summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorbapt <bapt@FreeBSD.org>2015-05-03 19:30:11 +0000
committerbapt <bapt@FreeBSD.org>2015-05-03 19:30:11 +0000
commitb5633ba2a5f5c5e3fddb07ef1f3c114268f7ea42 (patch)
tree43730ad7995cdbd70d25f4f9739ec3b2abd10b91 /sys
parent249cdb0bbbb0d59f85a71e76323eeed99d6d3134 (diff)
parent4cd4238e928bc196c424f1549c026c4f4407fba6 (diff)
downloadFreeBSD-src-b5633ba2a5f5c5e3fddb07ef1f3c114268f7ea42.zip
FreeBSD-src-b5633ba2a5f5c5e3fddb07ef1f3c114268f7ea42.tar.gz
Merge from head
Diffstat (limited to 'sys')
-rw-r--r--sys/amd64/amd64/apic_vector.S16
-rw-r--r--sys/amd64/amd64/machdep.c378
-rw-r--r--sys/amd64/amd64/mp_machdep.c1034
-rw-r--r--sys/amd64/amd64/pmap.c2
-rw-r--r--sys/amd64/conf/GENERIC4
-rw-r--r--sys/amd64/conf/NOTES2
-rw-r--r--sys/amd64/include/md_var.h1
-rw-r--r--sys/amd64/include/metadata.h10
-rw-r--r--sys/amd64/include/smp.h39
-rw-r--r--sys/amd64/include/vm.h2
-rw-r--r--sys/amd64/include/vmm.h6
-rw-r--r--sys/amd64/include/xen/xenfunc.h9
-rw-r--r--sys/amd64/include/xen/xenpmap.h227
-rw-r--r--sys/amd64/include/xen/xenvar.h61
-rw-r--r--sys/amd64/vmm/amd/amdv.c1
-rw-r--r--sys/amd64/vmm/amd/svm.c3
-rw-r--r--sys/amd64/vmm/amd/svm_msr.c31
-rw-r--r--sys/amd64/vmm/amd/vmcb.c1
-rw-r--r--sys/amd64/vmm/intel/vmx_msr.c23
-rw-r--r--sys/amd64/vmm/io/vatpic.c1
-rw-r--r--sys/amd64/vmm/io/vatpit.c1
-rw-r--r--sys/amd64/vmm/io/vhpet.c1
-rw-r--r--sys/amd64/vmm/io/vioapic.c1
-rw-r--r--sys/amd64/vmm/io/vlapic.c20
-rw-r--r--sys/amd64/vmm/io/vpmtmr.c1
-rw-r--r--sys/amd64/vmm/io/vrtc.c118
-rw-r--r--sys/amd64/vmm/vmm.c8
-rw-r--r--sys/amd64/vmm/vmm_instruction_emul.c251
-rw-r--r--sys/amd64/vmm/vmm_ioport.c6
-rw-r--r--sys/amd64/vmm/vmm_lapic.c6
-rw-r--r--sys/amd64/vmm/vmm_stat.c1
-rw-r--r--sys/amd64/vmm/x86.c22
-rw-r--r--sys/arm/allwinner/a10_clk.c1
-rw-r--r--sys/arm/allwinner/a10_clk.h162
-rw-r--r--sys/arm/allwinner/a10_common.c1
-rw-r--r--sys/arm/allwinner/a10_gpio.c1
-rw-r--r--sys/arm/allwinner/a10_sramc.c1
-rw-r--r--sys/arm/allwinner/a10_wdog.c1
-rw-r--r--sys/arm/allwinner/a20/a20_cpu_cfg.c1
-rw-r--r--sys/arm/allwinner/a20/a20_mp.c6
-rw-r--r--sys/arm/allwinner/a20/files.a2014
-rw-r--r--sys/arm/allwinner/a20/std.a201
-rw-r--r--sys/arm/allwinner/files.a1016
-rw-r--r--sys/arm/allwinner/files.allwinner18
-rw-r--r--sys/arm/allwinner/if_emac.c168
-rw-r--r--sys/arm/allwinner/if_emacreg.h5
-rw-r--r--sys/arm/allwinner/std.a103
-rw-r--r--sys/arm/allwinner/timer.c1
-rw-r--r--sys/arm/altera/socfpga/socfpga_gpio.c1
-rw-r--r--sys/arm/altera/socfpga/socfpga_manager.c1
-rw-r--r--sys/arm/altera/socfpga/socfpga_mp.c3
-rw-r--r--sys/arm/amlogic/aml8726/aml8726_clkmsr.c34
-rw-r--r--sys/arm/amlogic/aml8726/aml8726_fb.c3
-rw-r--r--sys/arm/amlogic/aml8726/aml8726_i2c.c2
-rw-r--r--sys/arm/amlogic/aml8726/aml8726_identsoc.c19
-rw-r--r--sys/arm/amlogic/aml8726/aml8726_machdep.c26
-rw-r--r--sys/arm/amlogic/aml8726/aml8726_mmc.c347
-rw-r--r--sys/arm/amlogic/aml8726/aml8726_mmc.h14
-rw-r--r--sys/arm/amlogic/aml8726/aml8726_mp.c3
-rw-r--r--sys/arm/amlogic/aml8726/aml8726_soc.h4
-rw-r--r--sys/arm/amlogic/aml8726/aml8726_timer.c2
-rw-r--r--sys/arm/amlogic/aml8726/aml8726_wdt.c2
-rw-r--r--sys/arm/amlogic/aml8726/files.aml87263
-rw-r--r--sys/arm/amlogic/aml8726/files.smp4
-rw-r--r--sys/arm/amlogic/aml8726/std.aml87269
-rw-r--r--sys/arm/amlogic/aml8726/std.odroidc117
-rw-r--r--sys/arm/amlogic/aml8726/std.vsatv102-m617
-rw-r--r--sys/arm/amlogic/aml8726/uart_dev_aml8726.c32
-rw-r--r--sys/arm/arm/busdma_machdep-v6.c4
-rw-r--r--sys/arm/arm/busdma_machdep.c4
-rw-r--r--sys/arm/arm/cpufunc.c3
-rw-r--r--sys/arm/arm/devmap.c65
-rw-r--r--sys/arm/arm/elf_machdep.c12
-rw-r--r--sys/arm/arm/generic_timer.c50
-rw-r--r--sys/arm/arm/intr.c1
-rw-r--r--sys/arm/arm/locore-v4.S74
-rw-r--r--sys/arm/arm/locore-v6.S125
-rw-r--r--sys/arm/arm/machdep.c2
-rw-r--r--sys/arm/arm/mpcore_timer.c1
-rw-r--r--sys/arm/arm/pmap-v6-new.c42
-rw-r--r--sys/arm/arm/pmap-v6.c30
-rw-r--r--sys/arm/arm/pmap.c34
-rw-r--r--sys/arm/arm/pmu.c1
-rw-r--r--sys/arm/arm/trap-v6.c5
-rw-r--r--sys/arm/arm/vm_machdep.c4
-rw-r--r--sys/arm/at91/at91_common.c7
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_common.c1
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_fb.c416
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_fbd.c264
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_mbox.c177
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_mbox_prop.h153
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_sdhci.c13
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_spi.c1
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_systimer.c1
-rw-r--r--sys/arm/broadcom/bcm2835/bcm2835_wdog.c1
-rw-r--r--sys/arm/broadcom/bcm2835/std.bcm28362
-rw-r--r--sys/arm/conf/AML8726143
-rw-r--r--sys/arm/conf/CUBIEBOARD2
-rw-r--r--sys/arm/conf/CUBIEBOARD22
-rw-r--r--sys/arm/conf/EFIKA_MX2
-rw-r--r--sys/arm/conf/IMX532
-rw-r--r--sys/arm/conf/IMX62
-rw-r--r--sys/arm/conf/ODROIDC1121
-rw-r--r--sys/arm/conf/RK31884
-rw-r--r--sys/arm/conf/RPI28
-rw-r--r--sys/arm/conf/VIRT97
-rw-r--r--sys/arm/conf/VSATV102121
-rw-r--r--sys/arm/freescale/imx/files.imx5 (renamed from sys/arm/freescale/imx/files.imx53)5
-rw-r--r--sys/arm/freescale/imx/files.imx5149
-rw-r--r--sys/arm/freescale/imx/imx51_ccm.c1
-rw-r--r--sys/arm/freescale/imx/imx51_ipuv3.c3
-rw-r--r--sys/arm/freescale/imx/imx51_ipuv3_fbd.c1
-rw-r--r--sys/arm/freescale/imx/imx6_anatop.c1
-rw-r--r--sys/arm/freescale/imx/imx6_audmux.c1
-rw-r--r--sys/arm/freescale/imx/imx6_mp.c3
-rw-r--r--sys/arm/freescale/imx/imx6_sdma.c1
-rw-r--r--sys/arm/freescale/imx/imx6_ssi.c1
-rw-r--r--sys/arm/freescale/imx/imx_common.c1
-rw-r--r--sys/arm/freescale/imx/imx_gpt.c1
-rw-r--r--sys/arm/freescale/imx/imx_iomux.c1
-rw-r--r--sys/arm/freescale/imx/imx_wdog.c1
-rw-r--r--sys/arm/freescale/imx/std.imx513
-rw-r--r--sys/arm/freescale/imx/std.imx533
-rw-r--r--sys/arm/freescale/vybrid/vf_adc.c1
-rw-r--r--sys/arm/freescale/vybrid/vf_anadig.c1
-rw-r--r--sys/arm/freescale/vybrid/vf_ccm.c1
-rw-r--r--sys/arm/freescale/vybrid/vf_dcu4.c3
-rw-r--r--sys/arm/freescale/vybrid/vf_dmamux.c1
-rw-r--r--sys/arm/freescale/vybrid/vf_edma.c1
-rw-r--r--sys/arm/freescale/vybrid/vf_gpio.c1
-rw-r--r--sys/arm/freescale/vybrid/vf_i2c.c1
-rw-r--r--sys/arm/freescale/vybrid/vf_iomuxc.c1
-rw-r--r--sys/arm/freescale/vybrid/vf_mscm.c1
-rw-r--r--sys/arm/freescale/vybrid/vf_nfc.c1
-rw-r--r--sys/arm/freescale/vybrid/vf_port.c1
-rw-r--r--sys/arm/freescale/vybrid/vf_sai.c1
-rw-r--r--sys/arm/freescale/vybrid/vf_spi.c1
-rw-r--r--sys/arm/freescale/vybrid/vf_src.c1
-rw-r--r--sys/arm/freescale/vybrid/vf_tcon.c1
-rw-r--r--sys/arm/freescale/vybrid/vf_uart.c4
-rw-r--r--sys/arm/include/fdt.h10
-rw-r--r--sys/arm/include/metadata.h7
-rw-r--r--sys/arm/include/pmap-v6.h3
-rw-r--r--sys/arm/include/pmap.h3
-rw-r--r--sys/arm/mv/armadaxp/armadaxp_mp.c1
-rw-r--r--sys/arm/mv/gpio.c1
-rw-r--r--sys/arm/mv/mv_localbus.c1
-rw-r--r--sys/arm/mv/mv_ts.c1
-rw-r--r--sys/arm/mv/mvvar.h1
-rw-r--r--sys/arm/qemu/files.qemu16
-rw-r--r--sys/arm/qemu/std.virt15
-rw-r--r--sys/arm/qemu/virt_common.c45
-rw-r--r--sys/arm/qemu/virt_machdep.c92
-rw-r--r--sys/arm/rockchip/rk30xx_common.c1
-rw-r--r--sys/arm/rockchip/rk30xx_gpio.c1
-rw-r--r--sys/arm/rockchip/rk30xx_grf.c1
-rw-r--r--sys/arm/rockchip/rk30xx_mp.c3
-rw-r--r--sys/arm/rockchip/rk30xx_pmu.c1
-rw-r--r--sys/arm/samsung/exynos/exynos5_mp.c3
-rw-r--r--sys/arm/samsung/exynos/exynos_uart.c1
-rw-r--r--sys/arm/samsung/s3c2xx0/uart_dev_s3c2410.c1
-rw-r--r--sys/arm/ti/am335x/am335x_dmtimer.c1
-rw-r--r--sys/arm/ti/am335x/am335x_prcm.c1
-rw-r--r--sys/arm/ti/omap4/omap4_mp.c3
-rw-r--r--sys/arm/ti/ti_common.c1
-rw-r--r--sys/arm/ti/ti_mbox.c1
-rw-r--r--sys/arm/ti/ti_pruss.c1
-rw-r--r--sys/arm/ti/ti_wdt.c1
-rw-r--r--sys/arm/versatile/pl050.c1
-rw-r--r--sys/arm/versatile/sp804.c1
-rw-r--r--sys/arm/versatile/versatile_clcd.c1
-rw-r--r--sys/arm/versatile/versatile_common.c1
-rw-r--r--sys/arm/versatile/versatile_pci.c4
-rw-r--r--sys/arm/versatile/versatile_timer.c1
-rw-r--r--sys/arm/xilinx/zy7_mp.c3
-rw-r--r--sys/arm64/arm64/autoconf.c90
-rw-r--r--sys/arm64/arm64/bcopy.c139
-rw-r--r--sys/arm64/arm64/bus_machdep.c204
-rw-r--r--sys/arm64/arm64/bus_space_asm.S235
-rw-r--r--sys/arm64/arm64/busdma_machdep.c68
-rw-r--r--sys/arm64/arm64/clock.c39
-rw-r--r--sys/arm64/arm64/copyinout.S118
-rw-r--r--sys/arm64/arm64/copystr.c61
-rw-r--r--sys/arm64/arm64/cpufunc_asm.S154
-rw-r--r--sys/arm64/arm64/db_disasm.c41
-rw-r--r--sys/arm64/arm64/db_interface.c168
-rw-r--r--sys/arm64/arm64/db_trace.c152
-rw-r--r--sys/arm64/arm64/debug_monitor.c487
-rw-r--r--sys/arm64/arm64/dump_machdep.c73
-rw-r--r--sys/arm64/arm64/elf_machdep.c164
-rw-r--r--sys/arm64/arm64/exception.S198
-rw-r--r--sys/arm64/arm64/genassym.c61
-rw-r--r--sys/arm64/arm64/gic.c398
-rw-r--r--sys/arm64/arm64/identcpu.c199
-rw-r--r--sys/arm64/arm64/in_cksum.c241
-rw-r--r--sys/arm64/arm64/intr_machdep.c503
-rw-r--r--sys/arm64/arm64/locore.S544
-rw-r--r--sys/arm64/arm64/machdep.c854
-rw-r--r--sys/arm64/arm64/mem.c47
-rw-r--r--sys/arm64/arm64/minidump_machdep.c50
-rw-r--r--sys/arm64/arm64/nexus.c334
-rw-r--r--sys/arm64/arm64/pic_if.m180
-rw-r--r--sys/arm64/arm64/pmap.c3082
-rw-r--r--sys/arm64/arm64/stack_machdep.c60
-rw-r--r--sys/arm64/arm64/support.S255
-rw-r--r--sys/arm64/arm64/swtch.S255
-rw-r--r--sys/arm64/arm64/sys_machdep.c47
-rw-r--r--sys/arm64/arm64/trap.c311
-rw-r--r--sys/arm64/arm64/uio_machdep.c134
-rw-r--r--sys/arm64/arm64/vfp.c195
-rw-r--r--sys/arm64/arm64/vm_machdep.c265
-rw-r--r--sys/arm64/conf/DEFAULTS14
-rw-r--r--sys/arm64/conf/GENERIC94
-rw-r--r--sys/arm64/include/_bus.h46
-rw-r--r--sys/arm64/include/armreg.h194
-rw-r--r--sys/arm64/include/atomic.h242
-rw-r--r--sys/arm64/include/bus.h469
-rw-r--r--sys/arm64/include/bus_dma.h8
-rw-r--r--sys/arm64/include/clock.h1
-rw-r--r--sys/arm64/include/counter.h93
-rw-r--r--sys/arm64/include/cpufunc.h1
-rw-r--r--sys/arm64/include/db_machdep.h126
-rw-r--r--sys/arm64/include/debug_monitor.h63
-rw-r--r--sys/arm64/include/devmap.h93
-rw-r--r--sys/arm64/include/dump.h74
-rw-r--r--sys/arm64/include/hypervisor.h85
-rw-r--r--sys/arm64/include/in_cksum.h56
-rw-r--r--sys/arm64/include/intr.h56
-rw-r--r--sys/arm64/include/kdb.h53
-rw-r--r--sys/arm64/include/machdep.h44
-rw-r--r--sys/arm64/include/md_var.h44
-rw-r--r--sys/arm64/include/memdev.h40
-rw-r--r--sys/arm64/include/metadata.h41
-rw-r--r--sys/arm64/include/ofw_machdep.h44
-rw-r--r--sys/arm64/include/param.h4
-rw-r--r--sys/arm64/include/pmap.h5
-rw-r--r--sys/arm64/include/psl.h1
-rw-r--r--sys/arm64/include/resource.h46
-rw-r--r--sys/arm64/include/sf_buf.h51
-rw-r--r--sys/arm64/include/smp.h1
-rw-r--r--sys/arm64/include/stack.h35
-rw-r--r--sys/arm64/include/trap.h1
-rw-r--r--sys/arm64/include/vfp.h46
-rw-r--r--sys/boot/Makefile1
-rw-r--r--sys/boot/Makefile.arm2
-rw-r--r--sys/boot/Makefile.arm647
-rw-r--r--sys/boot/arm64/Makefile3
-rw-r--r--sys/boot/arm64/libarm64/cache.c95
-rw-r--r--sys/boot/arm64/libarm64/cache.h38
-rw-r--r--sys/boot/common/Makefile.inc12
-rw-r--r--sys/boot/common/md.c2
-rw-r--r--sys/boot/efi/Makefile12
-rw-r--r--sys/boot/efi/boot1/Makefile40
-rw-r--r--sys/boot/efi/boot1/boot1.c61
-rw-r--r--sys/boot/efi/boot1/fat-amd64.tmpl.bz2.uu (renamed from sys/boot/efi/boot1/fat.tmpl.bz2.uu)2
-rw-r--r--sys/boot/efi/boot1/fat-arm.tmpl.bz2.uu26
-rw-r--r--sys/boot/efi/boot1/fat-arm64.tmpl.bz2.uu26
-rw-r--r--sys/boot/efi/boot1/fat-i386.tmpl.bz2.uu26
-rwxr-xr-xsys/boot/efi/boot1/generate-fat.sh15
-rw-r--r--sys/boot/efi/fdt/Makefile6
-rw-r--r--sys/boot/efi/include/arm/efibind.h165
-rw-r--r--sys/boot/efi/include/arm64/efibind.h219
-rw-r--r--sys/boot/efi/libefi/Makefile2
-rw-r--r--sys/boot/efi/loader/Makefile51
-rw-r--r--sys/boot/efi/loader/arch/amd64/Makefile.inc6
-rw-r--r--sys/boot/efi/loader/arch/arm/Makefile.inc6
-rw-r--r--sys/boot/efi/loader/arch/arm/exec.c107
-rw-r--r--sys/boot/efi/loader/arch/arm/ldscript.arm62
-rw-r--r--sys/boot/efi/loader/arch/arm/start.S189
-rw-r--r--sys/boot/efi/loader/arch/arm64/Makefile.inc9
-rw-r--r--sys/boot/efi/loader/arch/arm64/exec.c109
-rw-r--r--sys/boot/efi/loader/arch/arm64/ldscript.arm6480
-rw-r--r--sys/boot/efi/loader/arch/arm64/start.S165
-rw-r--r--sys/boot/efi/loader/arch/i386/Makefile.inc13
-rw-r--r--sys/boot/efi/loader/arch/i386/bootinfo.c2
-rw-r--r--sys/boot/efi/loader/arch/i386/elf32_freebsd.c10
-rw-r--r--sys/boot/efi/loader/arch/i386/i386_copy.c2
-rw-r--r--sys/boot/efi/loader/arch/i386/start.S2
-rw-r--r--sys/boot/efi/loader/bootinfo.c63
-rw-r--r--sys/boot/efi/loader/copy.c18
-rw-r--r--sys/boot/efi/loader/main.c34
-rw-r--r--sys/boot/efi/loader/reloc.c (renamed from sys/boot/efi/loader/arch/amd64/reloc.c)39
-rw-r--r--sys/boot/fdt/dts/arm/bcm2836.dtsi14
-rw-r--r--sys/boot/fdt/dts/arm/meson8b.dtsi79
-rw-r--r--sys/boot/fdt/dts/arm/odroidc1.dts280
-rw-r--r--sys/boot/fdt/dts/arm/rpi2.dts20
-rw-r--r--sys/boot/fdt/dts/arm/vsatv102-m6.dts256
-rw-r--r--sys/boot/ficl/aarch64/sysdep.c99
-rw-r--r--sys/boot/ficl/aarch64/sysdep.h411
-rw-r--r--sys/boot/forth/check-password.4th9
-rw-r--r--sys/boot/forth/check-password.4th.842
-rw-r--r--sys/boot/forth/loader.conf11
-rw-r--r--sys/boot/forth/menu.4th2
-rw-r--r--sys/boot/forth/menu.rc33
-rw-r--r--sys/boot/forth/version.4th6
-rw-r--r--sys/boot/i386/common/edd.h2
-rw-r--r--sys/boot/i386/libi386/libi386.h4
-rw-r--r--sys/boot/i386/libi386/smbios.c21
-rw-r--r--sys/boot/i386/libi386/smbios.h34
-rw-r--r--sys/boot/i386/loader/main.c5
-rw-r--r--sys/boot/libstand32/Makefile36
-rw-r--r--sys/boot/sparc64/loader/main.c6
-rw-r--r--sys/boot/userboot/libstand/Makefile39
-rw-r--r--sys/cam/cam_xpt.c4
-rw-r--r--sys/cam/scsi/scsi_all.c2
-rw-r--r--sys/cam/scsi/scsi_da.c2
-rw-r--r--sys/cddl/contrib/opensolaris/common/nvpair/nvpair.c1
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c50
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c6
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_objset.c13
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_traverse.c32
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c3
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dir.c5
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c5
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_onexit.c2
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c24
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/sys/dtrace.h5
-rw-r--r--sys/cddl/dev/dtrace/amd64/dtrace_asm.S208
-rw-r--r--sys/cddl/dev/dtrace/arm/dtrace_asm.S18
-rw-r--r--sys/cddl/dev/dtrace/dtrace_hacks.c3
-rw-r--r--sys/cddl/dev/dtrace/dtrace_ioctl.c7
-rw-r--r--sys/cddl/dev/dtrace/i386/dtrace_asm.S164
-rw-r--r--sys/cddl/dev/dtrace/mips/dtrace_asm.S44
-rw-r--r--sys/cddl/dev/dtrace/powerpc/dtrace_asm.S40
-rw-r--r--sys/cddl/dev/profile/profile.c6
-rw-r--r--sys/compat/freebsd32/freebsd32.h26
-rw-r--r--sys/compat/freebsd32/freebsd32_misc.c5
-rw-r--r--sys/compat/linprocfs/linprocfs.c37
-rw-r--r--sys/compat/linux/linux_file.c92
-rw-r--r--sys/compat/linux/linux_getcwd.c414
-rw-r--r--sys/compat/linux/linux_misc.h2
-rw-r--r--sys/compat/svr4/svr4_stream.c4
-rw-r--r--sys/conf/Makefile.arm6454
-rw-r--r--sys/conf/Makefile.pc983
-rw-r--r--sys/conf/NOTES1
-rw-r--r--sys/conf/files78
-rw-r--r--sys/conf/files.amd6411
-rw-r--r--sys/conf/files.arm2
-rw-r--r--sys/conf/files.arm6454
-rw-r--r--sys/conf/files.i38648
-rw-r--r--sys/conf/files.mips1
-rw-r--r--sys/conf/files.pc982
-rw-r--r--sys/conf/files.powerpc16
-rw-r--r--sys/conf/kern.mk2
-rw-r--r--sys/conf/kern.pre.mk11
-rw-r--r--sys/conf/kmod.mk8
-rw-r--r--sys/conf/ldscript.arm64149
-rw-r--r--sys/conf/newvers.sh8
-rw-r--r--sys/conf/options3
-rw-r--r--sys/conf/options.amd642
-rw-r--r--sys/conf/options.arm3
-rw-r--r--sys/conf/options.arm646
-rw-r--r--sys/conf/options.i3869
-rw-r--r--sys/contrib/altq/altq/altqconf.h29
-rwxr-xr-xsys/contrib/dev/acpica/acpica_prep.sh11
-rw-r--r--sys/contrib/dev/acpica/changes.txt107
-rw-r--r--sys/contrib/dev/acpica/common/adfile.c10
-rw-r--r--sys/contrib/dev/acpica/common/adisasm.c95
-rw-r--r--sys/contrib/dev/acpica/common/dmtable.c136
-rw-r--r--sys/contrib/dev/acpica/common/dmtbdump.c100
-rw-r--r--sys/contrib/dev/acpica/common/dmtbinfo.c42
-rw-r--r--sys/contrib/dev/acpica/compiler/aslcodegen.c2
-rw-r--r--sys/contrib/dev/acpica/compiler/aslcompile.c12
-rw-r--r--sys/contrib/dev/acpica/compiler/aslcompiler.h8
-rw-r--r--sys/contrib/dev/acpica/compiler/asldefine.h1
-rw-r--r--sys/contrib/dev/acpica/compiler/aslfold.c706
-rw-r--r--sys/contrib/dev/acpica/compiler/asllisting.c5
-rw-r--r--sys/contrib/dev/acpica/compiler/aslmain.c1
-rw-r--r--sys/contrib/dev/acpica/compiler/aslmap.c2
-rw-r--r--sys/contrib/dev/acpica/compiler/aslmapenter.c10
-rw-r--r--sys/contrib/dev/acpica/compiler/asloptions.c5
-rw-r--r--sys/contrib/dev/acpica/compiler/aslrules.y53
-rw-r--r--sys/contrib/dev/acpica/compiler/aslstartup.c2
-rw-r--r--sys/contrib/dev/acpica/compiler/asltree.c199
-rw-r--r--sys/contrib/dev/acpica/compiler/asltypes.y2
-rw-r--r--sys/contrib/dev/acpica/compiler/aslutils.c9
-rw-r--r--sys/contrib/dev/acpica/compiler/aslwalks.c10
-rw-r--r--sys/contrib/dev/acpica/compiler/dtcompile.c17
-rw-r--r--sys/contrib/dev/acpica/compiler/dtcompiler.h20
-rw-r--r--sys/contrib/dev/acpica/compiler/dtio.c6
-rw-r--r--sys/contrib/dev/acpica/compiler/dttable.c35
-rw-r--r--sys/contrib/dev/acpica/compiler/dttemplate.h17
-rw-r--r--sys/contrib/dev/acpica/compiler/dtutils.c3
-rw-r--r--sys/contrib/dev/acpica/components/debugger/dbmethod.c4
-rw-r--r--sys/contrib/dev/acpica/components/debugger/dbxface.c13
-rw-r--r--sys/contrib/dev/acpica/components/disassembler/dmopcode.c12
-rw-r--r--sys/contrib/dev/acpica/components/disassembler/dmwalk.c2
-rw-r--r--sys/contrib/dev/acpica/components/dispatcher/dsopcode.c6
-rw-r--r--sys/contrib/dev/acpica/components/dispatcher/dsutils.c9
-rw-r--r--sys/contrib/dev/acpica/components/events/evregion.c2
-rw-r--r--sys/contrib/dev/acpica/components/events/evxfevnt.c5
-rw-r--r--sys/contrib/dev/acpica/components/executer/exdump.c2
-rw-r--r--sys/contrib/dev/acpica/components/executer/exfldio.c4
-rw-r--r--sys/contrib/dev/acpica/components/executer/exoparg3.c13
-rw-r--r--sys/contrib/dev/acpica/components/executer/exregion.c13
-rw-r--r--sys/contrib/dev/acpica/components/hardware/hwgpe.c15
-rw-r--r--sys/contrib/dev/acpica/components/hardware/hwvalid.c12
-rw-r--r--sys/contrib/dev/acpica/components/namespace/nsdump.c6
-rw-r--r--sys/contrib/dev/acpica/components/parser/psopcode.c6
-rw-r--r--sys/contrib/dev/acpica/components/parser/psopinfo.c2
-rw-r--r--sys/contrib/dev/acpica/components/resources/rsaddr.c8
-rw-r--r--sys/contrib/dev/acpica/components/resources/rsdump.c279
-rw-r--r--sys/contrib/dev/acpica/components/resources/rsdumpinfo.c45
-rw-r--r--sys/contrib/dev/acpica/components/resources/rsxface.c10
-rw-r--r--sys/contrib/dev/acpica/components/tables/tbdata.c33
-rw-r--r--sys/contrib/dev/acpica/components/tables/tbinstal.c68
-rw-r--r--sys/contrib/dev/acpica/components/tables/tbprint.c18
-rw-r--r--sys/contrib/dev/acpica/components/tables/tbxfroot.c6
-rw-r--r--sys/contrib/dev/acpica/components/utilities/utaddress.c22
-rw-r--r--sys/contrib/dev/acpica/components/utilities/utbuffer.c9
-rw-r--r--sys/contrib/dev/acpica/components/utilities/utglobal.c13
-rw-r--r--sys/contrib/dev/acpica/components/utilities/utmisc.c2
-rw-r--r--sys/contrib/dev/acpica/components/utilities/utosi.c1
-rw-r--r--sys/contrib/dev/acpica/components/utilities/utprint.c13
-rw-r--r--sys/contrib/dev/acpica/components/utilities/utstate.c38
-rw-r--r--sys/contrib/dev/acpica/components/utilities/utuuid.c2
-rw-r--r--sys/contrib/dev/acpica/include/acdebug.h2
-rw-r--r--sys/contrib/dev/acpica/include/acdisasm.h20
-rw-r--r--sys/contrib/dev/acpica/include/acglobal.h9
-rw-r--r--sys/contrib/dev/acpica/include/aclocal.h2
-rw-r--r--sys/contrib/dev/acpica/include/acmacros.h13
-rw-r--r--sys/contrib/dev/acpica/include/acopcode.h2
-rw-r--r--sys/contrib/dev/acpica/include/acpixf.h4
-rw-r--r--sys/contrib/dev/acpica/include/acresrc.h4
-rw-r--r--sys/contrib/dev/acpica/include/acrestyp.h54
-rw-r--r--sys/contrib/dev/acpica/include/acstruct.h5
-rw-r--r--sys/contrib/dev/acpica/include/actables.h13
-rw-r--r--sys/contrib/dev/acpica/include/actbl2.h83
-rw-r--r--sys/contrib/dev/acpica/include/actypes.h46
-rw-r--r--sys/contrib/dev/acpica/include/acutils.h27
-rw-r--r--sys/contrib/dev/acpica/include/amlcode.h2
-rw-r--r--sys/contrib/dev/acpica/include/platform/acenv.h1
-rw-r--r--sys/contrib/ipfilter/netinet/ip_compat.h34
-rw-r--r--sys/contrib/x86emu/x86emu.c4
-rw-r--r--sys/crypto/aesni/aesencdec.h2
-rw-r--r--sys/crypto/aesni/aesni_ghash.c1
-rw-r--r--sys/crypto/aesni/aesni_os.h33
-rw-r--r--sys/dev/acpica/acpi.c45
-rw-r--r--sys/dev/acpica/acpi_pcib_acpi.c24
-rw-r--r--sys/dev/acpica/acpi_resource.c32
-rw-r--r--sys/dev/acpica/acpivar.h7
-rw-r--r--sys/dev/ath/ath_hal/ar5212/ar5212.h4
-rw-r--r--sys/dev/ath/ath_hal/ar5212/ar5212_misc.c26
-rw-r--r--sys/dev/atkbdc/atkbd.c82
-rw-r--r--sys/dev/atkbdc/psm.c320
-rw-r--r--sys/dev/bxe/bxe.h2
-rw-r--r--sys/dev/cxgbe/t4_main.c41
-rw-r--r--sys/dev/cxgbe/tom/t4_listen.c56
-rw-r--r--sys/dev/e1000/if_igb.c164
-rw-r--r--sys/dev/etherswitch/miiproxy.c122
-rw-r--r--sys/dev/fdt/fdt_arm64.c49
-rw-r--r--sys/dev/fdt/fdt_pinctrl.c6
-rw-r--r--sys/dev/hptnr/README14
-rw-r--r--sys/dev/hptnr/amd64-elf.hptnr_lib.o.uu23796
-rw-r--r--sys/dev/hptnr/him.h3
-rw-r--r--sys/dev/hptnr/hptintf.h1
-rw-r--r--sys/dev/hptnr/hptnr_config.c2
-rw-r--r--sys/dev/hptnr/hptnr_config.h2
-rw-r--r--sys/dev/hptnr/hptnr_osm_bsd.c405
-rw-r--r--sys/dev/hptnr/i386-elf.hptnr_lib.o.uu16552
-rw-r--r--sys/dev/hptnr/ldm.h1
-rw-r--r--sys/dev/hptnr/os_bsd.h2
-rw-r--r--sys/dev/hwpmc/hwpmc_core.c25
-rw-r--r--sys/dev/hwpmc/hwpmc_e500.c660
-rw-r--r--sys/dev/hwpmc/hwpmc_intel.c8
-rw-r--r--sys/dev/hwpmc/hwpmc_mips74k.c261
-rw-r--r--sys/dev/hwpmc/hwpmc_mpc7xxx.c4
-rw-r--r--sys/dev/hwpmc/hwpmc_powerpc.c5
-rw-r--r--sys/dev/hwpmc/hwpmc_powerpc.h1
-rw-r--r--sys/dev/hwpmc/hwpmc_ppc970.c4
-rw-r--r--sys/dev/hwpmc/pmc_events.h313
-rw-r--r--sys/dev/hyperv/include/hyperv.h167
-rw-r--r--sys/dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c801
-rw-r--r--sys/dev/hyperv/storvsc/hv_vstorage.h16
-rw-r--r--sys/dev/hyperv/utilities/hv_kvp.c11
-rw-r--r--sys/dev/hyperv/utilities/hv_util.c9
-rw-r--r--sys/dev/hyperv/vmbus/hv_channel.c98
-rw-r--r--sys/dev/hyperv/vmbus/hv_channel_mgmt.c265
-rw-r--r--sys/dev/hyperv/vmbus/hv_connection.c286
-rw-r--r--sys/dev/hyperv/vmbus/hv_hv.c66
-rw-r--r--sys/dev/hyperv/vmbus/hv_ring_buffer.c76
-rw-r--r--sys/dev/hyperv/vmbus/hv_vmbus_drv_freebsd.c364
-rw-r--r--sys/dev/hyperv/vmbus/hv_vmbus_priv.h71
-rw-r--r--sys/dev/ichsmb/ichsmb_pci.c10
-rw-r--r--sys/dev/iicbus/iic.c437
-rw-r--r--sys/dev/iicbus/iic.h1
-rw-r--r--sys/dev/iicbus/iicbus_if.m4
-rw-r--r--sys/dev/iicbus/iiconf.c71
-rw-r--r--sys/dev/iicbus/pcf8563.c67
-rw-r--r--sys/dev/ipmi/ipmi.c23
-rw-r--r--sys/dev/ipmi/ipmi_kcs.c1
-rw-r--r--sys/dev/ipmi/ipmi_smic.c1
-rw-r--r--sys/dev/ipmi/ipmivars.h1
-rw-r--r--sys/dev/iscsi/icl_conn_if.m4
-rw-r--r--sys/dev/iscsi/icl_soft.c20
-rw-r--r--sys/dev/iscsi/icl_wrappers.h7
-rw-r--r--sys/dev/iwn/if_iwn.c2
-rw-r--r--sys/dev/ixgbe/if_ix.c1070
-rw-r--r--sys/dev/ixgbe/if_ixv.c9
-rw-r--r--sys/dev/ixgbe/ix_txrx.c57
-rw-r--r--sys/dev/ixgbe/ixgbe.h39
-rw-r--r--sys/dev/ixgbe/ixgbe_82598.c7
-rw-r--r--sys/dev/ixgbe/ixgbe_82598.h2
-rw-r--r--sys/dev/ixgbe/ixgbe_82599.c6
-rw-r--r--sys/dev/ixgbe/ixgbe_82599.h2
-rw-r--r--sys/dev/ixgbe/ixgbe_api.c122
-rw-r--r--sys/dev/ixgbe/ixgbe_api.h11
-rw-r--r--sys/dev/ixgbe/ixgbe_common.c6
-rw-r--r--sys/dev/ixgbe/ixgbe_common.h2
-rw-r--r--sys/dev/ixgbe/ixgbe_dcb.c12
-rw-r--r--sys/dev/ixgbe/ixgbe_dcb.h2
-rw-r--r--sys/dev/ixgbe/ixgbe_dcb_82598.c2
-rw-r--r--sys/dev/ixgbe/ixgbe_dcb_82598.h2
-rw-r--r--sys/dev/ixgbe/ixgbe_dcb_82599.c2
-rw-r--r--sys/dev/ixgbe/ixgbe_dcb_82599.h2
-rw-r--r--sys/dev/ixgbe/ixgbe_mbx.c4
-rw-r--r--sys/dev/ixgbe/ixgbe_mbx.h2
-rw-r--r--sys/dev/ixgbe/ixgbe_osdep.h9
-rw-r--r--sys/dev/ixgbe/ixgbe_phy.c228
-rw-r--r--sys/dev/ixgbe/ixgbe_phy.h23
-rw-r--r--sys/dev/ixgbe/ixgbe_type.h265
-rw-r--r--sys/dev/ixgbe/ixgbe_vf.c3
-rw-r--r--sys/dev/ixgbe/ixgbe_vf.h2
-rw-r--r--sys/dev/ixgbe/ixgbe_x540.c12
-rw-r--r--sys/dev/ixgbe/ixgbe_x540.h2
-rw-r--r--sys/dev/ixgbe/ixgbe_x550.c3191
-rw-r--r--sys/dev/ixgbe/ixgbe_x550.h109
-rw-r--r--sys/dev/ixl/ixl.h2
-rw-r--r--sys/dev/mii/acphy.c8
-rw-r--r--sys/dev/mii/brgphy.c51
-rw-r--r--sys/dev/mii/lxtphy.c8
-rw-r--r--sys/dev/mii/mii_physubr.c160
-rw-r--r--sys/dev/mii/miivar.h21
-rw-r--r--sys/dev/mii/mlphy.c22
-rw-r--r--sys/dev/mii/xmphy.c9
-rw-r--r--sys/dev/mxge/if_mxge.c2
-rw-r--r--sys/dev/netmap/netmap.c6
-rw-r--r--sys/dev/nvme/nvme.c47
-rw-r--r--sys/dev/nvme/nvme_ctrlr.c181
-rw-r--r--sys/dev/nvme/nvme_ns.c46
-rw-r--r--sys/dev/nvme/nvme_private.h38
-rw-r--r--sys/dev/nvme/nvme_qpair.c56
-rw-r--r--sys/dev/pccbb/pccbb_pci.c52
-rw-r--r--sys/dev/pci/pci.c120
-rw-r--r--sys/dev/pci/pci_iov.c2
-rw-r--r--sys/dev/pci/pci_pci.c66
-rw-r--r--sys/dev/pci/pci_subr.c2
-rw-r--r--sys/dev/pci/pcib_private.h3
-rw-r--r--sys/dev/pci/pcivar.h10
-rw-r--r--sys/dev/psci/psci.c286
-rw-r--r--sys/dev/psci/psci.h102
-rw-r--r--sys/dev/psci/psci_arm.S47
-rw-r--r--sys/dev/psci/psci_arm64.S49
-rw-r--r--sys/dev/re/if_re.c14
-rw-r--r--sys/dev/smbus/smb.c148
-rw-r--r--sys/dev/smbus/smb.h37
-rw-r--r--sys/dev/smbus/smbconf.h33
-rw-r--r--sys/dev/smbus/smbus.c88
-rw-r--r--sys/dev/smbus/smbus.h4
-rw-r--r--sys/dev/smbus/smbus_if.m17
-rw-r--r--sys/dev/sound/pci/hda/hdaa_patches.c7
-rw-r--r--sys/dev/sound/pci/hda/hdac.c2
-rw-r--r--sys/dev/sound/pci/hda/hdac.h5
-rw-r--r--sys/dev/sound/pci/hda/hdacc.c2
-rw-r--r--sys/dev/sound/pcm/dsp.c12
-rw-r--r--sys/dev/streams/streams.c4
-rw-r--r--sys/dev/uart/uart_bus.h1
-rw-r--r--sys/dev/uart/uart_bus_fdt.c33
-rw-r--r--sys/dev/uart/uart_core.c6
-rw-r--r--sys/dev/uart/uart_cpu.h1
-rw-r--r--sys/dev/uart/uart_cpu_fdt.c58
-rw-r--r--sys/dev/uart/uart_cpu_fdt.h2
-rw-r--r--sys/dev/uart/uart_dev_imx.c3
-rw-r--r--sys/dev/uart/uart_dev_lpc.c3
-rw-r--r--sys/dev/uart/uart_dev_msm.c1
-rw-r--r--sys/dev/uart/uart_dev_ns8250.c3
-rw-r--r--sys/dev/uart/uart_dev_pl011.c3
-rw-r--r--sys/dev/uart/uart_dev_quicc.c3
-rw-r--r--sys/dev/uart/uart_dev_sab82532.c3
-rw-r--r--sys/dev/uart/uart_dev_ti8250.c3
-rw-r--r--sys/dev/uart/uart_dev_z8530.c3
-rw-r--r--sys/dev/usb/controller/dwc_otg.c16
-rw-r--r--sys/dev/usb/controller/ehci_pci.c2
-rw-r--r--sys/dev/usb/controller/uhci_pci.c2
-rw-r--r--sys/dev/usb/controller/xhci_pci.c2
-rw-r--r--sys/dev/usb/net/if_axge.c1
-rw-r--r--sys/dev/usb/serial/uftdi.c4
-rw-r--r--sys/dev/usb/usbdevs5
-rw-r--r--sys/dev/usb/video/udl.c76
-rw-r--r--sys/dev/usb/video/udl.h9
-rw-r--r--sys/dev/usb/wlan/if_run.c3
-rw-r--r--sys/dev/usb/wlan/if_urtwn.c134
-rw-r--r--sys/dev/virtio/block/virtio_blk.c3
-rw-r--r--sys/dev/virtio/network/if_vtnet.c5
-rw-r--r--sys/dev/vt/hw/fb/vt_fb.c54
-rw-r--r--sys/dev/vt/hw/vga/vt_vga.c16
-rw-r--r--sys/dev/vt/vt_core.c20
-rw-r--r--sys/dev/vt/vt_font.c4
-rw-r--r--sys/dev/wpi/if_wpi.c37
-rw-r--r--sys/dev/xen/balloon/balloon.c48
-rw-r--r--sys/dev/xen/blkback/blkback.c13
-rw-r--r--sys/dev/xen/control/control.c130
-rw-r--r--sys/dev/xen/grant_table/grant_table.c70
-rw-r--r--sys/dev/xen/netback/netback.c14
-rw-r--r--sys/dev/xen/netfront/netfront.c12
-rw-r--r--sys/fs/ext2fs/ext2_dir.h15
-rw-r--r--sys/fs/ext2fs/ext2_extern.h15
-rw-r--r--sys/fs/ext2fs/ext2_hash.c316
-rw-r--r--sys/fs/ext2fs/ext2_htree.c899
-rw-r--r--sys/fs/ext2fs/ext2_lookup.c336
-rw-r--r--sys/fs/ext2fs/ext2_vfsops.c21
-rw-r--r--sys/fs/ext2fs/ext2fs.h8
-rw-r--r--sys/fs/fuse/fuse_vfsops.c1
-rw-r--r--sys/fs/msdosfs/msdosfs_fat.c6
-rw-r--r--sys/fs/msdosfs/msdosfs_vfsops.c13
-rw-r--r--sys/fs/nandfs/nandfs_vfsops.c1
-rw-r--r--sys/fs/nfs/nfs.h2
-rw-r--r--sys/fs/nfs/nfs_commonport.c18
-rw-r--r--sys/fs/nfs/nfsport.h2
-rw-r--r--sys/fs/nfs/nfsproto.h15
-rw-r--r--sys/fs/nfsclient/nfs_clrpcops.c8
-rw-r--r--sys/fs/nfsclient/nfs_clvfsops.c26
-rw-r--r--sys/fs/nfsserver/nfs_nfsdkrpc.c3
-rw-r--r--sys/fs/nfsserver/nfs_nfsdport.c9
-rw-r--r--sys/fs/nfsserver/nfs_nfsdserv.c2
-rw-r--r--sys/fs/nullfs/null_vfsops.c2
-rw-r--r--sys/fs/tmpfs/tmpfs_vnops.c8
-rw-r--r--sys/geom/geom_dev.c2
-rw-r--r--sys/geom/multipath/g_multipath.c4
-rw-r--r--sys/geom/uncompress/g_uncompress.c3
-rw-r--r--sys/geom/uzip/g_uzip.c2
-rw-r--r--sys/gnu/dts/arm/meson.dtsi23
-rw-r--r--sys/gnu/dts/arm/meson6.dtsi4
-rw-r--r--sys/gnu/dts/arm/meson8.dtsi4
-rw-r--r--sys/i386/conf/DEFAULTS1
-rw-r--r--sys/i386/conf/GENERIC4
-rw-r--r--sys/i386/conf/XEN96
-rw-r--r--sys/i386/i386/apic_vector.s39
-rw-r--r--sys/i386/i386/bios.c2
-rw-r--r--sys/i386/i386/db_trace.c3
-rw-r--r--sys/i386/i386/genassym.c5
-rw-r--r--sys/i386/i386/initcpu.c2
-rw-r--r--sys/i386/i386/locore.s10
-rw-r--r--sys/i386/i386/machdep.c752
-rw-r--r--sys/i386/i386/minidump_machdep.c30
-rw-r--r--sys/i386/i386/mp_machdep.c1009
-rw-r--r--sys/i386/i386/mpboot.s2
-rw-r--r--sys/i386/i386/pmap.c153
-rw-r--r--sys/i386/i386/support.s2
-rw-r--r--sys/i386/i386/swtch.s28
-rw-r--r--sys/i386/i386/sys_machdep.c103
-rw-r--r--sys/i386/i386/trap.c2
-rw-r--r--sys/i386/i386/vm86bios.s2
-rw-r--r--sys/i386/i386/vm_machdep.c29
-rw-r--r--sys/i386/include/asmacros.h31
-rw-r--r--sys/i386/include/cpufunc.h46
-rw-r--r--sys/i386/include/intr_machdep.h8
-rw-r--r--sys/i386/include/md_var.h1
-rw-r--r--sys/i386/include/param.h2
-rw-r--r--sys/i386/include/pcpu.h32
-rw-r--r--sys/i386/include/pmap.h111
-rw-r--r--sys/i386/include/segments.h6
-rw-r--r--sys/i386/include/smp.h48
-rw-r--r--sys/i386/include/vm.h2
-rw-r--r--sys/i386/include/vmparam.h14
-rw-r--r--sys/i386/include/xen/features.h22
-rw-r--r--sys/i386/include/xen/hypercall.h6
-rw-r--r--sys/i386/include/xen/xen-os.h99
-rw-r--r--sys/i386/include/xen/xenfunc.h1
-rw-r--r--sys/i386/include/xen/xenpmap.h237
-rw-r--r--sys/i386/include/xen/xenstored.h89
-rw-r--r--sys/i386/include/xen/xenvar.h85
-rw-r--r--sys/i386/isa/npx.c9
-rw-r--r--sys/i386/pci/pci_cfgreg.c10
-rw-r--r--sys/i386/pci/pci_pir.c9
-rw-r--r--sys/i386/xen/clock.c570
-rw-r--r--sys/i386/xen/exception.s494
-rw-r--r--sys/i386/xen/locore.s360
-rw-r--r--sys/i386/xen/mp_machdep.c1309
-rw-r--r--sys/i386/xen/mptable.c109
-rw-r--r--sys/i386/xen/pmap.c4520
-rw-r--r--sys/i386/xen/xen_machdep.c1236
-rw-r--r--sys/kern/imgact_elf.c15
-rw-r--r--sys/kern/init_main.c3
-rw-r--r--sys/kern/init_sysent.c20
-rw-r--r--sys/kern/kern_descrip.c41
-rw-r--r--sys/kern/kern_exec.c17
-rw-r--r--sys/kern/kern_exit.c8
-rw-r--r--sys/kern/kern_fork.c2
-rw-r--r--sys/kern/kern_gzio.c3
-rw-r--r--sys/kern/kern_intr.c5
-rw-r--r--sys/kern/kern_jail.c22
-rw-r--r--sys/kern/kern_physio.c154
-rw-r--r--sys/kern/kern_poll.c6
-rw-r--r--sys/kern/kern_proc.c2
-rw-r--r--sys/kern/kern_racct.c98
-rw-r--r--sys/kern/kern_rctl.c69
-rw-r--r--sys/kern/kern_resource.c7
-rw-r--r--sys/kern/kern_shutdown.c9
-rw-r--r--sys/kern/kern_synch.c20
-rw-r--r--sys/kern/kern_thr.c26
-rw-r--r--sys/kern/kern_thread.c1
-rw-r--r--sys/kern/kern_timeout.c2
-rw-r--r--sys/kern/link_elf.c2
-rw-r--r--sys/kern/link_elf_obj.c2
-rw-r--r--sys/kern/sched_4bsd.c2
-rw-r--r--sys/kern/subr_bus.c18
-rw-r--r--sys/kern/subr_dnvlist.c166
-rw-r--r--sys/kern/subr_nvlist.c910
-rw-r--r--sys/kern/subr_nvpair.c382
-rw-r--r--sys/kern/subr_param.c4
-rw-r--r--sys/kern/subr_prf.c2
-rw-r--r--sys/kern/subr_trap.c22
-rw-r--r--sys/kern/subr_vmem.c3
-rw-r--r--sys/kern/sys_generic.c4
-rw-r--r--sys/kern/sys_pipe.c4
-rw-r--r--sys/kern/syscalls.c14
-rw-r--r--sys/kern/syscalls.master12
-rw-r--r--sys/kern/systrace_args.c216
-rw-r--r--sys/kern/sysv_msg.c42
-rw-r--r--sys/kern/sysv_sem.c25
-rw-r--r--sys/kern/sysv_shm.c82
-rw-r--r--sys/kern/tty_pts.c2
-rw-r--r--sys/kern/uipc_mqueue.c2
-rw-r--r--sys/kern/uipc_sem.c6
-rw-r--r--sys/kern/uipc_shm.c17
-rw-r--r--sys/kern/uipc_syscalls.c63
-rw-r--r--sys/kern/vfs_aio.c206
-rw-r--r--sys/kern/vfs_bio.c107
-rw-r--r--sys/kern/vfs_cache.c46
-rw-r--r--sys/kern/vfs_subr.c1
-rw-r--r--sys/kern/vfs_syscalls.c31
-rw-r--r--sys/kern/vfs_vnops.c6
-rw-r--r--sys/libkern/zlib.c (renamed from sys/net/zlib.c)2
-rw-r--r--sys/mips/adm5120/uart_dev_adm5120.c3
-rw-r--r--sys/mips/atheros/uart_dev_ar933x.c3
-rw-r--r--sys/mips/cavium/uart_dev_oct16550.c3
-rw-r--r--sys/mips/conf/CARAMBOLA2.hints17
-rw-r--r--sys/mips/conf/DIR-655A1.hints38
-rw-r--r--sys/mips/conf/DIR-825C1.hints28
-rw-r--r--sys/mips/include/reg.h4
-rw-r--r--sys/mips/mips/busdma_machdep.c4
-rw-r--r--sys/mips/rt305x/uart_dev_rt305x.c3
-rw-r--r--sys/modules/dtb/allwinner/Makefile7
-rw-r--r--sys/modules/ext2fs/Makefile4
-rw-r--r--sys/modules/hwpmc/Makefile2
-rw-r--r--sys/modules/i2c/iicbb/Makefile5
-rw-r--r--sys/modules/ix/Makefile2
-rw-r--r--sys/modules/ixv/Makefile2
-rw-r--r--sys/modules/oce/Makefile2
-rw-r--r--sys/modules/usb/Makefile1
-rw-r--r--sys/modules/zlib/Makefile2
-rw-r--r--sys/net/altq/altq.h (renamed from sys/contrib/altq/altq/altq.h)10
-rw-r--r--sys/net/altq/altq_cbq.c (renamed from sys/contrib/altq/altq/altq_cbq.c)22
-rw-r--r--sys/net/altq/altq_cbq.h (renamed from sys/contrib/altq/altq/altq_cbq.h)15
-rw-r--r--sys/net/altq/altq_cdnr.c (renamed from sys/contrib/altq/altq/altq_cdnr.c)24
-rw-r--r--sys/net/altq/altq_cdnr.h (renamed from sys/contrib/altq/altq/altq_cdnr.h)9
-rw-r--r--sys/net/altq/altq_classq.h (renamed from sys/contrib/altq/altq/altq_classq.h)7
-rw-r--r--sys/net/altq/altq_hfsc.c (renamed from sys/contrib/altq/altq/altq_hfsc.c)34
-rw-r--r--sys/net/altq/altq_hfsc.h (renamed from sys/contrib/altq/altq/altq_hfsc.h)15
-rw-r--r--sys/net/altq/altq_priq.c (renamed from sys/contrib/altq/altq/altq_priq.c)29
-rw-r--r--sys/net/altq/altq_priq.h (renamed from sys/contrib/altq/altq/altq_priq.h)14
-rw-r--r--sys/net/altq/altq_red.c (renamed from sys/contrib/altq/altq/altq_red.c)26
-rw-r--r--sys/net/altq/altq_red.h (renamed from sys/contrib/altq/altq/altq_red.h)9
-rw-r--r--sys/net/altq/altq_rio.c (renamed from sys/contrib/altq/altq/altq_rio.c)28
-rw-r--r--sys/net/altq/altq_rio.h (renamed from sys/contrib/altq/altq/altq_rio.h)9
-rw-r--r--sys/net/altq/altq_rmclass.c (renamed from sys/contrib/altq/altq/altq_rmclass.c)44
-rw-r--r--sys/net/altq/altq_rmclass.h (renamed from sys/contrib/altq/altq/altq_rmclass.h)9
-rw-r--r--sys/net/altq/altq_rmclass_debug.h (renamed from sys/contrib/altq/altq/altq_rmclass_debug.h)7
-rw-r--r--sys/net/altq/altq_subr.c (renamed from sys/contrib/altq/altq/altq_subr.c)68
-rw-r--r--sys/net/altq/altq_var.h (renamed from sys/contrib/altq/altq/altq_var.h)38
-rw-r--r--sys/net/altq/if_altq.h (renamed from sys/contrib/altq/altq/if_altq.h)16
-rw-r--r--sys/net/bpf.c23
-rw-r--r--sys/net/bpf.h21
-rw-r--r--sys/net/ieee8023ad_lacp.c42
-rw-r--r--sys/net/if.c1
-rw-r--r--sys/net/if_media.c33
-rw-r--r--sys/net/if_media.h108
-rw-r--r--sys/net/if_tap.c13
-rw-r--r--sys/net/if_types.h431
-rw-r--r--sys/net/if_var.h2
-rw-r--r--sys/net/if_vlan.c21
-rw-r--r--sys/net/ifq.h2
-rw-r--r--sys/net/netisr.c15
-rw-r--r--sys/net/pfvar.h11
-rw-r--r--sys/net/route.c1
-rw-r--r--sys/net80211/ieee80211_mesh.c2
-rw-r--r--sys/netgraph/bluetooth/hci/ng_hci_cmds.c141
-rw-r--r--sys/netgraph/bluetooth/hci/ng_hci_evnt.c247
-rw-r--r--sys/netgraph/bluetooth/hci/ng_hci_main.c4
-rw-r--r--sys/netgraph/bluetooth/hci/ng_hci_misc.c9
-rw-r--r--sys/netgraph/bluetooth/hci/ng_hci_misc.h2
-rw-r--r--sys/netgraph/bluetooth/hci/ng_hci_ulpi.c220
-rw-r--r--sys/netgraph/bluetooth/hci/ng_hci_var.h1
-rw-r--r--sys/netgraph/bluetooth/include/ng_btsocket.h19
-rw-r--r--sys/netgraph/bluetooth/include/ng_btsocket_l2cap.h4
-rw-r--r--sys/netgraph/bluetooth/include/ng_hci.h323
-rw-r--r--sys/netgraph/bluetooth/include/ng_l2cap.h44
-rw-r--r--sys/netgraph/bluetooth/l2cap/ng_l2cap_cmds.c23
-rw-r--r--sys/netgraph/bluetooth/l2cap/ng_l2cap_cmds.h19
-rw-r--r--sys/netgraph/bluetooth/l2cap/ng_l2cap_evnt.c157
-rw-r--r--sys/netgraph/bluetooth/l2cap/ng_l2cap_llpi.c19
-rw-r--r--sys/netgraph/bluetooth/l2cap/ng_l2cap_llpi.h2
-rw-r--r--sys/netgraph/bluetooth/l2cap/ng_l2cap_misc.c94
-rw-r--r--sys/netgraph/bluetooth/l2cap/ng_l2cap_misc.h10
-rw-r--r--sys/netgraph/bluetooth/l2cap/ng_l2cap_ulpi.c147
-rw-r--r--sys/netgraph/bluetooth/l2cap/ng_l2cap_var.h7
-rw-r--r--sys/netgraph/bluetooth/socket/ng_btsocket_hci_raw.c3
-rw-r--r--sys/netgraph/bluetooth/socket/ng_btsocket_l2cap.c171
-rw-r--r--sys/netgraph/bluetooth/socket/ng_btsocket_l2cap_raw.c12
-rw-r--r--sys/netgraph/ng_deflate.c3
-rw-r--r--sys/netinet/igmp.c7
-rw-r--r--sys/netinet/in.c24
-rw-r--r--sys/netinet/in.h1
-rw-r--r--sys/netinet/in_kdtrace.c3
-rw-r--r--sys/netinet/in_kdtrace.h3
-rw-r--r--sys/netinet/in_var.h9
-rw-r--r--sys/netinet/ip_carp.c109
-rw-r--r--sys/netinet/ip_fw.h5
-rw-r--r--sys/netinet/ip_input.c562
-rw-r--r--sys/netinet/ip_ipsec.c11
-rw-r--r--sys/netinet/ip_reass.c658
-rw-r--r--sys/netinet/libalias/libalias.38
-rw-r--r--sys/netinet/sctp_indata.c11
-rw-r--r--sys/netinet/sctp_syscalls.c10
-rw-r--r--sys/netinet/siftr.c4
-rw-r--r--sys/netinet/tcp_subr.c110
-rw-r--r--sys/netinet/tcp_timer.c168
-rw-r--r--sys/netinet/tcp_timer.h24
-rw-r--r--sys/netinet/tcp_timewait.c7
-rw-r--r--sys/netinet/tcp_var.h5
-rw-r--r--sys/netinet6/in6.c39
-rw-r--r--sys/netinet6/in6.h1
-rw-r--r--sys/netinet6/in6_ifattach.c4
-rw-r--r--sys/netinet6/in6_mcast.c14
-rw-r--r--sys/netinet6/ip6_forward.c93
-rw-r--r--sys/netinet6/ip6_ipsec.c12
-rw-r--r--sys/netinet6/ip6_mroute.c31
-rw-r--r--sys/netinet6/ip6_mroute.h14
-rw-r--r--sys/netinet6/nd6.c15
-rw-r--r--sys/netinet6/nd6_nbr.c27
-rw-r--r--sys/netinet6/nd6_rtr.c12
-rw-r--r--sys/netipsec/ipsec.c65
-rw-r--r--sys/netipsec/ipsec.h5
-rw-r--r--sys/netipsec/ipsec_input.c58
-rw-r--r--sys/netipsec/ipsec_output.c258
-rw-r--r--sys/netipsec/key.c43
-rw-r--r--sys/netipsec/xform.h6
-rw-r--r--sys/netipsec/xform_ah.c47
-rw-r--r--sys/netipsec/xform_esp.c66
-rw-r--r--sys/netipsec/xform_ipcomp.c39
-rw-r--r--sys/netipsec/xform_ipip.c307
-rw-r--r--sys/netpfil/ipfw/ip_fw2.c6
-rw-r--r--sys/netpfil/ipfw/ip_fw_nat.c26
-rw-r--r--sys/netpfil/ipfw/ip_fw_private.h113
-rw-r--r--sys/netpfil/ipfw/ip_fw_sockopt.c564
-rw-r--r--sys/netpfil/ipfw/ip_fw_table.c573
-rw-r--r--sys/netpfil/ipfw/ip_fw_table.h13
-rw-r--r--sys/netpfil/pf/pf.c2
-rw-r--r--sys/netpfil/pf/pf_ioctl.c2
-rw-r--r--sys/netpfil/pf/pf_norm.c3
-rw-r--r--sys/nfsclient/nfs.h3
-rw-r--r--sys/ofed/include/linux/file.h2
-rw-r--r--sys/ofed/include/linux/linux_idr.c30
-rw-r--r--sys/opencrypto/cryptodeflate.c4
-rw-r--r--sys/opencrypto/deflate.h2
-rw-r--r--sys/opencrypto/gmac.h1
-rw-r--r--sys/pc98/pc98/genassym.c3
-rw-r--r--sys/powerpc/aim/aim_machdep.c (renamed from sys/powerpc/aim/machdep.c)370
-rw-r--r--sys/powerpc/aim/mmu_oea64.c5
-rw-r--r--sys/powerpc/booke/booke_machdep.c (renamed from sys/powerpc/booke/machdep.c)376
-rw-r--r--sys/powerpc/booke/interrupt.c25
-rw-r--r--sys/powerpc/booke/locore.S6
-rw-r--r--sys/powerpc/booke/pmap.c7
-rw-r--r--sys/powerpc/booke/trap.c519
-rw-r--r--sys/powerpc/booke/trap_subr.S13
-rw-r--r--sys/powerpc/conf/GENERIC1
-rw-r--r--sys/powerpc/include/pmc_mdep.h58
-rw-r--r--sys/powerpc/include/reg.h4
-rw-r--r--sys/powerpc/include/trap.h2
-rw-r--r--sys/powerpc/mpc85xx/mpc85xx_gpio.c307
-rw-r--r--sys/powerpc/ofw/ofw_machdep.c23
-rw-r--r--sys/powerpc/powerpc/busdma_machdep.c4
-rw-r--r--sys/powerpc/powerpc/machdep.c502
-rw-r--r--sys/powerpc/powerpc/trap.c (renamed from sys/powerpc/aim/trap.c)150
-rw-r--r--sys/powerpc/powerpc/uma_machdep.c (renamed from sys/powerpc/aim/uma_machdep.c)0
-rw-r--r--sys/rpc/svc_generic.c4
-rw-r--r--sys/rpc/svc_vc.c2
-rw-r--r--sys/sparc64/include/reg.h6
-rw-r--r--sys/sparc64/pci/apb.c10
-rw-r--r--sys/sparc64/pci/sbbc.c3
-rw-r--r--sys/sys/buf.h4
-rw-r--r--sys/sys/cdefs.h26
-rw-r--r--sys/sys/elf_common.h1
-rw-r--r--sys/sys/fcntl.h4
-rw-r--r--sys/sys/filedesc.h2
-rw-r--r--sys/sys/imgact.h1
-rw-r--r--sys/sys/kerneldump.h1
-rw-r--r--sys/sys/malloc.h10
-rw-r--r--sys/sys/mbuf.h19
-rw-r--r--sys/sys/module.h2
-rw-r--r--sys/sys/mount.h1
-rw-r--r--sys/sys/mouse.h28
-rw-r--r--sys/sys/nv.h134
-rw-r--r--sys/sys/nv_impl.h51
-rw-r--r--sys/sys/nvlist_impl.h4
-rw-r--r--sys/sys/param.h18
-rw-r--r--sys/sys/pmc.h6
-rw-r--r--sys/sys/procctl.h2
-rw-r--r--sys/sys/procfs.h27
-rw-r--r--sys/sys/racct.h4
-rw-r--r--sys/sys/seq.h8
-rw-r--r--sys/sys/socketvar.h2
-rw-r--r--sys/sys/sockio.h1
-rw-r--r--sys/sys/syscall.h2
-rw-r--r--sys/sys/syscall.mk2
-rw-r--r--sys/sys/syscallsubr.h4
-rw-r--r--sys/sys/sysproto.h92
-rw-r--r--sys/sys/systm.h1
-rw-r--r--sys/sys/vnode.h2
-rw-r--r--sys/sys/zlib.h (renamed from sys/net/zlib.h)0
-rw-r--r--sys/sys/zutil.h (renamed from sys/net/zutil.h)2
-rw-r--r--sys/ufs/ffs/ffs_alloc.c78
-rw-r--r--sys/ufs/ffs/ffs_vfsops.c4
-rw-r--r--sys/ufs/ufs/inode.h2
-rw-r--r--sys/vm/device_pager.c2
-rw-r--r--sys/vm/sg_pager.c2
-rw-r--r--sys/vm/swap_pager.c103
-rw-r--r--sys/vm/uma_core.c14
-rw-r--r--sys/vm/vm_fault.c88
-rw-r--r--sys/vm/vm_map.c55
-rw-r--r--sys/vm/vm_mmap.c34
-rw-r--r--sys/vm/vm_page.c186
-rw-r--r--sys/vm/vm_pageout.c302
-rw-r--r--sys/vm/vm_reserv.c14
-rw-r--r--sys/vm/vm_unix.c81
-rw-r--r--sys/x86/acpica/OsdEnvironment.c2
-rw-r--r--sys/x86/acpica/acpi_wakeup.c2
-rw-r--r--sys/x86/acpica/srat.c2
-rw-r--r--sys/x86/include/apicvar.h1
-rw-r--r--sys/x86/include/mca.h2
-rw-r--r--sys/x86/include/reg.h1
-rw-r--r--sys/x86/include/segments.h8
-rw-r--r--sys/x86/iommu/busdma_dmar.c18
-rw-r--r--sys/x86/iommu/intel_dmar.h2
-rw-r--r--sys/x86/iommu/intel_gas.c33
-rw-r--r--sys/x86/pci/qpi.c2
-rw-r--r--sys/x86/x86/busdma_bounce.c9
-rw-r--r--sys/x86/x86/cpu_machdep.c486
-rw-r--r--sys/x86/x86/identcpu.c4
-rw-r--r--sys/x86/x86/intr_machdep.c7
-rw-r--r--sys/x86/x86/local_apic.c6
-rw-r--r--sys/x86/x86/mca.c27
-rw-r--r--sys/x86/x86/mp_x86.c1120
-rw-r--r--sys/x86/xen/xen_apic.c19
-rw-r--r--sys/x86/xen/xen_intr.c4
-rw-r--r--sys/x86/xen/xen_nexus.c6
957 files changed, 57854 insertions, 50750 deletions
diff --git a/sys/amd64/amd64/apic_vector.S b/sys/amd64/amd64/apic_vector.S
index c3aac33..4455cab 100644
--- a/sys/amd64/amd64/apic_vector.S
+++ b/sys/amd64/amd64/apic_vector.S
@@ -174,6 +174,22 @@ IDTVEC(xen_intr_upcall)
jmp doreti
#endif
+#ifdef HYPERV
+/*
+ * This is the Hyper-V vmbus channel direct callback interrupt.
+ * Only used when it is running on Hyper-V.
+ */
+ .text
+ SUPERALIGN_TEXT
+IDTVEC(hv_vmbus_callback)
+ PUSH_FRAME
+ FAKE_MCOUNT(TF_RIP(%rsp))
+ movq %rsp, %rdi
+ call hv_vector_handler
+ MEXITCOUNT
+ jmp doreti
+#endif
+
#ifdef SMP
/*
* Global address space TLB shootdown.
diff --git a/sys/amd64/amd64/machdep.c b/sys/amd64/amd64/machdep.c
index e38482c..3230937 100644
--- a/sys/amd64/amd64/machdep.c
+++ b/sys/amd64/amd64/machdep.c
@@ -578,384 +578,6 @@ freebsd4_sigreturn(struct thread *td, struct freebsd4_sigreturn_args *uap)
}
#endif
-
-/*
- * Machine dependent boot() routine
- *
- * I haven't seen anything to put here yet
- * Possibly some stuff might be grafted back here from boot()
- */
-void
-cpu_boot(int howto)
-{
-}
-
-/*
- * Flush the D-cache for non-DMA I/O so that the I-cache can
- * be made coherent later.
- */
-void
-cpu_flush_dcache(void *ptr, size_t len)
-{
- /* Not applicable */
-}
-
-/* Get current clock frequency for the given cpu id. */
-int
-cpu_est_clockrate(int cpu_id, uint64_t *rate)
-{
- uint64_t tsc1, tsc2;
- uint64_t acnt, mcnt, perf;
- register_t reg;
-
- if (pcpu_find(cpu_id) == NULL || rate == NULL)
- return (EINVAL);
-
- /*
- * If TSC is P-state invariant and APERF/MPERF MSRs do not exist,
- * DELAY(9) based logic fails.
- */
- if (tsc_is_invariant && !tsc_perf_stat)
- return (EOPNOTSUPP);
-
-#ifdef SMP
- if (smp_cpus > 1) {
- /* Schedule ourselves on the indicated cpu. */
- thread_lock(curthread);
- sched_bind(curthread, cpu_id);
- thread_unlock(curthread);
- }
-#endif
-
- /* Calibrate by measuring a short delay. */
- reg = intr_disable();
- if (tsc_is_invariant) {
- wrmsr(MSR_MPERF, 0);
- wrmsr(MSR_APERF, 0);
- tsc1 = rdtsc();
- DELAY(1000);
- mcnt = rdmsr(MSR_MPERF);
- acnt = rdmsr(MSR_APERF);
- tsc2 = rdtsc();
- intr_restore(reg);
- perf = 1000 * acnt / mcnt;
- *rate = (tsc2 - tsc1) * perf;
- } else {
- tsc1 = rdtsc();
- DELAY(1000);
- tsc2 = rdtsc();
- intr_restore(reg);
- *rate = (tsc2 - tsc1) * 1000;
- }
-
-#ifdef SMP
- if (smp_cpus > 1) {
- thread_lock(curthread);
- sched_unbind(curthread);
- thread_unlock(curthread);
- }
-#endif
-
- return (0);
-}
-
-/*
- * Shutdown the CPU as much as possible
- */
-void
-cpu_halt(void)
-{
- for (;;)
- halt();
-}
-
-void (*cpu_idle_hook)(sbintime_t) = NULL; /* ACPI idle hook. */
-static int cpu_ident_amdc1e = 0; /* AMD C1E supported. */
-static int idle_mwait = 1; /* Use MONITOR/MWAIT for short idle. */
-SYSCTL_INT(_machdep, OID_AUTO, idle_mwait, CTLFLAG_RWTUN, &idle_mwait,
- 0, "Use MONITOR/MWAIT for short idle");
-
-#define STATE_RUNNING 0x0
-#define STATE_MWAIT 0x1
-#define STATE_SLEEPING 0x2
-
-static void
-cpu_idle_acpi(sbintime_t sbt)
-{
- int *state;
-
- state = (int *)PCPU_PTR(monitorbuf);
- *state = STATE_SLEEPING;
-
- /* See comments in cpu_idle_hlt(). */
- disable_intr();
- if (sched_runnable())
- enable_intr();
- else if (cpu_idle_hook)
- cpu_idle_hook(sbt);
- else
- __asm __volatile("sti; hlt");
- *state = STATE_RUNNING;
-}
-
-static void
-cpu_idle_hlt(sbintime_t sbt)
-{
- int *state;
-
- state = (int *)PCPU_PTR(monitorbuf);
- *state = STATE_SLEEPING;
-
- /*
- * Since we may be in a critical section from cpu_idle(), if
- * an interrupt fires during that critical section we may have
- * a pending preemption. If the CPU halts, then that thread
- * may not execute until a later interrupt awakens the CPU.
- * To handle this race, check for a runnable thread after
- * disabling interrupts and immediately return if one is
- * found. Also, we must absolutely guarentee that hlt is
- * the next instruction after sti. This ensures that any
- * interrupt that fires after the call to disable_intr() will
- * immediately awaken the CPU from hlt. Finally, please note
- * that on x86 this works fine because of interrupts enabled only
- * after the instruction following sti takes place, while IF is set
- * to 1 immediately, allowing hlt instruction to acknowledge the
- * interrupt.
- */
- disable_intr();
- if (sched_runnable())
- enable_intr();
- else
- __asm __volatile("sti; hlt");
- *state = STATE_RUNNING;
-}
-
-/*
- * MWAIT cpu power states. Lower 4 bits are sub-states.
- */
-#define MWAIT_C0 0xf0
-#define MWAIT_C1 0x00
-#define MWAIT_C2 0x10
-#define MWAIT_C3 0x20
-#define MWAIT_C4 0x30
-
-static void
-cpu_idle_mwait(sbintime_t sbt)
-{
- int *state;
-
- state = (int *)PCPU_PTR(monitorbuf);
- *state = STATE_MWAIT;
-
- /* See comments in cpu_idle_hlt(). */
- disable_intr();
- if (sched_runnable()) {
- enable_intr();
- *state = STATE_RUNNING;
- return;
- }
- cpu_monitor(state, 0, 0);
- if (*state == STATE_MWAIT)
- __asm __volatile("sti; mwait" : : "a" (MWAIT_C1), "c" (0));
- else
- enable_intr();
- *state = STATE_RUNNING;
-}
-
-static void
-cpu_idle_spin(sbintime_t sbt)
-{
- int *state;
- int i;
-
- state = (int *)PCPU_PTR(monitorbuf);
- *state = STATE_RUNNING;
-
- /*
- * The sched_runnable() call is racy but as long as there is
- * a loop missing it one time will have just a little impact if any
- * (and it is much better than missing the check at all).
- */
- for (i = 0; i < 1000; i++) {
- if (sched_runnable())
- return;
- cpu_spinwait();
- }
-}
-
-/*
- * C1E renders the local APIC timer dead, so we disable it by
- * reading the Interrupt Pending Message register and clearing
- * both C1eOnCmpHalt (bit 28) and SmiOnCmpHalt (bit 27).
- *
- * Reference:
- * "BIOS and Kernel Developer's Guide for AMD NPT Family 0Fh Processors"
- * #32559 revision 3.00+
- */
-#define MSR_AMDK8_IPM 0xc0010055
-#define AMDK8_SMIONCMPHALT (1ULL << 27)
-#define AMDK8_C1EONCMPHALT (1ULL << 28)
-#define AMDK8_CMPHALT (AMDK8_SMIONCMPHALT | AMDK8_C1EONCMPHALT)
-
-static void
-cpu_probe_amdc1e(void)
-{
-
- /*
- * Detect the presence of C1E capability mostly on latest
- * dual-cores (or future) k8 family.
- */
- if (cpu_vendor_id == CPU_VENDOR_AMD &&
- (cpu_id & 0x00000f00) == 0x00000f00 &&
- (cpu_id & 0x0fff0000) >= 0x00040000) {
- cpu_ident_amdc1e = 1;
- }
-}
-
-void (*cpu_idle_fn)(sbintime_t) = cpu_idle_acpi;
-
-void
-cpu_idle(int busy)
-{
- uint64_t msr;
- sbintime_t sbt = -1;
-
- CTR2(KTR_SPARE2, "cpu_idle(%d) at %d",
- busy, curcpu);
-#ifdef MP_WATCHDOG
- ap_watchdog(PCPU_GET(cpuid));
-#endif
- /* If we are busy - try to use fast methods. */
- if (busy) {
- if ((cpu_feature2 & CPUID2_MON) && idle_mwait) {
- cpu_idle_mwait(busy);
- goto out;
- }
- }
-
- /* If we have time - switch timers into idle mode. */
- if (!busy) {
- critical_enter();
- sbt = cpu_idleclock();
- }
-
- /* Apply AMD APIC timer C1E workaround. */
- if (cpu_ident_amdc1e && cpu_disable_c3_sleep) {
- msr = rdmsr(MSR_AMDK8_IPM);
- if (msr & AMDK8_CMPHALT)
- wrmsr(MSR_AMDK8_IPM, msr & ~AMDK8_CMPHALT);
- }
-
- /* Call main idle method. */
- cpu_idle_fn(sbt);
-
- /* Switch timers back into active mode. */
- if (!busy) {
- cpu_activeclock();
- critical_exit();
- }
-out:
- CTR2(KTR_SPARE2, "cpu_idle(%d) at %d done",
- busy, curcpu);
-}
-
-int
-cpu_idle_wakeup(int cpu)
-{
- struct pcpu *pcpu;
- int *state;
-
- pcpu = pcpu_find(cpu);
- state = (int *)pcpu->pc_monitorbuf;
- /*
- * This doesn't need to be atomic since missing the race will
- * simply result in unnecessary IPIs.
- */
- if (*state == STATE_SLEEPING)
- return (0);
- if (*state == STATE_MWAIT)
- *state = STATE_RUNNING;
- return (1);
-}
-
-/*
- * Ordered by speed/power consumption.
- */
-struct {
- void *id_fn;
- char *id_name;
-} idle_tbl[] = {
- { cpu_idle_spin, "spin" },
- { cpu_idle_mwait, "mwait" },
- { cpu_idle_hlt, "hlt" },
- { cpu_idle_acpi, "acpi" },
- { NULL, NULL }
-};
-
-static int
-idle_sysctl_available(SYSCTL_HANDLER_ARGS)
-{
- char *avail, *p;
- int error;
- int i;
-
- avail = malloc(256, M_TEMP, M_WAITOK);
- p = avail;
- for (i = 0; idle_tbl[i].id_name != NULL; i++) {
- if (strstr(idle_tbl[i].id_name, "mwait") &&
- (cpu_feature2 & CPUID2_MON) == 0)
- continue;
- if (strcmp(idle_tbl[i].id_name, "acpi") == 0 &&
- cpu_idle_hook == NULL)
- continue;
- p += sprintf(p, "%s%s", p != avail ? ", " : "",
- idle_tbl[i].id_name);
- }
- error = sysctl_handle_string(oidp, avail, 0, req);
- free(avail, M_TEMP);
- return (error);
-}
-
-SYSCTL_PROC(_machdep, OID_AUTO, idle_available, CTLTYPE_STRING | CTLFLAG_RD,
- 0, 0, idle_sysctl_available, "A", "list of available idle functions");
-
-static int
-idle_sysctl(SYSCTL_HANDLER_ARGS)
-{
- char buf[16];
- int error;
- char *p;
- int i;
-
- p = "unknown";
- for (i = 0; idle_tbl[i].id_name != NULL; i++) {
- if (idle_tbl[i].id_fn == cpu_idle_fn) {
- p = idle_tbl[i].id_name;
- break;
- }
- }
- strncpy(buf, p, sizeof(buf));
- error = sysctl_handle_string(oidp, buf, sizeof(buf), req);
- if (error != 0 || req->newptr == NULL)
- return (error);
- for (i = 0; idle_tbl[i].id_name != NULL; i++) {
- if (strstr(idle_tbl[i].id_name, "mwait") &&
- (cpu_feature2 & CPUID2_MON) == 0)
- continue;
- if (strcmp(idle_tbl[i].id_name, "acpi") == 0 &&
- cpu_idle_hook == NULL)
- continue;
- if (strcmp(idle_tbl[i].id_name, buf))
- continue;
- cpu_idle_fn = idle_tbl[i].id_fn;
- return (0);
- }
- return (EINVAL);
-}
-
-SYSCTL_PROC(_machdep, OID_AUTO, idle, CTLTYPE_STRING | CTLFLAG_RW, 0, 0,
- idle_sysctl, "A", "currently selected idle function");
-
/*
* Reset registers to default values on exec.
*/
diff --git a/sys/amd64/amd64/mp_machdep.c b/sys/amd64/amd64/mp_machdep.c
index c81495a..83ca548 100644
--- a/sys/amd64/amd64/mp_machdep.c
+++ b/sys/amd64/amd64/mp_machdep.c
@@ -81,28 +81,11 @@ __FBSDID("$FreeBSD$");
#define BIOS_RESET (0x0f)
#define BIOS_WARM (0x0a)
-/* lock region used by kernel profiling */
-int mcount_lock;
-
-int mp_naps; /* # of Applications processors */
-int boot_cpu_id = -1; /* designated BSP */
-
-extern struct pcpu __pcpu[];
-
-/* AP uses this during bootstrap. Do not staticize. */
-char *bootSTK;
-int bootAP;
-
-/* Free these after use */
-void *bootstacks[MAXCPU];
+extern struct pcpu __pcpu[];
/* Temporary variables for init_secondary() */
char *doublefault_stack;
char *nmi_stack;
-void *dpcpu;
-
-struct pcb stoppcbs[MAXCPU];
-struct susppcb **susppcbs;
/* Variables needed for SMP tlb shootdown. */
vm_offset_t smp_tlb_addr2;
@@ -112,309 +95,16 @@ uint64_t pcid_cr3;
pmap_t smp_tlb_pmap;
extern int invpcid_works;
-#ifdef COUNT_IPIS
-/* Interrupt counts. */
-static u_long *ipi_preempt_counts[MAXCPU];
-static u_long *ipi_ast_counts[MAXCPU];
-u_long *ipi_invltlb_counts[MAXCPU];
-u_long *ipi_invlrng_counts[MAXCPU];
-u_long *ipi_invlpg_counts[MAXCPU];
-u_long *ipi_invlcache_counts[MAXCPU];
-u_long *ipi_rendezvous_counts[MAXCPU];
-static u_long *ipi_hardclock_counts[MAXCPU];
-#endif
-
-/* Default cpu_ops implementation. */
-struct cpu_ops cpu_ops;
-
extern inthand_t IDTVEC(fast_syscall), IDTVEC(fast_syscall32);
-extern int pmap_pcid_enabled;
-
/*
* Local data and functions.
*/
-static volatile cpuset_t ipi_nmi_pending;
-
-/* used to hold the AP's until we are ready to release them */
-struct mtx ap_boot_mtx;
-
-/* Set to 1 once we're ready to let the APs out of the pen. */
-static volatile int aps_ready = 0;
-
-/*
- * Store data from cpu_add() until later in the boot when we actually setup
- * the APs.
- */
-struct cpu_info {
- int cpu_present:1;
- int cpu_bsp:1;
- int cpu_disabled:1;
- int cpu_hyperthread:1;
-} static cpu_info[MAX_APIC_ID + 1];
-int cpu_apic_ids[MAXCPU];
-int apic_cpuids[MAX_APIC_ID + 1];
-
-/* Holds pending bitmap based IPIs per CPU */
-volatile u_int cpu_ipi_pending[MAXCPU];
-
-static u_int boot_address;
-static int cpu_logical; /* logical cpus per core */
-static int cpu_cores; /* cores per package */
-
-static void assign_cpu_ids(void);
-static void set_interrupt_apic_ids(void);
static int start_ap(int apic_id);
-static void release_aps(void *dummy);
-static u_int hyperthreading_cpus; /* logical cpus sharing L1 cache */
-static int hyperthreading_allowed = 1;
static u_int bootMP_size;
-
-static void
-mem_range_AP_init(void)
-{
- if (mem_range_softc.mr_op && mem_range_softc.mr_op->initAP)
- mem_range_softc.mr_op->initAP(&mem_range_softc);
-}
-
-static void
-topo_probe_amd(void)
-{
- int core_id_bits;
- int id;
-
- /* AMD processors do not support HTT. */
- cpu_logical = 1;
-
- if ((amd_feature2 & AMDID2_CMP) == 0) {
- cpu_cores = 1;
- return;
- }
-
- core_id_bits = (cpu_procinfo2 & AMDID_COREID_SIZE) >>
- AMDID_COREID_SIZE_SHIFT;
- if (core_id_bits == 0) {
- cpu_cores = (cpu_procinfo2 & AMDID_CMP_CORES) + 1;
- return;
- }
-
- /* Fam 10h and newer should get here. */
- for (id = 0; id <= MAX_APIC_ID; id++) {
- /* Check logical CPU availability. */
- if (!cpu_info[id].cpu_present || cpu_info[id].cpu_disabled)
- continue;
- /* Check if logical CPU has the same package ID. */
- if ((id >> core_id_bits) != (boot_cpu_id >> core_id_bits))
- continue;
- cpu_cores++;
- }
-}
-
-/*
- * Round up to the next power of two, if necessary, and then
- * take log2.
- * Returns -1 if argument is zero.
- */
-static __inline int
-mask_width(u_int x)
-{
-
- return (fls(x << (1 - powerof2(x))) - 1);
-}
-
-static void
-topo_probe_0x4(void)
-{
- u_int p[4];
- int pkg_id_bits;
- int core_id_bits;
- int max_cores;
- int max_logical;
- int id;
-
- /* Both zero and one here mean one logical processor per package. */
- max_logical = (cpu_feature & CPUID_HTT) != 0 ?
- (cpu_procinfo & CPUID_HTT_CORES) >> 16 : 1;
- if (max_logical <= 1)
- return;
-
- /*
- * Because of uniformity assumption we examine only
- * those logical processors that belong to the same
- * package as BSP. Further, we count number of
- * logical processors that belong to the same core
- * as BSP thus deducing number of threads per core.
- */
- if (cpu_high >= 0x4) {
- cpuid_count(0x04, 0, p);
- max_cores = ((p[0] >> 26) & 0x3f) + 1;
- } else
- max_cores = 1;
- core_id_bits = mask_width(max_logical/max_cores);
- if (core_id_bits < 0)
- return;
- pkg_id_bits = core_id_bits + mask_width(max_cores);
-
- for (id = 0; id <= MAX_APIC_ID; id++) {
- /* Check logical CPU availability. */
- if (!cpu_info[id].cpu_present || cpu_info[id].cpu_disabled)
- continue;
- /* Check if logical CPU has the same package ID. */
- if ((id >> pkg_id_bits) != (boot_cpu_id >> pkg_id_bits))
- continue;
- cpu_cores++;
- /* Check if logical CPU has the same package and core IDs. */
- if ((id >> core_id_bits) == (boot_cpu_id >> core_id_bits))
- cpu_logical++;
- }
-
- KASSERT(cpu_cores >= 1 && cpu_logical >= 1,
- ("topo_probe_0x4 couldn't find BSP"));
-
- cpu_cores /= cpu_logical;
- hyperthreading_cpus = cpu_logical;
-}
-
-static void
-topo_probe_0xb(void)
-{
- u_int p[4];
- int bits;
- int cnt;
- int i;
- int logical;
- int type;
- int x;
-
- /* We only support three levels for now. */
- for (i = 0; i < 3; i++) {
- cpuid_count(0x0b, i, p);
-
- /* Fall back if CPU leaf 11 doesn't really exist. */
- if (i == 0 && p[1] == 0) {
- topo_probe_0x4();
- return;
- }
-
- bits = p[0] & 0x1f;
- logical = p[1] &= 0xffff;
- type = (p[2] >> 8) & 0xff;
- if (type == 0 || logical == 0)
- break;
- /*
- * Because of uniformity assumption we examine only
- * those logical processors that belong to the same
- * package as BSP.
- */
- for (cnt = 0, x = 0; x <= MAX_APIC_ID; x++) {
- if (!cpu_info[x].cpu_present ||
- cpu_info[x].cpu_disabled)
- continue;
- if (x >> bits == boot_cpu_id >> bits)
- cnt++;
- }
- if (type == CPUID_TYPE_SMT)
- cpu_logical = cnt;
- else if (type == CPUID_TYPE_CORE)
- cpu_cores = cnt;
- }
- if (cpu_logical == 0)
- cpu_logical = 1;
- cpu_cores /= cpu_logical;
-}
-
-/*
- * Both topology discovery code and code that consumes topology
- * information assume top-down uniformity of the topology.
- * That is, all physical packages must be identical and each
- * core in a package must have the same number of threads.
- * Topology information is queried only on BSP, on which this
- * code runs and for which it can query CPUID information.
- * Then topology is extrapolated on all packages using the
- * uniformity assumption.
- */
-static void
-topo_probe(void)
-{
- static int cpu_topo_probed = 0;
-
- if (cpu_topo_probed)
- return;
-
- CPU_ZERO(&logical_cpus_mask);
- if (mp_ncpus <= 1)
- cpu_cores = cpu_logical = 1;
- else if (cpu_vendor_id == CPU_VENDOR_AMD)
- topo_probe_amd();
- else if (cpu_vendor_id == CPU_VENDOR_INTEL) {
- /*
- * See Intel(R) 64 Architecture Processor
- * Topology Enumeration article for details.
- *
- * Note that 0x1 <= cpu_high < 4 case should be
- * compatible with topo_probe_0x4() logic when
- * CPUID.1:EBX[23:16] > 0 (cpu_cores will be 1)
- * or it should trigger the fallback otherwise.
- */
- if (cpu_high >= 0xb)
- topo_probe_0xb();
- else if (cpu_high >= 0x1)
- topo_probe_0x4();
- }
-
- /*
- * Fallback: assume each logical CPU is in separate
- * physical package. That is, no multi-core, no SMT.
- */
- if (cpu_cores == 0 || cpu_logical == 0)
- cpu_cores = cpu_logical = 1;
- cpu_topo_probed = 1;
-}
-
-struct cpu_group *
-cpu_topo(void)
-{
- int cg_flags;
-
- /*
- * Determine whether any threading flags are
- * necessry.
- */
- topo_probe();
- if (cpu_logical > 1 && hyperthreading_cpus)
- cg_flags = CG_FLAG_HTT;
- else if (cpu_logical > 1)
- cg_flags = CG_FLAG_SMT;
- else
- cg_flags = 0;
- if (mp_ncpus % (cpu_cores * cpu_logical) != 0) {
- printf("WARNING: Non-uniform processors.\n");
- printf("WARNING: Using suboptimal topology.\n");
- return (smp_topo_none());
- }
- /*
- * No multi-core or hyper-threaded.
- */
- if (cpu_logical * cpu_cores == 1)
- return (smp_topo_none());
- /*
- * Only HTT no multi-core.
- */
- if (cpu_logical > 1 && cpu_cores == 1)
- return (smp_topo_1level(CG_SHARE_L1, cpu_logical, cg_flags));
- /*
- * Only multi-core no HTT.
- */
- if (cpu_cores > 1 && cpu_logical == 1)
- return (smp_topo_1level(CG_SHARE_L2, cpu_cores, cg_flags));
- /*
- * Both HTT and multi-core.
- */
- return (smp_topo_2level(CG_SHARE_L2, cpu_cores,
- CG_SHARE_L1, cpu_logical, cg_flags));
-}
+static u_int boot_address;
/*
* Calculate usable address in base memory for AP trampoline code.
@@ -433,85 +123,6 @@ mp_bootaddress(u_int basemem)
return mptramp_pagetables;
}
-void
-cpu_add(u_int apic_id, char boot_cpu)
-{
-
- if (apic_id > MAX_APIC_ID) {
- panic("SMP: APIC ID %d too high", apic_id);
- return;
- }
- KASSERT(cpu_info[apic_id].cpu_present == 0, ("CPU %d added twice",
- apic_id));
- cpu_info[apic_id].cpu_present = 1;
- if (boot_cpu) {
- KASSERT(boot_cpu_id == -1,
- ("CPU %d claims to be BSP, but CPU %d already is", apic_id,
- boot_cpu_id));
- boot_cpu_id = apic_id;
- cpu_info[apic_id].cpu_bsp = 1;
- }
- if (mp_ncpus < MAXCPU) {
- mp_ncpus++;
- mp_maxid = mp_ncpus - 1;
- }
- if (bootverbose)
- printf("SMP: Added CPU %d (%s)\n", apic_id, boot_cpu ? "BSP" :
- "AP");
-}
-
-void
-cpu_mp_setmaxid(void)
-{
-
- /*
- * mp_maxid should be already set by calls to cpu_add().
- * Just sanity check its value here.
- */
- if (mp_ncpus == 0)
- KASSERT(mp_maxid == 0,
- ("%s: mp_ncpus is zero, but mp_maxid is not", __func__));
- else if (mp_ncpus == 1)
- mp_maxid = 0;
- else
- KASSERT(mp_maxid >= mp_ncpus - 1,
- ("%s: counters out of sync: max %d, count %d", __func__,
- mp_maxid, mp_ncpus));
-}
-
-int
-cpu_mp_probe(void)
-{
-
- /*
- * Always record BSP in CPU map so that the mbuf init code works
- * correctly.
- */
- CPU_SETOF(0, &all_cpus);
- if (mp_ncpus == 0) {
- /*
- * No CPUs were found, so this must be a UP system. Setup
- * the variables to represent a system with a single CPU
- * with an id of 0.
- */
- mp_ncpus = 1;
- return (0);
- }
-
- /* At least one CPU was found. */
- if (mp_ncpus == 1) {
- /*
- * One CPU was found, so this must be a UP system with
- * an I/O APIC.
- */
- mp_maxid = 0;
- return (0);
- }
-
- /* At least two CPUs were found. */
- return (1);
-}
-
/*
* Initialize the IPI handlers and start up the AP's.
*/
@@ -575,47 +186,6 @@ cpu_mp_start(void)
/*
- * Print various information about the SMP system hardware and setup.
- */
-void
-cpu_mp_announce(void)
-{
- const char *hyperthread;
- int i;
-
- printf("FreeBSD/SMP: %d package(s) x %d core(s)",
- mp_ncpus / (cpu_cores * cpu_logical), cpu_cores);
- if (hyperthreading_cpus > 1)
- printf(" x %d HTT threads", cpu_logical);
- else if (cpu_logical > 1)
- printf(" x %d SMT threads", cpu_logical);
- printf("\n");
-
- /* List active CPUs first. */
- printf(" cpu0 (BSP): APIC ID: %2d\n", boot_cpu_id);
- for (i = 1; i < mp_ncpus; i++) {
- if (cpu_info[cpu_apic_ids[i]].cpu_hyperthread)
- hyperthread = "/HT";
- else
- hyperthread = "";
- printf(" cpu%d (AP%s): APIC ID: %2d\n", i, hyperthread,
- cpu_apic_ids[i]);
- }
-
- /* List disabled CPUs last. */
- for (i = 0; i <= MAX_APIC_ID; i++) {
- if (!cpu_info[i].cpu_present || !cpu_info[i].cpu_disabled)
- continue;
- if (cpu_info[i].cpu_hyperthread)
- hyperthread = "/HT";
- else
- hyperthread = "";
- printf(" cpu (AP%s): APIC ID: %2d (disabled)\n", hyperthread,
- i);
- }
-}
-
-/*
* AP CPU's call this to initialize themselves.
*/
void
@@ -624,7 +194,6 @@ init_secondary(void)
struct pcpu *pc;
struct nmi_pcpu *np;
u_int64_t msr, cr0;
- u_int cpuid;
int cpu, gsel_tss, x;
struct region_descriptor ap_gdt;
@@ -712,94 +281,7 @@ init_secondary(void)
while (!aps_ready)
ia32_pause();
- /*
- * On real hardware, switch to x2apic mode if possible. Do it
- * after aps_ready was signalled, to avoid manipulating the
- * mode while BSP might still want to send some IPI to us
- * (second startup IPI is ignored on modern hardware etc).
- */
- lapic_xapic_mode();
-
- /* Initialize the PAT MSR. */
- pmap_init_pat();
-
- /* set up CPU registers and state */
- cpu_setregs();
-
- /* set up SSE/NX */
- initializecpu();
-
- /* set up FPU state on the AP */
- fpuinit();
-
- if (cpu_ops.cpu_init)
- cpu_ops.cpu_init();
-
- /* A quick check from sanity claus */
- cpuid = PCPU_GET(cpuid);
- if (PCPU_GET(apic_id) != lapic_id()) {
- printf("SMP: cpuid = %d\n", cpuid);
- printf("SMP: actual apic_id = %d\n", lapic_id());
- printf("SMP: correct apic_id = %d\n", PCPU_GET(apic_id));
- panic("cpuid mismatch! boom!!");
- }
-
- /* Initialize curthread. */
- KASSERT(PCPU_GET(idlethread) != NULL, ("no idle thread"));
- PCPU_SET(curthread, PCPU_GET(idlethread));
-
- mca_init();
-
- mtx_lock_spin(&ap_boot_mtx);
-
- /* Init local apic for irq's */
- lapic_setup(1);
-
- /* Set memory range attributes for this CPU to match the BSP */
- mem_range_AP_init();
-
- smp_cpus++;
-
- CTR1(KTR_SMP, "SMP: AP CPU #%d Launched", cpuid);
- printf("SMP: AP CPU #%d Launched!\n", cpuid);
-
- /* Determine if we are a logical CPU. */
- /* XXX Calculation depends on cpu_logical being a power of 2, e.g. 2 */
- if (cpu_logical > 1 && PCPU_GET(apic_id) % cpu_logical != 0)
- CPU_SET(cpuid, &logical_cpus_mask);
-
- if (bootverbose)
- lapic_dump("AP");
-
- if (smp_cpus == mp_ncpus) {
- /* enable IPI's, tlb shootdown, freezes etc */
- atomic_store_rel_int(&smp_started, 1);
- }
-
- /*
- * Enable global pages TLB extension
- * This also implicitly flushes the TLB
- */
-
- load_cr4(rcr4() | CR4_PGE);
- if (pmap_pcid_enabled)
- load_cr4(rcr4() | CR4_PCIDE);
- load_ds(_udatasel);
- load_es(_udatasel);
- load_fs(_ufssel);
- mtx_unlock_spin(&ap_boot_mtx);
-
- /* Wait until all the AP's are up. */
- while (smp_started == 0)
- ia32_pause();
-
- /* Start per-CPU event timers. */
- cpu_initclocks_ap();
-
- sched_throw(NULL);
-
- panic("scheduler returned us to %s", __func__);
- /* NOTREACHED */
+ init_secondary_tail();
}
/*******************************************************************
@@ -807,108 +289,6 @@ init_secondary(void)
*/
/*
- * We tell the I/O APIC code about all the CPUs we want to receive
- * interrupts. If we don't want certain CPUs to receive IRQs we
- * can simply not tell the I/O APIC code about them in this function.
- * We also do not tell it about the BSP since it tells itself about
- * the BSP internally to work with UP kernels and on UP machines.
- */
-static void
-set_interrupt_apic_ids(void)
-{
- u_int i, apic_id;
-
- for (i = 0; i < MAXCPU; i++) {
- apic_id = cpu_apic_ids[i];
- if (apic_id == -1)
- continue;
- if (cpu_info[apic_id].cpu_bsp)
- continue;
- if (cpu_info[apic_id].cpu_disabled)
- continue;
-
- /* Don't let hyperthreads service interrupts. */
- if (cpu_logical > 1 &&
- apic_id % cpu_logical != 0)
- continue;
-
- intr_add_cpu(i);
- }
-}
-
-/*
- * Assign logical CPU IDs to local APICs.
- */
-static void
-assign_cpu_ids(void)
-{
- u_int i;
-
- TUNABLE_INT_FETCH("machdep.hyperthreading_allowed",
- &hyperthreading_allowed);
-
- /* Check for explicitly disabled CPUs. */
- for (i = 0; i <= MAX_APIC_ID; i++) {
- if (!cpu_info[i].cpu_present || cpu_info[i].cpu_bsp)
- continue;
-
- if (hyperthreading_cpus > 1 && i % hyperthreading_cpus != 0) {
- cpu_info[i].cpu_hyperthread = 1;
-
- /*
- * Don't use HT CPU if it has been disabled by a
- * tunable.
- */
- if (hyperthreading_allowed == 0) {
- cpu_info[i].cpu_disabled = 1;
- continue;
- }
- }
-
- /* Don't use this CPU if it has been disabled by a tunable. */
- if (resource_disabled("lapic", i)) {
- cpu_info[i].cpu_disabled = 1;
- continue;
- }
- }
-
- if (hyperthreading_allowed == 0 && hyperthreading_cpus > 1) {
- hyperthreading_cpus = 0;
- cpu_logical = 1;
- }
-
- /*
- * Assign CPU IDs to local APIC IDs and disable any CPUs
- * beyond MAXCPU. CPU 0 is always assigned to the BSP.
- *
- * To minimize confusion for userland, we attempt to number
- * CPUs such that all threads and cores in a package are
- * grouped together. For now we assume that the BSP is always
- * the first thread in a package and just start adding APs
- * starting with the BSP's APIC ID.
- */
- mp_ncpus = 1;
- cpu_apic_ids[0] = boot_cpu_id;
- apic_cpuids[boot_cpu_id] = 0;
- for (i = boot_cpu_id + 1; i != boot_cpu_id;
- i == MAX_APIC_ID ? i = 0 : i++) {
- if (!cpu_info[i].cpu_present || cpu_info[i].cpu_bsp ||
- cpu_info[i].cpu_disabled)
- continue;
-
- if (mp_ncpus < MAXCPU) {
- cpu_apic_ids[mp_ncpus] = i;
- apic_cpuids[i] = mp_ncpus;
- mp_ncpus++;
- } else
- cpu_info[i].cpu_disabled = 1;
- }
- KASSERT(mp_maxid >= mp_ncpus - 1,
- ("%s: counters out of sync: max %d, count %d", __func__, mp_maxid,
- mp_ncpus));
-}
-
-/*
* start each AP in our list
*/
int
@@ -1026,129 +406,6 @@ start_ap(int apic_id)
return 0; /* return FAILURE */
}
-#ifdef COUNT_XINVLTLB_HITS
-u_int xhits_gbl[MAXCPU];
-u_int xhits_pg[MAXCPU];
-u_int xhits_rng[MAXCPU];
-static SYSCTL_NODE(_debug, OID_AUTO, xhits, CTLFLAG_RW, 0, "");
-SYSCTL_OPAQUE(_debug_xhits, OID_AUTO, global, CTLFLAG_RW, &xhits_gbl,
- sizeof(xhits_gbl), "IU", "");
-SYSCTL_OPAQUE(_debug_xhits, OID_AUTO, page, CTLFLAG_RW, &xhits_pg,
- sizeof(xhits_pg), "IU", "");
-SYSCTL_OPAQUE(_debug_xhits, OID_AUTO, range, CTLFLAG_RW, &xhits_rng,
- sizeof(xhits_rng), "IU", "");
-
-u_int ipi_global;
-u_int ipi_page;
-u_int ipi_range;
-u_int ipi_range_size;
-SYSCTL_UINT(_debug_xhits, OID_AUTO, ipi_global, CTLFLAG_RW, &ipi_global, 0, "");
-SYSCTL_UINT(_debug_xhits, OID_AUTO, ipi_page, CTLFLAG_RW, &ipi_page, 0, "");
-SYSCTL_UINT(_debug_xhits, OID_AUTO, ipi_range, CTLFLAG_RW, &ipi_range, 0, "");
-SYSCTL_UINT(_debug_xhits, OID_AUTO, ipi_range_size, CTLFLAG_RW,
- &ipi_range_size, 0, "");
-
-u_int ipi_masked_global;
-u_int ipi_masked_page;
-u_int ipi_masked_range;
-u_int ipi_masked_range_size;
-SYSCTL_UINT(_debug_xhits, OID_AUTO, ipi_masked_global, CTLFLAG_RW,
- &ipi_masked_global, 0, "");
-SYSCTL_UINT(_debug_xhits, OID_AUTO, ipi_masked_page, CTLFLAG_RW,
- &ipi_masked_page, 0, "");
-SYSCTL_UINT(_debug_xhits, OID_AUTO, ipi_masked_range, CTLFLAG_RW,
- &ipi_masked_range, 0, "");
-SYSCTL_UINT(_debug_xhits, OID_AUTO, ipi_masked_range_size, CTLFLAG_RW,
- &ipi_masked_range_size, 0, "");
-#endif /* COUNT_XINVLTLB_HITS */
-
-/*
- * Init and startup IPI.
- */
-void
-ipi_startup(int apic_id, int vector)
-{
-
- /*
- * This attempts to follow the algorithm described in the
- * Intel Multiprocessor Specification v1.4 in section B.4.
- * For each IPI, we allow the local APIC ~20us to deliver the
- * IPI. If that times out, we panic.
- */
-
- /*
- * first we do an INIT IPI: this INIT IPI might be run, resetting
- * and running the target CPU. OR this INIT IPI might be latched (P5
- * bug), CPU waiting for STARTUP IPI. OR this INIT IPI might be
- * ignored.
- */
- lapic_ipi_raw(APIC_DEST_DESTFLD | APIC_TRIGMOD_LEVEL |
- APIC_LEVEL_ASSERT | APIC_DESTMODE_PHY | APIC_DELMODE_INIT, apic_id);
- lapic_ipi_wait(100);
-
- /* Explicitly deassert the INIT IPI. */
- lapic_ipi_raw(APIC_DEST_DESTFLD | APIC_TRIGMOD_LEVEL |
- APIC_LEVEL_DEASSERT | APIC_DESTMODE_PHY | APIC_DELMODE_INIT,
- apic_id);
-
- DELAY(10000); /* wait ~10mS */
-
- /*
- * next we do a STARTUP IPI: the previous INIT IPI might still be
- * latched, (P5 bug) this 1st STARTUP would then terminate
- * immediately, and the previously started INIT IPI would continue. OR
- * the previous INIT IPI has already run. and this STARTUP IPI will
- * run. OR the previous INIT IPI was ignored. and this STARTUP IPI
- * will run.
- */
- lapic_ipi_raw(APIC_DEST_DESTFLD | APIC_TRIGMOD_EDGE |
- APIC_LEVEL_ASSERT | APIC_DESTMODE_PHY | APIC_DELMODE_STARTUP |
- vector, apic_id);
- if (!lapic_ipi_wait(100))
- panic("Failed to deliver first STARTUP IPI to APIC %d",
- apic_id);
- DELAY(200); /* wait ~200uS */
-
- /*
- * finally we do a 2nd STARTUP IPI: this 2nd STARTUP IPI should run IF
- * the previous STARTUP IPI was cancelled by a latched INIT IPI. OR
- * this STARTUP IPI will be ignored, as only ONE STARTUP IPI is
- * recognized after hardware RESET or INIT IPI.
- */
- lapic_ipi_raw(APIC_DEST_DESTFLD | APIC_TRIGMOD_EDGE |
- APIC_LEVEL_ASSERT | APIC_DESTMODE_PHY | APIC_DELMODE_STARTUP |
- vector, apic_id);
- if (!lapic_ipi_wait(100))
- panic("Failed to deliver second STARTUP IPI to APIC %d",
- apic_id);
-
- DELAY(200); /* wait ~200uS */
-}
-
-/*
- * Send an IPI to specified CPU handling the bitmap logic.
- */
-static void
-ipi_send_cpu(int cpu, u_int ipi)
-{
- u_int bitmap, old_pending, new_pending;
-
- KASSERT(cpu_apic_ids[cpu] != -1, ("IPI to non-existent CPU %d", cpu));
-
- if (IPI_IS_BITMAPED(ipi)) {
- bitmap = 1 << ipi;
- ipi = IPI_BITMAP_VECTOR;
- do {
- old_pending = cpu_ipi_pending[cpu];
- new_pending = old_pending | bitmap;
- } while (!atomic_cmpset_int(&cpu_ipi_pending[cpu],
- old_pending, new_pending));
- if (old_pending)
- return;
- }
- lapic_ipi_vectored(ipi, cpu_apic_ids[cpu]);
-}
-
/*
* Flush the TLB on all other CPU's
*/
@@ -1228,26 +485,6 @@ smp_targeted_tlb_shootdown(cpuset_t mask, u_int vector, pmap_t pmap,
}
void
-smp_cache_flush(void)
-{
-
- if (smp_started)
- smp_tlb_shootdown(IPI_INVLCACHE, NULL, 0, 0);
-}
-
-void
-smp_invltlb(pmap_t pmap)
-{
-
- if (smp_started) {
- smp_tlb_shootdown(IPI_INVLTLB, pmap, 0, 0);
-#ifdef COUNT_XINVLTLB_HITS
- ipi_global++;
-#endif
- }
-}
-
-void
smp_invlpg(pmap_t pmap, vm_offset_t addr)
{
@@ -1312,210 +549,23 @@ smp_masked_invlpg_range(cpuset_t mask, pmap_t pmap, vm_offset_t addr1,
}
void
-ipi_bitmap_handler(struct trapframe frame)
-{
- struct trapframe *oldframe;
- struct thread *td;
- int cpu = PCPU_GET(cpuid);
- u_int ipi_bitmap;
-
- critical_enter();
- td = curthread;
- td->td_intr_nesting_level++;
- oldframe = td->td_intr_frame;
- td->td_intr_frame = &frame;
- ipi_bitmap = atomic_readandclear_int(&cpu_ipi_pending[cpu]);
- if (ipi_bitmap & (1 << IPI_PREEMPT)) {
-#ifdef COUNT_IPIS
- (*ipi_preempt_counts[cpu])++;
-#endif
- sched_preempt(td);
- }
- if (ipi_bitmap & (1 << IPI_AST)) {
-#ifdef COUNT_IPIS
- (*ipi_ast_counts[cpu])++;
-#endif
- /* Nothing to do for AST */
- }
- if (ipi_bitmap & (1 << IPI_HARDCLOCK)) {
-#ifdef COUNT_IPIS
- (*ipi_hardclock_counts[cpu])++;
-#endif
- hardclockintr();
- }
- td->td_intr_frame = oldframe;
- td->td_intr_nesting_level--;
- critical_exit();
-}
-
-/*
- * send an IPI to a set of cpus.
- */
-void
-ipi_selected(cpuset_t cpus, u_int ipi)
-{
- int cpu;
-
- /*
- * IPI_STOP_HARD maps to a NMI and the trap handler needs a bit
- * of help in order to understand what is the source.
- * Set the mask of receiving CPUs for this purpose.
- */
- if (ipi == IPI_STOP_HARD)
- CPU_OR_ATOMIC(&ipi_nmi_pending, &cpus);
-
- while ((cpu = CPU_FFS(&cpus)) != 0) {
- cpu--;
- CPU_CLR(cpu, &cpus);
- CTR3(KTR_SMP, "%s: cpu: %d ipi: %x", __func__, cpu, ipi);
- ipi_send_cpu(cpu, ipi);
- }
-}
-
-/*
- * send an IPI to a specific CPU.
- */
-void
-ipi_cpu(int cpu, u_int ipi)
-{
-
- /*
- * IPI_STOP_HARD maps to a NMI and the trap handler needs a bit
- * of help in order to understand what is the source.
- * Set the mask of receiving CPUs for this purpose.
- */
- if (ipi == IPI_STOP_HARD)
- CPU_SET_ATOMIC(cpu, &ipi_nmi_pending);
-
- CTR3(KTR_SMP, "%s: cpu: %d ipi: %x", __func__, cpu, ipi);
- ipi_send_cpu(cpu, ipi);
-}
-
-/*
- * send an IPI to all CPUs EXCEPT myself
- */
-void
-ipi_all_but_self(u_int ipi)
+smp_cache_flush(void)
{
- cpuset_t other_cpus;
-
- other_cpus = all_cpus;
- CPU_CLR(PCPU_GET(cpuid), &other_cpus);
- if (IPI_IS_BITMAPED(ipi)) {
- ipi_selected(other_cpus, ipi);
- return;
- }
-
- /*
- * IPI_STOP_HARD maps to a NMI and the trap handler needs a bit
- * of help in order to understand what is the source.
- * Set the mask of receiving CPUs for this purpose.
- */
- if (ipi == IPI_STOP_HARD)
- CPU_OR_ATOMIC(&ipi_nmi_pending, &other_cpus);
-
- CTR2(KTR_SMP, "%s: ipi: %x", __func__, ipi);
- lapic_ipi_vectored(ipi, APIC_IPI_DEST_OTHERS);
+ if (smp_started)
+ smp_tlb_shootdown(IPI_INVLCACHE, NULL, 0, 0);
}
-int
-ipi_nmi_handler()
-{
- u_int cpuid;
-
- /*
- * As long as there is not a simple way to know about a NMI's
- * source, if the bitmask for the current CPU is present in
- * the global pending bitword an IPI_STOP_HARD has been issued
- * and should be handled.
- */
- cpuid = PCPU_GET(cpuid);
- if (!CPU_ISSET(cpuid, &ipi_nmi_pending))
- return (1);
-
- CPU_CLR_ATOMIC(cpuid, &ipi_nmi_pending);
- cpustop_handler();
- return (0);
-}
-
-/*
- * Handle an IPI_STOP by saving our current context and spinning until we
- * are resumed.
- */
void
-cpustop_handler(void)
-{
- u_int cpu;
-
- cpu = PCPU_GET(cpuid);
-
- savectx(&stoppcbs[cpu]);
-
- /* Indicate that we are stopped */
- CPU_SET_ATOMIC(cpu, &stopped_cpus);
-
- /* Wait for restart */
- while (!CPU_ISSET(cpu, &started_cpus))
- ia32_pause();
-
- CPU_CLR_ATOMIC(cpu, &started_cpus);
- CPU_CLR_ATOMIC(cpu, &stopped_cpus);
+smp_invltlb(pmap_t pmap)
+{
-#ifdef DDB
- amd64_db_resume_dbreg();
+ if (smp_started) {
+ smp_tlb_shootdown(IPI_INVLTLB, pmap, 0, 0);
+#ifdef COUNT_XINVLTLB_HITS
+ ipi_global++;
#endif
-
- if (cpu == 0 && cpustop_restartfunc != NULL) {
- cpustop_restartfunc();
- cpustop_restartfunc = NULL;
- }
-}
-
-/*
- * Handle an IPI_SUSPEND by saving our current context and spinning until we
- * are resumed.
- */
-void
-cpususpend_handler(void)
-{
- u_int cpu;
-
- mtx_assert(&smp_ipi_mtx, MA_NOTOWNED);
-
- cpu = PCPU_GET(cpuid);
- if (savectx(&susppcbs[cpu]->sp_pcb)) {
- fpususpend(susppcbs[cpu]->sp_fpususpend);
- wbinvd();
- CPU_SET_ATOMIC(cpu, &suspended_cpus);
- } else {
- fpuresume(susppcbs[cpu]->sp_fpususpend);
- pmap_init_pat();
- initializecpu();
- PCPU_SET(switchtime, 0);
- PCPU_SET(switchticks, ticks);
-
- /* Indicate that we are resumed */
- CPU_CLR_ATOMIC(cpu, &suspended_cpus);
}
-
- /* Wait for resume */
- while (!CPU_ISSET(cpu, &started_cpus))
- ia32_pause();
-
- if (cpu_ops.cpu_resume)
- cpu_ops.cpu_resume();
- if (vmm_resume_p)
- vmm_resume_p();
-
- /* Resume MCA and local APIC */
- lapic_xapic_mode();
- mca_resume();
- lapic_setup(0);
-
- CPU_CLR_ATOMIC(cpu, &started_cpus);
- /* Indicate that we are resumed */
- CPU_CLR_ATOMIC(cpu, &suspended_cpus);
}
/*
@@ -1678,63 +728,3 @@ invlrng_handler(void)
atomic_add_int(&smp_tlb_wait, 1);
}
-
-void
-invlcache_handler(void)
-{
-#ifdef COUNT_IPIS
- (*ipi_invlcache_counts[PCPU_GET(cpuid)])++;
-#endif /* COUNT_IPIS */
-
- wbinvd();
- atomic_add_int(&smp_tlb_wait, 1);
-}
-
-/*
- * This is called once the rest of the system is up and running and we're
- * ready to let the AP's out of the pen.
- */
-static void
-release_aps(void *dummy __unused)
-{
-
- if (mp_ncpus == 1)
- return;
- atomic_store_rel_int(&aps_ready, 1);
- while (smp_started == 0)
- ia32_pause();
-}
-SYSINIT(start_aps, SI_SUB_SMP, SI_ORDER_FIRST, release_aps, NULL);
-
-#ifdef COUNT_IPIS
-/*
- * Setup interrupt counters for IPI handlers.
- */
-static void
-mp_ipi_intrcnt(void *dummy)
-{
- char buf[64];
- int i;
-
- CPU_FOREACH(i) {
- snprintf(buf, sizeof(buf), "cpu%d:invltlb", i);
- intrcnt_add(buf, &ipi_invltlb_counts[i]);
- snprintf(buf, sizeof(buf), "cpu%d:invlrng", i);
- intrcnt_add(buf, &ipi_invlrng_counts[i]);
- snprintf(buf, sizeof(buf), "cpu%d:invlpg", i);
- intrcnt_add(buf, &ipi_invlpg_counts[i]);
- snprintf(buf, sizeof(buf), "cpu%d:invlcache", i);
- intrcnt_add(buf, &ipi_invlcache_counts[i]);
- snprintf(buf, sizeof(buf), "cpu%d:preempt", i);
- intrcnt_add(buf, &ipi_preempt_counts[i]);
- snprintf(buf, sizeof(buf), "cpu%d:ast", i);
- intrcnt_add(buf, &ipi_ast_counts[i]);
- snprintf(buf, sizeof(buf), "cpu%d:rendezvous", i);
- intrcnt_add(buf, &ipi_rendezvous_counts[i]);
- snprintf(buf, sizeof(buf), "cpu%d:hardclock", i);
- intrcnt_add(buf, &ipi_hardclock_counts[i]);
- }
-}
-SYSINIT(mp_ipi_intrcnt, SI_SUB_INTR, SI_ORDER_MIDDLE, mp_ipi_intrcnt, NULL);
-#endif
-
diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c
index 29158e8..dc823fa 100644
--- a/sys/amd64/amd64/pmap.c
+++ b/sys/amd64/amd64/pmap.c
@@ -2532,6 +2532,8 @@ pmap_release(pmap_t pmap)
pmap->pm_stats.resident_count));
KASSERT(vm_radix_is_empty(&pmap->pm_root),
("pmap_release: pmap has reserved page table page(s)"));
+ KASSERT(CPU_EMPTY(&pmap->pm_active),
+ ("releasing active pmap %p", pmap));
if (pmap_pcid_enabled) {
/*
diff --git a/sys/amd64/conf/GENERIC b/sys/amd64/conf/GENERIC
index bdaca33..c24dd5a 100644
--- a/sys/amd64/conf/GENERIC
+++ b/sys/amd64/conf/GENERIC
@@ -340,7 +340,9 @@ device virtio_blk # VirtIO Block device
device virtio_scsi # VirtIO SCSI device
device virtio_balloon # VirtIO Memory Balloon device
-# HyperV drivers
+# HyperV drivers and enchancement support
+# NOTE: HYPERV depends on hyperv. They must be added or removed together.
+options HYPERV # Hyper-V kernel infrastructure
device hyperv # HyperV drivers
# Xen HVM Guest Optimizations
diff --git a/sys/amd64/conf/NOTES b/sys/amd64/conf/NOTES
index 9b697f0..e0fe465 100644
--- a/sys/amd64/conf/NOTES
+++ b/sys/amd64/conf/NOTES
@@ -494,6 +494,8 @@ device virtio_balloon # VirtIO Memory Balloon device
device virtio_random # VirtIO Entropy device
device virtio_console # VirtIO Console device
+# Microsoft Hyper-V enchancement support
+options HYPERV # Hyper-V kernel infrastructure
device hyperv # HyperV drivers
# Xen HVM Guest Optimizations
diff --git a/sys/amd64/include/md_var.h b/sys/amd64/include/md_var.h
index ccde0e3..9083421 100644
--- a/sys/amd64/include/md_var.h
+++ b/sys/amd64/include/md_var.h
@@ -91,6 +91,7 @@ struct dumperinfo;
void *alloc_fpusave(int flags);
void amd64_syscall(struct thread *td, int traced);
void busdma_swi(void);
+void cpu_probe_amdc1e(void);
void cpu_setregs(void);
void doreti_iret(void) __asm(__STRING(doreti_iret));
void doreti_iret_fault(void) __asm(__STRING(doreti_iret_fault));
diff --git a/sys/amd64/include/metadata.h b/sys/amd64/include/metadata.h
index cf244e4..e13eba0 100644
--- a/sys/amd64/include/metadata.h
+++ b/sys/amd64/include/metadata.h
@@ -37,17 +37,17 @@
#define MODINFOMD_MODULEP 0x1006
struct efi_map_header {
- size_t memory_size;
- size_t descriptor_size;
+ uint64_t memory_size;
+ uint64_t descriptor_size;
uint32_t descriptor_version;
};
struct efi_fb {
uint64_t fb_addr;
uint64_t fb_size;
- int fb_height;
- int fb_width;
- int fb_stride;
+ uint32_t fb_height;
+ uint32_t fb_width;
+ uint32_t fb_stride;
uint32_t fb_mask_red;
uint32_t fb_mask_green;
uint32_t fb_mask_blue;
diff --git a/sys/amd64/include/smp.h b/sys/amd64/include/smp.h
index 3a4b6b3..034a693 100644
--- a/sys/amd64/include/smp.h
+++ b/sys/amd64/include/smp.h
@@ -35,6 +35,39 @@ extern int mp_naps;
extern int boot_cpu_id;
extern struct pcb stoppcbs[];
extern int cpu_apic_ids[];
+extern int bootAP;
+extern void *dpcpu;
+extern char *bootSTK;
+extern int bootAP;
+extern void *bootstacks[];
+extern volatile u_int cpu_ipi_pending[];
+extern volatile int aps_ready;
+extern struct mtx ap_boot_mtx;
+extern int cpu_logical;
+extern int cpu_cores;
+extern int pmap_pcid_enabled;
+extern u_int xhits_gbl[];
+extern u_int xhits_pg[];
+extern u_int xhits_rng[];
+extern u_int ipi_global;
+extern u_int ipi_page;
+extern u_int ipi_range;
+extern u_int ipi_range_size;
+extern u_int ipi_masked_global;
+extern u_int ipi_masked_page;
+extern u_int ipi_masked_range;
+extern u_int ipi_masked_range_size;
+
+extern volatile int smp_tlb_wait;
+
+struct cpu_info {
+ int cpu_present:1;
+ int cpu_bsp:1;
+ int cpu_disabled:1;
+ int cpu_hyperthread:1;
+};
+extern struct cpu_info cpu_info[];
+
#ifdef COUNT_IPIS
extern u_long *ipi_invltlb_counts[MAXCPU];
extern u_long *ipi_invlrng_counts[MAXCPU];
@@ -60,9 +93,11 @@ inthand_t
struct pmap;
/* functions in mp_machdep.c */
+void assign_cpu_ids(void);
void cpu_add(u_int apic_id, char boot_cpu);
void cpustop_handler(void);
void cpususpend_handler(void);
+void init_secondary_tail(void);
void invltlb_handler(void);
void invltlb_pcid_handler(void);
void invlpg_handler(void);
@@ -77,6 +112,7 @@ void ipi_cpu(int cpu, u_int ipi);
int ipi_nmi_handler(void);
void ipi_selected(cpuset_t cpus, u_int ipi);
u_int mp_bootaddress(u_int);
+void set_interrupt_apic_ids(void);
void smp_cache_flush(void);
void smp_invlpg(struct pmap *pmap, vm_offset_t addr);
void smp_masked_invlpg(cpuset_t mask, struct pmap *pmap, vm_offset_t addr);
@@ -87,6 +123,9 @@ void smp_masked_invlpg_range(cpuset_t mask, struct pmap *pmap,
void smp_invltlb(struct pmap *pmap);
void smp_masked_invltlb(cpuset_t mask, struct pmap *pmap);
int native_start_all_aps(void);
+void mem_range_AP_init(void);
+void topo_probe(void);
+void ipi_send_cpu(int cpu, u_int ipi);
#endif /* !LOCORE */
#endif /* SMP */
diff --git a/sys/amd64/include/vm.h b/sys/amd64/include/vm.h
index 6573e37..22d2eca 100644
--- a/sys/amd64/include/vm.h
+++ b/sys/amd64/include/vm.h
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2009 Advanced Computing Technologies LLC
+ * Copyright (c) 2009 Hudson River Trading LLC
* Written by: John H. Baldwin <jhb@FreeBSD.org>
* All rights reserved.
*
diff --git a/sys/amd64/include/vmm.h b/sys/amd64/include/vmm.h
index 52294bd..7c617be 100644
--- a/sys/amd64/include/vmm.h
+++ b/sys/amd64/include/vmm.h
@@ -204,13 +204,12 @@ int vm_get_x2apic_state(struct vm *vm, int vcpu, enum x2apic_state *state);
int vm_set_x2apic_state(struct vm *vm, int vcpu, enum x2apic_state state);
int vm_apicid2vcpuid(struct vm *vm, int apicid);
int vm_activate_cpu(struct vm *vm, int vcpu);
-cpuset_t vm_active_cpus(struct vm *vm);
-cpuset_t vm_suspended_cpus(struct vm *vm);
struct vm_exit *vm_exitinfo(struct vm *vm, int vcpuid);
void vm_exit_suspended(struct vm *vm, int vcpuid, uint64_t rip);
void vm_exit_rendezvous(struct vm *vm, int vcpuid, uint64_t rip);
void vm_exit_astpending(struct vm *vm, int vcpuid, uint64_t rip);
+#ifdef _SYS__CPUSET_H_
/*
* Rendezvous all vcpus specified in 'dest' and execute 'func(arg)'.
* The rendezvous 'func(arg)' is not allowed to do anything that will
@@ -228,6 +227,9 @@ void vm_exit_astpending(struct vm *vm, int vcpuid, uint64_t rip);
typedef void (*vm_rendezvous_func_t)(struct vm *vm, int vcpuid, void *arg);
void vm_smp_rendezvous(struct vm *vm, int vcpuid, cpuset_t dest,
vm_rendezvous_func_t func, void *arg);
+cpuset_t vm_active_cpus(struct vm *vm);
+cpuset_t vm_suspended_cpus(struct vm *vm);
+#endif /* _SYS__CPUSET_H_ */
static __inline int
vcpu_rendezvous_pending(void *rendezvous_cookie)
diff --git a/sys/amd64/include/xen/xenfunc.h b/sys/amd64/include/xen/xenfunc.h
index d03d4f6..d8a6b5c 100644
--- a/sys/amd64/include/xen/xenfunc.h
+++ b/sys/amd64/include/xen/xenfunc.h
@@ -29,12 +29,7 @@
#ifndef _XEN_XENFUNC_H_
#define _XEN_XENFUNC_H_
-#ifdef XENHVM
#include <machine/xen/xenvar.h>
-#else
-#include <machine/xen/xenpmap.h>
-#include <machine/segments.h>
-#endif
#define BKPT __asm__("int3");
#define XPQ_CALL_DEPTH 5
@@ -64,10 +59,6 @@ void _xen_machphys_update(vm_paddr_t, vm_paddr_t, char *file, int line);
#define xen_machphys_update(a, b) _xen_machphys_update((a), (b), NULL, 0)
#endif
-#ifndef XENHVM
-void xen_update_descriptor(union descriptor *, union descriptor *);
-#endif
-
extern struct mtx balloon_lock;
#if 0
#define balloon_lock(__flags) mtx_lock_irqsave(&balloon_lock, __flags)
diff --git a/sys/amd64/include/xen/xenpmap.h b/sys/amd64/include/xen/xenpmap.h
deleted file mode 100644
index d768dad..0000000
--- a/sys/amd64/include/xen/xenpmap.h
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
- *
- * Copyright (c) 2004 Christian Limpach.
- * Copyright (c) 2004,2005 Kip Macy
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Christian Limpach.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-#ifndef _XEN_XENPMAP_H_
-#define _XEN_XENPMAP_H_
-
-#include <machine/xen/features.h>
-
-void _xen_queue_pt_update(vm_paddr_t, vm_paddr_t, char *, int);
-void xen_pt_switch(vm_paddr_t);
-void xen_set_ldt(vm_paddr_t, unsigned long);
-void xen_pgdpt_pin(vm_paddr_t);
-void xen_pgd_pin(vm_paddr_t);
-void xen_pgd_unpin(vm_paddr_t);
-void xen_pt_pin(vm_paddr_t);
-void xen_pt_unpin(vm_paddr_t);
-void xen_flush_queue(void);
-void xen_check_queue(void);
-#if 0
-void pmap_ref(pt_entry_t *pte, vm_paddr_t ma);
-#endif
-
-#ifdef INVARIANTS
-#define xen_queue_pt_update(a, b) _xen_queue_pt_update((a), (b), __FILE__, __LINE__)
-#else
-#define xen_queue_pt_update(a, b) _xen_queue_pt_update((a), (b), NULL, 0)
-#endif
-
-#ifdef PMAP_DEBUG
-#define PMAP_REF pmap_ref
-#define PMAP_DEC_REF_PAGE pmap_dec_ref_page
-#define PMAP_MARK_PRIV pmap_mark_privileged
-#define PMAP_MARK_UNPRIV pmap_mark_unprivileged
-#else
-#define PMAP_MARK_PRIV(a)
-#define PMAP_MARK_UNPRIV(a)
-#define PMAP_REF(a, b)
-#define PMAP_DEC_REF_PAGE(a)
-#endif
-
-#define ALWAYS_SYNC 0
-
-#ifdef PT_DEBUG
-#define PT_LOG() printk("WP PT_SET %s:%d\n", __FILE__, __LINE__)
-#else
-#define PT_LOG()
-#endif
-
-#define INVALID_P2M_ENTRY (~0UL)
-
-#define pmap_valid_entry(E) ((E) & PG_V) /* is PDE or PTE valid? */
-
-#define SH_PD_SET_VA 1
-#define SH_PD_SET_VA_MA 2
-#define SH_PD_SET_VA_CLEAR 3
-
-struct pmap;
-void pd_set(struct pmap *pmap, int ptepindex, vm_paddr_t val, int type);
-#ifdef notyet
-static vm_paddr_t
-vptetomachpte(vm_paddr_t *pte)
-{
- vm_offset_t offset, ppte;
- vm_paddr_t pgoffset, retval, *pdir_shadow_ptr;
- int pgindex;
-
- ppte = (vm_offset_t)pte;
- pgoffset = (ppte & PAGE_MASK);
- offset = ppte - (vm_offset_t)PTmap;
- pgindex = ppte >> PDRSHIFT;
-
- pdir_shadow_ptr = (vm_paddr_t *)PCPU_GET(pdir_shadow);
- retval = (pdir_shadow_ptr[pgindex] & ~PAGE_MASK) + pgoffset;
- return (retval);
-}
-#endif
-#define PT_GET(_ptp) \
- (pmap_valid_entry(*(_ptp)) ? xpmap_mtop(*(_ptp)) : (0))
-
-#ifdef WRITABLE_PAGETABLES
-
-#define PT_SET_VA(_ptp,_npte,sync) do { \
- PMAP_REF((_ptp), xpmap_ptom(_npte)); \
- PT_LOG(); \
- *(_ptp) = xpmap_ptom((_npte)); \
-} while (/*CONSTCOND*/0)
-#define PT_SET_VA_MA(_ptp,_npte,sync) do { \
- PMAP_REF((_ptp), (_npte)); \
- PT_LOG(); \
- *(_ptp) = (_npte); \
-} while (/*CONSTCOND*/0)
-#define PT_CLEAR_VA(_ptp, sync) do { \
- PMAP_REF((pt_entry_t *)(_ptp), 0); \
- PT_LOG(); \
- *(_ptp) = 0; \
-} while (/*CONSTCOND*/0)
-
-#define PD_SET_VA(_pmap, _ptp, _npte, sync) do { \
- PMAP_REF((_ptp), xpmap_ptom(_npte)); \
- pd_set((_pmap),(_ptp),(_npte), SH_PD_SET_VA); \
- if (sync || ALWAYS_SYNC) xen_flush_queue(); \
-} while (/*CONSTCOND*/0)
-#define PD_SET_VA_MA(_pmap, _ptp, _npte, sync) do { \
- PMAP_REF((_ptp), (_npte)); \
- pd_set((_pmap),(_ptp),(_npte), SH_PD_SET_VA_MA); \
- if (sync || ALWAYS_SYNC) xen_flush_queue(); \
-} while (/*CONSTCOND*/0)
-#define PD_CLEAR_VA(_pmap, _ptp, sync) do { \
- PMAP_REF((pt_entry_t *)(_ptp), 0); \
- pd_set((_pmap),(_ptp), 0, SH_PD_SET_VA_CLEAR); \
- if (sync || ALWAYS_SYNC) xen_flush_queue(); \
-} while (/*CONSTCOND*/0)
-
-#else /* !WRITABLE_PAGETABLES */
-
-#define PT_SET_VA(_ptp,_npte,sync) do { \
- PMAP_REF((_ptp), xpmap_ptom(_npte)); \
- xen_queue_pt_update(vtomach(_ptp), \
- xpmap_ptom(_npte)); \
- if (sync || ALWAYS_SYNC) xen_flush_queue(); \
-} while (/*CONSTCOND*/0)
-#define PT_SET_VA_MA(_ptp,_npte,sync) do { \
- PMAP_REF((_ptp), (_npte)); \
- xen_queue_pt_update(vtomach(_ptp), _npte); \
- if (sync || ALWAYS_SYNC) xen_flush_queue(); \
-} while (/*CONSTCOND*/0)
-#define PT_CLEAR_VA(_ptp, sync) do { \
- PMAP_REF((pt_entry_t *)(_ptp), 0); \
- xen_queue_pt_update(vtomach(_ptp), 0); \
- if (sync || ALWAYS_SYNC) \
- xen_flush_queue(); \
-} while (/*CONSTCOND*/0)
-
-#define PD_SET_VA(_pmap, _ptepindex,_npte,sync) do { \
- PMAP_REF((_ptp), xpmap_ptom(_npte)); \
- pd_set((_pmap),(_ptepindex),(_npte), SH_PD_SET_VA); \
- if (sync || ALWAYS_SYNC) xen_flush_queue(); \
-} while (/*CONSTCOND*/0)
-#define PD_SET_VA_MA(_pmap, _ptepindex,_npte,sync) do { \
- PMAP_REF((_ptp), (_npte)); \
- pd_set((_pmap),(_ptepindex),(_npte), SH_PD_SET_VA_MA); \
- if (sync || ALWAYS_SYNC) xen_flush_queue(); \
-} while (/*CONSTCOND*/0)
-#define PD_CLEAR_VA(_pmap, _ptepindex, sync) do { \
- PMAP_REF((pt_entry_t *)(_ptp), 0); \
- pd_set((_pmap),(_ptepindex), 0, SH_PD_SET_VA_CLEAR); \
- if (sync || ALWAYS_SYNC) xen_flush_queue(); \
-} while (/*CONSTCOND*/0)
-
-#endif
-
-#define PT_SET_MA(_va, _ma) \
-do { \
- PANIC_IF(HYPERVISOR_update_va_mapping(((unsigned long)(_va)),\
- (_ma), \
- UVMF_INVLPG| UVMF_ALL) < 0); \
-} while (/*CONSTCOND*/0)
-
-#define PT_UPDATES_FLUSH() do { \
- xen_flush_queue(); \
-} while (/*CONSTCOND*/0)
-
-static __inline vm_paddr_t
-xpmap_mtop(vm_paddr_t mpa)
-{
- vm_paddr_t tmp = (mpa & PG_FRAME);
-
- return machtophys(tmp) | (mpa & ~PG_FRAME);
-}
-
-static __inline vm_paddr_t
-xpmap_ptom(vm_paddr_t ppa)
-{
- vm_paddr_t tmp = (ppa & PG_FRAME);
-
- return phystomach(tmp) | (ppa & ~PG_FRAME);
-}
-
-static __inline void
-set_phys_to_machine(unsigned long pfn, unsigned long mfn)
-{
-#ifdef notyet
- PANIC_IF(max_mapnr && pfn >= max_mapnr);
-#endif
- if (xen_feature(XENFEAT_auto_translated_physmap)) {
-#ifdef notyet
- PANIC_IF((pfn != mfn && mfn != INVALID_P2M_ENTRY));
-#endif
- return;
- }
- xen_phys_machine[pfn] = mfn;
-}
-
-
-
-
-#endif /* _XEN_XENPMAP_H_ */
diff --git a/sys/amd64/include/xen/xenvar.h b/sys/amd64/include/xen/xenvar.h
index d9dbc5d..110a351 100644
--- a/sys/amd64/include/xen/xenvar.h
+++ b/sys/amd64/include/xen/xenvar.h
@@ -48,68 +48,7 @@ if (xendebug_flags & argflags) XENPRINTF("(file=%s, line=%d) " _f "\n", __FILE__
#define TRACE_DEBUG(argflags, _f, _a...)
#endif
-#ifdef XENHVM
-
-static inline vm_paddr_t
-phystomach(vm_paddr_t pa)
-{
-
- return (pa);
-}
-
-static inline vm_paddr_t
-machtophys(vm_paddr_t ma)
-{
-
- return (ma);
-}
-
#define vtomach(va) pmap_kextract((vm_offset_t) (va))
-#define PFNTOMFN(pa) (pa)
-#define MFNTOPFN(ma) (ma)
-
-#define set_phys_to_machine(pfn, mfn) ((void)0)
-#define phys_to_machine_mapping_valid(pfn) (TRUE)
-#define PT_UPDATES_FLUSH() ((void)0)
-
-#else
-
-extern xen_pfn_t *xen_phys_machine;
-
-
-extern xen_pfn_t *xen_machine_phys;
-/* Xen starts physical pages after the 4MB ISA hole -
- * FreeBSD doesn't
- */
-
-
-#undef ADD_ISA_HOLE /* XXX */
-
-#ifdef ADD_ISA_HOLE
-#define ISA_INDEX_OFFSET 1024
-#define ISA_PDR_OFFSET 1
-#else
-#define ISA_INDEX_OFFSET 0
-#define ISA_PDR_OFFSET 0
-#endif
-
-
-#define PFNTOMFN(i) (xen_phys_machine[(i)])
-#define MFNTOPFN(i) ((vm_paddr_t)xen_machine_phys[(i)])
-
-#define VTOP(x) ((((uintptr_t)(x))) - KERNBASE)
-#define PTOV(x) (((uintptr_t)(x)) + KERNBASE)
-
-#define VTOPFN(x) (VTOP(x) >> PAGE_SHIFT)
-#define PFNTOV(x) PTOV((vm_paddr_t)(x) << PAGE_SHIFT)
-
-#define VTOMFN(va) (vtomach(va) >> PAGE_SHIFT)
-#define PFN_UP(x) (((x) + PAGE_SIZE-1) >> PAGE_SHIFT)
-
-#define phystomach(pa) (((vm_paddr_t)(PFNTOMFN((pa) >> PAGE_SHIFT))) << PAGE_SHIFT)
-#define machtophys(ma) (((vm_paddr_t)(MFNTOPFN((ma) >> PAGE_SHIFT))) << PAGE_SHIFT)
-
-#endif
void xpq_init(void);
diff --git a/sys/amd64/vmm/amd/amdv.c b/sys/amd64/vmm/amd/amdv.c
index acb3a3d..3157e21 100644
--- a/sys/amd64/vmm/amd/amdv.c
+++ b/sys/amd64/vmm/amd/amdv.c
@@ -32,7 +32,6 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/errno.h>
-#include <sys/smp.h>
#include <machine/vmm.h>
#include "io/iommu.h"
diff --git a/sys/amd64/vmm/amd/svm.c b/sys/amd64/vmm/amd/svm.c
index 18871d0..7cc13ca 100644
--- a/sys/amd64/vmm/amd/svm.c
+++ b/sys/amd64/vmm/amd/svm.c
@@ -802,6 +802,7 @@ svm_handle_inst_emul(struct vmcb *vmcb, uint64_t gpa, struct vm_exit *vmexit)
case CPU_MODE_REAL:
vmexit->u.inst_emul.cs_base = seg.base;
vmexit->u.inst_emul.cs_d = 0;
+ break;
case CPU_MODE_PROTECTED:
case CPU_MODE_COMPATIBILITY:
vmexit->u.inst_emul.cs_base = seg.base;
@@ -1917,7 +1918,7 @@ svm_vmrun(void *arg, int vcpu, register_t rip, pmap_t pmap,
}
/* We are asked to give the cpu by scheduler. */
- if (curthread->td_flags & (TDF_ASTPENDING | TDF_NEEDRESCHED)) {
+ if (vcpu_should_yield(vm, vcpu)) {
enable_gintr();
vm_exit_astpending(vm, vcpu, state->rip);
break;
diff --git a/sys/amd64/vmm/amd/svm_msr.c b/sys/amd64/vmm/amd/svm_msr.c
index 100af4b..088751a 100644
--- a/sys/amd64/vmm/amd/svm_msr.c
+++ b/sys/amd64/vmm/amd/svm_msr.c
@@ -27,12 +27,17 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
-#include <sys/types.h>
+#include <sys/param.h>
#include <sys/errno.h>
+#include <sys/systm.h>
#include <machine/cpufunc.h>
#include <machine/specialreg.h>
+#include <machine/vmm.h>
+#include "svm.h"
+#include "vmcb.h"
+#include "svm_softc.h"
#include "svm_msr.h"
#ifndef MSR_AMDK8_IPM
@@ -105,6 +110,18 @@ svm_rdmsr(struct svm_softc *sc, int vcpu, u_int num, uint64_t *result,
int error = 0;
switch (num) {
+ case MSR_MCG_CAP:
+ case MSR_MCG_STATUS:
+ *result = 0;
+ break;
+ case MSR_MTRRcap:
+ case MSR_MTRRdefType:
+ case MSR_MTRR4kBase ... MSR_MTRR4kBase + 8:
+ case MSR_MTRR16kBase ... MSR_MTRR16kBase + 1:
+ case MSR_MTRR64kBase:
+ case MSR_SYSCFG:
+ *result = 0;
+ break;
case MSR_AMDK8_IPM:
*result = 0;
break;
@@ -122,6 +139,18 @@ svm_wrmsr(struct svm_softc *sc, int vcpu, u_int num, uint64_t val, bool *retu)
int error = 0;
switch (num) {
+ case MSR_MCG_CAP:
+ case MSR_MCG_STATUS:
+ break; /* ignore writes */
+ case MSR_MTRRcap:
+ vm_inject_gp(sc->vm, vcpu);
+ break;
+ case MSR_MTRRdefType:
+ case MSR_MTRR4kBase ... MSR_MTRR4kBase + 8:
+ case MSR_MTRR16kBase ... MSR_MTRR16kBase + 1:
+ case MSR_MTRR64kBase:
+ case MSR_SYSCFG:
+ break; /* Ignore writes */
case MSR_AMDK8_IPM:
/*
* Ignore writes to the "Interrupt Pending Message" MSR.
diff --git a/sys/amd64/vmm/amd/vmcb.c b/sys/amd64/vmm/amd/vmcb.c
index fb4b2c8..d860169 100644
--- a/sys/amd64/vmm/amd/vmcb.c
+++ b/sys/amd64/vmm/amd/vmcb.c
@@ -29,7 +29,6 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/systm.h>
-#include <sys/cpuset.h>
#include <machine/segments.h>
#include <machine/specialreg.h>
diff --git a/sys/amd64/vmm/intel/vmx_msr.c b/sys/amd64/vmm/intel/vmx_msr.c
index e517778..3091f68 100644
--- a/sys/amd64/vmm/intel/vmx_msr.c
+++ b/sys/amd64/vmm/intel/vmx_msr.c
@@ -31,7 +31,6 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/systm.h>
-#include <sys/cpuset.h>
#include <machine/clock.h>
#include <machine/cpufunc.h>
@@ -396,6 +395,17 @@ vmx_rdmsr(struct vmx *vmx, int vcpuid, u_int num, uint64_t *val, bool *retu)
error = 0;
switch (num) {
+ case MSR_MCG_CAP:
+ case MSR_MCG_STATUS:
+ *val = 0;
+ break;
+ case MSR_MTRRcap:
+ case MSR_MTRRdefType:
+ case MSR_MTRR4kBase ... MSR_MTRR4kBase + 8:
+ case MSR_MTRR16kBase ... MSR_MTRR16kBase + 1:
+ case MSR_MTRR64kBase:
+ *val = 0;
+ break;
case MSR_IA32_MISC_ENABLE:
*val = misc_enable;
break;
@@ -427,6 +437,17 @@ vmx_wrmsr(struct vmx *vmx, int vcpuid, u_int num, uint64_t val, bool *retu)
error = 0;
switch (num) {
+ case MSR_MCG_CAP:
+ case MSR_MCG_STATUS:
+ break; /* ignore writes */
+ case MSR_MTRRcap:
+ vm_inject_gp(vmx->vm, vcpuid);
+ break;
+ case MSR_MTRRdefType:
+ case MSR_MTRR4kBase ... MSR_MTRR4kBase + 8:
+ case MSR_MTRR16kBase ... MSR_MTRR16kBase + 1:
+ case MSR_MTRR64kBase:
+ break; /* Ignore writes */
case MSR_IA32_MISC_ENABLE:
changed = val ^ misc_enable;
/*
diff --git a/sys/amd64/vmm/io/vatpic.c b/sys/amd64/vmm/io/vatpic.c
index 0df6e7c..6e94f5b 100644
--- a/sys/amd64/vmm/io/vatpic.c
+++ b/sys/amd64/vmm/io/vatpic.c
@@ -30,7 +30,6 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/types.h>
#include <sys/queue.h>
-#include <sys/cpuset.h>
#include <sys/kernel.h>
#include <sys/lock.h>
#include <sys/malloc.h>
diff --git a/sys/amd64/vmm/io/vatpit.c b/sys/amd64/vmm/io/vatpit.c
index 842253d..173ef1f 100644
--- a/sys/amd64/vmm/io/vatpit.c
+++ b/sys/amd64/vmm/io/vatpit.c
@@ -31,7 +31,6 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/types.h>
#include <sys/queue.h>
-#include <sys/cpuset.h>
#include <sys/kernel.h>
#include <sys/lock.h>
#include <sys/malloc.h>
diff --git a/sys/amd64/vmm/io/vhpet.c b/sys/amd64/vmm/io/vhpet.c
index a4c96cd..1db1c51 100644
--- a/sys/amd64/vmm/io/vhpet.c
+++ b/sys/amd64/vmm/io/vhpet.c
@@ -36,7 +36,6 @@ __FBSDID("$FreeBSD$");
#include <sys/kernel.h>
#include <sys/malloc.h>
#include <sys/systm.h>
-#include <sys/cpuset.h>
#include <dev/acpica/acpi_hpet.h>
diff --git a/sys/amd64/vmm/io/vioapic.c b/sys/amd64/vmm/io/vioapic.c
index 411887d..e6b8b5a 100644
--- a/sys/amd64/vmm/io/vioapic.c
+++ b/sys/amd64/vmm/io/vioapic.c
@@ -32,7 +32,6 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/queue.h>
-#include <sys/cpuset.h>
#include <sys/lock.h>
#include <sys/mutex.h>
#include <sys/systm.h>
diff --git a/sys/amd64/vmm/io/vlapic.c b/sys/amd64/vmm/io/vlapic.c
index 7097248..3451e1e 100644
--- a/sys/amd64/vmm/io/vlapic.c
+++ b/sys/amd64/vmm/io/vlapic.c
@@ -547,6 +547,8 @@ vlapic_update_ppr(struct vlapic *vlapic)
VLAPIC_CTR1(vlapic, "vlapic_update_ppr 0x%02x", ppr);
}
+static VMM_STAT(VLAPIC_GRATUITOUS_EOI, "EOI without any in-service interrupt");
+
static void
vlapic_process_eoi(struct vlapic *vlapic)
{
@@ -557,11 +559,7 @@ vlapic_process_eoi(struct vlapic *vlapic)
isrptr = &lapic->isr0;
tmrptr = &lapic->tmr0;
- /*
- * The x86 architecture reserves the the first 32 vectors for use
- * by the processor.
- */
- for (i = 7; i > 0; i--) {
+ for (i = 7; i >= 0; i--) {
idx = i * 4;
bitpos = fls(isrptr[idx]);
if (bitpos-- != 0) {
@@ -570,17 +568,21 @@ vlapic_process_eoi(struct vlapic *vlapic)
vlapic->isrvec_stk_top);
}
isrptr[idx] &= ~(1 << bitpos);
+ vector = i * 32 + bitpos;
+ VCPU_CTR1(vlapic->vm, vlapic->vcpuid, "EOI vector %d",
+ vector);
VLAPIC_CTR_ISR(vlapic, "vlapic_process_eoi");
vlapic->isrvec_stk_top--;
vlapic_update_ppr(vlapic);
if ((tmrptr[idx] & (1 << bitpos)) != 0) {
- vector = i * 32 + bitpos;
vioapic_process_eoi(vlapic->vm, vlapic->vcpuid,
vector);
}
return;
}
}
+ VCPU_CTR0(vlapic->vm, vlapic->vcpuid, "Gratuitous EOI");
+ vmm_stat_incr(vlapic->vm, vlapic->vcpuid, VLAPIC_GRATUITOUS_EOI, 1);
}
static __inline int
@@ -1092,11 +1094,7 @@ vlapic_pending_intr(struct vlapic *vlapic, int *vecptr)
irrptr = &lapic->irr0;
- /*
- * The x86 architecture reserves the the first 32 vectors for use
- * by the processor.
- */
- for (i = 7; i > 0; i--) {
+ for (i = 7; i >= 0; i--) {
idx = i * 4;
val = atomic_load_acq_int(&irrptr[idx]);
bitpos = fls(val);
diff --git a/sys/amd64/vmm/io/vpmtmr.c b/sys/amd64/vmm/io/vpmtmr.c
index 09f763f..1e7bb93 100644
--- a/sys/amd64/vmm/io/vpmtmr.c
+++ b/sys/amd64/vmm/io/vpmtmr.c
@@ -29,7 +29,6 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/queue.h>
-#include <sys/cpuset.h>
#include <sys/kernel.h>
#include <sys/malloc.h>
#include <sys/systm.h>
diff --git a/sys/amd64/vmm/io/vrtc.c b/sys/amd64/vmm/io/vrtc.c
index ab9cabb..18ebc4b 100644
--- a/sys/amd64/vmm/io/vrtc.c
+++ b/sys/amd64/vmm/io/vrtc.c
@@ -30,7 +30,6 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/queue.h>
-#include <sys/cpuset.h>
#include <sys/kernel.h>
#include <sys/malloc.h>
#include <sys/lock.h>
@@ -63,9 +62,12 @@ struct rtcdev {
uint8_t reg_b;
uint8_t reg_c;
uint8_t reg_d;
- uint8_t nvram[128 - 14];
+ uint8_t nvram[36];
+ uint8_t century;
+ uint8_t nvram2[128 - 51];
} __packed;
CTASSERT(sizeof(struct rtcdev) == 128);
+CTASSERT(offsetof(struct rtcdev, century) == RTC_CENTURY);
struct vrtc {
struct vm *vm;
@@ -139,20 +141,23 @@ update_enabled(struct vrtc *vrtc)
}
static time_t
-vrtc_curtime(struct vrtc *vrtc)
+vrtc_curtime(struct vrtc *vrtc, sbintime_t *basetime)
{
sbintime_t now, delta;
- time_t t;
+ time_t t, secs;
KASSERT(VRTC_LOCKED(vrtc), ("%s: vrtc not locked", __func__));
t = vrtc->base_rtctime;
+ *basetime = vrtc->base_uptime;
if (update_enabled(vrtc)) {
now = sbinuptime();
delta = now - vrtc->base_uptime;
KASSERT(delta >= 0, ("vrtc_curtime: uptime went backwards: "
"%#lx to %#lx", vrtc->base_uptime, now));
- t += delta / SBT_1S;
+ secs = delta / SBT_1S;
+ t += secs;
+ *basetime += secs * SBT_1S;
}
return (t);
}
@@ -245,6 +250,7 @@ secs_to_rtc(time_t rtctime, struct vrtc *vrtc, int force_update)
rtc->day_of_month = rtcset(rtc, ct.day);
rtc->month = rtcset(rtc, ct.mon);
rtc->year = rtcset(rtc, ct.year % 100);
+ rtc->century = rtcset(rtc, ct.year / 100);
}
static int
@@ -274,7 +280,7 @@ rtc_to_secs(struct vrtc *vrtc)
struct timespec ts;
struct rtcdev *rtc;
struct vm *vm;
- int error, hour, pm, year;
+ int century, error, hour, pm, year;
KASSERT(VRTC_LOCKED(vrtc), ("%s: vrtc not locked", __func__));
@@ -358,10 +364,14 @@ rtc_to_secs(struct vrtc *vrtc)
VM_CTR2(vm, "Invalid RTC year %#x/%d", rtc->year, year);
goto fail;
}
- if (year >= 70)
- ct.year = 1900 + year;
- else
- ct.year = 2000 + year;
+
+ error = rtcget(rtc, rtc->century, &century);
+ ct.year = century * 100 + year;
+ if (error || ct.year < POSIX_BASE_YEAR) {
+ VM_CTR2(vm, "Invalid RTC century %#x/%d", rtc->century,
+ ct.year);
+ goto fail;
+ }
error = clock_ct_to_ts(&ct, &ts);
if (error || ts.tv_sec < 0) {
@@ -373,13 +383,19 @@ rtc_to_secs(struct vrtc *vrtc)
}
return (ts.tv_sec); /* success */
fail:
- return (VRTC_BROKEN_TIME); /* failure */
+ /*
+ * Stop updating the RTC if the date/time fields programmed by
+ * the guest are invalid.
+ */
+ VM_CTR0(vrtc->vm, "Invalid RTC date/time programming detected");
+ return (VRTC_BROKEN_TIME);
}
static int
-vrtc_time_update(struct vrtc *vrtc, time_t newtime)
+vrtc_time_update(struct vrtc *vrtc, time_t newtime, sbintime_t newbase)
{
struct rtcdev *rtc;
+ sbintime_t oldbase;
time_t oldtime;
uint8_t alarm_sec, alarm_min, alarm_hour;
@@ -391,16 +407,21 @@ vrtc_time_update(struct vrtc *vrtc, time_t newtime)
alarm_hour = rtc->alarm_hour;
oldtime = vrtc->base_rtctime;
- VM_CTR2(vrtc->vm, "Updating RTC time from %#lx to %#lx",
+ VM_CTR2(vrtc->vm, "Updating RTC secs from %#lx to %#lx",
oldtime, newtime);
+ oldbase = vrtc->base_uptime;
+ VM_CTR2(vrtc->vm, "Updating RTC base uptime from %#lx to %#lx",
+ oldbase, newbase);
+ vrtc->base_uptime = newbase;
+
if (newtime == oldtime)
return (0);
/*
* If 'newtime' indicates that RTC updates are disabled then just
* record that and return. There is no need to do alarm interrupt
- * processing or update 'base_uptime' in this case.
+ * processing in this case.
*/
if (newtime == VRTC_BROKEN_TIME) {
vrtc->base_rtctime = VRTC_BROKEN_TIME;
@@ -446,8 +467,6 @@ vrtc_time_update(struct vrtc *vrtc, time_t newtime)
if (uintr_enabled(vrtc))
vrtc_set_reg_c(vrtc, rtc->reg_c | RTCIR_UPDATE);
- vrtc->base_uptime = sbinuptime();
-
return (0);
}
@@ -518,7 +537,7 @@ static void
vrtc_callout_handler(void *arg)
{
struct vrtc *vrtc = arg;
- sbintime_t freqsbt;
+ sbintime_t freqsbt, basetime;
time_t rtctime;
int error;
@@ -540,8 +559,8 @@ vrtc_callout_handler(void *arg)
vrtc_set_reg_c(vrtc, vrtc->rtcdev.reg_c | RTCIR_PERIOD);
if (aintr_enabled(vrtc) || uintr_enabled(vrtc)) {
- rtctime = vrtc_curtime(vrtc);
- error = vrtc_time_update(vrtc, rtctime);
+ rtctime = vrtc_curtime(vrtc, &basetime);
+ error = vrtc_time_update(vrtc, rtctime, basetime);
KASSERT(error == 0, ("%s: vrtc_time_update error %d",
__func__, error));
}
@@ -606,7 +625,7 @@ static int
vrtc_set_reg_b(struct vrtc *vrtc, uint8_t newval)
{
struct rtcdev *rtc;
- sbintime_t oldfreq, newfreq;
+ sbintime_t oldfreq, newfreq, basetime;
time_t curtime, rtctime;
int error;
uint8_t oldval, changed;
@@ -627,19 +646,13 @@ vrtc_set_reg_b(struct vrtc *vrtc, uint8_t newval)
if (changed & RTCSB_HALT) {
if ((newval & RTCSB_HALT) == 0) {
rtctime = rtc_to_secs(vrtc);
+ basetime = sbinuptime();
if (rtctime == VRTC_BROKEN_TIME) {
- /*
- * Stop updating the RTC if the date/time
- * programmed by the guest is not correct.
- */
- VM_CTR0(vrtc->vm, "Invalid RTC date/time "
- "programming detected");
-
if (rtc_flag_broken_time)
return (-1);
}
} else {
- curtime = vrtc_curtime(vrtc);
+ curtime = vrtc_curtime(vrtc, &basetime);
KASSERT(curtime == vrtc->base_rtctime, ("%s: mismatch "
"between vrtc basetime (%#lx) and curtime (%#lx)",
__func__, vrtc->base_rtctime, curtime));
@@ -658,7 +671,7 @@ vrtc_set_reg_b(struct vrtc *vrtc, uint8_t newval)
rtctime = VRTC_BROKEN_TIME;
rtc->reg_b &= ~RTCSB_UINTR;
}
- error = vrtc_time_update(vrtc, rtctime);
+ error = vrtc_time_update(vrtc, rtctime, basetime);
KASSERT(error == 0, ("vrtc_time_update error %d", error));
}
@@ -738,7 +751,7 @@ vrtc_set_time(struct vm *vm, time_t secs)
vrtc = vm_rtc(vm);
VRTC_LOCK(vrtc);
- error = vrtc_time_update(vrtc, secs);
+ error = vrtc_time_update(vrtc, secs, sbinuptime());
VRTC_UNLOCK(vrtc);
if (error) {
@@ -755,11 +768,12 @@ time_t
vrtc_get_time(struct vm *vm)
{
struct vrtc *vrtc;
+ sbintime_t basetime;
time_t t;
vrtc = vm_rtc(vm);
VRTC_LOCK(vrtc);
- t = vrtc_curtime(vrtc);
+ t = vrtc_curtime(vrtc, &basetime);
VRTC_UNLOCK(vrtc);
return (t);
@@ -777,7 +791,7 @@ vrtc_nvram_write(struct vm *vm, int offset, uint8_t value)
* Don't allow writes to RTC control registers or the date/time fields.
*/
if (offset < offsetof(struct rtcdev, nvram[0]) ||
- offset >= sizeof(struct rtcdev)) {
+ offset == RTC_CENTURY || offset >= sizeof(struct rtcdev)) {
VM_CTR1(vrtc->vm, "RTC nvram write to invalid offset %d",
offset);
return (EINVAL);
@@ -796,6 +810,7 @@ int
vrtc_nvram_read(struct vm *vm, int offset, uint8_t *retval)
{
struct vrtc *vrtc;
+ sbintime_t basetime;
time_t curtime;
uint8_t *ptr;
@@ -811,8 +826,8 @@ vrtc_nvram_read(struct vm *vm, int offset, uint8_t *retval)
/*
* Update RTC date/time fields if necessary.
*/
- if (offset < 10) {
- curtime = vrtc_curtime(vrtc);
+ if (offset < 10 || offset == RTC_CENTURY) {
+ curtime = vrtc_curtime(vrtc, &basetime);
secs_to_rtc(curtime, vrtc, 0);
}
@@ -852,6 +867,7 @@ vrtc_data_handler(struct vm *vm, int vcpuid, bool in, int port, int bytes,
{
struct vrtc *vrtc;
struct rtcdev *rtc;
+ sbintime_t basetime;
time_t curtime;
int error, offset;
@@ -869,16 +885,20 @@ vrtc_data_handler(struct vm *vm, int vcpuid, bool in, int port, int bytes,
}
error = 0;
- curtime = vrtc_curtime(vrtc);
- vrtc_time_update(vrtc, curtime);
+ curtime = vrtc_curtime(vrtc, &basetime);
+ vrtc_time_update(vrtc, curtime, basetime);
- if (in) {
- /*
- * Update RTC date/time fields if necessary.
- */
- if (offset < 10)
- secs_to_rtc(curtime, vrtc, 0);
+ /*
+ * Update RTC date/time fields if necessary.
+ *
+ * This is not just for reads of the RTC. The side-effect of writing
+ * the century byte requires other RTC date/time fields (e.g. sec)
+ * to be updated here.
+ */
+ if (offset < 10 || offset == RTC_CENTURY)
+ secs_to_rtc(curtime, vrtc, 0);
+ if (in) {
if (offset == 12) {
/*
* XXX
@@ -922,6 +942,18 @@ vrtc_data_handler(struct vm *vm, int vcpuid, bool in, int port, int bytes,
*((uint8_t *)rtc + offset) = *val;
break;
}
+
+ /*
+ * XXX some guests (e.g. OpenBSD) write the century byte
+ * outside of RTCSB_HALT so re-calculate the RTC date/time.
+ */
+ if (offset == RTC_CENTURY && !rtc_halted(vrtc)) {
+ curtime = rtc_to_secs(vrtc);
+ error = vrtc_time_update(vrtc, curtime, sbinuptime());
+ KASSERT(!error, ("vrtc_time_update error %d", error));
+ if (curtime == VRTC_BROKEN_TIME && rtc_flag_broken_time)
+ error = -1;
+ }
}
VRTC_UNLOCK(vrtc);
return (error);
@@ -971,7 +1003,7 @@ vrtc_init(struct vm *vm)
VRTC_LOCK(vrtc);
vrtc->base_rtctime = VRTC_BROKEN_TIME;
- vrtc_time_update(vrtc, curtime);
+ vrtc_time_update(vrtc, curtime, sbinuptime());
secs_to_rtc(curtime, vrtc, 0);
VRTC_UNLOCK(vrtc);
diff --git a/sys/amd64/vmm/vmm.c b/sys/amd64/vmm/vmm.c
index 6bd5bce..bca9b98 100644
--- a/sys/amd64/vmm/vmm.c
+++ b/sys/amd64/vmm/vmm.c
@@ -1293,8 +1293,12 @@ vm_handle_inst_emul(struct vm *vm, int vcpuid, bool *retu)
else if (error != 0)
panic("%s: vmm_fetch_instruction error %d", __func__, error);
- if (vmm_decode_instruction(vm, vcpuid, gla, cpu_mode, cs_d, vie) != 0)
- return (EFAULT);
+ if (vmm_decode_instruction(vm, vcpuid, gla, cpu_mode, cs_d, vie) != 0) {
+ VCPU_CTR1(vm, vcpuid, "Error decoding instruction at %#lx",
+ vme->rip + cs_base);
+ *retu = true; /* dump instruction bytes in userspace */
+ return (0);
+ }
/*
* If the instruction length was not specified then update it now
diff --git a/sys/amd64/vmm/vmm_instruction_emul.c b/sys/amd64/vmm/vmm_instruction_emul.c
index ca0b144..7172365 100644
--- a/sys/amd64/vmm/vmm_instruction_emul.c
+++ b/sys/amd64/vmm/vmm_instruction_emul.c
@@ -71,6 +71,9 @@ enum {
VIE_OP_TYPE_CMP,
VIE_OP_TYPE_POP,
VIE_OP_TYPE_MOVS,
+ VIE_OP_TYPE_GROUP1,
+ VIE_OP_TYPE_STOS,
+ VIE_OP_TYPE_BITTEST,
VIE_OP_TYPE_LAST
};
@@ -90,6 +93,11 @@ static const struct vie_op two_byte_opcodes[256] = {
.op_byte = 0xB7,
.op_type = VIE_OP_TYPE_MOVZX,
},
+ [0xBA] = {
+ .op_byte = 0xBA,
+ .op_type = VIE_OP_TYPE_BITTEST,
+ .op_flags = VIE_OP_F_IMM8,
+ },
[0xBE] = {
.op_byte = 0xBE,
.op_type = VIE_OP_TYPE_MOVSX,
@@ -145,6 +153,16 @@ static const struct vie_op one_byte_opcodes[256] = {
.op_type = VIE_OP_TYPE_MOVS,
.op_flags = VIE_OP_F_NO_MODRM | VIE_OP_F_NO_GLA_VERIFICATION
},
+ [0xAA] = {
+ .op_byte = 0xAA,
+ .op_type = VIE_OP_TYPE_STOS,
+ .op_flags = VIE_OP_F_NO_MODRM | VIE_OP_F_NO_GLA_VERIFICATION
+ },
+ [0xAB] = {
+ .op_byte = 0xAB,
+ .op_type = VIE_OP_TYPE_STOS,
+ .op_flags = VIE_OP_F_NO_MODRM | VIE_OP_F_NO_GLA_VERIFICATION
+ },
[0xC6] = {
/* XXX Group 11 extended opcode - not just MOV */
.op_byte = 0xC6,
@@ -161,15 +179,15 @@ static const struct vie_op one_byte_opcodes[256] = {
.op_type = VIE_OP_TYPE_AND,
},
[0x81] = {
- /* XXX Group 1 extended opcode - not just AND */
+ /* XXX Group 1 extended opcode */
.op_byte = 0x81,
- .op_type = VIE_OP_TYPE_AND,
+ .op_type = VIE_OP_TYPE_GROUP1,
.op_flags = VIE_OP_F_IMM,
},
[0x83] = {
- /* XXX Group 1 extended opcode - not just OR */
+ /* XXX Group 1 extended opcode */
.op_byte = 0x83,
- .op_type = VIE_OP_TYPE_OR,
+ .op_type = VIE_OP_TYPE_GROUP1,
.op_flags = VIE_OP_F_IMM8,
},
[0x8F] = {
@@ -802,6 +820,68 @@ done:
}
static int
+emulate_stos(void *vm, int vcpuid, uint64_t gpa, struct vie *vie,
+ struct vm_guest_paging *paging, mem_region_read_t memread,
+ mem_region_write_t memwrite, void *arg)
+{
+ int error, opsize, repeat;
+ uint64_t val;
+ uint64_t rcx, rdi, rflags;
+
+ opsize = (vie->op.op_byte == 0xAA) ? 1 : vie->opsize;
+ repeat = vie->repz_present | vie->repnz_present;
+
+ if (repeat) {
+ error = vie_read_register(vm, vcpuid, VM_REG_GUEST_RCX, &rcx);
+ KASSERT(!error, ("%s: error %d getting rcx", __func__, error));
+
+ /*
+ * The count register is %rcx, %ecx or %cx depending on the
+ * address size of the instruction.
+ */
+ if ((rcx & vie_size2mask(vie->addrsize)) == 0)
+ return (0);
+ }
+
+ error = vie_read_register(vm, vcpuid, VM_REG_GUEST_RAX, &val);
+ KASSERT(!error, ("%s: error %d getting rax", __func__, error));
+
+ error = memwrite(vm, vcpuid, gpa, val, opsize, arg);
+ if (error)
+ return (error);
+
+ error = vie_read_register(vm, vcpuid, VM_REG_GUEST_RDI, &rdi);
+ KASSERT(error == 0, ("%s: error %d getting rdi", __func__, error));
+
+ error = vie_read_register(vm, vcpuid, VM_REG_GUEST_RFLAGS, &rflags);
+ KASSERT(error == 0, ("%s: error %d getting rflags", __func__, error));
+
+ if (rflags & PSL_D)
+ rdi -= opsize;
+ else
+ rdi += opsize;
+
+ error = vie_update_register(vm, vcpuid, VM_REG_GUEST_RDI, rdi,
+ vie->addrsize);
+ KASSERT(error == 0, ("%s: error %d updating rdi", __func__, error));
+
+ if (repeat) {
+ rcx = rcx - 1;
+ error = vie_update_register(vm, vcpuid, VM_REG_GUEST_RCX,
+ rcx, vie->addrsize);
+ KASSERT(!error, ("%s: error %d updating rcx", __func__, error));
+
+ /*
+ * Repeat the instruction if the count register is not zero.
+ */
+ if ((rcx & vie_size2mask(vie->addrsize)) != 0)
+ vm_restart_instruction(vm, vcpuid);
+ }
+
+ return (0);
+}
+
+static int
emulate_and(void *vm, int vcpuid, uint64_t gpa, struct vie *vie,
mem_region_read_t memread, mem_region_write_t memwrite, void *arg)
{
@@ -839,16 +919,18 @@ emulate_and(void *vm, int vcpuid, uint64_t gpa, struct vie *vie,
error = vie_update_register(vm, vcpuid, reg, result, size);
break;
case 0x81:
+ case 0x83:
/*
- * AND/OR mem (ModRM:r/m) with immediate and store the
+ * AND mem (ModRM:r/m) with immediate and store the
* result in mem.
*
- * AND: i = 4
- * OR: i = 1
- * 81 /i op r/m16, imm16
- * 81 /i op r/m32, imm32
- * REX.W + 81 /i op r/m64, imm32 sign-extended to 64
+ * 81 /4 and r/m16, imm16
+ * 81 /4 and r/m32, imm32
+ * REX.W + 81 /4 and r/m64, imm32 sign-extended to 64
*
+ * 83 /4 and r/m16, imm8 sign-extended to 16
+ * 83 /4 and r/m32, imm8 sign-extended to 32
+ * REX.W + 83/4 and r/m64, imm8 sign-extended to 64
*/
/* get the first operand */
@@ -857,26 +939,11 @@ emulate_and(void *vm, int vcpuid, uint64_t gpa, struct vie *vie,
break;
/*
- * perform the operation with the pre-fetched immediate
- * operand and write the result
- */
- switch (vie->reg & 7) {
- case 0x4:
- /* modrm:reg == b100, AND */
- result = val1 & vie->immediate;
- break;
- case 0x1:
- /* modrm:reg == b001, OR */
- result = val1 | vie->immediate;
- break;
- default:
- error = EINVAL;
- break;
- }
- if (error)
- break;
-
- error = memwrite(vm, vcpuid, gpa, result, size, arg);
+ * perform the operation with the pre-fetched immediate
+ * operand and write the result
+ */
+ result = val1 & vie->immediate;
+ error = memwrite(vm, vcpuid, gpa, result, size, arg);
break;
default:
break;
@@ -913,20 +980,20 @@ emulate_or(void *vm, int vcpuid, uint64_t gpa, struct vie *vie,
error = EINVAL;
switch (vie->op.op_byte) {
+ case 0x81:
case 0x83:
/*
* OR mem (ModRM:r/m) with immediate and store the
* result in mem.
*
- * 83 /1 OR r/m16, imm8 sign-extended to 16
- * 83 /1 OR r/m32, imm8 sign-extended to 32
- * REX.W + 83/1 OR r/m64, imm8 sign-extended to 64
+ * 81 /1 or r/m16, imm16
+ * 81 /1 or r/m32, imm32
+ * REX.W + 81 /1 or r/m64, imm32 sign-extended to 64
*
- * Currently, only the OR operation of the 0x83 opcode
- * is implemented (ModRM:reg = b001).
+ * 83 /1 or r/m16, imm8 sign-extended to 16
+ * 83 /1 or r/m32, imm8 sign-extended to 32
+ * REX.W + 83/1 or r/m64, imm8 sign-extended to 64
*/
- if ((vie->reg & 7) != 1)
- break;
/* get the first operand */
error = memread(vm, vcpuid, gpa, &val1, size, arg);
@@ -997,11 +1064,37 @@ emulate_cmp(void *vm, int vcpuid, uint64_t gpa, struct vie *vie,
if (error)
return (error);
+ rflags2 = getcc(size, op1, op2);
+ break;
+ case 0x81:
+ case 0x83:
+ /*
+ * 81 /7 cmp r/m16, imm16
+ * 81 /7 cmp r/m32, imm32
+ * REX.W + 81 /7 cmp r/m64, imm32 sign-extended to 64
+ *
+ * 83 /7 cmp r/m16, imm8 sign-extended to 16
+ * 83 /7 cmp r/m32, imm8 sign-extended to 32
+ * REX.W + 83 /7 cmp r/m64, imm8 sign-extended to 64
+ *
+ * Compare mem (ModRM:r/m) with immediate and set
+ * status flags according to the results. The
+ * comparison is performed by subtracting the
+ * immediate from the first operand and then setting
+ * the status flags.
+ *
+ */
+
+ /* get the first operand */
+ error = memread(vm, vcpuid, gpa, &op1, size, arg);
+ if (error)
+ return (error);
+
+ rflags2 = getcc(size, op1, vie->immediate);
break;
default:
return (EINVAL);
}
- rflags2 = getcc(size, op1, op2);
error = vie_read_register(vm, vcpuid, VM_REG_GUEST_RFLAGS, &rflags);
if (error)
return (error);
@@ -1220,6 +1313,76 @@ emulate_pop(void *vm, int vcpuid, uint64_t mmio_gpa, struct vie *vie,
return (error);
}
+static int
+emulate_group1(void *vm, int vcpuid, uint64_t gpa, struct vie *vie,
+ struct vm_guest_paging *paging, mem_region_read_t memread,
+ mem_region_write_t memwrite, void *memarg)
+{
+ int error;
+
+ switch (vie->reg & 7) {
+ case 0x1: /* OR */
+ error = emulate_or(vm, vcpuid, gpa, vie,
+ memread, memwrite, memarg);
+ break;
+ case 0x4: /* AND */
+ error = emulate_and(vm, vcpuid, gpa, vie,
+ memread, memwrite, memarg);
+ break;
+ case 0x7: /* CMP */
+ error = emulate_cmp(vm, vcpuid, gpa, vie,
+ memread, memwrite, memarg);
+ break;
+ default:
+ error = EINVAL;
+ break;
+ }
+
+ return (error);
+}
+
+static int
+emulate_bittest(void *vm, int vcpuid, uint64_t gpa, struct vie *vie,
+ mem_region_read_t memread, mem_region_write_t memwrite, void *memarg)
+{
+ uint64_t val, rflags;
+ int error, bitmask, bitoff;
+
+ /*
+ * 0F BA is a Group 8 extended opcode.
+ *
+ * Currently we only emulate the 'Bit Test' instruction which is
+ * identified by a ModR/M:reg encoding of 100b.
+ */
+ if ((vie->reg & 7) != 4)
+ return (EINVAL);
+
+ error = vie_read_register(vm, vcpuid, VM_REG_GUEST_RFLAGS, &rflags);
+ KASSERT(error == 0, ("%s: error %d getting rflags", __func__, error));
+
+ error = memread(vm, vcpuid, gpa, &val, vie->opsize, memarg);
+ if (error)
+ return (error);
+
+ /*
+ * Intel SDM, Vol 2, Table 3-2:
+ * "Range of Bit Positions Specified by Bit Offset Operands"
+ */
+ bitmask = vie->opsize * 8 - 1;
+ bitoff = vie->immediate & bitmask;
+
+ /* Copy the bit into the Carry flag in %rflags */
+ if (val & (1UL << bitoff))
+ rflags |= PSL_C;
+ else
+ rflags &= ~PSL_C;
+
+ error = vie_update_register(vm, vcpuid, VM_REG_GUEST_RFLAGS, rflags, 8);
+ KASSERT(error == 0, ("%s: error %d updating rflags", __func__, error));
+
+ return (0);
+}
+
int
vmm_emulate_instruction(void *vm, int vcpuid, uint64_t gpa, struct vie *vie,
struct vm_guest_paging *paging, mem_region_read_t memread,
@@ -1231,6 +1394,10 @@ vmm_emulate_instruction(void *vm, int vcpuid, uint64_t gpa, struct vie *vie,
return (EINVAL);
switch (vie->op.op_type) {
+ case VIE_OP_TYPE_GROUP1:
+ error = emulate_group1(vm, vcpuid, gpa, vie, paging, memread,
+ memwrite, memarg);
+ break;
case VIE_OP_TYPE_POP:
error = emulate_pop(vm, vcpuid, gpa, vie, paging, memread,
memwrite, memarg);
@@ -1256,6 +1423,10 @@ vmm_emulate_instruction(void *vm, int vcpuid, uint64_t gpa, struct vie *vie,
error = emulate_movs(vm, vcpuid, gpa, vie, paging, memread,
memwrite, memarg);
break;
+ case VIE_OP_TYPE_STOS:
+ error = emulate_stos(vm, vcpuid, gpa, vie, paging, memread,
+ memwrite, memarg);
+ break;
case VIE_OP_TYPE_AND:
error = emulate_and(vm, vcpuid, gpa, vie,
memread, memwrite, memarg);
@@ -1268,6 +1439,10 @@ vmm_emulate_instruction(void *vm, int vcpuid, uint64_t gpa, struct vie *vie,
error = emulate_sub(vm, vcpuid, gpa, vie,
memread, memwrite, memarg);
break;
+ case VIE_OP_TYPE_BITTEST:
+ error = emulate_bittest(vm, vcpuid, gpa, vie,
+ memread, memwrite, memarg);
+ break;
default:
error = EINVAL;
break;
diff --git a/sys/amd64/vmm/vmm_ioport.c b/sys/amd64/vmm/vmm_ioport.c
index fc68a61..63044e8 100644
--- a/sys/amd64/vmm/vmm_ioport.c
+++ b/sys/amd64/vmm/vmm_ioport.c
@@ -28,16 +28,10 @@
__FBSDID("$FreeBSD$");
#include <sys/param.h>
-#include <sys/types.h>
-#include <sys/queue.h>
-#include <sys/cpuset.h>
#include <sys/systm.h>
-#include <vm/vm.h>
-
#include <machine/vmm.h>
#include <machine/vmm_instruction_emul.h>
-#include <x86/psl.h>
#include "vatpic.h"
#include "vatpit.h"
diff --git a/sys/amd64/vmm/vmm_lapic.c b/sys/amd64/vmm/vmm_lapic.c
index 15a995e..6bccd32 100644
--- a/sys/amd64/vmm/vmm_lapic.c
+++ b/sys/amd64/vmm/vmm_lapic.c
@@ -57,7 +57,11 @@ lapic_set_intr(struct vm *vm, int cpu, int vector, bool level)
if (cpu < 0 || cpu >= VM_MAXCPU)
return (EINVAL);
- if (vector < 32 || vector > 255)
+ /*
+ * According to section "Maskable Hardware Interrupts" in Intel SDM
+ * vectors 16 through 255 can be delivered through the local APIC.
+ */
+ if (vector < 16 || vector > 255)
return (EINVAL);
vlapic = vm_lapic(vm, cpu);
diff --git a/sys/amd64/vmm/vmm_stat.c b/sys/amd64/vmm/vmm_stat.c
index 9ecf9af..4ae5fb9 100644
--- a/sys/amd64/vmm/vmm_stat.c
+++ b/sys/amd64/vmm/vmm_stat.c
@@ -33,7 +33,6 @@ __FBSDID("$FreeBSD$");
#include <sys/kernel.h>
#include <sys/systm.h>
#include <sys/malloc.h>
-#include <sys/smp.h>
#include <machine/vmm.h>
#include "vmm_util.h"
diff --git a/sys/amd64/vmm/x86.c b/sys/amd64/vmm/x86.c
index c37d21c..137c7ee 100644
--- a/sys/amd64/vmm/x86.c
+++ b/sys/amd64/vmm/x86.c
@@ -32,7 +32,6 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/pcpu.h>
#include <sys/systm.h>
-#include <sys/cpuset.h>
#include <sys/sysctl.h>
#include <machine/clock.h>
@@ -231,10 +230,11 @@ x86_emulate_cpuid(struct vm *vm, int vcpu_id,
regs[1] |= (vcpu_id << CPUID_0000_0001_APICID_SHIFT);
/*
- * Don't expose VMX, SpeedStep or TME capability.
+ * Don't expose VMX, SpeedStep, TME or SMX capability.
* Advertise x2APIC capability and Hypervisor guest.
*/
regs[2] &= ~(CPUID2_VMX | CPUID2_EST | CPUID2_TM2);
+ regs[2] &= ~(CPUID2_SMX);
regs[2] |= CPUID2_HV;
@@ -286,18 +286,20 @@ x86_emulate_cpuid(struct vm *vm, int vcpu_id,
* Hide thermal monitoring
*/
regs[3] &= ~(CPUID_ACPI | CPUID_TM);
-
+
/*
- * Machine check handling is done in the host.
- * Hide MTRR capability.
+ * Hide the debug store capability.
*/
- regs[3] &= ~(CPUID_MCA | CPUID_MCE | CPUID_MTRR);
-
- /*
- * Hide the debug store capability.
- */
regs[3] &= ~CPUID_DS;
+ /*
+ * Advertise the Machine Check and MTRR capability.
+ *
+ * Some guest OSes (e.g. Windows) will not boot if
+ * these features are absent.
+ */
+ regs[3] |= (CPUID_MCA | CPUID_MCE | CPUID_MTRR);
+
logical_cpus = threads_per_core * cores_per_package;
regs[1] &= ~CPUID_HTT_CORES;
regs[1] |= (logical_cpus & 0xff) << 16;
diff --git a/sys/arm/allwinner/a10_clk.c b/sys/arm/allwinner/a10_clk.c
index af7e875..ddec359 100644
--- a/sys/arm/allwinner/a10_clk.c
+++ b/sys/arm/allwinner/a10_clk.c
@@ -49,7 +49,6 @@ __FBSDID("$FreeBSD$");
#include <dev/ofw/ofw_bus_subr.h>
#include <machine/bus.h>
-#include <machine/fdt.h>
#include "a10_clk.h"
diff --git a/sys/arm/allwinner/a10_clk.h b/sys/arm/allwinner/a10_clk.h
index 3794196..2bba1a4 100644
--- a/sys/arm/allwinner/a10_clk.h
+++ b/sys/arm/allwinner/a10_clk.h
@@ -17,98 +17,98 @@
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $FreeBSD$
*/
-#ifndef _A10_CLK_H_
-#define _A10_CLK_H_
+#ifndef _A10_CLK_H_
+#define _A10_CLK_H_
-#define CCMU_BASE 0xe1c20000
+#define CCMU_BASE 0xe1c20000
-#define CCM_PLL1_CFG 0x0000
-#define CCM_PLL1_TUN 0x0004
-#define CCM_PLL2_CFG 0x0008
-#define CCM_PLL2_TUN 0x000c
-#define CCM_PLL3_CFG 0x0010
-#define CCM_PLL3_TUN 0x0014
-#define CCM_PLL4_CFG 0x0018
-#define CCM_PLL4_TUN 0x001c
-#define CCM_PLL5_CFG 0x0020
-#define CCM_PLL5_TUN 0x0024
-#define CCM_PLL6_CFG 0x0028
-#define CCM_PLL6_TUN 0x002c
-#define CCM_PLL7_CFG 0x0030
-#define CCM_PLL7_TUN 0x0034
-#define CCM_PLL1_TUN2 0x0038
-#define CCM_PLL5_TUN2 0x003c
-#define CCM_PLL_LOCK_DBG 0x004c
-#define CCM_OSC24M_CFG 0x0050
-#define CCM_CPU_AHB_APB0_CFG 0x0054
-#define CCM_APB1_CLK_DIV 0x0058
-#define CCM_AXI_GATING 0x005c
-#define CCM_AHB_GATING0 0x0060
-#define CCM_AHB_GATING1 0x0064
-#define CCM_APB0_GATING 0x0068
-#define CCM_APB1_GATING 0x006c
-#define CCM_NAND_SCLK_CFG 0x0080
-#define CCM_MS_SCLK_CFG 0x0084
-#define CCM_MMC0_SCLK_CFG 0x0088
-#define CCM_MMC1_SCLK_CFG 0x008c
-#define CCM_MMC2_SCLK_CFG 0x0090
-#define CCM_MMC3_SCLK_CFG 0x0094
-#define CCM_TS_CLK 0x0098
-#define CCM_SS_CLK 0x009c
-#define CCM_SPI0_CLK 0x00a0
-#define CCM_SPI1_CLK 0x00a4
-#define CCM_SPI2_CLK 0x00a8
-#define CCM_PATA_CLK 0x00ac
-#define CCM_IR0_CLK 0x00b0
-#define CCM_IR1_CLK 0x00b4
-#define CCM_IIS_CLK 0x00b8
-#define CCM_AC97_CLK 0x00bc
-#define CCM_SPDIF_CLK 0x00c0
-#define CCM_KEYPAD_CLK 0x00c4
-#define CCM_SATA_CLK 0x00c8
-#define CCM_USB_CLK 0x00cc
-#define CCM_GPS_CLK 0x00d0
-#define CCM_SPI3_CLK 0x00d4
-#define CCM_DRAM_CLK 0x0100
-#define CCM_BE0_SCLK 0x0104
-#define CCM_BE1_SCLK 0x0108
-#define CCM_FE0_CLK 0x010c
-#define CCM_FE1_CLK 0x0110
-#define CCM_MP_CLK 0x0114
-#define CCM_LCD0_CH0_CLK 0x0118
-#define CCM_LCD1_CH0_CLK 0x011c
-#define CCM_CSI_ISP_CLK 0x0120
-#define CCM_TVD_CLK 0x0128
-#define CCM_LCD0_CH1_CLK 0x012c
-#define CCM_LCD1_CH1_CLK 0x0130
-#define CCM_CS0_CLK 0x0134
-#define CCM_CS1_CLK 0x0138
-#define CCM_VE_CLK 0x013c
-#define CCM_AUDIO_CODEC_CLK 0x0140
-#define CCM_AVS_CLK 0x0144
-#define CCM_ACE_CLK 0x0148
-#define CCM_LVDS_CLK 0x014c
-#define CCM_HDMI_CLK 0x0150
-#define CCM_MALI400_CLK 0x0154
+#define CCM_PLL1_CFG 0x0000
+#define CCM_PLL1_TUN 0x0004
+#define CCM_PLL2_CFG 0x0008
+#define CCM_PLL2_TUN 0x000c
+#define CCM_PLL3_CFG 0x0010
+#define CCM_PLL3_TUN 0x0014
+#define CCM_PLL4_CFG 0x0018
+#define CCM_PLL4_TUN 0x001c
+#define CCM_PLL5_CFG 0x0020
+#define CCM_PLL5_TUN 0x0024
+#define CCM_PLL6_CFG 0x0028
+#define CCM_PLL6_TUN 0x002c
+#define CCM_PLL7_CFG 0x0030
+#define CCM_PLL7_TUN 0x0034
+#define CCM_PLL1_TUN2 0x0038
+#define CCM_PLL5_TUN2 0x003c
+#define CCM_PLL_LOCK_DBG 0x004c
+#define CCM_OSC24M_CFG 0x0050
+#define CCM_CPU_AHB_APB0_CFG 0x0054
+#define CCM_APB1_CLK_DIV 0x0058
+#define CCM_AXI_GATING 0x005c
+#define CCM_AHB_GATING0 0x0060
+#define CCM_AHB_GATING1 0x0064
+#define CCM_APB0_GATING 0x0068
+#define CCM_APB1_GATING 0x006c
+#define CCM_NAND_SCLK_CFG 0x0080
+#define CCM_MS_SCLK_CFG 0x0084
+#define CCM_MMC0_SCLK_CFG 0x0088
+#define CCM_MMC1_SCLK_CFG 0x008c
+#define CCM_MMC2_SCLK_CFG 0x0090
+#define CCM_MMC3_SCLK_CFG 0x0094
+#define CCM_TS_CLK 0x0098
+#define CCM_SS_CLK 0x009c
+#define CCM_SPI0_CLK 0x00a0
+#define CCM_SPI1_CLK 0x00a4
+#define CCM_SPI2_CLK 0x00a8
+#define CCM_PATA_CLK 0x00ac
+#define CCM_IR0_CLK 0x00b0
+#define CCM_IR1_CLK 0x00b4
+#define CCM_IIS_CLK 0x00b8
+#define CCM_AC97_CLK 0x00bc
+#define CCM_SPDIF_CLK 0x00c0
+#define CCM_KEYPAD_CLK 0x00c4
+#define CCM_SATA_CLK 0x00c8
+#define CCM_USB_CLK 0x00cc
+#define CCM_GPS_CLK 0x00d0
+#define CCM_SPI3_CLK 0x00d4
+#define CCM_DRAM_CLK 0x0100
+#define CCM_BE0_SCLK 0x0104
+#define CCM_BE1_SCLK 0x0108
+#define CCM_FE0_CLK 0x010c
+#define CCM_FE1_CLK 0x0110
+#define CCM_MP_CLK 0x0114
+#define CCM_LCD0_CH0_CLK 0x0118
+#define CCM_LCD1_CH0_CLK 0x011c
+#define CCM_CSI_ISP_CLK 0x0120
+#define CCM_TVD_CLK 0x0128
+#define CCM_LCD0_CH1_CLK 0x012c
+#define CCM_LCD1_CH1_CLK 0x0130
+#define CCM_CS0_CLK 0x0134
+#define CCM_CS1_CLK 0x0138
+#define CCM_VE_CLK 0x013c
+#define CCM_AUDIO_CODEC_CLK 0x0140
+#define CCM_AVS_CLK 0x0144
+#define CCM_ACE_CLK 0x0148
+#define CCM_LVDS_CLK 0x014c
+#define CCM_HDMI_CLK 0x0150
+#define CCM_MALI400_CLK 0x0154
-#define CCM_AHB_GATING_USB0 (1 << 0)
-#define CCM_AHB_GATING_EHCI0 (1 << 1)
-#define CCM_AHB_GATING_EHCI1 (1 << 3)
-#define CCM_AHB_GATING_EMAC (1 << 17)
+#define CCM_AHB_GATING_USB0 (1 << 0)
+#define CCM_AHB_GATING_EHCI0 (1 << 1)
+#define CCM_AHB_GATING_EHCI1 (1 << 3)
+#define CCM_AHB_GATING_EMAC (1 << 17)
-#define CCM_USB_PHY (1 << 8)
-#define CCM_USB0_RESET (1 << 0)
-#define CCM_USB1_RESET (1 << 1)
-#define CCM_USB2_RESET (1 << 2)
+#define CCM_USB_PHY (1 << 8)
+#define CCM_USB0_RESET (1 << 0)
+#define CCM_USB1_RESET (1 << 1)
+#define CCM_USB2_RESET (1 << 2)
int a10_clk_usb_activate(void);
int a10_clk_usb_deactivate(void);
diff --git a/sys/arm/allwinner/a10_common.c b/sys/arm/allwinner/a10_common.c
index 9bc726e..3b5bf0e 100644
--- a/sys/arm/allwinner/a10_common.c
+++ b/sys/arm/allwinner/a10_common.c
@@ -36,7 +36,6 @@ __FBSDID("$FreeBSD$");
#include <dev/ofw/openfirm.h>
#include <machine/bus.h>
-#include <machine/fdt.h>
#include <machine/vmparam.h>
struct fdt_fixup_entry fdt_fixup_table[] = {
diff --git a/sys/arm/allwinner/a10_gpio.c b/sys/arm/allwinner/a10_gpio.c
index 906b2c4..b2dca00 100644
--- a/sys/arm/allwinner/a10_gpio.c
+++ b/sys/arm/allwinner/a10_gpio.c
@@ -44,7 +44,6 @@ __FBSDID("$FreeBSD$");
#include <machine/cpu.h>
#include <machine/cpufunc.h>
#include <machine/resource.h>
-#include <machine/fdt.h>
#include <machine/intr.h>
#include <dev/fdt/fdt_common.h>
diff --git a/sys/arm/allwinner/a10_sramc.c b/sys/arm/allwinner/a10_sramc.c
index fc71c7d..a26afbb 100644
--- a/sys/arm/allwinner/a10_sramc.c
+++ b/sys/arm/allwinner/a10_sramc.c
@@ -43,7 +43,6 @@ __FBSDID("$FreeBSD$");
#include <machine/cpu.h>
#include <machine/frame.h>
#include <machine/intr.h>
-#include <machine/fdt.h>
#include <dev/fdt/fdt_common.h>
#include <dev/ofw/openfirm.h>
diff --git a/sys/arm/allwinner/a10_wdog.c b/sys/arm/allwinner/a10_wdog.c
index af7365b..40609b0 100644
--- a/sys/arm/allwinner/a10_wdog.c
+++ b/sys/arm/allwinner/a10_wdog.c
@@ -44,7 +44,6 @@ __FBSDID("$FreeBSD$");
#include <machine/bus.h>
#include <machine/cpufunc.h>
#include <machine/machdep.h>
-#include <machine/fdt.h>
#include <arm/allwinner/a10_wdog.h>
diff --git a/sys/arm/allwinner/a20/a20_cpu_cfg.c b/sys/arm/allwinner/a20/a20_cpu_cfg.c
index 81f6a50..ed0345a 100644
--- a/sys/arm/allwinner/a20/a20_cpu_cfg.c
+++ b/sys/arm/allwinner/a20/a20_cpu_cfg.c
@@ -49,7 +49,6 @@ __FBSDID("$FreeBSD$");
#include <dev/ofw/ofw_bus_subr.h>
#include <machine/bus.h>
-#include <machine/fdt.h>
#include "a20_cpu_cfg.h"
diff --git a/sys/arm/allwinner/a20/a20_mp.c b/sys/arm/allwinner/a20/a20_mp.c
index aa450a7..9429aaf 100644
--- a/sys/arm/allwinner/a20/a20_mp.c
+++ b/sys/arm/allwinner/a20/a20_mp.c
@@ -25,6 +25,7 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/bus.h>
@@ -33,6 +34,9 @@ __FBSDID("$FreeBSD$");
#include <sys/mutex.h>
#include <sys/smp.h>
+#include <vm/vm.h>
+#include <vm/pmap.h>
+
#include <machine/smp.h>
#include <machine/fdt.h>
#include <machine/intr.h>
@@ -68,7 +72,7 @@ platform_mp_setmaxid(void)
if (mp_ncpus != 0)
return;
- /* Read current CP15 Cache Size ID Register */
+ /* Read the number of cores from the CP15 L2 Control Register. */
__asm __volatile("mrc p15, 1, %0, c9, c0, 2" : "=r" (ncpu));
ncpu = ((ncpu >> 24) & 0x3) + 1;
diff --git a/sys/arm/allwinner/a20/files.a20 b/sys/arm/allwinner/a20/files.a20
index 0edd6e8..f8d8f6f 100644
--- a/sys/arm/allwinner/a20/files.a20
+++ b/sys/arm/allwinner/a20/files.a20
@@ -1,19 +1,5 @@
# $FreeBSD$
-kern/kern_clocksource.c standard
-arm/arm/bus_space_asm_generic.S standard
-arm/arm/bus_space_generic.c standard
arm/arm/gic.c standard
-arm/allwinner/a20/a20_cpu_cfg.c standard
-arm/allwinner/a10_clk.c standard
-arm/allwinner/a10_sramc.c standard
-arm/allwinner/a10_gpio.c optional gpio
-arm/allwinner/a10_ehci.c optional ehci
-arm/allwinner/if_emac.c optional emac
-arm/allwinner/a10_wdog.c standard
-arm/allwinner/timer.c standard
-arm/arm/bus_space_base.c standard
-arm/allwinner/a10_common.c standard
-arm/allwinner/a10_machdep.c standard
arm/allwinner/a20/a20_mp.c optional smp
diff --git a/sys/arm/allwinner/a20/std.a20 b/sys/arm/allwinner/a20/std.a20
index 7d5342b..eb4fa3f 100644
--- a/sys/arm/allwinner/a20/std.a20
+++ b/sys/arm/allwinner/a20/std.a20
@@ -22,4 +22,5 @@ options ARM_L2_PIPT
options IPI_IRQ_START=0
options IPI_IRQ_END=15
+files "../allwinner/files.allwinner"
files "../allwinner/a20/files.a20"
diff --git a/sys/arm/allwinner/files.a10 b/sys/arm/allwinner/files.a10
index 8dda7cf..9f28fc4 100644
--- a/sys/arm/allwinner/files.a10
+++ b/sys/arm/allwinner/files.a10
@@ -1,19 +1,3 @@
# $FreeBSD$
-kern/kern_clocksource.c standard
-arm/arm/bus_space_asm_generic.S standard
-arm/arm/bus_space_generic.c standard
-
-arm/allwinner/a10_clk.c standard
-arm/allwinner/a10_common.c standard
-arm/allwinner/a10_gpio.c optional gpio
-arm/allwinner/a10_ehci.c optional ehci
-arm/allwinner/a10_machdep.c standard
-arm/allwinner/a10_sramc.c standard
-arm/allwinner/a10_wdog.c standard
-arm/allwinner/a20/a20_cpu_cfg.c standard
arm/allwinner/aintc.c standard
-arm/allwinner/if_emac.c optional emac
-arm/allwinner/timer.c standard
-arm/arm/bus_space_base.c standard
-#arm/allwinner/console.c standard
diff --git a/sys/arm/allwinner/files.allwinner b/sys/arm/allwinner/files.allwinner
new file mode 100644
index 0000000..9b65e7c
--- /dev/null
+++ b/sys/arm/allwinner/files.allwinner
@@ -0,0 +1,18 @@
+# $FreeBSD$
+kern/kern_clocksource.c standard
+
+arm/arm/bus_space_base.c standard
+arm/arm/bus_space_asm_generic.S standard
+arm/arm/bus_space_generic.c standard
+
+arm/allwinner/a10_clk.c standard
+arm/allwinner/a10_common.c standard
+arm/allwinner/a10_ehci.c optional ehci
+arm/allwinner/a10_gpio.c optional gpio
+arm/allwinner/a10_machdep.c standard
+arm/allwinner/a10_sramc.c standard
+arm/allwinner/a10_wdog.c standard
+arm/allwinner/a20/a20_cpu_cfg.c standard
+arm/allwinner/if_emac.c optional emac
+arm/allwinner/timer.c standard
+#arm/allwinner/console.c standard
diff --git a/sys/arm/allwinner/if_emac.c b/sys/arm/allwinner/if_emac.c
index 7828661..e311049 100644
--- a/sys/arm/allwinner/if_emac.c
+++ b/sys/arm/allwinner/if_emac.c
@@ -101,6 +101,7 @@ struct emac_softc {
int emac_watchdog_timer;
int emac_rx_process_limit;
int emac_link;
+ uint32_t emac_fifo_mask;
};
static int emac_probe(device_t);
@@ -121,7 +122,7 @@ static void emac_intr(void *);
static int emac_ioctl(struct ifnet *, u_long, caddr_t);
static void emac_rxeof(struct emac_softc *, int);
-static void emac_txeof(struct emac_softc *);
+static void emac_txeof(struct emac_softc *, uint32_t);
static int emac_miibus_readreg(device_t, int, int);
static int emac_miibus_writereg(device_t, int, int, int);
@@ -253,14 +254,28 @@ emac_reset(struct emac_softc *sc)
}
static void
-emac_txeof(struct emac_softc *sc)
+emac_drain_rxfifo(struct emac_softc *sc)
+{
+ uint32_t data;
+
+ while (EMAC_READ_REG(sc, EMAC_RX_FBC) > 0)
+ data = EMAC_READ_REG(sc, EMAC_RX_IO_DATA);
+}
+
+static void
+emac_txeof(struct emac_softc *sc, uint32_t status)
{
struct ifnet *ifp;
EMAC_ASSERT_LOCKED(sc);
ifp = sc->emac_ifp;
- if_inc_counter(ifp, IFCOUNTER_OPACKETS, 1);
+ status &= (EMAC_TX_FIFO0 | EMAC_TX_FIFO1);
+ sc->emac_fifo_mask &= ~status;
+ if (status == (EMAC_TX_FIFO0 | EMAC_TX_FIFO1))
+ if_inc_counter(ifp, IFCOUNTER_OPACKETS, 2);
+ else
+ if_inc_counter(ifp, IFCOUNTER_OPACKETS, 1);
ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
/* Unarm watchdog timer if no TX */
@@ -275,7 +290,7 @@ emac_rxeof(struct emac_softc *sc, int count)
uint32_t reg_val, rxcount;
int16_t len;
uint16_t status;
- int good_packet, i;
+ int i;
ifp = sc->emac_ifp;
for (; count > 0 &&
@@ -327,20 +342,19 @@ emac_rxeof(struct emac_softc *sc, int count)
return;
}
- good_packet = 1;
-
/* Get packet size and status */
reg_val = EMAC_READ_REG(sc, EMAC_RX_IO_DATA);
len = reg_val & 0xffff;
status = (reg_val >> 16) & 0xffff;
- if (len < 64) {
- good_packet = 0;
+ if (len < 64 || (status & EMAC_PKT_OK) == 0) {
if (bootverbose)
if_printf(ifp,
"bad packet: len = %i status = %i\n",
len, status);
if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
+ emac_drain_rxfifo(sc);
+ continue;
}
#if 0
if (status & (EMAC_CRCERR | EMAC_LENERR)) {
@@ -352,63 +366,58 @@ emac_rxeof(struct emac_softc *sc, int count)
if_printf(ifp, "length error\n");
}
#endif
- if (good_packet) {
- m = m_getcl(M_NOWAIT, MT_DATA, M_PKTHDR);
- if (m == NULL)
- return;
- m->m_len = m->m_pkthdr.len = MCLBYTES;
-
- len -= ETHER_CRC_LEN;
-
- /* Copy entire frame to mbuf first. */
- bus_space_read_multi_4(sc->emac_tag, sc->emac_handle,
- EMAC_RX_IO_DATA, mtod(m, uint32_t *),
- roundup2(len, 4) / 4);
-
- m->m_pkthdr.rcvif = ifp;
- m->m_len = m->m_pkthdr.len = len;
-
- /*
- * Emac controller needs strict aligment, so to avoid
- * copying over an entire frame to align, we allocate
- * a new mbuf and copy ethernet header + IP header to
- * the new mbuf. The new mbuf is prepended into the
- * existing mbuf chain.
- */
- if (m->m_len <= (MHLEN - ETHER_HDR_LEN)) {
- bcopy(m->m_data, m->m_data + ETHER_HDR_LEN,
- m->m_len);
- m->m_data += ETHER_HDR_LEN;
- } else if (m->m_len <= (MCLBYTES - ETHER_HDR_LEN) &&
- m->m_len > (MHLEN - ETHER_HDR_LEN)) {
- MGETHDR(m0, M_NOWAIT, MT_DATA);
- if (m0 != NULL) {
- len = ETHER_HDR_LEN +
- m->m_pkthdr.l2hlen;
- bcopy(m->m_data, m0->m_data, len);
- m->m_data += len;
- m->m_len -= len;
- m0->m_len = len;
- M_MOVE_PKTHDR(m0, m);
- m0->m_next = m;
- m = m0;
- } else {
- if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
- m_freem(m);
- m = NULL;
- continue;
- }
- } else if (m->m_len > EMAC_MAC_MAXF) {
+ m = m_getcl(M_NOWAIT, MT_DATA, M_PKTHDR);
+ if (m == NULL) {
+ emac_drain_rxfifo(sc);
+ return;
+ }
+ m->m_len = m->m_pkthdr.len = MCLBYTES;
+
+ /* Copy entire frame to mbuf first. */
+ bus_space_read_multi_4(sc->emac_tag, sc->emac_handle,
+ EMAC_RX_IO_DATA, mtod(m, uint32_t *), roundup2(len, 4) / 4);
+
+ m->m_pkthdr.rcvif = ifp;
+ m->m_len = m->m_pkthdr.len = len - ETHER_CRC_LEN;
+
+ /*
+ * Emac controller needs strict aligment, so to avoid
+ * copying over an entire frame to align, we allocate
+ * a new mbuf and copy ethernet header + IP header to
+ * the new mbuf. The new mbuf is prepended into the
+ * existing mbuf chain.
+ */
+ if (m->m_len <= (MHLEN - ETHER_HDR_LEN)) {
+ bcopy(m->m_data, m->m_data + ETHER_HDR_LEN, m->m_len);
+ m->m_data += ETHER_HDR_LEN;
+ } else if (m->m_len <= (MCLBYTES - ETHER_HDR_LEN) &&
+ m->m_len > (MHLEN - ETHER_HDR_LEN)) {
+ MGETHDR(m0, M_NOWAIT, MT_DATA);
+ if (m0 != NULL) {
+ len = ETHER_HDR_LEN + m->m_pkthdr.l2hlen;
+ bcopy(m->m_data, m0->m_data, len);
+ m->m_data += len;
+ m->m_len -= len;
+ m0->m_len = len;
+ M_MOVE_PKTHDR(m0, m);
+ m0->m_next = m;
+ m = m0;
+ } else {
if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
m_freem(m);
m = NULL;
continue;
}
- if_inc_counter(ifp, IFCOUNTER_IPACKETS, 1);
- EMAC_UNLOCK(sc);
- (*ifp->if_input)(ifp, m);
- EMAC_LOCK(sc);
+ } else if (m->m_len > EMAC_MAC_MAXF) {
+ if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
+ m_freem(m);
+ m = NULL;
+ continue;
}
+ if_inc_counter(ifp, IFCOUNTER_IPACKETS, 1);
+ EMAC_UNLOCK(sc);
+ (*ifp->if_input)(ifp, m);
+ EMAC_LOCK(sc);
}
}
@@ -582,11 +591,13 @@ emac_start_locked(struct ifnet *ifp)
{
struct emac_softc *sc;
struct mbuf *m, *m0;
- uint32_t reg_val;
+ uint32_t fifo, reg;
sc = ifp->if_softc;
if (ifp->if_drv_flags & IFF_DRV_OACTIVE)
return;
+ if (sc->emac_fifo_mask == (EMAC_TX_FIFO0 | EMAC_TX_FIFO1))
+ return;
if (sc->emac_link == 0)
return;
IFQ_DRV_DEQUEUE(&ifp->if_snd, m);
@@ -594,7 +605,14 @@ emac_start_locked(struct ifnet *ifp)
return;
/* Select channel */
- EMAC_WRITE_REG(sc, EMAC_TX_INS, 0);
+ if (sc->emac_fifo_mask & EMAC_TX_FIFO0)
+ fifo = 1;
+ else
+ fifo = 0;
+ sc->emac_fifo_mask |= (1 << fifo);
+ if (sc->emac_fifo_mask == (EMAC_TX_FIFO0 | EMAC_TX_FIFO1))
+ ifp->if_drv_flags |= IFF_DRV_OACTIVE;
+ EMAC_WRITE_REG(sc, EMAC_TX_INS, fifo);
/*
* Emac controller wants 4 byte aligned TX buffers.
@@ -615,17 +633,17 @@ emac_start_locked(struct ifnet *ifp)
roundup2(m->m_len, 4) / 4);
/* Send the data lengh. */
- EMAC_WRITE_REG(sc, EMAC_TX_PL0, m->m_len);
+ reg = (fifo == 0) ? EMAC_TX_PL0 : EMAC_TX_PL1;
+ EMAC_WRITE_REG(sc, reg, m->m_len);
/* Start translate from fifo to phy. */
- reg_val = EMAC_READ_REG(sc, EMAC_TX_CTL0);
- reg_val |= 1;
- EMAC_WRITE_REG(sc, EMAC_TX_CTL0, reg_val);
+ reg = (fifo == 0) ? EMAC_TX_CTL0 : EMAC_TX_CTL1;
+ EMAC_WRITE_REG(sc, reg, EMAC_READ_REG(sc, reg) | 1);
/* Set timeout */
sc->emac_watchdog_timer = 5;
- ifp->if_drv_flags |= IFF_DRV_OACTIVE;
+ /* Data have been sent to hardware, it is okay to free the mbuf now. */
BPF_MTAP(ifp, m);
m_freem(m);
}
@@ -664,9 +682,6 @@ emac_intr(void *arg)
sc = (struct emac_softc *)arg;
EMAC_LOCK(sc);
- ifp = sc->emac_ifp;
- if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
- return;
/* Disable all interrupts */
EMAC_WRITE_REG(sc, EMAC_INT_CTL, 0);
@@ -680,18 +695,17 @@ emac_intr(void *arg)
emac_rxeof(sc, sc->emac_rx_process_limit);
/* Transmit Interrupt check */
- if (reg_val & EMAC_INT_STA_TX){
- emac_txeof(sc);
+ if (reg_val & EMAC_INT_STA_TX) {
+ emac_txeof(sc, reg_val);
+ ifp = sc->emac_ifp;
if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
emac_start_locked(ifp);
}
- if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) {
- /* Re-enable interrupt mask */
- reg_val = EMAC_READ_REG(sc, EMAC_INT_CTL);
- reg_val |= EMAC_INT_EN;
- EMAC_WRITE_REG(sc, EMAC_INT_CTL, reg_val);
- }
+ /* Re-enable interrupt mask */
+ reg_val = EMAC_READ_REG(sc, EMAC_INT_CTL);
+ reg_val |= EMAC_INT_EN;
+ EMAC_WRITE_REG(sc, EMAC_INT_CTL, reg_val);
EMAC_UNLOCK(sc);
}
diff --git a/sys/arm/allwinner/if_emacreg.h b/sys/arm/allwinner/if_emacreg.h
index ee79c30..4776302 100644
--- a/sys/arm/allwinner/if_emacreg.h
+++ b/sys/arm/allwinner/if_emacreg.h
@@ -51,6 +51,8 @@
#define EMAC_TX_TSVH0 0x30
#define EMAC_TX_TSVL1 0x34
#define EMAC_TX_TSVH1 0x38
+#define EMAC_TX_FIFO0 (1 << 0)
+#define EMAC_TX_FIFO1 (1 << 1)
#define EMAC_RX_CTL 0x3C
#define EMAC_RX_HASH0 0x40
@@ -61,7 +63,7 @@
#define EMAC_INT_CTL 0x54
#define EMAC_INT_STA 0x58
-#define EMAC_INT_STA_TX (0x01 | 0x02)
+#define EMAC_INT_STA_TX (EMAC_TX_FIFO0 | EMAC_TX_FIFO1)
#define EMAC_INT_STA_RX 0x100
#define EMAC_INT_EN (0xf << 0) | (1 << 8)
@@ -223,6 +225,7 @@
/* Receive status */
#define EMAC_CRCERR (1 << 4)
#define EMAC_LENERR (3 << 5)
+#define EMAC_PKT_OK (1 << 7)
#define EMAC_RX_FLUSH_FIFO (1 << 3)
#define EMAC_PHY_RESET (1 << 15)
diff --git a/sys/arm/allwinner/std.a10 b/sys/arm/allwinner/std.a10
index fa24d5c..da5d895 100644
--- a/sys/arm/allwinner/std.a10
+++ b/sys/arm/allwinner/std.a10
@@ -17,4 +17,7 @@ options KERNPHYSADDR=0x40200000
makeoptions KERNVIRTADDR=0xc0200000
options KERNVIRTADDR=0xc0200000
+options ARM_L2_PIPT
+
+files "../allwinner/files.allwinner"
files "../allwinner/files.a10"
diff --git a/sys/arm/allwinner/timer.c b/sys/arm/allwinner/timer.c
index a04fafa..7c2a340 100644
--- a/sys/arm/allwinner/timer.c
+++ b/sys/arm/allwinner/timer.c
@@ -47,7 +47,6 @@ __FBSDID("$FreeBSD$");
#include <dev/ofw/ofw_bus_subr.h>
#include <machine/bus.h>
-#include <machine/fdt.h>
#include <sys/kdb.h>
diff --git a/sys/arm/altera/socfpga/socfpga_gpio.c b/sys/arm/altera/socfpga/socfpga_gpio.c
index 7cec0c1..0e71d18 100644
--- a/sys/arm/altera/socfpga/socfpga_gpio.c
+++ b/sys/arm/altera/socfpga/socfpga_gpio.c
@@ -61,7 +61,6 @@ __FBSDID("$FreeBSD$");
#include <dev/ofw/ofw_bus_subr.h>
#include <machine/bus.h>
-#include <machine/fdt.h>
#include <machine/cpu.h>
#include <machine/intr.h>
diff --git a/sys/arm/altera/socfpga/socfpga_manager.c b/sys/arm/altera/socfpga/socfpga_manager.c
index 47fd23f..3b63f79 100644
--- a/sys/arm/altera/socfpga/socfpga_manager.c
+++ b/sys/arm/altera/socfpga/socfpga_manager.c
@@ -54,7 +54,6 @@ __FBSDID("$FreeBSD$");
#include <dev/ofw/ofw_bus_subr.h>
#include <machine/bus.h>
-#include <machine/fdt.h>
#include <machine/cpu.h>
#include <machine/intr.h>
diff --git a/sys/arm/altera/socfpga/socfpga_mp.c b/sys/arm/altera/socfpga/socfpga_mp.c
index 0942ea7..24784e9 100644
--- a/sys/arm/altera/socfpga/socfpga_mp.c
+++ b/sys/arm/altera/socfpga/socfpga_mp.c
@@ -38,6 +38,9 @@ __FBSDID("$FreeBSD$");
#include <sys/mutex.h>
#include <sys/smp.h>
+#include <vm/vm.h>
+#include <vm/pmap.h>
+
#include <machine/smp.h>
#include <machine/fdt.h>
#include <machine/intr.h>
diff --git a/sys/arm/amlogic/aml8726/aml8726_clkmsr.c b/sys/arm/amlogic/aml8726/aml8726_clkmsr.c
index 51c9d85..da75618 100644
--- a/sys/arm/amlogic/aml8726/aml8726_clkmsr.c
+++ b/sys/arm/amlogic/aml8726/aml8726_clkmsr.c
@@ -56,6 +56,7 @@ __FBSDID("$FreeBSD$");
#include <dev/ofw/ofw_bus.h>
#include <dev/ofw/ofw_bus_subr.h>
+#include <arm/amlogic/aml8726/aml8726_soc.h>
#include <arm/amlogic/aml8726/aml8726_clkmsr.h>
@@ -147,6 +148,30 @@ aml8726_clkmsr_clock_frequency(struct aml8726_clkmsr_softc *sc, unsigned clock)
return value;
}
+static void
+aml8726_clkmsr_fixup_clk81(struct aml8726_clkmsr_softc *sc, int freq)
+{
+ pcell_t prop;
+ ssize_t len;
+ phandle_t clk_node;
+ phandle_t node;
+
+ node = ofw_bus_get_node(sc->dev);
+
+ len = OF_getencprop(node, "clocks", &prop, sizeof(prop));
+ if ((len / sizeof(prop)) != 1 || prop == 0 ||
+ (clk_node = OF_node_from_xref(prop)) == 0)
+ return;
+
+ len = OF_getencprop(clk_node, "clock-frequency", &prop, sizeof(prop));
+ if ((len / sizeof(prop)) != 1 || prop != 0)
+ return;
+
+ freq = cpu_to_fdt32(freq);
+
+ OF_setprop(clk_node, "clock-frequency", (void *)&freq, sizeof(freq));
+}
+
static int
aml8726_clkmsr_probe(device_t dev)
{
@@ -178,6 +203,8 @@ aml8726_clkmsr_attach(device_t dev)
freq = aml8726_clkmsr_clock_frequency(sc, AML_CLKMSR_CLK81);
device_printf(sc->dev, "bus clock %u MHz\n", freq);
+ aml8726_clkmsr_fixup_clk81(sc, freq * 1000000);
+
return (0);
}
@@ -209,8 +236,8 @@ static driver_t aml8726_clkmsr_driver = {
static devclass_t aml8726_clkmsr_devclass;
-DRIVER_MODULE(clkmsr, simplebus, aml8726_clkmsr_driver,
- aml8726_clkmsr_devclass, 0, 0);
+EARLY_DRIVER_MODULE(clkmsr, simplebus, aml8726_clkmsr_driver,
+ aml8726_clkmsr_devclass, 0, 0, BUS_PASS_CPU + BUS_PASS_ORDER_EARLY);
int
aml8726_clkmsr_bus_frequency()
@@ -222,6 +249,9 @@ aml8726_clkmsr_bus_frequency()
u_long start, size;
int freq;
+ KASSERT(aml8726_soc_hw_rev != AML_SOC_HW_REV_UNKNOWN,
+ ("aml8726_soc_hw_rev isn't initialized"));
+
/*
* Try to access the clkmsr node directly i.e. through /aliases/.
*/
diff --git a/sys/arm/amlogic/aml8726/aml8726_fb.c b/sys/arm/amlogic/aml8726/aml8726_fb.c
index f0c9395..94d3906 100644
--- a/sys/arm/amlogic/aml8726/aml8726_fb.c
+++ b/sys/arm/amlogic/aml8726/aml8726_fb.c
@@ -49,6 +49,9 @@ __FBSDID("$FreeBSD$");
#include <sys/fbio.h>
+#include <vm/vm.h>
+#include <vm/pmap.h>
+
#include <machine/bus.h>
#include <machine/cpu.h>
#include <machine/fdt.h>
diff --git a/sys/arm/amlogic/aml8726/aml8726_i2c.c b/sys/arm/amlogic/aml8726/aml8726_i2c.c
index 5e81204..c47bb6e 100644
--- a/sys/arm/amlogic/aml8726/aml8726_i2c.c
+++ b/sys/arm/amlogic/aml8726/aml8726_i2c.c
@@ -93,7 +93,7 @@ aml8726_iic_probe(device_t dev)
if (!ofw_bus_status_okay(dev))
return (ENXIO);
- if (!ofw_bus_is_compatible(dev, "amlogic,aml8726-i2c"))
+ if (!ofw_bus_is_compatible(dev, "amlogic,meson6-i2c"))
return (ENXIO);
device_set_desc(dev, "Amlogic aml8726 I2C");
diff --git a/sys/arm/amlogic/aml8726/aml8726_identsoc.c b/sys/arm/amlogic/aml8726/aml8726_identsoc.c
index 2349367..b10ad16 100644
--- a/sys/arm/amlogic/aml8726/aml8726_identsoc.c
+++ b/sys/arm/amlogic/aml8726/aml8726_identsoc.c
@@ -59,8 +59,8 @@ __FBSDID("$FreeBSD$");
#include <arm/amlogic/aml8726/aml8726_soc.h>
-uint32_t aml8726_soc_hw_rev = 0xffffffff;
-uint32_t aml8726_soc_metal_rev = 0xffffffff;
+uint32_t aml8726_soc_hw_rev = AML_SOC_HW_REV_UNKNOWN;
+uint32_t aml8726_soc_metal_rev = AML_SOC_METAL_REV_UNKNOWN;
static const struct {
uint32_t hw_rev;
@@ -86,11 +86,10 @@ static const struct {
{ 0xff, NULL }
};
-static void
-aml8726_identify_soc(void *dummy)
+void
+aml8726_identify_soc()
{
int err;
- int i;
struct resource res;
memset(&res, 0, sizeof(res));
@@ -108,6 +107,12 @@ aml8726_identify_soc(void *dummy)
aml8726_soc_metal_rev = bus_read_4(&res, AML_SOC_METAL_REV_REG);
bus_space_unmap(res.r_bustag, res.r_bushandle, 0x100000);
+}
+
+static void
+aml8726_identify_announce_soc(void *dummy)
+{
+ int i;
for (i = 0; aml8726_soc_desc[i].desc; i++)
if (aml8726_soc_desc[i].hw_rev == aml8726_soc_hw_rev)
@@ -133,5 +138,5 @@ aml8726_identify_soc(void *dummy)
printf("\n");
}
-SYSINIT(aml8726_identify_soc, SI_SUB_CPU, SI_ORDER_SECOND,
- aml8726_identify_soc, NULL);
+SYSINIT(aml8726_identify_announce_soc, SI_SUB_CPU, SI_ORDER_SECOND,
+ aml8726_identify_announce_soc, NULL);
diff --git a/sys/arm/amlogic/aml8726/aml8726_machdep.c b/sys/arm/amlogic/aml8726/aml8726_machdep.c
index 0cfb31a..4476c90 100644
--- a/sys/arm/amlogic/aml8726/aml8726_machdep.c
+++ b/sys/arm/amlogic/aml8726/aml8726_machdep.c
@@ -44,6 +44,7 @@ __FBSDID("$FreeBSD$");
#include <dev/fdt/fdt_common.h>
+#include <arm/amlogic/aml8726/aml8726_soc.h>
#include <arm/amlogic/aml8726/aml8726_clkmsr.h>
#if defined(SOCDEV_PA) && defined(SOCDEV_VA)
@@ -55,12 +56,12 @@ vm_offset_t aml8726_aobus_kva_base;
static void
aml8726_fixup_busfreq()
{
- phandle_t node, child;
+ phandle_t node;
pcell_t freq, prop;
ssize_t len;
/*
- * Set the bus-frequency for any top level SoC simple-bus which
+ * Set the bus-frequency for the SoC simple-bus if it
* needs updating (meaning the current frequency is zero).
*/
@@ -74,16 +75,6 @@ aml8726_fixup_busfreq()
len = OF_getencprop(node, "bus-frequency", &prop, sizeof(prop));
if ((len / sizeof(prop)) == 1 && prop == 0)
OF_setprop(node, "bus-frequency", (void *)&freq, sizeof(freq));
-
- for (child = OF_child(node); child != 0; child = OF_peer(child)) {
- if (fdt_is_compatible_strict(child, "simple-bus")) {
- len = OF_getencprop(child, "bus-frequency",
- &prop, sizeof(prop));
- if ((len / sizeof(prop)) == 1 && prop == 0)
- OF_setprop(child, "bus-frequency",
- (void *)&freq, sizeof(freq));
- }
- }
}
vm_offset_t
@@ -116,6 +107,13 @@ platform_gpio_init(void)
(vm_offset_t)arm_devmap_ptov(0xc8100000, 0x100000);
/*
+ * The hardware mux used by clkmsr is unique to the SoC (though
+ * currently clk81 is at a fixed location, however that might
+ * change in the future).
+ */
+ aml8726_identify_soc();
+
+ /*
* This FDT fixup should arguably be called through fdt_fixup_table,
* however currently there's no mechanism to specify a fixup which
* should always be invoked.
@@ -179,13 +177,13 @@ fdt_pic_decode_ic(phandle_t node, pcell_t *intr, int *interrupt, int *trig,
* multi core chips also have a GIC.
*/
#ifdef SMP
- if (!fdt_is_compatible_strict(node, "arm,gic"))
+ if (!fdt_is_compatible_strict(node, "arm,cortex-a9-gic"))
#else
if (!fdt_is_compatible_strict(node, "amlogic,aml8726-pic"))
#endif
return (ENXIO);
- *interrupt = fdt32_to_cpu(intr[0]);
+ *interrupt = fdt32_to_cpu(intr[1]);
*trig = INTR_TRIGGER_EDGE;
*pol = INTR_POLARITY_HIGH;
diff --git a/sys/arm/amlogic/aml8726/aml8726_mmc.c b/sys/arm/amlogic/aml8726/aml8726_mmc.c
index b1d4935..7d1ef4e 100644
--- a/sys/arm/amlogic/aml8726/aml8726_mmc.c
+++ b/sys/arm/amlogic/aml8726/aml8726_mmc.c
@@ -70,6 +70,7 @@ struct aml8726_mmc_softc {
device_t dev;
struct resource *res[2];
struct mtx mtx;
+ struct callout ch;
uint32_t port;
unsigned int ref_freq;
struct aml8726_mmc_gpio pwr_en;
@@ -81,7 +82,7 @@ struct aml8726_mmc_softc {
struct mmc_host host;
int bus_busy;
struct mmc_command *cmd;
- unsigned int timeout_remaining;
+ uint32_t stop_timeout;
};
static struct resource_spec aml8726_mmc_spec[] = {
@@ -92,6 +93,7 @@ static struct resource_spec aml8726_mmc_spec[] = {
#define AML_MMC_LOCK(sc) mtx_lock(&(sc)->mtx)
#define AML_MMC_UNLOCK(sc) mtx_unlock(&(sc)->mtx)
+#define AML_MMC_LOCK_ASSERT(sc) mtx_assert(&(sc)->mtx, MA_OWNED)
#define AML_MMC_LOCK_INIT(sc) \
mtx_init(&(sc)->mtx, device_get_nameunit((sc)->dev), \
"mmc", MTX_DEF)
@@ -107,6 +109,60 @@ static struct resource_spec aml8726_mmc_spec[] = {
#define PWR_OFF_FLAG(pol) ((pol) == 0 ? GPIO_PIN_HIGH : \
GPIO_PIN_LOW)
+#define MSECS_TO_TICKS(ms) (((ms)*hz)/1000 + 1)
+
+static void aml8726_mmc_timeout(void *arg);
+
+static unsigned int
+aml8726_mmc_clk(phandle_t node)
+{
+ pcell_t prop;
+ ssize_t len;
+ phandle_t clk_node;
+
+ len = OF_getencprop(node, "clocks", &prop, sizeof(prop));
+ if ((len / sizeof(prop)) != 1 || prop == 0 ||
+ (clk_node = OF_node_from_xref(prop)) == 0)
+ return (0);
+
+ len = OF_getencprop(clk_node, "clock-frequency", &prop, sizeof(prop));
+ if ((len / sizeof(prop)) != 1 || prop == 0)
+ return (0);
+
+ return ((unsigned int)prop);
+}
+
+static uint32_t
+aml8726_mmc_freq(struct aml8726_mmc_softc *sc, uint32_t divisor)
+{
+
+ return (sc->ref_freq / ((divisor + 1) * 2));
+}
+
+static uint32_t
+aml8726_mmc_div(struct aml8726_mmc_softc *sc, uint32_t desired_freq)
+{
+ uint32_t divisor;
+
+ divisor = sc->ref_freq / (desired_freq * 2);
+
+ if (divisor == 0)
+ divisor = 1;
+
+ divisor -= 1;
+
+ if (aml8726_mmc_freq(sc, divisor) > desired_freq)
+ divisor += 1;
+
+ if (divisor > (AML_MMC_CONFIG_CMD_CLK_DIV_MASK >>
+ AML_MMC_CONFIG_CMD_CLK_DIV_SHIFT)) {
+ divisor = AML_MMC_CONFIG_CMD_CLK_DIV_MASK >>
+ AML_MMC_CONFIG_CMD_CLK_DIV_SHIFT;
+ }
+
+ return (divisor);
+}
+
static void
aml8726_mmc_mapmem(void *arg, bus_dma_segment_t *segs, int nseg, int error)
{
@@ -143,25 +199,18 @@ aml8726_mmc_power_on(struct aml8726_mmc_softc *sc)
PWR_ON_FLAG(sc->pwr_en.pol)));
}
-static int
-aml8726_mmc_restart_timer(struct aml8726_mmc_softc *sc)
+static void
+aml8726_mmc_soft_reset(struct aml8726_mmc_softc *sc, boolean_t enable_irq)
{
- uint32_t count;
- uint32_t isr;
-
- if (sc->cmd == NULL || sc->timeout_remaining == 0)
- return (0);
-
- count = (sc->timeout_remaining > 0x1fff) ? 0x1fff :
- sc->timeout_remaining;
- sc->timeout_remaining -= count;
+ uint32_t icr;
- isr = (count << AML_MMC_IRQ_STATUS_TIMER_CNT_SHIFT) |
- AML_MMC_IRQ_STATUS_TIMER_EN | AML_MMC_IRQ_STATUS_TIMEOUT_IRQ;
+ icr = AML_MMC_IRQ_CONFIG_SOFT_RESET;
- CSR_WRITE_4(sc, AML_MMC_IRQ_STATUS_REG, isr);
+ if (enable_irq == true)
+ icr |= AML_MMC_IRQ_CONFIG_CMD_DONE_EN;
- return (1);
+ CSR_WRITE_4(sc, AML_MMC_IRQ_CONFIG_REG, icr);
+ CSR_BARRIER(sc, AML_MMC_IRQ_CONFIG_REG);
}
static int
@@ -172,7 +221,6 @@ aml8726_mmc_start_command(struct aml8726_mmc_softc *sc, struct mmc_command *cmd)
uint32_t block_size;
uint32_t bus_width;
uint32_t cmdr;
- uint32_t cycles_per_msec;
uint32_t extr;
uint32_t mcfgr;
uint32_t nbits_per_pkg;
@@ -184,14 +232,9 @@ aml8726_mmc_start_command(struct aml8726_mmc_softc *sc, struct mmc_command *cmd)
return (MMC_ERR_INVALID);
/*
- * Ensure the hardware state machine is in a known state,
- * the command done interrupt is enabled, and previous
- * IRQ status bits have been cleared.
+ * Ensure the hardware state machine is in a known state.
*/
- CSR_WRITE_4(sc, AML_MMC_IRQ_CONFIG_REG,
- (AML_MMC_IRQ_CONFIG_SOFT_RESET | AML_MMC_IRQ_CONFIG_CMD_DONE_EN));
- CSR_BARRIER(sc, AML_MMC_IRQ_CONFIG_REG);
- CSR_WRITE_4(sc, AML_MMC_IRQ_STATUS_REG, AML_MMC_IRQ_STATUS_CLEAR_IRQ);
+ aml8726_mmc_soft_reset(sc, true);
/*
* Start and transmission bits are per section 4.7.2 of the:
@@ -206,6 +249,13 @@ aml8726_mmc_start_command(struct aml8726_mmc_softc *sc, struct mmc_command *cmd)
mcfgr = sc->port;
timeout = AML_MMC_CMD_TIMEOUT;
+ /*
+ * If this is a linked command, then use the previous timeout.
+ */
+ if (cmd == cmd->mrq->stop && sc->stop_timeout)
+ timeout = sc->stop_timeout;
+ sc->stop_timeout = 0;
+
if ((cmd->flags & MMC_RSP_136) != 0) {
cmdr |= AML_MMC_CMD_RESP_CRC7_FROM_8;
cmdr |= (133 << AML_MMC_CMD_RESP_BITS_SHIFT);
@@ -272,32 +322,24 @@ aml8726_mmc_start_command(struct aml8726_mmc_softc *sc, struct mmc_command *cmd)
timeout = AML_MMC_WRITE_TIMEOUT *
(data->len / block_size);
}
+
+ /*
+ * Stop terminates a multiblock read / write and thus
+ * can take as long to execute as an actual read / write.
+ */
+ if (cmd->mrq->stop != NULL)
+ sc->stop_timeout = timeout;
}
sc->cmd = cmd;
cmd->error = MMC_ERR_NONE;
- /*
- * Round up while calculating the number of cycles which
- * correspond to a millisecond. Use that to determine
- * the count from the desired timeout in milliseconds.
- *
- * The counter has a limited range which is not sufficient
- * for directly implementing worst case timeouts at high clock
- * rates so a 32 bit counter is implemented in software.
- *
- * The documentation isn't clear on when the timer starts
- * so add 48 cycles for the command and 136 cycles for the
- * response (the values are from the previously mentioned
- * standard).
- */
if (timeout > AML_MMC_MAX_TIMEOUT)
timeout = AML_MMC_MAX_TIMEOUT;
- cycles_per_msec = (ios->clock + 1000 - 1) / 1000;
- sc->timeout_remaining = 48 + 136 + timeout * cycles_per_msec;
- aml8726_mmc_restart_timer(sc);
+ callout_reset(&sc->ch, MSECS_TO_TICKS(timeout),
+ aml8726_mmc_timeout, sc);
CSR_WRITE_4(sc, AML_MMC_CMD_ARGUMENT_REG, cmd->arg);
CSR_WRITE_4(sc, AML_MMC_MULT_CONFIG_REG, mcfgr);
@@ -311,20 +353,96 @@ aml8726_mmc_start_command(struct aml8726_mmc_softc *sc, struct mmc_command *cmd)
}
static void
-aml8726_mmc_intr(void *arg)
+aml8726_mmc_finish_command(struct aml8726_mmc_softc *sc, int mmc_error)
{
- struct aml8726_mmc_softc *sc = (struct aml8726_mmc_softc *)arg;
+ int mmc_stop_error;
struct mmc_command *cmd;
struct mmc_command *stop_cmd;
struct mmc_data *data;
+
+ AML_MMC_LOCK_ASSERT(sc);
+
+ /* Clear all interrupts since the request is no longer in flight. */
+ CSR_WRITE_4(sc, AML_MMC_IRQ_STATUS_REG, AML_MMC_IRQ_STATUS_CLEAR_IRQ);
+ CSR_BARRIER(sc, AML_MMC_IRQ_STATUS_REG);
+
+ /* In some cases (e.g. finish called via timeout) this is a NOP. */
+ callout_stop(&sc->ch);
+
+ cmd = sc->cmd;
+ sc->cmd = NULL;
+
+ cmd->error = mmc_error;
+
+ data = cmd->data;
+
+ if (data && data->len &&
+ (data->flags & (MMC_DATA_READ | MMC_DATA_WRITE)) != 0) {
+ if ((data->flags & MMC_DATA_READ) != 0)
+ bus_dmamap_sync(sc->dmatag, sc->dmamap,
+ BUS_DMASYNC_POSTREAD);
+ else
+ bus_dmamap_sync(sc->dmatag, sc->dmamap,
+ BUS_DMASYNC_POSTWRITE);
+ bus_dmamap_unload(sc->dmatag, sc->dmamap);
+ }
+
+ /*
+ * If there's a linked stop command, then start the stop command.
+ * In order to establish a known state attempt the stop command
+ * even if the original request encountered an error.
+ */
+
+ stop_cmd = (cmd->mrq->stop != cmd) ? cmd->mrq->stop : NULL;
+
+ if (stop_cmd != NULL) {
+ mmc_stop_error = aml8726_mmc_start_command(sc, stop_cmd);
+ if (mmc_stop_error == MMC_ERR_NONE) {
+ AML_MMC_UNLOCK(sc);
+ return;
+ }
+ stop_cmd->error = mmc_stop_error;
+ }
+
+ AML_MMC_UNLOCK(sc);
+
+ /* Execute the callback after dropping the lock. */
+ if (cmd->mrq)
+ cmd->mrq->done(cmd->mrq);
+}
+
+static void
+aml8726_mmc_timeout(void *arg)
+{
+ struct aml8726_mmc_softc *sc = (struct aml8726_mmc_softc *)arg;
+
+ /*
+ * The command failed to complete in time so forcefully
+ * terminate it.
+ */
+ aml8726_mmc_soft_reset(sc, false);
+
+ /*
+ * Ensure the command has terminated before continuing on
+ * to things such as bus_dmamap_sync / bus_dmamap_unload.
+ */
+ while ((CSR_READ_4(sc, AML_MMC_IRQ_STATUS_REG) &
+ AML_MMC_IRQ_STATUS_CMD_BUSY) != 0)
+ cpu_spinwait();
+
+ aml8726_mmc_finish_command(sc, MMC_ERR_TIMEOUT);
+}
+
+static void
+aml8726_mmc_intr(void *arg)
+{
+ struct aml8726_mmc_softc *sc = (struct aml8726_mmc_softc *)arg;
uint32_t cmdr;
- uint32_t icr;
uint32_t isr;
uint32_t mcfgr;
uint32_t previous_byte;
uint32_t resp;
int mmc_error;
- int mmc_stop_error;
unsigned int i;
AML_MMC_LOCK(sc);
@@ -348,12 +466,6 @@ aml8726_mmc_intr(void *arg)
if ((cmdr & AML_MMC_CMD_CMD_HAS_DATA) != 0 &&
(isr & AML_MMC_IRQ_STATUS_WR_CRC16_OK) == 0)
mmc_error = MMC_ERR_BADCRC;
- } else if ((isr & AML_MMC_IRQ_STATUS_TIMEOUT_IRQ) != 0) {
- if (aml8726_mmc_restart_timer(sc) != 0) {
- AML_MMC_UNLOCK(sc);
- return;
- }
- mmc_error = MMC_ERR_TIMEOUT;
} else {
spurious:
@@ -370,49 +482,12 @@ spurious:
return;
}
- if ((isr & AML_MMC_IRQ_STATUS_CMD_BUSY) != 0 &&
- /*
- * A multiblock operation may keep the hardware
- * busy until stop transmission is executed.
- */
- (isr & AML_MMC_IRQ_STATUS_CMD_DONE_IRQ) == 0) {
- if (mmc_error == MMC_ERR_NONE)
- mmc_error = MMC_ERR_FAILED;
-
- /*
- * Issue a soft reset (while leaving the command complete
- * interrupt enabled) to terminate the command.
- *
- * Ensure the command has terminated before continuing on
- * to things such as bus_dmamap_sync / bus_dmamap_unload.
- */
-
- icr = AML_MMC_IRQ_CONFIG_SOFT_RESET |
- AML_MMC_IRQ_CONFIG_CMD_DONE_EN;
-
- CSR_WRITE_4(sc, AML_MMC_IRQ_CONFIG_REG, icr);
-
- while ((CSR_READ_4(sc, AML_MMC_IRQ_STATUS_REG) &
- AML_MMC_IRQ_STATUS_CMD_BUSY) != 0)
- cpu_spinwait();
- }
-
- /* Clear all interrupts since the request is no longer in flight. */
- CSR_WRITE_4(sc, AML_MMC_IRQ_STATUS_REG, AML_MMC_IRQ_STATUS_CLEAR_IRQ);
- CSR_BARRIER(sc, AML_MMC_IRQ_STATUS_REG);
-
- cmd = sc->cmd;
- sc->cmd = NULL;
-
- cmd->error = mmc_error;
-
- if ((cmd->flags & MMC_RSP_PRESENT) != 0 &&
- mmc_error == MMC_ERR_NONE) {
+ if ((cmdr & AML_MMC_CMD_RESP_BITS_MASK) != 0) {
mcfgr = sc->port;
mcfgr |= AML_MMC_MULT_CONFIG_RESP_READOUT_EN;
CSR_WRITE_4(sc, AML_MMC_MULT_CONFIG_REG, mcfgr);
- if ((cmd->flags & MMC_RSP_136) != 0) {
+ if ((cmdr & AML_MMC_CMD_RESP_CRC7_FROM_8) != 0) {
/*
* Controller supplies 135:8 instead of
@@ -425,48 +500,39 @@ spurious:
for (i = 0; i < 4; i++) {
resp = CSR_READ_4(sc, AML_MMC_CMD_ARGUMENT_REG);
- cmd->resp[3 - i] = (resp << 8) | previous_byte;
+ sc->cmd->resp[3 - i] = (resp << 8) |
+ previous_byte;
previous_byte = (resp >> 24) & 0xff;
}
} else
- cmd->resp[0] = CSR_READ_4(sc, AML_MMC_CMD_ARGUMENT_REG);
+ sc->cmd->resp[0] = CSR_READ_4(sc,
+ AML_MMC_CMD_ARGUMENT_REG);
}
- data = cmd->data;
-
- if (data && data->len &&
- (data->flags & (MMC_DATA_READ | MMC_DATA_WRITE)) != 0) {
- if ((data->flags & MMC_DATA_READ) != 0)
- bus_dmamap_sync(sc->dmatag, sc->dmamap,
- BUS_DMASYNC_POSTREAD);
- else
- bus_dmamap_sync(sc->dmatag, sc->dmamap,
- BUS_DMASYNC_POSTWRITE);
- bus_dmamap_unload(sc->dmatag, sc->dmamap);
- }
+ if ((isr & AML_MMC_IRQ_STATUS_CMD_BUSY) != 0 &&
+ /*
+ * A multiblock operation may keep the hardware
+ * busy until stop transmission is executed.
+ */
+ (isr & AML_MMC_IRQ_STATUS_CMD_DONE_IRQ) == 0) {
+ if (mmc_error == MMC_ERR_NONE)
+ mmc_error = MMC_ERR_FAILED;
- /*
- * If there's a linked stop command, then start the stop command.
- * In order to establish a known state attempt the stop command
- * even if the original request encountered an error.
- */
+ /*
+ * Issue a soft reset to terminate the command.
+ *
+ * Ensure the command has terminated before continuing on
+ * to things such as bus_dmamap_sync / bus_dmamap_unload.
+ */
- stop_cmd = (cmd->mrq->stop != cmd) ? cmd->mrq->stop : NULL;
+ aml8726_mmc_soft_reset(sc, false);
- if (stop_cmd != NULL) {
- mmc_stop_error = aml8726_mmc_start_command(sc, stop_cmd);
- if (mmc_stop_error == MMC_ERR_NONE) {
- AML_MMC_UNLOCK(sc);
- return;
- }
- stop_cmd->error = mmc_stop_error;
+ while ((CSR_READ_4(sc, AML_MMC_IRQ_STATUS_REG) &
+ AML_MMC_IRQ_STATUS_CMD_BUSY) != 0)
+ cpu_spinwait();
}
- AML_MMC_UNLOCK(sc);
-
- /* Execute the callback after dropping the lock. */
- if (cmd->mrq)
- cmd->mrq->done(cmd->mrq);
+ aml8726_mmc_finish_command(sc, mmc_error);
}
static int
@@ -502,15 +568,13 @@ aml8726_mmc_attach(device_t dev)
node = ofw_bus_get_node(dev);
- len = OF_getencprop(OF_parent(node), "bus-frequency",
- prop, sizeof(prop));
- if ((len / sizeof(prop[0])) != 1 || prop[0] == 0) {
- device_printf(dev, "missing bus-frequency attribute in FDT\n");
+ sc->ref_freq = aml8726_mmc_clk(node);
+
+ if (sc->ref_freq == 0) {
+ device_printf(dev, "missing clocks attribute in FDT\n");
return (ENXIO);
}
- sc->ref_freq = prop[0];
-
/*
* The pins must be specified as part of the device in order
* to know which port to used.
@@ -681,8 +745,10 @@ aml8726_mmc_attach(device_t dev)
goto fail;
}
- sc->host.f_min = 200000;
- sc->host.f_max = 50000000;
+ callout_init_mtx(&sc->ch, &sc->mtx, CALLOUT_RETURNUNLOCKED);
+
+ sc->host.f_min = aml8726_mmc_freq(sc, aml8726_mmc_div(sc, 200000));
+ sc->host.f_max = aml8726_mmc_freq(sc, aml8726_mmc_div(sc, 50000000));
sc->host.host_ocr = sc->voltages[0] | sc->voltages[1];
sc->host.caps = MMC_CAP_4_BIT_DATA | MMC_CAP_HSPEED;
@@ -739,10 +805,12 @@ aml8726_mmc_detach(device_t dev)
* disable the interrupts, and clear the interrupts.
*/
(void)aml8726_mmc_power_off(sc);
- CSR_WRITE_4(sc, AML_MMC_IRQ_CONFIG_REG, AML_MMC_IRQ_CONFIG_SOFT_RESET);
- CSR_BARRIER(sc, AML_MMC_IRQ_CONFIG_REG);
+ aml8726_mmc_soft_reset(sc, false);
CSR_WRITE_4(sc, AML_MMC_IRQ_STATUS_REG, AML_MMC_IRQ_STATUS_CLEAR_IRQ);
+ /* This should be a NOP since no command was in flight. */
+ callout_stop(&sc->ch);
+
AML_MMC_UNLOCK(sc);
bus_generic_detach(dev);
@@ -770,8 +838,7 @@ aml8726_mmc_shutdown(device_t dev)
* disable the interrupts, and clear the interrupts.
*/
(void)aml8726_mmc_power_off(sc);
- CSR_WRITE_4(sc, AML_MMC_IRQ_CONFIG_REG, AML_MMC_IRQ_CONFIG_SOFT_RESET);
- CSR_BARRIER(sc, AML_MMC_IRQ_CONFIG_REG);
+ aml8726_mmc_soft_reset(sc, false);
CSR_WRITE_4(sc, AML_MMC_IRQ_STATUS_REG, AML_MMC_IRQ_STATUS_CLEAR_IRQ);
return (0);
@@ -782,7 +849,6 @@ aml8726_mmc_update_ios(device_t bus, device_t child)
{
struct aml8726_mmc_softc *sc = device_get_softc(bus);
struct mmc_ios *ios = &sc->host.ios;
- unsigned int divisor;
int error;
int i;
uint32_t cfgr;
@@ -803,15 +869,8 @@ aml8726_mmc_update_ios(device_t bus, device_t child)
return (EINVAL);
}
- divisor = sc->ref_freq / (ios->clock * 2) - 1;
- if (divisor == 0 || divisor == -1)
- divisor = 1;
- if ((sc->ref_freq / ((divisor + 1) * 2)) > ios->clock)
- divisor += 1;
- if (divisor > 0x3ff)
- divisor = 0x3ff;
-
- cfgr |= divisor;
+ cfgr |= aml8726_mmc_div(sc, ios->clock) <<
+ AML_MMC_CONFIG_CMD_CLK_DIV_SHIFT;
CSR_WRITE_4(sc, AML_MMC_CONFIG_REG, cfgr);
diff --git a/sys/arm/amlogic/aml8726/aml8726_mmc.h b/sys/arm/amlogic/aml8726/aml8726_mmc.h
index 0370943..64e3bae 100644
--- a/sys/arm/amlogic/aml8726/aml8726_mmc.h
+++ b/sys/arm/amlogic/aml8726/aml8726_mmc.h
@@ -47,20 +47,6 @@
#define AML_MMC_WRITE_TIMEOUT 500
#define AML_MMC_MAX_TIMEOUT 5000
-/*
- * Internally the timeout is implemented by counting clock cycles.
- *
- * Since the hardware implements timeouts by counting cycles
- * the minimum read / write timeout (assuming the minimum
- * conversion factor of 1 cycle per usec) is:
- *
- * (8 bits * 512 bytes per block + 16 bits CRC) = 4112 usec
- */
-#if ((AML_MMC_READ_TIMEOUT * 1000) < 4112 || \
- (AML_MMC_WRITE_TIMEOUT * 1000) < 4112)
-#error "Single block timeout is smaller than supported"
-#endif
-
#define AML_MMC_CMD_ARGUMENT_REG 0
#define AML_MMC_CMD_SEND_REG 4
diff --git a/sys/arm/amlogic/aml8726/aml8726_mp.c b/sys/arm/amlogic/aml8726/aml8726_mp.c
index c4aa43a..4f0bce0 100644
--- a/sys/arm/amlogic/aml8726/aml8726_mp.c
+++ b/sys/arm/amlogic/aml8726/aml8726_mp.c
@@ -50,6 +50,9 @@ __FBSDID("$FreeBSD$");
#include <sys/rman.h>
#include <sys/smp.h>
+#include <vm/vm.h>
+#include <vm/pmap.h>
+
#include <machine/bus.h>
#include <machine/smp.h>
#include <machine/fdt.h>
diff --git a/sys/arm/amlogic/aml8726/aml8726_soc.h b/sys/arm/amlogic/aml8726/aml8726_soc.h
index e45a5df..45e3bc4 100644
--- a/sys/arm/amlogic/aml8726/aml8726_soc.h
+++ b/sys/arm/amlogic/aml8726/aml8726_soc.h
@@ -32,8 +32,11 @@
#define AML_SOC_AOBUS_BASE_ADDR 0xc8100000
#define AML_SOC_CBUS_BASE_ADDR 0xc1100000
+void aml8726_identify_soc(void);
+
/* cbus */
#define AML_SOC_HW_REV_REG 0x7d4c
+#define AML_SOC_HW_REV_UNKNOWN 0xffffffff
#define AML_SOC_HW_REV_M3 0x15
#define AML_SOC_HW_REV_M6 0x16
#define AML_SOC_HW_REV_M6TV 0x17
@@ -42,6 +45,7 @@
#define AML_SOC_HW_REV_M8B 0x1b
#define AML_SOC_METAL_REV_REG 0x81a8
+#define AML_SOC_METAL_REV_UNKNOWN 0xffffffff
#define AML_SOC_M8_METAL_REV_A 0x11111111
#define AML_SOC_M8_METAL_REV_M2_A 0x11111112
#define AML_SOC_M8_METAL_REV_B 0x11111113
diff --git a/sys/arm/amlogic/aml8726/aml8726_timer.c b/sys/arm/amlogic/aml8726/aml8726_timer.c
index 074d51d..6061703 100644
--- a/sys/arm/amlogic/aml8726/aml8726_timer.c
+++ b/sys/arm/amlogic/aml8726/aml8726_timer.c
@@ -226,7 +226,7 @@ aml8726_timer_probe(device_t dev)
if (!ofw_bus_status_okay(dev))
return (ENXIO);
- if (!ofw_bus_is_compatible(dev, "amlogic,aml8726-timer"))
+ if (!ofw_bus_is_compatible(dev, "amlogic,meson6-timer"))
return (ENXIO);
device_set_desc(dev, "Amlogic aml8726 timer");
diff --git a/sys/arm/amlogic/aml8726/aml8726_wdt.c b/sys/arm/amlogic/aml8726/aml8726_wdt.c
index ca9b755..1e89f81 100644
--- a/sys/arm/amlogic/aml8726/aml8726_wdt.c
+++ b/sys/arm/amlogic/aml8726/aml8726_wdt.c
@@ -167,7 +167,7 @@ aml8726_wdt_probe(device_t dev)
if (!ofw_bus_status_okay(dev))
return (ENXIO);
- if (!ofw_bus_is_compatible(dev, "amlogic,aml8726-wdt"))
+ if (!ofw_bus_is_compatible(dev, "amlogic,meson6-wdt"))
return (ENXIO);
device_set_desc(dev, "Amlogic aml8726 WDT");
diff --git a/sys/arm/amlogic/aml8726/files.aml8726 b/sys/arm/amlogic/aml8726/files.aml8726
index b32ebcd..ca058a5 100644
--- a/sys/arm/amlogic/aml8726/files.aml8726
+++ b/sys/arm/amlogic/aml8726/files.aml8726
@@ -4,12 +4,13 @@ kern/kern_clocksource.c standard
arm/arm/bus_space_base.c standard
arm/arm/bus_space_generic.c standard
-arm/arm/bus_space_asm_generic.S standard
+arm/arm/gic.c standard
arm/arm/pl310.c standard
arm/amlogic/aml8726/aml8726_l2cache.c standard
arm/amlogic/aml8726/aml8726_machdep.c standard
+arm/amlogic/aml8726/aml8726_mp.c optional smp
arm/amlogic/aml8726/aml8726_identsoc.c standard
arm/amlogic/aml8726/aml8726_ccm.c standard
arm/amlogic/aml8726/aml8726_clkmsr.c standard
diff --git a/sys/arm/amlogic/aml8726/files.smp b/sys/arm/amlogic/aml8726/files.smp
deleted file mode 100644
index 9b6c6ab..0000000
--- a/sys/arm/amlogic/aml8726/files.smp
+++ /dev/null
@@ -1,4 +0,0 @@
-#$FreeBSD$
-
-arm/arm/gic.c standard
-arm/amlogic/aml8726/aml8726_mp.c standard
diff --git a/sys/arm/amlogic/aml8726/std.aml8726 b/sys/arm/amlogic/aml8726/std.aml8726
index 073f02c..61b515f 100644
--- a/sys/arm/amlogic/aml8726/std.aml8726
+++ b/sys/arm/amlogic/aml8726/std.aml8726
@@ -4,6 +4,15 @@ cpu CPU_CORTEXA
machine arm armv6
makeoptions CONF_CFLAGS="-march=armv7a"
+# Physical memory starts at 0x80000000. We assume the kernel is loaded
+# at 0x80100000 by u-boot (which doesn't support ubldr since it's missing
+# CONFIG_API). The kernel must be supplied as a binary since u-boot is
+# also missing CONFIG_CMD_ELF.
+#
+#
+options KERNVIRTADDR=0xc0100000 # Used in ldscript.arm
+makeoptions KERNVIRTADDR=0xc0100000
+
device fdt_pinctrl
files "../amlogic/aml8726/files.aml8726"
diff --git a/sys/arm/amlogic/aml8726/std.odroidc1 b/sys/arm/amlogic/aml8726/std.odroidc1
deleted file mode 100644
index 441c135..0000000
--- a/sys/arm/amlogic/aml8726/std.odroidc1
+++ /dev/null
@@ -1,17 +0,0 @@
-# $FreeBSD$
-
-include "../amlogic/aml8726/std.aml8726"
-
-makeoptions FDT_DTS_FILE=odroidc1.dts
-
-options SMP # Enable multiple cores
-files "../amlogic/aml8726/files.smp"
-
-# Physical memory starts at 0x00000000. We assume the kernel is loaded
-# at 0x00100000 by u-boot (which doesn't support ubldr since it's missing
-# CONFIG_API). The kernel must be supplied as a binary since u-boot is
-# also missing CONFIG_CMD_ELF.
-#
-#
-options KERNVIRTADDR=0xc0100000 # Used in ldscript.arm
-makeoptions KERNVIRTADDR=0xc0100000
diff --git a/sys/arm/amlogic/aml8726/std.vsatv102-m6 b/sys/arm/amlogic/aml8726/std.vsatv102-m6
deleted file mode 100644
index e0014a4..0000000
--- a/sys/arm/amlogic/aml8726/std.vsatv102-m6
+++ /dev/null
@@ -1,17 +0,0 @@
-# $FreeBSD$
-
-include "../amlogic/aml8726/std.aml8726"
-
-makeoptions FDT_DTS_FILE=vsatv102-m6.dts
-
-options SMP # Enable multiple cores
-files "../amlogic/aml8726/files.smp"
-
-# Physical memory starts at 0x80000000. We assume the kernel is loaded
-# at 0x80100000 by u-boot (which doesn't support ubldr since it's missing
-# CONFIG_API). The kernel must be supplied as a binary since u-boot is
-# also missing CONFIG_CMD_ELF.
-#
-#
-options KERNVIRTADDR=0xc0100000 # Used in ldscript.arm
-makeoptions KERNVIRTADDR=0xc0100000
diff --git a/sys/arm/amlogic/aml8726/uart_dev_aml8726.c b/sys/arm/amlogic/aml8726/uart_dev_aml8726.c
index 6c1e85e..1dda52f 100644
--- a/sys/arm/amlogic/aml8726/uart_dev_aml8726.c
+++ b/sys/arm/amlogic/aml8726/uart_dev_aml8726.c
@@ -48,6 +48,10 @@ __FBSDID("$FreeBSD$");
#include <machine/bus.h>
#include <machine/cpu.h>
+#include <dev/fdt/fdt_common.h>
+#include <dev/ofw/ofw_bus.h>
+#include <dev/ofw/ofw_bus_subr.h>
+
#include <dev/uart/uart.h>
#include <dev/uart/uart_cpu.h>
#include <dev/uart/uart_cpu_fdt.h>
@@ -262,6 +266,25 @@ struct uart_ops aml8726_uart_ops = {
.getc = aml8726_uart_getc,
};
+static unsigned int
+aml8726_uart_bus_clk(phandle_t node)
+{
+ pcell_t prop;
+ ssize_t len;
+ phandle_t clk_node;
+
+ len = OF_getencprop(node, "clocks", &prop, sizeof(prop));
+ if ((len / sizeof(prop)) != 1 || prop == 0 ||
+ (clk_node = OF_node_from_xref(prop)) == 0)
+ return (0);
+
+ len = OF_getencprop(clk_node, "clock-frequency", &prop, sizeof(prop));
+ if ((len / sizeof(prop)) != 1 || prop == 0)
+ return (0);
+
+ return ((unsigned int)prop);
+}
+
static int
aml8726_uart_bus_probe(struct uart_softc *sc)
{
@@ -330,8 +353,10 @@ aml8726_uart_bus_attach(struct uart_softc *sc)
bas = &sc->sc_bas;
+ bas->rclk = aml8726_uart_bus_clk(ofw_bus_get_node(sc->sc_dev));
+
if (bas->rclk == 0) {
- device_printf(sc->sc_dev, "missing clock attribute in FDT\n");
+ device_printf(sc->sc_dev, "missing clocks attribute in FDT\n");
return (ENXIO);
}
@@ -699,11 +724,12 @@ struct uart_class uart_aml8726_class = {
sizeof(struct uart_softc),
.uc_ops = &aml8726_uart_ops,
.uc_range = 24,
- .uc_rclk = 0
+ .uc_rclk = 0,
+ .uc_rshift = 0
};
static struct ofw_compat_data compat_data[] = {
- { "amlogic,aml8726-uart", (uintptr_t)&uart_aml8726_class },
+ { "amlogic,meson-uart", (uintptr_t)&uart_aml8726_class },
{ NULL, (uintptr_t)NULL }
};
UART_FDT_CLASS_AND_DEVICE(compat_data);
diff --git a/sys/arm/arm/busdma_machdep-v6.c b/sys/arm/arm/busdma_machdep-v6.c
index ed501c5..7236c5a 100644
--- a/sys/arm/arm/busdma_machdep-v6.c
+++ b/sys/arm/arm/busdma_machdep-v6.c
@@ -1685,8 +1685,8 @@ add_bounce_page(bus_dma_tag_t dmat, bus_dmamap_t map, vm_offset_t vaddr,
if (dmat->flags & BUS_DMA_KEEP_PG_OFFSET) {
/* Page offset needs to be preserved. */
- bpage->vaddr |= vaddr & PAGE_MASK;
- bpage->busaddr |= vaddr & PAGE_MASK;
+ bpage->vaddr |= addr & PAGE_MASK;
+ bpage->busaddr |= addr & PAGE_MASK;
}
bpage->datavaddr = vaddr;
bpage->dataaddr = addr;
diff --git a/sys/arm/arm/busdma_machdep.c b/sys/arm/arm/busdma_machdep.c
index 265292d..acd8f81 100644
--- a/sys/arm/arm/busdma_machdep.c
+++ b/sys/arm/arm/busdma_machdep.c
@@ -1441,8 +1441,8 @@ add_bounce_page(bus_dma_tag_t dmat, bus_dmamap_t map, vm_offset_t vaddr,
if (dmat->flags & BUS_DMA_KEEP_PG_OFFSET) {
/* Page offset needs to be preserved. */
- bpage->vaddr |= vaddr & PAGE_MASK;
- bpage->busaddr |= vaddr & PAGE_MASK;
+ bpage->vaddr |= addr & PAGE_MASK;
+ bpage->busaddr |= addr & PAGE_MASK;
}
bpage->datavaddr = vaddr;
bpage->dataaddr = addr;
diff --git a/sys/arm/arm/cpufunc.c b/sys/arm/arm/cpufunc.c
index f98e91a..a3c8239 100644
--- a/sys/arm/arm/cpufunc.c
+++ b/sys/arm/arm/cpufunc.c
@@ -1186,7 +1186,8 @@ arm11x6_setup(void)
CPU_CONTROL_32BD_ENABLE |
CPU_CONTROL_LABT_ENABLE |
CPU_CONTROL_SYST_ENABLE |
- CPU_CONTROL_IC_ENABLE;
+ CPU_CONTROL_IC_ENABLE |
+ CPU_CONTROL_UNAL_ENABLE;
/*
* "write as existing" bits
diff --git a/sys/arm/arm/devmap.c b/sys/arm/arm/devmap.c
index 1c60a15..823210f 100644
--- a/sys/arm/arm/devmap.c
+++ b/sys/arm/arm/devmap.c
@@ -29,6 +29,8 @@ __FBSDID("$FreeBSD$");
/*
* Routines for mapping device memory.
+ *
+ * This is used on both arm and arm64.
*/
#include "opt_ddb.h"
@@ -40,10 +42,18 @@ __FBSDID("$FreeBSD$");
#include <vm/pmap.h>
#include <machine/armreg.h>
#include <machine/devmap.h>
+#include <machine/vmparam.h>
static const struct arm_devmap_entry *devmap_table;
static boolean_t devmap_bootstrap_done = false;
+#if defined(__aarch64__)
+#define MAX_VADDR VM_MAX_KERNEL_ADDRESS
+#define PTE_DEVICE VM_MEMATTR_DEVICE
+#elif defined(__arm__)
+#define MAX_VADDR ARM_VECTORS_HIGH
+#endif
+
/*
* The allocated-kva (akva) devmap table and metadata. Platforms can call
* arm_devmap_add_entry() to add static device mappings to this table using
@@ -53,7 +63,11 @@ static boolean_t devmap_bootstrap_done = false;
#define AKVA_DEVMAP_MAX_ENTRIES 32
static struct arm_devmap_entry akva_devmap_entries[AKVA_DEVMAP_MAX_ENTRIES];
static u_int akva_devmap_idx;
-static vm_offset_t akva_devmap_vaddr = ARM_VECTORS_HIGH;
+static vm_offset_t akva_devmap_vaddr = MAX_VADDR;
+
+#ifdef __aarch64__
+extern int early_boot;
+#endif
/*
* Print the contents of the static mapping table using the provided printf-like
@@ -99,7 +113,7 @@ arm_devmap_lastaddr()
if (akva_devmap_idx > 0)
return (akva_devmap_vaddr);
- lowaddr = ARM_VECTORS_HIGH;
+ lowaddr = MAX_VADDR;
for (pd = devmap_table; pd != NULL && pd->pd_size != 0; ++pd) {
if (lowaddr > pd->pd_va)
lowaddr = pd->pd_va;
@@ -136,9 +150,12 @@ arm_devmap_add_entry(vm_paddr_t pa, vm_size_t sz)
* align the virtual address to the next-lower 1MB boundary so that we
* end up with a nice efficient section mapping.
*/
+#ifdef __arm__
if ((pa & 0x000fffff) == 0 && (sz & 0x000fffff) == 0) {
akva_devmap_vaddr = trunc_1mpage(akva_devmap_vaddr - sz);
- } else {
+ } else
+#endif
+ {
akva_devmap_vaddr = trunc_page(akva_devmap_vaddr - sz);
}
m = &akva_devmap_entries[akva_devmap_idx++];
@@ -186,8 +203,12 @@ arm_devmap_bootstrap(vm_offset_t l1pt, const struct arm_devmap_entry *table)
return;
for (pd = devmap_table; pd->pd_size != 0; ++pd) {
+#if defined(__arm__)
pmap_map_chunk(l1pt, pd->pd_va, pd->pd_pa, pd->pd_size,
pd->pd_prot,pd->pd_cache);
+#elif defined(__aarch64__)
+ pmap_kenter_device(pd->pd_va, pd->pd_size, pd->pd_pa);
+#endif
}
}
@@ -246,28 +267,31 @@ arm_devmap_vtop(void * vpva, vm_size_t size)
void *
pmap_mapdev(vm_offset_t pa, vm_size_t size)
{
- vm_offset_t va, tmpva, offset;
+ vm_offset_t va, offset;
void * rva;
/* First look in the static mapping table. */
if ((rva = arm_devmap_ptov(pa, size)) != NULL)
return (rva);
-
+
offset = pa & PAGE_MASK;
pa = trunc_page(pa);
size = round_page(size + offset);
-
- va = kva_alloc(size);
+
+#ifdef __aarch64__
+ if (early_boot) {
+ akva_devmap_vaddr = trunc_page(akva_devmap_vaddr - size);
+ va = akva_devmap_vaddr;
+ KASSERT(va >= VM_MAX_KERNEL_ADDRESS - L2_SIZE,
+ ("Too many early devmap mappings"));
+ } else
+#endif
+ va = kva_alloc(size);
if (!va)
panic("pmap_mapdev: Couldn't alloc kernel virtual memory");
- for (tmpva = va; size > 0;) {
- pmap_kenter_device(tmpva, pa);
- size -= PAGE_SIZE;
- tmpva += PAGE_SIZE;
- pa += PAGE_SIZE;
- }
-
+ pmap_kenter_device(va, size, pa);
+
return ((void *)(va + offset));
}
@@ -277,25 +301,18 @@ pmap_mapdev(vm_offset_t pa, vm_size_t size)
void
pmap_unmapdev(vm_offset_t va, vm_size_t size)
{
- vm_offset_t tmpva, offset;
- vm_size_t origsize;
+ vm_offset_t offset;
/* Nothing to do if we find the mapping in the static table. */
if (arm_devmap_vtop((void*)va, size) != DEVMAP_PADDR_NOTFOUND)
return;
- origsize = size;
offset = va & PAGE_MASK;
va = trunc_page(va);
size = round_page(size + offset);
- for (tmpva = va; size > 0;) {
- pmap_kremove(tmpva);
- size -= PAGE_SIZE;
- tmpva += PAGE_SIZE;
- }
-
- kva_free(va, origsize);
+ pmap_kremove_device(va, size);
+ kva_free(va, size);
}
#ifdef DDB
diff --git a/sys/arm/arm/elf_machdep.c b/sys/arm/arm/elf_machdep.c
index 9085d67..598decc 100644
--- a/sys/arm/arm/elf_machdep.c
+++ b/sys/arm/arm/elf_machdep.c
@@ -105,7 +105,6 @@ elf32_arm_abi_supported(struct image_params *imgp)
{
const Elf_Ehdr *hdr = (const Elf_Ehdr *)imgp->image_header;
-#ifdef __ARM_EABI__
/*
* When configured for EABI, FreeBSD supports EABI vesions 4 and 5.
*/
@@ -115,17 +114,6 @@ elf32_arm_abi_supported(struct image_params *imgp)
EF_ARM_EABI_VERSION(hdr->e_flags), imgp->args->fname);
return (FALSE);
}
-#else
- /*
- * When configured for OABI, that's all we do, so reject EABI binaries.
- */
- if (EF_ARM_EABI_VERSION(hdr->e_flags) != EF_ARM_EABI_VERSION_UNKNOWN) {
- if (bootverbose)
- uprintf("Attempting to execute EABI binary (rev %d) image %s",
- EF_ARM_EABI_VERSION(hdr->e_flags), imgp->args->fname);
- return (FALSE);
- }
-#endif
return (TRUE);
}
diff --git a/sys/arm/arm/generic_timer.c b/sys/arm/arm/generic_timer.c
index 8be4b25..d246a87 100644
--- a/sys/arm/arm/generic_timer.c
+++ b/sys/arm/arm/generic_timer.c
@@ -101,10 +101,22 @@ static struct timecounter arm_tmr_timecount = {
.tc_quality = 1000,
};
+#ifdef __arm__
+#define get_el0(x) cp15_## x ##_get()
+#define get_el1(x) cp15_## x ##_get()
+#define set_el0(x, val) cp15_## x ##_set(val)
+#define set_el1(x, val) cp15_## x ##_set(val)
+#else /* __aarch64__ */
+#define get_el0(x) READ_SPECIALREG(x ##_el0)
+#define get_el1(x) READ_SPECIALREG(x ##_el1)
+#define set_el0(x, val) WRITE_SPECIALREG(x ##_el0, val)
+#define set_el1(x, val) WRITE_SPECIALREG(x ##_el1, val)
+#endif
+
static int
get_freq(void)
{
- return (cp15_cntfrq_get());
+ return (get_el0(cntfrq));
}
static long
@@ -114,9 +126,9 @@ get_cntxct(bool physical)
isb();
if (physical)
- val = cp15_cntpct_get();
+ val = get_el0(cntpct);
else
- val = cp15_cntvct_get();
+ val = get_el0(cntvct);
return (val);
}
@@ -126,9 +138,9 @@ set_ctrl(uint32_t val, bool physical)
{
if (physical)
- cp15_cntp_ctl_set(val);
+ set_el0(cntp_ctl, val);
else
- cp15_cntv_ctl_set(val);
+ set_el0(cntv_ctl, val);
isb();
return (0);
@@ -139,9 +151,9 @@ set_tval(uint32_t val, bool physical)
{
if (physical)
- cp15_cntp_tval_set(val);
+ set_el0(cntp_tval, val);
else
- cp15_cntv_tval_set(val);
+ set_el0(cntv_tval, val);
isb();
return (0);
@@ -153,9 +165,9 @@ get_ctrl(bool physical)
uint32_t val;
if (physical)
- val = cp15_cntp_ctl_get();
+ val = get_el0(cntp_ctl);
else
- val = cp15_cntv_ctl_get();
+ val = get_el0(cntv_ctl);
return (val);
}
@@ -165,10 +177,10 @@ disable_user_access(void)
{
uint32_t cntkctl;
- cntkctl = cp15_cntkctl_get();
+ cntkctl = get_el1(cntkctl);
cntkctl &= ~(GT_CNTKCTL_PL0PTEN | GT_CNTKCTL_PL0VTEN |
GT_CNTKCTL_EVNTEN | GT_CNTKCTL_PL0VCTEN | GT_CNTKCTL_PL0PCTEN);
- cp15_cntkctl_set(cntkctl);
+ set_el1(cntkctl, cntkctl);
isb();
}
@@ -242,11 +254,15 @@ arm_tmr_probe(device_t dev)
if (!ofw_bus_status_okay(dev))
return (ENXIO);
- if (!ofw_bus_is_compatible(dev, "arm,armv7-timer"))
- return (ENXIO);
+ if (ofw_bus_is_compatible(dev, "arm,armv7-timer")) {
+ device_set_desc(dev, "ARMv7 Generic Timer");
+ return (BUS_PROBE_DEFAULT);
+ } else if (ofw_bus_is_compatible(dev, "arm,armv8-timer")) {
+ device_set_desc(dev, "ARMv8 Generic Timer");
+ return (BUS_PROBE_DEFAULT);
+ }
- device_set_desc(dev, "ARMv7 Generic Timer");
- return (BUS_PROBE_DEFAULT);
+ return (ENXIO);
}
@@ -285,7 +301,11 @@ arm_tmr_attach(device_t dev)
return (ENXIO);
}
+#ifdef __arm__
sc->physical = true;
+#else /* __aarch64__ */
+ sc->physical = false;
+#endif
arm_tmr_sc = sc;
diff --git a/sys/arm/arm/intr.c b/sys/arm/arm/intr.c
index e83bca9..be8e87c 100644
--- a/sys/arm/arm/intr.c
+++ b/sys/arm/arm/intr.c
@@ -55,6 +55,7 @@ __FBSDID("$FreeBSD$");
#include <sys/pmckern.h>
#include <machine/atomic.h>
+#include <machine/bus.h>
#include <machine/intr.h>
#include <machine/cpu.h>
diff --git a/sys/arm/arm/locore-v4.S b/sys/arm/arm/locore-v4.S
index 8ef53e9..d798e97 100644
--- a/sys/arm/arm/locore-v4.S
+++ b/sys/arm/arm/locore-v4.S
@@ -116,7 +116,7 @@ ASENTRY_NP(_start)
* If we're running with MMU disabled, test against the
* physical address instead.
*/
- mrc p15, 0, r2, c1, c0, 0
+ mrc p15, 0, r2, c1, c0, 0
ands r2, r2, #CPU_CONTROL_MMU_ENABLE
ldreq r6, =PHYSADDR
ldrne r6, =LOADERRAMADDR
@@ -125,7 +125,7 @@ ASENTRY_NP(_start)
cmp r7, pc
bhi from_ram
b do_copy
-
+
flash_lower:
cmp r6, pc
bls from_ram
@@ -148,12 +148,12 @@ from_ram:
disable_mmu:
/* Disable MMU for a while */
- mrc p15, 0, r2, c1, c0, 0
+ mrc p15, 0, r2, c1, c0, 0
bic r2, r2, #(CPU_CONTROL_MMU_ENABLE | CPU_CONTROL_DC_ENABLE |\
CPU_CONTROL_WBUF_ENABLE)
bic r2, r2, #(CPU_CONTROL_IC_ENABLE)
bic r2, r2, #(CPU_CONTROL_BPRD_ENABLE)
- mcr p15, 0, r2, c1, c0, 0
+ mcr p15, 0, r2, c1, c0, 0
nop
nop
@@ -169,36 +169,16 @@ Lunmapped:
adr r0, Lpagetable
bl translate_va_to_pa
-#ifndef _ARM_ARCH_6
/*
* Some of the older ports (the various XScale, mostly) assume
* that the memory before the kernel is mapped, and use it for
- * the various stacks, page tables, etc. For those CPUs, map the
- * 64 first MB of RAM, as it used to be.
+ * the various stacks, page tables, etc. For those CPUs, map the
+ * 64 first MB of RAM, as it used to be.
*/
/*
* Map PA == VA
- */
- ldr r5, =PHYSADDR
- mov r1, r5
- mov r2, r5
- /* Map 64MiB, preserved over calls to build_pagetables */
- mov r3, #64
- bl build_pagetables
-
- /* Create the kernel map to jump to */
- mov r1, r5
- ldr r2, =(KERNBASE)
- bl build_pagetables
- ldr r5, =(KERNPHYSADDR)
-#else
- /*
- * Map PA == VA
- */
- /* Find the start kernels load address */
- adr r5, _start
- ldr r2, =(L1_S_OFFSET)
- bic r5, r2
+ */
+ ldr r5, =PHYSADDR
mov r1, r5
mov r2, r5
/* Map 64MiB, preserved over calls to build_pagetables */
@@ -207,10 +187,10 @@ Lunmapped:
/* Create the kernel map to jump to */
mov r1, r5
- ldr r2, =(KERNVIRTADDR)
+ ldr r2, =(KERNBASE)
bl build_pagetables
-#endif
-
+ ldr r5, =(KERNPHYSADDR)
+
#if defined(SOCDEV_PA) && defined(SOCDEV_VA)
/* Create the custom map */
ldr r1, =SOCDEV_PA
@@ -221,26 +201,16 @@ Lunmapped:
mcr p15, 0, r0, c2, c0, 0 /* Set TTB */
mcr p15, 0, r0, c8, c7, 0 /* Flush TLB */
-#if defined(CPU_ARM1136) || defined(CPU_ARM1176) || defined(CPU_CORTEXA) || defined(CPU_MV_PJ4B) || defined(CPU_KRAIT)
- mov r0, #0
- mcr p15, 0, r0, c13, c0, 1 /* Set ASID to 0 */
-#endif
-
/* Set the Domain Access register. Very important! */
- mov r0, #((DOMAIN_CLIENT << (PMAP_DOMAIN_KERNEL*2)) | DOMAIN_CLIENT)
+ mov r0, #((DOMAIN_CLIENT << (PMAP_DOMAIN_KERNEL*2)) | DOMAIN_CLIENT)
mcr p15, 0, r0, c3, c0, 0
- /*
+ /*
* Enable MMU.
* On armv6 enable extended page tables, and set alignment checking
* to modulo-4 (CPU_CONTROL_UNAL_ENABLE) for the ldrd/strd
* instructions emitted by clang.
*/
mrc p15, 0, r0, c1, c0, 0
-#ifdef _ARM_ARCH_6
- orr r0, r0, #(CPU_CONTROL_V6_EXTPAGE | CPU_CONTROL_UNAL_ENABLE)
- orr r0, r0, #(CPU_CONTROL_AFLT_ENABLE)
- orr r0, r0, #(CPU_CONTROL_AF_ENABLE)
-#endif
orr r0, r0, #(CPU_CONTROL_MMU_ENABLE)
mcr p15, 0, r0, c1, c0, 0
nop
@@ -280,7 +250,7 @@ virt_done:
/* init arm will return the new stack pointer. */
mov sp, r0
- bl _C_LABEL(mi_startup) /* call mi_startup()! */
+ bl _C_LABEL(mi_startup) /* call mi_startup()! */
adr r0, .Lmainreturned
b _C_LABEL(panic)
@@ -389,11 +359,11 @@ pagetable:
.word _C_LABEL(cpufuncs)
ENTRY_NP(cpu_halt)
- mrs r2, cpsr
+ mrs r2, cpsr
bic r2, r2, #(PSR_MODE)
- orr r2, r2, #(PSR_SVC32_MODE)
+ orr r2, r2, #(PSR_SVC32_MODE)
orr r2, r2, #(PSR_I | PSR_F)
- msr cpsr_fsxc, r2
+ msr cpsr_fsxc, r2
ldr r4, .Lcpu_reset_address
ldr r4, [r4]
@@ -419,9 +389,9 @@ ENTRY_NP(cpu_halt)
* Hurl ourselves into the ROM
*/
mov r0, #(CPU_CONTROL_32BP_ENABLE | CPU_CONTROL_32BD_ENABLE)
- mcr p15, 0, r0, c1, c0, 0
- mcrne p15, 0, r2, c8, c7, 0 /* nail I+D TLB on ARMv4 and greater */
- mov pc, r4
+ mcr p15, 0, r0, c1, c0, 0
+ mcrne p15, 0, r2, c8, c7, 0 /* nail I+D TLB on ARMv4 and greater */
+ mov pc, r4
/*
* _cpu_reset_address contains the address to branch to, to complete
@@ -458,7 +428,7 @@ ENTRY(longjmp)
END(longjmp)
.data
- .global _C_LABEL(esym)
+ .global _C_LABEL(esym)
_C_LABEL(esym): .word _C_LABEL(end)
ENTRY_NP(abort)
@@ -471,7 +441,7 @@ ENTRY_NP(sigcode)
/*
* Call the sigreturn system call.
- *
+ *
* We have to load r7 manually rather than using
* "ldr r7, =SYS_sigreturn" to ensure the value of szsigcode is
* correct. Using the alternative places esigcode at the address
diff --git a/sys/arm/arm/locore-v6.S b/sys/arm/arm/locore-v6.S
index 55b4311..7d5ba97 100644
--- a/sys/arm/arm/locore-v6.S
+++ b/sys/arm/arm/locore-v6.S
@@ -39,7 +39,7 @@
__FBSDID("$FreeBSD$");
-#ifndef ARM_NEW_PMAP
+#ifndef ARM_NEW_PMAP
#define PTE1_OFFSET L1_S_OFFSET
#define PTE1_SHIFT L1_S_SHIFT
#define PTE1_SIZE L1_S_SIZE
@@ -52,13 +52,13 @@ __FBSDID("$FreeBSD$");
.align 2
/*
- * On entry for FreeBSD boot ABI:
- * r0 - metadata pointer or 0 (boothowto on AT91's boot2)
- * r1 - if (r0 == 0) then metadata pointer
- * On entry for Linux boot ABI:
+ * On entry for FreeBSD boot ABI:
+ * r0 - metadata pointer or 0 (boothowto on AT91's boot2)
+ * r1 - if (r0 == 0) then metadata pointer
+ * On entry for Linux boot ABI:
* r0 - 0
* r1 - machine type (passed as arg2 to initarm)
- * r2 - Pointer to a tagged list or dtb image (phys addr) (passed as arg1 initarm)
+ * r2 - Pointer to a tagged list or dtb image (phys addr) (passed as arg1 initarm)
*
* For both types of boot we gather up the args, put them in a struct arm_boot_params
* structure and pass that to initarm.
@@ -66,17 +66,17 @@ __FBSDID("$FreeBSD$");
.globl btext
btext:
ASENTRY_NP(_start)
- STOP_UNWINDING /* Can't unwind into the bootloader! */
+ STOP_UNWINDING /* Can't unwind into the bootloader! */
- /* Make sure interrupts are disabled. */
+ /* Make sure interrupts are disabled. */
cpsid ifa
- mov r8, r0 /* 0 or boot mode from boot2 */
- mov r9, r1 /* Save Machine type */
- mov r10, r2 /* Save meta data */
+ mov r8, r0 /* 0 or boot mode from boot2 */
+ mov r9, r1 /* Save Machine type */
+ mov r10, r2 /* Save meta data */
mov r11, r3 /* Future expansion */
- /*
+ /*
* Check whether data cache is enabled. If it is, then we know
* current tags are valid (not power-on garbage values) and there
* might be dirty lines that need cleaning. Disable cache to prevent
@@ -93,7 +93,7 @@ ASENTRY_NP(_start)
* valid. Disable all caches and the MMU, and invalidate everything
* before setting up new page tables and re-enabling the mmu.
*/
-1:
+1:
bic r7, #CPU_CONTROL_DC_ENABLE
bic r7, #CPU_CONTROL_MMU_ENABLE
bic r7, #CPU_CONTROL_IC_ENABLE
@@ -119,13 +119,13 @@ ASENTRY_NP(_start)
/*
* Map PA == VA
*/
- /* Find the start kernels load address */
+ /* Find the start kernels load address */
adr r5, _start
ldr r2, =(PTE1_OFFSET)
bic r5, r2
mov r1, r5
mov r2, r5
- /* Map 64MiB, preserved over calls to build_pagetables */
+ /* Map 64MiB, preserved over calls to build_pagetables */
mov r3, #64
bl build_pagetables
@@ -142,41 +142,41 @@ ASENTRY_NP(_start)
#endif
bl init_mmu
- /* Switch to virtual addresses. */
+ /* Switch to virtual addresses. */
ldr pc, =1f
1:
- /* Setup stack, clear BSS */
+ /* Setup stack, clear BSS */
ldr r1, =.Lstart
ldmia r1, {r1, r2, sp} /* Set initial stack and */
add sp, sp, #INIT_ARM_STACK_SIZE
- sub r2, r2, r1 /* get zero init data */
+ sub r2, r2, r1 /* get zero init data */
mov r3, #0
2:
str r3, [r1], #0x0004 /* get zero init data */
- subs r2, r2, #4
+ subs r2, r2, #4
bgt 2b
- mov r1, #28 /* loader info size is 28 bytes also second arg */
- subs sp, sp, r1 /* allocate arm_boot_params struct on stack */
- mov r0, sp /* loader info pointer is first arg */
- bic sp, sp, #7 /* align stack to 8 bytes */
- str r1, [r0] /* Store length of loader info */
+ mov r1, #28 /* loader info size is 28 bytes also second arg */
+ subs sp, sp, r1 /* allocate arm_boot_params struct on stack */
+ mov r0, sp /* loader info pointer is first arg */
+ bic sp, sp, #7 /* align stack to 8 bytes */
+ str r1, [r0] /* Store length of loader info */
str r8, [r0, #4] /* Store r0 from boot loader */
str r9, [r0, #8] /* Store r1 from boot loader */
str r10, [r0, #12] /* store r2 from boot loader */
str r11, [r0, #16] /* store r3 from boot loader */
str r5, [r0, #20] /* store the physical address */
- adr r4, Lpagetable /* load the pagetable address */
+ adr r4, Lpagetable /* load the pagetable address */
ldr r5, [r4, #4]
str r5, [r0, #24] /* store the pagetable address */
mov fp, #0 /* trace back starts here */
bl _C_LABEL(initarm) /* Off we go */
- /* init arm will return the new stack pointer. */
+ /* init arm will return the new stack pointer. */
mov sp, r0
- bl _C_LABEL(mi_startup) /* call mi_startup()! */
+ bl _C_LABEL(mi_startup) /* call mi_startup()! */
ldr r0, =.Lmainreturned
b _C_LABEL(panic)
@@ -219,8 +219,8 @@ translate_va_to_pa:
mov pc, lr
/*
- * Init MMU
- * r0 - The table base address
+ * Init MMU
+ * r0 - the table base address
*/
ASENTRY_NP(init_mmu)
@@ -267,11 +267,11 @@ END(init_mmu)
/*
- * Init SMP coherent mode, enable caching and switch to final MMU table.
- * Called with disabled caches
- * r0 - The table base address
- * r1 - clear bits for aux register
- * r2 - set bits for aux register
+ * Init SMP coherent mode, enable caching and switch to final MMU table.
+ * Called with disabled caches
+ * r0 - The table base address
+ * r1 - clear bits for aux register
+ * r2 - set bits for aux register
*/
ASENTRY_NP(reinit_mmu)
push {r4-r11, lr}
@@ -331,11 +331,11 @@ END(reinit_mmu)
/*
* Builds the page table
- * r0 - The table base address
- * r1 - The physical address (trashed)
- * r2 - The virtual address (trashed)
- * r3 - The number of 1MiB sections
- * r4 - Trashed
+ * r0 - The table base address
+ * r1 - The physical address (trashed)
+ * r2 - The virtual address (trashed)
+ * r3 - The number of 1MiB sections
+ * r4 - Trashed
*
* Addresses must be 1MiB aligned
*/
@@ -350,15 +350,15 @@ build_pagetables:
#endif
orr r1, r4
- /* Move the virtual address to the correct bit location */
+ /* Move the virtual address to the correct bit location */
lsr r2, #(PTE1_SHIFT - 2)
mov r4, r3
1:
str r1, [r0, r2]
- add r2, r2, #4
- add r1, r1, #(PTE1_SIZE)
- adds r4, r4, #-1
+ add r2, r2, #4
+ add r1, r1, #(PTE1_SIZE)
+ adds r4, r4, #-1
bhi 1b
mov pc, lr
@@ -372,7 +372,7 @@ VA_TO_PA_POINTER(Lpagetable, boot_pt1)
.word svcstk /* must remain in order together. */
.Lmainreturned:
- .asciz "main() returned"
+ .asciz "main() returned"
.align 2
.bss
@@ -380,8 +380,8 @@ svcstk:
.space INIT_ARM_STACK_SIZE * MAXCPU
/*
- * Memory for the initial pagetable. We are unable to place this in
- * the bss as this will be cleared after the table is loaded.
+ * Memory for the initial pagetable. We are unable to place this in
+ * the bss as this will be cleared after the table is loaded.
*/
.section ".init_pagetable"
.align 14 /* 16KiB aligned */
@@ -398,7 +398,7 @@ boot_pt1:
#if defined(SMP)
ASENTRY_NP(mpentry)
- /* Make sure interrupts are disabled. */
+ /* Make sure interrupts are disabled. */
cpsid ifa
/* Setup core, disable all caches. */
@@ -419,10 +419,10 @@ ASENTRY_NP(mpentry)
mcr CP15_ICIALLU
ISB
- /* Find the delta between VA and PA */
+ /* Find the delta between VA and PA */
adr r0, Lpagetable
bl translate_va_to_pa
-
+
bl init_mmu
adr r1, .Lstart+8 /* Get initstack pointer from */
@@ -433,7 +433,7 @@ ASENTRY_NP(mpentry)
mul r2, r1, r0 /* Point sp to initstack */
add sp, sp, r2 /* area for this processor. */
- /* Switch to virtual addresses. */
+ /* Switch to virtual addresses. */
ldr pc, =1f
1:
mov fp, #0 /* trace back starts here */
@@ -459,14 +459,14 @@ ENTRY_NP(cpu_halt)
ldr r4, [r4]
teq r4, #0
movne pc, r4
-1:
+1:
WFI
b 1b
/*
* _cpu_reset_address contains the address to branch to, to complete
* the cpu reset after turning the MMU off
- * This variable is provided by the hardware specific code
+ * This variable is provided by the hardware specific code
*/
.Lcpu_reset_address:
.word _C_LABEL(cpu_reset_address)
@@ -498,38 +498,37 @@ END(abort)
ENTRY_NP(sigcode)
mov r0, sp
- add r0, r0, #SIGF_UC
+ add r0, r0, #SIGF_UC
/*
- * Call the sigreturn system call.
+ * Call the sigreturn system call.
*
* We have to load r7 manually rather than using
- * "ldr r7, =SYS_sigreturn" to ensure the value of szsigcode is
+ * "ldr r7, =SYS_sigreturn" to ensure the value of szsigcode is
* correct. Using the alternative places esigcode at the address
- * of the data rather than the address one past the data.
+ * of the data rather than the address one past the data.
*/
- ldr r7, [pc, #12] /* Load SYS_sigreturn */
+ ldr r7, [pc, #12] /* Load SYS_sigreturn */
swi SYS_sigreturn
- /* Well if that failed we better exit quick ! */
+ /* Well if that failed we better exit quick ! */
- ldr r7, [pc, #8] /* Load SYS_exit */
+ ldr r7, [pc, #8] /* Load SYS_exit */
swi SYS_exit
- /* Branch back to retry SYS_sigreturn */
+ /* Branch back to retry SYS_sigreturn */
b . - 16
END(sigcode)
-
.word SYS_sigreturn
.word SYS_exit
.align 2
- .global _C_LABEL(esigcode)
+ .global _C_LABEL(esigcode)
_C_LABEL(esigcode):
.data
- .global szsigcode
+ .global szsigcode
szsigcode:
.long esigcode-sigcode
diff --git a/sys/arm/arm/machdep.c b/sys/arm/arm/machdep.c
index 68d31a9..a76e18a4 100644
--- a/sys/arm/arm/machdep.c
+++ b/sys/arm/arm/machdep.c
@@ -1055,7 +1055,6 @@ kenv_next(char *cp)
static void
print_kenv(void)
{
- int len;
char *cp;
debugf("loader passed (static) kenv:\n");
@@ -1065,7 +1064,6 @@ print_kenv(void)
}
debugf(" kern_envp = 0x%08x\n", (uint32_t)kern_envp);
- len = 0;
for (cp = kern_envp; cp != NULL; cp = kenv_next(cp))
debugf(" %x %s\n", (uint32_t)cp, cp);
}
diff --git a/sys/arm/arm/mpcore_timer.c b/sys/arm/arm/mpcore_timer.c
index 62c5344..88060cf 100644
--- a/sys/arm/arm/mpcore_timer.c
+++ b/sys/arm/arm/mpcore_timer.c
@@ -65,7 +65,6 @@ __FBSDID("$FreeBSD$");
#include <dev/ofw/ofw_bus_subr.h>
#include <machine/bus.h>
-#include <machine/fdt.h>
#include <arm/arm/mpcore_timervar.h>
diff --git a/sys/arm/arm/pmap-v6-new.c b/sys/arm/arm/pmap-v6-new.c
index 8c15918..f404214 100644
--- a/sys/arm/arm/pmap-v6-new.c
+++ b/sys/arm/arm/pmap-v6-new.c
@@ -6051,11 +6051,38 @@ retry:
}
void
-pmap_kenter_device(vm_offset_t va, vm_paddr_t pa)
+pmap_kenter_device(vm_offset_t va, vm_size_t size, vm_paddr_t pa)
{
+ vm_offset_t sva;
- pmap_kenter_prot_attr(va, pa, PTE2_AP_KRW, PTE2_ATTR_DEVICE);
- tlb_flush(va);
+ KASSERT((size & PAGE_MASK) == 0,
+ ("%s: device mapping not page-sized", __func__));
+
+ sva = va;
+ while (size != 0) {
+ pmap_kenter_prot_attr(va, pa, PTE2_AP_KRW, PTE2_ATTR_DEVICE);
+ va += PAGE_SIZE;
+ pa += PAGE_SIZE;
+ size -= PAGE_SIZE;
+ }
+ tlb_flush_range(sva, va - sva);
+}
+
+void
+pmap_kremove_device(vm_offset_t va, vm_size_t size)
+{
+ vm_offset_t sva;
+
+ KASSERT((size & PAGE_MASK) == 0,
+ ("%s: device mapping not page-sized", __func__));
+
+ sva = va;
+ while (size != 0) {
+ pmap_kremove(va);
+ va += PAGE_SIZE;
+ size -= PAGE_SIZE;
+ }
+ tlb_flush_range(sva, va - sva);
}
void
@@ -6067,13 +6094,13 @@ pmap_set_pcb_pagedir(pmap_t pmap, struct pcb *pcb)
/*
- * Clean L1 data cache range on a single page, which is not mapped yet.
+ * Clean L1 data cache range by physical address.
+ * The range must be within a single page.
*/
static void
pmap_dcache_wb_pou(vm_paddr_t pa, vm_size_t size, vm_memattr_t ma)
{
struct sysmaps *sysmaps;
- vm_offset_t va;
KASSERT(((pa & PAGE_MASK) + size) <= PAGE_SIZE,
("%s: not on single page", __func__));
@@ -6084,9 +6111,8 @@ pmap_dcache_wb_pou(vm_paddr_t pa, vm_size_t size, vm_memattr_t ma)
if (*sysmaps->CMAP3)
panic("%s: CMAP3 busy", __func__);
pte2_store(sysmaps->CMAP3, PTE2_KERN_NG(pa, PTE2_AP_KRW, ma));
- va = (vm_offset_t)sysmaps->CADDR3;
- tlb_flush_local(va);
- dcache_wb_pou(va, size);
+ tlb_flush_local((vm_offset_t)sysmaps->CADDR3);
+ dcache_wb_pou((vm_offset_t)sysmaps->CADDR3 + (pa & PAGE_MASK), size);
pte2_clear(sysmaps->CMAP3);
sched_unpin();
mtx_unlock(&sysmaps->lock);
diff --git a/sys/arm/arm/pmap-v6.c b/sys/arm/arm/pmap-v6.c
index 317d776..0e0d884 100644
--- a/sys/arm/arm/pmap-v6.c
+++ b/sys/arm/arm/pmap-v6.c
@@ -2451,10 +2451,36 @@ pmap_kenter_nocache(vm_offset_t va, vm_paddr_t pa)
}
void
-pmap_kenter_device(vm_offset_t va, vm_paddr_t pa)
+pmap_kenter_device(vm_offset_t va, vm_size_t size, vm_paddr_t pa)
{
+ vm_offset_t sva;
- pmap_kenter_internal(va, pa, KENTER_DEVICE);
+ KASSERT((size & PAGE_MASK) == 0,
+ ("%s: device mapping not page-sized", __func__));
+
+ sva = va;
+ while (size != 0) {
+ pmap_kenter_internal(va, pa, KENTER_DEVICE);
+ va += PAGE_SIZE;
+ pa += PAGE_SIZE;
+ size -= PAGE_SIZE;
+ }
+}
+
+void
+pmap_kremove_device(vm_offset_t va, vm_size_t size)
+{
+ vm_offset_t sva;
+
+ KASSERT((size & PAGE_MASK) == 0,
+ ("%s: device mapping not page-sized", __func__));
+
+ sva = va;
+ while (size != 0) {
+ pmap_kremove(va);
+ va += PAGE_SIZE;
+ size -= PAGE_SIZE;
+ }
}
void
diff --git a/sys/arm/arm/pmap.c b/sys/arm/arm/pmap.c
index 1619236..e1429a1 100644
--- a/sys/arm/arm/pmap.c
+++ b/sys/arm/arm/pmap.c
@@ -2712,14 +2712,36 @@ pmap_kenter_nocache(vm_offset_t va, vm_paddr_t pa)
}
void
-pmap_kenter_device(vm_offset_t va, vm_paddr_t pa)
+pmap_kenter_device(vm_offset_t va, vm_size_t size, vm_paddr_t pa)
{
+ vm_offset_t sva;
- /*
- * XXX - Need a way for kenter_internal to handle PTE_DEVICE mapping as
- * a potentially different thing than PTE_NOCACHE.
- */
- pmap_kenter_internal(va, pa, 0);
+ KASSERT((size & PAGE_MASK) == 0,
+ ("%s: device mapping not page-sized", __func__));
+
+ sva = va;
+ while (size != 0) {
+ pmap_kenter_internal(va, pa, 0);
+ va += PAGE_SIZE;
+ pa += PAGE_SIZE;
+ size -= PAGE_SIZE;
+ }
+}
+
+void
+pmap_kremove_device(vm_offset_t va, vm_size_t size)
+{
+ vm_offset_t sva;
+
+ KASSERT((size & PAGE_MASK) == 0,
+ ("%s: device mapping not page-sized", __func__));
+
+ sva = va;
+ while (size != 0) {
+ pmap_kremove(va);
+ va += PAGE_SIZE;
+ size -= PAGE_SIZE;
+ }
}
void
diff --git a/sys/arm/arm/pmu.c b/sys/arm/arm/pmu.c
index 168c8b4..c224525 100644
--- a/sys/arm/arm/pmu.c
+++ b/sys/arm/arm/pmu.c
@@ -55,7 +55,6 @@ __FBSDID("$FreeBSD$");
#include <dev/ofw/ofw_bus_subr.h>
#include <machine/bus.h>
-#include <machine/fdt.h>
#include <machine/cpu.h>
#include <machine/intr.h>
diff --git a/sys/arm/arm/trap-v6.c b/sys/arm/arm/trap-v6.c
index b9cad50..abafa86 100644
--- a/sys/arm/arm/trap-v6.c
+++ b/sys/arm/arm/trap-v6.c
@@ -53,6 +53,7 @@ __FBSDID("$FreeBSD$");
#include <vm/vm_extern.h>
#include <vm/vm_param.h>
+#include <machine/acle-compat.h>
#include <machine/cpu.h>
#include <machine/cpu-v6.h>
#include <machine/frame.h>
@@ -287,7 +288,11 @@ abort_handler(struct trapframe *tf, int prefetch)
#endif
td = curthread;
fsr = (prefetch) ? cp15_ifsr_get(): cp15_dfsr_get();
+#if __ARM_ARCH >= 7
+ far = (prefetch) ? cp15_ifar_get() : cp15_dfar_get();
+#else
far = (prefetch) ? TRAPF_PC(tf) : cp15_dfar_get();
+#endif
idx = FSR_TO_FAULT(fsr);
usermode = TRAPF_USERMODE(tf); /* Abort came from user mode? */
diff --git a/sys/arm/arm/vm_machdep.c b/sys/arm/arm/vm_machdep.c
index 383a74a..2ab58ea 100644
--- a/sys/arm/arm/vm_machdep.c
+++ b/sys/arm/arm/vm_machdep.c
@@ -178,11 +178,7 @@ cpu_set_syscall_retval(struct thread *td, int error)
* place the returned data into r1. As the lseek and frerebsd6_lseek
* syscalls also return an off_t they do not need this fixup.
*/
-#ifdef __ARM_EABI__
call = frame->tf_r7;
-#else
- call = *(u_int32_t *)(frame->tf_pc - INSN_SIZE) & 0x000fffff;
-#endif
if (call == SYS___syscall) {
register_t *ap = &frame->tf_r0;
register_t code = ap[_QUAD_LOWWORD];
diff --git a/sys/arm/at91/at91_common.c b/sys/arm/at91/at91_common.c
index 8282aa1..4153366 100644
--- a/sys/arm/at91/at91_common.c
+++ b/sys/arm/at91/at91_common.c
@@ -29,15 +29,22 @@ __FBSDID("$FreeBSD$");
#define _ARM32_BUS_DMA_PRIVATE
#include <sys/param.h>
#include <sys/systm.h>
+#include <sys/bus.h>
+
#include <vm/vm.h>
+
#include <machine/devmap.h>
+#include <machine/intr.h>
#include <machine/machdep.h>
#include <machine/platform.h>
+
#include <arm/at91/at91var.h>
#include <arm/at91/at91soc.h>
#include <arm/at91/at91_aicreg.h>
+
#include <dev/fdt/fdt_common.h>
#include <dev/ofw/openfirm.h>
+
#include <machine/fdt.h>
extern const struct arm_devmap_entry at91_devmap[];
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_common.c b/sys/arm/broadcom/bcm2835/bcm2835_common.c
index a534957..a558ac8 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_common.c
+++ b/sys/arm/broadcom/bcm2835/bcm2835_common.c
@@ -44,7 +44,6 @@ __FBSDID("$FreeBSD$");
#include <dev/ofw/openfirm.h>
#include <machine/bus.h>
-#include <machine/fdt.h>
#include <machine/vmparam.h>
struct fdt_fixup_entry fdt_fixup_table[] = {
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_fb.c b/sys/arm/broadcom/bcm2835/bcm2835_fb.c
index 3270da1..6e6cfda 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_fb.c
+++ b/sys/arm/broadcom/bcm2835/bcm2835_fb.c
@@ -29,46 +29,27 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/systm.h>
-#include <sys/bio.h>
#include <sys/bus.h>
-#include <sys/conf.h>
-#include <sys/endian.h>
+#include <sys/consio.h>
+#include <sys/fbio.h>
+#include <sys/kdb.h>
#include <sys/kernel.h>
-#include <sys/kthread.h>
-#include <sys/lock.h>
#include <sys/malloc.h>
#include <sys/module.h>
-#include <sys/mutex.h>
-#include <sys/queue.h>
-#include <sys/resource.h>
-#include <sys/rman.h>
-#include <sys/time.h>
-#include <sys/timetc.h>
-#include <sys/fbio.h>
-#include <sys/consio.h>
-
-#include <sys/kdb.h>
-#include <machine/bus.h>
-#include <machine/cpu.h>
-#include <machine/cpufunc.h>
-#include <machine/resource.h>
-#include <machine/intr.h>
+#include <vm/vm.h>
+#include <vm/pmap.h>
+#include <dev/fb/fbreg.h>
#include <dev/fdt/fdt_common.h>
#include <dev/ofw/ofw_bus.h>
#include <dev/ofw/ofw_bus_subr.h>
-
-#include <dev/fb/fbreg.h>
#include <dev/syscons/syscons.h>
-#include <arm/broadcom/bcm2835/bcm2835_mbox.h>
-#include <arm/broadcom/bcm2835/bcm2835_vcbus.h>
+#include <arm/broadcom/bcm2835/bcm2835_mbox_prop.h>
#include "mbox_if.h"
-#define BCMFB_FONT_HEIGHT 16
-
struct argb {
uint8_t a;
uint8_t r;
@@ -101,40 +82,15 @@ static u_char mouse_pointer[16] = {
0x0c, 0x0c, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00
};
-#define FB_WIDTH 640
-#define FB_HEIGHT 480
-#define FB_DEPTH 24
-
-struct bcm_fb_config {
- uint32_t xres;
- uint32_t yres;
- uint32_t vxres;
- uint32_t vyres;
- uint32_t pitch;
- uint32_t bpp;
- uint32_t xoffset;
- uint32_t yoffset;
- /* Filled by videocore */
- uint32_t base;
- uint32_t screen_size;
-};
+#define BCMFB_FONT_HEIGHT 16
+#define BCMFB_FONT_WIDTH 8
+#define FB_WIDTH 640
+#define FB_HEIGHT 480
+#define FB_DEPTH 24
struct bcmsc_softc {
- device_t dev;
- struct cdev * cdev;
- struct mtx mtx;
- bus_dma_tag_t dma_tag;
- bus_dmamap_t dma_map;
- struct bcm_fb_config* fb_config;
- bus_addr_t fb_config_phys;
- struct intr_config_hook init_hook;
-
-};
-
-struct video_adapter_softc {
/* Videoadpater part */
video_adapter_t va;
- int console;
intptr_t fb_addr;
intptr_t fb_paddr;
@@ -149,199 +105,75 @@ struct video_adapter_softc {
unsigned int ymargin;
unsigned char *font;
+ int fbswap;
int initialized;
};
-static struct bcmsc_softc *bcmsc_softc;
-static struct video_adapter_softc va_softc;
-
-#define bcm_fb_lock(_sc) mtx_lock(&(_sc)->mtx)
-#define bcm_fb_unlock(_sc) mtx_unlock(&(_sc)->mtx)
-#define bcm_fb_lock_assert(sc) mtx_assert(&(_sc)->mtx, MA_OWNED)
+static struct bcmsc_softc bcmsc;
static int bcm_fb_probe(device_t);
static int bcm_fb_attach(device_t);
-static void bcm_fb_dmamap_cb(void *arg, bus_dma_segment_t *segs, int nseg, int err);
static void bcmfb_update_margins(video_adapter_t *adp);
static int bcmfb_configure(int);
-static void
-bcm_fb_init(void *arg)
-{
- struct bcmsc_softc *sc = arg;
- struct video_adapter_softc *va_sc = &va_softc;
- int err;
- volatile struct bcm_fb_config* fb_config = sc->fb_config;
- phandle_t node;
- pcell_t cell;
- device_t mbox;
-
- node = ofw_bus_get_node(sc->dev);
-
- fb_config->xres = 0;
- fb_config->yres = 0;
- fb_config->bpp = 0;
-
- if ((OF_getprop(node, "broadcom,width", &cell, sizeof(cell))) > 0)
- fb_config->xres = (int)fdt32_to_cpu(cell);
- if (fb_config->xres == 0)
- fb_config->xres = FB_WIDTH;
-
- if ((OF_getprop(node, "broadcom,height", &cell, sizeof(cell))) > 0)
- fb_config->yres = (uint32_t)fdt32_to_cpu(cell);
- if (fb_config->yres == 0)
- fb_config->yres = FB_HEIGHT;
-
- if ((OF_getprop(node, "broadcom,depth", &cell, sizeof(cell))) > 0)
- fb_config->bpp = (uint32_t)fdt32_to_cpu(cell);
- if (fb_config->bpp == 0)
- fb_config->bpp = FB_DEPTH;
-
- fb_config->vxres = 0;
- fb_config->vyres = 0;
- fb_config->xoffset = 0;
- fb_config->yoffset = 0;
- fb_config->base = 0;
- fb_config->pitch = 0;
- fb_config->screen_size = 0;
-
- bus_dmamap_sync(sc->dma_tag, sc->dma_map,
- BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD);
-
- mbox = devclass_get_device(devclass_find("mbox"), 0);
- if (mbox) {
- MBOX_WRITE(mbox, BCM2835_MBOX_CHAN_FB, sc->fb_config_phys);
- MBOX_READ(mbox, BCM2835_MBOX_CHAN_FB, &err);
- }
- bus_dmamap_sync(sc->dma_tag, sc->dma_map,
- BUS_DMASYNC_POSTREAD);
-
- if (fb_config->base != 0) {
- device_printf(sc->dev, "%dx%d(%dx%d@%d,%d) %dbpp\n",
- fb_config->xres, fb_config->yres,
- fb_config->vxres, fb_config->vyres,
- fb_config->xoffset, fb_config->yoffset,
- fb_config->bpp);
-
-
- device_printf(sc->dev, "pitch %d, base 0x%08x, screen_size %d\n",
- fb_config->pitch, fb_config->base,
- fb_config->screen_size);
-
- va_sc->fb_addr = (intptr_t)pmap_mapdev(fb_config->base, fb_config->screen_size);
- va_sc->fb_paddr = fb_config->base;
- va_sc->fb_size = fb_config->screen_size;
- va_sc->depth = fb_config->bpp;
- va_sc->stride = fb_config->pitch;
-
- va_sc->width = fb_config->xres;
- va_sc->height = fb_config->yres;
- bcmfb_update_margins(&va_sc->va);
- }
- else {
- device_printf(sc->dev, "Failed to set framebuffer info\n");
- }
-
- config_intrhook_disestablish(&sc->init_hook);
-}
-
static int
bcm_fb_probe(device_t dev)
{
- int error = 0;
+ int error;
if (!ofw_bus_is_compatible(dev, "broadcom,bcm2835-fb"))
return (ENXIO);
-
device_set_desc(dev, "BCM2835 framebuffer device");
-
error = sc_probe_unit(device_get_unit(dev),
device_get_flags(dev) | SC_AUTODETECT_KBD);
if (error != 0)
return (error);
-
return (BUS_PROBE_DEFAULT);
}
static int
bcm_fb_attach(device_t dev)
{
- struct bcmsc_softc *sc = device_get_softc(dev);
- int dma_size = sizeof(struct bcm_fb_config);
- int err;
-
- if (bcmsc_softc)
- return (ENXIO);
+ struct bcm2835_fb_config fb;
+ struct bcmsc_softc *sc;
- bcmsc_softc = sc;
-
- sc->dev = dev;
- mtx_init(&sc->mtx, "bcm2835fb", "fb", MTX_DEF);
-
- err = bus_dma_tag_create(
- bus_get_dma_tag(sc->dev),
- PAGE_SIZE, 0, /* alignment, boundary */
- BUS_SPACE_MAXADDR_32BIT, /* lowaddr */
- BUS_SPACE_MAXADDR, /* highaddr */
- NULL, NULL, /* filter, filterarg */
- dma_size, 1, /* maxsize, nsegments */
- dma_size, 0, /* maxsegsize, flags */
- NULL, NULL, /* lockfunc, lockarg */
- &sc->dma_tag);
-
- err = bus_dmamem_alloc(sc->dma_tag, (void **)&sc->fb_config,
- 0, &sc->dma_map);
- if (err) {
- device_printf(dev, "cannot allocate framebuffer\n");
- goto fail;
- }
-
- err = bus_dmamap_load(sc->dma_tag, sc->dma_map, sc->fb_config,
- dma_size, bcm_fb_dmamap_cb, &sc->fb_config_phys, BUS_DMA_NOWAIT);
-
- if (err) {
- device_printf(dev, "cannot load DMA map\n");
- goto fail;
- }
+ sc = (struct bcmsc_softc *)vid_get_adapter(vid_find_adapter(
+ "bcmfb", 0));
+ if (sc != NULL)
+ device_set_softc(dev, sc);
+ else
+ sc = device_get_softc(dev);
- err = (sc_attach_unit(device_get_unit(dev),
- device_get_flags(dev) | SC_AUTODETECT_KBD));
+ memset(&fb, 0, sizeof(fb));
+ if (bcm2835_mbox_fb_get_w_h(dev, &fb) != 0)
+ return (ENXIO);
+ fb.bpp = FB_DEPTH;
+ if (bcm2835_mbox_fb_init(dev, &fb) != 0)
+ return (ENXIO);
- if (err) {
+ sc->fb_addr = (intptr_t)pmap_mapdev(fb.base, fb.size);
+ sc->fb_paddr = fb.base;
+ sc->fb_size = fb.size;
+ sc->depth = fb.bpp;
+ sc->stride = fb.pitch;
+ sc->width = fb.xres;
+ sc->height = fb.yres;
+ bcmfb_update_margins(&sc->va);
+
+ if (sc_attach_unit(device_get_unit(dev),
+ device_get_flags(dev) | SC_AUTODETECT_KBD) != 0) {
device_printf(dev, "failed to attach syscons\n");
- goto fail;
+ return (ENXIO);
}
- /*
- * We have to wait until interrupts are enabled.
- * Mailbox relies on it to get data from VideoCore
- */
- sc->init_hook.ich_func = bcm_fb_init;
- sc->init_hook.ich_arg = sc;
-
- if (config_intrhook_establish(&sc->init_hook) != 0) {
- device_printf(dev, "failed to establish intrhook\n");
- return (ENOMEM);
- }
+ device_printf(dev, "%dx%d(%dx%d@%d,%d) %dbpp\n", fb.xres, fb.yres,
+ fb.vxres, fb.vyres, fb.xoffset, fb.yoffset, fb.bpp);
+ device_printf(dev,
+ "fbswap: %d, pitch %d, base 0x%08x, screen_size %d\n",
+ sc->fbswap, fb.pitch, fb.base, fb.size);
return (0);
-
-fail:
- return (ENXIO);
-}
-
-
-static void
-bcm_fb_dmamap_cb(void *arg, bus_dma_segment_t *segs, int nseg, int err)
-{
- bus_addr_t *addr;
-
- if (err)
- return;
-
- addr = (bus_addr_t*)arg;
- *addr = PHYS_TO_VCBUS(segs[0].ds_addr);
}
static device_method_t bcm_fb_methods[] = {
@@ -504,13 +336,13 @@ bcmrend_set_cursor(scr_stat* scp, int base, int height, int blink)
static void
bcmrend_draw_cursor(scr_stat* scp, int off, int blink, int on, int flip)
{
- video_adapter_t* adp = scp->sc->adp;
- struct video_adapter_softc *sc;
- int row, col;
+ int bytes, col, i, j, row;
+ struct bcmsc_softc *sc;
uint8_t *addr;
- int i, j, bytes;
+ video_adapter_t *adp;
- sc = (struct video_adapter_softc *)adp;
+ adp = scp->sc->adp;
+ sc = (struct bcmsc_softc *)adp;
if (scp->curs_attr.height <= 0)
return;
@@ -529,8 +361,7 @@ bcmrend_draw_cursor(scr_stat* scp, int off, int blink, int on, int flip)
+ (row + sc->ymargin)*(sc->stride)
+ (sc->depth/8) * (col + sc->xmargin);
- bytes = sc->depth/8;
-
+ bytes = sc->depth / 8;
/* our cursor consists of simply inverting the char under it */
for (i = 0; i < adp->va_info.vi_cheight; i++) {
for (j = 0; j < adp->va_info.vi_cwidth; j++) {
@@ -577,56 +408,80 @@ extern u_char dflt_font_16[];
static void
bcmfb_update_margins(video_adapter_t *adp)
{
- struct video_adapter_softc *sc;
+ struct bcmsc_softc *sc;
video_info_t *vi;
- sc = (struct video_adapter_softc *)adp;
+ sc = (struct bcmsc_softc *)adp;
vi = &adp->va_info;
sc->xmargin = (sc->width - (vi->vi_width * vi->vi_cwidth)) / 2;
- sc->ymargin = (sc->height - (vi->vi_height * vi->vi_cheight))/2;
+ sc->ymargin = (sc->height - (vi->vi_height * vi->vi_cheight)) / 2;
}
static int
bcmfb_configure(int flags)
{
- struct video_adapter_softc *va_sc;
-
- va_sc = &va_softc;
- phandle_t display, root;
+ char bootargs[2048], *n, *p, *v;
pcell_t cell;
+ phandle_t chosen, display, root;
+ struct bcmsc_softc *sc;
- if (va_sc->initialized)
+ sc = &bcmsc;
+ if (sc->initialized)
return (0);
- va_sc->width = 0;
- va_sc->height = 0;
+ sc->width = 0;
+ sc->height = 0;
/*
* It seems there is no way to let syscons framework know
* that framebuffer resolution has changed. So just try
- * to fetch data from FDT and go with defaults if failed
+ * to fetch data from FDT bootargs, FDT display data and
+ * finally go with defaults if everything else has failed.
*/
+ chosen = OF_finddevice("/chosen");
+ if (chosen != 0 &&
+ OF_getprop(chosen, "bootargs", &bootargs, sizeof(bootargs)) > 0) {
+ p = bootargs;
+ while ((v = strsep(&p, " ")) != NULL) {
+ if (*v == '\0')
+ continue;
+ n = strsep(&v, "=");
+ if (strcmp(n, "bcm2708_fb.fbwidth") == 0 && v != NULL)
+ sc->width = (unsigned int)strtol(v, NULL, 0);
+ else if (strcmp(n, "bcm2708_fb.fbheight") == 0 &&
+ v != NULL)
+ sc->height = (unsigned int)strtol(v, NULL, 0);
+ else if (strcmp(n, "bcm2708_fb.fbswap") == 0 &&
+ v != NULL)
+ if (*v == '1')
+ sc->fbswap = 1;
+ }
+ }
+
root = OF_finddevice("/");
if ((root != 0) &&
(display = fdt_find_compatible(root, "broadcom,bcm2835-fb", 1))) {
- if ((OF_getprop(display, "broadcom,width",
- &cell, sizeof(cell))) > 0)
- va_sc->width = (int)fdt32_to_cpu(cell);
+ if (sc->width == 0) {
+ if ((OF_getprop(display, "broadcom,width",
+ &cell, sizeof(cell))) > 0)
+ sc->width = (int)fdt32_to_cpu(cell);
+ }
- if ((OF_getprop(display, "broadcom,height",
- &cell, sizeof(cell))) > 0)
- va_sc->height = (int)fdt32_to_cpu(cell);
+ if (sc->height == 0) {
+ if ((OF_getprop(display, "broadcom,height",
+ &cell, sizeof(cell))) > 0)
+ sc->height = (int)fdt32_to_cpu(cell);
+ }
}
- if (va_sc->width == 0)
- va_sc->width = FB_WIDTH;
- if (va_sc->height == 0)
- va_sc->height = FB_HEIGHT;
-
- bcmfb_init(0, &va_sc->va, 0);
+ if (sc->width == 0)
+ sc->width = FB_WIDTH;
+ if (sc->height == 0)
+ sc->height = FB_HEIGHT;
- va_sc->initialized = 1;
+ bcmfb_init(0, &sc->va, 0);
+ sc->initialized = 1;
return (0);
}
@@ -641,20 +496,19 @@ bcmfb_probe(int unit, video_adapter_t **adp, void *arg, int flags)
static int
bcmfb_init(int unit, video_adapter_t *adp, int flags)
{
- struct video_adapter_softc *sc;
+ struct bcmsc_softc *sc;
video_info_t *vi;
- sc = (struct video_adapter_softc *)adp;
+ sc = (struct bcmsc_softc *)adp;
vi = &adp->va_info;
vid_init_struct(adp, "bcmfb", -1, unit);
sc->font = dflt_font_16;
vi->vi_cheight = BCMFB_FONT_HEIGHT;
- vi->vi_cwidth = 8;
-
- vi->vi_width = sc->width/8;
- vi->vi_height = sc->height/vi->vi_cheight;
+ vi->vi_cwidth = BCMFB_FONT_WIDTH;
+ vi->vi_width = sc->width / vi->vi_cwidth;
+ vi->vi_height = sc->height / vi->vi_cheight;
/*
* Clamp width/height to syscons maximums
@@ -665,8 +519,7 @@ bcmfb_init(int unit, video_adapter_t *adp, int flags)
vi->vi_height = ROW;
sc->xmargin = (sc->width - (vi->vi_width * vi->vi_cwidth)) / 2;
- sc->ymargin = (sc->height - (vi->vi_height * vi->vi_cheight))/2;
-
+ sc->ymargin = (sc->height - (vi->vi_height * vi->vi_cheight)) / 2;
adp->va_window = (vm_offset_t) bcmfb_static_window;
adp->va_flags |= V_ADP_FONT /* | V_ADP_COLOR | V_ADP_MODECHANGE */;
@@ -706,8 +559,9 @@ static int
bcmfb_load_font(video_adapter_t *adp, int page, int size, int width,
u_char *data, int c, int count)
{
- struct video_adapter_softc *sc = (struct video_adapter_softc *)adp;
+ struct bcmsc_softc *sc;
+ sc = (struct bcmsc_softc *)adp;
sc->font = data;
return (0);
@@ -780,9 +634,9 @@ static int
bcmfb_blank_display(video_adapter_t *adp, int mode)
{
- struct video_adapter_softc *sc;
+ struct bcmsc_softc *sc;
- sc = (struct video_adapter_softc *)adp;
+ sc = (struct bcmsc_softc *)adp;
if (sc && sc->fb_addr)
memset((void*)sc->fb_addr, 0, sc->fb_size);
@@ -793,9 +647,9 @@ static int
bcmfb_mmap(video_adapter_t *adp, vm_ooffset_t offset, vm_paddr_t *paddr,
int prot, vm_memattr_t *memattr)
{
- struct video_adapter_softc *sc;
+ struct bcmsc_softc *sc;
- sc = (struct video_adapter_softc *)adp;
+ sc = (struct bcmsc_softc *)adp;
/*
* This might be a legacy VGA mem request: if so, just point it at the
@@ -812,10 +666,10 @@ bcmfb_mmap(video_adapter_t *adp, vm_ooffset_t offset, vm_paddr_t *paddr,
static int
bcmfb_ioctl(video_adapter_t *adp, u_long cmd, caddr_t data)
{
- struct video_adapter_softc *sc;
+ struct bcmsc_softc *sc;
struct fbtype *fb;
- sc = (struct video_adapter_softc *)adp;
+ sc = (struct bcmsc_softc *)adp;
switch (cmd) {
case FBIOGTYPE:
@@ -897,16 +751,13 @@ bcmfb_putp(video_adapter_t *adp, vm_offset_t off, uint32_t p, uint32_t a,
static int
bcmfb_putc(video_adapter_t *adp, vm_offset_t off, uint8_t c, uint8_t a)
{
- struct video_adapter_softc *sc;
- int row;
- int col;
- int i, j, k;
- uint8_t *addr;
+ int bytes, col, i, j, k, row;
+ struct bcmsc_softc *sc;
u_char *p;
- uint8_t fg, bg, color;
+ uint8_t *addr, fg, bg, color;
uint16_t rgb;
- sc = (struct video_adapter_softc *)adp;
+ sc = (struct bcmsc_softc *)adp;
if (sc->fb_addr == 0)
return (0);
@@ -921,6 +772,7 @@ bcmfb_putc(video_adapter_t *adp, vm_offset_t off, uint8_t c, uint8_t a)
fg = a & 0xf ;
bg = (a >> 4) & 0xf;
+ bytes = sc->depth / 8;
for (i = 0; i < BCMFB_FONT_HEIGHT; i++) {
for (j = 0, k = 7; j < 8; j++, k--) {
if ((p[i] & (1 << k)) == 0)
@@ -930,22 +782,32 @@ bcmfb_putc(video_adapter_t *adp, vm_offset_t off, uint8_t c, uint8_t a)
switch (sc->depth) {
case 32:
- addr[4*j+0] = bcmfb_palette[color].r;
- addr[4*j+1] = bcmfb_palette[color].g;
- addr[4*j+2] = bcmfb_palette[color].b;
- addr[4*j+3] = bcmfb_palette[color].a;
- break;
case 24:
- addr[3*j] = bcmfb_palette[color].r;
- addr[3*j+1] = bcmfb_palette[color].g;
- addr[3*j+2] = bcmfb_palette[color].b;
+ if (sc->fbswap) {
+ addr[bytes * j + 0] =
+ bcmfb_palette[color].b;
+ addr[bytes * j + 1] =
+ bcmfb_palette[color].g;
+ addr[bytes * j + 2] =
+ bcmfb_palette[color].r;
+ } else {
+ addr[bytes * j + 0] =
+ bcmfb_palette[color].r;
+ addr[bytes * j + 1] =
+ bcmfb_palette[color].g;
+ addr[bytes * j + 2] =
+ bcmfb_palette[color].b;
+ }
+ if (sc->depth == 32)
+ addr[bytes * j + 3] =
+ bcmfb_palette[color].a;
break;
case 16:
rgb = (bcmfb_palette[color].r >> 3) << 11;
rgb |= (bcmfb_palette[color].g >> 2) << 5;
rgb |= (bcmfb_palette[color].b >> 3);
- addr[2*j] = rgb & 0xff;
- addr[2*j + 1] = (rgb >> 8) & 0xff;
+ addr[bytes * j] = rgb & 0xff;
+ addr[bytes * j + 1] = (rgb >> 8) & 0xff;
default:
/* Not supported yet */
break;
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_fbd.c b/sys/arm/broadcom/bcm2835/bcm2835_fbd.c
index b3b0dd3..34a7af8 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_fbd.c
+++ b/sys/arm/broadcom/bcm2835/bcm2835_fbd.c
@@ -35,30 +35,13 @@ __FBSDID("$FreeBSD$");
#include <sys/systm.h>
#include <sys/bio.h>
#include <sys/bus.h>
-#include <sys/conf.h>
-#include <sys/endian.h>
+#include <sys/fbio.h>
#include <sys/kernel.h>
-#include <sys/kthread.h>
-#include <sys/lock.h>
#include <sys/malloc.h>
#include <sys/module.h>
-#include <sys/mutex.h>
-#include <sys/queue.h>
-#include <sys/resource.h>
-#include <sys/rman.h>
-#include <sys/time.h>
-#include <sys/timetc.h>
-#include <sys/fbio.h>
-#include <sys/consio.h>
-
-#include <sys/kdb.h>
-#include <machine/bus.h>
-#include <machine/cpu.h>
-#include <machine/cpufunc.h>
-#include <machine/fdt.h>
-#include <machine/resource.h>
-#include <machine/intr.h>
+#include <vm/vm.h>
+#include <vm/pmap.h>
#include <dev/fdt/fdt_common.h>
#include <dev/ofw/ofw_bus.h>
@@ -66,136 +49,21 @@ __FBSDID("$FreeBSD$");
#include <dev/fb/fbreg.h>
#include <dev/vt/vt.h>
+#include <dev/vt/colors/vt_termcolors.h>
-#include <arm/broadcom/bcm2835/bcm2835_mbox.h>
-#include <arm/broadcom/bcm2835/bcm2835_vcbus.h>
+#include <arm/broadcom/bcm2835/bcm2835_mbox_prop.h>
#include "fb_if.h"
#include "mbox_if.h"
-#define FB_WIDTH 640
-#define FB_HEIGHT 480
-#define FB_DEPTH 24
-
-struct bcm_fb_config {
- uint32_t xres;
- uint32_t yres;
- uint32_t vxres;
- uint32_t vyres;
- uint32_t pitch;
- uint32_t bpp;
- uint32_t xoffset;
- uint32_t yoffset;
- /* Filled by videocore */
- uint32_t base;
- uint32_t screen_size;
-};
+#define FB_DEPTH 24
struct bcmsc_softc {
- device_t dev;
struct fb_info *info;
- bus_dma_tag_t dma_tag;
- bus_dmamap_t dma_map;
- struct bcm_fb_config* fb_config;
- bus_addr_t fb_config_phys;
- struct intr_config_hook init_hook;
};
static int bcm_fb_probe(device_t);
static int bcm_fb_attach(device_t);
-static void bcm_fb_dmamap_cb(void *arg, bus_dma_segment_t *segs, int nseg,
- int err);
-
-static void
-bcm_fb_init(void *arg)
-{
- volatile struct bcm_fb_config *fb_config;
- struct bcmsc_softc *sc;
- struct fb_info *info;
- phandle_t node;
- pcell_t cell;
- device_t mbox;
- device_t fbd;
- int err = 0;
-
- sc = arg;
- fb_config = sc->fb_config;
- node = ofw_bus_get_node(sc->dev);
-
- fb_config->xres = 0;
- fb_config->yres = 0;
- fb_config->bpp = 0;
- fb_config->vxres = 0;
- fb_config->vyres = 0;
- fb_config->xoffset = 0;
- fb_config->yoffset = 0;
- fb_config->base = 0;
- fb_config->pitch = 0;
- fb_config->screen_size = 0;
-
- if ((OF_getprop(node, "broadcom,width", &cell, sizeof(cell))) > 0)
- fb_config->xres = (int)fdt32_to_cpu(cell);
- if (fb_config->xres == 0)
- fb_config->xres = FB_WIDTH;
-
- if ((OF_getprop(node, "broadcom,height", &cell, sizeof(cell))) > 0)
- fb_config->yres = (uint32_t)fdt32_to_cpu(cell);
- if (fb_config->yres == 0)
- fb_config->yres = FB_HEIGHT;
-
- if ((OF_getprop(node, "broadcom,depth", &cell, sizeof(cell))) > 0)
- fb_config->bpp = (uint32_t)fdt32_to_cpu(cell);
- if (fb_config->bpp == 0)
- fb_config->bpp = FB_DEPTH;
-
- bus_dmamap_sync(sc->dma_tag, sc->dma_map,
- BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD);
-
- mbox = devclass_get_device(devclass_find("mbox"), 0);
- if (mbox) {
- MBOX_WRITE(mbox, BCM2835_MBOX_CHAN_FB, sc->fb_config_phys);
- MBOX_READ(mbox, BCM2835_MBOX_CHAN_FB, &err);
- }
- bus_dmamap_sync(sc->dma_tag, sc->dma_map,
- BUS_DMASYNC_POSTREAD);
-
- if (fb_config->base != 0) {
- device_printf(sc->dev, "%dx%d(%dx%d@%d,%d) %dbpp\n",
- fb_config->xres, fb_config->yres,
- fb_config->vxres, fb_config->vyres,
- fb_config->xoffset, fb_config->yoffset,
- fb_config->bpp);
-
- device_printf(sc->dev, "pitch %d, base 0x%08x, screen_size %d\n",
- fb_config->pitch, fb_config->base,
- fb_config->screen_size);
-
- info = malloc(sizeof(struct fb_info), M_DEVBUF,
- M_WAITOK | M_ZERO);
- info->fb_name = device_get_nameunit(sc->dev);
- info->fb_vbase = (intptr_t)pmap_mapdev(fb_config->base,
- fb_config->screen_size);
- info->fb_pbase = fb_config->base;
- info->fb_size = fb_config->screen_size;
- info->fb_bpp = info->fb_depth = fb_config->bpp;
- info->fb_stride = fb_config->pitch;
- info->fb_width = fb_config->xres;
- info->fb_height = fb_config->yres;
-
- sc->info = info;
-
- fbd = device_add_child(sc->dev, "fbd",
- device_get_unit(sc->dev));
- if (fbd == NULL)
- device_printf(sc->dev, "Failed to add fbd child\n");
- else if (device_probe_and_attach(fbd) != 0)
- device_printf(sc->dev, "Failed to attach fbd device\n");
- } else {
- device_printf(sc->dev, "Failed to set framebuffer info\n");
- }
-
- config_intrhook_disestablish(&sc->init_hook);
-}
static int
bcm_fb_probe(device_t dev)
@@ -211,66 +79,82 @@ bcm_fb_probe(device_t dev)
static int
bcm_fb_attach(device_t dev)
{
- struct bcmsc_softc *sc = device_get_softc(dev);
- int dma_size = sizeof(struct bcm_fb_config);
- int err;
-
- sc->dev = dev;
+ char bootargs[2048], *n, *p, *v;
+ device_t fbd;
+ int fbswap;
+ phandle_t chosen;
+ struct bcm2835_fb_config fb;
+ struct bcmsc_softc *sc;
+ struct fb_info *info;
- err = bus_dma_tag_create(
- bus_get_dma_tag(sc->dev),
- PAGE_SIZE, 0, /* alignment, boundary */
- BUS_SPACE_MAXADDR_32BIT, /* lowaddr */
- BUS_SPACE_MAXADDR, /* highaddr */
- NULL, NULL, /* filter, filterarg */
- dma_size, 1, /* maxsize, nsegments */
- dma_size, 0, /* maxsegsize, flags */
- NULL, NULL, /* lockfunc, lockarg */
- &sc->dma_tag);
+ sc = device_get_softc(dev);
+ memset(&fb, 0, sizeof(fb));
+ if (bcm2835_mbox_fb_get_w_h(dev, &fb) != 0)
+ return (ENXIO);
+ fb.bpp = FB_DEPTH;
+ if (bcm2835_mbox_fb_init(dev, &fb) != 0)
+ return (ENXIO);
- err = bus_dmamem_alloc(sc->dma_tag, (void **)&sc->fb_config, 0,
- &sc->dma_map);
- if (err) {
- device_printf(dev, "cannot allocate framebuffer\n");
- goto fail;
+ info = malloc(sizeof(struct fb_info), M_DEVBUF, M_WAITOK | M_ZERO);
+ info->fb_name = device_get_nameunit(dev);
+ info->fb_vbase = (intptr_t)pmap_mapdev(fb.base, fb.size);
+ info->fb_pbase = fb.base;
+ info->fb_size = fb.size;
+ info->fb_bpp = info->fb_depth = fb.bpp;
+ info->fb_stride = fb.pitch;
+ info->fb_width = fb.xres;
+ info->fb_height = fb.yres;
+ sc->info = info;
+
+ /* Newer firmware versions needs an inverted color palette. */
+ fbswap = 0;
+ chosen = OF_finddevice("/chosen");
+ if (chosen != 0 &&
+ OF_getprop(chosen, "bootargs", &bootargs, sizeof(bootargs)) > 0) {
+ p = bootargs;
+ while ((v = strsep(&p, " ")) != NULL) {
+ if (*v == '\0')
+ continue;
+ n = strsep(&v, "=");
+ if (strcmp(n, "bcm2708_fb.fbswap") == 0 && v != NULL)
+ if (*v == '1')
+ fbswap = 1;
+ }
+ }
+ if (fbswap) {
+ switch (info->fb_bpp) {
+ case 24:
+ vt_generate_cons_palette(info->fb_cmap,
+ COLOR_FORMAT_RGB, 0xff, 0, 0xff, 8, 0xff, 16);
+ info->fb_cmsize = 16;
+ break;
+ case 32:
+ vt_generate_cons_palette(info->fb_cmap,
+ COLOR_FORMAT_RGB, 0xff, 16, 0xff, 8, 0xff, 0);
+ info->fb_cmsize = 16;
+ break;
+ }
}
- err = bus_dmamap_load(sc->dma_tag, sc->dma_map, sc->fb_config,
- dma_size, bcm_fb_dmamap_cb, &sc->fb_config_phys, BUS_DMA_NOWAIT);
-
- if (err) {
- device_printf(dev, "cannot load DMA map\n");
- goto fail;
+ fbd = device_add_child(dev, "fbd", device_get_unit(dev));
+ if (fbd == NULL) {
+ device_printf(dev, "Failed to add fbd child\n");
+ free(info, M_DEVBUF);
+ return (ENXIO);
+ } else if (device_probe_and_attach(fbd) != 0) {
+ device_printf(dev, "Failed to attach fbd device\n");
+ device_delete_child(dev, fbd);
+ free(info, M_DEVBUF);
+ return (ENXIO);
}
- /*
- * We have to wait until interrupts are enabled.
- * Mailbox relies on it to get data from VideoCore
- */
- sc->init_hook.ich_func = bcm_fb_init;
- sc->init_hook.ich_arg = sc;
-
- if (config_intrhook_establish(&sc->init_hook) != 0) {
- device_printf(dev, "failed to establish intrhook\n");
- return (ENOMEM);
- }
+ device_printf(dev, "%dx%d(%dx%d@%d,%d) %dbpp\n", fb.xres, fb.yres,
+ fb.vxres, fb.vyres, fb.xoffset, fb.yoffset, fb.bpp);
+ device_printf(dev,
+ "fbswap: %d, pitch %d, base 0x%08x, screen_size %d\n",
+ fbswap, fb.pitch, fb.base, fb.size);
return (0);
-
-fail:
- return (ENXIO);
-}
-
-static void
-bcm_fb_dmamap_cb(void *arg, bus_dma_segment_t *segs, int nseg, int err)
-{
- bus_addr_t *addr;
-
- if (err)
- return;
-
- addr = (bus_addr_t*)arg;
- *addr = PHYS_TO_VCBUS(segs[0].ds_addr);
}
static struct fb_info *
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_mbox.c b/sys/arm/broadcom/bcm2835/bcm2835_mbox.c
index 2ab7ebf..5940ad6 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_mbox.c
+++ b/sys/arm/broadcom/bcm2835/bcm2835_mbox.c
@@ -306,8 +306,7 @@ bcm2835_mbox_init_dma(device_t dev, size_t len, bus_dma_tag_t *tag,
return (NULL);
}
- err = bus_dmamap_load(*tag, *map, buf,
- sizeof(struct msg_set_power_state), bcm2835_mbox_dma_cb,
+ err = bus_dmamap_load(*tag, *map, buf, len, bcm2835_mbox_dma_cb,
phys, 0);
if (err != 0) {
bus_dmamem_free(*tag, buf, *map);
@@ -319,6 +318,47 @@ bcm2835_mbox_init_dma(device_t dev, size_t len, bus_dma_tag_t *tag,
return (buf);
}
+static int
+bcm2835_mbox_err(device_t dev, bus_addr_t msg_phys, uint32_t resp_phys,
+ struct bcm2835_mbox_hdr *msg, size_t len)
+{
+ int idx;
+ struct bcm2835_mbox_tag_hdr *tag;
+ uint8_t *last;
+
+ if ((uint32_t)msg_phys != resp_phys) {
+ device_printf(dev, "response channel mismatch\n");
+ return (EIO);
+ }
+ if (msg->code != BCM2835_MBOX_CODE_RESP_SUCCESS) {
+ device_printf(dev, "mbox response error\n");
+ return (EIO);
+ }
+
+ /* Loop until the end tag. */
+ tag = (struct bcm2835_mbox_tag_hdr *)(msg + 1);
+ last = (uint8_t *)msg + len;
+ for (idx = 0; tag->tag != 0; idx++) {
+ if ((tag->val_len & BCM2835_MBOX_TAG_VAL_LEN_RESPONSE) == 0) {
+ device_printf(dev, "tag %d response error\n", idx);
+ return (EIO);
+ }
+ /* Clear the response bit. */
+ tag->val_len &= ~BCM2835_MBOX_TAG_VAL_LEN_RESPONSE;
+
+ /* Next tag. */
+ tag = (struct bcm2835_mbox_tag_hdr *)((uint8_t *)tag +
+ sizeof(*tag) + tag->val_buf_size);
+
+ if ((uint8_t *)tag > last) {
+ device_printf(dev, "mbox buffer size error\n");
+ return (EIO);
+ }
+ }
+
+ return (0);
+}
+
int
bcm2835_mbox_set_power_state(device_t dev, uint32_t device_id, boolean_t on)
{
@@ -414,3 +454,136 @@ bcm2835_mbox_get_clock_rate(device_t dev, uint32_t clock_id, uint32_t *hz)
return (0);
}
+
+int
+bcm2835_mbox_fb_get_w_h(device_t dev, struct bcm2835_fb_config *fb)
+{
+ device_t mbox;
+ int err;
+ bus_dma_tag_t msg_tag;
+ bus_dmamap_t msg_map;
+ bus_addr_t msg_phys;
+ struct msg_fb_get_w_h *msg;
+ uint32_t reg;
+
+ /* get mbox device */
+ mbox = devclass_get_device(devclass_find("mbox"), 0);
+ if (mbox == NULL) {
+ device_printf(dev, "can't find mbox\n");
+ return (ENXIO);
+ }
+
+ /* Allocate memory for the message */
+ msg = bcm2835_mbox_init_dma(dev, sizeof(*msg), &msg_tag, &msg_map,
+ &msg_phys);
+ if (msg == NULL)
+ return (ENOMEM);
+
+ memset(msg, 0, sizeof(*msg));
+ msg->hdr.buf_size = sizeof(*msg);
+ msg->hdr.code = BCM2835_MBOX_CODE_REQ;
+ BCM2835_MBOX_INIT_TAG(&msg->physical_w_h, GET_PHYSICAL_W_H);
+ msg->physical_w_h.tag_hdr.val_len = 0;
+ BCM2835_MBOX_INIT_TAG(&msg->virtual_w_h, GET_VIRTUAL_W_H);
+ msg->virtual_w_h.tag_hdr.val_len = 0;
+ BCM2835_MBOX_INIT_TAG(&msg->offset, GET_VIRTUAL_OFFSET);
+ msg->offset.tag_hdr.val_len = 0;
+ msg->end_tag = 0;
+
+ bus_dmamap_sync(msg_tag, msg_map, BUS_DMASYNC_PREWRITE);
+ MBOX_WRITE(mbox, BCM2835_MBOX_CHAN_PROP, (uint32_t)msg_phys);
+ bus_dmamap_sync(msg_tag, msg_map, BUS_DMASYNC_POSTWRITE);
+
+ bus_dmamap_sync(msg_tag, msg_map, BUS_DMASYNC_PREREAD);
+ MBOX_READ(mbox, BCM2835_MBOX_CHAN_PROP, &reg);
+ bus_dmamap_sync(msg_tag, msg_map, BUS_DMASYNC_POSTREAD);
+
+ err = bcm2835_mbox_err(dev, msg_phys, reg, &msg->hdr, sizeof(*msg));
+ if (err == 0) {
+ fb->xres = msg->physical_w_h.body.resp.width;
+ fb->yres = msg->physical_w_h.body.resp.height;
+ fb->vxres = msg->virtual_w_h.body.resp.width;
+ fb->vyres = msg->virtual_w_h.body.resp.height;
+ fb->xoffset = msg->offset.body.resp.x;
+ fb->yoffset = msg->offset.body.resp.y;
+ }
+
+ bus_dmamap_unload(msg_tag, msg_map);
+ bus_dmamem_free(msg_tag, msg, msg_map);
+ bus_dma_tag_destroy(msg_tag);
+
+ return (err);
+}
+
+int
+bcm2835_mbox_fb_init(device_t dev, struct bcm2835_fb_config *fb)
+{
+ device_t mbox;
+ int err;
+ bus_dma_tag_t msg_tag;
+ bus_dmamap_t msg_map;
+ bus_addr_t msg_phys;
+ struct msg_fb_setup *msg;
+ uint32_t reg;
+
+ /* get mbox device */
+ mbox = devclass_get_device(devclass_find("mbox"), 0);
+ if (mbox == NULL) {
+ device_printf(dev, "can't find mbox\n");
+ return (ENXIO);
+ }
+
+ /* Allocate memory for the message */
+ msg = bcm2835_mbox_init_dma(dev, sizeof(*msg), &msg_tag, &msg_map,
+ &msg_phys);
+ if (msg == NULL)
+ return (ENOMEM);
+
+ memset(msg, 0, sizeof(*msg));
+ msg->hdr.buf_size = sizeof(*msg);
+ msg->hdr.code = BCM2835_MBOX_CODE_REQ;
+ BCM2835_MBOX_INIT_TAG(&msg->physical_w_h, SET_PHYSICAL_W_H);
+ msg->physical_w_h.body.req.width = fb->xres;
+ msg->physical_w_h.body.req.height = fb->yres;
+ BCM2835_MBOX_INIT_TAG(&msg->virtual_w_h, SET_VIRTUAL_W_H);
+ msg->virtual_w_h.body.req.width = fb->vxres;
+ msg->virtual_w_h.body.req.height = fb->vyres;
+ BCM2835_MBOX_INIT_TAG(&msg->offset, GET_VIRTUAL_OFFSET);
+ msg->offset.body.req.x = fb->xoffset;
+ msg->offset.body.req.y = fb->yoffset;
+ BCM2835_MBOX_INIT_TAG(&msg->depth, SET_DEPTH);
+ msg->depth.body.req.bpp = fb->bpp;
+ BCM2835_MBOX_INIT_TAG(&msg->alpha, SET_ALPHA_MODE);
+ msg->alpha.body.req.alpha = BCM2835_MBOX_ALPHA_MODE_IGNORED;
+ BCM2835_MBOX_INIT_TAG(&msg->buffer, ALLOCATE_BUFFER);
+ msg->buffer.body.req.alignment = PAGE_SIZE;
+ BCM2835_MBOX_INIT_TAG(&msg->pitch, GET_PITCH);
+ msg->end_tag = 0;
+
+ bus_dmamap_sync(msg_tag, msg_map, BUS_DMASYNC_PREWRITE);
+ MBOX_WRITE(mbox, BCM2835_MBOX_CHAN_PROP, (uint32_t)msg_phys);
+ bus_dmamap_sync(msg_tag, msg_map, BUS_DMASYNC_POSTWRITE);
+
+ bus_dmamap_sync(msg_tag, msg_map, BUS_DMASYNC_PREREAD);
+ MBOX_READ(mbox, BCM2835_MBOX_CHAN_PROP, &reg);
+ bus_dmamap_sync(msg_tag, msg_map, BUS_DMASYNC_POSTREAD);
+
+ err = bcm2835_mbox_err(dev, msg_phys, reg, &msg->hdr, sizeof(*msg));
+ if (err == 0) {
+ fb->xres = msg->physical_w_h.body.resp.width;
+ fb->yres = msg->physical_w_h.body.resp.height;
+ fb->vxres = msg->virtual_w_h.body.resp.width;
+ fb->vyres = msg->virtual_w_h.body.resp.height;
+ fb->xoffset = msg->offset.body.resp.x;
+ fb->yoffset = msg->offset.body.resp.y;
+ fb->pitch = msg->pitch.body.resp.pitch;
+ fb->base = msg->buffer.body.resp.fb_address;
+ fb->size = msg->buffer.body.resp.fb_size;
+ }
+
+ bus_dmamap_unload(msg_tag, msg_map);
+ bus_dmamem_free(msg_tag, msg, msg_map);
+ bus_dma_tag_destroy(msg_tag);
+
+ return (err);
+}
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_mbox_prop.h b/sys/arm/broadcom/bcm2835/bcm2835_mbox_prop.h
index 76f2a16..a425f2a 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_mbox_prop.h
+++ b/sys/arm/broadcom/bcm2835/bcm2835_mbox_prop.h
@@ -52,6 +52,12 @@ struct bcm2835_mbox_tag_hdr {
uint32_t val_len;
};
+#define BCM2835_MBOX_INIT_TAG(tag_, tagid_) do { \
+ (tag_)->tag_hdr.tag = BCM2835_MBOX_TAG_##tagid_; \
+ (tag_)->tag_hdr.val_buf_size = sizeof((tag_)->body); \
+ (tag_)->tag_hdr.val_len = sizeof((tag_)->body.req); \
+} while (0)
+
#define BCM2835_MBOX_POWER_ID_EMMC 0x00000000
#define BCM2835_MBOX_POWER_ID_UART0 0x00000001
#define BCM2835_MBOX_POWER_ID_UART1 0x00000002
@@ -322,4 +328,151 @@ struct msg_get_max_temperature {
uint32_t end_tag;
};
+#define BCM2835_MBOX_TAG_GET_PHYSICAL_W_H 0x00040003
+#define BCM2835_MBOX_TAG_SET_PHYSICAL_W_H 0x00048003
+#define BCM2835_MBOX_TAG_GET_VIRTUAL_W_H 0x00040004
+#define BCM2835_MBOX_TAG_SET_VIRTUAL_W_H 0x00048004
+
+struct bcm2835_mbox_tag_fb_w_h {
+ struct bcm2835_mbox_tag_hdr tag_hdr;
+ union {
+ struct {
+ uint32_t width;
+ uint32_t height;
+ } req;
+ struct {
+ uint32_t width;
+ uint32_t height;
+ } resp;
+ } body;
+};
+
+#define BCM2835_MBOX_TAG_GET_DEPTH 0x00040005
+#define BCM2835_MBOX_TAG_SET_DEPTH 0x00048005
+
+struct bcm2835_mbox_tag_depth {
+ struct bcm2835_mbox_tag_hdr tag_hdr;
+ union {
+ struct {
+ uint32_t bpp;
+ } req;
+ struct {
+ uint32_t bpp;
+ } resp;
+ } body;
+};
+
+#define BCM2835_MBOX_TAG_GET_ALPHA_MODE 0x00040007
+#define BCM2835_MBOX_TAG_SET_ALPHA_MODE 0x00048007
+
+#define BCM2835_MBOX_ALPHA_MODE_0_OPAQUE 0
+#define BCM2835_MBOX_ALPHA_MODE_0_TRANSPARENT 1
+#define BCM2835_MBOX_ALPHA_MODE_IGNORED 2
+
+struct bcm2835_mbox_tag_alpha_mode {
+ struct bcm2835_mbox_tag_hdr tag_hdr;
+ union {
+ struct {
+ uint32_t alpha;
+ } req;
+ struct {
+ uint32_t alpha;
+ } resp;
+ } body;
+};
+
+#define BCM2835_MBOX_TAG_GET_VIRTUAL_OFFSET 0x00040009
+#define BCM2835_MBOX_TAG_SET_VIRTUAL_OFFSET 0x00048009
+
+struct bcm2835_mbox_tag_virtual_offset {
+ struct bcm2835_mbox_tag_hdr tag_hdr;
+ union {
+ struct {
+ uint32_t x;
+ uint32_t y;
+ } req;
+ struct {
+ uint32_t x;
+ uint32_t y;
+ } resp;
+ } body;
+};
+
+#define BCM2835_MBOX_TAG_GET_PITCH 0x00040008
+
+struct bcm2835_mbox_tag_pitch {
+ struct bcm2835_mbox_tag_hdr tag_hdr;
+ union {
+ struct {
+ } req;
+ struct {
+ uint32_t pitch;
+ } resp;
+ } body;
+};
+
+#define BCM2835_MBOX_TAG_ALLOCATE_BUFFER 0x00040001
+
+struct bcm2835_mbox_tag_allocate_buffer {
+ struct bcm2835_mbox_tag_hdr tag_hdr;
+ union {
+ struct {
+ uint32_t alignment;
+ } req;
+ struct {
+ uint32_t fb_address;
+ uint32_t fb_size;
+ } resp;
+ } body;
+};
+
+#define BCM2835_MBOX_TAG_RELEASE_BUFFER 0x00048001
+
+struct bcm2835_mbox_tag_release_buffer {
+ struct bcm2835_mbox_tag_hdr tag_hdr;
+ union {
+ struct {
+ } req;
+ struct {
+ } resp;
+ } body;
+};
+
+struct bcm2835_fb_config {
+ uint32_t xres;
+ uint32_t yres;
+ uint32_t vxres;
+ uint32_t vyres;
+ uint32_t xoffset;
+ uint32_t yoffset;
+ uint32_t bpp;
+ uint32_t pitch;
+ uint32_t base;
+ uint32_t size;
+};
+
+struct msg_fb_get_w_h {
+ struct bcm2835_mbox_hdr hdr;
+ struct bcm2835_mbox_tag_fb_w_h physical_w_h;
+ struct bcm2835_mbox_tag_fb_w_h virtual_w_h;
+ struct bcm2835_mbox_tag_virtual_offset offset;
+ uint32_t end_tag;
+};
+
+int bcm2835_mbox_fb_get_w_h(device_t, struct bcm2835_fb_config *);
+
+struct msg_fb_setup {
+ struct bcm2835_mbox_hdr hdr;
+ struct bcm2835_mbox_tag_fb_w_h physical_w_h;
+ struct bcm2835_mbox_tag_fb_w_h virtual_w_h;
+ struct bcm2835_mbox_tag_virtual_offset offset;
+ struct bcm2835_mbox_tag_depth depth;
+ struct bcm2835_mbox_tag_alpha_mode alpha;
+ struct bcm2835_mbox_tag_allocate_buffer buffer;
+ struct bcm2835_mbox_tag_pitch pitch;
+ uint32_t end_tag;
+};
+
+int bcm2835_mbox_fb_init(device_t, struct bcm2835_fb_config *);
+
#endif /* _BCM2835_MBOX_PROP_H_ */
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_sdhci.c b/sys/arm/broadcom/bcm2835/bcm2835_sdhci.c
index 19eeb71..1024a48 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_sdhci.c
+++ b/sys/arm/broadcom/bcm2835/bcm2835_sdhci.c
@@ -181,17 +181,16 @@ bcm_sdhci_attach(device_t dev)
if (err == 0) {
/* Convert to MHz */
default_freq /= 1000000;
- if (bootverbose)
- device_printf(dev, "default frequency: %dMHz\n",
- default_freq);
+ }
+ if (default_freq == 0) {
+ node = ofw_bus_get_node(sc->sc_dev);
+ if ((OF_getencprop(node, "clock-frequency", &cell,
+ sizeof(cell))) > 0)
+ default_freq = cell / 1000000;
}
if (default_freq == 0)
default_freq = BCM2835_DEFAULT_SDHCI_FREQ;
- node = ofw_bus_get_node(sc->sc_dev);
- if ((OF_getprop(node, "clock-frequency", &cell, sizeof(cell))) > 0)
- default_freq = fdt32_to_cpu(cell)/1000000;
-
if (bootverbose)
device_printf(dev, "SDHCI frequency: %dMHz\n", default_freq);
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_spi.c b/sys/arm/broadcom/bcm2835/bcm2835_spi.c
index c9f6d33..3692c67 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_spi.c
+++ b/sys/arm/broadcom/bcm2835/bcm2835_spi.c
@@ -43,7 +43,6 @@ __FBSDID("$FreeBSD$");
#include <machine/cpu.h>
#include <machine/cpufunc.h>
#include <machine/resource.h>
-#include <machine/fdt.h>
#include <machine/intr.h>
#include <dev/fdt/fdt_common.h>
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_systimer.c b/sys/arm/broadcom/bcm2835/bcm2835_systimer.c
index 5e73747..93bf676 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_systimer.c
+++ b/sys/arm/broadcom/bcm2835/bcm2835_systimer.c
@@ -48,7 +48,6 @@ __FBSDID("$FreeBSD$");
#include <dev/ofw/ofw_bus_subr.h>
#include <machine/bus.h>
-#include <machine/fdt.h>
#define BCM2835_NUM_TIMERS 4
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_wdog.c b/sys/arm/broadcom/bcm2835/bcm2835_wdog.c
index 58cb2c3..ca823f1 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_wdog.c
+++ b/sys/arm/broadcom/bcm2835/bcm2835_wdog.c
@@ -42,7 +42,6 @@ __FBSDID("$FreeBSD$");
#include <machine/bus.h>
#include <machine/cpufunc.h>
#include <machine/machdep.h>
-#include <machine/fdt.h>
#include <arm/broadcom/bcm2835/bcm2835_wdog.h>
diff --git a/sys/arm/broadcom/bcm2835/std.bcm2836 b/sys/arm/broadcom/bcm2835/std.bcm2836
index 874083f..bb112be 100644
--- a/sys/arm/broadcom/bcm2835/std.bcm2836
+++ b/sys/arm/broadcom/bcm2835/std.bcm2836
@@ -5,6 +5,8 @@ cpu CPU_CORTEXA
makeoptions CONF_CFLAGS="-march=armv7a"
options SOC_BCM2836
+options ARM_L2_PIPT
+
files "../broadcom/bcm2835/files.bcm2836"
files "../broadcom/bcm2835/files.bcm283x"
diff --git a/sys/arm/conf/AML8726 b/sys/arm/conf/AML8726
new file mode 100644
index 0000000..7272db4
--- /dev/null
+++ b/sys/arm/conf/AML8726
@@ -0,0 +1,143 @@
+#
+# Kernel configuration for Amlogic aml8726 boards.
+#
+# For more information on this file, please read the config(5) manual page,
+# and/or the handbook section on Kernel Configuration Files:
+#
+# http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig-config.html
+#
+# The handbook is also available locally in /usr/share/doc/handbook
+# if you've installed the doc distribution, otherwise always see the
+# FreeBSD World Wide Web server (http://www.FreeBSD.org/) for the
+# latest information.
+#
+# An exhaustive list of options and more detailed explanations of the
+# device lines is also present in the ../../conf/NOTES and NOTES files.
+# If you are in doubt as to the purpose or necessity of a line, check first
+# in NOTES.
+#
+# $FreeBSD$
+
+ident AML8726
+include "../amlogic/aml8726/std.aml8726"
+
+options HZ=100
+options SCHED_ULE # ULE scheduler
+options PREEMPTION # Enable kernel thread preemption
+options INET # InterNETworking
+options INET6 # IPv6 communications protocols
+options SCTP # Stream Control Transmission Protocol
+options FFS # Berkeley Fast Filesystem
+options SOFTUPDATES # Enable FFS soft updates support
+options UFS_ACL # Support for access control lists
+options UFS_DIRHASH # Improve performance on big directories
+options UFS_GJOURNAL # Enable gjournal-based UFS journaling
+options QUOTA # Enable disk quotas for UFS
+options NFSCL # Network Filesystem Client
+options NFSLOCKD # Network Lock Manager
+options NFS_ROOT # NFS usable as /, requires NFSCL
+options MSDOSFS # MSDOS Filesystem
+options CD9660 # ISO 9660 Filesystem
+options PROCFS # Process filesystem (requires PSEUDOFS)
+options PSEUDOFS # Pseudo-filesystem framework
+options TMPFS # Efficient memory filesystem
+options GEOM_PART_GPT # GUID Partition Tables
+options GEOM_PART_BSD # BSD partition scheme
+options GEOM_PART_MBR # MBR partition scheme
+options COMPAT_43 # Compatible with BSD 4.3 [KEEP THIS!]
+options SCSI_DELAY=5000 # Delay (in ms) before probing SCSI
+options KTRACE # ktrace(1) support
+options SYSVSHM # SYSV-style shared memory
+options SYSVMSG # SYSV-style message queues
+options SYSVSEM # SYSV-style semaphores
+options _KPOSIX_PRIORITY_SCHEDULING # POSIX P1003_1B real-time extensions
+options PRINTF_BUFR_SIZE=128 # Prevent printf output being interspersed.
+options KBD_INSTALL_CDEV # install a CDEV entry in /dev
+options FREEBSD_BOOT_LOADER # Process metadata passed from loader(8)
+options LINUX_BOOT_ABI
+options VFP # Enable floating point hardware support
+options SMP # Enable multiple cores
+
+# Debugging
+makeoptions DEBUG=-g # Build kernel with gdb(1) debug symbols
+options ALT_BREAK_TO_DEBUGGER
+#options VERBOSE_SYSINIT # Enable verbose sysinit messages
+options BOOTVERBOSE=1
+options KDB # Enable kernel debugger support
+# For minimum debugger support (stable branch) use:
+#options KDB_TRACE # Print a stack trace for a panic
+# For full debugger support use this instead:
+options DDB # Enable the kernel debugger
+options INVARIANTS # Enable calls of extra sanity checking
+options INVARIANT_SUPPORT # Extra sanity checks of internal structures, required by INVARIANTS
+options WITNESS # Enable checks to detect deadlocks and cycles
+options WITNESS_SKIPSPIN # Don't run witness on spinlocks for speed
+#options DIAGNOSTIC
+
+# NFS root from boopt/dhcp
+#options BOOTP
+#options BOOTP_NFSROOT
+#options BOOTP_COMPAT
+#options BOOTP_NFSV3
+#options BOOTP_WIRED_TO=axe0
+
+# MMC/SD/SDIO Card slot support
+device mmc # mmc/sd bus
+device mmcsd # mmc/sd flash cards
+
+# Boot device is 2nd slice on MMC/SD card
+options ROOTDEVNAME=\"ufs:mmcsd0s2\"
+
+# GPIO
+device gpio
+device gpioled
+
+# I2C support
+device iicbus
+device iicbb
+device iic
+
+# vt is the default console driver, resembling an SCO console
+device vt
+#device kbdmux
+
+# Serial (COM) ports
+device uart # Generic UART driver
+
+# Pseudo devices.
+device loop # Network loopback
+device random # Entropy device
+device ether # Ethernet support
+device pty # BSD-style compatibility pseudo ttys
+
+# The `bpf' device enables the Berkeley Packet Filter.
+# Be aware of the administrative consequences of enabling this!
+# Note that 'bpf' is required for DHCP.
+device bpf # Berkeley packet filter
+
+# USB support
+device usb # General USB code (mandatory for USB)
+device dwcotg # DWC OTG controller
+options USB_HOST_ALIGN=64 # Align usb buffers to cache line size.
+options USB_DEBUG
+#options USB_REQ_DEBUG
+#options USB_VERBOSE
+
+#device ukbd # USB keyboard
+#device ums # USB mouse
+
+device scbus # SCSI bus (required for ATA/SCSI)
+device da # Direct Access (disks)
+device umass # Disks/Mass storage - Requires scbus and da
+
+# Ethernet support
+device miibus # MII bus support
+
+# SoC Ethernet, requires miibus
+device dwc
+
+# USB Ethernet support, requires miibus
+device axe # ASIX Electronics USB Ethernet
+
+# Flattened Device Tree
+options FDT # Configure using FDT/DTB data
diff --git a/sys/arm/conf/CUBIEBOARD b/sys/arm/conf/CUBIEBOARD
index f137b5a..945f0ae 100644
--- a/sys/arm/conf/CUBIEBOARD
+++ b/sys/arm/conf/CUBIEBOARD
@@ -139,4 +139,4 @@ device miibus
options FDT # Configure using FDT/DTB data
options FDT_DTB_STATIC
makeoptions FDT_DTS_FILE=cubieboard.dts
-
+makeoptions MODULES_EXTRA=dtb/allwinner
diff --git a/sys/arm/conf/CUBIEBOARD2 b/sys/arm/conf/CUBIEBOARD2
index 0aefc5f..d370dda 100644
--- a/sys/arm/conf/CUBIEBOARD2
+++ b/sys/arm/conf/CUBIEBOARD2
@@ -140,4 +140,4 @@ device miibus
options FDT # Configure using FDT/DTB data
options FDT_DTB_STATIC
makeoptions FDT_DTS_FILE=cubieboard2.dts
-
+makeoptions MODULES_EXTRA=dtb/allwinner
diff --git a/sys/arm/conf/EFIKA_MX b/sys/arm/conf/EFIKA_MX
index 6ea9d8a..a4690f6 100644
--- a/sys/arm/conf/EFIKA_MX
+++ b/sys/arm/conf/EFIKA_MX
@@ -24,6 +24,8 @@ include "../freescale/imx/std.imx51"
makeoptions WITHOUT_MODULES="ahc"
+options SOC_IMX51
+
options SCHED_4BSD # 4BSD scheduler
options PREEMPTION # Enable kernel thread preemption
options INET # InterNETworking
diff --git a/sys/arm/conf/IMX53 b/sys/arm/conf/IMX53
index d627c25..9f78f30 100644
--- a/sys/arm/conf/IMX53
+++ b/sys/arm/conf/IMX53
@@ -22,6 +22,8 @@ ident IMX53
include "../freescale/imx/std.imx53"
+options SOC_IMX53
+
options SCHED_4BSD # 4BSD scheduler
options PREEMPTION # Enable kernel thread preemption
options INET # InterNETworking
diff --git a/sys/arm/conf/IMX6 b/sys/arm/conf/IMX6
index ada4eea..f1baf29 100644
--- a/sys/arm/conf/IMX6
+++ b/sys/arm/conf/IMX6
@@ -21,6 +21,8 @@
ident IMX6
include "../freescale/imx/std.imx6"
+options SOC_IMX6
+
options HZ=500 # Scheduling quantum is 2 milliseconds.
options SCHED_ULE # ULE scheduler
options PREEMPTION # Enable kernel thread preemption
diff --git a/sys/arm/conf/ODROIDC1 b/sys/arm/conf/ODROIDC1
index 7d70fa4..7bb7b56 100644
--- a/sys/arm/conf/ODROIDC1
+++ b/sys/arm/conf/ODROIDC1
@@ -1,7 +1,7 @@
# ODROIDC1 -- Custom configuration for the HardKernel ODROID-C1 SBC
#
-# For more information on this file, please read the handbook section on
-# Kernel Configuration Files:
+# For more information on this file, please read the config(5) manual page,
+# and/or the handbook section on Kernel Configuration Files:
#
# http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig-config.html
#
@@ -17,117 +17,10 @@
#
# $FreeBSD$
-ident ODROIDC1
-
-include "../amlogic/aml8726/std.odroidc1"
-
-options HZ=100
-options SCHED_ULE # ULE scheduler
-options PREEMPTION # Enable kernel thread preemption
-options INET # InterNETworking
-options INET6 # IPv6 communications protocols
-options FFS # Berkeley Fast Filesystem
-options SOFTUPDATES # Enable FFS soft updates support
-options UFS_ACL # Support for access control lists
-options UFS_DIRHASH # Improve performance on big directories
-options PROCFS # Process filesystem (requires PSEUDOFS)
-options PSEUDOFS # Pseudo-filesystem framework
-options GEOM_PART_BSD # BSD partition scheme
-options GEOM_PART_MBR # MBR partition scheme
-options SCSI_DELAY=5000 # Delay (in ms) before probing SCSI
-options KTRACE # ktrace(1) support
-options SYSVSHM # SYSV-style shared memory
-options SYSVMSG # SYSV-style message queues
-options SYSVSEM # SYSV-style semaphores
-options _KPOSIX_PRIORITY_SCHEDULING # Posix P1003_1B real-time extensions
-options PRINTF_BUFR_SIZE=128 # Prevent printf output being interspersed.
-options KBD_INSTALL_CDEV # install a CDEV entry in /dev
-options LINUX_BOOT_ABI
-options VFP # vfp/neon
-
-# Debugging
-makeoptions DEBUG=-g # Build kernel with gdb(1) debug symbols
-options ALT_BREAK_TO_DEBUGGER
-#options VERBOSE_SYSINIT # Enable verbose sysinit messages
-options BOOTVERBOSE=1
-options KDB
-options DDB # Enable the kernel debugger
-options INVARIANTS # Enable calls of extra sanity checking
-options INVARIANT_SUPPORT # Extra sanity checks of internal structures, required by INVARIANTS
-options WITNESS # Enable checks to detect deadlocks and cycles
-options WITNESS_SKIPSPIN # Don't run witness on spinlocks for speed
-#options DIAGNOSTIC
-
-# NFS support
-#options NFSCL # New Network Filesystem Client
-#options NFSLOCKD # Network Lock Manager
-#options NFS_ROOT # NFS usable as /, requires NFSCL
-
-# NFS root from boopt/dhcp
-#options BOOTP
-#options BOOTP_NFSROOT
-#options BOOTP_COMPAT
-#options BOOTP_NFSV3
-#options BOOTP_WIRED_TO=axe0
-
-# MMC/SD/SDIO card slot support
-device mmc # mmc/sd bus
-device mmcsd # mmc/sd flash cards
-
-# Boot device is 2nd slice on MMC/SD card
-options ROOTDEVNAME=\"ufs:mmcsd0s2\"
-
-# GPIO
-device gpio
-device gpioled
-
-# I2C support
-device iicbus
-device iicbb
-device iic
+#NO_UNIVERSE
-# vt is the default console driver, resembling an SCO console
-device vt
-#device kbdmux
-
-# Serial (COM) ports
-device uart # Generic UART driver
-
-# Pseudo devices.
-device loop # Network loopback
-device random # Entropy device
-device ether # Ethernet support
-device pty # BSD-style compatibility pseudo ttys
-
-# The `bpf' device enables the Berkeley Packet Filter.
-# Be aware of the administrative consequences of enabling this!
-# Note that 'bpf' is required for DHCP.
-device bpf # Berkeley packet filter
-
-# USB support
-device usb # General USB code (mandatory for USB)
-device dwcotg # DWC OTG controller
-options USB_HOST_ALIGN=64 # Cacheline size is 64
-options USB_DEBUG
-#options USB_REQ_DEBUG
-#options USB_VERBOSE
-
-#device ukbd # USB keyboard
-#device ums # USB mouse
-
-device scbus # SCSI bus (required for ATA/SCSI)
-device da # Direct Access (disks)
-device umass # Disks/Mass storage - Requires scbus and da
-
-# Ethernet support
-device miibus # MII bus support
-
-# SoC Ethernet, requires miibus
-device dwc
-
-# USB Ethernet, requires miibus
-device axe # ASIX Electronics USB Ethernet
+include "AML8726"
+ident ODROIDC1
-# Flattened Device Tree
-options FDT
-options FDT_DTB_STATIC
+options FDT_DTB_STATIC
+makeoptions FDT_DTS_FILE=odroidc1.dts
diff --git a/sys/arm/conf/RK3188 b/sys/arm/conf/RK3188
index 2aba68e..64065d3 100644
--- a/sys/arm/conf/RK3188
+++ b/sys/arm/conf/RK3188
@@ -72,8 +72,8 @@ options WITNESS # Enable checks to detect deadlocks and cycles
options WITNESS_SKIPSPIN # Don't run witness on spinlocks for speed
options DIAGNOSTIC
-# Boot device is 2nd slice on USB
-options ROOTDEVNAME=\"ufs:/dev/da0s2\"
+# Root mount from MMC/SD card
+options ROOTDEVNAME=\"ufs:/dev/mmcsd0\"
# MMC/SD/SDIO Card slot support
device mmc # mmc/sd bus
diff --git a/sys/arm/conf/RPI2 b/sys/arm/conf/RPI2
index 02f3869..5383601 100644
--- a/sys/arm/conf/RPI2
+++ b/sys/arm/conf/RPI2
@@ -1,5 +1,5 @@
#
-# RPI-B -- Custom configuration for the Raspberry Pi
+# RPI2 -- Custom configuration for the Raspberry Pi 2
#
# For more information on this file, please read the config(5) manual page,
# and/or the handbook section on Kernel Configuration Files:
@@ -18,7 +18,7 @@
#
# $FreeBSD$
-ident RPI-B
+ident RPI2
include "../broadcom/bcm2835/std.rpi"
include "../broadcom/bcm2835/std.bcm2836"
@@ -137,6 +137,6 @@ device bcm2835_spi
options FDT # Configure using FDT/DTB data
# Note: DTB is normally loaded and modified by RPi boot loader, then
# handed to kernel via U-Boot and ubldr.
-options FDT_DTB_STATIC
-makeoptions FDT_DTS_FILE=rpi2.dts
+#options FDT_DTB_STATIC
+#makeoptions FDT_DTS_FILE=rpi2.dts
makeoptions MODULES_EXTRA=dtb/rpi
diff --git a/sys/arm/conf/VIRT b/sys/arm/conf/VIRT
new file mode 100644
index 0000000..c4f9405
--- /dev/null
+++ b/sys/arm/conf/VIRT
@@ -0,0 +1,97 @@
+#
+# VIRT -- Custom configuration for the qemu virt platform
+#
+# For more information on this file, please read the config(5) manual page,
+# and/or the handbook section on Kernel Configuration Files:
+#
+# http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig-config.html
+#
+# The handbook is also available locally in /usr/share/doc/handbook
+# if you've installed the doc distribution, otherwise always see the
+# FreeBSD World Wide Web server (http://www.FreeBSD.org/) for the
+# latest information.
+#
+# An exhaustive list of options and more detailed explanations of the
+# device lines is also present in the ../../conf/NOTES and NOTES files.
+# If you are in doubt as to the purpose or necessity of a line, check first
+# in NOTES.
+#
+# $FreeBSD$
+
+ident VIRT
+
+include "../qemu/std.virt"
+
+options HZ=100
+options SCHED_4BSD # 4BSD scheduler
+options PREEMPTION # Enable kernel thread preemption
+options INET # InterNETworking
+options INET6 # IPv6 communications protocols
+options SCTP # Stream Control Transmission Protocol
+options FFS # Berkeley Fast Filesystem
+options SOFTUPDATES # Enable FFS soft updates support
+options UFS_ACL # Support for access control lists
+options UFS_DIRHASH # Improve performance on big directories
+options UFS_GJOURNAL # Enable gjournal-based UFS journaling
+options QUOTA # Enable disk quotas for UFS
+options NFSCL # Network Filesystem Client
+options NFSLOCKD # Network Lock Manager
+options NFS_ROOT # NFS usable as /, requires NFSCL
+options MSDOSFS # MSDOS Filesystem
+options CD9660 # ISO 9660 Filesystem
+options PROCFS # Process filesystem (requires PSEUDOFS)
+options PSEUDOFS # Pseudo-filesystem framework
+options TMPFS # Efficient memory filesystem
+options GEOM_PART_GPT # GUID Partition Tables
+options GEOM_PART_BSD # BSD partition scheme
+options GEOM_PART_MBR # MBR partition scheme
+options GEOM_LABEL # Provides labelization
+options COMPAT_43 # Compatible with BSD 4.3 [KEEP THIS!]
+options SCSI_DELAY=5000 # Delay (in ms) before probing SCSI
+options KTRACE # ktrace(1) support
+options SYSVSHM # SYSV-style shared memory
+options SYSVMSG # SYSV-style message queues
+options SYSVSEM # SYSV-style semaphores
+options _KPOSIX_PRIORITY_SCHEDULING # POSIX P1003_1B real-time extensions
+options KBD_INSTALL_CDEV # install a CDEV entry in /dev
+options PLATFORM
+options FREEBSD_BOOT_LOADER # Process metadata passed from loader(8)
+options VFP # Enable floating point hardware support
+options ARM_NEW_PMAP # Enable the new v6 pmap
+
+# Debugging for use in -current
+makeoptions DEBUG=-g # Build kernel with gdb(1) debug symbols
+options BREAK_TO_DEBUGGER
+options ALT_BREAK_TO_DEBUGGER
+#options VERBOSE_SYSINIT # Enable verbose sysinit messages
+options KDB # Enable kernel debugger support
+# For minimum debugger support (stable branch) use:
+#options KDB_TRACE # Print a stack trace for a panic
+# For full debugger support use this instead:
+options DDB # Enable the kernel debugger
+options INVARIANTS # Enable calls of extra sanity checking
+options INVARIANT_SUPPORT # Extra sanity checks of internal structures, required by INVARIANTS
+#options WITNESS # Enable checks to detect deadlocks and cycles
+#options WITNESS_SKIPSPIN # Don't run witness on spinlocks for speed
+#options DIAGNOSTIC
+
+device bpf
+device loop
+device ether
+device uart
+device pty
+device snp
+device pl011
+device psci
+
+device virtio
+device virtio_mmio
+device virtio_blk
+device vtnet
+
+device md
+device random # Entropy device
+
+# Flattened Device Tree
+options FDT # Configure using FDT/DTB data
+
diff --git a/sys/arm/conf/VSATV102 b/sys/arm/conf/VSATV102
index a3df9fa..b5de5f9 100644
--- a/sys/arm/conf/VSATV102
+++ b/sys/arm/conf/VSATV102
@@ -1,7 +1,7 @@
# VSATV102 -- Custom configuration for the Visson ATV-102 media player
#
-# For more information on this file, please read the handbook section on
-# Kernel Configuration Files:
+# For more information on this file, please read the config(5) manual page,
+# and/or the handbook section on Kernel Configuration Files:
#
# http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig-config.html
#
@@ -17,117 +17,10 @@
#
# $FreeBSD$
-ident VSATV102
-
-include "../amlogic/aml8726/std.vsatv102-m6"
-
-options HZ=100
-options SCHED_ULE # ULE scheduler
-options PREEMPTION # Enable kernel thread preemption
-options INET # InterNETworking
-options INET6 # IPv6 communications protocols
-options FFS # Berkeley Fast Filesystem
-options SOFTUPDATES # Enable FFS soft updates support
-options UFS_ACL # Support for access control lists
-options UFS_DIRHASH # Improve performance on big directories
-options PROCFS # Process filesystem (requires PSEUDOFS)
-options PSEUDOFS # Pseudo-filesystem framework
-options GEOM_PART_BSD # BSD partition scheme
-options GEOM_PART_MBR # MBR partition scheme
-options SCSI_DELAY=5000 # Delay (in ms) before probing SCSI
-options KTRACE # ktrace(1) support
-options SYSVSHM # SYSV-style shared memory
-options SYSVMSG # SYSV-style message queues
-options SYSVSEM # SYSV-style semaphores
-options _KPOSIX_PRIORITY_SCHEDULING # Posix P1003_1B real-time extensions
-options PRINTF_BUFR_SIZE=128 # Prevent printf output being interspersed.
-options KBD_INSTALL_CDEV # install a CDEV entry in /dev
-options LINUX_BOOT_ABI
-options VFP # vfp/neon
-
-# Debugging
-makeoptions DEBUG=-g # Build kernel with gdb(1) debug symbols
-options ALT_BREAK_TO_DEBUGGER
-#options VERBOSE_SYSINIT # Enable verbose sysinit messages
-options BOOTVERBOSE=1
-options KDB
-options DDB # Enable the kernel debugger
-options INVARIANTS # Enable calls of extra sanity checking
-options INVARIANT_SUPPORT # Extra sanity checks of internal structures, required by INVARIANTS
-options WITNESS # Enable checks to detect deadlocks and cycles
-options WITNESS_SKIPSPIN # Don't run witness on spinlocks for speed
-#options DIAGNOSTIC
-
-# NFS support
-#options NFSCL # New Network Filesystem Client
-#options NFSLOCKD # Network Lock Manager
-#options NFS_ROOT # NFS usable as /, requires NFSCL
-
-# NFS root from boopt/dhcp
-#options BOOTP
-#options BOOTP_NFSROOT
-#options BOOTP_COMPAT
-#options BOOTP_NFSV3
-#options BOOTP_WIRED_TO=axe0
-
-# MMC/SD/SDIO card slot support
-device mmc # mmc/sd bus
-device mmcsd # mmc/sd flash cards
-
-# Boot device is 2nd slice on MMC/SD card
-options ROOTDEVNAME=\"ufs:mmcsd0s2\"
-
-# GPIO
-device gpio
-device gpioled
-
-# I2C support
-device iicbus
-device iicbb
-device iic
+#NO_UNIVERSE
-# vt is the default console driver, resembling an SCO console
-device vt
-#device kbdmux
-
-# Serial (COM) ports
-device uart # Generic UART driver
-
-# Pseudo devices.
-device loop # Network loopback
-device random # Entropy device
-device ether # Ethernet support
-device pty # BSD-style compatibility pseudo ttys
-
-# The `bpf' device enables the Berkeley Packet Filter.
-# Be aware of the administrative consequences of enabling this!
-# Note that 'bpf' is required for DHCP.
-device bpf # Berkeley packet filter
-
-# USB support
-device usb # General USB code (mandatory for USB)
-device dwcotg # DWC OTG controller
-options USB_HOST_ALIGN=64 # Cacheline size is 64
-options USB_DEBUG
-#options USB_REQ_DEBUG
-#options USB_VERBOSE
-
-#device ukbd # USB keyboard
-#device ums # USB mouse
-
-device scbus # SCSI bus (required for ATA/SCSI)
-device da # Direct Access (disks)
-device umass # Disks/Mass storage - Requires scbus and da
-
-# Ethernet support
-device miibus # MII bus support
-
-# SoC Ethernet, requires miibus
-device dwc
-
-# USB Ethernet, requires miibus
-device axe # ASIX Electronics USB Ethernet
+include "AML8726"
+ident VSATV102
-# Flattened Device Tree
-options FDT
-options FDT_DTB_STATIC
+options FDT_DTB_STATIC
+makeoptions FDT_DTS_FILE=vsatv102-m6.dts
diff --git a/sys/arm/freescale/imx/files.imx53 b/sys/arm/freescale/imx/files.imx5
index 6ca4ffd..58e925b 100644
--- a/sys/arm/freescale/imx/files.imx53
+++ b/sys/arm/freescale/imx/files.imx5
@@ -6,14 +6,15 @@ kern/kern_clocksource.c standard
# Init
arm/freescale/imx/imx_common.c standard
arm/freescale/imx/imx_machdep.c standard
-arm/freescale/imx/imx53_machdep.c standard
+arm/freescale/imx/imx51_machdep.c optional soc_imx51
+arm/freescale/imx/imx53_machdep.c optional soc_imx53
arm/arm/bus_space_base.c standard
# Special serial console for debuging early boot code
#arm/freescale/imx/console.c standard
# UART driver (includes serial console support)
-dev/uart/uart_dev_imx.c optional uart
+dev/uart/uart_dev_imx.c optional uart
# TrustZone Interrupt Controller
arm/freescale/imx/tzic.c standard
diff --git a/sys/arm/freescale/imx/files.imx51 b/sys/arm/freescale/imx/files.imx51
deleted file mode 100644
index b779ee2..0000000
--- a/sys/arm/freescale/imx/files.imx51
+++ /dev/null
@@ -1,49 +0,0 @@
-# $FreeBSD$
-arm/arm/bus_space_asm_generic.S standard
-arm/arm/bus_space_generic.c standard
-kern/kern_clocksource.c standard
-
-# Init
-arm/freescale/imx/imx_common.c standard
-arm/freescale/imx/imx_machdep.c standard
-arm/freescale/imx/imx51_machdep.c standard
-arm/arm/bus_space_base.c standard
-
-# Dummy serial console
-#arm/freescale/imx/console.c standard
-
-# TrustZone Interrupt Controller
-arm/freescale/imx/tzic.c standard
-
-# IOMUX - external pins multiplexor
-arm/freescale/imx/imx_iomux.c standard
-
-# GPIO
-arm/freescale/imx/imx_gpio.c optional gpio
-
-# Generic Periodic Timer
-arm/freescale/imx/imx_gpt.c standard
-
-# Clock Configuration Manager
-arm/freescale/imx/imx51_ccm.c standard
-
-# i.MX5xx PATA controller
-dev/ata/chipsets/ata-fsl.c optional imxata
-
-# UART driver
-dev/uart/uart_dev_imx.c optional uart
-
-# USB OH3 controller (1 OTG, 3 EHCI)
-arm/freescale/imx/imx_nop_usbphy.c optional ehci
-dev/usb/controller/ehci_imx.c optional ehci
-
-# Watchdog
-arm/freescale/imx/imx_wdog.c optional imxwdt
-
-# i2c
-arm/freescale/imx/imx_i2c.c optional fsliic
-
-# IPU - Image Processing Unit (frame buffer also)
-arm/freescale/imx/imx51_ipuv3.c optional sc
-arm/freescale/imx/imx51_ipuv3_fbd.c optional vt
-dev/vt/hw/fb/vt_early_fb.c optional vt
diff --git a/sys/arm/freescale/imx/imx51_ccm.c b/sys/arm/freescale/imx/imx51_ccm.c
index 8e099ce5..7a05d1e 100644
--- a/sys/arm/freescale/imx/imx51_ccm.c
+++ b/sys/arm/freescale/imx/imx51_ccm.c
@@ -78,7 +78,6 @@ __FBSDID("$FreeBSD$");
#include <dev/ofw/ofw_bus_subr.h>
#include <machine/bus.h>
-#include <machine/fdt.h>
#include <arm/freescale/imx/imx51_ccmvar.h>
#include <arm/freescale/imx/imx51_ccmreg.h>
diff --git a/sys/arm/freescale/imx/imx51_ipuv3.c b/sys/arm/freescale/imx/imx51_ipuv3.c
index 6c0a9eb..3da87a9 100644
--- a/sys/arm/freescale/imx/imx51_ipuv3.c
+++ b/sys/arm/freescale/imx/imx51_ipuv3.c
@@ -53,6 +53,9 @@ __FBSDID("$FreeBSD$");
#include <sys/kdb.h>
+#include <vm/vm.h>
+#include <vm/pmap.h>
+
#include <machine/bus.h>
#include <machine/cpu.h>
#include <machine/cpufunc.h>
diff --git a/sys/arm/freescale/imx/imx51_ipuv3_fbd.c b/sys/arm/freescale/imx/imx51_ipuv3_fbd.c
index 4828240..3852754 100644
--- a/sys/arm/freescale/imx/imx51_ipuv3_fbd.c
+++ b/sys/arm/freescale/imx/imx51_ipuv3_fbd.c
@@ -57,7 +57,6 @@ __FBSDID("$FreeBSD$");
#include <machine/bus.h>
#include <machine/cpu.h>
#include <machine/cpufunc.h>
-#include <machine/fdt.h>
#include <machine/resource.h>
#include <machine/frame.h>
#include <machine/intr.h>
diff --git a/sys/arm/freescale/imx/imx6_anatop.c b/sys/arm/freescale/imx/imx6_anatop.c
index 644ac7f..a384501 100644
--- a/sys/arm/freescale/imx/imx6_anatop.c
+++ b/sys/arm/freescale/imx/imx6_anatop.c
@@ -67,7 +67,6 @@ __FBSDID("$FreeBSD$");
#include <dev/ofw/ofw_bus_subr.h>
#include <machine/bus.h>
-#include <machine/fdt.h>
#include <arm/arm/mpcore_timervar.h>
#include <arm/freescale/fsl_ocotpreg.h>
diff --git a/sys/arm/freescale/imx/imx6_audmux.c b/sys/arm/freescale/imx/imx6_audmux.c
index 4ea2109..3b08a14 100644
--- a/sys/arm/freescale/imx/imx6_audmux.c
+++ b/sys/arm/freescale/imx/imx6_audmux.c
@@ -50,7 +50,6 @@ __FBSDID("$FreeBSD$");
#include <dev/ofw/ofw_bus_subr.h>
#include <machine/bus.h>
-#include <machine/fdt.h>
#include <machine/cpu.h>
#include <machine/intr.h>
diff --git a/sys/arm/freescale/imx/imx6_mp.c b/sys/arm/freescale/imx/imx6_mp.c
index afadee0..b02588c 100644
--- a/sys/arm/freescale/imx/imx6_mp.c
+++ b/sys/arm/freescale/imx/imx6_mp.c
@@ -34,6 +34,9 @@ __FBSDID("$FreeBSD$");
#include <sys/mutex.h>
#include <sys/smp.h>
+#include <vm/vm.h>
+#include <vm/pmap.h>
+
#include <machine/smp.h>
#include <machine/fdt.h>
#include <machine/intr.h>
diff --git a/sys/arm/freescale/imx/imx6_sdma.c b/sys/arm/freescale/imx/imx6_sdma.c
index 4a4c287..91d66af 100644
--- a/sys/arm/freescale/imx/imx6_sdma.c
+++ b/sys/arm/freescale/imx/imx6_sdma.c
@@ -55,7 +55,6 @@ __FBSDID("$FreeBSD$");
#include <dev/ofw/ofw_bus_subr.h>
#include <machine/bus.h>
-#include <machine/fdt.h>
#include <machine/cpu.h>
#include <machine/intr.h>
diff --git a/sys/arm/freescale/imx/imx6_ssi.c b/sys/arm/freescale/imx/imx6_ssi.c
index af8a9e8..184de2a 100644
--- a/sys/arm/freescale/imx/imx6_ssi.c
+++ b/sys/arm/freescale/imx/imx6_ssi.c
@@ -54,7 +54,6 @@ __FBSDID("$FreeBSD$");
#include <dev/ofw/ofw_bus_subr.h>
#include <machine/bus.h>
-#include <machine/fdt.h>
#include <machine/cpu.h>
#include <machine/intr.h>
diff --git a/sys/arm/freescale/imx/imx_common.c b/sys/arm/freescale/imx/imx_common.c
index 3b7139c..0fe7082 100644
--- a/sys/arm/freescale/imx/imx_common.c
+++ b/sys/arm/freescale/imx/imx_common.c
@@ -48,7 +48,6 @@ __FBSDID("$FreeBSD$");
#include <dev/ofw/openfirm.h>
#include <machine/bus.h>
-#include <machine/fdt.h>
#include <machine/vmparam.h>
struct fdt_fixup_entry fdt_fixup_table[] = {
diff --git a/sys/arm/freescale/imx/imx_gpt.c b/sys/arm/freescale/imx/imx_gpt.c
index 6f77963..8da0b2e 100644
--- a/sys/arm/freescale/imx/imx_gpt.c
+++ b/sys/arm/freescale/imx/imx_gpt.c
@@ -44,7 +44,6 @@ __FBSDID("$FreeBSD$");
#include <machine/cpu.h>
#include <machine/intr.h>
-#include <machine/fdt.h>
#include <dev/fdt/fdt_common.h>
#include <dev/ofw/openfirm.h>
#include <dev/ofw/ofw_bus.h>
diff --git a/sys/arm/freescale/imx/imx_iomux.c b/sys/arm/freescale/imx/imx_iomux.c
index d1ac6cb..c130b78 100644
--- a/sys/arm/freescale/imx/imx_iomux.c
+++ b/sys/arm/freescale/imx/imx_iomux.c
@@ -58,7 +58,6 @@
#include <sys/rman.h>
#include <machine/bus.h>
-#include <machine/fdt.h>
#include <dev/fdt/fdt_common.h>
#include <dev/fdt/fdt_pinctrl.h>
diff --git a/sys/arm/freescale/imx/imx_wdog.c b/sys/arm/freescale/imx/imx_wdog.c
index cadd1d7..9ac5826 100644
--- a/sys/arm/freescale/imx/imx_wdog.c
+++ b/sys/arm/freescale/imx/imx_wdog.c
@@ -47,7 +47,6 @@ __FBSDID("$FreeBSD$");
#include <dev/ofw/openfirm.h>
#include <dev/ofw/ofw_bus.h>
#include <dev/ofw/ofw_bus_subr.h>
-#include <machine/fdt.h>
#include <arm/freescale/imx/imx_wdogreg.h>
diff --git a/sys/arm/freescale/imx/std.imx51 b/sys/arm/freescale/imx/std.imx51
index fbc1349..eca33c2 100644
--- a/sys/arm/freescale/imx/std.imx51
+++ b/sys/arm/freescale/imx/std.imx51
@@ -13,5 +13,4 @@ options PHYSADDR=0x90000000
device fdt_pinctrl
-files "../freescale/imx/files.imx51"
-
+files "../freescale/imx/files.imx5"
diff --git a/sys/arm/freescale/imx/std.imx53 b/sys/arm/freescale/imx/std.imx53
index cbef21a..1da484c 100644
--- a/sys/arm/freescale/imx/std.imx53
+++ b/sys/arm/freescale/imx/std.imx53
@@ -13,5 +13,4 @@ options PHYSADDR=0x70000000
device fdt_pinctrl
-files "../freescale/imx/files.imx53"
-
+files "../freescale/imx/files.imx5"
diff --git a/sys/arm/freescale/vybrid/vf_adc.c b/sys/arm/freescale/vybrid/vf_adc.c
index f497ec0..0a806fb 100644
--- a/sys/arm/freescale/vybrid/vf_adc.c
+++ b/sys/arm/freescale/vybrid/vf_adc.c
@@ -48,7 +48,6 @@ __FBSDID("$FreeBSD$");
#include <dev/ofw/ofw_bus_subr.h>
#include <machine/bus.h>
-#include <machine/fdt.h>
#include <machine/cpu.h>
#include <machine/intr.h>
diff --git a/sys/arm/freescale/vybrid/vf_anadig.c b/sys/arm/freescale/vybrid/vf_anadig.c
index 77946d3..3a2cbc4 100644
--- a/sys/arm/freescale/vybrid/vf_anadig.c
+++ b/sys/arm/freescale/vybrid/vf_anadig.c
@@ -49,7 +49,6 @@ __FBSDID("$FreeBSD$");
#include <dev/ofw/ofw_bus_subr.h>
#include <machine/bus.h>
-#include <machine/fdt.h>
#include <machine/cpu.h>
#include <machine/intr.h>
diff --git a/sys/arm/freescale/vybrid/vf_ccm.c b/sys/arm/freescale/vybrid/vf_ccm.c
index 30df67a..8f8a3f0 100644
--- a/sys/arm/freescale/vybrid/vf_ccm.c
+++ b/sys/arm/freescale/vybrid/vf_ccm.c
@@ -49,7 +49,6 @@ __FBSDID("$FreeBSD$");
#include <dev/ofw/ofw_bus_subr.h>
#include <machine/bus.h>
-#include <machine/fdt.h>
#include <machine/cpu.h>
#include <machine/intr.h>
diff --git a/sys/arm/freescale/vybrid/vf_dcu4.c b/sys/arm/freescale/vybrid/vf_dcu4.c
index d2ddddc..34dea46 100644
--- a/sys/arm/freescale/vybrid/vf_dcu4.c
+++ b/sys/arm/freescale/vybrid/vf_dcu4.c
@@ -47,6 +47,9 @@ __FBSDID("$FreeBSD$");
#include <sys/eventhandler.h>
#include <sys/gpio.h>
+#include <vm/vm.h>
+#include <vm/pmap.h>
+
#include <dev/fdt/fdt_common.h>
#include <dev/ofw/openfirm.h>
#include <dev/ofw/ofw_bus.h>
diff --git a/sys/arm/freescale/vybrid/vf_dmamux.c b/sys/arm/freescale/vybrid/vf_dmamux.c
index 1909621..a887ffa 100644
--- a/sys/arm/freescale/vybrid/vf_dmamux.c
+++ b/sys/arm/freescale/vybrid/vf_dmamux.c
@@ -49,7 +49,6 @@ __FBSDID("$FreeBSD$");
#include <dev/ofw/ofw_bus_subr.h>
#include <machine/bus.h>
-#include <machine/fdt.h>
#include <machine/cpu.h>
#include <machine/intr.h>
diff --git a/sys/arm/freescale/vybrid/vf_edma.c b/sys/arm/freescale/vybrid/vf_edma.c
index c5df919..ed12072 100644
--- a/sys/arm/freescale/vybrid/vf_edma.c
+++ b/sys/arm/freescale/vybrid/vf_edma.c
@@ -49,7 +49,6 @@ __FBSDID("$FreeBSD$");
#include <dev/ofw/ofw_bus_subr.h>
#include <machine/bus.h>
-#include <machine/fdt.h>
#include <machine/cpu.h>
#include <machine/intr.h>
diff --git a/sys/arm/freescale/vybrid/vf_gpio.c b/sys/arm/freescale/vybrid/vf_gpio.c
index 4f458a1..0c1cf82 100644
--- a/sys/arm/freescale/vybrid/vf_gpio.c
+++ b/sys/arm/freescale/vybrid/vf_gpio.c
@@ -52,7 +52,6 @@ __FBSDID("$FreeBSD$");
#include <dev/ofw/ofw_bus_subr.h>
#include <machine/bus.h>
-#include <machine/fdt.h>
#include <machine/cpu.h>
#include <machine/intr.h>
diff --git a/sys/arm/freescale/vybrid/vf_i2c.c b/sys/arm/freescale/vybrid/vf_i2c.c
index 2eb6726..c554ce2 100644
--- a/sys/arm/freescale/vybrid/vf_i2c.c
+++ b/sys/arm/freescale/vybrid/vf_i2c.c
@@ -57,7 +57,6 @@ __FBSDID("$FreeBSD$");
#include <dev/ofw/ofw_bus_subr.h>
#include <machine/bus.h>
-#include <machine/fdt.h>
#include <machine/cpu.h>
#include <machine/intr.h>
diff --git a/sys/arm/freescale/vybrid/vf_iomuxc.c b/sys/arm/freescale/vybrid/vf_iomuxc.c
index 8d8f7fd..95711d6 100644
--- a/sys/arm/freescale/vybrid/vf_iomuxc.c
+++ b/sys/arm/freescale/vybrid/vf_iomuxc.c
@@ -49,7 +49,6 @@ __FBSDID("$FreeBSD$");
#include <dev/ofw/ofw_bus_subr.h>
#include <machine/bus.h>
-#include <machine/fdt.h>
#include <machine/cpu.h>
#include <machine/intr.h>
diff --git a/sys/arm/freescale/vybrid/vf_mscm.c b/sys/arm/freescale/vybrid/vf_mscm.c
index b07181e..02850e5 100644
--- a/sys/arm/freescale/vybrid/vf_mscm.c
+++ b/sys/arm/freescale/vybrid/vf_mscm.c
@@ -49,7 +49,6 @@ __FBSDID("$FreeBSD$");
#include <dev/ofw/ofw_bus_subr.h>
#include <machine/bus.h>
-#include <machine/fdt.h>
#include <machine/cpu.h>
#include <machine/intr.h>
diff --git a/sys/arm/freescale/vybrid/vf_nfc.c b/sys/arm/freescale/vybrid/vf_nfc.c
index 28db4c6..62b7782 100644
--- a/sys/arm/freescale/vybrid/vf_nfc.c
+++ b/sys/arm/freescale/vybrid/vf_nfc.c
@@ -51,7 +51,6 @@ __FBSDID("$FreeBSD$");
#include <dev/nand/nandbus.h>
#include <machine/bus.h>
-#include <machine/fdt.h>
#include "nfc_if.h"
diff --git a/sys/arm/freescale/vybrid/vf_port.c b/sys/arm/freescale/vybrid/vf_port.c
index 1cc83ed..943ca88 100644
--- a/sys/arm/freescale/vybrid/vf_port.c
+++ b/sys/arm/freescale/vybrid/vf_port.c
@@ -49,7 +49,6 @@ __FBSDID("$FreeBSD$");
#include <dev/ofw/ofw_bus_subr.h>
#include <machine/bus.h>
-#include <machine/fdt.h>
#include <machine/cpu.h>
#include <machine/intr.h>
diff --git a/sys/arm/freescale/vybrid/vf_sai.c b/sys/arm/freescale/vybrid/vf_sai.c
index 586055d..309d95e 100644
--- a/sys/arm/freescale/vybrid/vf_sai.c
+++ b/sys/arm/freescale/vybrid/vf_sai.c
@@ -53,7 +53,6 @@ __FBSDID("$FreeBSD$");
#include <dev/ofw/ofw_bus_subr.h>
#include <machine/bus.h>
-#include <machine/fdt.h>
#include <machine/cpu.h>
#include <machine/intr.h>
diff --git a/sys/arm/freescale/vybrid/vf_spi.c b/sys/arm/freescale/vybrid/vf_spi.c
index 222b96f..8fa466b 100644
--- a/sys/arm/freescale/vybrid/vf_spi.c
+++ b/sys/arm/freescale/vybrid/vf_spi.c
@@ -54,7 +54,6 @@ __FBSDID("$FreeBSD$");
#include <dev/ofw/ofw_bus_subr.h>
#include <machine/bus.h>
-#include <machine/fdt.h>
#include <machine/cpu.h>
#include <machine/intr.h>
diff --git a/sys/arm/freescale/vybrid/vf_src.c b/sys/arm/freescale/vybrid/vf_src.c
index ac9b23b..83d7e96 100644
--- a/sys/arm/freescale/vybrid/vf_src.c
+++ b/sys/arm/freescale/vybrid/vf_src.c
@@ -49,7 +49,6 @@ __FBSDID("$FreeBSD$");
#include <dev/ofw/ofw_bus_subr.h>
#include <machine/bus.h>
-#include <machine/fdt.h>
#include <machine/cpu.h>
#include <machine/intr.h>
diff --git a/sys/arm/freescale/vybrid/vf_tcon.c b/sys/arm/freescale/vybrid/vf_tcon.c
index 2cc4a6a..31f85b5 100644
--- a/sys/arm/freescale/vybrid/vf_tcon.c
+++ b/sys/arm/freescale/vybrid/vf_tcon.c
@@ -49,7 +49,6 @@ __FBSDID("$FreeBSD$");
#include <dev/ofw/ofw_bus_subr.h>
#include <machine/bus.h>
-#include <machine/fdt.h>
#include <machine/cpu.h>
#include <machine/intr.h>
diff --git a/sys/arm/freescale/vybrid/vf_uart.c b/sys/arm/freescale/vybrid/vf_uart.c
index da11871..312f18c 100644
--- a/sys/arm/freescale/vybrid/vf_uart.c
+++ b/sys/arm/freescale/vybrid/vf_uart.c
@@ -40,7 +40,6 @@ __FBSDID("$FreeBSD$");
#include <sys/conf.h>
#include <sys/kdb.h>
#include <machine/bus.h>
-#include <machine/fdt.h>
#include <dev/uart/uart.h>
#include <dev/uart/uart_cpu.h>
@@ -277,7 +276,8 @@ static struct uart_class uart_vybrid_class = {
sizeof(struct vf_uart_softc),
.uc_ops = &uart_vybrid_ops,
.uc_range = 0x100,
- .uc_rclk = 24000000 /* TODO: get value from CCM */
+ .uc_rclk = 24000000, /* TODO: get value from CCM */
+ .uc_rshift = 0
};
static struct ofw_compat_data compat_data[] = {
diff --git a/sys/arm/include/fdt.h b/sys/arm/include/fdt.h
index 9bd9332..c1b785e 100644
--- a/sys/arm/include/fdt.h
+++ b/sys/arm/include/fdt.h
@@ -32,13 +32,7 @@
#ifndef _MACHINE_FDT_H_
#define _MACHINE_FDT_H_
-#include <dev/ofw/openfirm.h>
-
-#include <vm/vm.h>
-#include <vm/pmap.h>
-
#include <machine/bus.h>
-#include <machine/intr.h>
/* Max interrupt number */
#define FDT_INTR_MAX NIRQ
@@ -51,8 +45,4 @@
*/
extern bus_space_tag_t fdtbus_bs_tag;
-struct arm_devmap_entry;
-
-int fdt_localbus_devmap(phandle_t, struct arm_devmap_entry *, int, int *);
-
#endif /* _MACHINE_FDT_H_ */
diff --git a/sys/arm/include/metadata.h b/sys/arm/include/metadata.h
index 0ef3f41..cf4c9bb 100644
--- a/sys/arm/include/metadata.h
+++ b/sys/arm/include/metadata.h
@@ -31,5 +31,12 @@
#define MODINFOMD_BOOTINFO 0x1001
#define MODINFOMD_DTBP 0x1002
+#define MODINFOMD_EFI_MAP 0x1003
+
+struct efi_map_header {
+ uint64_t memory_size;
+ uint64_t descriptor_size;
+ uint32_t descriptor_version;
+};
#endif /* !_MACHINE_METADATA_H_ */
diff --git a/sys/arm/include/pmap-v6.h b/sys/arm/include/pmap-v6.h
index 54c0f85..bb58682 100644
--- a/sys/arm/include/pmap-v6.h
+++ b/sys/arm/include/pmap-v6.h
@@ -190,7 +190,8 @@ void *pmap_mapdev_attr(vm_paddr_t, vm_size_t, int);
boolean_t pmap_page_is_mapped(vm_page_t );
void pmap_page_set_memattr(vm_page_t , vm_memattr_t );
void pmap_unmapdev(vm_offset_t, vm_size_t);
-void pmap_kenter_device(vm_offset_t , vm_paddr_t );
+void pmap_kenter_device(vm_offset_t, vm_size_t, vm_paddr_t);
+void pmap_kremove_device(vm_offset_t, vm_size_t);
void pmap_set_pcb_pagedir(pmap_t , struct pcb *);
void pmap_lazyfix_action(void);
diff --git a/sys/arm/include/pmap.h b/sys/arm/include/pmap.h
index b88ca32..c42a36f 100644
--- a/sys/arm/include/pmap.h
+++ b/sys/arm/include/pmap.h
@@ -258,7 +258,8 @@ void pmap_bootstrap(vm_offset_t firstaddr, struct pv_addr *l1pt);
int pmap_change_attr(vm_offset_t, vm_size_t, int);
void pmap_kenter(vm_offset_t va, vm_paddr_t pa);
void pmap_kenter_nocache(vm_offset_t va, vm_paddr_t pa);
-void pmap_kenter_device(vm_offset_t va, vm_paddr_t pa);
+void pmap_kenter_device(vm_offset_t, vm_size_t, vm_paddr_t);
+void pmap_kremove_device(vm_offset_t, vm_size_t);
void *pmap_kenter_temporary(vm_paddr_t pa, int i);
void pmap_kenter_user(vm_offset_t va, vm_paddr_t pa);
vm_paddr_t pmap_kextract(vm_offset_t va);
diff --git a/sys/arm/mv/armadaxp/armadaxp_mp.c b/sys/arm/mv/armadaxp/armadaxp_mp.c
index 775fc09..1fa4d53 100644
--- a/sys/arm/mv/armadaxp/armadaxp_mp.c
+++ b/sys/arm/mv/armadaxp/armadaxp_mp.c
@@ -36,6 +36,7 @@
#include <vm/vm.h>
#include <vm/vm_kern.h>
#include <vm/vm_extern.h>
+#include <vm/pmap.h>
#include <dev/fdt/fdt_common.h>
diff --git a/sys/arm/mv/gpio.c b/sys/arm/mv/gpio.c
index 2e255aa..79b7cc6 100644
--- a/sys/arm/mv/gpio.c
+++ b/sys/arm/mv/gpio.c
@@ -44,7 +44,6 @@ __FBSDID("$FreeBSD$");
#include <sys/queue.h>
#include <sys/timetc.h>
#include <machine/bus.h>
-#include <machine/fdt.h>
#include <machine/intr.h>
#include <dev/fdt/fdt_common.h>
diff --git a/sys/arm/mv/mv_localbus.c b/sys/arm/mv/mv_localbus.c
index 8d91c41..59cccc4 100644
--- a/sys/arm/mv/mv_localbus.c
+++ b/sys/arm/mv/mv_localbus.c
@@ -49,6 +49,7 @@ __FBSDID("$FreeBSD$");
#include "dev/fdt/fdt_common.h"
#include "ofw_bus_if.h"
+#include <arm/mv/mvvar.h>
#include <arm/mv/mvwin.h>
#ifdef DEBUG
diff --git a/sys/arm/mv/mv_ts.c b/sys/arm/mv/mv_ts.c
index 7c2a113..7606859 100644
--- a/sys/arm/mv/mv_ts.c
+++ b/sys/arm/mv/mv_ts.c
@@ -35,7 +35,6 @@ __FBSDID("$FreeBSD$");
#include <sys/module.h>
#include <sys/bus.h>
#include <sys/sysctl.h>
-#include <machine/fdt.h>
#include <dev/fdt/fdt_common.h>
#include <dev/ofw/ofw_bus.h>
diff --git a/sys/arm/mv/mvvar.h b/sys/arm/mv/mvvar.h
index a9b2bb0..7166fab 100644
--- a/sys/arm/mv/mvvar.h
+++ b/sys/arm/mv/mvvar.h
@@ -140,5 +140,6 @@ struct arm_devmap_entry;
int mv_pci_devmap(phandle_t, struct arm_devmap_entry *, vm_offset_t,
vm_offset_t);
+int fdt_localbus_devmap(phandle_t, struct arm_devmap_entry *, int, int *);
#endif /* _MVVAR_H_ */
diff --git a/sys/arm/qemu/files.qemu b/sys/arm/qemu/files.qemu
new file mode 100644
index 0000000..d23524e
--- /dev/null
+++ b/sys/arm/qemu/files.qemu
@@ -0,0 +1,16 @@
+# $FreeBSD$
+
+#
+# Standard ARM support.
+#
+arm/arm/bus_space_base.c standard
+arm/arm/bus_space_generic.c standard
+kern/kern_clocksource.c standard
+
+#
+# Standard qemu virt devices and support.
+#
+arm/arm/gic.c standard
+arm/arm/generic_timer.c standard
+arm/qemu/virt_common.c standard
+arm/qemu/virt_machdep.c standard
diff --git a/sys/arm/qemu/std.virt b/sys/arm/qemu/std.virt
new file mode 100644
index 0000000..ca6a06f
--- /dev/null
+++ b/sys/arm/qemu/std.virt
@@ -0,0 +1,15 @@
+# $FreeBSD$
+machine arm armv6
+cpu CPU_CORTEXA
+makeoptions CONF_CFLAGS="-march=armv7a"
+makeoptions ARM_LITTLE_ENDIAN
+options ARM_L2_PIPT
+
+options KERNVIRTADDR = 0xc1000000
+makeoptions KERNVIRTADDR = 0xc1000000
+
+options IPI_IRQ_START=0
+options IPI_IRQ_END=15
+
+files "../qemu/files.qemu"
+
diff --git a/sys/arm/qemu/virt_common.c b/sys/arm/qemu/virt_common.c
new file mode 100644
index 0000000..fc02247
--- /dev/null
+++ b/sys/arm/qemu/virt_common.c
@@ -0,0 +1,45 @@
+/*-
+ * Copyright (c) 2015 Andrew Turner
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+
+#include <dev/fdt/fdt_common.h>
+
+#include <machine/intr.h>
+
+struct fdt_fixup_entry fdt_fixup_table[] = {
+ { NULL, NULL }
+};
+
+fdt_pic_decode_t fdt_pic_table[] = {
+ &gic_decode_fdt,
+ NULL
+};
diff --git a/sys/arm/qemu/virt_machdep.c b/sys/arm/qemu/virt_machdep.c
new file mode 100644
index 0000000..6b0cba2
--- /dev/null
+++ b/sys/arm/qemu/virt_machdep.c
@@ -0,0 +1,92 @@
+/*-
+ * Copyright (c) 2015 Andrew Turner
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+#include "opt_platform.h"
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#define _ARM32_BUS_DMA_PRIVATE
+#include <sys/param.h>
+#include <sys/systm.h>
+
+#include <vm/vm.h>
+
+#include <machine/bus.h>
+#include <machine/devmap.h>
+#include <machine/platform.h>
+#include <machine/platformvar.h>
+
+#include "platform_if.h"
+
+struct arm32_dma_range *
+bus_dma_get_range(void)
+{
+
+ return (NULL);
+}
+
+int
+bus_dma_get_range_nb(void)
+{
+
+ return (0);
+}
+
+void
+cpu_reset(void)
+{
+
+ while (1);
+}
+
+static vm_offset_t
+virt_lastaddr(platform_t plat)
+{
+
+ return (arm_devmap_lastaddr());
+}
+
+/*
+ * Set up static device mappings.
+ */
+static int
+virt_devmap_init(platform_t plat)
+{
+
+ arm_devmap_add_entry(0x09000000, 0x100000); /* Uart */
+ return (0);
+}
+
+static platform_method_t virt_methods[] = {
+ PLATFORMMETHOD(platform_devmap_init, virt_devmap_init),
+ PLATFORMMETHOD(platform_lastaddr, virt_lastaddr),
+
+ PLATFORMMETHOD_END,
+};
+
+FDT_PLATFORM_DEF(virt, "virt", 0, "linux,dummy-virt");
diff --git a/sys/arm/rockchip/rk30xx_common.c b/sys/arm/rockchip/rk30xx_common.c
index 6eb892c..eff1824 100644
--- a/sys/arm/rockchip/rk30xx_common.c
+++ b/sys/arm/rockchip/rk30xx_common.c
@@ -36,7 +36,6 @@ __FBSDID("$FreeBSD$");
#include <dev/ofw/openfirm.h>
#include <machine/bus.h>
-#include <machine/fdt.h>
#include <machine/vmparam.h>
struct fdt_fixup_entry fdt_fixup_table[] = {
diff --git a/sys/arm/rockchip/rk30xx_gpio.c b/sys/arm/rockchip/rk30xx_gpio.c
index ce20c1c..2c95fb9 100644
--- a/sys/arm/rockchip/rk30xx_gpio.c
+++ b/sys/arm/rockchip/rk30xx_gpio.c
@@ -44,7 +44,6 @@ __FBSDID("$FreeBSD$");
#include <machine/cpu.h>
#include <machine/cpufunc.h>
#include <machine/resource.h>
-#include <machine/fdt.h>
#include <machine/intr.h>
#include <dev/fdt/fdt_common.h>
diff --git a/sys/arm/rockchip/rk30xx_grf.c b/sys/arm/rockchip/rk30xx_grf.c
index 29da576..ce61e8c 100644
--- a/sys/arm/rockchip/rk30xx_grf.c
+++ b/sys/arm/rockchip/rk30xx_grf.c
@@ -49,7 +49,6 @@ __FBSDID("$FreeBSD$");
#include <dev/ofw/ofw_bus_subr.h>
#include <machine/bus.h>
-#include <machine/fdt.h>
#include "rk30xx_grf.h"
diff --git a/sys/arm/rockchip/rk30xx_mp.c b/sys/arm/rockchip/rk30xx_mp.c
index 1232611..74c8b55 100644
--- a/sys/arm/rockchip/rk30xx_mp.c
+++ b/sys/arm/rockchip/rk30xx_mp.c
@@ -33,6 +33,9 @@ __FBSDID("$FreeBSD$");
#include <sys/mutex.h>
#include <sys/smp.h>
+#include <vm/vm.h>
+#include <vm/pmap.h>
+
#include <machine/smp.h>
#include <machine/fdt.h>
#include <machine/intr.h>
diff --git a/sys/arm/rockchip/rk30xx_pmu.c b/sys/arm/rockchip/rk30xx_pmu.c
index 517aef3..514e961 100644
--- a/sys/arm/rockchip/rk30xx_pmu.c
+++ b/sys/arm/rockchip/rk30xx_pmu.c
@@ -49,7 +49,6 @@ __FBSDID("$FreeBSD$");
#include <dev/ofw/ofw_bus_subr.h>
#include <machine/bus.h>
-#include <machine/fdt.h>
#include "rk30xx_pmu.h"
diff --git a/sys/arm/samsung/exynos/exynos5_mp.c b/sys/arm/samsung/exynos/exynos5_mp.c
index fa0fa07..1b3afbb 100644
--- a/sys/arm/samsung/exynos/exynos5_mp.c
+++ b/sys/arm/samsung/exynos/exynos5_mp.c
@@ -33,6 +33,9 @@ __FBSDID("$FreeBSD$");
#include <sys/mutex.h>
#include <sys/smp.h>
+#include <vm/vm.h>
+#include <vm/pmap.h>
+
#include <machine/smp.h>
#include <machine/fdt.h>
#include <machine/intr.h>
diff --git a/sys/arm/samsung/exynos/exynos_uart.c b/sys/arm/samsung/exynos/exynos_uart.c
index 9e33bcb..7b372de 100644
--- a/sys/arm/samsung/exynos/exynos_uart.c
+++ b/sys/arm/samsung/exynos/exynos_uart.c
@@ -380,6 +380,7 @@ static struct uart_class uart_exynos4210_class = {
.uc_ops = &uart_exynos4210_ops,
.uc_range = 8,
.uc_rclk = 0,
+ .uc_rshift = 0
};
static struct ofw_compat_data compat_data[] = {
diff --git a/sys/arm/samsung/s3c2xx0/uart_dev_s3c2410.c b/sys/arm/samsung/s3c2xx0/uart_dev_s3c2410.c
index 2ee1217..cc0d59a 100644
--- a/sys/arm/samsung/s3c2xx0/uart_dev_s3c2410.c
+++ b/sys/arm/samsung/s3c2xx0/uart_dev_s3c2410.c
@@ -402,4 +402,5 @@ struct uart_class uart_s3c2410_class = {
.uc_ops = &uart_s3c2410_ops,
.uc_range = 8,
.uc_rclk = 0,
+ .uc_rshift = 0
};
diff --git a/sys/arm/ti/am335x/am335x_dmtimer.c b/sys/arm/ti/am335x/am335x_dmtimer.c
index 09acb3d..7ba171e 100644
--- a/sys/arm/ti/am335x/am335x_dmtimer.c
+++ b/sys/arm/ti/am335x/am335x_dmtimer.c
@@ -52,7 +52,6 @@ __FBSDID("$FreeBSD$");
#include <dev/ofw/ofw_bus_subr.h>
#include <machine/bus.h>
-#include <machine/fdt.h>
#include <arm/ti/ti_prcm.h>
#include <arm/ti/ti_scm.h>
diff --git a/sys/arm/ti/am335x/am335x_prcm.c b/sys/arm/ti/am335x/am335x_prcm.c
index 4b3a245..d9f4db1 100644
--- a/sys/arm/ti/am335x/am335x_prcm.c
+++ b/sys/arm/ti/am335x/am335x_prcm.c
@@ -51,7 +51,6 @@ __FBSDID("$FreeBSD$");
#include <dev/ofw/ofw_bus_subr.h>
#include <machine/bus.h>
-#include <machine/fdt.h>
#define CM_PER 0
#define CM_PER_L4LS_CLKSTCTRL (CM_PER + 0x000)
diff --git a/sys/arm/ti/omap4/omap4_mp.c b/sys/arm/ti/omap4/omap4_mp.c
index e298cd1..6423e56 100644
--- a/sys/arm/ti/omap4/omap4_mp.c
+++ b/sys/arm/ti/omap4/omap4_mp.c
@@ -31,6 +31,9 @@ __FBSDID("$FreeBSD$");
#include <sys/mutex.h>
#include <sys/smp.h>
+#include <vm/vm.h>
+#include <vm/pmap.h>
+
#include <machine/smp.h>
#include <machine/fdt.h>
#include <machine/intr.h>
diff --git a/sys/arm/ti/ti_common.c b/sys/arm/ti/ti_common.c
index 5fb72b7..4d12c71 100644
--- a/sys/arm/ti/ti_common.c
+++ b/sys/arm/ti/ti_common.c
@@ -44,7 +44,6 @@ __FBSDID("$FreeBSD$");
#include <dev/ofw/openfirm.h>
#include <machine/bus.h>
-#include <machine/fdt.h>
#include <machine/vmparam.h>
struct fdt_fixup_entry fdt_fixup_table[] = {
diff --git a/sys/arm/ti/ti_mbox.c b/sys/arm/ti/ti_mbox.c
index 3fb5c33..1f8cde1 100644
--- a/sys/arm/ti/ti_mbox.c
+++ b/sys/arm/ti/ti_mbox.c
@@ -47,7 +47,6 @@ __FBSDID("$FreeBSD$");
#include <dev/ofw/ofw_bus_subr.h>
#include <machine/bus.h>
-#include <machine/fdt.h>
#include <arm/ti/ti_mbox.h>
#include <arm/ti/ti_prcm.h>
diff --git a/sys/arm/ti/ti_pruss.c b/sys/arm/ti/ti_pruss.c
index 9a981d8..805476b 100644
--- a/sys/arm/ti/ti_pruss.c
+++ b/sys/arm/ti/ti_pruss.c
@@ -47,7 +47,6 @@ __FBSDID("$FreeBSD$");
#include <dev/ofw/ofw_bus_subr.h>
#include <machine/bus.h>
-#include <machine/fdt.h>
#include <arm/ti/ti_prcm.h>
#include <arm/ti/ti_pruss.h>
diff --git a/sys/arm/ti/ti_wdt.c b/sys/arm/ti/ti_wdt.c
index 7e8e5ae..2b51cc2 100644
--- a/sys/arm/ti/ti_wdt.c
+++ b/sys/arm/ti/ti_wdt.c
@@ -48,7 +48,6 @@ __FBSDID("$FreeBSD$");
#include <dev/ofw/ofw_bus_subr.h>
#include <machine/bus.h>
-#include <machine/fdt.h>
#include <arm/ti/ti_prcm.h>
#include <arm/ti/ti_wdt.h>
diff --git a/sys/arm/versatile/pl050.c b/sys/arm/versatile/pl050.c
index ec26f2a..c5d8a61 100644
--- a/sys/arm/versatile/pl050.c
+++ b/sys/arm/versatile/pl050.c
@@ -57,7 +57,6 @@ __FBSDID("$FreeBSD$");
#include <dev/kbd/kbdreg.h>
#include <machine/bus.h>
-#include <machine/fdt.h>
#include <dev/kbd/kbdtables.h>
diff --git a/sys/arm/versatile/sp804.c b/sys/arm/versatile/sp804.c
index 5f986b1..a69c018 100644
--- a/sys/arm/versatile/sp804.c
+++ b/sys/arm/versatile/sp804.c
@@ -48,7 +48,6 @@ __FBSDID("$FreeBSD$");
#include <dev/ofw/ofw_bus_subr.h>
#include <machine/bus.h>
-#include <machine/fdt.h>
#define SP804_TIMER1_LOAD 0x00
#define SP804_TIMER1_VALUE 0x04
diff --git a/sys/arm/versatile/versatile_clcd.c b/sys/arm/versatile/versatile_clcd.c
index 804c24f..76c6c63 100644
--- a/sys/arm/versatile/versatile_clcd.c
+++ b/sys/arm/versatile/versatile_clcd.c
@@ -51,7 +51,6 @@ __FBSDID("$FreeBSD$");
#include <dev/syscons/syscons.h>
#include <machine/bus.h>
-#include <machine/fdt.h>
#define PL110_VENDOR_ARM926PXP 1
diff --git a/sys/arm/versatile/versatile_common.c b/sys/arm/versatile/versatile_common.c
index 7a9e42f..bcb504a 100644
--- a/sys/arm/versatile/versatile_common.c
+++ b/sys/arm/versatile/versatile_common.c
@@ -44,7 +44,6 @@ __FBSDID("$FreeBSD$");
#include <dev/ofw/openfirm.h>
#include <machine/bus.h>
-#include <machine/fdt.h>
#include <machine/vmparam.h>
struct fdt_fixup_entry fdt_fixup_table[] = {
diff --git a/sys/arm/versatile/versatile_pci.c b/sys/arm/versatile/versatile_pci.c
index 7b198ca..10f3119 100644
--- a/sys/arm/versatile/versatile_pci.c
+++ b/sys/arm/versatile/versatile_pci.c
@@ -35,6 +35,10 @@ __FBSDID("$FreeBSD$");
#include <sys/malloc.h>
#include <sys/rman.h>
#include <sys/watchdog.h>
+
+#include <vm/vm.h>
+#include <vm/pmap.h>
+
#include <machine/bus.h>
#include <machine/cpu.h>
#include <machine/intr.h>
diff --git a/sys/arm/versatile/versatile_timer.c b/sys/arm/versatile/versatile_timer.c
index 5231ef1c..c5f6def 100644
--- a/sys/arm/versatile/versatile_timer.c
+++ b/sys/arm/versatile/versatile_timer.c
@@ -47,7 +47,6 @@ __FBSDID("$FreeBSD$");
#include <dev/ofw/ofw_bus_subr.h>
#include <machine/bus.h>
-#include <machine/fdt.h>
void
cpu_initclocks(void)
diff --git a/sys/arm/xilinx/zy7_mp.c b/sys/arm/xilinx/zy7_mp.c
index b6a540f..305290e 100644
--- a/sys/arm/xilinx/zy7_mp.c
+++ b/sys/arm/xilinx/zy7_mp.c
@@ -31,6 +31,9 @@ __FBSDID("$FreeBSD$");
#include <sys/mutex.h>
#include <sys/smp.h>
+#include <vm/vm.h>
+#include <vm/pmap.h>
+
#include <machine/smp.h>
#include <machine/fdt.h>
#include <machine/intr.h>
diff --git a/sys/arm64/arm64/autoconf.c b/sys/arm64/arm64/autoconf.c
new file mode 100644
index 0000000..c29b335
--- /dev/null
+++ b/sys/arm64/arm64/autoconf.c
@@ -0,0 +1,90 @@
+/*-
+ * Copyright (c) 2015 The FreeBSD Foundation
+ * All rights reserved.
+ *
+ * This software was developed by Andrew Turner under
+ * sponsorship from the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * Setup the system to run on the current machine.
+ *
+ * Configure() is called at boot time and initializes the vba
+ * device tables and the memory controller monitoring. Available
+ * devices are determined (from possibilities mentioned in ioconf.c),
+ * and the drivers are initialized.
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/bus.h>
+#include <sys/cons.h>
+#include <sys/kernel.h>
+
+#include <machine/intr.h>
+
+static void configure_first(void *);
+static void configure(void *);
+static void configure_final(void *);
+
+SYSINIT(configure1, SI_SUB_CONFIGURE, SI_ORDER_FIRST, configure_first, NULL);
+/* SI_ORDER_SECOND is hookable */
+SYSINIT(configure2, SI_SUB_CONFIGURE, SI_ORDER_THIRD, configure, NULL);
+/* SI_ORDER_MIDDLE is hookable */
+SYSINIT(configure3, SI_SUB_CONFIGURE, SI_ORDER_ANY, configure_final, NULL);
+
+/*
+ * Determine i/o configuration for a machine.
+ */
+static void
+configure_first(void *dummy)
+{
+
+ /* nexus0 is the top of the device tree */
+ device_add_child(root_bus, "nexus", 0);
+}
+
+static void
+configure(void *dummy)
+{
+
+ /* initialize new bus architecture */
+ root_bus_configure();
+}
+
+static void
+configure_final(void *dummy)
+{
+ arm_enable_intr();
+ cninit_finish();
+
+ if (bootverbose)
+ printf("Device configuration finished.\n");
+
+ cold = 0;
+}
diff --git a/sys/arm64/arm64/bcopy.c b/sys/arm64/arm64/bcopy.c
new file mode 100644
index 0000000..613ca97
--- /dev/null
+++ b/sys/arm64/arm64/bcopy.c
@@ -0,0 +1,139 @@
+/*-
+ * Copyright (c) 1990 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * From: sys/powerpc/powerpc/bcopy.c
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+
+/*
+ * sizeof(word) MUST BE A POWER OF TWO
+ * SO THAT wmask BELOW IS ALL ONES
+ */
+typedef long word; /* "word" used for optimal copy speed */
+
+#define wsize sizeof(word)
+#define wmask (wsize - 1)
+
+/*
+ * Copy a block of memory, handling overlap.
+ * This is the routine that actually implements
+ * (the portable versions of) bcopy, memcpy, and memmove.
+ */
+void *
+memcpy(void *dst0, const void *src0, size_t length)
+{
+ char *dst;
+ const char *src;
+ size_t t;
+
+ dst = dst0;
+ src = src0;
+
+ if (length == 0 || dst == src) { /* nothing to do */
+ goto done;
+ }
+
+ /*
+ * Macros: loop-t-times; and loop-t-times, t>0
+ */
+#define TLOOP(s) if (t) TLOOP1(s)
+#define TLOOP1(s) do { s; } while (--t)
+
+ if ((unsigned long)dst < (unsigned long)src) {
+ /*
+ * Copy forward.
+ */
+ t = (size_t)src; /* only need low bits */
+
+ if ((t | (uintptr_t)dst) & wmask) {
+ /*
+ * Try to align operands. This cannot be done
+ * unless the low bits match.
+ */
+ if ((t ^ (uintptr_t)dst) & wmask || length < wsize) {
+ t = length;
+ } else {
+ t = wsize - (t & wmask);
+ }
+
+ length -= t;
+ TLOOP1(*dst++ = *src++);
+ }
+ /*
+ * Copy whole words, then mop up any trailing bytes.
+ */
+ t = length / wsize;
+ TLOOP(*(word *)dst = *(const word *)src; src += wsize;
+ dst += wsize);
+ t = length & wmask;
+ TLOOP(*dst++ = *src++);
+ } else {
+ /*
+ * Copy backwards. Otherwise essentially the same.
+ * Alignment works as before, except that it takes
+ * (t&wmask) bytes to align, not wsize-(t&wmask).
+ */
+ src += length;
+ dst += length;
+ t = (uintptr_t)src;
+
+ if ((t | (uintptr_t)dst) & wmask) {
+ if ((t ^ (uintptr_t)dst) & wmask || length <= wsize) {
+ t = length;
+ } else {
+ t &= wmask;
+ }
+
+ length -= t;
+ TLOOP1(*--dst = *--src);
+ }
+ t = length / wsize;
+ TLOOP(src -= wsize; dst -= wsize;
+ *(word *)dst = *(const word *)src);
+ t = length & wmask;
+ TLOOP(*--dst = *--src);
+ }
+done:
+ return (dst0);
+}
+
+void
+bcopy(const void *src0, void *dst0, size_t length)
+{
+
+ memcpy(dst0, src0, length);
+}
+
diff --git a/sys/arm64/arm64/bus_machdep.c b/sys/arm64/arm64/bus_machdep.c
new file mode 100644
index 0000000..25a675e
--- /dev/null
+++ b/sys/arm64/arm64/bus_machdep.c
@@ -0,0 +1,204 @@
+/*-
+ * Copyright (c) 2014 Andrew Turner
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+#include "opt_platform.h"
+
+#include <sys/param.h>
+__FBSDID("$FreeBSD$");
+
+#include <vm/vm.h>
+#include <vm/pmap.h>
+
+#include <machine/bus.h>
+
+uint8_t generic_bs_r_1(void *, bus_space_handle_t, bus_size_t);
+uint16_t generic_bs_r_2(void *, bus_space_handle_t, bus_size_t);
+uint32_t generic_bs_r_4(void *, bus_space_handle_t, bus_size_t);
+uint64_t generic_bs_r_8(void *, bus_space_handle_t, bus_size_t);
+
+void generic_bs_rm_1(void *, bus_space_handle_t, bus_size_t, uint8_t *,
+ bus_size_t);
+void generic_bs_rm_2(void *, bus_space_handle_t, bus_size_t, uint16_t *,
+ bus_size_t);
+void generic_bs_rm_4(void *, bus_space_handle_t, bus_size_t, uint32_t *,
+ bus_size_t);
+void generic_bs_rm_8(void *, bus_space_handle_t, bus_size_t, uint64_t *,
+ bus_size_t);
+
+void generic_bs_w_1(void *, bus_space_handle_t, bus_size_t, uint8_t);
+void generic_bs_w_2(void *, bus_space_handle_t, bus_size_t, uint16_t);
+void generic_bs_w_4(void *, bus_space_handle_t, bus_size_t, uint32_t);
+void generic_bs_w_8(void *, bus_space_handle_t, bus_size_t, uint64_t);
+
+void generic_bs_wm_1(void *, bus_space_handle_t, bus_size_t, const uint8_t *,
+ bus_size_t);
+void generic_bs_wm_2(void *, bus_space_handle_t, bus_size_t, const uint16_t *,
+ bus_size_t);
+void generic_bs_wm_4(void *, bus_space_handle_t, bus_size_t, const uint32_t *,
+ bus_size_t);
+void generic_bs_wm_8(void *, bus_space_handle_t, bus_size_t, const uint64_t *,
+ bus_size_t);
+
+static int
+generic_bs_map(void *t, bus_addr_t bpa, bus_size_t size, int flags,
+ bus_space_handle_t *bshp)
+{
+ void *va;
+
+ va = pmap_mapdev(bpa, size);
+ if (va == NULL)
+ return (ENOMEM);
+ *bshp = (bus_space_handle_t)va;
+ return (0);
+}
+
+static void
+generic_bs_unmap(void *t, bus_space_handle_t bsh, bus_size_t size)
+{
+
+ pmap_unmapdev(bsh, size);
+}
+
+static void
+generic_bs_barrier(void *t, bus_space_handle_t bsh, bus_size_t offset,
+ bus_size_t size, int flags)
+{
+}
+
+static int
+generic_bs_subregion(void *t, bus_space_handle_t bsh, bus_size_t offset,
+ bus_size_t size, bus_space_handle_t *nbshp)
+{
+
+ *nbshp = bsh + offset;
+ return (0);
+}
+
+struct bus_space memmap_bus = {
+ /* cookie */
+ .bs_cookie = NULL,
+
+ /* mapping/unmapping */
+ .bs_map = generic_bs_map,
+ .bs_unmap = generic_bs_unmap,
+ .bs_subregion = generic_bs_subregion,
+
+ /* allocation/deallocation */
+ .bs_alloc = NULL,
+ .bs_free = NULL,
+
+ /* barrier */
+ .bs_barrier = generic_bs_barrier,
+
+ /* read single */
+ .bs_r_1 = generic_bs_r_1,
+ .bs_r_2 = generic_bs_r_2,
+ .bs_r_4 = generic_bs_r_4,
+ .bs_r_8 = generic_bs_r_8,
+
+ /* read multiple */
+ .bs_rm_1 = generic_bs_rm_1,
+ .bs_rm_2 = generic_bs_rm_2,
+ .bs_rm_4 = generic_bs_rm_4,
+ .bs_rm_8 = generic_bs_rm_8,
+
+ /* write single */
+ .bs_w_1 = generic_bs_w_1,
+ .bs_w_2 = generic_bs_w_2,
+ .bs_w_4 = generic_bs_w_4,
+ .bs_w_8 = generic_bs_w_8,
+
+ /* write multiple */
+ .bs_wm_1 = generic_bs_wm_1,
+ .bs_wm_2 = generic_bs_wm_2,
+ .bs_wm_4 = generic_bs_wm_4,
+ .bs_wm_8 = generic_bs_wm_8,
+
+ /* write region */
+ .bs_wr_1 = NULL,
+ .bs_wr_2 = NULL,
+ .bs_wr_4 = NULL,
+ .bs_wr_8 = NULL,
+
+ /* set multiple */
+ .bs_sm_1 = NULL,
+ .bs_sm_2 = NULL,
+ .bs_sm_4 = NULL,
+ .bs_sm_8 = NULL,
+
+ /* set region */
+ .bs_sr_1 = NULL,
+ .bs_sr_2 = NULL,
+ .bs_sr_4 = NULL,
+ .bs_sr_8 = NULL,
+
+ /* copy */
+ .bs_c_1 = NULL,
+ .bs_c_2 = NULL,
+ .bs_c_4 = NULL,
+ .bs_c_8 = NULL,
+
+ /* read single stream */
+ .bs_r_1_s = NULL,
+ .bs_r_2_s = NULL,
+ .bs_r_4_s = NULL,
+ .bs_r_8_s = NULL,
+
+ /* read multiple stream */
+ .bs_rm_1_s = generic_bs_rm_1,
+ .bs_rm_2_s = generic_bs_rm_2,
+ .bs_rm_4_s = generic_bs_rm_4,
+ .bs_rm_8_s = generic_bs_rm_8,
+
+ /* read region stream */
+ .bs_rr_1_s = NULL,
+ .bs_rr_2_s = NULL,
+ .bs_rr_4_s = NULL,
+ .bs_rr_8_s = NULL,
+
+ /* write single stream */
+ .bs_w_1_s = NULL,
+ .bs_w_2_s = NULL,
+ .bs_w_4_s = NULL,
+ .bs_w_8_s = NULL,
+
+ /* write multiple stream */
+ .bs_wm_1_s = generic_bs_wm_1,
+ .bs_wm_2_s = generic_bs_wm_2,
+ .bs_wm_4_s = generic_bs_wm_4,
+ .bs_wm_8_s = generic_bs_wm_8,
+
+ /* write region stream */
+ .bs_wr_1_s = NULL,
+ .bs_wr_2_s = NULL,
+ .bs_wr_4_s = NULL,
+ .bs_wr_8_s = NULL,
+};
+
+#ifdef FDT
+bus_space_tag_t fdtbus_bs_tag = &memmap_bus;
+#endif
diff --git a/sys/arm64/arm64/bus_space_asm.S b/sys/arm64/arm64/bus_space_asm.S
new file mode 100644
index 0000000..20d4128
--- /dev/null
+++ b/sys/arm64/arm64/bus_space_asm.S
@@ -0,0 +1,235 @@
+/*-
+ * Copyright (c) 2014 Andrew Turner
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+#include <machine/asm.h>
+
+__FBSDID("$FreeBSD$");
+
+ENTRY(generic_bs_r_1)
+ ldrb w0, [x1, x2]
+ ret
+END(generic_bs_r_1)
+
+ENTRY(generic_bs_r_2)
+ ldrh w0, [x1, x2]
+ ret
+END(generic_bs_r_2)
+
+ENTRY(generic_bs_r_4)
+ ldr w0, [x1, x2]
+ ret
+END(generic_bs_r_4)
+
+ENTRY(generic_bs_r_8)
+ ldr x0, [x1, x2]
+ ret
+END(generic_bs_r_8)
+
+ENTRY(generic_bs_rm_1)
+ /* If there is anything to read. */
+ cbz x4, 2f
+
+ /* Calculate the device address. */
+ add x0, x1, x2
+ /*
+ * x0 = The device address.
+ * x3 = The kernel address.
+ * x4 = Count
+ */
+
+ /* Read the data. */
+1: ldrb w1, [x0]
+ strb w1, [x3], #1
+ subs x4, x4, #1
+ b.ne 1b
+
+2: ret
+END(generic_bs_rm_1)
+
+ENTRY(generic_bs_rm_2)
+ /* If there is anything to read. */
+ cbz x4, 2f
+
+ /* Calculate the device address. */
+ add x0, x1, x2
+ /*
+ * x0 = The device address.
+ * x3 = The kernel address.
+ * x4 = Count
+ */
+
+ /* Read the data. */
+1: ldrh w1, [x0]
+ strh w1, [x3], #2
+ subs x4, x4, #1
+ b.ne 1b
+
+2: ret
+END(generic_bs_rm_2)
+
+ENTRY(generic_bs_rm_4)
+ /* If there is anything to read. */
+ cbz x4, 2f
+
+ /* Calculate the device address. */
+ add x0, x1, x2
+ /*
+ * x0 = The device address.
+ * x3 = The kernel address.
+ * x4 = Count
+ */
+
+ /* Read the data. */
+1: ldr w1, [x0]
+ str w1, [x3], #4
+ subs x4, x4, #1
+ b.ne 1b
+
+2: ret
+END(generic_bs_rm_4)
+
+ENTRY(generic_bs_rm_8)
+ /* If there is anything to read. */
+ cbz x4, 2f
+
+ /* Calculate the device address. */
+ add x0, x1, x2
+ /*
+ * x0 = The device address.
+ * x3 = The kernel address.
+ * x4 = Count
+ */
+
+ /* Read the data. */
+1: ldr x1, [x0]
+ str x1, [x3], #8
+ subs x4, x4, #1
+ b.ne 1b
+
+2: ret
+END(generic_bs_rm_8)
+
+
+ENTRY(generic_bs_w_1)
+ strb w3, [x1, x2]
+ ret
+END(generic_bs_w_1)
+
+ENTRY(generic_bs_w_2)
+ strh w3, [x1, x2]
+ ret
+END(generic_bs_w_2)
+
+ENTRY(generic_bs_w_4)
+ str w3, [x1, x2]
+ ret
+END(generic_bs_w_4)
+
+ENTRY(generic_bs_w_8)
+ str x3, [x1, x2]
+ ret
+END(generic_bs_w_8)
+
+ENTRY(generic_bs_wm_1)
+ /* If there is anything to write. */
+ cbz x4, 2f
+
+ add x0, x1, x2
+ /*
+ * x0 = The device address.
+ * x3 = The kernel address.
+ * x4 = Count
+ */
+
+ /* Write the data */
+1: ldrb w1, [x3], #1
+ strb w1, [x0]
+ subs x4, x4, #1
+ b.ne 1b
+
+2: ret
+END(generic_bs_wm_1)
+
+ENTRY(generic_bs_wm_2)
+ /* If there is anything to write. */
+ cbz x4, 2f
+
+ add x0, x1, x2
+ /*
+ * x0 = The device address.
+ * x3 = The kernel address.
+ * x4 = Count
+ */
+
+ /* Write the data */
+1: ldrh w1, [x3], #2
+ strh w1, [x0]
+ subs x4, x4, #1
+ b.ne 1b
+
+2: ret
+END(generic_bs_wm_2)
+
+ENTRY(generic_bs_wm_4)
+ /* If there is anything to write. */
+ cbz x4, 2f
+
+ add x0, x1, x2
+ /*
+ * x0 = The device address.
+ * x3 = The kernel address.
+ * x4 = Count
+ */
+
+ /* Write the data */
+1: ldr w1, [x3], #4
+ str w1, [x0]
+ subs x4, x4, #1
+ b.ne 1b
+
+2: ret
+END(generic_bs_wm_4)
+
+ENTRY(generic_bs_wm_8)
+ /* If there is anything to write. */
+ cbz x4, 2f
+
+ add x0, x1, x2
+ /*
+ * x0 = The device address.
+ * x3 = The kernel address.
+ * x4 = Count
+ */
+
+ /* Write the data */
+1: ldr x1, [x3], #8
+ str x1, [x0]
+ subs x4, x4, #1
+ b.ne 1b
+
+2: ret
+END(generic_bs_wm_8)
diff --git a/sys/arm64/arm64/busdma_machdep.c b/sys/arm64/arm64/busdma_machdep.c
new file mode 100644
index 0000000..4a89b1f
--- /dev/null
+++ b/sys/arm64/arm64/busdma_machdep.c
@@ -0,0 +1,68 @@
+/* $FreeBSD$ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+
+#include <vm/vm.h>
+#include <vm/pmap.h>
+
+#include <machine/bus.h>
+
+int
+_bus_dmamap_load_phys(bus_dma_tag_t dmat, bus_dmamap_t map, vm_paddr_t buf,
+ bus_size_t buflen, int flags, bus_dma_segment_t *segs, int *segp)
+{
+
+ panic("_bus_dmamap_load_phys");
+}
+
+int
+_bus_dmamap_load_ma(bus_dma_tag_t dmat, bus_dmamap_t map, struct vm_page **ma,
+ bus_size_t tlen, int ma_offs, int flags, bus_dma_segment_t *segs,
+ int *segp)
+{
+
+ panic("_bus_dmamap_load_ma");
+}
+
+int
+_bus_dmamap_load_buffer(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf,
+ bus_size_t buflen, pmap_t pmap, int flags, bus_dma_segment_t *segs,
+ int *segp)
+{
+
+ panic("_bus_dmamap_load_buffer");
+}
+
+void
+__bus_dmamap_waitok(bus_dma_tag_t dmat, bus_dmamap_t map,
+ struct memdesc *mem, bus_dmamap_callback_t *callback, void *callback_arg)
+{
+
+ panic("__bus_dmamap_waitok");
+}
+
+bus_dma_segment_t *
+_bus_dmamap_complete(bus_dma_tag_t dmat, bus_dmamap_t map,
+ bus_dma_segment_t *segs, int nsegs, int error)
+{
+
+ panic("_bus_dmamap_complete");
+}
+
+void
+_bus_dmamap_unload(bus_dma_tag_t dmat, bus_dmamap_t map)
+{
+
+ panic("_bus_dmamap_unload");
+}
+
+void
+_bus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op)
+{
+
+ panic("_bus_dmamap_sync");
+}
diff --git a/sys/arm64/arm64/clock.c b/sys/arm64/arm64/clock.c
new file mode 100644
index 0000000..ef68ea4
--- /dev/null
+++ b/sys/arm64/arm64/clock.c
@@ -0,0 +1,39 @@
+/*-
+ * Copyright (c) 2014 Andrew Turner
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/types.h>
+#include <sys/systm.h>
+
+void
+cpu_initclocks(void)
+{
+
+ cpu_initclocks_bsp();
+}
diff --git a/sys/arm64/arm64/copyinout.S b/sys/arm64/arm64/copyinout.S
new file mode 100644
index 0000000..56512ec
--- /dev/null
+++ b/sys/arm64/arm64/copyinout.S
@@ -0,0 +1,118 @@
+/*-
+ * Copyright (c) 2015 The FreeBSD Foundation
+ * All rights reserved.
+ *
+ * This software was developed by Andrew Turner under
+ * sponsorship from the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+#include <machine/asm.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/errno.h>
+
+#include "assym.s"
+
+/*
+ * Fault handler for the copy{in,out} functions below.
+ */
+ENTRY(copyio_fault)
+ SET_FAULT_HANDLER(xzr, x1) /* Clear the handler */
+ mov x0, #EFAULT
+ ret
+END(copyio_fault)
+
+/*
+ * Copies from a kernel to user address
+ *
+ * int copyout(const void *kaddr, void *udaddr, size_t len)
+ */
+ENTRY(copyout)
+ cbz x2, 2f /* If len == 0 then skip loop */
+
+ adr x6, copyio_fault /* Get the handler address */
+ SET_FAULT_HANDLER(x6, x7) /* Set the handler */
+
+1: ldrb w4, [x0], #1 /* Load from kaddr */
+ strb w4, [x1], #1 /* Store in uaddr */
+ sub x2, x2, #1 /* len-- */
+ cbnz x2, 1b
+
+ SET_FAULT_HANDLER(xzr, x7) /* Clear the handler */
+
+2: mov x0, xzr /* return 0 */
+ ret
+END(copyout)
+
+/*
+ * Copies from a user to kernel address
+ *
+ * int copyin(const void *uaddr, void *kdaddr, size_t len)
+ */
+ENTRY(copyin)
+ cbz x2, 2f /* If len == 0 then skip loop */
+
+ adr x6, copyio_fault /* Get the handler address */
+ SET_FAULT_HANDLER(x6, x7) /* Set the handler */
+
+1: ldrb w4, [x0], #1 /* Load from uaddr */
+ strb w4, [x1], #1 /* Store in kaddr */
+ sub x2, x2, #1 /* len-- */
+ cbnz x2, 1b
+
+ SET_FAULT_HANDLER(xzr, x7) /* Clear the handler */
+
+2: mov x0, xzr /* return 0 */
+ ret
+END(copyin)
+
+/*
+ * Copies a string from a user to kernel address
+ *
+ * int copyinstr(const void *udaddr, void *kaddr, size_t len, size_t *done)
+ */
+ENTRY(copyinstr)
+ mov x5, xzr /* count = 0 */
+ cbz x2, 3f /* If len == 0 then skip loop */
+
+ adr x6, copyio_fault /* Get the handler address */
+ SET_FAULT_HANDLER(x6, x7) /* Set the handler */
+
+1: ldrb w4, [x0], #1 /* Load from uaddr */
+ strb w4, [x1], #1 /* Store in kaddr */
+ cbz w4, 2f /* If == 0 then break */
+ sub x2, x2, #1 /* len-- */
+ add x5, x5, #1 /* count++ */
+ cbnz x2, 1b
+
+2: SET_FAULT_HANDLER(xzr, x7) /* Clear the handler */
+
+3: cbz x3, 4f /* Check if done != NULL */
+ add x5, x5, #1 /* count++ */
+ str x5, [x3] /* done = count */
+
+4: mov x0, xzr /* return 0 */
+ ret
+END(copyinstr)
diff --git a/sys/arm64/arm64/copystr.c b/sys/arm64/arm64/copystr.c
new file mode 100644
index 0000000..008fdd1
--- /dev/null
+++ b/sys/arm64/arm64/copystr.c
@@ -0,0 +1,61 @@
+/*-
+ * Copyright (c) 2014 Andrew Turner
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+
+int
+copystr(const void * __restrict kfaddr, void * __restrict kdaddr, size_t len,
+ size_t * __restrict lencopied)
+{
+ const char *src;
+ size_t pos;
+ char *dst;
+ int error;
+
+ error = ENAMETOOLONG;
+ src = kfaddr;
+ dst = kdaddr;
+ for (pos = 0; pos < len; pos++) {
+ dst[pos] = src[pos];
+ if (src[pos] == '\0') {
+ /* Increment pos to hold the number of bytes copied */
+ pos++;
+ error = 0;
+ break;
+ }
+ }
+
+ if (lencopied != NULL)
+ *lencopied = pos;
+
+ return (0);
+}
+
diff --git a/sys/arm64/arm64/cpufunc_asm.S b/sys/arm64/arm64/cpufunc_asm.S
new file mode 100644
index 0000000..9b17c21
--- /dev/null
+++ b/sys/arm64/arm64/cpufunc_asm.S
@@ -0,0 +1,154 @@
+/*-
+ * Copyright (c) 2014 Robin Randhawa
+ * Copyright (c) 2015 The FreeBSD Foundation
+ * All rights reserved.
+ *
+ * Portions of this software were developed by Andrew Turner
+ * under sponsorship from the FreeBSD Foundation
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+#include <machine/asm.h>
+#include <machine/param.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * FIXME:
+ * Need big.LITTLE awareness at some point.
+ * Using arm64_p[id]cache_line_size may not be the best option.
+ * Need better SMP awareness.
+ */
+ .text
+ .align 2
+
+.Lpage_mask:
+ .word PAGE_MASK
+
+/*
+ * Macro to handle the cache. This takes the start address in x0, length
+ * in x1. It will corrupt x0, x1, x2, and x3.
+ */
+.macro cache_handle_range dcop = 0, ic = 0, icop = 0
+.if \ic == 0
+ ldr x3, =dcache_line_size /* Load the D cache line size */
+.else
+ ldr x3, =idcache_line_size /* Load the I & D cache line size */
+.endif
+ ldr x3, [x3]
+ sub x4, x3, #1 /* Get the address mask */
+ and x2, x0, x4 /* Get the low bits of the address */
+ add x1, x1, x2 /* Add these to the size */
+ bic x0, x0, x4 /* Clear the low bit of the address */
+1:
+.if \ic != 0
+ ic \icop, x0
+.endif
+ dc \dcop, x0
+ add x0, x0, x3 /* Move to the next line */
+ subs x1, x1, x3 /* Reduce the size */
+ b.hi 1b /* Check if we are done */
+.if \ic != 0
+ isb
+.endif
+ dsb ish
+ ret
+.endm
+
+ENTRY(arm64_nullop)
+ ret
+END(arm64_nullop)
+
+/*
+ * Generic functions to read/modify/write the internal coprocessor registers
+ */
+
+ENTRY(arm64_setttb)
+ dsb ish
+ msr ttbr0_el1, x0
+ dsb ish
+ isb
+ ret
+END(arm64_setttb)
+
+ENTRY(arm64_tlb_flushID)
+#ifdef SMP
+ tlbi vmalle1is
+#else
+ tlbi vmalle1
+#endif
+ dsb ish
+ isb
+ ret
+END(arm64_tlb_flushID)
+
+ENTRY(arm64_tlb_flushID_SE)
+ ldr x1, .Lpage_mask
+ bic x0, x0, x1
+#ifdef SMP
+ tlbi vae1is, x0
+#else
+ tlbi vae1, x0
+#endif
+ dsb ish
+ isb
+ ret
+END(arm64_tlb_flushID_SE)
+
+/*
+ * void arm64_dcache_wb_range(vm_offset_t, vm_size_t)
+ */
+ENTRY(arm64_dcache_wb_range)
+ cache_handle_range dcop = cvac
+END(arm64_dcache_wb_range)
+
+/*
+ * void arm64_dcache_wbinv_range(vm_offset_t, vm_size_t)
+ */
+ENTRY(arm64_dcache_wbinv_range)
+ cache_handle_range dcop = civac
+END(arm64_dcache_wbinv_range)
+
+/*
+ * void arm64_dcache_inv_range(vm_offset_t, vm_size_t)
+ *
+ * Note, we must not invalidate everything. If the range is too big we
+ * must use wb-inv of the entire cache.
+ */
+ENTRY(arm64_dcache_inv_range)
+ cache_handle_range dcop = ivac
+END(arm64_dcache_inv_range)
+
+/*
+ * void arm64_idcache_wbinv_range(vm_offset_t, vm_size_t)
+ */
+ENTRY(arm64_idcache_wbinv_range)
+ cache_handle_range dcop = civac, ic = 1, icop = ivau
+END(arm64_idcache_wbinv_range)
+
+/*
+ * void arm64_icache_sync_range(vm_offset_t, vm_size_t)
+ */
+ENTRY(arm64_icache_sync_range)
+ cache_handle_range dcop = cvac, ic = 1, icop = ivau
+END(arm64_icache_sync_range)
diff --git a/sys/arm64/arm64/db_disasm.c b/sys/arm64/arm64/db_disasm.c
new file mode 100644
index 0000000..ec943a4
--- /dev/null
+++ b/sys/arm64/arm64/db_disasm.c
@@ -0,0 +1,41 @@
+/*-
+ * Copyright (c) 2015 The FreeBSD Foundation
+ * All rights reserved.
+ *
+ * This software was developed by Semihalf under
+ * the sponsorship of the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+#include <sys/param.h>
+#include <ddb/ddb.h>
+
+vm_offset_t
+db_disasm(vm_offset_t loc, boolean_t altfmt)
+{
+ return 0;
+}
+
+/* End of db_disasm.c */
diff --git a/sys/arm64/arm64/db_interface.c b/sys/arm64/arm64/db_interface.c
new file mode 100644
index 0000000..38834af
--- /dev/null
+++ b/sys/arm64/arm64/db_interface.c
@@ -0,0 +1,168 @@
+/*-
+ * Copyright (c) 2015 The FreeBSD Foundation
+ * All rights reserved.
+ *
+ * This software was developed by Semihalf under
+ * the sponsorship of the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+#include <sys/param.h>
+#include <sys/proc.h>
+#include <vm/vm.h>
+#include <vm/pmap.h>
+#include <vm/vm_map.h>
+
+#ifdef KDB
+#include <sys/kdb.h>
+#endif
+
+#include <ddb/ddb.h>
+#include <ddb/db_variables.h>
+
+#include <machine/cpu.h>
+#include <machine/pcb.h>
+#include <machine/vmparam.h>
+
+static int
+db_frame(struct db_variable *vp, db_expr_t *valuep, int op)
+{
+ long *reg;
+
+ if (kdb_frame == NULL)
+ return (0);
+
+ reg = (long *)((uintptr_t)kdb_frame + (db_expr_t)vp->valuep);
+ if (op == DB_VAR_GET)
+ *valuep = *reg;
+ else
+ *reg = *valuep;
+ return (1);
+}
+
+#define DB_OFFSET(x) (db_expr_t *)offsetof(struct trapframe, x)
+struct db_variable db_regs[] = {
+ { "spsr", DB_OFFSET(tf_spsr), db_frame },
+ { "x0", DB_OFFSET(tf_x[0]), db_frame },
+ { "x1", DB_OFFSET(tf_x[1]), db_frame },
+ { "x2", DB_OFFSET(tf_x[2]), db_frame },
+ { "x3", DB_OFFSET(tf_x[3]), db_frame },
+ { "x4", DB_OFFSET(tf_x[4]), db_frame },
+ { "x5", DB_OFFSET(tf_x[5]), db_frame },
+ { "x6", DB_OFFSET(tf_x[6]), db_frame },
+ { "x7", DB_OFFSET(tf_x[7]), db_frame },
+ { "x8", DB_OFFSET(tf_x[8]), db_frame },
+ { "x9", DB_OFFSET(tf_x[9]), db_frame },
+ { "x10", DB_OFFSET(tf_x[10]), db_frame },
+ { "x11", DB_OFFSET(tf_x[11]), db_frame },
+ { "x12", DB_OFFSET(tf_x[12]), db_frame },
+ { "x13", DB_OFFSET(tf_x[13]), db_frame },
+ { "x14", DB_OFFSET(tf_x[14]), db_frame },
+ { "x15", DB_OFFSET(tf_x[15]), db_frame },
+ { "x16", DB_OFFSET(tf_x[16]), db_frame },
+ { "x17", DB_OFFSET(tf_x[17]), db_frame },
+ { "x18", DB_OFFSET(tf_x[18]), db_frame },
+ { "x19", DB_OFFSET(tf_x[19]), db_frame },
+ { "x20", DB_OFFSET(tf_x[20]), db_frame },
+ { "x21", DB_OFFSET(tf_x[21]), db_frame },
+ { "x22", DB_OFFSET(tf_x[22]), db_frame },
+ { "x23", DB_OFFSET(tf_x[23]), db_frame },
+ { "x24", DB_OFFSET(tf_x[24]), db_frame },
+ { "x25", DB_OFFSET(tf_x[25]), db_frame },
+ { "x26", DB_OFFSET(tf_x[26]), db_frame },
+ { "x27", DB_OFFSET(tf_x[27]), db_frame },
+ { "x28", DB_OFFSET(tf_x[28]), db_frame },
+ { "x29", DB_OFFSET(tf_x[29]), db_frame },
+ { "lr", DB_OFFSET(tf_lr), db_frame },
+ { "elr", DB_OFFSET(tf_elr), db_frame },
+ { "sp", DB_OFFSET(tf_sp), db_frame },
+};
+
+struct db_variable *db_eregs = db_regs + sizeof(db_regs)/sizeof(db_regs[0]);
+
+void
+db_show_mdpcpu(struct pcpu *pc)
+{
+}
+
+static int
+db_validate_address(vm_offset_t addr)
+{
+ struct proc *p = curproc;
+ struct pmap *pmap;
+
+ if (!p || !p->p_vmspace || !p->p_vmspace->vm_map.pmap ||
+ addr >= VM_MAXUSER_ADDRESS)
+ pmap = pmap_kernel();
+ else
+ pmap = p->p_vmspace->vm_map.pmap;
+
+ return (pmap_extract(pmap, addr) == FALSE);
+}
+
+/*
+ * Read bytes from kernel address space for debugger.
+ */
+int
+db_read_bytes(vm_offset_t addr, size_t size, char *data)
+{
+ const char *src = (const char *)addr;
+
+ while (size-- > 0) {
+ if (db_validate_address((vm_offset_t)src)) {
+ db_printf("address %p is invalid\n", src);
+ return (-1);
+ }
+ *data++ = *src++;
+ }
+ return (0);
+}
+
+/*
+ * Write bytes to kernel address space for debugger.
+ */
+int
+db_write_bytes(vm_offset_t addr, size_t size, char *data)
+{
+ char *dst;
+
+ dst = (char *)addr;
+ while (size-- > 0) {
+ if (db_validate_address((vm_offset_t)dst)) {
+ db_printf("address %p is invalid\n", dst);
+ return (-1);
+ }
+ *dst++ = *data++;
+ }
+
+ dsb();
+ /* Clean D-cache and invalidate I-cache */
+ cpu_dcache_wb_range(addr, (vm_size_t)size);
+ cpu_icache_sync_range(addr, (vm_size_t)size);
+ dsb();
+ isb();
+
+ return (0);
+}
diff --git a/sys/arm64/arm64/db_trace.c b/sys/arm64/arm64/db_trace.c
new file mode 100644
index 0000000..1e89bac
--- /dev/null
+++ b/sys/arm64/arm64/db_trace.c
@@ -0,0 +1,152 @@
+/*-
+ * Copyright (c) 2015 The FreeBSD Foundation
+ * All rights reserved.
+ *
+ * This software was developed by Semihalf under
+ * the sponsorship of the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+#include <sys/param.h>
+#include <sys/proc.h>
+#include <sys/kdb.h>
+#include <machine/pcb.h>
+#include <ddb/ddb.h>
+#include <ddb/db_sym.h>
+
+#include <machine/armreg.h>
+#include <machine/debug_monitor.h>
+
+struct unwind_state {
+ uint64_t fp;
+ uint64_t sp;
+ uint64_t pc;
+};
+
+void
+db_md_list_watchpoints()
+{
+
+ dbg_show_watchpoint();
+}
+
+int
+db_md_clr_watchpoint(db_expr_t addr, db_expr_t size)
+{
+
+ return (dbg_remove_watchpoint(addr, size, DBG_FROM_EL1));
+}
+
+int
+db_md_set_watchpoint(db_expr_t addr, db_expr_t size)
+{
+
+ return (dbg_setup_watchpoint(addr, size, DBG_FROM_EL1,
+ HW_BREAKPOINT_RW));
+}
+
+static int
+db_unwind_frame(struct unwind_state *frame)
+{
+ uint64_t fp = frame->fp;
+
+ if (fp == 0)
+ return -1;
+
+ frame->sp = fp + 0x10;
+ /* FP to previous frame (X29) */
+ frame->fp = *(uint64_t *)(fp);
+ /* LR (X30) */
+ frame->pc = *(uint64_t *)(fp + 8) - 4;
+ return (0);
+}
+
+static void
+db_stack_trace_cmd(struct unwind_state *frame)
+{
+ c_db_sym_t sym;
+ const char *name;
+ db_expr_t value;
+ db_expr_t offset;
+
+ while (1) {
+ uint64_t pc = frame->pc;
+ int ret;
+
+ ret = db_unwind_frame(frame);
+ if (ret < 0)
+ break;
+
+ sym = db_search_symbol(pc, DB_STGY_ANY, &offset);
+ if (sym == C_DB_SYM_NULL) {
+ value = 0;
+ name = "(null)";
+ } else
+ db_symbol_values(sym, &name, &value);
+
+ db_printf("%s() at ", name);
+ db_printsym(frame->pc, DB_STGY_PROC);
+ db_printf("\n");
+
+ db_printf("\t pc = 0x%016lx lr = 0x%016lx\n", pc,
+ frame->pc);
+ db_printf("\t sp = 0x%016lx fp = 0x%016lx\n", frame->sp,
+ frame->fp);
+ /* TODO: Show some more registers */
+ db_printf("\n");
+ }
+}
+
+int
+db_trace_thread(struct thread *thr, int count)
+{
+ struct unwind_state frame;
+ struct pcb *ctx;
+
+ if (thr != curthread) {
+ ctx = kdb_thr_ctx(thr);
+
+ frame.sp = (uint64_t)ctx->pcb_sp;
+ frame.fp = (uint64_t)ctx->pcb_x[29];
+ frame.pc = (uint64_t)ctx->pcb_x[30];
+ db_stack_trace_cmd(&frame);
+ } else
+ db_trace_self();
+ return (0);
+}
+
+void
+db_trace_self(void)
+{
+ struct unwind_state frame;
+ uint64_t sp;
+
+ __asm __volatile("mov %0, sp" : "=&r" (sp));
+
+ frame.sp = sp;
+ frame.fp = (uint64_t)__builtin_frame_address(0);
+ frame.pc = (uint64_t)db_trace_self;
+ db_stack_trace_cmd(&frame);
+}
diff --git a/sys/arm64/arm64/debug_monitor.c b/sys/arm64/arm64/debug_monitor.c
new file mode 100644
index 0000000..50d663d
--- /dev/null
+++ b/sys/arm64/arm64/debug_monitor.c
@@ -0,0 +1,487 @@
+/*-
+ * Copyright (c) 2014 The FreeBSD Foundation
+ * All rights reserved.
+ *
+ * This software was developed by Semihalf under
+ * the sponsorship of the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/types.h>
+#include <sys/kdb.h>
+#include <sys/pcpu.h>
+#include <sys/systm.h>
+
+#include <machine/armreg.h>
+#include <machine/cpu.h>
+#include <machine/debug_monitor.h>
+#include <machine/kdb.h>
+#include <machine/param.h>
+
+#include <ddb/ddb.h>
+#include <ddb/db_sym.h>
+
+enum dbg_t {
+ DBG_TYPE_BREAKPOINT = 0,
+ DBG_TYPE_WATCHPOINT = 1,
+};
+
+static int dbg_watchpoint_num;
+static int dbg_breakpoint_num;
+static int dbg_ref_count_mde[MAXCPU];
+static int dbg_ref_count_kde[MAXCPU];
+
+/* Watchpoints/breakpoints control register bitfields */
+#define DBG_WATCH_CTRL_LEN_1 (0x1 << 5)
+#define DBG_WATCH_CTRL_LEN_2 (0x3 << 5)
+#define DBG_WATCH_CTRL_LEN_4 (0xf << 5)
+#define DBG_WATCH_CTRL_LEN_8 (0xff << 5)
+#define DBG_WATCH_CTRL_LEN_MASK(x) ((x) & (0xff << 5))
+#define DBG_WATCH_CTRL_EXEC (0x0 << 3)
+#define DBG_WATCH_CTRL_LOAD (0x1 << 3)
+#define DBG_WATCH_CTRL_STORE (0x2 << 3)
+#define DBG_WATCH_CTRL_ACCESS_MASK(x) ((x) & (0x3 << 3))
+
+/* Common for breakpoint and watchpoint */
+#define DBG_WB_CTRL_EL1 (0x1 << 1)
+#define DBG_WB_CTRL_EL0 (0x2 << 1)
+#define DBG_WB_CTRL_ELX_MASK(x) ((x) & (0x3 << 1))
+#define DBG_WB_CTRL_E (0x1 << 0)
+
+#define DBG_REG_BASE_BVR 0
+#define DBG_REG_BASE_BCR (DBG_REG_BASE_BVR + 16)
+#define DBG_REG_BASE_WVR (DBG_REG_BASE_BCR + 16)
+#define DBG_REG_BASE_WCR (DBG_REG_BASE_WVR + 16)
+
+/* Watchpoint/breakpoint helpers */
+#define DBG_WB_WVR "wvr"
+#define DBG_WB_WCR "wcr"
+#define DBG_WB_BVR "bvr"
+#define DBG_WB_BCR "bcr"
+
+#define DBG_WB_READ(reg, num, val) do { \
+ __asm __volatile("mrs %0, dbg" reg #num "_el1" : "=r" (val)); \
+} while (0)
+
+#define DBG_WB_WRITE(reg, num, val) do { \
+ __asm __volatile("msr dbg" reg #num "_el1, %0" :: "r" (val)); \
+} while (0)
+
+#define READ_WB_REG_CASE(reg, num, offset, val) \
+ case (num + offset): \
+ DBG_WB_READ(reg, num, val); \
+ break
+
+#define WRITE_WB_REG_CASE(reg, num, offset, val) \
+ case (num + offset): \
+ DBG_WB_WRITE(reg, num, val); \
+ break
+
+#define SWITCH_CASES_READ_WB_REG(reg, offset, val) \
+ READ_WB_REG_CASE(reg, 0, offset, val); \
+ READ_WB_REG_CASE(reg, 1, offset, val); \
+ READ_WB_REG_CASE(reg, 2, offset, val); \
+ READ_WB_REG_CASE(reg, 3, offset, val); \
+ READ_WB_REG_CASE(reg, 4, offset, val); \
+ READ_WB_REG_CASE(reg, 5, offset, val); \
+ READ_WB_REG_CASE(reg, 6, offset, val); \
+ READ_WB_REG_CASE(reg, 7, offset, val); \
+ READ_WB_REG_CASE(reg, 8, offset, val); \
+ READ_WB_REG_CASE(reg, 9, offset, val); \
+ READ_WB_REG_CASE(reg, 10, offset, val); \
+ READ_WB_REG_CASE(reg, 11, offset, val); \
+ READ_WB_REG_CASE(reg, 12, offset, val); \
+ READ_WB_REG_CASE(reg, 13, offset, val); \
+ READ_WB_REG_CASE(reg, 14, offset, val); \
+ READ_WB_REG_CASE(reg, 15, offset, val)
+
+#define SWITCH_CASES_WRITE_WB_REG(reg, offset, val) \
+ WRITE_WB_REG_CASE(reg, 0, offset, val); \
+ WRITE_WB_REG_CASE(reg, 1, offset, val); \
+ WRITE_WB_REG_CASE(reg, 2, offset, val); \
+ WRITE_WB_REG_CASE(reg, 3, offset, val); \
+ WRITE_WB_REG_CASE(reg, 4, offset, val); \
+ WRITE_WB_REG_CASE(reg, 5, offset, val); \
+ WRITE_WB_REG_CASE(reg, 6, offset, val); \
+ WRITE_WB_REG_CASE(reg, 7, offset, val); \
+ WRITE_WB_REG_CASE(reg, 8, offset, val); \
+ WRITE_WB_REG_CASE(reg, 9, offset, val); \
+ WRITE_WB_REG_CASE(reg, 10, offset, val); \
+ WRITE_WB_REG_CASE(reg, 11, offset, val); \
+ WRITE_WB_REG_CASE(reg, 12, offset, val); \
+ WRITE_WB_REG_CASE(reg, 13, offset, val); \
+ WRITE_WB_REG_CASE(reg, 14, offset, val); \
+ WRITE_WB_REG_CASE(reg, 15, offset, val)
+
+static uint64_t
+dbg_wb_read_reg(int reg, int n)
+{
+ uint64_t val = 0;
+
+ switch (reg + n) {
+ SWITCH_CASES_READ_WB_REG(DBG_WB_WVR, DBG_REG_BASE_WVR, val);
+ SWITCH_CASES_READ_WB_REG(DBG_WB_WCR, DBG_REG_BASE_WCR, val);
+ SWITCH_CASES_READ_WB_REG(DBG_WB_BVR, DBG_REG_BASE_BVR, val);
+ SWITCH_CASES_READ_WB_REG(DBG_WB_BCR, DBG_REG_BASE_BCR, val);
+ default:
+ db_printf("trying to read from wrong debug register %d\n", n);
+ }
+
+ return val;
+}
+
+static void
+dbg_wb_write_reg(int reg, int n, uint64_t val)
+{
+ switch (reg + n) {
+ SWITCH_CASES_WRITE_WB_REG(DBG_WB_WVR, DBG_REG_BASE_WVR, val);
+ SWITCH_CASES_WRITE_WB_REG(DBG_WB_WCR, DBG_REG_BASE_WCR, val);
+ SWITCH_CASES_WRITE_WB_REG(DBG_WB_BVR, DBG_REG_BASE_BVR, val);
+ SWITCH_CASES_WRITE_WB_REG(DBG_WB_BCR, DBG_REG_BASE_BCR, val);
+ default:
+ db_printf("trying to write to wrong debug register %d\n", n);
+ }
+ isb();
+}
+
+void
+kdb_cpu_set_singlestep(void)
+{
+
+ kdb_frame->tf_spsr |= DBG_SPSR_SS;
+ WRITE_SPECIALREG(MDSCR_EL1, READ_SPECIALREG(MDSCR_EL1) |
+ DBG_MDSCR_SS | DBG_MDSCR_KDE);
+
+ /*
+ * Disable breakpoints and watchpoints, e.g. stepping
+ * over watched instruction will trigger break exception instead of
+ * single-step exception and locks CPU on that instruction for ever.
+ */
+ if (dbg_ref_count_mde[PCPU_GET(cpuid)] > 0) {
+ WRITE_SPECIALREG(MDSCR_EL1,
+ READ_SPECIALREG(MDSCR_EL1) & ~DBG_MDSCR_MDE);
+ }
+}
+
+void
+kdb_cpu_clear_singlestep(void)
+{
+
+ WRITE_SPECIALREG(MDSCR_EL1, READ_SPECIALREG(MDSCR_EL1) &
+ ~(DBG_MDSCR_SS | DBG_MDSCR_KDE));
+
+ /* Restore breakpoints and watchpoints */
+ if (dbg_ref_count_mde[PCPU_GET(cpuid)] > 0) {
+ WRITE_SPECIALREG(MDSCR_EL1,
+ READ_SPECIALREG(MDSCR_EL1) | DBG_MDSCR_MDE);
+ }
+
+ if (dbg_ref_count_kde[PCPU_GET(cpuid)] > 0) {
+ WRITE_SPECIALREG(MDSCR_EL1,
+ READ_SPECIALREG(MDSCR_EL1) | DBG_MDSCR_KDE);
+ }
+}
+
+static const char *
+dbg_watchtype_str(uint32_t type)
+{
+ switch (type) {
+ case DBG_WATCH_CTRL_EXEC:
+ return ("execute");
+ case DBG_WATCH_CTRL_STORE:
+ return ("write");
+ case DBG_WATCH_CTRL_LOAD:
+ return ("read");
+ case DBG_WATCH_CTRL_LOAD | DBG_WATCH_CTRL_STORE:
+ return ("read/write");
+ default:
+ return ("invalid");
+ }
+}
+
+static int
+dbg_watchtype_len(uint32_t len)
+{
+ switch (len) {
+ case DBG_WATCH_CTRL_LEN_1:
+ return (1);
+ case DBG_WATCH_CTRL_LEN_2:
+ return (2);
+ case DBG_WATCH_CTRL_LEN_4:
+ return (4);
+ case DBG_WATCH_CTRL_LEN_8:
+ return (8);
+ default:
+ return (0);
+ }
+}
+
+void
+dbg_show_watchpoint(void)
+{
+ uint32_t wcr, len, type;
+ uint64_t addr;
+ int i;
+
+ db_printf("\nhardware watchpoints:\n");
+ db_printf(" watch status type len address symbol\n");
+ db_printf(" ----- -------- ---------- --- ------------------ ------------------\n");
+ for (i = 0; i < dbg_watchpoint_num; i++) {
+ wcr = dbg_wb_read_reg(DBG_REG_BASE_WCR, i);
+ if ((wcr & DBG_WB_CTRL_E) != 0) {
+ type = DBG_WATCH_CTRL_ACCESS_MASK(wcr);
+ len = DBG_WATCH_CTRL_LEN_MASK(wcr);
+ addr = dbg_wb_read_reg(DBG_REG_BASE_WVR, i);
+ db_printf(" %-5d %-8s %10s %3d 0x%16lx ",
+ i, "enabled", dbg_watchtype_str(type),
+ dbg_watchtype_len(len), addr);
+ db_printsym((db_addr_t)addr, DB_STGY_ANY);
+ db_printf("\n");
+ } else {
+ db_printf(" %-5d disabled\n", i);
+ }
+ }
+}
+
+
+static int
+dbg_find_free_slot(enum dbg_t type)
+{
+ u_int max, reg, i;
+
+ switch(type) {
+ case DBG_TYPE_BREAKPOINT:
+ max = dbg_breakpoint_num;
+ reg = DBG_REG_BASE_BCR;
+
+ break;
+ case DBG_TYPE_WATCHPOINT:
+ max = dbg_watchpoint_num;
+ reg = DBG_REG_BASE_WCR;
+ break;
+ default:
+ db_printf("Unsupported debug type\n");
+ return (i);
+ }
+
+ for (i = 0; i < max; i++) {
+ if ((dbg_wb_read_reg(reg, i) & DBG_WB_CTRL_E) == 0)
+ return (i);
+ }
+
+ return (-1);
+}
+
+static int
+dbg_find_slot(enum dbg_t type, db_expr_t addr)
+{
+ u_int max, reg_addr, reg_ctrl, i;
+
+ switch(type) {
+ case DBG_TYPE_BREAKPOINT:
+ max = dbg_breakpoint_num;
+ reg_addr = DBG_REG_BASE_BVR;
+ reg_ctrl = DBG_REG_BASE_BCR;
+ break;
+ case DBG_TYPE_WATCHPOINT:
+ max = dbg_watchpoint_num;
+ reg_addr = DBG_REG_BASE_WVR;
+ reg_ctrl = DBG_REG_BASE_WCR;
+ break;
+ default:
+ db_printf("Unsupported debug type\n");
+ return (i);
+ }
+
+ for (i = 0; i < max; i++) {
+ if ((dbg_wb_read_reg(reg_addr, i) == addr) &&
+ ((dbg_wb_read_reg(reg_ctrl, i) & DBG_WB_CTRL_E) != 0))
+ return (i);
+ }
+
+ return (-1);
+}
+
+static void
+dbg_enable_monitor(enum dbg_el_t el)
+{
+ uint64_t reg_mdcr = 0;
+
+ /*
+ * There is no need to have debug monitor on permanently, thus we are
+ * refcounting and turn it on only if any of CPU is going to use that.
+ */
+ if (atomic_fetchadd_int(&dbg_ref_count_mde[PCPU_GET(cpuid)], 1) == 0)
+ reg_mdcr = DBG_MDSCR_MDE;
+
+ if ((el == DBG_FROM_EL1) &&
+ atomic_fetchadd_int(&dbg_ref_count_kde[PCPU_GET(cpuid)], 1) == 0)
+ reg_mdcr |= DBG_MDSCR_KDE;
+
+ if (reg_mdcr)
+ WRITE_SPECIALREG(MDSCR_EL1, READ_SPECIALREG(MDSCR_EL1) | reg_mdcr);
+}
+
+static void
+dbg_disable_monitor(enum dbg_el_t el)
+{
+ uint64_t reg_mdcr = 0;
+
+ if (atomic_fetchadd_int(&dbg_ref_count_mde[PCPU_GET(cpuid)], -1) == 1)
+ reg_mdcr = DBG_MDSCR_MDE;
+
+ if ((el == DBG_FROM_EL1) &&
+ atomic_fetchadd_int(&dbg_ref_count_kde[PCPU_GET(cpuid)], -1) == 1)
+ reg_mdcr |= DBG_MDSCR_KDE;
+
+ if (reg_mdcr)
+ WRITE_SPECIALREG(MDSCR_EL1, READ_SPECIALREG(MDSCR_EL1) & ~reg_mdcr);
+}
+
+int
+dbg_setup_watchpoint(db_expr_t addr, db_expr_t size, enum dbg_el_t el,
+ enum dbg_access_t access)
+{
+ uint64_t wcr_size, wcr_priv, wcr_access;
+ u_int i;
+
+ i = dbg_find_free_slot(DBG_TYPE_WATCHPOINT);
+ if (i == -1) {
+ db_printf("Can not find slot for watchpoint, max %d"
+ " watchpoints supported\n", dbg_watchpoint_num);
+ return (i);
+ }
+
+ switch(size) {
+ case 1:
+ wcr_size = DBG_WATCH_CTRL_LEN_1;
+ break;
+ case 2:
+ wcr_size = DBG_WATCH_CTRL_LEN_2;
+ break;
+ case 4:
+ wcr_size = DBG_WATCH_CTRL_LEN_4;
+ break;
+ case 8:
+ wcr_size = DBG_WATCH_CTRL_LEN_8;
+ break;
+ default:
+ db_printf("Unsupported address size for watchpoint\n");
+ return (-1);
+ }
+
+ switch(el) {
+ case DBG_FROM_EL0:
+ wcr_priv = DBG_WB_CTRL_EL0;
+ break;
+ case DBG_FROM_EL1:
+ wcr_priv = DBG_WB_CTRL_EL1;
+ break;
+ default:
+ db_printf("Unsupported exception level for watchpoint\n");
+ return (-1);
+ }
+
+ switch(access) {
+ case HW_BREAKPOINT_X:
+ wcr_access = DBG_WATCH_CTRL_EXEC;
+ break;
+ case HW_BREAKPOINT_R:
+ wcr_access = DBG_WATCH_CTRL_LOAD;
+ break;
+ case HW_BREAKPOINT_W:
+ wcr_access = DBG_WATCH_CTRL_STORE;
+ break;
+ case HW_BREAKPOINT_RW:
+ wcr_access = DBG_WATCH_CTRL_LOAD | DBG_WATCH_CTRL_STORE;
+ break;
+ default:
+ db_printf("Unsupported exception level for watchpoint\n");
+ return (-1);
+ }
+
+ dbg_wb_write_reg(DBG_REG_BASE_WVR, i, addr);
+ dbg_wb_write_reg(DBG_REG_BASE_WCR, i, wcr_size | wcr_access | wcr_priv |
+ DBG_WB_CTRL_E);
+ dbg_enable_monitor(el);
+ return (0);
+}
+
+int
+dbg_remove_watchpoint(db_expr_t addr, db_expr_t size, enum dbg_el_t el)
+{
+ u_int i;
+
+ i = dbg_find_slot(DBG_TYPE_WATCHPOINT, addr);
+ if (i == -1) {
+ db_printf("Can not find watchpoint for address 0%lx\n", addr);
+ return (i);
+ }
+
+ dbg_wb_write_reg(DBG_REG_BASE_WCR, i, 0);
+ dbg_disable_monitor(el);
+ return (0);
+}
+
+void
+dbg_monitor_init(void)
+{
+ u_int i;
+
+ /* Clear OS lock */
+ WRITE_SPECIALREG(OSLAR_EL1, 0);
+
+ /* Find out many breakpoints and watchpoints we can use */
+ dbg_watchpoint_num = ((READ_SPECIALREG(ID_AA64DFR0_EL1) >> 20) & 0xf) + 1;
+ dbg_breakpoint_num = ((READ_SPECIALREG(ID_AA64DFR0_EL1) >> 12) & 0xf) + 1;
+
+ if (bootverbose && PCPU_GET(cpuid) == 0) {
+ db_printf("%d watchpoints and %d breakpoints supported\n",
+ dbg_watchpoint_num, dbg_breakpoint_num);
+ }
+
+ /*
+ * We have limited number of {watch,break}points, each consists of
+ * two registers:
+ * - wcr/bcr regsiter configurates corresponding {watch,break}point
+ * behaviour
+ * - wvr/bvr register keeps address we are hunting for
+ *
+ * Reset all breakpoints and watchpoints.
+ */
+ for (i = 0; i < dbg_watchpoint_num; ++i) {
+ dbg_wb_write_reg(DBG_REG_BASE_WCR, i, 0);
+ dbg_wb_write_reg(DBG_REG_BASE_WVR, i, 0);
+ }
+
+ for (i = 0; i < dbg_breakpoint_num; ++i) {
+ dbg_wb_write_reg(DBG_REG_BASE_BCR, i, 0);
+ dbg_wb_write_reg(DBG_REG_BASE_BVR, i, 0);
+ }
+
+ dbg_enable();
+}
diff --git a/sys/arm64/arm64/dump_machdep.c b/sys/arm64/arm64/dump_machdep.c
new file mode 100644
index 0000000..d92777f
--- /dev/null
+++ b/sys/arm64/arm64/dump_machdep.c
@@ -0,0 +1,73 @@
+/*-
+ * Copyright (c) 2015 The FreeBSD Foundation
+ * All rights reserved.
+ *
+ * This software was developed by Andrew Turner under
+ * sponsorship from the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/conf.h>
+#include <sys/kernel.h>
+#include <sys/kerneldump.h>
+#include <sys/proc.h>
+#include <sys/sysctl.h>
+
+#include <machine/dump.h>
+
+int do_minidump = 1;
+TUNABLE_INT("debug.minidump", &do_minidump);
+SYSCTL_INT(_debug, OID_AUTO, minidump, CTLFLAG_RW, &do_minidump, 0,
+ "Enable mini crash dumps");
+
+void
+dumpsys_wbinv_all(void)
+{
+
+ printf("dumpsys_wbinv_all\n");
+}
+
+void
+dumpsys_map_chunk(vm_paddr_t pa, size_t chunk __unused, void **va)
+{
+
+ printf("dumpsys_map_chunk\n");
+ while(1);
+}
+
+/*
+ * Add a header to be used by libkvm to get the va to pa delta
+ */
+int
+dumpsys_write_aux_headers(struct dumperinfo *di)
+{
+
+ printf("dumpsys_map_chunk\n");
+ return (0);
+}
diff --git a/sys/arm64/arm64/elf_machdep.c b/sys/arm64/arm64/elf_machdep.c
new file mode 100644
index 0000000..5702e7f
--- /dev/null
+++ b/sys/arm64/arm64/elf_machdep.c
@@ -0,0 +1,164 @@
+/*-
+ * Copyright (c) 2014 The FreeBSD Foundation.
+ * Copyright (c) 2014 Andrew Turner.
+ * Copyright (c) 2001 Jake Burkholder.
+ * Copyright (c) 2000 Eduardo Horvath.
+ * Copyright (c) 1999 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Paul Kranenburg.
+ *
+ * This software was developed by Andrew Turner under
+ * sponsorship from the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * from: NetBSD: mdreloc.c,v 1.42 2008/04/28 20:23:04 martin Exp
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/kernel.h>
+#include <sys/systm.h>
+#include <sys/exec.h>
+#include <sys/imgact.h>
+#include <sys/linker.h>
+#include <sys/proc.h>
+#include <sys/sysent.h>
+#include <sys/imgact_elf.h>
+#include <sys/syscall.h>
+#include <sys/signalvar.h>
+#include <sys/vnode.h>
+
+#include <vm/vm.h>
+#include <vm/vm_param.h>
+
+#include <machine/elf.h>
+#include <machine/md_var.h>
+
+#include "linker_if.h"
+
+static struct sysentvec elf64_freebsd_sysvec = {
+ .sv_size = SYS_MAXSYSCALL,
+ .sv_table = sysent,
+ .sv_mask = 0,
+ .sv_sigsize = 0,
+ .sv_sigtbl = NULL,
+ .sv_errsize = 0,
+ .sv_errtbl = NULL,
+ .sv_transtrap = NULL,
+ .sv_fixup = __elfN(freebsd_fixup),
+ .sv_sendsig = sendsig,
+ .sv_sigcode = sigcode,
+ .sv_szsigcode = &szsigcode,
+ .sv_prepsyscall = NULL,
+ .sv_name = "FreeBSD ELF64",
+ .sv_coredump = __elfN(coredump),
+ .sv_imgact_try = NULL,
+ .sv_minsigstksz = MINSIGSTKSZ,
+ .sv_pagesize = PAGE_SIZE,
+ .sv_minuser = VM_MIN_ADDRESS,
+ .sv_maxuser = VM_MAXUSER_ADDRESS,
+ .sv_usrstack = USRSTACK,
+ .sv_psstrings = PS_STRINGS,
+ .sv_stackprot = VM_PROT_READ | VM_PROT_WRITE,
+ .sv_copyout_strings = exec_copyout_strings,
+ .sv_setregs = exec_setregs,
+ .sv_fixlimit = NULL,
+ .sv_maxssiz = NULL,
+ .sv_flags = SV_ABI_FREEBSD | SV_LP64,
+ .sv_set_syscall_retval = cpu_set_syscall_retval,
+ .sv_fetch_syscall_args = cpu_fetch_syscall_args,
+ .sv_syscallnames = syscallnames,
+ .sv_schedtail = NULL,
+};
+
+static Elf64_Brandinfo freebsd_brand_info = {
+ .brand = ELFOSABI_FREEBSD,
+ .machine = EM_AARCH64,
+ .compat_3_brand = "FreeBSD",
+ .emul_path = NULL,
+ .interp_path = "/libexec/ld-elf.so.1",
+ .sysvec = &elf64_freebsd_sysvec,
+ .interp_newpath = NULL,
+ .brand_note = &elf64_freebsd_brandnote,
+ .flags = BI_CAN_EXEC_DYN | BI_BRAND_NOTE
+};
+
+SYSINIT(elf64, SI_SUB_EXEC, SI_ORDER_FIRST,
+ (sysinit_cfunc_t)elf64_insert_brand_entry, &freebsd_brand_info);
+
+static Elf64_Brandinfo freebsd_brand_oinfo = {
+ .brand = ELFOSABI_FREEBSD,
+ .machine = EM_AARCH64,
+ .compat_3_brand = "FreeBSD",
+ .emul_path = NULL,
+ .interp_path = "/usr/libexec/ld-elf.so.1",
+ .sysvec = &elf64_freebsd_sysvec,
+ .interp_newpath = NULL,
+ .brand_note = &elf64_freebsd_brandnote,
+ .flags = BI_CAN_EXEC_DYN | BI_BRAND_NOTE
+};
+
+SYSINIT(oelf64, SI_SUB_EXEC, SI_ORDER_ANY,
+ (sysinit_cfunc_t)elf64_insert_brand_entry, &freebsd_brand_oinfo);
+
+void
+elf64_dump_thread(struct thread *td __unused, void *dst __unused,
+ size_t *off __unused)
+{
+
+}
+
+int
+elf_reloc_local(linker_file_t lf, Elf_Addr relocbase, const void *data,
+ int type, elf_lookup_fn lookup __unused)
+{
+
+ panic("elf_reloc_local");
+}
+
+/* Process one elf relocation with addend. */
+int
+elf_reloc(linker_file_t lf, Elf_Addr relocbase, const void *data, int type,
+ elf_lookup_fn lookup)
+{
+
+ panic("elf_reloc");
+}
+
+int
+elf_cpu_load_file(linker_file_t lf __unused)
+{
+
+ return (0);
+}
+
+int
+elf_cpu_unload_file(linker_file_t lf __unused)
+{
+
+ return (0);
+}
diff --git a/sys/arm64/arm64/exception.S b/sys/arm64/arm64/exception.S
new file mode 100644
index 0000000..efb1364
--- /dev/null
+++ b/sys/arm64/arm64/exception.S
@@ -0,0 +1,198 @@
+/*-
+ * Copyright (c) 2014 Andrew Turner
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+#include <machine/asm.h>
+__FBSDID("$FreeBSD$");
+
+#include "assym.s"
+
+ .text
+
+.macro save_registers el
+ stp x28, x29, [sp, #-16]!
+ stp x26, x27, [sp, #-16]!
+ stp x24, x25, [sp, #-16]!
+ stp x22, x23, [sp, #-16]!
+ stp x20, x21, [sp, #-16]!
+ stp x18, x19, [sp, #-16]!
+ stp x16, x17, [sp, #-16]!
+ stp x14, x15, [sp, #-16]!
+ stp x12, x13, [sp, #-16]!
+ stp x10, x11, [sp, #-16]!
+ stp x8, x9, [sp, #-16]!
+ stp x6, x7, [sp, #-16]!
+ stp x4, x5, [sp, #-16]!
+ stp x2, x3, [sp, #-16]!
+ stp x0, x1, [sp, #-16]!
+ mrs x10, elr_el1
+ mrs x11, spsr_el1
+.if \el == 0
+ mrs x12, sp_el0
+.else
+ mov x12, sp
+.endif
+ stp x10, x11, [sp, #-16]!
+ stp x12, lr, [sp, #-16]!
+ mrs x18, tpidr_el1
+.endm
+
+.macro restore_registers el
+ ldp x12, lr, [sp], #16
+ ldp x10, x11, [sp], #16
+.if \el == 0
+ msr sp_el0, x12
+.else
+ mov sp, x12
+.endif
+ msr spsr_el1, x11
+ msr elr_el1, x10
+ ldp x0, x1, [sp], #16
+ ldp x2, x3, [sp], #16
+ ldp x4, x5, [sp], #16
+ ldp x6, x7, [sp], #16
+ ldp x8, x9, [sp], #16
+ ldp x10, x11, [sp], #16
+ ldp x12, x13, [sp], #16
+ ldp x14, x15, [sp], #16
+ ldp x16, x17, [sp], #16
+.if \el == 0
+ ldp x18, x19, [sp], #16
+.else
+ ldp xzr, x19, [sp], #16
+.endif
+ ldp x20, x21, [sp], #16
+ ldp x22, x23, [sp], #16
+ ldp x24, x25, [sp], #16
+ ldp x26, x27, [sp], #16
+ ldp x28, x29, [sp], #16
+.endm
+
+.macro do_ast
+ /* Disable interrupts */
+ mrs x19, daif
+ msr daifset, #2
+
+ /* Read the current thread flags */
+1: ldr x1, [x18, #PC_CURTHREAD] /* Load curthread */
+ ldr x2, [x1, #TD_FLAGS]! /* TODO: No need for the ! but clang fails without it */
+
+ /* Check if we have either bits set */
+ mov x3, #((TDF_ASTPENDING|TDF_NEEDRESCHED) >> 8)
+ lsl x3, x3, #8
+ and x2, x2, x3
+ cmp x2, #0
+ b.eq 2f
+
+ /* Restore interrupts */
+ msr daif, x19
+
+ /* handle the ast */
+ mov x0, sp
+ bl _C_LABEL(ast)
+
+ /* Disable interrupts */
+ mrs x19, daif
+ msr daifset, #2
+
+2:
+ /* Restore interrupts */
+ msr daif, x19
+.endm
+
+handle_el1h_sync:
+ save_registers 1
+ mov x0, sp
+ bl do_el1h_sync
+ restore_registers 1
+ eret
+
+handle_el1h_irq:
+ save_registers 1
+ mov x0, sp
+ bl arm_cpu_intr
+ restore_registers 1
+ eret
+
+handle_el1h_error:
+ brk 0xf13
+
+handle_el0_sync:
+ save_registers 0
+ mov x0, sp
+ bl do_el0_sync
+ do_ast
+ restore_registers 0
+ eret
+
+handle_el0_irq:
+ save_registers 0
+ mov x0, sp
+ bl arm_cpu_intr
+ restore_registers 0
+ eret
+
+handle_el0_error:
+ save_registers 0
+ mov x0, sp
+ bl do_el0_error
+ brk 0xf23
+ 1: b 1b
+
+.macro vempty
+ .align 7
+ brk 0xfff
+ 1: b 1b
+.endm
+
+.macro vector name
+ .align 7
+ b handle_\name
+.endm
+
+ .align 11
+ .globl exception_vectors
+exception_vectors:
+ vempty /* Synchronous EL1t */
+ vempty /* IRQ EL1t */
+ vempty /* FIQ EL1t */
+ vempty /* Error EL1t */
+
+ vector el1h_sync /* Synchronous EL1h */
+ vector el1h_irq /* IRQ EL1h */
+ vempty /* FIQ EL1h */
+ vector el1h_error /* Error EL1h */
+
+ vector el0_sync /* Synchronous 64-bit EL0 */
+ vector el0_irq /* IRQ 64-bit EL0 */
+ vempty /* FIQ 64-bit EL0 */
+ vector el0_error /* Error 64-bit EL0 */
+
+ vempty /* Synchronous 32-bit EL0 */
+ vempty /* IRQ 32-bit EL0 */
+ vempty /* FIQ 32-bit EL0 */
+ vempty /* Error 32-bit EL0 */
+
diff --git a/sys/arm64/arm64/genassym.c b/sys/arm64/arm64/genassym.c
new file mode 100644
index 0000000..33b2042
--- /dev/null
+++ b/sys/arm64/arm64/genassym.c
@@ -0,0 +1,61 @@
+/*-
+ * Copyright (c) 2004 Olivier Houchard
+ * Copyright (c) 2014 Andrew Turner
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+#include <sys/param.h>
+#include <sys/assym.h>
+#include <sys/pcpu.h>
+#include <sys/proc.h>
+
+#include <machine/frame.h>
+#include <machine/pcb.h>
+#include <machine/vmparam.h>
+
+ASSYM(KERNBASE, KERNBASE);
+ASSYM(TDF_ASTPENDING, TDF_ASTPENDING);
+ASSYM(TDF_NEEDRESCHED, TDF_NEEDRESCHED);
+
+ASSYM(PCPU_SIZE, sizeof(struct pcpu));
+ASSYM(PC_CURPCB, offsetof(struct pcpu, pc_curpcb));
+ASSYM(PC_CURTHREAD, offsetof(struct pcpu, pc_curthread));
+
+/* Size of pcb, rounded to keep stack alignment */
+ASSYM(PCB_SIZE, roundup2(sizeof(struct pcb), STACKALIGNBYTES + 1));
+ASSYM(PCB_REGS, offsetof(struct pcb, pcb_x));
+ASSYM(PCB_SP, offsetof(struct pcb, pcb_sp));
+ASSYM(PCB_L1ADDR, offsetof(struct pcb, pcb_l1addr));
+ASSYM(PCB_ONFAULT, offsetof(struct pcb, pcb_onfault));
+
+ASSYM(SF_UC, offsetof(struct sigframe, sf_uc));
+
+ASSYM(TD_PCB, offsetof(struct thread, td_pcb));
+ASSYM(TD_FLAGS, offsetof(struct thread, td_flags));
+ASSYM(TD_LOCK, offsetof(struct thread, td_lock));
+
+ASSYM(TF_X, offsetof(struct trapframe, tf_x));
diff --git a/sys/arm64/arm64/gic.c b/sys/arm64/arm64/gic.c
new file mode 100644
index 0000000..59fac99
--- /dev/null
+++ b/sys/arm64/arm64/gic.c
@@ -0,0 +1,398 @@
+/*-
+ * Copyright (c) 2011 The FreeBSD Foundation
+ * Copyright (c) 2014 Andrew Turner
+ * All rights reserved.
+ *
+ * Developed by Damjan Marion <damjan.marion@gmail.com>
+ *
+ * Based on OMAP4 GIC code by Ben Gray
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of the company nor the name of the author may be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/bus.h>
+#include <sys/kernel.h>
+#include <sys/ktr.h>
+#include <sys/module.h>
+#include <sys/rman.h>
+#include <sys/pcpu.h>
+#include <sys/proc.h>
+#include <sys/cpuset.h>
+#include <sys/lock.h>
+#include <sys/mutex.h>
+#include <machine/bus.h>
+#include <machine/intr.h>
+#include <machine/smp.h>
+
+#include <dev/fdt/fdt_common.h>
+#include <dev/ofw/openfirm.h>
+#include <dev/ofw/ofw_bus.h>
+#include <dev/ofw/ofw_bus_subr.h>
+
+
+#include "pic_if.h"
+
+/* We are using GICv2 register naming */
+
+/* Distributor Registers */
+#define GICD_CTLR 0x000 /* v1 ICDDCR */
+#define GICD_TYPER 0x004 /* v1 ICDICTR */
+#define GICD_IIDR 0x008 /* v1 ICDIIDR */
+#define GICD_IGROUPR(n) (0x0080 + ((n) * 4)) /* v1 ICDISER */
+#define GICD_ISENABLER(n) (0x0100 + ((n) * 4)) /* v1 ICDISER */
+#define GICD_ICENABLER(n) (0x0180 + ((n) * 4)) /* v1 ICDICER */
+#define GICD_ISPENDR(n) (0x0200 + ((n) * 4)) /* v1 ICDISPR */
+#define GICD_ICPENDR(n) (0x0280 + ((n) * 4)) /* v1 ICDICPR */
+#define GICD_ICACTIVER(n) (0x0380 + ((n) * 4)) /* v1 ICDABR */
+#define GICD_IPRIORITYR(n) (0x0400 + ((n) * 4)) /* v1 ICDIPR */
+#define GICD_ITARGETSR(n) (0x0800 + ((n) * 4)) /* v1 ICDIPTR */
+#define GICD_ICFGR(n) (0x0C00 + ((n) * 4)) /* v1 ICDICFR */
+#define GICD_SGIR(n) (0x0F00 + ((n) * 4)) /* v1 ICDSGIR */
+
+/* CPU Registers */
+#define GICC_CTLR 0x0000 /* v1 ICCICR */
+#define GICC_PMR 0x0004 /* v1 ICCPMR */
+#define GICC_BPR 0x0008 /* v1 ICCBPR */
+#define GICC_IAR 0x000C /* v1 ICCIAR */
+#define GICC_EOIR 0x0010 /* v1 ICCEOIR */
+#define GICC_RPR 0x0014 /* v1 ICCRPR */
+#define GICC_HPPIR 0x0018 /* v1 ICCHPIR */
+#define GICC_ABPR 0x001C /* v1 ICCABPR */
+#define GICC_IIDR 0x00FC /* v1 ICCIIDR*/
+
+#define GIC_FIRST_IPI 0 /* Irqs 0-15 are SGIs/IPIs. */
+#define GIC_LAST_IPI 15
+#define GIC_FIRST_PPI 16 /* Irqs 16-31 are private (per */
+#define GIC_LAST_PPI 31 /* core) peripheral interrupts. */
+#define GIC_FIRST_SPI 32 /* Irqs 32+ are shared peripherals. */
+
+/* First bit is a polarity bit (0 - low, 1 - high) */
+#define GICD_ICFGR_POL_LOW (0 << 0)
+#define GICD_ICFGR_POL_HIGH (1 << 0)
+#define GICD_ICFGR_POL_MASK 0x1
+/* Second bit is a trigger bit (0 - level, 1 - edge) */
+#define GICD_ICFGR_TRIG_LVL (0 << 1)
+#define GICD_ICFGR_TRIG_EDGE (1 << 1)
+#define GICD_ICFGR_TRIG_MASK 0x2
+
+struct arm_gic_softc {
+ device_t gic_dev;
+ struct resource * gic_res[3];
+ bus_space_tag_t gic_c_bst;
+ bus_space_tag_t gic_d_bst;
+ bus_space_handle_t gic_c_bsh;
+ bus_space_handle_t gic_d_bsh;
+ uint8_t ver;
+ struct mtx mutex;
+ uint32_t nirqs;
+};
+
+static struct resource_spec arm_gic_spec[] = {
+ { SYS_RES_MEMORY, 0, RF_ACTIVE }, /* Distributor registers */
+ { SYS_RES_MEMORY, 1, RF_ACTIVE }, /* CPU Interrupt Intf. registers */
+ { -1, 0 }
+};
+
+static struct arm_gic_softc *arm_gic_sc = NULL;
+
+#define gic_c_read_4(_sc, _reg) \
+ bus_space_read_4((_sc)->gic_c_bst, (_sc)->gic_c_bsh, (_reg))
+#define gic_c_write_4(_sc, _reg, _val) \
+ bus_space_write_4((_sc)->gic_c_bst, (_sc)->gic_c_bsh, (_reg), (_val))
+#define gic_d_read_4(_sc, _reg) \
+ bus_space_read_4((_sc)->gic_d_bst, (_sc)->gic_d_bsh, (_reg))
+#define gic_d_write_4(_sc, _reg, _val) \
+ bus_space_write_4((_sc)->gic_d_bst, (_sc)->gic_d_bsh, (_reg), (_val))
+
+static pic_dispatch_t gic_dispatch;
+static pic_eoi_t gic_eoi;
+static pic_mask_t gic_mask_irq;
+static pic_unmask_t gic_unmask_irq;
+
+static struct ofw_compat_data compat_data[] = {
+ {"arm,gic", true}, /* Non-standard, used in FreeBSD dts. */
+ {"arm,gic-400", true},
+ {"arm,cortex-a15-gic", true},
+ {"arm,cortex-a9-gic", true},
+ {"arm,cortex-a7-gic", true},
+ {"arm,arm11mp-gic", true},
+ {"brcm,brahma-b15-gic", true},
+ {NULL, false}
+};
+
+static int
+arm_gic_probe(device_t dev)
+{
+
+ if (!ofw_bus_status_okay(dev))
+ return (ENXIO);
+
+ if (!ofw_bus_search_compatible(dev, compat_data)->ocd_data)
+ return (ENXIO);
+
+ device_set_desc(dev, "ARM Generic Interrupt Controller");
+ return (BUS_PROBE_DEFAULT);
+}
+
+#ifdef SMP
+static void
+gic_init_secondary(device_t dev)
+{
+ struct arm_gic_softc *sc = device_get_softc(dev);
+ int i;
+
+ for (i = 0; i < sc->nirqs; i += 4)
+ gic_d_write_4(sc, GICD_IPRIORITYR(i >> 2), 0);
+
+ /* Set all the interrupts to be in Group 0 (secure) */
+ for (i = 0; i < sc->nirqs; i += 32) {
+ gic_d_write_4(sc, GICD_IGROUPR(i >> 5), 0);
+ }
+
+ /* Enable CPU interface */
+ gic_c_write_4(sc, GICC_CTLR, 1);
+
+ /* Set priority mask register. */
+ gic_c_write_4(sc, GICC_PMR, 0xff);
+
+ /* Enable interrupt distribution */
+ gic_d_write_4(sc, GICD_CTLR, 0x01);
+
+ /*
+ * Activate the timer interrupts: virtual, secure, and non-secure.
+ */
+ gic_d_write_4(sc, GICD_ISENABLER(27 >> 5), (1UL << (27 & 0x1F)));
+ gic_d_write_4(sc, GICD_ISENABLER(29 >> 5), (1UL << (29 & 0x1F)));
+ gic_d_write_4(sc, GICD_ISENABLER(30 >> 5), (1UL << (30 & 0x1F)));
+}
+#endif
+
+static int
+arm_gic_attach(device_t dev)
+{
+ struct arm_gic_softc *sc;
+ int i;
+ uint32_t icciidr;
+
+ if (arm_gic_sc)
+ return (ENXIO);
+
+ sc = device_get_softc(dev);
+
+ if (bus_alloc_resources(dev, arm_gic_spec, sc->gic_res)) {
+ device_printf(dev, "could not allocate resources\n");
+ return (ENXIO);
+ }
+
+ sc->gic_dev = dev;
+ arm_gic_sc = sc;
+
+ /* Initialize mutex */
+ mtx_init(&sc->mutex, "GIC lock", "", MTX_SPIN);
+
+ /* Distributor Interface */
+ sc->gic_d_bst = rman_get_bustag(sc->gic_res[0]);
+ sc->gic_d_bsh = rman_get_bushandle(sc->gic_res[0]);
+
+ /* CPU Interface */
+ sc->gic_c_bst = rman_get_bustag(sc->gic_res[1]);
+ sc->gic_c_bsh = rman_get_bushandle(sc->gic_res[1]);
+
+ /* Disable interrupt forwarding to the CPU interface */
+ gic_d_write_4(sc, GICD_CTLR, 0x00);
+
+ /* Get the number of interrupts */
+ sc->nirqs = gic_d_read_4(sc, GICD_TYPER);
+ sc->nirqs = 32 * ((sc->nirqs & 0x1f) + 1);
+
+ arm_register_root_pic(dev, sc->nirqs);
+
+ icciidr = gic_c_read_4(sc, GICC_IIDR);
+ device_printf(dev,"pn 0x%x, arch 0x%x, rev 0x%x, implementer 0x%x irqs %u\n",
+ icciidr>>20, (icciidr>>16) & 0xF, (icciidr>>12) & 0xf,
+ (icciidr & 0xfff), sc->nirqs);
+
+ /* Set all global interrupts to be level triggered, active low. */
+ for (i = 32; i < sc->nirqs; i += 16) {
+ gic_d_write_4(sc, GICD_ICFGR(i >> 4), 0x00000000);
+ }
+
+ /* Disable all interrupts. */
+ for (i = 32; i < sc->nirqs; i += 32) {
+ gic_d_write_4(sc, GICD_ICENABLER(i >> 5), 0xFFFFFFFF);
+ }
+
+ for (i = 0; i < sc->nirqs; i += 4) {
+ gic_d_write_4(sc, GICD_IPRIORITYR(i >> 2), 0);
+ gic_d_write_4(sc, GICD_ITARGETSR(i >> 2),
+ 1 << 0 | 1 << 8 | 1 << 16 | 1 << 24);
+ }
+
+ /* Set all the interrupts to be in Group 0 (secure) */
+ for (i = 0; i < sc->nirqs; i += 32) {
+ gic_d_write_4(sc, GICD_IGROUPR(i >> 5), 0);
+ }
+
+ /* Enable CPU interface */
+ gic_c_write_4(sc, GICC_CTLR, 1);
+
+ /* Set priority mask register. */
+ gic_c_write_4(sc, GICC_PMR, 0xff);
+
+ /* Enable interrupt distribution */
+ gic_d_write_4(sc, GICD_CTLR, 0x01);
+
+ return (0);
+}
+
+static void gic_dispatch(device_t dev, struct trapframe *frame)
+{
+ struct arm_gic_softc *sc = device_get_softc(dev);
+ uint32_t active_irq;
+ int first = 1;
+
+ while (1) {
+ active_irq = gic_c_read_4(sc, GICC_IAR);
+
+ /*
+ * Immediatly EOIR the SGIs, because doing so requires the other
+ * bits (ie CPU number), not just the IRQ number, and we do not
+ * have this information later.
+ */
+
+ if ((active_irq & 0x3ff) <= GIC_LAST_IPI)
+ gic_c_write_4(sc, GICC_EOIR, active_irq);
+ active_irq &= 0x3FF;
+
+ if (active_irq == 0x3FF) {
+ if (first)
+ printf("Spurious interrupt detected\n");
+ return;
+ }
+
+ arm_dispatch_intr(active_irq, frame);
+ first = 0;
+ }
+}
+
+static void
+gic_eoi(device_t dev, u_int irq)
+{
+ struct arm_gic_softc *sc = device_get_softc(dev);
+
+ gic_c_write_4(sc, GICC_EOIR, irq);
+}
+
+void
+gic_mask_irq(device_t dev, u_int irq)
+{
+ struct arm_gic_softc *sc = device_get_softc(dev);
+
+ gic_d_write_4(sc, GICD_ICENABLER(irq >> 5), (1UL << (irq & 0x1F)));
+ gic_c_write_4(sc, GICC_EOIR, irq);
+}
+
+void
+gic_unmask_irq(device_t dev, u_int irq)
+{
+ struct arm_gic_softc *sc = device_get_softc(dev);
+
+ gic_d_write_4(sc, GICD_ISENABLER(irq >> 5), (1UL << (irq & 0x1F)));
+}
+
+#ifdef SMP
+static void
+gic_ipi_send(device_t dev, cpuset_t cpus, u_int ipi)
+{
+ struct arm_gic_softc *sc = device_get_softc(dev);
+ uint32_t val = 0, i;
+
+ for (i = 0; i < MAXCPU; i++)
+ if (CPU_ISSET(i, &cpus))
+ val |= 1 << (16 + i);
+
+ gic_d_write_4(sc, GICD_SGIR(0), val | ipi);
+}
+
+static int
+arm_gic_ipi_read(device_t dev, int i)
+{
+
+ if (i != -1) {
+ /*
+ * The intr code will automagically give the frame pointer
+ * if the interrupt argument is 0.
+ */
+ if ((unsigned int)i > 16)
+ return (0);
+ return (i);
+ }
+
+ return (0x3ff);
+}
+
+static void
+arm_gic_ipi_clear(device_t dev, int ipi)
+{
+ /* no-op */
+}
+#endif
+
+static device_method_t arm_gic_methods[] = {
+ /* Device interface */
+ DEVMETHOD(device_probe, arm_gic_probe),
+ DEVMETHOD(device_attach, arm_gic_attach),
+
+ /* pic_if */
+ DEVMETHOD(pic_dispatch, gic_dispatch),
+ DEVMETHOD(pic_eoi, gic_eoi),
+ DEVMETHOD(pic_mask, gic_mask_irq),
+ DEVMETHOD(pic_unmask, gic_unmask_irq),
+
+#ifdef SMP
+ DEVMETHOD(pic_init_secondary, gic_init_secondary),
+ DEVMETHOD(pic_ipi_send, gic_ipi_send),
+#endif
+
+ { 0, 0 }
+};
+
+static driver_t arm_gic_driver = {
+ "gic",
+ arm_gic_methods,
+ sizeof(struct arm_gic_softc),
+};
+
+static devclass_t arm_gic_devclass;
+
+EARLY_DRIVER_MODULE(gic, simplebus, arm_gic_driver, arm_gic_devclass, 0, 0,
+ BUS_PASS_INTERRUPT + BUS_PASS_ORDER_MIDDLE);
+EARLY_DRIVER_MODULE(gic, ofwbus, arm_gic_driver, arm_gic_devclass, 0, 0,
+ BUS_PASS_INTERRUPT + BUS_PASS_ORDER_MIDDLE);
diff --git a/sys/arm64/arm64/identcpu.c b/sys/arm64/arm64/identcpu.c
new file mode 100644
index 0000000..b961ed3
--- /dev/null
+++ b/sys/arm64/arm64/identcpu.c
@@ -0,0 +1,199 @@
+/*-
+ * Copyright (c) 2014 Andrew Turner
+ * Copyright (c) 2014 The FreeBSD Foundation
+ * All rights reserved.
+ *
+ * Portions of this software were developed by Semihalf
+ * under sponsorship of the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/pcpu.h>
+#include <sys/sysctl.h>
+#include <sys/systm.h>
+
+#include <machine/cpu.h>
+#include <machine/cpufunc.h>
+
+char machine[] = "arm64";
+
+SYSCTL_STRING(_hw, HW_MACHINE, machine, CTLFLAG_RD, machine, 0,
+ "Machine class");
+
+/*
+ * Per-CPU affinity as provided in MPIDR_EL1
+ * Indexed by CPU number in logical order selected by the system.
+ * Relevant fields can be extracetd using CPU_AFFn macros,
+ * Aff3.Aff2.Aff1.Aff0 construct a unique CPU address in the system.
+ *
+ * Fields used by us:
+ * Aff1 - Cluster number
+ * Aff0 - CPU number in Aff1 cluster
+ */
+uint64_t __cpu_affinity[MAXCPU];
+
+#define CPU_IMPL_ARM 0x41
+#define CPU_IMPL_BROADCOM 0x42
+#define CPU_IMPL_CAVIUM 0x43
+#define CPU_IMPL_DEC 0x44
+#define CPU_IMPL_INFINEON 0x49
+#define CPU_IMPL_FREESCALE 0x4D
+#define CPU_IMPL_NVIDIA 0x4E
+#define CPU_IMPL_APM 0x50
+#define CPU_IMPL_QUALCOMM 0x51
+#define CPU_IMPL_MARVELL 0x56
+#define CPU_IMPL_INTEL 0x69
+
+#define CPU_PART_THUNDER 0x0A1
+#define CPU_PART_FOUNDATION 0xD00
+#define CPU_PART_CORTEX_A53 0xD03
+#define CPU_PART_CORTEX_A57 0xD07
+
+#define CPU_IMPL(midr) (((midr) >> 24) & 0xff)
+#define CPU_PART(midr) (((midr) >> 4) & 0xfff)
+#define CPU_VAR(midr) (((midr) >> 20) & 0xf)
+#define CPU_REV(midr) (((midr) >> 0) & 0xf)
+
+struct cpu_desc {
+ u_int cpu_impl;
+ u_int cpu_part_num;
+ u_int cpu_variant;
+ u_int cpu_revision;
+ const char *cpu_impl_name;
+ const char *cpu_part_name;
+};
+
+struct cpu_desc cpu_desc[MAXCPU];
+
+struct cpu_parts {
+ u_int part_id;
+ const char *part_name;
+};
+#define CPU_PART_NONE { 0, "Unknown Processor" }
+
+struct cpu_implementers {
+ u_int impl_id;
+ const char *impl_name;
+ /*
+ * Part number is implementation defined
+ * so each vendor will have its own set of values and names.
+ */
+ const struct cpu_parts *cpu_parts;
+};
+#define CPU_IMPLEMENTER_NONE { 0, "Unknown Implementer", cpu_parts_none }
+
+/*
+ * Per-implementer table of (PartNum, CPU Name) pairs.
+ */
+/* ARM Ltd. */
+static const struct cpu_parts cpu_parts_arm[] = {
+ { 0xD00, "Foundation-Model" },
+ { 0xD03, "Cortex-A53" },
+ { 0xD07, "Cortex-A57" },
+ CPU_PART_NONE,
+};
+/* Cavium */
+static const struct cpu_parts cpu_parts_cavium[] = {
+ { 0x0A1, "Thunder" },
+ CPU_PART_NONE,
+};
+
+/* Unknown */
+static const struct cpu_parts cpu_parts_none[] = {
+ CPU_PART_NONE,
+};
+
+/*
+ * Implementers table.
+ */
+const struct cpu_implementers cpu_implementers[] = {
+ { CPU_IMPL_ARM, "ARM", cpu_parts_arm },
+ { CPU_IMPL_BROADCOM, "Broadcom", cpu_parts_none },
+ { CPU_IMPL_CAVIUM, "Cavium", cpu_parts_cavium },
+ { CPU_IMPL_DEC, "DEC", cpu_parts_none },
+ { CPU_IMPL_INFINEON, "IFX", cpu_parts_none },
+ { CPU_IMPL_FREESCALE, "Freescale", cpu_parts_none },
+ { CPU_IMPL_NVIDIA, "NVIDIA", cpu_parts_none },
+ { CPU_IMPL_APM, "APM", cpu_parts_none },
+ { CPU_IMPL_QUALCOMM, "Qualcomm", cpu_parts_none },
+ { CPU_IMPL_MARVELL, "Marvell", cpu_parts_none },
+ { CPU_IMPL_INTEL, "Intel", cpu_parts_none },
+ CPU_IMPLEMENTER_NONE,
+};
+
+void identify_cpu(void);
+
+void
+identify_cpu(void)
+{
+ u_int midr;
+ u_int impl_id;
+ u_int part_id;
+ u_int cpu;
+ uint64_t mpidr;
+ size_t i;
+ const struct cpu_parts *cpu_partsp = NULL;
+
+ cpu = PCPU_GET(cpuid);
+ midr = get_midr();
+
+ impl_id = CPU_IMPL(midr);
+ for (i = 0; i < nitems(cpu_implementers); i++) {
+ if (impl_id == cpu_implementers[i].impl_id ||
+ cpu_implementers[i].impl_id == 0) {
+ cpu_desc[cpu].cpu_impl = impl_id;
+ cpu_desc[cpu].cpu_impl_name = cpu_implementers[i].impl_name;
+ cpu_partsp = cpu_implementers[i].cpu_parts;
+ break;
+ }
+ }
+
+ part_id = CPU_PART(midr);
+ for (i = 0; &cpu_partsp[i] != NULL; i++) {
+ if (part_id == cpu_partsp[i].part_id ||
+ cpu_partsp[i].part_id == 0) {
+ cpu_desc[cpu].cpu_part_num = part_id;
+ cpu_desc[cpu].cpu_part_name = cpu_partsp[i].part_name;
+ break;
+ }
+ }
+
+ printf("CPU: %s %s r%dp%d\n", cpu_desc[cpu].cpu_impl_name,
+ cpu_desc[cpu].cpu_part_name, CPU_VAR(midr), CPU_REV(midr));
+
+ /*
+ * Save affinity for the boot CPU.
+ * (CPU0 in the internal system enumeration.
+ */
+ mpidr = get_mpidr();
+ CPU_AFFINITY(0) = mpidr & CPU_AFF_MASK;
+
+ if (bootverbose)
+ printf("CPU%u affinity: %u.%u.%u.%u\n", 0, CPU_AFF0(mpidr),
+ CPU_AFF1(mpidr), CPU_AFF2(mpidr), CPU_AFF3(mpidr));
+}
diff --git a/sys/arm64/arm64/in_cksum.c b/sys/arm64/arm64/in_cksum.c
new file mode 100644
index 0000000..ae02e91
--- /dev/null
+++ b/sys/arm64/arm64/in_cksum.c
@@ -0,0 +1,241 @@
+/* $NetBSD: in_cksum.c,v 1.7 1997/09/02 13:18:15 thorpej Exp $ */
+
+/*-
+ * Copyright (c) 1988, 1992, 1993
+ * The Regents of the University of California. All rights reserved.
+ * Copyright (c) 1996
+ * Matt Thomas <matt@3am-software.com>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)in_cksum.c 8.1 (Berkeley) 6/10/93
+ */
+
+#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/mbuf.h>
+#include <sys/systm.h>
+#include <netinet/in_systm.h>
+#include <netinet/in.h>
+#include <netinet/ip.h>
+#include <machine/in_cksum.h>
+
+/*
+ * Checksum routine for Internet Protocol family headers
+ * (Portable Alpha version).
+ *
+ * This routine is very heavily used in the network
+ * code and should be modified for each CPU to be as fast as possible.
+ */
+
+#define ADDCARRY(x) (x > 65535 ? x -= 65535 : x)
+#define REDUCE32 \
+ { \
+ q_util.q = sum; \
+ sum = q_util.s[0] + q_util.s[1] + q_util.s[2] + q_util.s[3]; \
+ }
+#define REDUCE16 \
+ { \
+ q_util.q = sum; \
+ l_util.l = q_util.s[0] + q_util.s[1] + q_util.s[2] + q_util.s[3]; \
+ sum = l_util.s[0] + l_util.s[1]; \
+ ADDCARRY(sum); \
+ }
+
+static const u_int32_t in_masks[] = {
+ /*0 bytes*/ /*1 byte*/ /*2 bytes*/ /*3 bytes*/
+ 0x00000000, 0x000000FF, 0x0000FFFF, 0x00FFFFFF, /* offset 0 */
+ 0x00000000, 0x0000FF00, 0x00FFFF00, 0xFFFFFF00, /* offset 1 */
+ 0x00000000, 0x00FF0000, 0xFFFF0000, 0xFFFF0000, /* offset 2 */
+ 0x00000000, 0xFF000000, 0xFF000000, 0xFF000000, /* offset 3 */
+};
+
+union l_util {
+ u_int16_t s[2];
+ u_int32_t l;
+};
+union q_util {
+ u_int16_t s[4];
+ u_int32_t l[2];
+ u_int64_t q;
+};
+
+static u_int64_t
+in_cksumdata(const void *buf, int len)
+{
+ const u_int32_t *lw = (const u_int32_t *) buf;
+ u_int64_t sum = 0;
+ u_int64_t prefilled;
+ int offset;
+ union q_util q_util;
+
+ if ((3 & (long) lw) == 0 && len == 20) {
+ sum = (u_int64_t) lw[0] + lw[1] + lw[2] + lw[3] + lw[4];
+ REDUCE32;
+ return sum;
+ }
+
+ if ((offset = 3 & (long) lw) != 0) {
+ const u_int32_t *masks = in_masks + (offset << 2);
+ lw = (u_int32_t *) (((long) lw) - offset);
+ sum = *lw++ & masks[len >= 3 ? 3 : len];
+ len -= 4 - offset;
+ if (len <= 0) {
+ REDUCE32;
+ return sum;
+ }
+ }
+#if 0
+ /*
+ * Force to cache line boundary.
+ */
+ offset = 32 - (0x1f & (long) lw);
+ if (offset < 32 && len > offset) {
+ len -= offset;
+ if (4 & offset) {
+ sum += (u_int64_t) lw[0];
+ lw += 1;
+ }
+ if (8 & offset) {
+ sum += (u_int64_t) lw[0] + lw[1];
+ lw += 2;
+ }
+ if (16 & offset) {
+ sum += (u_int64_t) lw[0] + lw[1] + lw[2] + lw[3];
+ lw += 4;
+ }
+ }
+#endif
+ /*
+ * access prefilling to start load of next cache line.
+ * then add current cache line
+ * save result of prefilling for loop iteration.
+ */
+ prefilled = lw[0];
+ while ((len -= 32) >= 4) {
+ u_int64_t prefilling = lw[8];
+ sum += prefilled + lw[1] + lw[2] + lw[3]
+ + lw[4] + lw[5] + lw[6] + lw[7];
+ lw += 8;
+ prefilled = prefilling;
+ }
+ if (len >= 0) {
+ sum += prefilled + lw[1] + lw[2] + lw[3]
+ + lw[4] + lw[5] + lw[6] + lw[7];
+ lw += 8;
+ } else {
+ len += 32;
+ }
+ while ((len -= 16) >= 0) {
+ sum += (u_int64_t) lw[0] + lw[1] + lw[2] + lw[3];
+ lw += 4;
+ }
+ len += 16;
+ while ((len -= 4) >= 0) {
+ sum += (u_int64_t) *lw++;
+ }
+ len += 4;
+ if (len > 0)
+ sum += (u_int64_t) (in_masks[len] & *lw);
+ REDUCE32;
+ return sum;
+}
+
+u_short
+in_addword(u_short a, u_short b)
+{
+ u_int64_t sum = a + b;
+
+ ADDCARRY(sum);
+ return (sum);
+}
+
+u_short
+in_pseudo(u_int32_t a, u_int32_t b, u_int32_t c)
+{
+ u_int64_t sum;
+ union q_util q_util;
+ union l_util l_util;
+
+ sum = (u_int64_t) a + b + c;
+ REDUCE16;
+ return (sum);
+}
+
+u_short
+in_cksum_skip(struct mbuf *m, int len, int skip)
+{
+ u_int64_t sum = 0;
+ int mlen = 0;
+ int clen = 0;
+ caddr_t addr;
+ union q_util q_util;
+ union l_util l_util;
+
+ len -= skip;
+ for (; skip && m; m = m->m_next) {
+ if (m->m_len > skip) {
+ mlen = m->m_len - skip;
+ addr = mtod(m, caddr_t) + skip;
+ goto skip_start;
+ } else {
+ skip -= m->m_len;
+ }
+ }
+
+ for (; m && len; m = m->m_next) {
+ if (m->m_len == 0)
+ continue;
+ mlen = m->m_len;
+ addr = mtod(m, caddr_t);
+skip_start:
+ if (len < mlen)
+ mlen = len;
+ if ((clen ^ (long) addr) & 1)
+ sum += in_cksumdata(addr, mlen) << 8;
+ else
+ sum += in_cksumdata(addr, mlen);
+
+ clen += mlen;
+ len -= mlen;
+ }
+ REDUCE16;
+ return (~sum & 0xffff);
+}
+
+u_int in_cksum_hdr(const struct ip *ip)
+{
+ u_int64_t sum = in_cksumdata(ip, sizeof(struct ip));
+ union q_util q_util;
+ union l_util l_util;
+ REDUCE16;
+ return (~sum & 0xffff);
+}
diff --git a/sys/arm64/arm64/intr_machdep.c b/sys/arm64/arm64/intr_machdep.c
new file mode 100644
index 0000000..6f1c7bb
--- /dev/null
+++ b/sys/arm64/arm64/intr_machdep.c
@@ -0,0 +1,503 @@
+/*-
+ * Copyright (c) 1991 The Regents of the University of California.
+ * Copyright (c) 2002 Benno Rice.
+ * Copyright (c) 2014 The FreeBSD Foundation
+ * All rights reserved.
+ *
+ * This software was developed by Semihalf under
+ * the sponsorship of the FreeBSD Foundation.
+ *
+ * This code is derived from software contributed by
+ * William Jolitz (Berkeley) and Benno Rice.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * form: src/sys/powerpc/powerpc/intr_machdep.c, r271712 2014/09/17
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/bus.h>
+#include <sys/kernel.h>
+#include <sys/ktr.h>
+#include <sys/lock.h>
+#include <sys/malloc.h>
+#include <sys/mutex.h>
+#include <sys/cpuset.h>
+#include <sys/interrupt.h>
+#include <sys/queue.h>
+
+#include <machine/cpufunc.h>
+#include <machine/intr.h>
+
+#ifdef SMP
+#include <machine/smp.h>
+#endif
+
+#include "pic_if.h"
+
+#define MAX_STRAY_LOG 5
+#define INTRNAME_LEN (MAXCOMLEN + 1)
+
+#define NIRQS 1024 /* Maximum number of interrupts in the system */
+
+static MALLOC_DEFINE(M_INTR, "intr", "Interrupt Services");
+
+/*
+ * Linked list of interrupts that have been set-up.
+ * Each element holds the interrupt description
+ * and has to be allocated and freed dynamically.
+ */
+static SLIST_HEAD(, arm64_intr_entry) irq_slist_head =
+ SLIST_HEAD_INITIALIZER(irq_slist_head);
+
+struct arm64_intr_entry {
+ SLIST_ENTRY(arm64_intr_entry) entries;
+ struct intr_event *i_event;
+
+ enum intr_trigger i_trig;
+ enum intr_polarity i_pol;
+
+ u_int i_hw_irq; /* Physical interrupt number */
+ u_int i_cntidx; /* Index in intrcnt table */
+ u_int i_handlers; /* Allocated handlers */
+ u_long *i_cntp; /* Interrupt hit counter */
+};
+
+/* Counts and names for statistics - see sys/sys/interrupt.h */
+/* Tables are indexed by i_cntidx */
+u_long intrcnt[NIRQS];
+char intrnames[NIRQS * INTRNAME_LEN];
+size_t sintrcnt = sizeof(intrcnt);
+size_t sintrnames = sizeof(intrnames);
+
+static u_int intrcntidx; /* Current index into intrcnt table */
+static u_int arm64_nintrs; /* Max interrupts number of the root PIC */
+static u_int arm64_nstray; /* Number of received stray interrupts */
+static device_t root_pic; /* PIC device for all incoming interrupts */
+static device_t msi_pic; /* Device which handles MSI/MSI-X interrupts */
+static struct mtx intr_list_lock;
+
+static void
+intr_init(void *dummy __unused)
+{
+
+ mtx_init(&intr_list_lock, "intr sources lock", NULL, MTX_DEF);
+}
+SYSINIT(intr_init, SI_SUB_INTR, SI_ORDER_FIRST, intr_init, NULL);
+
+/*
+ * Helper routines.
+ */
+
+/* Set interrupt name for statistics */
+static void
+intrcnt_setname(const char *name, u_int idx)
+{
+
+ snprintf(&intrnames[idx * INTRNAME_LEN], INTRNAME_LEN, "%-*s",
+ INTRNAME_LEN - 1, name);
+}
+
+/*
+ * Get intr structure for the given interrupt number.
+ * Allocate one if this is the first time.
+ * (Similar to ppc's intr_lookup() but without actual
+ * lookup since irq number is an index in arm64_intrs[]).
+ */
+static struct arm64_intr_entry *
+intr_acquire(u_int hw_irq)
+{
+ struct arm64_intr_entry *intr;
+
+ mtx_lock(&intr_list_lock);
+
+ SLIST_FOREACH(intr, &irq_slist_head, entries) {
+ if (intr->i_hw_irq == hw_irq) {
+ break;
+ }
+ }
+ if (intr != NULL)
+ goto out;
+
+ /* Do not alloc another intr when max number of IRQs has been reached */
+ if (intrcntidx >= NIRQS)
+ goto out;
+
+ intr = malloc(sizeof(*intr), M_INTR, M_NOWAIT);
+ if (intr == NULL)
+ goto out;
+
+ intr->i_event = NULL;
+ intr->i_handlers = 0;
+ intr->i_trig = INTR_TRIGGER_CONFORM;
+ intr->i_pol = INTR_POLARITY_CONFORM;
+ intr->i_cntidx = atomic_fetchadd_int(&intrcntidx, 1);
+ intr->i_cntp = &intrcnt[intr->i_cntidx];
+ intr->i_hw_irq = hw_irq;
+ SLIST_INSERT_HEAD(&irq_slist_head, intr, entries);
+out:
+ mtx_unlock(&intr_list_lock);
+ return intr;
+}
+
+static void
+intr_pre_ithread(void *arg)
+{
+ struct arm64_intr_entry *intr = arg;
+
+ PIC_PRE_ITHREAD(root_pic, intr->i_hw_irq);
+}
+
+static void
+intr_post_ithread(void *arg)
+{
+ struct arm64_intr_entry *intr = arg;
+
+ PIC_POST_ITHREAD(root_pic, intr->i_hw_irq);
+}
+
+static void
+intr_post_filter(void *arg)
+{
+ struct arm64_intr_entry *intr = arg;
+
+ PIC_POST_FILTER(root_pic, intr->i_hw_irq);
+}
+
+/*
+ * Register PIC driver.
+ * This is intended to be called by the very first PIC driver
+ * at the end of the successful attach.
+ * Note that during boot this can be called after first references
+ * to bus_setup_intr() so it is required to not use root_pic if it
+ * is not 100% safe.
+ */
+void
+arm_register_root_pic(device_t dev, u_int nirq)
+{
+
+ KASSERT(root_pic == NULL, ("Unable to set the pic twice"));
+ KASSERT(nirq <= NIRQS, ("PIC is trying to handle too many IRQs"));
+
+ arm64_nintrs = NIRQS; /* Number of IRQs limited only by array size */
+ root_pic = dev;
+}
+
+/* Register device which allocates MSI interrupts */
+void
+arm_register_msi_pic(device_t dev)
+{
+
+ KASSERT(msi_pic == NULL, ("Unable to set msi_pic twice"));
+ msi_pic = dev;
+}
+
+int
+arm_alloc_msi(device_t pci_dev, int count, int *irqs)
+{
+
+ return PIC_ALLOC_MSI(msi_pic, pci_dev, count, irqs);
+}
+
+int
+arm_release_msi(device_t pci_dev, int count, int *irqs)
+{
+
+ return PIC_RELEASE_MSI(msi_pic, pci_dev, count, irqs);
+}
+
+int
+arm_map_msi(device_t pci_dev, int irq, uint64_t *addr, uint32_t *data)
+{
+
+ return PIC_MAP_MSI(msi_pic, pci_dev, irq, addr, data);
+}
+
+int
+arm_alloc_msix(device_t pci_dev, int *irq)
+{
+
+ return PIC_ALLOC_MSIX(msi_pic, pci_dev, irq);
+}
+
+int
+arm_release_msix(device_t pci_dev, int irq)
+{
+
+ return PIC_RELEASE_MSIX(msi_pic, pci_dev, irq);
+}
+
+
+int
+arm_map_msix(device_t pci_dev, int irq, uint64_t *addr, uint32_t *data)
+{
+
+ return PIC_MAP_MSIX(msi_pic, pci_dev, irq, addr, data);
+}
+
+/*
+ * Finalize interrupts bring-up (should be called from configure_final()).
+ * Enables all interrupts registered by bus_setup_intr() during boot
+ * as well as unlocks interrups reception on primary CPU.
+ */
+int
+arm_enable_intr(void)
+{
+ struct arm64_intr_entry *intr;
+
+ if (root_pic == NULL)
+ panic("Cannot enable interrupts. No PIC configured");
+
+ /*
+ * Iterate through all possible interrupts and perform
+ * configuration if the interrupt is registered.
+ */
+ SLIST_FOREACH(intr, &irq_slist_head, entries) {
+ /*
+ * XXX: In case we allowed to set up interrupt whose number
+ * exceeds maximum number of interrupts for the root PIC
+ * disable it and print proper error message.
+ *
+ * This can happen only when calling bus_setup_intr()
+ * before the interrupt controller is attached.
+ */
+ if (intr->i_cntidx >= arm64_nintrs) {
+ /* Better fail when IVARIANTS enabled */
+ KASSERT(0, ("%s: Interrupt %u cannot be handled by the "
+ "registered PIC. Max interrupt number: %u", __func__,
+ intr->i_cntidx, arm64_nintrs - 1));
+ /* Print message and disable otherwise */
+ printf("ERROR: Cannot enable irq %u. Disabling.\n",
+ intr->i_cntidx);
+ PIC_MASK(root_pic, intr->i_hw_irq);
+ }
+
+ if (intr->i_trig != INTR_TRIGGER_CONFORM ||
+ intr->i_pol != INTR_POLARITY_CONFORM) {
+ PIC_CONFIG(root_pic, intr->i_hw_irq,
+ intr->i_trig, intr->i_pol);
+ }
+
+ if (intr->i_handlers > 0)
+ PIC_UNMASK(root_pic, intr->i_hw_irq);
+
+ }
+ /* Enable interrupt reception on this CPU */
+ intr_enable();
+
+ return (0);
+}
+
+int
+arm_setup_intr(const char *name, driver_filter_t *filt, driver_intr_t handler,
+ void *arg, u_int hw_irq, enum intr_type flags, void **cookiep)
+{
+ struct arm64_intr_entry *intr;
+ int error;
+
+ intr = intr_acquire(hw_irq);
+ if (intr == NULL)
+ return (ENOMEM);
+
+ /*
+ * Watch out for interrupts' numbers.
+ * If this is a system boot then don't allow to overfill interrupts
+ * table (the interrupts will be deconfigured in arm_enable_intr()).
+ */
+ if (intr->i_cntidx >= NIRQS)
+ return (EINVAL);
+
+ if (intr->i_event == NULL) {
+ error = intr_event_create(&intr->i_event, (void *)intr, 0,
+ hw_irq, intr_pre_ithread, intr_post_ithread,
+ intr_post_filter, NULL, "irq%u", hw_irq);
+ if (error)
+ return (error);
+ }
+
+ error = intr_event_add_handler(intr->i_event, name, filt, handler, arg,
+ intr_priority(flags), flags, cookiep);
+
+ if (!error) {
+ mtx_lock(&intr_list_lock);
+ intrcnt_setname(intr->i_event->ie_fullname, intr->i_cntidx);
+ intr->i_handlers++;
+
+ if (!cold && intr->i_handlers == 1) {
+ if (intr->i_trig != INTR_TRIGGER_CONFORM ||
+ intr->i_pol != INTR_POLARITY_CONFORM) {
+ PIC_CONFIG(root_pic, intr->i_hw_irq, intr->i_trig,
+ intr->i_pol);
+ }
+
+ PIC_UNMASK(root_pic, intr->i_hw_irq);
+ }
+ mtx_unlock(&intr_list_lock);
+ }
+
+ return (error);
+}
+
+int
+arm_teardown_intr(void *cookie)
+{
+ struct arm64_intr_entry *intr;
+ int error;
+
+ intr = intr_handler_source(cookie);
+ error = intr_event_remove_handler(cookie);
+ if (!error) {
+ mtx_lock(&intr_list_lock);
+ intr->i_handlers--;
+ if (intr->i_handlers == 0)
+ PIC_MASK(root_pic, intr->i_hw_irq);
+ intrcnt_setname(intr->i_event->ie_fullname, intr->i_cntidx);
+ mtx_unlock(&intr_list_lock);
+ }
+
+ return (error);
+}
+
+int
+arm_config_intr(u_int hw_irq, enum intr_trigger trig, enum intr_polarity pol)
+{
+ struct arm64_intr_entry *intr;
+
+ intr = intr_acquire(hw_irq);
+ if (intr == NULL)
+ return (ENOMEM);
+
+ intr->i_trig = trig;
+ intr->i_pol = pol;
+
+ if (!cold && root_pic != NULL)
+ PIC_CONFIG(root_pic, intr->i_hw_irq, trig, pol);
+
+ return (0);
+}
+
+void
+arm_dispatch_intr(u_int hw_irq, struct trapframe *tf)
+{
+ struct arm64_intr_entry *intr;
+
+ SLIST_FOREACH(intr, &irq_slist_head, entries) {
+ if (intr->i_hw_irq == hw_irq) {
+ break;
+ }
+ }
+
+ if (intr == NULL)
+ goto stray;
+
+ (*intr->i_cntp)++;
+
+ if (!intr_event_handle(intr->i_event, tf))
+ return;
+
+stray:
+ if (arm64_nstray < MAX_STRAY_LOG) {
+ arm64_nstray++;
+ printf("Stray IRQ %u\n", hw_irq);
+ if (arm64_nstray >= MAX_STRAY_LOG) {
+ printf("Got %d stray IRQs. Not logging anymore.\n",
+ MAX_STRAY_LOG);
+ }
+ }
+
+ if (intr != NULL)
+ PIC_MASK(root_pic, intr->i_hw_irq);
+}
+
+void
+arm_cpu_intr(struct trapframe *tf)
+{
+
+ critical_enter();
+ PIC_DISPATCH(root_pic, tf);
+ critical_exit();
+}
+
+#ifdef SMP
+void
+arm_setup_ipihandler(driver_filter_t *filt, u_int ipi)
+{
+
+ /* ARM64TODO: The hard coded 16 will be fixed with am_intrng */
+ arm_setup_intr("ipi", filt, NULL, (void *)((uintptr_t)ipi | 1<<16), ipi + 16,
+ INTR_TYPE_MISC | INTR_EXCL, NULL);
+ arm_unmask_ipi(ipi);
+}
+
+void
+arm_unmask_ipi(u_int ipi)
+{
+ PIC_UNMASK(root_pic, ipi + 16);
+}
+
+void
+arm_init_secondary(void)
+{
+
+ PIC_INIT_SECONDARY(root_pic);
+}
+
+/* Sending IPI */
+void
+ipi_all_but_self(u_int ipi)
+{
+
+ /* ARM64TODO: We should support this */
+ panic("ipi_all_but_self");
+}
+
+void
+ipi_cpu(int cpu, u_int ipi)
+{
+ cpuset_t cpus;
+
+ CPU_ZERO(&cpus);
+ CPU_SET(cpu, &cpus);
+
+ /* ARM64TODO: This will be fixed with arm_intrng */
+ ipi += 16;
+
+ CTR2(KTR_SMP, "ipi_cpu: cpu: %d, ipi: %x", cpu, ipi);
+ PIC_IPI_SEND(root_pic, cpus, ipi);
+}
+
+void
+ipi_selected(cpuset_t cpus, u_int ipi)
+{
+
+ /* ARM64TODO: This will be fixed with arm_intrng */
+ ipi += 16;
+
+ CTR1(KTR_SMP, "ipi_selected: ipi: %x", ipi);
+ PIC_IPI_SEND(root_pic, cpus, ipi);
+}
+
+#endif
diff --git a/sys/arm64/arm64/locore.S b/sys/arm64/arm64/locore.S
new file mode 100644
index 0000000..bf702fa
--- /dev/null
+++ b/sys/arm64/arm64/locore.S
@@ -0,0 +1,544 @@
+/*-
+ * Copyright (c) 2012-2014 Andrew Turner
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include "assym.s"
+#include <sys/syscall.h>
+#include <machine/asm.h>
+#include <machine/armreg.h>
+#include <machine/hypervisor.h>
+#include <machine/param.h>
+#include <machine/pte.h>
+
+#define VIRT_BITS 39
+
+ .globl kernbase
+ .set kernbase, KERNBASE
+
+#define DEVICE_MEM 0
+#define NORMAL_UNCACHED 1
+#define NORMAL_MEM 2
+
+/*
+ * We assume:
+ * MMU on with an identity map, or off
+ * D-Cache: off
+ * I-Cache: on or off
+ * We are loaded at a 2MiB aligned address
+ */
+
+#define INIT_STACK_SIZE (PAGE_SIZE * 4)
+
+ .text
+ .globl _start
+_start:
+ /* Drop to EL1 */
+ bl drop_to_el1
+
+ /*
+ * Disable the MMU. We may have entered the kernel with it on and
+ * will need to update the tables later. If this has been set up
+ * with anything other than a VA == PA map then this will fail,
+ * but in this case the code to find where we are running from
+ * would have also failed.
+ */
+ dsb sy
+ mrs x2, sctlr_el1
+ bic x2, x2, SCTLR_M
+ msr sctlr_el1, x2
+ isb
+
+
+ /* Get the virt -> phys offset */
+ bl get_virt_delta
+
+ /*
+ * At this point:
+ * x29 = PA - VA
+ * x28 = Our physical load address
+ */
+
+ /* Create the page tables */
+ bl create_pagetables
+
+ /*
+ * At this point:
+ * x27 = TTBR0 table
+ * x26 = TTBR1 table
+ */
+
+ /* Enable the mmu */
+ bl start_mmu
+
+ /* Jump to the virtual address space */
+ ldr x15, .Lvirtdone
+ br x15
+
+virtdone:
+ /* Set up the stack */
+ adr x25, initstack_end
+ mov sp, x25
+ sub sp, sp, #PCB_SIZE
+
+ /* Zero the BSS */
+ ldr x15, .Lbss
+ ldr x14, .Lend
+1:
+ str xzr, [x15], #8
+ cmp x15, x14
+ b.lo 1b
+
+ /* Backup the module pointer */
+ mov x1, x0
+
+ /* Make the page table base a virtual address */
+ sub x26, x26, x29
+
+ sub sp, sp, #(64 * 4)
+ mov x0, sp
+
+ /* Degate the delda so it is VA -> PA */
+ neg x29, x29
+
+ str x1, [x0] /* modulep */
+ str x26, [x0, 8] /* kern_l1pt */
+ str x29, [x0, 16] /* kern_delta */
+ str x25, [x0, 24] /* kern_stack */
+
+ /* trace back starts here */
+ mov fp, #0
+ /* Branch to C code */
+ bl initarm
+ bl mi_startup
+
+ /* We should not get here */
+ brk 0
+
+ .align 3
+.Lvirtdone:
+ .quad virtdone
+.Lbss:
+ .quad __bss_start
+.Lend:
+ .quad _end
+
+/*
+ * If we are started in EL2, configure the required hypervisor
+ * registers and drop to EL1.
+ */
+drop_to_el1:
+ mrs x1, CurrentEL
+ lsr x1, x1, #2
+ cmp x1, #0x2
+ b.eq 1f
+ ret
+1:
+ /* Configure the Hypervisor */
+ mov x2, #(HCR_RW)
+ msr hcr_el2, x2
+
+ /* Load the Virtualization Process ID Register */
+ mrs x2, midr_el1
+ msr vpidr_el2, x2
+
+ /* Load the Virtualization Multiprocess ID Register */
+ mrs x2, mpidr_el1
+ msr vmpidr_el2, x2
+
+ /* Set the bits that need to be 1 in sctlr_el1 */
+ ldr x2, .Lsctlr_res1
+ msr sctlr_el1, x2
+
+ /* Don't trap to EL2 for exceptions */
+ mov x2, #CPTR_RES1
+ msr cptr_el2, x2
+
+ /* Don't trap to EL2 for CP15 traps */
+ msr hstr_el2, xzr
+
+ /* Hypervisor trap functions */
+ adr x2, hyp_vectors
+ msr vbar_el2, x2
+
+ mov x2, #(PSR_F | PSR_I | PSR_A | PSR_D | PSR_M_EL1h)
+ msr spsr_el2, x2
+
+ /* Set the address to return to our return address */
+ msr elr_el2, x30
+
+ eret
+
+ .align 3
+.Lsctlr_res1:
+ .quad SCTLR_RES1
+
+#define VECT_EMPTY \
+ .align 7; \
+ 1: b 1b
+
+ .align 11
+hyp_vectors:
+ VECT_EMPTY /* Synchronous EL2t */
+ VECT_EMPTY /* IRQ EL2t */
+ VECT_EMPTY /* FIQ EL2t */
+ VECT_EMPTY /* Error EL2t */
+
+ VECT_EMPTY /* Synchronous EL2h */
+ VECT_EMPTY /* IRQ EL2h */
+ VECT_EMPTY /* FIQ EL2h */
+ VECT_EMPTY /* Error EL2h */
+
+ VECT_EMPTY /* Synchronous 64-bit EL1 */
+ VECT_EMPTY /* IRQ 64-bit EL1 */
+ VECT_EMPTY /* FIQ 64-bit EL1 */
+ VECT_EMPTY /* Error 64-bit EL1 */
+
+ VECT_EMPTY /* Synchronous 32-bit EL1 */
+ VECT_EMPTY /* IRQ 32-bit EL1 */
+ VECT_EMPTY /* FIQ 32-bit EL1 */
+ VECT_EMPTY /* Error 32-bit EL1 */
+
+/*
+ * Get the delta between the physical address we were loaded to and the
+ * virtual address we expect to run from. This is used when building the
+ * initial page table.
+ */
+get_virt_delta:
+ /* Load the physical address of virt_map */
+ adr x29, virt_map
+ /* Load the virtual address of virt_map stored in virt_map */
+ ldr x28, [x29]
+ /* Find PA - VA as PA' = VA' - VA + PA = VA' + (PA - VA) = VA' + x29 */
+ sub x29, x29, x28
+ /* Find the load address for the kernel */
+ mov x28, #(KERNBASE)
+ add x28, x28, x29
+ ret
+
+ .align 3
+virt_map:
+ .quad virt_map
+
+/*
+ * This builds the page tables containing the identity map, and the kernel
+ * virtual map.
+ *
+ * It relys on:
+ * We were loaded to an address that is on a 2MiB boundary
+ * All the memory must not cross a 1GiB boundaty
+ * x28 contains the physical address we were loaded from
+ *
+ * TODO: This is out of date.
+ * There are at least 5 pages before that address for the page tables
+ * The pages used are:
+ * - The identity (PA = VA) table (TTBR0)
+ * - The Kernel L1 table (TTBR1)(not yet)
+ * - The PA != VA L2 table to jump into (not yet)
+ * - The FDT L2 table (not yet)
+ */
+create_pagetables:
+ /* Save the Link register */
+ mov x5, x30
+
+ /* Clean the page table */
+ adr x6, pagetable
+ mov x26, x6
+ adr x27, pagetable_end
+1:
+ stp xzr, xzr, [x6], #16
+ stp xzr, xzr, [x6], #16
+ stp xzr, xzr, [x6], #16
+ stp xzr, xzr, [x6], #16
+ cmp x6, x27
+ b.lo 1b
+
+ /*
+ * Build the TTBR1 maps.
+ */
+
+ /* Find the size of the kernel */
+ mov x6, #(KERNBASE)
+ ldr x7, .Lend
+ /* Find the end - begin */
+ sub x8, x7, x6
+ /* Get the number of l2 pages to allocate, rounded down */
+ lsr x10, x8, #(L2_SHIFT)
+ /* Add 4 MiB for any rounding above and the module data */
+ add x10, x10, #2
+
+ /* Create the kernel space L2 table */
+ mov x6, x26
+ mov x7, #NORMAL_MEM
+ mov x8, #(KERNBASE & L2_BLOCK_MASK)
+ mov x9, x28
+ bl build_block_pagetable
+
+ /* Move to the l1 table */
+ add x26, x26, #PAGE_SIZE
+
+ /* Link the l1 -> l2 table */
+ mov x9, x6
+ mov x6, x26
+ bl link_l1_pagetable
+
+
+ /*
+ * Build the TTBR0 maps.
+ */
+ add x27, x26, #PAGE_SIZE
+
+#if defined(SOCDEV_PA) && defined(SOCDEV_VA)
+ /* Create a table for the UART */
+ mov x6, x27 /* The initial page table */
+ mov x7, #DEVICE_MEM
+ mov x8, #(SOCDEV_VA) /* VA start */
+ mov x9, #(SOCDEV_PA) /* PA start */
+ bl build_section_pagetable
+#endif
+
+ /* Create the VA = PA map */
+ mov x6, x27 /* The initial page table */
+ mov x7, #NORMAL_UNCACHED /* Uncached as it's only needed early on */
+ mov x9, x27
+ mov x8, x9 /* VA start (== PA start) */
+ bl build_section_pagetable
+
+ /* Restore the Link register */
+ mov x30, x5
+ ret
+
+/*
+ * Builds a 1 GiB page table entry
+ * x6 = L1 table
+ * x7 = Type (0 = Device, 1 = Normal)
+ * x8 = VA start
+ * x9 = PA start (trashed)
+ * x11, x12 and x13 are trashed
+ */
+build_section_pagetable:
+ /*
+ * Build the L1 table entry.
+ */
+ /* Find the table index */
+ lsr x11, x8, #L1_SHIFT
+ and x11, x11, #Ln_ADDR_MASK
+
+ /* Build the L1 block entry */
+ lsl x12, x7, #2
+ orr x12, x12, #L1_BLOCK
+ orr x12, x12, #(ATTR_AF)
+
+ /* Only use the output address bits */
+ lsr x9, x9, #L1_SHIFT
+ orr x12, x12, x9, lsl #L1_SHIFT
+
+ /* Store the entry */
+ str x12, [x6, x11, lsl #3]
+
+ ret
+
+/*
+ * Builds an L1 -> L2 table descriptor
+ *
+ * This is a link for a 1GiB block of memory with up to 2MiB regions mapped
+ * within it by build_block_pagetable.
+ *
+ * x6 = L1 table
+ * x8 = Virtual Address
+ * x9 = L2 PA (trashed)
+ * x11, x12 and x13 are trashed
+ */
+link_l1_pagetable:
+ /*
+ * Link an L1 -> L2 table entry.
+ */
+ /* Find the table index */
+ lsr x11, x8, #L1_SHIFT
+ and x11, x11, #Ln_ADDR_MASK
+
+ /* Build the L1 block entry */
+ mov x12, #L1_TABLE
+
+ /* Only use the output address bits */
+ lsr x9, x9, #12
+ orr x12, x12, x9, lsl #12
+
+ /* Store the entry */
+ str x12, [x6, x11, lsl #3]
+
+ ret
+
+/*
+ * Builds count 2 MiB page table entry
+ * x6 = L2 table
+ * x7 = Type (0 = Device, 1 = Normal)
+ * x8 = VA start
+ * x9 = PA start (trashed)
+ * x10 = Entry count (TODO)
+ * x11, x12 and x13 are trashed
+ */
+build_block_pagetable:
+ /*
+ * Build the L2 table entry.
+ */
+ /* Find the table index */
+ lsr x11, x8, #L2_SHIFT
+ and x11, x11, #Ln_ADDR_MASK
+
+ /* Build the L2 block entry */
+ lsl x12, x7, #2
+ orr x12, x12, #L2_BLOCK
+ orr x12, x12, #(ATTR_AF)
+
+ /* Only use the output address bits */
+ lsr x9, x9, #L2_SHIFT
+
+ /* Set the physical address for this virtual address */
+1: orr x12, x12, x9, lsl #L2_SHIFT
+
+ /* Store the entry */
+ str x12, [x6, x11, lsl #3]
+
+ /* Clear the address bits */
+ and x12, x12, #ATTR_MASK_L
+
+ sub x10, x10, #1
+ add x11, x11, #1
+ add x9, x9, #1
+ cbnz x10, 1b
+
+2: ret
+
+start_mmu:
+ dsb sy
+
+ /* Load the exception vectors */
+ ldr x2, =exception_vectors
+ msr vbar_el1, x2
+
+ /* Load ttbr0 and ttbr1 */
+ msr ttbr0_el1, x27
+ msr ttbr1_el1, x26
+ isb
+
+ /* Clear the Monitor Debug System control register */
+ msr mdscr_el1, xzr
+
+ /* Invalidate the TLB */
+ tlbi vmalle1is
+
+ ldr x2, mair
+ msr mair_el1, x2
+
+ /* Setup TCR according to PARange bits from ID_AA64MMFR0_EL1 */
+ ldr x2, tcr
+ mrs x3, id_aa64mmfr0_el1
+ bfi x2, x3, #32, #3
+ msr tcr_el1, x2
+
+ /* Setup SCTLR */
+ ldr x2, sctlr_set
+ ldr x3, sctlr_clear
+ mrs x1, sctlr_el1
+ bic x1, x1, x3 /* Clear the required bits */
+ orr x1, x1, x2 /* Set the required bits */
+ msr sctlr_el1, x1
+ isb
+
+ ret
+
+ .align 3
+mair:
+ /* Device Normal, no cache Normal, write-back */
+ .quad MAIR_ATTR(0x00, 0) | MAIR_ATTR(0x44, 1) | MAIR_ATTR(0xff, 2)
+tcr:
+ .quad (TCR_TxSZ(64 - VIRT_BITS) | TCR_ASID_16 | TCR_TG1_4K)
+sctlr_set:
+ /* Bits to set */
+ .quad (SCTLR_UCI | SCTLR_nTWE | SCTLR_nTWI | SCTLR_UCT | SCTLR_DZE | \
+ SCTLR_I | SCTLR_SED | SCTLR_C | SCTLR_M)
+sctlr_clear:
+ /* Bits to clear */
+ .quad (SCTLR_EE | SCTLR_EOE | SCTLR_WXN | SCTLR_UMA | SCTLR_ITD | \
+ SCTLR_THEE | SCTLR_CP15BEN | SCTLR_SA0 | SCTLR_SA | SCTLR_A)
+
+ .globl abort
+abort:
+ b abort
+
+ //.section .init_pagetable
+ .align 12 /* 4KiB aligned */
+ /*
+ * 3 initial tables (in the following order):
+ * L2 for kernel (High addresses)
+ * L1 for kernel
+ * L1 for user (Low addresses)
+ */
+pagetable:
+ .space PAGE_SIZE
+pagetable_l1_ttbr1:
+ .space PAGE_SIZE
+pagetable_l1_ttbr0:
+ .space PAGE_SIZE
+pagetable_end:
+
+el2_pagetable:
+ .space PAGE_SIZE
+
+ .globl init_pt_va
+init_pt_va:
+ .quad pagetable /* XXX: Keep page tables VA */
+
+ .align 4
+initstack:
+ .space (PAGE_SIZE * KSTACK_PAGES)
+initstack_end:
+
+
+ENTRY(sigcode)
+ mov x0, sp
+ add x0, x0, #SF_UC
+
+1:
+ mov x8, #SYS_sigreturn
+ svc 0
+
+ /* sigreturn failed, exit */
+ mov x8, #SYS_exit
+ svc 0
+
+ b 1b
+END(sigcode)
+ /* This may be copied to the stack, keep it 16-byte aligned */
+ .align 3
+esigcode:
+
+ .data
+ .align 3
+ .global szsigcode
+szsigcode:
+ .quad esigcode - sigcode
diff --git a/sys/arm64/arm64/machdep.c b/sys/arm64/arm64/machdep.c
new file mode 100644
index 0000000..221b138
--- /dev/null
+++ b/sys/arm64/arm64/machdep.c
@@ -0,0 +1,854 @@
+/*-
+ * Copyright (c) 2014 Andrew Turner
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+#include "opt_platform.h"
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/buf.h>
+#include <sys/bus.h>
+#include <sys/cons.h>
+#include <sys/cpu.h>
+#include <sys/efi.h>
+#include <sys/exec.h>
+#include <sys/imgact.h>
+#include <sys/kdb.h>
+#include <sys/kernel.h>
+#include <sys/limits.h>
+#include <sys/linker.h>
+#include <sys/msgbuf.h>
+#include <sys/pcpu.h>
+#include <sys/proc.h>
+#include <sys/ptrace.h>
+#include <sys/reboot.h>
+#include <sys/rwlock.h>
+#include <sys/sched.h>
+#include <sys/signalvar.h>
+#include <sys/syscallsubr.h>
+#include <sys/sysent.h>
+#include <sys/sysproto.h>
+#include <sys/ucontext.h>
+
+#include <vm/vm.h>
+#include <vm/vm_kern.h>
+#include <vm/vm_object.h>
+#include <vm/vm_page.h>
+#include <vm/pmap.h>
+#include <vm/vm_map.h>
+#include <vm/vm_pager.h>
+
+#include <machine/armreg.h>
+#include <machine/cpu.h>
+#include <machine/debug_monitor.h>
+#include <machine/kdb.h>
+#include <machine/devmap.h>
+#include <machine/machdep.h>
+#include <machine/metadata.h>
+#include <machine/pcb.h>
+#include <machine/reg.h>
+#include <machine/vmparam.h>
+
+#ifdef VFP
+#include <machine/vfp.h>
+#endif
+
+#ifdef FDT
+#include <dev/fdt/fdt_common.h>
+#include <dev/ofw/openfirm.h>
+#endif
+
+struct pcpu __pcpu[MAXCPU];
+
+static struct trapframe proc0_tf;
+
+vm_paddr_t phys_avail[PHYS_AVAIL_SIZE + 2];
+vm_paddr_t dump_avail[PHYS_AVAIL_SIZE + 2];
+
+int early_boot = 1;
+int cold = 1;
+long realmem = 0;
+long Maxmem = 0;
+
+#define PHYSMAP_SIZE (2 * (VM_PHYSSEG_MAX - 1))
+vm_paddr_t physmap[PHYSMAP_SIZE];
+u_int physmap_idx;
+
+struct kva_md_info kmi;
+
+int64_t dcache_line_size; /* The minimum D cache line size */
+int64_t icache_line_size; /* The minimum I cache line size */
+int64_t idcache_line_size; /* The minimum cache line size */
+
+static void
+cpu_startup(void *dummy)
+{
+
+ identify_cpu();
+
+ vm_ksubmap_init(&kmi);
+ bufinit();
+ vm_pager_bufferinit();
+}
+
+SYSINIT(cpu, SI_SUB_CPU, SI_ORDER_FIRST, cpu_startup, NULL);
+
+void
+bzero(void *buf, size_t len)
+{
+ uint8_t *p;
+
+ p = buf;
+ while(len-- > 0)
+ *p++ = 0;
+}
+
+int
+fill_regs(struct thread *td, struct reg *regs)
+{
+ struct trapframe *frame;
+
+ frame = td->td_frame;
+ regs->sp = frame->tf_sp;
+ regs->lr = frame->tf_lr;
+ regs->elr = frame->tf_elr;
+ regs->spsr = frame->tf_spsr;
+
+ memcpy(regs->x, frame->tf_x, sizeof(regs->x));
+
+ return (0);
+}
+
+int
+set_regs(struct thread *td, struct reg *regs)
+{
+ struct trapframe *frame;
+
+ frame = td->td_frame;
+ frame->tf_sp = regs->sp;
+ frame->tf_lr = regs->lr;
+ frame->tf_elr = regs->elr;
+ frame->tf_spsr = regs->spsr;
+
+ memcpy(frame->tf_x, regs->x, sizeof(frame->tf_x));
+
+ return (0);
+}
+
+int
+fill_fpregs(struct thread *td, struct fpreg *regs)
+{
+#ifdef VFP
+ struct pcb *pcb;
+
+ pcb = td->td_pcb;
+ if ((pcb->pcb_fpflags & PCB_FP_STARTED) != 0) {
+ /*
+ * If we have just been running VFP instructions we will
+ * need to save the state to memcpy it below.
+ */
+ vfp_save_state(td);
+
+ memcpy(regs->fp_q, pcb->pcb_vfp, sizeof(regs->fp_q));
+ regs->fp_cr = pcb->pcb_fpcr;
+ regs->fp_sr = pcb->pcb_fpsr;
+ } else
+#endif
+ memset(regs->fp_q, 0, sizeof(regs->fp_q));
+ return (0);
+}
+
+int
+set_fpregs(struct thread *td, struct fpreg *regs)
+{
+#ifdef VFP
+ struct pcb *pcb;
+
+ pcb = td->td_pcb;
+ memcpy(pcb->pcb_vfp, regs->fp_q, sizeof(regs->fp_q));
+ pcb->pcb_fpcr = regs->fp_cr;
+ pcb->pcb_fpsr = regs->fp_sr;
+#endif
+ return (0);
+}
+
+int
+fill_dbregs(struct thread *td, struct dbreg *regs)
+{
+
+ panic("fill_dbregs");
+}
+
+int
+set_dbregs(struct thread *td, struct dbreg *regs)
+{
+
+ panic("set_dbregs");
+}
+
+int
+ptrace_set_pc(struct thread *td, u_long addr)
+{
+
+ panic("ptrace_set_pc");
+ return (0);
+}
+
+int
+ptrace_single_step(struct thread *td)
+{
+
+ /* TODO; */
+ return (0);
+}
+
+int
+ptrace_clear_single_step(struct thread *td)
+{
+
+ /* TODO; */
+ return (0);
+}
+
+void
+exec_setregs(struct thread *td, struct image_params *imgp, u_long stack)
+{
+ struct trapframe *tf = td->td_frame;
+
+ memset(tf, 0, sizeof(struct trapframe));
+
+ tf->tf_sp = stack;
+ tf->tf_lr = imgp->entry_addr;
+ tf->tf_elr = imgp->entry_addr;
+}
+
+/* Sanity check these are the same size, they will be memcpy'd to and fro */
+CTASSERT(sizeof(((struct trapframe *)0)->tf_x) ==
+ sizeof((struct gpregs *)0)->gp_x);
+CTASSERT(sizeof(((struct trapframe *)0)->tf_x) ==
+ sizeof((struct reg *)0)->x);
+
+int
+get_mcontext(struct thread *td, mcontext_t *mcp, int clear_ret)
+{
+ struct trapframe *tf = td->td_frame;
+
+ if (clear_ret & GET_MC_CLEAR_RET)
+ mcp->mc_gpregs.gp_x[0] = 0;
+ else
+ mcp->mc_gpregs.gp_x[0] = tf->tf_x[0];
+
+ memcpy(&mcp->mc_gpregs.gp_x[1], &tf->tf_x[1],
+ sizeof(mcp->mc_gpregs.gp_x[1]) * (nitems(mcp->mc_gpregs.gp_x) - 1));
+
+ mcp->mc_gpregs.gp_sp = tf->tf_sp;
+ mcp->mc_gpregs.gp_lr = tf->tf_lr;
+ mcp->mc_gpregs.gp_elr = tf->tf_elr;
+ mcp->mc_gpregs.gp_spsr = tf->tf_spsr;
+
+ return (0);
+}
+
+int
+set_mcontext(struct thread *td, mcontext_t *mcp)
+{
+ struct trapframe *tf = td->td_frame;
+
+ memcpy(tf->tf_x, mcp->mc_gpregs.gp_x, sizeof(tf->tf_x));
+
+ tf->tf_sp = mcp->mc_gpregs.gp_sp;
+ tf->tf_lr = mcp->mc_gpregs.gp_lr;
+ tf->tf_elr = mcp->mc_gpregs.gp_elr;
+ tf->tf_spsr = mcp->mc_gpregs.gp_spsr;
+
+ return (0);
+}
+
+static void
+get_fpcontext(struct thread *td, mcontext_t *mcp)
+{
+#ifdef VFP
+ struct pcb *curpcb;
+
+ critical_enter();
+
+ curpcb = curthread->td_pcb;
+
+ if ((curpcb->pcb_fpflags & PCB_FP_STARTED) != 0) {
+ /*
+ * If we have just been running VFP instructions we will
+ * need to save the state to memcpy it below.
+ */
+ vfp_save_state(td);
+
+ memcpy(mcp->mc_fpregs.fp_q, curpcb->pcb_vfp,
+ sizeof(mcp->mc_fpregs));
+ mcp->mc_fpregs.fp_cr = curpcb->pcb_fpcr;
+ mcp->mc_fpregs.fp_sr = curpcb->pcb_fpsr;
+ mcp->mc_fpregs.fp_flags = curpcb->pcb_fpflags;
+ mcp->mc_flags |= _MC_FP_VALID;
+ }
+
+ critical_exit();
+#endif
+}
+
+static void
+set_fpcontext(struct thread *td, mcontext_t *mcp)
+{
+#ifdef VFP
+ struct pcb *curpcb;
+
+ critical_enter();
+
+ if ((mcp->mc_flags & _MC_FP_VALID) != 0) {
+ curpcb = curthread->td_pcb;
+
+ /*
+ * Discard any vfp state for the current thread, we
+ * are about to override it.
+ */
+ vfp_discard(td);
+
+ memcpy(curpcb->pcb_vfp, mcp->mc_fpregs.fp_q,
+ sizeof(mcp->mc_fpregs));
+ curpcb->pcb_fpcr = mcp->mc_fpregs.fp_cr;
+ curpcb->pcb_fpsr = mcp->mc_fpregs.fp_sr;
+ curpcb->pcb_fpflags = mcp->mc_fpregs.fp_flags;
+ }
+
+ critical_exit();
+#endif
+}
+
+void
+cpu_idle(int busy)
+{
+
+ spinlock_enter();
+ if (!busy)
+ cpu_idleclock();
+ if (!sched_runnable())
+ __asm __volatile(
+ "dsb sy \n"
+ "wfi \n");
+ if (!busy)
+ cpu_activeclock();
+ spinlock_exit();
+}
+
+void
+cpu_halt(void)
+{
+
+ panic("cpu_halt");
+}
+
+/*
+ * Flush the D-cache for non-DMA I/O so that the I-cache can
+ * be made coherent later.
+ */
+void
+cpu_flush_dcache(void *ptr, size_t len)
+{
+
+ /* TBD */
+}
+
+/* Get current clock frequency for the given CPU ID. */
+int
+cpu_est_clockrate(int cpu_id, uint64_t *rate)
+{
+
+ panic("cpu_est_clockrate");
+}
+
+void
+cpu_pcpu_init(struct pcpu *pcpu, int cpuid, size_t size)
+{
+}
+
+void
+spinlock_enter(void)
+{
+ struct thread *td;
+ register_t daif;
+
+ td = curthread;
+ if (td->td_md.md_spinlock_count == 0) {
+ daif = intr_disable();
+ td->td_md.md_spinlock_count = 1;
+ td->td_md.md_saved_daif = daif;
+ } else
+ td->td_md.md_spinlock_count++;
+ critical_enter();
+}
+
+void
+spinlock_exit(void)
+{
+ struct thread *td;
+ register_t daif;
+
+ td = curthread;
+ critical_exit();
+ daif = td->td_md.md_saved_daif;
+ td->td_md.md_spinlock_count--;
+ if (td->td_md.md_spinlock_count == 0)
+ intr_restore(daif);
+}
+
+#ifndef _SYS_SYSPROTO_H_
+struct sigreturn_args {
+ ucontext_t *ucp;
+};
+#endif
+
+int
+sys_sigreturn(struct thread *td, struct sigreturn_args *uap)
+{
+ ucontext_t uc;
+ uint32_t spsr;
+
+ if (uap == NULL)
+ return (EFAULT);
+ if (copyin(uap->sigcntxp, &uc, sizeof(uc)))
+ return (EFAULT);
+
+ spsr = uc.uc_mcontext.mc_gpregs.gp_spsr;
+ if ((spsr & PSR_M_MASK) != PSR_M_EL0t ||
+ (spsr & (PSR_F | PSR_I | PSR_A | PSR_D)) != 0)
+ return (EINVAL);
+
+ set_mcontext(td, &uc.uc_mcontext);
+ set_fpcontext(td, &uc.uc_mcontext);
+
+ /* Restore signal mask. */
+ kern_sigprocmask(td, SIG_SETMASK, &uc.uc_sigmask, NULL, 0);
+
+ return (EJUSTRETURN);
+}
+
+/*
+ * Construct a PCB from a trapframe. This is called from kdb_trap() where
+ * we want to start a backtrace from the function that caused us to enter
+ * the debugger. We have the context in the trapframe, but base the trace
+ * on the PCB. The PCB doesn't have to be perfect, as long as it contains
+ * enough for a backtrace.
+ */
+void
+makectx(struct trapframe *tf, struct pcb *pcb)
+{
+ int i;
+
+ for (i = 0; i < PCB_LR; i++)
+ pcb->pcb_x[i] = tf->tf_x[i];
+
+ pcb->pcb_x[PCB_LR] = tf->tf_lr;
+ pcb->pcb_pc = tf->tf_elr;
+ pcb->pcb_sp = tf->tf_sp;
+}
+
+void
+sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask)
+{
+ struct thread *td;
+ struct proc *p;
+ struct trapframe *tf;
+ struct sigframe *fp, frame;
+ struct sigacts *psp;
+ int code, onstack, sig;
+
+ td = curthread;
+ p = td->td_proc;
+ PROC_LOCK_ASSERT(p, MA_OWNED);
+
+ sig = ksi->ksi_signo;
+ code = ksi->ksi_code;
+ psp = p->p_sigacts;
+ mtx_assert(&psp->ps_mtx, MA_OWNED);
+
+ tf = td->td_frame;
+ onstack = sigonstack(tf->tf_sp);
+
+ CTR4(KTR_SIG, "sendsig: td=%p (%s) catcher=%p sig=%d", td, p->p_comm,
+ catcher, sig);
+
+ /* Allocate and validate space for the signal handler context. */
+ if ((td->td_pflags & TDP_ALTSTACK) != 0 && !onstack &&
+ SIGISMEMBER(psp->ps_sigonstack, sig)) {
+ fp = (struct sigframe *)(td->td_sigstk.ss_sp +
+ td->td_sigstk.ss_size);
+#if defined(COMPAT_43)
+ td->td_sigstk.ss_flags |= SS_ONSTACK;
+#endif
+ } else {
+ fp = (struct sigframe *)td->td_frame->tf_sp;
+ }
+
+ /* Make room, keeping the stack aligned */
+ fp--;
+ fp = (struct sigframe *)STACKALIGN(fp);
+
+ /* Fill in the frame to copy out */
+ get_mcontext(td, &frame.sf_uc.uc_mcontext, 0);
+ get_fpcontext(td, &frame.sf_uc.uc_mcontext);
+ frame.sf_si = ksi->ksi_info;
+ frame.sf_uc.uc_sigmask = *mask;
+ frame.sf_uc.uc_stack.ss_flags = (td->td_pflags & TDP_ALTSTACK) ?
+ ((onstack) ? SS_ONSTACK : 0) : SS_DISABLE;
+ frame.sf_uc.uc_stack = td->td_sigstk;
+ mtx_unlock(&psp->ps_mtx);
+ PROC_UNLOCK(td->td_proc);
+
+ /* Copy the sigframe out to the user's stack. */
+ if (copyout(&frame, fp, sizeof(*fp)) != 0) {
+ /* Process has trashed its stack. Kill it. */
+ CTR2(KTR_SIG, "sendsig: sigexit td=%p fp=%p", td, fp);
+ PROC_LOCK(p);
+ sigexit(td, SIGILL);
+ }
+
+ /* Translate the signal if appropriate. */
+ if (p->p_sysent->sv_sigtbl && sig <= p->p_sysent->sv_sigsize)
+ sig = p->p_sysent->sv_sigtbl[_SIG_IDX(sig)];
+
+ tf->tf_x[0]= sig;
+ tf->tf_x[1] = (register_t)&fp->sf_si;
+ tf->tf_x[2] = (register_t)&fp->sf_uc;
+
+ tf->tf_elr = (register_t)catcher;
+ tf->tf_sp = (register_t)fp;
+ tf->tf_lr = (register_t)(PS_STRINGS - *(p->p_sysent->sv_szsigcode));
+
+ CTR3(KTR_SIG, "sendsig: return td=%p pc=%#x sp=%#x", td, tf->tf_elr,
+ tf->tf_sp);
+
+ PROC_LOCK(p);
+ mtx_lock(&psp->ps_mtx);
+}
+
+static void
+init_proc0(vm_offset_t kstack)
+{
+ struct pcpu *pcpup = &__pcpu[0];
+
+ proc_linkup0(&proc0, &thread0);
+ thread0.td_kstack = kstack;
+ thread0.td_pcb = (struct pcb *)(thread0.td_kstack) - 1;
+ thread0.td_pcb->pcb_fpflags = 0;
+ thread0.td_pcb->pcb_vfpcpu = UINT_MAX;
+ thread0.td_frame = &proc0_tf;
+ pcpup->pc_curpcb = thread0.td_pcb;
+}
+
+typedef struct {
+ uint32_t type;
+ uint64_t phys_start;
+ uint64_t virt_start;
+ uint64_t num_pages;
+ uint64_t attr;
+} EFI_MEMORY_DESCRIPTOR;
+
+static int
+add_physmap_entry(uint64_t base, uint64_t length, vm_paddr_t *physmap,
+ u_int *physmap_idxp)
+{
+ u_int i, insert_idx, _physmap_idx;
+
+ _physmap_idx = *physmap_idxp;
+
+ if (length == 0)
+ return (1);
+
+ /*
+ * Find insertion point while checking for overlap. Start off by
+ * assuming the new entry will be added to the end.
+ */
+ insert_idx = _physmap_idx;
+ for (i = 0; i <= _physmap_idx; i += 2) {
+ if (base < physmap[i + 1]) {
+ if (base + length <= physmap[i]) {
+ insert_idx = i;
+ break;
+ }
+ if (boothowto & RB_VERBOSE)
+ printf(
+ "Overlapping memory regions, ignoring second region\n");
+ return (1);
+ }
+ }
+
+ /* See if we can prepend to the next entry. */
+ if (insert_idx <= _physmap_idx &&
+ base + length == physmap[insert_idx]) {
+ physmap[insert_idx] = base;
+ return (1);
+ }
+
+ /* See if we can append to the previous entry. */
+ if (insert_idx > 0 && base == physmap[insert_idx - 1]) {
+ physmap[insert_idx - 1] += length;
+ return (1);
+ }
+
+ _physmap_idx += 2;
+ *physmap_idxp = _physmap_idx;
+ if (_physmap_idx == PHYSMAP_SIZE) {
+ printf(
+ "Too many segments in the physical address map, giving up\n");
+ return (0);
+ }
+
+ /*
+ * Move the last 'N' entries down to make room for the new
+ * entry if needed.
+ */
+ for (i = _physmap_idx; i > insert_idx; i -= 2) {
+ physmap[i] = physmap[i - 2];
+ physmap[i + 1] = physmap[i - 1];
+ }
+
+ /* Insert the new entry. */
+ physmap[insert_idx] = base;
+ physmap[insert_idx + 1] = base + length;
+ return (1);
+}
+
+#define efi_next_descriptor(ptr, size) \
+ ((struct efi_md *)(((uint8_t *) ptr) + size))
+
+static void
+add_efi_map_entries(struct efi_map_header *efihdr, vm_paddr_t *physmap,
+ u_int *physmap_idxp)
+{
+ struct efi_md *map, *p;
+ const char *type;
+ size_t efisz;
+ int ndesc, i;
+
+ static const char *types[] = {
+ "Reserved",
+ "LoaderCode",
+ "LoaderData",
+ "BootServicesCode",
+ "BootServicesData",
+ "RuntimeServicesCode",
+ "RuntimeServicesData",
+ "ConventionalMemory",
+ "UnusableMemory",
+ "ACPIReclaimMemory",
+ "ACPIMemoryNVS",
+ "MemoryMappedIO",
+ "MemoryMappedIOPortSpace",
+ "PalCode"
+ };
+
+ /*
+ * Memory map data provided by UEFI via the GetMemoryMap
+ * Boot Services API.
+ */
+ efisz = (sizeof(struct efi_map_header) + 0xf) & ~0xf;
+ map = (struct efi_md *)((uint8_t *)efihdr + efisz);
+
+ if (efihdr->descriptor_size == 0)
+ return;
+ ndesc = efihdr->memory_size / efihdr->descriptor_size;
+
+ if (boothowto & RB_VERBOSE)
+ printf("%23s %12s %12s %8s %4s\n",
+ "Type", "Physical", "Virtual", "#Pages", "Attr");
+
+ for (i = 0, p = map; i < ndesc; i++,
+ p = efi_next_descriptor(p, efihdr->descriptor_size)) {
+ if (boothowto & RB_VERBOSE) {
+ if (p->md_type <= EFI_MD_TYPE_PALCODE)
+ type = types[p->md_type];
+ else
+ type = "<INVALID>";
+ printf("%23s %012lx %12p %08lx ", type, p->md_phys,
+ p->md_virt, p->md_pages);
+ if (p->md_attr & EFI_MD_ATTR_UC)
+ printf("UC ");
+ if (p->md_attr & EFI_MD_ATTR_WC)
+ printf("WC ");
+ if (p->md_attr & EFI_MD_ATTR_WT)
+ printf("WT ");
+ if (p->md_attr & EFI_MD_ATTR_WB)
+ printf("WB ");
+ if (p->md_attr & EFI_MD_ATTR_UCE)
+ printf("UCE ");
+ if (p->md_attr & EFI_MD_ATTR_WP)
+ printf("WP ");
+ if (p->md_attr & EFI_MD_ATTR_RP)
+ printf("RP ");
+ if (p->md_attr & EFI_MD_ATTR_XP)
+ printf("XP ");
+ if (p->md_attr & EFI_MD_ATTR_RT)
+ printf("RUNTIME");
+ printf("\n");
+ }
+
+ switch (p->md_type) {
+ case EFI_MD_TYPE_CODE:
+ case EFI_MD_TYPE_DATA:
+ case EFI_MD_TYPE_BS_CODE:
+ case EFI_MD_TYPE_BS_DATA:
+ case EFI_MD_TYPE_FREE:
+ /*
+ * We're allowed to use any entry with these types.
+ */
+ break;
+ default:
+ continue;
+ }
+
+ if (!add_physmap_entry(p->md_phys, (p->md_pages * PAGE_SIZE),
+ physmap, physmap_idxp))
+ break;
+ }
+}
+
+#ifdef FDT
+static void
+try_load_dtb(caddr_t kmdp)
+{
+ vm_offset_t dtbp;
+
+ dtbp = MD_FETCH(kmdp, MODINFOMD_DTBP, vm_offset_t);
+ if (dtbp == (vm_offset_t)NULL) {
+ printf("ERROR loading DTB\n");
+ return;
+ }
+
+ if (OF_install(OFW_FDT, 0) == FALSE)
+ panic("Cannot install FDT");
+
+ if (OF_init((void *)dtbp) != 0)
+ panic("OF_init failed with the found device tree");
+}
+#endif
+
+static void
+cache_setup(void)
+{
+ int dcache_line_shift, icache_line_shift;
+ uint32_t ctr_el0;
+
+ ctr_el0 = READ_SPECIALREG(ctr_el0);
+
+ /* Read the log2 words in each D cache line */
+ dcache_line_shift = CTR_DLINE_SIZE(ctr_el0);
+ /* Get the D cache line size */
+ dcache_line_size = sizeof(int) << dcache_line_shift;
+
+ /* And the same for the I cache */
+ icache_line_shift = CTR_ILINE_SIZE(ctr_el0);
+ icache_line_size = sizeof(int) << icache_line_shift;
+
+ idcache_line_size = MIN(dcache_line_size, icache_line_size);
+}
+
+void
+initarm(struct arm64_bootparams *abp)
+{
+ struct efi_map_header *efihdr;
+ struct pcpu *pcpup;
+ vm_offset_t lastaddr;
+ caddr_t kmdp;
+ vm_paddr_t mem_len;
+ int i;
+
+ /* Set the module data location */
+ preload_metadata = (caddr_t)(uintptr_t)(abp->modulep);
+
+ /* Find the kernel address */
+ kmdp = preload_search_by_type("elf kernel");
+ if (kmdp == NULL)
+ kmdp = preload_search_by_type("elf64 kernel");
+
+ boothowto = MD_FETCH(kmdp, MODINFOMD_HOWTO, int);
+ kern_envp = MD_FETCH(kmdp, MODINFOMD_ENVP, char *);
+
+#ifdef FDT
+ try_load_dtb(kmdp);
+#endif
+
+ /* Find the address to start allocating from */
+ lastaddr = MD_FETCH(kmdp, MODINFOMD_KERNEND, vm_offset_t);
+
+ /* Load the physical memory ranges */
+ physmap_idx = 0;
+ efihdr = (struct efi_map_header *)preload_search_info(kmdp,
+ MODINFO_METADATA | MODINFOMD_EFI_MAP);
+ add_efi_map_entries(efihdr, physmap, &physmap_idx);
+
+ /* Print the memory map */
+ mem_len = 0;
+ for (i = 0; i < physmap_idx; i += 2)
+ mem_len += physmap[i + 1] - physmap[i];
+
+ /* Set the pcpu data, this is needed by pmap_bootstrap */
+ pcpup = &__pcpu[0];
+ pcpu_init(pcpup, 0, sizeof(struct pcpu));
+
+ /*
+ * Set the pcpu pointer with a backup in tpidr_el1 to be
+ * loaded when entering the kernel from userland.
+ */
+ __asm __volatile(
+ "mov x18, %0 \n"
+ "msr tpidr_el1, %0" :: "r"(pcpup));
+
+ PCPU_SET(curthread, &thread0);
+
+ /* Do basic tuning, hz etc */
+ init_param1();
+
+ cache_setup();
+
+ /* Bootstrap enough of pmap to enter the kernel proper */
+ pmap_bootstrap(abp->kern_l1pt, KERNBASE - abp->kern_delta,
+ lastaddr - KERNBASE);
+
+ arm_devmap_bootstrap(0, NULL);
+
+ cninit();
+
+ init_proc0(abp->kern_stack);
+ msgbufinit(msgbufp, msgbufsize);
+ mutex_init();
+ init_param2(physmem);
+
+ dbg_monitor_init();
+ kdb_init();
+
+ early_boot = 0;
+}
+
diff --git a/sys/arm64/arm64/mem.c b/sys/arm64/arm64/mem.c
new file mode 100644
index 0000000..70c0f57
--- /dev/null
+++ b/sys/arm64/arm64/mem.c
@@ -0,0 +1,47 @@
+/*-
+ * Copyright (c) 2014 Andrew Turner
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/conf.h>
+#include <sys/malloc.h>
+#include <sys/memrange.h>
+
+#include <machine/memdev.h>
+
+struct mem_range_softc mem_range_softc;
+
+int
+memrw(struct cdev *dev, struct uio *uio, int flags)
+{
+
+ panic("memrw");
+}
+
diff --git a/sys/arm64/arm64/minidump_machdep.c b/sys/arm64/arm64/minidump_machdep.c
new file mode 100644
index 0000000..c53be2c
--- /dev/null
+++ b/sys/arm64/arm64/minidump_machdep.c
@@ -0,0 +1,50 @@
+/*-
+ * Copyright (c) 2015 The FreeBSD Foundation
+ * All rights reserved.
+ *
+ * This software was developed by Andrew Turner under
+ * sponsorship from the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "opt_watchdog.h"
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/conf.h>
+#include <sys/kernel.h>
+#include <sys/kerneldump.h>
+
+#include <machine/md_var.h>
+
+int
+minidumpsys(struct dumperinfo *di)
+{
+
+ printf("minidumpsys\n");
+ while (1);
+}
+
diff --git a/sys/arm64/arm64/nexus.c b/sys/arm64/arm64/nexus.c
new file mode 100644
index 0000000..bc38330
--- /dev/null
+++ b/sys/arm64/arm64/nexus.c
@@ -0,0 +1,334 @@
+/*-
+ * Copyright 1998 Massachusetts Institute of Technology
+ *
+ * Permission to use, copy, modify, and distribute this software and
+ * its documentation for any purpose and without fee is hereby
+ * granted, provided that both the above copyright notice and this
+ * permission notice appear in all copies, that both the above
+ * copyright notice and this permission notice appear in all
+ * supporting documentation, and that the name of M.I.T. not be used
+ * in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. M.I.T. makes
+ * no representations about the suitability of this software for any
+ * purpose. It is provided "as is" without express or implied
+ * warranty.
+ *
+ * THIS SOFTWARE IS PROVIDED BY M.I.T. ``AS IS''. M.I.T. DISCLAIMS
+ * ALL EXPRESS OR IMPLIED WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT
+ * SHALL M.I.T. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+/*
+ * This code implements a `root nexus' for Arm Architecture
+ * machines. The function of the root nexus is to serve as an
+ * attachment point for both processors and buses, and to manage
+ * resources which are common to all of them. In particular,
+ * this code implements the core resource managers for interrupt
+ * requests, DMA requests (which rightfully should be a part of the
+ * ISA code but it's easier to do it here for now), I/O port addresses,
+ * and I/O memory address space.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/bus.h>
+#include <sys/kernel.h>
+#include <sys/malloc.h>
+#include <sys/module.h>
+#include <machine/bus.h>
+#include <sys/rman.h>
+#include <sys/interrupt.h>
+
+#include <machine/vmparam.h>
+#include <machine/pcb.h>
+#include <vm/vm.h>
+#include <vm/pmap.h>
+
+#include <machine/resource.h>
+#include <machine/intr.h>
+
+#include "opt_platform.h"
+
+#ifdef FDT
+#include <dev/fdt/fdt_common.h>
+#include "ofw_bus_if.h"
+#endif
+
+extern struct bus_space memmap_bus;
+
+static MALLOC_DEFINE(M_NEXUSDEV, "nexusdev", "Nexus device");
+
+struct nexus_device {
+ struct resource_list nx_resources;
+};
+
+#define DEVTONX(dev) ((struct nexus_device *)device_get_ivars(dev))
+
+static struct rman mem_rman;
+
+static int nexus_probe(device_t);
+static int nexus_attach(device_t);
+static int nexus_print_child(device_t, device_t);
+static device_t nexus_add_child(device_t, u_int, const char *, int);
+static struct resource *nexus_alloc_resource(device_t, device_t, int, int *,
+ u_long, u_long, u_long, u_int);
+static int nexus_activate_resource(device_t, device_t, int, int,
+ struct resource *);
+static int nexus_config_intr(device_t dev, int irq, enum intr_trigger trig,
+ enum intr_polarity pol);
+static int nexus_deactivate_resource(device_t, device_t, int, int,
+ struct resource *);
+
+static int nexus_setup_intr(device_t dev, device_t child, struct resource *res,
+ int flags, driver_filter_t *filt, driver_intr_t *intr, void *arg, void **cookiep);
+static int nexus_teardown_intr(device_t, device_t, struct resource *, void *);
+
+#ifdef FDT
+static int nexus_ofw_map_intr(device_t dev, device_t child, phandle_t iparent,
+ int icells, pcell_t *intr);
+#endif
+
+static device_method_t nexus_methods[] = {
+ /* Device interface */
+ DEVMETHOD(device_probe, nexus_probe),
+ DEVMETHOD(device_attach, nexus_attach),
+ /* Bus interface */
+ DEVMETHOD(bus_print_child, nexus_print_child),
+ DEVMETHOD(bus_add_child, nexus_add_child),
+ DEVMETHOD(bus_alloc_resource, nexus_alloc_resource),
+ DEVMETHOD(bus_activate_resource, nexus_activate_resource),
+ DEVMETHOD(bus_config_intr, nexus_config_intr),
+ DEVMETHOD(bus_deactivate_resource, nexus_deactivate_resource),
+ DEVMETHOD(bus_setup_intr, nexus_setup_intr),
+ DEVMETHOD(bus_teardown_intr, nexus_teardown_intr),
+#ifdef FDT
+ DEVMETHOD(ofw_bus_map_intr, nexus_ofw_map_intr),
+#endif
+ { 0, 0 }
+};
+
+static devclass_t nexus_devclass;
+static driver_t nexus_driver = {
+ "nexus",
+ nexus_methods,
+ 1 /* no softc */
+};
+DRIVER_MODULE(nexus, root, nexus_driver, nexus_devclass, 0, 0);
+
+static int
+nexus_probe(device_t dev)
+{
+
+ device_quiet(dev); /* suppress attach message for neatness */
+
+ return (BUS_PROBE_DEFAULT);
+}
+
+static int
+nexus_attach(device_t dev)
+{
+
+ mem_rman.rm_start = 0;
+ mem_rman.rm_end = ~0ul;
+ mem_rman.rm_type = RMAN_ARRAY;
+ mem_rman.rm_descr = "I/O memory addresses";
+ if (rman_init(&mem_rman) || rman_manage_region(&mem_rman, 0, ~0))
+ panic("nexus_probe mem_rman");
+
+ /*
+ * First, deal with the children we know about already
+ */
+ bus_generic_probe(dev);
+ bus_generic_attach(dev);
+
+ return (0);
+}
+
+static int
+nexus_print_child(device_t bus, device_t child)
+{
+ int retval = 0;
+
+ retval += bus_print_child_header(bus, child);
+ retval += printf("\n");
+
+ return (retval);
+}
+
+static device_t
+nexus_add_child(device_t bus, u_int order, const char *name, int unit)
+{
+ device_t child;
+ struct nexus_device *ndev;
+
+ ndev = malloc(sizeof(struct nexus_device), M_NEXUSDEV, M_NOWAIT|M_ZERO);
+ if (!ndev)
+ return (0);
+ resource_list_init(&ndev->nx_resources);
+
+ child = device_add_child_ordered(bus, order, name, unit);
+
+ /* should we free this in nexus_child_detached? */
+ device_set_ivars(child, ndev);
+
+ return (child);
+}
+
+
+/*
+ * Allocate a resource on behalf of child. NB: child is usually going to be a
+ * child of one of our descendants, not a direct child of nexus0.
+ * (Exceptions include footbridge.)
+ */
+static struct resource *
+nexus_alloc_resource(device_t bus, device_t child, int type, int *rid,
+ u_long start, u_long end, u_long count, u_int flags)
+{
+ struct resource *rv;
+ struct rman *rm;
+ int needactivate = flags & RF_ACTIVE;
+
+ switch (type) {
+ case SYS_RES_MEMORY:
+ case SYS_RES_IOPORT:
+ rm = &mem_rman;
+ break;
+
+ default:
+ return (NULL);
+ }
+
+ rv = rman_reserve_resource(rm, start, end, count, flags, child);
+ if (rv == 0)
+ return (NULL);
+
+ rman_set_rid(rv, *rid);
+ rman_set_bushandle(rv, rman_get_start(rv));
+
+ if (needactivate) {
+ if (bus_activate_resource(child, type, *rid, rv)) {
+ rman_release_resource(rv);
+ return (NULL);
+ }
+ }
+
+ return (rv);
+}
+
+static int
+nexus_config_intr(device_t dev, int irq, enum intr_trigger trig,
+ enum intr_polarity pol)
+{
+
+ return (arm_config_intr(irq, trig, pol));
+}
+
+static int
+nexus_setup_intr(device_t dev, device_t child, struct resource *res, int flags,
+ driver_filter_t *filt, driver_intr_t *intr, void *arg, void **cookiep)
+{
+ int error;
+
+ if ((rman_get_flags(res) & RF_SHAREABLE) == 0)
+ flags |= INTR_EXCL;
+
+ /* We depend here on rman_activate_resource() being idempotent. */
+ error = rman_activate_resource(res);
+ if (error)
+ return (error);
+
+ error = arm_setup_intr(device_get_nameunit(child), filt, intr,
+ arg, rman_get_start(res), flags, cookiep);
+
+ return (error);
+}
+
+static int
+nexus_teardown_intr(device_t dev, device_t child, struct resource *r, void *ih)
+{
+
+ return (arm_teardown_intr(ih));
+}
+
+static int
+nexus_activate_resource(device_t bus, device_t child, int type, int rid,
+ struct resource *r)
+{
+ int err;
+ bus_addr_t paddr;
+ bus_size_t psize;
+ bus_space_handle_t vaddr;
+
+ if ((err = rman_activate_resource(r)) != 0)
+ return (err);
+
+ /*
+ * If this is a memory resource, map it into the kernel.
+ */
+ if (type == SYS_RES_MEMORY || type == SYS_RES_IOPORT) {
+ paddr = (bus_addr_t)rman_get_start(r);
+ psize = (bus_size_t)rman_get_size(r);
+ err = bus_space_map(&memmap_bus, paddr, psize, 0, &vaddr);
+ if (err != 0) {
+ rman_deactivate_resource(r);
+ return (err);
+ }
+ rman_set_bustag(r, &memmap_bus);
+ rman_set_virtual(r, (void *)vaddr);
+ rman_set_bushandle(r, vaddr);
+ }
+ return (0);
+}
+
+static int
+nexus_deactivate_resource(device_t bus, device_t child, int type, int rid,
+ struct resource *r)
+{
+ bus_size_t psize;
+ bus_space_handle_t vaddr;
+
+ psize = (bus_size_t)rman_get_size(r);
+ vaddr = rman_get_bushandle(r);
+
+ if (vaddr != 0) {
+ bus_space_unmap(&memmap_bus, vaddr, psize);
+ rman_set_virtual(r, NULL);
+ rman_set_bushandle(r, 0);
+ }
+
+ return (rman_deactivate_resource(r));
+}
+
+#ifdef FDT
+static int
+nexus_ofw_map_intr(device_t dev, device_t child, phandle_t iparent, int icells,
+ pcell_t *intr)
+{
+ int irq;
+
+ if (icells == 3) {
+ irq = intr[1];
+ if (intr[0] == 0)
+ irq += 32; /* SPI */
+ else
+ irq += 16; /* PPI */
+ } else
+ irq = intr[0];
+
+ return (irq);
+}
+#endif
+
diff --git a/sys/arm64/arm64/pic_if.m b/sys/arm64/arm64/pic_if.m
new file mode 100644
index 0000000..f05c31b
--- /dev/null
+++ b/sys/arm64/arm64/pic_if.m
@@ -0,0 +1,180 @@
+#-
+# Copyright (c) 1998 Doug Rabson
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# from: src/sys/kern/bus_if.m,v 1.21 2002/04/21 11:16:10 markm Exp
+# $FreeBSD$
+#
+
+#include <sys/bus.h>
+#include <sys/cpuset.h>
+#include <machine/frame.h>
+
+INTERFACE pic;
+
+CODE {
+ static pic_translate_code_t pic_translate_code_default;
+
+ static void pic_translate_code_default(device_t dev, u_int irq,
+ int code, enum intr_trigger *trig, enum intr_polarity *pol)
+ {
+ *trig = INTR_TRIGGER_CONFORM;
+ *pol = INTR_POLARITY_CONFORM;
+ }
+
+ static void pic_pre_ithread(device_t dev, u_int irq)
+ {
+ PIC_MASK(dev, irq);
+ PIC_EOI(dev, irq);
+ }
+
+ static void pic_post_ithread(device_t dev, u_int irq)
+ {
+ PIC_UNMASK(dev, irq);
+ }
+
+ static void pic_post_filter(device_t dev, u_int irq)
+ {
+ PIC_EOI(dev, irq);
+ }
+};
+
+METHOD void bind {
+ device_t dev;
+ u_int irq;
+ cpuset_t cpumask;
+};
+
+METHOD void translate_code {
+ device_t dev;
+ u_int irq;
+ int code;
+ enum intr_trigger *trig;
+ enum intr_polarity *pol;
+} DEFAULT pic_translate_code_default;
+
+METHOD void config {
+ device_t dev;
+ u_int irq;
+ enum intr_trigger trig;
+ enum intr_polarity pol;
+};
+
+METHOD void dispatch {
+ device_t dev;
+ struct trapframe *tf;
+};
+
+METHOD void enable {
+ device_t dev;
+ u_int irq;
+ u_int vector;
+};
+
+METHOD void pre_ithread {
+ device_t dev;
+ u_int irq;
+} DEFAULT pic_pre_ithread;
+
+METHOD void post_ithread {
+ device_t dev;
+ u_int irq;
+} DEFAULT pic_post_ithread;
+
+METHOD void post_filter {
+ device_t dev;
+ u_int irq;
+} DEFAULT pic_post_filter;
+
+METHOD void eoi {
+ device_t dev;
+ u_int irq;
+};
+
+METHOD void ipi {
+ device_t dev;
+ u_int cpu;
+};
+
+METHOD void mask {
+ device_t dev;
+ u_int irq;
+};
+
+METHOD void unmask {
+ device_t dev;
+ u_int irq;
+};
+
+METHOD void init_secondary {
+ device_t dev;
+};
+
+METHOD void ipi_send {
+ device_t dev;
+ cpuset_t cpus;
+ u_int ipi;
+};
+
+METHOD int alloc_msi {
+ device_t dev;
+ device_t pci_dev;
+ int count;
+ int *irqs;
+};
+
+METHOD int alloc_msix {
+ device_t dev;
+ device_t pci_dev;
+ int *irq;
+};
+
+METHOD int map_msi {
+ device_t dev;
+ device_t pci_dev;
+ int irq;
+ uint64_t *addr;
+ uint32_t *data;
+};
+
+METHOD int map_msix {
+ device_t dev;
+ device_t pci_dev;
+ int irq;
+ uint64_t *addr;
+ uint32_t *data;
+};
+
+METHOD int release_msi {
+ device_t dev;
+ device_t pci_dev;
+ int count;
+ int *irqs;
+};
+
+METHOD int release_msix {
+ device_t dev;
+ device_t pci_dev;
+ int irq;
+};
diff --git a/sys/arm64/arm64/pmap.c b/sys/arm64/arm64/pmap.c
new file mode 100644
index 0000000..c192fa6
--- /dev/null
+++ b/sys/arm64/arm64/pmap.c
@@ -0,0 +1,3082 @@
+/*-
+ * Copyright (c) 1991 Regents of the University of California.
+ * All rights reserved.
+ * Copyright (c) 1994 John S. Dyson
+ * All rights reserved.
+ * Copyright (c) 1994 David Greenman
+ * All rights reserved.
+ * Copyright (c) 2003 Peter Wemm
+ * All rights reserved.
+ * Copyright (c) 2005-2010 Alan L. Cox <alc@cs.rice.edu>
+ * All rights reserved.
+ * Copyright (c) 2014 Andrew Turner
+ * All rights reserved.
+ * Copyright (c) 2014 The FreeBSD Foundation
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * the Systems Programming Group of the University of Utah Computer
+ * Science Department and William Jolitz of UUNET Technologies Inc.
+ *
+ * This software was developed by Andrew Turner under sponsorship from
+ * the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * from: @(#)pmap.c 7.7 (Berkeley) 5/12/91
+ */
+/*-
+ * Copyright (c) 2003 Networks Associates Technology, Inc.
+ * All rights reserved.
+ *
+ * This software was developed for the FreeBSD Project by Jake Burkholder,
+ * Safeport Network Services, and Network Associates Laboratories, the
+ * Security Research Division of Network Associates, Inc. under
+ * DARPA/SPAWAR contract N66001-01-C-8035 ("CBOSS"), as part of the DARPA
+ * CHATS research program.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#define AMD64_NPT_AWARE
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * Manages physical address maps.
+ *
+ * Since the information managed by this module is
+ * also stored by the logical address mapping module,
+ * this module may throw away valid virtual-to-physical
+ * mappings at almost any time. However, invalidations
+ * of virtual-to-physical mappings must be done as
+ * requested.
+ *
+ * In order to cope with hardware architectures which
+ * make virtual-to-physical map invalidates expensive,
+ * this module may delay invalidate or reduced protection
+ * operations until such time as they are actually
+ * necessary. This module is given full information as
+ * to which processors are currently using which maps,
+ * and to when physical maps must be made correct.
+ */
+
+#include <sys/param.h>
+#include <sys/bus.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/ktr.h>
+#include <sys/lock.h>
+#include <sys/malloc.h>
+#include <sys/mman.h>
+#include <sys/msgbuf.h>
+#include <sys/mutex.h>
+#include <sys/proc.h>
+#include <sys/rwlock.h>
+#include <sys/sx.h>
+#include <sys/vmem.h>
+#include <sys/vmmeter.h>
+#include <sys/sched.h>
+#include <sys/sysctl.h>
+#include <sys/_unrhdr.h>
+#include <sys/smp.h>
+
+#include <vm/vm.h>
+#include <vm/vm_param.h>
+#include <vm/vm_kern.h>
+#include <vm/vm_page.h>
+#include <vm/vm_map.h>
+#include <vm/vm_object.h>
+#include <vm/vm_extern.h>
+#include <vm/vm_pageout.h>
+#include <vm/vm_pager.h>
+#include <vm/vm_radix.h>
+#include <vm/vm_reserv.h>
+#include <vm/uma.h>
+
+#include <machine/machdep.h>
+#include <machine/md_var.h>
+#include <machine/pcb.h>
+
+#define NPDEPG (PAGE_SIZE/(sizeof (pd_entry_t)))
+#define NUPDE (NPDEPG * NPDEPG)
+#define NUSERPGTBLS (NUPDE + NPDEPG)
+
+#if !defined(DIAGNOSTIC)
+#ifdef __GNUC_GNU_INLINE__
+#define PMAP_INLINE __attribute__((__gnu_inline__)) inline
+#else
+#define PMAP_INLINE extern inline
+#endif
+#else
+#define PMAP_INLINE
+#endif
+
+/*
+ * These are configured by the mair_el1 register. This is set up in locore.S
+ */
+#define DEVICE_MEMORY 0
+#define UNCACHED_MEMORY 1
+#define CACHED_MEMORY 2
+
+
+#ifdef PV_STATS
+#define PV_STAT(x) do { x ; } while (0)
+#else
+#define PV_STAT(x) do { } while (0)
+#endif
+
+#define pmap_l2_pindex(v) ((v) >> L2_SHIFT)
+
+#define NPV_LIST_LOCKS MAXCPU
+
+#define PHYS_TO_PV_LIST_LOCK(pa) \
+ (&pv_list_locks[pa_index(pa) % NPV_LIST_LOCKS])
+
+#define CHANGE_PV_LIST_LOCK_TO_PHYS(lockp, pa) do { \
+ struct rwlock **_lockp = (lockp); \
+ struct rwlock *_new_lock; \
+ \
+ _new_lock = PHYS_TO_PV_LIST_LOCK(pa); \
+ if (_new_lock != *_lockp) { \
+ if (*_lockp != NULL) \
+ rw_wunlock(*_lockp); \
+ *_lockp = _new_lock; \
+ rw_wlock(*_lockp); \
+ } \
+} while (0)
+
+#define CHANGE_PV_LIST_LOCK_TO_VM_PAGE(lockp, m) \
+ CHANGE_PV_LIST_LOCK_TO_PHYS(lockp, VM_PAGE_TO_PHYS(m))
+
+#define RELEASE_PV_LIST_LOCK(lockp) do { \
+ struct rwlock **_lockp = (lockp); \
+ \
+ if (*_lockp != NULL) { \
+ rw_wunlock(*_lockp); \
+ *_lockp = NULL; \
+ } \
+} while (0)
+
+#define VM_PAGE_TO_PV_LIST_LOCK(m) \
+ PHYS_TO_PV_LIST_LOCK(VM_PAGE_TO_PHYS(m))
+
+struct pmap kernel_pmap_store;
+
+vm_offset_t virtual_avail; /* VA of first avail page (after kernel bss) */
+vm_offset_t virtual_end; /* VA of last avail page (end of kernel AS) */
+vm_offset_t kernel_vm_end = 0;
+
+struct msgbuf *msgbufp = NULL;
+
+static struct rwlock_padalign pvh_global_lock;
+
+/*
+ * Data for the pv entry allocation mechanism
+ */
+static TAILQ_HEAD(pch, pv_chunk) pv_chunks = TAILQ_HEAD_INITIALIZER(pv_chunks);
+static struct mtx pv_chunks_mutex;
+static struct rwlock pv_list_locks[NPV_LIST_LOCKS];
+
+static void free_pv_chunk(struct pv_chunk *pc);
+static void free_pv_entry(pmap_t pmap, pv_entry_t pv);
+static pv_entry_t get_pv_entry(pmap_t pmap, struct rwlock **lockp);
+static vm_page_t reclaim_pv_chunk(pmap_t locked_pmap, struct rwlock **lockp);
+static void pmap_pvh_free(struct md_page *pvh, pmap_t pmap, vm_offset_t va);
+static pv_entry_t pmap_pvh_remove(struct md_page *pvh, pmap_t pmap,
+ vm_offset_t va);
+static vm_page_t pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va,
+ vm_page_t m, vm_prot_t prot, vm_page_t mpte, struct rwlock **lockp);
+static int pmap_remove_l3(pmap_t pmap, pt_entry_t *l3, vm_offset_t sva,
+ pd_entry_t ptepde, struct spglist *free, struct rwlock **lockp);
+static boolean_t pmap_try_insert_pv_entry(pmap_t pmap, vm_offset_t va,
+ vm_page_t m, struct rwlock **lockp);
+
+static vm_page_t _pmap_alloc_l3(pmap_t pmap, vm_pindex_t ptepindex,
+ struct rwlock **lockp);
+
+static void _pmap_unwire_l3(pmap_t pmap, vm_offset_t va, vm_page_t m,
+ struct spglist *free);
+static int pmap_unuse_l3(pmap_t, vm_offset_t, pd_entry_t, struct spglist *);
+
+/********************/
+/* Inline functions */
+/********************/
+
+static __inline void
+pagecopy(void *s, void *d)
+{
+
+ memcpy(d, s, PAGE_SIZE);
+}
+
+static __inline void
+pagezero(void *p)
+{
+
+ bzero(p, PAGE_SIZE);
+}
+
+#define pmap_l1_index(va) (((va) >> L1_SHIFT) & Ln_ADDR_MASK)
+#define pmap_l2_index(va) (((va) >> L2_SHIFT) & Ln_ADDR_MASK)
+#define pmap_l3_index(va) (((va) >> L3_SHIFT) & Ln_ADDR_MASK)
+
+static __inline pd_entry_t *
+pmap_l1(pmap_t pmap, vm_offset_t va)
+{
+
+ return (&pmap->pm_l1[pmap_l1_index(va)]);
+}
+
+static __inline pd_entry_t *
+pmap_l1_to_l2(pd_entry_t *l1, vm_offset_t va)
+{
+ pd_entry_t *l2;
+
+ l2 = (pd_entry_t *)PHYS_TO_DMAP(*l1 & ~ATTR_MASK);
+ return (&l2[pmap_l2_index(va)]);
+}
+
+static __inline pd_entry_t *
+pmap_l2(pmap_t pmap, vm_offset_t va)
+{
+ pd_entry_t *l1;
+
+ l1 = pmap_l1(pmap, va);
+ if ((*l1 & ATTR_DESCR_MASK) != L1_TABLE)
+ return (NULL);
+
+ return (pmap_l1_to_l2(l1, va));
+}
+
+static __inline pt_entry_t *
+pmap_l2_to_l3(pd_entry_t *l2, vm_offset_t va)
+{
+ pt_entry_t *l3;
+
+ l3 = (pd_entry_t *)PHYS_TO_DMAP(*l2 & ~ATTR_MASK);
+ return (&l3[pmap_l3_index(va)]);
+}
+
+static __inline pt_entry_t *
+pmap_l3(pmap_t pmap, vm_offset_t va)
+{
+ pd_entry_t *l2;
+
+ l2 = pmap_l2(pmap, va);
+ if (l2 == NULL || (*l2 & ATTR_DESCR_MASK) != L2_TABLE)
+ return (NULL);
+
+ return (pmap_l2_to_l3(l2, va));
+}
+
+/*
+ * These load the old table data and store the new value.
+ * They need to be atomic as the System MMU may write to the table at
+ * the same time as the CPU.
+ */
+#define pmap_load_store(table, entry) atomic_swap_64(table, entry)
+#define pmap_set(table, mask) atomic_set_64(table, mask)
+#define pmap_load_clear(table) atomic_swap_64(table, 0)
+#define pmap_load(table) (*table)
+
+static __inline int
+pmap_is_current(pmap_t pmap)
+{
+
+ return ((pmap == pmap_kernel()) ||
+ (pmap == curthread->td_proc->p_vmspace->vm_map.pmap));
+}
+
+static __inline int
+pmap_l3_valid(pt_entry_t l3)
+{
+
+ return ((l3 & ATTR_DESCR_MASK) == L3_PAGE);
+}
+
+static __inline int
+pmap_l3_valid_cacheable(pt_entry_t l3)
+{
+
+ return (((l3 & ATTR_DESCR_MASK) == L3_PAGE) &&
+ ((l3 & ATTR_IDX_MASK) == ATTR_IDX(CACHED_MEMORY)));
+}
+
+#define PTE_SYNC(pte) cpu_dcache_wb_range((vm_offset_t)pte, sizeof(*pte))
+
+/*
+ * Checks if the page is dirty. We currently lack proper tracking of this on
+ * arm64 so for now assume is a page mapped as rw was accessed it is.
+ */
+static inline int
+pmap_page_dirty(pt_entry_t pte)
+{
+
+ return ((pte & (ATTR_AF | ATTR_AP_RW_BIT)) ==
+ (ATTR_AF | ATTR_AP(ATTR_AP_RW)));
+}
+
+static __inline void
+pmap_resident_count_inc(pmap_t pmap, int count)
+{
+
+ PMAP_LOCK_ASSERT(pmap, MA_OWNED);
+ pmap->pm_stats.resident_count += count;
+}
+
+static __inline void
+pmap_resident_count_dec(pmap_t pmap, int count)
+{
+
+ PMAP_LOCK_ASSERT(pmap, MA_OWNED);
+ KASSERT(pmap->pm_stats.resident_count >= count,
+ ("pmap %p resident count underflow %ld %d", pmap,
+ pmap->pm_stats.resident_count, count));
+ pmap->pm_stats.resident_count -= count;
+}
+
+static pt_entry_t *
+pmap_early_page_idx(vm_offset_t l1pt, vm_offset_t va, u_int *l1_slot,
+ u_int *l2_slot)
+{
+ pt_entry_t *l2;
+ pd_entry_t *l1;
+
+ l1 = (pd_entry_t *)l1pt;
+ *l1_slot = (va >> L1_SHIFT) & Ln_ADDR_MASK;
+
+ /* Check locore has used a table L1 map */
+ KASSERT((l1[*l1_slot] & ATTR_DESCR_MASK) == L1_TABLE,
+ ("Invalid bootstrap L1 table"));
+ /* Find the address of the L2 table */
+ l2 = (pt_entry_t *)init_pt_va;
+ *l2_slot = pmap_l2_index(va);
+
+ return (l2);
+}
+
+static vm_paddr_t
+pmap_early_vtophys(vm_offset_t l1pt, vm_offset_t va)
+{
+ u_int l1_slot, l2_slot;
+ pt_entry_t *l2;
+
+ l2 = pmap_early_page_idx(l1pt, va, &l1_slot, &l2_slot);
+
+ return ((l2[l2_slot] & ~ATTR_MASK) + (va & L2_OFFSET));
+}
+
+static void
+pmap_bootstrap_dmap(vm_offset_t l1pt)
+{
+ vm_offset_t va;
+ vm_paddr_t pa;
+ pd_entry_t *l1;
+ u_int l1_slot;
+
+ va = DMAP_MIN_ADDRESS;
+ l1 = (pd_entry_t *)l1pt;
+ l1_slot = pmap_l1_index(DMAP_MIN_ADDRESS);
+
+ for (pa = 0; va < DMAP_MAX_ADDRESS;
+ pa += L1_SIZE, va += L1_SIZE, l1_slot++) {
+ KASSERT(l1_slot < Ln_ENTRIES, ("Invalid L1 index"));
+
+ /*
+ * TODO: Turn the cache on here when we have cache
+ * flushing code.
+ */
+ pmap_load_store(&l1[l1_slot],
+ (pa & ~L1_OFFSET) | ATTR_AF | L1_BLOCK |
+ ATTR_IDX(CACHED_MEMORY));
+ }
+
+ cpu_dcache_wb_range((vm_offset_t)l1, PAGE_SIZE);
+ cpu_tlb_flushID();
+}
+
+static vm_offset_t
+pmap_bootstrap_l2(vm_offset_t l1pt, vm_offset_t va, vm_offset_t l2_start)
+{
+ vm_offset_t l2pt;
+ vm_paddr_t pa;
+ pd_entry_t *l1;
+ u_int l1_slot;
+
+ KASSERT((va & L1_OFFSET) == 0, ("Invalid virtual address"));
+
+ l1 = (pd_entry_t *)l1pt;
+ l1_slot = pmap_l1_index(va);
+ l2pt = l2_start;
+
+ for (; va < VM_MAX_KERNEL_ADDRESS; l1_slot++, va += L1_SIZE) {
+ KASSERT(l1_slot < Ln_ENTRIES, ("Invalid L1 index"));
+
+ pa = pmap_early_vtophys(l1pt, l2pt);
+ pmap_load_store(&l1[l1_slot],
+ (pa & ~Ln_TABLE_MASK) | L1_TABLE);
+ l2pt += PAGE_SIZE;
+ }
+
+ /* Clean the L2 page table */
+ memset((void *)l2_start, 0, l2pt - l2_start);
+ cpu_dcache_wb_range(l2_start, l2pt - l2_start);
+
+ /* Flush the l1 table to ram */
+ cpu_dcache_wb_range((vm_offset_t)l1, PAGE_SIZE);
+
+ return l2pt;
+}
+
+static vm_offset_t
+pmap_bootstrap_l3(vm_offset_t l1pt, vm_offset_t va, vm_offset_t l3_start)
+{
+ vm_offset_t l2pt, l3pt;
+ vm_paddr_t pa;
+ pd_entry_t *l2;
+ u_int l2_slot;
+
+ KASSERT((va & L2_OFFSET) == 0, ("Invalid virtual address"));
+
+ l2 = pmap_l2(kernel_pmap, va);
+ l2 = (pd_entry_t *)((uintptr_t)l2 & ~(PAGE_SIZE - 1));
+ l2pt = (vm_offset_t)l2;
+ l2_slot = pmap_l2_index(va);
+ l3pt = l3_start;
+
+ for (; va < VM_MAX_KERNEL_ADDRESS; l2_slot++, va += L2_SIZE) {
+ KASSERT(l2_slot < Ln_ENTRIES, ("Invalid L2 index"));
+
+ pa = pmap_early_vtophys(l1pt, l3pt);
+ pmap_load_store(&l2[l2_slot],
+ (pa & ~Ln_TABLE_MASK) | L2_TABLE);
+ l3pt += PAGE_SIZE;
+ }
+
+ /* Clean the L2 page table */
+ memset((void *)l3_start, 0, l3pt - l3_start);
+ cpu_dcache_wb_range(l3_start, l3pt - l3_start);
+
+ cpu_dcache_wb_range((vm_offset_t)l2, PAGE_SIZE);
+
+ return l3pt;
+}
+
+/*
+ * Bootstrap the system enough to run with virtual memory.
+ */
+void
+pmap_bootstrap(vm_offset_t l1pt, vm_paddr_t kernstart, vm_size_t kernlen)
+{
+ u_int l1_slot, l2_slot, avail_slot, map_slot, used_map_slot;
+ uint64_t kern_delta;
+ pt_entry_t *l2;
+ vm_offset_t va, freemempos;
+ vm_offset_t dpcpu, msgbufpv;
+ vm_paddr_t pa;
+
+ kern_delta = KERNBASE - kernstart;
+ physmem = 0;
+
+ printf("pmap_bootstrap %lx %lx %lx\n", l1pt, kernstart, kernlen);
+ printf("%lx\n", l1pt);
+ printf("%lx\n", (KERNBASE >> L1_SHIFT) & Ln_ADDR_MASK);
+
+ /* Set this early so we can use the pagetable walking functions */
+ kernel_pmap_store.pm_l1 = (pd_entry_t *)l1pt;
+ PMAP_LOCK_INIT(kernel_pmap);
+
+ /*
+ * Initialize the global pv list lock.
+ */
+ rw_init(&pvh_global_lock, "pmap pv global");
+
+ /* Create a direct map region early so we can use it for pa -> va */
+ pmap_bootstrap_dmap(l1pt);
+
+ va = KERNBASE;
+ pa = KERNBASE - kern_delta;
+
+ /*
+ * Start to initialise phys_avail by copying from physmap
+ * up to the physical address KERNBASE points at.
+ */
+ map_slot = avail_slot = 0;
+ for (; map_slot < (physmap_idx * 2); map_slot += 2) {
+ if (physmap[map_slot] == physmap[map_slot + 1])
+ continue;
+
+ if (physmap[map_slot] <= pa &&
+ physmap[map_slot + 1] > pa)
+ break;
+
+ phys_avail[avail_slot] = physmap[map_slot];
+ phys_avail[avail_slot + 1] = physmap[map_slot + 1];
+ physmem += (phys_avail[avail_slot + 1] -
+ phys_avail[avail_slot]) >> PAGE_SHIFT;
+ avail_slot += 2;
+ }
+
+ /* Add the memory before the kernel */
+ if (physmap[avail_slot] < pa) {
+ phys_avail[avail_slot] = physmap[map_slot];
+ phys_avail[avail_slot + 1] = pa;
+ physmem += (phys_avail[avail_slot + 1] -
+ phys_avail[avail_slot]) >> PAGE_SHIFT;
+ avail_slot += 2;
+ }
+ used_map_slot = map_slot;
+
+ /*
+ * Read the page table to find out what is already mapped.
+ * This assumes we have mapped a block of memory from KERNBASE
+ * using a single L1 entry.
+ */
+ l2 = pmap_early_page_idx(l1pt, KERNBASE, &l1_slot, &l2_slot);
+
+ /* Sanity check the index, KERNBASE should be the first VA */
+ KASSERT(l2_slot == 0, ("The L2 index is non-zero"));
+
+ /* Find how many pages we have mapped */
+ for (; l2_slot < Ln_ENTRIES; l2_slot++) {
+ if ((l2[l2_slot] & ATTR_DESCR_MASK) == 0)
+ break;
+
+ /* Check locore used L2 blocks */
+ KASSERT((l2[l2_slot] & ATTR_DESCR_MASK) == L2_BLOCK,
+ ("Invalid bootstrap L2 table"));
+ KASSERT((l2[l2_slot] & ~ATTR_MASK) == pa,
+ ("Incorrect PA in L2 table"));
+
+ va += L2_SIZE;
+ pa += L2_SIZE;
+ }
+
+ va = roundup2(va, L1_SIZE);
+
+ freemempos = KERNBASE + kernlen;
+ freemempos = roundup2(freemempos, PAGE_SIZE);
+ /* Create the l2 tables up to VM_MAX_KERNEL_ADDRESS */
+ freemempos = pmap_bootstrap_l2(l1pt, va, freemempos);
+ /* And the l3 tables for the early devmap */
+ freemempos = pmap_bootstrap_l3(l1pt,
+ VM_MAX_KERNEL_ADDRESS - L2_SIZE, freemempos);
+
+ cpu_tlb_flushID();
+
+#define alloc_pages(var, np) \
+ (var) = freemempos; \
+ freemempos += (np * PAGE_SIZE); \
+ memset((char *)(var), 0, ((np) * PAGE_SIZE));
+
+ /* Allocate dynamic per-cpu area. */
+ alloc_pages(dpcpu, DPCPU_SIZE / PAGE_SIZE);
+ dpcpu_init((void *)dpcpu, 0);
+
+ /* Allocate memory for the msgbuf, e.g. for /sbin/dmesg */
+ alloc_pages(msgbufpv, round_page(msgbufsize) / PAGE_SIZE);
+ msgbufp = (void *)msgbufpv;
+
+ virtual_avail = roundup2(freemempos, L1_SIZE);
+ virtual_end = VM_MAX_KERNEL_ADDRESS - L2_SIZE;
+ kernel_vm_end = virtual_avail;
+
+ pa = pmap_early_vtophys(l1pt, freemempos);
+
+ /* Finish initialising physmap */
+ map_slot = used_map_slot;
+ for (; avail_slot < (PHYS_AVAIL_SIZE - 2) &&
+ map_slot < (physmap_idx * 2); map_slot += 2) {
+ if (physmap[map_slot] == physmap[map_slot + 1])
+ continue;
+
+ /* Have we used the current range? */
+ if (physmap[map_slot + 1] <= pa)
+ continue;
+
+ /* Do we need to split the entry? */
+ if (physmap[map_slot] < pa) {
+ phys_avail[avail_slot] = pa;
+ phys_avail[avail_slot + 1] = physmap[map_slot + 1];
+ } else {
+ phys_avail[avail_slot] = physmap[map_slot];
+ phys_avail[avail_slot + 1] = physmap[map_slot + 1];
+ }
+ physmem += (phys_avail[avail_slot + 1] -
+ phys_avail[avail_slot]) >> PAGE_SHIFT;
+
+ avail_slot += 2;
+ }
+ phys_avail[avail_slot] = 0;
+ phys_avail[avail_slot + 1] = 0;
+
+ /*
+ * Maxmem isn't the "maximum memory", it's one larger than the
+ * highest page of the physical address space. It should be
+ * called something like "Maxphyspage".
+ */
+ Maxmem = atop(phys_avail[avail_slot - 1]);
+
+ cpu_tlb_flushID();
+}
+
+/*
+ * Initialize a vm_page's machine-dependent fields.
+ */
+void
+pmap_page_init(vm_page_t m)
+{
+
+ TAILQ_INIT(&m->md.pv_list);
+ m->md.pv_memattr = VM_MEMATTR_WRITE_BACK;
+}
+
+/*
+ * Initialize the pmap module.
+ * Called by vm_init, to initialize any structures that the pmap
+ * system needs to map virtual memory.
+ */
+void
+pmap_init(void)
+{
+ int i;
+
+ /*
+ * Initialize the pv chunk list mutex.
+ */
+ mtx_init(&pv_chunks_mutex, "pmap pv chunk list", NULL, MTX_DEF);
+
+ /*
+ * Initialize the pool of pv list locks.
+ */
+ for (i = 0; i < NPV_LIST_LOCKS; i++)
+ rw_init(&pv_list_locks[i], "pmap pv list");
+}
+
+/*
+ * Normal, non-SMP, invalidation functions.
+ * We inline these within pmap.c for speed.
+ */
+PMAP_INLINE void
+pmap_invalidate_page(pmap_t pmap, vm_offset_t va)
+{
+
+ sched_pin();
+ __asm __volatile(
+ "dsb sy \n"
+ "tlbi vaae1is, %0 \n"
+ "dsb sy \n"
+ "isb \n"
+ : : "r"(va >> PAGE_SHIFT));
+ sched_unpin();
+}
+
+PMAP_INLINE void
+pmap_invalidate_range(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
+{
+ vm_offset_t addr;
+
+ sched_pin();
+ sva >>= PAGE_SHIFT;
+ eva >>= PAGE_SHIFT;
+ __asm __volatile("dsb sy");
+ for (addr = sva; addr < eva; addr++) {
+ __asm __volatile(
+ "tlbi vaae1is, %0" : : "r"(addr));
+ }
+ __asm __volatile(
+ "dsb sy \n"
+ "isb \n");
+ sched_unpin();
+}
+
+PMAP_INLINE void
+pmap_invalidate_all(pmap_t pmap)
+{
+
+ sched_pin();
+ __asm __volatile(
+ "dsb sy \n"
+ "tlbi vmalle1is \n"
+ "dsb sy \n"
+ "isb \n");
+ sched_unpin();
+}
+
+/*
+ * Routine: pmap_extract
+ * Function:
+ * Extract the physical page address associated
+ * with the given map/virtual_address pair.
+ */
+vm_paddr_t
+pmap_extract(pmap_t pmap, vm_offset_t va)
+{
+ pd_entry_t *l2p, l2;
+ pt_entry_t *l3p, l3;
+ vm_paddr_t pa;
+
+ pa = 0;
+ PMAP_LOCK(pmap);
+ /*
+ * Start with the l2 tabel. We are unable to allocate
+ * pages in the l1 table.
+ */
+ l2p = pmap_l2(pmap, va);
+ if (l2p != NULL) {
+ l2 = *l2p;
+ if ((l2 & ATTR_DESCR_MASK) == L2_TABLE) {
+ l3p = pmap_l2_to_l3(l2p, va);
+ if (l3p != NULL) {
+ l3 = *l3p;
+
+ if ((l3 & ATTR_DESCR_MASK) == L3_PAGE)
+ pa = (l3 & ~ATTR_MASK) |
+ (va & L3_OFFSET);
+ }
+ } else if ((l2 & ATTR_DESCR_MASK) == L2_BLOCK)
+ pa = (l2 & ~ATTR_MASK) | (va & L2_OFFSET);
+ }
+ PMAP_UNLOCK(pmap);
+ return (pa);
+}
+
+/*
+ * Routine: pmap_extract_and_hold
+ * Function:
+ * Atomically extract and hold the physical page
+ * with the given pmap and virtual address pair
+ * if that mapping permits the given protection.
+ */
+vm_page_t
+pmap_extract_and_hold(pmap_t pmap, vm_offset_t va, vm_prot_t prot)
+{
+ pt_entry_t *l3p, l3;
+ vm_paddr_t pa;
+ vm_page_t m;
+
+ pa = 0;
+ m = NULL;
+ PMAP_LOCK(pmap);
+retry:
+ l3p = pmap_l3(pmap, va);
+ if (l3p != NULL && (l3 = *l3p) != 0) {
+ if (((l3 & ATTR_AP_RW_BIT) == ATTR_AP(ATTR_AP_RW)) ||
+ ((prot & VM_PROT_WRITE) == 0)) {
+ if (vm_page_pa_tryrelock(pmap, l3 & ~ATTR_MASK, &pa))
+ goto retry;
+ m = PHYS_TO_VM_PAGE(l3 & ~ATTR_MASK);
+ vm_page_hold(m);
+ }
+ }
+ PA_UNLOCK_COND(pa);
+ PMAP_UNLOCK(pmap);
+ return (m);
+}
+
+vm_paddr_t
+pmap_kextract(vm_offset_t va)
+{
+ pd_entry_t *l2;
+ pt_entry_t *l3;
+ vm_paddr_t pa;
+
+ if (va >= DMAP_MIN_ADDRESS && va < DMAP_MAX_ADDRESS) {
+ pa = DMAP_TO_PHYS(va);
+ } else {
+ l2 = pmap_l2(kernel_pmap, va);
+ if (l2 == NULL)
+ panic("pmap_kextract: No l2");
+ if ((*l2 & ATTR_DESCR_MASK) == L2_BLOCK)
+ return ((*l2 & ~ATTR_MASK) | (va & L2_OFFSET));
+
+ l3 = pmap_l2_to_l3(l2, va);
+ if (l3 == NULL)
+ panic("pmap_kextract: No l3...");
+ pa = (*l3 & ~ATTR_MASK) | (va & PAGE_MASK);
+ }
+ return (pa);
+}
+
+/***************************************************
+ * Low level mapping routines.....
+ ***************************************************/
+
+void
+pmap_kenter_device(vm_offset_t va, vm_size_t size, vm_paddr_t pa)
+{
+ pt_entry_t *l3;
+
+ KASSERT((pa & L3_OFFSET) == 0,
+ ("pmap_kenter_device: Invalid physical address"));
+ KASSERT((va & L3_OFFSET) == 0,
+ ("pmap_kenter_device: Invalid virtual address"));
+ KASSERT((size & PAGE_MASK) == 0,
+ ("pmap_kenter_device: Mapping is not page-sized"));
+
+ while (size != 0) {
+ l3 = pmap_l3(kernel_pmap, va);
+ KASSERT(l3 != NULL, ("Invalid page table, va: 0x%lx", va));
+ pmap_load_store(l3, (pa & ~L3_OFFSET) | ATTR_AF | L3_PAGE |
+ ATTR_IDX(DEVICE_MEMORY));
+ PTE_SYNC(l3);
+
+ va += PAGE_SIZE;
+ pa += PAGE_SIZE;
+ size -= PAGE_SIZE;
+ }
+}
+
+/*
+ * Remove a page from the kernel pagetables.
+ * Note: not SMP coherent.
+ */
+PMAP_INLINE void
+pmap_kremove(vm_offset_t va)
+{
+ pt_entry_t *l3;
+
+ l3 = pmap_l3(kernel_pmap, va);
+ KASSERT(l3 != NULL, ("pmap_kremove: Invalid address"));
+
+ if (pmap_l3_valid_cacheable(pmap_load(l3)))
+ cpu_dcache_wb_range(va, L3_SIZE);
+ pmap_load_clear(l3);
+ PTE_SYNC(l3);
+}
+
+void
+pmap_kremove_device(vm_offset_t va, vm_size_t size)
+{
+ pt_entry_t *l3;
+
+ KASSERT((va & L3_OFFSET) == 0,
+ ("pmap_kremove_device: Invalid virtual address"));
+ KASSERT((size & PAGE_MASK) == 0,
+ ("pmap_kremove_device: Mapping is not page-sized"));
+
+ while (size != 0) {
+ l3 = pmap_l3(kernel_pmap, va);
+ KASSERT(l3 != NULL, ("Invalid page table, va: 0x%lx", va));
+ pmap_load_clear(l3);
+ PTE_SYNC(l3);
+
+ va += PAGE_SIZE;
+ size -= PAGE_SIZE;
+ }
+}
+
+/*
+ * Used to map a range of physical addresses into kernel
+ * virtual address space.
+ *
+ * The value passed in '*virt' is a suggested virtual address for
+ * the mapping. Architectures which can support a direct-mapped
+ * physical to virtual region can return the appropriate address
+ * within that region, leaving '*virt' unchanged. Other
+ * architectures should map the pages starting at '*virt' and
+ * update '*virt' with the first usable address after the mapped
+ * region.
+ */
+vm_offset_t
+pmap_map(vm_offset_t *virt, vm_paddr_t start, vm_paddr_t end, int prot)
+{
+ return PHYS_TO_DMAP(start);
+}
+
+
+/*
+ * Add a list of wired pages to the kva
+ * this routine is only used for temporary
+ * kernel mappings that do not need to have
+ * page modification or references recorded.
+ * Note that old mappings are simply written
+ * over. The page *must* be wired.
+ * Note: SMP coherent. Uses a ranged shootdown IPI.
+ */
+void
+pmap_qenter(vm_offset_t sva, vm_page_t *ma, int count)
+{
+ pt_entry_t *l3, pa;
+ vm_offset_t va;
+ vm_page_t m;
+ int i;
+
+ va = sva;
+ for (i = 0; i < count; i++) {
+ m = ma[i];
+ pa = VM_PAGE_TO_PHYS(m) | ATTR_AF |
+ ATTR_IDX(m->md.pv_memattr) | ATTR_AP(ATTR_AP_RW) | L3_PAGE;
+ l3 = pmap_l3(kernel_pmap, va);
+ pmap_load_store(l3, pa);
+ PTE_SYNC(l3);
+
+ va += L3_SIZE;
+ }
+}
+
+/*
+ * This routine tears out page mappings from the
+ * kernel -- it is meant only for temporary mappings.
+ * Note: SMP coherent. Uses a ranged shootdown IPI.
+ */
+void
+pmap_qremove(vm_offset_t sva, int count)
+{
+ vm_offset_t va;
+
+ va = sva;
+ while (count-- > 0) {
+ KASSERT(va >= VM_MIN_KERNEL_ADDRESS, ("usermode va %lx", va));
+ pmap_kremove(va);
+ va += PAGE_SIZE;
+ }
+ pmap_invalidate_range(kernel_pmap, sva, va);
+}
+
+/***************************************************
+ * Page table page management routines.....
+ ***************************************************/
+static __inline void
+pmap_free_zero_pages(struct spglist *free)
+{
+ vm_page_t m;
+
+ while ((m = SLIST_FIRST(free)) != NULL) {
+ SLIST_REMOVE_HEAD(free, plinks.s.ss);
+ /* Preserve the page's PG_ZERO setting. */
+ vm_page_free_toq(m);
+ }
+}
+
+/*
+ * Schedule the specified unused page table page to be freed. Specifically,
+ * add the page to the specified list of pages that will be released to the
+ * physical memory manager after the TLB has been updated.
+ */
+static __inline void
+pmap_add_delayed_free_list(vm_page_t m, struct spglist *free,
+ boolean_t set_PG_ZERO)
+{
+
+ if (set_PG_ZERO)
+ m->flags |= PG_ZERO;
+ else
+ m->flags &= ~PG_ZERO;
+ SLIST_INSERT_HEAD(free, m, plinks.s.ss);
+}
+
+/*
+ * Decrements a page table page's wire count, which is used to record the
+ * number of valid page table entries within the page. If the wire count
+ * drops to zero, then the page table page is unmapped. Returns TRUE if the
+ * page table page was unmapped and FALSE otherwise.
+ */
+static inline boolean_t
+pmap_unwire_l3(pmap_t pmap, vm_offset_t va, vm_page_t m, struct spglist *free)
+{
+
+ --m->wire_count;
+ if (m->wire_count == 0) {
+ _pmap_unwire_l3(pmap, va, m, free);
+ return (TRUE);
+ } else
+ return (FALSE);
+}
+
+static void
+_pmap_unwire_l3(pmap_t pmap, vm_offset_t va, vm_page_t m, struct spglist *free)
+{
+
+ PMAP_LOCK_ASSERT(pmap, MA_OWNED);
+ /*
+ * unmap the page table page
+ */
+ if (m->pindex >= NUPDE) {
+ /* PD page */
+ pd_entry_t *l1;
+ l1 = pmap_l1(pmap, va);
+ pmap_load_clear(l1);
+ PTE_SYNC(l1);
+ } else {
+ /* PTE page */
+ pd_entry_t *l2;
+ l2 = pmap_l2(pmap, va);
+ pmap_load_clear(l2);
+ PTE_SYNC(l2);
+ }
+ pmap_resident_count_dec(pmap, 1);
+ if (m->pindex < NUPDE) {
+ /* We just released a PT, unhold the matching PD */
+ vm_page_t pdpg;
+
+ pdpg = PHYS_TO_VM_PAGE(*pmap_l1(pmap, va) & ~ATTR_MASK);
+ pmap_unwire_l3(pmap, va, pdpg, free);
+ }
+
+ /*
+ * This is a release store so that the ordinary store unmapping
+ * the page table page is globally performed before TLB shoot-
+ * down is begun.
+ */
+ atomic_subtract_rel_int(&vm_cnt.v_wire_count, 1);
+
+ /*
+ * Put page on a list so that it is released after
+ * *ALL* TLB shootdown is done
+ */
+ pmap_add_delayed_free_list(m, free, TRUE);
+}
+
+/*
+ * After removing an l3 entry, this routine is used to
+ * conditionally free the page, and manage the hold/wire counts.
+ */
+static int
+pmap_unuse_l3(pmap_t pmap, vm_offset_t va, pd_entry_t ptepde,
+ struct spglist *free)
+{
+ vm_page_t mpte;
+
+ if (va >= VM_MAXUSER_ADDRESS)
+ return (0);
+ KASSERT(ptepde != 0, ("pmap_unuse_pt: ptepde != 0"));
+ mpte = PHYS_TO_VM_PAGE(ptepde & ~ATTR_MASK);
+ return (pmap_unwire_l3(pmap, va, mpte, free));
+}
+
+void
+pmap_pinit0(pmap_t pmap)
+{
+
+ PMAP_LOCK_INIT(pmap);
+ bzero(&pmap->pm_stats, sizeof(pmap->pm_stats));
+ pmap->pm_l1 = kernel_pmap->pm_l1;
+}
+
+int
+pmap_pinit(pmap_t pmap)
+{
+ vm_paddr_t l1phys;
+ vm_page_t l1pt;
+
+ /*
+ * allocate the l1 page
+ */
+ while ((l1pt = vm_page_alloc(NULL, 0xdeadbeef, VM_ALLOC_NORMAL |
+ VM_ALLOC_NOOBJ | VM_ALLOC_WIRED | VM_ALLOC_ZERO)) == NULL)
+ VM_WAIT;
+
+ l1phys = VM_PAGE_TO_PHYS(l1pt);
+ pmap->pm_l1 = (pd_entry_t *)PHYS_TO_DMAP(l1phys);
+
+ if ((l1pt->flags & PG_ZERO) == 0)
+ pagezero(pmap->pm_l1);
+
+ bzero(&pmap->pm_stats, sizeof(pmap->pm_stats));
+
+ return (1);
+}
+
+/*
+ * This routine is called if the desired page table page does not exist.
+ *
+ * If page table page allocation fails, this routine may sleep before
+ * returning NULL. It sleeps only if a lock pointer was given.
+ *
+ * Note: If a page allocation fails at page table level two or three,
+ * one or two pages may be held during the wait, only to be released
+ * afterwards. This conservative approach is easily argued to avoid
+ * race conditions.
+ */
+static vm_page_t
+_pmap_alloc_l3(pmap_t pmap, vm_pindex_t ptepindex, struct rwlock **lockp)
+{
+ vm_page_t m, /*pdppg, */pdpg;
+
+ PMAP_LOCK_ASSERT(pmap, MA_OWNED);
+
+ /*
+ * Allocate a page table page.
+ */
+ if ((m = vm_page_alloc(NULL, ptepindex, VM_ALLOC_NOOBJ |
+ VM_ALLOC_WIRED | VM_ALLOC_ZERO)) == NULL) {
+ if (lockp != NULL) {
+ RELEASE_PV_LIST_LOCK(lockp);
+ PMAP_UNLOCK(pmap);
+ rw_runlock(&pvh_global_lock);
+ VM_WAIT;
+ rw_rlock(&pvh_global_lock);
+ PMAP_LOCK(pmap);
+ }
+
+ /*
+ * Indicate the need to retry. While waiting, the page table
+ * page may have been allocated.
+ */
+ return (NULL);
+ }
+ if ((m->flags & PG_ZERO) == 0)
+ pmap_zero_page(m);
+
+ /*
+ * Map the pagetable page into the process address space, if
+ * it isn't already there.
+ */
+
+ if (ptepindex >= NUPDE) {
+ pd_entry_t *l1;
+ vm_pindex_t l1index;
+
+ l1index = ptepindex - NUPDE;
+ l1 = &pmap->pm_l1[l1index];
+ pmap_load_store(l1, VM_PAGE_TO_PHYS(m) | L1_TABLE);
+ PTE_SYNC(l1);
+
+ } else {
+ vm_pindex_t l1index;
+ pd_entry_t *l1, *l2;
+
+ l1index = ptepindex >> (L1_SHIFT - L2_SHIFT);
+ l1 = &pmap->pm_l1[l1index];
+ if (*l1 == 0) {
+ /* recurse for allocating page dir */
+ if (_pmap_alloc_l3(pmap, NUPDE + l1index,
+ lockp) == NULL) {
+ --m->wire_count;
+ atomic_subtract_int(&vm_cnt.v_wire_count, 1);
+ vm_page_free_zero(m);
+ return (NULL);
+ }
+ } else {
+ pdpg = PHYS_TO_VM_PAGE(*l1 & ~ATTR_MASK);
+ pdpg->wire_count++;
+ }
+
+ l2 = (pd_entry_t *)PHYS_TO_DMAP(*l1 & ~ATTR_MASK);
+ l2 = &l2[ptepindex & Ln_ADDR_MASK];
+ pmap_load_store(l2, VM_PAGE_TO_PHYS(m) | ATTR_AF |
+ ATTR_IDX(CACHED_MEMORY) | L2_TABLE);
+ PTE_SYNC(l2);
+ }
+
+ pmap_resident_count_inc(pmap, 1);
+
+ return (m);
+}
+
+static vm_page_t
+pmap_alloc_l3(pmap_t pmap, vm_offset_t va, struct rwlock **lockp)
+{
+ vm_pindex_t ptepindex;
+ pd_entry_t *l2;
+ vm_page_t m;
+
+ /*
+ * Calculate pagetable page index
+ */
+ ptepindex = pmap_l2_pindex(va);
+retry:
+ /*
+ * Get the page directory entry
+ */
+ l2 = pmap_l2(pmap, va);
+
+ /*
+ * If the page table page is mapped, we just increment the
+ * hold count, and activate it.
+ */
+ if (l2 != NULL && *l2 != 0) {
+ m = PHYS_TO_VM_PAGE(*l2 & ~ATTR_MASK);
+ m->wire_count++;
+ } else {
+ /*
+ * Here if the pte page isn't mapped, or if it has been
+ * deallocated.
+ */
+ m = _pmap_alloc_l3(pmap, ptepindex, lockp);
+ if (m == NULL && lockp != NULL)
+ goto retry;
+ }
+ /*
+ * XXXARM64: I'm not sure why we need this but it fixes a crash
+ * when running things from a shell script.
+ */
+ pmap_invalidate_all(pmap);
+ return (m);
+}
+
+
+/***************************************************
+ * Pmap allocation/deallocation routines.
+ ***************************************************/
+
+/*
+ * Release any resources held by the given physical map.
+ * Called when a pmap initialized by pmap_pinit is being released.
+ * Should only be called if the map contains no valid mappings.
+ */
+void
+pmap_release(pmap_t pmap)
+{
+ vm_page_t m;
+
+ KASSERT(pmap->pm_stats.resident_count == 0,
+ ("pmap_release: pmap resident count %ld != 0",
+ pmap->pm_stats.resident_count));
+
+ m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pmap->pm_l1));
+
+ m->wire_count--;
+ atomic_subtract_int(&vm_cnt.v_wire_count, 1);
+ vm_page_free_zero(m);
+}
+
+#if 0
+static int
+kvm_size(SYSCTL_HANDLER_ARGS)
+{
+ unsigned long ksize = VM_MAX_KERNEL_ADDRESS - VM_MIN_KERNEL_ADDRESS;
+
+ return sysctl_handle_long(oidp, &ksize, 0, req);
+}
+SYSCTL_PROC(_vm, OID_AUTO, kvm_size, CTLTYPE_LONG|CTLFLAG_RD,
+ 0, 0, kvm_size, "LU", "Size of KVM");
+
+static int
+kvm_free(SYSCTL_HANDLER_ARGS)
+{
+ unsigned long kfree = VM_MAX_KERNEL_ADDRESS - kernel_vm_end;
+
+ return sysctl_handle_long(oidp, &kfree, 0, req);
+}
+SYSCTL_PROC(_vm, OID_AUTO, kvm_free, CTLTYPE_LONG|CTLFLAG_RD,
+ 0, 0, kvm_free, "LU", "Amount of KVM free");
+#endif /* 0 */
+
+/*
+ * grow the number of kernel page table entries, if needed
+ */
+void
+pmap_growkernel(vm_offset_t addr)
+{
+ vm_paddr_t paddr;
+ vm_page_t nkpg;
+ pd_entry_t *l1, *l2;
+
+ mtx_assert(&kernel_map->system_mtx, MA_OWNED);
+
+ addr = roundup2(addr, L2_SIZE);
+ if (addr - 1 >= kernel_map->max_offset)
+ addr = kernel_map->max_offset;
+ while (kernel_vm_end < addr) {
+ l1 = pmap_l1(kernel_pmap, kernel_vm_end);
+ if (*l1 == 0) {
+ /* We need a new PDP entry */
+ nkpg = vm_page_alloc(NULL, kernel_vm_end >> L1_SHIFT,
+ VM_ALLOC_INTERRUPT | VM_ALLOC_NOOBJ |
+ VM_ALLOC_WIRED | VM_ALLOC_ZERO);
+ if (nkpg == NULL)
+ panic("pmap_growkernel: no memory to grow kernel");
+ if ((nkpg->flags & PG_ZERO) == 0)
+ pmap_zero_page(nkpg);
+ paddr = VM_PAGE_TO_PHYS(nkpg);
+ pmap_load_store(l1, paddr | L1_TABLE);
+ PTE_SYNC(l1);
+ continue; /* try again */
+ }
+ l2 = pmap_l1_to_l2(l1, kernel_vm_end);
+ if ((*l2 & ATTR_AF) != 0) {
+ kernel_vm_end = (kernel_vm_end + L2_SIZE) & ~L2_OFFSET;
+ if (kernel_vm_end - 1 >= kernel_map->max_offset) {
+ kernel_vm_end = kernel_map->max_offset;
+ break;
+ }
+ continue;
+ }
+
+ nkpg = vm_page_alloc(NULL, kernel_vm_end >> L2_SHIFT,
+ VM_ALLOC_INTERRUPT | VM_ALLOC_NOOBJ | VM_ALLOC_WIRED |
+ VM_ALLOC_ZERO);
+ if (nkpg == NULL)
+ panic("pmap_growkernel: no memory to grow kernel");
+ if ((nkpg->flags & PG_ZERO) == 0)
+ pmap_zero_page(nkpg);
+ paddr = VM_PAGE_TO_PHYS(nkpg);
+ pmap_load_store(l2, paddr | L2_TABLE);
+ PTE_SYNC(l2);
+
+ kernel_vm_end = (kernel_vm_end + L2_SIZE) & ~L2_OFFSET;
+ if (kernel_vm_end - 1 >= kernel_map->max_offset) {
+ kernel_vm_end = kernel_map->max_offset;
+ break;
+ }
+ }
+}
+
+
+/***************************************************
+ * page management routines.
+ ***************************************************/
+
+CTASSERT(sizeof(struct pv_chunk) == PAGE_SIZE);
+CTASSERT(_NPCM == 3);
+CTASSERT(_NPCPV == 168);
+
+static __inline struct pv_chunk *
+pv_to_chunk(pv_entry_t pv)
+{
+
+ return ((struct pv_chunk *)((uintptr_t)pv & ~(uintptr_t)PAGE_MASK));
+}
+
+#define PV_PMAP(pv) (pv_to_chunk(pv)->pc_pmap)
+
+#define PC_FREE0 0xfffffffffffffffful
+#define PC_FREE1 0xfffffffffffffffful
+#define PC_FREE2 0x000000fffffffffful
+
+static const uint64_t pc_freemask[_NPCM] = { PC_FREE0, PC_FREE1, PC_FREE2 };
+
+#if 0
+#ifdef PV_STATS
+static int pc_chunk_count, pc_chunk_allocs, pc_chunk_frees, pc_chunk_tryfail;
+
+SYSCTL_INT(_vm_pmap, OID_AUTO, pc_chunk_count, CTLFLAG_RD, &pc_chunk_count, 0,
+ "Current number of pv entry chunks");
+SYSCTL_INT(_vm_pmap, OID_AUTO, pc_chunk_allocs, CTLFLAG_RD, &pc_chunk_allocs, 0,
+ "Current number of pv entry chunks allocated");
+SYSCTL_INT(_vm_pmap, OID_AUTO, pc_chunk_frees, CTLFLAG_RD, &pc_chunk_frees, 0,
+ "Current number of pv entry chunks frees");
+SYSCTL_INT(_vm_pmap, OID_AUTO, pc_chunk_tryfail, CTLFLAG_RD, &pc_chunk_tryfail, 0,
+ "Number of times tried to get a chunk page but failed.");
+
+static long pv_entry_frees, pv_entry_allocs, pv_entry_count;
+static int pv_entry_spare;
+
+SYSCTL_LONG(_vm_pmap, OID_AUTO, pv_entry_frees, CTLFLAG_RD, &pv_entry_frees, 0,
+ "Current number of pv entry frees");
+SYSCTL_LONG(_vm_pmap, OID_AUTO, pv_entry_allocs, CTLFLAG_RD, &pv_entry_allocs, 0,
+ "Current number of pv entry allocs");
+SYSCTL_LONG(_vm_pmap, OID_AUTO, pv_entry_count, CTLFLAG_RD, &pv_entry_count, 0,
+ "Current number of pv entries");
+SYSCTL_INT(_vm_pmap, OID_AUTO, pv_entry_spare, CTLFLAG_RD, &pv_entry_spare, 0,
+ "Current number of spare pv entries");
+#endif
+#endif /* 0 */
+
+/*
+ * We are in a serious low memory condition. Resort to
+ * drastic measures to free some pages so we can allocate
+ * another pv entry chunk.
+ *
+ * Returns NULL if PV entries were reclaimed from the specified pmap.
+ *
+ * We do not, however, unmap 2mpages because subsequent accesses will
+ * allocate per-page pv entries until repromotion occurs, thereby
+ * exacerbating the shortage of free pv entries.
+ */
+static vm_page_t
+reclaim_pv_chunk(pmap_t locked_pmap, struct rwlock **lockp)
+{
+
+ panic("reclaim_pv_chunk");
+}
+
+/*
+ * free the pv_entry back to the free list
+ */
+static void
+free_pv_entry(pmap_t pmap, pv_entry_t pv)
+{
+ struct pv_chunk *pc;
+ int idx, field, bit;
+
+ rw_assert(&pvh_global_lock, RA_LOCKED);
+ PMAP_LOCK_ASSERT(pmap, MA_OWNED);
+ PV_STAT(atomic_add_long(&pv_entry_frees, 1));
+ PV_STAT(atomic_add_int(&pv_entry_spare, 1));
+ PV_STAT(atomic_subtract_long(&pv_entry_count, 1));
+ pc = pv_to_chunk(pv);
+ idx = pv - &pc->pc_pventry[0];
+ field = idx / 64;
+ bit = idx % 64;
+ pc->pc_map[field] |= 1ul << bit;
+ if (pc->pc_map[0] != PC_FREE0 || pc->pc_map[1] != PC_FREE1 ||
+ pc->pc_map[2] != PC_FREE2) {
+ /* 98% of the time, pc is already at the head of the list. */
+ if (__predict_false(pc != TAILQ_FIRST(&pmap->pm_pvchunk))) {
+ TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
+ TAILQ_INSERT_HEAD(&pmap->pm_pvchunk, pc, pc_list);
+ }
+ return;
+ }
+ TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
+ free_pv_chunk(pc);
+}
+
+static void
+free_pv_chunk(struct pv_chunk *pc)
+{
+ vm_page_t m;
+
+ mtx_lock(&pv_chunks_mutex);
+ TAILQ_REMOVE(&pv_chunks, pc, pc_lru);
+ mtx_unlock(&pv_chunks_mutex);
+ PV_STAT(atomic_subtract_int(&pv_entry_spare, _NPCPV));
+ PV_STAT(atomic_subtract_int(&pc_chunk_count, 1));
+ PV_STAT(atomic_add_int(&pc_chunk_frees, 1));
+ /* entire chunk is free, return it */
+ m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pc));
+#if 0 /* TODO: For minidump */
+ dump_drop_page(m->phys_addr);
+#endif
+ vm_page_unwire(m, PQ_INACTIVE);
+ vm_page_free(m);
+}
+
+/*
+ * Returns a new PV entry, allocating a new PV chunk from the system when
+ * needed. If this PV chunk allocation fails and a PV list lock pointer was
+ * given, a PV chunk is reclaimed from an arbitrary pmap. Otherwise, NULL is
+ * returned.
+ *
+ * The given PV list lock may be released.
+ */
+static pv_entry_t
+get_pv_entry(pmap_t pmap, struct rwlock **lockp)
+{
+ int bit, field;
+ pv_entry_t pv;
+ struct pv_chunk *pc;
+ vm_page_t m;
+
+ rw_assert(&pvh_global_lock, RA_LOCKED);
+ PMAP_LOCK_ASSERT(pmap, MA_OWNED);
+ PV_STAT(atomic_add_long(&pv_entry_allocs, 1));
+retry:
+ pc = TAILQ_FIRST(&pmap->pm_pvchunk);
+ if (pc != NULL) {
+ for (field = 0; field < _NPCM; field++) {
+ if (pc->pc_map[field]) {
+ bit = ffsl(pc->pc_map[field]) - 1;
+ break;
+ }
+ }
+ if (field < _NPCM) {
+ pv = &pc->pc_pventry[field * 64 + bit];
+ pc->pc_map[field] &= ~(1ul << bit);
+ /* If this was the last item, move it to tail */
+ if (pc->pc_map[0] == 0 && pc->pc_map[1] == 0 &&
+ pc->pc_map[2] == 0) {
+ TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
+ TAILQ_INSERT_TAIL(&pmap->pm_pvchunk, pc,
+ pc_list);
+ }
+ PV_STAT(atomic_add_long(&pv_entry_count, 1));
+ PV_STAT(atomic_subtract_int(&pv_entry_spare, 1));
+ return (pv);
+ }
+ }
+ /* No free items, allocate another chunk */
+ m = vm_page_alloc(NULL, 0, VM_ALLOC_NORMAL | VM_ALLOC_NOOBJ |
+ VM_ALLOC_WIRED);
+ if (m == NULL) {
+ if (lockp == NULL) {
+ PV_STAT(pc_chunk_tryfail++);
+ return (NULL);
+ }
+ m = reclaim_pv_chunk(pmap, lockp);
+ if (m == NULL)
+ goto retry;
+ }
+ PV_STAT(atomic_add_int(&pc_chunk_count, 1));
+ PV_STAT(atomic_add_int(&pc_chunk_allocs, 1));
+#if 0 /* TODO: This is for minidump */
+ dump_add_page(m->phys_addr);
+#endif
+ pc = (void *)PHYS_TO_DMAP(m->phys_addr);
+ pc->pc_pmap = pmap;
+ pc->pc_map[0] = PC_FREE0 & ~1ul; /* preallocated bit 0 */
+ pc->pc_map[1] = PC_FREE1;
+ pc->pc_map[2] = PC_FREE2;
+ mtx_lock(&pv_chunks_mutex);
+ TAILQ_INSERT_TAIL(&pv_chunks, pc, pc_lru);
+ mtx_unlock(&pv_chunks_mutex);
+ pv = &pc->pc_pventry[0];
+ TAILQ_INSERT_HEAD(&pmap->pm_pvchunk, pc, pc_list);
+ PV_STAT(atomic_add_long(&pv_entry_count, 1));
+ PV_STAT(atomic_add_int(&pv_entry_spare, _NPCPV - 1));
+ return (pv);
+}
+
+/*
+ * First find and then remove the pv entry for the specified pmap and virtual
+ * address from the specified pv list. Returns the pv entry if found and NULL
+ * otherwise. This operation can be performed on pv lists for either 4KB or
+ * 2MB page mappings.
+ */
+static __inline pv_entry_t
+pmap_pvh_remove(struct md_page *pvh, pmap_t pmap, vm_offset_t va)
+{
+ pv_entry_t pv;
+
+ rw_assert(&pvh_global_lock, RA_LOCKED);
+ TAILQ_FOREACH(pv, &pvh->pv_list, pv_next) {
+ if (pmap == PV_PMAP(pv) && va == pv->pv_va) {
+ TAILQ_REMOVE(&pvh->pv_list, pv, pv_next);
+ pvh->pv_gen++;
+ break;
+ }
+ }
+ return (pv);
+}
+
+/*
+ * First find and then destroy the pv entry for the specified pmap and virtual
+ * address. This operation can be performed on pv lists for either 4KB or 2MB
+ * page mappings.
+ */
+static void
+pmap_pvh_free(struct md_page *pvh, pmap_t pmap, vm_offset_t va)
+{
+ pv_entry_t pv;
+
+ pv = pmap_pvh_remove(pvh, pmap, va);
+ KASSERT(pv != NULL, ("pmap_pvh_free: pv not found"));
+ free_pv_entry(pmap, pv);
+}
+
+/*
+ * Conditionally create the PV entry for a 4KB page mapping if the required
+ * memory can be allocated without resorting to reclamation.
+ */
+static boolean_t
+pmap_try_insert_pv_entry(pmap_t pmap, vm_offset_t va, vm_page_t m,
+ struct rwlock **lockp)
+{
+ pv_entry_t pv;
+
+ rw_assert(&pvh_global_lock, RA_LOCKED);
+ PMAP_LOCK_ASSERT(pmap, MA_OWNED);
+ /* Pass NULL instead of the lock pointer to disable reclamation. */
+ if ((pv = get_pv_entry(pmap, NULL)) != NULL) {
+ pv->pv_va = va;
+ CHANGE_PV_LIST_LOCK_TO_VM_PAGE(lockp, m);
+ TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_next);
+ m->md.pv_gen++;
+ return (TRUE);
+ } else
+ return (FALSE);
+}
+
+/*
+ * pmap_remove_l3: do the things to unmap a page in a process
+ */
+static int
+pmap_remove_l3(pmap_t pmap, pt_entry_t *l3, vm_offset_t va,
+ pd_entry_t l2e, struct spglist *free, struct rwlock **lockp)
+{
+ pt_entry_t old_l3;
+ vm_page_t m;
+
+ PMAP_LOCK_ASSERT(pmap, MA_OWNED);
+ if (pmap_is_current(pmap) && pmap_l3_valid_cacheable(pmap_load(l3)))
+ cpu_dcache_wb_range(va, L3_SIZE);
+ old_l3 = pmap_load_clear(l3);
+ PTE_SYNC(l3);
+ if (old_l3 & ATTR_SW_WIRED)
+ pmap->pm_stats.wired_count -= 1;
+ pmap_resident_count_dec(pmap, 1);
+ if (old_l3 & ATTR_SW_MANAGED) {
+ m = PHYS_TO_VM_PAGE(old_l3 & ~ATTR_MASK);
+ if (pmap_page_dirty(old_l3))
+ vm_page_dirty(m);
+ if (old_l3 & ATTR_AF)
+ vm_page_aflag_set(m, PGA_REFERENCED);
+ CHANGE_PV_LIST_LOCK_TO_VM_PAGE(lockp, m);
+ pmap_pvh_free(&m->md, pmap, va);
+ }
+ return (pmap_unuse_l3(pmap, va, l2e, free));
+}
+
+/*
+ * Remove the given range of addresses from the specified map.
+ *
+ * It is assumed that the start and end are properly
+ * rounded to the page size.
+ */
+void
+pmap_remove(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
+{
+ struct rwlock *lock;
+ vm_offset_t va, va_next;
+ pd_entry_t *l1, *l2;
+ pt_entry_t l3_paddr, *l3;
+ struct spglist free;
+ int anyvalid;
+
+ /*
+ * Perform an unsynchronized read. This is, however, safe.
+ */
+ if (pmap->pm_stats.resident_count == 0)
+ return;
+
+ anyvalid = 0;
+ SLIST_INIT(&free);
+
+ rw_rlock(&pvh_global_lock);
+ PMAP_LOCK(pmap);
+
+ lock = NULL;
+ for (; sva < eva; sva = va_next) {
+
+ if (pmap->pm_stats.resident_count == 0)
+ break;
+
+ l1 = pmap_l1(pmap, sva);
+ if (*l1 == 0) {
+ va_next = (sva + L1_SIZE) & ~L1_OFFSET;
+ if (va_next < sva)
+ va_next = eva;
+ continue;
+ }
+
+ /*
+ * Calculate index for next page table.
+ */
+ va_next = (sva + L2_SIZE) & ~L2_OFFSET;
+ if (va_next < sva)
+ va_next = eva;
+
+ l2 = pmap_l1_to_l2(l1, sva);
+ if (l2 == NULL)
+ continue;
+
+ l3_paddr = *l2;
+
+ /*
+ * Weed out invalid mappings.
+ */
+ if ((l3_paddr & ATTR_DESCR_MASK) != L2_TABLE)
+ continue;
+
+ /*
+ * Limit our scan to either the end of the va represented
+ * by the current page table page, or to the end of the
+ * range being removed.
+ */
+ if (va_next > eva)
+ va_next = eva;
+
+ va = va_next;
+ for (l3 = pmap_l2_to_l3(l2, sva); sva != va_next; l3++,
+ sva += L3_SIZE) {
+ if (l3 == NULL)
+ panic("l3 == NULL");
+ if (*l3 == 0) {
+ if (va != va_next) {
+ pmap_invalidate_range(pmap, va, sva);
+ va = va_next;
+ }
+ continue;
+ }
+ if (va == va_next)
+ va = sva;
+ if (pmap_remove_l3(pmap, l3, sva, l3_paddr, &free,
+ &lock)) {
+ sva += L3_SIZE;
+ break;
+ }
+ }
+ if (va != va_next)
+ pmap_invalidate_range(pmap, va, sva);
+ }
+ if (lock != NULL)
+ rw_wunlock(lock);
+ if (anyvalid)
+ pmap_invalidate_all(pmap);
+ rw_runlock(&pvh_global_lock);
+ PMAP_UNLOCK(pmap);
+ pmap_free_zero_pages(&free);
+}
+
+/*
+ * Routine: pmap_remove_all
+ * Function:
+ * Removes this physical page from
+ * all physical maps in which it resides.
+ * Reflects back modify bits to the pager.
+ *
+ * Notes:
+ * Original versions of this routine were very
+ * inefficient because they iteratively called
+ * pmap_remove (slow...)
+ */
+
+void
+pmap_remove_all(vm_page_t m)
+{
+ pv_entry_t pv;
+ pmap_t pmap;
+ pt_entry_t *l3, tl3;
+ pd_entry_t *l2;
+ struct spglist free;
+
+ KASSERT((m->oflags & VPO_UNMANAGED) == 0,
+ ("pmap_remove_all: page %p is not managed", m));
+ SLIST_INIT(&free);
+ rw_wlock(&pvh_global_lock);
+ while ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) {
+ pmap = PV_PMAP(pv);
+ PMAP_LOCK(pmap);
+ pmap_resident_count_dec(pmap, 1);
+ l2 = pmap_l2(pmap, pv->pv_va);
+ KASSERT((*l2 & ATTR_DESCR_MASK) == L2_TABLE,
+ ("pmap_remove_all: found a table when expecting "
+ "a block in %p's pv list", m));
+ l3 = pmap_l2_to_l3(l2, pv->pv_va);
+ if (pmap_is_current(pmap) &&
+ pmap_l3_valid_cacheable(pmap_load(l3)))
+ cpu_dcache_wb_range(pv->pv_va, L3_SIZE);
+ tl3 = pmap_load_clear(l3);
+ PTE_SYNC(l3);
+ if (tl3 & ATTR_SW_WIRED)
+ pmap->pm_stats.wired_count--;
+ if ((tl3 & ATTR_AF) != 0)
+ vm_page_aflag_set(m, PGA_REFERENCED);
+
+ /*
+ * Update the vm_page_t clean and reference bits.
+ */
+ if (pmap_page_dirty(tl3))
+ vm_page_dirty(m);
+ pmap_unuse_l3(pmap, pv->pv_va, *l2, &free);
+ pmap_invalidate_page(pmap, pv->pv_va);
+ TAILQ_REMOVE(&m->md.pv_list, pv, pv_next);
+ m->md.pv_gen++;
+ free_pv_entry(pmap, pv);
+ PMAP_UNLOCK(pmap);
+ }
+ vm_page_aflag_clear(m, PGA_WRITEABLE);
+ rw_wunlock(&pvh_global_lock);
+ pmap_free_zero_pages(&free);
+}
+
+/*
+ * Set the physical protection on the
+ * specified range of this map as requested.
+ */
+void
+pmap_protect(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot)
+{
+ vm_offset_t va, va_next;
+ pd_entry_t *l1, *l2;
+ pt_entry_t *l3p, l3;
+
+ if ((prot & VM_PROT_READ) == VM_PROT_NONE) {
+ pmap_remove(pmap, sva, eva);
+ return;
+ }
+
+ if ((prot & VM_PROT_WRITE) == VM_PROT_WRITE)
+ return;
+
+ PMAP_LOCK(pmap);
+ for (; sva < eva; sva = va_next) {
+
+ l1 = pmap_l1(pmap, sva);
+ if (*l1 == 0) {
+ va_next = (sva + L1_SIZE) & ~L1_OFFSET;
+ if (va_next < sva)
+ va_next = eva;
+ continue;
+ }
+
+ va_next = (sva + L2_SIZE) & ~L2_OFFSET;
+ if (va_next < sva)
+ va_next = eva;
+
+ l2 = pmap_l1_to_l2(l1, sva);
+ if (l2 == NULL || (*l2 & ATTR_DESCR_MASK) != L2_TABLE)
+ continue;
+
+ if (va_next > eva)
+ va_next = eva;
+
+ va = va_next;
+ for (l3p = pmap_l2_to_l3(l2, sva); sva != va_next; l3p++,
+ sva += L3_SIZE) {
+ l3 = pmap_load(l3p);
+ if (pmap_l3_valid(l3)) {
+ pmap_set(l3p, ATTR_AP(ATTR_AP_RO));
+ PTE_SYNC(l3p);
+ }
+ }
+ }
+ PMAP_UNLOCK(pmap);
+
+ /* TODO: Only invalidate entries we are touching */
+ pmap_invalidate_all(pmap);
+}
+
+/*
+ * Insert the given physical page (p) at
+ * the specified virtual address (v) in the
+ * target physical map with the protection requested.
+ *
+ * If specified, the page will be wired down, meaning
+ * that the related pte can not be reclaimed.
+ *
+ * NB: This is the only routine which MAY NOT lazy-evaluate
+ * or lose information. That is, this routine must actually
+ * insert this page into the given map NOW.
+ */
+int
+pmap_enter(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot,
+ u_int flags, int8_t psind __unused)
+{
+ struct rwlock *lock;
+ pd_entry_t *l1, *l2;
+ pt_entry_t new_l3, orig_l3;
+ pt_entry_t *l3;
+ pv_entry_t pv;
+ vm_paddr_t opa, pa, l2_pa, l3_pa;
+ vm_page_t mpte, om, l2_m, l3_m;
+ boolean_t nosleep;
+
+ va = trunc_page(va);
+ if ((m->oflags & VPO_UNMANAGED) == 0 && !vm_page_xbusied(m))
+ VM_OBJECT_ASSERT_LOCKED(m->object);
+ pa = VM_PAGE_TO_PHYS(m);
+ new_l3 = (pt_entry_t)(pa | ATTR_AF | L3_PAGE);
+ if ((prot & VM_PROT_WRITE) == 0)
+ new_l3 |= ATTR_AP(ATTR_AP_RO);
+ if ((flags & PMAP_ENTER_WIRED) != 0)
+ new_l3 |= ATTR_SW_WIRED;
+ if ((va >> 63) == 0)
+ new_l3 |= ATTR_AP(ATTR_AP_USER);
+ new_l3 |= ATTR_IDX(m->md.pv_memattr);
+
+ mpte = NULL;
+
+ lock = NULL;
+ rw_rlock(&pvh_global_lock);
+ PMAP_LOCK(pmap);
+
+ if (va < VM_MAXUSER_ADDRESS) {
+ nosleep = (flags & PMAP_ENTER_NOSLEEP) != 0;
+ mpte = pmap_alloc_l3(pmap, va, nosleep ? NULL : &lock);
+ if (mpte == NULL && nosleep) {
+ if (lock != NULL)
+ rw_wunlock(lock);
+ rw_runlock(&pvh_global_lock);
+ PMAP_UNLOCK(pmap);
+ return (KERN_RESOURCE_SHORTAGE);
+ }
+ l3 = pmap_l3(pmap, va);
+ } else {
+ l3 = pmap_l3(pmap, va);
+ /* TODO: This is not optimal, but should mostly work */
+ if (l3 == NULL) {
+ l2 = pmap_l2(pmap, va);
+
+ if (l2 == NULL) {
+ l2_m = vm_page_alloc(NULL, 0, VM_ALLOC_NORMAL |
+ VM_ALLOC_NOOBJ | VM_ALLOC_WIRED |
+ VM_ALLOC_ZERO);
+ if (l2_m == NULL)
+ panic("pmap_enter: l2 pte_m == NULL");
+ if ((l2_m->flags & PG_ZERO) == 0)
+ pmap_zero_page(l2_m);
+
+ l2_pa = VM_PAGE_TO_PHYS(l2_m);
+ l1 = pmap_l1(pmap, va);
+ pmap_load_store(l1, l2_pa | L1_TABLE);
+ PTE_SYNC(l1);
+ l2 = pmap_l1_to_l2(l1, va);
+ }
+
+ KASSERT(l2 != NULL,
+ ("No l2 table after allocating one"));
+
+ l3_m = vm_page_alloc(NULL, 0, VM_ALLOC_NORMAL |
+ VM_ALLOC_NOOBJ | VM_ALLOC_WIRED | VM_ALLOC_ZERO);
+ if (l3_m == NULL)
+ panic("pmap_enter: l3 pte_m == NULL");
+ if ((l3_m->flags & PG_ZERO) == 0)
+ pmap_zero_page(l3_m);
+
+ l3_pa = VM_PAGE_TO_PHYS(l3_m);
+ pmap_load_store(l2, l3_pa | L2_TABLE);
+ PTE_SYNC(l2);
+ l3 = pmap_l2_to_l3(l2, va);
+ }
+ }
+
+ om = NULL;
+ orig_l3 = pmap_load(l3);
+ opa = orig_l3 & ~ATTR_MASK;
+
+ /*
+ * Is the specified virtual address already mapped?
+ */
+ if (pmap_l3_valid(orig_l3)) {
+ /*
+ * Wiring change, just update stats. We don't worry about
+ * wiring PT pages as they remain resident as long as there
+ * are valid mappings in them. Hence, if a user page is wired,
+ * the PT page will be also.
+ */
+ if ((flags & PMAP_ENTER_WIRED) != 0 &&
+ (orig_l3 & ATTR_SW_WIRED) == 0)
+ pmap->pm_stats.wired_count++;
+ else if ((flags & PMAP_ENTER_WIRED) == 0 &&
+ (orig_l3 & ATTR_SW_WIRED) != 0)
+ pmap->pm_stats.wired_count--;
+
+ /*
+ * Remove the extra PT page reference.
+ */
+ if (mpte != NULL) {
+ mpte->wire_count--;
+ KASSERT(mpte->wire_count > 0,
+ ("pmap_enter: missing reference to page table page,"
+ " va: 0x%lx", va));
+ }
+
+ /*
+ * Has the physical page changed?
+ */
+ if (opa == pa) {
+ /*
+ * No, might be a protection or wiring change.
+ */
+ if ((orig_l3 & ATTR_SW_MANAGED) != 0) {
+ new_l3 |= ATTR_SW_MANAGED;
+ if ((new_l3 & ATTR_AP(ATTR_AP_RW)) ==
+ ATTR_AP(ATTR_AP_RW)) {
+ vm_page_aflag_set(m, PGA_WRITEABLE);
+ }
+ }
+ goto validate;
+ }
+
+ /* Flush the cache, there might be uncommitted data in it */
+ if (pmap_is_current(pmap) && pmap_l3_valid_cacheable(orig_l3))
+ cpu_dcache_wb_range(va, L3_SIZE);
+ } else {
+ /*
+ * Increment the counters.
+ */
+ if ((new_l3 & ATTR_SW_WIRED) != 0)
+ pmap->pm_stats.wired_count++;
+ pmap_resident_count_inc(pmap, 1);
+ }
+ /*
+ * Enter on the PV list if part of our managed memory.
+ */
+ if ((m->oflags & VPO_UNMANAGED) == 0) {
+ new_l3 |= ATTR_SW_MANAGED;
+ pv = get_pv_entry(pmap, &lock);
+ pv->pv_va = va;
+ CHANGE_PV_LIST_LOCK_TO_PHYS(&lock, pa);
+ TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_next);
+ m->md.pv_gen++;
+ if ((new_l3 & ATTR_AP_RW_BIT) == ATTR_AP(ATTR_AP_RW))
+ vm_page_aflag_set(m, PGA_WRITEABLE);
+ }
+
+ /*
+ * Update the L3 entry.
+ */
+ if (orig_l3 != 0) {
+validate:
+ orig_l3 = pmap_load_store(l3, new_l3);
+ PTE_SYNC(l3);
+ opa = orig_l3 & ~ATTR_MASK;
+
+ if (opa != pa) {
+ if ((orig_l3 & ATTR_SW_MANAGED) != 0) {
+ om = PHYS_TO_VM_PAGE(opa);
+ if (pmap_page_dirty(orig_l3))
+ vm_page_dirty(om);
+ if ((orig_l3 & ATTR_AF) != 0)
+ vm_page_aflag_set(om, PGA_REFERENCED);
+ CHANGE_PV_LIST_LOCK_TO_PHYS(&lock, opa);
+ pmap_pvh_free(&om->md, pmap, va);
+ }
+ } else if (pmap_page_dirty(orig_l3)) {
+ if ((orig_l3 & ATTR_SW_MANAGED) != 0)
+ vm_page_dirty(m);
+ }
+ if ((orig_l3 & ATTR_AF) != 0)
+ pmap_invalidate_page(pmap, va);
+ } else {
+ pmap_load_store(l3, new_l3);
+ PTE_SYNC(l3);
+ }
+ if ((pmap != pmap_kernel()) && (pmap == &curproc->p_vmspace->vm_pmap))
+ cpu_icache_sync_range(va, PAGE_SIZE);
+
+ if (lock != NULL)
+ rw_wunlock(lock);
+ rw_runlock(&pvh_global_lock);
+ PMAP_UNLOCK(pmap);
+ return (KERN_SUCCESS);
+}
+
+/*
+ * Maps a sequence of resident pages belonging to the same object.
+ * The sequence begins with the given page m_start. This page is
+ * mapped at the given virtual address start. Each subsequent page is
+ * mapped at a virtual address that is offset from start by the same
+ * amount as the page is offset from m_start within the object. The
+ * last page in the sequence is the page with the largest offset from
+ * m_start that can be mapped at a virtual address less than the given
+ * virtual address end. Not every virtual page between start and end
+ * is mapped; only those for which a resident page exists with the
+ * corresponding offset from m_start are mapped.
+ */
+void
+pmap_enter_object(pmap_t pmap, vm_offset_t start, vm_offset_t end,
+ vm_page_t m_start, vm_prot_t prot)
+{
+ struct rwlock *lock;
+ vm_offset_t va;
+ vm_page_t m, mpte;
+ vm_pindex_t diff, psize;
+
+ VM_OBJECT_ASSERT_LOCKED(m_start->object);
+
+ psize = atop(end - start);
+ mpte = NULL;
+ m = m_start;
+ lock = NULL;
+ rw_rlock(&pvh_global_lock);
+ PMAP_LOCK(pmap);
+ while (m != NULL && (diff = m->pindex - m_start->pindex) < psize) {
+ va = start + ptoa(diff);
+ mpte = pmap_enter_quick_locked(pmap, va, m, prot, mpte, &lock);
+ m = TAILQ_NEXT(m, listq);
+ }
+ if (lock != NULL)
+ rw_wunlock(lock);
+ rw_runlock(&pvh_global_lock);
+ PMAP_UNLOCK(pmap);
+}
+
+/*
+ * this code makes some *MAJOR* assumptions:
+ * 1. Current pmap & pmap exists.
+ * 2. Not wired.
+ * 3. Read access.
+ * 4. No page table pages.
+ * but is *MUCH* faster than pmap_enter...
+ */
+
+void
+pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot)
+{
+ struct rwlock *lock;
+
+ lock = NULL;
+ rw_rlock(&pvh_global_lock);
+ PMAP_LOCK(pmap);
+ (void)pmap_enter_quick_locked(pmap, va, m, prot, NULL, &lock);
+ if (lock != NULL)
+ rw_wunlock(lock);
+ rw_runlock(&pvh_global_lock);
+ PMAP_UNLOCK(pmap);
+}
+
+static vm_page_t
+pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va, vm_page_t m,
+ vm_prot_t prot, vm_page_t mpte, struct rwlock **lockp)
+{
+ struct spglist free;
+ pd_entry_t *l2;
+ pt_entry_t *l3;
+ vm_paddr_t pa;
+
+ KASSERT(va < kmi.clean_sva || va >= kmi.clean_eva ||
+ (m->oflags & VPO_UNMANAGED) != 0,
+ ("pmap_enter_quick_locked: managed mapping within the clean submap"));
+ rw_assert(&pvh_global_lock, RA_LOCKED);
+ PMAP_LOCK_ASSERT(pmap, MA_OWNED);
+
+ /*
+ * In the case that a page table page is not
+ * resident, we are creating it here.
+ */
+ if (va < VM_MAXUSER_ADDRESS) {
+ vm_pindex_t l2pindex;
+
+ /*
+ * Calculate pagetable page index
+ */
+ l2pindex = pmap_l2_pindex(va);
+ if (mpte && (mpte->pindex == l2pindex)) {
+ mpte->wire_count++;
+ } else {
+ /*
+ * Get the l2 entry
+ */
+ l2 = pmap_l2(pmap, va);
+
+ /*
+ * If the page table page is mapped, we just increment
+ * the hold count, and activate it. Otherwise, we
+ * attempt to allocate a page table page. If this
+ * attempt fails, we don't retry. Instead, we give up.
+ */
+ if (l2 != NULL && *l2 != 0) {
+ mpte = PHYS_TO_VM_PAGE(*l2 & ~ATTR_MASK);
+ mpte->wire_count++;
+ } else {
+ /*
+ * Pass NULL instead of the PV list lock
+ * pointer, because we don't intend to sleep.
+ */
+ mpte = _pmap_alloc_l3(pmap, l2pindex, NULL);
+ if (mpte == NULL)
+ return (mpte);
+ }
+ }
+ l3 = (pt_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(mpte));
+ l3 = &l3[pmap_l3_index(va)];
+ } else {
+ mpte = NULL;
+ l3 = pmap_l3(kernel_pmap, va);
+ }
+ if (l3 == NULL)
+ panic("pmap_enter_quick_locked: No l3");
+ if (*l3) {
+ if (mpte != NULL) {
+ mpte->wire_count--;
+ mpte = NULL;
+ }
+ return (mpte);
+ }
+
+ /*
+ * Enter on the PV list if part of our managed memory.
+ */
+ if ((m->oflags & VPO_UNMANAGED) == 0 &&
+ !pmap_try_insert_pv_entry(pmap, va, m, lockp)) {
+ if (mpte != NULL) {
+ SLIST_INIT(&free);
+ if (pmap_unwire_l3(pmap, va, mpte, &free)) {
+ pmap_invalidate_page(pmap, va);
+ pmap_free_zero_pages(&free);
+ }
+ mpte = NULL;
+ }
+ return (mpte);
+ }
+
+ /*
+ * Increment counters
+ */
+ pmap_resident_count_inc(pmap, 1);
+
+ pa = VM_PAGE_TO_PHYS(m) | ATTR_AF | ATTR_IDX(m->md.pv_memattr) |
+ ATTR_AP(ATTR_AP_RW) | L3_PAGE;
+
+ /*
+ * Now validate mapping with RO protection
+ */
+ if ((m->oflags & VPO_UNMANAGED) == 0)
+ pa |= ATTR_SW_MANAGED;
+ pmap_load_store(l3, pa);
+ PTE_SYNC(l3);
+ pmap_invalidate_page(pmap, va);
+ return (mpte);
+}
+
+/*
+ * This code maps large physical mmap regions into the
+ * processor address space. Note that some shortcuts
+ * are taken, but the code works.
+ */
+void
+pmap_object_init_pt(pmap_t pmap, vm_offset_t addr, vm_object_t object,
+ vm_pindex_t pindex, vm_size_t size)
+{
+
+ VM_OBJECT_ASSERT_WLOCKED(object);
+ KASSERT(object->type == OBJT_DEVICE || object->type == OBJT_SG,
+ ("pmap_object_init_pt: non-device object"));
+}
+
+/*
+ * Clear the wired attribute from the mappings for the specified range of
+ * addresses in the given pmap. Every valid mapping within that range
+ * must have the wired attribute set. In contrast, invalid mappings
+ * cannot have the wired attribute set, so they are ignored.
+ *
+ * The wired attribute of the page table entry is not a hardware feature,
+ * so there is no need to invalidate any TLB entries.
+ */
+void
+pmap_unwire(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
+{
+ vm_offset_t va_next;
+ pd_entry_t *l1, *l2;
+ pt_entry_t *l3;
+ boolean_t pv_lists_locked;
+
+ pv_lists_locked = FALSE;
+ PMAP_LOCK(pmap);
+ for (; sva < eva; sva = va_next) {
+ l1 = pmap_l1(pmap, sva);
+ if (*l1 == 0) {
+ va_next = (sva + L1_SIZE) & ~L1_OFFSET;
+ if (va_next < sva)
+ va_next = eva;
+ continue;
+ }
+
+ va_next = (sva + L2_SIZE) & ~L2_OFFSET;
+ if (va_next < sva)
+ va_next = eva;
+
+ l2 = pmap_l1_to_l2(l1, sva);
+ if (*l2 == 0)
+ continue;
+
+ if (va_next > eva)
+ va_next = eva;
+ for (l3 = pmap_l2_to_l3(l2, sva); sva != va_next; l3++,
+ sva += L3_SIZE) {
+ if (*l3 == 0)
+ continue;
+ if ((*l3 & ATTR_SW_WIRED) == 0)
+ panic("pmap_unwire: l3 %#jx is missing "
+ "ATTR_SW_WIRED", (uintmax_t)*l3);
+
+ /*
+ * PG_W must be cleared atomically. Although the pmap
+ * lock synchronizes access to PG_W, another processor
+ * could be setting PG_M and/or PG_A concurrently.
+ */
+ atomic_clear_long(l3, ATTR_SW_WIRED);
+ pmap->pm_stats.wired_count--;
+ }
+ }
+ if (pv_lists_locked)
+ rw_runlock(&pvh_global_lock);
+ PMAP_UNLOCK(pmap);
+}
+
+/*
+ * Copy the range specified by src_addr/len
+ * from the source map to the range dst_addr/len
+ * in the destination map.
+ *
+ * This routine is only advisory and need not do anything.
+ */
+
+void
+pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vm_offset_t dst_addr, vm_size_t len,
+ vm_offset_t src_addr)
+{
+}
+
+/*
+ * pmap_zero_page zeros the specified hardware page by mapping
+ * the page into KVM and using bzero to clear its contents.
+ */
+void
+pmap_zero_page(vm_page_t m)
+{
+ vm_offset_t va = PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m));
+
+ pagezero((void *)va);
+}
+
+/*
+ * pmap_zero_page_area zeros the specified hardware page by mapping
+ * the page into KVM and using bzero to clear its contents.
+ *
+ * off and size may not cover an area beyond a single hardware page.
+ */
+void
+pmap_zero_page_area(vm_page_t m, int off, int size)
+{
+ vm_offset_t va = PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m));
+
+ if (off == 0 && size == PAGE_SIZE)
+ pagezero((void *)va);
+ else
+ bzero((char *)va + off, size);
+}
+
+/*
+ * pmap_zero_page_idle zeros the specified hardware page by mapping
+ * the page into KVM and using bzero to clear its contents. This
+ * is intended to be called from the vm_pagezero process only and
+ * outside of Giant.
+ */
+void
+pmap_zero_page_idle(vm_page_t m)
+{
+ vm_offset_t va = PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m));
+
+ pagezero((void *)va);
+}
+
+/*
+ * pmap_copy_page copies the specified (machine independent)
+ * page by mapping the page into virtual memory and using
+ * bcopy to copy the page, one machine dependent page at a
+ * time.
+ */
+void
+pmap_copy_page(vm_page_t msrc, vm_page_t mdst)
+{
+ vm_offset_t src = PHYS_TO_DMAP(VM_PAGE_TO_PHYS(msrc));
+ vm_offset_t dst = PHYS_TO_DMAP(VM_PAGE_TO_PHYS(mdst));
+
+ pagecopy((void *)src, (void *)dst);
+}
+
+int unmapped_buf_allowed = 1;
+
+void
+pmap_copy_pages(vm_page_t ma[], vm_offset_t a_offset, vm_page_t mb[],
+ vm_offset_t b_offset, int xfersize)
+{
+ void *a_cp, *b_cp;
+ vm_page_t m_a, m_b;
+ vm_paddr_t p_a, p_b;
+ vm_offset_t a_pg_offset, b_pg_offset;
+ int cnt;
+
+ while (xfersize > 0) {
+ a_pg_offset = a_offset & PAGE_MASK;
+ m_a = ma[a_offset >> PAGE_SHIFT];
+ p_a = m_a->phys_addr;
+ b_pg_offset = b_offset & PAGE_MASK;
+ m_b = mb[b_offset >> PAGE_SHIFT];
+ p_b = m_b->phys_addr;
+ cnt = min(xfersize, PAGE_SIZE - a_pg_offset);
+ cnt = min(cnt, PAGE_SIZE - b_pg_offset);
+ if (__predict_false(!PHYS_IN_DMAP(p_a))) {
+ panic("!DMAP a %lx", p_a);
+ } else {
+ a_cp = (char *)PHYS_TO_DMAP(p_a) + a_pg_offset;
+ }
+ if (__predict_false(!PHYS_IN_DMAP(p_b))) {
+ panic("!DMAP b %lx", p_b);
+ } else {
+ b_cp = (char *)PHYS_TO_DMAP(p_b) + b_pg_offset;
+ }
+ bcopy(a_cp, b_cp, cnt);
+ a_offset += cnt;
+ b_offset += cnt;
+ xfersize -= cnt;
+ }
+}
+
+/*
+ * Returns true if the pmap's pv is one of the first
+ * 16 pvs linked to from this page. This count may
+ * be changed upwards or downwards in the future; it
+ * is only necessary that true be returned for a small
+ * subset of pmaps for proper page aging.
+ */
+boolean_t
+pmap_page_exists_quick(pmap_t pmap, vm_page_t m)
+{
+ struct rwlock *lock;
+ pv_entry_t pv;
+ int loops = 0;
+ boolean_t rv;
+
+ KASSERT((m->oflags & VPO_UNMANAGED) == 0,
+ ("pmap_page_exists_quick: page %p is not managed", m));
+ rv = FALSE;
+ rw_rlock(&pvh_global_lock);
+ lock = VM_PAGE_TO_PV_LIST_LOCK(m);
+ rw_rlock(lock);
+ TAILQ_FOREACH(pv, &m->md.pv_list, pv_next) {
+ if (PV_PMAP(pv) == pmap) {
+ rv = TRUE;
+ break;
+ }
+ loops++;
+ if (loops >= 16)
+ break;
+ }
+ rw_runlock(lock);
+ rw_runlock(&pvh_global_lock);
+ return (rv);
+}
+
+/*
+ * pmap_page_wired_mappings:
+ *
+ * Return the number of managed mappings to the given physical page
+ * that are wired.
+ */
+int
+pmap_page_wired_mappings(vm_page_t m)
+{
+ struct rwlock *lock;
+ pmap_t pmap;
+ pt_entry_t *l3;
+ pv_entry_t pv;
+ int count, md_gen;
+
+ if ((m->oflags & VPO_UNMANAGED) != 0)
+ return (0);
+ rw_rlock(&pvh_global_lock);
+ lock = VM_PAGE_TO_PV_LIST_LOCK(m);
+ rw_rlock(lock);
+restart:
+ count = 0;
+ TAILQ_FOREACH(pv, &m->md.pv_list, pv_next) {
+ pmap = PV_PMAP(pv);
+ if (!PMAP_TRYLOCK(pmap)) {
+ md_gen = m->md.pv_gen;
+ rw_runlock(lock);
+ PMAP_LOCK(pmap);
+ rw_rlock(lock);
+ if (md_gen != m->md.pv_gen) {
+ PMAP_UNLOCK(pmap);
+ goto restart;
+ }
+ }
+ l3 = pmap_l3(pmap, pv->pv_va);
+ if (l3 != NULL && (*l3 & ATTR_SW_WIRED) != 0)
+ count++;
+ PMAP_UNLOCK(pmap);
+ }
+ rw_runlock(lock);
+ rw_runlock(&pvh_global_lock);
+ return (count);
+}
+
+/*
+ * Destroy all managed, non-wired mappings in the given user-space
+ * pmap. This pmap cannot be active on any processor besides the
+ * caller.
+ *
+ * This function cannot be applied to the kernel pmap. Moreover, it
+ * is not intended for general use. It is only to be used during
+ * process termination. Consequently, it can be implemented in ways
+ * that make it faster than pmap_remove(). First, it can more quickly
+ * destroy mappings by iterating over the pmap's collection of PV
+ * entries, rather than searching the page table. Second, it doesn't
+ * have to test and clear the page table entries atomically, because
+ * no processor is currently accessing the user address space. In
+ * particular, a page table entry's dirty bit won't change state once
+ * this function starts.
+ */
+void
+pmap_remove_pages(pmap_t pmap)
+{
+ pd_entry_t ptepde, *l2;
+ pt_entry_t *l3, tl3;
+ struct spglist free;
+ vm_page_t m;
+ pv_entry_t pv;
+ struct pv_chunk *pc, *npc;
+ struct rwlock *lock;
+ int64_t bit;
+ uint64_t inuse, bitmask;
+ int allfree, field, freed, idx;
+ vm_paddr_t pa;
+
+ lock = NULL;
+
+ SLIST_INIT(&free);
+ rw_rlock(&pvh_global_lock);
+ PMAP_LOCK(pmap);
+ TAILQ_FOREACH_SAFE(pc, &pmap->pm_pvchunk, pc_list, npc) {
+ allfree = 1;
+ freed = 0;
+ for (field = 0; field < _NPCM; field++) {
+ inuse = ~pc->pc_map[field] & pc_freemask[field];
+ while (inuse != 0) {
+ bit = ffsl(inuse) - 1;
+ bitmask = 1UL << bit;
+ idx = field * 64 + bit;
+ pv = &pc->pc_pventry[idx];
+ inuse &= ~bitmask;
+
+ l2 = pmap_l2(pmap, pv->pv_va);
+ ptepde = pmap_load(l2);
+ l3 = pmap_l2_to_l3(l2, pv->pv_va);
+ tl3 = pmap_load(l3);
+
+/*
+ * We cannot remove wired pages from a process' mapping at this time
+ */
+ if (tl3 & ATTR_SW_WIRED) {
+ allfree = 0;
+ continue;
+ }
+
+ pa = tl3 & ~ATTR_MASK;
+
+ m = PHYS_TO_VM_PAGE(pa);
+ KASSERT(m->phys_addr == pa,
+ ("vm_page_t %p phys_addr mismatch %016jx %016jx",
+ m, (uintmax_t)m->phys_addr,
+ (uintmax_t)tl3));
+
+ KASSERT((m->flags & PG_FICTITIOUS) != 0 ||
+ m < &vm_page_array[vm_page_array_size],
+ ("pmap_remove_pages: bad l3 %#jx",
+ (uintmax_t)tl3));
+
+ if (pmap_is_current(pmap) &&
+ pmap_l3_valid_cacheable(pmap_load(l3)))
+ cpu_dcache_wb_range(pv->pv_va, L3_SIZE);
+ pmap_load_clear(l3);
+ PTE_SYNC(l3);
+
+ /*
+ * Update the vm_page_t clean/reference bits.
+ */
+ if ((tl3 & ATTR_AP_RW_BIT) ==
+ ATTR_AP(ATTR_AP_RW))
+ vm_page_dirty(m);
+
+ CHANGE_PV_LIST_LOCK_TO_VM_PAGE(&lock, m);
+
+ /* Mark free */
+ pc->pc_map[field] |= bitmask;
+
+ pmap_resident_count_dec(pmap, 1);
+ TAILQ_REMOVE(&m->md.pv_list, pv, pv_next);
+ m->md.pv_gen++;
+
+ pmap_unuse_l3(pmap, pv->pv_va, ptepde, &free);
+ freed++;
+ }
+ }
+ PV_STAT(atomic_add_long(&pv_entry_frees, freed));
+ PV_STAT(atomic_add_int(&pv_entry_spare, freed));
+ PV_STAT(atomic_subtract_long(&pv_entry_count, freed));
+ if (allfree) {
+ TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
+ free_pv_chunk(pc);
+ }
+ }
+ pmap_invalidate_all(pmap);
+ if (lock != NULL)
+ rw_wunlock(lock);
+ rw_runlock(&pvh_global_lock);
+ PMAP_UNLOCK(pmap);
+ pmap_free_zero_pages(&free);
+}
+
+/*
+ * This is used to check if a page has been accessed or modified. As we
+ * don't have a bit to see if it has been modified we have to assume it
+ * has been if the page is read/write.
+ */
+static boolean_t
+pmap_page_test_mappings(vm_page_t m, boolean_t accessed, boolean_t modified)
+{
+ struct rwlock *lock;
+ pv_entry_t pv;
+ pt_entry_t *l3, mask, value;
+ pmap_t pmap;
+ int md_gen;
+ boolean_t rv;
+
+ rv = FALSE;
+ rw_rlock(&pvh_global_lock);
+ lock = VM_PAGE_TO_PV_LIST_LOCK(m);
+ rw_rlock(lock);
+restart:
+ TAILQ_FOREACH(pv, &m->md.pv_list, pv_next) {
+ pmap = PV_PMAP(pv);
+ if (!PMAP_TRYLOCK(pmap)) {
+ md_gen = m->md.pv_gen;
+ rw_runlock(lock);
+ PMAP_LOCK(pmap);
+ rw_rlock(lock);
+ if (md_gen != m->md.pv_gen) {
+ PMAP_UNLOCK(pmap);
+ goto restart;
+ }
+ }
+ l3 = pmap_l3(pmap, pv->pv_va);
+ mask = 0;
+ value = 0;
+ if (modified) {
+ mask |= ATTR_AP_RW_BIT;
+ value |= ATTR_AP(ATTR_AP_RW);
+ }
+ if (accessed) {
+ mask |= ATTR_AF | ATTR_DESCR_MASK;
+ value |= ATTR_AF | L3_PAGE;
+ }
+ rv = (pmap_load(l3) & mask) == value;
+ PMAP_UNLOCK(pmap);
+ if (rv)
+ goto out;
+ }
+out:
+ rw_runlock(lock);
+ rw_runlock(&pvh_global_lock);
+ return (rv);
+}
+
+/*
+ * pmap_is_modified:
+ *
+ * Return whether or not the specified physical page was modified
+ * in any physical maps.
+ */
+boolean_t
+pmap_is_modified(vm_page_t m)
+{
+
+ KASSERT((m->oflags & VPO_UNMANAGED) == 0,
+ ("pmap_is_modified: page %p is not managed", m));
+
+ /*
+ * If the page is not exclusive busied, then PGA_WRITEABLE cannot be
+ * concurrently set while the object is locked. Thus, if PGA_WRITEABLE
+ * is clear, no PTEs can have PG_M set.
+ */
+ VM_OBJECT_ASSERT_WLOCKED(m->object);
+ if (!vm_page_xbusied(m) && (m->aflags & PGA_WRITEABLE) == 0)
+ return (FALSE);
+ return (pmap_page_test_mappings(m, FALSE, TRUE));
+}
+
+/*
+ * pmap_is_prefaultable:
+ *
+ * Return whether or not the specified virtual address is eligible
+ * for prefault.
+ */
+boolean_t
+pmap_is_prefaultable(pmap_t pmap, vm_offset_t addr)
+{
+ pt_entry_t *l3;
+ boolean_t rv;
+
+ rv = FALSE;
+ PMAP_LOCK(pmap);
+ l3 = pmap_l3(pmap, addr);
+ if (l3 != NULL && *l3 != 0) {
+ rv = TRUE;
+ }
+ PMAP_UNLOCK(pmap);
+ return (rv);
+}
+
+/*
+ * pmap_is_referenced:
+ *
+ * Return whether or not the specified physical page was referenced
+ * in any physical maps.
+ */
+boolean_t
+pmap_is_referenced(vm_page_t m)
+{
+
+ KASSERT((m->oflags & VPO_UNMANAGED) == 0,
+ ("pmap_is_referenced: page %p is not managed", m));
+ return (pmap_page_test_mappings(m, TRUE, FALSE));
+}
+
+/*
+ * Clear the write and modified bits in each of the given page's mappings.
+ */
+void
+pmap_remove_write(vm_page_t m)
+{
+ pmap_t pmap;
+ struct rwlock *lock;
+ pv_entry_t pv;
+ pt_entry_t *l3, oldl3;
+ int md_gen;
+
+ KASSERT((m->oflags & VPO_UNMANAGED) == 0,
+ ("pmap_remove_write: page %p is not managed", m));
+
+ /*
+ * If the page is not exclusive busied, then PGA_WRITEABLE cannot be
+ * set by another thread while the object is locked. Thus,
+ * if PGA_WRITEABLE is clear, no page table entries need updating.
+ */
+ VM_OBJECT_ASSERT_WLOCKED(m->object);
+ if (!vm_page_xbusied(m) && (m->aflags & PGA_WRITEABLE) == 0)
+ return;
+ rw_rlock(&pvh_global_lock);
+ lock = VM_PAGE_TO_PV_LIST_LOCK(m);
+retry_pv_loop:
+ rw_wlock(lock);
+ TAILQ_FOREACH(pv, &m->md.pv_list, pv_next) {
+ pmap = PV_PMAP(pv);
+ if (!PMAP_TRYLOCK(pmap)) {
+ md_gen = m->md.pv_gen;
+ rw_wunlock(lock);
+ PMAP_LOCK(pmap);
+ rw_wlock(lock);
+ if (md_gen != m->md.pv_gen) {
+ PMAP_UNLOCK(pmap);
+ rw_wunlock(lock);
+ goto retry_pv_loop;
+ }
+ }
+ l3 = pmap_l3(pmap, pv->pv_va);
+retry:
+ oldl3 = *l3;
+ if ((oldl3 & ATTR_AP_RW_BIT) == ATTR_AP(ATTR_AP_RW)) {
+ if (!atomic_cmpset_long(l3, oldl3,
+ oldl3 | ATTR_AP(ATTR_AP_RO)))
+ goto retry;
+ if ((oldl3 & ATTR_AF) != 0)
+ vm_page_dirty(m);
+ pmap_invalidate_page(pmap, pv->pv_va);
+ }
+ PMAP_UNLOCK(pmap);
+ }
+ rw_wunlock(lock);
+ vm_page_aflag_clear(m, PGA_WRITEABLE);
+ rw_runlock(&pvh_global_lock);
+}
+
+static __inline boolean_t
+safe_to_clear_referenced(pmap_t pmap, pt_entry_t pte)
+{
+
+ return (FALSE);
+}
+
+#define PMAP_TS_REFERENCED_MAX 5
+
+/*
+ * pmap_ts_referenced:
+ *
+ * Return a count of reference bits for a page, clearing those bits.
+ * It is not necessary for every reference bit to be cleared, but it
+ * is necessary that 0 only be returned when there are truly no
+ * reference bits set.
+ *
+ * XXX: The exact number of bits to check and clear is a matter that
+ * should be tested and standardized at some point in the future for
+ * optimal aging of shared pages.
+ */
+int
+pmap_ts_referenced(vm_page_t m)
+{
+ pv_entry_t pv, pvf;
+ pmap_t pmap;
+ struct rwlock *lock;
+ pd_entry_t *l2;
+ pt_entry_t *l3;
+ vm_paddr_t pa;
+ int cleared, md_gen, not_cleared;
+ struct spglist free;
+
+ KASSERT((m->oflags & VPO_UNMANAGED) == 0,
+ ("pmap_ts_referenced: page %p is not managed", m));
+ SLIST_INIT(&free);
+ cleared = 0;
+ pa = VM_PAGE_TO_PHYS(m);
+ lock = PHYS_TO_PV_LIST_LOCK(pa);
+ rw_rlock(&pvh_global_lock);
+ rw_wlock(lock);
+retry:
+ not_cleared = 0;
+ if ((pvf = TAILQ_FIRST(&m->md.pv_list)) == NULL)
+ goto out;
+ pv = pvf;
+ do {
+ if (pvf == NULL)
+ pvf = pv;
+ pmap = PV_PMAP(pv);
+ if (!PMAP_TRYLOCK(pmap)) {
+ md_gen = m->md.pv_gen;
+ rw_wunlock(lock);
+ PMAP_LOCK(pmap);
+ rw_wlock(lock);
+ if (md_gen != m->md.pv_gen) {
+ PMAP_UNLOCK(pmap);
+ goto retry;
+ }
+ }
+ l2 = pmap_l2(pmap, pv->pv_va);
+ KASSERT((*l2 & ATTR_DESCR_MASK) == L2_TABLE,
+ ("pmap_ts_referenced: found an invalid l2 table"));
+ l3 = pmap_l2_to_l3(l2, pv->pv_va);
+ if ((*l3 & ATTR_AF) != 0) {
+ if (safe_to_clear_referenced(pmap, *l3)) {
+ /*
+ * TODO: We don't handle the access flag
+ * at all. We need to be able to set it in
+ * the exception handler.
+ */
+ panic("TODO: safe_to_clear_referenced\n");
+ } else if ((*l3 & ATTR_SW_WIRED) == 0) {
+ /*
+ * Wired pages cannot be paged out so
+ * doing accessed bit emulation for
+ * them is wasted effort. We do the
+ * hard work for unwired pages only.
+ */
+ pmap_remove_l3(pmap, l3, pv->pv_va,
+ *l2, &free, &lock);
+ pmap_invalidate_page(pmap, pv->pv_va);
+ cleared++;
+ if (pvf == pv)
+ pvf = NULL;
+ pv = NULL;
+ KASSERT(lock == VM_PAGE_TO_PV_LIST_LOCK(m),
+ ("inconsistent pv lock %p %p for page %p",
+ lock, VM_PAGE_TO_PV_LIST_LOCK(m), m));
+ } else
+ not_cleared++;
+ }
+ PMAP_UNLOCK(pmap);
+ /* Rotate the PV list if it has more than one entry. */
+ if (pv != NULL && TAILQ_NEXT(pv, pv_next) != NULL) {
+ TAILQ_REMOVE(&m->md.pv_list, pv, pv_next);
+ TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_next);
+ m->md.pv_gen++;
+ }
+ } while ((pv = TAILQ_FIRST(&m->md.pv_list)) != pvf && cleared +
+ not_cleared < PMAP_TS_REFERENCED_MAX);
+out:
+ rw_wunlock(lock);
+ rw_runlock(&pvh_global_lock);
+ pmap_free_zero_pages(&free);
+ return (cleared + not_cleared);
+}
+
+/*
+ * Apply the given advice to the specified range of addresses within the
+ * given pmap. Depending on the advice, clear the referenced and/or
+ * modified flags in each mapping and set the mapped page's dirty field.
+ */
+void
+pmap_advise(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, int advice)
+{
+}
+
+/*
+ * Clear the modify bits on the specified physical page.
+ */
+void
+pmap_clear_modify(vm_page_t m)
+{
+
+ KASSERT((m->oflags & VPO_UNMANAGED) == 0,
+ ("pmap_clear_modify: page %p is not managed", m));
+ VM_OBJECT_ASSERT_WLOCKED(m->object);
+ KASSERT(!vm_page_xbusied(m),
+ ("pmap_clear_modify: page %p is exclusive busied", m));
+
+ /*
+ * If the page is not PGA_WRITEABLE, then no PTEs can have PG_M set.
+ * If the object containing the page is locked and the page is not
+ * exclusive busied, then PGA_WRITEABLE cannot be concurrently set.
+ */
+ if ((m->aflags & PGA_WRITEABLE) == 0)
+ return;
+
+ /* TODO: We lack support for tracking if a page is modified */
+}
+
+void *
+pmap_mapbios(vm_paddr_t pa, vm_size_t size)
+{
+
+ return ((void *)PHYS_TO_DMAP(pa));
+}
+
+void
+pmap_unmapbios(vm_paddr_t pa, vm_size_t size)
+{
+}
+
+/*
+ * Sets the memory attribute for the specified page.
+ */
+void
+pmap_page_set_memattr(vm_page_t m, vm_memattr_t ma)
+{
+
+ panic("pmap_page_set_memattr");
+}
+
+/*
+ * perform the pmap work for mincore
+ */
+int
+pmap_mincore(pmap_t pmap, vm_offset_t addr, vm_paddr_t *locked_pa)
+{
+
+ panic("pmap_mincore");
+}
+
+void
+pmap_activate(struct thread *td)
+{
+ pmap_t pmap;
+
+ critical_enter();
+ pmap = vmspace_pmap(td->td_proc->p_vmspace);
+ td->td_pcb->pcb_l1addr = vtophys(pmap->pm_l1);
+ __asm __volatile("msr ttbr0_el1, %0" : : "r"(td->td_pcb->pcb_l1addr));
+ critical_exit();
+}
+
+void
+pmap_sync_icache(pmap_t pm, vm_offset_t va, vm_size_t sz)
+{
+
+ panic("pmap_sync_icache");
+}
+
+/*
+ * Increase the starting virtual address of the given mapping if a
+ * different alignment might result in more superpage mappings.
+ */
+void
+pmap_align_superpage(vm_object_t object, vm_ooffset_t offset,
+ vm_offset_t *addr, vm_size_t size)
+{
+}
+
+/**
+ * Get the kernel virtual address of a set of physical pages. If there are
+ * physical addresses not covered by the DMAP perform a transient mapping
+ * that will be removed when calling pmap_unmap_io_transient.
+ *
+ * \param page The pages the caller wishes to obtain the virtual
+ * address on the kernel memory map.
+ * \param vaddr On return contains the kernel virtual memory address
+ * of the pages passed in the page parameter.
+ * \param count Number of pages passed in.
+ * \param can_fault TRUE if the thread using the mapped pages can take
+ * page faults, FALSE otherwise.
+ *
+ * \returns TRUE if the caller must call pmap_unmap_io_transient when
+ * finished or FALSE otherwise.
+ *
+ */
+boolean_t
+pmap_map_io_transient(vm_page_t page[], vm_offset_t vaddr[], int count,
+ boolean_t can_fault)
+{
+ vm_paddr_t paddr;
+ boolean_t needs_mapping;
+ int error, i;
+
+ /*
+ * Allocate any KVA space that we need, this is done in a separate
+ * loop to prevent calling vmem_alloc while pinned.
+ */
+ needs_mapping = FALSE;
+ for (i = 0; i < count; i++) {
+ paddr = VM_PAGE_TO_PHYS(page[i]);
+ if (__predict_false(paddr >= DMAP_MAX_PHYSADDR)) {
+ error = vmem_alloc(kernel_arena, PAGE_SIZE,
+ M_BESTFIT | M_WAITOK, &vaddr[i]);
+ KASSERT(error == 0, ("vmem_alloc failed: %d", error));
+ needs_mapping = TRUE;
+ } else {
+ vaddr[i] = PHYS_TO_DMAP(paddr);
+ }
+ }
+
+ /* Exit early if everything is covered by the DMAP */
+ if (!needs_mapping)
+ return (FALSE);
+
+ /*
+ * NB: The sequence of updating a page table followed by accesses
+ * to the corresponding pages used in the !DMAP case is subject to
+ * the situation described in the "AMD64 Architecture Programmer's
+ * Manual Volume 2: System Programming" rev. 3.23, "7.3.1 Special
+ * Coherency Considerations". Therefore, issuing the INVLPG right
+ * after modifying the PTE bits is crucial.
+ */
+ if (!can_fault)
+ sched_pin();
+ for (i = 0; i < count; i++) {
+ paddr = VM_PAGE_TO_PHYS(page[i]);
+ if (paddr >= DMAP_MAX_PHYSADDR) {
+ panic(
+ "pmap_map_io_transient: TODO: Map out of DMAP data");
+ }
+ }
+
+ return (needs_mapping);
+}
+
+void
+pmap_unmap_io_transient(vm_page_t page[], vm_offset_t vaddr[], int count,
+ boolean_t can_fault)
+{
+ vm_paddr_t paddr;
+ int i;
+
+ if (!can_fault)
+ sched_unpin();
+ for (i = 0; i < count; i++) {
+ paddr = VM_PAGE_TO_PHYS(page[i]);
+ if (paddr >= DMAP_MAX_PHYSADDR) {
+ panic("pmap_unmap_io_transient: TODO: Unmap data");
+ }
+ }
+}
diff --git a/sys/arm64/arm64/stack_machdep.c b/sys/arm64/arm64/stack_machdep.c
new file mode 100644
index 0000000..a640077
--- /dev/null
+++ b/sys/arm64/arm64/stack_machdep.c
@@ -0,0 +1,60 @@
+/*-
+ * Copyright (c) 2015 The FreeBSD Foundation
+ * All rights reserved.
+ *
+ * This software was developed by Andrew Turner under
+ * sponsorship from the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/proc.h>
+#include <sys/stack.h>
+
+#include <machine/vmparam.h>
+#include <machine/pcb.h>
+#include <machine/stack.h>
+
+void
+stack_save_td(struct stack *st, struct thread *td)
+{
+
+ if (TD_IS_SWAPPED(td))
+ panic("stack_save_td: swapped");
+ if (TD_IS_RUNNING(td))
+ panic("stack_save_td: running");
+
+ stack_zero(st);
+}
+
+void
+stack_save(struct stack *st)
+{
+
+ stack_zero(st);
+}
diff --git a/sys/arm64/arm64/support.S b/sys/arm64/arm64/support.S
new file mode 100644
index 0000000..9f30b58
--- /dev/null
+++ b/sys/arm64/arm64/support.S
@@ -0,0 +1,255 @@
+/*-
+ * Copyright (c) 2014 Andrew Turner
+ * Copyright (c) 2014-2015 The FreeBSD Foundation
+ * All rights reserved.
+ *
+ * Portions of this software were developed by Andrew Turner
+ * under sponsorship from the FreeBSD Foundation
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+#include <machine/asm.h>
+__FBSDID("$FreeBSD$");
+
+#include <machine/setjmp.h>
+
+#include "assym.s"
+
+/*
+ * One of the fu* or su* functions failed, return -1.
+ */
+ENTRY(fsu_fault)
+ SET_FAULT_HANDLER(xzr, x1) /* Reset the handler function */
+ mov x0, #-1
+ ret
+END(fsu_fault)
+
+/*
+ * int casueword32(volatile uint32_t *, uint32_t, uint32_t *, uint32_t)
+ */
+ENTRY(casueword32)
+ adr x6, fsu_fault /* Load the fault handler */
+ SET_FAULT_HANDLER(x6, x4) /* And set it */
+1: ldxr w4, [x0] /* Load-exclusive the data */
+ cmp w4, w1 /* Compare */
+ b.ne 2f /* Not equal, exit */
+ stxr w5, w3, [x0] /* Store the new data */
+ cbnz w5, 1b /* Retry on failure */
+ ldrb w0, [x0] /* Try loading the data */
+2: SET_FAULT_HANDLER(xzr, x5) /* Reset the fault handler */
+ str w4, [x2] /* Store the read data */
+ ret /* Return */
+END(casueword32)
+
+/*
+ * int casueword(volatile u_long *, u_long, u_long *, u_long)
+ */
+ENTRY(casueword)
+ adr x6, fsu_fault /* Load the fault handler */
+ SET_FAULT_HANDLER(x6, x4) /* And set it */
+1: ldxr x4, [x0] /* Load-exclusive the data */
+ cmp x4, x1 /* Compare */
+ b.ne 2f /* Not equal, exit */
+ stxr w5, x3, [x0] /* Store the new data */
+ cbnz w5, 1b /* Retry on failure */
+ ldrb w0, [x0] /* Try loading the data */
+2: SET_FAULT_HANDLER(xzr, x5) /* Reset the fault handler */
+ str x4, [x2] /* Store the read data */
+ ret /* Return */
+END(casueword)
+
+/*
+ * int fubyte(volatile const void *)
+ */
+ENTRY(fubyte)
+ adr x6, fsu_fault /* Load the fault handler */
+ SET_FAULT_HANDLER(x6, x1) /* And set it */
+ ldrb w0, [x0] /* Try loading the data */
+ SET_FAULT_HANDLER(xzr, x1) /* Reset the fault handler */
+ ret /* Return */
+END(fubyte)
+
+/*
+ * int fuword(volatile const void *)
+ */
+ENTRY(fuword16)
+ adr x6, fsu_fault /* Load the fault handler */
+ SET_FAULT_HANDLER(x6, x1) /* And set it */
+ ldrh w0, [x0] /* Try loading the data */
+ SET_FAULT_HANDLER(xzr, x1) /* Reset the fault handler */
+ ret /* Return */
+END(fuword16)
+
+/*
+ * int32_t fueword32(volatile const void *, int32_t *)
+ */
+ENTRY(fueword32)
+ adr x6, fsu_fault /* Load the fault handler */
+ SET_FAULT_HANDLER(x6, x2) /* And set it */
+ ldr w0, [x0] /* Try loading the data */
+ SET_FAULT_HANDLER(xzr, x2) /* Reset the fault handler */
+ str w0, [x1] /* Save the data in kernel space */
+ mov w0, #0 /* Success */
+ ret /* Return */
+END(fueword32)
+
+/*
+ * long fueword(volatile const void *, int64_t *)
+ * int64_t fueword64(volatile const void *, int64_t *)
+ */
+ENTRY(fueword)
+EENTRY(fueword64)
+ adr x6, fsu_fault /* Load the fault handler */
+ SET_FAULT_HANDLER(x6, x2) /* And set it */
+ ldr x0, [x0] /* Try loading the data */
+ SET_FAULT_HANDLER(xzr, x2) /* Reset the fault handler */
+ str x0, [x1] /* Save the data in kernel space */
+ mov x0, #0 /* Success */
+ ret /* Return */
+EEND(fueword64)
+END(fueword)
+
+/*
+ * int subyte(volatile void *, int)
+ */
+ENTRY(subyte)
+ adr x6, fsu_fault /* Load the fault handler */
+ SET_FAULT_HANDLER(x6, x2) /* And set it */
+ strb w1, [x0] /* Try storing the data */
+ SET_FAULT_HANDLER(xzr, x2) /* Reset the fault handler */
+ mov x0, #0 /* Success */
+ ret /* Return */
+END(subyte)
+
+/*
+ * int suword16(volatile void *, int)
+ */
+ENTRY(suword16)
+ adr x6, fsu_fault /* Load the fault handler */
+ SET_FAULT_HANDLER(x6, x2) /* And set it */
+ strh w1, [x0] /* Try storing the data */
+ SET_FAULT_HANDLER(xzr, x2) /* Reset the fault handler */
+ mov x0, #0 /* Success */
+ ret /* Return */
+END(suword16)
+
+/*
+ * int suword32(volatile void *, int)
+ */
+ENTRY(suword32)
+ adr x6, fsu_fault /* Load the fault handler */
+ SET_FAULT_HANDLER(x6, x2) /* And set it */
+ str w1, [x0] /* Try storing the data */
+ SET_FAULT_HANDLER(xzr, x2) /* Reset the fault handler */
+ mov x0, #0 /* Success */
+ ret /* Return */
+END(suword32)
+
+/*
+ * int suword(volatile void *, long)
+ */
+ENTRY(suword)
+EENTRY(suword64)
+ adr x6, fsu_fault /* Load the fault handler */
+ SET_FAULT_HANDLER(x6, x2) /* And set it */
+ str x1, [x0] /* Try storing the data */
+ SET_FAULT_HANDLER(xzr, x2) /* Reset the fault handler */
+ mov x0, #0 /* Success */
+ ret /* Return */
+EEND(suword64)
+END(suword)
+
+/*
+ * fuswintr and suswintr are just like fusword and susword except that if
+ * the page is not in memory or would cause a trap, then we return an error.
+ * The important thing is to prevent sleep() and switch().
+ */
+
+/*
+ * Special handler so the trap code knows not to sleep.
+ */
+ENTRY(fsu_intr_fault)
+ SET_FAULT_HANDLER(xzr, x1) /* Reset the handler function */
+ mov x0, #-1
+ ret
+END(fsu_fault)
+
+/*
+ * int fuswintr(void *)
+ */
+ENTRY(fuswintr)
+ adr x6, fsu_intr_fault /* Load the fault handler */
+ SET_FAULT_HANDLER(x6, x1) /* And set it */
+ ldr w0, [x0] /* Try loading the data */
+ SET_FAULT_HANDLER(xzr, x1) /* Reset the fault handler */
+ ret /* Return */
+END(fuswintr)
+
+/*
+ * int suswintr(void *base, int word)
+ */
+ENTRY(suswintr)
+ adr x6, fsu_intr_fault /* Load the fault handler */
+ SET_FAULT_HANDLER(x6, x2) /* And set it */
+ str w1, [x0] /* Try storing the data */
+ SET_FAULT_HANDLER(xzr, x2) /* Reset the fault handler */
+ mov x0, #0 /* Success */
+ ret /* Return */
+END(suswintr)
+
+ENTRY(setjmp)
+ /* Store the stack pointer */
+ mov x8, sp
+ str x8, [x0]
+
+ /* Store the general purpose registers and lr */
+ stp x19, x20, [x0], #16
+ stp x21, x22, [x0], #16
+ stp x23, x24, [x0], #16
+ stp x25, x26, [x0], #16
+ stp x27, x28, [x0], #16
+ stp x29, lr, [x0], #16
+
+ /* Return value */
+ mov x0, #0
+ ret
+END(setjmp)
+
+ENTRY(longjmp)
+ /* Restore the stack pointer */
+ ldr x8, [x0], #8
+ mov sp, x8
+
+ /* Restore the general purpose registers and lr */
+ ldp x19, x20, [x0], #16
+ ldp x21, x22, [x0], #16
+ ldp x23, x24, [x0], #16
+ ldp x25, x26, [x0], #16
+ ldp x27, x28, [x0], #16
+ ldp x29, lr, [x0], #16
+
+ /* Load the return value */
+ mov x0, x1
+ ret
+END(longjmp)
diff --git a/sys/arm64/arm64/swtch.S b/sys/arm64/arm64/swtch.S
new file mode 100644
index 0000000..2d547fd
--- /dev/null
+++ b/sys/arm64/arm64/swtch.S
@@ -0,0 +1,255 @@
+/*-
+ * Copyright (c) 2014 Andrew Turner
+ * Copyright (c) 2014 The FreeBSD Foundation
+ * All rights reserved.
+ *
+ * This software was developed by Andrew Turner under sponsorship from
+ * the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+#include "assym.s"
+
+#include <machine/asm.h>
+
+__FBSDID("$FreeBSD$");
+
+/*
+ * void cpu_throw(struct thread *old, struct thread *new)
+ */
+ENTRY(cpu_throw)
+#ifdef SMP
+#error cpu_throw needs to be ported to support SMP
+#endif
+
+#ifdef VFP
+ /* Backup the new thread pointer around a call to C code */
+ mov x19, x1
+ bl vfp_discard
+ mov x1, x19
+#endif
+
+ /* Store the new curthread */
+ str x1, [x18, #PC_CURTHREAD]
+ /* And the new pcb */
+ ldr x4, [x1, #TD_PCB]
+ str x4, [x18, #PC_CURPCB]
+
+ /*
+ * TODO: We may need to flush the cache here.
+ */
+
+ /* Switch to the new pmap */
+ ldr x5, [x4, #PCB_L1ADDR]
+ msr ttbr0_el1, x5
+ isb
+
+ /* Invalidate the TLB */
+ dsb sy
+ tlbi vmalle1is
+ dsb sy
+ isb
+
+ /* Restore the registers */
+ ldp x5, x6, [x4, #PCB_SP]
+ mov sp, x5
+ msr tpidr_el0, x6
+ ldp x8, x9, [x4, #PCB_REGS + 8 * 8]
+ ldp x10, x11, [x4, #PCB_REGS + 10 * 8]
+ ldp x12, x13, [x4, #PCB_REGS + 12 * 8]
+ ldp x14, x15, [x4, #PCB_REGS + 14 * 8]
+ ldp x16, x17, [x4, #PCB_REGS + 16 * 8]
+ ldr x19, [x4, #PCB_REGS + 19 * 8]
+ ldp x20, x21, [x4, #PCB_REGS + 20 * 8]
+ ldp x22, x23, [x4, #PCB_REGS + 22 * 8]
+ ldp x24, x25, [x4, #PCB_REGS + 24 * 8]
+ ldp x26, x27, [x4, #PCB_REGS + 26 * 8]
+ ldp x28, x29, [x4, #PCB_REGS + 28 * 8]
+ ldr x30, [x4, #PCB_REGS + 30 * 8]
+
+ ret
+END(cpu_throw)
+
+/*
+ * void cpu_switch(struct thread *old, struct thread *new, struct mtx *mtx)
+ *
+ * x0 = old
+ * x1 = new
+ * x2 = mtx
+ * x3 to x7, x16 and x17 are caller saved
+ */
+ENTRY(cpu_switch)
+#ifdef SMP
+#error cpu_switch needs to be ported to support SMP
+#endif
+
+ /* Store the new curthread */
+ str x1, [x18, #PC_CURTHREAD]
+ /* And the new pcb */
+ ldr x4, [x1, #TD_PCB]
+ str x4, [x18, #PC_CURPCB]
+
+ /*
+ * Save the old context.
+ */
+ ldr x4, [x0, #TD_PCB]
+
+ /* Store the callee-saved registers */
+ stp x8, x9, [x4, #PCB_REGS + 8 * 8]
+ stp x10, x11, [x4, #PCB_REGS + 10 * 8]
+ stp x12, x13, [x4, #PCB_REGS + 12 * 8]
+ stp x14, x15, [x4, #PCB_REGS + 14 * 8]
+ stp x16, x17, [x4, #PCB_REGS + 16 * 8]
+ stp x18, x19, [x4, #PCB_REGS + 18 * 8]
+ stp x20, x21, [x4, #PCB_REGS + 20 * 8]
+ stp x22, x23, [x4, #PCB_REGS + 22 * 8]
+ stp x24, x25, [x4, #PCB_REGS + 24 * 8]
+ stp x26, x27, [x4, #PCB_REGS + 26 * 8]
+ stp x28, x29, [x4, #PCB_REGS + 28 * 8]
+ str x30, [x4, #PCB_REGS + 30 * 8]
+ /* And the old stack pointer */
+ mov x5, sp
+ mrs x6, tpidr_el0
+ stp x5, x6, [x4, #PCB_SP]
+
+#ifdef VFP
+ mov x19, x0
+ mov x20, x1
+ mov x21, x2
+ bl vfp_save_state
+ mov x2, x21
+ mov x1, x20
+ mov x0, x19
+#endif
+
+ /*
+ * Restore the saved context.
+ */
+ ldr x4, [x1, #TD_PCB]
+
+ /*
+ * TODO: We may need to flush the cache here if switching
+ * to a user process.
+ */
+
+ /* Switch to the new pmap */
+ ldr x5, [x4, #PCB_L1ADDR]
+ msr ttbr0_el1, x5
+ isb
+
+ /* Invalidate the TLB */
+ dsb sy
+ tlbi vmalle1is
+ dsb sy
+ isb
+
+ /* Release the old thread */
+ str x2, [x0, #TD_LOCK]
+#if defined(SCHED_ULE) && defined(SMP)
+#error We may need to wait for the lock here
+#endif
+
+ /* Restore the registers */
+ ldp x5, x6, [x4, #PCB_SP]
+ mov sp, x5
+ msr tpidr_el0, x6
+ ldp x8, x9, [x4, #PCB_REGS + 8 * 8]
+ ldp x10, x11, [x4, #PCB_REGS + 10 * 8]
+ ldp x12, x13, [x4, #PCB_REGS + 12 * 8]
+ ldp x14, x15, [x4, #PCB_REGS + 14 * 8]
+ ldp x16, x17, [x4, #PCB_REGS + 16 * 8]
+ ldr x19, [x4, #PCB_REGS + 19 * 8]
+ ldp x20, x21, [x4, #PCB_REGS + 20 * 8]
+ ldp x22, x23, [x4, #PCB_REGS + 22 * 8]
+ ldp x24, x25, [x4, #PCB_REGS + 24 * 8]
+ ldp x26, x27, [x4, #PCB_REGS + 26 * 8]
+ ldp x28, x29, [x4, #PCB_REGS + 28 * 8]
+ ldr x30, [x4, #PCB_REGS + 30 * 8]
+
+ str xzr, [x4, #PCB_REGS + 18 * 8]
+ ret
+.Lcpu_switch_panic_str:
+ .asciz "cpu_switch: %p\0"
+END(cpu_switch)
+
+ENTRY(fork_trampoline)
+ mov x0, x8
+ mov x1, x9
+ mov x2, sp
+ mov fp, #0 /* Stack traceback stops here. */
+ bl _C_LABEL(fork_exit)
+
+ /* Restore sp and lr */
+ ldp x0, x1, [sp]
+ msr sp_el0, x0
+ mov lr, x1
+
+ /* Restore the registers other than x0 and x1 */
+ ldp x2, x3, [sp, #TF_X + 2 * 8]
+ ldp x4, x5, [sp, #TF_X + 4 * 8]
+ ldp x6, x7, [sp, #TF_X + 6 * 8]
+ ldp x8, x9, [sp, #TF_X + 8 * 8]
+ ldp x10, x11, [sp, #TF_X + 10 * 8]
+ ldp x12, x13, [sp, #TF_X + 12 * 8]
+ ldp x14, x15, [sp, #TF_X + 14 * 8]
+ ldp x16, x17, [sp, #TF_X + 16 * 8]
+ ldr x19, [sp, #TF_X + 19 * 8]
+ ldp x20, x21, [sp, #TF_X + 20 * 8]
+ ldp x22, x23, [sp, #TF_X + 22 * 8]
+ ldp x24, x25, [sp, #TF_X + 24 * 8]
+ ldp x26, x27, [sp, #TF_X + 26 * 8]
+ ldp x28, x29, [sp, #TF_X + 28 * 8]
+ /* Skip x30 as it was restored above as lr */
+
+ /*
+ * Disable interrupts to avoid
+ * overwriting spsr_el1 by an IRQ exception.
+ */
+ msr daifset, #2
+
+ /* Restore elr and spsr */
+ ldp x0, x1, [sp, #16]
+ msr elr_el1, x0
+ msr spsr_el1, x1
+
+ /* Finally x0 and x1 */
+ ldp x0, x1, [sp, #TF_X + 0 * 8]
+ ldr x18, [sp, #TF_X + 18 * 8]
+
+ /*
+ * No need for interrupts reenabling since PSR
+ * will be set to the desired value anyway.
+ */
+ eret
+
+END(fork_trampoline)
+
+ENTRY(savectx)
+ adr x0, .Lsavectx_panic_str
+ bl panic
+ ret
+.Lsavectx_panic_str:
+ .asciz "savectx"
+END(savectx)
+
diff --git a/sys/arm64/arm64/sys_machdep.c b/sys/arm64/arm64/sys_machdep.c
new file mode 100644
index 0000000..c9ee6c5
--- /dev/null
+++ b/sys/arm64/arm64/sys_machdep.c
@@ -0,0 +1,47 @@
+/*-
+ * Copyright (c) 2015 The FreeBSD Foundation
+ * All rights reserved.
+ *
+ * This software was developed by Andrew Turner under
+ * sponsorship from the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/sysproto.h>
+
+#include <machine/sysarch.h>
+
+
+int
+sysarch(struct thread *td, struct sysarch_args *uap)
+{
+
+ return (ENOTSUP);
+}
+
diff --git a/sys/arm64/arm64/trap.c b/sys/arm64/arm64/trap.c
new file mode 100644
index 0000000..a5c9d61
--- /dev/null
+++ b/sys/arm64/arm64/trap.c
@@ -0,0 +1,311 @@
+/*-
+ * Copyright (c) 2014 Andrew Turner
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/lock.h>
+#include <sys/mutex.h>
+#include <sys/pioctl.h>
+#include <sys/proc.h>
+#include <sys/ptrace.h>
+#include <sys/syscall.h>
+#include <sys/sysent.h>
+#ifdef KDB
+#include <sys/kdb.h>
+#endif
+
+#include <vm/vm.h>
+#include <vm/pmap.h>
+#include <vm/vm_kern.h>
+#include <vm/vm_map.h>
+#include <vm/vm_extern.h>
+
+#include <machine/frame.h>
+#include <machine/pcb.h>
+#include <machine/pcpu.h>
+#include <machine/vmparam.h>
+
+#ifdef VFP
+#include <machine/vfp.h>
+#endif
+
+#ifdef KDB
+#include <machine/db_machdep.h>
+#endif
+
+#ifdef DDB
+#include <ddb/db_output.h>
+#endif
+
+extern register_t fsu_intr_fault;
+
+/* Called from exception.S */
+void do_el1h_sync(struct trapframe *);
+void do_el0_sync(struct trapframe *);
+void do_el0_error(struct trapframe *);
+
+static __inline void
+call_trapsignal(struct thread *td, int sig, u_long code)
+{
+ ksiginfo_t ksi;
+
+ ksiginfo_init_trap(&ksi);
+ ksi.ksi_signo = sig;
+ ksi.ksi_code = (int)code;
+ trapsignal(td, &ksi);
+}
+
+int
+cpu_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
+{
+ struct proc *p;
+ register_t *ap;
+ int nap;
+
+ nap = 8;
+ p = td->td_proc;
+ ap = td->td_frame->tf_x;
+
+ sa->code = td->td_frame->tf_x[8];
+
+ if (sa->code == SYS_syscall || sa->code == SYS___syscall) {
+ sa->code = *ap++;
+ nap--;
+ }
+
+ if (p->p_sysent->sv_mask)
+ sa->code &= p->p_sysent->sv_mask;
+ if (sa->code >= p->p_sysent->sv_size)
+ sa->callp = &p->p_sysent->sv_table[0];
+ else
+ sa->callp = &p->p_sysent->sv_table[sa->code];
+
+ sa->narg = sa->callp->sy_narg;
+ memcpy(sa->args, ap, nap * sizeof(register_t));
+ if (sa->narg > nap)
+ panic("TODO: Could we have more then 8 args?");
+
+ td->td_retval[0] = 0;
+ td->td_retval[1] = 0;
+
+ return (0);
+}
+
+#include "../../kern/subr_syscall.c"
+
+static void
+svc_handler(struct trapframe *frame)
+{
+ struct syscall_args sa;
+ struct thread *td;
+ int error;
+
+ td = curthread;
+ td->td_frame = frame;
+
+ error = syscallenter(td, &sa);
+ syscallret(td, error, &sa);
+}
+
+static void
+data_abort(struct trapframe *frame, uint64_t esr, int lower)
+{
+ struct vm_map *map;
+ struct thread *td;
+ struct proc *p;
+ struct pcb *pcb;
+ vm_prot_t ftype;
+ vm_offset_t va;
+ uint64_t far;
+ int error, sig;
+
+ td = curthread;
+ pcb = td->td_pcb;
+
+ /*
+ * Special case for fuswintr and suswintr. These can't sleep so
+ * handle them early on in the trap handler.
+ */
+ if (__predict_false(pcb->pcb_onfault == (vm_offset_t)&fsu_intr_fault)) {
+ frame->tf_elr = pcb->pcb_onfault;
+ return;
+ }
+
+ far = READ_SPECIALREG(far_el1);
+ p = td->td_proc;
+
+ if (lower)
+ map = &td->td_proc->p_vmspace->vm_map;
+ else {
+ /* The top bit tells us which range to use */
+ if ((far >> 63) == 1)
+ map = kernel_map;
+ else
+ map = &td->td_proc->p_vmspace->vm_map;
+ }
+
+ va = trunc_page(far);
+ ftype = ((esr >> 6) & 1) ? VM_PROT_READ | VM_PROT_WRITE : VM_PROT_READ;
+
+ if (map != kernel_map) {
+ /*
+ * Keep swapout from messing with us during this
+ * critical time.
+ */
+ PROC_LOCK(p);
+ ++p->p_lock;
+ PROC_UNLOCK(p);
+
+ /* Fault in the user page: */
+ error = vm_fault(map, va, ftype, VM_FAULT_NORMAL);
+
+ PROC_LOCK(p);
+ --p->p_lock;
+ PROC_UNLOCK(p);
+ } else {
+ /*
+ * Don't have to worry about process locking or stacks in the
+ * kernel.
+ */
+ error = vm_fault(map, va, ftype, VM_FAULT_NORMAL);
+ }
+
+ if (error != 0) {
+ if (lower) {
+ if (error == ENOMEM)
+ sig = SIGKILL;
+ else
+ sig = SIGSEGV;
+ call_trapsignal(td, sig, 0);
+ } else {
+ if (td->td_intr_nesting_level == 0 &&
+ pcb->pcb_onfault != 0) {
+ frame->tf_x[0] = error;
+ frame->tf_elr = pcb->pcb_onfault;
+ return;
+ }
+ panic("vm_fault failed: %lx", frame->tf_elr);
+ }
+ }
+
+ if (lower)
+ userret(td, frame);
+}
+
+void
+do_el1h_sync(struct trapframe *frame)
+{
+ uint32_t exception;
+ uint64_t esr;
+
+ /* Read the esr register to get the exception details */
+ esr = READ_SPECIALREG(esr_el1);
+ exception = ESR_ELx_EXCEPTION(esr);
+
+ /*
+ * Sanity check we are in an exception er can handle. The IL bit
+ * is used to indicate the instruction length, except in a few
+ * exceptions described in the ARMv8 ARM.
+ *
+ * It is unclear in some cases if the bit is implementation defined.
+ * The Foundation Model and QEMU disagree on if the IL bit should
+ * be set when we are in a data fault from the same EL and the ISV
+ * bit (bit 24) is also set.
+ */
+ KASSERT((esr & ESR_ELx_IL) == ESR_ELx_IL ||
+ (exception == EXCP_DATA_ABORT && ((esr & ISS_DATA_ISV) == 0)),
+ ("Invalid instruction length in exception"));
+
+ switch(exception) {
+ case EXCP_FP_SIMD:
+ case EXCP_TRAP_FP:
+ panic("VFP exception in the kernel");
+ case EXCP_DATA_ABORT:
+ data_abort(frame, esr, 0);
+ break;
+ case EXCP_BRK:
+ case EXCP_WATCHPT_EL1:
+ case EXCP_SOFTSTP_EL1:
+#ifdef KDB
+ kdb_trap(exception, 0, frame);
+#else
+ panic("No debugger in kernel.\n");
+#endif
+ break;
+ default:
+ panic("Unknown kernel exception %x esr_el1 %lx\n", exception,
+ esr);
+ }
+}
+
+void
+do_el0_sync(struct trapframe *frame)
+{
+ uint32_t exception;
+ uint64_t esr;
+
+ /* Check we have a sane environment when entering from userland */
+ KASSERT((uintptr_t)get_pcpu() >= VM_MIN_KERNEL_ADDRESS,
+ ("Invalid pcpu address from userland: %p (tpidr %lx)",
+ get_pcpu(), READ_SPECIALREG(tpidr_el1)));
+
+ esr = READ_SPECIALREG(esr_el1);
+ exception = ESR_ELx_EXCEPTION(esr);
+
+ switch(exception) {
+ case EXCP_FP_SIMD:
+ case EXCP_TRAP_FP:
+#ifdef VFP
+ vfp_restore_state();
+#else
+ panic("VFP exception in userland");
+#endif
+ break;
+ case EXCP_SVC:
+ svc_handler(frame);
+ break;
+ case EXCP_INSN_ABORT_L:
+ case EXCP_DATA_ABORT_L:
+ data_abort(frame, esr, 1);
+ break;
+ default:
+ panic("Unknown userland exception %x esr_el1 %lx\n", exception,
+ esr);
+ }
+}
+
+void
+do_el0_error(struct trapframe *frame)
+{
+
+ panic("do_el0_error");
+}
+
diff --git a/sys/arm64/arm64/uio_machdep.c b/sys/arm64/arm64/uio_machdep.c
new file mode 100644
index 0000000..e6f6d39
--- /dev/null
+++ b/sys/arm64/arm64/uio_machdep.c
@@ -0,0 +1,134 @@
+/*-
+ * Copyright (c) 2004 Alan L. Cox <alc@cs.rice.edu>
+ * Copyright (c) 1982, 1986, 1991, 1993
+ * The Regents of the University of California. All rights reserved.
+ * (c) UNIX System Laboratories, Inc.
+ * All or some portions of this file are derived from material licensed
+ * to the University of California by American Telephone and Telegraph
+ * Co. or Unix System Laboratories, Inc. and are reproduced herein with
+ * the permission of UNIX System Laboratories, Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)kern_subr.c 8.3 (Berkeley) 1/21/94
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/kernel.h>
+#include <sys/lock.h>
+#include <sys/mutex.h>
+#include <sys/proc.h>
+#include <sys/systm.h>
+#include <sys/uio.h>
+
+#include <vm/vm.h>
+#include <vm/vm_page.h>
+
+#include <machine/vmparam.h>
+
+/*
+ * Implement uiomove(9) from physical memory using the direct map to
+ * avoid the creation and destruction of ephemeral mappings.
+ */
+int
+uiomove_fromphys(vm_page_t ma[], vm_offset_t offset, int n, struct uio *uio)
+{
+ struct thread *td = curthread;
+ struct iovec *iov;
+ void *cp;
+ vm_offset_t page_offset, vaddr;
+ size_t cnt;
+ int error = 0;
+ int save = 0;
+ boolean_t mapped;
+
+ KASSERT(uio->uio_rw == UIO_READ || uio->uio_rw == UIO_WRITE,
+ ("uiomove_fromphys: mode"));
+ KASSERT(uio->uio_segflg != UIO_USERSPACE || uio->uio_td == curthread,
+ ("uiomove_fromphys proc"));
+ save = td->td_pflags & TDP_DEADLKTREAT;
+ td->td_pflags |= TDP_DEADLKTREAT;
+ mapped = FALSE;
+ while (n > 0 && uio->uio_resid) {
+ iov = uio->uio_iov;
+ cnt = iov->iov_len;
+ if (cnt == 0) {
+ uio->uio_iov++;
+ uio->uio_iovcnt--;
+ continue;
+ }
+ if (cnt > n)
+ cnt = n;
+ page_offset = offset & PAGE_MASK;
+ cnt = min(cnt, PAGE_SIZE - page_offset);
+ if (uio->uio_segflg != UIO_NOCOPY) {
+ mapped = pmap_map_io_transient(
+ &ma[offset >> PAGE_SHIFT], &vaddr, 1, TRUE);
+ cp = (char *)vaddr + page_offset;
+ }
+ switch (uio->uio_segflg) {
+ case UIO_USERSPACE:
+ maybe_yield();
+ if (uio->uio_rw == UIO_READ)
+ error = copyout(cp, iov->iov_base, cnt);
+ else
+ error = copyin(iov->iov_base, cp, cnt);
+ if (error)
+ goto out;
+ break;
+ case UIO_SYSSPACE:
+ if (uio->uio_rw == UIO_READ)
+ bcopy(cp, iov->iov_base, cnt);
+ else
+ bcopy(iov->iov_base, cp, cnt);
+ break;
+ case UIO_NOCOPY:
+ break;
+ }
+ if (__predict_false(mapped)) {
+ pmap_unmap_io_transient(&ma[offset >> PAGE_SHIFT],
+ &vaddr, 1, TRUE);
+ mapped = FALSE;
+ }
+ iov->iov_base = (char *)iov->iov_base + cnt;
+ iov->iov_len -= cnt;
+ uio->uio_resid -= cnt;
+ uio->uio_offset += cnt;
+ offset += cnt;
+ n -= cnt;
+ }
+out:
+ if (__predict_false(mapped)) {
+ panic("TODO 3");
+ pmap_unmap_io_transient(&ma[offset >> PAGE_SHIFT], &vaddr, 1,
+ TRUE);
+ }
+ if (save == 0)
+ td->td_pflags &= ~TDP_DEADLKTREAT;
+ return (error);
+}
diff --git a/sys/arm64/arm64/vfp.c b/sys/arm64/arm64/vfp.c
new file mode 100644
index 0000000..7ce59b8
--- /dev/null
+++ b/sys/arm64/arm64/vfp.c
@@ -0,0 +1,195 @@
+/*-
+ * Copyright (c) 2015 The FreeBSD Foundation
+ * All rights reserved.
+ *
+ * This software was developed by Andrew Turner under
+ * sponsorship from the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#ifdef VFP
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/pcpu.h>
+#include <sys/proc.h>
+
+#include <machine/armreg.h>
+#include <machine/pcb.h>
+#include <machine/vfp.h>
+
+/* Sanity check we can store all the VFP registers */
+CTASSERT(sizeof(((struct pcb *)0)->pcb_vfp) == 16 * 32);
+
+static void
+vfp_enable(void)
+{
+ uint32_t cpacr;
+
+ cpacr = READ_SPECIALREG(cpacr_el1);
+ cpacr = (cpacr & ~CPACR_FPEN_MASK) | CPACR_FPEN_TRAP_NONE;
+ WRITE_SPECIALREG(cpacr_el1, cpacr);
+ isb();
+}
+
+static void
+vfp_disable(void)
+{
+ uint32_t cpacr;
+
+ cpacr = READ_SPECIALREG(cpacr_el1);
+ cpacr = (cpacr & ~CPACR_FPEN_MASK) | CPACR_FPEN_TRAP_ALL1;
+ WRITE_SPECIALREG(cpacr_el1, cpacr);
+ isb();
+}
+
+/*
+ * Called when the thread is dying. If the thread was the last to use the
+ * VFP unit mark it as unused to tell the kernel the fp state is unowned.
+ * Ensure the VFP unit is off so we get an exception on the next access.
+ */
+void
+vfp_discard(struct thread *td)
+{
+
+ if (PCPU_GET(fpcurthread) == td)
+ PCPU_SET(fpcurthread, NULL);
+
+ vfp_disable();
+}
+
+void
+vfp_save_state(struct thread *td)
+{
+ __int128_t *vfp_state;
+ uint64_t fpcr, fpsr;
+ uint32_t cpacr;
+
+ critical_enter();
+ /*
+ * Only store the registers if the VFP is enabled,
+ * i.e. return if we are trapping on FP access.
+ */
+ cpacr = READ_SPECIALREG(cpacr_el1);
+ if ((cpacr & CPACR_FPEN_MASK) == CPACR_FPEN_TRAP_NONE) {
+ vfp_state = td->td_pcb->pcb_vfp;
+ __asm __volatile(
+ "mrs %0, fpcr \n"
+ "mrs %1, fpsr \n"
+ "stp q0, q1, [%2, #16 * 0]\n"
+ "stp q2, q3, [%2, #16 * 2]\n"
+ "stp q4, q5, [%2, #16 * 4]\n"
+ "stp q6, q7, [%2, #16 * 6]\n"
+ "stp q8, q9, [%2, #16 * 8]\n"
+ "stp q10, q11, [%2, #16 * 10]\n"
+ "stp q12, q13, [%2, #16 * 12]\n"
+ "stp q14, q15, [%2, #16 * 14]\n"
+ "stp q16, q17, [%2, #16 * 16]\n"
+ "stp q18, q19, [%2, #16 * 18]\n"
+ "stp q20, q21, [%2, #16 * 20]\n"
+ "stp q22, q23, [%2, #16 * 22]\n"
+ "stp q24, q25, [%2, #16 * 24]\n"
+ "stp q26, q27, [%2, #16 * 26]\n"
+ "stp q28, q29, [%2, #16 * 28]\n"
+ "stp q30, q31, [%2, #16 * 30]\n"
+ : "=&r"(fpcr), "=&r"(fpsr) : "r"(vfp_state));
+
+ td->td_pcb->pcb_fpcr = fpcr;
+ td->td_pcb->pcb_fpsr = fpsr;
+
+ dsb();
+ vfp_disable();
+ }
+ critical_exit();
+}
+
+void
+vfp_restore_state(void)
+{
+ __int128_t *vfp_state;
+ uint64_t fpcr, fpsr;
+ struct pcb *curpcb;
+ u_int cpu;
+
+ critical_enter();
+
+ cpu = PCPU_GET(cpuid);
+ curpcb = curthread->td_pcb;
+ curpcb->pcb_fpflags |= PCB_FP_STARTED;
+
+ vfp_enable();
+
+ if (PCPU_GET(fpcurthread) != curthread && cpu != curpcb->pcb_vfpcpu) {
+
+ vfp_state = curthread->td_pcb->pcb_vfp;
+ fpcr = curthread->td_pcb->pcb_fpcr;
+ fpsr = curthread->td_pcb->pcb_fpsr;
+
+ __asm __volatile(
+ "ldp q0, q1, [%2, #16 * 0]\n"
+ "ldp q2, q3, [%2, #16 * 2]\n"
+ "ldp q4, q5, [%2, #16 * 4]\n"
+ "ldp q6, q7, [%2, #16 * 6]\n"
+ "ldp q8, q9, [%2, #16 * 8]\n"
+ "ldp q10, q11, [%2, #16 * 10]\n"
+ "ldp q12, q13, [%2, #16 * 12]\n"
+ "ldp q14, q15, [%2, #16 * 14]\n"
+ "ldp q16, q17, [%2, #16 * 16]\n"
+ "ldp q18, q19, [%2, #16 * 18]\n"
+ "ldp q20, q21, [%2, #16 * 20]\n"
+ "ldp q22, q23, [%2, #16 * 22]\n"
+ "ldp q24, q25, [%2, #16 * 24]\n"
+ "ldp q26, q27, [%2, #16 * 26]\n"
+ "ldp q28, q29, [%2, #16 * 28]\n"
+ "ldp q30, q31, [%2, #16 * 30]\n"
+ "msr fpcr, %0 \n"
+ "msr fpsr, %1 \n"
+ : : "r"(fpcr), "r"(fpsr), "r"(vfp_state));
+
+ PCPU_SET(fpcurthread, curthread);
+ curpcb->pcb_vfpcpu = cpu;
+ }
+
+ critical_exit();
+}
+
+void
+vfp_init(void)
+{
+ uint64_t pfr;
+
+ /* Check if there is a vfp unit present */
+ pfr = READ_SPECIALREG(id_aa64pfr0_el1);
+ if ((pfr & ID_AA64PFR0_FP_MASK) == ID_AA64PFR0_FP_NONE)
+ return;
+
+ /* Disable to be enabled when it's used */
+ vfp_disable();
+}
+
+SYSINIT(vfp, SI_SUB_CPU, SI_ORDER_ANY, vfp_init, NULL);
+
+#endif
diff --git a/sys/arm64/arm64/vm_machdep.c b/sys/arm64/arm64/vm_machdep.c
new file mode 100644
index 0000000..11591f0
--- /dev/null
+++ b/sys/arm64/arm64/vm_machdep.c
@@ -0,0 +1,265 @@
+/*-
+ * Copyright (c) 2014 Andrew Turner
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/limits.h>
+#include <sys/proc.h>
+#include <sys/sf_buf.h>
+#include <sys/signal.h>
+#include <sys/unistd.h>
+
+#include <vm/vm.h>
+#include <vm/vm_page.h>
+#include <vm/vm_map.h>
+#include <vm/uma.h>
+#include <vm/uma_int.h>
+
+#include <machine/armreg.h>
+#include <machine/cpu.h>
+#include <machine/pcb.h>
+#include <machine/frame.h>
+
+#ifdef VFP
+#include <machine/vfp.h>
+#endif
+
+/*
+ * Finish a fork operation, with process p2 nearly set up.
+ * Copy and update the pcb, set up the stack so that the child
+ * ready to run and return to user mode.
+ */
+void
+cpu_fork(struct thread *td1, struct proc *p2, struct thread *td2, int flags)
+{
+ struct pcb *pcb2;
+ struct trapframe *tf;
+
+ if ((flags & RFPROC) == 0)
+ return;
+
+ if (td1 == curthread) {
+ /*
+ * Save the tpidr_el0 and the vfp state, these normally happen
+ * in cpu_switch, but if userland changes these then forks
+ * this may not have happened.
+ */
+ td1->td_pcb->pcb_tpidr_el0 = READ_SPECIALREG(tpidr_el0);
+#ifdef VFP
+ if ((td1->td_pcb->pcb_fpflags & PCB_FP_STARTED) != 0)
+ vfp_save_state(td1);
+#endif
+ }
+
+ pcb2 = (struct pcb *)(td2->td_kstack +
+ td2->td_kstack_pages * PAGE_SIZE) - 1;
+
+ td2->td_pcb = pcb2;
+ bcopy(td1->td_pcb, pcb2, sizeof(*pcb2));
+
+ td2->td_pcb->pcb_l1addr =
+ vtophys(vmspace_pmap(td2->td_proc->p_vmspace)->pm_l1);
+
+ tf = (struct trapframe *)STACKALIGN((struct trapframe *)pcb2 - 1);
+ bcopy(td1->td_frame, tf, sizeof(*tf));
+ tf->tf_x[0] = 0;
+ tf->tf_x[1] = 0;
+ tf->tf_spsr = 0;
+
+ td2->td_frame = tf;
+
+ /* Set the return value registers for fork() */
+ td2->td_pcb->pcb_x[8] = (uintptr_t)fork_return;
+ td2->td_pcb->pcb_x[9] = (uintptr_t)td2;
+ td2->td_pcb->pcb_x[PCB_LR] = (uintptr_t)fork_trampoline;
+ td2->td_pcb->pcb_sp = (uintptr_t)td2->td_frame;
+ td2->td_pcb->pcb_vfpcpu = UINT_MAX;
+
+ /* Setup to release spin count in fork_exit(). */
+ td2->td_md.md_spinlock_count = 1;
+ td2->td_md.md_saved_daif = 0;
+}
+
+void
+cpu_reset(void)
+{
+
+ printf("cpu_reset");
+ while(1)
+ __asm volatile("wfi" ::: "memory");
+}
+
+void
+cpu_thread_swapin(struct thread *td)
+{
+}
+
+void
+cpu_thread_swapout(struct thread *td)
+{
+}
+
+void
+cpu_set_syscall_retval(struct thread *td, int error)
+{
+ struct trapframe *frame;
+
+ frame = td->td_frame;
+
+ switch (error) {
+ case 0:
+ frame->tf_x[0] = td->td_retval[0];
+ frame->tf_x[1] = td->td_retval[1];
+ frame->tf_spsr &= ~PSR_C; /* carry bit */
+ break;
+ case ERESTART:
+ frame->tf_elr -= 4;
+ break;
+ case EJUSTRETURN:
+ break;
+ default:
+ frame->tf_spsr |= PSR_C; /* carry bit */
+ frame->tf_x[0] = error;
+ break;
+ }
+}
+
+/*
+ * Initialize machine state (pcb and trap frame) for a new thread about to
+ * upcall. Put enough state in the new thread's PCB to get it to go back
+ * userret(), where we can intercept it again to set the return (upcall)
+ * Address and stack, along with those from upcals that are from other sources
+ * such as those generated in thread_userret() itself.
+ */
+void
+cpu_set_upcall(struct thread *td, struct thread *td0)
+{
+ bcopy(td0->td_frame, td->td_frame, sizeof(struct trapframe));
+ bcopy(td0->td_pcb, td->td_pcb, sizeof(struct pcb));
+
+ td->td_pcb->pcb_x[8] = (uintptr_t)fork_return;
+ td->td_pcb->pcb_x[9] = (uintptr_t)td;
+ td->td_pcb->pcb_x[PCB_LR] = (uintptr_t)fork_trampoline;
+ td->td_pcb->pcb_sp = (uintptr_t)td->td_frame;
+ td->td_pcb->pcb_vfpcpu = UINT_MAX;
+
+ /* Setup to release spin count in fork_exit(). */
+ td->td_md.md_spinlock_count = 1;
+ td->td_md.md_saved_daif = 0;
+}
+
+/*
+ * Set that machine state for performing an upcall that has to
+ * be done in thread_userret() so that those upcalls generated
+ * in thread_userret() itself can be done as well.
+ */
+void
+cpu_set_upcall_kse(struct thread *td, void (*entry)(void *), void *arg,
+ stack_t *stack)
+{
+
+ panic("cpu_set_upcall_kse");
+}
+
+int
+cpu_set_user_tls(struct thread *td, void *tls_base)
+{
+
+ panic("cpu_set_user_tls");
+}
+
+void
+cpu_thread_exit(struct thread *td)
+{
+}
+
+void
+cpu_thread_alloc(struct thread *td)
+{
+
+ td->td_pcb = (struct pcb *)(td->td_kstack +
+ td->td_kstack_pages * PAGE_SIZE) - 1;
+ td->td_frame = (struct trapframe *)STACKALIGN(
+ td->td_pcb - 1);
+}
+
+void
+cpu_thread_free(struct thread *td)
+{
+}
+
+void
+cpu_thread_clean(struct thread *td)
+{
+}
+
+/*
+ * Intercept the return address from a freshly forked process that has NOT
+ * been scheduled yet.
+ *
+ * This is needed to make kernel threads stay in kernel mode.
+ */
+void
+cpu_set_fork_handler(struct thread *td, void (*func)(void *), void *arg)
+{
+
+ td->td_pcb->pcb_x[8] = (uintptr_t)func;
+ td->td_pcb->pcb_x[9] = (uintptr_t)arg;
+ td->td_pcb->pcb_x[PCB_LR] = (uintptr_t)fork_trampoline;
+ td->td_pcb->pcb_sp = (uintptr_t)td->td_frame;
+ td->td_pcb->pcb_vfpcpu = UINT_MAX;
+}
+
+void
+cpu_exit(struct thread *td)
+{
+}
+
+void
+swi_vm(void *v)
+{
+
+ /* Nothing to do here - busdma bounce buffers are not implemented. */
+}
+
+void *
+uma_small_alloc(uma_zone_t zone, vm_size_t bytes, u_int8_t *flags, int wait)
+{
+
+ panic("uma_small_alloc");
+}
+
+void
+uma_small_free(void *mem, vm_size_t size, u_int8_t flags)
+{
+
+ panic("uma_small_free");
+}
+
diff --git a/sys/arm64/conf/DEFAULTS b/sys/arm64/conf/DEFAULTS
new file mode 100644
index 0000000..8f6d58f
--- /dev/null
+++ b/sys/arm64/conf/DEFAULTS
@@ -0,0 +1,14 @@
+#
+# DEFAULTS -- Default kernel configuration file for FreeBSD/arm64
+#
+# $FreeBSD$
+
+machine arm64 aarch64
+
+# Pseudo devices.
+device mem # Memory and kernel memory devices
+
+# Default partitioning schemes
+options GEOM_PART_BSD
+options GEOM_PART_MBR
+
diff --git a/sys/arm64/conf/GENERIC b/sys/arm64/conf/GENERIC
new file mode 100644
index 0000000..8aca411
--- /dev/null
+++ b/sys/arm64/conf/GENERIC
@@ -0,0 +1,94 @@
+#
+# GENERIC -- Generic kernel configuration file for FreeBSD/arm64
+#
+# For more information on this file, please read the config(5) manual page,
+# and/or the handbook section on Kernel Configuration Files:
+#
+# http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig-config.html
+#
+# The handbook is also available locally in /usr/share/doc/handbook
+# if you've installed the doc distribution, otherwise always see the
+# FreeBSD World Wide Web server (http://www.FreeBSD.org/) for the
+# latest information.
+#
+# An exhaustive list of options and more detailed explanations of the
+# device lines is also present in the ../../conf/NOTES and NOTES files.
+# If you are in doubt as to the purpose or necessity of a line, check first
+# in NOTES.
+#
+# $FreeBSD$
+
+cpu ARM64
+ident GENERIC
+
+makeoptions DEBUG=-g # Build kernel with gdb(1) debug symbols
+makeoptions NO_MODULES=1 # We don't yet support modules on arm64
+
+options SCHED_ULE # ULE scheduler
+options PREEMPTION # Enable kernel thread preemption
+options INET # InterNETworking
+options INET6 # IPv6 communications protocols
+options TCP_OFFLOAD # TCP offload
+options SCTP # Stream Control Transmission Protocol
+options FFS # Berkeley Fast Filesystem
+options SOFTUPDATES # Enable FFS soft updates support
+options UFS_ACL # Support for access control lists
+options UFS_DIRHASH # Improve performance on big directories
+options UFS_GJOURNAL # Enable gjournal-based UFS journaling
+options QUOTA # Enable disk quotas for UFS
+options MD_ROOT # MD is a potential root device
+options NFSCL # New Network Filesystem Client
+options NFSD # New Network Filesystem Server
+options NFSLOCKD # Network Lock Manager
+options NFS_ROOT # NFS usable as /, requires NFSCL
+options MSDOSFS # MSDOS Filesystem
+options CD9660 # ISO 9660 Filesystem
+options PROCFS # Process filesystem (requires PSEUDOFS)
+options PSEUDOFS # Pseudo-filesystem framework
+options GEOM_PART_GPT # GUID Partition Tables.
+options GEOM_RAID # Soft RAID functionality.
+options GEOM_LABEL # Provides labelization
+options SCSI_DELAY=5000 # Delay (in ms) before probing SCSI
+options KTRACE # ktrace(1) support
+options STACK # stack(9) support
+options SYSVSHM # SYSV-style shared memory
+options SYSVMSG # SYSV-style message queues
+options SYSVSEM # SYSV-style semaphores
+options _KPOSIX_PRIORITY_SCHEDULING # POSIX P1003_1B real-time extensions
+options PRINTF_BUFR_SIZE=128 # Prevent printf output being interspersed.
+options KBD_INSTALL_CDEV # install a CDEV entry in /dev
+options HWPMC_HOOKS # Necessary kernel hooks for hwpmc(4)
+options AUDIT # Security event auditing
+options CAPABILITY_MODE # Capsicum capability mode
+options CAPABILITIES # Capsicum capabilities
+options MAC # TrustedBSD MAC Framework
+options KDTRACE_FRAME # Ensure frames are compiled in
+options KDTRACE_HOOKS # Kernel DTrace hooks
+options VFP # Floating-point support
+
+device virtio
+device virtio_mmio
+device virtio_blk
+device vtnet
+
+# Serial (COM) ports
+device uart # Generic UART driver
+device pl011
+
+# Pseudo devices.
+device loop # Network loopback
+device random # Entropy device
+device ether # Ethernet support
+device vlan # 802.1Q VLAN support
+device tun # Packet tunnel.
+device md # Memory "disks"
+device gif # IPv6 and IPv4 tunneling
+device firmware # firmware assist module
+device psci # Support for ARM PSCI
+
+# The `bpf' device enables the Berkeley Packet Filter.
+# Be aware of the administrative consequences of enabling this!
+# Note that 'bpf' is required for DHCP.
+device bpf # Berkeley packet filter
+
+options FDT
diff --git a/sys/arm64/include/_bus.h b/sys/arm64/include/_bus.h
new file mode 100644
index 0000000..f11991f
--- /dev/null
+++ b/sys/arm64/include/_bus.h
@@ -0,0 +1,46 @@
+/*-
+ * Copyright (c) 2005 M. Warner Losh.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions, and the following disclaimer,
+ * without modification, immediately at the beginning of the file.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _MACHINE__BUS_H_
+#define _MACHINE__BUS_H_
+
+/*
+ * Addresses (in bus space).
+ */
+typedef u_long bus_addr_t;
+typedef u_long bus_size_t;
+
+/*
+ * Access methods for bus space.
+ */
+typedef u_long bus_space_handle_t;
+typedef struct bus_space *bus_space_tag_t;
+
+#endif /* !_MACHINE__BUS_H_ */
diff --git a/sys/arm64/include/armreg.h b/sys/arm64/include/armreg.h
new file mode 100644
index 0000000..51063bb
--- /dev/null
+++ b/sys/arm64/include/armreg.h
@@ -0,0 +1,194 @@
+/*-
+ * Copyright (c) 2013, 2014 Andrew Turner
+ * Copyright (c) 2015 The FreeBSD Foundation
+ * All rights reserved.
+ *
+ * This software was developed by Andrew Turner under
+ * sponsorship from the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _MACHINE_ARMREG_H_
+#define _MACHINE_ARMREG_H_
+
+#define READ_SPECIALREG(reg) \
+({ uint64_t val; \
+ __asm __volatile("mrs %0, " __STRING(reg) : "=&r" (val)); \
+ val; \
+})
+#define WRITE_SPECIALREG(reg, val) \
+ __asm __volatile("msr " __STRING(reg) ", %0" : : "r"((uint64_t)val))
+
+/* CPACR_EL1 */
+#define CPACR_FPEN_MASK (0x3 << 20)
+#define CPACR_FPEN_TRAP_ALL1 (0x0 << 20) /* Traps from EL0 and EL1 */
+#define CPACR_FPEN_TRAP_EL0 (0x1 << 20) /* Traps from EL0 */
+#define CPACR_FPEN_TRAP_ALL2 (0x2 << 20) /* Traps from EL0 and EL1 */
+#define CPACR_FPEN_TRAP_NONE (0x3 << 20) /* No traps */
+#define CPACR_TTA (0x1 << 28)
+
+/* CTR_EL0 - Cache Type Register */
+#define CTR_DLINE_SHIFT 16
+#define CTR_DLINE_MASK (0xf << CTR_DLINE_SHIFT)
+#define CTR_DLINE_SIZE(reg) (((reg) & CTR_DLINE_MASK) >> CTR_DLINE_SHIFT)
+#define CTR_ILINE_SHIFT 0
+#define CTR_ILINE_MASK (0xf << CTR_ILINE_SHIFT)
+#define CTR_ILINE_SIZE(reg) (((reg) & CTR_ILINE_MASK) >> CTR_ILINE_SHIFT)
+
+/* ESR_ELx */
+#define ESR_ELx_ISS_MASK 0x00ffffff
+#define ISS_INSN_FnV (0x01 << 10)
+#define ISS_INSN_EA (0x01 << 9)
+#define ISS_INSN_S1PTW (0x01 << 7)
+#define ISS_INSN_IFSC_MASK (0x1f << 0)
+#define ISS_DATA_ISV (0x01 << 24)
+#define ISS_DATA_SAS_MASK (0x03 << 22)
+#define ISS_DATA_SSE (0x01 << 21)
+#define ISS_DATA_SRT_MASK (0x1f << 16)
+#define ISS_DATA_SF (0x01 << 15)
+#define ISS_DATA_AR (0x01 << 14)
+#define ISS_DATA_FnV (0x01 << 10)
+#define ISS_DATa_EA (0x01 << 9)
+#define ISS_DATa_CM (0x01 << 8)
+#define ISS_INSN_S1PTW (0x01 << 7)
+#define ISS_DATa_WnR (0x01 << 6)
+#define ISS_DATA_DFSC_MASK (0x1f << 0)
+#define ESR_ELx_IL (0x01 << 25)
+#define ESR_ELx_EC_SHIFT 26
+#define ESR_ELx_EC_MASK (0x3f << 26)
+#define ESR_ELx_EXCEPTION(esr) (((esr) & ESR_ELx_EC_MASK) >> ESR_ELx_EC_SHIFT)
+#define EXCP_UNKNOWN 0x00 /* Unkwn exception */
+#define EXCP_FP_SIMD 0x07 /* VFP/SIMD trap */
+#define EXCP_ILL_STATE 0x0e /* Illegal execution state */
+#define EXCP_SVC 0x15 /* SVC trap */
+#define EXCP_MSR 0x18 /* MSR/MRS trap */
+#define EXCP_INSN_ABORT_L 0x20 /* Instruction abort, from lower EL */
+#define EXCP_INSN_ABORT 0x21 /* Instruction abort, from same EL */
+#define EXCP_PC_ALIGN 0x22 /* PC alignment fault */
+#define EXCP_DATA_ABORT_L 0x24 /* Data abort, from lower EL */
+#define EXCP_DATA_ABORT 0x25 /* Data abort, from same EL */
+#define EXCP_SP_ALIGN 0x26 /* SP slignment fault */
+#define EXCP_TRAP_FP 0x2c /* Trapped FP exception */
+#define EXCP_SERROR 0x2f /* SError interrupt */
+#define EXCP_SOFTSTP_EL1 0x33 /* Software Step, from same EL */
+#define EXCP_WATCHPT_EL1 0x35 /* Watchpoint, from same EL */
+#define EXCP_BRK 0x3c /* Breakpoint */
+
+/* ID_AA64PFR0_EL1 */
+#define ID_AA64PFR0_EL0_MASK (0xf << 0)
+#define ID_AA64PFR0_EL1_MASK (0xf << 4)
+#define ID_AA64PFR0_EL2_MASK (0xf << 8)
+#define ID_AA64PFR0_EL3_MASK (0xf << 12)
+#define ID_AA64PFR0_FP_MASK (0xf << 16)
+#define ID_AA64PFR0_FP_IMPL (0x0 << 16) /* Floating-point implemented */
+#define ID_AA64PFR0_FP_NONE (0xf << 16) /* Floating-point not implemented */
+#define ID_AA64PFR0_ADV_SIMD_MASK (0xf << 20)
+#define ID_AA64PFR0_GIC_MASK (0xf << 24)
+
+/* MAIR_EL1 - Memory Attribute Indirection Register */
+#define MAIR_ATTR_MASK(idx) (0xff << ((n)* 8))
+#define MAIR_ATTR(attr, idx) ((attr) << ((idx) * 8))
+
+/* SCTLR_EL1 - System Control Register */
+#define SCTLR_RES0 0xc8222400 /* Reserved, write 0 */
+#define SCTLR_RES1 0x30d00800 /* Reserved, write 1 */
+
+#define SCTLR_M 0x00000001
+#define SCTLR_A 0x00000002
+#define SCTLR_C 0x00000004
+#define SCTLR_SA 0x00000008
+#define SCTLR_SA0 0x00000010
+#define SCTLR_CP15BEN 0x00000020
+#define SCTLR_THEE 0x00000040
+#define SCTLR_ITD 0x00000080
+#define SCTLR_SED 0x00000100
+#define SCTLR_UMA 0x00000200
+#define SCTLR_I 0x00001000
+#define SCTLR_DZE 0x00004000
+#define SCTLR_UCT 0x00008000
+#define SCTLR_nTWI 0x00010000
+#define SCTLR_nTWE 0x00040000
+#define SCTLR_WXN 0x00080000
+#define SCTLR_EOE 0x01000000
+#define SCTLR_EE 0x02000000
+#define SCTLR_UCI 0x04000000
+
+/* SPSR_EL1 */
+/*
+ * When the exception is taken in AArch64:
+ * M[4] is 0 for AArch64 mode
+ * M[3:2] is the exception level
+ * M[1] is unused
+ * M[0] is the SP select:
+ * 0: always SP0
+ * 1: current ELs SP
+ */
+#define PSR_M_EL0t 0x00000000
+#define PSR_M_EL1t 0x00000004
+#define PSR_M_EL1h 0x00000005
+#define PSR_M_EL2t 0x00000008
+#define PSR_M_EL2h 0x00000009
+#define PSR_M_MASK 0x0000001f
+
+#define PSR_F 0x00000040
+#define PSR_I 0x00000080
+#define PSR_A 0x00000100
+#define PSR_D 0x00000200
+#define PSR_IL 0x00100000
+#define PSR_SS 0x00200000
+#define PSR_V 0x10000000
+#define PSR_C 0x20000000
+#define PSR_Z 0x40000000
+#define PSR_N 0x80000000
+
+/* TCR_EL1 - Translation Control Register */
+#define TCR_ASID_16 (1 << 36)
+
+#define TCR_IPS_SHIFT 32
+#define TCR_IPS_32BIT (0 << TCR_IPS_SHIFT)
+#define TCR_IPS_36BIT (1 << TCR_IPS_SHIFT)
+#define TCR_IPS_40BIT (2 << TCR_IPS_SHIFT)
+#define TCR_IPS_42BIT (3 << TCR_IPS_SHIFT)
+#define TCR_IPS_44BIT (4 << TCR_IPS_SHIFT)
+#define TCR_IPS_48BIT (5 << TCR_IPS_SHIFT)
+
+#define TCR_TG1_SHIFT 30
+#define TCR_TG1_16K (1 << TCR_TG1_SHIFT)
+#define TCR_TG1_4K (2 << TCR_TG1_SHIFT)
+#define TCR_TG1_64K (3 << TCR_TG1_SHIFT)
+
+#define TCR_T1SZ_SHIFT 16
+#define TCR_T0SZ_SHIFT 0
+#define TCR_TxSZ(x) (((x) << TCR_T1SZ_SHIFT) | ((x) << TCR_T0SZ_SHIFT))
+
+/* Saved Program Status Register */
+#define DBG_SPSR_SS (0x1 << 21)
+
+/* Monitor Debug System Control Register */
+#define DBG_MDSCR_SS (0x1 << 0)
+#define DBG_MDSCR_KDE (0x1 << 13)
+#define DBG_MDSCR_MDE (0x1 << 15)
+
+#endif /* !_MACHINE_ARMREG_H_ */
diff --git a/sys/arm64/include/atomic.h b/sys/arm64/include/atomic.h
index 366ae02..f0f6c17 100644
--- a/sys/arm64/include/atomic.h
+++ b/sys/arm64/include/atomic.h
@@ -160,7 +160,6 @@ atomic_subtract_32(volatile uint32_t *p, uint32_t val)
#define atomic_set_int atomic_set_32
#define atomic_subtract_int atomic_subtract_32
-
static __inline void
atomic_add_acq_32(volatile uint32_t *p, uint32_t val)
{
@@ -170,7 +169,7 @@ atomic_add_acq_32(volatile uint32_t *p, uint32_t val)
__asm __volatile(
"1: ldaxr %w0, [%2] \n"
" add %w0, %w0, %w3 \n"
- " stlxr %w1, %w0, [%2] \n"
+ " stxr %w1, %w0, [%2] \n"
" cbnz %w1, 1b \n"
"2:"
: "=&r"(tmp), "=&r"(res), "+r" (p), "+r" (val) : : "cc", "memory"
@@ -186,7 +185,7 @@ atomic_clear_acq_32(volatile uint32_t *p, uint32_t val)
__asm __volatile(
"1: ldaxr %w0, [%2] \n"
" bic %w0, %w0, %w3 \n"
- " stlxr %w1, %w0, [%2] \n"
+ " stxr %w1, %w0, [%2] \n"
" cbnz %w1, 1b \n"
: "=&r"(tmp), "=&r"(res), "+r" (p), "+r" (val) : : "cc", "memory"
);
@@ -203,7 +202,7 @@ atomic_cmpset_acq_32(volatile uint32_t *p, uint32_t cmpval, uint32_t newval)
" ldaxr %w0, [%2] \n"
" cmp %w0, %w3 \n"
" b.ne 2f \n"
- " stlxr %w1, %w4, [%2] \n"
+ " stxr %w1, %w4, [%2] \n"
" cbnz %w1, 1b \n"
"2:"
: "=&r"(tmp), "=&r"(res), "+r" (p), "+r" (cmpval), "+r" (newval)
@@ -218,8 +217,9 @@ atomic_load_acq_32(volatile uint32_t *p)
{
uint32_t ret;
- ret = *p;
- dmb();
+ __asm __volatile(
+ "ldar %w0, [%1] \n"
+ : "=&r" (ret) : "r" (p) : "memory");
return (ret);
}
@@ -233,7 +233,7 @@ atomic_set_acq_32(volatile uint32_t *p, uint32_t val)
__asm __volatile(
"1: ldaxr %w0, [%2] \n"
" orr %w0, %w0, %w3 \n"
- " stlxr %w1, %w0, [%2] \n"
+ " stxr %w1, %w0, [%2] \n"
" cbnz %w1, 1b \n"
: "=&r"(tmp), "=&r"(res), "+r" (p), "+r" (val) : : "cc", "memory"
);
@@ -248,6 +248,82 @@ atomic_subtract_acq_32(volatile uint32_t *p, uint32_t val)
__asm __volatile(
"1: ldaxr %w0, [%2] \n"
" sub %w0, %w0, %w3 \n"
+ " stxr %w1, %w0, [%2] \n"
+ " cbnz %w1, 1b \n"
+ : "=&r"(tmp), "=&r"(res), "+r" (p), "+r" (val) : : "cc", "memory"
+ );
+}
+
+#define atomic_add_acq_int atomic_add_acq_32
+#define atomic_clear_acq_int atomic_clear_acq_32
+#define atomic_cmpset_acq_int atomic_cmpset_acq_32
+#define atomic_load_acq_int atomic_load_acq_32
+#define atomic_set_acq_int atomic_set_acq_32
+#define atomic_subtract_acq_int atomic_subtract_acq_32
+
+/* The atomic functions currently are both acq and rel, we should fix this. */
+
+static __inline void
+atomic_add_rel_32(volatile uint32_t *p, uint32_t val)
+{
+ uint32_t tmp;
+ int res;
+
+ __asm __volatile(
+ "1: ldxr %w0, [%2] \n"
+ " add %w0, %w0, %w3 \n"
+ " stlxr %w1, %w0, [%2] \n"
+ " cbnz %w1, 1b \n"
+ "2:"
+ : "=&r"(tmp), "=&r"(res), "+r" (p), "+r" (val) : : "cc", "memory"
+ );
+}
+
+static __inline void
+atomic_clear_rel_32(volatile uint32_t *p, uint32_t val)
+{
+ uint32_t tmp;
+ int res;
+
+ __asm __volatile(
+ "1: ldxr %w0, [%2] \n"
+ " bic %w0, %w0, %w3 \n"
+ " stlxr %w1, %w0, [%2] \n"
+ " cbnz %w1, 1b \n"
+ : "=&r"(tmp), "=&r"(res), "+r" (p), "+r" (val) : : "cc", "memory"
+ );
+}
+
+static __inline int
+atomic_cmpset_rel_32(volatile uint32_t *p, uint32_t cmpval, uint32_t newval)
+{
+ uint32_t tmp;
+ int res;
+
+ __asm __volatile(
+ "1: mov %w1, #1 \n"
+ " ldxr %w0, [%2] \n"
+ " cmp %w0, %w3 \n"
+ " b.ne 2f \n"
+ " stlxr %w1, %w4, [%2] \n"
+ " cbnz %w1, 1b \n"
+ "2:"
+ : "=&r"(tmp), "=&r"(res), "+r" (p), "+r" (cmpval), "+r" (newval)
+ : : "cc", "memory"
+ );
+
+ return (!res);
+}
+
+static __inline void
+atomic_set_rel_32(volatile uint32_t *p, uint32_t val)
+{
+ uint32_t tmp;
+ int res;
+
+ __asm __volatile(
+ "1: ldxr %w0, [%2] \n"
+ " orr %w0, %w0, %w3 \n"
" stlxr %w1, %w0, [%2] \n"
" cbnz %w1, 1b \n"
: "=&r"(tmp), "=&r"(res), "+r" (p), "+r" (val) : : "cc", "memory"
@@ -258,23 +334,25 @@ static __inline void
atomic_store_rel_32(volatile uint32_t *p, uint32_t val)
{
- dmb();
- *p = val;
+ __asm __volatile(
+ "stlr %w0, [%1] \n"
+ : : "r" (val), "r" (p) : "memory");
}
-#define atomic_add_acq_int atomic_add_acq_32
-#define atomic_clear_acq_int atomic_add_acq_32
-#define atomic_cmpset_acq_int atomic_cmpset_acq_32
-#define atomic_load_acq_int atomic_load_acq_32
-#define atomic_set_acq_int atomic_set_acq_32
-#define atomic_subtract_acq_int atomic_subtract_acq_32
+static __inline void
+atomic_subtract_rel_32(volatile uint32_t *p, uint32_t val)
+{
+ uint32_t tmp;
+ int res;
-/* The atomic functions currently are both acq and rel, we should fix this. */
-#define atomic_add_rel_32 atomic_add_acq_32
-#define atomic_clear_rel_32 atomic_add_acq_32
-#define atomic_cmpset_rel_32 atomic_cmpset_acq_32
-#define atomic_set_rel_32 atomic_set_acq_32
-#define atomic_subtract_rel_32 atomic_subtract_acq_32
+ __asm __volatile(
+ "1: ldxr %w0, [%2] \n"
+ " sub %w0, %w0, %w3 \n"
+ " stlxr %w1, %w0, [%2] \n"
+ " cbnz %w1, 1b \n"
+ : "=&r"(tmp), "=&r"(res), "+r" (p), "+r" (val) : : "cc", "memory"
+ );
+}
#define atomic_add_rel_int atomic_add_rel_32
#define atomic_clear_rel_int atomic_add_rel_32
@@ -440,7 +518,7 @@ atomic_add_acq_64(volatile uint64_t *p, uint64_t val)
__asm __volatile(
"1: ldaxr %0, [%2] \n"
" add %0, %0, %3 \n"
- " stlxr %w1, %0, [%2] \n"
+ " stxr %w1, %0, [%2] \n"
" cbnz %w1, 1b \n"
"2:"
: "=&r"(tmp), "=&r"(res), "+r" (p), "+r" (val) : : "cc", "memory"
@@ -456,7 +534,7 @@ atomic_clear_acq_64(volatile uint64_t *p, uint64_t val)
__asm __volatile(
"1: ldaxr %0, [%2] \n"
" bic %0, %0, %3 \n"
- " stlxr %w1, %0, [%2] \n"
+ " stxr %w1, %0, [%2] \n"
" cbnz %w1, 1b \n"
: "=&r"(tmp), "=&r"(res), "+r" (p), "+r" (val) : : "cc", "memory"
);
@@ -473,7 +551,7 @@ atomic_cmpset_acq_64(volatile uint64_t *p, uint64_t cmpval, uint64_t newval)
" ldaxr %0, [%2] \n"
" cmp %0, %3 \n"
" b.ne 2f \n"
- " stlxr %w1, %4, [%2] \n"
+ " stxr %w1, %4, [%2] \n"
" cbnz %w1, 1b \n"
"2:"
: "=&r" (tmp), "=&r" (res), "+r" (p), "+r" (cmpval), "+r" (newval)
@@ -488,8 +566,9 @@ atomic_load_acq_64(volatile uint64_t *p)
{
uint64_t ret;
- ret = *p;
- dmb();
+ __asm __volatile(
+ "ldar %0, [%1] \n"
+ : "=&r" (ret) : "r" (p) : "memory");
return (ret);
}
@@ -503,7 +582,7 @@ atomic_set_acq_64(volatile uint64_t *p, uint64_t val)
__asm __volatile(
"1: ldaxr %0, [%2] \n"
" orr %0, %0, %3 \n"
- " stlxr %w1, %0, [%2] \n"
+ " stxr %w1, %0, [%2] \n"
" cbnz %w1, 1b \n"
: "=&r"(tmp), "=&r"(res), "+r" (p), "+r" (val) : : "cc", "memory"
);
@@ -518,20 +597,12 @@ atomic_subtract_acq_64(volatile uint64_t *p, uint64_t val)
__asm __volatile(
"1: ldaxr %0, [%2] \n"
" sub %0, %0, %3 \n"
- " stlxr %w1, %0, [%2] \n"
+ " stxr %w1, %0, [%2] \n"
" cbnz %w1, 1b \n"
: "=&r"(tmp), "=&r"(res), "+r" (p), "+r" (val) : : "cc", "memory"
);
}
-static __inline void
-atomic_store_rel_64(volatile uint64_t *p, uint64_t val)
-{
-
- dmb();
- *p = val;
-}
-
#define atomic_add_acq_long atomic_add_acq_64
#define atomic_clear_acq_long atomic_add_acq_64
#define atomic_cmpset_acq_long atomic_cmpset_acq_64
@@ -550,21 +621,106 @@ atomic_store_rel_64(volatile uint64_t *p, uint64_t val)
* TODO: The atomic functions currently are both acq and rel, we should fix
* this.
*/
-#define atomic_add_rel_64 atomic_add_acq_64
-#define atomic_clear_rel_64 atomic_add_acq_64
-#define atomic_cmpset_rel_64 atomic_cmpset_acq_64
-#define atomic_set_rel_64 atomic_set_acq_64
-#define atomic_subtract_rel_64 atomic_subtract_acq_64
+static __inline void
+atomic_add_rel_64(volatile uint64_t *p, uint64_t val)
+{
+ uint64_t tmp;
+ int res;
+
+ __asm __volatile(
+ "1: ldxr %0, [%2] \n"
+ " add %0, %0, %3 \n"
+ " stlxr %w1, %0, [%2] \n"
+ " cbnz %w1, 1b \n"
+ "2:"
+ : "=&r"(tmp), "=&r"(res), "+r" (p), "+r" (val) : : "cc", "memory"
+ );
+}
+
+static __inline void
+atomic_clear_rel_64(volatile uint64_t *p, uint64_t val)
+{
+ uint64_t tmp;
+ int res;
+
+ __asm __volatile(
+ "1: ldxr %0, [%2] \n"
+ " bic %0, %0, %3 \n"
+ " stlxr %w1, %0, [%2] \n"
+ " cbnz %w1, 1b \n"
+ : "=&r"(tmp), "=&r"(res), "+r" (p), "+r" (val) : : "cc", "memory"
+ );
+}
+
+static __inline int
+atomic_cmpset_rel_64(volatile uint64_t *p, uint64_t cmpval, uint64_t newval)
+{
+ uint64_t tmp;
+ int res;
+
+ __asm __volatile(
+ "1: mov %w1, #1 \n"
+ " ldxr %0, [%2] \n"
+ " cmp %0, %3 \n"
+ " b.ne 2f \n"
+ " stlxr %w1, %4, [%2] \n"
+ " cbnz %w1, 1b \n"
+ "2:"
+ : "=&r" (tmp), "=&r" (res), "+r" (p), "+r" (cmpval), "+r" (newval)
+ : : "cc", "memory"
+ );
+
+ return (!res);
+}
+
+static __inline void
+atomic_set_rel_64(volatile uint64_t *p, uint64_t val)
+{
+ uint64_t tmp;
+ int res;
+
+ __asm __volatile(
+ "1: ldxr %0, [%2] \n"
+ " orr %0, %0, %3 \n"
+ " stlxr %w1, %0, [%2] \n"
+ " cbnz %w1, 1b \n"
+ : "=&r"(tmp), "=&r"(res), "+r" (p), "+r" (val) : : "cc", "memory"
+ );
+}
+
+static __inline void
+atomic_store_rel_64(volatile uint64_t *p, uint64_t val)
+{
+
+ __asm __volatile(
+ "stlr %0, [%1] \n"
+ : : "r" (val), "r" (p) : "memory");
+}
+
+static __inline void
+atomic_subtract_rel_64(volatile uint64_t *p, uint64_t val)
+{
+ uint64_t tmp;
+ int res;
+
+ __asm __volatile(
+ "1: ldxr %0, [%2] \n"
+ " sub %0, %0, %3 \n"
+ " stlxr %w1, %0, [%2] \n"
+ " cbnz %w1, 1b \n"
+ : "=&r"(tmp), "=&r"(res), "+r" (p), "+r" (val) : : "cc", "memory"
+ );
+}
#define atomic_add_rel_long atomic_add_rel_64
-#define atomic_clear_rel_long atomic_add_rel_64
+#define atomic_clear_rel_long atomic_clear_rel_64
#define atomic_cmpset_rel_long atomic_cmpset_rel_64
#define atomic_set_rel_long atomic_set_rel_64
#define atomic_subtract_rel_long atomic_subtract_rel_64
#define atomic_store_rel_long atomic_store_rel_64
#define atomic_add_rel_ptr atomic_add_rel_64
-#define atomic_clear_rel_ptr atomic_add_rel_64
+#define atomic_clear_rel_ptr atomic_clear_rel_64
#define atomic_cmpset_rel_ptr atomic_cmpset_rel_64
#define atomic_set_rel_ptr atomic_set_rel_64
#define atomic_subtract_rel_ptr atomic_subtract_rel_64
diff --git a/sys/arm64/include/bus.h b/sys/arm64/include/bus.h
new file mode 100644
index 0000000..8aaf1d3
--- /dev/null
+++ b/sys/arm64/include/bus.h
@@ -0,0 +1,469 @@
+/* $NetBSD: bus.h,v 1.11 2003/07/28 17:35:54 thorpej Exp $ */
+
+/*-
+ * Copyright (c) 1996, 1997, 1998, 2001 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
+ * NASA Ames Research Center.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*-
+ * Copyright (c) 1996 Charles M. Hannum. All rights reserved.
+ * Copyright (c) 1996 Christopher G. Demetriou. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Christopher G. Demetriou
+ * for the NetBSD Project.
+ * 4. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * From: sys/arm/include/bus.h
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _MACHINE_BUS_H_
+#define _MACHINE_BUS_H_
+
+#include <machine/_bus.h>
+
+#define BUS_SPACE_ALIGNED_POINTER(p, t) ALIGNED_POINTER(p, t)
+
+#define BUS_SPACE_MAXADDR_24BIT 0xFFFFFFUL
+#define BUS_SPACE_MAXADDR_32BIT 0xFFFFFFFFUL
+#define BUS_SPACE_MAXSIZE_24BIT 0xFFFFFFUL
+#define BUS_SPACE_MAXSIZE_32BIT 0xFFFFFFFFUL
+
+#define BUS_SPACE_MAXADDR 0xFFFFFFFFFFFFFFFFUL
+#define BUS_SPACE_MAXSIZE 0xFFFFFFFFFFFFFFFFUL
+
+#define BUS_SPACE_MAP_CACHEABLE 0x01
+#define BUS_SPACE_MAP_LINEAR 0x02
+#define BUS_SPACE_MAP_PREFETCHABLE 0x04
+
+#define BUS_SPACE_UNRESTRICTED (~0)
+
+#define BUS_SPACE_BARRIER_READ 0x01
+#define BUS_SPACE_BARRIER_WRITE 0x02
+
+
+struct bus_space {
+ /* cookie */
+ void *bs_cookie;
+
+ /* mapping/unmapping */
+ int (*bs_map) (void *, bus_addr_t, bus_size_t,
+ int, bus_space_handle_t *);
+ void (*bs_unmap) (void *, bus_space_handle_t, bus_size_t);
+ int (*bs_subregion) (void *, bus_space_handle_t,
+ bus_size_t, bus_size_t, bus_space_handle_t *);
+
+ /* allocation/deallocation */
+ int (*bs_alloc) (void *, bus_addr_t, bus_addr_t,
+ bus_size_t, bus_size_t, bus_size_t, int,
+ bus_addr_t *, bus_space_handle_t *);
+ void (*bs_free) (void *, bus_space_handle_t,
+ bus_size_t);
+
+ /* get kernel virtual address */
+ /* barrier */
+ void (*bs_barrier) (void *, bus_space_handle_t,
+ bus_size_t, bus_size_t, int);
+
+ /* read single */
+ u_int8_t (*bs_r_1) (void *, bus_space_handle_t, bus_size_t);
+ u_int16_t (*bs_r_2) (void *, bus_space_handle_t, bus_size_t);
+ u_int32_t (*bs_r_4) (void *, bus_space_handle_t, bus_size_t);
+ u_int64_t (*bs_r_8) (void *, bus_space_handle_t, bus_size_t);
+
+ /* read multiple */
+ void (*bs_rm_1) (void *, bus_space_handle_t, bus_size_t,
+ u_int8_t *, bus_size_t);
+ void (*bs_rm_2) (void *, bus_space_handle_t, bus_size_t,
+ u_int16_t *, bus_size_t);
+ void (*bs_rm_4) (void *, bus_space_handle_t,
+ bus_size_t, u_int32_t *, bus_size_t);
+ void (*bs_rm_8) (void *, bus_space_handle_t,
+ bus_size_t, u_int64_t *, bus_size_t);
+
+ /* read region */
+ void (*bs_rr_1) (void *, bus_space_handle_t,
+ bus_size_t, u_int8_t *, bus_size_t);
+ void (*bs_rr_2) (void *, bus_space_handle_t,
+ bus_size_t, u_int16_t *, bus_size_t);
+ void (*bs_rr_4) (void *, bus_space_handle_t,
+ bus_size_t, u_int32_t *, bus_size_t);
+ void (*bs_rr_8) (void *, bus_space_handle_t,
+ bus_size_t, u_int64_t *, bus_size_t);
+
+ /* write single */
+ void (*bs_w_1) (void *, bus_space_handle_t,
+ bus_size_t, u_int8_t);
+ void (*bs_w_2) (void *, bus_space_handle_t,
+ bus_size_t, u_int16_t);
+ void (*bs_w_4) (void *, bus_space_handle_t,
+ bus_size_t, u_int32_t);
+ void (*bs_w_8) (void *, bus_space_handle_t,
+ bus_size_t, u_int64_t);
+
+ /* write multiple */
+ void (*bs_wm_1) (void *, bus_space_handle_t,
+ bus_size_t, const u_int8_t *, bus_size_t);
+ void (*bs_wm_2) (void *, bus_space_handle_t,
+ bus_size_t, const u_int16_t *, bus_size_t);
+ void (*bs_wm_4) (void *, bus_space_handle_t,
+ bus_size_t, const u_int32_t *, bus_size_t);
+ void (*bs_wm_8) (void *, bus_space_handle_t,
+ bus_size_t, const u_int64_t *, bus_size_t);
+
+ /* write region */
+ void (*bs_wr_1) (void *, bus_space_handle_t,
+ bus_size_t, const u_int8_t *, bus_size_t);
+ void (*bs_wr_2) (void *, bus_space_handle_t,
+ bus_size_t, const u_int16_t *, bus_size_t);
+ void (*bs_wr_4) (void *, bus_space_handle_t,
+ bus_size_t, const u_int32_t *, bus_size_t);
+ void (*bs_wr_8) (void *, bus_space_handle_t,
+ bus_size_t, const u_int64_t *, bus_size_t);
+
+ /* set multiple */
+ void (*bs_sm_1) (void *, bus_space_handle_t,
+ bus_size_t, u_int8_t, bus_size_t);
+ void (*bs_sm_2) (void *, bus_space_handle_t,
+ bus_size_t, u_int16_t, bus_size_t);
+ void (*bs_sm_4) (void *, bus_space_handle_t,
+ bus_size_t, u_int32_t, bus_size_t);
+ void (*bs_sm_8) (void *, bus_space_handle_t,
+ bus_size_t, u_int64_t, bus_size_t);
+
+ /* set region */
+ void (*bs_sr_1) (void *, bus_space_handle_t,
+ bus_size_t, u_int8_t, bus_size_t);
+ void (*bs_sr_2) (void *, bus_space_handle_t,
+ bus_size_t, u_int16_t, bus_size_t);
+ void (*bs_sr_4) (void *, bus_space_handle_t,
+ bus_size_t, u_int32_t, bus_size_t);
+ void (*bs_sr_8) (void *, bus_space_handle_t,
+ bus_size_t, u_int64_t, bus_size_t);
+
+ /* copy */
+ void (*bs_c_1) (void *, bus_space_handle_t, bus_size_t,
+ bus_space_handle_t, bus_size_t, bus_size_t);
+ void (*bs_c_2) (void *, bus_space_handle_t, bus_size_t,
+ bus_space_handle_t, bus_size_t, bus_size_t);
+ void (*bs_c_4) (void *, bus_space_handle_t, bus_size_t,
+ bus_space_handle_t, bus_size_t, bus_size_t);
+ void (*bs_c_8) (void *, bus_space_handle_t, bus_size_t,
+ bus_space_handle_t, bus_size_t, bus_size_t);
+
+ /* read single stream */
+ u_int8_t (*bs_r_1_s) (void *, bus_space_handle_t, bus_size_t);
+ u_int16_t (*bs_r_2_s) (void *, bus_space_handle_t, bus_size_t);
+ u_int32_t (*bs_r_4_s) (void *, bus_space_handle_t, bus_size_t);
+ u_int64_t (*bs_r_8_s) (void *, bus_space_handle_t, bus_size_t);
+
+ /* read multiple stream */
+ void (*bs_rm_1_s) (void *, bus_space_handle_t, bus_size_t,
+ u_int8_t *, bus_size_t);
+ void (*bs_rm_2_s) (void *, bus_space_handle_t, bus_size_t,
+ u_int16_t *, bus_size_t);
+ void (*bs_rm_4_s) (void *, bus_space_handle_t,
+ bus_size_t, u_int32_t *, bus_size_t);
+ void (*bs_rm_8_s) (void *, bus_space_handle_t,
+ bus_size_t, u_int64_t *, bus_size_t);
+
+ /* read region stream */
+ void (*bs_rr_1_s) (void *, bus_space_handle_t,
+ bus_size_t, u_int8_t *, bus_size_t);
+ void (*bs_rr_2_s) (void *, bus_space_handle_t,
+ bus_size_t, u_int16_t *, bus_size_t);
+ void (*bs_rr_4_s) (void *, bus_space_handle_t,
+ bus_size_t, u_int32_t *, bus_size_t);
+ void (*bs_rr_8_s) (void *, bus_space_handle_t,
+ bus_size_t, u_int64_t *, bus_size_t);
+
+ /* write single stream */
+ void (*bs_w_1_s) (void *, bus_space_handle_t,
+ bus_size_t, u_int8_t);
+ void (*bs_w_2_s) (void *, bus_space_handle_t,
+ bus_size_t, u_int16_t);
+ void (*bs_w_4_s) (void *, bus_space_handle_t,
+ bus_size_t, u_int32_t);
+ void (*bs_w_8_s) (void *, bus_space_handle_t,
+ bus_size_t, u_int64_t);
+
+ /* write multiple stream */
+ void (*bs_wm_1_s) (void *, bus_space_handle_t,
+ bus_size_t, const u_int8_t *, bus_size_t);
+ void (*bs_wm_2_s) (void *, bus_space_handle_t,
+ bus_size_t, const u_int16_t *, bus_size_t);
+ void (*bs_wm_4_s) (void *, bus_space_handle_t,
+ bus_size_t, const u_int32_t *, bus_size_t);
+ void (*bs_wm_8_s) (void *, bus_space_handle_t,
+ bus_size_t, const u_int64_t *, bus_size_t);
+
+ /* write region stream */
+ void (*bs_wr_1_s) (void *, bus_space_handle_t,
+ bus_size_t, const u_int8_t *, bus_size_t);
+ void (*bs_wr_2_s) (void *, bus_space_handle_t,
+ bus_size_t, const u_int16_t *, bus_size_t);
+ void (*bs_wr_4_s) (void *, bus_space_handle_t,
+ bus_size_t, const u_int32_t *, bus_size_t);
+ void (*bs_wr_8_s) (void *, bus_space_handle_t,
+ bus_size_t, const u_int64_t *, bus_size_t);
+};
+
+
+/*
+ * Utility macros; INTERNAL USE ONLY.
+ */
+#define __bs_c(a,b) __CONCAT(a,b)
+#define __bs_opname(op,size) __bs_c(__bs_c(__bs_c(bs_,op),_),size)
+
+#define __bs_rs(sz, t, h, o) \
+ (*(t)->__bs_opname(r,sz))((t)->bs_cookie, h, o)
+#define __bs_ws(sz, t, h, o, v) \
+ (*(t)->__bs_opname(w,sz))((t)->bs_cookie, h, o, v)
+#define __bs_nonsingle(type, sz, t, h, o, a, c) \
+ (*(t)->__bs_opname(type,sz))((t)->bs_cookie, h, o, a, c)
+#define __bs_set(type, sz, t, h, o, v, c) \
+ (*(t)->__bs_opname(type,sz))((t)->bs_cookie, h, o, v, c)
+#define __bs_copy(sz, t, h1, o1, h2, o2, cnt) \
+ (*(t)->__bs_opname(c,sz))((t)->bs_cookie, h1, o1, h2, o2, cnt)
+
+#define __bs_opname_s(op,size) __bs_c(__bs_c(__bs_c(__bs_c(bs_,op),_),size),_s)
+#define __bs_rs_s(sz, t, h, o) \
+ (*(t)->__bs_opname_s(r,sz))((t)->bs_cookie, h, o)
+#define __bs_ws_s(sz, t, h, o, v) \
+ (*(t)->__bs_opname_s(w,sz))((t)->bs_cookie, h, o, v)
+#define __bs_nonsingle_s(type, sz, t, h, o, a, c) \
+ (*(t)->__bs_opname_s(type,sz))((t)->bs_cookie, h, o, a, c)
+
+
+/*
+ * Mapping and unmapping operations.
+ */
+#define bus_space_map(t, a, s, c, hp) \
+ (*(t)->bs_map)((t)->bs_cookie, (a), (s), (c), (hp))
+#define bus_space_unmap(t, h, s) \
+ (*(t)->bs_unmap)((t)->bs_cookie, (h), (s))
+#define bus_space_subregion(t, h, o, s, hp) \
+ (*(t)->bs_subregion)((t)->bs_cookie, (h), (o), (s), (hp))
+
+
+/*
+ * Allocation and deallocation operations.
+ */
+#define bus_space_alloc(t, rs, re, s, a, b, c, ap, hp) \
+ (*(t)->bs_alloc)((t)->bs_cookie, (rs), (re), (s), (a), (b), \
+ (c), (ap), (hp))
+#define bus_space_free(t, h, s) \
+ (*(t)->bs_free)((t)->bs_cookie, (h), (s))
+
+/*
+ * Bus barrier operations.
+ */
+#define bus_space_barrier(t, h, o, l, f) \
+ (*(t)->bs_barrier)((t)->bs_cookie, (h), (o), (l), (f))
+
+
+
+/*
+ * Bus read (single) operations.
+ */
+#define bus_space_read_1(t, h, o) __bs_rs(1,(t),(h),(o))
+#define bus_space_read_2(t, h, o) __bs_rs(2,(t),(h),(o))
+#define bus_space_read_4(t, h, o) __bs_rs(4,(t),(h),(o))
+#define bus_space_read_8(t, h, o) __bs_rs(8,(t),(h),(o))
+
+#define bus_space_read_stream_1(t, h, o) __bs_rs_s(1,(t), (h), (o))
+#define bus_space_read_stream_2(t, h, o) __bs_rs_s(2,(t), (h), (o))
+#define bus_space_read_stream_4(t, h, o) __bs_rs_s(4,(t), (h), (o))
+#define bus_space_read_stream_8(t, h, o) __bs_rs_s(8,8,(t),(h),(o))
+
+/*
+ * Bus read multiple operations.
+ */
+#define bus_space_read_multi_1(t, h, o, a, c) \
+ __bs_nonsingle(rm,1,(t),(h),(o),(a),(c))
+#define bus_space_read_multi_2(t, h, o, a, c) \
+ __bs_nonsingle(rm,2,(t),(h),(o),(a),(c))
+#define bus_space_read_multi_4(t, h, o, a, c) \
+ __bs_nonsingle(rm,4,(t),(h),(o),(a),(c))
+#define bus_space_read_multi_8(t, h, o, a, c) \
+ __bs_nonsingle(rm,8,(t),(h),(o),(a),(c))
+
+#define bus_space_read_multi_stream_1(t, h, o, a, c) \
+ __bs_nonsingle_s(rm,1,(t),(h),(o),(a),(c))
+#define bus_space_read_multi_stream_2(t, h, o, a, c) \
+ __bs_nonsingle_s(rm,2,(t),(h),(o),(a),(c))
+#define bus_space_read_multi_stream_4(t, h, o, a, c) \
+ __bs_nonsingle_s(rm,4,(t),(h),(o),(a),(c))
+#define bus_space_read_multi_stream_8(t, h, o, a, c) \
+ __bs_nonsingle_s(rm,8,(t),(h),(o),(a),(c))
+
+
+/*
+ * Bus read region operations.
+ */
+#define bus_space_read_region_1(t, h, o, a, c) \
+ __bs_nonsingle(rr,1,(t),(h),(o),(a),(c))
+#define bus_space_read_region_2(t, h, o, a, c) \
+ __bs_nonsingle(rr,2,(t),(h),(o),(a),(c))
+#define bus_space_read_region_4(t, h, o, a, c) \
+ __bs_nonsingle(rr,4,(t),(h),(o),(a),(c))
+#define bus_space_read_region_8(t, h, o, a, c) \
+ __bs_nonsingle(rr,8,(t),(h),(o),(a),(c))
+
+#define bus_space_read_region_stream_1(t, h, o, a, c) \
+ __bs_nonsingle_s(rr,1,(t),(h),(o),(a),(c))
+#define bus_space_read_region_stream_2(t, h, o, a, c) \
+ __bs_nonsingle_s(rr,2,(t),(h),(o),(a),(c))
+#define bus_space_read_region_stream_4(t, h, o, a, c) \
+ __bs_nonsingle_s(rr,4,(t),(h),(o),(a),(c))
+#define bus_space_read_region_stream_8(t, h, o, a, c) \
+ __bs_nonsingle_s(rr,8,(t),(h),(o),(a),(c))
+
+
+/*
+ * Bus write (single) operations.
+ */
+#define bus_space_write_1(t, h, o, v) __bs_ws(1,(t),(h),(o),(v))
+#define bus_space_write_2(t, h, o, v) __bs_ws(2,(t),(h),(o),(v))
+#define bus_space_write_4(t, h, o, v) __bs_ws(4,(t),(h),(o),(v))
+#define bus_space_write_8(t, h, o, v) __bs_ws(8,(t),(h),(o),(v))
+
+#define bus_space_write_stream_1(t, h, o, v) __bs_ws_s(1,(t),(h),(o),(v))
+#define bus_space_write_stream_2(t, h, o, v) __bs_ws_s(2,(t),(h),(o),(v))
+#define bus_space_write_stream_4(t, h, o, v) __bs_ws_s(4,(t),(h),(o),(v))
+#define bus_space_write_stream_8(t, h, o, v) __bs_ws_s(8,(t),(h),(o),(v))
+
+
+/*
+ * Bus write multiple operations.
+ */
+#define bus_space_write_multi_1(t, h, o, a, c) \
+ __bs_nonsingle(wm,1,(t),(h),(o),(a),(c))
+#define bus_space_write_multi_2(t, h, o, a, c) \
+ __bs_nonsingle(wm,2,(t),(h),(o),(a),(c))
+#define bus_space_write_multi_4(t, h, o, a, c) \
+ __bs_nonsingle(wm,4,(t),(h),(o),(a),(c))
+#define bus_space_write_multi_8(t, h, o, a, c) \
+ __bs_nonsingle(wm,8,(t),(h),(o),(a),(c))
+
+#define bus_space_write_multi_stream_1(t, h, o, a, c) \
+ __bs_nonsingle_s(wm,1,(t),(h),(o),(a),(c))
+#define bus_space_write_multi_stream_2(t, h, o, a, c) \
+ __bs_nonsingle_s(wm,2,(t),(h),(o),(a),(c))
+#define bus_space_write_multi_stream_4(t, h, o, a, c) \
+ __bs_nonsingle_s(wm,4,(t),(h),(o),(a),(c))
+#define bus_space_write_multi_stream_8(t, h, o, a, c) \
+ __bs_nonsingle_s(wm,8,(t),(h),(o),(a),(c))
+
+
+/*
+ * Bus write region operations.
+ */
+#define bus_space_write_region_1(t, h, o, a, c) \
+ __bs_nonsingle(wr,1,(t),(h),(o),(a),(c))
+#define bus_space_write_region_2(t, h, o, a, c) \
+ __bs_nonsingle(wr,2,(t),(h),(o),(a),(c))
+#define bus_space_write_region_4(t, h, o, a, c) \
+ __bs_nonsingle(wr,4,(t),(h),(o),(a),(c))
+#define bus_space_write_region_8(t, h, o, a, c) \
+ __bs_nonsingle(wr,8,(t),(h),(o),(a),(c))
+
+#define bus_space_write_region_stream_1(t, h, o, a, c) \
+ __bs_nonsingle_s(wr,1,(t),(h),(o),(a),(c))
+#define bus_space_write_region_stream_2(t, h, o, a, c) \
+ __bs_nonsingle_s(wr,2,(t),(h),(o),(a),(c))
+#define bus_space_write_region_stream_4(t, h, o, a, c) \
+ __bs_nonsingle_s(wr,4,(t),(h),(o),(a),(c))
+#define bus_space_write_region_stream_8(t, h, o, a, c) \
+ __bs_nonsingle_s(wr,8,(t),(h),(o),(a),(c))
+
+
+/*
+ * Set multiple operations.
+ */
+#define bus_space_set_multi_1(t, h, o, v, c) \
+ __bs_set(sm,1,(t),(h),(o),(v),(c))
+#define bus_space_set_multi_2(t, h, o, v, c) \
+ __bs_set(sm,2,(t),(h),(o),(v),(c))
+#define bus_space_set_multi_4(t, h, o, v, c) \
+ __bs_set(sm,4,(t),(h),(o),(v),(c))
+#define bus_space_set_multi_8(t, h, o, v, c) \
+ __bs_set(sm,8,(t),(h),(o),(v),(c))
+
+
+/*
+ * Set region operations.
+ */
+#define bus_space_set_region_1(t, h, o, v, c) \
+ __bs_set(sr,1,(t),(h),(o),(v),(c))
+#define bus_space_set_region_2(t, h, o, v, c) \
+ __bs_set(sr,2,(t),(h),(o),(v),(c))
+#define bus_space_set_region_4(t, h, o, v, c) \
+ __bs_set(sr,4,(t),(h),(o),(v),(c))
+#define bus_space_set_region_8(t, h, o, v, c) \
+ __bs_set(sr,8,(t),(h),(o),(v),(c))
+
+
+/*
+ * Copy operations.
+ */
+#define bus_space_copy_region_1(t, h1, o1, h2, o2, c) \
+ __bs_copy(1, t, h1, o1, h2, o2, c)
+#define bus_space_copy_region_2(t, h1, o1, h2, o2, c) \
+ __bs_copy(2, t, h1, o1, h2, o2, c)
+#define bus_space_copy_region_4(t, h1, o1, h2, o2, c) \
+ __bs_copy(4, t, h1, o1, h2, o2, c)
+#define bus_space_copy_region_8(t, h1, o1, h2, o2, c) \
+ __bs_copy(8, t, h1, o1, h2, o2, c)
+
+#include <machine/bus_dma.h>
+
+#endif /* _MACHINE_BUS_H_ */
diff --git a/sys/arm64/include/bus_dma.h b/sys/arm64/include/bus_dma.h
new file mode 100644
index 0000000..b07d0f7
--- /dev/null
+++ b/sys/arm64/include/bus_dma.h
@@ -0,0 +1,8 @@
+/* $FreeBSD$ */
+
+#ifndef _MACHINE_BUS_DMA_H_
+#define _MACHINE_BUS_DMA_H_
+
+#include <sys/bus_dma.h>
+
+#endif /* !_MACHINE_BUS_DMA_H_ */
diff --git a/sys/arm64/include/clock.h b/sys/arm64/include/clock.h
new file mode 100644
index 0000000..da23dbe
--- /dev/null
+++ b/sys/arm64/include/clock.h
@@ -0,0 +1 @@
+/* $FreeBSD$ */
diff --git a/sys/arm64/include/counter.h b/sys/arm64/include/counter.h
new file mode 100644
index 0000000..9d56cce
--- /dev/null
+++ b/sys/arm64/include/counter.h
@@ -0,0 +1,93 @@
+/*-
+ * Copyright (c) 2012 Konstantin Belousov <kib@FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _MACHINE_COUNTER_H_
+#define _MACHINE_COUNTER_H_
+
+#include <sys/pcpu.h>
+#ifdef INVARIANTS
+#include <sys/proc.h>
+#endif
+
+#define counter_enter() critical_enter()
+#define counter_exit() critical_exit()
+
+#ifdef IN_SUBR_COUNTER_C
+static inline uint64_t
+counter_u64_read_one(uint64_t *p, int cpu)
+{
+
+ return (*(uint64_t *)((char *)p + sizeof(struct pcpu) * cpu));
+}
+
+static inline uint64_t
+counter_u64_fetch_inline(uint64_t *p)
+{
+ uint64_t r;
+ int i;
+
+ r = 0;
+ for (i = 0; i < mp_ncpus; i++)
+ r += counter_u64_read_one((uint64_t *)p, i);
+
+ return (r);
+}
+
+/* XXXKIB might interrupt increment */
+static void
+counter_u64_zero_one_cpu(void *arg)
+{
+
+ *((uint64_t *)((char *)arg + sizeof(struct pcpu) *
+ PCPU_GET(cpuid))) = 0;
+}
+
+static inline void
+counter_u64_zero_inline(counter_u64_t c)
+{
+
+ smp_rendezvous(smp_no_rendevous_barrier, counter_u64_zero_one_cpu,
+ smp_no_rendevous_barrier, c);
+}
+#endif
+
+#define counter_u64_add_protected(c, inc) do { \
+ CRITICAL_ASSERT(curthread); \
+ *(uint64_t *)zpcpu_get(c) += (inc); \
+} while (0)
+
+static inline void
+counter_u64_add(counter_u64_t c, int64_t inc)
+{
+
+ counter_enter();
+ counter_u64_add_protected(c, inc);
+ counter_exit();
+}
+
+#endif /* ! _MACHINE_COUNTER_H_ */
diff --git a/sys/arm64/include/cpufunc.h b/sys/arm64/include/cpufunc.h
index 08d5355..5a7f08b 100644
--- a/sys/arm64/include/cpufunc.h
+++ b/sys/arm64/include/cpufunc.h
@@ -109,6 +109,7 @@ get_mpidr(void)
}
#define cpu_nullop() arm64_nullop()
+#define cpufunc_nullop() arm64_nullop()
#define cpu_setttb(a) arm64_setttb(a)
#define cpu_tlb_flushID() arm64_tlb_flushID()
diff --git a/sys/arm64/include/db_machdep.h b/sys/arm64/include/db_machdep.h
new file mode 100644
index 0000000..b249256
--- /dev/null
+++ b/sys/arm64/include/db_machdep.h
@@ -0,0 +1,126 @@
+/*-
+ * Copyright (c) 2014 Andrew Turner
+ * Copyright (c) 2014-2015 The FreeBSD Foundation
+ * All rights reserved.
+ *
+ * This software was developed by Semihalf under
+ * sponsorship from the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _MACHINE_DB_MACHDEP_H_
+#define _MACHINE_DB_MACHDEP_H_
+
+#include <machine/armreg.h>
+#include <machine/frame.h>
+#include <machine/trap.h>
+
+#define T_BREAKPOINT (EXCP_BRK)
+#define T_WATCHPOINT (EXCP_WATCHPT_EL1)
+
+typedef vm_offset_t db_addr_t;
+typedef long db_expr_t;
+
+#define PC_REGS() ((db_addr_t)kdb_thrctx->pcb_pc)
+
+#define BKPT_INST (0xd4200000)
+#define BKPT_SIZE (4)
+#define BKPT_SET(inst) (BKPT_INST)
+
+#define BKPT_SKIP do { \
+ kdb_frame->tf_elr += BKPT_SIZE; \
+} while (0)
+
+#define db_clear_single_step kdb_cpu_clear_singlestep
+#define db_set_single_step kdb_cpu_set_singlestep
+
+#define IS_BREAKPOINT_TRAP(type, code) (type == T_BREAKPOINT)
+#define IS_WATCHPOINT_TRAP(type, code) (type == T_WATCHPOINT)
+
+#define inst_trap_return(ins) (0)
+/* ret */
+#define inst_return(ins) (((ins) & 0xfffffc1fu) == 0xd65f0000)
+#define inst_call(ins) (((ins) & 0xfc000000u) == 0x94000000u || /* BL */ \
+ ((ins) & 0xfffffc1fu) == 0xd63f0000u) /* BLR */
+
+#define inst_load(ins) ({ \
+ uint32_t tmp_instr = db_get_value(PC_REGS(), sizeof(uint32_t), FALSE); \
+ is_load_instr(tmp_instr); \
+})
+
+#define inst_store(ins) ({ \
+ uint32_t tmp_instr = db_get_value(PC_REGS(), sizeof(uint32_t), FALSE); \
+ is_store_instr(tmp_instr); \
+})
+
+#define is_load_instr(ins) ((((ins) & 0x3b000000u) == 0x18000000u) || /* literal */ \
+ (((ins) & 0x3f400000u) == 0x08400000u) || /* exclusive */ \
+ (((ins) & 0x3bc00000u) == 0x28400000u) || /* no-allocate pair */ \
+ ((((ins) & 0x3b200c00u) == 0x38000400u) && \
+ (((ins) & 0x3be00c00u) != 0x38000400u) && \
+ (((ins) & 0xffe00c00u) != 0x3c800400u)) || /* immediate post-indexed */ \
+ ((((ins) & 0x3b200c00u) == 0x38000c00u) && \
+ (((ins) & 0x3be00c00u) != 0x38000c00u) && \
+ (((ins) & 0xffe00c00u) != 0x3c800c00u)) || /* immediate pre-indexed */ \
+ ((((ins) & 0x3b200c00u) == 0x38200800u) && \
+ (((ins) & 0x3be00c00u) != 0x38200800u) && \
+ (((ins) & 0xffe00c00u) != 0x3ca00c80u)) || /* register offset */ \
+ ((((ins) & 0x3b200c00u) == 0x38000800u) && \
+ (((ins) & 0x3be00c00u) != 0x38000800u)) || /* unprivileged */ \
+ ((((ins) & 0x3b200c00u) == 0x38000000u) && \
+ (((ins) & 0x3be00c00u) != 0x38000000u) && \
+ (((ins) & 0xffe00c00u) != 0x3c800000u)) || /* unscaled immediate */ \
+ ((((ins) & 0x3b000000u) == 0x39000000u) && \
+ (((ins) & 0x3bc00000u) != 0x39000000u) && \
+ (((ins) & 0xffc00000u) != 0x3d800000u)) && /* unsigned immediate */ \
+ (((ins) & 0x3bc00000u) == 0x28400000u) || /* pair (offset) */ \
+ (((ins) & 0x3bc00000u) == 0x28c00000u) || /* pair (post-indexed) */ \
+ (((ins) & 0x3bc00000u) == 0x29800000u)) /* pair (pre-indexed) */
+
+#define is_store_instr(ins) ((((ins) & 0x3f400000u) == 0x08000000u) || /* exclusive */ \
+ (((ins) & 0x3bc00000u) == 0x28000000u) || /* no-allocate pair */ \
+ ((((ins) & 0x3be00c00u) == 0x38000400u) || \
+ (((ins) & 0xffe00c00u) == 0x3c800400u)) || /* immediate post-indexed */ \
+ ((((ins) & 0x3be00c00u) == 0x38000c00u) || \
+ (((ins) & 0xffe00c00u) == 0x3c800c00u)) || /* immediate pre-indexed */ \
+ ((((ins) & 0x3be00c00u) == 0x38200800u) || \
+ (((ins) & 0xffe00c00u) == 0x3ca00800u)) || /* register offset */ \
+ (((ins) & 0x3be00c00u) == 0x38000800u) || /* unprivileged */ \
+ ((((ins) & 0x3be00c00u) == 0x38000000u) || \
+ (((ins) & 0xffe00c00u) == 0x3c800000u)) || /* unscaled immediate */ \
+ ((((ins) & 0x3bc00000u) == 0x39000000u) || \
+ (((ins) & 0xffc00000u) == 0x3d800000u)) || /* unsigned immediate */ \
+ (((ins) & 0x3bc00000u) == 0x28000000u) || /* pair (offset) */ \
+ (((ins) & 0x3bc00000u) == 0x28800000u) || /* pair (post-indexed) */ \
+ (((ins) & 0x3bc00000u) == 0x29800000u)) /* pair (pre-indexed) */
+
+#define next_instr_address(pc, bd) ((bd) ? (pc) : ((pc) + 4))
+
+#define DB_SMALL_VALUE_MAX (0x7fffffff)
+#define DB_SMALL_VALUE_MIN (-0x40001)
+
+#define DB_ELFSIZE 64
+
+#endif /* !_MACHINE_DB_MACHDEP_H_ */
diff --git a/sys/arm64/include/debug_monitor.h b/sys/arm64/include/debug_monitor.h
new file mode 100644
index 0000000..59a0cb8
--- /dev/null
+++ b/sys/arm64/include/debug_monitor.h
@@ -0,0 +1,63 @@
+/*-
+ * Copyright (c) 2014 The FreeBSD Foundation
+ * All rights reserved.
+ *
+ * This software was developed by Semihalf under
+ * the sponsorship of the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _MACHINE_DEBUG_MONITOR_H_
+#define _MACHINE_DEBUG_MONITOR_H_
+
+#ifdef KDB
+
+#include <machine/db_machdep.h>
+
+enum dbg_el_t {
+ DBG_FROM_EL0 = 0,
+ DBG_FROM_EL1 = 1,
+};
+
+enum dbg_access_t {
+ HW_BREAKPOINT_X = 0,
+ HW_BREAKPOINT_R = 1,
+ HW_BREAKPOINT_W = 2,
+ HW_BREAKPOINT_RW = HW_BREAKPOINT_R | HW_BREAKPOINT_W,
+};
+
+void dbg_monitor_init(void);
+void dbg_show_watchpoint(void);
+int dbg_setup_watchpoint(db_expr_t addr, db_expr_t size, enum dbg_el_t el,
+ enum dbg_access_t access);
+int dbg_remove_watchpoint(db_expr_t addr, db_expr_t size, enum dbg_el_t el);
+#else
+static __inline void
+dbg_monitor_init(void)
+{
+}
+#endif
+
+#endif /* _MACHINE_DEBUG_MONITOR_H_ */
diff --git a/sys/arm64/include/devmap.h b/sys/arm64/include/devmap.h
new file mode 100644
index 0000000..e205d9b
--- /dev/null
+++ b/sys/arm64/include/devmap.h
@@ -0,0 +1,93 @@
+/*-
+ * Copyright (c) 2013 Ian Lepore <ian@freebsd.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _MACHINE_DEVMAP_H_
+#define _MACHINE_DEVMAP_H_
+
+/*
+ * This structure is used by MD code to describe static mappings of devices
+ * which are established as part of bringing up the MMU early in the boot.
+ */
+struct arm_devmap_entry {
+ vm_offset_t pd_va; /* virtual address */
+ vm_paddr_t pd_pa; /* physical address */
+ vm_size_t pd_size; /* size of region */
+ vm_prot_t pd_prot; /* protection code */
+ int pd_cache; /* cache attributes */
+};
+
+/*
+ * Return the lowest KVA address used in any entry in the registered devmap
+ * table. This works with whatever table is registered, including the internal
+ * table used by arm_devmap_add_entry() if that routine was used. Platforms can
+ * implement initarm_lastaddr() by calling this if static device mappings are
+ * their only use of high KVA space.
+ */
+vm_offset_t arm_devmap_lastaddr(void);
+
+/*
+ * Automatically allocate KVA (from the top of the address space downwards) and
+ * make static device mapping entries in an internal table. The internal table
+ * is automatically registered on the first call to this.
+ */
+void arm_devmap_add_entry(vm_paddr_t pa, vm_size_t sz);
+
+/*
+ * Register a platform-local table to be bootstrapped by the generic
+ * initarm() in arm/machdep.c. This is used by newer code that allocates and
+ * fills in its own local table but does not have its own initarm() routine.
+ */
+void arm_devmap_register_table(const struct arm_devmap_entry * _table);
+
+/*
+ * Establish mappings for all the entries in the table. This is called
+ * automatically from the common initarm() in arm/machdep.c, and also from the
+ * custom initarm() routines in older code. If the table pointer is NULL, this
+ * will use the table installed previously by arm_devmap_register_table().
+ */
+void arm_devmap_bootstrap(vm_offset_t _l1pt,
+ const struct arm_devmap_entry *_table);
+
+/*
+ * Translate between virtual and physical addresses within a region that is
+ * static-mapped by the devmap code. If the given address range isn't
+ * static-mapped, then ptov returns NULL and vtop returns DEVMAP_PADDR_NOTFOUND.
+ * The latter implies that you can't vtop just the last byte of physical address
+ * space. This is not as limiting as it might sound, because even if a device
+ * occupies the end of the physical address space, you're only prevented from
+ * doing vtop for that single byte. If you vtop a size bigger than 1 it works.
+ */
+#define DEVMAP_PADDR_NOTFOUND ((vm_paddr_t)(-1))
+
+void * arm_devmap_ptov(vm_paddr_t _pa, vm_size_t _sz);
+vm_paddr_t arm_devmap_vtop(void * _va, vm_size_t _sz);
+
+/* Print the static mapping table; used for bootverbose output. */
+void arm_devmap_print_table(void);
+
+#endif
diff --git a/sys/arm64/include/dump.h b/sys/arm64/include/dump.h
new file mode 100644
index 0000000..6f25375
--- /dev/null
+++ b/sys/arm64/include/dump.h
@@ -0,0 +1,74 @@
+/*-
+ * Copyright (c) 2014 EMC Corp.
+ * Author: Conrad Meyer <conrad.meyer@isilon.com>
+ * Copyright (c) 2015 The FreeBSD Foundation.
+ * All rights reserved.
+ *
+ * Portions of this software were developed by Andrew Turner
+ * under sponsorship from the FreeBSD Foundation
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _MACHINE_DUMP_H_
+#define _MACHINE_DUMP_H_
+
+#define KERNELDUMP_ARCH_VERSION KERNELDUMP_AARCH64_VERSION
+#define EM_VALUE EM_AARCH64
+/* XXX: I suppose 20 should be enough. */
+#define DUMPSYS_MD_PA_NPAIRS 20
+#define DUMPSYS_NUM_AUX_HDRS 1
+
+void dumpsys_wbinv_all(void);
+int dumpsys_write_aux_headers(struct dumperinfo *di);
+
+static inline void
+dumpsys_pa_init(void)
+{
+
+ dumpsys_gen_pa_init();
+}
+
+static inline struct dump_pa *
+dumpsys_pa_next(struct dump_pa *p)
+{
+
+ return (dumpsys_gen_pa_next(p));
+}
+
+static inline void
+dumpsys_unmap_chunk(vm_paddr_t pa, size_t s, void *va)
+{
+
+ dumpsys_gen_unmap_chunk(pa, s, va);
+}
+
+static inline int
+dumpsys(struct dumperinfo *di)
+{
+
+ return (dumpsys_generic(di));
+}
+
+#endif /* !_MACHINE_DUMP_H_ */
diff --git a/sys/arm64/include/hypervisor.h b/sys/arm64/include/hypervisor.h
new file mode 100644
index 0000000..4e9980f
--- /dev/null
+++ b/sys/arm64/include/hypervisor.h
@@ -0,0 +1,85 @@
+/*-
+ * Copyright (c) 2013, 2014 Andrew Turner
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _MACHINE_HYPERVISOR_H_
+#define _MACHINE_HYPERVISOR_H_
+
+/*
+ * These registers are only useful when in hypervisor context,
+ * e.g. specific to EL2, or controlling the hypervisor.
+ */
+
+/*
+ * Architecture feature trap register
+ */
+#define CPTR_RES0 0x7fefc800
+#define CPTR_RES1 0x000033ff
+#define CPTR_TFP 0x00000400
+#define CPTR_TTA 0x00100000
+#define CPTR_TCPAC 0x80000000
+
+/*
+ * Hypervisor Config Register
+ */
+
+#define HCR_VM 0x0000000000000001
+#define HCR_SWIO 0x0000000000000002
+#define HCR_PTW 0x0000000000000004
+#define HCR_FMO 0x0000000000000008
+#define HCR_IMO 0x0000000000000010
+#define HCR_AMO 0x0000000000000020
+#define HCR_VF 0x0000000000000040
+#define HCR_VI 0x0000000000000080
+#define HCR_VSE 0x0000000000000100
+#define HCR_FB 0x0000000000000200
+#define HCR_BSU_MASK 0x0000000000000c00
+#define HCR_DC 0x0000000000001000
+#define HCR_TWI 0x0000000000002000
+#define HCR_TWE 0x0000000000004000
+#define HCR_TID0 0x0000000000008000
+#define HCR_TID1 0x0000000000010000
+#define HCR_TID2 0x0000000000020000
+#define HCR_TID3 0x0000000000040000
+#define HCR_TSC 0x0000000000080000
+#define HCR_TIDCP 0x0000000000100000
+#define HCR_TACR 0x0000000000200000
+#define HCR_TSW 0x0000000000400000
+#define HCR_TPC 0x0000000000800000
+#define HCR_TPU 0x0000000001000000
+#define HCR_TTLB 0x0000000002000000
+#define HCR_TVM 0x0000000004000000
+#define HCR_TGE 0x0000000008000000
+#define HCR_TDZ 0x0000000010000000
+#define HCR_HCD 0x0000000020000000
+#define HCR_TRVM 0x0000000040000000
+#define HCR_RW 0x0000000080000000
+#define HCR_CD 0x0000000100000000
+#define HCR_ID 0x0000000200000000
+
+#endif
+
diff --git a/sys/arm64/include/in_cksum.h b/sys/arm64/include/in_cksum.h
new file mode 100644
index 0000000..40524e4
--- /dev/null
+++ b/sys/arm64/include/in_cksum.h
@@ -0,0 +1,56 @@
+/*-
+ * Copyright (c) 1990 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * from tahoe: in_cksum.c 1.2 86/01/05
+ * from: @(#)in_cksum.c 1.3 (Berkeley) 1/19/91
+ * from: Id: in_cksum.c,v 1.8 1995/12/03 18:35:19 bde Exp
+ * $FreeBSD$
+ */
+
+#ifndef _MACHINE_IN_CKSUM_H_
+#define _MACHINE_IN_CKSUM_H_ 1
+
+#include <sys/cdefs.h>
+
+#ifdef _KERNEL
+#define in_cksum(m, len) in_cksum_skip(m, len, 0)
+u_short in_addword(u_short sum, u_short b);
+u_short in_cksum_skip(struct mbuf *m, int len, int skip);
+u_int do_cksum(const void *, int);
+#if defined(IPVERSION) && (IPVERSION == 4)
+u_int in_cksum_hdr(const struct ip *);
+#endif
+
+u_short in_pseudo(u_int sum, u_int b, u_int c);
+
+#endif /* _KERNEL */
+#endif /* _MACHINE_IN_CKSUM_H_ */
diff --git a/sys/arm64/include/intr.h b/sys/arm64/include/intr.h
new file mode 100644
index 0000000..1031c64
--- /dev/null
+++ b/sys/arm64/include/intr.h
@@ -0,0 +1,56 @@
+/*-
+ * Copyright (c) 2014 Andrew Turner <andrew@FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _MACHINE_INTR_H_
+#define _MACHINE_INTR_H_
+
+int arm_config_intr(u_int, enum intr_trigger, enum intr_polarity);
+void arm_cpu_intr(struct trapframe *);
+void arm_dispatch_intr(u_int, struct trapframe *);
+int arm_enable_intr(void);
+void arm_mask_irq(u_int);
+void arm_register_root_pic(device_t, u_int);
+void arm_register_msi_pic(device_t);
+int arm_alloc_msi(device_t, int, int *);
+int arm_release_msi(device_t, int, int *);
+int arm_alloc_msix(device_t, int *);
+int arm_release_msix(device_t, int);
+int arm_map_msi(device_t, int, uint64_t *, uint32_t *);
+int arm_map_msix(device_t, int, uint64_t *, uint32_t *);
+int arm_setup_intr(const char *, driver_filter_t *, driver_intr_t,
+ void *, u_int, enum intr_type, void **);
+int arm_teardown_intr(void *);
+void arm_unmask_irq(u_int);
+
+#ifdef SMP
+void arm_init_secondary(void);
+void arm_setup_ipihandler(driver_filter_t *, u_int);
+void arm_unmask_ipi(u_int);
+#endif
+
+#endif /* _MACHINE_INTR_H */
diff --git a/sys/arm64/include/kdb.h b/sys/arm64/include/kdb.h
new file mode 100644
index 0000000..e4f4f70
--- /dev/null
+++ b/sys/arm64/include/kdb.h
@@ -0,0 +1,53 @@
+/*-
+ * Copyright (c) 2014 Andrew Turner
+ * Copyright (c) 2015 The FreeBSD Foundation
+ * All rights reserved.
+ *
+ * This software was developed by Semihalf under
+ * sponsorship from the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _MACHINE_KDB_H_
+#define _MACHINE_KDB_H_
+
+#include <machine/cpufunc.h>
+
+#define KDB_STOPPEDPCB(pc) &stoppcbs[pc->pc_cpuid]
+
+void kdb_cpu_clear_singlestep(void);
+void kdb_cpu_set_singlestep(void);
+
+static __inline void
+kdb_cpu_sync_icache(unsigned char *addr, size_t size)
+{
+}
+
+static __inline void
+kdb_cpu_trap(int type, int code)
+{
+}
+
+#endif /* _MACHINE_KDB_H_ */
diff --git a/sys/arm64/include/machdep.h b/sys/arm64/include/machdep.h
new file mode 100644
index 0000000..92c735b
--- /dev/null
+++ b/sys/arm64/include/machdep.h
@@ -0,0 +1,44 @@
+/*-
+ * Copyright (c) 2013 Andrew Turner <andrew@freebsd.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _MACHINE_MACHDEP_H_
+#define _MACHINE_MACHDEP_H_
+
+struct arm64_bootparams {
+ vm_offset_t modulep;
+ vm_offset_t kern_l1pt; /* L1 page table for the kernel */
+ uint64_t kern_delta;
+ vm_offset_t kern_stack;
+};
+
+extern vm_paddr_t physmap[];
+extern u_int physmap_idx;
+
+void initarm(struct arm64_bootparams *);
+
+#endif /* _MACHINE_MACHDEP_H_ */
diff --git a/sys/arm64/include/md_var.h b/sys/arm64/include/md_var.h
new file mode 100644
index 0000000..3bdb5e5
--- /dev/null
+++ b/sys/arm64/include/md_var.h
@@ -0,0 +1,44 @@
+/*-
+ * Copyright (c) 1995 Bruce D. Evans.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the author nor the names of contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * from: FreeBSD: src/sys/i386/include/md_var.h,v 1.40 2001/07/12
+ * $FreeBSD$
+ */
+
+#ifndef _MACHINE_MD_VAR_H_
+#define _MACHINE_MD_VAR_H_
+
+extern long Maxmem;
+extern char sigcode[];
+extern int szsigcode;
+
+struct dumperinfo;
+int minidumpsys(struct dumperinfo *);
+void busdma_swi(void);
+
+#endif /* !_MACHINE_MD_VAR_H_ */
diff --git a/sys/arm64/include/memdev.h b/sys/arm64/include/memdev.h
new file mode 100644
index 0000000..f16ba16
--- /dev/null
+++ b/sys/arm64/include/memdev.h
@@ -0,0 +1,40 @@
+/*-
+ * Copyright (c) 2004 Mark R V Murray
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer
+ * in this position and unchanged.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _MACHINE_MEMDEV_H_
+#define _MACHINE_MEMDEV_H_
+
+#define CDEV_MINOR_MEM 0
+#define CDEV_MINOR_KMEM 1
+
+d_open_t memopen;
+d_read_t memrw;
+#define memioctl (d_ioctl_t *)NULL
+#define memmmap (d_mmap_t *)NULL
+
+#endif /* _MACHINE_MEMDEV_H_ */
diff --git a/sys/arm64/include/metadata.h b/sys/arm64/include/metadata.h
new file mode 100644
index 0000000..090e908
--- /dev/null
+++ b/sys/arm64/include/metadata.h
@@ -0,0 +1,41 @@
+/*-
+ * Copyright (c) 2014 Andrew Turner <andrew@FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _MACHINE_METADATA_H_
+#define _MACHINE_METADATA_H_
+
+#define MODINFOMD_EFI_MAP 0x1001
+#define MODINFOMD_DTBP 0x1002
+
+struct efi_map_header {
+ size_t memory_size;
+ size_t descriptor_size;
+ uint32_t descriptor_version;
+};
+
+#endif /* !_MACHINE_METADATA_H_ */
diff --git a/sys/arm64/include/ofw_machdep.h b/sys/arm64/include/ofw_machdep.h
new file mode 100644
index 0000000..511fc8d
--- /dev/null
+++ b/sys/arm64/include/ofw_machdep.h
@@ -0,0 +1,44 @@
+/*-
+ * Copyright (c) 2009 The FreeBSD Foundation
+ * All rights reserved.
+ *
+ * This software was developed by Semihalf under sponsorship from
+ * the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _MACHINE_OFW_MACHDEP_H_
+#define _MACHINE_OFW_MACHDEP_H_
+
+#include <vm/vm.h>
+
+typedef uint32_t cell_t;
+
+struct mem_region {
+ vm_offset_t mr_start;
+ vm_size_t mr_size;
+};
+
+#endif /* _MACHINE_OFW_MACHDEP_H_ */
diff --git a/sys/arm64/include/param.h b/sys/arm64/include/param.h
index 3dac7a1..412e619 100644
--- a/sys/arm64/include/param.h
+++ b/sys/arm64/include/param.h
@@ -118,8 +118,4 @@
#define pgtok(x) ((unsigned long)(x) * (PAGE_SIZE / 1024))
-#ifdef _KERNEL
-#define NO_FUEWORD 1
-#endif
-
#endif /* !_MACHINE_PARAM_H_ */
diff --git a/sys/arm64/include/pmap.h b/sys/arm64/include/pmap.h
index 338601b..63ae34c 100644
--- a/sys/arm64/include/pmap.h
+++ b/sys/arm64/include/pmap.h
@@ -136,12 +136,15 @@ extern vm_offset_t virtual_end;
void pmap_bootstrap(vm_offset_t, vm_paddr_t, vm_size_t);
void pmap_kenter(vm_offset_t, vm_paddr_t);
-void pmap_kenter_device(vm_offset_t, vm_paddr_t);
+void pmap_kenter_device(vm_offset_t, vm_size_t, vm_paddr_t);
vm_paddr_t pmap_kextract(vm_offset_t va);
void pmap_kremove(vm_offset_t);
+void pmap_kremove_device(vm_offset_t, vm_size_t);
void *pmap_mapdev(vm_offset_t, vm_size_t);
+void *pmap_mapbios(vm_paddr_t, vm_size_t);
void pmap_unmapdev(vm_offset_t, vm_size_t);
+void pmap_unmapbios(vm_offset_t, vm_size_t);
boolean_t pmap_map_io_transient(vm_page_t *, vm_offset_t *, int, boolean_t);
void pmap_unmap_io_transient(vm_page_t *, vm_offset_t *, int, boolean_t);
diff --git a/sys/arm64/include/psl.h b/sys/arm64/include/psl.h
new file mode 100644
index 0000000..da23dbe
--- /dev/null
+++ b/sys/arm64/include/psl.h
@@ -0,0 +1 @@
+/* $FreeBSD$ */
diff --git a/sys/arm64/include/resource.h b/sys/arm64/include/resource.h
new file mode 100644
index 0000000..723d145
--- /dev/null
+++ b/sys/arm64/include/resource.h
@@ -0,0 +1,46 @@
+/*-
+ * Copyright 1998 Massachusetts Institute of Technology
+ *
+ * Permission to use, copy, modify, and distribute this software and
+ * its documentation for any purpose and without fee is hereby
+ * granted, provided that both the above copyright notice and this
+ * permission notice appear in all copies, that both the above
+ * copyright notice and this permission notice appear in all
+ * supporting documentation, and that the name of M.I.T. not be used
+ * in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. M.I.T. makes
+ * no representations about the suitability of this software for any
+ * purpose. It is provided "as is" without express or implied
+ * warranty.
+ *
+ * THIS SOFTWARE IS PROVIDED BY M.I.T. ``AS IS''. M.I.T. DISCLAIMS
+ * ALL EXPRESS OR IMPLIED WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT
+ * SHALL M.I.T. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _MACHINE_RESOURCE_H_
+#define _MACHINE_RESOURCE_H_ 1
+
+/*
+ * Definitions of resource types for Intel Architecture machines
+ * with support for legacy ISA devices and drivers.
+ */
+
+#define SYS_RES_IRQ 1 /* interrupt lines */
+#define SYS_RES_DRQ 2 /* isa dma lines */
+#define SYS_RES_MEMORY 3 /* i/o memory */
+#define SYS_RES_IOPORT 4 /* i/o ports */
+#define SYS_RES_GPIO 5 /* general purpose i/o */
+
+#endif /* !_MACHINE_RESOURCE_H_ */
diff --git a/sys/arm64/include/sf_buf.h b/sys/arm64/include/sf_buf.h
new file mode 100644
index 0000000..59f9009
--- /dev/null
+++ b/sys/arm64/include/sf_buf.h
@@ -0,0 +1,51 @@
+/*-
+ * Copyright (c) 2003, 2005 Alan L. Cox <alc@cs.rice.edu>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _MACHINE_SF_BUF_H_
+#define _MACHINE_SF_BUF_H_
+
+/*
+ * On this machine, the only purpose for which sf_buf is used is to implement
+ * an opaque pointer required by the machine-independent parts of the kernel.
+ * That pointer references the vm_page that is "mapped" by the sf_buf. The
+ * actual mapping is provided by the direct virtual-to-physical mapping.
+ */
+static inline vm_offset_t
+sf_buf_kva(struct sf_buf *sf)
+{
+
+ return (PHYS_TO_DMAP(VM_PAGE_TO_PHYS((vm_page_t)sf)));
+}
+
+static inline vm_page_t
+sf_buf_page(struct sf_buf *sf)
+{
+
+ return ((vm_page_t)sf);
+}
+#endif /* !_MACHINE_SF_BUF_H_ */
diff --git a/sys/arm64/include/smp.h b/sys/arm64/include/smp.h
new file mode 100644
index 0000000..da23dbe
--- /dev/null
+++ b/sys/arm64/include/smp.h
@@ -0,0 +1 @@
+/* $FreeBSD$ */
diff --git a/sys/arm64/include/stack.h b/sys/arm64/include/stack.h
new file mode 100644
index 0000000..8131ce5
--- /dev/null
+++ b/sys/arm64/include/stack.h
@@ -0,0 +1,35 @@
+/*-
+ * Copyright (c) 2001 Jake Burkholder.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _MACHINE_STACK_H_
+#define _MACHINE_STACK_H_
+
+#define INKERNEL(va) \
+ ((va) >= VM_MIN_KERNEL_ADDRESS && (va) <= VM_MAX_KERNEL_ADDRESS)
+
+#endif /* !_MACHINE_STACK_H_ */
diff --git a/sys/arm64/include/trap.h b/sys/arm64/include/trap.h
new file mode 100644
index 0000000..da23dbe
--- /dev/null
+++ b/sys/arm64/include/trap.h
@@ -0,0 +1 @@
+/* $FreeBSD$ */
diff --git a/sys/arm64/include/vfp.h b/sys/arm64/include/vfp.h
new file mode 100644
index 0000000..ccb853c
--- /dev/null
+++ b/sys/arm64/include/vfp.h
@@ -0,0 +1,46 @@
+/*-
+ * Copyright (c) 2015 The FreeBSD Foundation
+ * All rights reserved.
+ *
+ * This software was developed by Andrew Turner under
+ * sponsorship from the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _MACHINE_VFP_H_
+#define _MACHINE_VFP_H_
+
+#ifdef _KERNEL
+
+#ifndef LOCORE
+void vfp_init(void);
+void vfp_discard(struct thread *);
+void vfp_restore_state(void);
+void vfp_save_state(struct thread *);
+#endif
+
+#endif
+
+#endif /* !_MACHINE_VFP_H_ */
diff --git a/sys/boot/Makefile b/sys/boot/Makefile
index 172255e..2aa76b7 100644
--- a/sys/boot/Makefile
+++ b/sys/boot/Makefile
@@ -5,6 +5,7 @@
.if ${MK_FORTH} != "no"
# Build the add-in FORTH interpreter.
SUBDIR+= ficl
+SUBDIR+= forth
.endif
.include <bsd.arch.inc.mk>
diff --git a/sys/boot/Makefile.arm b/sys/boot/Makefile.arm
index 46fc574..bb0e01c 100644
--- a/sys/boot/Makefile.arm
+++ b/sys/boot/Makefile.arm
@@ -4,4 +4,4 @@
SUBDIR+= fdt
.endif
-SUBDIR+= uboot
+SUBDIR+= efi uboot
diff --git a/sys/boot/Makefile.arm64 b/sys/boot/Makefile.arm64
new file mode 100644
index 0000000..116e903
--- /dev/null
+++ b/sys/boot/Makefile.arm64
@@ -0,0 +1,7 @@
+# $FreeBSD$
+
+.if ${MK_FDT} != "no"
+SUBDIR+= fdt
+.endif
+
+SUBDIR+= efi
diff --git a/sys/boot/arm64/Makefile b/sys/boot/arm64/Makefile
new file mode 100644
index 0000000..3ecb582
--- /dev/null
+++ b/sys/boot/arm64/Makefile
@@ -0,0 +1,3 @@
+# $FreeBSD$
+
+.include <bsd.subdir.mk>
diff --git a/sys/boot/arm64/libarm64/cache.c b/sys/boot/arm64/libarm64/cache.c
new file mode 100644
index 0000000..2b3c0b1
--- /dev/null
+++ b/sys/boot/arm64/libarm64/cache.c
@@ -0,0 +1,95 @@
+/*-
+ * Copyright (c) 2014 The FreeBSD Foundation
+ * All rights reserved.
+ *
+ * This software was developed by Semihalf under
+ * the sponsorship of the FreeBSD Foundation.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+
+#include <machine/armreg.h>
+
+#include <stand.h>
+#include <efi.h>
+
+#include "cache.h"
+
+static unsigned int
+get_dcache_line_size(void)
+{
+ uint64_t ctr;
+ unsigned int dcl_size;
+
+ /* Accessible from all security levels */
+ ctr = READ_SPECIALREG(ctr_el0);
+
+ /*
+ * Relevant field [19:16] is LOG2
+ * of the number of words in DCache line
+ */
+ dcl_size = CTR_DLINE_SIZE(ctr);
+
+ /* Size of word shifted by cache line size */
+ return (sizeof(int) << dcl_size);
+}
+
+void
+cpu_flush_dcache(const void *ptr, size_t len)
+{
+
+ uint64_t cl_size;
+ vm_offset_t addr, end;
+
+ cl_size = get_dcache_line_size();
+
+ /* Calculate end address to clean */
+ end = (vm_offset_t)(ptr + len);
+ /* Align start address to cache line */
+ addr = (vm_offset_t)ptr;
+ addr = rounddown2(addr, cl_size);
+
+ for (; addr < end; addr += cl_size)
+ __asm __volatile("dc civac, %0" : : "r" (addr) : "memory");
+ /* Full system DSB */
+ __asm __volatile("dsb sy" : : : "memory");
+}
+
+void
+cpu_inval_icache(const void *ptr, size_t len)
+{
+
+ /* NULL ptr or 0 len means all */
+ if (ptr == NULL || len == 0) {
+ __asm __volatile(
+ "ic ialluis \n"
+ "dsb ish \n"
+ : : : "memory");
+ return;
+ }
+
+ /* TODO: Other cache ranges if necessary */
+}
diff --git a/sys/boot/arm64/libarm64/cache.h b/sys/boot/arm64/libarm64/cache.h
new file mode 100644
index 0000000..89b094b
--- /dev/null
+++ b/sys/boot/arm64/libarm64/cache.h
@@ -0,0 +1,38 @@
+/*-
+ * Copyright (c) 2014 The FreeBSD Foundation
+ * All rights reserved.
+ *
+ * This software was developed by Semihalf under
+ * the sponsorship of the FreeBSD Foundation.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _CACHE_H_
+#define _CACHE_H_
+
+/* cache.c */
+void cpu_flush_dcache(const void *, size_t);
+void cpu_inval_icache(const void *, size_t);
+
+#endif /* _CACHE_H_ */
diff --git a/sys/boot/common/Makefile.inc b/sys/boot/common/Makefile.inc
index dde6879..54e8617 100644
--- a/sys/boot/common/Makefile.inc
+++ b/sys/boot/common/Makefile.inc
@@ -9,6 +9,8 @@ SRCS+= load_elf32.c load_elf32_obj.c reloc_elf32.c
SRCS+= load_elf64.c load_elf64_obj.c reloc_elf64.c
.elif ${MACHINE} == "pc98"
SRCS+= load_elf32.c load_elf32_obj.c reloc_elf32.c
+.elif ${MACHINE_CPUARCH} == "aarch64"
+SRCS+= load_elf64.c reloc_elf64.c
.elif ${MACHINE_CPUARCH} == "arm"
SRCS+= load_elf32.c reloc_elf32.c
.elif ${MACHINE_CPUARCH} == "powerpc"
@@ -56,16 +58,6 @@ SRCS+= pnp.c
# Forth interpreter
.if defined(BOOT_FORTH)
SRCS+= interp_forth.c
-MAN+= ../forth/beastie.4th.8
-MAN+= ../forth/brand.4th.8
-MAN+= ../forth/check-password.4th.8
-MAN+= ../forth/color.4th.8
-MAN+= ../forth/delay.4th.8
-MAN+= ../forth/loader.conf.5
-MAN+= ../forth/loader.4th.8
-MAN+= ../forth/menu.4th.8
-MAN+= ../forth/menusets.4th.8
-MAN+= ../forth/version.4th.8
.endif
.if defined(BOOT_PROMPT_123)
diff --git a/sys/boot/common/md.c b/sys/boot/common/md.c
index 6d2d2b4..a8f092b9 100644
--- a/sys/boot/common/md.c
+++ b/sys/boot/common/md.c
@@ -27,11 +27,11 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+#include <stand.h>
#include <sys/param.h>
#include <sys/endian.h>
#include <sys/queue.h>
#include <machine/stdarg.h>
-#include <stand.h>
#include "bootstrap.h"
diff --git a/sys/boot/efi/Makefile b/sys/boot/efi/Makefile
index 5dfb648..57d4e81 100644
--- a/sys/boot/efi/Makefile
+++ b/sys/boot/efi/Makefile
@@ -1,8 +1,18 @@
# $FreeBSD$
+.include <src.opts.mk>
+
SUBDIR= libefi
-.if ${MACHINE_CPUARCH} == "amd64"
+.if ${MACHINE_CPUARCH} == "aarch64" || ${MACHINE_CPUARCH} == "arm"
+.if ${MK_FDT} != "no"
+SUBDIR+= fdt
+.endif
+.endif
+
+.if ${MACHINE_CPUARCH} == "aarch64" || \
+ ${MACHINE_CPUARCH} == "amd64" || \
+ ${MACHINE_CPUARCH} == "arm"
SUBDIR+= loader boot1
.endif
diff --git a/sys/boot/efi/boot1/Makefile b/sys/boot/efi/boot1/Makefile
index 2bcdc31..e611063 100644
--- a/sys/boot/efi/boot1/Makefile
+++ b/sys/boot/efi/boot1/Makefile
@@ -15,27 +15,38 @@ INTERNALPROG=
# architecture-specific loader code
SRCS= boot1.c reloc.c start.S
-CFLAGS+= -fPIC
CFLAGS+= -I.
CFLAGS+= -I${.CURDIR}/../include
-CFLAGS+= -I${.CURDIR}/../include/${MACHINE_CPUARCH}
+CFLAGS+= -I${.CURDIR}/../include/${MACHINE}
CFLAGS+= -I${.CURDIR}/../../../contrib/dev/acpica/include
CFLAGS+= -I${.CURDIR}/../../..
# Always add MI sources and REGULAR efi loader bits
-.PATH: ${.CURDIR}/../loader/arch/${MACHINE_CPUARCH} ${.CURDIR}/../../common
+.PATH: ${.CURDIR}/../loader/arch/${MACHINE}
+.PATH: ${.CURDIR}/../loader
+.PATH: ${.CURDIR}/../../common
CFLAGS+= -I${.CURDIR}/../../common
FILES= boot1.efi boot1.efifat
FILESMODE_boot1.efi= ${BINMODE}
-LDSCRIPT= ${.CURDIR}/../loader/arch/${MACHINE_CPUARCH}/ldscript.${MACHINE_CPUARCH}
+LDSCRIPT= ${.CURDIR}/../loader/arch/${MACHINE}/ldscript.${MACHINE}
LDFLAGS= -Wl,-T${LDSCRIPT} -Wl,-Bsymbolic -shared
.if ${MACHINE_CPUARCH} == "amd64" || ${MACHINE_CPUARCH} == "i386"
+CFLAGS+= -fPIC
LDFLAGS+= -Wl,-znocombreloc
.endif
+.if ${MACHINE_CPUARCH} == "arm" || ${MACHINE_CPUARCH} == "i386"
+#
+# Add libstand for the runtime functions used by the compiler - for example
+# __aeabi_* (arm) or __divdi3 (i386).
+#
+DPADD+= ${LIBSTAND}
+LDADD+= -lstand
+.endif
+
${PROG}: ${LDSCRIPT}
OBJCOPY?= objcopy
@@ -45,6 +56,8 @@ OBJDUMP?= objdump
EFI_TARGET= efi-app-x86_64
.elif ${MACHINE_CPUARCH} == "i386"
EFI_TARGET= efi-app-ia32
+.else
+EFI_TARGET= binary
.endif
boot1.efi: loader.sym
@@ -52,7 +65,7 @@ boot1.efi: loader.sym
${OBJDUMP} -t ${.ALLSRC} | fgrep '*UND*'; \
exit 1; \
fi
- ${OBJCOPY} -j .text -j .sdata -j .data \
+ ${OBJCOPY} -j .peheader -j .text -j .sdata -j .data \
-j .dynamic -j .dynsym -j .rel.dyn \
-j .rela.dyn -j .reloc -j .eh_frame -j set_Xcommand_set \
--output-target=${EFI_TARGET} ${.ALLSRC} ${.TARGET}
@@ -66,24 +79,27 @@ boot1.o: ${.CURDIR}/../../common/ufsread.c
boot1.efifat: boot1.efi
echo ${.OBJDIR}
- uudecode ${.CURDIR}/fat.tmpl.bz2.uu
- mv fat.tmpl.bz2 ${.TARGET}.bz2
+ uudecode ${.CURDIR}/fat-${MACHINE}.tmpl.bz2.uu
+ mv fat-${MACHINE}.tmpl.bz2 ${.TARGET}.bz2
bzip2 -f -d ${.TARGET}.bz2
dd if=boot1.efi of=${.TARGET} seek=${BOOT1_OFFSET} conv=notrunc
-CLEANFILES= boot1.efifat
+CLEANFILES= boot1.efi boot1.efifat
.endif # ${COMPILER_TYPE} != "gcc"
.include <bsd.prog.mk>
-.if ${MACHINE_CPUARCH} == "amd64" || ${MACHINE_CPUARCH} == "i386"
-beforedepend ${OBJS}: machine x86
+beforedepend ${OBJS}: machine
-CLEANFILES+= machine x86 boot1.efi
+CLEANFILES+= machine
machine:
- ln -sf ${.CURDIR}/../../../amd64/include machine
+ ln -sf ${.CURDIR}/../../../${MACHINE}/include machine
+
+.if ${MACHINE_CPUARCH} == "amd64" || ${MACHINE_CPUARCH} == "i386"
+beforedepend ${OBJS}: x86
+CLEANFILES+= x86
x86:
ln -sf ${.CURDIR}/../../../x86/include x86
diff --git a/sys/boot/efi/boot1/boot1.c b/sys/boot/efi/boot1/boot1.c
index e5719ff..eff191b 100644
--- a/sys/boot/efi/boot1/boot1.c
+++ b/sys/boot/efi/boot1/boot1.c
@@ -30,7 +30,7 @@ __FBSDID("$FreeBSD$");
#define _PATH_LOADER "/boot/loader.efi"
#define _PATH_KERNEL "/boot/kernel/kernel"
-
+
#define BSIZEMAX 16384
typedef int putc_func_t(char c, void *arg);
@@ -40,7 +40,7 @@ struct sp_data {
u_int sp_len;
u_int sp_size;
};
-
+
static const char digits[] = "0123456789abcdef";
static void panic(const char *fmt, ...) __dead2;
@@ -59,10 +59,10 @@ static char *__ultoa(char *buf, u_long val, int base);
static int domount(EFI_DEVICE_PATH *device, EFI_BLOCK_IO *blkio, int quiet);
static void load(const char *fname);
-EFI_SYSTEM_TABLE *systab;
-EFI_HANDLE *image;
+static EFI_SYSTEM_TABLE *systab;
+static EFI_HANDLE *image;
-static void
+static void
bcopy(const void *src, void *dst, size_t len)
{
const char *s = src;
@@ -71,12 +71,12 @@ bcopy(const void *src, void *dst, size_t len)
while (len-- != 0)
*d++ = *s++;
}
-
+
static void
memcpy(void *dst, const void *src, size_t len)
{
bcopy(src, dst, len);
-}
+}
static void
bzero(void *b, size_t len)
@@ -86,7 +86,7 @@ bzero(void *b, size_t len)
while (len-- != 0)
*p++ = 0;
}
-
+
static int
strcmp(const char *s1, const char *s2)
{
@@ -108,11 +108,12 @@ EFI_STATUS efi_main(EFI_HANDLE Ximage, EFI_SYSTEM_TABLE* Xsystab)
{
EFI_HANDLE handles[128];
EFI_BLOCK_IO *blkio;
- UINTN i, nparts = sizeof(handles);
+ UINTN i, nparts = sizeof(handles), cols, rows, max_dim, best_mode;
EFI_STATUS status;
EFI_DEVICE_PATH *devpath;
EFI_BOOT_SERVICES *BS;
EFI_CONSOLE_CONTROL_PROTOCOL *ConsoleControl = NULL;
+ SIMPLE_TEXT_OUTPUT_INTERFACE *conout = NULL;
char *path = _PATH_LOADER;
systab = Xsystab;
@@ -124,8 +125,29 @@ EFI_STATUS efi_main(EFI_HANDLE Ximage, EFI_SYSTEM_TABLE* Xsystab)
if (status == EFI_SUCCESS)
(void)ConsoleControl->SetMode(ConsoleControl,
EfiConsoleControlScreenText);
+ /*
+ * Reset the console and find the best text mode.
+ */
+ conout = systab->ConOut;
+ conout->Reset(conout, TRUE);
+ max_dim = best_mode = 0;
+ for (i = 0; ; i++) {
+ status = conout->QueryMode(conout, i,
+ &cols, &rows);
+ if (EFI_ERROR(status))
+ break;
+ if (cols * rows > max_dim) {
+ max_dim = cols * rows;
+ best_mode = i;
+ }
+ }
+ if (max_dim > 0)
+ conout->SetMode(conout, best_mode);
+ conout->EnableCursor(conout, TRUE);
+ conout->ClearScreen(conout);
- printf(" \n>> FreeBSD EFI boot block\n");
+ printf("\n"
+ ">> FreeBSD EFI boot block\n");
printf(" Loader path: %s\n", path);
status = systab->BootServices->LocateHandle(ByProtocol,
@@ -134,7 +156,7 @@ EFI_STATUS efi_main(EFI_HANDLE Ximage, EFI_SYSTEM_TABLE* Xsystab)
for (i = 0; i < nparts; i++) {
status = systab->BootServices->HandleProtocol(handles[i],
- &DevicePathGUID, (void **)&devpath);
+ &DevicePathGUID, (void **)&devpath);
if (EFI_ERROR(status))
continue;
@@ -142,7 +164,7 @@ EFI_STATUS efi_main(EFI_HANDLE Ximage, EFI_SYSTEM_TABLE* Xsystab)
devpath = NextDevicePathNode(devpath);
status = systab->BootServices->HandleProtocol(handles[i],
- &BlockIoProtocolGUID, (void **)&blkio);
+ &BlockIoProtocolGUID, (void **)&blkio);
if (EFI_ERROR(status))
continue;
@@ -158,7 +180,7 @@ EFI_STATUS efi_main(EFI_HANDLE Ximage, EFI_SYSTEM_TABLE* Xsystab)
bootdevhandle = handles[i];
load(path);
-
+
panic("Load failed");
return EFI_SUCCESS;
@@ -266,7 +288,7 @@ fsstat(ufs_ino_t inode)
}
static struct dmadat __dmadat;
-
+
static int
domount(EFI_DEVICE_PATH *device, EFI_BLOCK_IO *blkio, int quiet)
{
@@ -278,7 +300,7 @@ domount(EFI_DEVICE_PATH *device, EFI_BLOCK_IO *blkio, int quiet)
if (!quiet)
printf("domount: can't read superblock\n");
return (-1);
- }
+ }
if (!quiet)
printf("Succesfully mounted UFS filesystem\n");
return (0);
@@ -303,23 +325,23 @@ load(const char *fname)
status = systab->BootServices->AllocatePool(EfiLoaderData,
bufsize, &buffer);
fsread(ino, buffer, bufsize);
-
+
/* XXX: For secure boot, we need our own loader here */
status = systab->BootServices->LoadImage(TRUE, image, bootdevpath,
buffer, bufsize, &loaderhandle);
if (EFI_ERROR(status))
- printf("LoadImage failed with error %d\n", status);
+ printf("LoadImage failed with error %lx\n", status);
status = systab->BootServices->HandleProtocol(loaderhandle,
&LoadedImageGUID, (VOID**)&loaded_image);
if (EFI_ERROR(status))
- printf("HandleProtocol failed with error %d\n", status);
+ printf("HandleProtocol failed with error %lx\n", status);
loaded_image->DeviceHandle = bootdevhandle;
status = systab->BootServices->StartImage(loaderhandle, NULL, NULL);
if (EFI_ERROR(status))
- printf("StartImage failed with error %d\n", status);
+ printf("StartImage failed with error %lx\n", status);
}
static void
@@ -549,4 +571,3 @@ __ultoa(char *buf, u_long ul, int base)
while ((ul /= base) != 0);
return (p);
}
-
diff --git a/sys/boot/efi/boot1/fat.tmpl.bz2.uu b/sys/boot/efi/boot1/fat-amd64.tmpl.bz2.uu
index c9044ee..d8a44b7 100644
--- a/sys/boot/efi/boot1/fat.tmpl.bz2.uu
+++ b/sys/boot/efi/boot1/fat-amd64.tmpl.bz2.uu
@@ -1,7 +1,7 @@
FAT template boot filesystem created by generate-fat.sh
DO NOT EDIT
$FreeBSD$
-begin 644 fat.tmpl.bz2
+begin 644 fat-amd64.tmpl.bz2
M0EIH.3%!629362AK*D(`&I+____[ZZKJZ_^N_ZO^Z_Z_OJ[L`4`!7I0$#&$"
M0$!$3&(<P`(;J*C:0E0E#30&AH`T````9#0```9````#)ZF0:,-3U/409,`)
M@`"8`C3",````$R:8F@P`C`````"24U,D>I-DTU,)ZAZ0VA-!M0T'J`>H#"9
diff --git a/sys/boot/efi/boot1/fat-arm.tmpl.bz2.uu b/sys/boot/efi/boot1/fat-arm.tmpl.bz2.uu
new file mode 100644
index 0000000..15b59d8
--- /dev/null
+++ b/sys/boot/efi/boot1/fat-arm.tmpl.bz2.uu
@@ -0,0 +1,26 @@
+FAT template boot filesystem created by generate-fat.sh
+DO NOT EDIT
+$FreeBSD$
+begin 644 fat-arm.tmpl.bz2
+M0EIH.3%!629365NH-?4`&T!_____ZZ[J[_ZN_ZO^J_Z[OJ_^J^J[^KZNKNNJ
+MZNKNZOJ^P`+\#$``0`&AD:,@TTTT-&C30#$R&FF1H:!B&)D&F@```-&AB::#
+M1HP0-,AD`T8F(TTP2JII&?^I5/]4`@TTT-&(T8FAB:&@T:8F(Q!@!`9,1DR9
+M`-,$:,FC)B&FC"8"#3"#(-,0`&AD:,@TTTT-&C30#$R&FF1H:!B&)D&F@```
+M-&AB::#1HP0-,AD`T8F(TTP*HI)D\DFDVC0AIIH]3(:-``80>HTTR!IH::#$
+M-`Q`:`/2:::&)IDP"/0$T:>IFD]$R8---3HUK2<PNK%<6\J]BA",-*(A%:0B
+M(B#G5%F8B$$(68C_:!`A#OL<HAB+JZ6UHRRU>*K9].C:!IWS-2UK9M<WC]W[
+M+]QW,9%V2,?<"ZEO9B("$,I.0ZFE66K/,<N6+8ITS$J3))F2I4HJ5*E2I74J
+M:$J5*E2I4JE5*I*I-2I4J5.;84I4J5*E2I6ZU4Q*E2I4J5+X<SOK,65E965D
+MT:($(0A"$(0A"$(0C>.3@8,&#!@P8(0A"$(0@0A"$(0[;_L-&C1HT:-&B+YP
+M,&#!@P8,$"$(0A"-?NW$*YY:V9IQ,:B93+AX^A7B),5HN_4JV=2\Y,:-+W'Q
+MKQKVU7KA+YR'.:*V#48N-"7<`%:TT4D`/;N;SZM9X,V(@!D'=P==+O)9*\H8
+MI8W<L9:.AU[N;G"QEHLZBWB/2B.SKCGRM):%ZK3-2U3ZV1;%MUZX:^?X_Y@N
+MM=0SN1R7Z\&PN,I8VVWKMS$1-X41%"V)-;+V9:MI5;.+M*TMZ]K7HQ-ALY1\
+M4LG)\#5/I7#7-D_1<KUPE\OW)<YEW=.GMJ%$MUF)TE9N)8[M[6LIEXF@H6?S
+MW%U89M5M+:LW6(\?7Z6I:U4F>IM*Q<2E)KFG;%M&U;INV]<)Q%^P'*<]T6R;
+M^7`P.+I+N(HA%=#(^Q0WVV0]=$2=5)>-XWKW7!95E7$<5QW)<IS6"PF@7&+H
+M&<ETI.`9F48V7/E&??ROG%<9FU^Y#E.8W+GL%]#L7+U=^CY91Q\+`K'-WPF4
+M.2S[EM@S38.8YKG.@P6_83I,-<G1DPY84N-)VMWK,/!;AIJ&3E%&7B`0A,`&
+3'65I7J6`B^?^+N2*<*$@MU!KZ@``
+`
+end
diff --git a/sys/boot/efi/boot1/fat-arm64.tmpl.bz2.uu b/sys/boot/efi/boot1/fat-arm64.tmpl.bz2.uu
new file mode 100644
index 0000000..031815c
--- /dev/null
+++ b/sys/boot/efi/boot1/fat-arm64.tmpl.bz2.uu
@@ -0,0 +1,26 @@
+FAT template boot filesystem created by generate-fat.sh
+DO NOT EDIT
+$FreeBSD$
+begin 644 fat-arm64.tmpl.bz2
+M0EIH.3%!62936:2BH:(`&T#_____ZZKJ[_^N_ZO_J_Z[OJ_NJ^JK^KZNKNNJ
+MZNKNZOJ^P`+\```"``:`9,@T&F3$,@!B`,AIHP$#0-`T``,09--&31IH9#)D
+M,(#$T&)B!A``-`,F0:#3)B&0`Q`&0TT8"!H&@:``&(,FFC)HTT,ADR&$!B:#
+M$Q`P@`&@&3(-!IDQ#(`8@#(::,!`T#0-``#$&331DT::&0R9#"`Q-!B8@8"J
+M*0GY$I&GH"-&AZ@T```T`:`!HT```&@&@-,C0`-`#U,(-`&)ZF(PGIJ>IO;U
+M^=&QL3`-\E@Q+$(RTHB$7I"(B(-W:73$0@A#;S##$3$`A#FL\LAF,;&8;[CE
+M&D=@ON\:9IWHO):QK7LL=LFN;1M6Y:%F>-1G^&O-A*(@0AQ,\#H*KRCJF>9Q
+MFF_,RWU4X-,R6K5EJU:M6L"JMB5555555JVJU*U-JU:M6MUB*I555555;XHJ
+ME555555YM='L;(N7+ERY<N4****************.2B55555555%%%%%%%%"B
+MBBBBBC#S/DW+ERY<N7+E&NE55555550HHHHHHHS_(SQEG'X7.OTSKFY=#*]*
+M9?C*,7MM&JO=0EIDQW:7C-0U;WGRM>_!^S^F[=KA#3YJ.S-)`!>O]K)`#-ZO
+MU=9T,X(@!H',-+,1Q'-6'#ZNQORGURS=]_O%.6SF5G,PC`G#X_@7W$RC>2Q)
+M9MW3P&G:AJFA?`^AKWXOV?R_QDL9F^`=5H>$UWWT9K&Q/HS.!KXB)U)9$6,)
+M*/!EJ7>+W2L65_C\&LP69G$?'M$18.(LL.G:AZ;%>TUKYF.V+9/W9AMF[<VT
+MS/X;%DL?1SW5Y]4L]R=+RLNCTMB[6_5C8C2+?DPWF/F.G]WN[5+:G4UOWC%E
+M*3V7BO??&^=COL?:V3]&T9#<-XWKX3\,BQ#[KW01%D(X'O<#8?*B.`D]1J&O
+M>&^]HFB?J_AM6V;ANF2RG7,61I)?])L35<Y8C.RWDHV3\GZOW;-TC:MLW#<O
+MG;QDO2<6_S5;,T$1["/3W^^]&4;3*_F\:?7"90R&E;=N']O@;ENF[?ZR6Q93
+M_F6SAO9,N65+9R:#69>2^EX5C12BSAX@$(3`!EWEZ6P2R$9#_Q=R13A0D*2B
+"H:(`
+`
+end
diff --git a/sys/boot/efi/boot1/fat-i386.tmpl.bz2.uu b/sys/boot/efi/boot1/fat-i386.tmpl.bz2.uu
new file mode 100644
index 0000000..2bdebf0
--- /dev/null
+++ b/sys/boot/efi/boot1/fat-i386.tmpl.bz2.uu
@@ -0,0 +1,26 @@
+FAT template boot filesystem created by generate-fat.sh
+DO NOT EDIT
+$FreeBSD$
+begin 644 fat-i386.tmpl.bz2
+M0EIH.3%!629368LPC"P`&T#_____[ZKJ[_ZN_ZO^J_Z[OJ_OJ^JK_KZNKNNJ
+MZNKNZOJ^P`+\``4`15/%`]3U!H:-`:,C0```&@:9!H`T`!D````&@&@:9HF1
+MA``R:``:"``T,C1D&FFFAHT::`8F0TTR-#0,0Q,@TT```!HT,330:-&"!ID,
+M@&C$Q&FF(`#0R-&0::::&C1IH!B9#33(T-`Q#$R#30```&C0Q--!HT8(&F0R
+M`:,3$::8%4DDT_(HDQDFC$TR8F31H#0R,@T-!IH`#0R-`:9`TT--&C0-,C(R
+M--/0C"---/28$P:::G.M7$NU9*YMC#26[FI",))$0BU((B(@Y=99)$((0LB)
+M<:0@0AFL6JA=Y+)+JX9A-W:UXB7H/&:9\#3OG;)]#;MZOE^X3DL>PXZ:3<R.
+MJ1C*H@$(=/+'8VBTMO`8MBEXQ##KM0R"4I%:M56K5JU:VHI4DHHHHHHK5T5I
+M*TJU:M6K<JY4244444489-2)******/<SFZLBQ8L6+%BQ,FFFFFFFFFFFFFF
+MFFZV)*******)IIIIIIIIDTTTTTTUUFM/8L6+%BQ8L37TE%%%%%%$R::::::
+M;HNLR]568NF=;_H3.25=S.TN8C:-Q*3(SMM])&*T6=89:T"3R4HTB33/?:UL
+M&T;EO'`<1RVBN@U%Y'F&?@`M7&BD0`O=;\FNSTK<0`QK-P9;M*C)ZVIAUSMY
+M+RX<WJ797N#>Z7)W*[T]0YDF(D\UI%&H:I\KI&Q?FW+,N`_U_S`9%EL9H,?D
+M+[=S7F7N=K>6VVB(EK"J(J71=U(].36-&M9]E)+CJ[>NMXBU<ME(921[;4OB
+M8E]+[GX-LW+>.`OW%#X"4"I`L0*`H@*982S&"L)%`M'-HP#B!/4PH$;I)EK"
+M?`??(&!3=]_K])6G70T%+BT8F221>O8;!LVT?HV[=-ZWZ_<-QW,<YL3*[OAV
+MEUANWB*H1:7J(DC':.IN-FB,9(U;4KYX3]V595OW!<)Q7'<I@,%H6)DE$D=U
+M)SY&X7$29N2,5)S+BI&\;YOW`<%GE^XCCN2VCF,!JF6<C5_VCU)(X.#PK1RK
+MX2DAPVA<9QW(:]R7*<MS6`W#!<]A,4<Z3`DPI,&2_D==K<+`;5I:F4DBK,Q`
+8(0E`!A6EJ2^2<1'$?^+N2*<*$A%F$86`
+`
+end
diff --git a/sys/boot/efi/boot1/generate-fat.sh b/sys/boot/efi/boot1/generate-fat.sh
index 2688da3..7992b55 100755
--- a/sys/boot/efi/boot1/generate-fat.sh
+++ b/sys/boot/efi/boot1/generate-fat.sh
@@ -17,18 +17,21 @@ BOOT1_SIZE=128k
#
# Known filenames
-# amd64: BOOTx64.efi
-# arm64: BOOTaa64.efi
+# amd64: BOOTx64.efi
+# arm64: BOOTaa64.efi
+# arm: BOOTarm.efi
+# i386: BOOTia32.efi
#
-if [ -z "$1" ]; then
- echo "Usage: $0 filename"
+if [ -z "$2" ]; then
+ echo "Usage: $0 arch boot-filename"
exit 1
fi
-FILENAME=$1
+ARCH=$1
+FILENAME=$2
# Generate 800K FAT image
-OUTPUT_FILE=fat.tmpl
+OUTPUT_FILE=fat-${ARCH}.tmpl
dd if=/dev/zero of=$OUTPUT_FILE bs=512 count=$FAT_SIZE
DEVICE=`mdconfig -a -f $OUTPUT_FILE`
diff --git a/sys/boot/efi/fdt/Makefile b/sys/boot/efi/fdt/Makefile
index 05fbee8..19a4c49 100644
--- a/sys/boot/efi/fdt/Makefile
+++ b/sys/boot/efi/fdt/Makefile
@@ -10,7 +10,7 @@ INTERNALLIB=
SRCS= efi_fdt.c
CFLAGS+= -ffreestanding -msoft-float
-.if ${MACHINE_CPUARCH} == "arm64"
+.if ${MACHINE_CPUARCH} == "aarch64"
CFLAGS+= -mgeneral-regs-only
.endif
@@ -18,7 +18,7 @@ CFLAGS+= -I${.CURDIR}/../../../../lib/libstand/
# EFI library headers
CFLAGS+= -I${.CURDIR}/../include
-CFLAGS+= -I${.CURDIR}/../include/${MACHINE_CPUARCH}
+CFLAGS+= -I${.CURDIR}/../include/${MACHINE}
# libfdt headers
CFLAGS+= -I${.CURDIR}/../../fdt
@@ -27,7 +27,7 @@ CFLAGS+= -I${.CURDIR}/../../fdt
CFLAGS+= -I${.CURDIR}/../../common -I${.CURDIR}/../../.. -I.
machine:
- ln -sf ${.CURDIR}/../../../${MACHINE_CPUARCH}/include machine
+ ln -sf ${.CURDIR}/../../../${MACHINE}/include machine
CLEANFILES+= machine
diff --git a/sys/boot/efi/include/arm/efibind.h b/sys/boot/efi/include/arm/efibind.h
new file mode 100644
index 0000000..85537ad
--- /dev/null
+++ b/sys/boot/efi/include/arm/efibind.h
@@ -0,0 +1,165 @@
+/* $FreeBSD$ */
+/*++
+
+Copyright (c) 2004 - 2012, Intel Corporation. All rights reserved.
+
+This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution. The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+Module Name:
+
+ EfiBind.h
+
+Abstract:
+
+ Processor or Compiler specific defines and types for IA-32.
+ We are using the ANSI C 2000 _t type definitions for basic types.
+ This it technically a violation of the coding standard, but they
+ are used to make EfiTypes.h portable. Code other than EfiTypes.h
+ should never use any ANSI C 2000 _t integer types.
+
+--*/
+
+#ifndef _EFI_BIND_H_
+#define _EFI_BIND_H_
+
+
+#define EFI_DRIVER_ENTRY_POINT(InitFunction)
+#define EFI_APPLICATION_ENTRY_POINT EFI_DRIVER_ENTRY_POINT
+
+
+//
+// Make sure we are useing the correct packing rules per EFI specification
+//
+#ifndef __GNUC__
+#pragma pack()
+#endif
+
+
+#ifdef __FreeBSD__
+#include <sys/stdint.h>
+#else
+//
+// Assume standard IA-32 alignment.
+// BugBug: Need to check portability of long long
+//
+typedef unsigned long long uint64_t;
+typedef long long int64_t;
+typedef unsigned int uint32_t;
+typedef int int32_t;
+typedef unsigned short uint16_t;
+typedef short int16_t;
+typedef unsigned char uint8_t;
+typedef signed char int8_t;
+#endif
+
+typedef uint64_t UINT64;
+typedef int64_t INT64;
+typedef uint32_t UINT32;
+typedef int32_t INT32;
+typedef uint16_t UINT16;
+typedef int16_t INT16;
+typedef uint8_t UINT8;
+typedef int8_t INT8;
+
+#undef VOID
+#define VOID void
+
+//
+// Native integer size in stdint.h
+//
+typedef uint32_t UINTN;
+typedef int32_t INTN;
+
+#define EFIERR(a) (0x80000000 | a)
+#define EFI_ERROR_MASK 0x80000000
+#define EFIERR_OEM(a) (0xc0000000 | a)
+
+//
+// Processor specific defines
+//
+#define EFI_MAX_BIT 0x80000000
+#define MAX_2_BITS 0xC0000000
+
+//
+// Maximum legal IA-32 address
+//
+#define EFI_MAX_ADDRESS 0xFFFFFFFF
+
+//
+// Bad pointer value to use in check builds.
+// if you see this value you are using uninitialized or free'ed data
+//
+#define EFI_BAD_POINTER 0xAFAFAFAF
+#define EFI_BAD_POINTER_AS_BYTE 0xAF
+
+#define EFI_DEADLOOP() { volatile UINTN __iii; __iii = 1; while (__iii); }
+
+//
+// Inject a break point in the code to assist debugging for NT Emulation Environment
+// For real hardware, just put in a halt loop. Don't do a while(1) because the
+// compiler will optimize away the rest of the function following, so that you run out in
+// the weeds if you skip over it with a debugger.
+//
+#define EFI_BREAKPOINT EFI_DEADLOOP()
+
+
+//
+// Memory Fence forces serialization, and is needed to support out of order
+// memory transactions. The Memory Fence is mainly used to make sure IO
+// transactions complete in a deterministic sequence, and to syncronize locks
+// an other MP code. Currently no memory fencing is required.
+//
+#define MEMORY_FENCE()
+
+//
+// Some compilers don't support the forward reference construct:
+// typedef struct XXXXX. The forward reference is required for
+// ANSI compatibility.
+//
+// The following macro provide a workaround for such cases.
+//
+
+
+#ifdef EFI_NO_INTERFACE_DECL
+ #define EFI_FORWARD_DECLARATION(x)
+#else
+ #define EFI_FORWARD_DECLARATION(x) typedef struct _##x x
+#endif
+
+
+//
+// Some C compilers optimize the calling conventions to increase performance.
+// EFIAPI is used to make all public APIs follow the standard C calling
+// convention.
+//
+#define EFIAPI
+
+
+
+//
+// For symbol name in GNU assembly code, an extra "_" is necessary
+//
+#if defined(__GNUC__)
+ ///
+ /// Private worker functions for ASM_PFX()
+ ///
+ #define _CONCATENATE(a, b) __CONCATENATE(a, b)
+ #define __CONCATENATE(a, b) a ## b
+
+ ///
+ /// The __USER_LABEL_PREFIX__ macro predefined by GNUC represents the prefix
+ /// on symbols in assembly language.
+ ///
+ #define ASM_PFX(name) _CONCATENATE (__USER_LABEL_PREFIX__, name)
+
+#endif
+
+#define INTERFACE_DECL(x) struct x
+
+#endif
diff --git a/sys/boot/efi/include/arm64/efibind.h b/sys/boot/efi/include/arm64/efibind.h
new file mode 100644
index 0000000..21f0d25
--- /dev/null
+++ b/sys/boot/efi/include/arm64/efibind.h
@@ -0,0 +1,219 @@
+/* $FreeBSD$ */
+/*++
+
+Copyright (c) 1999 - 2003 Intel Corporation. All rights reserved
+This software and associated documentation (if any) is furnished
+under a license and may only be used or copied in accordance
+with the terms of the license. Except as permitted by such
+license, no part of this software or documentation may be
+reproduced, stored in a retrieval system, or transmitted in any
+form or by any means without the express written consent of
+Intel Corporation.
+
+Module Name:
+
+ efefind.h
+
+Abstract:
+
+ EFI to compile bindings
+
+
+
+
+Revision History
+
+--*/
+
+#pragma pack()
+
+
+#ifdef __FreeBSD__
+#include <sys/stdint.h>
+#else
+//
+// Basic int types of various widths
+//
+
+#if (__STDC_VERSION__ < 199901L )
+
+ // No ANSI C 1999/2000 stdint.h integer width declarations
+
+ #if _MSC_EXTENSIONS
+
+ // Use Microsoft C compiler integer width declarations
+
+ typedef unsigned __int64 uint64_t;
+ typedef __int64 int64_t;
+ typedef unsigned __int32 uint32_t;
+ typedef __int32 int32_t;
+ typedef unsigned __int16 uint16_t;
+ typedef __int16 int16_t;
+ typedef unsigned __int8 uint8_t;
+ typedef __int8 int8_t;
+ #else
+ #ifdef UNIX_LP64
+
+ // Use LP64 programming model from C_FLAGS for integer width declarations
+
+ typedef unsigned long uint64_t;
+ typedef long int64_t;
+ typedef unsigned int uint32_t;
+ typedef int int32_t;
+ typedef unsigned short uint16_t;
+ typedef short int16_t;
+ typedef unsigned char uint8_t;
+ typedef char int8_t;
+ #else
+
+ // Assume P64 programming model from C_FLAGS for integer width declarations
+
+ typedef unsigned long long uint64_t;
+ typedef long long int64_t;
+ typedef unsigned int uint32_t;
+ typedef int int32_t;
+ typedef unsigned short uint16_t;
+ typedef short int16_t;
+ typedef unsigned char uint8_t;
+ typedef char int8_t;
+ #endif
+ #endif
+#endif
+#endif /* __FreeBSD__ */
+
+//
+// Basic EFI types of various widths
+//
+
+
+typedef uint64_t UINT64;
+typedef int64_t INT64;
+typedef uint32_t UINT32;
+typedef int32_t INT32;
+typedef uint16_t UINT16;
+typedef int16_t INT16;
+typedef uint8_t UINT8;
+typedef int8_t INT8;
+
+
+#undef VOID
+#define VOID void
+
+
+typedef int64_t INTN;
+typedef uint64_t UINTN;
+
+//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+// BugBug: Code to debug
+//
+#define BIT63 0x8000000000000000
+
+#define PLATFORM_IOBASE_ADDRESS (0xffffc000000 | BIT63)
+#define PORT_TO_MEMD(_Port) (PLATFORM_IOBASE_ADDRESS | ( ( ( (_Port) & 0xfffc) << 10 ) | ( (_Port) & 0x0fff) ) )
+
+//
+// Macro's with casts make this much easier to use and read.
+//
+#define PORT_TO_MEM8D(_Port) (*(UINT8 *)(PORT_TO_MEMD(_Port)))
+#define POST_CODE(_Data) (PORT_TO_MEM8D(0x80) = (_Data))
+//
+// BugBug: End Debug Code!!!
+//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+#define EFIERR(a) (0x8000000000000000 | a)
+#define EFI_ERROR_MASK 0x8000000000000000
+#define EFIERR_OEM(a) (0xc000000000000000 | a)
+
+#define BAD_POINTER 0xFBFBFBFBFBFBFBFB
+#define MAX_ADDRESS 0xFFFFFFFFFFFFFFFF
+
+#pragma intrinsic (__break)
+#define BREAKPOINT() __break(0)
+
+//
+// Pointers must be aligned to these address to function
+// you will get an alignment fault if this value is less than 8
+//
+#define MIN_ALIGNMENT_SIZE 8
+
+#define ALIGN_VARIABLE(Value , Adjustment) \
+ (UINTN) Adjustment = 0; \
+ if((UINTN)Value % MIN_ALIGNMENT_SIZE) \
+ (UINTN)Adjustment = MIN_ALIGNMENT_SIZE - ((UINTN)Value % MIN_ALIGNMENT_SIZE); \
+ Value = (UINTN)Value + (UINTN)Adjustment
+
+//
+// Define macros to create data structure signatures.
+//
+
+#define EFI_SIGNATURE_16(A,B) ((A) | (B<<8))
+#define EFI_SIGNATURE_32(A,B,C,D) (EFI_SIGNATURE_16(A,B) | (EFI_SIGNATURE_16(C,D) << 16))
+#define EFI_SIGNATURE_64(A,B,C,D,E,F,G,H) (EFI_SIGNATURE_32(A,B,C,D) | ((UINT64)(EFI_SIGNATURE_32(E,F,G,H)) << 32))
+
+//
+// EFIAPI - prototype calling convention for EFI function pointers
+// BOOTSERVICE - prototype for implementation of a boot service interface
+// RUNTIMESERVICE - prototype for implementation of a runtime service interface
+// RUNTIMEFUNCTION - prototype for implementation of a runtime function that is not a service
+// RUNTIME_CODE - pragma macro for declaring runtime code
+//
+
+#ifndef EFIAPI // Forces EFI calling conventions reguardless of compiler options
+ #if _MSC_EXTENSIONS
+ #define EFIAPI __cdecl // Force C calling convention for Microsoft C compiler
+ #else
+ #define EFIAPI // Substitute expresion to force C calling convention
+ #endif
+#endif
+
+#define BOOTSERVICE
+#define RUNTIMESERVICE
+#define RUNTIMEFUNCTION
+
+#define RUNTIME_CODE(a) alloc_text("rtcode", a)
+#define BEGIN_RUNTIME_DATA() data_seg("rtdata")
+#define END_RUNTIME_DATA() data_seg()
+
+#define VOLATILE volatile
+
+//
+// BugBug: Need to find out if this is portable accross compliers.
+//
+void __mfa (void);
+#pragma intrinsic (__mfa)
+#define MEMORY_FENCE() __mfa()
+
+#ifdef EFI_NO_INTERFACE_DECL
+ #define EFI_FORWARD_DECLARATION(x)
+ #define EFI_INTERFACE_DECL(x)
+#else
+ #define EFI_FORWARD_DECLARATION(x) typedef struct _##x x
+ #define EFI_INTERFACE_DECL(x) typedef struct x
+#endif
+
+//
+// When build similiar to FW, then link everything together as
+// one big module.
+//
+
+#define EFI_DRIVER_ENTRY_POINT(InitFunction)
+
+#define LOAD_INTERNAL_DRIVER(_if, type, name, entry) \
+ (_if)->LoadInternal(type, name, entry)
+// entry(NULL, ST)
+
+#ifdef __FreeBSD__
+#define INTERFACE_DECL(x) struct x
+#else
+//
+// Some compilers don't support the forward reference construct:
+// typedef struct XXXXX
+//
+// The following macro provide a workaround for such cases.
+//
+#ifdef NO_INTERFACE_DECL
+#define INTERFACE_DECL(x)
+#else
+#define INTERFACE_DECL(x) typedef struct x
+#endif
+#endif
diff --git a/sys/boot/efi/libefi/Makefile b/sys/boot/efi/libefi/Makefile
index 2a3a251..88ca242 100644
--- a/sys/boot/efi/libefi/Makefile
+++ b/sys/boot/efi/libefi/Makefile
@@ -10,7 +10,7 @@ SRCS= delay.c efi_console.c efinet.c efipart.c errno.c handles.c \
CFLAGS+= -fPIC -mno-red-zone
.endif
CFLAGS+= -I${.CURDIR}/../include
-CFLAGS+= -I${.CURDIR}/../include/${MACHINE_CPUARCH}
+CFLAGS+= -I${.CURDIR}/../include/${MACHINE}
CFLAGS+= -I${.CURDIR}/../../../../lib/libstand
# Pick up the bootstrap header for some interface items
diff --git a/sys/boot/efi/loader/Makefile b/sys/boot/efi/loader/Makefile
index e109b72..5585f78 100644
--- a/sys/boot/efi/loader/Makefile
+++ b/sys/boot/efi/loader/Makefile
@@ -20,19 +20,23 @@ SRCS= autoload.c \
copy.c \
devicename.c \
main.c \
+ reloc.c \
+ smbios.c \
vers.c
-.PATH: ${.CURDIR}/arch/${MACHINE_CPUARCH}
-.include "${.CURDIR}/arch/${MACHINE_CPUARCH}/Makefile.inc"
+.PATH: ${.CURDIR}/arch/${MACHINE}
+# For smbios.c
+.PATH: ${.CURDIR}/../../i386/libi386
+.include "${.CURDIR}/arch/${MACHINE}/Makefile.inc"
-CFLAGS+= -fPIC
CFLAGS+= -I${.CURDIR}
-CFLAGS+= -I${.CURDIR}/arch/${MACHINE_CPUARCH}
+CFLAGS+= -I${.CURDIR}/arch/${MACHINE}
CFLAGS+= -I${.CURDIR}/../include
-CFLAGS+= -I${.CURDIR}/../include/${MACHINE_CPUARCH}
+CFLAGS+= -I${.CURDIR}/../include/${MACHINE}
CFLAGS+= -I${.CURDIR}/../../../contrib/dev/acpica/include
CFLAGS+= -I${.CURDIR}/../../..
-CFLAGS+= -DNO_PCI
+CFLAGS+= -I${.CURDIR}/../../i386/libi386
+CFLAGS+= -DNO_PCI -DEFI
.if ${MK_FORTH} != "no"
BOOT_FORTH= yes
@@ -42,6 +46,15 @@ CFLAGS+= -I${.CURDIR}/../../ficl/${MACHINE_CPUARCH}
LIBFICL= ${.OBJDIR}/../../ficl/libficl.a
.endif
+LOADER_FDT_SUPPORT?= no
+.if ${MK_FDT} != "no" && ${LOADER_FDT_SUPPORT} != "no"
+CFLAGS+= -I${.CURDIR}/../../fdt
+CFLAGS+= -I${.OBJDIR}/../../fdt
+CFLAGS+= -DLOADER_FDT_SUPPORT
+LIBEFI_FDT= ${.OBJDIR}/../../efi/fdt/libefi_fdt.a
+LIBFDT= ${.OBJDIR}/../../fdt/libfdt.a
+.endif
+
# Include bcache code.
HAVE_BCACHE= yes
@@ -57,12 +70,12 @@ CFLAGS+= -I${.CURDIR}/../../common
FILES= loader.efi
FILESMODE_loader.efi= ${BINMODE}
-LDSCRIPT= ${.CURDIR}/arch/${MACHINE_CPUARCH}/ldscript.${MACHINE_CPUARCH}
-LDFLAGS= -Wl,-T${LDSCRIPT} -Wl,-Bsymbolic -shared -Wl,-znocombreloc
+LDSCRIPT= ${.CURDIR}/arch/${MACHINE}/ldscript.${MACHINE}
+LDFLAGS+= -Wl,-T${LDSCRIPT} -Wl,-Bsymbolic -shared
CLEANFILES= vers.c loader.efi
-NEWVERSWHAT= "EFI loader" ${MACHINE_CPUARCH}
+NEWVERSWHAT= "EFI loader" ${MACHINE}
vers.c: ${.CURDIR}/../../common/newvers.sh ${.CURDIR}/../../efi/loader/version
sh ${.CURDIR}/../../common/newvers.sh ${.CURDIR}/version ${NEWVERSWHAT}
@@ -74,6 +87,8 @@ OBJDUMP?= objdump
EFI_TARGET= efi-app-x86_64
.elif ${MACHINE_CPUARCH} == "i386"
EFI_TARGET= efi-app-ia32
+.else
+EFI_TARGET= binary
.endif
loader.efi: loader.sym
@@ -81,26 +96,32 @@ loader.efi: loader.sym
${OBJDUMP} -t ${.ALLSRC} | fgrep '*UND*'; \
exit 1; \
fi
- ${OBJCOPY} -j .text -j .sdata -j .data \
+ ${OBJCOPY} -j .peheader -j .text -j .sdata -j .data \
-j .dynamic -j .dynsym -j .rel.dyn \
-j .rela.dyn -j .reloc -j .eh_frame -j set_Xcommand_set \
--output-target=${EFI_TARGET} ${.ALLSRC} ${.TARGET}
LIBEFI= ${.OBJDIR}/../libefi/libefi.a
-DPADD= ${LIBFICL} ${LIBEFI} ${LIBSTAND} ${LDSCRIPT}
-LDADD= ${LIBFICL} ${LIBEFI} ${LIBSTAND}
+DPADD= ${LIBFICL} ${LIBEFI} ${LIBFDT} ${LIBEFI_FDT} ${LIBSTAND} \
+ ${LDSCRIPT}
+LDADD= ${LIBFICL} ${LIBEFI} ${LIBFDT} ${LIBEFI_FDT} ${LIBSTAND}
.endif # ${COMPILER_TYPE} != "gcc"
.include <bsd.prog.mk>
-beforedepend ${OBJS}: machine x86
+beforedepend ${OBJS}: machine
-CLEANFILES+= machine x86
+CLEANFILES+= machine
machine:
- ln -sf ${.CURDIR}/../../../amd64/include machine
+ ln -sf ${.CURDIR}/../../../${MACHINE}/include machine
+
+.if ${MACHINE_CPUARCH} == "amd64" || ${MACHINE_CPUARCH} == "i386"
+beforedepend ${OBJS}: x86
+CLEANFILES+= x86
x86:
ln -sf ${.CURDIR}/../../../x86/include x86
+.endif
diff --git a/sys/boot/efi/loader/arch/amd64/Makefile.inc b/sys/boot/efi/loader/arch/amd64/Makefile.inc
index 3f2b68e..fee959b 100644
--- a/sys/boot/efi/loader/arch/amd64/Makefile.inc
+++ b/sys/boot/efi/loader/arch/amd64/Makefile.inc
@@ -3,9 +3,11 @@
SRCS+= amd64_tramp.S \
start.S \
framebuffer.c \
- elf64_freebsd.c \
- reloc.c
+ elf64_freebsd.c
.PATH: ${.CURDIR}/../../i386/libi386
SRCS+= nullconsole.c \
comconsole.c
+
+CFLAGS+= -fPIC
+LDFLAGS+= -Wl,-znocombreloc
diff --git a/sys/boot/efi/loader/arch/arm/Makefile.inc b/sys/boot/efi/loader/arch/arm/Makefile.inc
new file mode 100644
index 0000000..b2876ca
--- /dev/null
+++ b/sys/boot/efi/loader/arch/arm/Makefile.inc
@@ -0,0 +1,6 @@
+# $FreeBSD$
+
+SRCS+= exec.c \
+ start.S
+
+LOADER_FDT_SUPPORT=yes
diff --git a/sys/boot/efi/loader/arch/arm/exec.c b/sys/boot/efi/loader/arch/arm/exec.c
new file mode 100644
index 0000000..1cbbce5
--- /dev/null
+++ b/sys/boot/efi/loader/arch/arm/exec.c
@@ -0,0 +1,107 @@
+/*-
+ * Copyright (c) 2001 Benno Rice <benno@FreeBSD.org>
+ * Copyright (c) 2007 Semihalf, Rafal Jaworowski <raj@semihalf.com>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/linker.h>
+
+#include <machine/md_var.h>
+#include <machine/metadata.h>
+#include <machine/elf.h>
+
+#include <stand.h>
+
+#include <efi.h>
+#include <efilib.h>
+
+#include "bootstrap.h"
+#include "loader_efi.h"
+
+extern vm_offset_t md_load(char *, vm_offset_t *);
+
+int
+__elfN(arm_load)(char *filename, u_int64_t dest,
+ struct preloaded_file **result)
+{
+ int r;
+
+ r = __elfN(loadfile)(filename, dest, result);
+ if (r != 0)
+ return (r);
+
+ return (0);
+}
+
+int
+__elfN(arm_exec)(struct preloaded_file *fp)
+{
+ struct file_metadata *fmp;
+ vm_offset_t modulep, kernend;
+ Elf_Ehdr *e;
+ int error;
+ void (*entry)(void *);
+ EFI_STATUS status;
+
+ if ((fmp = file_findmetadata(fp, MODINFOMD_ELFHDR)) == NULL)
+ return (EFTYPE);
+
+ e = (Elf_Ehdr *)&fmp->md_data;
+
+ if ((error = bi_load(fp->f_args, &modulep, &kernend)) != 0)
+ return (error);
+
+ entry = efi_translate(e->e_entry);
+ printf("Kernel entry at 0x%x...\n", (unsigned)entry);
+ printf("Kernel args: %s\n", fp->f_args);
+ printf("modulep: %#x\n", modulep);
+ printf("relocation_offset %llx\n", __elfN(relocation_offset));
+
+ status = BS->ExitBootServices(IH, efi_mapkey);
+ if (EFI_ERROR(status)) {
+ printf("%s: ExitBootServices() returned 0x%lx\n", __func__,
+ (long)status);
+ return (EINVAL);
+ }
+
+ dev_cleanup();
+
+ (*entry)((void *)modulep);
+ panic("exec returned");
+}
+
+static struct file_format arm_elf = {
+ __elfN(arm_load),
+ __elfN(arm_exec)
+};
+
+struct file_format *file_formats[] = {
+ &arm_elf,
+ NULL
+};
+
diff --git a/sys/boot/efi/loader/arch/arm/ldscript.arm b/sys/boot/efi/loader/arch/arm/ldscript.arm
new file mode 100644
index 0000000..6404c0c
--- /dev/null
+++ b/sys/boot/efi/loader/arch/arm/ldscript.arm
@@ -0,0 +1,62 @@
+/* $FreeBSD$ */
+OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm",
+ "elf32-littlearm")
+OUTPUT_ARCH(arm)
+ENTRY(_start)
+SECTIONS
+{
+ /* Read-only sections, merged into text segment: */
+ . = 0;
+ ImageBase = .;
+ .text : {
+ *(.peheader)
+ *(.text .stub .text.* .gnu.linkonce.t.*)
+ /* .gnu.warning sections are handled specially by elf32.em. */
+ *(.gnu.warning)
+ *(.gnu.linkonce.t*)
+ } =0
+ _etext = .;
+ PROVIDE (etext = .);
+ . = ALIGN(4096);
+ .data :
+ {
+ *(.data *.data.*)
+ *(.gnu.linkonce.d*)
+ *(.rodata)
+ *(.rodata.*)
+ CONSTRUCTORS
+
+ PROVIDE (__bss_start = .);
+ *(.sbss)
+ *(.scommon)
+ *(.dynsbss)
+ *(.dynbss)
+ *(.bss)
+ *(COMMON)
+ PROVIDE (__bss_end = .);
+ }
+ /* We want the small data sections together, so single-instruction offsets
+ can access them all, and initialized data all before uninitialized, so
+ we can shorten the on-disk segment size. */
+ .sdata : {
+ *(.got.plt .got)
+ *(.sdata*.sdata.* .gnu.linkonce.s.*)
+ }
+ set_Xcommand_set : {
+ __start_set_Xcommand_set = .;
+ *(set_Xcommand_set)
+ __stop_set_Xcommand_set = .;
+ }
+ __gp = .;
+ .plt : { *(.plt) }
+ .dynamic : { *(.dynamic) }
+ .reloc : { *(.reloc) }
+ .dynsym : { *(.dynsym) }
+ .dynstr : { *(.dynstr) }
+ .rel.dyn : {
+ *(.rel.*)
+ *(.relset_*)
+ }
+ _edata = .;
+ .hash : { *(.hash) }
+}
diff --git a/sys/boot/efi/loader/arch/arm/start.S b/sys/boot/efi/loader/arch/arm/start.S
new file mode 100644
index 0000000..4160655
--- /dev/null
+++ b/sys/boot/efi/loader/arch/arm/start.S
@@ -0,0 +1,189 @@
+/*-
+ * Copyright (c) 2014, 2015 Andrew Turner
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <machine/asm.h>
+
+/*
+ * We need to be a PE32 file for EFI. On some architectures we can use
+ * objcopy to create the correct file, however on arm we need to do
+ * it ourselves.
+ */
+
+#define IMAGE_FILE_MACHINE_ARM 0x01c2
+
+#define IMAGE_SCN_CNT_CODE 0x00000020
+#define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040
+#define IMAGE_SCN_MEM_DISCARDABLE 0x02000000
+#define IMAGE_SCN_MEM_EXECUTE 0x20000000
+#define IMAGE_SCN_MEM_READ 0x40000000
+
+ .section .peheader
+efi_start:
+ /* The MS-DOS Stub, only used to get the offset of the COFF header */
+ .ascii "MZ"
+ .short 0
+ .space 0x38
+ .long pe_sig - efi_start
+
+ /* The PE32 Signature. Needs to be 8-byte aligned */
+ .align 3
+pe_sig:
+ .ascii "PE"
+ .short 0
+coff_head:
+ .short IMAGE_FILE_MACHINE_ARM /* ARM file */
+ .short 2 /* 2 Sections */
+ .long 0 /* Timestamp */
+ .long 0 /* No symbol table */
+ .long 0 /* No symbols */
+ .short section_table - optional_header /* Optional header size */
+ .short 0 /* Characteristics TODO: Fill in */
+
+optional_header:
+ .short 0x010b /* PE32 (32-bit addressing) */
+ .byte 0 /* Major linker version */
+ .byte 0 /* Minor linker version */
+ .long _edata - _end_header /* Code size */
+ .long 0 /* No initialized data */
+ .long 0 /* No uninitialized data */
+ .long _start - efi_start /* Entry point */
+ .long _end_header - efi_start /* Start of code */
+ .long 0 /* Start of data */
+
+optional_windows_header:
+ .long 0 /* Image base */
+ .long 32 /* Section Alignment */
+ .long 8 /* File alignment */
+ .short 0 /* Major OS version */
+ .short 0 /* Minor OS version */
+ .short 0 /* Major image version */
+ .short 0 /* Minor image version */
+ .short 0 /* Major subsystem version */
+ .short 0 /* Minor subsystem version */
+ .long 0 /* Win32 version */
+ .long _edata - efi_start /* Image size */
+ .long _end_header - efi_start /* Header size */
+ .long 0 /* Checksum */
+ .short 0xa /* Subsystem (EFI app) */
+ .short 0 /* DLL Characteristics */
+ .long 0 /* Stack reserve */
+ .long 0 /* Stack commit */
+ .long 0 /* Heap reserve */
+ .long 0 /* Heap commit */
+ .long 0 /* Loader flags */
+ .long 6 /* Number of RVAs */
+
+ /* RVAs: */
+ .quad 0
+ .quad 0
+ .quad 0
+ .quad 0
+ .quad 0
+ .quad 0
+
+section_table:
+ /* We need a .reloc section for EFI */
+ .ascii ".reloc"
+ .byte 0
+ .byte 0 /* Pad to 8 bytes */
+ .long 0 /* Virtual size */
+ .long 0 /* Virtual address */
+ .long 0 /* Size of raw data */
+ .long 0 /* Pointer to raw data */
+ .long 0 /* Pointer to relocations */
+ .long 0 /* Pointer to line numbers */
+ .short 0 /* Number of relocations */
+ .short 0 /* Number of line numbers */
+ .long (IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | \
+ IMAGE_SCN_MEM_DISCARDABLE) /* Characteristics */
+
+ /* The contents of the loader */
+ .ascii ".text"
+ .byte 0
+ .byte 0
+ .byte 0 /* Pad to 8 bytes */
+ .long _edata - _end_header /* Virtual size */
+ .long _end_header - efi_start /* Virtual address */
+ .long _edata - _end_header /* Size of raw data */
+ .long _end_header - efi_start /* Pointer to raw data */
+ .long 0 /* Pointer to relocations */
+ .long 0 /* Pointer to line numbers */
+ .short 0 /* Number of relocations */
+ .short 0 /* Number of line numbers */
+ .long (IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE | \
+ IMAGE_SCN_MEM_READ) /* Characteristics */
+_end_header:
+
+ .text
+_start:
+ /* Save the boot params to the stack */
+ push {r0, r1}
+
+ adr r0, .Lbase
+ ldr r1, [r0]
+ sub r5, r0, r1
+
+ ldr r0, .Limagebase
+ add r0, r0, r5
+ ldr r1, .Ldynamic
+ add r1, r1, r5
+
+ bl _C_LABEL(_reloc)
+
+ /* Zero the BSS, _reloc fixed the values for us */
+ ldr r0, .Lbss
+ ldr r1, .Lbssend
+ mov r2, #0
+
+1: cmp r0, r1
+ bgt 2f
+ str r2, [r0], #4
+ b 1b
+2:
+
+ pop {r0, r1}
+ bl _C_LABEL(efi_main)
+
+1: b 1b
+
+.Lbase:
+ .word .
+.Limagebase:
+ .word ImageBase
+.Ldynamic:
+ .word _DYNAMIC
+.Lbss:
+ .word __bss_start
+.Lbssend:
+ .word __bss_end
+
+.align 3
+stack:
+ .space 512
+stack_end:
+
diff --git a/sys/boot/efi/loader/arch/arm64/Makefile.inc b/sys/boot/efi/loader/arch/arm64/Makefile.inc
new file mode 100644
index 0000000..e5064cc
--- /dev/null
+++ b/sys/boot/efi/loader/arch/arm64/Makefile.inc
@@ -0,0 +1,9 @@
+# $FreeBSD$
+
+LOADER_FDT_SUPPORT=yes
+SRCS+= exec.c \
+ start.S
+
+.PATH: ${.CURDIR}/../../arm64/libarm64
+CFLAGS+=-I${.CURDIR}/../../arm64/libarm64
+SRCS+= cache.c
diff --git a/sys/boot/efi/loader/arch/arm64/exec.c b/sys/boot/efi/loader/arch/arm64/exec.c
new file mode 100644
index 0000000..1f72269
--- /dev/null
+++ b/sys/boot/efi/loader/arch/arm64/exec.c
@@ -0,0 +1,109 @@
+/*-
+ * Copyright (c) 2006 Marcel Moolenaar
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <stand.h>
+#include <string.h>
+
+#include <sys/param.h>
+#include <sys/linker.h>
+#include <machine/elf.h>
+
+#include <bootstrap.h>
+
+#include <efi.h>
+#include <efilib.h>
+
+#include "loader_efi.h"
+#include "cache.h"
+
+static int elf64_exec(struct preloaded_file *amp);
+static int elf64_obj_exec(struct preloaded_file *amp);
+
+int bi_load(char *args, vm_offset_t *modulep, vm_offset_t *kernendp);
+
+static struct file_format arm64_elf = {
+ elf64_loadfile,
+ elf64_exec
+};
+
+struct file_format *file_formats[] = {
+ &arm64_elf,
+ NULL
+};
+
+static int
+elf64_exec(struct preloaded_file *fp)
+{
+ vm_offset_t modulep, kernendp;
+ vm_offset_t clean_addr;
+ size_t clean_size;
+ struct file_metadata *md;
+ EFI_STATUS status;
+ EFI_PHYSICAL_ADDRESS addr;
+ Elf_Ehdr *ehdr;
+ int err;
+ void (*entry)(vm_offset_t);
+
+ if ((md = file_findmetadata(fp, MODINFOMD_ELFHDR)) == NULL)
+ return(EFTYPE);
+
+ ehdr = (Elf_Ehdr *)&(md->md_data);
+ entry = efi_translate(ehdr->e_entry);
+
+ err = bi_load(fp->f_args, &modulep, &kernendp);
+ if (err != 0)
+ return (err);
+
+ status = BS->ExitBootServices(IH, efi_mapkey);
+ if (EFI_ERROR(status)) {
+ printf("%s: ExitBootServices() returned 0x%lx\n", __func__,
+ (long)status);
+ return (EINVAL);
+ }
+
+ /* Clean D-cache under kernel area and invalidate whole I-cache */
+ clean_addr = efi_translate(fp->f_addr);
+ clean_size = efi_translate(kernendp) - clean_addr;
+
+ cpu_flush_dcache((void *)clean_addr, clean_size);
+ cpu_inval_icache(NULL, 0);
+
+ (*entry)(modulep);
+ panic("exec returned");
+}
+
+static int
+elf64_obj_exec(struct preloaded_file *fp)
+{
+
+ printf("%s called for preloaded file %p (=%s):\n", __func__, fp,
+ fp->f_name);
+ return (ENOSYS);
+}
+
diff --git a/sys/boot/efi/loader/arch/arm64/ldscript.arm64 b/sys/boot/efi/loader/arch/arm64/ldscript.arm64
new file mode 100644
index 0000000..7b62eaa
--- /dev/null
+++ b/sys/boot/efi/loader/arch/arm64/ldscript.arm64
@@ -0,0 +1,80 @@
+/* $FreeBSD$ */
+/*
+OUTPUT_FORMAT("elf64-aarch64-freebsd", "elf64-aarch64-freebsd", "elf64-aarch64-freebsd")
+*/
+OUTPUT_ARCH(aarch64)
+ENTRY(_start)
+SECTIONS
+{
+ /* Read-only sections, merged into text segment: */
+ . = 0;
+ ImageBase = .;
+ .text : {
+ *(.peheader)
+ *(.text .stub .text.* .gnu.linkonce.t.*)
+ /* .gnu.warning sections are handled specially by elf32.em. */
+ *(.gnu.warning)
+ *(.plt)
+ } =0x00300000010070000002000001000400
+ . = ALIGN(16);
+ .data : {
+ *(.rodata .rodata.* .gnu.linkonce.r.*)
+ *(.rodata1)
+ *(.sdata2 .sdata2.* .gnu.linkonce.s2.*)
+ *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*)
+ *(.opd)
+ *(.data .data.* .gnu.linkonce.d.*)
+ *(.data1)
+ *(.plabel)
+
+ . = ALIGN(16);
+ __bss_start = .;
+ *(.sbss .sbss.* .gnu.linkonce.sb.*)
+ *(.scommon)
+ *(.dynbss)
+ *(.bss *.bss.*)
+ *(COMMON)
+ . = ALIGN(16);
+ __bss_end = .;
+ }
+ . = ALIGN(16);
+ set_Xcommand_set : {
+ __start_set_Xcommand_set = .;
+ *(set_Xcommand_set)
+ __stop_set_Xcommand_set = .;
+ }
+ . = ALIGN(16);
+ __gp = .;
+ .sdata : {
+ *(.got.plt .got)
+ *(.sdata .sdata.* .gnu.linkonce.s.*)
+ *(dynsbss)
+ *(.scommon)
+ }
+ . = ALIGN(16);
+ .dynamic : { *(.dynamic) }
+ . = ALIGN(16);
+ .rela.dyn : {
+ *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*)
+ *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*)
+ *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*)
+ *(.rela.got)
+ *(.rela.sdata .rela.sdata.* .rela.gnu.linkonce.s.*)
+ *(.rela.sbss .rela.sbss.* .rela.gnu.linkonce.sb.*)
+ *(.rela.sdata2 .rela.sdata2.* .rela.gnu.linkonce.s2.*)
+ *(.rela.sbss2 .rela.sbss2.* .rela.gnu.linkonce.sb2.*)
+ *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*)
+ *(.rela.plt)
+ *(.relset_*)
+ *(.rela.dyn .rela.dyn.*)
+ }
+ . = ALIGN(16);
+ .reloc : { *(.reloc) }
+ . = ALIGN(16);
+ .dynsym : { *(.dynsym) }
+ _edata = .;
+
+ /* Unused sections */
+ .dynstr : { *(.dynstr) }
+ .hash : { *(.hash) }
+}
diff --git a/sys/boot/efi/loader/arch/arm64/start.S b/sys/boot/efi/loader/arch/arm64/start.S
new file mode 100644
index 0000000..a8002fa
--- /dev/null
+++ b/sys/boot/efi/loader/arch/arm64/start.S
@@ -0,0 +1,165 @@
+/*-
+ * Copyright (c) 2014 Andrew Turner
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+/*
+ * We need to be a PE32+ file for EFI. On some architectures we can use
+ * objcopy to create the correct file, however on arm64 we need to do
+ * it ourselves.
+ */
+
+#define IMAGE_FILE_MACHINE_ARM64 0xaa64
+
+#define IMAGE_SCN_CNT_CODE 0x00000020
+#define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040
+#define IMAGE_SCN_MEM_DISCARDABLE 0x02000000
+#define IMAGE_SCN_MEM_EXECUTE 0x20000000
+#define IMAGE_SCN_MEM_READ 0x40000000
+
+ .section .peheader
+efi_start:
+ /* The MS-DOS Stub, only used to get the offset of the COFF header */
+ .ascii "MZ"
+ .short 0
+ .space 0x38
+ .long pe_sig - efi_start
+
+ /* The PE32 Signature. Needs to be 8-byte aligned */
+ .align 3
+pe_sig:
+ .ascii "PE"
+ .short 0
+coff_head:
+ .short IMAGE_FILE_MACHINE_ARM64 /* AArch64 file */
+ .short 2 /* 2 Sections */
+ .long 0 /* Timestamp */
+ .long 0 /* No symbol table */
+ .long 0 /* No symbols */
+ .short section_table - optional_header /* Optional header size */
+ .short 0 /* Characteristics TODO: Fill in */
+
+optional_header:
+ .short 0x020b /* PE32+ (64-bit addressing) */
+ .byte 0 /* Major linker version */
+ .byte 0 /* Minor linker version */
+ .long _edata - _end_header /* Code size */
+ .long 0 /* No initialized data */
+ .long 0 /* No uninitialized data */
+ .long _start - efi_start /* Entry point */
+ .long _end_header - efi_start /* Start of code */
+
+optional_windows_header:
+ .quad 0 /* Image base */
+ .long 32 /* Section Alignment */
+ .long 8 /* File alignment */
+ .short 0 /* Major OS version */
+ .short 0 /* Minor OS version */
+ .short 0 /* Major image version */
+ .short 0 /* Minor image version */
+ .short 0 /* Major subsystem version */
+ .short 0 /* Minor subsystem version */
+ .long 0 /* Win32 version */
+ .long _edata - efi_start /* Image size */
+ .long _end_header - efi_start /* Header size */
+ .long 0 /* Checksum */
+ .short 0xa /* Subsystem (EFI app) */
+ .short 0 /* DLL Characteristics */
+ .quad 0 /* Stack reserve */
+ .quad 0 /* Stack commit */
+ .quad 0 /* Heap reserve */
+ .quad 0 /* Heap commit */
+ .long 0 /* Loader flags */
+ .long 6 /* Number of RVAs */
+
+ /* RVAs: */
+ .quad 0
+ .quad 0
+ .quad 0
+ .quad 0
+ .quad 0
+ .quad 0
+
+section_table:
+ /* We need a .reloc section for EFI */
+ .ascii ".reloc"
+ .byte 0
+ .byte 0 /* Pad to 8 bytes */
+ .long 0 /* Virtual size */
+ .long 0 /* Virtual address */
+ .long 0 /* Size of raw data */
+ .long 0 /* Pointer to raw data */
+ .long 0 /* Pointer to relocations */
+ .long 0 /* Pointer to line numbers */
+ .short 0 /* Number of relocations */
+ .short 0 /* Number of line numbers */
+ .long (IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | \
+ IMAGE_SCN_MEM_DISCARDABLE) /* Characteristics */
+
+ /* The contents of the loader */
+ .ascii ".text"
+ .byte 0
+ .byte 0
+ .byte 0 /* Pad to 8 bytes */
+ .long _edata - _end_header /* Virtual size */
+ .long _end_header - efi_start /* Virtual address */
+ .long _edata - _end_header /* Size of raw data */
+ .long _end_header - efi_start /* Pointer to raw data */
+ .long 0 /* Pointer to relocations */
+ .long 0 /* Pointer to line numbers */
+ .short 0 /* Number of relocations */
+ .short 0 /* Number of line numbers */
+ .long (IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE | \
+ IMAGE_SCN_MEM_READ) /* Characteristics */
+_end_header:
+
+ .text
+ .globl _start
+_start:
+ /* Save the boot params to the stack */
+ stp x0, x1, [sp, #-16]!
+
+ adr x0, __bss_start
+ adr x1, __bss_end
+
+ b 2f
+
+1:
+ stp xzr, xzr, [x0], #16
+2:
+ cmp x0, x1
+ b.lo 1b
+
+ adr x0, ImageBase
+ adr x1, _DYNAMIC
+
+ bl _reloc
+
+ ldp x0, x1, [sp], #16
+
+ bl efi_main
+
+1: b 1b
diff --git a/sys/boot/efi/loader/arch/i386/Makefile.inc b/sys/boot/efi/loader/arch/i386/Makefile.inc
new file mode 100644
index 0000000..4e08c53
--- /dev/null
+++ b/sys/boot/efi/loader/arch/i386/Makefile.inc
@@ -0,0 +1,13 @@
+# $FreeBSD$
+
+SRCS+= start.S \
+ efimd.c \
+ elf32_freebsd.c \
+ exec.c
+
+.PATH: ${.CURDIR}/../../i386/libi386
+SRCS+= nullconsole.c \
+ comconsole.c
+
+CFLAGS+= -fPIC
+LDFLAGS+= -Wl,-znocombreloc
diff --git a/sys/boot/efi/loader/arch/i386/bootinfo.c b/sys/boot/efi/loader/arch/i386/bootinfo.c
index 853d044..cbd6e4e 100644
--- a/sys/boot/efi/loader/arch/i386/bootinfo.c
+++ b/sys/boot/efi/loader/arch/i386/bootinfo.c
@@ -219,7 +219,7 @@ bi_load(struct preloaded_file *fp, uint64_t *bi_addr)
bi.bi_version = 1;
// bi.bi_boothowto = bi_getboothowto(fp->f_args);
- /*
+ /*
* Allow the environment variable 'rootdev' to override the supplied
* device. This should perhaps go to MI code and/or have $rootdev
* tested/set by MI code before launching the kernel.
diff --git a/sys/boot/efi/loader/arch/i386/elf32_freebsd.c b/sys/boot/efi/loader/arch/i386/elf32_freebsd.c
index f193735..bae8f7b 100644
--- a/sys/boot/efi/loader/arch/i386/elf32_freebsd.c
+++ b/sys/boot/efi/loader/arch/i386/elf32_freebsd.c
@@ -48,9 +48,15 @@ static int elf32_obj_exec(struct preloaded_file *amp);
struct file_format i386_elf = { elf32_loadfile, elf32_exec };
struct file_format i386_elf_obj = { elf32_obj_loadfile, elf32_obj_exec };
+struct file_format *file_formats[] = {
+ &i386_elf,
+ &i386_elf_obj,
+ NULL
+};
+
/*
- * There is an ELF kernel and one or more ELF modules loaded.
- * We wish to start executing the kernel image, so make such
+ * There is an ELF kernel and one or more ELF modules loaded.
+ * We wish to start executing the kernel image, so make such
* preparations as are required, and do so.
*/
static int
diff --git a/sys/boot/efi/loader/arch/i386/i386_copy.c b/sys/boot/efi/loader/arch/i386/i386_copy.c
index 43c26ce..522913f 100644
--- a/sys/boot/efi/loader/arch/i386/i386_copy.c
+++ b/sys/boot/efi/loader/arch/i386/i386_copy.c
@@ -28,7 +28,7 @@
__FBSDID("$FreeBSD$");
/*
- * MD primitives supporting placement of module data
+ * MD primitives supporting placement of module data
*
* XXX should check load address/size against memory top.
*/
diff --git a/sys/boot/efi/loader/arch/i386/start.S b/sys/boot/efi/loader/arch/i386/start.S
index ea4597f..2be2478 100644
--- a/sys/boot/efi/loader/arch/i386/start.S
+++ b/sys/boot/efi/loader/arch/i386/start.S
@@ -33,7 +33,7 @@
#define EFI_SUCCESS 0
/*
- * EFI entry point.
+ * EFI entry point.
* _start(EFI_IMAGE image_handle, EFI_SYSTEM_TABLE *system_table);
*
* We calculate the base address along with _DYNAMIC, relocate us and finally
diff --git a/sys/boot/efi/loader/bootinfo.c b/sys/boot/efi/loader/bootinfo.c
index 28ec620..6ef83a8 100644
--- a/sys/boot/efi/loader/bootinfo.c
+++ b/sys/boot/efi/loader/bootinfo.c
@@ -46,11 +46,15 @@ __FBSDID("$FreeBSD$");
#include "bootstrap.h"
#include "loader_efi.h"
-#if defined(__amd64__) || defined(__i386__)
+#if defined(__amd64__)
#include <machine/specialreg.h>
#include "framebuffer.h"
#endif
+#if defined(LOADER_FDT_SUPPORT)
+#include <fdt_platform.h>
+#endif
+
UINTN efi_mapkey;
static const char howto_switches[] = "aCdrgDmphsv";
@@ -215,6 +219,9 @@ bi_copymodules(vm_offset_t addr)
if (fp->f_args)
MOD_ARGS(addr, fp->f_args, c);
v = fp->f_addr;
+#if defined(__arm__)
+ v -= __elfN(relocation_offset);
+#endif
MOD_ADDR(addr, v, c);
v = fp->f_size;
MOD_SIZE(addr, v, c);
@@ -237,7 +244,7 @@ bi_load_efi_data(struct preloaded_file *kfp)
UINT32 mmver;
struct efi_map_header *efihdr;
-#if defined(__amd64__) || defined(__i386__)
+#if defined(__amd64__)
struct efi_fb efifb;
if (efi_find_framebuffer(&efifb) == 0) {
@@ -324,6 +331,25 @@ bi_load(char *args, vm_offset_t *modulep, vm_offset_t *kernendp)
vm_offset_t size;
char *rootdevname;
int howto;
+#if defined(LOADER_FDT_SUPPORT)
+ vm_offset_t dtbp;
+ int dtb_size;
+#endif
+#if defined(__arm__)
+ vm_offset_t vaddr;
+ int i;
+ /*
+ * These metadata addreses must be converted for kernel after
+ * relocation.
+ */
+ uint32_t mdt[] = {
+ MODINFOMD_SSYM, MODINFOMD_ESYM, MODINFOMD_KERNEND,
+ MODINFOMD_ENVP,
+#if defined(LOADER_FDT_SUPPORT)
+ MODINFOMD_DTBP
+#endif
+ };
+#endif
howto = bi_getboothowto(args);
@@ -358,6 +384,16 @@ bi_load(char *args, vm_offset_t *modulep, vm_offset_t *kernendp)
/* Pad to a page boundary. */
addr = roundup(addr, PAGE_SIZE);
+#if defined(LOADER_FDT_SUPPORT)
+ /* Handle device tree blob */
+ dtbp = addr;
+ dtb_size = fdt_copy(addr);
+
+ /* Pad to a page boundary */
+ if (dtb_size)
+ addr += roundup(dtb_size, PAGE_SIZE);
+#endif
+
kfp = file_findfile(NULL, "elf kernel");
if (kfp == NULL)
kfp = file_findfile(NULL, "elf64 kernel");
@@ -366,6 +402,13 @@ bi_load(char *args, vm_offset_t *modulep, vm_offset_t *kernendp)
kernend = 0; /* fill it in later */
file_addmetadata(kfp, MODINFOMD_HOWTO, sizeof howto, &howto);
file_addmetadata(kfp, MODINFOMD_ENVP, sizeof envp, &envp);
+#if defined(LOADER_FDT_SUPPORT)
+ if (dtb_size)
+ file_addmetadata(kfp, MODINFOMD_DTBP, sizeof dtbp, &dtbp);
+ else
+ pager_output("WARNING! Trying to fire up the kernel, but no "
+ "device tree blob found!\n");
+#endif
file_addmetadata(kfp, MODINFOMD_KERNEND, sizeof kernend, &kernend);
bi_load_efi_data(kfp);
@@ -380,6 +423,22 @@ bi_load(char *args, vm_offset_t *modulep, vm_offset_t *kernendp)
md = file_findmetadata(kfp, MODINFOMD_KERNEND);
bcopy(&kernend, md->md_data, sizeof kernend);
+#if defined(__arm__)
+ *modulep -= __elfN(relocation_offset);
+
+ /* Do relocation fixup on metadata of each module. */
+ for (xp = file_findfile(NULL, NULL); xp != NULL; xp = xp->f_next) {
+ for (i = 0; i < sizeof mdt / sizeof mdt[0]; i++) {
+ md = file_findmetadata(xp, mdt[i]);
+ if (md) {
+ bcopy(md->md_data, &vaddr, sizeof vaddr);
+ vaddr -= __elfN(relocation_offset);
+ bcopy(&vaddr, md->md_data, sizeof vaddr);
+ }
+ }
+ }
+#endif
+
/* Copy module list and metadata. */
(void)bi_copymodules(addr);
diff --git a/sys/boot/efi/loader/copy.c b/sys/boot/efi/loader/copy.c
index 1da3f43..10f4cb2 100644
--- a/sys/boot/efi/loader/copy.c
+++ b/sys/boot/efi/loader/copy.c
@@ -61,9 +61,27 @@ efi_copy_init(void)
}
staging_end = staging + STAGE_PAGES * 4096;
+#if defined(__aarch64__) || defined(__arm__)
+ /*
+ * Round the kernel load address to a 2MiB value. This is needed
+ * because the kernel builds a page table based on where it has
+ * been loaded in physical address space. As the kernel will use
+ * either a 1MiB or 2MiB page for this we need to make sure it
+ * is correctly aligned for both cases.
+ */
+ staging = roundup2(staging, 2 * 1024 * 1024);
+#endif
+
return (0);
}
+void *
+efi_translate(vm_offset_t ptr)
+{
+
+ return ((void *)(ptr + stage_offset));
+}
+
ssize_t
efi_copyin(const void *src, vm_offset_t dest, const size_t len)
{
diff --git a/sys/boot/efi/loader/main.c b/sys/boot/efi/loader/main.c
index d6b2b53..93c6059 100644
--- a/sys/boot/efi/loader/main.c
+++ b/sys/boot/efi/loader/main.c
@@ -36,6 +36,8 @@ __FBSDID("$FreeBSD$");
#include <efilib.h>
#include <bootstrap.h>
+#include <smbios.h>
+
#include "loader_efi.h"
extern char bootprog_name[];
@@ -63,6 +65,7 @@ main(int argc, CHAR16 *argv[])
{
char vendor[128];
EFI_LOADED_IMAGE *img;
+ EFI_GUID *guid;
int i;
/*
@@ -128,6 +131,14 @@ main(int argc, CHAR16 *argv[])
archsw.arch_copyout = efi_copyout;
archsw.arch_readin = efi_readin;
+ for (i = 0; i < ST->NumberOfTableEntries; i++) {
+ guid = &ST->ConfigurationTable[i].VendorGuid;
+ if (!memcmp(guid, &smbios, sizeof(EFI_GUID))) {
+ smbios_detect(ST->ConfigurationTable[i].VendorTable);
+ break;
+ }
+ }
+
interact(NULL); /* doesn't return */
return (EFI_SUCCESS); /* keep compiler happy */
@@ -285,7 +296,7 @@ command_configuration(int argc, char *argv[])
}
-COMMAND_SET(mode, "mode", "change or display text modes", command_mode);
+COMMAND_SET(mode, "mode", "change or display EFI text modes", command_mode);
static int
command_mode(int argc, char *argv[])
@@ -331,7 +342,7 @@ command_mode(int argc, char *argv[])
}
if (i != 0)
- printf("Choose the mode with \"col <mode number>\"\n");
+ printf("Select a mode with the command \"mode <number>\"\n");
return (CMD_OK);
}
@@ -387,3 +398,22 @@ command_nvram(int argc, char *argv[])
return (CMD_OK);
}
+
+#ifdef LOADER_FDT_SUPPORT
+extern int command_fdt_internal(int argc, char *argv[]);
+
+/*
+ * Since proper fdt command handling function is defined in fdt_loader_cmd.c,
+ * and declaring it as extern is in contradiction with COMMAND_SET() macro
+ * (which uses static pointer), we're defining wrapper function, which
+ * calls the proper fdt handling routine.
+ */
+static int
+command_fdt(int argc, char *argv[])
+{
+
+ return (command_fdt_internal(argc, argv));
+}
+
+COMMAND_SET(fdt, "fdt", "flattened device tree handling", command_fdt);
+#endif
diff --git a/sys/boot/efi/loader/arch/amd64/reloc.c b/sys/boot/efi/loader/reloc.c
index 98bcf8e..fbe2043 100644
--- a/sys/boot/efi/loader/arch/amd64/reloc.c
+++ b/sys/boot/efi/loader/reloc.c
@@ -32,18 +32,38 @@ __FBSDID("$FreeBSD$");
#include <efi.h>
#include <bootstrap.h>
-#ifdef __i386__
+#if defined(__aarch64__)
+#define ElfW_Rel Elf64_Rela
+#define ElfW_Dyn Elf64_Dyn
+#define ELFW_R_TYPE ELF64_R_TYPE
+#define ELF_RELA
+#elif defined(__arm__) || defined(__i386__)
#define ElfW_Rel Elf32_Rel
#define ElfW_Dyn Elf32_Dyn
#define ELFW_R_TYPE ELF32_R_TYPE
-#elif __amd64__
+#elif defined(__amd64__)
#define ElfW_Rel Elf64_Rel
#define ElfW_Dyn Elf64_Dyn
#define ELFW_R_TYPE ELF64_R_TYPE
+#else
+#error architecture not supported
+#endif
+#if defined(__aarch64__)
+#define RELOC_TYPE_NONE R_AARCH64_NONE
+#define RELOC_TYPE_RELATIVE R_AARCH64_RELATIVE
+#elif defined(__amd64__)
+#define RELOC_TYPE_NONE R_X86_64_NONE
+#define RELOC_TYPE_RELATIVE R_X86_64_RELATIVE
+#elif defined(__arm__)
+#define RELOC_TYPE_NONE R_ARM_NONE
+#define RELOC_TYPE_RELATIVE R_ARM_RELATIVE
+#elif defined(__i386__)
+#define RELOC_TYPE_NONE R_386_NONE
+#define RELOC_TYPE_RELATIVE R_386_RELATIVE
#endif
/*
- * A simple relocator for IA32/AMD64 EFI binaries.
+ * A simple relocator for EFI binaries.
*/
EFI_STATUS
_reloc(unsigned long ImageBase, ElfW_Dyn *dynamic, EFI_HANDLE image_handle,
@@ -81,20 +101,21 @@ _reloc(unsigned long ImageBase, ElfW_Dyn *dynamic, EFI_HANDLE image_handle,
/*
* Perform the actual relocation.
- * XXX: We are reusing code for the amd64 version of this, but
- * we must make sure the relocation types are the same.
*/
- CTASSERT(R_386_NONE == R_X86_64_NONE);
- CTASSERT(R_386_RELATIVE == R_X86_64_RELATIVE);
for (; relsz > 0; relsz -= relent) {
switch (ELFW_R_TYPE(rel->r_info)) {
- case R_386_NONE:
+ case RELOC_TYPE_NONE:
/* No relocation needs be performed. */
break;
- case R_386_RELATIVE:
+
+ case RELOC_TYPE_RELATIVE:
/* Address relative to the base address. */
newaddr = (unsigned long *)(ImageBase + rel->r_offset);
*newaddr += ImageBase;
+ /* Add the addend when the ABI uses them */
+#ifdef ELF_RELA
+ *newaddr += rel->r_addend;
+#endif
break;
default:
/* XXX: do we need other relocations ? */
diff --git a/sys/boot/fdt/dts/arm/bcm2836.dtsi b/sys/boot/fdt/dts/arm/bcm2836.dtsi
index 7fdaecf..bd75c84 100644
--- a/sys/boot/fdt/dts/arm/bcm2836.dtsi
+++ b/sys/boot/fdt/dts/arm/bcm2836.dtsi
@@ -101,6 +101,12 @@
*/
};
+ watchdog0 {
+ compatible = "broadcom,bcm2835-wdt",
+ "broadcom,bcm2708-wdt";
+ reg = <0x10001c 0x0c>; /* 0x1c, 0x20, 0x24 */
+ };
+
gpio: gpio {
compatible = "broadcom,bcm2835-gpio",
"broadcom,bcm2708-gpio";
@@ -125,11 +131,11 @@
pinctrl-names = "default";
pinctrl-0 = <&pins_reserved>;
- /* Pins that can short 3.3V to GND in output mode: 46-47
+ /* Pins that can short 3.3V to GND in output mode: 46
* Pins used by VideoCore: 48-53
*/
- broadcom,read-only = <46>, <47>, <48>, <49>, <50>,
- <51>, <52>, <53>;
+ broadcom,read-only = <46>, <48>, <49>, <50>,
+ <51>, <52>, <53>;
/* BSC0 */
pins_bsc0_a: bsc0_a {
@@ -431,7 +437,7 @@
interrupts = <70>;
interrupt-parent = <&intc>;
- clock-frequency = <2500000000>; /* Set by VideoCore */
+ clock-frequency = <250000000>; /* Set by VideoCore */
};
uart0: uart0 {
diff --git a/sys/boot/fdt/dts/arm/meson8b.dtsi b/sys/boot/fdt/dts/arm/meson8b.dtsi
new file mode 100644
index 0000000..c76a01a
--- /dev/null
+++ b/sys/boot/fdt/dts/arm/meson8b.dtsi
@@ -0,0 +1,79 @@
+/*-
+ * Copyright (c) 2015 John Wehle <john@feith.com>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+/include/ "meson.dtsi"
+
+/ {
+ model = "Amlogic Meson8b SoC";
+ compatible = "amlogic,meson8b";
+
+ interrupt-parent = <&gic>;
+
+ cpus {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ cpu@200 {
+ device_type = "cpu";
+ compatible = "arm,cortex-a5";
+ next-level-cache = <&L2>;
+ reg = <0x200>;
+ };
+
+ cpu@201 {
+ device_type = "cpu";
+ compatible = "arm,cortex-a5";
+ next-level-cache = <&L2>;
+ reg = <0x201>;
+ };
+
+ cpu@202 {
+ device_type = "cpu";
+ compatible = "arm,cortex-a5";
+ next-level-cache = <&L2>;
+ reg = <0x202>;
+ };
+
+ cpu@203 {
+ device_type = "cpu";
+ compatible = "arm,cortex-a5";
+ next-level-cache = <&L2>;
+ reg = <0x203>;
+ };
+ };
+
+ clk81: clk@0 {
+ #clock-cells = <0>;
+ compatible = "fixed-clock";
+ clock-frequency = <0>;
+ };
+};
+
+&L2 {
+ interrupts = <0 143 1>;
+};
diff --git a/sys/boot/fdt/dts/arm/odroidc1.dts b/sys/boot/fdt/dts/arm/odroidc1.dts
index 6a90ed4..c65344b 100644
--- a/sys/boot/fdt/dts/arm/odroidc1.dts
+++ b/sys/boot/fdt/dts/arm/odroidc1.dts
@@ -39,6 +39,8 @@
/memreserve/ 0x7900000 0x00600000; /* 6MB frame buffer */
+#include "meson8b.dtsi"
+
/ {
model = "hardkernel,odroid-c1";
compatible = "hardkernel,odroid-c1", "amlogic,s805";
@@ -46,41 +48,10 @@
#address-cells = <1>;
#size-cells = <1>;
- interrupt-parent = <&gic>;
-
aliases {
soc = &soc;
screen = &screen;
- uart0 = &uart0;
- };
-
- cpus {
- #address-cells = <1>;
- #size-cells = <0>;
-
- cpu@0 {
- device_type = "cpu";
- compatible = "arm,cortex-a5";
- reg = <0x0>;
- };
-
- cpu@1 {
- device_type = "cpu";
- compatible = "arm,cortex-a5";
- reg = <0x1>;
- };
-
- cpu@2 {
- device_type = "cpu";
- compatible = "arm,cortex-a5";
- reg = <0x2>;
- };
-
- cpu@3 {
- device_type = "cpu";
- compatible = "arm,cortex-a5";
- reg = <0x3>;
- };
+ uart0 = &uart_AO;
};
memory {
@@ -88,60 +59,37 @@
reg = <0x0 0x40000000>; /* 1GB RAM */
};
- soc: soc@c0000000 {
+ soc: soc {
device_type = "soc";
- compatible = "simple-bus";
bus-frequency = <0>;
- #address-cells = <1>;
- #size-cells = <1>;
-
- ranges = <0x0 0xc0000000 0x1a100000>;
-
- gic: gic@4301000 {
- device_type = "interrupt-controller";
- compatible = "arm,gic";
- reg = <0x4301000 0x1000>, // distributer registers
- <0x4300100 0x0100>; // CPU if registers
-
- interrupt-controller;
- #interrupt-cells = <1>;
- };
-
- scu: scu@4300000 {
+ scu: scu@c4300000 {
compatible = "arm,cortex-a5-scu";
- reg = <0x4300000 0x1000>;
+ reg = <0xc4300000 0x1000>;
};
- cpuconfig: cpuconfig@1901ff80 {
+ cpuconfig: cpuconfig@d901ff80 {
compatible = "amlogic,aml8726-cpuconfig";
- reg = <0x1901ff80 16>;
+ reg = <0xd901ff80 16>;
};
- pl310@4200000 {
- compatible = "arm,pl310";
- reg = <0x4200000 0x1000>;
- interrupts = <61>;
- interrupt-parent = <&gic>;
- };
-
- ccm@1104140 {
+ ccm@c1104140 {
compatible = "amlogic,aml8726-ccm";
- reg = <0x1104140 20>; /* cbus 0x1050 */
+ reg = <0xc1104140 20>; /* cbus 0x1050 */
functions = "ethernet", "i2c", "rng", "sdio", "sdxc",
"uart-a", "uart-b", "uart-c",
"usb-a", "usb-b";
};
- pinctrl@11080b0 {
+ pinctrl@c11080b0 {
compatible = "amlogic,aml8726-pinctrl";
- reg = <0x11080b0 40>, /* mux */
- <0x11080e8 24>, /* pu/pd */
- <0x1108120 24>, /* pull enable */
- <0x8100014 4>, /* ao mux */
- <0x810002c 4>, /* ao pu/pd */
- <0x810002c 4>; /* ao pull enable */
+ reg = <0xc11080b0 40>, /* mux */
+ <0xc11080e8 24>, /* pu/pd */
+ <0xc1108120 24>, /* pull enable */
+ <0xc8100014 4>, /* ao mux */
+ <0xc810002c 4>, /* ao pu/pd */
+ <0xc810002c 4>; /* ao pull enable */
/*
* Currently only pin muxing that deviates
@@ -242,24 +190,10 @@
};
};
- watchdog@1109900 {
- compatible = "amlogic,aml8726-wdt";
- reg = <0x1109900 8>; /* cbus 0x2640 */
- interrupts = <0>;
- interrupt-parent = <&gic>;
- };
-
- timer@1109940 {
- compatible = "amlogic,aml8726-timer";
- reg = <0x1109940 24>; /* cbus 0x2650 */
- interrupts = <10 11 6 29>;
- interrupt-parent = <&gic>;
- };
-
- rtc@8100740 {
+ rtc@c8100740 {
compatible = "amlogic,aml8726-rtc";
- reg = <0x8100740 20>; /* aobus 0x1d0 */
- interrupts = <72>;
+ reg = <0xc8100740 20>; /* aobus 0x1d0 */
+ interrupts = <0 72 1>;
interrupt-parent = <&gic>;
init-always = "false";
@@ -267,62 +201,55 @@
gpo-init = <0x500000>;
};
- clkmsr: clkmsr@1108758 {
+ clkmsr: clkmsr@c1108758 {
compatible = "amlogic,aml8726-clkmsr";
- reg = <0x1108758 16>; /* cbus 0x21d6 */
- };
+ reg = <0xc1108758 16>; /* cbus 0x21d6 */
- uart0: uart@81004c0 {
- /* uart-ao */
- device_type = "serial";
- compatible = "amlogic,aml8726-uart";
- clock-frequency = <0>;
- current-speed = <115200>;
- reg = <0x81004c0 20>; /* aobus 0x130 */
- interrupts = <90>;
- interrupt-parent = <&gic>;
+ clocks = <&clk81>;
};
- gpioao: gpio@8100024 {
+ gpioao: gpio@c8100024 {
/* gpio unit 7 */
compatible = "amlogic,aml8726-gpio";
- reg = <0x8100024 4>, /* oen aobus 0x9 */
- <0x8100024 4>, /* out */
- <0x8100028 4>; /* in */
+ reg = <0xc8100024 4>, /* oen aobus 0x9 */
+ <0xc8100024 4>, /* out */
+ <0xc8100028 4>; /* in */
gpio-controller;
#gpio-cells = <1>;
pin-count = <14>;
};
- gpio3: gpio@1108054 {
+ gpio3: gpio@c1108054 {
compatible = "amlogic,aml8726-gpio";
- reg = <0x1108054 4>, /* oen cbus 0x2015 */
- <0x1108058 4>, /* out */
- <0x110805c 4>; /* in */
+ reg = <0xc1108054 4>, /* oen cbus 0x2015 */
+ <0xc1108058 4>, /* out */
+ <0xc110805c 4>; /* in */
gpio-controller;
#gpio-cells = <1>;
pin-count = <32>;
};
- gpio5: gpio@110806c {
+ gpio5: gpio@c110806c {
compatible = "amlogic,aml8726-gpio";
- reg = <0x110806c 4>, /* oen cbus 0x201b */
- <0x1108070 4>, /* out */
- <0x1108074 4>; /* in */
+ reg = <0xc110806c 4>, /* oen cbus 0x201b */
+ <0xc1108070 4>, /* out */
+ <0xc1108074 4>; /* in */
gpio-controller;
#gpio-cells = <1>;
pin-count = <32>;
};
- mmc@1108c20 {
+ mmc@c1108c20 {
compatible = "amlogic,aml8726-mmc";
- reg = <0x1108c20 32>; /* cbus 0x2308 */
- interrupts = <28>;
+ reg = <0xc1108c20 32>; /* cbus 0x2308 */
+ interrupts = <0 28 1>;
interrupt-parent = <&gic>;
+ clocks = <&clk81>;
+
pinctrl-names = "default";
pinctrl-0 = <&pins_sdio_b>;
@@ -342,11 +269,11 @@
ins-detect = <&gpio5 29 0>; /* card_6 */
};
- sdxc@1108e00 {
+ sdxc@c1108e00 {
compatible = "amlogic,aml8726-sdxc-m8";
clock-frequency = <1275000000>;
- reg = <0x1108e00 60>; /* cbus 0x2380 */
- interrupts = <78>;
+ reg = <0xc1108e00 60>; /* cbus 0x2380 */
+ interrupts = <0 78 1>;
interrupt-parent = <&gic>;
pinctrl-names = "default";
@@ -357,82 +284,33 @@
mmc-rst = <&gpio3 9 0>; /* boot_9 emmc-rst */
};
- rng@1108100 {
+ rng@c1108100 {
compatible = "amlogic,aml8726-rng";
- reg = <0x1108100 8>; /* cbus 0x2040 */
+ reg = <0xc1108100 8>; /* cbus 0x2040 */
};
- i2c@1108500 {
- /* i2c-a */
- compatible = "amlogic,aml8726-i2c";
- reg = <0x1108500 32>; /* cbus 0x2140 */
- interrupts = <21>;
- interrupt-parent = <&gic>;
- };
-
- i2c@11087c0 {
- /* i2c-b */
- compatible = "amlogic,aml8726-i2c";
- reg = <0x11087c0 32>; /* cbus 0x21f0 */
- interrupts = <128>;
- interrupt-parent = <&gic>;
- };
-
- uart@11084c0 {
- /* uart-a */
- device_type = "serial";
- compatible = "amlogic,aml8726-uart";
- clock-frequency = <0>;
- current-speed = <115200>;
- reg = <0x11084c0 20>; /* cbus 0x2130 */
- interrupts = <26>;
- interrupt-parent = <&gic>;
- };
-
- uart@11084dc {
- /* uart-b */
- device_type = "serial";
- compatible = "amlogic,aml8726-uart";
- clock-frequency = <0>;
- current-speed = <115200>;
- reg = <0x11084dc 20>; /* cbus 0x2137 */
- interrupts = <75>;
- interrupt-parent = <&gic>;
- };
-
- uart@1108700 {
- /* uart-c */
- device_type = "serial";
- compatible = "amlogic,aml8726-uart";
- clock-frequency = <0>;
- current-speed = <115200>;
- reg = <0x1108700 20>; /* cbus 0x21c0 */
- interrupts = <93>;
- interrupt-parent = <&gic>;
- };
-
- usb-phy@1108800 {
+ usb-phy@c1108800 {
/* usb-a phy */
compatible = "amlogic,aml8726-m8-usb-phy";
- reg = <0x1108800 32>; /* cbus 0x2200 */
+ reg = <0xc1108800 32>; /* cbus 0x2200 */
usb-pwr-en = <&gpioao 5 1>; /* gpioao_5 vbus */
};
- usb-phy@1108820 {
+ usb-phy@c1108820 {
/* usb-b phy */
compatible = "amlogic,aml8726-m8-usb-phy";
- reg = <0x1108820 32>; /* cbus 0x2208 */
+ reg = <0xc1108820 32>; /* cbus 0x2208 */
force-aca = "true";
usb-hub-rst = <&gpioao 4 0>; /* gpioao_4 hub-rst */
};
- usb@9040000 {
+ usb@c9040000 {
/* usb-a */
compatible = "synopsys,designware-hs-otg2";
- reg = <0x9040000 0x40000>; /* ahbbus 0x40000*/
- interrupts = <30>;
+ reg = <0xc9040000 0x40000>; /* ahbbus 0x40000*/
+ interrupts = <0 30 4>;
interrupt-parent = <&gic>;
#address-cells = <1>;
#size-cells = <0>;
@@ -440,11 +318,11 @@
dr_mode = "host";
};
- usb@90c0000 {
+ usb@c90c0000 {
/* usb-b */
compatible = "synopsys,designware-hs-otg2";
- reg = <0x90c0000 0x40000>; /* ahbbus 0xc0000 */
- interrupts = <31>;
+ reg = <0xc90c0000 0x40000>; /* ahbbus 0xc0000 */
+ interrupts = <0 31 4>;
interrupt-parent = <&gic>;
#address-cells = <1>;
#size-cells = <0>;
@@ -452,11 +330,11 @@
dr_mode = "host";
};
- eth@9410000 {
+ eth@c9410000 {
/* ethernet */
compatible = "snps,dwmac";
- reg = <0x9410000 0x2000>; /* ahbbus 0x410000 */
- interrupts = <8>;
+ reg = <0xc9410000 0x2000>; /* ahbbus 0x410000 */
+ interrupts = <0 8 1>;
interrupt-parent = <&gic>;
#address-cells = <1>;
#size-cells = <0>;
@@ -464,13 +342,16 @@
eth-phy-rst = <&gpio3 23 0>; /* gpioh_4 phy-rst */
};
- screen: fb@8006020 {
+ screen: fb@c8006020 {
device_type = "display";
compatible = "amlogic,aml8726-fb";
- reg = <0x8006048 12>, /* CANVAS */
- <0x1106800 1024>, /* VIU */
- <0x1107400 1024>; /* VPP */
- interrupts = <2 3 12 13>;
+ reg = <0xc8006048 12>, /* CANVAS */
+ <0xc1106800 1024>, /* VIU */
+ <0xc1107400 1024>; /* VPP */
+ interrupts = <0 2 1>,
+ <0 3 1>,
+ <0 12 1>,
+ <0 13 1>;
interrupt-parent = <&gic>;
address = <0x7900000>; /* match memreserve */
@@ -495,3 +376,32 @@
stdout = "uart0";
};
};
+
+&clk81 {
+ clock-frequency = <0>;
+};
+
+&uart_AO {
+ status = "okay";
+ current-speed = <115200>;
+};
+
+&uart_A {
+ status = "okay";
+};
+
+&uart_B {
+ status = "okay";
+};
+
+&uart_C {
+ status = "okay";
+};
+
+&i2c_A {
+ status = "okay";
+};
+
+&i2c_B {
+ status = "okay";
+};
diff --git a/sys/boot/fdt/dts/arm/rpi2.dts b/sys/boot/fdt/dts/arm/rpi2.dts
index 59974f1..1c8c559 100644
--- a/sys/boot/fdt/dts/arm/rpi2.dts
+++ b/sys/boot/fdt/dts/arm/rpi2.dts
@@ -322,18 +322,14 @@
leds {
compatible = "gpio-leds";
- ok {
- label = "ok";
- gpios = <&gpio 16 1>;
-
- /* Don't change this - it configures
- * how the led driver determines if
- * the led is on or off when it loads.
- */
- default-state = "keep";
-
- /* This is the real default state. */
- linux,default-trigger = "default-on";
+ pwr {
+ label = "pwr";
+ gpios = <&gpio 35 0>;
+ };
+
+ act {
+ label = "act";
+ gpios = <&gpio 47 0>;
};
};
diff --git a/sys/boot/fdt/dts/arm/vsatv102-m6.dts b/sys/boot/fdt/dts/arm/vsatv102-m6.dts
index 639e010..ad3b5a1 100644
--- a/sys/boot/fdt/dts/arm/vsatv102-m6.dts
+++ b/sys/boot/fdt/dts/arm/vsatv102-m6.dts
@@ -39,6 +39,8 @@
/memreserve/ 0x84900000 0x00600000; /* 6MB frame buffer */
+#include "meson6.dtsi"
+
/ {
/*
* My development unit visually appears to be a Visson ATV-102
@@ -50,34 +52,15 @@
*/
model = "visson,atv-102";
- compatible = "visson,atv-102", "amlogic,aml8726-m6";
+ compatible = "visson,atv-102", "amlogic,meson6";
#address-cells = <1>;
#size-cells = <1>;
- interrupt-parent = <&gic>;
-
aliases {
soc = &soc;
screen = &screen;
- uart0 = &uart0;
- };
-
- cpus {
- #address-cells = <1>;
- #size-cells = <0>;
-
- cpu@0 {
- device_type = "cpu";
- compatible = "arm,cortex-a9";
- reg = <0x0>;
- };
-
- cpu@1 {
- device_type = "cpu";
- compatible = "arm,cortex-a9";
- reg = <0x1>;
- };
+ uart0 = &uart_AO;
};
memory {
@@ -85,69 +68,46 @@
reg = <0x80000000 0x40000000>; /* 1GB RAM */
};
- soc: soc@c0000000 {
+ soc: soc {
device_type = "soc";
- compatible = "simple-bus";
bus-frequency = <0>;
- #address-cells = <1>;
- #size-cells = <1>;
-
- ranges = <0x0 0xc0000000 0x1a100000>;
-
- pic: pic@1109a40 {
+ pic: pic@c1109a40 {
device_type = "interrupt-controller";
compatible = "amlogic,aml8726-pic";
- reg = <0x1109a40 128>; /* cbus 0x2690 */
+ reg = <0xc1109a40 128>; /* cbus 0x2690 */
interrupt-controller;
- #interrupt-cells = <1>;
+ #interrupt-cells = <3>;
};
- gic: gic@4301000 {
- device_type = "interrupt-controller";
- compatible = "arm,gic";
- reg = <0x4301000 0x1000>, /* distributer registers */
- <0x4300100 0x0100>; /* CPU if registers */
-
- interrupt-controller;
- #interrupt-cells = <1>;
- };
-
- scu: scu@4300000 {
+ scu: scu@c4300000 {
compatible = "arm,cortex-a9-scu";
- reg = <0x4300000 0x1000>;
+ reg = <0xc4300000 0x1000>;
};
- cpuconfig: cpuconfig@1901ff80 {
+ cpuconfig: cpuconfig@d901ff80 {
compatible = "amlogic,aml8726-cpuconfig";
- reg = <0x1901ff80 8>;
- };
-
- pl310@4200000 {
- compatible = "arm,pl310";
- reg = <0x4200000 0x1000>;
- interrupts = <61>; /* AM_IRQ1(29) */
- interrupt-parent = <&gic>;
+ reg = <0xd901ff80 8>;
};
- ccm@1104140 {
+ ccm@c1104140 {
compatible = "amlogic,aml8726-ccm";
- reg = <0x1104140 20>; /* cbus 0x1050 */
+ reg = <0xc1104140 20>; /* cbus 0x1050 */
functions = "ethernet", "i2c", "rng", "sdio",
"uart-a", "uart-b", "uart-c",
"usb-a", "usb-b";
};
- pinctrl: pinctrl@11080b0 {
+ pinctrl: pinctrl@c11080b0 {
compatible = "amlogic,aml8726-pinctrl";
- reg = <0x11080b0 40>, /* mux */
- <0x11080e8 24>, /* pu/pd */
- <0x11080e8 24>, /* pull enable */
- <0x8100014 4>, /* ao mux */
- <0x810002c 4>, /* ao pu/pd */
- <0x810002c 4>; /* ao pull enable */
+ reg = <0xc11080b0 40>, /* mux */
+ <0xc11080e8 24>, /* pu/pd */
+ <0xc11080e8 24>, /* pull enable */
+ <0xc8100014 4>, /* ao mux */
+ <0xc810002c 4>, /* ao pu/pd */
+ <0xc810002c 4>; /* ao pull enable */
/*
* Currently only pin muxing that deviates
@@ -189,27 +149,10 @@
};
};
- watchdog@1109900 {
- compatible = "amlogic,aml8726-wdt";
- reg = <0x1109900 8>; /* cbus 0x2640 */
- interrupts = <0>; /* AM_IRQ0(0) */
- interrupt-parent = <&gic>;
- };
-
- timer@1109940 {
- compatible = "amlogic,aml8726-timer";
- reg = <0x1109940 24>; /* cbus 0x2650 */
- interrupts = <10 /* AM_IRQ0(10) */
- 11 /* AM_IRQ0(11) */
- 6 /* AM_IRQ0(6) */
- 29>; /* AM_IRQ0(29) */
- interrupt-parent = <&gic>;
- };
-
- rtc@1a004340 {
+ rtc@da004340 {
compatible = "amlogic,aml8726-rtc";
- reg = <0x1a004340 20>; /* secbus2 0xd0 */
- interrupts = <72>; /* AM_IRQ2(8) */
+ reg = <0xda004340 20>; /* secbus2 0xd0 */
+ interrupts = <0 72 1>; /* AM_IRQ2(8) */
interrupt-parent = <&gic>;
init-always = "false";
@@ -217,62 +160,55 @@
gpo-init = <0x500000>;
};
- clkmsr: clkmsr@1108758 {
+ clkmsr: clkmsr@c1108758 {
compatible = "amlogic,aml8726-clkmsr";
- reg = <0x1108758 16>; /* cbus 0x21d6 */
- };
+ reg = <0xc1108758 16>; /* cbus 0x21d6 */
- uart0: uart@81004c0 {
- /* uart-ao */
- device_type = "serial";
- compatible = "amlogic,aml8726-uart";
- clock-frequency = <0>;
- current-speed = <115200>;
- reg = <0x81004c0 20>; /* aobus 0x130 */
- interrupts = <90>; /* AM_IRQ2(26) */
- interrupt-parent = <&gic>;
+ clocks = <&clk81>;
};
- gpioao: gpio@8100024 {
+ gpioao: gpio@c8100024 {
/* gpio unit 7 */
compatible = "amlogic,aml8726-gpio";
- reg = <0x8100024 4>, /* oen aobus 0x9 */
- <0x8100024 4>, /* out */
- <0x8100028 4>; /* in */
+ reg = <0xc8100024 4>, /* oen aobus 0x9 */
+ <0xc8100024 4>, /* out */
+ <0xc8100028 4>; /* in */
gpio-controller;
#gpio-cells = <1>;
pin-count = <12>;
};
- gpio5: gpio@110806c {
+ gpio5: gpio@c110806c {
compatible = "amlogic,aml8726-gpio";
- reg = <0x110806c 4>, /* oen cbus 0x201b */
- <0x1108070 4>, /* out */
- <0x1108074 4>; /* in */
+ reg = <0xc110806c 4>, /* oen cbus 0x201b */
+ <0xc1108070 4>, /* out */
+ <0xc1108074 4>; /* in */
gpio-controller;
#gpio-cells = <1>;
pin-count = <32>;
};
- gpio6: gpio@1108020 {
+ gpio6: gpio@c1108020 {
compatible = "amlogic,aml8726-gpio";
- reg = <0x1108020 4>, /* oen cbus 0x2008 */
- <0x1108024 4>, /* out */
- <0x1108028 4>; /* in */
+ reg = <0xc1108020 4>, /* oen cbus 0x2008 */
+ <0xc1108024 4>, /* out */
+ <0xc1108028 4>; /* in */
gpio-controller;
#gpio-cells = <1>;
pin-count = <29>;
};
- mmc@1108c20 {
+ mmc@c1108c20 {
compatible = "amlogic,aml8726-mmc";
- reg = <0x1108c20 32>; /* cbus 0x2308 */
- interrupts = <28>; /* AM_IRQ0(28) */
+ reg = <0xc1108c20 32>; /* cbus 0x2308 */
+ interrupts = <0 28 1>; /* AM_IRQ0(28) */
interrupt-parent = <&gic>;
+ clocks = <&clk81>;
+
pinctrl-names = "default";
pinctrl-0 = <&pins_sdio_b>;
@@ -282,90 +218,41 @@
ins-detect = <&gpio5 29 0>; /* card_6 */
};
- rng@1108100 {
+ rng@c1108100 {
compatible = "amlogic,aml8726-rng";
- reg = <0x1108100 8>; /* cbus 0x2040 */
- };
-
- i2c@1108500 {
- /* i2c-a */
- compatible = "amlogic,aml8726-i2c";
- reg = <0x1108500 32>; /* cbus 0x2140 */
- interrupts = <21>;
- interrupt-parent = <&gic>;
- };
-
- i2c@11087c0 {
- /* i2c-b */
- compatible = "amlogic,aml8726-i2c";
- reg = <0x11087c0 32>; /* cbus 0x21f0 */
- interrupts = <128>;
- interrupt-parent = <&gic>;
+ reg = <0xc1108100 8>; /* cbus 0x2040 */
};
- uart@11084c0 {
- /* uart-a */
- device_type = "serial";
- compatible = "amlogic,aml8726-uart";
- clock-frequency = <0>;
- current-speed = <115200>;
- reg = <0x11084c0 20>; /* cbus 0x2130 */
- interrupts = <26>;
- interrupt-parent = <&gic>;
- };
-
- uart@11084dc {
- /* uart-b */
- device_type = "serial";
- compatible = "amlogic,aml8726-uart";
- clock-frequency = <0>;
- current-speed = <115200>;
- reg = <0x11084dc 20>; /* cbus 0x2137 */
- interrupts = <75>;
- interrupt-parent = <&gic>;
- };
-
- uart@1108700 {
- /* uart-c */
- device_type = "serial";
- compatible = "amlogic,aml8726-uart";
- clock-frequency = <0>;
- current-speed = <115200>;
- reg = <0x1108700 20>; /* cbus 0x21c0 */
- interrupts = <93>;
- interrupt-parent = <&gic>;
- };
-
- usb-phy@1108400 {
+ usb-phy@c1108400 {
/* usb-a phy */
compatible = "amlogic,aml8726-m6-usb-phy";
- reg = <0x1108400 32>; /* cbus 0x2100 */
+ reg = <0xc1108400 32>; /* cbus 0x2100 */
};
- usb-phy@1108420 {
+ usb-phy@c1108420 {
/* usb-b phy */
compatible = "amlogic,aml8726-m6-usb-phy";
- reg = <0x1108420 32>; /* cbus 0x2108 */
+ reg = <0xc1108420 32>; /* cbus 0x2108 */
usb-pwr-en = <&gpioao 3 1>, /* gpioao_3 vbus */
<&gpio6 11 0>; /* gpioe_11 wifi */
};
- usb@9040000 {
+ usb@c9040000 {
/* usb-a */
compatible = "synopsys,designware-hs-otg2";
- reg = <0x9040000 0x40000>; /* ahbbus 0x40000*/
- interrupts = <30>; /* AM_IRQ0(30) */
+ reg = <0xc9040000 0x40000>; /* ahbbus 0x40000*/
+ interrupts = <0 30 4>; /* AM_IRQ0(30) */
interrupt-parent = <&gic>;
#address-cells = <1>;
#size-cells = <0>;
};
- usb@90c0000 {
+ usb@c90c0000 {
/* usb-b */
compatible = "synopsys,designware-hs-otg2";
- reg = <0x90c0000 0x40000>; /* ahbbus 0xc0000 */
- interrupts = <31>; /* AM_IRQ0(31) */
+ reg = <0xc90c0000 0x40000>; /* ahbbus 0xc0000 */
+ interrupts = <0 31 4>; /* AM_IRQ0(31) */
interrupt-parent = <&gic>;
#address-cells = <1>;
#size-cells = <0>;
@@ -373,11 +260,11 @@
dr_mode = "host";
};
- eth@9410000 {
+ eth@c9410000 {
/* ethernet */
compatible = "snps,dwmac";
- reg = <0x9410000 0x2000>; /* ahbbus 0x410000 */
- interrupts = <8>; /* AM_IRQ0(8) */
+ reg = <0xc9410000 0x2000>; /* ahbbus 0x410000 */
+ interrupts = <0 8 1>; /* AM_IRQ0(8) */
interrupt-parent = <&gic>;
#address-cells = <1>;
#size-cells = <0>;
@@ -385,16 +272,16 @@
eth-phy-rst = <&gpio5 15 0>; /* gpioy_15 phy-rst */
};
- screen: fb@8006324 {
+ screen: fb@c8006324 {
device_type = "display";
compatible = "amlogic,aml8726-fb";
- reg = <0x8006324 12>, /* CANVAS */
- <0x1106800 1024>, /* VIU */
- <0x1107400 1024>; /* VPP */
- interrupts = <2 /* AM_IRQ0(2) */
- 3 /* AM_IRQ0(3) */
- 12 /* AM_IRQ0(12) */
- 13>; /* AM_IRQ0(13) */
+ reg = <0xc8006324 12>, /* CANVAS */
+ <0xc1106800 1024>, /* VIU */
+ <0xc1107400 1024>; /* VPP */
+ interrupts = <0 2 1>, /* AM_IRQ0(2) */
+ <0 3 1>, /* AM_IRQ0(3) */
+ <0 12 1>, /* AM_IRQ0(12) */
+ <0 13 1>; /* AM_IRQ0(13) */
interrupt-parent = <&gic>;
address = <0x84900000>; /* match memreserve */
@@ -410,3 +297,12 @@
stdout = "uart0";
};
};
+
+&clk81 {
+ clock-frequency = <0>;
+};
+
+&uart_AO {
+ status = "okay";
+ current-speed = <115200>;
+};
diff --git a/sys/boot/ficl/aarch64/sysdep.c b/sys/boot/ficl/aarch64/sysdep.c
new file mode 100644
index 0000000..ad38660
--- /dev/null
+++ b/sys/boot/ficl/aarch64/sysdep.c
@@ -0,0 +1,99 @@
+/*******************************************************************
+** s y s d e p . c
+** Forth Inspired Command Language
+** Author: John Sadler (john_sadler@alum.mit.edu)
+** Created: 16 Oct 1997
+** Implementations of FICL external interface functions...
+**
+*******************************************************************/
+
+/* $FreeBSD$ */
+
+#ifdef TESTMAIN
+#include <stdio.h>
+#include <stdlib.h>
+#else
+#include <stand.h>
+#endif
+#include "ficl.h"
+
+/*
+******************* FreeBSD P O R T B E G I N S H E R E ******************** Michael Smith
+*/
+
+#if PORTABLE_LONGMULDIV == 0
+DPUNS ficlLongMul(FICL_UNS x, FICL_UNS y)
+{
+ DPUNS q;
+ u_int64_t qx;
+
+ qx = (u_int64_t)x * (u_int64_t) y;
+
+ q.hi = (u_int32_t)( qx >> 32 );
+ q.lo = (u_int32_t)( qx & 0xFFFFFFFFL);
+
+ return q;
+}
+
+UNSQR ficlLongDiv(DPUNS q, FICL_UNS y)
+{
+ UNSQR result;
+ u_int64_t qx, qh;
+
+ qh = q.hi;
+ qx = (qh << 32) | q.lo;
+
+ result.quot = qx / y;
+ result.rem = qx % y;
+
+ return result;
+}
+#endif
+
+void ficlTextOut(FICL_VM *pVM, char *msg, int fNewline)
+{
+ IGNORE(pVM);
+
+ while(*msg != 0)
+ putchar(*(msg++));
+ if (fNewline)
+ putchar('\n');
+
+ return;
+}
+
+void *ficlMalloc (size_t size)
+{
+ return malloc(size);
+}
+
+void *ficlRealloc (void *p, size_t size)
+{
+ return realloc(p, size);
+}
+
+void ficlFree (void *p)
+{
+ free(p);
+}
+
+
+/*
+** Stub function for dictionary access control - does nothing
+** by default, user can redefine to guarantee exclusive dict
+** access to a single thread for updates. All dict update code
+** is guaranteed to be bracketed as follows:
+** ficlLockDictionary(TRUE);
+** <code that updates dictionary>
+** ficlLockDictionary(FALSE);
+**
+** Returns zero if successful, nonzero if unable to acquire lock
+** befor timeout (optional - could also block forever)
+*/
+#if FICL_MULTITHREAD
+int ficlLockDictionary(short fLock)
+{
+ IGNORE(fLock);
+ return 0;
+}
+#endif /* FICL_MULTITHREAD */
diff --git a/sys/boot/ficl/aarch64/sysdep.h b/sys/boot/ficl/aarch64/sysdep.h
new file mode 100644
index 0000000..3726b9e
--- /dev/null
+++ b/sys/boot/ficl/aarch64/sysdep.h
@@ -0,0 +1,411 @@
+/*******************************************************************
+ s y s d e p . h
+** Forth Inspired Command Language
+** Author: John Sadler (john_sadler@alum.mit.edu)
+** Created: 16 Oct 1997
+** Ficl system dependent types and prototypes...
+**
+** Note: Ficl also depends on the use of "assert" when
+** FICL_ROBUST is enabled. This may require some consideration
+** in firmware systems since assert often
+** assumes stderr/stdout.
+** $Id: sysdep.h,v 1.6 2001-04-26 21:41:55-07 jsadler Exp jsadler $
+*******************************************************************/
+/*
+** Copyright (c) 1997-2001 John Sadler (john_sadler@alum.mit.edu)
+** All rights reserved.
+**
+** Get the latest Ficl release at http://ficl.sourceforge.net
+**
+** L I C E N S E and D I S C L A I M E R
+**
+** Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions
+** are met:
+** 1. Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** 2. Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in the
+** documentation and/or other materials provided with the distribution.
+**
+** THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+** ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+** OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+** HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+** LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+** OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+** SUCH DAMAGE.
+**
+** I am interested in hearing from anyone who uses ficl. If you have
+** a problem, a success story, a defect, an enhancement request, or
+** if you would like to contribute to the ficl release, please send
+** contact me by email at the address above.
+**
+** $Id: sysdep.h,v 1.6 2001-04-26 21:41:55-07 jsadler Exp jsadler $
+** $FreeBSD$
+*/
+
+#if !defined (__SYSDEP_H__)
+#define __SYSDEP_H__
+
+#include <sys/types.h>
+
+#include <stddef.h> /* size_t, NULL */
+#include <setjmp.h>
+#include <assert.h>
+
+#if !defined IGNORE /* Macro to silence unused param warnings */
+#define IGNORE(x) (void)(x)
+#endif
+
+/*
+** TRUE and FALSE for C boolean operations, and
+** portable 32 bit types for CELLs
+**
+*/
+#if !defined TRUE
+#define TRUE 1
+#endif
+#if !defined FALSE
+#define FALSE 0
+#endif
+
+
+/*
+** System dependent data type declarations...
+*/
+#if !defined INT32
+#define INT32 int
+#endif
+
+#if !defined UNS32
+#define UNS32 unsigned int
+#endif
+
+#if !defined UNS16
+#define UNS16 unsigned short
+#endif
+
+#if !defined UNS8
+#define UNS8 unsigned char
+#endif
+
+#if !defined NULL
+#define NULL ((void *)0)
+#endif
+
+/*
+** FICL_UNS and FICL_INT must have the same size as a void* on
+** the target system. A CELL is a union of void*, FICL_UNS, and
+** FICL_INT.
+** (11/2000: same for FICL_FLOAT)
+*/
+#if !defined FICL_INT
+#define FICL_INT long
+#endif
+
+#if !defined FICL_UNS
+#define FICL_UNS unsigned long
+#endif
+
+#if !defined FICL_FLOAT
+#define FICL_FLOAT float
+#endif
+
+/*
+** Ficl presently supports values of 32 and 64 for BITS_PER_CELL
+*/
+#if !defined BITS_PER_CELL
+#define BITS_PER_CELL 64
+#endif
+
+#if ((BITS_PER_CELL != 32) && (BITS_PER_CELL != 64))
+ Error!
+#endif
+
+typedef struct
+{
+ FICL_UNS hi;
+ FICL_UNS lo;
+} DPUNS;
+
+typedef struct
+{
+ FICL_UNS quot;
+ FICL_UNS rem;
+} UNSQR;
+
+typedef struct
+{
+ FICL_INT hi;
+ FICL_INT lo;
+} DPINT;
+
+typedef struct
+{
+ FICL_INT quot;
+ FICL_INT rem;
+} INTQR;
+
+
+/*
+** B U I L D C O N T R O L S
+*/
+
+#if !defined (FICL_MINIMAL)
+#define FICL_MINIMAL 0
+#endif
+#if (FICL_MINIMAL)
+#define FICL_WANT_SOFTWORDS 0
+#define FICL_WANT_FLOAT 0
+#define FICL_WANT_USER 0
+#define FICL_WANT_LOCALS 0
+#define FICL_WANT_DEBUGGER 0
+#define FICL_WANT_OOP 0
+#define FICL_PLATFORM_EXTEND 0
+#define FICL_MULTITHREAD 0
+#define FICL_ROBUST 0
+#define FICL_EXTENDED_PREFIX 0
+#endif
+
+/*
+** FICL_PLATFORM_EXTEND
+** Includes words defined in ficlCompilePlatform
+*/
+#if !defined (FICL_PLATFORM_EXTEND)
+#define FICL_PLATFORM_EXTEND 1
+#endif
+
+/*
+** FICL_WANT_FLOAT
+** Includes a floating point stack for the VM, and words to do float operations.
+** Contributed by Guy Carver
+*/
+#if !defined (FICL_WANT_FLOAT)
+#define FICL_WANT_FLOAT 0
+#endif
+
+/*
+** FICL_WANT_DEBUGGER
+** Inludes a simple source level debugger
+*/
+#if !defined (FICL_WANT_DEBUGGER)
+#define FICL_WANT_DEBUGGER 1
+#endif
+
+/*
+** User variables: per-instance variables bound to the VM.
+** Kinda like thread-local storage. Could be implemented in a
+** VM private dictionary, but I've chosen the lower overhead
+** approach of an array of CELLs instead.
+*/
+#if !defined FICL_WANT_USER
+#define FICL_WANT_USER 1
+#endif
+
+#if !defined FICL_USER_CELLS
+#define FICL_USER_CELLS 16
+#endif
+
+/*
+** FICL_WANT_LOCALS controls the creation of the LOCALS wordset and
+** a private dictionary for local variable compilation.
+*/
+#if !defined FICL_WANT_LOCALS
+#define FICL_WANT_LOCALS 1
+#endif
+
+/* Max number of local variables per definition */
+#if !defined FICL_MAX_LOCALS
+#define FICL_MAX_LOCALS 16
+#endif
+
+/*
+** FICL_WANT_OOP
+** Inludes object oriented programming support (in softwords)
+** OOP support requires locals and user variables!
+*/
+#if !(FICL_WANT_LOCALS) || !(FICL_WANT_USER)
+#if !defined (FICL_WANT_OOP)
+#define FICL_WANT_OOP 0
+#endif
+#endif
+
+#if !defined (FICL_WANT_OOP)
+#define FICL_WANT_OOP 1
+#endif
+
+/*
+** FICL_WANT_SOFTWORDS
+** Controls inclusion of all softwords in softcore.c
+*/
+#if !defined (FICL_WANT_SOFTWORDS)
+#define FICL_WANT_SOFTWORDS 1
+#endif
+
+/*
+** FICL_MULTITHREAD enables dictionary mutual exclusion
+** wia the ficlLockDictionary system dependent function.
+** Note: this implementation is experimental and poorly
+** tested. Further, it's unnecessary unless you really
+** intend to have multiple SESSIONS (poor choice of name
+** on my part) - that is, threads that modify the dictionary
+** at the same time.
+*/
+#if !defined FICL_MULTITHREAD
+#define FICL_MULTITHREAD 0
+#endif
+
+/*
+** PORTABLE_LONGMULDIV causes ficlLongMul and ficlLongDiv to be
+** defined in C in sysdep.c. Use this if you cannot easily
+** generate an inline asm definition
+*/
+#if !defined (PORTABLE_LONGMULDIV)
+#define PORTABLE_LONGMULDIV 0
+#endif
+
+/*
+** INLINE_INNER_LOOP causes the inner interpreter to be inline code
+** instead of a function call. This is mainly because MS VC++ 5
+** chokes with an internal compiler error on the function version.
+** in release mode. Sheesh.
+*/
+#if !defined INLINE_INNER_LOOP
+#if defined _DEBUG
+#define INLINE_INNER_LOOP 0
+#else
+#define INLINE_INNER_LOOP 1
+#endif
+#endif
+
+/*
+** FICL_ROBUST enables bounds checking of stacks and the dictionary.
+** This will detect stack over and underflows and dictionary overflows.
+** Any exceptional condition will result in an assertion failure.
+** (As generated by the ANSI assert macro)
+** FICL_ROBUST == 1 --> stack checking in the outer interpreter
+** FICL_ROBUST == 2 also enables checking in many primitives
+*/
+
+#if !defined FICL_ROBUST
+#define FICL_ROBUST 2
+#endif
+
+/*
+** FICL_DEFAULT_STACK Specifies the default size (in CELLs) of
+** a new virtual machine's stacks, unless overridden at
+** create time.
+*/
+#if !defined FICL_DEFAULT_STACK
+#define FICL_DEFAULT_STACK 128
+#endif
+
+/*
+** FICL_DEFAULT_DICT specifies the number of CELLs to allocate
+** for the system dictionary by default. The value
+** can be overridden at startup time as well.
+** FICL_DEFAULT_ENV specifies the number of cells to allot
+** for the environment-query dictionary.
+*/
+#if !defined FICL_DEFAULT_DICT
+#define FICL_DEFAULT_DICT 12288
+#endif
+
+#if !defined FICL_DEFAULT_ENV
+#define FICL_DEFAULT_ENV 260
+#endif
+
+/*
+** FICL_DEFAULT_VOCS specifies the maximum number of wordlists in
+** the dictionary search order. See Forth DPANS sec 16.3.3
+** (file://dpans16.htm#16.3.3)
+*/
+#if !defined FICL_DEFAULT_VOCS
+#define FICL_DEFAULT_VOCS 16
+#endif
+
+/*
+** FICL_MAX_PARSE_STEPS controls the size of an array in the FICL_SYSTEM structure
+** that stores pointers to parser extension functions. I would never expect to have
+** more than 8 of these, so that's the default limit. Too many of these functions
+** will probably exact a nasty performance penalty.
+*/
+#if !defined FICL_MAX_PARSE_STEPS
+#define FICL_MAX_PARSE_STEPS 8
+#endif
+
+/*
+** FICL_EXTENDED_PREFIX enables a bunch of extra prefixes in prefix.c and prefix.fr (if
+** included as part of softcore.c)
+*/
+#if !defined FICL_EXTENDED_PREFIX
+#define FICL_EXTENDED_PREFIX 0
+#endif
+
+/*
+** FICL_ALIGN is the power of two to which the dictionary
+** pointer address must be aligned. This value is usually
+** either 1 or 2, depending on the memory architecture
+** of the target system; 2 is safe on any 16 or 32 bit
+** machine. 3 would be appropriate for a 64 bit machine.
+*/
+#if !defined FICL_ALIGN
+#define FICL_ALIGN 3
+#define FICL_ALIGN_ADD ((1 << FICL_ALIGN) - 1)
+#endif
+
+/*
+** System dependent routines --
+** edit the implementations in sysdep.c to be compatible
+** with your runtime environment...
+** ficlTextOut sends a NULL terminated string to the
+** default output device - used for system error messages
+** ficlMalloc and ficlFree have the same semantics as malloc and free
+** in standard C
+** ficlLongMul multiplies two UNS32s and returns a 64 bit unsigned
+** product
+** ficlLongDiv divides an UNS64 by an UNS32 and returns UNS32 quotient
+** and remainder
+*/
+struct vm;
+void ficlTextOut(struct vm *pVM, char *msg, int fNewline);
+void *ficlMalloc (size_t size);
+void ficlFree (void *p);
+void *ficlRealloc(void *p, size_t size);
+/*
+** Stub function for dictionary access control - does nothing
+** by default, user can redefine to guarantee exclusive dict
+** access to a single thread for updates. All dict update code
+** must be bracketed as follows:
+** ficlLockDictionary(TRUE);
+** <code that updates dictionary>
+** ficlLockDictionary(FALSE);
+**
+** Returns zero if successful, nonzero if unable to acquire lock
+** before timeout (optional - could also block forever)
+**
+** NOTE: this function must be implemented with lock counting
+** semantics: nested calls must behave properly.
+*/
+#if FICL_MULTITHREAD
+int ficlLockDictionary(short fLock);
+#else
+#define ficlLockDictionary(x) 0 /* ignore */
+#endif
+
+/*
+** 64 bit integer math support routines: multiply two UNS32s
+** to get a 64 bit product, & divide the product by an UNS32
+** to get an UNS32 quotient and remainder. Much easier in asm
+** on a 32 bit CPU than in C, which usually doesn't support
+** the double length result (but it should).
+*/
+DPUNS ficlLongMul(FICL_UNS x, FICL_UNS y);
+UNSQR ficlLongDiv(DPUNS q, FICL_UNS y);
+
+#endif /*__SYSDEP_H__*/
diff --git a/sys/boot/forth/check-password.4th b/sys/boot/forth/check-password.4th
index 04114aa..d41777c 100644
--- a/sys/boot/forth/check-password.4th
+++ b/sys/boot/forth/check-password.4th
@@ -146,6 +146,15 @@ only forth definitions also password-processing
2drop read-reset
else drop then
+ \ Prompt for GEOM ELI (geli(8)) passphrase if enabled
+ s" geom_eli_passphrase_prompt" getenv dup -1 <> if
+ s" YES" compare-insensitive 0= if
+ s" GELI Passphrase: " read ( prompt -- )
+ readval readlen @ s" kern.geom.eli.passphrase" setenv
+ read-reset
+ then
+ else drop then
+
\ Exit if a password was not set
s" password" getenv -1 = if exit else drop then
diff --git a/sys/boot/forth/check-password.4th.8 b/sys/boot/forth/check-password.4th.8
index e1f52b7..db0aa4b 100644
--- a/sys/boot/forth/check-password.4th.8
+++ b/sys/boot/forth/check-password.4th.8
@@ -1,4 +1,4 @@
-.\" Copyright (c) 2011-2012 Devin Teske
+.\" Copyright (c) 2011-2015 Devin Teske
.\" All rights reserved.
.\"
.\" Redistribution and use in source and binary forms, with or without
@@ -24,7 +24,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd December 10, 2012
+.Dd March 20, 2015
.Dt CHECK-PASSWORD.4TH 8
.Os
.Sh NAME
@@ -33,8 +33,12 @@
.Sh DESCRIPTION
The file that goes by the name of
.Nm
-is a set of commands designed to either prevent booting or prevent modification
-of boot options without an appropriately configured password.
+is a set of commands designed to do one or more of the following:
+.Pp
+.Dl o Prevent booting without password
+.Dl o Prevent modification of boot options without password
+.Dl o Provide a password to mount geli(8) encrypted root disk(s)
+.Pp
The commands of
.Nm
by themselves are not enough for most uses.
@@ -58,14 +62,23 @@ The commands provided by it are:
.Pp
.Bl -tag -width disable-module_module -compact -offset indent
.It Ic check-password
-Dual-purpose function that can either protect the interactive boot menu or
-prevent boot without password (separately).
+Multi-purpose function that can protect the interactive boot menu,
+prevent boot without password, or prompt for geli(8) passphrase
+.Pq depending on Xr loader.conf 5 settings .
.Pp
First checks
.Va bootlock_password
and if-set, the user cannot continue until the correct password is entered.
.Pp
-Next checks
+Next, checks
+.Va geom_eli_passphrase_prompt
+and if set to
+.Li YES
+.Pq case-insensitive
+prompts the user to enter their GELI password for later mounting of the root
+device(s) during boot.
+.Pp
+Last, checks
.Va password
and if-set, tries to
.Ic autoboot
@@ -81,6 +94,11 @@ The environment variables that effect its behavior are:
Sets the bootlock password (up to 16 characters long) that is required by
.Ic check-password
to be entered before the system is allowed to boot.
+.It Va geom_eli_passphrase_prompt
+Selects whether loader(8) will prompt for GELI credentials, handing-off to the
+kernel for later mounting of
+.Xr geli 8
+encrypted root device(s).
.It Va password
Sets the password (up to 16 characters long) that is required by
.Ic check-password
@@ -122,6 +140,16 @@ to prevent booting without password:
.Bd -literal -offset indent -compact
bootlock_password="boot"
.Ed
+.Pp
+Add the following to
+.Xr loader.conf 5
+to generate a prompt at boot to collect GELI credentials for mounting
+.Xr geli 8
+encrypted root device(s):
+.Pp
+.Bd -literal -offset indent -compact
+geom_eli_passphrase_prompt="YES"
+.Ed
.Sh SEE ALSO
.Xr loader.conf 5 ,
.Xr loader 8 ,
diff --git a/sys/boot/forth/loader.conf b/sys/boot/forth/loader.conf
index 573a06a..240e403 100644
--- a/sys/boot/forth/loader.conf
+++ b/sys/boot/forth/loader.conf
@@ -48,6 +48,16 @@ entropy_cache_type="/boot/entropy"
#kern.random.sys.seeded="0" # Set this to 1 to start /dev/random
# without waiting for a (re)seed.
+##############################################################
+### RAM Blacklist configuration #############################
+##############################################################
+
+ram_blacklist_load="NO" # Set this to YES to load a file
+ # containing a list of addresses to
+ # exclude from the running system.
+ram_blacklist_name="/boot/blacklist.txt" # Set this to the name of the file
+ram_blacklist_type="ram_blacklist" # Required for the kernel to find
+ # the blacklist module
##############################################################
### Loader settings ########################################
@@ -62,6 +72,7 @@ entropy_cache_type="/boot/entropy"
# "NO" to disable autobooting
#password="" # Prevent changes to boot options
#bootlock_password="" # Prevent booting (see check-password.4th(8))
+#geom_eli_passphrase_prompt="NO" # Prompt for geli(8) passphrase to mount root
#beastie_disable="NO" # Turn the beastie boot menu on and off
#kernels="kernel kernel.old" # Kernels to display in the boot menu
#loader_logo="orbbw" # Desired logo: orbbw, orb, fbsdbw, beastiebw, beastie, none
diff --git a/sys/boot/forth/menu.4th b/sys/boot/forth/menu.4th
index 4d8aaee..9127565 100644
--- a/sys/boot/forth/menu.4th
+++ b/sys/boot/forth/menu.4th
@@ -206,6 +206,8 @@ also menu-infrastructure definitions
\
: printmenuitem ( menu_item_str -- ascii_keycode )
+ loader_color? if [char] ^ escc! then
+
menurow dup @ 1+ swap ! ( increment menurow )
menuidx dup @ 1+ swap ! ( increment menuidx )
diff --git a/sys/boot/forth/menu.rc b/sys/boot/forth/menu.rc
index 70f0b68..e650848 100644
--- a/sys/boot/forth/menu.rc
+++ b/sys/boot/forth/menu.rc
@@ -17,6 +17,7 @@ menu-init \ initialize the menu area (see `menu.4th')
\ Initialize main menu constructs (see `menu.4th')
\ NOTE: To use `non-ansi' variants, add `loader_color=0' to loader.conf(5)
+\ NOTE: ANSI variants can use `^' in place of literal `Esc' (ASCII 27)
\
\ MAIN MENU
@@ -28,22 +29,22 @@ set mainmenu_init[1]="init_boot"
set mainmenu_caption[1]="Boot Multi User [Enter]"
set maintoggled_text[1]="Boot [S]ingle User [Enter]"
set mainmenu_command[1]="boot"
-set mainansi_caption[1]="Boot Multi User [Enter]"
-set maintoggled_ansi[1]="Boot Single User [Enter]"
+set mainansi_caption[1]="^[1mB^[moot Multi User ^[1m[Enter]^[m"
+set maintoggled_ansi[1]="Boot ^[1mS^[mingle User ^[1m[Enter]^[m"
\ keycode set by init_boot
set mainmenu_init[2]="init_altboot"
set mainmenu_caption[2]="Boot [S]ingle User"
set maintoggled_text[2]="Boot [M]ulti User"
set mainmenu_command[2]="altboot"
-set mainansi_caption[2]="Boot Single User"
-set maintoggled_ansi[2]="Boot Multi User"
+set mainansi_caption[2]="Boot ^[1mS^[mingle User"
+set maintoggled_ansi[2]="Boot ^[1mM^[multi User"
\ keycode set by init_altboot
set mainmenu_caption[3]="[Esc]ape to loader prompt"
set mainmenu_command[3]="goto_prompt"
set mainmenu_keycode[3]=27
-set mainansi_caption[3]="Escape to loader prompt"
+set mainansi_caption[3]="^[1mEsc^[mape to loader prompt"
\ Enable built-in "Reboot" trailing menuitem
\ NOTE: appears before menu_options if configured
@@ -62,7 +63,7 @@ set mainmenu_keycode[5]=107
set mainmenu_caption[6]="Configure Boot [O]ptions..."
set mainmenu_command[6]="2 goto_menu"
set mainmenu_keycode[6]=111
-set mainansi_caption[6]="Configure Boot Options..."
+set mainansi_caption[6]="Configure Boot ^[1mO^[mptions..."
\
\ BOOT OPTIONS MENU
@@ -73,12 +74,12 @@ set menuset_name2="options"
set optionsmenu_caption[1]="Back to Main Menu [Backspace]"
set optionsmenu_command[1]="1 goto_menu"
set optionsmenu_keycode[1]=8
-set optionsansi_caption[1]="Back to Main Menu [Backspace]"
+set optionsansi_caption[1]="Back to Main Menu ^[1m[Backspace]^[m"
set optionsmenu_caption[2]="Load System [D]efaults"
set optionsmenu_command[2]="set_default_boot_options"
set optionsmenu_keycode[2]=100
-set optionsansi_caption[2]="Load System Defaults"
+set optionsansi_caption[2]="Load System ^[1mD^[mefaults"
set optionsmenu_options=3
set optionsmenu_optionstext="Boot Options:"
@@ -88,32 +89,32 @@ set optionsmenu_caption[3]="[A]CPI Support off"
set optionstoggled_text[3]="[A]CPI Support On"
set optionsmenu_command[3]="toggle_acpi"
set optionsmenu_keycode[3]=97
-set optionsansi_caption[3]="ACPI Support Off"
-set optionstoggled_ansi[3]="ACPI Support On"
+set optionsansi_caption[3]="^[1mA^[mCPI Support ^[34;1mOff^[m"
+set optionstoggled_ansi[3]="^[1mA^[mCPI Support ^[32;7mOn^[m"
set optionsmenu_init[4]="init_safemode"
set optionsmenu_caption[4]="Safe [M]ode... off"
set optionstoggled_text[4]="Safe [M]ode... On"
set optionsmenu_command[4]="toggle_safemode"
set optionsmenu_keycode[4]=109
-set optionsansi_caption[4]="Safe Mode... Off"
-set optionstoggled_ansi[4]="Safe Mode... On"
+set optionsansi_caption[4]="Safe ^[1mM^[mode... ^[34;1mOff^[m"
+set optionstoggled_ansi[4]="Safe ^[1mM^[mode... ^[32;7mOn^[m"
set optionsmenu_init[5]="init_singleuser"
set optionsmenu_caption[5]="[S]ingle User. off"
set optionstoggled_text[5]="[S]ingle User. On"
set optionsmenu_command[5]="toggle_singleuser"
set optionsmenu_keycode[5]=115
-set optionsansi_caption[5]="Single User. Off"
-set optionstoggled_ansi[5]="Single User. On"
+set optionsansi_caption[5]="^[1mS^[mingle User. ^[34;1mOff^[m"
+set optionstoggled_ansi[5]="^[1mS^[mingle User. ^[32;7mOn^[m"
set optionsmenu_init[6]="init_verbose"
set optionsmenu_caption[6]="[V]erbose..... off"
set optionstoggled_text[6]="[V]erbose..... On"
set optionsmenu_command[6]="toggle_verbose"
set optionsmenu_keycode[6]=118
-set optionsansi_caption[6]="Verbose..... Off"
-set optionstoggled_ansi[6]="Verbose..... On"
+set optionsansi_caption[6]="^[1mV^[merbose..... ^[34;1mOff^[m"
+set optionstoggled_ansi[6]="^[1mV^[merbose..... ^[32;7mOn^[m"
\ Enable automatic booting (add ``autoboot_delay=N'' to loader.conf(5) to
\ customize the timeout; default is 10-seconds)
diff --git a/sys/boot/forth/version.4th b/sys/boot/forth/version.4th
index 2b672b6..a5311b4 100644
--- a/sys/boot/forth/version.4th
+++ b/sys/boot/forth/version.4th
@@ -85,10 +85,12 @@ only forth definitions also version-processing
dup versionX @ swap - versionY @ at-xy
\ Print the version (optionally in cyan)
- loader_color? dup ( -- bool bool )
+ loader_color? dup ( c-addr/u -- c-addr/u bool bool )
if 6 fg then
- type
+ -rot type
if me then
+
+ 0 25 at-xy
;
only forth definitions
diff --git a/sys/boot/i386/common/edd.h b/sys/boot/i386/common/edd.h
index 4a204f7..7d1f450 100644
--- a/sys/boot/i386/common/edd.h
+++ b/sys/boot/i386/common/edd.h
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2011 Advanced Computing Technologies LLC
+ * Copyright (c) 2011 Hudson River Trading LLC
* Written by: John H. Baldwin <jhb@FreeBSD.org>
* All rights reserved.
*
diff --git a/sys/boot/i386/libi386/libi386.h b/sys/boot/i386/libi386/libi386.h
index 2322c2b..ce650dd 100644
--- a/sys/boot/i386/libi386/libi386.h
+++ b/sys/boot/i386/libi386/libi386.h
@@ -113,10 +113,6 @@ uint32_t biospci_locator(int8_t bus, uint8_t device, uint8_t function);
void biosacpi_detect(void);
-void smbios_detect(void);
-int smbios_match(const char* bios_vendor, const char* maker,
- const char* product);
-
int i386_autoload(void);
int bi_getboothowto(char *kargs);
diff --git a/sys/boot/i386/libi386/smbios.c b/sys/boot/i386/libi386/smbios.c
index 570111c..6e4fb84 100644
--- a/sys/boot/i386/libi386/smbios.c
+++ b/sys/boot/i386/libi386/smbios.c
@@ -31,8 +31,13 @@ __FBSDID("$FreeBSD$");
#include <bootstrap.h>
#include <sys/endian.h>
+#ifdef EFI
+/* In EFI, we don't need PTOV(). */
+#define PTOV(x) (caddr_t)(x)
+#else
#include "btxv86.h"
-#include "libi386.h"
+#endif
+#include "smbios.h"
/*
* Detect SMBIOS and export information about the SMBIOS into the
@@ -347,17 +352,18 @@ smbios_find_struct(int type)
}
static void
-smbios_probe(void)
+smbios_probe(const caddr_t addr)
{
caddr_t saddr, info;
- u_int32_t paddr;
+ uintptr_t paddr;
if (smbios.probed)
return;
smbios.probed = 1;
/* Search signatures and validate checksums. */
- saddr = smbios_sigsearch(PTOV(SMBIOS_START), SMBIOS_LENGTH);
+ saddr = smbios_sigsearch(addr ? addr : PTOV(SMBIOS_START),
+ SMBIOS_LENGTH);
if (saddr == NULL)
return;
@@ -392,13 +398,13 @@ smbios_probe(void)
}
void
-smbios_detect(void)
+smbios_detect(const caddr_t addr)
{
char buf[16];
caddr_t dmi;
int i;
- smbios_probe();
+ smbios_probe(addr);
if (smbios.addr == NULL)
return;
@@ -433,7 +439,8 @@ int
smbios_match(const char* bios_vendor, const char* maker,
const char* product)
{
- smbios_probe();
+ /* XXXRP currently, only called from non-EFI. */
+ smbios_probe(NULL);
return (smbios_match_str(bios_vendor, smbios.bios_vendor) &&
smbios_match_str(maker, smbios.maker) &&
smbios_match_str(product, smbios.product));
diff --git a/sys/boot/i386/libi386/smbios.h b/sys/boot/i386/libi386/smbios.h
new file mode 100644
index 0000000..03fc07e
--- /dev/null
+++ b/sys/boot/i386/libi386/smbios.h
@@ -0,0 +1,34 @@
+/*-
+ * Copyright (c) 2015 Rui Paulo <rpaulo@FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+#ifndef _SMBIOS_H_
+#define _SMBIOS_H_
+
+void smbios_detect(const caddr_t);
+int smbios_match(const char *, const char *, const char *);
+
+#endif /* _SMBIOS_H_ */
diff --git a/sys/boot/i386/loader/main.c b/sys/boot/i386/loader/main.c
index 3479169..82465a3 100644
--- a/sys/boot/i386/loader/main.c
+++ b/sys/boot/i386/loader/main.c
@@ -43,6 +43,7 @@ __FBSDID("$FreeBSD$");
#include "bootstrap.h"
#include "common/bootargs.h"
#include "libi386/libi386.h"
+#include "libi386/smbios.h"
#include "btxv86.h"
#ifdef LOADER_ZFS_SUPPORT
@@ -115,7 +116,7 @@ main(void)
}
setheap(heap_bottom, heap_top);
- /*
+ /*
* XXX Chicken-and-egg problem; we want to have console output early, but some
* console attributes may depend on reading from eg. the boot device, which we
* can't do yet.
@@ -181,7 +182,7 @@ main(void)
biosacpi_detect();
/* detect SMBIOS for future reference */
- smbios_detect();
+ smbios_detect(NULL);
/* detect PCI BIOS for future reference */
biospci_detect();
diff --git a/sys/boot/libstand32/Makefile b/sys/boot/libstand32/Makefile
index a08a8e9..c41dc21 100644
--- a/sys/boot/libstand32/Makefile
+++ b/sys/boot/libstand32/Makefile
@@ -11,9 +11,10 @@ MAN=
.include <src.opts.mk>
MK_SSP= no
-S= ${.CURDIR}/../../../lib/libstand
+LIBSTAND_SRC= ${.CURDIR}/../../../lib/libstand
+LIBC_SRC= ${LIBSTAND_SRC}/../libc
-.PATH: ${S}
+.PATH: ${LIBSTAND_SRC}
LIB= stand
INTERNALLIB=
MK_PROFILE= no
@@ -22,7 +23,7 @@ NO_PIC=
WARNS?= 0
CFLAGS+= -ffreestanding -Wformat
-CFLAGS+= -I${S}
+CFLAGS+= -I${LIBSTAND_SRC}
.if ${MACHINE_CPUARCH} == "i386" || ${MACHINE_CPUARCH} == "amd64"
CFLAGS.gcc+= -mpreferred-stack-boundary=2
@@ -52,56 +53,54 @@ SRCS+= gzguts.h zutil.h __main.c assert.c bcd.c bswap.c environment.c getopt.c g
# private (pruned) versions of libc string functions
SRCS+= strcasecmp.c
-LIBC= ${S}/../libc
-
-.PATH: ${LIBC}/net
+.PATH: ${LIBC_SRC}/net
SRCS+= ntoh.c
# string functions from libc
-.PATH: ${LIBC}/string
+.PATH: ${LIBC_SRC}/string
SRCS+= bcmp.c bcopy.c bzero.c ffs.c memccpy.c memchr.c memcmp.c memcpy.c \
memmove.c memset.c qdivrem.c strcat.c strchr.c strcmp.c strcpy.c \
strcspn.c strlen.c strncat.c strncmp.c strncpy.c strpbrk.c \
strrchr.c strsep.c strspn.c strstr.c strtok.c swab.c
.if ${MACHINE_CPUARCH} == "arm"
-.PATH: ${LIBC}/arm/gen
+.PATH: ${LIBC_SRC}/arm/gen
# Compiler support functions
-.PATH: ${.CURDIR}/../../../contrib/compiler-rt/lib/builtins/
+.PATH: ${LIBSTAND_SRC}/../../contrib/compiler-rt/lib/builtins/
# __clzsi2 and ctzsi2 for various builtin functions
SRCS+= clzsi2.c ctzsi2.c
# Divide and modulus functions called by the compiler
SRCS+= divmoddi4.c divmodsi4.c divdi3.c divsi3.c moddi3.c modsi3.c
SRCS+= udivmoddi4.c udivmodsi4.c udivdi3.c udivsi3.c umoddi3.c umodsi3.c
-.PATH: ${.CURDIR}/../../../contrib/compiler-rt/lib/builtins/arm/
+.PATH: ${LIBSTAND_SRC}/../../contrib/compiler-rt/lib/builtins/arm/
SRCS+= aeabi_idivmod.S aeabi_ldivmod.S aeabi_uidivmod.S aeabi_uldivmod.S
SRCS+= aeabi_memcmp.S aeabi_memcpy.S aeabi_memmove.S aeabi_memset.S
.endif
.if ${MACHINE_CPUARCH} == "powerpc"
-.PATH: ${LIBC}/quad
+.PATH: ${LIBC_SRC}/quad
SRCS+= ashldi3.c ashrdi3.c
SRCS+= syncicache.c
.endif
# uuid functions from libc
-.PATH: ${LIBC}/uuid
+.PATH: ${LIBC_SRC}/uuid
SRCS+= uuid_equal.c uuid_is_nil.c
# _setjmp/_longjmp
.if ${MACHINE_CPUARCH} == "amd64"
-.PATH: ${S}/i386
+.PATH: ${LIBSTAND_SRC}/i386
.else
-.PATH: ${S}/${MACHINE_CPUARCH}
+.PATH: ${LIBSTAND_SRC}/${MACHINE_CPUARCH}
.endif
SRCS+= _setjmp.S
# decompression functionality from libbz2
# NOTE: to actually test this functionality after libbz2 upgrade compile
# loader(8) with LOADER_BZIP2_SUPPORT defined
-.PATH: ${.CURDIR}/../../../contrib/bzip2
+.PATH: ${LIBSTAND_SRC}/../../contrib/bzip2
CFLAGS+= -DBZ_NO_STDIO -DBZ_NO_COMPRESS
SRCS+= libstand_bzlib_private.h
@@ -110,7 +109,8 @@ SRCS+= _${file}
CLEANFILES+= _${file}
_${file}: ${file}
- sed "s|bzlib_private\.h|libstand_bzlib_private.h|" ${.ALLSRC} > ${.TARGET}
+ sed "s|bzlib_private\.h|libstand_bzlib_private.h|" \
+ ${.ALLSRC} > ${.TARGET}
.endfor
CLEANFILES+= libstand_bzlib_private.h
@@ -119,8 +119,8 @@ libstand_bzlib_private.h: bzlib_private.h
${.ALLSRC} > ${.TARGET}
# decompression functionality from libz
-.PATH: ${S}/../libz
-CFLAGS+=-DHAVE_MEMCPY -I${S}/../libz
+.PATH: ${LIBSTAND_SRC}/../libz
+CFLAGS+=-DHAVE_MEMCPY -I${LIBSTAND_SRC}/../libz
SRCS+= adler32.c crc32.c libstand_zutil.h libstand_gzguts.h
.for file in infback.c inffast.c inflate.c inftrees.c zutil.c
diff --git a/sys/boot/sparc64/loader/main.c b/sys/boot/sparc64/loader/main.c
index 44c4d21..ae1e559 100644
--- a/sys/boot/sparc64/loader/main.c
+++ b/sys/boot/sparc64/loader/main.c
@@ -101,7 +101,7 @@ static inline u_long itlb_get_data_sun4u(u_int, u_int);
static int itlb_enter_sun4u(u_int, u_long data, vm_offset_t);
static vm_offset_t itlb_va_to_pa_sun4u(vm_offset_t);
static void itlb_relocate_locked0_sun4u(void);
-extern vm_offset_t md_load(char *, vm_offset_t *);
+extern vm_offset_t md_load(char *, vm_offset_t *, vm_offset_t *);
static int sparc64_autoload(void);
static ssize_t sparc64_readin(const int, vm_offset_t, const size_t);
static ssize_t sparc64_copyin(const void *, vm_offset_t, size_t);
@@ -340,7 +340,7 @@ static int
__elfN(exec)(struct preloaded_file *fp)
{
struct file_metadata *fmp;
- vm_offset_t mdp;
+ vm_offset_t mdp, dtbp;
Elf_Addr entry;
Elf_Ehdr *e;
int error;
@@ -349,7 +349,7 @@ __elfN(exec)(struct preloaded_file *fp)
return (EFTYPE);
e = (Elf_Ehdr *)&fmp->md_data;
- if ((error = md_load(fp->f_args, &mdp)) != 0)
+ if ((error = md_load(fp->f_args, &mdp, &dtbp)) != 0)
return (error);
printf("jumping to kernel entry at %#lx.\n", e->e_entry);
diff --git a/sys/boot/userboot/libstand/Makefile b/sys/boot/userboot/libstand/Makefile
index 35903fc..88eb98f 100644
--- a/sys/boot/userboot/libstand/Makefile
+++ b/sys/boot/userboot/libstand/Makefile
@@ -11,9 +11,10 @@ MAN=
.include <bsd.own.mk>
MK_SSP= no
-S= ${.CURDIR}/../../../../lib/libstand
+LIBSTAND_SRC= ${.CURDIR}/../../../../lib/libstand
+LIBC_SRC= ${LIBSTAND_SRC}/../libc
-.PATH: ${S}
+.PATH: ${LIBSTAND_SRC}
LIB= stand
INTERNALLIB=
MK_PROFILE= no
@@ -22,7 +23,7 @@ NO_PIC=
WARNS?= 0
CFLAGS+= -ffreestanding -Wformat -fPIC
-CFLAGS+= -I${.CURDIR}/../../../../lib/libstand
+CFLAGS+= -I${LIBSTAND_SRC}
.if ${MACHINE_CPUARCH} == "i386" || ${MACHINE_CPUARCH} == "amd64"
CFLAGS+= -mno-mmx -mno-3dnow -mno-sse -mno-sse2
@@ -49,14 +50,12 @@ SRCS+= gzguts.h zutil.h __main.c assert.c bcd.c bswap.c environment.c getopt.c g
# private (pruned) versions of libc string functions
SRCS+= strcasecmp.c
-LIBC= ${.CURDIR}/../../../../lib/libc
-
-.PATH: ${LIBC}/net
+.PATH: ${LIBC_SRC}/net
SRCS+= ntoh.c
# string functions from libc
-.PATH: ${LIBC}/string
+.PATH: ${LIBC_SRC}/string
.if ${MACHINE_CPUARCH} == "i386" || ${MACHINE_CPUARCH} == "powerpc" || \
${MACHINE_CPUARCH} == "sparc64" || ${MACHINE_CPUARCH} == "amd64" || \
${MACHINE_CPUARCH} == "arm"
@@ -66,34 +65,34 @@ SRCS+= bcmp.c bcopy.c bzero.c ffs.c memccpy.c memchr.c memcmp.c memcpy.c \
strrchr.c strsep.c strspn.c strstr.c strtok.c swab.c
.endif
.if ${MACHINE_CPUARCH} == "arm"
-.PATH: ${LIBC}/arm/gen
+.PATH: ${LIBC_SRC}/arm/gen
SRCS+= divsi3.S
.endif
.if ${MACHINE_CPUARCH} == "powerpc"
-.PATH: ${LIBC}/libc/quad
+.PATH: ${LIBC_SRC}/quad
SRCS+= ashldi3.c ashrdi3.c
-.PATH: ${LIBC}/powerpc/gen
+.PATH: ${LIBC_SRC}/powerpc/gen
SRCS+= syncicache.c
.endif
# uuid functions from libc
-.PATH: ${LIBC}/uuid
+.PATH: ${LIBC_SRC}/uuid
SRCS+= uuid_equal.c uuid_is_nil.c
# _setjmp/_longjmp
.if ${MACHINE_CPUARCH} == "amd64"
-.PATH: ${S}/amd64
+.PATH: ${LIBSTAND_SRC}/amd64
.elif ${MACHINE_ARCH} == "powerpc64"
-.PATH: ${S}/powerpc
+.PATH: ${LIBSTAND_SRC}/powerpc
.else
-.PATH: ${S}/${MACHINE_CPUARCH}
+.PATH: ${LIBSTAND_SRC}/${MACHINE_CPUARCH}
.endif
SRCS+= _setjmp.S
# decompression functionality from libbz2
# NOTE: to actually test this functionality after libbz2 upgrade compile
# loader(8) with LOADER_BZIP2_SUPPORT defined
-.PATH: ${.CURDIR}/../../../../contrib/bzip2
+.PATH: ${LIBSTAND_SRC}/../../contrib/bzip2
CFLAGS+= -DBZ_NO_STDIO -DBZ_NO_COMPRESS
SRCS+= libstand_bzlib_private.h
@@ -102,7 +101,8 @@ SRCS+= _${file}
CLEANFILES+= _${file}
_${file}: ${file}
- sed "s|bzlib_private\.h|libstand_bzlib_private.h|" ${.ALLSRC} > ${.TARGET}
+ sed "s|bzlib_private\.h|libstand_bzlib_private.h|" \
+ ${.ALLSRC} > ${.TARGET}
.endfor
CLEANFILES+= libstand_bzlib_private.h
@@ -111,8 +111,8 @@ libstand_bzlib_private.h: bzlib_private.h
${.ALLSRC} > ${.TARGET}
# decompression functionality from libz
-.PATH: ${.CURDIR}/../../../../lib/libz
-CFLAGS+=-DHAVE_MEMCPY -I${.CURDIR}/../../../../lib/libz
+.PATH: ${LIBSTAND_SRC}/../libz
+CFLAGS+=-DHAVE_MEMCPY -I${LIBSTAND_SRC}/../libz
SRCS+= adler32.c crc32.c libstand_zutil.h libstand_gzguts.h
.for file in infback.c inffast.c inflate.c inftrees.c zutil.c
@@ -121,7 +121,8 @@ CLEANFILES+= _${file}
_${file}: ${file}
sed -e "s|zutil\.h|libstand_zutil.h|" \
- -e "s|gzguts\.h|libstand_gzguts.h|" ${.ALLSRC} > ${.TARGET}
+ -e "s|gzguts\.h|libstand_gzguts.h|" \
+ ${.ALLSRC} > ${.TARGET}
.endfor
# depend on stand.h being able to be included multiple times
diff --git a/sys/cam/cam_xpt.c b/sys/cam/cam_xpt.c
index 06e01fc..ad55373 100644
--- a/sys/cam/cam_xpt.c
+++ b/sys/cam/cam_xpt.c
@@ -4264,8 +4264,10 @@ xpt_async(u_int32_t async_code, struct cam_path *path, void *async_arg)
}
memcpy(ccb->casync.async_arg_ptr, async_arg, size);
ccb->casync.async_arg_size = size;
- } else if (size < 0)
+ } else if (size < 0) {
+ ccb->casync.async_arg_ptr = async_arg;
ccb->casync.async_arg_size = size;
+ }
if (path->device != NULL && path->device->lun_id != CAM_LUN_WILDCARD)
xpt_freeze_devq(path, 1);
else
diff --git a/sys/cam/scsi/scsi_all.c b/sys/cam/scsi/scsi_all.c
index 3266d5b3f..a429259 100644
--- a/sys/cam/scsi/scsi_all.c
+++ b/sys/cam/scsi/scsi_all.c
@@ -6039,7 +6039,7 @@ scsi_parse_transportid_rdma(char *id_str, struct scsi_transportid_header **hdr,
goto bailout;
}
*alloc_len = sizeof(*rdma);
- bzero(rdma, sizeof(rdma));
+ bzero(rdma, *alloc_len);
rdma->format_protocol = SCSI_PROTO_RDMA | SCSI_TRN_RDMA_FORMAT_DEFAULT;
bcopy(rdma_id, rdma->initiator_port_id, SCSI_TRN_RDMA_PORT_LEN);
diff --git a/sys/cam/scsi/scsi_da.c b/sys/cam/scsi/scsi_da.c
index 911aece..74dd3b9 100644
--- a/sys/cam/scsi/scsi_da.c
+++ b/sys/cam/scsi/scsi_da.c
@@ -1186,7 +1186,7 @@ static struct da_quirk_entry da_quirk_table[] =
/*
* MX-ES USB Drive by Mach Xtreme
*/
- { T_DIRECT, SIP_MEDIA_REMOVABLE, "MX", "MXUB3SES*", "*"},
+ { T_DIRECT, SIP_MEDIA_REMOVABLE, "MX", "MXUB3*", "*"},
/*quirks*/DA_Q_NO_RC16
},
};
diff --git a/sys/cddl/contrib/opensolaris/common/nvpair/nvpair.c b/sys/cddl/contrib/opensolaris/common/nvpair/nvpair.c
index 53ed5f2..cd6af4e 100644
--- a/sys/cddl/contrib/opensolaris/common/nvpair/nvpair.c
+++ b/sys/cddl/contrib/opensolaris/common/nvpair/nvpair.c
@@ -1227,6 +1227,7 @@ nvpair_type_is_array(nvpair_t *nvp)
data_type_t type = NVP_TYPE(nvp);
if ((type == DATA_TYPE_BYTE_ARRAY) ||
+ (type == DATA_TYPE_INT8_ARRAY) ||
(type == DATA_TYPE_UINT8_ARRAY) ||
(type == DATA_TYPE_INT16_ARRAY) ||
(type == DATA_TYPE_UINT16_ARRAY) ||
diff --git a/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c b/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c
index 818f180..b31e8bb 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c
@@ -611,7 +611,11 @@ dtrace_panic(const char *format, ...)
va_list alist;
va_start(alist, format);
+#ifdef __FreeBSD__
+ vpanic(format, alist);
+#else
dtrace_vpanic(format, alist);
+#endif
va_end(alist);
}
@@ -15374,13 +15378,15 @@ dtrace_helper_action_destroy(dtrace_helper_action_t *helper,
}
static int
-dtrace_helper_destroygen(int gen)
+dtrace_helper_destroygen(dtrace_helpers_t *help, int gen)
{
proc_t *p = curproc;
- dtrace_helpers_t *help = p->p_dtrace_helpers;
dtrace_vstate_t *vstate;
int i;
+ if (help == NULL)
+ help = p->p_dtrace_helpers;
+
ASSERT(MUTEX_HELD(&dtrace_lock));
if (help == NULL || gen > help->dthps_generation)
@@ -15478,9 +15484,9 @@ dtrace_helper_validate(dtrace_helper_action_t *helper)
}
static int
-dtrace_helper_action_add(int which, dtrace_ecbdesc_t *ep)
+dtrace_helper_action_add(int which, dtrace_ecbdesc_t *ep,
+ dtrace_helpers_t *help)
{
- dtrace_helpers_t *help;
dtrace_helper_action_t *helper, *last;
dtrace_actdesc_t *act;
dtrace_vstate_t *vstate;
@@ -15490,7 +15496,6 @@ dtrace_helper_action_add(int which, dtrace_ecbdesc_t *ep)
if (which < 0 || which >= DTRACE_NHELPER_ACTIONS)
return (EINVAL);
- help = curproc->p_dtrace_helpers;
last = help->dthps_actions[which];
vstate = &help->dthps_vstate;
@@ -15614,15 +15619,12 @@ dtrace_helper_provider_register(proc_t *p, dtrace_helpers_t *help,
}
static int
-dtrace_helper_provider_add(dof_helper_t *dofhp, int gen)
+dtrace_helper_provider_add(dof_helper_t *dofhp, dtrace_helpers_t *help, int gen)
{
- dtrace_helpers_t *help;
dtrace_helper_provider_t *hprov, **tmp_provs;
uint_t tmp_maxprovs, i;
ASSERT(MUTEX_HELD(&dtrace_lock));
-
- help = curproc->p_dtrace_helpers;
ASSERT(help != NULL);
/*
@@ -15914,13 +15916,28 @@ dtrace_helper_slurp(dof_hdr_t *dof, dof_helper_t *dhp)
dtrace_helpers_t *help;
dtrace_vstate_t *vstate;
dtrace_enabling_t *enab = NULL;
+ proc_t *p = curproc;
int i, gen, rv, nhelpers = 0, nprovs = 0, destroy = 1;
uintptr_t daddr = (uintptr_t)dof;
ASSERT(MUTEX_HELD(&dtrace_lock));
- if ((help = curproc->p_dtrace_helpers) == NULL)
- help = dtrace_helpers_create(curproc);
+#ifdef __FreeBSD__
+ if (dhp->dofhp_pid != p->p_pid) {
+ if ((p = pfind(dhp->dofhp_pid)) == NULL)
+ return (-1);
+ if (!P_SHOULDSTOP(p) ||
+ (p->p_flag & P_TRACED) == 0 ||
+ p->p_pptr->p_pid != curproc->p_pid) {
+ PROC_UNLOCK(p);
+ return (-1);
+ }
+ PROC_UNLOCK(p);
+ }
+#endif
+
+ if ((help = p->p_dtrace_helpers) == NULL)
+ help = dtrace_helpers_create(p);
vstate = &help->dthps_vstate;
@@ -15968,12 +15985,13 @@ dtrace_helper_slurp(dof_hdr_t *dof, dof_helper_t *dhp)
continue;
if ((rv = dtrace_helper_action_add(DTRACE_HELPER_ACTION_USTACK,
- ep)) != 0) {
+ ep, help)) != 0) {
/*
* Adding this helper action failed -- we are now going
* to rip out the entire generation and return failure.
*/
- (void) dtrace_helper_destroygen(help->dthps_generation);
+ (void) dtrace_helper_destroygen(help,
+ help->dthps_generation);
dtrace_enabling_destroy(enab);
dtrace_dof_destroy(dof);
return (-1);
@@ -15990,9 +16008,9 @@ dtrace_helper_slurp(dof_hdr_t *dof, dof_helper_t *dhp)
if (dhp != NULL && nprovs > 0) {
dhp->dofhp_dof = (uint64_t)(uintptr_t)dof;
- if (dtrace_helper_provider_add(dhp, gen) == 0) {
+ if (dtrace_helper_provider_add(dhp, help, gen) == 0) {
mutex_exit(&dtrace_lock);
- dtrace_helper_provider_register(curproc, help, dhp);
+ dtrace_helper_provider_register(p, help, dhp);
mutex_enter(&dtrace_lock);
destroy = 0;
@@ -16956,7 +16974,7 @@ dtrace_ioctl_helper(int cmd, intptr_t arg, int *rv)
case DTRACEHIOC_REMOVE: {
mutex_enter(&dtrace_lock);
- rval = dtrace_helper_destroygen(arg);
+ rval = dtrace_helper_destroygen(NULL, arg);
mutex_exit(&dtrace_lock);
return (rval);
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c
index 4176dce..30ca7b9 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c
@@ -2671,8 +2671,12 @@ arc_reclaim_needed(void)
* Above limits know nothing about real level of KVA fragmentation.
* Start aggressive reclamation if too little sequential KVA left.
*/
- if (vmem_size(heap_arena, VMEM_MAXFREE) < zfs_max_recordsize)
+ if (vmem_size(heap_arena, VMEM_MAXFREE) < zfs_max_recordsize) {
+ DTRACE_PROBE2(arc__reclaim_maxfree, uint64_t,
+ vmem_size(heap_arena, VMEM_MAXFREE),
+ uint64_t, zfs_max_recordsize);
return (1);
+ }
#else /* _KERNEL */
if (spa_get_random(100) == 0)
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_objset.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_objset.c
index 36ac27a..fb9c8a1 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_objset.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_objset.c
@@ -23,6 +23,7 @@
* Copyright (c) 2012, 2014 by Delphix. All rights reserved.
* Copyright (c) 2013 by Saso Kiselkov. All rights reserved.
* Copyright (c) 2013, Joyent, Inc. All rights reserved.
+ * Copyright 2015 Nexenta Systems, Inc. All rights reserved.
*/
/* Portions Copyright 2010 Robert Milkowski */
@@ -879,11 +880,7 @@ dmu_objset_clone_check(void *arg, dmu_tx_t *tx)
dsl_dir_rele(pdd, FTAG);
return (SET_ERROR(EEXIST));
}
- /* You can't clone across pools. */
- if (pdd->dd_pool != dp) {
- dsl_dir_rele(pdd, FTAG);
- return (SET_ERROR(EXDEV));
- }
+
error = dsl_fs_ss_limit_check(pdd, 1, ZFS_PROP_FILESYSTEM_LIMIT, NULL,
doca->doca_cred);
if (error != 0) {
@@ -896,12 +893,6 @@ dmu_objset_clone_check(void *arg, dmu_tx_t *tx)
if (error != 0)
return (error);
- /* You can't clone across pools. */
- if (origin->ds_dir->dd_pool != dp) {
- dsl_dataset_rele(origin, FTAG);
- return (SET_ERROR(EXDEV));
- }
-
/* You can only clone snapshots, not the head datasets. */
if (!dsl_dataset_is_snapshot(origin)) {
dsl_dataset_rele(origin, FTAG);
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_traverse.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_traverse.c
index 7b1d6be..faa6d0c 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_traverse.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu_traverse.c
@@ -306,21 +306,22 @@ traverse_visitbp(traverse_data_t *td, const dnode_phys_t *dnp,
arc_flags_t flags = ARC_FLAG_WAIT;
int i;
int epb = BP_GET_LSIZE(bp) >> DNODE_SHIFT;
+ dnode_phys_t *cdnp;
err = arc_read(NULL, td->td_spa, bp, arc_getbuf_func, &buf,
ZIO_PRIORITY_ASYNC_READ, ZIO_FLAG_CANFAIL, &flags, zb);
if (err != 0)
goto post;
- dnp = buf->b_data;
+ cdnp = buf->b_data;
for (i = 0; i < epb; i++) {
- prefetch_dnode_metadata(td, &dnp[i], zb->zb_objset,
+ prefetch_dnode_metadata(td, &cdnp[i], zb->zb_objset,
zb->zb_blkid * epb + i);
}
/* recursively visitbp() blocks below this */
for (i = 0; i < epb; i++) {
- err = traverse_dnode(td, &dnp[i], zb->zb_objset,
+ err = traverse_dnode(td, &cdnp[i], zb->zb_objset,
zb->zb_blkid * epb + i);
if (err != 0)
break;
@@ -328,7 +329,7 @@ traverse_visitbp(traverse_data_t *td, const dnode_phys_t *dnp,
} else if (BP_GET_TYPE(bp) == DMU_OT_OBJSET) {
arc_flags_t flags = ARC_FLAG_WAIT;
objset_phys_t *osp;
- dnode_phys_t *dnp;
+ dnode_phys_t *mdnp, *gdnp, *udnp;
err = arc_read(NULL, td->td_spa, bp, arc_getbuf_func, &buf,
ZIO_PRIORITY_ASYNC_READ, ZIO_FLAG_CANFAIL, &flags, zb);
@@ -336,26 +337,27 @@ traverse_visitbp(traverse_data_t *td, const dnode_phys_t *dnp,
goto post;
osp = buf->b_data;
- dnp = &osp->os_meta_dnode;
- prefetch_dnode_metadata(td, dnp, zb->zb_objset,
+ mdnp = &osp->os_meta_dnode;
+ gdnp = &osp->os_groupused_dnode;
+ udnp = &osp->os_userused_dnode;
+
+ prefetch_dnode_metadata(td, mdnp, zb->zb_objset,
DMU_META_DNODE_OBJECT);
if (arc_buf_size(buf) >= sizeof (objset_phys_t)) {
- prefetch_dnode_metadata(td, &osp->os_groupused_dnode,
- zb->zb_objset, DMU_GROUPUSED_OBJECT);
- prefetch_dnode_metadata(td, &osp->os_userused_dnode,
- zb->zb_objset, DMU_USERUSED_OBJECT);
+ prefetch_dnode_metadata(td, gdnp, zb->zb_objset,
+ DMU_GROUPUSED_OBJECT);
+ prefetch_dnode_metadata(td, udnp, zb->zb_objset,
+ DMU_USERUSED_OBJECT);
}
- err = traverse_dnode(td, dnp, zb->zb_objset,
+ err = traverse_dnode(td, mdnp, zb->zb_objset,
DMU_META_DNODE_OBJECT);
if (err == 0 && arc_buf_size(buf) >= sizeof (objset_phys_t)) {
- dnp = &osp->os_groupused_dnode;
- err = traverse_dnode(td, dnp, zb->zb_objset,
+ err = traverse_dnode(td, gdnp, zb->zb_objset,
DMU_GROUPUSED_OBJECT);
}
if (err == 0 && arc_buf_size(buf) >= sizeof (objset_phys_t)) {
- dnp = &osp->os_userused_dnode;
- err = traverse_dnode(td, dnp, zb->zb_objset,
+ err = traverse_dnode(td, udnp, zb->zb_objset,
DMU_USERUSED_OBJECT);
}
}
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c
index ce22f4e..58db4dd 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c
@@ -413,7 +413,8 @@ dsl_dataset_hold_obj(dsl_pool_t *dp, uint64_t dsobj, void *tag,
offsetof(dmu_sendarg_t, dsa_link));
if (doi.doi_type == DMU_OTN_ZAP_METADATA) {
- int zaperr = zap_contains(mos, dsobj, DS_FIELD_LARGE_BLOCKS);
+ int zaperr = zap_contains(mos, dsobj,
+ DS_FIELD_LARGE_BLOCKS);
if (zaperr != ENOENT) {
VERIFY0(zaperr);
ds->ds_large_blocks = B_TRUE;
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dir.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dir.c
index 1862f8c..26f5c2d 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dir.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dsl_dir.c
@@ -24,6 +24,7 @@
* All rights reserved.
* Copyright (c) 2012, 2014 by Delphix. All rights reserved.
* Copyright (c) 2014 Joyent, Inc. All rights reserved.
+ * Copyright 2015 Nexenta Systems, Inc. All rights reserved.
*/
#include <sys/dmu.h>
@@ -408,7 +409,7 @@ dsl_dir_hold(dsl_pool_t *dp, const char *name, void *tag,
/* Make sure the name is in the specified pool. */
spaname = spa_name(dp->dp_spa);
if (strcmp(buf, spaname) != 0)
- return (SET_ERROR(EINVAL));
+ return (SET_ERROR(EXDEV));
ASSERT(dsl_pool_config_held(dp));
@@ -1706,7 +1707,7 @@ dsl_dir_rename_check(void *arg, dmu_tx_t *tx)
if (dd->dd_pool != newparent->dd_pool) {
dsl_dir_rele(newparent, FTAG);
dsl_dir_rele(dd, FTAG);
- return (SET_ERROR(ENXIO));
+ return (SET_ERROR(EXDEV));
}
/* new name should not already exist */
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c
index a829b06..55e3c45 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c
@@ -195,11 +195,6 @@
CTASSERT(sizeof(zfs_cmd_t) < IOCPARM_MAX);
-static int snapshot_list_prefetch;
-SYSCTL_DECL(_vfs_zfs);
-SYSCTL_INT(_vfs_zfs, OID_AUTO, snapshot_list_prefetch, CTLFLAG_RWTUN,
- &snapshot_list_prefetch, 0, "Prefetch data when listing snapshots");
-
static struct cdev *zfsdev;
extern void zfs_init(void);
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_onexit.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_onexit.c
index 6a90b9c..fe02399 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_onexit.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_onexit.c
@@ -137,7 +137,7 @@ zfs_onexit_fd_hold(int fd, minor_t *minorp)
*minorp = (minor_t)(uintptr_t)data;
curthread->td_fpop = tmpfp;
if (error != 0)
- return (error);
+ return (SET_ERROR(EBADF));
return (zfs_onexit_minor_to_state(*minorp, &zo));
}
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c
index d925712..e3b314f 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c
@@ -1320,15 +1320,25 @@ zfs_rezget(znode_t *zp)
}
/*
- * XXXPJD: Not sure how is that possible, but under heavy
- * zfs recv -F load it happens that z_gen is the same, but
- * vnode type is different than znode type. This would mean
- * that for example regular file was replaced with directory
- * which has the same object number.
+ * It is highly improbable but still quite possible that two
+ * objects in different datasets are created with the same
+ * object numbers and in transaction groups with the same
+ * numbers. znodes corresponding to those objects would
+ * have the same z_id and z_gen, but their other attributes
+ * may be different.
+ * zfs recv -F may replace one of such objects with the other.
+ * As a result file properties recorded in the replaced
+ * object's vnode may no longer match the received object's
+ * properties. At present the only cached property is the
+ * files type recorded in v_type.
+ * So, handle this case by leaving the old vnode and znode
+ * disassociated from the actual object. A new vnode and a
+ * znode will be created if the object is accessed
+ * (e.g. via a look-up). The old vnode and znode will be
+ * recycled when the last vnode reference is dropped.
*/
vp = ZTOV(zp);
- if (vp != NULL &&
- vp->v_type != IFTOVT((mode_t)zp->z_mode)) {
+ if (vp != NULL && vp->v_type != IFTOVT((mode_t)zp->z_mode)) {
zfs_znode_dmu_fini(zp);
ZFS_OBJ_HOLD_EXIT(zfsvfs, obj_num);
return (EIO);
diff --git a/sys/cddl/contrib/opensolaris/uts/common/sys/dtrace.h b/sys/cddl/contrib/opensolaris/uts/common/sys/dtrace.h
index 4605ee5..dfcdbbf 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/sys/dtrace.h
+++ b/sys/cddl/contrib/opensolaris/uts/common/sys/dtrace.h
@@ -1423,8 +1423,9 @@ typedef struct dof_helper {
char dofhp_mod[DTRACE_MODNAMELEN]; /* executable or library name */
uint64_t dofhp_addr; /* base address of object */
uint64_t dofhp_dof; /* address of helper DOF */
-#ifndef illumos
- int gen;
+#ifdef __FreeBSD__
+ pid_t dofhp_pid; /* target process ID */
+ int dofhp_gen;
#endif
} dof_helper_t;
diff --git a/sys/cddl/dev/dtrace/amd64/dtrace_asm.S b/sys/cddl/dev/dtrace/amd64/dtrace_asm.S
index cf8314c..a6c079e 100644
--- a/sys/cddl/dev/dtrace/amd64/dtrace_asm.S
+++ b/sys/cddl/dev/dtrace/amd64/dtrace_asm.S
@@ -363,211 +363,3 @@ dtrace_interrupt_enable(dtrace_icookie_t cookie)
popfq
ret
END(dtrace_interrupt_enable)
-
-/*
- * The panic() and cmn_err() functions invoke vpanic() as a common entry point
- * into the panic code implemented in panicsys(). vpanic() is responsible
- * for passing through the format string and arguments, and constructing a
- * regs structure on the stack into which it saves the current register
- * values. If we are not dying due to a fatal trap, these registers will
- * then be preserved in panicbuf as the current processor state. Before
- * invoking panicsys(), vpanic() activates the first panic trigger (see
- * common/os/panic.c) and switches to the panic_stack if successful. Note that
- * DTrace takes a slightly different panic path if it must panic from probe
- * context. Instead of calling panic, it calls into dtrace_vpanic(), which
- * sets up the initial stack as vpanic does, calls dtrace_panic_trigger(), and
- * branches back into vpanic().
- */
-
-/*
-void
-vpanic(const char *format, va_list alist)
-*/
- ENTRY(vpanic) /* Initial stack layout: */
-
- pushq %rbp /* | %rip | 0x60 */
- movq %rsp, %rbp /* | %rbp | 0x58 */
- pushfq /* | rfl | 0x50 */
- pushq %r11 /* | %r11 | 0x48 */
- pushq %r10 /* | %r10 | 0x40 */
- pushq %rbx /* | %rbx | 0x38 */
- pushq %rax /* | %rax | 0x30 */
- pushq %r9 /* | %r9 | 0x28 */
- pushq %r8 /* | %r8 | 0x20 */
- pushq %rcx /* | %rcx | 0x18 */
- pushq %rdx /* | %rdx | 0x10 */
- pushq %rsi /* | %rsi | 0x8 alist */
- pushq %rdi /* | %rdi | 0x0 format */
-
- movq %rsp, %rbx /* %rbx = current %rsp */
-
- leaq panic_quiesce(%rip), %rdi /* %rdi = &panic_quiesce */
- call panic_trigger /* %eax = panic_trigger() */
-
-vpanic_common:
- /*
- * The panic_trigger result is in %eax from the call above, and
- * dtrace_panic places it in %eax before branching here.
- * The rdmsr instructions that follow below will clobber %eax so
- * we stash the panic_trigger result in %r11d.
- */
- movl %eax, %r11d
- cmpl $0, %r11d
- je 0f
-
- /*
- * If panic_trigger() was successful, we are the first to initiate a
- * panic: we now switch to the reserved panic_stack before continuing.
- */
- leaq panic_stack(%rip), %rsp
- addq $PANICSTKSIZE, %rsp
-0: subq $REGSIZE, %rsp
- /*
- * Now that we've got everything set up, store the register values as
- * they were when we entered vpanic() to the designated location in
- * the regs structure we allocated on the stack.
- */
-#ifdef notyet
- movq 0x0(%rbx), %rcx
- movq %rcx, REGOFF_RDI(%rsp)
- movq 0x8(%rbx), %rcx
- movq %rcx, REGOFF_RSI(%rsp)
- movq 0x10(%rbx), %rcx
- movq %rcx, REGOFF_RDX(%rsp)
- movq 0x18(%rbx), %rcx
- movq %rcx, REGOFF_RCX(%rsp)
- movq 0x20(%rbx), %rcx
-
- movq %rcx, REGOFF_R8(%rsp)
- movq 0x28(%rbx), %rcx
- movq %rcx, REGOFF_R9(%rsp)
- movq 0x30(%rbx), %rcx
- movq %rcx, REGOFF_RAX(%rsp)
- movq 0x38(%rbx), %rcx
- movq %rcx, REGOFF_RBX(%rsp)
- movq 0x58(%rbx), %rcx
-
- movq %rcx, REGOFF_RBP(%rsp)
- movq 0x40(%rbx), %rcx
- movq %rcx, REGOFF_R10(%rsp)
- movq 0x48(%rbx), %rcx
- movq %rcx, REGOFF_R11(%rsp)
- movq %r12, REGOFF_R12(%rsp)
-
- movq %r13, REGOFF_R13(%rsp)
- movq %r14, REGOFF_R14(%rsp)
- movq %r15, REGOFF_R15(%rsp)
-
- xorl %ecx, %ecx
- movw %ds, %cx
- movq %rcx, REGOFF_DS(%rsp)
- movw %es, %cx
- movq %rcx, REGOFF_ES(%rsp)
- movw %fs, %cx
- movq %rcx, REGOFF_FS(%rsp)
- movw %gs, %cx
- movq %rcx, REGOFF_GS(%rsp)
-
- movq $0, REGOFF_TRAPNO(%rsp)
-
- movq $0, REGOFF_ERR(%rsp)
- leaq vpanic(%rip), %rcx
- movq %rcx, REGOFF_RIP(%rsp)
- movw %cs, %cx
- movzwq %cx, %rcx
- movq %rcx, REGOFF_CS(%rsp)
- movq 0x50(%rbx), %rcx
- movq %rcx, REGOFF_RFL(%rsp)
- movq %rbx, %rcx
- addq $0x60, %rcx
- movq %rcx, REGOFF_RSP(%rsp)
- movw %ss, %cx
- movzwq %cx, %rcx
- movq %rcx, REGOFF_SS(%rsp)
-
- /*
- * panicsys(format, alist, rp, on_panic_stack)
- */
- movq REGOFF_RDI(%rsp), %rdi /* format */
- movq REGOFF_RSI(%rsp), %rsi /* alist */
- movq %rsp, %rdx /* struct regs */
- movl %r11d, %ecx /* on_panic_stack */
- call panicsys
- addq $REGSIZE, %rsp
-#endif
- popq %rdi
- popq %rsi
- popq %rdx
- popq %rcx
- popq %r8
- popq %r9
- popq %rax
- popq %rbx
- popq %r10
- popq %r11
- popfq
- leave
- ret
- END(vpanic)
-
-/*
-void
-dtrace_vpanic(const char *format, va_list alist)
-*/
- ENTRY(dtrace_vpanic) /* Initial stack layout: */
-
- pushq %rbp /* | %rip | 0x60 */
- movq %rsp, %rbp /* | %rbp | 0x58 */
- pushfq /* | rfl | 0x50 */
- pushq %r11 /* | %r11 | 0x48 */
- pushq %r10 /* | %r10 | 0x40 */
- pushq %rbx /* | %rbx | 0x38 */
- pushq %rax /* | %rax | 0x30 */
- pushq %r9 /* | %r9 | 0x28 */
- pushq %r8 /* | %r8 | 0x20 */
- pushq %rcx /* | %rcx | 0x18 */
- pushq %rdx /* | %rdx | 0x10 */
- pushq %rsi /* | %rsi | 0x8 alist */
- pushq %rdi /* | %rdi | 0x0 format */
-
- movq %rsp, %rbx /* %rbx = current %rsp */
-
- leaq panic_quiesce(%rip), %rdi /* %rdi = &panic_quiesce */
- call dtrace_panic_trigger /* %eax = dtrace_panic_trigger() */
- jmp vpanic_common
-
- END(dtrace_vpanic)
-
-/*
-int
-panic_trigger(int *tp)
-*/
- ENTRY(panic_trigger)
- xorl %eax, %eax
- movl $0xdefacedd, %edx
- lock
- xchgl %edx, (%rdi)
- cmpl $0, %edx
- je 0f
- movl $0, %eax
- ret
-0: movl $1, %eax
- ret
- END(panic_trigger)
-
-/*
-int
-dtrace_panic_trigger(int *tp)
-*/
- ENTRY(dtrace_panic_trigger)
- xorl %eax, %eax
- movl $0xdefacedd, %edx
- lock
- xchgl %edx, (%rdi)
- cmpl $0, %edx
- je 0f
- movl $0, %eax
- ret
-0: movl $1, %eax
- ret
- END(dtrace_panic_trigger)
diff --git a/sys/cddl/dev/dtrace/arm/dtrace_asm.S b/sys/cddl/dev/dtrace/arm/dtrace_asm.S
index ce27b14..06e91d2 100644
--- a/sys/cddl/dev/dtrace/arm/dtrace_asm.S
+++ b/sys/cddl/dev/dtrace/arm/dtrace_asm.S
@@ -170,24 +170,6 @@ ENTRY(dtrace_copystr)
END(dtrace_copystr)
/*
-void
-vpanic(const char *format, va_list alist)
-*/
-ENTRY(vpanic) /* Initial stack layout: */
-vpanic_common:
- RET
-END(vpanic)
-
-/*
-void
-dtrace_vpanic(const char *format, va_list alist)
-*/
-ENTRY(dtrace_vpanic) /* Initial stack layout: */
- b vpanic
- RET
-END(dtrace_vpanic) /* Initial stack layout: */
-
-/*
uintptr_t
dtrace_caller(int aframes)
*/
diff --git a/sys/cddl/dev/dtrace/dtrace_hacks.c b/sys/cddl/dev/dtrace/dtrace_hacks.c
index 21da9f8..3f89973 100644
--- a/sys/cddl/dev/dtrace/dtrace_hacks.c
+++ b/sys/cddl/dev/dtrace/dtrace_hacks.c
@@ -3,9 +3,6 @@
dtrace_cacheid_t dtrace_predcache_id;
-int panic_quiesce;
-char panic_stack[PANICSTKSIZE];
-
boolean_t
priv_policy_only(const cred_t *a, int b, boolean_t c)
{
diff --git a/sys/cddl/dev/dtrace/dtrace_ioctl.c b/sys/cddl/dev/dtrace/dtrace_ioctl.c
index ef9bed5..524e937 100644
--- a/sys/cddl/dev/dtrace/dtrace_ioctl.c
+++ b/sys/cddl/dev/dtrace/dtrace_ioctl.c
@@ -32,9 +32,9 @@ static int
dtrace_ioctl_helper(struct cdev *dev, u_long cmd, caddr_t addr, int flags,
struct thread *td)
{
- int rval;
dof_helper_t *dhp = NULL;
dof_hdr_t *dof = NULL;
+ int rval;
switch (cmd) {
case DTRACEHIOC_ADDDOF:
@@ -51,7 +51,7 @@ dtrace_ioctl_helper(struct cdev *dev, u_long cmd, caddr_t addr, int flags,
mutex_enter(&dtrace_lock);
if ((rval = dtrace_helper_slurp((dof_hdr_t *)dof, dhp)) != -1) {
if (dhp) {
- dhp->gen = rval;
+ dhp->dofhp_gen = rval;
copyout(dhp, addr, sizeof(*dhp));
}
rval = 0;
@@ -59,10 +59,11 @@ dtrace_ioctl_helper(struct cdev *dev, u_long cmd, caddr_t addr, int flags,
rval = EINVAL;
}
mutex_exit(&dtrace_lock);
+
return (rval);
case DTRACEHIOC_REMOVE:
mutex_enter(&dtrace_lock);
- rval = dtrace_helper_destroygen((int)*addr);
+ rval = dtrace_helper_destroygen(NULL, (int)*addr);
mutex_exit(&dtrace_lock);
return (rval);
diff --git a/sys/cddl/dev/dtrace/i386/dtrace_asm.S b/sys/cddl/dev/dtrace/i386/dtrace_asm.S
index 6338719..d44f6c3 100644
--- a/sys/cddl/dev/dtrace/i386/dtrace_asm.S
+++ b/sys/cddl/dev/dtrace/i386/dtrace_asm.S
@@ -355,167 +355,3 @@ void dtrace_interrupt_enable(dtrace_icookie_t cookie)
popfl
ret
END(dtrace_interrupt_enable)
-
-/*
- * The panic() and cmn_err() functions invoke vpanic() as a common entry point
- * into the panic code implemented in panicsys(). vpanic() is responsible
- * for passing through the format string and arguments, and constructing a
- * regs structure on the stack into which it saves the current register
- * values. If we are not dying due to a fatal trap, these registers will
- * then be preserved in panicbuf as the current processor state. Before
- * invoking panicsys(), vpanic() activates the first panic trigger (see
- * common/os/panic.c) and switches to the panic_stack if successful. Note that
- * DTrace takes a slightly different panic path if it must panic from probe
- * context. Instead of calling panic, it calls into dtrace_vpanic(), which
- * sets up the initial stack as vpanic does, calls dtrace_panic_trigger(), and
- * branches back into vpanic().
- */
-/*
-void vpanic(const char *format, va_list alist)
-*/
- ENTRY(vpanic) /* Initial stack layout: */
-
- pushl %ebp /* | %eip | 20 */
- movl %esp, %ebp /* | %ebp | 16 */
- pushl %eax /* | %eax | 12 */
- pushl %ebx /* | %ebx | 8 */
- pushl %ecx /* | %ecx | 4 */
- pushl %edx /* | %edx | 0 */
-
- movl %esp, %ebx /* %ebx = current stack pointer */
-
- lea panic_quiesce, %eax /* %eax = &panic_quiesce */
- pushl %eax /* push &panic_quiesce */
- call panic_trigger /* %eax = panic_trigger() */
- addl $4, %esp /* reset stack pointer */
-
-vpanic_common:
- cmpl $0, %eax /* if (%eax == 0) */
- je 0f /* goto 0f; */
-
- /*
- * If panic_trigger() was successful, we are the first to initiate a
- * panic: we now switch to the reserved panic_stack before continuing.
- */
- lea panic_stack, %esp /* %esp = panic_stack */
- addl $PANICSTKSIZE, %esp /* %esp += PANICSTKSIZE */
-
-0: subl $REGSIZE, %esp /* allocate struct regs */
-
- /*
- * Now that we've got everything set up, store the register values as
- * they were when we entered vpanic() to the designated location in
- * the regs structure we allocated on the stack.
- */
-#ifdef notyet
- mov %gs, %edx
- mov %edx, REGOFF_GS(%esp)
- mov %fs, %edx
- mov %edx, REGOFF_FS(%esp)
- mov %es, %edx
- mov %edx, REGOFF_ES(%esp)
- mov %ds, %edx
- mov %edx, REGOFF_DS(%esp)
- movl %edi, REGOFF_EDI(%esp)
- movl %esi, REGOFF_ESI(%esp)
- movl 16(%ebx), %ecx
- movl %ecx, REGOFF_EBP(%esp)
- movl %ebx, %ecx
- addl $20, %ecx
- movl %ecx, REGOFF_ESP(%esp)
- movl 8(%ebx), %ecx
- movl %ecx, REGOFF_EBX(%esp)
- movl 0(%ebx), %ecx
- movl %ecx, REGOFF_EDX(%esp)
- movl 4(%ebx), %ecx
- movl %ecx, REGOFF_ECX(%esp)
- movl 12(%ebx), %ecx
- movl %ecx, REGOFF_EAX(%esp)
- movl $0, REGOFF_TRAPNO(%esp)
- movl $0, REGOFF_ERR(%esp)
- lea vpanic, %ecx
- movl %ecx, REGOFF_EIP(%esp)
- mov %cs, %edx
- movl %edx, REGOFF_CS(%esp)
- pushfl
- popl %ecx
- movl %ecx, REGOFF_EFL(%esp)
- movl $0, REGOFF_UESP(%esp)
- mov %ss, %edx
- movl %edx, REGOFF_SS(%esp)
-
- movl %esp, %ecx /* %ecx = &regs */
- pushl %eax /* push on_panic_stack */
- pushl %ecx /* push &regs */
- movl 12(%ebp), %ecx /* %ecx = alist */
- pushl %ecx /* push alist */
- movl 8(%ebp), %ecx /* %ecx = format */
- pushl %ecx /* push format */
- call panicsys /* panicsys(); */
- addl $16, %esp /* pop arguments */
-
- addl $REGSIZE, %esp
-#endif
- popl %edx
- popl %ecx
- popl %ebx
- popl %eax
- leave
- ret
- END(vpanic)
-
-/*
-void dtrace_vpanic(const char *format, va_list alist)
-*/
- ENTRY(dtrace_vpanic) /* Initial stack layout: */
-
- pushl %ebp /* | %eip | 20 */
- movl %esp, %ebp /* | %ebp | 16 */
- pushl %eax /* | %eax | 12 */
- pushl %ebx /* | %ebx | 8 */
- pushl %ecx /* | %ecx | 4 */
- pushl %edx /* | %edx | 0 */
-
- movl %esp, %ebx /* %ebx = current stack pointer */
-
- lea panic_quiesce, %eax /* %eax = &panic_quiesce */
- pushl %eax /* push &panic_quiesce */
- call dtrace_panic_trigger /* %eax = dtrace_panic_trigger() */
- addl $4, %esp /* reset stack pointer */
- jmp vpanic_common /* jump back to common code */
-
- END(dtrace_vpanic)
-
-/*
-int
-panic_trigger(int *tp)
-*/
- ENTRY(panic_trigger)
- xorl %eax, %eax
- movl $0xdefacedd, %edx
- lock
- xchgl %edx, (%edi)
- cmpl $0, %edx
- je 0f
- movl $0, %eax
- ret
-0: movl $1, %eax
- ret
- END(panic_trigger)
-
-/*
-int
-dtrace_panic_trigger(int *tp)
-*/
- ENTRY(dtrace_panic_trigger)
- xorl %eax, %eax
- movl $0xdefacedd, %edx
- lock
- xchgl %edx, (%edi)
- cmpl $0, %edx
- je 0f
- movl $0, %eax
- ret
-0: movl $1, %eax
- ret
- END(dtrace_panic_trigger)
diff --git a/sys/cddl/dev/dtrace/mips/dtrace_asm.S b/sys/cddl/dev/dtrace/mips/dtrace_asm.S
index 50f6c54..199d16be 100644
--- a/sys/cddl/dev/dtrace/mips/dtrace_asm.S
+++ b/sys/cddl/dev/dtrace/mips/dtrace_asm.S
@@ -249,49 +249,6 @@ LEAF(dtrace_invop_uninit)
END(dtrace_invop_uninit)
/*
- * The panic() and cmn_err() functions invoke vpanic() as a common entry point
- * into the panic code implemented in panicsys(). vpanic() is responsible
- * for passing through the format string and arguments, and constructing a
- * regs structure on the stack into which it saves the current register
- * values. If we are not dying due to a fatal trap, these registers will
- * then be preserved in panicbuf as the current processor state. Before
- * invoking panicsys(), vpanic() activates the first panic trigger (see
- * common/os/panic.c) and switches to the panic_stack if successful. Note that
- * DTrace takes a slightly different panic path if it must panic from probe
- * context. Instead of calling panic, it calls into dtrace_vpanic(), which
- * sets up the initial stack as vpanic does, calls dtrace_panic_trigger(), and
- * branches back into vpanic().
- */
-
-/*
-void
-vpanic(const char *format, va_list alist)
-*/
-LEAF(vpanic) /* Initial stack layout: */
-
-vpanic_common:
- j ra
- nop
-END(vpanic)
-
-
-
-/*
-void
-dtrace_vpanic(const char *format, va_list alist)
-*/
-LEAF(dtrace_vpanic) /* Initial stack layout: */
-
-#if 0
- jal dtrace_panic_trigger /* %eax = dtrace_panic_trigger() */
- nop
-#endif
- j vpanic_common
- nop
-
-END(dtrace_vpanic)
-
-/*
uintptr_t
dtrace_caller(int aframes)
*/
@@ -300,4 +257,3 @@ LEAF(dtrace_caller)
j ra
nop
END(dtrace_caller)
-
diff --git a/sys/cddl/dev/dtrace/powerpc/dtrace_asm.S b/sys/cddl/dev/dtrace/powerpc/dtrace_asm.S
index 5676360..3adfbe3 100644
--- a/sys/cddl/dev/dtrace/powerpc/dtrace_asm.S
+++ b/sys/cddl/dev/dtrace/powerpc/dtrace_asm.S
@@ -161,45 +161,6 @@ ASENTRY_NOPROF(dtrace_copystr)
END(dtrace_copystr)
/*
- * The panic() and cmn_err() functions invoke vpanic() as a common entry point
- * into the panic code implemented in panicsys(). vpanic() is responsible
- * for passing through the format string and arguments, and constructing a
- * regs structure on the stack into which it saves the current register
- * values. If we are not dying due to a fatal trap, these registers will
- * then be preserved in panicbuf as the current processor state. Before
- * invoking panicsys(), vpanic() activates the first panic trigger (see
- * common/os/panic.c) and switches to the panic_stack if successful. Note that
- * DTrace takes a slightly different panic path if it must panic from probe
- * context. Instead of calling panic, it calls into dtrace_vpanic(), which
- * sets up the initial stack as vpanic does, calls dtrace_panic_trigger(), and
- * branches back into vpanic().
- */
-
-/*
-void
-vpanic(const char *format, va_list alist)
-*/
-ASENTRY_NOPROF(vpanic) /* Initial stack layout: */
-
-vpanic_common:
- blr
-END(vpanic)
-
-
-
-/*
-void
-dtrace_vpanic(const char *format, va_list alist)
-*/
-ASENTRY_NOPROF(dtrace_vpanic) /* Initial stack layout: */
-
-#if 0
- bl dtrace_panic_trigger /* %eax = dtrace_panic_trigger() */
-#endif
- b vpanic_common
-END(dtrace_vpanic)
-
-/*
uintptr_t
dtrace_caller(int aframes)
*/
@@ -207,4 +168,3 @@ ASENTRY_NOPROF(dtrace_caller)
li %r3, -1
blr
END(dtrace_caller)
-
diff --git a/sys/cddl/dev/profile/profile.c b/sys/cddl/dev/profile/profile.c
index 338a958..d31d5c8 100644
--- a/sys/cddl/dev/profile/profile.c
+++ b/sys/cddl/dev/profile/profile.c
@@ -134,8 +134,10 @@ struct profile_probe_percpu;
#endif
#ifdef __arm__
-/* bogus */
-#define PROF_ARTIFICIAL_FRAMES 9
+/*
+ * At least on ARMv7, this appears to work quite well.
+ */
+#define PROF_ARTIFICIAL_FRAMES 10
#endif
typedef struct profile_probe {
diff --git a/sys/compat/freebsd32/freebsd32.h b/sys/compat/freebsd32/freebsd32.h
index ed3df7a..982b44e 100644
--- a/sys/compat/freebsd32/freebsd32.h
+++ b/sys/compat/freebsd32/freebsd32.h
@@ -243,32 +243,6 @@ struct i386_ldt_args32 {
uint32_t num;
};
-/*
- * Alternative layouts for <sys/procfs.h>
- */
-struct prstatus32 {
- int pr_version;
- u_int pr_statussz;
- u_int pr_gregsetsz;
- u_int pr_fpregsetsz;
- int pr_osreldate;
- int pr_cursig;
- pid_t pr_pid;
- struct reg32 pr_reg;
-};
-
-struct prpsinfo32 {
- int pr_version;
- u_int pr_psinfosz;
- char pr_fname[PRFNAMESZ+1];
- char pr_psargs[PRARGSZ+1];
-};
-
-struct thrmisc32 {
- char pr_tname[MAXCOMLEN+1];
- u_int _pad;
-};
-
struct mq_attr32 {
int mq_flags;
int mq_maxmsg;
diff --git a/sys/compat/freebsd32/freebsd32_misc.c b/sys/compat/freebsd32/freebsd32_misc.c
index a72612b..8696b36 100644
--- a/sys/compat/freebsd32/freebsd32_misc.c
+++ b/sys/compat/freebsd32/freebsd32_misc.c
@@ -253,9 +253,8 @@ freebsd4_freebsd32_getfsstat(struct thread *td, struct freebsd4_freebsd32_getfss
count = uap->bufsize / sizeof(struct statfs32);
size = count * sizeof(struct statfs);
- error = kern_getfsstat(td, &buf, size, UIO_SYSSPACE, uap->flags);
+ error = kern_getfsstat(td, &buf, size, &count, UIO_SYSSPACE, uap->flags);
if (size > 0) {
- count = td->td_retval[0];
sp = buf;
while (count > 0 && error == 0) {
copy_statfs(sp, &stat32);
@@ -266,6 +265,8 @@ freebsd4_freebsd32_getfsstat(struct thread *td, struct freebsd4_freebsd32_getfss
}
free(buf, M_TEMP);
}
+ if (error == 0)
+ td->td_retval[0] = count;
return (error);
}
#endif
diff --git a/sys/compat/linprocfs/linprocfs.c b/sys/compat/linprocfs/linprocfs.c
index b2fe3ed..b2444c1 100644
--- a/sys/compat/linprocfs/linprocfs.c
+++ b/sys/compat/linprocfs/linprocfs.c
@@ -53,10 +53,10 @@ __FBSDID("$FreeBSD$");
#include <sys/filedesc.h>
#include <sys/jail.h>
#include <sys/kernel.h>
+#include <sys/limits.h>
#include <sys/linker.h>
#include <sys/lock.h>
#include <sys/malloc.h>
-#include <sys/mount.h>
#include <sys/msg.h>
#include <sys/mutex.h>
#include <sys/namei.h>
@@ -67,6 +67,7 @@ __FBSDID("$FreeBSD$");
#include <sys/sem.h>
#include <sys/smp.h>
#include <sys/socket.h>
+#include <sys/syscallsubr.h>
#include <sys/sysctl.h>
#include <sys/systm.h>
#include <sys/time.h>
@@ -326,11 +327,12 @@ static int
linprocfs_domtab(PFS_FILL_ARGS)
{
struct nameidata nd;
- struct mount *mp;
const char *lep;
char *dlep, *flep, *mntto, *mntfrom, *fstype;
size_t lep_len;
int error;
+ struct statfs *buf, *sp;
+ size_t count;
/* resolve symlinks etc. in the emulation tree prefix */
NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, linux_emul_path, td);
@@ -344,20 +346,26 @@ linprocfs_domtab(PFS_FILL_ARGS)
}
lep_len = strlen(lep);
- mtx_lock(&mountlist_mtx);
- error = 0;
- TAILQ_FOREACH(mp, &mountlist, mnt_list) {
+ buf = NULL;
+ error = kern_getfsstat(td, &buf, SIZE_T_MAX, &count,
+ UIO_SYSSPACE, MNT_WAIT);
+ if (error != 0) {
+ free(buf, M_TEMP);
+ free(flep, M_TEMP);
+ return (error);
+ }
+
+ for (sp = buf; count > 0; sp++, count--) {
/* determine device name */
- mntfrom = mp->mnt_stat.f_mntfromname;
+ mntfrom = sp->f_mntfromname;
/* determine mount point */
- mntto = mp->mnt_stat.f_mntonname;
- if (strncmp(mntto, lep, lep_len) == 0 &&
- mntto[lep_len] == '/')
+ mntto = sp->f_mntonname;
+ if (strncmp(mntto, lep, lep_len) == 0 && mntto[lep_len] == '/')
mntto += lep_len;
/* determine fs type */
- fstype = mp->mnt_stat.f_fstypename;
+ fstype = sp->f_fstypename;
if (strcmp(fstype, pn->pn_info->pi_name) == 0)
mntfrom = fstype = "proc";
else if (strcmp(fstype, "procfs") == 0)
@@ -365,16 +373,16 @@ linprocfs_domtab(PFS_FILL_ARGS)
if (strcmp(fstype, "linsysfs") == 0) {
sbuf_printf(sb, "/sys %s sysfs %s", mntto,
- mp->mnt_stat.f_flags & MNT_RDONLY ? "ro" : "rw");
+ sp->f_flags & MNT_RDONLY ? "ro" : "rw");
} else {
/* For Linux msdosfs is called vfat */
if (strcmp(fstype, "msdosfs") == 0)
fstype = "vfat";
sbuf_printf(sb, "%s %s %s %s", mntfrom, mntto, fstype,
- mp->mnt_stat.f_flags & MNT_RDONLY ? "ro" : "rw");
+ sp->f_flags & MNT_RDONLY ? "ro" : "rw");
}
#define ADD_OPTION(opt, name) \
- if (mp->mnt_stat.f_flags & (opt)) sbuf_printf(sb, "," name);
+ if (sp->f_flags & (opt)) sbuf_printf(sb, "," name);
ADD_OPTION(MNT_SYNCHRONOUS, "sync");
ADD_OPTION(MNT_NOEXEC, "noexec");
ADD_OPTION(MNT_NOSUID, "nosuid");
@@ -387,7 +395,8 @@ linprocfs_domtab(PFS_FILL_ARGS)
/* a real Linux mtab will also show NFS options */
sbuf_printf(sb, " 0 0\n");
}
- mtx_unlock(&mountlist_mtx);
+
+ free(buf, M_TEMP);
free(flep, M_TEMP);
return (error);
}
diff --git a/sys/compat/linux/linux_file.c b/sys/compat/linux/linux_file.c
index 88303b9..78a65d0 100644
--- a/sys/compat/linux/linux_file.c
+++ b/sys/compat/linux/linux_file.c
@@ -55,10 +55,6 @@ __FBSDID("$FreeBSD$");
#include <security/mac/mac_framework.h>
-#include <ufs/ufs/extattr.h>
-#include <ufs/ufs/quota.h>
-#include <ufs/ufs/ufsmount.h>
-
#ifdef COMPAT_LINUX32
#include <machine/../linux32/linux.h>
#include <machine/../linux32/linux32_proto.h>
@@ -136,39 +132,39 @@ linux_common_open(struct thread *td, int dirfd, char *path, int l_flags, int mod
/* XXX LINUX_O_NOATIME: unable to be easily implemented. */
error = kern_openat(td, dirfd, path, UIO_SYSSPACE, bsd_flags, mode);
-
- if (!error) {
- fd = td->td_retval[0];
- /*
- * XXX In between kern_open() and fget(), another process
- * having the same filedesc could use that fd without
- * checking below.
- */
- error = fget(td, fd, cap_rights_init(&rights, CAP_IOCTL), &fp);
- if (!error) {
- sx_slock(&proctree_lock);
- PROC_LOCK(p);
- if (!(bsd_flags & O_NOCTTY) &&
- SESS_LEADER(p) && !(p->p_flag & P_CONTROLT)) {
- PROC_UNLOCK(p);
- sx_unlock(&proctree_lock);
- /* XXXPJD: Verify if TIOCSCTTY is allowed. */
- if (fp->f_type == DTYPE_VNODE)
- (void) fo_ioctl(fp, TIOCSCTTY, (caddr_t) 0,
- td->td_ucred, td);
- } else {
- PROC_UNLOCK(p);
- sx_sunlock(&proctree_lock);
- }
+ if (error != 0)
+ goto done;
+
+ if (bsd_flags & O_NOCTTY)
+ goto done;
+
+ /*
+ * XXX In between kern_open() and fget(), another process
+ * having the same filedesc could use that fd without
+ * checking below.
+ */
+ fd = td->td_retval[0];
+ if (fget(td, fd, cap_rights_init(&rights, CAP_IOCTL), &fp) == 0) {
+ if (fp->f_type != DTYPE_VNODE) {
fdrop(fp, td);
- /*
- * XXX as above, fdrop()/kern_close() pair is racy.
- */
- if (error)
- kern_close(td, fd);
+ goto done;
+ }
+ sx_slock(&proctree_lock);
+ PROC_LOCK(p);
+ if (SESS_LEADER(p) && !(p->p_flag & P_CONTROLT)) {
+ PROC_UNLOCK(p);
+ sx_sunlock(&proctree_lock);
+ /* XXXPJD: Verify if TIOCSCTTY is allowed. */
+ (void) fo_ioctl(fp, TIOCSCTTY, (caddr_t) 0,
+ td->td_ucred, td);
+ } else {
+ PROC_UNLOCK(p);
+ sx_sunlock(&proctree_lock);
}
+ fdrop(fp, td);
}
+done:
#ifdef DEBUG
if (ldebug(open))
printf(LMSG("open returns error %d"), error);
@@ -1078,12 +1074,10 @@ linux_pwrite(td, uap)
int
linux_mount(struct thread *td, struct linux_mount_args *args)
{
- struct ufs_args ufs;
char fstypename[MFSNAMELEN];
char mntonname[MNAMELEN], mntfromname[MNAMELEN];
int error;
int fsflags;
- void *fsdata;
error = copyinstr(args->filesystemtype, fstypename, MFSNAMELEN - 1,
NULL);
@@ -1104,20 +1098,10 @@ linux_mount(struct thread *td, struct linux_mount_args *args)
if (strcmp(fstypename, "ext2") == 0) {
strcpy(fstypename, "ext2fs");
- fsdata = &ufs;
- ufs.fspec = mntfromname;
-#define DEFAULT_ROOTID -2
- ufs.export.ex_root = DEFAULT_ROOTID;
- ufs.export.ex_flags =
- args->rwflag & LINUX_MS_RDONLY ? MNT_EXRDONLY : 0;
} else if (strcmp(fstypename, "proc") == 0) {
strcpy(fstypename, "linprocfs");
- fsdata = NULL;
} else if (strcmp(fstypename, "vfat") == 0) {
strcpy(fstypename, "msdosfs");
- fsdata = NULL;
- } else {
- return (ENODEV);
}
fsflags = 0;
@@ -1137,19 +1121,11 @@ linux_mount(struct thread *td, struct linux_mount_args *args)
fsflags |= MNT_UPDATE;
}
- if (strcmp(fstypename, "linprocfs") == 0) {
- error = kernel_vmount(fsflags,
- "fstype", fstypename,
- "fspath", mntonname,
- NULL);
- } else if (strcmp(fstypename, "msdosfs") == 0) {
- error = kernel_vmount(fsflags,
- "fstype", fstypename,
- "fspath", mntonname,
- "from", mntfromname,
- NULL);
- } else
- error = EOPNOTSUPP;
+ error = kernel_vmount(fsflags,
+ "fstype", fstypename,
+ "fspath", mntonname,
+ "from", mntfromname,
+ NULL);
return (error);
}
diff --git a/sys/compat/linux/linux_getcwd.c b/sys/compat/linux/linux_getcwd.c
index 1c7080d..ebcf970 100644
--- a/sys/compat/linux/linux_getcwd.c
+++ b/sys/compat/linux/linux_getcwd.c
@@ -2,11 +2,15 @@
/* $NetBSD: vfs_getcwd.c,v 1.3.2.3 1999/07/11 10:24:09 sommerfeld Exp $ */
/*-
* Copyright (c) 1999 The NetBSD Foundation, Inc.
+ * Copyright (c) 2015 The FreeBSD Foundation
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
* by Bill Sommerfeld.
*
+ * Portions of this software were developed by Edward Tomasz Napierala
+ * under sponsorship from the FreeBSD Foundation.
+ *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
@@ -36,19 +40,9 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/systm.h>
-#include <sys/namei.h>
-#include <sys/filedesc.h>
-#include <sys/kernel.h>
-#include <sys/file.h>
-#include <sys/stat.h>
#include <sys/syscallsubr.h>
-#include <sys/vnode.h>
-#include <sys/mount.h>
#include <sys/proc.h>
-#include <sys/uio.h>
#include <sys/malloc.h>
-#include <sys/dirent.h>
-#include <ufs/ufs/dir.h> /* XXX only for DIRBLKSIZ */
#ifdef COMPAT_LINUX32
#include <machine/../linux32/linux.h>
@@ -57,410 +51,40 @@ __FBSDID("$FreeBSD$");
#include <machine/../linux/linux.h>
#include <machine/../linux/linux_proto.h>
#endif
+#include <compat/linux/linux_misc.h>
#include <compat/linux/linux_util.h>
-#include <security/mac/mac_framework.h>
-
-static int
-linux_getcwd_scandir(struct vnode **, struct vnode **,
- char **, char *, struct thread *);
-static int
-linux_getcwd_common(struct vnode *, struct vnode *,
- char **, char *, int, int, struct thread *);
-
-#define DIRENT_MINSIZE (sizeof(struct dirent) - (MAXNAMLEN+1) + 4)
-
-/*
- * Vnode variable naming conventions in this file:
- *
- * rvp: the current root we're aiming towards.
- * lvp, *lvpp: the "lower" vnode
- * uvp, *uvpp: the "upper" vnode.
- *
- * Since all the vnodes we're dealing with are directories, and the
- * lookups are going *up* in the filesystem rather than *down*, the
- * usual "pvp" (parent) or "dvp" (directory) naming conventions are
- * too confusing.
- */
-
-/*
- * XXX Will infinite loop in certain cases if a directory read reliably
- * returns EINVAL on last block.
- * XXX is EINVAL the right thing to return if a directory is malformed?
- */
-
-/*
- * XXX Untested vs. mount -o union; probably does the wrong thing.
- */
-
-/*
- * Find parent vnode of *lvpp, return in *uvpp
- *
- * If we care about the name, scan it looking for name of directory
- * entry pointing at lvp.
- *
- * Place the name in the buffer which starts at bufp, immediately
- * before *bpp, and move bpp backwards to point at the start of it.
- *
- * On entry, *lvpp is a locked vnode reference; on exit, it is vput and NULL'ed
- * On exit, *uvpp is either NULL or is a locked vnode reference.
- */
-static int
-linux_getcwd_scandir(lvpp, uvpp, bpp, bufp, td)
- struct vnode **lvpp;
- struct vnode **uvpp;
- char **bpp;
- char *bufp;
- struct thread *td;
-{
- int error = 0;
- int eofflag;
- off_t off;
- int tries;
- struct uio uio;
- struct iovec iov;
- char *dirbuf = NULL;
- int dirbuflen;
- ino_t fileno;
- struct vattr va;
- struct vnode *uvp = NULL;
- struct vnode *lvp = *lvpp;
- struct componentname cn;
- int len, reclen;
- tries = 0;
-
- /*
- * If we want the filename, get some info we need while the
- * current directory is still locked.
- */
- if (bufp != NULL) {
- error = VOP_GETATTR(lvp, &va, td->td_ucred);
- if (error) {
- vput(lvp);
- *lvpp = NULL;
- *uvpp = NULL;
- return error;
- }
- }
-
- /*
- * Ok, we have to do it the hard way..
- * Next, get parent vnode using lookup of ..
- */
- cn.cn_nameiop = LOOKUP;
- cn.cn_flags = ISLASTCN | ISDOTDOT | RDONLY;
- cn.cn_thread = td;
- cn.cn_cred = td->td_ucred;
- cn.cn_pnbuf = NULL;
- cn.cn_nameptr = "..";
- cn.cn_namelen = 2;
- cn.cn_consume = 0;
- cn.cn_lkflags = LK_SHARED;
-
- /*
- * At this point, lvp is locked and will be unlocked by the lookup.
- * On successful return, *uvpp will be locked
- */
-#ifdef MAC
- error = mac_vnode_check_lookup(td->td_ucred, lvp, &cn);
- if (error == 0)
-#endif
- error = VOP_LOOKUP(lvp, uvpp, &cn);
- if (error) {
- vput(lvp);
- *lvpp = NULL;
- *uvpp = NULL;
- return error;
- }
- uvp = *uvpp;
-
- /* If we don't care about the pathname, we're done */
- if (bufp == NULL) {
- vput(lvp);
- *lvpp = NULL;
- return 0;
- }
-
- fileno = va.va_fileid;
-
- dirbuflen = DIRBLKSIZ;
- if (dirbuflen < va.va_blocksize)
- dirbuflen = va.va_blocksize;
- dirbuf = malloc(dirbuflen, M_TEMP, M_WAITOK);
-
-#if 0
-unionread:
-#endif
- off = 0;
- do {
- /* call VOP_READDIR of parent */
- iov.iov_base = dirbuf;
- iov.iov_len = dirbuflen;
-
- uio.uio_iov = &iov;
- uio.uio_iovcnt = 1;
- uio.uio_offset = off;
- uio.uio_resid = dirbuflen;
- uio.uio_segflg = UIO_SYSSPACE;
- uio.uio_rw = UIO_READ;
- uio.uio_td = td;
-
- eofflag = 0;
-
-#ifdef MAC
- error = mac_vnode_check_readdir(td->td_ucred, uvp);
- if (error == 0)
-#endif /* MAC */
- error = VOP_READDIR(uvp, &uio, td->td_ucred, &eofflag,
- 0, 0);
-
- off = uio.uio_offset;
-
- /*
- * Try again if NFS tosses its cookies.
- * XXX this can still loop forever if the directory is busted
- * such that the second or subsequent page of it always
- * returns EINVAL
- */
- if ((error == EINVAL) && (tries < 3)) {
- off = 0;
- tries++;
- continue; /* once more, with feeling */
- }
-
- if (!error) {
- char *cpos;
- struct dirent *dp;
-
- cpos = dirbuf;
- tries = 0;
-
- /* scan directory page looking for matching vnode */
- for (len = (dirbuflen - uio.uio_resid); len > 0; len -= reclen) {
- dp = (struct dirent *) cpos;
- reclen = dp->d_reclen;
-
- /* check for malformed directory.. */
- if (reclen < DIRENT_MINSIZE) {
- error = EINVAL;
- goto out;
- }
- /*
- * XXX should perhaps do VOP_LOOKUP to
- * check that we got back to the right place,
- * but getting the locking games for that
- * right would be heinous.
- */
- if ((dp->d_type != DT_WHT) &&
- (dp->d_fileno == fileno)) {
- char *bp = *bpp;
- bp -= dp->d_namlen;
-
- if (bp <= bufp) {
- error = ERANGE;
- goto out;
- }
- bcopy(dp->d_name, bp, dp->d_namlen);
- error = 0;
- *bpp = bp;
- goto out;
- }
- cpos += reclen;
- }
- }
- } while (!eofflag);
- error = ENOENT;
-
-out:
- vput(lvp);
- *lvpp = NULL;
- free(dirbuf, M_TEMP);
- return error;
-}
-
-
-/*
- * common routine shared by sys___getcwd() and linux_vn_isunder()
- */
-
-#define GETCWD_CHECK_ACCESS 0x0001
-
-static int
-linux_getcwd_common (lvp, rvp, bpp, bufp, limit, flags, td)
- struct vnode *lvp;
- struct vnode *rvp;
- char **bpp;
- char *bufp;
- int limit;
- int flags;
- struct thread *td;
-{
- struct filedesc *fdp = td->td_proc->p_fd;
- struct vnode *uvp = NULL;
- char *bp = NULL;
- int error;
- accmode_t accmode = VEXEC;
-
- if (rvp == NULL) {
- rvp = fdp->fd_rdir;
- if (rvp == NULL)
- rvp = rootvnode;
- }
-
- VREF(rvp);
- VREF(lvp);
-
- /*
- * Error handling invariant:
- * Before a `goto out':
- * lvp is either NULL, or locked and held.
- * uvp is either NULL, or locked and held.
- */
-
- error = vn_lock(lvp, LK_EXCLUSIVE | LK_RETRY);
- if (error != 0)
- panic("vn_lock LK_RETRY returned error %d", error);
- if (bufp)
- bp = *bpp;
- /*
- * this loop will terminate when one of the following happens:
- * - we hit the root
- * - getdirentries or lookup fails
- * - we run out of space in the buffer.
- */
- if (lvp == rvp) {
- if (bp)
- *(--bp) = '/';
- goto out;
- }
- do {
- if (lvp->v_type != VDIR) {
- error = ENOTDIR;
- goto out;
- }
-
- /*
- * access check here is optional, depending on
- * whether or not caller cares.
- */
- if (flags & GETCWD_CHECK_ACCESS) {
- error = VOP_ACCESS(lvp, accmode, td->td_ucred, td);
- if (error)
- goto out;
- accmode = VEXEC|VREAD;
- }
-
- /*
- * step up if we're a covered vnode..
- */
- while (lvp->v_vflag & VV_ROOT) {
- struct vnode *tvp;
-
- if (lvp == rvp)
- goto out;
-
- tvp = lvp;
- lvp = lvp->v_mount->mnt_vnodecovered;
- vput(tvp);
- /*
- * hodie natus est radici frater
- */
- if (lvp == NULL) {
- error = ENOENT;
- goto out;
- }
- VREF(lvp);
- error = vn_lock(lvp, LK_EXCLUSIVE | LK_RETRY);
- if (error != 0)
- panic("vn_lock LK_RETRY returned %d", error);
- }
- error = linux_getcwd_scandir(&lvp, &uvp, &bp, bufp, td);
- if (error)
- goto out;
-#ifdef DIAGNOSTIC
- if (lvp != NULL)
- panic("getcwd: oops, forgot to null lvp");
- if (bufp && (bp <= bufp)) {
- panic("getcwd: oops, went back too far");
- }
-#endif
- if (bp)
- *(--bp) = '/';
- lvp = uvp;
- uvp = NULL;
- limit--;
- } while ((lvp != rvp) && (limit > 0));
-
-out:
- if (bpp)
- *bpp = bp;
- if (uvp)
- vput(uvp);
- if (lvp)
- vput(lvp);
- vrele(rvp);
- return error;
-}
-
-
/*
* Find pathname of process's current directory.
- *
- * Use vfs vnode-to-name reverse cache; if that fails, fall back
- * to reading directory contents.
*/
-
int
linux_getcwd(struct thread *td, struct linux_getcwd_args *args)
{
- char *bp, *bend, *path;
- int error, len, lenused;
+ char *path;
+ int error, lenused;
#ifdef DEBUG
if (ldebug(getcwd))
printf(ARGS(getcwd, "%p, %ld"), args->buf, (long)args->bufsize);
#endif
- len = args->bufsize;
-
- if (len > MAXPATHLEN*4)
- len = MAXPATHLEN*4;
- else if (len < 2)
- return ERANGE;
+ /*
+ * Linux returns ERANGE instead of EINVAL.
+ */
+ if (args->bufsize < 2)
+ return (ERANGE);
- path = malloc(len, M_TEMP, M_WAITOK);
+ path = malloc(LINUX_PATH_MAX, M_TEMP, M_WAITOK);
- error = kern___getcwd(td, path, UIO_SYSSPACE, len);
- if (!error) {
+ error = kern___getcwd(td, path, UIO_SYSSPACE, args->bufsize,
+ LINUX_PATH_MAX);
+ if (error == 0) {
lenused = strlen(path) + 1;
- if (lenused <= args->bufsize) {
+ error = copyout(path, args->buf, lenused);
+ if (error == 0)
td->td_retval[0] = lenused;
- error = copyout(path, args->buf, lenused);
- }
- else
- error = ERANGE;
- } else {
- bp = &path[len];
- bend = bp;
- *(--bp) = '\0';
-
- /*
- * 5th argument here is "max number of vnodes to traverse".
- * Since each entry takes up at least 2 bytes in the output buffer,
- * limit it to N/2 vnodes for an N byte buffer.
- */
-
- error = linux_getcwd_common (td->td_proc->p_fd->fd_cdir, NULL,
- &bp, path, len/2, GETCWD_CHECK_ACCESS, td);
- if (error)
- goto out;
- lenused = bend - bp;
- td->td_retval[0] = lenused;
- /* put the result into user buffer */
- error = copyout(bp, args->buf, lenused);
}
-out:
+
free(path, M_TEMP);
return (error);
}
-
diff --git a/sys/compat/linux/linux_misc.h b/sys/compat/linux/linux_misc.h
index 154d78f..51135d8 100644
--- a/sys/compat/linux/linux_misc.h
+++ b/sys/compat/linux/linux_misc.h
@@ -55,6 +55,8 @@
#define LINUX_MREMAP_MAYMOVE 1
#define LINUX_MREMAP_FIXED 2
+#define LINUX_PATH_MAX 4096
+
extern const char *linux_platform;
/*
diff --git a/sys/compat/svr4/svr4_stream.c b/sys/compat/svr4/svr4_stream.c
index d287d5d..cbb536b 100644
--- a/sys/compat/svr4/svr4_stream.c
+++ b/sys/compat/svr4/svr4_stream.c
@@ -1829,7 +1829,7 @@ svr4_do_getmsg(td, uap, fp)
break;
default:
- fdclose(td->td_proc->p_fd, afp, st->s_afd, td);
+ fdclose(td, afp, st->s_afd);
fdrop(afp, td);
st->s_afd = -1;
mtx_unlock(&Giant);
@@ -1967,7 +1967,7 @@ svr4_do_getmsg(td, uap, fp)
if (error) {
if (afp) {
- fdclose(td->td_proc->p_fd, afp, st->s_afd, td);
+ fdclose(td, afp, st->s_afd);
fdrop(afp, td);
st->s_afd = -1;
}
diff --git a/sys/conf/Makefile.arm64 b/sys/conf/Makefile.arm64
new file mode 100644
index 0000000..46c191c
--- /dev/null
+++ b/sys/conf/Makefile.arm64
@@ -0,0 +1,54 @@
+# Makefile.arm64 -- with config changes.
+# Copyright 1990 W. Jolitz
+# from: @(#)Makefile.i386 7.1 5/10/91
+# from FreeBSD: src/sys/conf/Makefile.i386,v 1.255 2002/02/20 23:35:49
+# $FreeBSD$
+#
+# Makefile for FreeBSD
+#
+# This makefile is constructed from a machine description:
+# config machineid
+# Most changes should be made in the machine description
+# /sys/arm64/conf/``machineid''
+# after which you should do
+# config machineid
+# Generic makefile changes should be made in
+# /sys/conf/Makefile.arm64
+# after which config should be rerun for all machines.
+#
+
+# Which version of config(8) is required.
+%VERSREQ= 600012
+
+.if !defined(S)
+S= ../../..
+.endif
+.include "$S/conf/kern.pre.mk"
+
+INCLUDES+= -I$S/contrib/libfdt
+
+# We generally don't want fpu instructions in the kernel.
+CFLAGS += -mgeneral-regs-only
+
+# Reserve x18 for pcpu data
+CFLAGS += -ffixed-x18
+
+.if !empty(DDB_ENABLED)
+CFLAGS += -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer
+.endif
+
+%BEFORE_DEPEND
+
+%OBJS
+
+%FILES.c
+
+%FILES.s
+
+%FILES.m
+
+%CLEAN
+
+%RULES
+
+.include "$S/conf/kern.post.mk"
diff --git a/sys/conf/Makefile.pc98 b/sys/conf/Makefile.pc98
index 9d0f25b..1bd5bae 100644
--- a/sys/conf/Makefile.pc98
+++ b/sys/conf/Makefile.pc98
@@ -28,6 +28,9 @@ S= ./@
S= ../../..
.endif
.endif
+
+LDSCRIPT_NAME?= ldscript.${MACHINE_ARCH}
+
.include "$S/conf/kern.pre.mk"
ASM_CFLAGS.mpboot.s= ${CLANG_NO_IAS34}
diff --git a/sys/conf/NOTES b/sys/conf/NOTES
index e728ee2..06c8549 100644
--- a/sys/conf/NOTES
+++ b/sys/conf/NOTES
@@ -2836,6 +2836,7 @@ options INIT_PATH=/sbin/init:/rescue/init
options BUS_DEBUG # enable newbus debugging
options DEBUG_VFS_LOCKS # enable VFS lock debugging
options SOCKBUF_DEBUG # enable sockbuf last record/mb tail checking
+options IFMEDIA_DEBUG # enable debugging in net/if_media.c
#
# Verbose SYSINIT
diff --git a/sys/conf/files b/sys/conf/files
index 9e63ffe..caaed94 100644
--- a/sys/conf/files
+++ b/sys/conf/files
@@ -247,14 +247,6 @@ compat/freebsd32/freebsd32_ioctl.c optional compat_freebsd32
compat/freebsd32/freebsd32_misc.c optional compat_freebsd32
compat/freebsd32/freebsd32_syscalls.c optional compat_freebsd32
compat/freebsd32/freebsd32_sysent.c optional compat_freebsd32
-contrib/altq/altq/altq_cbq.c optional altq
-contrib/altq/altq/altq_cdnr.c optional altq
-contrib/altq/altq/altq_hfsc.c optional altq
-contrib/altq/altq/altq_priq.c optional altq
-contrib/altq/altq/altq_red.c optional altq
-contrib/altq/altq/altq_rio.c optional altq
-contrib/altq/altq/altq_rmclass.c optional altq
-contrib/altq/altq/altq_subr.c optional altq
contrib/dev/acpica/common/ahids.c optional acpi acpi_debug
contrib/dev/acpica/common/ahuuids.c optional acpi acpi_debug
contrib/dev/acpica/components/debugger/dbcmds.c optional acpi acpi_debug
@@ -592,7 +584,6 @@ dev/acpica/acpi_button.c optional acpi
dev/acpica/acpi_cmbat.c optional acpi
dev/acpica/acpi_cpu.c optional acpi
dev/acpica/acpi_ec.c optional acpi
-dev/acpica/acpi_hpet.c optional acpi
dev/acpica/acpi_isab.c optional acpi isa
dev/acpica/acpi_lid.c optional acpi
dev/acpica/acpi_package.c optional acpi
@@ -1788,6 +1779,8 @@ dev/ixgbe/ixgbe_82599.c optional ix ixv inet \
compile-with "${NORMAL_C} -I$S/dev/ixgbe"
dev/ixgbe/ixgbe_x540.c optional ix ixv inet \
compile-with "${NORMAL_C} -I$S/dev/ixgbe"
+dev/ixgbe/ixgbe_x550.c optional ix ixv inet \
+ compile-with "${NORMAL_C} -I$S/dev/ixgbe"
dev/ixgbe/ixgbe_dcb.c optional ix ixv inet \
compile-with "${NORMAL_C} -I$S/dev/ixgbe"
dev/ixgbe/ixgbe_dcb_82598.c optional ix ixv inet \
@@ -2685,24 +2678,24 @@ wpi.fw optional wpifw \
clean "wpi.fw"
dev/xe/if_xe.c optional xe
dev/xe/if_xe_pccard.c optional xe pccard
-dev/xen/balloon/balloon.c optional xen | xenhvm
-dev/xen/blkfront/blkfront.c optional xen | xenhvm
-dev/xen/blkback/blkback.c optional xen | xenhvm
-dev/xen/console/console.c optional xen | xenhvm
-dev/xen/console/xencons_ring.c optional xen | xenhvm
-dev/xen/control/control.c optional xen | xenhvm
-dev/xen/grant_table/grant_table.c optional xen | xenhvm
-dev/xen/netback/netback.c optional xen | xenhvm
-dev/xen/netfront/netfront.c optional xen | xenhvm
+dev/xen/balloon/balloon.c optional xenhvm
+dev/xen/blkfront/blkfront.c optional xenhvm
+dev/xen/blkback/blkback.c optional xenhvm
+dev/xen/console/console.c optional xenhvm
+dev/xen/console/xencons_ring.c optional xenhvm
+dev/xen/control/control.c optional xenhvm
+dev/xen/grant_table/grant_table.c optional xenhvm
+dev/xen/netback/netback.c optional xenhvm
+dev/xen/netfront/netfront.c optional xenhvm
dev/xen/xenpci/xenpci.c optional xenpci
-dev/xen/timer/timer.c optional xen | xenhvm
-dev/xen/pvcpu/pvcpu.c optional xen | xenhvm
-dev/xen/xenstore/xenstore.c optional xen | xenhvm
-dev/xen/xenstore/xenstore_dev.c optional xen | xenhvm
-dev/xen/xenstore/xenstored_dev.c optional xen | xenhvm
-dev/xen/evtchn/evtchn_dev.c optional xen | xenhvm
-dev/xen/privcmd/privcmd.c optional xen | xenhvm
-dev/xen/debug/debug.c optional xen | xenhvm
+dev/xen/timer/timer.c optional xenhvm
+dev/xen/pvcpu/pvcpu.c optional xenhvm
+dev/xen/xenstore/xenstore.c optional xenhvm
+dev/xen/xenstore/xenstore_dev.c optional xenhvm
+dev/xen/xenstore/xenstored_dev.c optional xenhvm
+dev/xen/evtchn/evtchn_dev.c optional xenhvm
+dev/xen/privcmd/privcmd.c optional xenhvm
+dev/xen/debug/debug.c optional xenhvm
dev/xl/if_xl.c optional xl pci
dev/xl/xlphy.c optional xl pci
fs/autofs/autofs.c optional autofs
@@ -2941,8 +2934,6 @@ fs/ext2fs/ext2_bmap.c optional ext2fs
fs/ext2fs/ext2_extents.c optional ext2fs
fs/ext2fs/ext2_inode.c optional ext2fs
fs/ext2fs/ext2_inode_cnv.c optional ext2fs
-fs/ext2fs/ext2_hash.c optional ext2fs
-fs/ext2fs/ext2_htree.c optional ext2fs
fs/ext2fs/ext2_lookup.c optional ext2fs
fs/ext2fs/ext2_subr.c optional ext2fs
fs/ext2fs/ext2_vfsops.c optional ext2fs
@@ -3272,6 +3263,17 @@ libkern/strtoul.c standard
libkern/strtouq.c standard
libkern/strvalid.c standard
libkern/timingsafe_bcmp.c standard
+libkern/zlib.c optional crypto | geom_uzip | ipsec | \
+ mxge | netgraph_deflate | \
+ ddb_ctf | gzio | geom_uncompress
+net/altq/altq_cbq.c optional altq
+net/altq/altq_cdnr.c optional altq
+net/altq/altq_hfsc.c optional altq
+net/altq/altq_priq.c optional altq
+net/altq/altq_red.c optional altq
+net/altq/altq_rio.c optional altq
+net/altq/altq_rmclass.c optional altq
+net/altq/altq_subr.c optional altq
net/bpf.c standard
net/bpf_buffer.c optional bpf
net/bpf_jitter.c optional bpf_jitter
@@ -3326,9 +3328,6 @@ net/slcompress.c optional netgraph_vjc | sppp | \
netgraph_sppp
net/toeplitz.c optional inet rss | inet6 rss
net/vnet.c optional vimage
-net/zlib.c optional crypto | geom_uzip | ipsec | \
- mxge | netgraph_deflate | \
- ddb_ctf | gzio | geom_uncompress
net80211/ieee80211.c optional wlan
net80211/ieee80211_acl.c optional wlan wlan_acl
net80211/ieee80211_action.c optional wlan
@@ -3485,6 +3484,7 @@ netinet/ip_ipsec.c optional inet ipsec
netinet/ip_mroute.c optional mrouting inet
netinet/ip_options.c optional inet
netinet/ip_output.c optional inet
+netinet/ip_reass.c optional inet
netinet/raw_ip.c optional inet | inet6
netinet/cc/cc.c optional inet | inet6
netinet/cc/cc_newreno.c optional inet | inet6
@@ -3504,6 +3504,7 @@ netinet/sctp_sysctl.c optional inet sctp | inet6 sctp
netinet/sctp_timer.c optional inet sctp | inet6 sctp
netinet/sctp_usrreq.c optional inet sctp | inet6 sctp
netinet/sctputil.c optional inet sctp | inet6 sctp
+netinet/siftr.c optional inet siftr alq | inet6 siftr alq
netinet/tcp_debug.c optional tcpdebug
netinet/tcp_hostcache.c optional inet | inet6
netinet/tcp_input.c optional inet | inet6
@@ -3564,7 +3565,6 @@ netipsec/keysock.c optional ipsec inet | ipsec inet6
netipsec/xform_ah.c optional ipsec inet | ipsec inet6
netipsec/xform_esp.c optional ipsec inet | ipsec inet6
netipsec/xform_ipcomp.c optional ipsec inet | ipsec inet6
-netipsec/xform_ipip.c optional ipsec inet | ipsec inet6
netipsec/xform_tcp.c optional ipsec inet tcp_signature | \
ipsec inet6 tcp_signature
netnatm/natm.c optional natm
@@ -4045,13 +4045,13 @@ vm/vm_reserv.c standard
vm/vm_unix.c standard
vm/vm_zeroidle.c standard
vm/vnode_pager.c standard
-xen/features.c optional xen | xenhvm
-xen/xenbus/xenbus_if.m optional xen | xenhvm
-xen/xenbus/xenbus.c optional xen | xenhvm
-xen/xenbus/xenbusb_if.m optional xen | xenhvm
-xen/xenbus/xenbusb.c optional xen | xenhvm
-xen/xenbus/xenbusb_front.c optional xen | xenhvm
-xen/xenbus/xenbusb_back.c optional xen | xenhvm
+xen/features.c optional xenhvm
+xen/xenbus/xenbus_if.m optional xenhvm
+xen/xenbus/xenbus.c optional xenhvm
+xen/xenbus/xenbusb_if.m optional xenhvm
+xen/xenbus/xenbusb.c optional xenhvm
+xen/xenbus/xenbusb_front.c optional xenhvm
+xen/xenbus/xenbusb_back.c optional xenhvm
xdr/xdr.c optional krpc | nfslockd | nfscl | nfsd
xdr/xdr_array.c optional krpc | nfslockd | nfscl | nfsd
xdr/xdr_mbuf.c optional krpc | nfslockd | nfscl | nfsd
diff --git a/sys/conf/files.amd64 b/sys/conf/files.amd64
index 4910903..8aadcf5 100644
--- a/sys/conf/files.amd64
+++ b/sys/conf/files.amd64
@@ -145,6 +145,7 @@ crypto/via/padlock.c optional padlock
crypto/via/padlock_cipher.c optional padlock
crypto/via/padlock_hash.c optional padlock
dev/acpica/acpi_if.m standard
+dev/acpica/acpi_hpet.c optional acpi
dev/acpi_support/acpi_wmi_if.m standard
dev/agp/agp_amd64.c optional agp
dev/agp/agp_i810.c optional agp
@@ -513,10 +514,10 @@ compat/ndis/winx64_wrap.S optional ndisapi pci
libkern/memmove.c standard
libkern/memset.c standard
#
-# x86 real mode BIOS emulator, required by atkbdc/dpms/pci/vesa
+# x86 real mode BIOS emulator, required by dpms/pci/vesa
#
-compat/x86bios/x86bios.c optional x86bios | atkbd | dpms | pci | vesa
-contrib/x86emu/x86emu.c optional x86bios | atkbd | dpms | pci | vesa
+compat/x86bios/x86bios.c optional x86bios | dpms | pci | vesa
+contrib/x86emu/x86emu.c optional x86bios | dpms | pci | vesa
#
# bvm console
#
@@ -558,6 +559,7 @@ x86/pci/pci_bus.c optional pci
x86/pci/qpi.c optional pci
x86/x86/busdma_bounce.c standard
x86/x86/busdma_machdep.c standard
+x86/x86/cpu_machdep.c standard
x86/x86/dump_machdep.c standard
x86/x86/fdt_machdep.c optional fdt
x86/x86/identcpu.c standard
@@ -568,13 +570,14 @@ x86/x86/local_apic.c standard
x86/x86/mca.c standard
x86/x86/mptable.c optional mptable
x86/x86/mptable_pci.c optional mptable pci
+x86/x86/mp_x86.c optional smp
x86/x86/msi.c optional pci
x86/x86/nexus.c standard
x86/x86/pvclock.c standard
x86/x86/tsc.c standard
x86/x86/delay.c standard
x86/xen/hvm.c optional xenhvm
-x86/xen/xen_intr.c optional xen | xenhvm
+x86/xen/xen_intr.c optional xenhvm
x86/xen/pv.c optional xenhvm
x86/xen/pvcpu_enum.c optional xenhvm
x86/xen/xen_apic.c optional xenhvm
diff --git a/sys/conf/files.arm b/sys/conf/files.arm
index 741b907..b40f7c9 100644
--- a/sys/conf/files.arm
+++ b/sys/conf/files.arm
@@ -85,6 +85,8 @@ dev/fdt/fdt_arm_platform.c optional platform fdt
dev/hwpmc/hwpmc_arm.c optional hwpmc
dev/hwpmc/hwpmc_armv7.c optional hwpmc armv6
dev/kbd/kbd.c optional sc | vt
+dev/psci/psci.c optional psci
+dev/psci/psci_arm.S optional psci
dev/syscons/scgfbrndr.c optional sc
dev/syscons/scterm-teken.c optional sc
dev/syscons/scvtb.c optional sc
diff --git a/sys/conf/files.arm64 b/sys/conf/files.arm64
new file mode 100644
index 0000000..f80fecd
--- /dev/null
+++ b/sys/conf/files.arm64
@@ -0,0 +1,54 @@
+# $FreeBSD$
+arm/arm/devmap.c standard
+arm/arm/generic_timer.c standard
+arm64/arm64/autoconf.c standard
+arm64/arm64/bcopy.c standard
+arm64/arm64/bus_machdep.c standard
+arm64/arm64/bus_space_asm.S standard
+arm64/arm64/busdma_machdep.c standard
+arm64/arm64/clock.c standard
+arm64/arm64/copyinout.S standard
+arm64/arm64/copystr.c standard
+arm64/arm64/cpufunc_asm.S standard
+arm64/arm64/db_disasm.c optional ddb
+arm64/arm64/db_interface.c optional ddb
+arm64/arm64/db_trace.c optional ddb
+arm64/arm64/debug_monitor.c optional kdb
+arm64/arm64/dump_machdep.c standard
+arm64/arm64/elf_machdep.c standard
+arm64/arm64/exception.S standard
+arm64/arm64/gic.c standard
+arm64/arm64/identcpu.c standard
+arm64/arm64/intr_machdep.c standard
+arm64/arm64/in_cksum.c optional inet | inet6
+arm64/arm64/locore.S standard no-obj
+arm64/arm64/machdep.c standard
+arm64/arm64/mem.c standard
+arm64/arm64/minidump_machdep.c standard
+arm64/arm64/nexus.c standard
+arm64/arm64/pic_if.m standard
+arm64/arm64/pmap.c standard
+arm64/arm64/stack_machdep.c standard
+arm64/arm64/support.S standard
+arm64/arm64/swtch.S standard
+arm64/arm64/sys_machdep.c standard
+arm64/arm64/trap.c standard
+arm64/arm64/uio_machdep.c standard
+arm64/arm64/vfp.c standard
+arm64/arm64/vm_machdep.c standard
+dev/fdt/fdt_arm64.c optional fdt
+dev/ofw/ofw_cpu.c optional fdt
+dev/psci/psci.c optional psci
+dev/psci/psci_arm64.S optional psci
+dev/uart/uart_cpu_fdt.c optional uart fdt
+dev/uart/uart_dev_pl011.c optional uart pl011
+kern/kern_clocksource.c standard
+kern/subr_dummy_vdso_tc.c standard
+libkern/bcmp.c standard
+libkern/ffs.c standard
+libkern/ffsl.c standard
+libkern/fls.c standard
+libkern/flsl.c standard
+libkern/flsll.c standard
+libkern/memmove.c standard
+libkern/memset.c standard
diff --git a/sys/conf/files.i386 b/sys/conf/files.i386
index 1873514..68dd6a9 100644
--- a/sys/conf/files.i386
+++ b/sys/conf/files.i386
@@ -285,6 +285,7 @@ dev/uart/uart_cpu_x86.c optional uart
dev/viawd/viawd.c optional viawd
dev/vmware/vmxnet3/if_vmx.c optional vmx
dev/acpica/acpi_if.m standard
+dev/acpica/acpi_hpet.c optional acpi
dev/acpi_support/acpi_wmi_if.m standard
dev/wbwd/wbwd.c optional wbwd
dev/wpi/if_wpi.c optional wpi
@@ -427,16 +428,15 @@ i386/bios/smapi_bios.S optional smapi
i386/i386/atomic.c standard \
compile-with "${CC} -c ${CFLAGS} ${DEFINED_PROF:S/^$/-fomit-frame-pointer/} ${.IMPSRC}"
i386/i386/autoconf.c standard
-i386/i386/bios.c optional native
-i386/i386/bioscall.s optional native
+i386/i386/bios.c standard
+i386/i386/bioscall.s standard
i386/i386/bpf_jit_machdep.c optional bpf_jitter
i386/i386/db_disasm.c optional ddb
i386/i386/db_interface.c optional ddb
i386/i386/db_trace.c optional ddb
i386/i386/elan-mmcr.c optional cpu_elan | cpu_soekris
i386/i386/elf_machdep.c standard
-i386/i386/exception.s optional native
-i386/xen/exception.s optional xen
+i386/i386/exception.s standard
i386/i386/gdb_machdep.c optional gdb
i386/i386/geode.c optional cpu_geode
i386/i386/i686_mem.c optional mem
@@ -444,22 +444,17 @@ i386/i386/in_cksum.c optional inet | inet6
i386/i386/initcpu.c standard
i386/i386/io.c optional io
i386/i386/k6_mem.c optional mem
-i386/i386/locore.s optional native no-obj
-i386/xen/locore.s optional xen no-obj
+i386/i386/locore.s standard no-obj
i386/i386/longrun.c optional cpu_enable_longrun
i386/i386/machdep.c standard
-i386/xen/xen_machdep.c optional xen
i386/i386/mem.c optional mem
i386/i386/minidump_machdep.c standard
i386/i386/mp_clock.c optional smp
-i386/i386/mp_machdep.c optional native smp
-i386/xen/mp_machdep.c optional xen smp
+i386/i386/mp_machdep.c optional smp
i386/i386/mp_watchdog.c optional mp_watchdog smp
-i386/i386/mpboot.s optional smp native
-i386/xen/mptable.c optional apic xen
+i386/i386/mpboot.s optional smp
i386/i386/perfmon.c optional perfmon
-i386/i386/pmap.c optional native
-i386/xen/pmap.c optional xen
+i386/i386/pmap.c standard
i386/i386/ptrace_machdep.c standard
i386/i386/stack_machdep.c optional ddb | stack
i386/i386/support.s standard
@@ -488,7 +483,6 @@ i386/ibcs2/ibcs2_util.c optional ibcs2
i386/ibcs2/ibcs2_xenix.c optional ibcs2
i386/ibcs2/ibcs2_xenix_sysent.c optional ibcs2
i386/ibcs2/imgact_coff.c optional ibcs2
-i386/xen/clock.c optional xen
i386/isa/elink.c optional ep | ie
i386/isa/npx.c optional npx
i386/isa/pmtimer.c optional pmtimer
@@ -531,9 +525,9 @@ i386/xbox/xboxfb.c optional xboxfb
dev/fb/boot_font.c optional xboxfb
i386/xbox/pic16l.s optional xbox
#
-# x86 real mode BIOS support, required by atkbdc/dpms/pci/vesa
+# x86 real mode BIOS support, required by dpms/pci/vesa
#
-compat/x86bios/x86bios.c optional x86bios | atkbd | dpms | pci | vesa
+compat/x86bios/x86bios.c optional x86bios | dpms | pci | vesa
#
# bvm console
#
@@ -565,9 +559,9 @@ x86/iommu/intel_qi.c optional acpi acpi_dmar pci
x86/iommu/intel_quirks.c optional acpi acpi_dmar pci
x86/iommu/intel_utils.c optional acpi acpi_dmar pci
x86/isa/atpic.c optional atpic
-x86/isa/atrtc.c optional native
-x86/isa/clock.c optional native
-x86/isa/elcr.c optional atpic | apic native
+x86/isa/atrtc.c standard
+x86/isa/clock.c standard
+x86/isa/elcr.c optional atpic | apic
x86/isa/isa.c optional isa
x86/isa/isa_dma.c optional isa
x86/isa/nmi.c standard
@@ -576,24 +570,26 @@ x86/pci/pci_bus.c optional pci
x86/pci/qpi.c optional pci
x86/x86/busdma_bounce.c standard
x86/x86/busdma_machdep.c standard
+x86/x86/cpu_machdep.c standard
x86/x86/dump_machdep.c standard
x86/x86/fdt_machdep.c optional fdt
x86/x86/identcpu.c standard
x86/x86/intr_machdep.c standard
x86/x86/io_apic.c optional apic
-x86/x86/legacy.c optional native
+x86/x86/legacy.c standard
x86/x86/local_apic.c optional apic
x86/x86/mca.c standard
-x86/x86/mptable.c optional apic native
-x86/x86/mptable_pci.c optional apic native pci
+x86/x86/mptable.c optional apic
+x86/x86/mptable_pci.c optional apic pci
+x86/x86/mp_x86.c optional smp
x86/x86/msi.c optional apic pci
x86/x86/nexus.c standard
x86/x86/tsc.c standard
x86/x86/pvclock.c standard
x86/x86/delay.c standard
x86/xen/hvm.c optional xenhvm
-x86/xen/xen_intr.c optional xen | xenhvm
+x86/xen/xen_intr.c optional xenhvm
x86/xen/xen_apic.c optional xenhvm
-x86/xen/xenpv.c optional xen | xenhvm
-x86/xen/xen_nexus.c optional xen | xenhvm
-x86/xen/xen_msi.c optional xen | xenhvm
+x86/xen/xenpv.c optional xenhvm
+x86/xen/xen_nexus.c optional xenhvm
+x86/xen/xen_msi.c optional xenhvm
diff --git a/sys/conf/files.mips b/sys/conf/files.mips
index 3677de4..4bc6775a1 100644
--- a/sys/conf/files.mips
+++ b/sys/conf/files.mips
@@ -89,3 +89,4 @@ dev/nvram2env/nvram2env.c optional nvram2env
# hwpmc support
dev/hwpmc/hwpmc_mips.c optional hwpmc
dev/hwpmc/hwpmc_mips24k.c optional hwpmc_mips24k
+dev/hwpmc/hwpmc_mips74k.c optional hwpmc_mips74k
diff --git a/sys/conf/files.pc98 b/sys/conf/files.pc98
index be67ce4..ae165fc 100644
--- a/sys/conf/files.pc98
+++ b/sys/conf/files.pc98
@@ -248,6 +248,7 @@ x86/isa/isa.c optional isa
x86/pci/pci_bus.c optional pci
x86/x86/busdma_bounce.c standard
x86/x86/busdma_machdep.c standard
+x86/x86/cpu_machdep.c standard
x86/x86/dump_machdep.c standard
x86/x86/identcpu.c standard
x86/x86/intr_machdep.c standard
@@ -255,6 +256,7 @@ x86/x86/io_apic.c optional apic
x86/x86/legacy.c standard
x86/x86/local_apic.c optional apic
x86/x86/mca.c standard
+x86/x86/mp_x86.c optional smp
x86/x86/mptable.c optional apic
x86/x86/mptable_pci.c optional apic pci
x86/x86/msi.c optional apic pci
diff --git a/sys/conf/files.powerpc b/sys/conf/files.powerpc
index 9d34751..92f4101 100644
--- a/sys/conf/files.powerpc
+++ b/sys/conf/files.powerpc
@@ -31,11 +31,12 @@ dev/fb/fb.c optional sc
dev/fdt/fdt_powerpc.c optional fdt
# ofwbus depends on simplebus.
dev/fdt/simplebus.c optional aim | fdt
-dev/hwpmc/hwpmc_powerpc.c optional hwpmc
+dev/hwpmc/hwpmc_e500.c optional hwpmc
dev/hwpmc/hwpmc_mpc7xxx.c optional hwpmc
+dev/hwpmc/hwpmc_powerpc.c optional hwpmc
dev/hwpmc/hwpmc_ppc970.c optional hwpmc
dev/iicbus/ad7417.c optional ad7417 powermac
-dev/iicbus/adm1030.c optional powermac windtunnel | adm1030 powermac
+dev/iicbus/adm1030.c optional powermac windtunnel | adm1030 powermac
dev/iicbus/adt746x.c optional adt746x powermac
dev/iicbus/ds1631.c optional ds1631 powermac
dev/iicbus/ds1775.c optional ds1775 powermac
@@ -96,23 +97,20 @@ libkern/udivdi3.c optional powerpc
libkern/umoddi3.c optional powerpc
powerpc/aim/interrupt.c optional aim
powerpc/aim/locore.S optional aim no-obj
-powerpc/aim/machdep.c optional aim
+powerpc/aim/aim_machdep.c optional aim
powerpc/aim/mmu_oea.c optional aim powerpc
powerpc/aim/mmu_oea64.c optional aim
powerpc/aim/moea64_if.m optional aim
powerpc/aim/moea64_native.c optional aim
powerpc/aim/mp_cpudep.c optional aim
powerpc/aim/slb.c optional aim powerpc64
-powerpc/aim/trap.c optional aim
-powerpc/aim/uma_machdep.c optional aim
powerpc/booke/interrupt.c optional booke
powerpc/booke/locore.S optional booke no-obj
-powerpc/booke/machdep.c optional booke
+powerpc/booke/booke_machdep.c optional booke
powerpc/booke/machdep_e500.c optional booke_e500
powerpc/booke/mp_cpudep.c optional booke smp
powerpc/booke/platform_bare.c optional booke
powerpc/booke/pmap.c optional booke
-powerpc/booke/trap.c optional booke
powerpc/cpufreq/dfs.c optional cpufreq
powerpc/cpufreq/pcr.c optional cpufreq aim
powerpc/cpufreq/pmufreq.c optional cpufreq aim pmu
@@ -136,6 +134,7 @@ powerpc/mpc85xx/i2c.c optional iicbus fdt
powerpc/mpc85xx/isa.c optional mpc85xx isa
powerpc/mpc85xx/lbc.c optional mpc85xx
powerpc/mpc85xx/mpc85xx.c optional mpc85xx
+powerpc/mpc85xx/mpc85xx_gpio.c optional mpc85xx gpio
powerpc/mpc85xx/platform_mpc85xx.c optional mpc85xx
powerpc/mpc85xx/pci_mpc85xx.c optional pci mpc85xx
powerpc/ofw/ofw_machdep.c standard
@@ -195,6 +194,7 @@ powerpc/powerpc/gdb_machdep.c optional gdb
powerpc/powerpc/in_cksum.c optional inet | inet6
powerpc/powerpc/intr_machdep.c standard
powerpc/powerpc/iommu_if.m standard
+powerpc/powerpc/machdep.c standard
powerpc/powerpc/mem.c optional mem
powerpc/powerpc/mmu_if.m standard
powerpc/powerpc/mp_machdep.c optional smp
@@ -215,7 +215,9 @@ powerpc/powerpc/stack_machdep.c optional ddb | stack
powerpc/powerpc/suswintr.c standard
powerpc/powerpc/syncicache.c standard
powerpc/powerpc/sys_machdep.c standard
+powerpc/powerpc/trap.c standard
powerpc/powerpc/uio_machdep.c standard
+powerpc/powerpc/uma_machdep.c standard
powerpc/powerpc/vm_machdep.c standard
powerpc/ps3/ehci_ps3.c optional ps3 ehci
powerpc/ps3/ohci_ps3.c optional ps3 ohci
diff --git a/sys/conf/kern.mk b/sys/conf/kern.mk
index 9a7ad61..8e76268 100644
--- a/sys/conf/kern.mk
+++ b/sys/conf/kern.mk
@@ -187,7 +187,7 @@ CFLAGS+= -fstack-protector
CFLAGS+= -gdwarf-2
.endif
-CFLAGS+= ${CWARNEXTRA} ${CWARNFLAGS} ${CWARNFLAGS.${.IMPSRC:T}}
+CFLAGS+= ${CWARNFLAGS} ${CWARNFLAGS.${.IMPSRC:T}}
CFLAGS+= ${CFLAGS.${COMPILER_TYPE}} ${CFLAGS.${.IMPSRC:T}}
# Tell bmake not to mistake standard targets for things to be searched for
diff --git a/sys/conf/kern.pre.mk b/sys/conf/kern.pre.mk
index ede4ae8..8c3b9c6 100644
--- a/sys/conf/kern.pre.mk
+++ b/sys/conf/kern.pre.mk
@@ -26,7 +26,7 @@ KODIR?= /boot/${KERNEL}
LDSCRIPT_NAME?= ldscript.$M
LDSCRIPT?= $S/conf/${LDSCRIPT_NAME}
-M= ${MACHINE_CPUARCH}
+M= ${MACHINE}
AWK?= awk
CP?= cp
@@ -64,13 +64,10 @@ NOSTDINC= -nostdinc
INCLUDES= ${NOSTDINC} ${INCLMAGIC} -I. -I$S
-# This hack lets us use the OpenBSD altq code without spamming a new
-# include path into contrib'ed source files.
-INCLUDES+= -I$S/contrib/altq
-
.if make(depend) || make(kernel-depend)
-# ... and the same for ipfilter
+# This hack lets us use the ipfilter code without spamming a new
+# include path into contrib'ed source files.
INCLUDES+= -I$S/contrib/ipfilter
# ... and the same for ath
@@ -90,7 +87,7 @@ INCLUDES+= -I$S/dev/cxgb -I$S/dev/cxgbe
.endif
-CFLAGS= ${COPTFLAGS} ${DEBUG} ${CWARNFLAGS}
+CFLAGS= ${COPTFLAGS} ${DEBUG}
CFLAGS+= ${INCLUDES} -D_KERNEL -DHAVE_KERNEL_OPTION_HEADERS -include opt_global.h
CFLAGS_PARAM_INLINE_UNIT_GROWTH?=100
CFLAGS_PARAM_LARGE_FUNCTION_GROWTH?=1000
diff --git a/sys/conf/kmod.mk b/sys/conf/kmod.mk
index dff8610..e6fd846 100644
--- a/sys/conf/kmod.mk
+++ b/sys/conf/kmod.mk
@@ -101,10 +101,6 @@ CFLAGS+= -DHAVE_KERNEL_OPTION_HEADERS -include ${KERNBUILDDIR}/opt_global.h
# set because there are no standard paths for non-headers.
CFLAGS+= -I. -I${SYSDIR}
-# Add -I path for altq headers as they are included via net/if_var.h
-# for example.
-CFLAGS+= -I${SYSDIR}/contrib/altq
-
CFLAGS.gcc+= -finline-limit=${INLINE_LIMIT}
CFLAGS.gcc+= -fms-extensions
CFLAGS.gcc+= --param inline-unit-growth=100
@@ -429,10 +425,10 @@ genassym.o: opt_global.h
.endif
assym.s: ${SYSDIR}/kern/genassym.sh
sh ${SYSDIR}/kern/genassym.sh genassym.o > ${.TARGET}
-genassym.o: ${SYSDIR}/${MACHINE_CPUARCH}/${MACHINE_CPUARCH}/genassym.c
+genassym.o: ${SYSDIR}/${MACHINE}/${MACHINE}/genassym.c
genassym.o: ${SRCS:Mopt_*.h}
${CC} -c ${CFLAGS:N-fno-common} \
- ${SYSDIR}/${MACHINE_CPUARCH}/${MACHINE_CPUARCH}/genassym.c
+ ${SYSDIR}/${MACHINE}/${MACHINE}/genassym.c
.endif
lint: ${SRCS}
diff --git a/sys/conf/ldscript.arm64 b/sys/conf/ldscript.arm64
new file mode 100644
index 0000000..4b38654
--- /dev/null
+++ b/sys/conf/ldscript.arm64
@@ -0,0 +1,149 @@
+/* $FreeBSD$ */
+OUTPUT_ARCH(aarch64)
+ENTRY(_start)
+
+SEARCH_DIR(/usr/lib);
+SECTIONS
+{
+ /* Read-only sections, merged into text segment: */
+ . = kernbase + SIZEOF_HEADERS;
+ .text :
+ {
+ *(.text)
+ *(.stub)
+ /* .gnu.warning sections are handled specially by elf32.em. */
+ *(.gnu.warning)
+ *(.gnu.linkonce.t*)
+ } =0x9090
+ _etext = .;
+ PROVIDE (etext = .);
+ .fini : { *(.fini) } =0x9090
+ .rodata : { *(.rodata) *(.gnu.linkonce.r*) }
+ .rodata1 : { *(.rodata1) }
+ .interp : { *(.interp) }
+ .hash : { *(.hash) }
+ .dynsym : { *(.dynsym) }
+ .dynstr : { *(.dynstr) }
+ .gnu.version : { *(.gnu.version) }
+ .gnu.version_d : { *(.gnu.version_d) }
+ .gnu.version_r : { *(.gnu.version_r) }
+ .rel.text :
+ { *(.rel.text) *(.rel.gnu.linkonce.t*) }
+ .rela.text :
+ { *(.rela.text) *(.rela.gnu.linkonce.t*) }
+ .rel.data :
+ { *(.rel.data) *(.rel.gnu.linkonce.d*) }
+ .rela.data :
+ { *(.rela.data) *(.rela.gnu.linkonce.d*) }
+ .rel.rodata :
+ { *(.rel.rodata) *(.rel.gnu.linkonce.r*) }
+ .rela.rodata :
+ { *(.rela.rodata) *(.rela.gnu.linkonce.r*) }
+ .rel.got : { *(.rel.got) }
+ .rela.got : { *(.rela.got) }
+ .rel.ctors : { *(.rel.ctors) }
+ .rela.ctors : { *(.rela.ctors) }
+ .rel.dtors : { *(.rel.dtors) }
+ .rela.dtors : { *(.rela.dtors) }
+ .rel.init : { *(.rel.init) }
+ .rela.init : { *(.rela.init) }
+ .rel.fini : { *(.rel.fini) }
+ .rela.fini : { *(.rela.fini) }
+ .rel.bss : { *(.rel.bss) }
+ .rela.bss : { *(.rela.bss) }
+ .rel.plt : { *(.rel.plt) }
+ .rela.plt : { *(.rela.plt) }
+ .init : { *(.init) } =0x9090
+ .plt : { *(.plt) }
+
+ . = ALIGN(4);
+ _extab_start = .;
+ PROVIDE(extab_start = .);
+ .ARM.extab : { *(.ARM.extab) }
+ _extab.end = .;
+ PROVIDE(extab_end = .);
+
+ _exidx_start = .;
+ PROVIDE(exidx_start = .);
+ .ARM.exidx : { *(.ARM.exidx) }
+ _exidx_end = .;
+ PROVIDE(exidx_end = .);
+
+ /* Adjust the address for the data segment. We want to adjust up to
+ the same address within the page on the next page up. */
+ . = ALIGN(0x1000) + (. & (0x1000 - 1)) ;
+ .data :
+ {
+ *(.data)
+ *(.gnu.linkonce.d*)
+ CONSTRUCTORS
+ }
+ .data1 : { *(.data1) }
+ . = ALIGN(32 / 8);
+ _start_ctors = .;
+ PROVIDE (start_ctors = .);
+ .ctors :
+ {
+ *(.ctors)
+ }
+ _stop_ctors = .;
+ PROVIDE (stop_ctors = .);
+ .dtors :
+ {
+ *(.dtors)
+ }
+ .got : { *(.got.plt) *(.got) }
+ .dynamic : { *(.dynamic) }
+ /* We want the small data sections together, so single-instruction offsets
+ can access them all, and initialized data all before uninitialized, so
+ we can shorten the on-disk segment size. */
+ . = ALIGN(8);
+ .sdata : { *(.sdata) }
+ _edata = .;
+ PROVIDE (edata = .);
+ __bss_start = .;
+ .sbss : { *(.sbss) *(.scommon) }
+ .bss :
+ {
+ *(.dynbss)
+ *(.bss)
+ *(COMMON)
+ }
+ . = ALIGN(8);
+ _end = . ;
+ PROVIDE (end = .);
+ /* Stabs debugging sections. */
+ .stab 0 : { *(.stab) }
+ .stabstr 0 : { *(.stabstr) }
+ .stab.excl 0 : { *(.stab.excl) }
+ .stab.exclstr 0 : { *(.stab.exclstr) }
+ .stab.index 0 : { *(.stab.index) }
+ .stab.indexstr 0 : { *(.stab.indexstr) }
+ .comment 0 : { *(.comment) }
+ /* DWARF debug sections.
+ Symbols in the DWARF debugging sections are relative to the beginning
+ of the section so we begin them at 0. */
+ /* DWARF 1 */
+ .debug 0 : { *(.debug) }
+ .line 0 : { *(.line) }
+ /* GNU DWARF 1 extensions */
+ .debug_srcinfo 0 : { *(.debug_srcinfo) }
+ .debug_sfnames 0 : { *(.debug_sfnames) }
+ /* DWARF 1.1 and DWARF 2 */
+ .debug_aranges 0 : { *(.debug_aranges) }
+ .debug_pubnames 0 : { *(.debug_pubnames) }
+ /* DWARF 2 */
+ .debug_info 0 : { *(.debug_info) }
+ .debug_abbrev 0 : { *(.debug_abbrev) }
+ .debug_line 0 : { *(.debug_line) }
+ .debug_frame 0 : { *(.debug_frame) }
+ .debug_str 0 : { *(.debug_str) }
+ .debug_loc 0 : { *(.debug_loc) }
+ .debug_macinfo 0 : { *(.debug_macinfo) }
+ /* SGI/MIPS DWARF 2 extensions */
+ .debug_weaknames 0 : { *(.debug_weaknames) }
+ .debug_funcnames 0 : { *(.debug_funcnames) }
+ .debug_typenames 0 : { *(.debug_typenames) }
+ .debug_varnames 0 : { *(.debug_varnames) }
+ /* These must appear regardless of . */
+}
diff --git a/sys/conf/newvers.sh b/sys/conf/newvers.sh
index c06eeaf..3ca5bcd 100644
--- a/sys/conf/newvers.sh
+++ b/sys/conf/newvers.sh
@@ -33,17 +33,17 @@
TYPE="FreeBSD"
REVISION="11.0"
BRANCH="CURRENT"
-if [ "X${BRANCH_OVERRIDE}" != "X" ]; then
+if [ -n "${BRANCH_OVERRIDE}" ]; then
BRANCH=${BRANCH_OVERRIDE}
fi
RELEASE="${REVISION}-${BRANCH}"
VERSION="${TYPE} ${RELEASE}"
-if [ "X${SYSDIR}" = "X" ]; then
+if [ -z "${SYSDIR}" ]; then
SYSDIR=$(dirname $0)/..
fi
-if [ "X${PARAMFILE}" != "X" ]; then
+if [ -n "${PARAMFILE}" ]; then
RELDATE=$(awk '/__FreeBSD_version.*propagated to newvers/ {print $3}' \
${PARAMFILE})
else
@@ -72,7 +72,7 @@ do
done
# no copyright found, use a dummy
-if [ X"$COPYRIGHT" = X ]; then
+if [ -z "$COPYRIGHT" ]; then
COPYRIGHT="/*-
* Copyright (c) 1992-$year The FreeBSD Project.
* All rights reserved.
diff --git a/sys/conf/options b/sys/conf/options
index 28d7950..b698717 100644
--- a/sys/conf/options
+++ b/sys/conf/options
@@ -432,6 +432,7 @@ ROUTETABLES opt_route.h
RSS opt_rss.h
SLIP_IFF_OPTS opt_slip.h
TCPDEBUG
+SIFTR
TCP_OFFLOAD opt_inet.h # Enable code to dispatch TCP offloading
TCP_SIGNATURE opt_inet.h
VLAN_ARRAY opt_vlan.h
@@ -553,6 +554,7 @@ LPT_DEBUG opt_lpt.h
PLIP_DEBUG opt_plip.h
LOCKF_DEBUG opt_debug_lockf.h
SI_DEBUG opt_debug_si.h
+IFMEDIA_DEBUG opt_ifmedia.h
# Fb options
FB_DEBUG opt_fb.h
@@ -927,6 +929,7 @@ IPOIB_CM opt_ofed.h
# Resource Accounting
RACCT opt_global.h
+RACCT_DISABLED opt_global.h
# Resource Limits
RCTL opt_global.h
diff --git a/sys/conf/options.amd64 b/sys/conf/options.amd64
index f1d4b4a..0e59187 100644
--- a/sys/conf/options.amd64
+++ b/sys/conf/options.amd64
@@ -63,5 +63,7 @@ BPF_JITTER opt_bpf.h
XENHVM opt_global.h
+HYPERV opt_global.h
+
# options for the Intel C600 SAS driver (isci)
ISCI_LOGGING opt_isci.h
diff --git a/sys/conf/options.arm b/sys/conf/options.arm
index 239be2a..b712b02 100644
--- a/sys/conf/options.arm
+++ b/sys/conf/options.arm
@@ -40,6 +40,9 @@ PV_STATS opt_pmap.h
QEMU_WORKAROUNDS opt_global.h
SOC_BCM2835 opt_global.h
SOC_BCM2836 opt_global.h
+SOC_IMX51 opt_global.h
+SOC_IMX53 opt_global.h
+SOC_IMX6 opt_global.h
SOC_MV_ARMADAXP opt_global.h
SOC_MV_DISCOVERY opt_global.h
SOC_MV_DOVE opt_global.h
diff --git a/sys/conf/options.arm64 b/sys/conf/options.arm64
new file mode 100644
index 0000000..1dfcbec
--- /dev/null
+++ b/sys/conf/options.arm64
@@ -0,0 +1,6 @@
+# $FreeBSD$
+
+ARM64 opt_global.h
+SOCDEV_PA opt_global.h
+SOCDEV_VA opt_global.h
+VFP opt_global.h
diff --git a/sys/conf/options.i386 b/sys/conf/options.i386
index 96b6d4d..69eb7e3 100644
--- a/sys/conf/options.i386
+++ b/sys/conf/options.i386
@@ -36,6 +36,11 @@ KVA_PAGES opt_global.h
# Physical address extensions and support for >4G ram. As above.
PAE opt_global.h
+# Use PAE page tables, but limit memory support to 4GB.
+# This keeps the i386 non-PAE KBI, in particular, drivers see
+# 32bit vm_paddr_t.
+PAE_TABLES opt_global.h
+
TIMER_FREQ opt_clock.h
CPU_ATHLON_SSE_HACK opt_cpu.h
@@ -116,9 +121,9 @@ NPX_DEBUG opt_npx.h
# BPF just-in-time compiler
BPF_JITTER opt_bpf.h
-NATIVE opt_global.h
-XEN opt_global.h
XENHVM opt_global.h
+HYPERV opt_global.h
+
# options for the Intel C600 SAS driver (isci)
ISCI_LOGGING opt_isci.h
diff --git a/sys/contrib/altq/altq/altqconf.h b/sys/contrib/altq/altq/altqconf.h
deleted file mode 100644
index 4d3921c..0000000
--- a/sys/contrib/altq/altq/altqconf.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/* $OpenBSD: altqconf.h,v 1.1 2001/06/27 05:28:36 kjc Exp $ */
-/* $NetBSD: altqconf.h,v 1.2 2001/05/30 11:57:16 mrg Exp $ */
-
-#if defined(_KERNEL_OPT) || defined(__OpenBSD__)
-
-#if defined(_KERNEL_OPT)
-#include "opt_altq_enabled.h"
-#endif
-
-#include <sys/conf.h>
-
-#ifdef ALTQ
-#define NALTQ 1
-#else
-#define NALTQ 0
-#endif
-
-cdev_decl(altq);
-
-#ifdef __OpenBSD__
-#define cdev_altq_init(c,n) { \
- dev_init(c,n,open), dev_init(c,n,close), (dev_type_read((*))) enodev, \
- (dev_type_write((*))) enodev, dev_init(c,n,ioctl), \
- (dev_type_stop((*))) enodev, 0, (dev_type_select((*))) enodev, \
- (dev_type_mmap((*))) enodev }
-#else
-#define cdev_altq_init(x,y) cdev__oci_init(x,y)
-#endif
-#endif /* defined(_KERNEL_OPT) || defined(__OpenBSD__) */
diff --git a/sys/contrib/dev/acpica/acpica_prep.sh b/sys/contrib/dev/acpica/acpica_prep.sh
index 00c5fa4..faf850e 100755
--- a/sys/contrib/dev/acpica/acpica_prep.sh
+++ b/sys/contrib/dev/acpica/acpica_prep.sh
@@ -18,11 +18,12 @@ fulldirs="common compiler components include os_specific"
# files to remove
stripdirs="generate libraries tests tools"
-stripfiles="Makefile README accygwin.h acefi.h achaiku.h acintel.h \
- aclinux.h aclinuxex.h acmacosx.h acmsvc.h acnetbsd.h acos2.h \
- acwin.h acwin64.h new_table.txt osefitbl.c osefixf.c \
- osfreebsdtbl.c oslinuxtbl.c osunixdir.c osunixmap.c oswindir.c \
- oswintbl.c oswinxf.c readme.txt utclib.c"
+stripfiles="Makefile README accygwin.h acdragonfly.h acdragonflyex.h \
+ acefi.h achaiku.h acintel.h aclinux.h aclinuxex.h acmacosx.h \
+ acmsvc.h acnetbsd.h acos2.h acwin.h acwin64.h new_table.txt \
+ osbsdtbl.c osefitbl.c osefixf.c osfreebsdtbl.c oslinuxtbl.c \
+ osunixdir.c osunixmap.c oswindir.c oswintbl.c oswinxf.c \
+ readme.txt utclib.c"
# include files to canonify
src_headers="acapps.h acbuffer.h accommon.h acconfig.h acdebug.h \
diff --git a/sys/contrib/dev/acpica/changes.txt b/sys/contrib/dev/acpica/changes.txt
index 0469af0..ad9d23c 100644
--- a/sys/contrib/dev/acpica/changes.txt
+++ b/sys/contrib/dev/acpica/changes.txt
@@ -1,7 +1,84 @@
----------------------------------------
-04 February 2015. Summary of changes for version 20150204:
+10 April 2015. Summary of changes for version 20150410:
-This release is available at https://acpica.org/downloads
+Reverted a change introduced in version 20150408 that caused
+a regression in the disassembler where incorrect operator
+symbols could be emitted.
+
+----------------------------------------
+08 April 2015. Summary of changes for version 20150408:
+
+
+1) ACPICA kernel-resident subsystem:
+
+Permanently set the return value for the _REV predefined name. It now
+returns 2 (was 5). This matches other ACPI implementations. _REV will be
+deprecated in the future, and is now defined to be 1 for ACPI 1.0, and 2
+for ACPI 2.0 and later. It should never be used to differentiate or
+identify operating systems.
+
+Added the "Windows 2015" string to the _OSI support. ACPICA will now
+return TRUE to a query with this string.
+
+Fixed several issues with the local version of the printf function.
+
+Added the C99 compiler option (-std=c99) to the Unix makefiles.
+
+ Current Release:
+ Non-Debug Version: 99.9K Code, 27.4K Data, 127.3K Total
+ Debug Version: 195.2K Code, 80.7K Data, 275.9K Total
+ Previous Release:
+ Non-Debug Version: 98.8K Code, 27.3K Data, 126.1K Total
+ Debug Version: 192.1K Code, 79.8K Data, 271.9K Total
+
+
+2) iASL Compiler/Disassembler and Tools:
+
+iASL: Implemented an enhancement to the constant folding feature to
+transform the parse tree to a simple Store operation whenever possible:
+ Add (2, 3, X) ==> is converted to: Store (5, X)
+ X = 2 + 3 ==> is converted to: Store (5, X)
+
+Updated support for the SLIC table (Software Licensing Description Table)
+in both the Data Table compiler and the disassembler. The SLIC table
+support now conforms to "Microsoft Software Licensing Tables (SLIC and
+MSDM). November 29, 2011. Copyright 2011 Microsoft". Note: Any SLIC data
+following the ACPI header is now defined to be "Proprietary Data", and as
+such, can only be entered or displayed as a hex data block.
+
+Implemented full support for the MSDM table as described in the document
+above. Note: The format of MSDM is similar to SLIC. Any MSDM data
+following the ACPI header is defined to be "Proprietary Data", and can
+only be entered or displayed as a hex data block.
+
+Implemented the -Pn option for the iASL Table Compiler (was only
+implemented for the ASL compiler). This option disables the iASL
+preprocessor.
+
+Disassembler: For disassembly of Data Tables, added a comment field
+around the Ascii equivalent data that is emitted as part of the "Raw
+Table Data" block. This prevents the iASL Preprocessor from possible
+confusion if/when the table is compiled.
+
+Disassembler: Added an option (-df) to force the disassembler to assume
+that the table being disassembled contains valid AML. This feature is
+useful for disassembling AML files that contain ACPI signatures other
+than DSDT or SSDT (such as OEMx or other signatures).
+
+Changes for the EFI version of the tools:
+1) Fixed a build error/issue
+2) Fixed a cast warning
+
+iASL: Fixed a path issue with the __FILE__ operator by making the
+directory prefix optional within the internal SplitInputFilename
+function.
+
+Debugger: Removed some unused global variables.
+
+Tests: Updated the makefile for proper generation of the AAPITS suite.
+
+----------------------------------------
+04 February 2015. Summary of changes for version 20150204:
ACPICA kernel-resident subsystem:
@@ -14,24 +91,26 @@ Events: Introduce ACPI_GPE_DISPATCH_RAW_HANDLER to fix GPE storm issues.
A raw gpe handling mechanism was created to allow better handling of GPE
storms that aren't easily managed by the normal handler. The raw handler
allows disabling/renabling of the the GPE so that interrupt storms can be
-avoided in cases where events cannot be timely serviced. In this scenario,
-handlers should use the AcpiSetGpe() API to disable/enable the GPE. This API
-will leave the reference counts undisturbed, thereby preventing unintentional
-clearing of the GPE when the intent in only to temporarily disable it. Raw
-handlers allow enabling and disabling of a GPE by removing GPE register
-locking. As such, raw handlers much provide their own locks while using
-GPE API's to protect access to GPE data structures.
+avoided in cases where events cannot be timely serviced. In this
+scenario, handlers should use the AcpiSetGpe() API to disable/enable the
+GPE. This API will leave the reference counts undisturbed, thereby
+preventing unintentional clearing of the GPE when the intent in only to
+temporarily disable it. Raw handlers allow enabling and disabling of a
+GPE by removing GPE register locking. As such, raw handlers much provide
+their own locks while using GPE API's to protect access to GPE data
+structures.
Lv Zheng
Events: Always modify GPE registers under the GPE lock.
Applies GPE lock around AcpiFinishGpe() to protect access to GPE register
values. Reported as bug by joe.liu@apple.com.
-Unix makefiles: Separate option to disable optimizations and _FORTIFY_SOURCE.
-This change removes the _FORTIFY_SOURCE flag from the NOOPT disable option and
-creates a separate flag (NOFORTIFY) for this purpose. Some toolchains may
-define _FORTIFY_SOURCE which leads redefined errors when building ACPICA. This
-allows disabling the option without also having to disable optimazations.
+Unix makefiles: Separate option to disable optimizations and
+_FORTIFY_SOURCE. This change removes the _FORTIFY_SOURCE flag from the
+NOOPT disable option and creates a separate flag (NOFORTIFY) for this
+purpose. Some toolchains may define _FORTIFY_SOURCE which leads redefined
+errors when building ACPICA. This allows disabling the option without
+also having to disable optimazations.
David Box
Current Release:
diff --git a/sys/contrib/dev/acpica/common/adfile.c b/sys/contrib/dev/acpica/common/adfile.c
index edf4513..2bfe7ed 100644
--- a/sys/contrib/dev/acpica/common/adfile.c
+++ b/sys/contrib/dev/acpica/common/adfile.c
@@ -295,7 +295,10 @@ FlSplitInputPathname (
char *Filename;
- *OutDirectoryPath = NULL;
+ if (OutDirectoryPath)
+ {
+ *OutDirectoryPath = NULL;
+ }
if (!InputPath)
{
@@ -340,7 +343,10 @@ FlSplitInputPathname (
return (AE_NO_MEMORY);
}
- *OutDirectoryPath = DirectoryPath;
+ if (OutDirectoryPath)
+ {
+ *OutDirectoryPath = DirectoryPath;
+ }
if (OutFilename)
{
diff --git a/sys/contrib/dev/acpica/common/adisasm.c b/sys/contrib/dev/acpica/common/adisasm.c
index 2212450..658b5be 100644
--- a/sys/contrib/dev/acpica/common/adisasm.c
+++ b/sys/contrib/dev/acpica/common/adisasm.c
@@ -64,6 +64,11 @@ AdCreateTableHeader (
char *Filename,
ACPI_TABLE_HEADER *Table);
+static ACPI_STATUS
+AdStoreTable (
+ ACPI_TABLE_HEADER *Table,
+ UINT32 *TableIndex);
+
/* Stubs for ASL compiler */
#ifndef ACPI_ASL_COMPILER
@@ -298,7 +303,7 @@ AdAmlDisassemble (
return (Status);
}
- if (!AcpiGbl_DbOpt_disasm)
+ if (!AcpiGbl_DbOpt_Disasm)
{
return (AE_OK);
}
@@ -337,7 +342,6 @@ AdAmlDisassemble (
{
fprintf (stderr, "Could not open output file %s\n", DisasmFilename);
Status = AE_ERROR;
- ACPI_FREE (DisasmFilename);
goto Cleanup;
}
@@ -346,9 +350,11 @@ AdAmlDisassemble (
*OutFilename = DisasmFilename;
- if (!AcpiUtIsAmlTable (Table))
+ /* ForceAmlDisassembly means to assume the table contains valid AML */
+
+ if (!AcpiGbl_ForceAmlDisassembly && !AcpiUtIsAmlTable (Table))
{
- AdDisassemblerHeader (Filename);
+ AdDisassemblerHeader (Filename, ACPI_IS_DATA_TABLE);
AcpiOsPrintf (" * ACPI Data Table [%4.4s]\n *\n",
Table->Signature);
AcpiOsPrintf (" * Format: [HexOffset DecimalOffset ByteLength] "
@@ -486,7 +492,7 @@ AdAmlDisassemble (
/* Optional displays */
- if (AcpiGbl_DbOpt_disasm)
+ if (AcpiGbl_DbOpt_Disasm)
{
/* This is the real disassembly */
@@ -515,7 +521,7 @@ AdAmlDisassemble (
Cleanup:
- if (Table && !AcpiUtIsAmlTable (Table))
+ if (Table && !AcpiGbl_ForceAmlDisassembly &&!AcpiUtIsAmlTable (Table))
{
ACPI_FREE (Table);
}
@@ -543,6 +549,7 @@ Cleanup:
* FUNCTION: AdDisassemblerHeader
*
* PARAMETERS: Filename - Input file for the table
+ * TableType - Either AML or DataTable
*
* RETURN: None
*
@@ -553,7 +560,8 @@ Cleanup:
void
AdDisassemblerHeader (
- char *Filename)
+ char *Filename,
+ UINT8 TableType)
{
time_t Timer;
@@ -565,17 +573,20 @@ AdDisassemblerHeader (
AcpiOsPrintf ("/*\n");
AcpiOsPrintf (ACPI_COMMON_HEADER (AML_DISASSEMBLER_NAME, " * "));
- if (AcpiGbl_CstyleDisassembly)
+ if (TableType == ACPI_IS_AML_TABLE)
{
- AcpiOsPrintf (
- " * Disassembling to symbolic ASL+ operators\n"
- " *\n");
- }
- else
- {
- AcpiOsPrintf (
- " * Disassembling to non-symbolic legacy ASL operators\n"
- " *\n");
+ if (AcpiGbl_CstyleDisassembly)
+ {
+ AcpiOsPrintf (
+ " * Disassembling to symbolic ASL+ operators\n"
+ " *\n");
+ }
+ else
+ {
+ AcpiOsPrintf (
+ " * Disassembling to non-symbolic legacy ASL operators\n"
+ " *\n");
+ }
}
AcpiOsPrintf (" * Disassembly of %s, %s", Filename, ctime (&Timer));
@@ -609,7 +620,7 @@ AdCreateTableHeader (
/*
* Print file header and dump original table header
*/
- AdDisassemblerHeader (Filename);
+ AdDisassemblerHeader (Filename, ACPI_IS_AML_TABLE);
AcpiOsPrintf (" * Original Table Header:\n");
AcpiOsPrintf (" * Signature \"%4.4s\"\n", Table->Signature);
@@ -717,7 +728,7 @@ AdDisplayTables (
return (AE_NOT_EXIST);
}
- if (!AcpiGbl_DbOpt_verbose)
+ if (!AcpiGbl_DbOpt_Verbose)
{
AdCreateTableHeader (Filename, Table);
}
@@ -725,7 +736,7 @@ AdDisplayTables (
AcpiDmDisassemble (NULL, AcpiGbl_ParseOpRoot, ACPI_UINT32_MAX);
MpEmitMappingInfo ();
- if (AcpiGbl_DbOpt_verbose)
+ if (AcpiGbl_DbOpt_Verbose)
{
AcpiOsPrintf ("\n\nTable Header:\n");
AcpiUtDebugDumpBuffer ((UINT8 *) Table, sizeof (ACPI_TABLE_HEADER),
@@ -740,6 +751,43 @@ AdDisplayTables (
}
+/*******************************************************************************
+ *
+ * FUNCTION: AdStoreTable
+ *
+ * PARAMETERS: Table - Table header
+ * TableIndex - Where the table index is returned
+ *
+ * RETURN: Status and table index.
+ *
+ * DESCRIPTION: Add an ACPI table to the global table list
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AdStoreTable (
+ ACPI_TABLE_HEADER *Table,
+ UINT32 *TableIndex)
+{
+ ACPI_STATUS Status;
+ ACPI_TABLE_DESC *TableDesc;
+
+
+ Status = AcpiTbGetNextTableDescriptor (TableIndex, &TableDesc);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+
+ /* Initialize added table */
+
+ AcpiTbInitTableDescriptor (TableDesc, ACPI_PTR_TO_PHYSADDR (Table),
+ ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL, Table);
+ AcpiTbValidateTable (TableDesc);
+ return (AE_OK);
+}
+
+
/******************************************************************************
*
* FUNCTION: AdGetLocalTables
@@ -777,8 +825,7 @@ AdGetLocalTables (
/* Store DSDT in the Table Manager */
- Status = AcpiTbStoreTable (0, NewTable, NewTable->Length,
- 0, &TableIndex);
+ Status = AdStoreTable (NewTable, &TableIndex);
if (ACPI_FAILURE (Status))
{
fprintf (stderr, "Could not store DSDT\n");
@@ -871,9 +918,7 @@ AdParseTable (
if (LoadTable)
{
- Status = AcpiTbStoreTable ((ACPI_PHYSICAL_ADDRESS) Table, Table,
- Table->Length, ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL,
- &TableIndex);
+ Status = AdStoreTable (Table, &TableIndex);
if (ACPI_FAILURE (Status))
{
return (Status);
diff --git a/sys/contrib/dev/acpica/common/dmtable.c b/sys/contrib/dev/acpica/common/dmtable.c
index d33d86f..b1875f8 100644
--- a/sys/contrib/dev/acpica/common/dmtable.c
+++ b/sys/contrib/dev/acpica/common/dmtable.c
@@ -241,13 +241,6 @@ static const char *AcpiDmPmttSubnames[] =
"Unknown SubTable Type" /* Reserved */
};
-static const char *AcpiDmSlicSubnames[] =
-{
- "Public Key Structure",
- "Windows Marker Structure",
- "Unknown SubTable Type" /* Reserved */
-};
-
static const char *AcpiDmSratSubnames[] =
{
"Processor Local APIC/SAPIC Affinity",
@@ -339,6 +332,7 @@ ACPI_DMTABLE_DATA AcpiDmTableData[] =
{ACPI_SIG_MCHI, AcpiDmTableInfoMchi, NULL, NULL, TemplateMchi, "Management Controller Host Interface table"},
{ACPI_SIG_MPST, AcpiDmTableInfoMpst, AcpiDmDumpMpst, DtCompileMpst, TemplateMpst, "Memory Power State Table"},
{ACPI_SIG_MSCT, NULL, AcpiDmDumpMsct, DtCompileMsct, TemplateMsct, "Maximum System Characteristics Table"},
+ {ACPI_SIG_MSDM, NULL, AcpiDmDumpSlic, DtCompileSlic, TemplateMsdm, "Microsoft Data Management table"},
{ACPI_SIG_MTMR, NULL, AcpiDmDumpMtmr, DtCompileMtmr, TemplateMtmr, "MID Timer Table"},
{ACPI_SIG_PCCT, AcpiDmTableInfoPcct, AcpiDmDumpPcct, DtCompilePcct, TemplatePcct, "Platform Communications Channel Table"},
{ACPI_SIG_PMTT, NULL, AcpiDmDumpPmtt, DtCompilePmtt, TemplatePmtt, "Platform Memory Topology Table"},
@@ -515,10 +509,20 @@ AcpiDmDumpDataTable (
}
else
{
- AcpiOsPrintf ("\n**** Unknown ACPI table type [%4.4s]\n\n",
+ AcpiOsPrintf ("\n**** Unknown ACPI table signature [%4.4s]\n\n",
Table->Signature);
- fprintf (stderr, "Unknown ACPI table signature [%4.4s], decoding header only\n",
+
+ fprintf (stderr, "Unknown ACPI table signature [%4.4s], ",
Table->Signature);
+
+ if (!AcpiGbl_ForceAmlDisassembly)
+ {
+ fprintf (stderr, "decoding ACPI table header only\n");
+ }
+ else
+ {
+ fprintf (stderr, "assuming table contains valid AML code\n");
+ }
}
}
else if (TableData->TableHandler)
@@ -686,6 +690,7 @@ AcpiDmDumpTable (
UINT32 ByteLength;
UINT8 Temp8;
UINT16 Temp16;
+ UINT32 Temp32;
UINT64 Value;
ACPI_DMTABLE_DATA *TableData;
const char *Name;
@@ -715,7 +720,8 @@ AcpiDmDumpTable (
if ((CurrentOffset >= TableLength) ||
(SubtableLength && (Info->Offset >= SubtableLength)))
{
- AcpiOsPrintf ("**** ACPI table terminates in the middle of a data structure!\n");
+ AcpiOsPrintf (
+ "**** ACPI table terminates in the middle of a data structure! (dump table)\n");
return (AE_BAD_DATA);
}
@@ -760,7 +766,6 @@ AcpiDmDumpTable (
case ACPI_DMT_UINT32:
case ACPI_DMT_NAME4:
case ACPI_DMT_SIG:
- case ACPI_DMT_SLIC:
case ACPI_DMT_LPIT:
ByteLength = 4;
@@ -805,6 +810,12 @@ AcpiDmDumpTable (
ByteLength = 128;
break;
+ case ACPI_DMT_BUFFER:
+ case ACPI_DMT_RAW_BUFFER:
+
+ ByteLength = SubtableLength;
+ break;
+
case ACPI_DMT_STRING:
ByteLength = ACPI_STRLEN (ACPI_CAST_PTR (char, Target)) + 1;
@@ -838,7 +849,8 @@ AcpiDmDumpTable (
if (CurrentOffset + ByteLength > TableLength)
{
- AcpiOsPrintf ("**** ACPI table terminates in the middle of a data structure!\n");
+ AcpiOsPrintf (
+ "**** ACPI table terminates in the middle of a data structure!\n");
return (AE_BAD_DATA);
}
@@ -1005,8 +1017,9 @@ AcpiDmDumpTable (
AcpiOsPrintf ("%2.2X", *Target);
Temp8 = AcpiDmGenerateChecksum (Table,
- ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Length,
- ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum);
+ ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Length,
+ ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum);
+
if (Temp8 != ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum)
{
AcpiOsPrintf (
@@ -1032,7 +1045,7 @@ AcpiDmDumpTable (
Temp8 = ACPI_GAS_WIDTH_RESERVED;
}
- AcpiOsPrintf (UINT8_FORMAT, Temp8, AcpiDmGasAccessWidth[Temp8]);
+ AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmGasAccessWidth[Temp8]);
break;
case ACPI_DMT_GAS:
@@ -1069,7 +1082,8 @@ AcpiDmDumpTable (
Temp16 = ACPI_DMAR_TYPE_RESERVED;
}
- AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target), AcpiDmDmarSubnames[Temp16]);
+ AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target),
+ AcpiDmDmarSubnames[Temp16]);
break;
case ACPI_DMT_DMAR_SCOPE:
@@ -1082,7 +1096,8 @@ AcpiDmDumpTable (
Temp8 = ACPI_DMAR_SCOPE_TYPE_RESERVED;
}
- AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmDmarScope[Temp8]);
+ AcpiOsPrintf (UINT8_FORMAT, *Target,
+ AcpiDmDmarScope[Temp8]);
break;
case ACPI_DMT_EINJACT:
@@ -1095,7 +1110,8 @@ AcpiDmDumpTable (
Temp8 = ACPI_EINJ_ACTION_RESERVED;
}
- AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmEinjActions[Temp8]);
+ AcpiOsPrintf (UINT8_FORMAT, *Target,
+ AcpiDmEinjActions[Temp8]);
break;
case ACPI_DMT_EINJINST:
@@ -1108,7 +1124,8 @@ AcpiDmDumpTable (
Temp8 = ACPI_EINJ_INSTRUCTION_RESERVED;
}
- AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmEinjInstructions[Temp8]);
+ AcpiOsPrintf (UINT8_FORMAT, *Target,
+ AcpiDmEinjInstructions[Temp8]);
break;
case ACPI_DMT_ERSTACT:
@@ -1121,7 +1138,8 @@ AcpiDmDumpTable (
Temp8 = ACPI_ERST_ACTION_RESERVED;
}
- AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmErstActions[Temp8]);
+ AcpiOsPrintf (UINT8_FORMAT, *Target,
+ AcpiDmErstActions[Temp8]);
break;
case ACPI_DMT_ERSTINST:
@@ -1134,7 +1152,8 @@ AcpiDmDumpTable (
Temp8 = ACPI_ERST_INSTRUCTION_RESERVED;
}
- AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmErstInstructions[Temp8]);
+ AcpiOsPrintf (UINT8_FORMAT, *Target,
+ AcpiDmErstInstructions[Temp8]);
break;
case ACPI_DMT_GTDT:
@@ -1147,7 +1166,8 @@ AcpiDmDumpTable (
Temp8 = ACPI_GTDT_TYPE_RESERVED;
}
- AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmGtdtSubnames[Temp8]);
+ AcpiOsPrintf (UINT8_FORMAT, *Target,
+ AcpiDmGtdtSubnames[Temp8]);
break;
case ACPI_DMT_HEST:
@@ -1160,12 +1180,15 @@ AcpiDmDumpTable (
Temp16 = ACPI_HEST_TYPE_RESERVED;
}
- AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target), AcpiDmHestSubnames[Temp16]);
+ AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target),
+ AcpiDmHestSubnames[Temp16]);
break;
case ACPI_DMT_HESTNTFY:
- AcpiOsPrintf (STRING_FORMAT, "Hardware Error Notification Structure");
+ AcpiOsPrintf (STRING_FORMAT,
+ "Hardware Error Notification Structure");
+
AcpiDmDumpTable (TableLength, CurrentOffset, Target,
sizeof (ACPI_HEST_NOTIFY), AcpiDmTableInfoHestNotify);
AcpiOsPrintf ("\n");
@@ -1182,7 +1205,8 @@ AcpiDmDumpTable (
Temp8 = ACPI_HEST_NOTIFY_RESERVED;
}
- AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmHestNotifySubnames[Temp8]);
+ AcpiOsPrintf (UINT8_FORMAT, *Target,
+ AcpiDmHestNotifySubnames[Temp8]);
break;
case ACPI_DMT_MADT:
@@ -1195,7 +1219,8 @@ AcpiDmDumpTable (
Temp8 = ACPI_MADT_TYPE_RESERVED;
}
- AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmMadtSubnames[Temp8]);
+ AcpiOsPrintf (UINT8_FORMAT, *Target,
+ AcpiDmMadtSubnames[Temp8]);
break;
case ACPI_DMT_PCCT:
@@ -1208,7 +1233,8 @@ AcpiDmDumpTable (
Temp8 = ACPI_PCCT_TYPE_RESERVED;
}
- AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmPcctSubnames[Temp8]);
+ AcpiOsPrintf (UINT8_FORMAT, *Target,
+ AcpiDmPcctSubnames[Temp8]);
break;
case ACPI_DMT_PMTT:
@@ -1221,20 +1247,20 @@ AcpiDmDumpTable (
Temp8 = ACPI_PMTT_TYPE_RESERVED;
}
- AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmPmttSubnames[Temp8]);
+ AcpiOsPrintf (UINT8_FORMAT, *Target,
+ AcpiDmPmttSubnames[Temp8]);
break;
- case ACPI_DMT_SLIC:
-
- /* SLIC subtable types */
-
- Temp8 = *Target;
- if (Temp8 > ACPI_SLIC_TYPE_RESERVED)
- {
- Temp8 = ACPI_SLIC_TYPE_RESERVED;
- }
+ case ACPI_DMT_RAW_BUFFER:
+ /*
+ * Currently only used for SLIC table
+ */
+ AcpiOsPrintf ("/* Proprietary data structure */ ");
- AcpiOsPrintf (UINT32_FORMAT, *Target, AcpiDmSlicSubnames[Temp8]);
+ AcpiDmDumpBuffer (Table, sizeof (ACPI_TABLE_HEADER),
+ ByteLength, sizeof (ACPI_TABLE_HEADER),
+ "Licensing Data", TRUE);
+ AcpiOsPrintf ("\n");
break;
case ACPI_DMT_SRAT:
@@ -1247,7 +1273,8 @@ AcpiDmDumpTable (
Temp8 = ACPI_SRAT_TYPE_RESERVED;
}
- AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmSratSubnames[Temp8]);
+ AcpiOsPrintf (UINT8_FORMAT, *Target,
+ AcpiDmSratSubnames[Temp8]);
break;
case ACPI_DMT_FADTPM:
@@ -1260,7 +1287,8 @@ AcpiDmDumpTable (
Temp8 = ACPI_FADT_PM_RESERVED;
}
- AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmFadtProfiles[Temp8]);
+ AcpiOsPrintf (UINT8_FORMAT, *Target,
+ AcpiDmFadtProfiles[Temp8]);
break;
case ACPI_DMT_IVRS:
@@ -1295,26 +1323,14 @@ AcpiDmDumpTable (
/* LPIT subtable types */
- Temp8 = *Target;
- switch (Temp8)
+ Temp32 = ACPI_GET32 (Target);
+ if (Temp32 > ACPI_LPIT_TYPE_RESERVED)
{
- case ACPI_LPIT_TYPE_NATIVE_CSTATE:
-
- Name = AcpiDmLpitSubnames[0];
- break;
-
- case ACPI_LPIT_TYPE_SIMPLE_IO:
-
- Name = AcpiDmLpitSubnames[1];
- break;
-
- default:
-
- Name = AcpiDmLpitSubnames[2];
- break;
+ Temp32 = ACPI_LPIT_TYPE_RESERVED;
}
- AcpiOsPrintf (UINT32_FORMAT, *Target, Name);
+ AcpiOsPrintf (UINT32_FORMAT, ACPI_GET32 (Target),
+ AcpiDmLpitSubnames[Temp32]);
break;
case ACPI_DMT_EXIT:
@@ -1331,8 +1347,10 @@ AcpiDmDumpTable (
if (TableOffset && !SubtableLength)
{
- /* If this table is not the main table, subtable must have valid length */
-
+ /*
+ * If this table is not the main table, the subtable must have a
+ * valid length
+ */
AcpiOsPrintf ("Invalid zero length subtable\n");
return (AE_BAD_DATA);
}
diff --git a/sys/contrib/dev/acpica/common/dmtbdump.c b/sys/contrib/dev/acpica/common/dmtbdump.c
index 399afa5..8a44328 100644
--- a/sys/contrib/dev/acpica/common/dmtbdump.c
+++ b/sys/contrib/dev/acpica/common/dmtbdump.c
@@ -59,14 +59,6 @@ AcpiDmValidateFadtLength (
UINT32 Revision,
UINT32 Length);
-static void
-AcpiDmDumpBuffer (
- void *Table,
- UINT32 BufferOffset,
- UINT32 Length,
- UINT32 AbsoluteOffset,
- char *Header);
-
/*******************************************************************************
*
@@ -78,6 +70,7 @@ AcpiDmDumpBuffer (
* AbsoluteOffset - Offset of buffer in the main ACPI table
* Header - Name of the buffer field (printed on the
* first line only.)
+ * MultiLine - TRUE if a large, multi-line buffer
*
* RETURN: None
*
@@ -86,13 +79,14 @@ AcpiDmDumpBuffer (
*
******************************************************************************/
-static void
+void
AcpiDmDumpBuffer (
void *Table,
UINT32 BufferOffset,
UINT32 Length,
UINT32 AbsoluteOffset,
- char *Header)
+ char *Header,
+ BOOLEAN MultiLine)
{
UINT8 *Buffer;
UINT32 i;
@@ -110,10 +104,19 @@ AcpiDmDumpBuffer (
{
if (!(i % 16))
{
- AcpiOsPrintf ("\n");
- AcpiDmLineHeader (AbsoluteOffset,
- ((Length - i) > 16) ? 16 : (Length - i), Header);
- Header = NULL;
+ if (MultiLine)
+ {
+ /* Insert a backslash - line continuation character */
+
+ AcpiOsPrintf ("\\\n ");
+ }
+ else
+ {
+ AcpiOsPrintf ("\n");
+ AcpiDmLineHeader (AbsoluteOffset,
+ ((Length - i) > 16) ? 16 : (Length - i), Header);
+ Header = NULL;
+ }
}
AcpiOsPrintf ("%.02X ", *Buffer);
@@ -526,7 +529,7 @@ AcpiDmDumpAsf (
DataOffset++;
if (DataOffset > Table->Length)
{
- AcpiOsPrintf ("**** ACPI table terminates in the middle of a data structure!\n");
+ AcpiOsPrintf ("**** ACPI table terminates in the middle of a data structure! (ASF! table)\n");
return;
}
}
@@ -692,7 +695,7 @@ AcpiDmDumpCsrt (
InfoLength = SubSubTable->Length - SubSubOffset;
AcpiDmDumpBuffer (SubSubTable, SubSubOffset, InfoLength,
- Offset + SubOffset + SubSubOffset, "ResourceInfo");
+ Offset + SubOffset + SubSubOffset, "ResourceInfo", FALSE);
SubSubOffset += InfoLength;
/* Point to next sub-subtable */
@@ -812,7 +815,7 @@ AcpiDmDumpDbg2 (
if (SubTable->OemDataOffset)
{
AcpiDmDumpBuffer (SubTable, SubTable->OemDataOffset, SubTable->OemDataLength,
- Offset + SubTable->OemDataOffset, "OEM Data");
+ Offset + SubTable->OemDataOffset, "OEM Data", FALSE);
}
/* Point to next subtable */
@@ -2535,67 +2538,8 @@ void
AcpiDmDumpSlic (
ACPI_TABLE_HEADER *Table)
{
- ACPI_STATUS Status;
- UINT32 Offset = sizeof (ACPI_TABLE_SLIC);
- ACPI_SLIC_HEADER *SubTable;
- ACPI_DMTABLE_INFO *InfoTable;
-
-
- /* There is no main SLIC table, only subtables */
-
- SubTable = ACPI_ADD_PTR (ACPI_SLIC_HEADER, Table, Offset);
- while (Offset < Table->Length)
- {
- /* Common subtable header */
-
- AcpiOsPrintf ("\n");
- Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
- SubTable->Length, AcpiDmTableInfoSlicHdr);
- if (ACPI_FAILURE (Status))
- {
- return;
- }
-
- switch (SubTable->Type)
- {
- case ACPI_SLIC_TYPE_PUBLIC_KEY:
-
- InfoTable = AcpiDmTableInfoSlic0;
- break;
-
- case ACPI_SLIC_TYPE_WINDOWS_MARKER:
-
- InfoTable = AcpiDmTableInfoSlic1;
- break;
-
- default:
-
- AcpiOsPrintf ("\n**** Unknown SLIC subtable type 0x%X\n", SubTable->Type);
-
- /* Attempt to continue */
-
- if (!SubTable->Length)
- {
- AcpiOsPrintf ("Invalid zero length subtable\n");
- return;
- }
- goto NextSubTable;
- }
-
- AcpiOsPrintf ("\n");
- Status = AcpiDmDumpTable (Table->Length, Offset, SubTable,
- SubTable->Length, InfoTable);
- if (ACPI_FAILURE (Status))
- {
- return;
- }
-
-NextSubTable:
- /* Point to next subtable */
-
- Offset += SubTable->Length;
- SubTable = ACPI_ADD_PTR (ACPI_SLIC_HEADER, SubTable, SubTable->Length);
- }
+ AcpiDmDumpTable (Table->Length, sizeof (ACPI_TABLE_HEADER), Table,
+ Table->Length - sizeof (*Table), AcpiDmTableInfoSlic);
}
diff --git a/sys/contrib/dev/acpica/common/dmtbinfo.c b/sys/contrib/dev/acpica/common/dmtbinfo.c
index 6a71c8a..4ce802b 100644
--- a/sys/contrib/dev/acpica/common/dmtbinfo.c
+++ b/sys/contrib/dev/acpica/common/dmtbinfo.c
@@ -200,9 +200,7 @@
#define ACPI_S3PTH_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_S3PT_HEADER,f)
#define ACPI_S3PT0_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_S3PT_RESUME,f)
#define ACPI_S3PT1_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_S3PT_SUSPEND,f)
-#define ACPI_SLICH_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_SLIC_HEADER,f)
-#define ACPI_SLIC0_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_SLIC_KEY,f)
-#define ACPI_SLIC1_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_SLIC_MARKER,f)
+#define ACPI_SLIC_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_TABLE_SLIC,f)
#define ACPI_SRATH_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_SUBTABLE_HEADER,f)
#define ACPI_SRAT0_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_SRAT_CPU_AFFINITY,f)
#define ACPI_SRAT1_OFFSET(f) (UINT16) ACPI_OFFSET (ACPI_SRAT_MEM_AFFINITY,f)
@@ -2043,42 +2041,16 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoSbst[] =
/*******************************************************************************
*
- * SLIC - Software Licensing Description Table. There is no common table, just
- * the standard ACPI header and then subtables.
+ * SLIC - Software Licensing Description Table. This table contains the standard
+ * ACPI header followed by proprietary data structures
*
******************************************************************************/
-/* Common Subtable header (one per Subtable) */
-
-ACPI_DMTABLE_INFO AcpiDmTableInfoSlicHdr[] =
-{
- {ACPI_DMT_SLIC, ACPI_SLICH_OFFSET (Type), "Subtable Type", 0},
- {ACPI_DMT_UINT32, ACPI_SLICH_OFFSET (Length), "Length", DT_LENGTH},
- ACPI_DMT_TERMINATOR
-};
-
-ACPI_DMTABLE_INFO AcpiDmTableInfoSlic0[] =
-{
- {ACPI_DMT_UINT8, ACPI_SLIC0_OFFSET (KeyType), "Key Type", 0},
- {ACPI_DMT_UINT8, ACPI_SLIC0_OFFSET (Version), "Version", 0},
- {ACPI_DMT_UINT16, ACPI_SLIC0_OFFSET (Reserved), "Reserved", 0},
- {ACPI_DMT_UINT32, ACPI_SLIC0_OFFSET (Algorithm), "Algorithm", 0},
- {ACPI_DMT_NAME4, ACPI_SLIC0_OFFSET (Magic), "Magic", 0},
- {ACPI_DMT_UINT32, ACPI_SLIC0_OFFSET (BitLength), "BitLength", 0},
- {ACPI_DMT_UINT32, ACPI_SLIC0_OFFSET (Exponent), "Exponent", 0},
- {ACPI_DMT_BUF128, ACPI_SLIC0_OFFSET (Modulus[0]), "Modulus", 0},
- ACPI_DMT_TERMINATOR
-};
+/* Single subtable, a proprietary format, so treat it as a buffer */
-ACPI_DMTABLE_INFO AcpiDmTableInfoSlic1[] =
+ACPI_DMTABLE_INFO AcpiDmTableInfoSlic[] =
{
- {ACPI_DMT_UINT32, ACPI_SLIC1_OFFSET (Version), "Version", 0},
- {ACPI_DMT_NAME6, ACPI_SLIC1_OFFSET (OemId[0]), "Oem ID", 0},
- {ACPI_DMT_NAME8, ACPI_SLIC1_OFFSET (OemTableId[0]), "Oem Table ID", 0},
- {ACPI_DMT_NAME8, ACPI_SLIC1_OFFSET (WindowsFlag[0]), "Windows Flag", 0},
- {ACPI_DMT_UINT32, ACPI_SLIC1_OFFSET (SlicVersion), "SLIC Version", 0},
- {ACPI_DMT_BUF16, ACPI_SLIC1_OFFSET (Reserved[0]), "Reserved", 0},
- {ACPI_DMT_BUF128, ACPI_SLIC1_OFFSET (Signature[0]), "Signature", 0},
+ {ACPI_DMT_RAW_BUFFER, 0, "Software Licensing Structure", 0},
ACPI_DMT_TERMINATOR
};
@@ -2091,7 +2063,7 @@ ACPI_DMTABLE_INFO AcpiDmTableInfoSlic1[] =
ACPI_DMTABLE_INFO AcpiDmTableInfoSlit[] =
{
- {ACPI_DMT_UINT64, ACPI_SLIT_OFFSET (LocalityCount), "Localities", 0},
+ {ACPI_DMT_UINT64, ACPI_SLIT_OFFSET (LocalityCount), "Localities", 0},
ACPI_DMT_TERMINATOR
};
diff --git a/sys/contrib/dev/acpica/compiler/aslcodegen.c b/sys/contrib/dev/acpica/compiler/aslcodegen.c
index 541236a..8dd30f3 100644
--- a/sys/contrib/dev/acpica/compiler/aslcodegen.c
+++ b/sys/contrib/dev/acpica/compiler/aslcodegen.c
@@ -460,7 +460,7 @@ CgWriteTableHeader (
/* Compiler version */
- TableHeader.AslCompilerRevision = ASL_REVISION;
+ TableHeader.AslCompilerRevision = ACPI_CA_VERSION;
/* Table length. Checksum zero for now, will rewrite later */
diff --git a/sys/contrib/dev/acpica/compiler/aslcompile.c b/sys/contrib/dev/acpica/compiler/aslcompile.c
index cf37c6a..0b0ca7a 100644
--- a/sys/contrib/dev/acpica/compiler/aslcompile.c
+++ b/sys/contrib/dev/acpica/compiler/aslcompile.c
@@ -195,8 +195,16 @@ CmDoCompile (
Event = UtBeginEvent ("Constant folding via AML interpreter");
DbgPrint (ASL_DEBUG_OUTPUT,
"\nInterpreting compile-time constant expressions\n\n");
- TrWalkParseTree (RootNode, ASL_WALK_VISIT_DOWNWARD,
- OpcAmlConstantWalk, NULL, NULL);
+
+ if (Gbl_FoldConstants)
+ {
+ TrWalkParseTree (RootNode, ASL_WALK_VISIT_DOWNWARD,
+ OpcAmlConstantWalk, NULL, NULL);
+ }
+ else
+ {
+ DbgPrint (ASL_PARSE_OUTPUT, " Optional folding disabled\n");
+ }
UtEndEvent (Event);
/* Update AML opcodes if necessary, after constant folding */
diff --git a/sys/contrib/dev/acpica/compiler/aslcompiler.h b/sys/contrib/dev/acpica/compiler/aslcompiler.h
index 7fb2088..7b07295 100644
--- a/sys/contrib/dev/acpica/compiler/aslcompiler.h
+++ b/sys/contrib/dev/acpica/compiler/aslcompiler.h
@@ -686,6 +686,10 @@ TrAllocateNode (
UINT32 ParseOpcode);
void
+TrPrintNodeCompileFlags (
+ UINT32 Flags);
+
+void
TrReleaseNode (
ACPI_PARSE_OBJECT *Op);
@@ -705,6 +709,10 @@ TrCreateLeafNode (
UINT32 ParseOpcode);
ACPI_PARSE_OBJECT *
+TrCreateNullTarget (
+ void);
+
+ACPI_PARSE_OBJECT *
TrCreateAssignmentNode (
ACPI_PARSE_OBJECT *Target,
ACPI_PARSE_OBJECT *Source);
diff --git a/sys/contrib/dev/acpica/compiler/asldefine.h b/sys/contrib/dev/acpica/compiler/asldefine.h
index f639ecc..14307c1 100644
--- a/sys/contrib/dev/acpica/compiler/asldefine.h
+++ b/sys/contrib/dev/acpica/compiler/asldefine.h
@@ -48,7 +48,6 @@
/*
* Compiler versions and names
*/
-#define ASL_REVISION ACPI_CA_VERSION
#define ASL_COMPILER_NAME "ASL+ Optimizing Compiler"
#define AML_DISASSEMBLER_NAME "AML/ASL+ Disassembler"
#define ASL_INVOCATION_NAME "iasl"
diff --git a/sys/contrib/dev/acpica/compiler/aslfold.c b/sys/contrib/dev/acpica/compiler/aslfold.c
index b8038ec..26b786d 100644
--- a/sys/contrib/dev/acpica/compiler/aslfold.c
+++ b/sys/contrib/dev/acpica/compiler/aslfold.c
@@ -76,97 +76,125 @@ OpcUpdateIntegerNode (
ACPI_PARSE_OBJECT *Op,
UINT64 Value);
+static ACPI_STATUS
+TrTransformToStoreOp (
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_WALK_STATE *WalkState);
+
+static ACPI_STATUS
+TrSimpleConstantReduction (
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_WALK_STATE *WalkState);
+
+static void
+TrInstallReducedConstant (
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_OPERAND_OBJECT *ObjDesc);
+
/*******************************************************************************
*
- * FUNCTION: OpcAmlEvaluationWalk1
+ * FUNCTION: OpcAmlConstantWalk
*
* PARAMETERS: ASL_WALK_CALLBACK
*
* RETURN: Status
*
- * DESCRIPTION: Descending callback for AML execution of constant subtrees
+ * DESCRIPTION: Reduce an Op and its subtree to a constant if possible
*
******************************************************************************/
-static ACPI_STATUS
-OpcAmlEvaluationWalk1 (
+ACPI_STATUS
+OpcAmlConstantWalk (
ACPI_PARSE_OBJECT *Op,
UINT32 Level,
void *Context)
{
- ACPI_WALK_STATE *WalkState = Context;
- ACPI_STATUS Status;
- ACPI_PARSE_OBJECT *OutOp;
+ ACPI_WALK_STATE *WalkState;
+ ACPI_STATUS Status = AE_OK;
- WalkState->Op = Op;
- WalkState->Opcode = Op->Common.AmlOpcode;
- WalkState->OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
-
- /* Copy child pointer to Arg for compatibility with Interpreter */
+ if (Op->Asl.CompileFlags == 0)
+ {
+ return (AE_OK);
+ }
- if (Op->Asl.Child)
+ /*
+ * Only interested in subtrees that could possibly contain
+ * expressions that can be evaluated at this time
+ */
+ if ((!(Op->Asl.CompileFlags & NODE_COMPILE_TIME_CONST)) ||
+ (Op->Asl.CompileFlags & NODE_IS_TARGET))
{
- Op->Common.Value.Arg = Op->Asl.Child;
+ return (AE_OK);
}
- /* Call AML dispatcher */
+ /* Create a new walk state */
- Status = AcpiDsExecBeginOp (WalkState, &OutOp);
- if (ACPI_FAILURE (Status))
+ WalkState = AcpiDsCreateWalkState (0, NULL, NULL, NULL);
+ if (!WalkState)
{
- AcpiOsPrintf ("Constant interpretation failed - %s\n",
- AcpiFormatException (Status));
+ return (AE_NO_MEMORY);
}
- return (Status);
-}
+ WalkState->NextOp = NULL;
+ WalkState->Params = NULL;
+ /*
+ * Examine the entire subtree -- all nodes must be constants
+ * or type 3/4/5 opcodes
+ */
+ Status = TrWalkParseTree (Op, ASL_WALK_VISIT_DOWNWARD,
+ OpcAmlCheckForConstant, NULL, WalkState);
-/*******************************************************************************
- *
- * FUNCTION: OpcAmlEvaluationWalk2
- *
- * PARAMETERS: ASL_WALK_CALLBACK
- *
- * RETURN: Status
- *
- * DESCRIPTION: Ascending callback for AML execution of constant subtrees
- *
- ******************************************************************************/
+ /*
+ * Did we find an entire subtree that contains all constants
+ * and type 3/4/5 opcodes?
+ */
+ switch (Status)
+ {
+ case AE_OK:
-static ACPI_STATUS
-OpcAmlEvaluationWalk2 (
- ACPI_PARSE_OBJECT *Op,
- UINT32 Level,
- void *Context)
-{
- ACPI_WALK_STATE *WalkState = Context;
- ACPI_STATUS Status;
+ /* Simple case, like Add(3,4) -> 7 */
+ Status = TrSimpleConstantReduction (Op, WalkState);
+ break;
- WalkState->Op = Op;
- WalkState->Opcode = Op->Common.AmlOpcode;
- WalkState->OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
+ case AE_CTRL_RETURN_VALUE:
- /* Copy child pointer to Arg for compatibility with Interpreter */
+ /* More complex case, like Add(3,4,Local0) -> Store(7,Local0) */
- if (Op->Asl.Child)
- {
- Op->Common.Value.Arg = Op->Asl.Child;
- }
+ Status = TrTransformToStoreOp (Op, WalkState);
+ break;
- /* Call AML dispatcher */
+ case AE_TYPE:
+
+ AcpiDsDeleteWalkState (WalkState);
+ return (AE_OK);
+
+ default:
+ AcpiDsDeleteWalkState (WalkState);
+ break;
+ }
- Status = AcpiDsExecEndOp (WalkState);
if (ACPI_FAILURE (Status))
{
- AcpiOsPrintf ("Constant interpretation failed - %s\n",
- AcpiFormatException (Status));
+ DbgPrint (ASL_PARSE_OUTPUT, "Cannot resolve, %s\n",
+ AcpiFormatException (Status));
+
+ /* We could not resolve the subtree for some reason */
+
+ AslError (ASL_ERROR, ASL_MSG_CONSTANT_EVALUATION, Op,
+ (char *) AcpiFormatException (Status));
+
+ /* Set the subtree value to ZERO anyway. Eliminates further errors */
+
+ OpcUpdateIntegerNode (Op, 0);
}
- return (Status);
+ /* Abort the walk of this subtree, we are done with it */
+
+ return (AE_CTRL_DEPTH);
}
@@ -189,6 +217,7 @@ OpcAmlCheckForConstant (
void *Context)
{
ACPI_WALK_STATE *WalkState = Context;
+ ACPI_STATUS Status = AE_OK;
WalkState->Op = Op;
@@ -196,7 +225,20 @@ OpcAmlCheckForConstant (
WalkState->OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
DbgPrint (ASL_PARSE_OUTPUT, "[%.4d] Opcode: %12.12s ",
- Op->Asl.LogicalLineNumber, Op->Asl.ParseOpName);
+ Op->Asl.LogicalLineNumber, Op->Asl.ParseOpName);
+
+ /*
+ * TBD: Ignore buffer constants for now. The problem is that these
+ * constants have been transformed into RAW_DATA at this point, from
+ * the parse tree transform process which currently happens before
+ * the constant folding process. We may need to defer this transform
+ * for buffer until after the constant folding.
+ */
+ if (WalkState->Opcode == AML_BUFFER_OP)
+ {
+ Status = AE_TYPE;
+ goto CleanupAndExit;
+ }
/*
* These opcodes do not appear in the OpcodeInfo table, but
@@ -207,50 +249,32 @@ OpcAmlCheckForConstant (
(WalkState->Opcode == AML_RAW_DATA_DWORD) ||
(WalkState->Opcode == AML_RAW_DATA_QWORD))
{
- WalkState->WalkType = ACPI_WALK_CONST_OPTIONAL;
- return (AE_TYPE);
+ DbgPrint (ASL_PARSE_OUTPUT, "RAW DATA");
+ Status = AE_TYPE;
+ goto CleanupAndExit;
}
+ /* Type 3/4/5 opcodes have the AML_CONSTANT flag set */
+
if (!(WalkState->OpInfo->Flags & AML_CONSTANT))
{
- /* The opcode is not a Type 3/4/5 opcode */
+ /* Not 3/4/5 opcode, but maybe can convert to STORE */
if (Op->Asl.CompileFlags & NODE_IS_TARGET)
{
DbgPrint (ASL_PARSE_OUTPUT,
- "**** Valid Target, cannot reduce ****\n");
- }
- else
- {
- DbgPrint (ASL_PARSE_OUTPUT,
- "**** Not a Type 3/4/5 opcode ****\n");
+ "**** Valid Target, transform to Store ****\n");
+ return (AE_CTRL_RETURN_VALUE);
}
- if (WalkState->WalkType == ACPI_WALK_CONST_OPTIONAL)
- {
- /*
- * We are looking at at normal expression to see if it can be
- * reduced. It can't. No error
- */
- return (AE_TYPE);
- }
+ /* Expression cannot be reduced */
- /*
- * This is an expression that MUST reduce to a constant, and it
- * can't be reduced. This is an error
- */
- if (Op->Asl.CompileFlags & NODE_IS_TARGET)
- {
- AslError (ASL_ERROR, ASL_MSG_INVALID_TARGET, Op,
- Op->Asl.ParseOpName);
- }
- else
- {
- AslError (ASL_ERROR, ASL_MSG_INVALID_CONSTANT_OP, Op,
- Op->Asl.ParseOpName);
- }
+ DbgPrint (ASL_PARSE_OUTPUT,
+ "**** Not a Type 3/4/5 opcode (%s) ****",
+ Op->Asl.ParseOpName);
- return (AE_TYPE);
+ Status = AE_TYPE;
+ goto CleanupAndExit;
}
/* Debug output */
@@ -259,250 +283,346 @@ OpcAmlCheckForConstant (
if (Op->Asl.CompileFlags & NODE_IS_TARGET)
{
- DbgPrint (ASL_PARSE_OUTPUT, " TARGET");
+ if (Op->Asl.ParseOpcode == PARSEOP_ZERO)
+ {
+ DbgPrint (ASL_PARSE_OUTPUT, "%-16s", " NULL TARGET");
+ }
+ else
+ {
+ DbgPrint (ASL_PARSE_OUTPUT, "%-16s", " VALID TARGET");
+ }
}
if (Op->Asl.CompileFlags & NODE_IS_TERM_ARG)
{
- DbgPrint (ASL_PARSE_OUTPUT, " TERMARG");
+ DbgPrint (ASL_PARSE_OUTPUT, "%-16s", " TERMARG");
}
+CleanupAndExit:
+
+ /* Dump the node compile flags also */
+
+ TrPrintNodeCompileFlags (Op->Asl.CompileFlags);
DbgPrint (ASL_PARSE_OUTPUT, "\n");
- return (AE_OK);
+ return (Status);
}
/*******************************************************************************
*
- * FUNCTION: OpcAmlConstantWalk
+ * FUNCTION: TrSimpleConstantReduction
*
- * PARAMETERS: ASL_WALK_CALLBACK
+ * PARAMETERS: Op - Parent operator to be transformed
+ * WalkState - Current walk state
*
* RETURN: Status
*
- * DESCRIPTION: Reduce an Op and its subtree to a constant if possible
+ * DESCRIPTION: Reduce an entire AML operation to a single constant. The
+ * operation must not have a target operand.
+ *
+ * Add (32,64) --> 96
*
******************************************************************************/
-ACPI_STATUS
-OpcAmlConstantWalk (
+static ACPI_STATUS
+TrSimpleConstantReduction (
ACPI_PARSE_OBJECT *Op,
- UINT32 Level,
- void *Context)
+ ACPI_WALK_STATE *WalkState)
{
- ACPI_WALK_STATE *WalkState;
- ACPI_STATUS Status = AE_OK;
- ACPI_OPERAND_OBJECT *ObjDesc;
ACPI_PARSE_OBJECT *RootOp;
ACPI_PARSE_OBJECT *OriginalParentOp;
- UINT8 WalkType;
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_STATUS Status;
- /*
- * Only interested in subtrees that could possibly contain
- * expressions that can be evaluated at this time
- */
- if ((!(Op->Asl.CompileFlags & NODE_COMPILE_TIME_CONST)) ||
- (Op->Asl.CompileFlags & NODE_IS_TARGET))
+ DbgPrint (ASL_PARSE_OUTPUT,
+ "Simple subtree constant reduction, operator to constant\n");
+
+ /* Allocate a new temporary root for this subtree */
+
+ RootOp = TrAllocateNode (PARSEOP_INTEGER);
+ if (!RootOp)
{
- return (AE_OK);
+ return (AE_NO_MEMORY);
}
- /* Set the walk type based on the reduction used for this op */
+ RootOp->Common.AmlOpcode = AML_INT_EVAL_SUBTREE_OP;
- if (Op->Asl.CompileFlags & NODE_IS_TERM_ARG)
- {
- /* Op is a TermArg, constant folding is merely optional */
+ OriginalParentOp = Op->Common.Parent;
+ Op->Common.Parent = RootOp;
- if (!Gbl_FoldConstants)
- {
- return (AE_CTRL_DEPTH);
- }
+ /* Hand off the subtree to the AML interpreter */
- WalkType = ACPI_WALK_CONST_OPTIONAL;
- }
- else
- {
- /* Op is a DataObject, the expression MUST reduced to a constant */
+ WalkState->CallerReturnDesc = &ObjDesc;
+
+ Status = TrWalkParseTree (Op, ASL_WALK_VISIT_TWICE,
+ OpcAmlEvaluationWalk1, OpcAmlEvaluationWalk2, WalkState);
+
+ /* Restore original parse tree */
+
+ Op->Common.Parent = OriginalParentOp;
- WalkType = ACPI_WALK_CONST_REQUIRED;
+ if (ACPI_FAILURE (Status))
+ {
+ DbgPrint (ASL_PARSE_OUTPUT,
+ "Constant Subtree evaluation(1), %s\n",
+ AcpiFormatException (Status));
+ return (Status);
}
- /* Create a new walk state */
+ /* Get the final result */
- WalkState = AcpiDsCreateWalkState (0, NULL, NULL, NULL);
- if (!WalkState)
+ Status = AcpiDsResultPop (&ObjDesc, WalkState);
+ if (ACPI_FAILURE (Status))
{
- return (AE_NO_MEMORY);
+ DbgPrint (ASL_PARSE_OUTPUT,
+ "Constant Subtree evaluation(2), %s\n",
+ AcpiFormatException (Status));
+ return (Status);
}
- WalkState->NextOp = NULL;
- WalkState->Params = NULL;
- WalkState->WalkType = WalkType;
- WalkState->CallerReturnDesc = &ObjDesc;
+ TrInstallReducedConstant (Op, ObjDesc);
- /*
- * Examine the entire subtree -- all nodes must be constants
- * or type 3/4/5 opcodes
- */
- Status = TrWalkParseTree (Op, ASL_WALK_VISIT_DOWNWARD,
- OpcAmlCheckForConstant, NULL, WalkState);
+ UtSetParseOpName (Op);
+ Op->Asl.Child = NULL;
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: TrTransformToStoreOp
+ *
+ * PARAMETERS: Op - Parent operator to be transformed
+ * WalkState - Current walk state
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Transforms a single AML operation with a constant and target
+ * to a simple store operation:
+ *
+ * Add (32,64,DATA) --> Store (96,DATA)
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+TrTransformToStoreOp (
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_PARSE_OBJECT *OriginalTarget;
+ ACPI_PARSE_OBJECT *NewTarget;
+ ACPI_PARSE_OBJECT *Child1;
+ ACPI_PARSE_OBJECT *Child2;
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_PARSE_OBJECT *NewParent;
+ ACPI_PARSE_OBJECT *OriginalParent;
+ ACPI_STATUS Status;
+
+
+ DbgPrint (ASL_PARSE_OUTPUT,
+ "Reduction/Transform to StoreOp: Store(Constant, Target)\n");
+
+ /* Extract the operands */
+
+ Child1 = Op->Asl.Child;
+ Child2 = Child1->Asl.Next;
/*
- * Did we find an entire subtree that contains all constants and type 3/4/5
- * opcodes? (Only AE_OK or AE_TYPE returned from above)
+ * Special case for DIVIDE -- it has two targets. The first
+ * is for the remainder and if present, we will not attempt
+ * to reduce the expression.
*/
- if (Status == AE_TYPE)
+ if (Op->Asl.ParseOpcode == PARSEOP_DIVIDE)
{
- /* Subtree cannot be reduced to a constant */
-
- if (WalkState->WalkType == ACPI_WALK_CONST_OPTIONAL)
+ Child2 = Child2->Asl.Next;
+ if (Child2->Asl.ParseOpcode != PARSEOP_ZERO)
{
- AcpiDsDeleteWalkState (WalkState);
+ DbgPrint (ASL_PARSE_OUTPUT,
+ "Cannot reduce DIVIDE - has two targets\n\n");
return (AE_OK);
}
+ }
+
+ /*
+ * Create a NULL (zero) target so that we can use the
+ * interpreter to evaluate the expression.
+ */
+ NewTarget = TrCreateNullTarget ();
+ NewTarget->Common.AmlOpcode = AML_INT_NAMEPATH_OP;
- /* Don't descend any further, and use a default "constant" value */
+ /* Handle one-operand cases (NOT, TOBCD, etc.) */
- Status = AE_CTRL_DEPTH;
+ if (!Child2->Asl.Next)
+ {
+ Child2 = Child1;
}
- else
+
+ /* Link in new NULL target as the last operand */
+
+ OriginalTarget = Child2->Asl.Next;
+ Child2->Asl.Next = NewTarget;
+ NewTarget->Asl.Parent = OriginalTarget->Asl.Parent;
+
+ NewParent = TrAllocateNode (PARSEOP_INTEGER);
+ NewParent->Common.AmlOpcode = AML_INT_EVAL_SUBTREE_OP;
+
+ OriginalParent = Op->Common.Parent;
+ Op->Common.Parent = NewParent;
+
+ /* Hand off the subtree to the AML interpreter */
+
+ WalkState->CallerReturnDesc = &ObjDesc;
+
+ Status = TrWalkParseTree (Op, ASL_WALK_VISIT_TWICE,
+ OpcAmlEvaluationWalk1, OpcAmlEvaluationWalk2, WalkState);
+ if (ACPI_FAILURE (Status))
{
- /* Subtree can be reduced */
+ DbgPrint (ASL_PARSE_OUTPUT,
+ "Constant Subtree evaluation(3), %s\n",
+ AcpiFormatException (Status));
+ goto EvalError;
+ }
- /* Allocate a new temporary root for this subtree */
+ /* Get the final result */
- RootOp = TrAllocateNode (PARSEOP_INTEGER);
- if (!RootOp)
- {
- return (AE_NO_MEMORY);
- }
+ Status = AcpiDsResultPop (&ObjDesc, WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ DbgPrint (ASL_PARSE_OUTPUT,
+ "Constant Subtree evaluation(4), %s\n",
+ AcpiFormatException (Status));
+ goto EvalError;
+ }
- RootOp->Common.AmlOpcode = AML_INT_EVAL_SUBTREE_OP;
+ /* Folded constant is in ObjDesc, store into Child1 */
- OriginalParentOp = Op->Common.Parent;
- Op->Common.Parent = RootOp;
+ TrInstallReducedConstant (Child1, ObjDesc);
- /* Hand off the subtree to the AML interpreter */
+ /* Convert operator to STORE */
- Status = TrWalkParseTree (Op, ASL_WALK_VISIT_TWICE,
- OpcAmlEvaluationWalk1, OpcAmlEvaluationWalk2, WalkState);
- Op->Common.Parent = OriginalParentOp;
+ Op->Asl.ParseOpcode = PARSEOP_STORE;
+ Op->Asl.AmlOpcode = AML_STORE_OP;
+ UtSetParseOpName (Op);
+ Op->Common.Parent = OriginalParent;
- /* TBD: we really *should* release the RootOp node */
+ /* Truncate any subtree expressions, they have been evaluated */
- if (ACPI_SUCCESS (Status))
- {
- TotalFolds++;
+ Child1->Asl.Child = NULL;
+ Child2->Asl.Child = NULL;
- /* Get the final result */
+ /* First child is the folded constant */
- Status = AcpiDsResultPop (&ObjDesc, WalkState);
- }
+ /* Second child will be the target */
- /* Check for error from the ACPICA core */
+ Child1->Asl.Next = OriginalTarget;
+ return (AE_OK);
- if (ACPI_FAILURE (Status))
- {
- AslCoreSubsystemError (Op, Status,
- "Failure during constant evaluation", FALSE);
- }
- }
- if (ACPI_FAILURE (Status))
- {
- /* We could not resolve the subtree for some reason */
+EvalError:
- AslError (ASL_ERROR, ASL_MSG_CONSTANT_EVALUATION, Op,
- Op->Asl.ParseOpName);
+ /* Restore original links */
- /* Set the subtree value to ZERO anyway. Eliminates further errors */
+ Op->Common.Parent = OriginalParent;
+ Child2->Asl.Next = OriginalTarget;
+ return (Status);
+}
- OpcUpdateIntegerNode (Op, 0);
- }
- else
- {
- AslError (ASL_OPTIMIZATION, ASL_MSG_CONSTANT_FOLDED, Op,
- Op->Asl.ParseOpName);
-
- /*
- * Because we know we executed type 3/4/5 opcodes above, we know that
- * the result must be either an Integer, String, or Buffer.
- */
- switch (ObjDesc->Common.Type)
- {
- case ACPI_TYPE_INTEGER:
- OpcUpdateIntegerNode (Op, ObjDesc->Integer.Value);
+/*******************************************************************************
+ *
+ * FUNCTION: TrInstallReducedConstant
+ *
+ * PARAMETERS: Op - Parent operator to be transformed
+ * ObjDesc - Reduced constant to be installed
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Transform the original operator to a simple constant.
+ * Handles Integers, Strings, and Buffers.
+ *
+ ******************************************************************************/
+
+static void
+TrInstallReducedConstant (
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_OPERAND_OBJECT *ObjDesc)
+{
+ ACPI_PARSE_OBJECT *RootOp;
- DbgPrint (ASL_PARSE_OUTPUT,
- "Constant expression reduced to (%s) %8.8X%8.8X\n",
- Op->Asl.ParseOpName,
- ACPI_FORMAT_UINT64 (Op->Common.Value.Integer));
- break;
- case ACPI_TYPE_STRING:
+ TotalFolds++;
+ AslError (ASL_OPTIMIZATION, ASL_MSG_CONSTANT_FOLDED, Op,
+ Op->Asl.ParseOpName);
- Op->Asl.ParseOpcode = PARSEOP_STRING_LITERAL;
- Op->Common.AmlOpcode = AML_STRING_OP;
- Op->Asl.AmlLength = ACPI_STRLEN (ObjDesc->String.Pointer) + 1;
- Op->Common.Value.String = ObjDesc->String.Pointer;
+ /*
+ * Because we know we executed type 3/4/5 opcodes above, we know that
+ * the result must be either an Integer, String, or Buffer.
+ */
+ switch (ObjDesc->Common.Type)
+ {
+ case ACPI_TYPE_INTEGER:
- DbgPrint (ASL_PARSE_OUTPUT,
- "Constant expression reduced to (STRING) %s\n",
- Op->Common.Value.String);
+ OpcUpdateIntegerNode (Op, ObjDesc->Integer.Value);
- break;
+ DbgPrint (ASL_PARSE_OUTPUT,
+ "Constant expression reduced to (%s) %8.8X%8.8X\n\n",
+ Op->Asl.ParseOpName,
+ ACPI_FORMAT_UINT64 (Op->Common.Value.Integer));
+ break;
- case ACPI_TYPE_BUFFER:
+ case ACPI_TYPE_STRING:
- Op->Asl.ParseOpcode = PARSEOP_BUFFER;
- Op->Common.AmlOpcode = AML_BUFFER_OP;
- Op->Asl.CompileFlags = NODE_AML_PACKAGE;
- UtSetParseOpName (Op);
+ Op->Asl.ParseOpcode = PARSEOP_STRING_LITERAL;
+ Op->Common.AmlOpcode = AML_STRING_OP;
+ Op->Asl.AmlLength = ACPI_STRLEN (ObjDesc->String.Pointer) + 1;
+ Op->Common.Value.String = ObjDesc->String.Pointer;
- /* Child node is the buffer length */
+ DbgPrint (ASL_PARSE_OUTPUT,
+ "Constant expression reduced to (STRING) %s\n\n",
+ Op->Common.Value.String);
- RootOp = TrAllocateNode (PARSEOP_INTEGER);
+ break;
- RootOp->Asl.AmlOpcode = AML_DWORD_OP;
- RootOp->Asl.Value.Integer = ObjDesc->Buffer.Length;
- RootOp->Asl.Parent = Op;
+ case ACPI_TYPE_BUFFER:
- (void) OpcSetOptimalIntegerSize (RootOp);
+ Op->Asl.ParseOpcode = PARSEOP_BUFFER;
+ Op->Common.AmlOpcode = AML_BUFFER_OP;
+ Op->Asl.CompileFlags = NODE_AML_PACKAGE;
+ UtSetParseOpName (Op);
- Op->Asl.Child = RootOp;
- Op = RootOp;
- UtSetParseOpName (Op);
+ /* Child node is the buffer length */
- /* Peer to the child is the raw buffer data */
+ RootOp = TrAllocateNode (PARSEOP_INTEGER);
- RootOp = TrAllocateNode (PARSEOP_RAW_DATA);
- RootOp->Asl.AmlOpcode = AML_RAW_DATA_BUFFER;
- RootOp->Asl.AmlLength = ObjDesc->Buffer.Length;
- RootOp->Asl.Value.String = (char *) ObjDesc->Buffer.Pointer;
- RootOp->Asl.Parent = Op->Asl.Parent;
+ RootOp->Asl.AmlOpcode = AML_DWORD_OP;
+ RootOp->Asl.Value.Integer = ObjDesc->Buffer.Length;
+ RootOp->Asl.Parent = Op;
- Op->Asl.Next = RootOp;
- Op = RootOp;
+ (void) OpcSetOptimalIntegerSize (RootOp);
- DbgPrint (ASL_PARSE_OUTPUT,
- "Constant expression reduced to (BUFFER) length %X\n",
- ObjDesc->Buffer.Length);
- break;
+ Op->Asl.Child = RootOp;
+ Op = RootOp;
+ UtSetParseOpName (Op);
- default:
+ /* Peer to the child is the raw buffer data */
- printf ("Unsupported return type: %s\n",
- AcpiUtGetObjectTypeName (ObjDesc));
- break;
- }
- }
+ RootOp = TrAllocateNode (PARSEOP_RAW_DATA);
+ RootOp->Asl.AmlOpcode = AML_RAW_DATA_BUFFER;
+ RootOp->Asl.AmlLength = ObjDesc->Buffer.Length;
+ RootOp->Asl.Value.String = (char *) ObjDesc->Buffer.Pointer;
+ RootOp->Asl.Parent = Op->Asl.Parent;
- UtSetParseOpName (Op);
- Op->Asl.Child = NULL;
+ Op->Asl.Next = RootOp;
+ Op = RootOp;
- AcpiDsDeleteWalkState (WalkState);
- return (AE_CTRL_DEPTH);
+ DbgPrint (ASL_PARSE_OUTPUT,
+ "Constant expression reduced to (BUFFER) length %X\n\n",
+ ObjDesc->Buffer.Length);
+ break;
+
+ default:
+ break;
+ }
}
@@ -511,10 +631,11 @@ OpcAmlConstantWalk (
* FUNCTION: OpcUpdateIntegerNode
*
* PARAMETERS: Op - Current parse object
+ * Value - Value for the integer op
*
* RETURN: None
*
- * DESCRIPTION: Update node to the correct integer type.
+ * DESCRIPTION: Update node to the correct Integer type and value
*
******************************************************************************/
@@ -566,3 +687,98 @@ OpcUpdateIntegerNode (
Op->Asl.AmlLength = 0;
}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: OpcAmlEvaluationWalk1
+ *
+ * PARAMETERS: ASL_WALK_CALLBACK
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Descending callback for AML execution of constant subtrees
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+OpcAmlEvaluationWalk1 (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context)
+{
+ ACPI_WALK_STATE *WalkState = Context;
+ ACPI_STATUS Status;
+ ACPI_PARSE_OBJECT *OutOp;
+
+
+ WalkState->Op = Op;
+ WalkState->Opcode = Op->Common.AmlOpcode;
+ WalkState->OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
+
+ /* Copy child pointer to Arg for compatibility with Interpreter */
+
+ if (Op->Asl.Child)
+ {
+ Op->Common.Value.Arg = Op->Asl.Child;
+ }
+
+ /* Call AML dispatcher */
+
+ Status = AcpiDsExecBeginOp (WalkState, &OutOp);
+ if (ACPI_FAILURE (Status))
+ {
+ DbgPrint (ASL_PARSE_OUTPUT,
+ "%s Constant interpretation failed (1) - %s\n",
+ Op->Asl.ParseOpName, AcpiFormatException (Status));
+ }
+
+ return (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: OpcAmlEvaluationWalk2
+ *
+ * PARAMETERS: ASL_WALK_CALLBACK
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Ascending callback for AML execution of constant subtrees
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+OpcAmlEvaluationWalk2 (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context)
+{
+ ACPI_WALK_STATE *WalkState = Context;
+ ACPI_STATUS Status;
+
+
+ WalkState->Op = Op;
+ WalkState->Opcode = Op->Common.AmlOpcode;
+ WalkState->OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
+
+ /* Copy child pointer to Arg for compatibility with Interpreter */
+
+ if (Op->Asl.Child)
+ {
+ Op->Common.Value.Arg = Op->Asl.Child;
+ }
+
+ /* Call AML dispatcher */
+
+ Status = AcpiDsExecEndOp (WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ DbgPrint (ASL_PARSE_OUTPUT,
+ "%s: Constant interpretation failed (2) - %s\n",
+ Op->Asl.ParseOpName, AcpiFormatException (Status));
+ }
+
+ return (Status);
+}
diff --git a/sys/contrib/dev/acpica/compiler/asllisting.c b/sys/contrib/dev/acpica/compiler/asllisting.c
index 9c51a93..a8fe2de 100644
--- a/sys/contrib/dev/acpica/compiler/asllisting.c
+++ b/sys/contrib/dev/acpica/compiler/asllisting.c
@@ -270,7 +270,10 @@ LsTreeWriteWalk (
UtPrintFormattedName (Op->Asl.ParseOpcode, Level);
- DbgPrint (ASL_TREE_OUTPUT, " (%.4X)\n", Op->Asl.ParseOpcode);
+ DbgPrint (ASL_TREE_OUTPUT, " (%.4X) Flags %8.8X",
+ Op->Asl.ParseOpcode, Op->Asl.CompileFlags);
+ TrPrintNodeCompileFlags (Op->Asl.CompileFlags);
+ DbgPrint (ASL_TREE_OUTPUT, "\n");
return (AE_OK);
}
diff --git a/sys/contrib/dev/acpica/compiler/aslmain.c b/sys/contrib/dev/acpica/compiler/aslmain.c
index d7ba1ae..99745ad 100644
--- a/sys/contrib/dev/acpica/compiler/aslmain.c
+++ b/sys/contrib/dev/acpica/compiler/aslmain.c
@@ -187,6 +187,7 @@ Usage (
ACPI_OPTION ("-db", "Do not translate Buffers to Resource Templates");
ACPI_OPTION ("-dc <f1 f2 ...>", "Disassemble AML and immediately compile it");
ACPI_OPTION ("", " (Obtain DSDT from current system if no input file)");
+ ACPI_OPTION ("-df", "Force disassembler to assume table contains valid AML");
ACPI_OPTION ("-dl", "Emit legacy ASL code only (no C-style operators)");
ACPI_OPTION ("-e <f1 f2 ...>", "Include ACPI table(s) for external symbol resolution");
ACPI_OPTION ("-fe <file>", "Specify external symbol declaration file");
diff --git a/sys/contrib/dev/acpica/compiler/aslmap.c b/sys/contrib/dev/acpica/compiler/aslmap.c
index 3d0e327..90252cb 100644
--- a/sys/contrib/dev/acpica/compiler/aslmap.c
+++ b/sys/contrib/dev/acpica/compiler/aslmap.c
@@ -222,7 +222,7 @@ const ASL_MAPPING_ENTRY AslKeywordMapping [] =
/* EXTENDEDIO */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0),
/* EXTENDEDMEMORY */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0),
/* EXTENDEDSPACE */ OP_TABLE_ENTRY (AML_RAW_DATA_QWORD, 0, 0, ACPI_BTYPE_INTEGER),
-/* EXTERNAL */ OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP, 0, 0, 0),
+/* EXTERNAL */ OP_TABLE_ENTRY (AML_EXTERNAL_OP, 0, 0, 0),
/* FATAL */ OP_TABLE_ENTRY (AML_FATAL_OP, 0, 0, 0),
/* FIELD */ OP_TABLE_ENTRY (AML_FIELD_OP, 0, NODE_AML_PACKAGE, 0),
/* FINDSETLEFTBIT */ OP_TABLE_ENTRY (AML_FIND_SET_LEFT_BIT_OP, 0, 0, ACPI_BTYPE_INTEGER),
diff --git a/sys/contrib/dev/acpica/compiler/aslmapenter.c b/sys/contrib/dev/acpica/compiler/aslmapenter.c
index a75ff33..87ad28a 100644
--- a/sys/contrib/dev/acpica/compiler/aslmapenter.c
+++ b/sys/contrib/dev/acpica/compiler/aslmapenter.c
@@ -216,6 +216,7 @@ MpCreateGpioInfo (
ACPI_GPIO_INFO *Info;
ACPI_GPIO_INFO *NextGpio;
ACPI_GPIO_INFO *PrevGpio;
+ char *Buffer;
/*
@@ -223,8 +224,8 @@ MpCreateGpioInfo (
* sorted by both source device name and then the pin number. There is
* one block per pin.
*/
- Info = ACPI_CAST_PTR (ACPI_GPIO_INFO,
- UtStringCacheCalloc (sizeof (ACPI_GPIO_INFO)));
+ Buffer = UtStringCacheCalloc (sizeof (ACPI_GPIO_INFO));
+ Info = ACPI_CAST_PTR (ACPI_GPIO_INFO, Buffer);
NextGpio = Gbl_GpioList;
PrevGpio = NULL;
@@ -293,14 +294,15 @@ MpCreateSerialInfo (
ACPI_SERIAL_INFO *Info;
ACPI_SERIAL_INFO *NextSerial;
ACPI_SERIAL_INFO *PrevSerial;
+ char *Buffer;
/*
* Allocate a new info block and insert it into the global Serial list
* sorted by both source device name and then the address.
*/
- Info = ACPI_CAST_PTR (ACPI_SERIAL_INFO,
- UtStringCacheCalloc (sizeof (ACPI_SERIAL_INFO)));
+ Buffer = UtStringCacheCalloc (sizeof (ACPI_SERIAL_INFO));
+ Info = ACPI_CAST_PTR (ACPI_SERIAL_INFO, Buffer);
NextSerial = Gbl_SerialList;
PrevSerial = NULL;
diff --git a/sys/contrib/dev/acpica/compiler/asloptions.c b/sys/contrib/dev/acpica/compiler/asloptions.c
index 5868d98..cc20bcd 100644
--- a/sys/contrib/dev/acpica/compiler/asloptions.c
+++ b/sys/contrib/dev/acpica/compiler/asloptions.c
@@ -274,6 +274,11 @@ AslDoOptions (
break;
+ case 'f':
+
+ AcpiGbl_ForceAmlDisassembly = TRUE;
+ break;
+
case 'l': /* Use legacy ASL code (not ASL+) for disassembly */
Gbl_DoCompile = FALSE;
diff --git a/sys/contrib/dev/acpica/compiler/aslrules.y b/sys/contrib/dev/acpica/compiler/aslrules.y
index 67f0413..dbe0882 100644
--- a/sys/contrib/dev/acpica/compiler/aslrules.y
+++ b/sys/contrib/dev/acpica/compiler/aslrules.y
@@ -130,7 +130,7 @@ Expression
: PARSEOP_EXP_LOGICAL_NOT {$<n>$ = TrCreateLeafNode (PARSEOP_LNOT);}
TermArg {$$ = TrLinkChildren ($<n>2,1,$3);}
| PARSEOP_EXP_NOT {$<n>$ = TrCreateLeafNode (PARSEOP_NOT);}
- TermArg {$$ = TrLinkChildren ($<n>2,2,$3,TrCreateLeafNode (PARSEOP_ZERO));}
+ TermArg {$$ = TrLinkChildren ($<n>2,2,$3,TrCreateNullTarget ());}
| SuperName PARSEOP_EXP_INCREMENT {$<n>$ = TrCreateLeafNode (PARSEOP_INCREMENT);}
{$$ = TrLinkChildren ($<n>3,1,$1);}
@@ -140,27 +140,27 @@ Expression
/* Binary operators: math and logical */
| TermArg PARSEOP_EXP_ADD {$<n>$ = TrCreateLeafNode (PARSEOP_ADD);}
- TermArg {$$ = TrLinkChildren ($<n>3,3,$1,$4,TrCreateLeafNode (PARSEOP_ZERO));}
+ TermArg {$$ = TrLinkChildren ($<n>3,3,$1,$4,TrCreateNullTarget ());}
| TermArg PARSEOP_EXP_DIVIDE {$<n>$ = TrCreateLeafNode (PARSEOP_DIVIDE);}
- TermArg {$$ = TrLinkChildren ($<n>3,4,$1,$4,TrCreateLeafNode (PARSEOP_ZERO),
- TrCreateLeafNode (PARSEOP_ZERO));}
+ TermArg {$$ = TrLinkChildren ($<n>3,4,$1,$4,TrCreateNullTarget (),
+ TrCreateNullTarget ());}
| TermArg PARSEOP_EXP_MODULO {$<n>$ = TrCreateLeafNode (PARSEOP_MOD);}
- TermArg {$$ = TrLinkChildren ($<n>3,3,$1,$4,TrCreateLeafNode (PARSEOP_ZERO));}
+ TermArg {$$ = TrLinkChildren ($<n>3,3,$1,$4,TrCreateNullTarget ());}
| TermArg PARSEOP_EXP_MULTIPLY {$<n>$ = TrCreateLeafNode (PARSEOP_MULTIPLY);}
- TermArg {$$ = TrLinkChildren ($<n>3,3,$1,$4,TrCreateLeafNode (PARSEOP_ZERO));}
+ TermArg {$$ = TrLinkChildren ($<n>3,3,$1,$4,TrCreateNullTarget ());}
| TermArg PARSEOP_EXP_SHIFT_LEFT {$<n>$ = TrCreateLeafNode (PARSEOP_SHIFTLEFT);}
- TermArg {$$ = TrLinkChildren ($<n>3,3,$1,$4,TrCreateLeafNode (PARSEOP_ZERO));}
+ TermArg {$$ = TrLinkChildren ($<n>3,3,$1,$4,TrCreateNullTarget ());}
| TermArg PARSEOP_EXP_SHIFT_RIGHT {$<n>$ = TrCreateLeafNode (PARSEOP_SHIFTRIGHT);}
- TermArg {$$ = TrLinkChildren ($<n>3,3,$1,$4,TrCreateLeafNode (PARSEOP_ZERO));}
+ TermArg {$$ = TrLinkChildren ($<n>3,3,$1,$4,TrCreateNullTarget ());}
| TermArg PARSEOP_EXP_SUBTRACT {$<n>$ = TrCreateLeafNode (PARSEOP_SUBTRACT);}
- TermArg {$$ = TrLinkChildren ($<n>3,3,$1,$4,TrCreateLeafNode (PARSEOP_ZERO));}
+ TermArg {$$ = TrLinkChildren ($<n>3,3,$1,$4,TrCreateNullTarget ());}
| TermArg PARSEOP_EXP_AND {$<n>$ = TrCreateLeafNode (PARSEOP_AND);}
- TermArg {$$ = TrLinkChildren ($<n>3,3,$1,$4,TrCreateLeafNode (PARSEOP_ZERO));}
+ TermArg {$$ = TrLinkChildren ($<n>3,3,$1,$4,TrCreateNullTarget ());}
| TermArg PARSEOP_EXP_OR {$<n>$ = TrCreateLeafNode (PARSEOP_OR);}
- TermArg {$$ = TrLinkChildren ($<n>3,3,$1,$4,TrCreateLeafNode (PARSEOP_ZERO));}
+ TermArg {$$ = TrLinkChildren ($<n>3,3,$1,$4,TrCreateNullTarget ());}
| TermArg PARSEOP_EXP_XOR {$<n>$ = TrCreateLeafNode (PARSEOP_XOR);}
- TermArg {$$ = TrLinkChildren ($<n>3,3,$1,$4,TrCreateLeafNode (PARSEOP_ZERO));}
+ TermArg {$$ = TrLinkChildren ($<n>3,3,$1,$4,TrCreateNullTarget ());}
| TermArg PARSEOP_EXP_GREATER {$<n>$ = TrCreateLeafNode (PARSEOP_LGREATER);}
TermArg {$$ = TrLinkChildren ($<n>3,2,$1,$4);}
@@ -198,7 +198,7 @@ EqualsTerm
TrSetNodeFlags (TrCreateTargetOperand ($1, NULL), NODE_IS_TARGET));}
| TermArg PARSEOP_EXP_DIV_EQ {$<n>$ = TrCreateLeafNode (PARSEOP_DIVIDE);}
- TermArg {$$ = TrLinkChildren ($<n>3,4,$1,$4,TrCreateLeafNode (PARSEOP_ZERO),
+ TermArg {$$ = TrLinkChildren ($<n>3,4,$1,$4,TrCreateNullTarget (),
TrSetNodeFlags (TrCreateTargetOperand ($1, NULL), NODE_IS_TARGET));}
| TermArg PARSEOP_EXP_MOD_EQ {$<n>$ = TrCreateLeafNode (PARSEOP_MOD);}
@@ -247,11 +247,10 @@ TermList
Term
: Object {}
- | Expression {}
| Type1Opcode {}
| Type2Opcode {}
- | Type2IntegerOpcode {}
- | Type2StringOpcode {}
+ | Type2IntegerOpcode {$$ = TrSetNodeFlags ($1, NODE_COMPILE_TIME_CONST);}
+ | Type2StringOpcode {$$ = TrSetNodeFlags ($1, NODE_COMPILE_TIME_CONST);}
| Type2BufferOpcode {}
| Type2BufferOrStringOpcode {}
| error {$$ = AslDoError(); yyclearin;}
@@ -332,7 +331,7 @@ NameSpaceModifier
| ScopeTerm {}
;
-UserTerm
+MethodInvocationTerm
: NameString '(' {TrUpdateNode (PARSEOP_METHODCALL, $1);}
ArgList ')' {$$ = TrLinkChildNode ($1,$4);}
;
@@ -355,8 +354,7 @@ Removed from TermArg due to reduce/reduce conflicts
*/
TermArg
- : Expression {$$ = TrSetNodeFlags ($1, NODE_IS_TERM_ARG);}
- | Type2Opcode {$$ = TrSetNodeFlags ($1, NODE_IS_TERM_ARG);}
+ : Type2Opcode {$$ = TrSetNodeFlags ($1, NODE_IS_TERM_ARG);}
| DataObject {$$ = TrSetNodeFlags ($1, NODE_IS_TERM_ARG);}
| NameString {$$ = TrSetNodeFlags ($1, NODE_IS_TERM_ARG);}
| ArgTerm {$$ = TrSetNodeFlags ($1, NODE_IS_TERM_ARG);}
@@ -364,8 +362,8 @@ TermArg
;
Target
- : {$$ = TrSetNodeFlags (TrCreateLeafNode (PARSEOP_ZERO), NODE_IS_TARGET | NODE_COMPILE_TIME_CONST);} /* Placeholder is a ZeroOp object */
- | ',' {$$ = TrSetNodeFlags (TrCreateLeafNode (PARSEOP_ZERO), NODE_IS_TARGET | NODE_COMPILE_TIME_CONST);} /* Placeholder is a ZeroOp object */
+ : {$$ = TrCreateNullTarget ();} /* Placeholder is a ZeroOp object */
+ | ',' {$$ = TrCreateNullTarget ();} /* Placeholder is a ZeroOp object */
| ',' SuperName {$$ = TrSetNodeFlags ($2, NODE_IS_TARGET);}
;
@@ -453,7 +451,7 @@ Type2Opcode
| EqualsTerm {}
| TimerTerm {}
| WaitTerm {}
- | UserTerm {}
+ | MethodInvocationTerm {}
;
/*
@@ -461,7 +459,8 @@ Type2Opcode
*/
Type2IntegerOpcode /* "Type3" opcodes */
- : AddTerm {}
+ : Expression {$$ = TrSetNodeFlags ($1, NODE_COMPILE_TIME_CONST);}
+ | AddTerm {}
| AndTerm {}
| DecTerm {}
| DivideTerm {}
@@ -507,7 +506,7 @@ Type2BufferOpcode /* "Type5" Opcodes */
;
Type2BufferOrStringOpcode
- : ConcatTerm {}
+ : ConcatTerm {$$ = TrSetNodeFlags ($1, NODE_COMPILE_TIME_CONST);}
| PrintfTerm {}
| FprintfTerm {}
| MidTerm {}
@@ -543,7 +542,7 @@ Type6Opcode
: RefOfTerm {}
| DerefOfTerm {}
| IndexTerm {}
- | UserTerm {}
+ | MethodInvocationTerm {}
;
IncludeTerm
@@ -1920,7 +1919,7 @@ SuperName
| DebugTerm {}
| Type6Opcode {}
-/* For ObjectType: SuperName except for UserTerm (method invocation) */
+/* For ObjectType: SuperName except for MethodInvocationTerm */
ObjectTypeName
: NameString {}
@@ -1931,7 +1930,7 @@ ObjectTypeName
| DerefOfTerm {}
| IndexTerm {}
-/* | UserTerm {} */ /* Caused reduce/reduce with Type6Opcode->UserTerm */
+/* | MethodInvocationTerm {} */ /* Caused reduce/reduce with Type6Opcode->MethodInvocationTerm */
;
ArgTerm
diff --git a/sys/contrib/dev/acpica/compiler/aslstartup.c b/sys/contrib/dev/acpica/compiler/aslstartup.c
index c8840b2..cbebd0d 100644
--- a/sys/contrib/dev/acpica/compiler/aslstartup.c
+++ b/sys/contrib/dev/acpica/compiler/aslstartup.c
@@ -248,7 +248,7 @@ AslDoDisassembly (
/* This is where the disassembly happens */
- AcpiGbl_DbOpt_disasm = TRUE;
+ AcpiGbl_DbOpt_Disasm = TRUE;
Status = AdAmlDisassemble (AslToFile,
Gbl_Files[ASL_FILE_INPUT].Filename, Gbl_OutputFilenamePrefix,
&Gbl_Files[ASL_FILE_INPUT].Filename);
diff --git a/sys/contrib/dev/acpica/compiler/asltree.c b/sys/contrib/dev/acpica/compiler/asltree.c
index 071231e..68d8072 100644
--- a/sys/contrib/dev/acpica/compiler/asltree.c
+++ b/sys/contrib/dev/acpica/compiler/asltree.c
@@ -55,10 +55,6 @@ static ACPI_PARSE_OBJECT *
TrGetNextNode (
void);
-static char *
-TrGetNodeFlagName (
- UINT32 Flags);
-
/*******************************************************************************
*
@@ -187,7 +183,7 @@ TrUpdateNode (
}
DbgPrint (ASL_PARSE_OUTPUT,
- "\nUpdateNode: Old - %s, New - %s\n\n",
+ "\nUpdateNode: Old - %s, New - %s\n",
UtGetOpName (Op->Asl.ParseOpcode),
UtGetOpName (ParseOpcode));
@@ -261,90 +257,140 @@ TrUpdateNode (
/*******************************************************************************
*
- * FUNCTION: TrGetNodeFlagName
+ * FUNCTION: TrPrintNodeCompileFlags
*
* PARAMETERS: Flags - Flags word to be decoded
*
- * RETURN: Name string. Always returns a valid string pointer.
+ * RETURN: None
*
- * DESCRIPTION: Decode a flags word
+ * DESCRIPTION: Decode a flags word to text. Displays all flags that are set.
*
******************************************************************************/
-static char *
-TrGetNodeFlagName (
+void
+TrPrintNodeCompileFlags (
UINT32 Flags)
{
+ UINT32 i;
+ UINT32 FlagBit = 1;
+ char *FlagName = NULL;
+
- switch (Flags)
+ for (i = 0; i < 32; i++)
{
- case NODE_VISITED:
+ switch (Flags & FlagBit)
+ {
+ case NODE_VISITED:
+
+ FlagName = "NODE_VISITED";
+ break;
+
+ case NODE_AML_PACKAGE:
- return ("NODE_VISITED");
+ FlagName = "NODE_AML_PACKAGE";
+ break;
+
+ case NODE_IS_TARGET:
+
+ FlagName = "NODE_IS_TARGET";
+ break;
+
+ case NODE_IS_RESOURCE_DESC:
- case NODE_AML_PACKAGE:
+ FlagName = "NODE_IS_RESOURCE_DESC";
+ break;
+
+ case NODE_IS_RESOURCE_FIELD:
+
+ FlagName = "NODE_IS_RESOURCE_FIELD";
+ break;
- return ("NODE_AML_PACKAGE");
+ case NODE_HAS_NO_EXIT:
- case NODE_IS_TARGET:
+ FlagName = "NODE_HAS_NO_EXIT";
+ break;
- return ("NODE_IS_TARGET");
+ case NODE_IF_HAS_NO_EXIT:
- case NODE_IS_RESOURCE_DESC:
+ FlagName = "NODE_IF_HAS_NO_EXIT";
+ break;
- return ("NODE_IS_RESOURCE_DESC");
+ case NODE_NAME_INTERNALIZED:
- case NODE_IS_RESOURCE_FIELD:
+ FlagName = "NODE_NAME_INTERNALIZED";
+ break;
- return ("NODE_IS_RESOURCE_FIELD");
+ case NODE_METHOD_NO_RETVAL:
- case NODE_HAS_NO_EXIT:
+ FlagName = "NODE_METHOD_NO_RETVAL";
+ break;
- return ("NODE_HAS_NO_EXIT");
+ case NODE_METHOD_SOME_NO_RETVAL:
- case NODE_IF_HAS_NO_EXIT:
+ FlagName = "NODE_METHOD_SOME_NO_RETVAL";
+ break;
- return ("NODE_IF_HAS_NO_EXIT");
+ case NODE_RESULT_NOT_USED:
- case NODE_NAME_INTERNALIZED:
+ FlagName = "NODE_RESULT_NOT_USED";
+ break;
- return ("NODE_NAME_INTERNALIZED");
+ case NODE_METHOD_TYPED:
- case NODE_METHOD_NO_RETVAL:
+ FlagName = "NODE_METHOD_TYPED";
+ break;
- return ("NODE_METHOD_NO_RETVAL");
+ case NODE_COMPILE_TIME_CONST:
- case NODE_METHOD_SOME_NO_RETVAL:
+ FlagName = "NODE_COMPILE_TIME_CONST";
+ break;
- return ("NODE_METHOD_SOME_NO_RETVAL");
+ case NODE_IS_TERM_ARG:
- case NODE_RESULT_NOT_USED:
+ FlagName = "NODE_IS_TERM_ARG";
+ break;
- return ("NODE_RESULT_NOT_USED");
+ case NODE_WAS_ONES_OP:
- case NODE_METHOD_TYPED:
+ FlagName = "NODE_WAS_ONES_OP";
+ break;
- return ("NODE_METHOD_TYPED");
+ case NODE_IS_NAME_DECLARATION:
- case NODE_COMPILE_TIME_CONST:
+ FlagName = "NODE_IS_NAME_DECLARATION";
+ break;
- return ("NODE_COMPILE_TIME_CONST");
+ case NODE_COMPILER_EMITTED:
- case NODE_IS_TERM_ARG:
+ FlagName = "NODE_COMPILER_EMITTED";
+ break;
- return ("NODE_IS_TERM_ARG");
+ case NODE_IS_DUPLICATE:
- case NODE_WAS_ONES_OP:
+ FlagName = "NODE_IS_DUPLICATE";
+ break;
- return ("NODE_WAS_ONES_OP");
+ case NODE_IS_RESOURCE_DATA:
- case NODE_IS_NAME_DECLARATION:
+ FlagName = "NODE_IS_RESOURCE_DATA";
+ break;
- return ("NODE_IS_NAME_DECLARATION");
+ case NODE_IS_NULL_RETURN:
- default:
+ FlagName = "NODE_IS_NULL_RETURN";
+ break;
- return ("Multiple Flags (or unknown flag) set");
+ default:
+ break;
+ }
+
+ if (FlagName)
+ {
+ DbgPrint (ASL_PARSE_OUTPUT, " %s", FlagName);
+ FlagName = NULL;
+ }
+
+ FlagBit <<= 1;
}
}
@@ -368,15 +414,17 @@ TrSetNodeFlags (
UINT32 Flags)
{
- DbgPrint (ASL_PARSE_OUTPUT,
- "\nSetNodeFlags: Op %p, %8.8X %s\n\n", Op, Flags,
- TrGetNodeFlagName (Flags));
-
if (!Op)
{
return (NULL);
}
+ DbgPrint (ASL_PARSE_OUTPUT,
+ "\nSetNodeFlags: %s Op %p, %8.8X", Op->Asl.ParseOpName, Op, Flags);
+
+ TrPrintNodeCompileFlags (Flags);
+ DbgPrint (ASL_PARSE_OUTPUT, "\n\n");
+
Op->Asl.CompileFlags |= Flags;
return (Op);
}
@@ -588,7 +636,40 @@ TrCreateLeafNode (
DbgPrint (ASL_PARSE_OUTPUT,
"\nCreateLeafNode Ln/Col %u/%u NewNode %p Op %s\n\n",
- Op->Asl.LineNumber, Op->Asl.Column, Op, UtGetOpName(ParseOpcode));
+ Op->Asl.LineNumber, Op->Asl.Column, Op, UtGetOpName (ParseOpcode));
+
+ return (Op);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: TrCreateNullTarget
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: Pointer to the new node. Aborts on allocation failure
+ *
+ * DESCRIPTION: Create a "null" target node. This is defined by the ACPI
+ * specification to be a zero AML opcode, and indicates that
+ * no target has been specified for the parent operation
+ *
+ ******************************************************************************/
+
+ACPI_PARSE_OBJECT *
+TrCreateNullTarget (
+ void)
+{
+ ACPI_PARSE_OBJECT *Op;
+
+
+ Op = TrAllocateNode (PARSEOP_ZERO);
+ Op->Asl.CompileFlags |= (NODE_IS_TARGET | NODE_COMPILE_TIME_CONST);
+
+ DbgPrint (ASL_PARSE_OUTPUT,
+ "\nCreateNullTarget Ln/Col %u/%u NewNode %p Op %s\n",
+ Op->Asl.LineNumber, Op->Asl.Column, Op,
+ UtGetOpName (Op->Asl.ParseOpcode));
return (Op);
}
@@ -620,7 +701,6 @@ TrCreateConstantLeafNode (
time_t CurrentTime;
char *StaticTimeString;
char *TimeString;
- char *Path;
char *Filename;
@@ -647,7 +727,7 @@ TrCreateConstantLeafNode (
/* Get the simple filename from the full path */
- FlSplitInputPathname (Op->Asl.Filename, &Path, &Filename);
+ FlSplitInputPathname (Op->Asl.Filename, NULL, &Filename);
Op->Asl.Value.String = Filename;
break;
@@ -672,7 +752,7 @@ TrCreateConstantLeafNode (
}
DbgPrint (ASL_PARSE_OUTPUT,
- "\nCreateConstantLeafNode Ln/Col %u/%u NewNode %p Op %s Value %8.8X%8.8X ",
+ "\nCreateConstantLeafNode Ln/Col %u/%u NewNode %p Op %s Value %8.8X%8.8X \n",
Op->Asl.LineNumber, Op->Asl.Column, Op, UtGetOpName (ParseOpcode),
ACPI_FORMAT_UINT64 (Op->Asl.Value.Integer));
return (Op);
@@ -813,7 +893,8 @@ TrCreateValuedLeafNode (
case PARSEOP_INTEGER:
- DbgPrint (ASL_PARSE_OUTPUT, "INTEGER");
+ DbgPrint (ASL_PARSE_OUTPUT, "INTEGER->%8.8X%8.8X",
+ ACPI_FORMAT_UINT64 (Value));
break;
default:
@@ -948,7 +1029,7 @@ TrCreateNode (
}
va_end(ap);
- DbgPrint (ASL_PARSE_OUTPUT, "\n\n");
+ DbgPrint (ASL_PARSE_OUTPUT, "\n");
return (Op);
}
@@ -1104,7 +1185,7 @@ TrLinkPeerNode (
DbgPrint (ASL_PARSE_OUTPUT,
- "\nLinkPeerNode: 1=%p (%s), 2=%p (%s)\n\n",
+ "\nLinkPeerNode: 1=%p (%s), 2=%p (%s)\n",
Op1, Op1 ? UtGetOpName(Op1->Asl.ParseOpcode) : NULL,
Op2, Op2 ? UtGetOpName(Op2->Asl.ParseOpcode) : NULL);
@@ -1130,7 +1211,7 @@ TrLinkPeerNode (
if (Op1 == Op2)
{
DbgPrint (ASL_DEBUG_OUTPUT,
- "\n\n************* Internal error, linking node to itself %p\n\n\n",
+ "\n************* Internal error, linking node to itself %p\n",
Op1);
AslError (ASL_WARNING, ASL_MSG_COMPILER_INTERNAL, Op1,
"Linking node to itself");
@@ -1214,7 +1295,7 @@ TrLinkPeerNodes (
}
va_end (ap);
- DbgPrint (ASL_PARSE_OUTPUT,"\n\n");
+ DbgPrint (ASL_PARSE_OUTPUT,"\n");
return (Start);
}
@@ -1241,7 +1322,7 @@ TrLinkChildNode (
DbgPrint (ASL_PARSE_OUTPUT,
- "\nLinkChildNode: Parent=%p (%s), Child=%p (%s)\n\n",
+ "\nLinkChildNode: Parent=%p (%s), Child=%p (%s)\n",
Op1, Op1 ? UtGetOpName(Op1->Asl.ParseOpcode): NULL,
Op2, Op2 ? UtGetOpName(Op2->Asl.ParseOpcode): NULL);
diff --git a/sys/contrib/dev/acpica/compiler/asltypes.y b/sys/contrib/dev/acpica/compiler/asltypes.y
index 3177d1d..650b856 100644
--- a/sys/contrib/dev/acpica/compiler/asltypes.y
+++ b/sys/contrib/dev/acpica/compiler/asltypes.y
@@ -74,7 +74,7 @@ NoEcho('
%type <n> Term
%type <n> TermArg
%type <n> TermList
-%type <n> UserTerm
+%type <n> MethodInvocationTerm
/* Type4Opcode is obsolete */
diff --git a/sys/contrib/dev/acpica/compiler/aslutils.c b/sys/contrib/dev/acpica/compiler/aslutils.c
index 7258daa..37d394b 100644
--- a/sys/contrib/dev/acpica/compiler/aslutils.c
+++ b/sys/contrib/dev/acpica/compiler/aslutils.c
@@ -503,8 +503,13 @@ UtDisplaySummary (
if (Gbl_FileType != ASL_INPUT_TYPE_ASCII_DATA)
{
- FlPrintFile (FileId,
- ", %u Optimizations", Gbl_ExceptionCount[ASL_OPTIMIZATION]);
+ FlPrintFile (FileId, ", %u Optimizations",
+ Gbl_ExceptionCount[ASL_OPTIMIZATION]);
+
+ if (TotalFolds)
+ {
+ FlPrintFile (FileId, ", %u Constants Folded", TotalFolds);
+ }
}
FlPrintFile (FileId, "\n");
diff --git a/sys/contrib/dev/acpica/compiler/aslwalks.c b/sys/contrib/dev/acpica/compiler/aslwalks.c
index c378f2d..c59895d 100644
--- a/sys/contrib/dev/acpica/compiler/aslwalks.c
+++ b/sys/contrib/dev/acpica/compiler/aslwalks.c
@@ -252,6 +252,13 @@ AnOperandTypecheckWalkEnd (
}
return (AE_OK);
+ case AML_EXTERNAL_OP:
+ /*
+ * Not really a "runtime" opcode since it used by disassembler only.
+ * The parser will find any issues with the operands.
+ */
+ return (AE_OK);
+
default:
break;
@@ -388,9 +395,6 @@ AnOperandTypecheckWalkEnd (
break;
case PARSEOP_DEBUG:
-
- break;
-
case PARSEOP_REFOF:
case PARSEOP_INDEX:
default:
diff --git a/sys/contrib/dev/acpica/compiler/dtcompile.c b/sys/contrib/dev/acpica/compiler/dtcompile.c
index e94a222..74bfc33 100644
--- a/sys/contrib/dev/acpica/compiler/dtcompile.c
+++ b/sys/contrib/dev/acpica/compiler/dtcompile.c
@@ -102,13 +102,18 @@ DtDoCompile (
/* Preprocessor */
- Event = UtBeginEvent ("Preprocess input file");
- PrDoPreprocess ();
- UtEndEvent (Event);
-
- if (Gbl_PreprocessOnly)
+ if (Gbl_PreprocessFlag)
{
- return (AE_OK);
+ /* Preprocessor */
+
+ Event = UtBeginEvent ("Preprocess input file");
+ PrDoPreprocess ();
+ UtEndEvent (Event);
+
+ if (Gbl_PreprocessOnly)
+ {
+ return (AE_OK);
+ }
}
/*
diff --git a/sys/contrib/dev/acpica/compiler/dtcompiler.h b/sys/contrib/dev/acpica/compiler/dtcompiler.h
index 307df3f..3a0b763 100644
--- a/sys/contrib/dev/acpica/compiler/dtcompiler.h
+++ b/sys/contrib/dev/acpica/compiler/dtcompiler.h
@@ -85,15 +85,16 @@
*/
typedef struct dt_field
{
- char *Name; /* Field name (from name : value) */
- char *Value; /* Field value (from name : value) */
- struct dt_field *Next; /* Next field */
- struct dt_field *NextLabel; /* If field is a label, next label */
- UINT32 Line; /* Line number for this field */
- UINT32 ByteOffset; /* Offset in source file for field */
- UINT32 NameColumn; /* Start column for field name */
- UINT32 Column; /* Start column for field value */
- UINT32 TableOffset;/* Binary offset within ACPI table */
+ char *Name; /* Field name (from name : value) */
+ char *Value; /* Field value (from name : value) */
+ UINT32 StringLength;/* Length of Value */
+ struct dt_field *Next; /* Next field */
+ struct dt_field *NextLabel; /* If field is a label, next label */
+ UINT32 Line; /* Line number for this field */
+ UINT32 ByteOffset; /* Offset in source file for field */
+ UINT32 NameColumn; /* Start column for field name */
+ UINT32 Column; /* Start column for field value */
+ UINT32 TableOffset; /* Binary offset within ACPI table */
UINT8 Flags;
} DT_FIELD;
@@ -557,6 +558,7 @@ extern const unsigned char TemplateMcfg[];
extern const unsigned char TemplateMchi[];
extern const unsigned char TemplateMpst[];
extern const unsigned char TemplateMsct[];
+extern const unsigned char TemplateMsdm[];
extern const unsigned char TemplateMtmr[];
extern const unsigned char TemplatePcct[];
extern const unsigned char TemplatePmtt[];
diff --git a/sys/contrib/dev/acpica/compiler/dtio.c b/sys/contrib/dev/acpica/compiler/dtio.c
index e840fc9..bebd927 100644
--- a/sys/contrib/dev/acpica/compiler/dtio.c
+++ b/sys/contrib/dev/acpica/compiler/dtio.c
@@ -375,6 +375,7 @@ DtParseLine (
Field->ByteOffset = Offset;
Field->NameColumn = NameColumn;
Field->Column = Column;
+ Field->StringLength = Length;
DtLinkField (Field);
}
@@ -414,6 +415,7 @@ DtGetNextLine (
int c;
+ ACPI_MEMSET (Gbl_CurrentLineBuffer, 0, Gbl_LineBufferSize);
for (i = 0; ;)
{
/*
@@ -939,11 +941,11 @@ DtDumpFieldList (
DbgPrint (ASL_DEBUG_OUTPUT, "\nField List:\n"
"LineNo ByteOff NameCol Column TableOff "
- "Flags %32s : %s\n\n", "Name", "Value");
+ "Flags %32s : %s\n\n", "Name", "Value");
while (Field)
{
DbgPrint (ASL_DEBUG_OUTPUT,
- "%.08X %.08X %.08X %.08X %.08X %.08X %32s : %s\n",
+ "%.08X %.08X %.08X %.08X %.08X %2.2X %32s : %s\n",
Field->Line, Field->ByteOffset, Field->NameColumn,
Field->Column, Field->TableOffset, Field->Flags,
Field->Name, Field->Value);
diff --git a/sys/contrib/dev/acpica/compiler/dttable.c b/sys/contrib/dev/acpica/compiler/dttable.c
index bc0cbd2..3fe02e8 100644
--- a/sys/contrib/dev/acpica/compiler/dttable.c
+++ b/sys/contrib/dev/acpica/compiler/dttable.c
@@ -2240,15 +2240,11 @@ DtCompileSlic (
DT_SUBTABLE *Subtable;
DT_SUBTABLE *ParentTable;
DT_FIELD **PFieldList = (DT_FIELD **) List;
- DT_FIELD *SubtableStart;
- ACPI_SLIC_HEADER *SlicHeader;
- ACPI_DMTABLE_INFO *InfoTable;
while (*PFieldList)
{
- SubtableStart = *PFieldList;
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlicHdr,
+ Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlic,
&Subtable, TRUE);
if (ACPI_FAILURE (Status))
{
@@ -2258,35 +2254,6 @@ DtCompileSlic (
ParentTable = DtPeekSubtable ();
DtInsertSubtable (ParentTable, Subtable);
DtPushSubtable (Subtable);
-
- SlicHeader = ACPI_CAST_PTR (ACPI_SLIC_HEADER, Subtable->Buffer);
-
- switch (SlicHeader->Type)
- {
- case ACPI_SLIC_TYPE_PUBLIC_KEY:
-
- InfoTable = AcpiDmTableInfoSlic0;
- break;
-
- case ACPI_SLIC_TYPE_WINDOWS_MARKER:
-
- InfoTable = AcpiDmTableInfoSlic1;
- break;
-
- default:
-
- DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SLIC");
- return (AE_ERROR);
- }
-
- Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- ParentTable = DtPeekSubtable ();
- DtInsertSubtable (ParentTable, Subtable);
DtPopSubtable ();
}
diff --git a/sys/contrib/dev/acpica/compiler/dttemplate.h b/sys/contrib/dev/acpica/compiler/dttemplate.h
index 0398d69..39be761 100644
--- a/sys/contrib/dev/acpica/compiler/dttemplate.h
+++ b/sys/contrib/dev/acpica/compiler/dttemplate.h
@@ -662,6 +662,23 @@ const unsigned char TemplateMchi[] =
0x00,0x00,0x00,0x00,0x00 /* 00000040 "....." */
};
+const unsigned char TemplateMsdm[] =
+{
+ 0x4D,0x53,0x44,0x4D,0x64,0x00,0x00,0x00, /* 00000000 "MSDMd..." */
+ 0x01,0x34,0x49,0x6E,0x74,0x65,0x6C,0x00, /* 00000008 ".4Intel." */
+ 0x54,0x65,0x6D,0x70,0x6C,0x61,0x74,0x65, /* 00000010 "Template" */
+ 0x03,0x00,0x00,0x00,0x49,0x4E,0x54,0x4C, /* 00000018 "....INTL" */
+ 0x04,0x02,0x15,0x20,0x00,0x00,0x00,0x00, /* 00000020 "... ...." */
+ 0x0A,0x10,0x16,0x17,0x18,0x19,0x1A,0x1B, /* 00000028 "........" */
+ 0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23, /* 00000030 ".... !"#" */
+ 0x24,0x25,0x26,0x27,0x10,0x0A,0x15,0x16, /* 00000038 "$%&'...." */
+ 0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E, /* 00000040 "........" */
+ 0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26, /* 00000048 ". !"#$%&" */
+ 0x16,0x15,0x0A,0x10,0x16,0x17,0x18,0x19, /* 00000050 "........" */
+ 0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21, /* 00000058 "...... !" */
+ 0x22,0x23,0x24,0x25 /* 00000060 ""#$%" */
+};
+
const unsigned char TemplateMpst[] =
{
0x4D,0x50,0x53,0x54,0xB6,0x00,0x00,0x00, /* 00000000 "MPST...." */
diff --git a/sys/contrib/dev/acpica/compiler/dtutils.c b/sys/contrib/dev/acpica/compiler/dtutils.c
index 3635f13..7d3c2c8 100644
--- a/sys/contrib/dev/acpica/compiler/dtutils.c
+++ b/sys/contrib/dev/acpica/compiler/dtutils.c
@@ -364,6 +364,7 @@ DtGetFieldType (
break;
case ACPI_DMT_BUFFER:
+ case ACPI_DMT_RAW_BUFFER:
case ACPI_DMT_BUF7:
case ACPI_DMT_BUF10:
case ACPI_DMT_BUF16:
@@ -531,7 +532,6 @@ DtGetFieldLength (
case ACPI_DMT_UINT32:
case ACPI_DMT_NAME4:
- case ACPI_DMT_SLIC:
case ACPI_DMT_SIG:
case ACPI_DMT_LPIT:
@@ -588,6 +588,7 @@ DtGetFieldLength (
break;
case ACPI_DMT_BUFFER:
+ case ACPI_DMT_RAW_BUFFER:
Value = DtGetFieldValue (Field);
if (Value)
diff --git a/sys/contrib/dev/acpica/components/debugger/dbmethod.c b/sys/contrib/dev/acpica/components/debugger/dbmethod.c
index 8f2e4db..5224854 100644
--- a/sys/contrib/dev/acpica/components/debugger/dbmethod.c
+++ b/sys/contrib/dev/acpica/components/debugger/dbmethod.c
@@ -396,11 +396,11 @@ AcpiDbDisassembleMethod (
/* Now we can disassemble the method */
- AcpiGbl_DbOpt_verbose = FALSE;
+ AcpiGbl_DbOpt_Verbose = FALSE;
#ifdef ACPI_DISASSEMBLER
AcpiDmDisassemble (NULL, Op, 0);
#endif
- AcpiGbl_DbOpt_verbose = TRUE;
+ AcpiGbl_DbOpt_Verbose = TRUE;
AcpiPsDeleteParseTree (Op);
diff --git a/sys/contrib/dev/acpica/components/debugger/dbxface.c b/sys/contrib/dev/acpica/components/debugger/dbxface.c
index 8d2e0a8..d72ee5e 100644
--- a/sys/contrib/dev/acpica/components/debugger/dbxface.c
+++ b/sys/contrib/dev/acpica/components/debugger/dbxface.c
@@ -424,13 +424,11 @@ AcpiDbInitialize (
AcpiGbl_DbConsoleDebugLevel = ACPI_NORMAL_DEFAULT | ACPI_LV_TABLES;
AcpiGbl_DbOutputFlags = ACPI_DB_CONSOLE_OUTPUT;
- AcpiGbl_DbOpt_tables = FALSE;
- AcpiGbl_DbOpt_disasm = FALSE;
- AcpiGbl_DbOpt_stats = FALSE;
+ AcpiGbl_DbOpt_Disasm = FALSE;
#ifdef ACPI_DISASSEMBLER
- AcpiGbl_DbOpt_verbose = TRUE;
+ AcpiGbl_DbOpt_Verbose = TRUE;
#endif
- AcpiGbl_DbOpt_ini_methods = TRUE;
+ AcpiGbl_DbOpt_NoIniMethods = FALSE;
AcpiGbl_DbBuffer = AcpiOsAllocate (ACPI_DEBUG_BUFFER_SIZE);
if (!AcpiGbl_DbBuffer)
@@ -479,10 +477,9 @@ AcpiDbInitialize (
}
#ifdef ACPI_DISASSEMBLER
- if (!AcpiGbl_DbOpt_verbose)
+ if (!AcpiGbl_DbOpt_Verbose)
{
- AcpiGbl_DbOpt_disasm = TRUE;
- AcpiGbl_DbOpt_stats = FALSE;
+ AcpiGbl_DbOpt_Disasm = TRUE;
}
#endif
diff --git a/sys/contrib/dev/acpica/components/disassembler/dmopcode.c b/sys/contrib/dev/acpica/components/disassembler/dmopcode.c
index f2ef535..b10d433 100644
--- a/sys/contrib/dev/acpica/components/disassembler/dmopcode.c
+++ b/sys/contrib/dev/acpica/components/disassembler/dmopcode.c
@@ -852,18 +852,6 @@ AcpiDmDisassembleOneOp (
}
break;
- case AML_INT_STATICSTRING_OP:
-
- if (Op->Common.Value.String)
- {
- AcpiOsPrintf ("%s", Op->Common.Value.String);
- }
- else
- {
- AcpiOsPrintf ("\"<NULL STATIC STRING PTR>\"");
- }
- break;
-
case AML_INT_NAMEPATH_OP:
AcpiDmNamestring (Op->Common.Value.Name);
diff --git a/sys/contrib/dev/acpica/components/disassembler/dmwalk.c b/sys/contrib/dev/acpica/components/disassembler/dmwalk.c
index 43a1139..2dbaa84 100644
--- a/sys/contrib/dev/acpica/components/disassembler/dmwalk.c
+++ b/sys/contrib/dev/acpica/components/disassembler/dmwalk.c
@@ -562,7 +562,7 @@ AcpiDmDescendingOp (
if (Op->Common.AmlOpcode != AML_INT_NAMEDFIELD_OP)
{
- if (AcpiGbl_DbOpt_verbose)
+ if (AcpiGbl_DbOpt_Verbose)
{
(void) AcpiPsDisplayObjectPathname (NULL, Op);
}
diff --git a/sys/contrib/dev/acpica/components/dispatcher/dsopcode.c b/sys/contrib/dev/acpica/components/dispatcher/dsopcode.c
index 86fe26c..157e4ce 100644
--- a/sys/contrib/dev/acpica/components/dispatcher/dsopcode.c
+++ b/sys/contrib/dev/acpica/components/dispatcher/dsopcode.c
@@ -477,7 +477,7 @@ AcpiDsEvalRegionOperands (
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "RgnObj %p Addr %8.8X%8.8X Len %X\n",
ObjDesc,
- ACPI_FORMAT_NATIVE_UINT (ObjDesc->Region.Address),
+ ACPI_FORMAT_UINT64 (ObjDesc->Region.Address),
ObjDesc->Region.Length));
/* Now the address and length are valid for this opregion */
@@ -579,12 +579,12 @@ AcpiDsEvalTableRegionOperands (
return_ACPI_STATUS (AE_NOT_EXIST);
}
- ObjDesc->Region.Address = (ACPI_PHYSICAL_ADDRESS) ACPI_TO_INTEGER (Table);
+ ObjDesc->Region.Address = ACPI_PTR_TO_PHYSADDR (Table);
ObjDesc->Region.Length = Table->Length;
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "RgnObj %p Addr %8.8X%8.8X Len %X\n",
ObjDesc,
- ACPI_FORMAT_NATIVE_UINT (ObjDesc->Region.Address),
+ ACPI_FORMAT_UINT64 (ObjDesc->Region.Address),
ObjDesc->Region.Length));
/* Now the address and length are valid for this opregion */
diff --git a/sys/contrib/dev/acpica/components/dispatcher/dsutils.c b/sys/contrib/dev/acpica/components/dispatcher/dsutils.c
index f4f0f33..a115b2e 100644
--- a/sys/contrib/dev/acpica/components/dispatcher/dsutils.c
+++ b/sys/contrib/dev/acpica/components/dispatcher/dsutils.c
@@ -599,6 +599,15 @@ AcpiDsCreateOperand (
ACPI_OPERAND_OBJECT, AcpiGbl_RootNode);
Status = AE_OK;
}
+ else if (ParentOp->Common.AmlOpcode == AML_EXTERNAL_OP)
+ {
+ /* TBD: May only be temporary */
+
+ ObjDesc = AcpiUtCreateStringObject ((ACPI_SIZE) NameLength);
+
+ ACPI_STRNCPY (ObjDesc->String.Pointer, NameString, NameLength);
+ Status = AE_OK;
+ }
else
{
/*
diff --git a/sys/contrib/dev/acpica/components/events/evregion.c b/sys/contrib/dev/acpica/components/events/evregion.c
index 19ceb26..54171b6 100644
--- a/sys/contrib/dev/acpica/components/events/evregion.c
+++ b/sys/contrib/dev/acpica/components/events/evregion.c
@@ -288,7 +288,7 @@ AcpiEvAddressSpaceDispatch (
ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION,
"Handler %p (@%p) Address %8.8X%8.8X [%s]\n",
&RegionObj->Region.Handler->AddressSpace, Handler,
- ACPI_FORMAT_NATIVE_UINT (Address),
+ ACPI_FORMAT_UINT64 (Address),
AcpiUtGetRegionName (RegionObj->Region.SpaceId)));
if (!(HandlerDesc->AddressSpace.HandlerFlags &
diff --git a/sys/contrib/dev/acpica/components/events/evxfevnt.c b/sys/contrib/dev/acpica/components/events/evxfevnt.c
index 08507b3..5515922 100644
--- a/sys/contrib/dev/acpica/components/events/evxfevnt.c
+++ b/sys/contrib/dev/acpica/components/events/evxfevnt.c
@@ -401,7 +401,8 @@ AcpiGetEventStatus (
if (InByte)
{
- LocalEventStatus |= ACPI_EVENT_FLAG_ENABLED;
+ LocalEventStatus |=
+ (ACPI_EVENT_FLAG_ENABLED | ACPI_EVENT_FLAG_ENABLE_SET);
}
/* Fixed event currently active? */
@@ -415,7 +416,7 @@ AcpiGetEventStatus (
if (InByte)
{
- LocalEventStatus |= ACPI_EVENT_FLAG_SET;
+ LocalEventStatus |= ACPI_EVENT_FLAG_STATUS_SET;
}
(*EventStatus) = LocalEventStatus;
diff --git a/sys/contrib/dev/acpica/components/executer/exdump.c b/sys/contrib/dev/acpica/components/executer/exdump.c
index 9986022..622dc14 100644
--- a/sys/contrib/dev/acpica/components/executer/exdump.c
+++ b/sys/contrib/dev/acpica/components/executer/exdump.c
@@ -784,7 +784,7 @@ AcpiExDumpOperand (
else
{
AcpiOsPrintf (" base %8.8X%8.8X Length %X\n",
- ACPI_FORMAT_NATIVE_UINT (ObjDesc->Region.Address),
+ ACPI_FORMAT_UINT64 (ObjDesc->Region.Address),
ObjDesc->Region.Length);
}
break;
diff --git a/sys/contrib/dev/acpica/components/executer/exfldio.c b/sys/contrib/dev/acpica/components/executer/exfldio.c
index c4d4019..2908da4 100644
--- a/sys/contrib/dev/acpica/components/executer/exfldio.c
+++ b/sys/contrib/dev/acpica/components/executer/exfldio.c
@@ -289,13 +289,13 @@ AcpiExAccessRegion (
}
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_BFIELD,
- " Region [%s:%X], Width %X, ByteBase %X, Offset %X at %p\n",
+ " Region [%s:%X], Width %X, ByteBase %X, Offset %X at %8.8X%8.8X\n",
AcpiUtGetRegionName (RgnDesc->Region.SpaceId),
RgnDesc->Region.SpaceId,
ObjDesc->CommonField.AccessByteWidth,
ObjDesc->CommonField.BaseByteOffset,
FieldDatumByteOffset,
- ACPI_CAST_PTR (void, (RgnDesc->Region.Address + RegionOffset))));
+ ACPI_FORMAT_UINT64 (RgnDesc->Region.Address + RegionOffset)));
/* Invoke the appropriate AddressSpace/OpRegion handler */
diff --git a/sys/contrib/dev/acpica/components/executer/exoparg3.c b/sys/contrib/dev/acpica/components/executer/exoparg3.c
index 6d0fdd1..da873c3 100644
--- a/sys/contrib/dev/acpica/components/executer/exoparg3.c
+++ b/sys/contrib/dev/acpica/components/executer/exoparg3.c
@@ -125,7 +125,18 @@ AcpiExOpcode_3A_0T_0R (
/* Might return while OS is shutting down, just continue */
ACPI_FREE (Fatal);
- break;
+ goto Cleanup;
+
+ case AML_EXTERNAL_OP:
+ /*
+ * If the interpreter sees this opcode, just ignore it. The External
+ * op is intended for use by disassemblers in order to properly
+ * disassemble control method invocations. The opcode or group of
+ * opcodes should be surrounded by an "if (0)" clause to ensure that
+ * AML interpreters never see the opcode.
+ */
+ Status = AE_OK;
+ goto Cleanup;
default:
diff --git a/sys/contrib/dev/acpica/components/executer/exregion.c b/sys/contrib/dev/acpica/components/executer/exregion.c
index 9deef50..59b4612 100644
--- a/sys/contrib/dev/acpica/components/executer/exregion.c
+++ b/sys/contrib/dev/acpica/components/executer/exregion.c
@@ -175,8 +175,8 @@ AcpiExSystemMemorySpaceHandler (
* one page, which is similar to the original code that used a 4k
* maximum window.
*/
- PageBoundaryMapLength =
- ACPI_ROUND_UP (Address, ACPI_DEFAULT_PAGE_SIZE) - Address;
+ PageBoundaryMapLength = (ACPI_SIZE)
+ (ACPI_ROUND_UP (Address, ACPI_DEFAULT_PAGE_SIZE) - Address);
if (PageBoundaryMapLength == 0)
{
PageBoundaryMapLength = ACPI_DEFAULT_PAGE_SIZE;
@@ -189,13 +189,12 @@ AcpiExSystemMemorySpaceHandler (
/* Create a new mapping starting at the address given */
- MemInfo->MappedLogicalAddress = AcpiOsMapMemory (
- (ACPI_PHYSICAL_ADDRESS) Address, MapLength);
+ MemInfo->MappedLogicalAddress = AcpiOsMapMemory (Address, MapLength);
if (!MemInfo->MappedLogicalAddress)
{
ACPI_ERROR ((AE_INFO,
"Could not map memory at 0x%8.8X%8.8X, size %u",
- ACPI_FORMAT_NATIVE_UINT (Address), (UINT32) MapLength));
+ ACPI_FORMAT_UINT64 (Address), (UINT32) MapLength));
MemInfo->MappedLength = 0;
return_ACPI_STATUS (AE_NO_MEMORY);
}
@@ -215,7 +214,7 @@ AcpiExSystemMemorySpaceHandler (
ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
"System-Memory (width %u) R/W %u Address=%8.8X%8.8X\n",
- BitWidth, Function, ACPI_FORMAT_NATIVE_UINT (Address)));
+ BitWidth, Function, ACPI_FORMAT_UINT64 (Address)));
/*
* Perform the memory read or write
@@ -338,7 +337,7 @@ AcpiExSystemIoSpaceHandler (
ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
"System-IO (width %u) R/W %u Address=%8.8X%8.8X\n",
- BitWidth, Function, ACPI_FORMAT_NATIVE_UINT (Address)));
+ BitWidth, Function, ACPI_FORMAT_UINT64 (Address)));
/* Decode the function parameter */
diff --git a/sys/contrib/dev/acpica/components/hardware/hwgpe.c b/sys/contrib/dev/acpica/components/hardware/hwgpe.c
index 9cc511e..093ba80 100644
--- a/sys/contrib/dev/acpica/components/hardware/hwgpe.c
+++ b/sys/contrib/dev/acpica/components/hardware/hwgpe.c
@@ -280,6 +280,19 @@ AcpiHwGetGpeStatus (
LocalEventStatus |= ACPI_EVENT_FLAG_WAKE_ENABLED;
}
+ /* GPE currently enabled (enable bit == 1)? */
+
+ Status = AcpiHwRead (&InByte, &GpeRegisterInfo->EnableAddress);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+
+ if (RegisterBit & InByte)
+ {
+ LocalEventStatus |= ACPI_EVENT_FLAG_ENABLE_SET;
+ }
+
/* GPE currently active (status bit == 1)? */
Status = AcpiHwRead (&InByte, &GpeRegisterInfo->StatusAddress);
@@ -290,7 +303,7 @@ AcpiHwGetGpeStatus (
if (RegisterBit & InByte)
{
- LocalEventStatus |= ACPI_EVENT_FLAG_SET;
+ LocalEventStatus |= ACPI_EVENT_FLAG_STATUS_SET;
}
/* Set return value */
diff --git a/sys/contrib/dev/acpica/components/hardware/hwvalid.c b/sys/contrib/dev/acpica/components/hardware/hwvalid.c
index ade53ad..3b6b567 100644
--- a/sys/contrib/dev/acpica/components/hardware/hwvalid.c
+++ b/sys/contrib/dev/acpica/components/hardware/hwvalid.c
@@ -155,8 +155,8 @@ AcpiHwValidateIoRequest (
ByteWidth = ACPI_DIV_8 (BitWidth);
LastAddress = Address + ByteWidth - 1;
- ACPI_DEBUG_PRINT ((ACPI_DB_IO, "Address %p LastAddress %p Length %X",
- ACPI_CAST_PTR (void, Address), ACPI_CAST_PTR (void, LastAddress),
+ ACPI_DEBUG_PRINT ((ACPI_DB_IO, "Address %8.8X%8.8X LastAddress %8.8X%8.8X Length %X",
+ ACPI_FORMAT_UINT64 (Address), ACPI_FORMAT_UINT64 (LastAddress),
ByteWidth));
/* Maximum 16-bit address in I/O space */
@@ -164,8 +164,8 @@ AcpiHwValidateIoRequest (
if (LastAddress > ACPI_UINT16_MAX)
{
ACPI_ERROR ((AE_INFO,
- "Illegal I/O port address/length above 64K: %p/0x%X",
- ACPI_CAST_PTR (void, Address), ByteWidth));
+ "Illegal I/O port address/length above 64K: %8.8X%8.8X/0x%X",
+ ACPI_FORMAT_UINT64 (Address), ByteWidth));
return_ACPI_STATUS (AE_LIMIT);
}
@@ -196,8 +196,8 @@ AcpiHwValidateIoRequest (
if (AcpiGbl_OsiData >= PortInfo->OsiDependency)
{
ACPI_DEBUG_PRINT ((ACPI_DB_IO,
- "Denied AML access to port 0x%p/%X (%s 0x%.4X-0x%.4X)",
- ACPI_CAST_PTR (void, Address), ByteWidth, PortInfo->Name,
+ "Denied AML access to port 0x%8.8X%8.8X/%X (%s 0x%.4X-0x%.4X)",
+ ACPI_FORMAT_UINT64 (Address), ByteWidth, PortInfo->Name,
PortInfo->Start, PortInfo->End));
return_ACPI_STATUS (AE_AML_ILLEGAL_ADDRESS);
diff --git a/sys/contrib/dev/acpica/components/namespace/nsdump.c b/sys/contrib/dev/acpica/components/namespace/nsdump.c
index 6140397..77fb279 100644
--- a/sys/contrib/dev/acpica/components/namespace/nsdump.c
+++ b/sys/contrib/dev/acpica/components/namespace/nsdump.c
@@ -313,9 +313,9 @@ AcpiNsDumpOneObject (
{
case ACPI_TYPE_PROCESSOR:
- AcpiOsPrintf ("ID %02X Len %02X Addr %p\n",
+ AcpiOsPrintf ("ID %02X Len %02X Addr %8.8X%8.8X\n",
ObjDesc->Processor.ProcId, ObjDesc->Processor.Length,
- ACPI_CAST_PTR (void, ObjDesc->Processor.Address));
+ ACPI_FORMAT_UINT64 (ObjDesc->Processor.Address));
break;
case ACPI_TYPE_DEVICE:
@@ -388,7 +388,7 @@ AcpiNsDumpOneObject (
if (ObjDesc->Region.Flags & AOPOBJ_DATA_VALID)
{
AcpiOsPrintf (" Addr %8.8X%8.8X Len %.4X\n",
- ACPI_FORMAT_NATIVE_UINT (ObjDesc->Region.Address),
+ ACPI_FORMAT_UINT64 (ObjDesc->Region.Address),
ObjDesc->Region.Length);
}
else
diff --git a/sys/contrib/dev/acpica/components/parser/psopcode.c b/sys/contrib/dev/acpica/components/parser/psopcode.c
index c219778..e351e4c 100644
--- a/sys/contrib/dev/acpica/components/parser/psopcode.c
+++ b/sys/contrib/dev/acpica/components/parser/psopcode.c
@@ -333,7 +333,11 @@ const ACPI_OPCODE_INFO AcpiGbl_AmlOpInfo[AML_NUM_OPCODES] =
/* ACPI 5.0 opcodes */
/* 7F */ ACPI_OP ("-ConnectField-", ARGP_CONNECTFIELD_OP, ARGI_CONNECTFIELD_OP, ACPI_TYPE_ANY, AML_CLASS_INTERNAL, AML_TYPE_BOGUS, AML_HAS_ARGS),
-/* 80 */ ACPI_OP ("-ExtAccessField-", ARGP_CONNECTFIELD_OP, ARGI_CONNECTFIELD_OP, ACPI_TYPE_ANY, AML_CLASS_INTERNAL, AML_TYPE_BOGUS, 0)
+/* 80 */ ACPI_OP ("-ExtAccessField-", ARGP_CONNECTFIELD_OP, ARGI_CONNECTFIELD_OP, ACPI_TYPE_ANY, AML_CLASS_INTERNAL, AML_TYPE_BOGUS, 0),
+
+/* ACPI 6.0 opcodes */
+
+/* 81 */ ACPI_OP ("External", ARGP_EXTERNAL_OP, ARGI_EXTERNAL_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE,/* ? */ AML_TYPE_EXEC_3A_0T_0R, AML_FLAGS_EXEC_3A_0T_0R)
/*! [End] no source code translation !*/
};
diff --git a/sys/contrib/dev/acpica/components/parser/psopinfo.c b/sys/contrib/dev/acpica/components/parser/psopinfo.c
index e44bf7b..872f58a 100644
--- a/sys/contrib/dev/acpica/components/parser/psopinfo.c
+++ b/sys/contrib/dev/acpica/components/parser/psopinfo.c
@@ -226,7 +226,7 @@ const UINT8 AcpiGbl_ShortOpIndex[256] =
/* 8 9 A B C D E F */
/* 0x00 */ 0x00, 0x01, _UNK, _UNK, _UNK, _UNK, 0x02, _UNK,
/* 0x08 */ 0x03, _UNK, 0x04, 0x05, 0x06, 0x07, 0x6E, _UNK,
-/* 0x10 */ 0x08, 0x09, 0x0a, 0x6F, 0x0b, _UNK, _UNK, _UNK,
+/* 0x10 */ 0x08, 0x09, 0x0a, 0x6F, 0x0b, 0x81, _UNK, _UNK,
/* 0x18 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
/* 0x20 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
/* 0x28 */ _UNK, _UNK, _UNK, _UNK, _UNK, 0x63, _PFX, _PFX,
diff --git a/sys/contrib/dev/acpica/components/resources/rsaddr.c b/sys/contrib/dev/acpica/components/resources/rsaddr.c
index f05c4fc..decd9a6 100644
--- a/sys/contrib/dev/acpica/components/resources/rsaddr.c
+++ b/sys/contrib/dev/acpica/components/resources/rsaddr.c
@@ -77,7 +77,7 @@ ACPI_RSCONVERT_INFO AcpiRsConvertAddress16[5] =
* Address Translation Offset
* Address Length
*/
- {ACPI_RSC_MOVE16, ACPI_RS_OFFSET (Data.Address16.Granularity),
+ {ACPI_RSC_MOVE16, ACPI_RS_OFFSET (Data.Address16.Address.Granularity),
AML_OFFSET (Address16.Granularity),
5},
@@ -117,7 +117,7 @@ ACPI_RSCONVERT_INFO AcpiRsConvertAddress32[5] =
* Address Translation Offset
* Address Length
*/
- {ACPI_RSC_MOVE32, ACPI_RS_OFFSET (Data.Address32.Granularity),
+ {ACPI_RSC_MOVE32, ACPI_RS_OFFSET (Data.Address32.Address.Granularity),
AML_OFFSET (Address32.Granularity),
5},
@@ -157,7 +157,7 @@ ACPI_RSCONVERT_INFO AcpiRsConvertAddress64[5] =
* Address Translation Offset
* Address Length
*/
- {ACPI_RSC_MOVE64, ACPI_RS_OFFSET (Data.Address64.Granularity),
+ {ACPI_RSC_MOVE64, ACPI_RS_OFFSET (Data.Address64.Address.Granularity),
AML_OFFSET (Address64.Granularity),
5},
@@ -203,7 +203,7 @@ ACPI_RSCONVERT_INFO AcpiRsConvertExtAddress64[5] =
* Address Length
* Type-Specific Attribute
*/
- {ACPI_RSC_MOVE64, ACPI_RS_OFFSET (Data.ExtAddress64.Granularity),
+ {ACPI_RSC_MOVE64, ACPI_RS_OFFSET (Data.ExtAddress64.Address.Granularity),
AML_OFFSET (ExtAddress64.Granularity),
6}
};
diff --git a/sys/contrib/dev/acpica/components/resources/rsdump.c b/sys/contrib/dev/acpica/components/resources/rsdump.c
index ddae6e0..9c1a7ec 100644
--- a/sys/contrib/dev/acpica/components/resources/rsdump.c
+++ b/sys/contrib/dev/acpica/components/resources/rsdump.c
@@ -1,6 +1,6 @@
/*******************************************************************************
*
- * Module Name: rsdump - Functions to display the resource structures.
+ * Module Name: rsdump - AML debugger support for resource structures.
*
******************************************************************************/
@@ -48,8 +48,10 @@
#define _COMPONENT ACPI_RESOURCES
ACPI_MODULE_NAME ("rsdump")
-
-#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DISASSEMBLER) || defined(ACPI_DEBUGGER)
+/*
+ * All functions in this module are used by the AML Debugger only
+ */
+#if defined(ACPI_DEBUGGER)
/* Local prototypes */
@@ -89,8 +91,8 @@ AcpiRsDumpByteList (
static void
AcpiRsDumpWordList (
- UINT16 Length,
- UINT16 *Data);
+ UINT16 Length,
+ UINT16 *Data);
static void
AcpiRsDumpDwordList (
@@ -99,8 +101,8 @@ AcpiRsDumpDwordList (
static void
AcpiRsDumpShortByteList (
- UINT8 Length,
- UINT8 *Data);
+ UINT8 Length,
+ UINT8 *Data);
static void
AcpiRsDumpResourceSource (
@@ -113,7 +115,133 @@ AcpiRsDumpAddressCommon (
static void
AcpiRsDumpDescriptor (
void *Resource,
- ACPI_RSDUMP_INFO *Table);
+ ACPI_RSDUMP_INFO *Table);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiRsDumpResourceList
+ *
+ * PARAMETERS: ResourceList - Pointer to a resource descriptor list
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Dispatches the structure to the correct dump routine.
+ *
+ ******************************************************************************/
+
+void
+AcpiRsDumpResourceList (
+ ACPI_RESOURCE *ResourceList)
+{
+ UINT32 Count = 0;
+ UINT32 Type;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ /* Check if debug output enabled */
+
+ if (!ACPI_IS_DEBUG_ENABLED (ACPI_LV_RESOURCES, _COMPONENT))
+ {
+ return;
+ }
+
+ /* Walk list and dump all resource descriptors (END_TAG terminates) */
+
+ do
+ {
+ AcpiOsPrintf ("\n[%02X] ", Count);
+ Count++;
+
+ /* Validate Type before dispatch */
+
+ Type = ResourceList->Type;
+ if (Type > ACPI_RESOURCE_TYPE_MAX)
+ {
+ AcpiOsPrintf (
+ "Invalid descriptor type (%X) in resource list\n",
+ ResourceList->Type);
+ return;
+ }
+
+ /* Sanity check the length. It must not be zero, or we loop forever */
+
+ if (!ResourceList->Length)
+ {
+ AcpiOsPrintf (
+ "Invalid zero length descriptor in resource list\n");
+ return;
+ }
+
+ /* Dump the resource descriptor */
+
+ if (Type == ACPI_RESOURCE_TYPE_SERIAL_BUS)
+ {
+ AcpiRsDumpDescriptor (&ResourceList->Data,
+ AcpiGbl_DumpSerialBusDispatch[
+ ResourceList->Data.CommonSerialBus.Type]);
+ }
+ else
+ {
+ AcpiRsDumpDescriptor (&ResourceList->Data,
+ AcpiGbl_DumpResourceDispatch[Type]);
+ }
+
+ /* Point to the next resource structure */
+
+ ResourceList = ACPI_NEXT_RESOURCE (ResourceList);
+
+ /* Exit when END_TAG descriptor is reached */
+
+ } while (Type != ACPI_RESOURCE_TYPE_END_TAG);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiRsDumpIrqList
+ *
+ * PARAMETERS: RouteTable - Pointer to the routing table to dump.
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Print IRQ routing table
+ *
+ ******************************************************************************/
+
+void
+AcpiRsDumpIrqList (
+ UINT8 *RouteTable)
+{
+ ACPI_PCI_ROUTING_TABLE *PrtElement;
+ UINT8 Count;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ /* Check if debug output enabled */
+
+ if (!ACPI_IS_DEBUG_ENABLED (ACPI_LV_RESOURCES, _COMPONENT))
+ {
+ return;
+ }
+
+ PrtElement = ACPI_CAST_PTR (ACPI_PCI_ROUTING_TABLE, RouteTable);
+
+ /* Dump all table elements, Exit on zero length element */
+
+ for (Count = 0; PrtElement->Length; Count++)
+ {
+ AcpiOsPrintf ("\n[%02X] PCI IRQ Routing Table Package\n", Count);
+ AcpiRsDumpDescriptor (PrtElement, AcpiRsDumpPrt);
+
+ PrtElement = ACPI_ADD_PTR (ACPI_PCI_ROUTING_TABLE,
+ PrtElement, PrtElement->Length);
+ }
+}
/*******************************************************************************
@@ -288,14 +416,16 @@ AcpiRsDumpDescriptor (
/*
* Common flags for all Address resources
*/
- AcpiRsDumpAddressCommon (ACPI_CAST_PTR (ACPI_RESOURCE_DATA, Target));
+ AcpiRsDumpAddressCommon (ACPI_CAST_PTR (
+ ACPI_RESOURCE_DATA, Target));
break;
case ACPI_RSD_SOURCE:
/*
* Optional ResourceSource for Address resources
*/
- AcpiRsDumpResourceSource (ACPI_CAST_PTR (ACPI_RESOURCE_SOURCE, Target));
+ AcpiRsDumpResourceSource (ACPI_CAST_PTR (
+ ACPI_RESOURCE_SOURCE, Target));
break;
default:
@@ -399,131 +529,6 @@ AcpiRsDumpAddressCommon (
/*******************************************************************************
*
- * FUNCTION: AcpiRsDumpResourceList
- *
- * PARAMETERS: ResourceList - Pointer to a resource descriptor list
- *
- * RETURN: None
- *
- * DESCRIPTION: Dispatches the structure to the correct dump routine.
- *
- ******************************************************************************/
-
-void
-AcpiRsDumpResourceList (
- ACPI_RESOURCE *ResourceList)
-{
- UINT32 Count = 0;
- UINT32 Type;
-
-
- ACPI_FUNCTION_ENTRY ();
-
-
- /* Check if debug output enabled */
-
- if (!ACPI_IS_DEBUG_ENABLED (ACPI_LV_RESOURCES, _COMPONENT))
- {
- return;
- }
-
- /* Walk list and dump all resource descriptors (END_TAG terminates) */
-
- do
- {
- AcpiOsPrintf ("\n[%02X] ", Count);
- Count++;
-
- /* Validate Type before dispatch */
-
- Type = ResourceList->Type;
- if (Type > ACPI_RESOURCE_TYPE_MAX)
- {
- AcpiOsPrintf (
- "Invalid descriptor type (%X) in resource list\n",
- ResourceList->Type);
- return;
- }
-
- /* Sanity check the length. It must not be zero, or we loop forever */
-
- if (!ResourceList->Length)
- {
- AcpiOsPrintf (
- "Invalid zero length descriptor in resource list\n");
- return;
- }
-
- /* Dump the resource descriptor */
-
- if (Type == ACPI_RESOURCE_TYPE_SERIAL_BUS)
- {
- AcpiRsDumpDescriptor (&ResourceList->Data,
- AcpiGbl_DumpSerialBusDispatch[ResourceList->Data.CommonSerialBus.Type]);
- }
- else
- {
- AcpiRsDumpDescriptor (&ResourceList->Data,
- AcpiGbl_DumpResourceDispatch[Type]);
- }
-
- /* Point to the next resource structure */
-
- ResourceList = ACPI_NEXT_RESOURCE (ResourceList);
-
- /* Exit when END_TAG descriptor is reached */
-
- } while (Type != ACPI_RESOURCE_TYPE_END_TAG);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION: AcpiRsDumpIrqList
- *
- * PARAMETERS: RouteTable - Pointer to the routing table to dump.
- *
- * RETURN: None
- *
- * DESCRIPTION: Print IRQ routing table
- *
- ******************************************************************************/
-
-void
-AcpiRsDumpIrqList (
- UINT8 *RouteTable)
-{
- ACPI_PCI_ROUTING_TABLE *PrtElement;
- UINT8 Count;
-
-
- ACPI_FUNCTION_ENTRY ();
-
-
- /* Check if debug output enabled */
-
- if (!ACPI_IS_DEBUG_ENABLED (ACPI_LV_RESOURCES, _COMPONENT))
- {
- return;
- }
-
- PrtElement = ACPI_CAST_PTR (ACPI_PCI_ROUTING_TABLE, RouteTable);
-
- /* Dump all table elements, Exit on zero length element */
-
- for (Count = 0; PrtElement->Length; Count++)
- {
- AcpiOsPrintf ("\n[%02X] PCI IRQ Routing Table Package\n", Count);
- AcpiRsDumpDescriptor (PrtElement, AcpiRsDumpPrt);
-
- PrtElement = ACPI_ADD_PTR (ACPI_PCI_ROUTING_TABLE,
- PrtElement, PrtElement->Length);
- }
-}
-
-
-/*******************************************************************************
- *
* FUNCTION: AcpiRsOut*
*
* PARAMETERS: Title - Name of the resource field
@@ -620,8 +625,8 @@ AcpiRsDumpByteList (
static void
AcpiRsDumpShortByteList (
- UINT8 Length,
- UINT8 *Data)
+ UINT8 Length,
+ UINT8 *Data)
{
UINT8 i;
diff --git a/sys/contrib/dev/acpica/components/resources/rsdumpinfo.c b/sys/contrib/dev/acpica/components/resources/rsdumpinfo.c
index aab597a..dfa1a84 100644
--- a/sys/contrib/dev/acpica/components/resources/rsdumpinfo.c
+++ b/sys/contrib/dev/acpica/components/resources/rsdumpinfo.c
@@ -161,11 +161,12 @@ ACPI_RSDUMP_INFO AcpiRsDumpAddress16[8] =
{
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE (AcpiRsDumpAddress16), "16-Bit WORD Address Space",NULL},
{ACPI_RSD_ADDRESS, 0, NULL, NULL},
- {ACPI_RSD_UINT16, ACPI_RSD_OFFSET (Address16.Granularity), "Granularity", NULL},
- {ACPI_RSD_UINT16, ACPI_RSD_OFFSET (Address16.Minimum), "Address Minimum", NULL},
- {ACPI_RSD_UINT16, ACPI_RSD_OFFSET (Address16.Maximum), "Address Maximum", NULL},
- {ACPI_RSD_UINT16, ACPI_RSD_OFFSET (Address16.TranslationOffset), "Translation Offset", NULL},
- {ACPI_RSD_UINT16, ACPI_RSD_OFFSET (Address16.AddressLength), "Address Length", NULL},
+ {ACPI_RSD_UINT16, ACPI_RSD_OFFSET (Address16.Address.Granularity), "Granularity", NULL},
+ {ACPI_RSD_UINT16, ACPI_RSD_OFFSET (Address16.Address.Minimum), "Address Minimum", NULL},
+ {ACPI_RSD_UINT16, ACPI_RSD_OFFSET (Address16.Address.Maximum), "Address Maximum", NULL},
+ {ACPI_RSD_UINT16, ACPI_RSD_OFFSET (Address16.Address.TranslationOffset),
+ "Translation Offset", NULL},
+ {ACPI_RSD_UINT16, ACPI_RSD_OFFSET (Address16.Address.AddressLength), "Address Length", NULL},
{ACPI_RSD_SOURCE, ACPI_RSD_OFFSET (Address16.ResourceSource), NULL, NULL}
};
@@ -173,11 +174,12 @@ ACPI_RSDUMP_INFO AcpiRsDumpAddress32[8] =
{
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE (AcpiRsDumpAddress32), "32-Bit DWORD Address Space", NULL},
{ACPI_RSD_ADDRESS, 0, NULL, NULL},
- {ACPI_RSD_UINT32, ACPI_RSD_OFFSET (Address32.Granularity), "Granularity", NULL},
- {ACPI_RSD_UINT32, ACPI_RSD_OFFSET (Address32.Minimum), "Address Minimum", NULL},
- {ACPI_RSD_UINT32, ACPI_RSD_OFFSET (Address32.Maximum), "Address Maximum", NULL},
- {ACPI_RSD_UINT32, ACPI_RSD_OFFSET (Address32.TranslationOffset), "Translation Offset", NULL},
- {ACPI_RSD_UINT32, ACPI_RSD_OFFSET (Address32.AddressLength), "Address Length", NULL},
+ {ACPI_RSD_UINT32, ACPI_RSD_OFFSET (Address32.Address.Granularity), "Granularity", NULL},
+ {ACPI_RSD_UINT32, ACPI_RSD_OFFSET (Address32.Address.Minimum), "Address Minimum", NULL},
+ {ACPI_RSD_UINT32, ACPI_RSD_OFFSET (Address32.Address.Maximum), "Address Maximum", NULL},
+ {ACPI_RSD_UINT32, ACPI_RSD_OFFSET (Address32.Address.TranslationOffset),
+ "Translation Offset", NULL},
+ {ACPI_RSD_UINT32, ACPI_RSD_OFFSET (Address32.Address.AddressLength), "Address Length", NULL},
{ACPI_RSD_SOURCE, ACPI_RSD_OFFSET (Address32.ResourceSource), NULL, NULL}
};
@@ -185,11 +187,12 @@ ACPI_RSDUMP_INFO AcpiRsDumpAddress64[8] =
{
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE (AcpiRsDumpAddress64), "64-Bit QWORD Address Space", NULL},
{ACPI_RSD_ADDRESS, 0, NULL, NULL},
- {ACPI_RSD_UINT64, ACPI_RSD_OFFSET (Address64.Granularity), "Granularity", NULL},
- {ACPI_RSD_UINT64, ACPI_RSD_OFFSET (Address64.Minimum), "Address Minimum", NULL},
- {ACPI_RSD_UINT64, ACPI_RSD_OFFSET (Address64.Maximum), "Address Maximum", NULL},
- {ACPI_RSD_UINT64, ACPI_RSD_OFFSET (Address64.TranslationOffset), "Translation Offset", NULL},
- {ACPI_RSD_UINT64, ACPI_RSD_OFFSET (Address64.AddressLength), "Address Length", NULL},
+ {ACPI_RSD_UINT64, ACPI_RSD_OFFSET (Address64.Address.Granularity), "Granularity", NULL},
+ {ACPI_RSD_UINT64, ACPI_RSD_OFFSET (Address64.Address.Minimum), "Address Minimum", NULL},
+ {ACPI_RSD_UINT64, ACPI_RSD_OFFSET (Address64.Address.Maximum), "Address Maximum", NULL},
+ {ACPI_RSD_UINT64, ACPI_RSD_OFFSET (Address64.Address.TranslationOffset),
+ "Translation Offset", NULL},
+ {ACPI_RSD_UINT64, ACPI_RSD_OFFSET (Address64.Address.AddressLength), "Address Length", NULL},
{ACPI_RSD_SOURCE, ACPI_RSD_OFFSET (Address64.ResourceSource), NULL, NULL}
};
@@ -197,11 +200,13 @@ ACPI_RSDUMP_INFO AcpiRsDumpExtAddress64[8] =
{
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE (AcpiRsDumpExtAddress64), "64-Bit Extended Address Space", NULL},
{ACPI_RSD_ADDRESS, 0, NULL, NULL},
- {ACPI_RSD_UINT64, ACPI_RSD_OFFSET (ExtAddress64.Granularity), "Granularity", NULL},
- {ACPI_RSD_UINT64, ACPI_RSD_OFFSET (ExtAddress64.Minimum), "Address Minimum", NULL},
- {ACPI_RSD_UINT64, ACPI_RSD_OFFSET (ExtAddress64.Maximum), "Address Maximum", NULL},
- {ACPI_RSD_UINT64, ACPI_RSD_OFFSET (ExtAddress64.TranslationOffset), "Translation Offset", NULL},
- {ACPI_RSD_UINT64, ACPI_RSD_OFFSET (ExtAddress64.AddressLength), "Address Length", NULL},
+ {ACPI_RSD_UINT64, ACPI_RSD_OFFSET (ExtAddress64.Address.Granularity), "Granularity", NULL},
+ {ACPI_RSD_UINT64, ACPI_RSD_OFFSET (ExtAddress64.Address.Minimum), "Address Minimum", NULL},
+ {ACPI_RSD_UINT64, ACPI_RSD_OFFSET (ExtAddress64.Address.Maximum), "Address Maximum", NULL},
+ {ACPI_RSD_UINT64, ACPI_RSD_OFFSET (ExtAddress64.Address.TranslationOffset),
+ "Translation Offset", NULL},
+ {ACPI_RSD_UINT64, ACPI_RSD_OFFSET (ExtAddress64.Address.AddressLength),
+ "Address Length", NULL},
{ACPI_RSD_UINT64, ACPI_RSD_OFFSET (ExtAddress64.TypeSpecific), "Type-Specific Attribute", NULL}
};
diff --git a/sys/contrib/dev/acpica/components/resources/rsxface.c b/sys/contrib/dev/acpica/components/resources/rsxface.c
index 2fe3e6f..a477f20 100644
--- a/sys/contrib/dev/acpica/components/resources/rsxface.c
+++ b/sys/contrib/dev/acpica/components/resources/rsxface.c
@@ -61,11 +61,11 @@
ACPI_COPY_FIELD(Out, In, MinAddressFixed); \
ACPI_COPY_FIELD(Out, In, MaxAddressFixed); \
ACPI_COPY_FIELD(Out, In, Info); \
- ACPI_COPY_FIELD(Out, In, Granularity); \
- ACPI_COPY_FIELD(Out, In, Minimum); \
- ACPI_COPY_FIELD(Out, In, Maximum); \
- ACPI_COPY_FIELD(Out, In, TranslationOffset); \
- ACPI_COPY_FIELD(Out, In, AddressLength); \
+ ACPI_COPY_FIELD(Out, In, Address.Granularity); \
+ ACPI_COPY_FIELD(Out, In, Address.Minimum); \
+ ACPI_COPY_FIELD(Out, In, Address.Maximum); \
+ ACPI_COPY_FIELD(Out, In, Address.TranslationOffset); \
+ ACPI_COPY_FIELD(Out, In, Address.AddressLength); \
ACPI_COPY_FIELD(Out, In, ResourceSource);
diff --git a/sys/contrib/dev/acpica/components/tables/tbdata.c b/sys/contrib/dev/acpica/components/tables/tbdata.c
index 4ff62dd..70bac2c 100644
--- a/sys/contrib/dev/acpica/components/tables/tbdata.c
+++ b/sys/contrib/dev/acpica/components/tables/tbdata.c
@@ -121,7 +121,8 @@ AcpiTbAcquireTable (
case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL:
case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL:
- Table = ACPI_CAST_PTR (ACPI_TABLE_HEADER, TableDesc->Address);
+ Table = ACPI_CAST_PTR (ACPI_TABLE_HEADER,
+ ACPI_PHYSADDR_TO_PTR (TableDesc->Address));
break;
default:
@@ -227,7 +228,8 @@ AcpiTbAcquireTempTable (
case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL:
case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL:
- TableHeader = ACPI_CAST_PTR (ACPI_TABLE_HEADER, Address);
+ TableHeader = ACPI_CAST_PTR (ACPI_TABLE_HEADER,
+ ACPI_PHYSADDR_TO_PTR (Address));
if (!TableHeader)
{
return (AE_NO_MEMORY);
@@ -437,11 +439,11 @@ AcpiTbVerifyTempTable (
if (ACPI_FAILURE (Status))
{
ACPI_EXCEPTION ((AE_INFO, AE_NO_MEMORY,
- "%4.4s " ACPI_PRINTF_UINT
+ "%4.4s 0x%8.8X%8.8X"
" Attempted table install failed",
AcpiUtValidAcpiName (TableDesc->Signature.Ascii) ?
TableDesc->Signature.Ascii : "????",
- ACPI_FORMAT_TO_UINT (TableDesc->Address)));
+ ACPI_FORMAT_UINT64 (TableDesc->Address)));
goto InvalidateAndExit;
}
}
@@ -529,21 +531,24 @@ AcpiTbResizeRootTableList (
/*******************************************************************************
*
- * FUNCTION: AcpiTbGetNextRootIndex
+ * FUNCTION: AcpiTbGetNextTableDescriptor
*
* PARAMETERS: TableIndex - Where table index is returned
+ * TableDesc - Where table descriptor is returned
*
- * RETURN: Status and table index.
+ * RETURN: Status and table index/descriptor.
*
* DESCRIPTION: Allocate a new ACPI table entry to the global table list
*
******************************************************************************/
ACPI_STATUS
-AcpiTbGetNextRootIndex (
- UINT32 *TableIndex)
+AcpiTbGetNextTableDescriptor (
+ UINT32 *TableIndex,
+ ACPI_TABLE_DESC **TableDesc)
{
ACPI_STATUS Status;
+ UINT32 i;
/* Ensure that there is room for the table in the Root Table List */
@@ -558,8 +563,18 @@ AcpiTbGetNextRootIndex (
}
}
- *TableIndex = AcpiGbl_RootTableList.CurrentTableCount;
+ i = AcpiGbl_RootTableList.CurrentTableCount;
AcpiGbl_RootTableList.CurrentTableCount++;
+
+ if (TableIndex)
+ {
+ *TableIndex = i;
+ }
+ if (TableDesc)
+ {
+ *TableDesc = &AcpiGbl_RootTableList.Tables[i];
+ }
+
return (AE_OK);
}
diff --git a/sys/contrib/dev/acpica/components/tables/tbinstal.c b/sys/contrib/dev/acpica/components/tables/tbinstal.c
index 2fe219d..d77d2c8 100644
--- a/sys/contrib/dev/acpica/components/tables/tbinstal.c
+++ b/sys/contrib/dev/acpica/components/tables/tbinstal.c
@@ -201,8 +201,8 @@ AcpiTbInstallFixedTable (
ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL);
if (ACPI_FAILURE (Status))
{
- ACPI_ERROR ((AE_INFO, "Could not acquire table length at %p",
- ACPI_CAST_PTR (void, Address)));
+ ACPI_ERROR ((AE_INFO, "Could not acquire table length at %8.8X%8.8X",
+ ACPI_FORMAT_UINT64 (Address)));
return_ACPI_STATUS (Status);
}
@@ -268,8 +268,8 @@ AcpiTbInstallStandardTable (
Status = AcpiTbAcquireTempTable (&NewTableDesc, Address, Flags);
if (ACPI_FAILURE (Status))
{
- ACPI_ERROR ((AE_INFO, "Could not acquire table length at %p",
- ACPI_CAST_PTR (void, Address)));
+ ACPI_ERROR ((AE_INFO, "Could not acquire table length at %8.8X%8.8X",
+ ACPI_FORMAT_UINT64 (Address)));
return_ACPI_STATUS (Status);
}
@@ -281,8 +281,8 @@ AcpiTbInstallStandardTable (
AcpiGbl_DisableSsdtTableInstall &&
ACPI_COMPARE_NAME (&NewTableDesc.Signature, ACPI_SIG_SSDT))
{
- ACPI_INFO ((AE_INFO, "Ignoring installation of %4.4s at %p",
- NewTableDesc.Signature.Ascii, ACPI_CAST_PTR (void, Address)));
+ ACPI_INFO ((AE_INFO, "Ignoring installation of %4.4s at %8.8X%8.8X",
+ NewTableDesc.Signature.Ascii, ACPI_FORMAT_UINT64 (Address)));
goto ReleaseAndExit;
}
@@ -368,7 +368,6 @@ AcpiTbInstallStandardTable (
*/
AcpiTbUninstallTable (&NewTableDesc);
*TableIndex = i;
- (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
return_ACPI_STATUS (AE_OK);
}
}
@@ -376,7 +375,7 @@ AcpiTbInstallStandardTable (
/* Add the table to the global root table list */
- Status = AcpiTbGetNextRootIndex (&i);
+ Status = AcpiTbGetNextTableDescriptor (&i, NULL);
if (ACPI_FAILURE (Status))
{
goto ReleaseAndExit;
@@ -459,11 +458,11 @@ FinishOverride:
return;
}
- ACPI_INFO ((AE_INFO, "%4.4s " ACPI_PRINTF_UINT
- " %s table override, new table: " ACPI_PRINTF_UINT,
+ ACPI_INFO ((AE_INFO, "%4.4s 0x%8.8X%8.8X"
+ " %s table override, new table: 0x%8.8X%8.8X",
OldTableDesc->Signature.Ascii,
- ACPI_FORMAT_TO_UINT (OldTableDesc->Address),
- OverrideType, ACPI_FORMAT_TO_UINT (NewTableDesc.Address)));
+ ACPI_FORMAT_UINT64 (OldTableDesc->Address),
+ OverrideType, ACPI_FORMAT_UINT64 (NewTableDesc.Address)));
/* We can now uninstall the original table */
@@ -485,49 +484,6 @@ FinishOverride:
/*******************************************************************************
*
- * FUNCTION: AcpiTbStoreTable
- *
- * PARAMETERS: Address - Table address
- * Table - Table header
- * Length - Table length
- * Flags - Install flags
- * TableIndex - Where the table index is returned
- *
- * RETURN: Status and table index.
- *
- * DESCRIPTION: Add an ACPI table to the global table list
- *
- ******************************************************************************/
-
-ACPI_STATUS
-AcpiTbStoreTable (
- ACPI_PHYSICAL_ADDRESS Address,
- ACPI_TABLE_HEADER *Table,
- UINT32 Length,
- UINT8 Flags,
- UINT32 *TableIndex)
-{
- ACPI_STATUS Status;
- ACPI_TABLE_DESC *TableDesc;
-
-
- Status = AcpiTbGetNextRootIndex (TableIndex);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- /* Initialize added table */
-
- TableDesc = &AcpiGbl_RootTableList.Tables[*TableIndex];
- AcpiTbInitTableDescriptor (TableDesc, Address, Flags, Table);
- TableDesc->Pointer = Table;
- return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
* FUNCTION: AcpiTbUninstallTable
*
* PARAMETERS: TableDesc - Table descriptor
@@ -558,7 +514,7 @@ AcpiTbUninstallTable (
if ((TableDesc->Flags & ACPI_TABLE_ORIGIN_MASK) ==
ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL)
{
- ACPI_FREE (ACPI_CAST_PTR (void, TableDesc->Address));
+ ACPI_FREE (ACPI_PHYSADDR_TO_PTR (TableDesc->Address));
}
TableDesc->Address = ACPI_PTR_TO_PHYSADDR (NULL);
diff --git a/sys/contrib/dev/acpica/components/tables/tbprint.c b/sys/contrib/dev/acpica/components/tables/tbprint.c
index 8be1a9f..f0ea090 100644
--- a/sys/contrib/dev/acpica/components/tables/tbprint.c
+++ b/sys/contrib/dev/acpica/components/tables/tbprint.c
@@ -144,18 +144,12 @@ AcpiTbPrintTableHeader (
ACPI_TABLE_HEADER LocalHeader;
- /*
- * The reason that we use ACPI_PRINTF_UINT and ACPI_FORMAT_TO_UINT is to
- * support both 32-bit and 64-bit hosts/addresses in a consistent manner.
- * The %p specifier does not emit uniform output on all hosts. On some,
- * leading zeros are not supported.
- */
if (ACPI_COMPARE_NAME (Header->Signature, ACPI_SIG_FACS))
{
/* FACS only has signature and length fields */
- ACPI_INFO ((AE_INFO, "%-4.4s " ACPI_PRINTF_UINT " %06X",
- Header->Signature, ACPI_FORMAT_TO_UINT (Address),
+ ACPI_INFO ((AE_INFO, "%-4.4s 0x%8.8X%8.8X %06X",
+ Header->Signature, ACPI_FORMAT_UINT64 (Address),
Header->Length));
}
else if (ACPI_VALIDATE_RSDP_SIG (Header->Signature))
@@ -166,8 +160,8 @@ AcpiTbPrintTableHeader (
ACPI_CAST_PTR (ACPI_TABLE_RSDP, Header)->OemId, ACPI_OEM_ID_SIZE);
AcpiTbFixString (LocalHeader.OemId, ACPI_OEM_ID_SIZE);
- ACPI_INFO ((AE_INFO, "RSDP " ACPI_PRINTF_UINT " %06X (v%.2d %-6.6s)",
- ACPI_FORMAT_TO_UINT (Address),
+ ACPI_INFO ((AE_INFO, "RSDP 0x%8.8X%8.8X %06X (v%.2d %-6.6s)",
+ ACPI_FORMAT_UINT64 (Address),
(ACPI_CAST_PTR (ACPI_TABLE_RSDP, Header)->Revision > 0) ?
ACPI_CAST_PTR (ACPI_TABLE_RSDP, Header)->Length : 20,
ACPI_CAST_PTR (ACPI_TABLE_RSDP, Header)->Revision,
@@ -180,9 +174,9 @@ AcpiTbPrintTableHeader (
AcpiTbCleanupTableHeader (&LocalHeader, Header);
ACPI_INFO ((AE_INFO,
- "%-4.4s " ACPI_PRINTF_UINT
+ "%-4.4s 0x%8.8X%8.8X"
" %06X (v%.2d %-6.6s %-8.8s %08X %-4.4s %08X)",
- LocalHeader.Signature, ACPI_FORMAT_TO_UINT (Address),
+ LocalHeader.Signature, ACPI_FORMAT_UINT64 (Address),
LocalHeader.Length, LocalHeader.Revision, LocalHeader.OemId,
LocalHeader.OemTableId, LocalHeader.OemRevision,
LocalHeader.AslCompilerId, LocalHeader.AslCompilerRevision));
diff --git a/sys/contrib/dev/acpica/components/tables/tbxfroot.c b/sys/contrib/dev/acpica/components/tables/tbxfroot.c
index 26babdb..e3b93d3 100644
--- a/sys/contrib/dev/acpica/components/tables/tbxfroot.c
+++ b/sys/contrib/dev/acpica/components/tables/tbxfroot.c
@@ -158,7 +158,7 @@ AcpiTbValidateRsdp (
ACPI_STATUS
AcpiFindRootPointer (
- ACPI_SIZE *TableAddress)
+ ACPI_PHYSICAL_ADDRESS *TableAddress)
{
UINT8 *TablePtr;
UINT8 *MemRover;
@@ -218,7 +218,7 @@ AcpiFindRootPointer (
PhysicalAddress += (UINT32) ACPI_PTR_DIFF (MemRover, TablePtr);
- *TableAddress = PhysicalAddress;
+ *TableAddress = (ACPI_PHYSICAL_ADDRESS) PhysicalAddress;
return_ACPI_STATUS (AE_OK);
}
}
@@ -249,7 +249,7 @@ AcpiFindRootPointer (
PhysicalAddress = (UINT32)
(ACPI_HI_RSDP_WINDOW_BASE + ACPI_PTR_DIFF (MemRover, TablePtr));
- *TableAddress = PhysicalAddress;
+ *TableAddress = (ACPI_PHYSICAL_ADDRESS) PhysicalAddress;
return_ACPI_STATUS (AE_OK);
}
diff --git a/sys/contrib/dev/acpica/components/utilities/utaddress.c b/sys/contrib/dev/acpica/components/utilities/utaddress.c
index 02d6110..5ed2b4d 100644
--- a/sys/contrib/dev/acpica/components/utilities/utaddress.c
+++ b/sys/contrib/dev/acpica/components/utilities/utaddress.c
@@ -117,10 +117,10 @@ AcpiUtAddAddressRange (
AcpiGbl_AddressRangeList[SpaceId] = RangeInfo;
ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
- "\nAdded [%4.4s] address range: 0x%p-0x%p\n",
+ "\nAdded [%4.4s] address range: 0x%8.8X%8.8X-0x%8.8X%8.8X\n",
AcpiUtGetNodeName (RangeInfo->RegionNode),
- ACPI_CAST_PTR (void, Address),
- ACPI_CAST_PTR (void, RangeInfo->EndAddress)));
+ ACPI_FORMAT_UINT64 (Address),
+ ACPI_FORMAT_UINT64 (RangeInfo->EndAddress)));
(void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
return_ACPI_STATUS (AE_OK);
@@ -179,10 +179,10 @@ AcpiUtRemoveAddressRange (
}
ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
- "\nRemoved [%4.4s] address range: 0x%p-0x%p\n",
+ "\nRemoved [%4.4s] address range: 0x%8.8X%8.8X-0x%8.8X%8.8X\n",
AcpiUtGetNodeName (RangeInfo->RegionNode),
- ACPI_CAST_PTR (void, RangeInfo->StartAddress),
- ACPI_CAST_PTR (void, RangeInfo->EndAddress)));
+ ACPI_FORMAT_UINT64 (RangeInfo->StartAddress),
+ ACPI_FORMAT_UINT64 (RangeInfo->EndAddress)));
ACPI_FREE (RangeInfo);
return_VOID;
@@ -266,12 +266,12 @@ AcpiUtCheckAddressRange (
Pathname = AcpiNsGetExternalPathname (RangeInfo->RegionNode);
ACPI_WARNING ((AE_INFO,
- "%s range 0x%p-0x%p conflicts with OpRegion 0x%p-0x%p (%s)",
+ "%s range 0x%8.8X%8.8X-0x%8.8X%8.8X conflicts with OpRegion 0x%8.8X%8.8X-0x%8.8X%8.8X (%s)",
AcpiUtGetRegionName (SpaceId),
- ACPI_CAST_PTR (void, Address),
- ACPI_CAST_PTR (void, EndAddress),
- ACPI_CAST_PTR (void, RangeInfo->StartAddress),
- ACPI_CAST_PTR (void, RangeInfo->EndAddress),
+ ACPI_FORMAT_UINT64 (Address),
+ ACPI_FORMAT_UINT64 (EndAddress),
+ ACPI_FORMAT_UINT64 (RangeInfo->StartAddress),
+ ACPI_FORMAT_UINT64 (RangeInfo->EndAddress),
Pathname));
ACPI_FREE (Pathname);
}
diff --git a/sys/contrib/dev/acpica/components/utilities/utbuffer.c b/sys/contrib/dev/acpica/components/utilities/utbuffer.c
index 862ac6b..cc41419 100644
--- a/sys/contrib/dev/acpica/components/utilities/utbuffer.c
+++ b/sys/contrib/dev/acpica/components/utilities/utbuffer.c
@@ -158,6 +158,15 @@ AcpiUtDumpBuffer (
return;
}
+ /*
+ * Add comment characters so rest of line is ignored when
+ * compiled
+ */
+ if (j == 0)
+ {
+ AcpiOsPrintf ("// ");
+ }
+
BufChar = Buffer[(ACPI_SIZE) i + j];
if (ACPI_IS_PRINT (BufChar))
{
diff --git a/sys/contrib/dev/acpica/components/utilities/utglobal.c b/sys/contrib/dev/acpica/components/utilities/utglobal.c
index 1dfd3e1..e027aa1 100644
--- a/sys/contrib/dev/acpica/components/utilities/utglobal.c
+++ b/sys/contrib/dev/acpica/components/utilities/utglobal.c
@@ -111,12 +111,19 @@ const ACPI_PREDEFINED_NAMES AcpiGbl_PreDefinedNames[] =
{"_SB_", ACPI_TYPE_DEVICE, NULL},
{"_SI_", ACPI_TYPE_LOCAL_SCOPE, NULL},
{"_TZ_", ACPI_TYPE_DEVICE, NULL},
- {"_REV", ACPI_TYPE_INTEGER, (char *) ACPI_CA_SUPPORT_LEVEL},
+ /*
+ * March, 2015:
+ * The _REV object is in the process of being deprecated, because
+ * other ACPI implementations permanently return 2. Thus, it
+ * has little or no value. Return 2 for compatibility with
+ * other ACPI implementations.
+ */
+ {"_REV", ACPI_TYPE_INTEGER, ACPI_CAST_PTR (char, 2)},
{"_OS_", ACPI_TYPE_STRING, ACPI_OS_NAME},
- {"_GL_", ACPI_TYPE_MUTEX, (char *) 1},
+ {"_GL_", ACPI_TYPE_MUTEX, ACPI_CAST_PTR (char, 1)},
#if !defined (ACPI_NO_METHOD_EXECUTION) || defined (ACPI_CONSTANT_EVAL_ONLY)
- {"_OSI", ACPI_TYPE_METHOD, (char *) 1},
+ {"_OSI", ACPI_TYPE_METHOD, ACPI_CAST_PTR (char, 1)},
#endif
/* Table terminator */
diff --git a/sys/contrib/dev/acpica/components/utilities/utmisc.c b/sys/contrib/dev/acpica/components/utilities/utmisc.c
index d5d81ca..f3d2222 100644
--- a/sys/contrib/dev/acpica/components/utilities/utmisc.c
+++ b/sys/contrib/dev/acpica/components/utilities/utmisc.c
@@ -84,6 +84,7 @@ AcpiUtIsPciRootBridge (
}
+#if (defined ACPI_ASL_COMPILER || defined ACPI_EXEC_APP)
/*******************************************************************************
*
* FUNCTION: AcpiUtIsAmlTable
@@ -114,6 +115,7 @@ AcpiUtIsAmlTable (
return (FALSE);
}
+#endif
/*******************************************************************************
diff --git a/sys/contrib/dev/acpica/components/utilities/utosi.c b/sys/contrib/dev/acpica/components/utilities/utosi.c
index 6b225ca..bf6ba86 100644
--- a/sys/contrib/dev/acpica/components/utilities/utosi.c
+++ b/sys/contrib/dev/acpica/components/utilities/utosi.c
@@ -105,6 +105,7 @@ static ACPI_INTERFACE_INFO AcpiDefaultSupportedInterfaces[] =
{"Windows 2009", NULL, 0, ACPI_OSI_WIN_7}, /* Windows 7 and Server 2008 R2 - Added 09/2009 */
{"Windows 2012", NULL, 0, ACPI_OSI_WIN_8}, /* Windows 8 and Server 2012 - Added 08/2012 */
{"Windows 2013", NULL, 0, ACPI_OSI_WIN_8}, /* Windows 8.1 and Server 2012 R2 - Added 01/2014 */
+ {"Windows 2015", NULL, 0, ACPI_OSI_WIN_10}, /* Windows 10 - Added 03/2015 */
/* Feature Group Strings */
diff --git a/sys/contrib/dev/acpica/components/utilities/utprint.c b/sys/contrib/dev/acpica/components/utilities/utprint.c
index d870ad4..62aecf0 100644
--- a/sys/contrib/dev/acpica/components/utilities/utprint.c
+++ b/sys/contrib/dev/acpica/components/utilities/utprint.c
@@ -442,11 +442,11 @@ AcpiUtVsnprintf (
const char *Format,
va_list Args)
{
- UINT8 Base = 10;
- UINT8 Type = 0;
- INT32 Width = -1;
- INT32 Precision = -1;
- char Qualifier = 0;
+ UINT8 Base;
+ UINT8 Type;
+ INT32 Width;
+ INT32 Precision;
+ char Qualifier;
UINT64 Number;
char *Pos;
char *End;
@@ -468,6 +468,9 @@ AcpiUtVsnprintf (
continue;
}
+ Type = 0;
+ Base = 10;
+
/* Process sign */
do
diff --git a/sys/contrib/dev/acpica/components/utilities/utstate.c b/sys/contrib/dev/acpica/components/utilities/utstate.c
index d90d694..3396319 100644
--- a/sys/contrib/dev/acpica/components/utilities/utstate.c
+++ b/sys/contrib/dev/acpica/components/utilities/utstate.c
@@ -50,44 +50,6 @@
/*******************************************************************************
*
- * FUNCTION: AcpiUtCreatePkgStateAndPush
- *
- * PARAMETERS: Object - Object to be added to the new state
- * Action - Increment/Decrement
- * StateList - List the state will be added to
- *
- * RETURN: Status
- *
- * DESCRIPTION: Create a new state and push it
- *
- ******************************************************************************/
-
-ACPI_STATUS
-AcpiUtCreatePkgStateAndPush (
- void *InternalObject,
- void *ExternalObject,
- UINT16 Index,
- ACPI_GENERIC_STATE **StateList)
-{
- ACPI_GENERIC_STATE *State;
-
-
- ACPI_FUNCTION_ENTRY ();
-
-
- State = AcpiUtCreatePkgState (InternalObject, ExternalObject, Index);
- if (!State)
- {
- return (AE_NO_MEMORY);
- }
-
- AcpiUtPushGenericState (StateList, State);
- return (AE_OK);
-}
-
-
-/*******************************************************************************
- *
* FUNCTION: AcpiUtPushGenericState
*
* PARAMETERS: ListHead - Head of the state stack
diff --git a/sys/contrib/dev/acpica/components/utilities/utuuid.c b/sys/contrib/dev/acpica/components/utilities/utuuid.c
index 8b3cb99..435c6c3 100644
--- a/sys/contrib/dev/acpica/components/utilities/utuuid.c
+++ b/sys/contrib/dev/acpica/components/utilities/utuuid.c
@@ -48,6 +48,7 @@
ACPI_MODULE_NAME ("utuuid")
+#if (defined ACPI_ASL_COMPILER || defined ACPI_DISASSEMBLER || defined ACPI_EXEC_APP || defined ACPI_HELP_APP)
/*
* UUID support functions.
*
@@ -99,3 +100,4 @@ AcpiUtConvertStringToUuid (
AcpiUtAsciiCharToHex (InString[AcpiGbl_MapToUuidOffset[i] + 1]);
}
}
+#endif
diff --git a/sys/contrib/dev/acpica/include/acdebug.h b/sys/contrib/dev/acpica/include/acdebug.h
index f630575..23464d6 100644
--- a/sys/contrib/dev/acpica/include/acdebug.h
+++ b/sys/contrib/dev/acpica/include/acdebug.h
@@ -77,7 +77,7 @@ typedef struct acpi_db_execute_walk
#define PARAM_LIST(pl) pl
-#define DBTEST_OUTPUT_LEVEL(lvl) if (AcpiGbl_DbOpt_verbose)
+#define DBTEST_OUTPUT_LEVEL(lvl) if (AcpiGbl_DbOpt_Verbose)
#define VERBOSE_PRINT(fp) DBTEST_OUTPUT_LEVEL(lvl) {\
AcpiOsPrintf PARAM_LIST(fp);}
diff --git a/sys/contrib/dev/acpica/include/acdisasm.h b/sys/contrib/dev/acpica/include/acdisasm.h
index 34cf1f7..f4487e5 100644
--- a/sys/contrib/dev/acpica/include/acdisasm.h
+++ b/sys/contrib/dev/acpica/include/acdisasm.h
@@ -129,6 +129,7 @@ typedef enum
/* Types used only for the Data Table Compiler */
ACPI_DMT_BUFFER,
+ ACPI_DMT_RAW_BUFFER, /* Large, multiple line buffer */
ACPI_DMT_DEVICE_PATH,
ACPI_DMT_LABEL,
ACPI_DMT_PCI_PATH,
@@ -351,9 +352,7 @@ extern ACPI_DMTABLE_INFO AcpiDmTableInfoS3ptHdr[];
extern ACPI_DMTABLE_INFO AcpiDmTableInfoS3pt0[];
extern ACPI_DMTABLE_INFO AcpiDmTableInfoS3pt1[];
extern ACPI_DMTABLE_INFO AcpiDmTableInfoSbst[];
-extern ACPI_DMTABLE_INFO AcpiDmTableInfoSlicHdr[];
-extern ACPI_DMTABLE_INFO AcpiDmTableInfoSlic0[];
-extern ACPI_DMTABLE_INFO AcpiDmTableInfoSlic1[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoSlic[];
extern ACPI_DMTABLE_INFO AcpiDmTableInfoSlit[];
extern ACPI_DMTABLE_INFO AcpiDmTableInfoSpcr[];
extern ACPI_DMTABLE_INFO AcpiDmTableInfoSpmi[];
@@ -422,6 +421,15 @@ AcpiDmLineHeader2 (
* dmtbdump
*/
void
+AcpiDmDumpBuffer (
+ void *Table,
+ UINT32 BufferOffset,
+ UINT32 Length,
+ UINT32 AbsoluteOffset,
+ char *Header,
+ BOOLEAN MultiLine);
+
+void
AcpiDmDumpAsf (
ACPI_TABLE_HEADER *Table);
@@ -996,6 +1004,10 @@ AcpiDmCloseOperator (
*/
void
AdDisassemblerHeader (
- char *Filename);
+ char *Filename,
+ UINT8 TableType);
+
+#define ACPI_IS_AML_TABLE 0
+#define ACPI_IS_DATA_TABLE 1
#endif /* __ACDISASM_H__ */
diff --git a/sys/contrib/dev/acpica/include/acglobal.h b/sys/contrib/dev/acpica/include/acglobal.h
index 9b6e936..ab2fc26 100644
--- a/sys/contrib/dev/acpica/include/acglobal.h
+++ b/sys/contrib/dev/acpica/include/acglobal.h
@@ -310,9 +310,10 @@ ACPI_INIT_GLOBAL (UINT8, AcpiGbl_DbOutputFlags, ACPI_DB_CONSOLE_O
ACPI_INIT_GLOBAL (UINT8, AcpiGbl_NoResourceDisassembly, FALSE);
ACPI_INIT_GLOBAL (BOOLEAN, AcpiGbl_IgnoreNoopOperator, FALSE);
ACPI_INIT_GLOBAL (BOOLEAN, AcpiGbl_CstyleDisassembly, TRUE);
+ACPI_INIT_GLOBAL (BOOLEAN, AcpiGbl_ForceAmlDisassembly, FALSE);
-ACPI_GLOBAL (BOOLEAN, AcpiGbl_DbOpt_disasm);
-ACPI_GLOBAL (BOOLEAN, AcpiGbl_DbOpt_verbose);
+ACPI_GLOBAL (BOOLEAN, AcpiGbl_DbOpt_Disasm);
+ACPI_GLOBAL (BOOLEAN, AcpiGbl_DbOpt_Verbose);
ACPI_GLOBAL (BOOLEAN, AcpiGbl_NumExternalMethods);
ACPI_GLOBAL (UINT32, AcpiGbl_ResolvedExternalMethods);
ACPI_GLOBAL (ACPI_EXTERNAL_LIST *, AcpiGbl_ExternalList);
@@ -325,9 +326,7 @@ ACPI_INIT_GLOBAL (BOOLEAN, AcpiGbl_DbTerminateThreads, FALSE);
ACPI_INIT_GLOBAL (BOOLEAN, AcpiGbl_AbortMethod, FALSE);
ACPI_INIT_GLOBAL (BOOLEAN, AcpiGbl_MethodExecuting, FALSE);
-ACPI_GLOBAL (BOOLEAN, AcpiGbl_DbOpt_tables);
-ACPI_GLOBAL (BOOLEAN, AcpiGbl_DbOpt_stats);
-ACPI_GLOBAL (BOOLEAN, AcpiGbl_DbOpt_ini_methods);
+ACPI_GLOBAL (BOOLEAN, AcpiGbl_DbOpt_NoIniMethods);
ACPI_GLOBAL (BOOLEAN, AcpiGbl_DbOpt_NoRegionSupport);
ACPI_GLOBAL (BOOLEAN, AcpiGbl_DbOutputToFile);
ACPI_GLOBAL (char *, AcpiGbl_DbBuffer);
diff --git a/sys/contrib/dev/acpica/include/aclocal.h b/sys/contrib/dev/acpica/include/aclocal.h
index 5f9b0f3..9729930 100644
--- a/sys/contrib/dev/acpica/include/aclocal.h
+++ b/sys/contrib/dev/acpica/include/aclocal.h
@@ -54,7 +54,7 @@ typedef UINT32 ACPI_MUTEX_HANDLE;
/* Total number of aml opcodes defined */
-#define AML_NUM_OPCODES 0x81
+#define AML_NUM_OPCODES 0x82
/* Forward declarations */
diff --git a/sys/contrib/dev/acpica/include/acmacros.h b/sys/contrib/dev/acpica/include/acmacros.h
index b23d175..35d53f6 100644
--- a/sys/contrib/dev/acpica/include/acmacros.h
+++ b/sys/contrib/dev/acpica/include/acmacros.h
@@ -64,23 +64,12 @@
#define ACPI_SET64(ptr, val) (*ACPI_CAST64 (ptr) = (UINT64) (val))
/*
- * printf() format helpers. These macros are workarounds for the difficulties
+ * printf() format helper. This macros is a workaround for the difficulties
* with emitting 64-bit integers and 64-bit pointers with the same code
* for both 32-bit and 64-bit hosts.
*/
#define ACPI_FORMAT_UINT64(i) ACPI_HIDWORD(i), ACPI_LODWORD(i)
-#if ACPI_MACHINE_WIDTH == 64
-#define ACPI_FORMAT_NATIVE_UINT(i) ACPI_FORMAT_UINT64(i)
-#define ACPI_FORMAT_TO_UINT(i) ACPI_FORMAT_UINT64(i)
-#define ACPI_PRINTF_UINT "0x%8.8X%8.8X"
-
-#else
-#define ACPI_FORMAT_NATIVE_UINT(i) 0, (UINT32) (i)
-#define ACPI_FORMAT_TO_UINT(i) (UINT32) (i)
-#define ACPI_PRINTF_UINT "0x%8.8X"
-#endif
-
/*
* Macros for moving data around to/from buffers that are possibly unaligned.
diff --git a/sys/contrib/dev/acpica/include/acopcode.h b/sys/contrib/dev/acpica/include/acopcode.h
index f4ba55d..9432d61 100644
--- a/sys/contrib/dev/acpica/include/acopcode.h
+++ b/sys/contrib/dev/acpica/include/acopcode.h
@@ -112,6 +112,7 @@
#define ARGP_DWORD_OP ARGP_LIST1 (ARGP_DWORDDATA)
#define ARGP_ELSE_OP ARGP_LIST2 (ARGP_PKGLENGTH, ARGP_TERMLIST)
#define ARGP_EVENT_OP ARGP_LIST1 (ARGP_NAME)
+#define ARGP_EXTERNAL_OP ARGP_LIST3 (ARGP_NAMESTRING, ARGP_BYTEDATA, ARGP_BYTEDATA)
#define ARGP_FATAL_OP ARGP_LIST3 (ARGP_BYTEDATA, ARGP_DWORDDATA, ARGP_TERMARG)
#define ARGP_FIELD_OP ARGP_LIST4 (ARGP_PKGLENGTH, ARGP_NAMESTRING, ARGP_BYTEDATA, ARGP_FIELDLIST)
#define ARGP_FIND_SET_LEFT_BIT_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET)
@@ -245,6 +246,7 @@
#define ARGI_DWORD_OP ARGI_INVALID_OPCODE
#define ARGI_ELSE_OP ARGI_INVALID_OPCODE
#define ARGI_EVENT_OP ARGI_INVALID_OPCODE
+#define ARGI_EXTERNAL_OP ARGI_LIST3 (ARGI_STRING, ARGI_INTEGER, ARGI_INTEGER)
#define ARGI_FATAL_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_INTEGER)
#define ARGI_FIELD_OP ARGI_INVALID_OPCODE
#define ARGI_FIND_SET_LEFT_BIT_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_TARGETREF)
diff --git a/sys/contrib/dev/acpica/include/acpixf.h b/sys/contrib/dev/acpica/include/acpixf.h
index 26988ab..8f6e089 100644
--- a/sys/contrib/dev/acpica/include/acpixf.h
+++ b/sys/contrib/dev/acpica/include/acpixf.h
@@ -46,7 +46,7 @@
/* Current ACPICA subsystem version in YYYYMMDD format */
-#define ACPI_CA_VERSION 0x20150204
+#define ACPI_CA_VERSION 0x20150410
#include <contrib/dev/acpica/include/acconfig.h>
#include <contrib/dev/acpica/include/actypes.h>
@@ -503,7 +503,7 @@ AcpiReallocateRootTable (
ACPI_EXTERNAL_RETURN_STATUS (
ACPI_STATUS
AcpiFindRootPointer (
- ACPI_SIZE *RsdpAddress))
+ ACPI_PHYSICAL_ADDRESS *RsdpAddress))
ACPI_EXTERNAL_RETURN_STATUS (
ACPI_STATUS
diff --git a/sys/contrib/dev/acpica/include/acresrc.h b/sys/contrib/dev/acpica/include/acresrc.h
index 3b62275..ef3265876 100644
--- a/sys/contrib/dev/acpica/include/acresrc.h
+++ b/sys/contrib/dev/acpica/include/acresrc.h
@@ -352,8 +352,9 @@ AcpiRsSetResourceLength (
/*
- * rsdump
+ * rsdump - Debugger support
*/
+#ifdef ACPI_DEBUGGER
void
AcpiRsDumpResourceList (
ACPI_RESOURCE *Resource);
@@ -361,6 +362,7 @@ AcpiRsDumpResourceList (
void
AcpiRsDumpIrqList (
UINT8 *RouteTable);
+#endif
/*
diff --git a/sys/contrib/dev/acpica/include/acrestyp.h b/sys/contrib/dev/acpica/include/acrestyp.h
index 971dd72..d695451 100644
--- a/sys/contrib/dev/acpica/include/acrestyp.h
+++ b/sys/contrib/dev/acpica/include/acrestyp.h
@@ -345,6 +345,36 @@ typedef struct acpi_resource_source
UINT8 MaxAddressFixed; \
ACPI_RESOURCE_ATTRIBUTE Info;
+typedef struct acpi_address16_attribute
+{
+ UINT16 Granularity;
+ UINT16 Minimum;
+ UINT16 Maximum;
+ UINT16 TranslationOffset;
+ UINT16 AddressLength;
+
+} ACPI_ADDRESS16_ATTRIBUTE;
+
+typedef struct acpi_address32_attribute
+{
+ UINT32 Granularity;
+ UINT32 Minimum;
+ UINT32 Maximum;
+ UINT32 TranslationOffset;
+ UINT32 AddressLength;
+
+} ACPI_ADDRESS32_ATTRIBUTE;
+
+typedef struct acpi_address64_attribute
+{
+ UINT64 Granularity;
+ UINT64 Minimum;
+ UINT64 Maximum;
+ UINT64 TranslationOffset;
+ UINT64 AddressLength;
+
+} ACPI_ADDRESS64_ATTRIBUTE;
+
typedef struct acpi_resource_address
{
ACPI_RESOURCE_ADDRESS_COMMON
@@ -354,11 +384,7 @@ typedef struct acpi_resource_address
typedef struct acpi_resource_address16
{
ACPI_RESOURCE_ADDRESS_COMMON
- UINT16 Granularity;
- UINT16 Minimum;
- UINT16 Maximum;
- UINT16 TranslationOffset;
- UINT16 AddressLength;
+ ACPI_ADDRESS16_ATTRIBUTE Address;
ACPI_RESOURCE_SOURCE ResourceSource;
} ACPI_RESOURCE_ADDRESS16;
@@ -366,11 +392,7 @@ typedef struct acpi_resource_address16
typedef struct acpi_resource_address32
{
ACPI_RESOURCE_ADDRESS_COMMON
- UINT32 Granularity;
- UINT32 Minimum;
- UINT32 Maximum;
- UINT32 TranslationOffset;
- UINT32 AddressLength;
+ ACPI_ADDRESS32_ATTRIBUTE Address;
ACPI_RESOURCE_SOURCE ResourceSource;
} ACPI_RESOURCE_ADDRESS32;
@@ -378,11 +400,7 @@ typedef struct acpi_resource_address32
typedef struct acpi_resource_address64
{
ACPI_RESOURCE_ADDRESS_COMMON
- UINT64 Granularity;
- UINT64 Minimum;
- UINT64 Maximum;
- UINT64 TranslationOffset;
- UINT64 AddressLength;
+ ACPI_ADDRESS64_ATTRIBUTE Address;
ACPI_RESOURCE_SOURCE ResourceSource;
} ACPI_RESOURCE_ADDRESS64;
@@ -391,11 +409,7 @@ typedef struct acpi_resource_extended_address64
{
ACPI_RESOURCE_ADDRESS_COMMON
UINT8 RevisionID;
- UINT64 Granularity;
- UINT64 Minimum;
- UINT64 Maximum;
- UINT64 TranslationOffset;
- UINT64 AddressLength;
+ ACPI_ADDRESS64_ATTRIBUTE Address;
UINT64 TypeSpecific;
} ACPI_RESOURCE_EXTENDED_ADDRESS64;
diff --git a/sys/contrib/dev/acpica/include/acstruct.h b/sys/contrib/dev/acpica/include/acstruct.h
index 1de614f..547921b 100644
--- a/sys/contrib/dev/acpica/include/acstruct.h
+++ b/sys/contrib/dev/acpica/include/acstruct.h
@@ -69,11 +69,6 @@
#define ACPI_WALK_METHOD 0x01
#define ACPI_WALK_METHOD_RESTART 0x02
-/* Flags for iASL compiler only */
-
-#define ACPI_WALK_CONST_REQUIRED 0x10
-#define ACPI_WALK_CONST_OPTIONAL 0x20
-
typedef struct acpi_walk_state
{
diff --git a/sys/contrib/dev/acpica/include/actables.h b/sys/contrib/dev/acpica/include/actables.h
index bc1574d..3eb02d3 100644
--- a/sys/contrib/dev/acpica/include/actables.h
+++ b/sys/contrib/dev/acpica/include/actables.h
@@ -70,8 +70,9 @@ AcpiTbScanMemoryForRsdp (
* tbdata - table data structure management
*/
ACPI_STATUS
-AcpiTbGetNextRootIndex (
- UINT32 *TableIndex);
+AcpiTbGetNextTableDescriptor (
+ UINT32 *TableIndex,
+ ACPI_TABLE_DESC **TableDesc);
void
AcpiTbInitTableDescriptor (
@@ -173,14 +174,6 @@ AcpiTbInstallStandardTable (
BOOLEAN Override,
UINT32 *TableIndex);
-ACPI_STATUS
-AcpiTbStoreTable (
- ACPI_PHYSICAL_ADDRESS Address,
- ACPI_TABLE_HEADER *Table,
- UINT32 Length,
- UINT8 Flags,
- UINT32 *TableIndex);
-
void
AcpiTbUninstallTable (
ACPI_TABLE_DESC *TableDesc);
diff --git a/sys/contrib/dev/acpica/include/actbl2.h b/sys/contrib/dev/acpica/include/actbl2.h
index f8a0278..5cdf904 100644
--- a/sys/contrib/dev/acpica/include/actbl2.h
+++ b/sys/contrib/dev/acpica/include/actbl2.h
@@ -75,6 +75,7 @@
#define ACPI_SIG_LPIT "LPIT" /* Low Power Idle Table */
#define ACPI_SIG_MCFG "MCFG" /* PCI Memory Mapped Configuration table */
#define ACPI_SIG_MCHI "MCHI" /* Management Controller Host Interface table */
+#define ACPI_SIG_MSDM "MSDM" /* Microsoft Data Management Table */
#define ACPI_SIG_MTMR "MTMR" /* MID Timer table */
#define ACPI_SIG_SLIC "SLIC" /* Software Licensing Description Table */
#define ACPI_SIG_SPCR "SPCR" /* Serial Port Console Redirection table */
@@ -980,7 +981,8 @@ typedef struct acpi_lpit_header
enum AcpiLpitType
{
ACPI_LPIT_TYPE_NATIVE_CSTATE = 0x00,
- ACPI_LPIT_TYPE_SIMPLE_IO = 0x01
+ ACPI_LPIT_TYPE_SIMPLE_IO = 0x01,
+ ACPI_LPIT_TYPE_RESERVED = 0x02 /* 2 and above are reserved */
};
/* Masks for Flags field above */
@@ -1085,6 +1087,24 @@ typedef struct acpi_table_mchi
/*******************************************************************************
*
+ * MSDM - Microsoft Data Management table
+ *
+ * Conforms to "Microsoft Software Licensing Tables (SLIC and MSDM)",
+ * November 29, 2011. Copyright 2011 Microsoft
+ *
+ ******************************************************************************/
+
+/* Basic MSDM table is only the common ACPI header */
+
+typedef struct acpi_table_msdm
+{
+ ACPI_TABLE_HEADER Header; /* Common ACPI table header */
+
+} ACPI_TABLE_MSDM;
+
+
+/*******************************************************************************
+ *
* MTMR - MID Timer Table
* Version 1
*
@@ -1114,10 +1134,9 @@ typedef struct acpi_mtmr_entry
/*******************************************************************************
*
* SLIC - Software Licensing Description Table
- * Version 1
*
- * Conforms to "OEM Activation 2.0 for Windows Vista Operating Systems",
- * Copyright 2006
+ * Conforms to "Microsoft Software Licensing Tables (SLIC and MSDM)",
+ * November 29, 2011. Copyright 2011 Microsoft
*
******************************************************************************/
@@ -1130,62 +1149,6 @@ typedef struct acpi_table_slic
} ACPI_TABLE_SLIC;
-/* Common SLIC subtable header */
-
-typedef struct acpi_slic_header
-{
- UINT32 Type;
- UINT32 Length;
-
-} ACPI_SLIC_HEADER;
-
-/* Values for Type field above */
-
-enum AcpiSlicType
-{
- ACPI_SLIC_TYPE_PUBLIC_KEY = 0,
- ACPI_SLIC_TYPE_WINDOWS_MARKER = 1,
- ACPI_SLIC_TYPE_RESERVED = 2 /* 2 and greater are reserved */
-};
-
-
-/*
- * SLIC Subtables, correspond to Type in ACPI_SLIC_HEADER
- */
-
-/* 0: Public Key Structure */
-
-typedef struct acpi_slic_key
-{
- ACPI_SLIC_HEADER Header;
- UINT8 KeyType;
- UINT8 Version;
- UINT16 Reserved;
- UINT32 Algorithm;
- char Magic[4];
- UINT32 BitLength;
- UINT32 Exponent;
- UINT8 Modulus[128];
-
-} ACPI_SLIC_KEY;
-
-
-/* 1: Windows Marker Structure */
-
-typedef struct acpi_slic_marker
-{
- ACPI_SLIC_HEADER Header;
- UINT32 Version;
- char OemId[ACPI_OEM_ID_SIZE]; /* ASCII OEM identification */
- char OemTableId[ACPI_OEM_TABLE_ID_SIZE]; /* ASCII OEM table identification */
- char WindowsFlag[8];
- UINT32 SlicVersion;
- UINT8 Reserved[16];
- UINT8 Signature[128];
-
-} ACPI_SLIC_MARKER;
-
-
/*******************************************************************************
*
* SPCR - Serial Port Console Redirection table
diff --git a/sys/contrib/dev/acpica/include/actypes.h b/sys/contrib/dev/acpica/include/actypes.h
index c6f2170..79ae310 100644
--- a/sys/contrib/dev/acpica/include/actypes.h
+++ b/sys/contrib/dev/acpica/include/actypes.h
@@ -201,9 +201,29 @@ typedef int INT32;
typedef INT32 ACPI_NATIVE_INT;
typedef UINT32 ACPI_SIZE;
+
+#ifdef ACPI_32BIT_PHYSICAL_ADDRESS
+
+/*
+ * OSPMs can define this to shrink the size of the structures for 32-bit
+ * none PAE environment. ASL compiler may always define this to generate
+ * 32-bit OSPM compliant tables.
+ */
typedef UINT32 ACPI_IO_ADDRESS;
typedef UINT32 ACPI_PHYSICAL_ADDRESS;
+#else /* ACPI_32BIT_PHYSICAL_ADDRESS */
+
+/*
+ * It is reported that, after some calculations, the physical addresses can
+ * wrap over the 32-bit boundary on 32-bit PAE environment.
+ * https://bugzilla.kernel.org/show_bug.cgi?id=87971
+ */
+typedef UINT64 ACPI_IO_ADDRESS;
+typedef UINT64 ACPI_PHYSICAL_ADDRESS;
+
+#endif /* ACPI_32BIT_PHYSICAL_ADDRESS */
+
#define ACPI_MAX_PTR ACPI_UINT32_MAX
#define ACPI_SIZE_MAX ACPI_UINT32_MAX
@@ -720,23 +740,26 @@ typedef UINT32 ACPI_EVENT_TYPE;
* The encoding of ACPI_EVENT_STATUS is illustrated below.
* Note that a set bit (1) indicates the property is TRUE
* (e.g. if bit 0 is set then the event is enabled).
- * +-------------+-+-+-+-+
- * | Bits 31:4 |3|2|1|0|
- * +-------------+-+-+-+-+
- * | | | | |
- * | | | | +- Enabled?
- * | | | +--- Enabled for wake?
- * | | +----- Set?
- * | +------- Has a handler?
- * +------------- <Reserved>
+ * +-------------+-+-+-+-+-+
+ * | Bits 31:5 |4|3|2|1|0|
+ * +-------------+-+-+-+-+-+
+ * | | | | | |
+ * | | | | | +- Enabled?
+ * | | | | +--- Enabled for wake?
+ * | | | +----- Status bit set?
+ * | | +------- Enable bit set?
+ * | +--------- Has a handler?
+ * +--------------- <Reserved>
*/
typedef UINT32 ACPI_EVENT_STATUS;
#define ACPI_EVENT_FLAG_DISABLED (ACPI_EVENT_STATUS) 0x00
#define ACPI_EVENT_FLAG_ENABLED (ACPI_EVENT_STATUS) 0x01
#define ACPI_EVENT_FLAG_WAKE_ENABLED (ACPI_EVENT_STATUS) 0x02
-#define ACPI_EVENT_FLAG_SET (ACPI_EVENT_STATUS) 0x04
-#define ACPI_EVENT_FLAG_HAS_HANDLER (ACPI_EVENT_STATUS) 0x08
+#define ACPI_EVENT_FLAG_STATUS_SET (ACPI_EVENT_STATUS) 0x04
+#define ACPI_EVENT_FLAG_ENABLE_SET (ACPI_EVENT_STATUS) 0x08
+#define ACPI_EVENT_FLAG_HAS_HANDLER (ACPI_EVENT_STATUS) 0x10
+#define ACPI_EVENT_FLAG_SET ACPI_EVENT_FLAG_STATUS_SET
/* Actions for AcpiSetGpe, AcpiGpeWakeup, AcpiHwLowSetGpe */
@@ -1344,6 +1367,7 @@ typedef struct acpi_memory_list
#define ACPI_OSI_WIN_VISTA_SP2 0x0A
#define ACPI_OSI_WIN_7 0x0B
#define ACPI_OSI_WIN_8 0x0C
+#define ACPI_OSI_WIN_10 0x0D
/* Definitions of file IO */
diff --git a/sys/contrib/dev/acpica/include/acutils.h b/sys/contrib/dev/acpica/include/acutils.h
index a651863..85426bf 100644
--- a/sys/contrib/dev/acpica/include/acutils.h
+++ b/sys/contrib/dev/acpica/include/acutils.h
@@ -723,6 +723,12 @@ const ACPI_PREDEFINED_INFO *
AcpiUtMatchPredefinedMethod (
char *Name);
+void
+AcpiUtGetExpectedReturnTypes (
+ char *Buffer,
+ UINT32 ExpectedBtypes);
+
+#if (defined ACPI_ASL_COMPILER || defined ACPI_HELP_APP)
const ACPI_PREDEFINED_INFO *
AcpiUtMatchResourceName (
char *Name);
@@ -733,15 +739,11 @@ AcpiUtDisplayPredefinedMethod (
const ACPI_PREDEFINED_INFO *ThisName,
BOOLEAN MultiLine);
-void
-AcpiUtGetExpectedReturnTypes (
- char *Buffer,
- UINT32 ExpectedBtypes);
-
UINT32
AcpiUtGetResourceBitWidth (
char *Buffer,
UINT16 Types);
+#endif
/*
@@ -782,13 +784,6 @@ AcpiUtCreateUpdateStateAndPush (
UINT16 Action,
ACPI_GENERIC_STATE **StateList);
-ACPI_STATUS
-AcpiUtCreatePkgStateAndPush (
- void *InternalObject,
- void *ExternalObject,
- UINT16 Index,
- ACPI_GENERIC_STATE **StateList);
-
ACPI_GENERIC_STATE *
AcpiUtCreateControlState (
void);
@@ -827,9 +822,11 @@ BOOLEAN
AcpiUtIsPciRootBridge (
char *Id);
+#if (defined ACPI_ASL_COMPILER || defined ACPI_EXEC_APP)
BOOLEAN
AcpiUtIsAmlTable (
ACPI_TABLE_HEADER *Table);
+#endif
ACPI_STATUS
AcpiUtWalkPackageTree (
@@ -918,6 +915,7 @@ void
AcpiUtStrupr (
char *SrcString);
+#ifdef ACPI_ASL_COMPILER
void
AcpiUtStrlwr (
char *SrcString);
@@ -926,6 +924,7 @@ int
AcpiUtStricmp (
char *String1,
char *String2);
+#endif
ACPI_STATUS
AcpiUtStrtoul64 (
@@ -938,9 +937,11 @@ AcpiUtPrintString (
char *String,
UINT16 MaxLength);
+#if defined ACPI_ASL_COMPILER || defined ACPI_EXEC_APP
void
UtConvertBackslashes (
char *Pathname);
+#endif
BOOLEAN
AcpiUtValidAcpiName (
@@ -1189,9 +1190,11 @@ AcpiUtFilePrintf (
/*
* utuuid -- UUID support functions
*/
+#if (defined ACPI_ASL_COMPILER || defined ACPI_DISASSEMBLER || defined ACPI_EXEC_APP || defined ACPI_HELP_APP)
void
AcpiUtConvertStringToUuid (
char *InString,
UINT8 *UuidBuffer);
+#endif
#endif /* _ACUTILS_H */
diff --git a/sys/contrib/dev/acpica/include/amlcode.h b/sys/contrib/dev/acpica/include/amlcode.h
index 03530b9..d56f6d9 100644
--- a/sys/contrib/dev/acpica/include/amlcode.h
+++ b/sys/contrib/dev/acpica/include/amlcode.h
@@ -65,6 +65,7 @@
#define AML_PACKAGE_OP (UINT16) 0x12
#define AML_VAR_PACKAGE_OP (UINT16) 0x13 /* ACPI 2.0 */
#define AML_METHOD_OP (UINT16) 0x14
+#define AML_EXTERNAL_OP (UINT16) 0x15 /* ACPI 6.0 */
#define AML_DUAL_NAME_PREFIX (UINT16) 0x2e
#define AML_MULTI_NAME_PREFIX_OP (UINT16) 0x2f
#define AML_NAME_CHAR_SUBSEQ (UINT16) 0x30
@@ -209,7 +210,6 @@
#define AML_INT_RESERVEDFIELD_OP (UINT16) 0x0031
#define AML_INT_ACCESSFIELD_OP (UINT16) 0x0032
#define AML_INT_BYTELIST_OP (UINT16) 0x0033
-#define AML_INT_STATICSTRING_OP (UINT16) 0x0034
#define AML_INT_METHODCALL_OP (UINT16) 0x0035
#define AML_INT_RETURN_VALUE_OP (UINT16) 0x0036
#define AML_INT_EVAL_SUBTREE_OP (UINT16) 0x0037
diff --git a/sys/contrib/dev/acpica/include/platform/acenv.h b/sys/contrib/dev/acpica/include/platform/acenv.h
index 759a68e..f5f3b1a 100644
--- a/sys/contrib/dev/acpica/include/platform/acenv.h
+++ b/sys/contrib/dev/acpica/include/platform/acenv.h
@@ -77,6 +77,7 @@
#define ACPI_LARGE_NAMESPACE_NODE
#define ACPI_DATA_TABLE_DISASSEMBLY
#define ACPI_SINGLE_THREADED
+#define ACPI_32BIT_PHYSICAL_ADDRESS
#endif
/* AcpiExec configuration. Multithreaded with full AML debugger */
diff --git a/sys/contrib/ipfilter/netinet/ip_compat.h b/sys/contrib/ipfilter/netinet/ip_compat.h
index 6d74468..8aece74 100644
--- a/sys/contrib/ipfilter/netinet/ip_compat.h
+++ b/sys/contrib/ipfilter/netinet/ip_compat.h
@@ -153,7 +153,8 @@ struct ether_addr {
# include <sys/rwlock.h>
# define KMUTEX_T struct mtx
# define KRWLOCK_T struct rwlock
-# ifdef _KERNEL
+
+#ifdef _KERNEL
# define READ_ENTER(x) rw_rlock(&(x)->ipf_lk)
# define WRITE_ENTER(x) rw_wlock(&(x)->ipf_lk)
# define MUTEX_DOWNGRADE(x) rw_downgrade(&(x)->ipf_lk)
@@ -165,16 +166,7 @@ struct ether_addr {
else \
rw_runlock(&(x)->ipf_lk); \
} while (0)
-# endif
-
# include <net/if_var.h>
-# define IFNAME(x) ((struct ifnet *)x)->if_xname
-# define COPYIFNAME(v, x, b) \
- (void) strncpy(b, \
- ((struct ifnet *)x)->if_xname, \
- LIFNAMSIZ)
-
-# ifdef _KERNEL
# define GETKTIME(x) microtime((struct timeval *)x)
# include <netinet/in_systm.h>
@@ -216,8 +208,28 @@ struct ether_addr {
# define M_DUP(m) m_dup(m, M_NOWAIT)
# define IPF_PANIC(x,y) if (x) { printf y; panic("ipf_panic"); }
typedef struct mbuf mb_t;
-# endif /* _KERNEL */
+#else /* !_KERNEL */
+#ifndef _NET_IF_VAR_H_
+/*
+ * Userland emulation of struct ifnet.
+ */
+struct route;
+struct mbuf;
+struct ifnet {
+ char if_xname[IFNAMSIZ];
+ TAILQ_HEAD(, ifaddr) if_addrlist;
+ int (*if_output)(struct ifnet *, struct mbuf *,
+ const struct sockaddr *, struct route *);
+};
+#endif /* _NET_IF_VAR_H_ */
+#endif /* _KERNEL */
+
+# define IFNAME(x) ((struct ifnet *)x)->if_xname
+# define COPYIFNAME(v, x, b) \
+ (void) strncpy(b, \
+ ((struct ifnet *)x)->if_xname, \
+ LIFNAMSIZ)
typedef u_long ioctlcmd_t;
typedef struct uio uio_t;
diff --git a/sys/contrib/x86emu/x86emu.c b/sys/contrib/x86emu/x86emu.c
index 87cd777..41e7c4a 100644
--- a/sys/contrib/x86emu/x86emu.c
+++ b/sys/contrib/x86emu/x86emu.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: x86emu.c,v 1.5 2010/02/17 15:09:47 pirofti Exp $ */
+/* $OpenBSD: x86emu.c,v 1.9 2014/06/15 11:04:49 pirofti Exp $ */
/* $NetBSD: x86emu.c,v 1.7 2009/02/03 19:26:29 joerg Exp $ */
/*
@@ -5250,7 +5250,7 @@ x86emuOp2_pop_FS(struct x86emu *emu)
static void
hw_cpuid(uint32_t *a, uint32_t *b, uint32_t *c, uint32_t *d)
{
- __asm__ __volatile__("cpuid"
+ __asm__ volatile("cpuid"
: "=a" (*a), "=b" (*b),
"=c" (*c), "=d" (*d)
: "a" (*a), "c" (*c)
diff --git a/sys/crypto/aesni/aesencdec.h b/sys/crypto/aesni/aesencdec.h
index 5e4f128..76e6403 100644
--- a/sys/crypto/aesni/aesencdec.h
+++ b/sys/crypto/aesni/aesencdec.h
@@ -27,6 +27,8 @@
*
*/
+#include <crypto/aesni/aesni_os.h>
+
#include <wmmintrin.h>
static inline void
diff --git a/sys/crypto/aesni/aesni_ghash.c b/sys/crypto/aesni/aesni_ghash.c
index 005ba81..f7be6c0 100644
--- a/sys/crypto/aesni/aesni_ghash.c
+++ b/sys/crypto/aesni/aesni_ghash.c
@@ -67,6 +67,7 @@
#ifdef _KERNEL
#include <crypto/aesni/aesni.h>
+#include <crypto/aesni/aesni_os.h>
#else
#include <stdint.h>
#endif
diff --git a/sys/crypto/aesni/aesni_os.h b/sys/crypto/aesni/aesni_os.h
new file mode 100644
index 0000000..273c3f9
--- /dev/null
+++ b/sys/crypto/aesni/aesni_os.h
@@ -0,0 +1,33 @@
+/*-
+ * Copyright 2015 Craig Rodrigues <rodrigc@FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ *
+ */
+
+#if defined(__GNUC__) && defined(_KERNEL)
+/* Suppress inclusion of gcc's mm_malloc.h header */
+#define _MM_MALLOC_H_INCLUDED 1
+#endif
diff --git a/sys/dev/acpica/acpi.c b/sys/dev/acpica/acpi.c
index b331fb8..7796fbe 100644
--- a/sys/dev/acpica/acpi.c
+++ b/sys/dev/acpica/acpi.c
@@ -606,7 +606,7 @@ acpi_attach(device_t dev)
sc->acpi_handle_reboot = 1;
/* Only enable S4BIOS by default if the FACS says it is available. */
- if (AcpiGbl_FACS->Flags & ACPI_FACS_S4_BIOS_PRESENT)
+ if (AcpiGbl_FACS != NULL && AcpiGbl_FACS->Flags & ACPI_FACS_S4_BIOS_PRESENT)
sc->acpi_s4bios = 1;
/* Probe all supported sleep states. */
@@ -1071,30 +1071,53 @@ acpi_hint_device_unit(device_t acdev, device_t child, const char *name,
}
/*
- * Fetch the NUMA domain for the given device.
- *
- * If a device has a _PXM method, map that to a NUMA domain.
+ * Fetch the VM domain for the given device 'dev'.
*
- * If none is found, then it'll call the parent method.
- * If there's no domain, return ENOENT.
+ * Return 1 + domain if there's a domain, 0 if not found;
+ * -1 upon an error.
*/
int
-acpi_get_domain(device_t dev, device_t child, int *domain)
+acpi_parse_pxm(device_t dev, int *domain)
{
#if MAXMEMDOM > 1
ACPI_HANDLE h;
int d, pxm;
- h = acpi_get_handle(child);
+ h = acpi_get_handle(dev);
if ((h != NULL) &&
ACPI_SUCCESS(acpi_GetInteger(h, "_PXM", &pxm))) {
d = acpi_map_pxm_to_vm_domainid(pxm);
if (d < 0)
- return (ENOENT);
+ return (-1);
*domain = d;
- return (0);
+ return (1);
}
#endif
+
+ return (0);
+}
+
+/*
+ * Fetch the NUMA domain for the given device.
+ *
+ * If a device has a _PXM method, map that to a NUMA domain.
+ *
+ * If none is found, then it'll call the parent method.
+ * If there's no domain, return ENOENT.
+ */
+int
+acpi_get_domain(device_t dev, device_t child, int *domain)
+{
+ int ret;
+
+ ret = acpi_parse_pxm(child, domain);
+ /* Error */
+ if (ret == -1)
+ return (ENOENT);
+ /* Found */
+ if (ret == 1)
+ return (0);
+
/* No _PXM node; go up a level */
return (bus_generic_get_domain(dev, child, domain));
}
@@ -1151,7 +1174,7 @@ acpi_sysres_alloc(device_t dev)
if (res != NULL) {
rman_manage_region(rm, rman_get_start(res), rman_get_end(res));
rle->res = res;
- } else
+ } else if (bootverbose)
device_printf(dev, "reservation of %lx, %lx (%d) failed\n",
rle->start, rle->count, rle->type);
}
diff --git a/sys/dev/acpica/acpi_pcib_acpi.c b/sys/dev/acpica/acpi_pcib_acpi.c
index 545f641..490f277 100644
--- a/sys/dev/acpica/acpi_pcib_acpi.c
+++ b/sys/dev/acpica/acpi_pcib_acpi.c
@@ -194,27 +194,27 @@ acpi_pcib_producer_handler(ACPI_RESOURCE *res, void *context)
break;
switch (res->Type) {
case ACPI_RESOURCE_TYPE_ADDRESS16:
- min = res->Data.Address16.Minimum;
- max = res->Data.Address16.Maximum;
- length = res->Data.Address16.AddressLength;
+ min = res->Data.Address16.Address.Minimum;
+ max = res->Data.Address16.Address.Maximum;
+ length = res->Data.Address16.Address.AddressLength;
break;
case ACPI_RESOURCE_TYPE_ADDRESS32:
- min = res->Data.Address32.Minimum;
- max = res->Data.Address32.Maximum;
- length = res->Data.Address32.AddressLength;
+ min = res->Data.Address32.Address.Minimum;
+ max = res->Data.Address32.Address.Maximum;
+ length = res->Data.Address32.Address.AddressLength;
break;
case ACPI_RESOURCE_TYPE_ADDRESS64:
- min = res->Data.Address64.Minimum;
- max = res->Data.Address64.Maximum;
- length = res->Data.Address64.AddressLength;
+ min = res->Data.Address64.Address.Minimum;
+ max = res->Data.Address64.Address.Maximum;
+ length = res->Data.Address64.Address.AddressLength;
break;
default:
KASSERT(res->Type ==
ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64,
("should never happen"));
- min = res->Data.ExtAddress64.Minimum;
- max = res->Data.ExtAddress64.Maximum;
- length = res->Data.ExtAddress64.AddressLength;
+ min = res->Data.ExtAddress64.Address.Minimum;
+ max = res->Data.ExtAddress64.Address.Maximum;
+ length = res->Data.ExtAddress64.Address.AddressLength;
break;
}
if (length == 0)
diff --git a/sys/dev/acpica/acpi_resource.c b/sys/dev/acpica/acpi_resource.c
index 07ebace..f8936a5 100644
--- a/sys/dev/acpica/acpi_resource.c
+++ b/sys/dev/acpica/acpi_resource.c
@@ -298,28 +298,28 @@ acpi_parse_resource(ACPI_RESOURCE *res, void *context)
case ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64:
switch (res->Type) {
case ACPI_RESOURCE_TYPE_ADDRESS16:
- gran = res->Data.Address16.Granularity;
- min = res->Data.Address16.Minimum;
- max = res->Data.Address16.Maximum;
- length = res->Data.Address16.AddressLength;
+ gran = res->Data.Address16.Address.Granularity;
+ min = res->Data.Address16.Address.Minimum;
+ max = res->Data.Address16.Address.Maximum;
+ length = res->Data.Address16.Address.AddressLength;
#ifdef ACPI_DEBUG
name = "Address16";
#endif
break;
case ACPI_RESOURCE_TYPE_ADDRESS32:
- gran = res->Data.Address32.Granularity;
- min = res->Data.Address32.Minimum;
- max = res->Data.Address32.Maximum;
- length = res->Data.Address32.AddressLength;
+ gran = res->Data.Address32.Address.Granularity;
+ min = res->Data.Address32.Address.Minimum;
+ max = res->Data.Address32.Address.Maximum;
+ length = res->Data.Address32.Address.AddressLength;
#ifdef ACPI_DEBUG
name = "Address32";
#endif
break;
case ACPI_RESOURCE_TYPE_ADDRESS64:
- gran = res->Data.Address64.Granularity;
- min = res->Data.Address64.Minimum;
- max = res->Data.Address64.Maximum;
- length = res->Data.Address64.AddressLength;
+ gran = res->Data.Address64.Address.Granularity;
+ min = res->Data.Address64.Address.Minimum;
+ max = res->Data.Address64.Address.Maximum;
+ length = res->Data.Address64.Address.AddressLength;
#ifdef ACPI_DEBUG
name = "Address64";
#endif
@@ -327,10 +327,10 @@ acpi_parse_resource(ACPI_RESOURCE *res, void *context)
default:
KASSERT(res->Type == ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64,
("should never happen"));
- gran = res->Data.ExtAddress64.Granularity;
- min = res->Data.ExtAddress64.Minimum;
- max = res->Data.ExtAddress64.Maximum;
- length = res->Data.ExtAddress64.AddressLength;
+ gran = res->Data.ExtAddress64.Address.Granularity;
+ min = res->Data.ExtAddress64.Address.Minimum;
+ max = res->Data.ExtAddress64.Address.Maximum;
+ length = res->Data.ExtAddress64.Address.AddressLength;
#ifdef ACPI_DEBUG
name = "ExtAddress64";
#endif
diff --git a/sys/dev/acpica/acpivar.h b/sys/dev/acpica/acpivar.h
index a314098..2e2b96d 100644
--- a/sys/dev/acpica/acpivar.h
+++ b/sys/dev/acpica/acpivar.h
@@ -185,7 +185,7 @@ extern struct mtx acpi_mutex;
* Various features and capabilities for the acpi_get_features() method.
* In particular, these are used for the ACPI 3.0 _PDC and _OSC methods.
* See the Intel document titled "Intel Processor Vendor-Specific ACPI",
- * number 302223-005.
+ * number 302223-007.
*/
#define ACPI_CAP_PERF_MSRS (1 << 0) /* Intel SpeedStep PERF_CTL MSRs */
#define ACPI_CAP_C1_IO_HALT (1 << 1) /* Intel C1 "IO then halt" sequence */
@@ -198,6 +198,9 @@ extern struct mtx acpi_mutex;
#define ACPI_CAP_SMP_C1_NATIVE (1 << 8) /* MP C1 support other than halt */
#define ACPI_CAP_SMP_C3_NATIVE (1 << 9) /* MP C2 and C3 support */
#define ACPI_CAP_PX_HW_COORD (1 << 11) /* Intel P-state HW coordination */
+#define ACPI_CAP_INTR_CPPC (1 << 12) /* Native Interrupt Handling for
+ Collaborative Processor Performance Control notifications */
+#define ACPI_CAP_HW_DUTY_C (1 << 13) /* Hardware Duty Cycling */
/*
* Quirk flags.
@@ -497,8 +500,8 @@ SYSCTL_DECL(_debug_acpi);
#if MAXMEMDOM > 1
extern int acpi_map_pxm_to_vm_domainid(int pxm);
#endif
-
extern int acpi_get_domain(device_t dev, device_t child, int *domain);
+extern int acpi_parse_pxm(device_t dev, int *domain);
#endif /* _KERNEL */
#endif /* !_ACPIVAR_H_ */
diff --git a/sys/dev/ath/ath_hal/ar5212/ar5212.h b/sys/dev/ath/ath_hal/ar5212/ar5212.h
index 2622efd..938a68c 100644
--- a/sys/dev/ath/ath_hal/ar5212/ar5212.h
+++ b/sys/dev/ath/ath_hal/ar5212/ar5212.h
@@ -345,7 +345,9 @@ struct ath_hal_5212 {
uint32_t ah_txBusy;
uint32_t ah_rx_chainmask;
uint32_t ah_tx_chainmask;
- HAL_ANI_STATE ext_ani_state;
+
+ /* Used to return ANI statistics to the diagnostic API */
+ HAL_ANI_STATS ext_ani_stats;
};
#define AH5212(_ah) ((struct ath_hal_5212 *)(_ah))
diff --git a/sys/dev/ath/ath_hal/ar5212/ar5212_misc.c b/sys/dev/ath/ath_hal/ar5212/ar5212_misc.c
index 098a14c..e2f1eb7 100644
--- a/sys/dev/ath/ath_hal/ar5212/ar5212_misc.c
+++ b/sys/dev/ath/ath_hal/ar5212/ar5212_misc.c
@@ -1052,7 +1052,7 @@ ar5212GetDiagState(struct ath_hal *ah, int request,
void **result, uint32_t *resultsize)
{
struct ath_hal_5212 *ahp = AH5212(ah);
- struct ar5212AniState *astate;
+ HAL_ANI_STATS *astats;
(void) ahp;
if (ath_hal_getdiagstate(ah, request, args, argsize, result, resultsize))
@@ -1084,27 +1084,15 @@ ar5212GetDiagState(struct ath_hal *ah, int request,
0 : sizeof(struct ar5212AniState);
return AH_TRUE;
case HAL_DIAG_ANI_STATS:
- OS_MEMZERO(&ahp->ext_ani_state, sizeof(ahp->ext_ani_state));
- astate = ar5212AniGetCurrentState(ah);
- if (astate == NULL) {
+ OS_MEMZERO(&ahp->ext_ani_stats, sizeof(ahp->ext_ani_stats));
+ astats = ar5212AniGetCurrentStats(ah);
+ if (astats == NULL) {
*result = NULL;
*resultsize = 0;
} else {
- ahp->ext_ani_state.noiseImmunityLevel =
- astate->noiseImmunityLevel;
- ahp->ext_ani_state.spurImmunityLevel =
- astate->spurImmunityLevel;
- ahp->ext_ani_state.firstepLevel =
- astate->firstepLevel;
- ahp->ext_ani_state.ofdmWeakSigDetectOff =
- astate->ofdmWeakSigDetectOff;
- ahp->ext_ani_state.cckWeakSigThreshold =
- astate->cckWeakSigThreshold;
- ahp->ext_ani_state.listenTime =
- astate->listenTime;
-
- *result = &ahp->ext_ani_state;
- *resultsize = sizeof(ahp->ext_ani_state);
+ OS_MEMCPY(&ahp->ext_ani_stats, astats, sizeof(HAL_ANI_STATS));
+ *result = &ahp->ext_ani_stats;
+ *resultsize = sizeof(ahp->ext_ani_stats);
}
return AH_TRUE;
case HAL_DIAG_ANI_CMD:
diff --git a/sys/dev/atkbdc/atkbd.c b/sys/dev/atkbdc/atkbd.c
index d93c1c6..a90f5d2 100644
--- a/sys/dev/atkbdc/atkbd.c
+++ b/sys/dev/atkbdc/atkbd.c
@@ -44,19 +44,6 @@ __FBSDID("$FreeBSD$");
#include <machine/bus.h>
#include <machine/resource.h>
-#if defined(__i386__) || defined(__amd64__)
-#include <machine/md_var.h>
-#include <machine/psl.h>
-#include <compat/x86bios/x86bios.h>
-#include <machine/pc/bios.h>
-
-#include <vm/vm.h>
-#include <vm/pmap.h>
-#include <vm/vm_param.h>
-
-#include <isa/isareg.h>
-#endif /* __i386__ || __amd64__ */
-
#include <sys/kbio.h>
#include <dev/kbd/kbdreg.h>
#include <dev/atkbdc/atkbdreg.h>
@@ -82,6 +69,9 @@ static int atkbd_reset(KBDC kbdc, int flags, int c);
#define HAS_QUIRK(p, q) (((atkbdc_softc_t *)(p))->quirks & q)
#define ALLOW_DISABLE_KBD(kbdc) !HAS_QUIRK(kbdc, KBDC_QUIRK_KEEP_ACTIVATED)
+#define DEFAULT_DELAY 0x1 /* 500ms */
+#define DEFAULT_RATE 0x10 /* 14Hz */
+
int
atkbd_probe_unit(device_t dev, int irq, int flags)
{
@@ -249,7 +239,7 @@ static keyboard_switch_t atkbdsw = {
KEYBOARD_DRIVER(atkbd, atkbdsw, atkbd_configure);
/* local functions */
-static int get_typematic(keyboard_t *kbd);
+static int set_typematic(keyboard_t *kbd);
static int setup_kbd_port(KBDC kbdc, int port, int intr);
static int get_kbd_echo(KBDC kbdc);
static int probe_keyboard(KBDC kbdc, int flags);
@@ -443,7 +433,7 @@ atkbd_init(int unit, keyboard_t **kbdp, void *arg, int flags)
goto bad;
}
atkbd_ioctl(kbd, KDSETLED, (caddr_t)&state->ks_state);
- get_typematic(kbd);
+ set_typematic(kbd);
delay[0] = kbd->kb_delay1;
delay[1] = kbd->kb_delay2;
atkbd_ioctl(kbd, KDSETREPEAT, (caddr_t)delay);
@@ -503,7 +493,7 @@ atkbd_intr(keyboard_t *kbd, void *arg)
init_keyboard(state->kbdc, &kbd->kb_type, kbd->kb_config);
KBD_FOUND_DEVICE(kbd);
atkbd_ioctl(kbd, KDSETLED, (caddr_t)&state->ks_state);
- get_typematic(kbd);
+ set_typematic(kbd);
delay[0] = kbd->kb_delay1;
delay[1] = kbd->kb_delay2;
atkbd_ioctl(kbd, KDSETREPEAT, (caddr_t)delay);
@@ -1135,57 +1125,19 @@ atkbd_reset(KBDC kbdc, int flags, int c)
/* local functions */
static int
-get_typematic(keyboard_t *kbd)
+set_typematic(keyboard_t *kbd)
{
-#if defined(__i386__) || defined(__amd64__)
- /*
- * Only some systems allow us to retrieve the keyboard repeat
- * rate previously set via the BIOS...
- */
- x86regs_t regs;
- uint8_t *p;
+ int val, error;
+ atkbd_state_t *state = kbd->kb_data;
- /*
- * Traditional entry points of int 0x15 and 0x16 are fixed
- * and later BIOSes follow them. (U)EFI CSM specification
- * also mandates these fixed entry points.
- *
- * Validate the entry points here before we proceed further.
- * It's known that some recent laptops does not have the
- * same entry point and hang on boot if we call it.
- */
- if (x86bios_get_intr(0x15) != 0xf000f859 ||
- x86bios_get_intr(0x16) != 0xf000e82e)
- return (ENODEV);
-
- /* Is BIOS system configuration table supported? */
- x86bios_init_regs(&regs);
- regs.R_AH = 0xc0;
- x86bios_intr(&regs, 0x15);
- if ((regs.R_FLG & PSL_C) != 0 || regs.R_AH != 0)
- return (ENODEV);
-
- /* Is int 0x16, function 0x09 supported? */
- p = x86bios_offset((regs.R_ES << 4) + regs.R_BX);
- if (readw(p) < 5 || (readb(p + 6) & 0x40) == 0)
- return (ENODEV);
-
- /* Is int 0x16, function 0x0306 supported? */
- x86bios_init_regs(&regs);
- regs.R_AH = 0x09;
- x86bios_intr(&regs, 0x16);
- if ((regs.R_AL & 0x08) == 0)
- return (ENODEV);
-
- x86bios_init_regs(&regs);
- regs.R_AX = 0x0306;
- x86bios_intr(&regs, 0x16);
- kbd->kb_delay1 = typematic_delay(regs.R_BH << 5);
- kbd->kb_delay2 = typematic_rate(regs.R_BL);
- return (0);
-#else
- return (ENODEV);
-#endif /* __i386__ || __amd64__ */
+ val = typematic(DEFAULT_DELAY, DEFAULT_RATE);
+ error = write_kbd(state->kbdc, KBDC_SET_TYPEMATIC, val);
+ if (error == 0) {
+ kbd->kb_delay1 = typematic_delay(val);
+ kbd->kb_delay2 = typematic_rate(val);
+ }
+
+ return (error);
}
static int
diff --git a/sys/dev/atkbdc/psm.c b/sys/dev/atkbdc/psm.c
index 94cf880..6c7f47a 100644
--- a/sys/dev/atkbdc/psm.c
+++ b/sys/dev/atkbdc/psm.c
@@ -191,13 +191,15 @@ enum {
SYNAPTICS_SYSCTL_VSCROLL_VER_AREA,
SYNAPTICS_SYSCTL_VSCROLL_MIN_DELTA,
SYNAPTICS_SYSCTL_VSCROLL_DIV_MIN,
- SYNAPTICS_SYSCTL_VSCROLL_DIV_MAX
+ SYNAPTICS_SYSCTL_VSCROLL_DIV_MAX,
+ SYNAPTICS_SYSCTL_TOUCHPAD_OFF
};
typedef struct synapticsinfo {
struct sysctl_ctx_list sysctl_ctx;
struct sysctl_oid *sysctl_tree;
int directional_scrolls;
+ int two_finger_scroll;
int min_pressure;
int max_pressure;
int max_width;
@@ -228,6 +230,7 @@ typedef struct synapticsinfo {
int vscroll_min_delta;
int vscroll_div_min;
int vscroll_div_max;
+ int touchpad_off;
} synapticsinfo_t;
typedef struct synapticspacket {
@@ -336,6 +339,7 @@ struct psm_softc { /* Driver status information */
int lasterr;
int cmdcount;
struct sigio *async; /* Processes waiting for SIGIO */
+ int extended_buttons;
};
static devclass_t psm_devclass;
@@ -476,6 +480,10 @@ static probefunc_t enable_synaptics;
static probefunc_t enable_trackpoint;
static probefunc_t enable_versapad;
+static void set_trackpoint_parameters(struct psm_softc *sc);
+static void synaptics_passthrough_on(struct psm_softc *sc);
+static void synaptics_passthrough_off(struct psm_softc *sc);
+
static struct {
int model;
u_char syncmask;
@@ -883,6 +891,13 @@ doinitialize(struct psm_softc *sc, mousemode_t *mode)
set_mouse_resolution(kbdc, mode->resolution);
set_mouse_scaling(kbdc, 1);
set_mouse_mode(kbdc);
+
+ /*
+ * Trackpoint settings are lost on resume.
+ * Restore them here.
+ */
+ if (sc->tphw > 0)
+ set_trackpoint_parameters(sc);
}
/* Record sync on the next data packet we see. */
@@ -2723,6 +2738,12 @@ proc_synaptics(struct psm_softc *sc, packetbuf_t *pb, mousestatus_t *ms,
goto SYNAPTICS_END;
}
+ if (sc->syninfo.touchpad_off) {
+ *x = *y = *z = 0;
+ ms->button = ms->obutton;
+ goto SYNAPTICS_END;
+ }
+
/* Button presses */
touchpad_buttons = 0;
if (pb->ipacket[0] & 0x01)
@@ -2735,7 +2756,8 @@ proc_synaptics(struct psm_softc *sc, packetbuf_t *pb, mousestatus_t *ms,
touchpad_buttons |= MOUSE_BUTTON4DOWN;
if ((pb->ipacket[3] ^ pb->ipacket[0]) & 0x02)
touchpad_buttons |= MOUSE_BUTTON5DOWN;
- } else if (sc->synhw.capExtended && sc->synhw.capMiddle) {
+ } else if (sc->synhw.capExtended && sc->synhw.capMiddle &&
+ !sc->synhw.capClickPad) {
/* Middle Button */
if ((pb->ipacket[0] ^ pb->ipacket[3]) & 0x01)
touchpad_buttons |= MOUSE_BUTTON2DOWN;
@@ -2752,7 +2774,13 @@ proc_synaptics(struct psm_softc *sc, packetbuf_t *pb, mousestatus_t *ms,
if (pb->ipacket[5] & 0x02)
touchpad_buttons |= MOUSE_BUTTON7DOWN;
} else {
- touchpad_buttons |= MOUSE_BUTTON2DOWN;
+ if (pb->ipacket[4] & 0x01)
+ touchpad_buttons |= MOUSE_BUTTON1DOWN;
+ if (pb->ipacket[5] & 0x01)
+ touchpad_buttons |= MOUSE_BUTTON3DOWN;
+ if (pb->ipacket[4] & 0x02)
+ touchpad_buttons |= MOUSE_BUTTON2DOWN;
+ sc->extended_buttons = touchpad_buttons;
}
/*
@@ -2774,13 +2802,26 @@ proc_synaptics(struct psm_softc *sc, packetbuf_t *pb, mousestatus_t *ms,
mask = (1 << maskedbits) - 1;
pb->ipacket[4] &= ~(mask);
pb->ipacket[5] &= ~(mask);
+ } else if (!sc->syninfo.directional_scrolls &&
+ !sc->synaction.in_vscroll) {
+ /*
+ * Keep reporting MOUSE DOWN until we get a new packet
+ * indicating otherwise.
+ */
+ touchpad_buttons |= sc->extended_buttons;
}
}
+ /* Handle ClickPad. */
+ if (sc->synhw.capClickPad &&
+ ((pb->ipacket[0] ^ pb->ipacket[3]) & 0x01))
+ touchpad_buttons |= MOUSE_BUTTON1DOWN;
ms->button = touchpad_buttons | guest_buttons;
- /* Check pressure to detect a real wanted action on the
- * touchpad. */
+ /*
+ * Check pressure to detect a real wanted action on the
+ * touchpad.
+ */
if (*z >= sc->syninfo.min_pressure) {
synapticsaction_t *synaction;
int cursor, peer, window;
@@ -2793,7 +2834,7 @@ proc_synaptics(struct psm_softc *sc, packetbuf_t *pb, mousestatus_t *ms,
int weight_current, weight_previous, weight_len_squared;
int div_min, div_max, div_len;
int vscroll_hor_area, vscroll_ver_area;
-
+ int two_finger_scroll;
int len, weight_prev_x, weight_prev_y;
int div_max_x, div_max_y, div_x, div_y;
@@ -2820,6 +2861,7 @@ proc_synaptics(struct psm_softc *sc, packetbuf_t *pb, mousestatus_t *ms,
div_len = sc->syninfo.div_len;
vscroll_hor_area = sc->syninfo.vscroll_hor_area;
vscroll_ver_area = sc->syninfo.vscroll_ver_area;
+ two_finger_scroll = sc->syninfo.two_finger_scroll;
/* Palm detection. */
if (!(
@@ -2979,33 +3021,57 @@ proc_synaptics(struct psm_softc *sc, packetbuf_t *pb, mousestatus_t *ms,
if (timevalcmp(&sc->lastsoftintr, &sc->taptimeout, >) ||
dxp >= sc->syninfo.vscroll_min_delta ||
dyp >= sc->syninfo.vscroll_min_delta) {
- /* Check for horizontal scrolling. */
- if ((vscroll_hor_area > 0 &&
- synaction->start_y <= vscroll_hor_area) ||
- (vscroll_hor_area < 0 &&
- synaction->start_y >=
- 6143 + vscroll_hor_area))
- synaction->in_vscroll += 2;
-
- /* Check for vertical scrolling. */
- if ((vscroll_ver_area > 0 &&
- synaction->start_x <= vscroll_ver_area) ||
- (vscroll_ver_area < 0 &&
- synaction->start_x >=
- 6143 + vscroll_ver_area))
- synaction->in_vscroll += 1;
+ /*
+ * Handle two finger scrolling.
+ * Note that we don't rely on fingers_nb
+ * as that keeps the maximum number of fingers.
+ */
+ if (two_finger_scroll) {
+ if (w == 0) {
+ synaction->in_vscroll +=
+ dyp ? 2 : 0;
+ synaction->in_vscroll +=
+ dxp ? 1 : 0;
+ }
+ } else {
+ /* Check for horizontal scrolling. */
+ if ((vscroll_hor_area > 0 &&
+ synaction->start_y <=
+ vscroll_hor_area) ||
+ (vscroll_hor_area < 0 &&
+ synaction->start_y >=
+ 6143 + vscroll_hor_area))
+ synaction->in_vscroll += 2;
+
+ /* Check for vertical scrolling. */
+ if ((vscroll_ver_area > 0 &&
+ synaction->start_x <=
+ vscroll_ver_area) ||
+ (vscroll_ver_area < 0 &&
+ synaction->start_x >=
+ 6143 + vscroll_ver_area))
+ synaction->in_vscroll += 1;
+ }
/* Avoid conflicts if area overlaps. */
- if (synaction->in_vscroll == 3)
+ if (synaction->in_vscroll >= 3)
synaction->in_vscroll =
(dxp > dyp) ? 2 : 1;
}
- VLOG(5, (LOG_DEBUG,
- "synaptics: virtual scrolling: %s "
- "(direction=%d, dxp=%d, dyp=%d)\n",
- synaction->in_vscroll ? "YES" : "NO",
- synaction->in_vscroll, dxp, dyp));
}
+ /*
+ * Reset two finger scrolling when the number of fingers
+ * is different from two.
+ */
+ if (two_finger_scroll && w != 0)
+ synaction->in_vscroll = 0;
+
+ VLOG(5, (LOG_DEBUG,
+ "synaptics: virtual scrolling: %s "
+ "(direction=%d, dxp=%d, dyp=%d, fingers=%d)\n",
+ synaction->in_vscroll ? "YES" : "NO",
+ synaction->in_vscroll, dxp, dyp,
+ synaction->fingers_nb));
weight_prev_x = weight_prev_y = weight_previous;
div_max_x = div_max_y = div_max;
@@ -3247,6 +3313,7 @@ SYNAPTICS_END:
* That's why the horizontal wheel is disabled by
* default for now.
*/
+
if (ms->button & MOUSE_BUTTON4DOWN) {
*z = -1;
ms->button &= ~MOUSE_BUTTON4DOWN;
@@ -3460,7 +3527,7 @@ psmsoftintr(void *arg)
c = ((x < 0) ? MOUSE_PS2_XNEG : 0) |
((y < 0) ? MOUSE_PS2_YNEG : 0);
break;
-
+
case MOUSE_MODEL_4D:
/*
* b7 b6 b5 b4 b3 b2 b1 b0
@@ -4084,6 +4151,10 @@ synaptics_sysctl(SYSCTL_HANDLER_ARGS)
if (arg < -6143 || arg > 6143)
return (EINVAL);
break;
+ case SYNAPTICS_SYSCTL_TOUCHPAD_OFF:
+ if (arg < 0 || arg > 1)
+ return (EINVAL);
+ break;
default:
return (EINVAL);
}
@@ -4108,13 +4179,29 @@ synaptics_sysctl_create_tree(struct psm_softc *sc)
0, "Synaptics TouchPad");
/* hw.psm.synaptics.directional_scrolls. */
- sc->syninfo.directional_scrolls = 1;
+ sc->syninfo.directional_scrolls = 0;
SYSCTL_ADD_INT(&sc->syninfo.sysctl_ctx,
SYSCTL_CHILDREN(sc->syninfo.sysctl_tree), OID_AUTO,
"directional_scrolls", CTLFLAG_RW|CTLFLAG_ANYBODY,
&sc->syninfo.directional_scrolls, 0,
"Enable hardware scrolling pad (if non-zero) or register it as "
- "a middle-click (if 0)");
+ "extended buttons (if 0)");
+
+ /*
+ * Turn off two finger scroll if we have a
+ * physical area reserved for scrolling or when
+ * there's no multi finger support.
+ */
+ if (sc->synhw.verticalScroll || sc->synhw.capMultiFinger == 0)
+ sc->syninfo.two_finger_scroll = 0;
+ else
+ sc->syninfo.two_finger_scroll = 1;
+ /* hw.psm.synaptics.two_finger_scroll. */
+ SYSCTL_ADD_INT(&sc->syninfo.sysctl_ctx,
+ SYSCTL_CHILDREN(sc->syninfo.sysctl_tree), OID_AUTO,
+ "two_finger_scroll", CTLFLAG_RW|CTLFLAG_ANYBODY,
+ &sc->syninfo.two_finger_scroll, 0,
+ "Enable two finger scrolling");
/* hw.psm.synaptics.min_pressure. */
sc->syninfo.min_pressure = 16;
@@ -4395,6 +4482,15 @@ synaptics_sysctl_create_tree(struct psm_softc *sc)
&sc->syninfo.vscroll_div_max, SYNAPTICS_SYSCTL_VSCROLL_DIV_MAX,
synaptics_sysctl, "I",
"Divisor for slow scrolling");
+
+ /* hw.psm.synaptics.touchpad_off. */
+ sc->syninfo.touchpad_off = 0;
+ SYSCTL_ADD_PROC(&sc->syninfo.sysctl_ctx,
+ SYSCTL_CHILDREN(sc->syninfo.sysctl_tree), OID_AUTO,
+ "touchpad_off", CTLTYPE_INT|CTLFLAG_RW|CTLFLAG_ANYBODY,
+ &sc->syninfo.touchpad_off, SYNAPTICS_SYSCTL_TOUCHPAD_OFF,
+ synaptics_sysctl, "I",
+ "Turn off touchpad");
}
static int
@@ -4483,8 +4579,12 @@ enable_synaptics(KBDC kbdc, struct psm_softc *sc)
synhw.nExtendedQueries = (status[0] & 0x70) != 0;
synhw.capMiddle = (status[0] & 0x04) != 0;
synhw.capPassthrough = (status[2] & 0x80) != 0;
+ synhw.capLowPower = (status[2] & 0x40) != 0;
+ synhw.capMultiFingerReport =
+ (status[2] & 0x20) != 0;
synhw.capSleep = (status[2] & 0x10) != 0;
synhw.capFourButtons = (status[2] & 0x08) != 0;
+ synhw.capBallistics = (status[2] & 0x04) != 0;
synhw.capMultiFinger = (status[2] & 0x02) != 0;
synhw.capPalmDetect = (status[2] & 0x01) != 0;
@@ -4495,8 +4595,12 @@ enable_synaptics(KBDC kbdc, struct psm_softc *sc)
printf(" nExtendedQueries: %d\n",
synhw.nExtendedQueries);
printf(" capPassthrough: %d\n", synhw.capPassthrough);
+ printf(" capLowPower: %d\n", synhw.capLowPower);
+ printf(" capMultiFingerReport: %d\n",
+ synhw.capMultiFingerReport);
printf(" capSleep: %d\n", synhw.capSleep);
printf(" capFourButtons: %d\n", synhw.capFourButtons);
+ printf(" capBallistics: %d\n", synhw.capBallistics);
printf(" capMultiFinger: %d\n", synhw.capMultiFinger);
printf(" capPalmDetect: %d\n", synhw.capPalmDetect);
}
@@ -4511,7 +4615,21 @@ enable_synaptics(KBDC kbdc, struct psm_softc *sc)
return (FALSE);
if (get_mouse_status(kbdc, status, 0, 3) != 3)
return (FALSE);
+ synhw.verticalScroll = (status[0] & 0x01) != 0;
+ synhw.horizontalScroll = (status[0] & 0x02) != 0;
+ synhw.verticalWheel = (status[0] & 0x08) != 0;
synhw.nExtendedButtons = (status[1] & 0xf0) >> 4;
+ if (verbose >= 2) {
+ printf(" Extended model ID:\n");
+ printf(" verticalScroll: %d\n",
+ synhw.verticalScroll);
+ printf(" horizontalScroll: %d\n",
+ synhw.horizontalScroll);
+ printf(" verticalWheel: %d\n",
+ synhw.verticalWheel);
+ printf(" nExtendedButtons: %d\n",
+ synhw.nExtendedButtons);
+ }
/*
* Add the number of extended buttons to the total
* button support count, including the middle button
@@ -4532,6 +4650,42 @@ enable_synaptics(KBDC kbdc, struct psm_softc *sc)
printf(" No extended capabilities\n");
}
+ /* Read the continued capabilities bits. */
+ if (mouse_ext_command(kbdc, 0xc) != 0 &&
+ get_mouse_status(kbdc, status, 0, 3) == 3) {
+ synhw.capClickPad = (status[1] & 0x01) << 1;
+ synhw.capClickPad |= (status[0] & 0x10) != 0;
+ synhw.capDeluxeLEDs = (status[1] & 0x02) != 0;
+ synhw.noAbsoluteFilter = (status[1] & 0x04) != 0;
+ synhw.capReportsV = (status[1] & 0x08) != 0;
+ synhw.capUniformClickPad = (status[1] & 0x10) != 0;
+ synhw.capReportsMin = (status[1] & 0x20) != 0;
+ synhw.capInterTouch = (status[1] & 0x40) != 0;
+ synhw.capReportsMax = (status[2] & 0x02) != 0;
+ synhw.capClearPad = (status[2] & 0x04) != 0;
+ synhw.capAdvancedGestures = (status[2] & 0x08) != 0;
+ synhw.capCoveredPad = (status[2] & 0x80) != 0;
+
+ if (verbose >= 2) {
+ printf(" Continued capabilities:\n");
+ printf(" capClickPad: %d\n", synhw.capClickPad);
+ printf(" capDeluxeLEDs: %d\n", synhw.capDeluxeLEDs);
+ printf(" noAbsoluteFilter: %d\n",
+ synhw.noAbsoluteFilter);
+ printf(" capReportsV: %d\n", synhw.capReportsV);
+ printf(" capUniformClickPad: %d\n",
+ synhw.capUniformClickPad);
+ printf(" capReportsMin: %d\n", synhw.capReportsMin);
+ printf(" capInterTouch: %d\n", synhw.capInterTouch);
+ printf(" capReportsMax: %d\n", synhw.capReportsMax);
+ printf(" capClearPad: %d\n", synhw.capClearPad);
+ printf(" capAdvancedGestures: %d\n",
+ synhw.capAdvancedGestures);
+ printf(" capCoveredPad: %d\n", synhw.capCoveredPad);
+ }
+ buttons += synhw.capClickPad;
+ }
+
/*
* Add the default number of 3 buttons to the total
* count of supported buttons reported above.
@@ -4568,25 +4722,75 @@ enable_synaptics(KBDC kbdc, struct psm_softc *sc)
VLOG(3, (LOG_DEBUG, "synaptics: END init (%d buttons)\n", buttons));
if (sc != NULL) {
+ if (trackpoint_support && synhw.capPassthrough) {
+ synaptics_passthrough_on(sc);
+ enable_trackpoint(kbdc, sc);
+ synaptics_passthrough_off(sc);
+ }
/* Create sysctl tree. */
synaptics_sysctl_create_tree(sc);
-
sc->hw.buttons = buttons;
}
return (TRUE);
}
+static void
+synaptics_passthrough_on(struct psm_softc *sc)
+{
+ int mode_byte;
+
+ mode_byte = 0xc1 | (1 << 5);
+ VLOG(2, (LOG_NOTICE, "psm: setting pass-through mode. %d\n",
+ mode_byte));
+ mouse_ext_command(sc->kbdc, mode_byte);
+
+ /* "Commit" the Set Mode Byte command sent above. */
+ set_mouse_sampling_rate(sc->kbdc, 20);
+}
+
+static void
+synaptics_passthrough_off(struct psm_softc *sc)
+{
+ int mode_byte;
+
+ mode_byte = 0xc1;
+ VLOG(2, (LOG_NOTICE, "psm: turning pass-through mode off.\n"));
+ set_mouse_scaling(sc->kbdc, 2);
+ set_mouse_scaling(sc->kbdc, 1);
+ mouse_ext_command(sc->kbdc, mode_byte);
+
+ /* "Commit" the Set Mode Byte command sent above. */
+ set_mouse_sampling_rate(sc->kbdc, 20);
+}
+
/* IBM/Lenovo TrackPoint */
static int
-trackpoint_command(KBDC kbdc, int cmd, int loc, int val)
+trackpoint_command(struct psm_softc *sc, int cmd, int loc, int val)
{
const int seq[] = { 0xe2, cmd, loc, val };
int i;
- for (i = 0; i < nitems(seq); i++)
- if (send_aux_command(kbdc, seq[i]) != PSM_ACK)
+ if (sc->synhw.capPassthrough)
+ synaptics_passthrough_on(sc);
+
+ for (i = 0; i < nitems(seq); i++) {
+ if (sc->synhw.capPassthrough &&
+ (seq[i] == 0xff || seq[i] == 0xe7))
+ if (send_aux_command(sc->kbdc, 0xe7) != PSM_ACK) {
+ synaptics_passthrough_off(sc);
+ return (EIO);
+ }
+ if (send_aux_command(sc->kbdc, seq[i]) != PSM_ACK) {
+ if (sc->synhw.capPassthrough)
+ synaptics_passthrough_off(sc);
return (EIO);
+ }
+ }
+
+ if (sc->synhw.capPassthrough)
+ synaptics_passthrough_off(sc);
+
return (0);
}
@@ -4629,7 +4833,7 @@ trackpoint_sysctl(SYSCTL_HANDLER_ARGS)
return (0);
if (newval < 0 || newval > (tp[TPMASK] == 0 ? 255 : 1))
return (EINVAL);
- error = trackpoint_command(sc->kbdc, tp[TPMASK] == 0 ? 0x81 : 0x47,
+ error = trackpoint_command(sc, tp[TPMASK] == 0 ? 0x81 : 0x47,
tp[TPLOC], tp[TPMASK] == 0 ? newval : tp[TPMASK]);
if (error != 0)
return (error);
@@ -4652,7 +4856,7 @@ trackpoint_sysctl_create_tree(struct psm_softc *sc)
0, "IBM/Lenovo TrackPoint");
/* hw.psm.trackpoint.sensitivity */
- sc->tpinfo.sensitivity = 0x64;
+ sc->tpinfo.sensitivity = 0x80;
SYSCTL_ADD_PROC(&sc->tpinfo.sysctl_ctx,
SYSCTL_CHILDREN(sc->tpinfo.sysctl_tree), OID_AUTO,
"sensitivity", CTLTYPE_INT|CTLFLAG_RW|CTLFLAG_ANYBODY,
@@ -4760,6 +4964,25 @@ trackpoint_sysctl_create_tree(struct psm_softc *sc)
"Skip backups from drags");
}
+static void
+set_trackpoint_parameters(struct psm_softc *sc)
+{
+ trackpoint_command(sc, 0x81, 0x4a, sc->tpinfo.sensitivity);
+ trackpoint_command(sc, 0x81, 0x60, sc->tpinfo.uplateau);
+ trackpoint_command(sc, 0x81, 0x4d, sc->tpinfo.inertia);
+ trackpoint_command(sc, 0x81, 0x57, sc->tpinfo.reach);
+ trackpoint_command(sc, 0x81, 0x58, sc->tpinfo.draghys);
+ trackpoint_command(sc, 0x81, 0x59, sc->tpinfo.mindrag);
+ trackpoint_command(sc, 0x81, 0x5a, sc->tpinfo.upthresh);
+ trackpoint_command(sc, 0x81, 0x5c, sc->tpinfo.threshold);
+ trackpoint_command(sc, 0x81, 0x5d, sc->tpinfo.jenks);
+ trackpoint_command(sc, 0x81, 0x5e, sc->tpinfo.ztime);
+ if (sc->tpinfo.pts == 0x01)
+ trackpoint_command(sc, 0x47, 0x2c, 0x01);
+ if (sc->tpinfo.skipback == 0x01)
+ trackpoint_command(sc, 0x47, 0x2d, 0x08);
+}
+
static int
enable_trackpoint(KBDC kbdc, struct psm_softc *sc)
{
@@ -4780,23 +5003,14 @@ enable_trackpoint(KBDC kbdc, struct psm_softc *sc)
/* Create sysctl tree. */
trackpoint_sysctl_create_tree(sc);
- trackpoint_command(kbdc, 0x81, 0x4a, sc->tpinfo.sensitivity);
- trackpoint_command(kbdc, 0x81, 0x4d, sc->tpinfo.inertia);
- trackpoint_command(kbdc, 0x81, 0x60, sc->tpinfo.uplateau);
- trackpoint_command(kbdc, 0x81, 0x57, sc->tpinfo.reach);
- trackpoint_command(kbdc, 0x81, 0x58, sc->tpinfo.draghys);
- trackpoint_command(kbdc, 0x81, 0x59, sc->tpinfo.mindrag);
- trackpoint_command(kbdc, 0x81, 0x5a, sc->tpinfo.upthresh);
- trackpoint_command(kbdc, 0x81, 0x5c, sc->tpinfo.threshold);
- trackpoint_command(kbdc, 0x81, 0x5d, sc->tpinfo.jenks);
- trackpoint_command(kbdc, 0x81, 0x5e, sc->tpinfo.ztime);
- if (sc->tpinfo.pts == 0x01)
- trackpoint_command(kbdc, 0x47, 0x2c, 0x01);
- if (sc->tpinfo.skipback == 0x01)
- trackpoint_command(kbdc, 0x47, 0x2d, 0x08);
-
- sc->hw.hwid = id;
- sc->hw.buttons = 3;
+ /*
+ * Don't overwrite hwid and buttons when we are
+ * a guest device.
+ */
+ if (!sc->synhw.capPassthrough) {
+ sc->hw.hwid = id;
+ sc->hw.buttons = 3;
+ }
}
return (TRUE);
diff --git a/sys/dev/bxe/bxe.h b/sys/dev/bxe/bxe.h
index f37b93f..eb695d0 100644
--- a/sys/dev/bxe/bxe.h
+++ b/sys/dev/bxe/bxe.h
@@ -51,6 +51,7 @@ __FBSDID("$FreeBSD$");
#include <sys/limits.h>
#include <sys/queue.h>
#include <sys/taskqueue.h>
+#include <sys/zlib.h>
#include <net/if.h>
#include <net/if_types.h>
@@ -60,7 +61,6 @@ __FBSDID("$FreeBSD$");
#include <net/if_var.h>
#include <net/if_media.h>
#include <net/if_vlan_var.h>
-#include <net/zlib.h>
#include <net/bpf.h>
#include <netinet/in.h>
diff --git a/sys/dev/cxgbe/t4_main.c b/sys/dev/cxgbe/t4_main.c
index 40098b8..4bbb55e 100644
--- a/sys/dev/cxgbe/t4_main.c
+++ b/sys/dev/cxgbe/t4_main.c
@@ -1571,9 +1571,6 @@ cxgbe_media_status(struct ifnet *ifp, struct ifmediareq *ifmr)
struct ifmedia *media = NULL;
struct ifmedia_entry *cur;
int speed = pi->link_cfg.speed;
-#ifdef INVARIANTS
- int data = (pi->port_type << 8) | pi->mod_type;
-#endif
if (ifp == pi->ifp)
media = &pi->media;
@@ -1584,7 +1581,6 @@ cxgbe_media_status(struct ifnet *ifp, struct ifmediareq *ifmr)
MPASS(media != NULL);
cur = media->ifm_cur;
- MPASS(cur->ifm_data == data);
ifmr->ifm_status = IFM_AVALID;
if (!pi->link_cfg.link_ok)
@@ -2884,30 +2880,29 @@ t4_set_desc(struct adapter *sc)
static void
build_medialist(struct port_info *pi, struct ifmedia *media)
{
- int data, m;
+ int m;
PORT_LOCK(pi);
ifmedia_removeall(media);
m = IFM_ETHER | IFM_FDX;
- data = (pi->port_type << 8) | pi->mod_type;
switch(pi->port_type) {
case FW_PORT_TYPE_BT_XFI:
case FW_PORT_TYPE_BT_XAUI:
- ifmedia_add(media, m | IFM_10G_T, data, NULL);
+ ifmedia_add(media, m | IFM_10G_T, 0, NULL);
/* fall through */
case FW_PORT_TYPE_BT_SGMII:
- ifmedia_add(media, m | IFM_1000_T, data, NULL);
- ifmedia_add(media, m | IFM_100_TX, data, NULL);
- ifmedia_add(media, IFM_ETHER | IFM_AUTO, data, NULL);
+ ifmedia_add(media, m | IFM_1000_T, 0, NULL);
+ ifmedia_add(media, m | IFM_100_TX, 0, NULL);
+ ifmedia_add(media, IFM_ETHER | IFM_AUTO, 0, NULL);
ifmedia_set(media, IFM_ETHER | IFM_AUTO);
break;
case FW_PORT_TYPE_CX4:
- ifmedia_add(media, m | IFM_10G_CX4, data, NULL);
+ ifmedia_add(media, m | IFM_10G_CX4, 0, NULL);
ifmedia_set(media, m | IFM_10G_CX4);
break;
@@ -2918,29 +2913,29 @@ build_medialist(struct port_info *pi, struct ifmedia *media)
switch (pi->mod_type) {
case FW_PORT_MOD_TYPE_LR:
- ifmedia_add(media, m | IFM_10G_LR, data, NULL);
+ ifmedia_add(media, m | IFM_10G_LR, 0, NULL);
ifmedia_set(media, m | IFM_10G_LR);
break;
case FW_PORT_MOD_TYPE_SR:
- ifmedia_add(media, m | IFM_10G_SR, data, NULL);
+ ifmedia_add(media, m | IFM_10G_SR, 0, NULL);
ifmedia_set(media, m | IFM_10G_SR);
break;
case FW_PORT_MOD_TYPE_LRM:
- ifmedia_add(media, m | IFM_10G_LRM, data, NULL);
+ ifmedia_add(media, m | IFM_10G_LRM, 0, NULL);
ifmedia_set(media, m | IFM_10G_LRM);
break;
case FW_PORT_MOD_TYPE_TWINAX_PASSIVE:
case FW_PORT_MOD_TYPE_TWINAX_ACTIVE:
- ifmedia_add(media, m | IFM_10G_TWINAX, data, NULL);
+ ifmedia_add(media, m | IFM_10G_TWINAX, 0, NULL);
ifmedia_set(media, m | IFM_10G_TWINAX);
break;
case FW_PORT_MOD_TYPE_NONE:
m &= ~IFM_FDX;
- ifmedia_add(media, m | IFM_NONE, data, NULL);
+ ifmedia_add(media, m | IFM_NONE, 0, NULL);
ifmedia_set(media, m | IFM_NONE);
break;
@@ -2950,7 +2945,7 @@ build_medialist(struct port_info *pi, struct ifmedia *media)
device_printf(pi->dev,
"unknown port_type (%d), mod_type (%d)\n",
pi->port_type, pi->mod_type);
- ifmedia_add(media, m | IFM_UNKNOWN, data, NULL);
+ ifmedia_add(media, m | IFM_UNKNOWN, 0, NULL);
ifmedia_set(media, m | IFM_UNKNOWN);
break;
}
@@ -2960,24 +2955,24 @@ build_medialist(struct port_info *pi, struct ifmedia *media)
switch (pi->mod_type) {
case FW_PORT_MOD_TYPE_LR:
- ifmedia_add(media, m | IFM_40G_LR4, data, NULL);
+ ifmedia_add(media, m | IFM_40G_LR4, 0, NULL);
ifmedia_set(media, m | IFM_40G_LR4);
break;
case FW_PORT_MOD_TYPE_SR:
- ifmedia_add(media, m | IFM_40G_SR4, data, NULL);
+ ifmedia_add(media, m | IFM_40G_SR4, 0, NULL);
ifmedia_set(media, m | IFM_40G_SR4);
break;
case FW_PORT_MOD_TYPE_TWINAX_PASSIVE:
case FW_PORT_MOD_TYPE_TWINAX_ACTIVE:
- ifmedia_add(media, m | IFM_40G_CR4, data, NULL);
+ ifmedia_add(media, m | IFM_40G_CR4, 0, NULL);
ifmedia_set(media, m | IFM_40G_CR4);
break;
case FW_PORT_MOD_TYPE_NONE:
m &= ~IFM_FDX;
- ifmedia_add(media, m | IFM_NONE, data, NULL);
+ ifmedia_add(media, m | IFM_NONE, 0, NULL);
ifmedia_set(media, m | IFM_NONE);
break;
@@ -2985,7 +2980,7 @@ build_medialist(struct port_info *pi, struct ifmedia *media)
device_printf(pi->dev,
"unknown port_type (%d), mod_type (%d)\n",
pi->port_type, pi->mod_type);
- ifmedia_add(media, m | IFM_UNKNOWN, data, NULL);
+ ifmedia_add(media, m | IFM_UNKNOWN, 0, NULL);
ifmedia_set(media, m | IFM_UNKNOWN);
break;
}
@@ -2995,7 +2990,7 @@ build_medialist(struct port_info *pi, struct ifmedia *media)
device_printf(pi->dev,
"unknown port_type (%d), mod_type (%d)\n", pi->port_type,
pi->mod_type);
- ifmedia_add(media, m | IFM_UNKNOWN, data, NULL);
+ ifmedia_add(media, m | IFM_UNKNOWN, 0, NULL);
ifmedia_set(media, m | IFM_UNKNOWN);
break;
}
diff --git a/sys/dev/cxgbe/tom/t4_listen.c b/sys/dev/cxgbe/tom/t4_listen.c
index e6cbfe4..fc5f935 100644
--- a/sys/dev/cxgbe/tom/t4_listen.c
+++ b/sys/dev/cxgbe/tom/t4_listen.c
@@ -1090,35 +1090,6 @@ pass_accept_req_to_protohdrs(const struct mbuf *m, struct in_conninfo *inc,
}
}
-static int
-ifnet_has_ip6(struct ifnet *ifp, struct in6_addr *ip6)
-{
- struct ifaddr *ifa;
- struct sockaddr_in6 *sin6;
- int found = 0;
- struct in6_addr in6 = *ip6;
-
- /* Just as in ip6_input */
- if (in6_clearscope(&in6) || in6_clearscope(&in6))
- return (0);
- in6_setscope(&in6, ifp, NULL);
-
- if_addr_rlock(ifp);
- TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
- sin6 = (void *)ifa->ifa_addr;
- if (sin6->sin6_family != AF_INET6)
- continue;
-
- if (IN6_ARE_ADDR_EQUAL(&sin6->sin6_addr, &in6)) {
- found = 1;
- break;
- }
- }
- if_addr_runlock(ifp);
-
- return (found);
-}
-
static struct l2t_entry *
get_l2te_for_nexthop(struct port_info *pi, struct ifnet *ifp,
struct in_conninfo *inc)
@@ -1166,29 +1137,6 @@ get_l2te_for_nexthop(struct port_info *pi, struct ifnet *ifp,
return (e);
}
-static int
-ifnet_has_ip(struct ifnet *ifp, struct in_addr in)
-{
- struct ifaddr *ifa;
- struct sockaddr_in *sin;
- int found = 0;
-
- if_addr_rlock(ifp);
- TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
- sin = (void *)ifa->ifa_addr;
- if (sin->sin_family != AF_INET)
- continue;
-
- if (sin->sin_addr.s_addr == in.s_addr) {
- found = 1;
- break;
- }
- }
- if_addr_runlock(ifp);
-
- return (found);
-}
-
#define REJECT_PASS_ACCEPT() do { \
reject_reason = __LINE__; \
goto reject; \
@@ -1281,7 +1229,7 @@ do_pass_accept_req(struct sge_iq *iq, const struct rss_header *rss,
* SYN must be directed to an IP6 address on this ifnet. This
* is more restrictive than in6_localip.
*/
- if (!ifnet_has_ip6(ifp, &inc.inc6_laddr))
+ if (!in6_ifhasaddr(ifp, &inc.inc6_laddr))
REJECT_PASS_ACCEPT();
} else {
@@ -1293,7 +1241,7 @@ do_pass_accept_req(struct sge_iq *iq, const struct rss_header *rss,
* SYN must be directed to an IP address on this ifnet. This
* is more restrictive than in_localip.
*/
- if (!ifnet_has_ip(ifp, inc.inc_laddr))
+ if (!in_ifhasaddr(ifp, inc.inc_laddr))
REJECT_PASS_ACCEPT();
}
diff --git a/sys/dev/e1000/if_igb.c b/sys/dev/e1000/if_igb.c
index 4e2f9ed..6ac6eb6 100644
--- a/sys/dev/e1000/if_igb.c
+++ b/sys/dev/e1000/if_igb.c
@@ -1046,8 +1046,7 @@ igb_mq_start_locked(struct ifnet *ifp, struct tx_ring *txr)
}
drbr_advance(ifp, txr->br);
enq++;
- if_inc_counter(ifp, IFCOUNTER_OBYTES, next->m_pkthdr.len);
- if (next->m_flags & M_MCAST)
+ if (next->m_flags & M_MCAST && adapter->vf_ifp)
if_inc_counter(ifp, IFCOUNTER_OMCASTS, 1);
ETHER_BPF_MTAP(ifp, next);
if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
@@ -4055,7 +4054,9 @@ static bool
igb_txeof(struct tx_ring *txr)
{
struct adapter *adapter = txr->adapter;
+#ifdef DEV_NETMAP
struct ifnet *ifp = adapter->ifp;
+#endif /* DEV_NETMAP */
u32 work, processed = 0;
u16 limit = txr->process_limit;
struct igb_tx_buf *buf;
@@ -4130,7 +4131,6 @@ igb_txeof(struct tx_ring *txr)
}
++txr->packets;
++processed;
- if_inc_counter(ifp, IFCOUNTER_OPACKETS, 1);
txr->watchdog_time = ticks;
/* Try the next packet */
@@ -4630,8 +4630,11 @@ igb_initialise_rss_mapping(struct adapter *adapter)
/* Now fill in hash table */
- /* XXX This means RSS enable + 8 queues for my igb (82580.) */
- mrqc = E1000_MRQC_ENABLE_RSS_4Q;
+ /*
+ * MRQC: Multiple Receive Queues Command
+ * Set queuing to RSS control, number depends on the device.
+ */
+ mrqc = E1000_MRQC_ENABLE_RSS_8Q;
#ifdef RSS
/* XXX ew typecasting */
@@ -5124,7 +5127,6 @@ igb_rxeof(struct igb_queue *que, int count, int *done)
if (eop) {
rxr->fmp->m_pkthdr.rcvif = ifp;
- if_inc_counter(ifp, IFCOUNTER_IPACKETS, 1);
rxr->rx_packets++;
/* capture data for AIM */
rxr->packets++;
@@ -5139,45 +5141,51 @@ igb_rxeof(struct igb_queue *que, int count, int *done)
rxr->fmp->m_pkthdr.ether_vtag = vtag;
rxr->fmp->m_flags |= M_VLANTAG;
}
-#ifdef RSS
- /* XXX set flowtype once this works right */
- rxr->fmp->m_pkthdr.flowid =
- le32toh(cur->wb.lower.hi_dword.rss);
- switch (pkt_info & E1000_RXDADV_RSSTYPE_MASK) {
- case E1000_RXDADV_RSSTYPE_IPV4_TCP:
- M_HASHTYPE_SET(rxr->fmp, M_HASHTYPE_RSS_TCP_IPV4);
- break;
- case E1000_RXDADV_RSSTYPE_IPV4:
- M_HASHTYPE_SET(rxr->fmp, M_HASHTYPE_RSS_IPV4);
- break;
- case E1000_RXDADV_RSSTYPE_IPV6_TCP:
- M_HASHTYPE_SET(rxr->fmp, M_HASHTYPE_RSS_TCP_IPV6);
- break;
- case E1000_RXDADV_RSSTYPE_IPV6_EX:
- M_HASHTYPE_SET(rxr->fmp, M_HASHTYPE_RSS_IPV6_EX);
- break;
- case E1000_RXDADV_RSSTYPE_IPV6:
- M_HASHTYPE_SET(rxr->fmp, M_HASHTYPE_RSS_IPV6);
- break;
- case E1000_RXDADV_RSSTYPE_IPV6_TCP_EX:
- M_HASHTYPE_SET(rxr->fmp, M_HASHTYPE_RSS_TCP_IPV6_EX);
- break;
- /* XXX no UDP support in RSS just yet */
-#ifdef notyet
- case E1000_RXDADV_RSSTYPE_IPV4_UDP:
- case E1000_RXDADV_RSSTYPE_IPV6_UDP:
- case E1000_RXDADV_RSSTYPE_IPV6_UDP_EX:
-#endif
-
- default:
- /* XXX fallthrough */
+ /*
+ * In case of multiqueue, we have RXCSUM.PCSD bit set
+ * and never cleared. This means we have RSS hash
+ * available to be used.
+ */
+ if (adapter->num_queues > 1) {
+ rxr->fmp->m_pkthdr.flowid =
+ le32toh(cur->wb.lower.hi_dword.rss);
+ switch (pkt_info & E1000_RXDADV_RSSTYPE_MASK) {
+ case E1000_RXDADV_RSSTYPE_IPV4_TCP:
+ M_HASHTYPE_SET(rxr->fmp,
+ M_HASHTYPE_RSS_TCP_IPV4);
+ break;
+ case E1000_RXDADV_RSSTYPE_IPV4:
+ M_HASHTYPE_SET(rxr->fmp,
+ M_HASHTYPE_RSS_IPV4);
+ break;
+ case E1000_RXDADV_RSSTYPE_IPV6_TCP:
+ M_HASHTYPE_SET(rxr->fmp,
+ M_HASHTYPE_RSS_TCP_IPV6);
+ break;
+ case E1000_RXDADV_RSSTYPE_IPV6_EX:
+ M_HASHTYPE_SET(rxr->fmp,
+ M_HASHTYPE_RSS_IPV6_EX);
+ break;
+ case E1000_RXDADV_RSSTYPE_IPV6:
+ M_HASHTYPE_SET(rxr->fmp,
+ M_HASHTYPE_RSS_IPV6);
+ break;
+ case E1000_RXDADV_RSSTYPE_IPV6_TCP_EX:
+ M_HASHTYPE_SET(rxr->fmp,
+ M_HASHTYPE_RSS_TCP_IPV6_EX);
+ break;
+ default:
+ /* XXX fallthrough */
+ M_HASHTYPE_SET(rxr->fmp,
+ M_HASHTYPE_OPAQUE);
+ }
+ } else {
+#ifndef IGB_LEGACY_TX
+ rxr->fmp->m_pkthdr.flowid = que->msix;
M_HASHTYPE_SET(rxr->fmp, M_HASHTYPE_OPAQUE);
- }
-#elif !defined(IGB_LEGACY_TX)
- rxr->fmp->m_pkthdr.flowid = que->msix;
- M_HASHTYPE_SET(rxr->fmp, M_HASHTYPE_OPAQUE);
#endif
+ }
sendmp = rxr->fmp;
/* Make sure to set M_PKTHDR. */
sendmp->m_flags |= M_PKTHDR;
@@ -5551,24 +5559,94 @@ igb_led_func(void *arg, int onoff)
}
static uint64_t
+igb_get_vf_counter(if_t ifp, ift_counter cnt)
+{
+ struct adapter *adapter;
+ struct e1000_vf_stats *stats;
+#ifndef IGB_LEGACY_TX
+ struct tx_ring *txr;
+ uint64_t rv;
+#endif
+
+ adapter = if_getsoftc(ifp);
+ stats = (struct e1000_vf_stats *)adapter->stats;
+
+ switch (cnt) {
+ case IFCOUNTER_IPACKETS:
+ return (stats->gprc);
+ case IFCOUNTER_OPACKETS:
+ return (stats->gptc);
+ case IFCOUNTER_IBYTES:
+ return (stats->gorc);
+ case IFCOUNTER_OBYTES:
+ return (stats->gotc);
+ case IFCOUNTER_IMCASTS:
+ return (stats->mprc);
+ case IFCOUNTER_IERRORS:
+ return (adapter->dropped_pkts);
+ case IFCOUNTER_OERRORS:
+ return (adapter->watchdog_events);
+#ifndef IGB_LEGACY_TX
+ case IFCOUNTER_OQDROPS:
+ rv = 0;
+ txr = adapter->tx_rings;
+ for (int i = 0; i < adapter->num_queues; i++, txr++)
+ rv += txr->br->br_drops;
+ return (rv);
+#endif
+ default:
+ return (if_get_counter_default(ifp, cnt));
+ }
+}
+
+static uint64_t
igb_get_counter(if_t ifp, ift_counter cnt)
{
struct adapter *adapter;
struct e1000_hw_stats *stats;
+#ifndef IGB_LEGACY_TX
+ struct tx_ring *txr;
+ uint64_t rv;
+#endif
adapter = if_getsoftc(ifp);
+ if (adapter->vf_ifp)
+ return (igb_get_vf_counter(ifp, cnt));
+
stats = (struct e1000_hw_stats *)adapter->stats;
switch (cnt) {
+ case IFCOUNTER_IPACKETS:
+ return (stats->gprc);
+ case IFCOUNTER_OPACKETS:
+ return (stats->gptc);
+ case IFCOUNTER_IBYTES:
+ return (stats->gorc);
+ case IFCOUNTER_OBYTES:
+ return (stats->gotc);
+ case IFCOUNTER_IMCASTS:
+ return (stats->mprc);
+ case IFCOUNTER_OMCASTS:
+ return (stats->mptc);
case IFCOUNTER_IERRORS:
return (adapter->dropped_pkts + stats->rxerrc +
stats->crcerrs + stats->algnerrc +
- stats->ruc + stats->roc + stats->mpc + stats->cexterr);
+ stats->ruc + stats->roc + stats->cexterr);
case IFCOUNTER_OERRORS:
return (stats->ecol + stats->latecol +
adapter->watchdog_events);
case IFCOUNTER_COLLISIONS:
return (stats->colc);
+ case IFCOUNTER_IQDROPS:
+ return (stats->mpc);
+#ifndef IGB_LEGACY_TX
+ case IFCOUNTER_OQDROPS:
+ rv = 0;
+ txr = adapter->tx_rings;
+ for (int i = 0; i < adapter->num_queues; i++, txr++)
+ rv += txr->br->br_drops;
+ return (rv);
+#endif
default:
return (if_get_counter_default(ifp, cnt));
}
diff --git a/sys/dev/etherswitch/miiproxy.c b/sys/dev/etherswitch/miiproxy.c
index f05b121..b0f2398 100644
--- a/sys/dev/etherswitch/miiproxy.c
+++ b/sys/dev/etherswitch/miiproxy.c
@@ -62,35 +62,35 @@ struct mdioproxy_softc {
};
/*
- * The rendevous data structures and functions allow two device endpoints to
+ * The rendezvous data structures and functions allow two device endpoints to
* match up, so that the proxy endpoint can be associated with a target
* endpoint. The proxy has to know the device name of the target that it
- * wants to associate with, for example through a hint. The rendevous code
+ * wants to associate with, for example through a hint. The rendezvous code
* makes no assumptions about the devices that want to meet.
*/
-struct rendevous_entry;
+struct rendezvous_entry;
-enum rendevous_op {
- RENDEVOUS_ATTACH,
- RENDEVOUS_DETACH
+enum rendezvous_op {
+ RENDEZVOUS_ATTACH,
+ RENDEZVOUS_DETACH
};
-typedef int (*rendevous_callback_t)(enum rendevous_op,
- struct rendevous_entry *);
+typedef int (*rendezvous_callback_t)(enum rendezvous_op,
+ struct rendezvous_entry *);
-static SLIST_HEAD(rendevoushead, rendevous_entry) rendevoushead =
- SLIST_HEAD_INITIALIZER(rendevoushead);
+static SLIST_HEAD(rendezvoushead, rendezvous_entry) rendezvoushead =
+ SLIST_HEAD_INITIALIZER(rendezvoushead);
-struct rendevous_endpoint {
+struct rendezvous_endpoint {
device_t device;
const char *name;
- rendevous_callback_t callback;
+ rendezvous_callback_t callback;
};
-struct rendevous_entry {
- SLIST_ENTRY(rendevous_entry) entries;
- struct rendevous_endpoint proxy;
- struct rendevous_endpoint target;
+struct rendezvous_entry {
+ SLIST_ENTRY(rendezvous_entry) entries;
+ struct rendezvous_endpoint proxy;
+ struct rendezvous_endpoint target;
};
/*
@@ -98,15 +98,15 @@ struct rendevous_entry {
* returns an error, undo the attachment.
*/
static int
-rendevous_attach(struct rendevous_entry *e, struct rendevous_endpoint *ep)
+rendezvous_attach(struct rendezvous_entry *e, struct rendezvous_endpoint *ep)
{
int error;
- error = e->proxy.callback(RENDEVOUS_ATTACH, e);
+ error = e->proxy.callback(RENDEZVOUS_ATTACH, e);
if (error == 0) {
- error = e->target.callback(RENDEVOUS_ATTACH, e);
+ error = e->target.callback(RENDEZVOUS_ATTACH, e);
if (error != 0) {
- e->proxy.callback(RENDEVOUS_DETACH, e);
+ e->proxy.callback(RENDEZVOUS_DETACH, e);
ep->device = NULL;
ep->callback = NULL;
}
@@ -115,27 +115,27 @@ rendevous_attach(struct rendevous_entry *e, struct rendevous_endpoint *ep)
}
/*
- * Create an entry for the proxy in the rendevous list. The name parameter
+ * Create an entry for the proxy in the rendezvous list. The name parameter
* indicates the name of the device that is the target endpoint for this
- * rendevous. The callback will be invoked as soon as the target is
+ * rendezvous. The callback will be invoked as soon as the target is
* registered: either immediately if the target registered itself earlier,
* or once the target registers. Returns ENXIO if the target has not yet
* registered.
*/
static int
-rendevous_register_proxy(device_t dev, const char *name,
- rendevous_callback_t callback)
+rendezvous_register_proxy(device_t dev, const char *name,
+ rendezvous_callback_t callback)
{
- struct rendevous_entry *e;
+ struct rendezvous_entry *e;
KASSERT(callback != NULL, ("callback must be set"));
- SLIST_FOREACH(e, &rendevoushead, entries) {
+ SLIST_FOREACH(e, &rendezvoushead, entries) {
if (strcmp(name, e->target.name) == 0) {
/* the target is already attached */
e->proxy.name = device_get_nameunit(dev);
e->proxy.device = dev;
e->proxy.callback = callback;
- return (rendevous_attach(e, &e->proxy));
+ return (rendezvous_attach(e, &e->proxy));
}
}
e = malloc(sizeof(*e), M_MIIPROXY, M_WAITOK | M_ZERO);
@@ -143,34 +143,34 @@ rendevous_register_proxy(device_t dev, const char *name,
e->proxy.device = dev;
e->proxy.callback = callback;
e->target.name = name;
- SLIST_INSERT_HEAD(&rendevoushead, e, entries);
+ SLIST_INSERT_HEAD(&rendezvoushead, e, entries);
return (ENXIO);
}
/*
- * Create an entry in the rendevous list for the target.
+ * Create an entry in the rendezvous list for the target.
* Returns ENXIO if the proxy has not yet registered.
*/
static int
-rendevous_register_target(device_t dev, rendevous_callback_t callback)
+rendezvous_register_target(device_t dev, rendezvous_callback_t callback)
{
- struct rendevous_entry *e;
+ struct rendezvous_entry *e;
const char *name;
-
+
KASSERT(callback != NULL, ("callback must be set"));
name = device_get_nameunit(dev);
- SLIST_FOREACH(e, &rendevoushead, entries) {
+ SLIST_FOREACH(e, &rendezvoushead, entries) {
if (strcmp(name, e->target.name) == 0) {
e->target.device = dev;
e->target.callback = callback;
- return (rendevous_attach(e, &e->target));
+ return (rendezvous_attach(e, &e->target));
}
}
e = malloc(sizeof(*e), M_MIIPROXY, M_WAITOK | M_ZERO);
e->target.name = name;
e->target.device = dev;
e->target.callback = callback;
- SLIST_INSERT_HEAD(&rendevoushead, e, entries);
+ SLIST_INSERT_HEAD(&rendezvoushead, e, entries);
return (ENXIO);
}
@@ -178,20 +178,20 @@ rendevous_register_target(device_t dev, rendevous_callback_t callback)
* Remove the registration for the proxy.
*/
static int
-rendevous_unregister_proxy(device_t dev)
+rendezvous_unregister_proxy(device_t dev)
{
- struct rendevous_entry *e;
+ struct rendezvous_entry *e;
int error = 0;
-
- SLIST_FOREACH(e, &rendevoushead, entries) {
+
+ SLIST_FOREACH(e, &rendezvoushead, entries) {
if (e->proxy.device == dev) {
if (e->target.device == NULL) {
- SLIST_REMOVE(&rendevoushead, e, rendevous_entry, entries);
+ SLIST_REMOVE(&rendezvoushead, e, rendezvous_entry, entries);
free(e, M_MIIPROXY);
return (0);
} else {
- e->proxy.callback(RENDEVOUS_DETACH, e);
- e->target.callback(RENDEVOUS_DETACH, e);
+ e->proxy.callback(RENDEZVOUS_DETACH, e);
+ e->target.callback(RENDEZVOUS_DETACH, e);
}
e->proxy.device = NULL;
e->proxy.callback = NULL;
@@ -205,20 +205,20 @@ rendevous_unregister_proxy(device_t dev)
* Remove the registration for the target.
*/
static int
-rendevous_unregister_target(device_t dev)
+rendezvous_unregister_target(device_t dev)
{
- struct rendevous_entry *e;
+ struct rendezvous_entry *e;
int error = 0;
-
- SLIST_FOREACH(e, &rendevoushead, entries) {
+
+ SLIST_FOREACH(e, &rendezvoushead, entries) {
if (e->target.device == dev) {
if (e->proxy.device == NULL) {
- SLIST_REMOVE(&rendevoushead, e, rendevous_entry, entries);
+ SLIST_REMOVE(&rendezvoushead, e, rendezvous_entry, entries);
free(e, M_MIIPROXY);
return (0);
} else {
- e->proxy.callback(RENDEVOUS_DETACH, e);
- e->target.callback(RENDEVOUS_DETACH, e);
+ e->proxy.callback(RENDEZVOUS_DETACH, e);
+ e->target.callback(RENDEZVOUS_DETACH, e);
}
e->target.device = NULL;
e->target.callback = NULL;
@@ -234,15 +234,15 @@ rendevous_unregister_target(device_t dev)
*/
static int
-miiproxy_rendevous_callback(enum rendevous_op op, struct rendevous_entry *rendevous)
+miiproxy_rendezvous_callback(enum rendezvous_op op, struct rendezvous_entry *rendezvous)
{
- struct miiproxy_softc *sc = device_get_softc(rendevous->proxy.device);
+ struct miiproxy_softc *sc = device_get_softc(rendezvous->proxy.device);
switch (op) {
- case RENDEVOUS_ATTACH:
- sc->mdio = device_get_parent(rendevous->target.device);
+ case RENDEZVOUS_ATTACH:
+ sc->mdio = device_get_parent(rendezvous->target.device);
break;
- case RENDEVOUS_DETACH:
+ case RENDEZVOUS_DETACH:
sc->mdio = NULL;
break;
}
@@ -263,7 +263,7 @@ miiproxy_attach(device_t dev)
/*
* The ethernet interface needs to call mii_attach_proxy() to pass
- * the relevant parameters for rendevous with the MDIO target.
+ * the relevant parameters for rendezvous with the MDIO target.
*/
return (bus_generic_attach(dev));
}
@@ -272,7 +272,7 @@ static int
miiproxy_detach(device_t dev)
{
- rendevous_unregister_proxy(dev);
+ rendezvous_unregister_proxy(dev);
bus_generic_detach(dev);
return (0);
}
@@ -322,7 +322,7 @@ miiproxy_mediainit(device_t dev)
* Functions for the MDIO target device driver.
*/
static int
-mdioproxy_rendevous_callback(enum rendevous_op op, struct rendevous_entry *rendevous)
+mdioproxy_rendezvous_callback(enum rendezvous_op op, struct rendezvous_entry *rendezvous)
{
return (0);
}
@@ -349,7 +349,7 @@ static int
mdioproxy_attach(device_t dev)
{
- rendevous_register_target(dev, mdioproxy_rendevous_callback);
+ rendezvous_register_target(dev, mdioproxy_rendezvous_callback);
return (bus_generic_attach(dev));
}
@@ -357,7 +357,7 @@ static int
mdioproxy_detach(device_t dev)
{
- rendevous_unregister_target(dev);
+ rendezvous_unregister_target(dev);
bus_generic_detach(dev);
return (0);
}
@@ -373,7 +373,7 @@ mii_attach_proxy(device_t dev)
int error;
const char *name;
device_t miiproxy;
-
+
if (resource_string_value(device_get_name(dev),
device_get_unit(dev), "mdio", &name) != 0) {
if (bootverbose)
@@ -391,7 +391,7 @@ mii_attach_proxy(device_t dev)
sc = device_get_softc(miiproxy);
sc->parent = dev;
sc->proxy = miiproxy;
- if (rendevous_register_proxy(miiproxy, name, miiproxy_rendevous_callback) != 0) {
+ if (rendezvous_register_proxy(miiproxy, name, miiproxy_rendezvous_callback) != 0) {
device_printf(dev, "can't attach proxy\n");
return (NULL);
}
diff --git a/sys/dev/fdt/fdt_arm64.c b/sys/dev/fdt/fdt_arm64.c
new file mode 100644
index 0000000..fc98f51
--- /dev/null
+++ b/sys/dev/fdt/fdt_arm64.c
@@ -0,0 +1,49 @@
+/*-
+ * Copyright (c) 2009-2010 The FreeBSD Foundation
+ * All rights reserved.
+ *
+ * This software was developed by Semihalf under sponsorship from
+ * the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/module.h>
+#include <sys/bus.h>
+
+#include <dev/ofw/ofw_bus.h>
+#include <dev/ofw/ofw_bus_subr.h>
+#include <dev/ofw/openfirm.h>
+
+#include "ofw_bus_if.h"
+#include "fdt_common.h"
+
+struct fdt_fixup_entry fdt_fixup_table[] = {
+ { NULL, NULL }
+};
+
diff --git a/sys/dev/fdt/fdt_pinctrl.c b/sys/dev/fdt/fdt_pinctrl.c
index 0a0dd84..b4d33c9 100644
--- a/sys/dev/fdt/fdt_pinctrl.c
+++ b/sys/dev/fdt/fdt_pinctrl.c
@@ -46,7 +46,7 @@ fdt_pinctrl_configure(device_t client, u_int index)
char name[16];
snprintf(name, sizeof(name), "pinctrl-%u", index);
- nconfigs = OF_getprop_alloc(ofw_bus_get_node(client), name,
+ nconfigs = OF_getencprop_alloc(ofw_bus_get_node(client), name,
sizeof(*configs), (void **)&configs);
if (nconfigs < 0)
return (ENOENT);
@@ -122,12 +122,12 @@ pinctrl_configure_children(device_t pinctrl, phandle_t parent)
if (!fdt_is_enabled(node))
continue;
pinctrl_configure_children(pinctrl, node);
- nconfigs = OF_getencprop_alloc(node, "pinctrl-0",
+ nconfigs = OF_getencprop_alloc(node, "pinctrl-0",
sizeof(*configs), (void **)&configs);
if (nconfigs <= 0)
continue;
if (bootverbose) {
- char name[32];
+ char name[32];
OF_getprop(node, "name", &name, sizeof(name));
printf("Processing %d pin-config node(s) in pinctrl-0 for %s\n",
nconfigs, name);
diff --git a/sys/dev/hptnr/README b/sys/dev/hptnr/README
index 150994a..a490026 100644
--- a/sys/dev/hptnr/README
+++ b/sys/dev/hptnr/README
@@ -1,8 +1,16 @@
Rocket Controller Driver for FreeBSD
-Copyright (C) 2014 HighPoint Technologies, Inc. All rights reserved.
+Copyright (C) 2015 HighPoint Technologies, Inc. All rights reserved.
#############################################################################
Revision History:
+ v1.1.1 2015-03-26
+ * Support 4Kn drive.
+ * Change the SCSI target ID of the disk to be the index of physical connetion to the HBA.
+ * Support staggered drive spin up.
+ * Fix a bug that command would be timeout because of improper interrupt service routine.
+ * Error handling to avoid scsi command lost which caused system hang up.
+ * Fix a bug that fail to get the devcie's serial number via FreeNAS WebGUI.
+
v1.0.1 2014-8-19
* Do not retry the command and reset the disk when failed to enable or
disable spin up feature.
@@ -13,7 +21,7 @@ Revision History:
* Support smartmontool for R750.
v1.0 2013-7-3
- *First source code release
+ First source code release
#############################################################################
@@ -49,7 +57,7 @@ Revision History:
2) Extract the driver files under the kernel source tree:
# cd /usr/src/sys/
- # tar xvzf /your/path/to/hptnr_freebsd_src_v1.0.1_14_08_19.tgz
+ # tar xvzf /your/path/to/hptnr-freebsd-src-v1.0-130701.tgz
3) Update the kernel configuration file to include the HighPoint source.
Assume the configure file is GENERIC, and new kernel configure file is
diff --git a/sys/dev/hptnr/amd64-elf.hptnr_lib.o.uu b/sys/dev/hptnr/amd64-elf.hptnr_lib.o.uu
index 4f01b04..00334cf 100644
--- a/sys/dev/hptnr/amd64-elf.hptnr_lib.o.uu
+++ b/sys/dev/hptnr/amd64-elf.hptnr_lib.o.uu
@@ -1,6297 +1,4969 @@
begin 644 hptnr_lib.o
-M?T5,1@(!`0D```````````$`/@`!`````````````````````````+`#!@``
-M`````````$```````$``$``-`(G0Q@<(QD<!$D"$]G0&@$\"!.L$@&<"^X3`
-M=`:`9PS?ZP2`3PP@N!0```##9F9FD//#9F9FD&9F9I!F9I!F9I!!5T%6055!
-M5%532(/L&$F)_4F)]DB)U8A,)`=%B<=(BT8P2(E$)!!(QT8P`````$B%P`^%
-M=`$``.@`````28G$N`````!-A>0/A!$"``!,B>_H`````$B)1"002(7`=15,
-MB>9,B>_H`````+@`````Z>H!``!!QD0D.!I!QD0D.0A!QD0D.@A!QD0D.P!!
-MQD0D//]!QD0D/0!!QD0D):M!#[=&.&9!B40D($V);"0H0<=$)#3_````0<>$
-M))0````(````2(M$)!!(BT`028E$)$A(!?\```!)B40D4$'&1"0P)$B+1"00
-M28E$)'A)QX0DH`````````!!QD0D)(!)C5PD6+X`````2(G?Z`````!(BT0D
-M$$B+<!BZ_P```$B)W^@`````3(GF3(GOZ`````"[R/___^L@9F9FD&9FD+_H
-M`P``Z`````"#ZP%,B>_H`````(3;=`Y!#[9$)"0\@'3=A,!T,4B-="003(GO
-MZ`````!!#[=T)#))BWY0Z`````!,B>9,B>_H`````+@`````Z<<```!)QT0D
-M>`````!,B>9,B>_H`````$B+1"002(M8$$$/MM</MG0D!TB->P3H`````$&)
-MQ,8#`,9#`0#&0P(`QD,#`$B)[DR)[^@`````2(U5.+@`````9F:0Q@00`$B#
-MP`%(@_@0=?)!C40D!,9%.!7&13D1B$4\QD4]`$B-75A$#[;@1(EE-,>%E```
-M``````!(BU0D$$B+0A!(B45(2(E5>+X`````2(G?Z`````!(BT0D$$B+<!A$
-MB>)(B=_H`````+@!````2(/$&%M=05Q!74%>05_#D)")\&:)=PC&1PX`9L='
-M#```9H7V=!^-4/^Y`````&9FD$B+!V:)%`A(@\$"@^H!9H/Z_W7L\\-F9F:0
-M9F:09F:008GP9HEW",9'#@%FQT<,``!FA?9T'KH`````N0````!(BP=FB10(
-M@\(!2(/!`F9$.<)U[//#9F9FD&9FD&9FD(!_#@%U*@^W1PP/M\A(BQ</MQ1*
-M@\`!9HE'#&8[1PIR!F;'1PP``&:#;P@!#[?"PTB+%P^W1PB#Z`%FB4<(#[?`
-M#[<$0L-F9F:09F:09F:0@'\.`74J#[=7"`^W1PP!P@^W1PJ)P8G0P?H?]_E(
-M8])(BP=FB3109H-'"`'#9F:0#[='"`^WR$B+%V:)-$J#P`%FB4<(PV9F9I!F
-M9I!F9I!F@W\(``^4P`^VP,.0D)"02(L/2#G/=0BY`````.L/D$B+$4B+00A(
-MB4((2(D02(G(PV9F9I!F9F:09F:09F:008G0A-)T.@^V!SH&=2A(B?&^````
-M`.L4#[97`0^V00%(@\<!2(/!`3C"=0J#Q@%$.,9UY.L+N`````!F9I!FD,.X
-M`0```,-F9I!F9I!F9I#&1P$`0(AW`L='!`````##08G0#[97`0^VPDB-!$!(
-MP>`"2(G!2`-/"(/"`8A7`40!1P2X`````,8$"`!(@\`!2(/X#'7R2(DQ1(A!
-M"$R)P@^VQHA!"42)PL'J$(/B/P^V00J#X,`)T(A!"L-F9F:0#[9'`3H'#Y+`
-M#[;`PV9FD$B)^;@`````@'D"_W4(9HDQB%$"ZPV#P`%(@\$$9CV``'7E#[?`
-MPV9FD&9FD&9FD$&)T`^WQDB-!(>`>`+_=1!F1(D`B$@"#[?&PV9FD&:0#[;1
-M00^W\.@`````#[?`PTB)^;@`````.%$"=1-F.3%U#L9!`O]FQP'__^L09F:0
-M@\`!2(/!!&8]@`!UVP^WP,-F9F:09F9FD&9F9I!F9I"X`````(G!.%2'`G4&
-M9CDTAW0/@\$!2(/``4@]@````'7C9H'Y@`"X@`$```]$R`^WP<-F9F:09F:0
-M9F:09F:0#[9'.#P(=#X\*'0Z/*@/A/\````\B`^$.0$``#P*9I!T)#PJ="`\
-MJ@^$Y0```#R*#X0?`0``/"]T##R/9F9FD`^%E`$``#PO#X22````/"]W(CP*
-M=%\\"G<*/`AF9F:0=43K43PH='@\*F9FD&9FD'4TZVP\CP^$V0```#R/9I!W
-M%3R(#X3+````/(IF9F:0=13IO@```#RH9F9FD&9FD'1Q/*IT;;D`````N```
-M``#I$P$```^V1SK!X`@/ME<["=`/ME<Y@^(?P>(0"=")P0^V1SSI[P```&9F
-M9I!F9I`/ME<ZP>(8#[9'.\'@$`G"#[9'/0G"#[9'/,'@"(G1"<$/MD<_P>`(
-M#[970`G0Z;4````/ME<ZP>(8#[9'.\'@$`G"#[9'/0G"#[9'/,'@"(G1"<$/
-MME<^P>(8#[9'/\'@$`G"#[9'00G"#[9'0,'@"`G0ZW,/ME<Z2,'B.`^V1SM(
-MP>`P2`G"#[9'04@)P@^V1SQ(P>`H2`G"#[9'/4C!X"!("<(/MD<^2,'@&$@)
-MP@^V1S](P>`02`G"#[9'0$C!X`A(B=%("<$/ME="P>(8#[9'0\'@$`G"#[9'
-M10G"#[9'1,'@"`G02(F/B````(F'D````&:#3R(!\\-F9F:0NO____]FA?9T
-M,4B)^;\`````NO____])Q\``````9I`/M@$QT`^VP,'J"$$S%("#QP%(@\$!
-M9CGW=>6)T,-FD$B#[&A$#[9/.T0/MD<Z#[9/.0^V5S@/MD='B40D6`^V1T:)
-M1"10#[9'18E$)$@/MD=$B40D0`^V1T.)1"0X#[9'0HE$)#`/MD=!B40D*`^V
-M1T")1"0@#[9'/XE$)!@/MD<^B40D$`^V1SV)1"0(#[9'/(D$)$B)_DC'QP``
-M``"X`````.@`````2(/$:,-FD$B#[`@/MD8!B$<!#[9&`HA'`HM&!(E'!$B+
-M1P@/ME<!2(T44DC!X@)(BW8(2(G'Z`````!(@\0(PV9F9I!F9I!(BT]@#[97
-M6+@`````9F:0Q@0X`$B#P`%(/:@```!U\$B)3V"(5UC#9F9FD&9F9I"X````
-M`+K_____9F:09F:0B!0X2(/``4@]``(``'7Q\\-F9F:09F9FD&9F9I!F9I"Y
-M`````$@[/W022(M/"$B+$4B+00A(B4((2(D02(G(PTB+#XN!!`$``(G"@>)^
-M__[_B9$$`0``)7[_\O](BU<(B0)(BU<(B4(,2(M7"(E"$$B+5PB)0A1(BU<(
-MB4(82(M7"(E"!$B+!XN`5`$``(D%`````"7^`/__2(L7B8)4`0``PV9F9I!F
-M9I!F9I!F9I")\4B+!XN0!`$``(D5``````^W1SQF/8!D=`QF/8"1=`9F/8"4
-M=1$/MLF#P0BX`0```-/@"<+K$$`/MLZ#P0RX`0```-/@"<)(BP>)D`0!``##
-M9F9FD&9F9I!F9I!F9I")\4B+!XN0!`$``(D5``````^W1SQF/8!D=`QF/8"1
-M=`9F/8"4=1$/MLF#P0BX_O___]/`(<+K$$`/MLZ#P0RX_O___]/`(<)(BP>)
-MD`0!``##9F9FD&9F9I!F9I!F9I")\4"`_O]T;T"`_A]W,HNW&`$``+H!````
-MT^*)T/?0(?")AQ@!``"+AU@!``")!0`````AT'1`B8=8`0``PV:0B[<<`0``
-M#[;!@^@@N@$```")P=/BB=#WT"'PB8<<`0``BX=@`0``B04`````(=!T!HF'
-M8`$``//#9F9FD&9FD$B#["A(B5PD"$B);"003(ED)!A,B6PD($B)U8GP3(LO
-M0(#^`P^&B0```$B-',4`````@>/X!P``38VD'0`"``!!QP0D#`$``+\0)P``
-MZ`````!)C9P=!`(```^V50/!XA@/MD4"P>`0"<(/MD4`"<(/MD4!P>`("<*)
-M$T''!"00`0``OQ`G``#H``````^V50?!XA@/MD4&P>`0"<(/MD4$"<(/MD4%
-MP>`("<*)$^F$````2(T<Q0````"!X_@'``!.C:0K``(``$''!"0,`0``OQ`G
-M``#H`````$J-G"L$`@``#[95`\'B&`^V10+!X!`)P@^V10`)P@^V10'!X`@)
-MPHD30<<$)!`!``"_$"<``.@`````#[95!\'B&`^V10;!X!`)P@^V100)P@^V
-M107!X`@)PHD32(M<)`A(BVPD$$R+9"083(ML)"!(@\0HPTB#[!A(B5PD"$R)
-M9"0028G\0`^VWHG>Z`````"_$"<``.@`````B=Y,B>?H`````$B+7"0(3(MD
-M)!!(@\08PY!!5T%6055!5%532(/L6$F)_XA4)%=(BQ>`?SX`#X0\`@``0;P`
-M````0;W@____0;[P____0`^VQDB)1"1(2(V"@`$``$B)1"1`2(V*A`$``$B)
-M3"0X2(V"H`$``$B)1"0P2(V*I`$``$B)3"0H2(V"4`(``$B)1"0@2(V*5`(`
-M`$B)3"082(V"X`$``$B)1"002('"T`$``$B)5"0(9F:02(M$)$A$B>%(T_BH
-M`0^$C0$``$2)Y8/]`W871(GJ2`-4)"B+`HD%`````(/@_HD"ZQN-%.T`````
-MB=)(`U0D.(L"B04`````@^#^B0*_$"<``.@`````@'PD5P!T<H/]`W871(GR
-M2`-4)!"+`HD%`````(/(`HD"ZQN-%*T`````B=)(`U0D"(L"B04`````@\@"
-MB0)$B?!(BTPD$$@!P8T$K0````")P$B+5"0(2`'"@_T#=@J+`8D%`````.L(
-MBP*)!0````"H`G1TZ^-FD(/]`W8O1(GK2(M$)"!(`=C'``````"_$"<``.@`
-M````2`-<)!B+`XD%`````(/(`8D#ZT&-'.T`````B=M(BT0D($@!V,<`````
-M`+\0)P``Z`````!(`UPD&(L#B04`````@\@!B0/K-V9F9I!F9I"#_0-V*T2)
-MZDB+1"0P2`'0QP`!````2`-4)"B+`HD%`````(/(`8D"ZS9F9I!F9I"-!.T`
-M````B<!(BU0D0$@!PL<"`0```$@#1"0XBQ")%0````"#R@&)$&9F9I!F9I!!
-MC50D`4F#Q`%!@\4(08/&!$$/MD<^.=`/AT+^__](@\186UU!7$%=05Y!7\-F
-M9I!54TB#[`B)T4B++X/^`W8@C03UX/___XG`2(V4!:`!``"+`HD%`````(/@
-M_HD"ZQZ-!/4`````B<!(C90%@`$``(L"B04`````@^#^B0*$R71^@_X#=B"-
-M!+7P____B<!(C90%X`$``(L"B04`````@\@"B0+K'HT$M0````")P$B-E`70
-M`0``BP*)!0````"#R`*)`HT4M0````"-0O")P$B-C`7@`0``B=)(C905T`$`
-M`(/^`W8*BP&)!0````#K"(L"B04`````J`)T=>OC@_X#=CB-'/7@____B=M(
-MC80K4`(``,<``````+\0)P``Z`````!(C9PK5`(``(L#B04`````@\@!B0/K
-M-HT<]0````")VTB-A"M0`@``QP``````OQ`G``#H`````$B-G"M4`@``BP.)
-M!0````"#R`&)`TB#Q`A;7<.0D)"0D)!(B?E(BS\/MX&P$@``@\`!9HF!L!(`
-M`&8[@;02``!R"6;'@;`2``````^W@;`2``!(P>`"2`.!:!$``(L6B1`/MX&P
-M$@``B8<L`0``PV9FD$&)T+@`````Q@0(`$B#P`%(@_@$=?*)\F:!XO\/#[<!
-M9B4`\`G09HD!#[97#<'B#(L!)?\/\/\)T(D!#[9'"H/@`DB#^`$9TH/B`H/"
-M`<'B!0^V00.#X!\)T(/($(/@]XA!`_9'"@%T%T2)PH/B?\'B!`^W00)F)0_X
-M"=!FB4$"\\-F9F:09F9FD&9FD&9FD+@`````Q@0P`$B#P`%(@_@-=?(/MD<Y
-MB`8/MD<ZB$8!#[9'.XA&`@^V1SR(1@,/MD<]B$8$#[9'/HA&!0^V1S^(1@;V
-MAY8````$=",/MD=`B$8(#[9'08A&"0^V1T*(1@H/MD=#B$8+#[9'1(A&#+@!
-M````PV9F9I!F9F:09F:0N@````!!N@````!!N?_____K4@'21(G`T_BH`702
-M]\(````!=1J!\G<GVP#K$F:0B=`U=R?;`/?"`````0]%T(/I`40YR77+28/"
-M`4F#^@AU$XG0P>@0B`>)T,'H"(A'`8A7`L-%#[8$,KD'````ZZ)F9F:09F9F
-MD&9F9I!F9I!(BX<($0``BQ"+4`2+4`B+0`R)!0````##9F9FD&9FD$B#[`A(
-MBX:(````1`^V1T-%A,!T(@^V4`VY`````/;"`70,ZQ)(B=!(T_BH`74(@\$!
-M1#C!=>[&1D(,Z`````!(@\0(PV9F9I!F9F:09F:02(/L"$B)^$B+/V;'0$X!
-M`,9`0AU(B<;H`````$B#Q`C#9F9FD&9F9I!F9F:09F:02(/L"$B+/P^W]DC!
-MY@-(`[>P"0``2(LV2(7V=#U(BQ</MT8R9L'H!0^WP(T$A0`#``")@G`!``!(
-MBQ</MTXR@^$?N`$```!(T^")@G0!``"Z`````.@`````2(/$",.005=!5D%5
-M05154TB#[`A(B?M)B?:`?T,`="6Y`````/9&#0%T#NL800^V1@U(T_BH`74,
-M@\$!#[9#0V8YR'?H28M&0$B%P'0<2(VPD````$B+>RCH`````$F+=D!(B=_H
-M`````$F-1F!).49@#X1S`0``28G'3(G_Z`````!(B<5(@WA```^$0`$``("X
-M@P`````/A*````!F@WMH``^$E0```$&]`````$&\`````)!(BX.P"0``3`'@
-M2(LP2(7V=&$/MT8@9CM%.'579CV%`'=1#[?`@+P#8`@``/]T1$B+$P^W1C)F
-MP>@%#[?`C02%``,``(F"<`$``$B+$P^W3C*#X1^X`0```$C3X(F"=`$``,9&
-M)"&Z`````$B)W^@`````08/%`4F#Q`@/MT-H1#GH#X]X____2(M%0$C'0&``
-M````]D5,!'492(G?Z`````!(BW5`N@$```!(B=_H`````$B+54`/MH+,````
-MC02`#[92`@'02)@/MH@`````#[93.@^V<SE(Q\<`````N`````#H`````$B+
-M54!(B[/P"```OP$```#H`````$B+54!(B[/P"```OP8```#H`````$C'14``
-M````08!N#@%(B>Y(B=_H`````$TY?F`/A9#^__])QT9``````$B+`XN(6`$`
-M`(D-`````(7)=`E(BP.)B%@!``!(@\0(6UU!7$%=05Y!7\-F9F:09F9FD$B#
-M[`A,BP=!#[9P0T"$]G0U28V`N!(``+D`````2#GX=1KK(@^VP4B-%$!(C120
-M28V4T+@2``!(.?IT#X/!`4`X\77@ZP6Y``````^VP4B-%$!(C1202(T$U0``
-M``!)B[0`R!(``$B%]G1]]D8*`G1W28V$`+@2``!(.48@=6D/MD98A,!T"(/`
-M`8A&6.M92(M62$B#ZCA(C4Y(2(U".$@YR'1$2(-Z$`!U+.L*9F:02(-Z$`!U
-M(,9&6`$/MHJ[````28NXL!```$G'P`````#H`````.L12(M2.$B#ZCA(C4(X
-M2#G(=<A(@\0(PV9FD$B#["A(B5PD"$B);"003(ED)!A,B6PD($B)^TB)]4B+
-M1G!,BV@H#[=.(&:!^84`=W\/M\$/MH0'8`@``#S_='!F@_E_=R$/MM!(BX\X
-M"0``2(T$4DB-!()(P>`%2(M$"%`/MD`(ZTYF@?F!`'<<#[;`2(N7B`D``$AI
-MP,@/``!(BT00"`^V0`CK*P^VP$B+EV`)``!(C03`2,'@!4B+A!"(````#[9`
-M".L+9F:09F:0N/\```!(F$0/MJ0#Y@@``$B+=7A(A?9T"$B)W^@`````2(GN
-M2(G?Z`````!!#[;$2(T\@$B-/+A(C;S[P`$``$R)[D'_E:````!(BUPD"$B+
-M;"003(MD)!A,BVPD($B#Q"C#9F9FD&9FD&9FD&9FD$%455-(B?5(B=-F@7XX
-MX0%U$0^V1CJ#Z!%!O``````\`78T2(LW2(N^.`D```^W12"Z8)X!`&8]A0!W
-M%P^WP`^VA`9@"```2(T40$B-%)!(P>(%3(TD%\9#!`6`8P7^@"/?N`````!F
-M@7TXX0%U$0^V13J#Z`$\`0^6P`^VP&:0P>`'#[83@^)_"<*($P^VA98```"#
-MX`'!X`:#XK\)PH@3]H66`````70.3(GGZ`````!FB4,(ZP1FB4L(#[=#"(A%
-M)6:!?3CA`74E#[95.HU"_SP!=PH/ME4[@^(/ZRJ0C4+ON@\````\`78=9F9F
-MD+H`````28-\)&``=`Q!#[:4)($```"#X@\/M@.#X/`)T(@#6UU!7,-F9F:0
-M9F9FD$B#[#A(B5PD"$B);"003(ED)!A,B6PD($R)="0H3(E\)#!)B?Q(B?-)
-MB=</MD8X/`AT#SPH=`L\J'0'/(AF9I!U#H.+E`````KK)69FD&:0/`IT#CPJ
-M=`H\JG0&/(IFD'4.@XN4`````F9F9I!F9I`/MWLX9H'_X0%U'`^V0SJ#Z!$\
-M`7<1@XN4````"+@`````Z4D%``!$BT,X08'@____`$&!^.$!$``/A>8````/
-MMTL@9H'YA0`/A_($```/M\%!#[:\!&`(``")^$"`__]T;F:#^7]W(T`/MM=)
-MBXPD.`D``$B-!%)(C02"2,'@!4B+1`A0#[9`".M%9H'Y@0!W'D`/ML=)BY0D
-MB`D``$AIP,@/``!(BT00"`^V0`CK($`/ML=)BY0D8`D``$B-!,!(P>`%2(N$
-M$(@````/MD`(#[;`00^VA`3F"```2(T4@$B-%)!)C;34P`$``$F+E"2("0``
-M0`^VQTAIP,@/``!!O0````#V1`)=$`^%8`(``,9#)`1!QP<`````N`$```#I
-M2P0```^W4R"Y_P```+C_____9H'ZA0`/AXL````/M\)!#[:T!&`(``")\$"`
-M_O]T<V:#^G]W*$`/MM9)BXPD.`D``$B-!%)(C02"2,'@!4B+1`A0#[9`".M*
-M9F:09I!F@?J!`'<>0`^VQDF+E"2("0``2&G`R`\``$B+1!`(#[9`".L@0`^V
-MQDF+E"1@"0``2(T$P$C!X`5(BX00B`````^V0`A`#[;.1`^V\$ECQD$/MJP$
-MY@@``$B-1*T`2(U$A0!)C;3$P`$```^WP4B-%$!(C1202,'B!4F)U4T#K"0X
-M"0``9H'_X0%U"P^V0SJ#Z`$\`78I9H'Y_P!T!T'V14L$=1O&0R0&0<<'````
-M`+@!````Z38#``!F9I!F9I!!#[952(G1@^$!="3VP@1T'T$/MD0D1$$Z1"1.
-M<A)!QP<!````N`$```#I`0,``)!-A>T/A/<```"%R0^$[P```/;"!`^$Y@``
-M`$B)WDR)[^@`````A,!U%<9#)`1!QP<`````N`$```#IP@(``$&`O8,````?
-M=A%!QP<!````N`$```#IIP(``/:#E@````%T%TB-1*T`2(U$A0!!]H3$S`$`
-M``%T&^M?2(U$K0!(C42%`$'VA,3,`0```0^$OP$``$2)]DR)Y^@`````A,!T
-M$4''!P$```"X`0```.E.`@``]H.6`````0^$D@$``$B-1*T`2(U$A0!!]H3$
-MS`$```$/A'D!``!,B>_H`````&:#^!\/AF<!``!!QP<!````N`$```#I!0(`
-M`&9FD&:0]D8*`G0R08'XX0$0`&9FD`^$.P$``$$/MH6#````03J%@@```'(>
-M0<<'`0```+@!````Z<@!``!!@?CA`1``#X0,`0``00^W16J`>SCA#X7]````
-M@'LY`0^%\P```$C1Z$B)PH/B`0^V0SJ#Z`8\"0^'Q@````^VP/\DQ0````!!
-MN`$```"Y`0```$B)VDR)[DR)Y^@`````A,`/A;````!!QP<"````N`$```#I
-M3@$``$&X`0```+D`````2(G:3(GN3(GGZ`````"$P`^%?@```$''!P(```"X
-M`0```.D<`0``#[;*0;@!````2(G:3(GN3(GGZ`````"$P'520<<'`@```+@!
-M````Z?`````/MLI!N`````!(B=I,B>Y,B>?H`````(3`=29!QP<"````N`$`
-M``#IQ````,9#)`1!QP<`````N`$```#IKP```$F-O"2@#P``Z`````"$P'01
-M0<<'`0```+@!````Z8T```"`>SCA=4Z`>SD!9F:0=46`>SH/=3^`>ST!9F9F
-MD'4U#[9S/,'F"`^V0SL!Q@^W]DR)Y^@`````2#M#:'4%2(7`=1+&0R0$0<<'
-M`````+@!````ZSFX`````.LR9I!!#[:$).4)``!(C12`2(T4D$F-M-3``0``
-M28N4)(@)``"X.+@/`.F4^___9F:09I!(BUPD"$B+;"003(MD)!A,BVPD($R+
-M="0H3(M\)#!(@\0XPV9F9I!F9I!F9I!F9I!(@^P(2(L_Z`````!(@\0(PV9F
-M9I!F9F:09F9FD&9FD$%7059!54%455-(@^Q828G]2(GU2(N?.!$``&;'1C+_
-M#TB-5"0LZ`````"$P'0)BT0D+.D."P``BT4X)?___P`]X0$0``^%Y0```+^(
-M$P``Z``````/MTT@9H'YA0`/A[D*```/M\%!#[:T!6`(``")\$"`_O]T:V:#
-M^7]W(D`/MM9)BXTX"0``2(T$4DB-!()(P>`%2(M$"%`/MD`(ZT-F@?F!`'<=
-M0`^VQDF+E8@)``!(:<#(#P``2(M$$`@/MD`(ZQ]`#[;&28N58`D``$B-!,!(
-MP>`%2(N$$(@````/MD`(#[;`00^VA`7F"```2(T4@$B-%)!-C;35P`$``$F+
-ME8@)``!`#[;&2&G`R`\``$@!PDB)5"002,=$)`@`````2,=$)!@`````Z7(!
-M```/MU4@OO\```!F@?J%`'<,#[?"00^VM`5@"```#[=].&:!_^$!=0\/MD4Z
-M@^@1/`$/AL8```!F@?J%`'=Z#[?"00^VA`5@"```//]T:F:#^G]W(0^VT$F+
-MC3@)``!(C0122(T$@DC!X`5(BT0(4`^V0`CK2&:!^H$`=QP/ML!)BY6("0``
-M2&G`R`\``$B+1!`(#[9`".LE#[;`28N58`D``$B-!,!(P>`%2(N$$(@````/
-MMD`(ZP6X_____P^VP$$/MH0%Y@@``$B-%(!(C12038VTU<`!```/M\9(C11`
-M2(T4D$C!X@5)`Y4X"0``2(E4)`AF@?_A`75&ZS(/M\9(C03`2,'@!4D#A6`)
-M``!(B40D&$R+L(@```!(QT0D"`````!(QT0D$`````#K1`^V53J-0N\\`78G
-MC4+_/`%V(&:!_O\`=`M(BT0D"/9`2P1U#L9%)`:X`````.FV"```2,=$)!``
-M````2,=$)!@`````2(UT)$A,B>_H`````$&)QV:)13),B>_H`````$F)Q+@"
-M````387D#X1W"```3(FE@````$$/M]=(B10D2&G"L`0``$B-'!A(C4,@22N%
-M.!$``$D#A4`1``!(BU0D2(E"($C!Z"!(BU0D2(E")$F+1"082(M4)$B)0BA(
-MP>@@2(M4)$B)0BQ(BT0D2&9$B7@(N`````#&!!@`2(/``4@]L`0``'7P9H%]
-M..$!=50/MD4Z@^@1/`%W24B-3"0P2(M$)$@/ME`(2(GN2(M\)`CH`````$B-
-M@R`$``!)*X4X$0``20.%0!$``$B+5"1(B4(02,'H($B+5"1(B4(4Z14!``!!
-M#[96"O;"`74LBT4X)?___P`]X0$0``^$G````$B+3"0(#[9!2*@!#X2+````
-MJ`0/A(,```#VA98````@=`](C70D,$B)[^@`````ZQM(C4PD,$B+1"1(#[90
-M"$B)[DB+?"0(Z`````!(C8,@!```22N%.!$``$D#A4`1``!(BU0D2(E"$$C!
-MZ"!(BU0D2(E"%$B)V$DKA3@1``!)`X5`$0``2(M4)$B)0AA(P>@@2(M4)$B)
-M0ASK7/;"`G172(G822N%.!$``$D#A4`1``!(BU0D2(E"&$C!Z"!(BU0D2(E"
-M'$B-@R`$``!)*X4X$0``20.%0!$``$B+5"1(B4(02,'H($B+5"1(B4(42(M$
-M)$B`2`$"#[9564B+1"1(9HE0`H!]60!T,[\`````B?A(C01`2,'@`DF+="00
-M2(M-8$B+%`A(B10&BU0("(E4!@B#QP$/MD59.?AWTHM5-$B+1"1(B5`,9H%]
-M..$!=3\/MD4Z@^@1/`%W-$$/M\](BU0D2$B)[DR)]^@`````2(U,)#!(B=I(
-MB>Y,B??H`````$&`9@S^Z8L$``!F9I!!#[9&"J@"#X0B!```2(M$)$C&0`;^
-M2(M$)$B`8`?^2(-\)`@`#X2X````2(M$)`@/ME!(2(G0@^`&2(/X!@^%GP``
-M`/;"`0^$E@```$$/M\](BU0D2$B)[DR)]^@`````]H66`````7002(M$)$@/
-MMT`(P>`#B$0D,4B-3"0P2(G:2(GN3(GWZ`````#VA98````!=`=!@$X,`>L%
-M08!F#/[&`Z%(BU0D"`^V@NH```"#X`\/ME,!@^+P"<*(4P%(BTPD"`^W03B#
-MP`%FP<`(9HE#`DF)S$F!Q-0```#I/0,``&:!?3CA`0^%)`(```^V13H\#W03
-M0;P`````/!`/A1L#``#IK@````^V53S!X@@/MD4[`<)(BT0D2,9`!`U(BT0D
-M2(!@!?Z`3"1#"$B+="1(#[9%)4$/MHWN````T^!F"48(2(M,)$@/MD$!@^`?
-M@\@@B$$!2(M%/DB)@S@$``!FP<((9HF31`0```^V13V(@T($``#&`Y%(BU0D
-M"`^W0CB#P`%FP<`(9HE#`DB+3"0(#[:1Z@```(/B#P^V0P&#X/`)T(A#`4F)
-MS$F!Q-0```#I:`(``$B+5"1(#[9%)4$/MHWN````T^!F"4((Q@.!9L=#`O__
-M2(M$)!`/MI"[````@^(/#[9#`8/@\`G0B$,!2(-]2`!U#L9%)"&X`````.GN
-M`P``]D4[`70I3(ME4$V%Y'0@28N]L!```$R)YN@`````@^`/#[93`8/B\`G"
-MB%,!ZP5,BV0D$$B+54@/MD(!OA`````\@`^$A@```#R`=Q\\%7<2/!!F9I!F
-MD'-G@^@"/`%W1.M7/!=F9I!W.^M>/(5T+CR%9F:09F:0=Q`\@71#/()U(V9F
-MD&9FD.LB/)!R%[XH````/))F9I!V-3R3=0>^C````.LJO@0```#K(P^V0@2-
-M-(4(````D.L5O@@```#K#KX,````9I#K!;X<````B?+!Z@)(BT0D2(A0!$B+
-M3"1(9L'J"(/B`0^V006#X/X)T(A!!4B-NR`$``")\DB+=4CH`````.D-`0``
-M#[9%.(/H!#RK=T`/ML#_),4`````#[9%0,'@"`^V54&-#!"#^0UW&+@!````
-M2-/@J=@^``!T"4B+1"1(@$@!!$B+1"1(@$@!`>L)2(M$)$B`8`'[2(M$)$C&
-M0`0-2(M$)$B`8`7^2(M4)$@/MD4E00^VC>X```#3X&8)0@A(BT0D2(!@`1_&
-M@R`$```&3(MD)`A)@<34````2(V[(00``$R)YN@`````2(V[)00``$R)YN@`
-M````2(M%.$B)@T0$``!(BT5`2(F#3`0``$B+5"0(2(N"W````$B)@S@$``#&
-M`Y%(BTPD"`^VD>H```"#X@\/MD,!@^#P"="(0P$/MT$X@\`!9L'`"&:)0P)-
-MA>1T8TF+!"1(B4,$ZUFH`71500^WSTB+5"1(2(GN3(GWZ`````#VA98````!
-M=!!(BT0D2`^W0`C!X`.(1"0Q2(U,)#!(B=I(B>Y,B??H`````/:%E@````%T
-M!T&`3@P!ZP5!@&8,_DF+A;`)``!(BQ0D2(DLT$2)^F;!Z@5%#[?G@>+_!P``
-M1(GA@^$?N`$```!(T^!!"825N`D``(M%."7___\`/>$!$`!U*4B-3"1`N@``
-M``!$B>9,B??H``````^V1"1#@^`?@\A`B$0D0^FD````9H%]..$!=3,/MD4Z
-M@^@1/`%W*$B+="083(GOZ`````!(C4PD0$B+1"08#[904$2)YDR)]^@`````
-MZVE(BW0D"$R)[^@`````2(U,)$!(BT0D"`^V4')$B>9,B??H`````$B+3"0(
-M#[912$B)T(/@!DB#^`9U+O;"`70I#[9$)$.#X!^#R&"(1"1##[91<H/B?\'B
-M!`^W1"1"9B4/^`G09HE$)$)(C70D0$R)[^@`````2(MS(+@#````2(7V=$%(
-MQ\<`````N`````#H`````+@#````ZRE!#[:%Y0D``$B-%(!(C12038VTU<`!
-M``!)BY6("0``N#BX#P#IR_7__TB#Q%A;74%<05U!7D%?PV9F9I!F9F:09F:0
-M055!5%532(/L"$B)_4&]`````$R-I_@```#IN0$``)!,B>?H`````$B)PTB#
-M>'``=39(B>_H`````$B)0W!(A<!U)4B-E?@```!(BX7X````2(E8"$B)`TB)
-M4PA(B9WX````Z9T!``"+0S@E____`#WA`1``#X3=````#[=#(&8]@``/A,\`
-M```/MLAFB4L@9H/Y?W8:9H%[..$!=2D/MD,Z@^@1/`%W'F9F9I!F9I!F@?F%
-M`'<0#[?!#[:4!6`(``"`^O]U&<9#)`9(B=Y(B>_H`````.G]````9F:09I`/
-MMW,X9H'^X0%U%0^V>SJ-1^\\`0^'[0```.L?9F9FD`^VPDB-%$!(C1202,'B
-M!4F)U4P#K3@)``#K!XU'_SP!=C9F@?F``'0O9H'^X0%FD'4+#[9#.H/H$3P!
-M=AM!]D5+!'44QD,D!DB)WDB)[^@`````Z8````!(B=Y(B>_H`````(/X`G<*
-M@_@!<R5F9I#K$(/X`W5A9F:09F:09F:0ZTM(B=Y(B>_H`````&9FD.M&2(.[
-M@`````!T#TB-LX````!(B>_H`````$B-E?@```!(BX7X````2(E8"$B)`TB)
-M4PA(B9WX````ZSA(B=Y(B>_H`````$PYI?@````/A3O^___K'@^VPDB-%$!(
-MC1202,'B!4F)U4P#K3@)``#I%O___TB#Q`A;74%<05W#2(/L2$B)7"082(EL
-M)"!,B60D*$R);"0P3(ET)#A,B7PD0$B)]4F)_4R+9U!-BS0D00^V1"0,J!!T
-M#,:'Z`````;IC`(```^VE^@```"`^@$/A((```"`^@%R&H#Z!`^$HP```(#Z
-M!@^%S0(``&9FD.E=`@``QH?H`````4B)_DR)]^@`````QD4D@4&`3"0,"$B#
-MO8``````=`](C;6`````3(GWZ`````!)BX;X````2(EH"$B)10!)C8;X````
-M2(E%"$F)KO@```!,B??H`````.EB`@``@^#W08A$)`R`A^L````!QH?H````
-M`,9&)`),B??H`````$R)]^@`````Z3,"``#&A^L`````2(.^@`````!T#TB-
-MMH````!,B??H`````$F+34!(A<D/A)X!``"+402-0@&)002#^B@/AXP!``!)
-MBX;X````2(EH"$B)10!)C8;X````2(E%"$F)KO@```!!@'U*_W0D28M%8$B%
-MP'0&@'A"`'053(GJO@(```!,B>?H`````.FH`0``00^V1"0,@^#W@\@008A$
-M)`Q)BW582(7V=11!@'PD#@!U+.GE````9F9FD&9FD$$/MI6!````0;@`````
-MN0(```!,B>?H`````.E:`0``0;\`````QD0D%P!)C40D8$B)1"0(2(M\)`CH
-M`````$B)Q4F+1"1H28EL)&A(BU0D"$B)50!(B44(2(DH2(M50$B%TG0528NV
-M\`@``+\%````Z`````"`34P"2(GJO@8```!,B>?H`````("]@P````!T-D&-
-M7P%!@?]_EI@`=R9,B??H`````+\!````Z`````"`O8,`````=`N#PP&!^X&6
-MF`!UVD&)WX!$)!<!#[9$)!=!.$0D#@^'5____TF+?6!(A?]U'$'&14H#9D''
-MA<@``````$R)[DR)]^@`````ZW?H`````&9F9I!F9F:0ZVA!#[9=2DC'QP``
-M``"X`````.@`````08!D)`SO28N&^````$B):`A(B44`28V&^````$B)10A)
-MB:[X````3(GJO@8```!,B>?H`````(#[_W4.3(GJ3(GF3(GWZ`````!,B??H
-M`````$B+7"082(ML)"!,BV0D*$R+;"0P3(MT)#A,BWPD0$B#Q$C#9F:005=!
-M5D%505154TB#["A(B?U)B?5(BX\X"0``N&">`0!F@7X@A0!W&P^W1B`/MH0'
-M8`@``$B-%$!(C1202(G02,'@!4R-)`%(BY4($0``2('"0`@``$$/MD0D<L'@
-M"$B82`'"BS*)-0````!!B?=!P>\02(N5"!$``$B!PD`(``!!#[9$)'+!X`A(
-MF$@!PHM"!(D%`````(A$)!")PL'J"(A4)!'!Z!"(1"022(N5"!$``$B!PD`(
-M``!!#[9$)'+!X`A(F$@!PHM""(D%`````(A$)!.)PL'J"(A4)!3!Z!"(1"05
-MQD0D%@#&1"07`(M,)!!!B?9!P>X800^VWT2+1"041(GRB=Y(Q\<`````N```
-M``#H`````(G8@_`!B<*#X@%T%$6$_W0/0<9%)`"X`````.FH`@``08!])(%F
-M9I!U(4B-3"001(GRB=Y,B>_H`````$'&120"N`````#I?0(``$&+13@E____
-M`#WA`0X`=0]!QD4D(;@`````Z5X"``!!]H66`````74HA-)U)$&`?"1*_W0<
-M2(U,)!!$B?*)WDR)[^@`````N`````#I+`(``$R)YDB)[^@`````3(GF2(GO
-MZ`````!(BU4`00^W13)FP>@%#[?`C02%``,``(F"<`$``$B+10!!#[=-,H/A
-M'[H!````2(G32-/CB9AT`0``00^W13)(P>`#2`.%L`D``$C'``````!!#[=-
-M,HG(9L'H!27_!P``@^$?2(G62-/F2(GQ]]$AC(6X"0``00^W33*)R&;!Z`4E
-M_P<``(/A'TC3XO?2(52%;$F+50!)BT4(2(E""$B)$$$/MW4R2(V]H`\``.@`
-M````08"L)(,````!0<9%)(%)@[V``````'0/28VU@````$B)[^@`````28U$
-M)"!).40D(`^$"0$``$F)QDB-A:`/``!(B40D"$R-O?@```!F9F:09F:03(GW
-MZ`````!(B<-(BU4`#[=`,F;!Z`4/M\"-!(4``P``B8)P`0``2(M%``^W2S*#
-MX1^Z`0```$B)UDC3YHFP=`$```^W0S)(P>`#2`.%L`D``$C'```````/MTLR
-MB<AFP>@%)?\'``"#X1](B=9(T^9(B?'WT2&,A;@)```/MTLRB<AFP>@%)?\'
-M``"#X1](T^+WTB%4A6P/MW,R2(M\)`CH`````$&`K"2#`````4B#NX``````
-M=`](C;.`````2(GOZ`````!(BX7X````2(E8"$B)`TR)>PA(B9WX````33ET
-M)"`/A13___]!@:64````___^_T'&A"3H````!$R)[DR)Y^@`````N`$```!(
-M@\0H6UU!7$%=05Y!7\.02(/L6$B)7"0H2(EL)#!,B60D.$R);"1`3(ET)$A,
-MB7PD4$B)5"002(LO3(N%.!$``$B%T@^$Q@(```^WUDAIPK`$``!*C0P`]D$A
-M`G082(T$U0````!(`X6P"0``2(L`QD`D`NL62(T$U0````!(`X6P"0``2(L`
-MQD`D(4R-%-4`````2(N%L`D``$P!T$B+$(M"."7___\`/>$!$``/A+`!```/
-MMT(@9CV%`'<2#[?`#[:$!6`(```\_W499F:03(G02`.%L`D``$B+`,9`)`;I
-MR@@```^VP$B-%$!(C1202,'B!4R+G3@)``!)`=.`?"03`'EN00^V4TA(B="#
-MX`9(@_@&=2/VP@%T'DB+10"+D%@!``")%0````"%TG0*2(M%`(F06`$``$B+
-M10"+@%`!``")!0````"#R`)(BU4`B8)0`0``2(M%`(N`!`$``(D%`````(#,
-M_TB+50")@@0!``!F]T$@`@@/A.H```"`?4,`#X3@````NP````!!N0````!%
-MB<A!#[;)#[9'#4C3^*@!=&!!@/D#=B=(BT4`2`70`0``C12-`````$ACTD@!
-MT(L`B04`````P>@4@^`!ZR5(BT4`2`70`0``C12-`````$ACTD@!T(L`B04`
-M````P>@4@^`!A,!T"K@!````2-/@"<-!@\$!08U``3A%0W>!A-MT4CA?#75-
-MB?!FP>@%)?\'``"+1(5LB?&#X1](T_BH`74R08"[Z`````)W"$'&@^@````#
-M3(G02`.%L`D``$B+,$R)W^@`````Z4P'``!!NP````#V1"03`0^$.P<``$R)
-MT$@#A;`)``!(BS#&1B0ABT8X)?___P`]X0$.``^$%P<``$B+E0@1``!(@<)`
-M"```00^V0W+!X`A(F$@!PHL"B04`````2(N5"!$``$B!PD0(``!!#[9#<L'@
-M"$B82`'"BP*)!0````!(BY4($0``2('"2`@``$$/MD-RP>`(2)A(`<*+`HD%
-M`````$B)[^@`````Z:$&``"0#[?V2(T<]0````!(BX6P"0``2`'82(L09H%Z
-M..$!#X4,`0``#[9Z.D"`_Q`/AVX&``"X`0```(GY2-/@J<`P```/A<P```"I
-M```!`'54]L2`#X1)!@``2&G&L`0``$J-#``/MD$SB$(D2(G82`.%L`D``$B+
-M`/9`(P0/A"`&``"`>"0`#X06!@``2(M04$B%T@^$"08```^V03.(`NG^!0``
-M2&G&L`0``$J-#`!,C6$H2(G82`.%L`D``$B+$$$/MD0D`HA")$B)V$@#A;`)
-M``!(BP!(@WA(``^$P04```^VN2$$``#H`````$B)VD@#E;`)``!(BPJ+430Y
-MT`]'PHG"2(MY2$R)YN@`````Z8T%``!(B=A(`X6P"0``2(L`QD`D`.EW!0``
-M9F9FD&9FD$B)V$@#A;`)``!,BRA-BWUHN/____]F08%]((4`=QE(B=A(`X6P
-M"0``2(L`#[=`(`^VA`5@"```#[;`2(T40$B-%)!(P>(%3(NE.`D``$D!U$'&
-MA"3H`````$$/ME0D2$B)T(/@!DB#^`8/A9<!``#VP@$/A(X!``!!QD4D`$'V
-MA98````@#X3D!```387_#X3;!```0?:'L0````(/A*$```!!BT4TA<`/A)4`
-M``!)B[^@````2(7_=`V)PDF+=4CH`````.M\28-]2`!T=4F#O[@`````=0I)
-M@[_``````'1A38MM2$F+A[@```!(A<!T#4B)PT'VA[$````!="9(B[5`"@``
-MN@$```!,B?]!_Y?`````NP````"%P'0'2(N=0`H``$B+>PB+$TR)[N@`````
-MBP-)`<6+0P1(@\,0A<!TXDB+E0@1``!(@<)`"```00^V1"1RP>`(2)A(`<*+
-M`HD%`````(G"P>H008B7FP```,'H&&9!B8>0````2(N5"!$``$B!PD0(``!!
-M#[9$)'+!X`A(F$@!PHL2B14`````#[;"9D&)AY0````/ML9F08F'E@```(G0
-MP>@0#[;`9D&)AY@```#!ZAA!B)>:````2(N5"!$``$B!PDP(``!!#[9$)'+!
-MX`A(F$@!PHL"B04`````#[;`9D&)AY(```#I:0,``$AIQK`$``!.C30`00^V
-M1C.$P`^%T0```$B)V$@#A;`)``!(BP#&0"0`0?:%E@```!`/A#(#``!-A?\/
-MA"D#``!!#[9&,T&(AY(```!!]H>Q`````@^$#P,``$&#?30`#X0$`P``28._
-MN`````!U#DF#O\``````#X3L`@``38ME2$F+A[@```!(A<!T#4B)PT'VA[$`
-M```!="9(B[5`"@``N@$```!,B?]!_Y?`````NP````"%P'0'2(N=0`H``$B+
-M>PB+$TR)YN@`````BP-)`<2+0P1(@\,0A<`/A8<"``#KW&9FD&:0/`(/A2@"
-M``!!#[9.0$&+1CB)1"0D#[94)"</MD0D),'@&`G"#[9$)"7!X!`)P@^V1"0F
-MP>`(08G400G$@^%_@/EQ=CS&1"0-`$&#_`%V#$$/MD9!@^`/B$0D#<9$)`X`
-M08/\`G8)00^V3D*(3"0.08/\`W9F00^V1D.(1"0/ZV#&1"0-`$&#_`)V#$$/
-MMDY"@^$/B$PD#<9$)`X`QD0D#P!!@_P'=CE!#[9&1X/`"$$YQ$0/1^#&1"0.
-M`$&#_`QV"4$/MD9,B$0D#D&#_`UV"T$/MDY-B$PD#^L%QD0D#P!(B=A(`X6P
-M"0``2(L`@'@P`'1(187D=$/&0"0@2(G82`.%L`D``$B+``^V0#`/MM!$..!$
-M#T+B2(G82`.%L`D``$B+`$B+>%!(A?]T'T2)XDF-=D#H`````.L12(G82`.%
-ML`D``$B+`,9`)"*`?"0-!'412(G82`.%L`D``$B+`,9`)`)).6TH#X02`0``
-M387_#X0)`0``0?:%E@```!!T0$$/MD8S08B'D@```$'VA[$````"="I!#[9%
-M,$2)XD$XQ`]'T(32=!A)B[^H````2(7_=`P/MM))C79`Z`````"`?"0-"W=<
-M#[9$)`W_),4`````0<:'L@````'IGP```(!\)`X$=12`?"0/`G4-0<:'L@``
-M`!'IA````$'&A[(````"ZWI!QH>R````$.MP0<:'L@````OK9D'&A[(````&
-MZUQ!QH>R````#>M29I`\*'4G00^VA"2#````@^@!08B$)((```!(B=A(`X6P
-M"0``2(L`QD`D@>LE/`AU"K\0)P``Z`````!(B=A(`X6P"0``2(L`QD`D(69F
-MD&9FD$B+7"0H2(ML)#!,BV0D.$R+;"1`3(MT)$A,BWPD4$B#Q%C#9F9FD&9F
-MD&9FD&9FD$%7059!54%455-(@>RH````2(G]2(E\)'`/MX>R$@``9HF$)(``
-M``!(BP>+@$`!``")!0````!F)?\/9HF'LA(``&8[A"2`````=7%(BP>+L%`!
-M``")-0````!(BP>)L%`!``"X`````/?&`/__``^$!`D``$C'QP````"X````
-M`.@`````2(M\)'#H`````+@!````Z=\(``!F9I!F9I!(BT4`BX!``0``B04`
-M````9B7_#V:)A;(2``#K)$B-EP@!``!(B50D:$B-CZ`/``!(B4PD8$B-M_@`
-M``!(B70D6$B+A9@1``"+`(D%``````^WC;(2```E_P\```^WT3G0=9UF@?G_
-M#P^%P@<``.G2!P``3(N%.!$``&:#A"2``````0^WA"2`````9CN%MA(``+@`
-M````#[>4)(`````/0]!FB90D@````$B+E9@1``!(@\($#[>$)(````"+#()!
-MB<E!P>D00?;!"`^$KP```$B+10"+D%`!``")%0````!(BT4`B9!0`0``]\(`
-M__\`=&F`?4,`=&.)UO?&``$``'4NOP````#WQ@```0!T0.L?#[?7C4H(2(GP
-M2-/XJ`%U%(U*$$B)\$C3^*@!=0?K'[\`````#[?'2(T4@$B-%)!(C9S5P`$`
-M`$B%VW4=ZPR#QP$/MD5#9CGX=[9(BWPD<.@`````Z<4&``!(BWPD<.@`````
-MB$,/Z;,&``!F9I")SF:!YO\/#[?&2&G0L`0``$V+1!`@2(T\Q0````!(BX6P
-M"0``2`'X2(L82(7;#X5L`0``#[?VB?)(Q\<`````N`````#H`````&:#?6@`
-M#X1;!@``QH0DGP````!F9I!$#[:T))\```!.C3SU`````$B+A;`)``!,`?A(
-MBS!(A?8/A/D```!-:>:P!```3`.E.!$``$B+G=@0```/MDXE1`^VK"2?````
-M1(GJ2,?'`````+@`````Z`````!,B?A(`X6P"0``2(LXZ`````!!BXPD)`0`
-M`$&+E"0@!```18N,)"P$``!%BX0D*`0``$2)[DC'QP````"X`````.@`````
-M3(GP2,'@!D@!PXM#-(M[,$2+4RQ$BULH1(MC)$2+:R!$BW,<1(M[&(M+%(E,
-M)'Q$BTL01(M##(M+"(M3!(LSB40D0(E\)#A$B50D,$2)7"0H1(ED)"!$B6PD
-M&$2)="001(E\)`B+1"1\B00D2,?'`````+@`````Z`````"`A"2?`````0^V
-MA"2?````9CM%:`^#%@4``.G!_O__D$'VP2`/A(@!``"`>R2!9I`/A5L!``#&
-M0R0A#[=#,DC!X`-(`X6P"0``2,<```````^W2S*)R&;!Z`4E_P<``(/A'[H!
-M````2(G62-/F2(GQ]]$AC(6X"0``#[=+,HG(9L'H!27_!P``@^$?2-/B]](A
-M5(5L#[=S,DB+?"1@Z`````!(@[N``````'0/2(VS@````$B)[^@`````#[=3
-M(&:!^H4`#X?'````#[?"#[:$!6`(```\_P^$M````&:#^G]W(P^VP$B-%$!(
-MC1202,'B!4@#E3@)``!(BT)0@'@(_P^5P.M9#[=#(&8]@0!W)@^WP`^VA`5@
-M"```2&G`R`\``$@#A8@)``!(BT`(@'@(_P^5P.LI#[=#(`^VA`5@"```2(T$
-MP$C!X`5(`X5@"0``2(N`B````(!X"/\/E<"$P'0N2(G>2(GOZ`````!(BX7X
-M````2(E8"$B)`TB+1"182(E#"$B)G?@```#IGP,``$B+3"1H2(M1"$B-0Q!(
-MB4$(2(E+$$B)4`A(B0+I?@,``(GP9L'H!40/M_!)8\8/M_9!B?=!@^<?BT2%
-M;$2)^4C3^*@!#X55`P``2(GX2`.%L`D``$B+``^W4"!F@?J%``^'N@````^W
-MP@^VA`5@"```//\/A*<```!F@_I_=R`/ML!(C11`2(T4D$C!X@5(`Y4X"0``
-M2(M"4`^V0`CK;4B)^$@#A;`)``!(BP`/MT`@9CV!`'<C#[?`#[:$!6`(``!(
-M:<#(#P``2`.%B`D``$B+0`@/MD`(ZS-(B?A(`X6P"0``2(L`#[=`(`^VA`5@
-M"```2(T$P$C!X`5(`X5@"0``2(N`B`````^V0`@\_W00#[;02&/"@+P%Y@@`
-M`/]U-DECQHM$A6Q$B?E(T_BH`0^%:@(``,9#)`9(B=_H`````+H`````2(G>
-M2(GOZ`````#I20(``$ACP@^VA`7F"```2(T4@$B-%)!(C;S5P`$``$V%P'0-
-M0?;!`K@`````3`]$P/9'"@(/A%X!``!,B<+H`````$ECQHM$A6Q$B?E(T_BH
-M`0^%]0$``(![)($/A8\````/MT,R2,'@`T@#A;`)``!(QP``````#[=+,HG*
-M9L'J!8'B_P<``(/A'[@!````2-/@]]`AA)6X"0``#[=S,DB+?"1@Z`````!(
-MB=Y(B>_H`````$B#NX``````=`](C;.`````2(GOZ`````!(BX7X````2(E8
-M"$B)`TB+="182(ES"$B)G?@```#I7`$``$B+A0@!``!(.T0D:'1?0;P`````
-M08/$`4B+`$@Y1"1H=?)%A.1T1D&]`````$B+?"1HZ`````!(C4CP2(MT)&A(
-MBU8(2(E&"$B),$B)4`A(B0)(.=FX`0```$0/1.A!@.P!=<E%A.T/A>\```!(
-MBT0D:$B+4`A(C4,02(M,)&A(B4$(2(E+$$B)4`A(B0))8]:X`0```$2)^4C3
-MX`F$E:P```#IM````$R)PN@`````2(N%"`$``$@[1"1H=%M!O`````!!@\0!
-M2(L`2#E$)&AU\D6$Y'1"0;T`````2(M\)&CH`````$B-2/!(BW0D:$B+5@A(
-MB48(2(DP2(E0"$B)`D@YV;@!````1`]$Z$&`[`%UR46$[75#@'LD@70]2(M$
-M)&A(BU`(2(U#$$B+3"1H2(E!"$B)2Q!(B5`(2(D"26/6N`$```!$B?E(T^`)
-MA)6L````9F9FD&9FD`^WM"2`````9CFULA(```^%+OC__V:!O;(2``#_#W0C
-M2(N%F!$``(L`B04`````)?\/```/MY6R$@``.=`/A<[W__](C84(`0``2#F%
-M"`$``'1)2(G#2(G?Z`````!(C7#P#[=.,HG*9L'J!8'B_P<``(/A'[@!````
-M2-/@]]`AA)6L````N@````!(B>_H`````$@YG0@!``!UNDB)[^@`````N`$`
-M``!(@<2H````6UU!7$%=05Y!7\-F9I!FD$B#["A(B5PD"$B);"003(ED)!A,
-MB6PD($B+G_`(``!(BT,(1(LH1(DM`````$'WQ0```)!T>DB+0PA$B2CK<9!(
-M@<.(%```2(L#BY!0`0``B14`````2(L#B9!0`0``A=)T//?"````$'0<2(L#
-MQX!0`0``````$$B+`XN`4`$``(D%`````$B+`\>`4`$```$```!(B=_H````
-M`$$!Q(/%`8/]`G69ZQ=F9F:09F:00;P`````O0````#KBF9FD$6$Y`^5P$6%
-M[0^5P@G0#[;`2(M<)`A(BVPD$$R+9"083(ML)"!(@\0HPV9FD&9FD$%7059!
-M54%455-(@^PH28G\2(L'BY!0`0``B14`````2(L'B9!0`0``9F9FD&9FD/?"
-M`/__``^$*`D``$&`?"1#``^$'`D``,9$)!``B=)(B50D"$0/MFPD$$&-30A(
-MBT0D"$C3^*@!=11!C4T02(M$)`A(T_BH`0^$T0@``(!\)!`#=BM)BP0D2`6`
-M`0``0HT4[0````!(8])(`="+`(D%`````,'H$X/@`>LI9F:028L$)$@%@`$`
-M`$*-%.T`````2&/22`'0BP")!0````#!Z!.#X`&$P'0F3(GGZ`````!)8]5(
-MC0122(T$@D&!C,3L$@`````(`&9F9I!F9I!)BQ0D@'PD$`-V)4*-!.T`````
-M2)A(C80"@`$``(L`B04`````)0```0#K(V9F9I!"C03M`````$B82(V$`H`!
-M``"+`(D%`````"4```$`A<!T08!\)!`#=AU"C03M`````$B82(V$`H`!``#'
-M`````0#I&0@``$*-!.T`````2)A(C80"@`$``,<````!`.G\!P``08!\)%$!
-M#X6H!@``@'PD$`-V*4F+!"1(!8`!``!"C13M`````$ACTD@!T(L`B04`````
-M@^`!ZR=F9F:028L$)$@%@`$``$*-%.T`````2&/22`'0BP")!0````"#X`&$
-MP`^$50$``$ECQ4B-'$!(C1R82,'C`TF-M!SP$@``28M\)"CH`````$F+O!S(
-M$@``2(7_=!U(BT=`2(7`=!3V0$X"=0[H`````(3`D`^%"@$``$ECQ4B-%$!(
-MC12028N$U,@2``!(A<!T=4F)QH!X#@`/A(L```!!OP````!(C6A@2(GOZ```
-M``!(B<-(BT4(2(E="$B)*TB)0PA(B1CV0TP"=2](BU-`2(72=!9)B[0D\`@`
-M`+\%````Z`````"`2TP"2(G:O@8```!,B??H`````$&#QP%%.'X.=B7KH@^V
-M="00N@$```!,B>?H`````+^@A@$`Z`````"Z`"TQ`>L%ND!+3`!)8\5(C0Q`
-M2(T,B$C!X0-*C30AB9;P$@``2,>&`!,````````/MD0D$$B-%$!(C12028V4
-MU+@2``!(B98($P``28VT#/`2``!)BWPD*.@`````9F:0@'PD$`-V/4*-%.T`
-M````2&/228L$)$@%@`$``$@!T(L`B04`````28L$)$@%@`$``$@!PHL"B04`
-M````P>@'@^`!ZSM"C13M`````$ACTDF+!"1(!8`!``!(`="+`(D%`````$F+
-M!"1(!8`!``!(`<*+`HD%`````,'H!X/@`83`='6`?"00`W8W0HT,[0````!(
-M8\E)BP0D2`6$`0``2`'(BP")!0````!)BQ0D2('"A`$``$@!T0T```$`B0'K
-M/D*-#.T`````2&/)28L$)$@%A`$``$@!R(L`B04`````28L4)$B!PH0!``!(
-M`=$-```!`(D!ZR^`?"00`W8H28L$)$@%@`$``$*-%.T`````2&/22`'0BP")
-M!0````#!Z!*#X`'K)DF+!"1(!8`!``!"C13M`````$ACTD@!T(L`B04`````
-MP>@2@^`!A,`/A"("``"`?"00`W8W0HT,[0````!(8\E)BP0D2`6``0``2`'(
-MBP")!0`````-```$`$F+%"1(@<*``0``2`'1B0'K-4*-#.T`````2&/)28L$
-M)$@%@`$``$@!R(L`B04`````#0``!`!)BQ0D2('"@`$``$@!T8D!26/%2(T4
-M0$B-%)!)BX34R!(``$B%P'0328G%2(-X0``/A:(```#IA`$``(!\)!`#=DI"
-MC13M`````$ACTDF+!"1(!8`!``!(`="+"(D-`````$F+!"1(!8`!``!(C00"
-MB0A)BP0D2`6``0``2`'"BP*)!0````#IT`,``$*-%.T`````2&/228L$)$@%
-M@`$``$@!T(L(B0T`````28L$)$@%@`$``$B-!`*)"$F+!"1(!8`!``!(`<*+
-M`HD%`````.F&`P``9I!(BTA`#[=!3@^WT/;&`0^%TP```$B)S?;"`@^$QP``
-M`(/@_6:)04Y(C;'`````28M\)"CH`````,9$)!``@'T[`'1WQD0D$``/MD0D
-M$$B+7,582(7;=%1(BU-`2(72=!9)B[0D\`@``+\%````Z`````"`2TP"2(G:
-MO@8```!,B>_H`````("[@P````!T')!,B>?H`````+\!````Z`````"`NX,`
-M````=>6`1"00`0^V1"00.$4[=X['A<````!`2TP`2,>%T`````````!(B:W8
-M````2(VUP````$F+?"0HZ`````"`?"00`W8R28L$)$@%@`$```^V5"002,'B
-M`X'B^`<``$@!T(L`B04`````P>@(@^`!ZS!F9I!F9I!)BP0D2`6``0``#[94
-M)!!(P>(#@>+X!P``2`'0BP")!0````#!Z`B#X`&$P`^$%@$``(!\)!`#=BQ)
-MBP0D2`6``0``#[94)!!(P>(#@>+X!P``2`'0BP")!0````"#\`&#X`'K*DF+
-M!"1(!8`!```/ME0D$$C!X@.!XO@'``!(`="+`(D%`````(/P`8/@`83`#X2Q
-M````#[9$)!!(C11`2(T4D$F-E-2P$@``3(UZ"$F+1Q!(A<`/A(L```!)B<9(
-MC7)`28M\)"CH`````$&`?@X`=%%!O0````!)C6Y@D$B)[^@`````2(G#2(M%
-M"$B)70A(B2M(B4,(2(D82(M30$B%TG0628NT)/`(``"_!0```.@`````@$M,
-M`D&#Q0%%.&X.=[I!QT<X@(0>`$G'1T@`````38E_4$F-=SA)BWPD*.@`````
-M@'PD$`,/AG\````/MEPD$$C!XP.!X_@'``!)BP0D2`6``0``2`'8BQ")%0``
-M``!)BP0D2`6``0``2(T$`XD028L$)$@%@`$``$B-!`.+`(D%`````$F+!"1(
-M!3`"``!(C00#QP``````OQ`G``#H`````$F+!"1(!30"``!(`<.+`XD%````
-M`.M]#[9<)!!(P>,#@>/X!P``28L$)$@%@`$``$@!V(L0B14`````28L$)$@%
-M@`$``$B-!`.)$$F+!"1(!8`!``!(C00#BP")!0````!)BP0D2`50`@``2(T$
-M`\<``````+\0)P``Z`````!)BP0D2`54`@``2`'#BP.)!0````"`1"00`0^V
-M1"0003A$)$,/A_#V__])BP0DBY!0`0``B14`````28L$)(F04`$``/?"`/__
-M`'0FZ:7V__]F9I!FD$ECU4B-!%)(C02"08&,Q.P2``````$`Z>CW__^X````
-M`$B#Q"A;74%<05U!7D%?PT%7059!54%455-(@^QH28G]0(AT)$M`#[;&B40D
-M3$B82(T40$B-%)!(C1373(NZR!(```^VJL(2``!(BP=`@/X#=@S'@'`!``#$
-M`0``ZPK'@'`!``"H`0``2(E$)&!(!70!``!(B40D4$B+5"1@BX)T`0``B04`
-M````BTPD3(/A`[L'````T^-!B=Q!"<1$B:)T`0``O^@#``#H`````/?31"'C
-M2(M,)&")F70!``"`?"1+`W95BT0D3,'@`DB82(V4`=`!``"+`HD%`````(/(
-M"(D"BUPD3,'C`TACVTB-A!D``@``QP`X````OQ`G``#H`````$B+5"1@2(V$
-M&@0"``#'``````#K6(M$)$S!X`)(F$B+3"1@2(V4`=`!``"+`HD%`````(/(
-M"(D"BUPD3,'C`TACVTB-A!D``@``QP`X````OQ`G``#H`````$B+5"1@2(V$
-M&@0"``#'``````!-A?\/A%<(``!!@'U#`'0LNP`````/MLM!#[9'#4C3^*@!
-M=`^Z`0```(G.3(GOZ`````"#PP%!.%U#=]E!]D<*`71G3(G^3(GOZ`````"+
-M="1,3(GOZ`````!(8T0D3$B-%$!(C12028V4U>`2``"+0@BI```0`'0()?__
-M[_^)0@A,B?Y,B>_H`````$AC1"1,2(T40$B-%)!)QX35R!(```````#IM@<`
-M`$&`?U@`=!1)B[VP$```3(G^Z`````!!@&]8`4C'P/[___\/MDPD3$C3P$`@
-MZ(A$)%L/A+T"``"+="1,3(GOZ`````!(8T0D3$B-%$!(C12028V4U>`2``"+
-M0@BI```0`'0()?__[_^)0@@/MD0D6T&(1PU!@'U#``^$[P$``,=$)%P`````
-M#[;02(E4)#!(BTPD8$B!P0`"``!(B4PD*$B+1"1@2`4$`@``2(E$)"`/ME0D
-M6XE4)!Q(BTPD8$B!P=`!``!(B4PD$$0/MG0D7$$/MNY(BT0D,(GI2-/XJ`$/
-MA$T!``!(8\5(C11`2(T4D`^V1"1;08B$U<(2``!!@/X##X:5````C1SM````
-M`$ACVTB+1"0H2`'8QP`X````OQ`G``#H`````$@#7"0@BU0D'(D32(M,)&#'
-M@7`!``#$`0``2(M4)%"+`HD%`````(GI@^$#NP<```#3XT&)W$$)Q$2)(K_H
-M`P``Z`````#WTT0AXTB+3"10B1F-%*T`````2&/22`-4)!"+`HD%`````(/(
-M"(D"Z98```"-'.T`````2&/;2(M$)"A(`=C'`#@```"_$"<``.@`````2`-<
-M)""+1"0<B0-(BU0D8,>"<`$``*@!``!(BTPD4(L!B04`````B>F#X0.[!P``
-M`-/C08G<00G$2(M$)%!$B2"_Z`,``.@`````]]-!(=Q(BU0D4$2)(HT4K0``
-M``!(8])(`U0D$(L"B04`````@\@(B0*#1"1<`4&-1@%!.$5#=BSI@_[__TB)
-MW^@`````2(UPR$B+4PA(B4,(2(D82(E0"$B)`DB#>-@`=!'K";X`````28U?
-M2$DY7TAURDB%]G0XQD9:`$&`?4,`="VY`````+H`````00^V1PU(T_BH`70.
-M#[;"B$P&<(!&6@&#P@&#P0%!.$U#=]VZ`````+Z!````3(G_Z`````!(8T0D
-M3$B-%$!(C1202<>$U<@2````````08!]0P`/A9\#``#IP@0``+H`````O@8`
-M``!,B?_H`````(MT)$Q,B>_H`````$AC1"1,2(T40$B-%)!)C935X!(``(M"
-M"*D``!``=`@E___O_XE""$F-1TA).4=(#X0``@``2(D$)$B+/"3H`````$R-
-M<,A(C5`02#E0$`^$PP$``$F-1DA(B40D"$B+?"0(Z`````!(C5CP@'M)#747
-M2(VP4`$``$B+0U!(BP!(BW@HZ`````!(BQ-(BT,(2(E""$B)$("[@P````!T
-M'6:03(GOZ`````"_`0```.@`````@+N#`````'7E2(M#0$B%P`^$*@$``$C'
-M0&``````@+N#``````^$IP```&9!@WUH``^$FP```+T`````0;P`````3(G@
-M20.%L`D``$B+,$B%]G1J#[=&(&8[0SAU8&8]A0!W6@^WP$&`O`5@"```_W1,
-M28M5``^W1C)FP>@%#[?`C02%``,``(F"<`$``$F+50`/MTXR@^$?N`$```!(
-MT^")@G0!``#&1B0AN@````!,B>_H`````&9FD&9FD(/%`4F#Q`A!#[=%:#GH
-M#X]P____]D-,!'493(GOZ`````!(BW-`N@$```!,B>_H`````$B+0T`/ME`"
-M#[9P`4C'QP````"X`````.@`````2(M30$F+M?`(``"_`0```.@`````2(M3
-M0$F+M?`(``"_!@```.@`````2,=#0`````!!@&\.`4&`;E@!2(G>3(GOZ```
-M``!(BU0D"$DY5D@/A4;^__]!@&\H`4R)]DR)[^@`````2(L,)$DY3T@/A03^
-M__])C4=@23E'8`^$$`$``+T`````28G$2<?&`````$R)Y^@`````2(G#@+B#
-M`````'0WC44!@?U_EI@`=@2)Q>LHB<5,B>_H`````+\!````Z`````"`NX,`
-M````=`N#Q0&!_8&6F`!UVDB+0T!(A<`/A(\```!(QT!@`````/9#3`1U&4R)
-M[^@`````2(MS0+H!````3(GOZ`````!(BU-`#[:"S````(T$@`^V4@(!T$B8
-M00^V#`9!#[95.D$/MG4Y2,?'`````+@`````Z`````!(BU-`28NU\`@``+\!
-M````Z`````!(BU-`28NU\`@``+\&````Z`````!(QT-``````$&`;PX!2(G>
-M3(GOZ`````!-.6=@#X7__O__3(G^3(GOZ`````!(8T0D3$B-%$!(C1202<>$
-MU<@2````````Z5;\__]!OP`````/MD0D6TB)1"1`2(M4)&!(@<+0`0``2(E4
-M)#A%B?Y!#[;O2(M$)$")Z4C3^*@!=0M$.'PD2P^%U0```$&`_@-V:$B+1"1@
-MQX!P`0``Q`$``$B+5"10BP*)!0````")Z8/A`XT,2;L'````T^-!B=Q!"<1$
-MB2*_Z`,``.@`````]]-$(>-(BTPD4(D9C12M`````$ACTD@#5"0XBP*)!0``
-M``"#R`B)`NMG2(M$)&#'@'`!``"H`0``2(M4)%"+`HD%`````(GI@^$#C0Q)
-MNP<```#3XT&)W$$)Q$2)(K_H`P``Z`````#WTT$AW$B+3"101(DAC12M````
-M`$ACTD@#5"0XBP*)!0````"#R`B)`D&#QP%!C48!03A%0P^'^?[__TB#Q&A;
-M74%<05U!7D%?PV9F9I!F9F:09F:09F:005154TF)_$B)]0^V=T-`A/9T)@^V
-M50V[`````/;"`70.ZQ9(B=")V4C3^*@!=0^#PP%`./-U[.L%NP````#V10P"
-M=0I(C45@2#E%8'5H2(GOZ`````"$P'113(GGZ`````!(B<9(A<!T3$B+56A(
-MB45H2(U%8$B)!DB)5@A(B3*`10X!2(EN4,9&2`7&1DD`QH:!````#[D!````
-MN@$```!(B>_H`````.L+#[;S3(GGZ`````!;74%<PV9FD&:0059!54%455-(
-MB?U!B?5$#[;V0HT$M0````!,8^"[`````+\0)P``Z`````!!@/T#=AY(BT4`
-M2`70`0``3`'@BP")!0````#!Z!2#X`'K'9!(BT4`2`70`0``28T$!(L`B04`
-M````P>@4@^`!A,!U"H/#`6:!^RP!=:A$B?9(B>_H`````$B)[^@`````26/&
-M2(T40$B-%)!(C435`/:`P1(```%T#TB+L,@2``!(B>_H`````%M=05Q!74%>
-MPV:0059!54%455-!B?5)B?Q$#[;V26/&2(T40$B-%)!(BZS7R!(``$B%[0^$
-ME@$``$C'P/[___]$B?%(T\"$10T/A8`!``!(C45(2#E%2'450;T`````2(U=
-M8(!]#@!U(^GS`@``0`^VQDB-/$!(C3RX28V\_+@2``#H`````.G5`@``2(G?
-MZ`````!(B<%(BT,(2(E+"$B)&4B)00A(B0B`>4D`#X4)`0``#[=!.$F#O,1@
-M!````'4+2(-Y0``/A-D````/MT$X28N$Q&`$``!(@[B```````^$IP```,:!
-MZ``````/ME%(2(G0@^`&2(/X!G4M]L(!="C&04H%QD%+!`^VD8$```!(BW%8
-M2(MY4.@`````Z9@```!F9F:09F:0#[912$B)T(/@!DB#^`1U(/;"`70;QD%*
-M`\9!2P1(B<Y,B>?H`````.MG9F:09F:0#[912$B)T(/@!DB#^`9U4?;"`75,
-MQD%+!L9!2@5FQX'(``````!(B<Y,B>?H`````.LN2(M10$F+M"3P"```OP0`
-M``#H`````.L6#[=1.$F+M"3P"```OP(```#H`````$&#Q0%$.&T.#X:7`0``
-MZ;W^__]"C02U`````$ACZ+L`````OQ`G``#H`````$&`_0-V'4F+!"1(!=`!
-M``!(`>B+`(D%`````,'H%(/@`>L;28L$)$@%T`$``$@!Z(L`B04`````P>@4
-M@^`!A,!U"H/#`6:!^RP!=:I$B?9,B>?H`````$R)Y^@`````26/&2(T40$B-
-M%)!)BZS4R!(``$B%[0^$_0```$&`?"1#`'0LNP`````/MLL/MD4-2-/XJ`%T
-M#[H`````B<Y,B>?H`````(/#`4$X7"1#=]E!#[;%2(T40$B-%)!)C934N!(`
-M`$B)52!(C45(2#E%2'4X2(U%8$@Y16!U+NM[9F:09I!(B=_H`````$B-<,A(
-MBU,(2(E#"$B)&$B)4`A(B0)(@WC8`'01ZPF^`````$B-74A(.5U(=<I(A?9T
-M6\9&6@!!@'PD0P!T3[D`````N@`````/MD4-2-/XJ`%T#@^VPHA,!G"`1EH!
-M@\(!@\$!03A,)$-V(NO;]D4*`70-2(GN3(GGZ`````#K#;X`````2(GOZ```
-M``!;74%<05U!7L.02(/L"$R+!T2+3S1!#[9P0T"$]G1B28V`N!(``+D`````
-M2#GX=1KK3P^VP4B-%$!(C12028V4T+@2``!(.?IT"(/!`4`X\77@@/D#=B])
-MBP!(!=`!``!(C12-`````('B_`,``$@!T(L`B04`````P>@4@^`!ZRVY````
-M`$F+`$@%T`$``$B-%(T`````@>+\`P``2`'0BP")!0````#!Z!2#X`&$P'00
-M#[;Q1(G*3(G'Z`````#K"P^V\4R)Q^@`````2(/$",-F9F:09F9FD$%7059!
-M54%455-(@^P(2(GS28G^3(NGB````$F++"1!]D0D#!!T!,9'409!#[9&43P!
-M='D\`7(5/`0/A)D````\!@^%2`,``.FZ`0``0<9&40%,B?9(B>_H`````,9#
-M)(%!@$PD#`A(@[N``````'0/2(VS@````$B)[^@`````2(V5^````$B+A?@`
-M``!(B5@(2(D#2(E3"$B)G?@```!(B>_H`````.GC`@``08!D)`SW08!&4@%!
-MQD91`,9#)`)(B=Y(B>_H`````$B)[^@`````Z;<"``!!#[9$)`R#X/>#R!!!
-MB$0D#$&+E@@!``"-0@%!B88(`0``@_H"#X<#`0``2(.[@`````!T#TB-LX``
-M``!(B>_H`````$B-E?@```!(BX7X````2(E8"$B)`TB)4PA(B9WX````08!^
-M0@!U&$&_`````$V-;"1@08!\)`X`=1[IG@```+H`````O@(```!,B>?H````
-M`&:0Z1L"``!,B>_H`````$B)PTF+10A)B5T(3(DK2(E#"$B)&$B+4T!(A=)T
-M%4B+M?`(``"_!0```.@`````@$M,`DB)VKX&````3(GGZ`````"`NX,`````
-M=")F9F:09F:02(GOZ`````"_`0```.@`````@+N#`````'7E08/'`44X?"0.
-M#X=[____3(GWZ`````#IB0$``$&`9"0,]T''A@@!````````2(.[@`````!T
-M#TB-LX````!(B>_H`````$B-E?@```!(BX7X````2(E8"$B)`TB)4PA(B9WX
-M````N@````"^!@```$R)Y^@`````28U$)&!).40D8'1\28G%3(GOZ`````!(
-MB<-(BT!`2(7`=%-(QT!@`````$B)[^@`````2(MS0+H!````2(GOZ`````!(
-MBU-`2(NU\`@``+\!````Z`````!(BU-`2(NU\`@``+\&````Z`````!(QT-`
-M`````$B)WDB)[^@`````33EL)&!UATR)]DB)[^@`````2<=$)$``````2(M%
-M`(N06`$``(D5`````(72=`I(BT4`B9!8`0``0?9$)`H!=&N`?4,`="RY````
-M`$'V1"0-`705ZQUF9I!F9I!!#[9$)`U(T_BH`74/@\$!.$U#=^OK!;D`````
-M#[;9B=Y(B>_H`````$R)YDB)[^@`````2&/;2(T$6TB-!(-(QX3%R!(`````
-M``!F9I!FD$B#Q`A;74%<05U!7D%?PY!(@^PH2(E<)`A(B6PD$$R)9"083(EL
-M)"!(B?-(B?U,BV]038ME``^W3C*)R&;!Z`4/M_!(8\9!BT2$;(/A'TC3^*@!
-M#X5G`P``28L4)(T$M0`#``")@G`!``!)BP0DBY!T`0``B14`````QD,D(8M#
-M."7___\`/>$!#P!U(TB)W^@`````N@````!(B=Y,B>?H`````.D6`P``9F:0
-M9F:0B=`/MTLR@^$?2-/XJ`%T$$B)W^@`````3(GGZ``````/MH7H````/`0/
-MA^$"```/ML#_),4`````QH7H`````;H!````2(G>3(GOZ`````#INP(``,:%
-MZ`````*Z"````$B)WDR)[^@`````Z9\"``#&A>@````#2(GJOB$```!,B>_H
-M`````$B+=5A(A?9T'P^VE8$```!!N`````"Y`0```$R)[^@`````Z6`"``!!
-M#[9U#;H`````3(GGZ`````#I20(``,:%Z`````1(@WU8`'0S2(GJOB$```!,
-MB>_H``````^VE8$```!(BW580;@`````N0(```!,B>_H`````.D(`@``N@``
-M``"^(0```$R)[^@`````00^V=0VZ`0```$R)Y^@`````Z=\!``"`?4K_=!5(
-MB>J^!@```$R)[^@`````Z<0!``!(B>J^!@```$R)[^@`````2(M-0$B%R702
-MBU$$C4(!B4$$@_H%#X:9`0``QD5+`<9%2@"`O8,`````=!M,B>?H`````+\!
-M````Z`````"`O8,`````=>5(@WU8`'092(M5$$B+11A(B4((2(D02(M%6(!H
-M6`'K&4B+56!(A=)T$`^VA8$```!(QT3"6`````!(BU4`2(M%"$B)0@A(B1!!
-M@&T.`4B+O2`!``!(A?]T$0^VM0T!``"Z`0```.@`````2(M]6$B%_W01#[:U
-M@0```+H!````Z`````!(BT5`2(7`=')(QT!@`````$R)Y^@`````2(MU0+H!
-M````3(GGZ`````!(BT5`#[90`@^V<`%(Q\<`````N`````#H`````$B+54!)
-MB[0D\`@``+\!````Z`````!(BU5`28NT)/`(``"_!@```.@`````2,=%0```
-M``!(B>Y,B>?H`````$&`?0G_=%R]`````$&`?0X`=#F]`````$F-76!F9F:0
-M9F:02(G?Z`````!(BU,(2(E#"$B)&$B)4`A(B0*`>$K_=0F#Q0%!.&T.=]=!
-M.&T.=Q%!QD4)_TR)[DR)Y^@`````D$B+7"0(2(ML)!!,BV0D&$R+;"0@2(/$
-M*,-F9F:09F:005=!5D%505154TB#[&A)B?](BX>(````2(E$)&!(BRA(BX68
-M$0``1(LP2(G^2(GOZ`````!!@']2`78%0<9'401)C5\H23E?*`^$4P$``$B)
-MW^@`````2(E$)%A)BT<H2(M4)%A(B5`(2(D"2(E:"$F)5RA(A=(/A#L#``!(
-MBTPD8$B+02`/MDU!#[95.@^V=3E(BUPD6$0/MTLR1`^V0`A(Q\<`````N```
-M``#H`````$0/MVLR36GEL`0``$P#I3@1``!(BYW8$```2(M\)%CH`````$&+
-MC"0D!```08N4)"`$``!(BWPD6`^W=S)%BXPD+`0``$6+A"0H!```2,?'````
-M`+@`````Z`````!)P>4&3`'KBT,TBWLP1(M3+$2+6RA$BV,D1(MK((M3'(E4
-M)$R+2QB)3"10BU,4B50D5$2+2Q!$BT,,BTL(BU,$BS.)1"1`B7PD.$2)5"0P
-M1(E<)"A$B60D($2);"08BUPD3(E<)!"+?"10B7PD"(M$)%2)!"1(Q\<`````
-MN`````#H`````&:#?6@`=3OIZP$``$B+5"1@2(M"(`^V34$/ME4Z#[9U.4&Y
-M____`$0/MD`(2,?'`````+@`````Z`````#I$0(``+L`````3(VEH`\``$R-
-MK?@```!F9I!FD`^WPTC!X`-(`X6P"0``2(LP2(7V#X1V`0``#[=&(&9!.4=`
-M#X5G`0``#[>5LA(``$$YUG10@\(!#[>%MA(``#G"N``````/0]"-0@%(P>`"
-M2`.%F!$``(L`J0``"`!U(&8E_P]F.=AU%T@Y="18=15(B>_H`````.E\`0``
-M9F:01#GR=;`/MT8@9CV%`&9FD`^'^@````^WP("\!6`(``#_#X3I````2(M,
-M)&"`>5@`#X7:````]D$*`0^$T````$B+50`/MT8R9L'H!0^WP(T$A0`#``")
-M@G`!``!(BT4`#[=.,H/A'[H!````2(G72-/GB;AT`0``#[=&,DC!X`-(`X6P
-M"0``2,<```````^W3C*)R&;!Z`4E_P<``(/A'TB)UTC3YTB)^??1(8R%N`D`
-M``^W3C*)R&;!Z`4E_P<``(/A'TC3XO?2(52%;$@Y="18="=(BP9(BU8(2(E0
-M"$B)`DB+A?@```!(B7`(2(D&3(EN"$B)M?@````/MW8R3(GGZ`````!!@&]%
-M`69F9I"#PP%F.5UH#X=C_O__2(M$)&#V0`H!=%%(BTPD6$B+$4B+00A(B4((
-M2(D02(G.3(G_Z`````#K,4B+7"1@2(M#(`^V34$/ME4Z#[9U.4&Y____`$0/
-MMD`(2,?'`````+@`````Z`````!(@\1H6UU!7$%=05Y!7\-F9F:09F9FD$%7
-M059!54%455-(@^PH28GX2(E4)"!,BR\/M_9(P>8#20.UL`D``$B++F:!?3CA
-M`74N#[9%.H/H$3P!=R-,BW]`2,=$)!@`````2(72=6E!QD=1`$C'1"08````
-M`.M9D$F+C3@)``"X8)X!`&:!?2"%`'<<#[=%($$/MH0%8`@``$B-%$!(C120
-M2(G02,'@!4@!P4B)3"080;\`````2(-\)"``=1)(BT0D&,:`Z`````!!OP``
-M``"`?22!=05!@&`,]TB#?"0@``^%`@$``,9%)`#VA98````@#X2"!0``2(M%
-M:$B%P`^$=04``$B)P_:`L0````)T'4B+N*````!(A?]T$4B+=4A(A?9T"(M5
-M-.@`````28N5"!$``$B!PD`(``!(BTPD&`^V07+!X`A(F$@!PHL"B04`````
-MB<+!ZA"(DYL```#!Z!AFB8.0````28N5"!$``$B!PD0(```/MD%RP>`(2)A(
-M`<*+$HD5``````^VPF:)@Y0````/ML9FB8.6````B=#!Z!`/ML!FB8.8````
-MP>H8B).:````28N5"!$``$B!PDP(```/MD%RP>`(2)A(`<*+`HD%``````^V
-MP&:)@Y(```#ID00```^W13)(:<"P!```38NE.!$``$D!Q$F-G"0@!```@'TD
-M@'4$QD4D(4B#?"08``^$F````$B+1"082(M00$B%TG1"#[:"S````(T$@`^V
-M4@(!T$B8#[:(`````$$/ME4Z00^V=3E,BTPD($2+131(Q\<`````N`````#H
-M`````.F#````BWTT2(M,)!A$#[:)@0```$F+0"!$#[9`"$$/MDU!00^V53I!
-M#[9U.4B+1"0@2(E$)`B)/"1(Q\<`````N`````#H`````.L[387_=#9$BTTT
-M28M`($0/MD`(00^V34%!#[95.D$/MG4Y2(M$)"!(B00D2,?'`````+@`````
-MZ`````"+2P2+$P^W=3)$BTL,1(M#"$C'QP````"X`````.@`````0?9$)"(!
-M='],C6583(NU@````$&+5"0$00^V="0!2,?'`````+@`````Z`````"`?5@`
-M#X3R````NP`````/ML-(C01`2,'@`DF+5"0(2`'"20-&$(M*"$B+$@^V\T2+
-M2`A,BP!(Q\<`````N`````#H`````(/#`4$X'"0/AJ@```#KN6:008!\)"<`
-M#XF8````#[=U,HGR9L'J!0^WT@^W]DC'QP````"X`````.@`````08N-P`D`
-M`$&+E;P)``!!B[6X"0``18N%Q`D``$C'QP````"X`````.@`````#[=U,DC'
-MQP````"X`````.@`````28M5``^W13)FP>@%#[?`C02%``,``(F"<`$``$F+
-M50`/MTTR@^$?N`$```!(T^")@G0!``!F@7TXX0%U&`^V13J#Z!$\`7<-3(G_
-MZ`````#I'@(```^V5"0C]L(!#X3N`0``BT4X)?___P`]X0$.``^$VP$``$F+
-ME0@1``!(@<)`"```2(M,)!@/MD%RP>`(2)A(`<)$BR)$B24`````28N5"!$`
-M`$B!PD0(```/MD%RP>`(2)A(`<)$BS)$B34`````28N5"!$``$B!PD@(```/
-MMD%RP>`(2)A(`<*+&HD=`````$F+E0@1``!(@<),"```#[9!<L'@"$B82`'"
-M1(L"1(D%`````(G91(GR1(GF2,?'`````+@`````Z`````#VA98````@#X3J
-M````2(M]:,:'L@```!#&120@1(G@P>@0B(>;````1(G@P>@89HF'D````(G8
-MP>`(00^VU@'09HF'E````(G8L`!,B?$/MM4!T&:)AY8```")VL'J$,'B"$2)
-M\,'H$`^VP`'"9HF7F````$F+E0@1``!(@<),"```2(M,)!@/MD%RP>`(2)A(
-M`<*+,HDU`````$`/MO9FB;>2````#[>/E@````^WEY@````/M_9$#[>'E```
-M`$C'QP````"X`````.@`````28N5"!$``$B!PD`(``!(BTPD&`^V07+!X`A(
-MF$@!PL<"`````.M:9H%]..$!=2(/MD4Z@^@:/`%W%TC'QP````"X`````.@`
-M````QD4D(>LP2(GN3(GOZ`````#K(Y"$TGD>28M%`(N(6`$``(D-`````(7)
-M=`I)BT4`B8A8`0``2(/$*%M=05Q!74%>05_#9F9FD&9F9I!F9F:09F:02(/L
-M"`^V1CA(.7XH=4H\"'1E/"AT83RH=%T\B&9F9I!T53P*=%$\*G1-/*IF9F:0
-M=$4\BG1!2(N'^````$B)<`A(B09(C8?X````2(E&"$B)M_@```#K'TB+EP`!
-M``!(B;<``0``2(V'^````$B)!DB)5@A(B3+H`````$B#Q`C#9F9FD&9F9I!F
-M9F:09F:02(/L".@`````2(/$",-FD%-(@^Q@2(G[2(U,)%U(C50D7DB-="1?
-M#[=_/$B-1"122(E$)#A(C40D5$B)1"0P2(U$)$Q(B40D*$B-1"1.2(E$)"!(
-MC40D6$B)1"082(U$)%I(B40D$$B-1"1;2(E$)`A(C40D5DB)!"1,C4PD7$R-
-M1"10Z``````/ME0D7P^V="1>2(U\)$CH``````^V1"1?2(T40$B-%)!(P>(%
-M2(MS($B-NQ@)``"Y`0```.@`````#[94)%U(C1322,'B!4B+<R!(C;M`"0``
-MN0$```#H``````^V5"1>2&G2R`\``$B+<R!(C;MH"0``N0$```#H``````^W
-M5"182,'B`TB+<R!(C;N0"0``N0$```#H``````^W1"102(T4@$B-%)!(P>(#
-M2(MS($B-NV@*``"Y`0```.@`````#[94)%P/MT0D4$@/K]!(C1122,'B`DB+
-M<R!(C;OX"0``N0$```#H`````$B+<R!(C;L@"@``N0$```"Z``(``.@`````
-M#[9,)%](BW,@2(V[6`L``+H`"```Z``````/ME0D6TC!X@5(BW,@2(V[N`H`
-M`+D!````Z`````!(BW,@2(V[X`H``+D!````N@`!``#H``````^V5"1:2(T4
-MDDC!X@5(BW,@2(V["`L``+D!````Z``````/MU0D5DB-%))(P>(#2(MS($B-
-MNS`+``"Y`0```.@`````#[=4)%A(`=)(BW,@2(V[>`\``+D!````Z``````/
-MME0D7T@!TDB+<R!(C;NP#P``N0$```#H``````^V5"1=2`'22(MS($B-N^@/
-M``"Y`0```.@`````#[94)%Y(`=)(BW,@2(V[(!```+D!````Z``````/ME,^
-M2`'22(MS($B-NU@0``"Y`0```.@`````#[=4)$Y(C1122,'B!$B+<R!(C;N0
-M"@``N0$```#H`````(M4)$A(BW,@2(V[D!```+D!````Z``````/MU0D6$C!
-MX@9(BW,@2(V[N!```$&X`0```+E`````Z`````!(BW,@2(V[Z!```$&X`0``
-M`+D``0``N@`9``#H``````^W5"182&G2L`0``$B+<R!(C;L8$0``0;@!````
-MN8````#H``````^W5"142,'B`DB+<R!(C;M($0``0;@!````N00```#H````
-M``^W5"122,'B`DB+<R!(C;MX$0``0;@!````N00```#H``````^V5"1;P>(+
-M2(MS($B-NZ@1``!!N`$```"Y"````.@`````2(MS($B-N]@1``!!N`$```"Y
-M"````+H```@`Z``````/MU0D5DAITHP!``!(BW,@2('#"!(``$&X`0```+D(
-M````2(G?Z`````"X`````$B#Q&!;PV9FD&:02(/L.$B)7"0(2(EL)!!,B60D
-M&$R);"0@3(ET)"A,B7PD,$F)]TF)_4B+!TB)!"1,C6=(3(GGZ`````!(B<-,
-MC7#(2(L\).@`````2(G%28M%4$F)75!-B68X28E&0$B)&+@!````2(7M='C&
-M13CAQD4Y`<9%.A"`33L!28N'H````$B)16A(BT5P3(EX*$F-AY````!(B450
-MQD4ES$$/MD9;9HE%($F+10!(B44HQT4TD````$R)?4A(QX6@`````````$B-
-M?5B^`````.@`````2(GN2(L\).@`````N`````!(BUPD"$B+;"003(MD)!A,
-MBVPD($R+="0H3(M\)#!(@\0XPV9F9I!F9I!F9I!!5T%6055!5%532(/L&$B)
-M_4C'1"00`````$B+1"00#[:4*.8(``"`^O\/A.H````/MLI(C02)2(T$@4B-
-MA,7``0``2(E$)`@/MO)(8\9(C12`2(T4D("\U<X!````#X2V````0;P`````
-M2(T$B4B-!(%(P>`#3(VT!2`"``!,C2PH2&/&2(T4@$B-%)!,C;S5P`$``$R)
-M]^@`````2(G#28N%*`(``$F)G2@"``!,B3-(B4,(2(D82(M30$B%TG052(NU
-M\`@``+\%````Z`````"`2TP"2(G:O@(```!(BWPD".@`````@+N#`````'0;
-M2(GOZ`````"_`0```.@`````@+N#`````'7E08/$`44X9PX/AWO___](@T0D
-M$`%(@WPD$`0/A>[^__](B>_H`````$B#Q!A;74%<05U!7D%?PV9F9I!F9I!F
-M9I!F9I!!5T%6055!5%532(/L>$B)^\9'40#&1U``QD=/`,:':10```!(C9>X
-M$@``N`````#&!!``2(/``4@]H`$``'7P2(V#^````$B)@_@```!(B8,``0``
-M2(V#"`$``$B)@P@!``!(B8,0`0``3(VC&`$``$R)HQ@!``!,B:,@`0``3(VK
-M*`$``$R)JR@!``!,B:LP`0``2(V#.`$``$B)1"1(2(F#.`$``$B)@T`!``!(
-MC8M(`0``2(E,)%!(B8M(`0``2(F+4`$``$R-LV@!``!,B;-H`0``3(FS<`$`
-M`$B-LW@!``!(B70D0$B)LW@!``!(B;.``0``3(V[6`$``$R)NU@!``!,B;M@
-M`0``2(U,)&Y(C50D<$B-="1Q#[=[/$B-1"1R2(E$)#A(C40D=$B)1"0P2(U$
-M)&1(B40D*$B-1"1J2(E$)"!(C40D=DB)1"082(U$)&Q(B40D$$B-1"1M2(E$
-M)`A(C40D:$B)!"1,C4PD;TR-1"1FZ``````/MD0D<8A#1@^V1"1PB$-'#[9$
-M)&Z(@_$````/MT0D=F:)0V@/MT0D=&:)@[02```/MT0D<H/H`6:)@[82```/
-MMT0D9F:)0U(/MT,\9CV`D70*9CV`E`^%I`D``,9#303&0T,$QD-.0,9#3`#&
-M@^X````)QD-$`$B-NQ@)``#H`````$B)P4B)@S@)```/MD0D<4B-%$!(C120
-M2,'B!4B%TG002(G(Q@``2(/``4B#Z@%U\TB-NT`)``#H`````$B)P4B)@V`)
-M```/MD0D;DB-!,!(B<)(P>(%2(72=!!(B<C&``!(@\`!2(/J`77S2(V[:`D`
-M`.@`````2(G!2(F#B`D```^V1"1P2&G0R`\``$B%TG002(G(Q@``2(/``4B#
-MZ@%U\TB-NY`)``#H`````$B)P4B)@[`)```/MT0D=DB-%,4`````2(72=!!(
-MB<C&``!(@\`!2(/J`77S2(V[(`H``.@`````2(F#0`H``$B-N_@)``#H````
-M`$B)Q4B)@Q@*``!(C;MH"@``Z`````!(B<)(B8.("@``9H-\)&8`=$BY````
-M`$B):F`/MD0D;XA"6$B+@R`!``!(B9,@`0``3(DB2(E""$B)$`^V1"1O2(T$
-M0$B-;(4`2('"J````(/!`68Y3"1F=[U(C;N0"@``Z`````!(B<)(B8.P"@``
-M9H-\)&H`="^Y`````,9"$`!(BX,P`0``2(F3,`$``$R)*DB)0@A(B1!(@\(P
-M@\$!9CE,)&IWUDB-N[@*``#H`````$B)PDB)@]@*``"`?"1M`'0SN0````!(
-MBX-``0``2(F30`$``$B+="1(2(DR2(E""$B)$$B#PB"#P0$/MD0D;68YR'?2
-M2(V[X`H``.@`````2(G"2(F#``L``$B-B``!``!(BX-0`0``2(F34`$``$B+
-M="102(DR2(E""$B)$$B#PB!(.<IUVDB-NP@+``#H`````$B)PDB)@R@+``"`
-M?"1L`'0QN0````!(BX-P`0``2(F3<`$``$R),DB)0@A(B1!(@<*@````@\$!
-M#[9$)&QF.<AWU$B-NS`+``#H`````$B)PDB)@U`+``!F@WPD:`!T*[D`````
-M2(N#8`$``$B)DV`!``!,B3I(B4((2(D02(/"*(/!`68Y3"1H=]J`?"1Q`'1)
-MO0````!,C:-8"P``3(GGZ``````/M]5(B833>`L``$B+DX`!``!(B8.``0``
-M2(M,)$!(B0A(B5`(2(D"@\4!#[9$)'%F.>AWPTB-NW@/``#H`````$B)@Y@/
-M``!(B8.@#P``#[=T)'9FB;.J#P``#[?V2(V[H`\``.@`````2(V[L`\``.@`
-M````2(F#T`\``$B)@]@/```/MG0D<6:)L^(/```/M_9(C;O8#P``Z`````!(
-MC;OH#P``Z`````!(B8,($```2(F#$!````^V="1N9HFS&A````^W]DB-NQ`0
-M``#H`````$B-NR`0``#H`````$B)@T`0``!(B8-($```#[9T)'!FB;-2$```
-M#[?V2(V[2!```.@`````2(V[6!```.@`````2(F#>!```$B)@X`0```/MD,^
-M9HF#BA````^V<SY(C;N`$```Z`````!(C;N0$```Z`````!(B<%(B8.P$```
-M#[9$)'!(C03`2,'@!XG&@<9@5P``=!*)\DB)R,8``$B#P`%(@^H!=?-(BX.P
-M$```B3!(BY.P$```#[9$)'"(0@0/ME0D<$B+N[`0``#H`````$&X`````(![
-M/@`/A*0```"_``````^WQTB-%(!(C1202,'B`TR-A!/``0``2(T$&D&(>`A!
-MQD`)`$B)F,`!``!!QD`.`,:`&`(```#&@.@!````QX!@`@```````$B-C!/P
-M`0``2(F(\`$``$B)B/@!``!(C8P3"`(``$B)B`@"``!(B8@0`@``2(V4$R`"
-M``!(B9`@`@``2(F0*`(``$'&0`H"@\<!#[9#/F8Y^`^'8?___\9#3`#&@^8(
-M``#_QH/G"```_\:#Z`@``/_&@^D(``#_@'PD<0`/A)8```"^``````^WSDB-
-M!$E(C02!2,'@!4B+DS@)``#&1`)+`4B+DS@)``#&1!!*`$B+DS@)``#&A!"`
-M````_TB+DS@)``#&1!!R_TB+DS@)``!FQX00R```````2,>$RV`$````````
-M2(G!2`.+.`D``$B-42!(B5$@2`.#.`D``$B-4"!(B5`H@\8!#[9$)'%F.?`/
-MAV____]FQX/L``````"X`````,:$&&`(``#_2(/``4@]A@```'7L@'PD<``/
-MA+T```"^``````^WQDAIP,@/``!(BY.("0``QD0"6`!(BY.("0``QD0060!(
-MBY.("0``2,=$$!``````2(G!2`.+B`D``$B-41A(B5$82(G!2`.+B`D``$B-
-M41A(B5$@2(G!2`.+B`D``$B-42A(B5$H2(G!2`.+B`D``$B-42A(B5$P2(N3
-MB`D``$R)1!`(2(G!2`.+B`D``$B-44A(B5%(2`.#B`D``$B-4$A(B5!0@\8!
-M#[9$)'!F.?`/ATC____&@^\```"`@'PD;@`/A((```"^``````^WQDB-!,!(
-MP>`%2(N38`D``&;'1`).!`!(BY-@"0``QD000@!(BY-@"0``QD001/](BY-@
-M"0``QD004/](B<%(`XM@"0``2(U1*$B)42A(B<%(`XM@"0``2(U1*$B)43!(
-MBY-@"0``3(F$$(@```"#Q@$/MD0D;F8Y\'>#QH/P````@DB-L^`0``!(C;NX
-M$```Z`````!(B8/8$```2(VS$!$``$B-N^@0``#H`````$B)@P@1``!(C;-`
-M$0``2(V[&!$``.@`````2(F#.!$``$B-LW`1``!(C;M($0``Z`````!(B8-H
-M$0``2(VSH!$``$B-NW@1``#H`````$B)@Y@1``!(C;/0$0``2(V[J!$``.@`
-M````28G$2(F#R!$``$B+J]`1``"`?"1M`'120;T`````2(M\)$CH`````$R)
-M8!!(B6@82(N30`$``$B)@T`!``!(BW0D2$B),$B)4`A(B0))@<0`"```2('%
-M``@``$&#Q0$/MD0D;69$.>AWM$B-LP`2``!(C;O8$0``Z`````!)B<1(B8/X
-M$0``2(NK`!(``$&]`````$B+?"10Z`````!,B6`02(EH&$B+DU`!``!(B8-0
-M`0``2(M,)%!(B0A(B5`(2(D"28'$```!`$B!Q0```0!!@\4!9D&#_0AUN$B-
-MLS`2``!(C;L($@``Z`````!(B8,H$@``3(NC,!(``&:#?"1H`'1(2(G%0;4`
-M3(G_Z`````!(B6@03(E@&$B+DV`!``!(B8-@`0``3(DX2(E0"$B)`DB!Q8P!
-M``!)@<2,`0``08/%`69$.6PD:'>^2(/$>%M=05Q!74%>05_#9F9FD$%50515
-M4TB#[`A)B?U)B?1(BYZ(````#[961TB)_DB)W^@`````2(G%9D&#3"1.$$&`
-M?4,`=%FY`````/9##0%T#>M,#[9##4C3^*@!=0V#P0%!#[9%0V8YR'?H9H/Y
-M`W8S28M%`$@%T`$``$B-%(T`````@>+\_P,`2`'0BP")!0````#!Z!2#\`&#
-MX`'K,;D`````28M%`$@%T`$``$B-%(T`````@>+\_P,`2`'0BP")!0````#!
-MZ!2#\`&#X`&$P'00#[;Q3(GOZ`````#IEP$``$B-0V!(.4-@#X09`0``2(7M
-M#X00`0``#[:%@0```$G'1,18`````$B+50!(BT4(2(E""$B)$$B)ZKX&````
-M2(G?Z`````"`O8,`````=!M,B>_H`````+\!````Z`````"`O8,`````=>5(
-MBT5`2(7`=$A(QT!@`````/9%3`1U"$R)[^@`````2(M50$F+M?`(``"_`0``
-M`.@`````2(M50$F+M?`(``"_!@```.@`````2,=%0`````"`:PX!2(GN3(GO
-MZ`````!)BT4`BY!8`0``B14`````A=)T"DF+10")D%@!``!!QD0D0@!F08-D
-M)$[O08!\)#L`="JZ``````^WPDF+1,182(7`=`J`>$K_#X5^````@\(!00^V
-M1"0[9CG0=]M!@'PD3@!X#[T`````08!\)#L`=1'K2TR)YDR)[^@`````9I#K
-M2@^WQ4F+7,182(7;="'V0TP"=!M(BU-`28NU\`@``+\&````Z`````"`8TS]
-M9I"#Q0%!#[9$)#MF.>AWQ&9!QT0D3@(`08!D)$G]2(/$"%M=05Q!7<-F9I!F
-M9I!F9I!!5T%6055!5%532(/L>$F)_TB)?"102(M'4$B)1"1P2(LH2(N%F!$`
-M`$2+,$B)_DB)[^@`````08"_ZP````%V"$'&A^@````$28U'($C'1"1H````
-M`$DY1R!T*4F-7R!(B=_H`````$B)1"1H28M'($B+5"1H2(E0"$B)`DB)6@A)
-MB5<@28-_0`!T4$&X____`$B#?"1H`'0*2(M,)&A$#[=!,DF+5T`/MH+,````
-MC02`#[92`@'02)@/MH@`````#[95.@^V=3E(Q\<`````N`````#H`````.M,
-MO____P!(@WPD:`!T"4B+="1H#[=^,D4/MH^!````2(M4)'!(BT(@1`^V0`@/
-MMDU!#[95.@^V=3F)/"1(Q\<`````N`````#H`````$B#?"1H``^$S@,``$B+
-M3"1H1`^W:3)-:>6P!```3`.E.!$``$B+G=@0``!(B<_H`````$&+C"0D!```
-M08N4)"`$``!(BT0D:`^W<#)%BXPD+`0``$6+A"0H!```2,?'`````+@`````
-MZ`````!)P>4&3`'KBT,TBWLP1(M3+$2+6RA$BV,D1(MK((M3'(E4)%R+2QB)
-M3"1@BW,4B70D9$2+2Q!$BT,,BTL(BU,$BS.)1"1`B7PD.$2)5"0P1(E<)"A$
-MB60D($2);"08BT0D7(E$)!"+1"1@B40D"(M$)&2)!"1(Q\<`````N`````#H
-M`````$R+9"1H28/$6$B+5"1H3(NJ@````$&+5"0$00^V="0!2,?'`````+@`
-M````Z`````!!@'PD`0!T3KL`````9F9FD&9FD`^VPTB-!$!(P>`"28M4)`A(
-M`<))`T40BTH(2(L2#[;S1(M("$R+`$C'QP````"X`````.@`````@\,!03A<
-M)`%WOF:#?6@`#X0B`@``0;P`````3(VMH`\``$B-C?@```!(B4PD2$$/M\1(
-MP>`#2`.%L`D``$B+&$B%VP^$WP$```^W0R!F03E'.`^%T`$```^WE;(2``!!
-M.=9T;&9F9I"#P@$/MX6V$@``.<*X``````]#T(U"`4C!X`)(`X68$0``BP"I
-M```(`'4X9B7_#V9$.>!U+D@Y7"1H=2Q(BT0D:`^W<#)(Q\<`````N`````#H
-M`````$B)[^@`````Z9\!``!$.?)UF$B+5"1P@'I8``^%20$```^W0R!F/84`
-M#X<[`0``#[?`@+P%8`@``/\/A"H!``!(@WPD4``/A`0!``!!#[9'2*@!#X3W
-M````J`0/A.\```!(BU4`#[=#,F;!Z`4/M\"-!(4``P``B8)P`0``2(M%``^W
-M2S*#X1^Z`0```$B)UDC3YHFP=`$```^W0S)(P>`#2`.%L`D``$C'```````/
-MMTLRB<AFP>@%)?\'``"#X1](B=9(T^9(B?'WT2&,A;@)```/MTLRB<AFP>@%
-M)?\'``"#X1](T^+WTB%4A6Q(.UPD:'1%2(L32(M#"$B)0@A(B1!(@[N`````
-M`'0/2(VS@````$B)[^@`````2(N%^````$B)6`A(B0-(BT0D2$B)0PA(B9WX
-M````#[=S,DR)[^@`````08"O@P````'K&DB+5"1P]D(*`G0/2(G>3(G_Z```
-M``!F9F:008/$`69$.65H#X?W_?__2(-\)%``="M!#[9'2*@!="*H!'0>2(M,
-M)&A(BQ%(BT$(2(E""$B)$$B)SDR)_^@`````2(/$>%M=05Q!74%>05_#D)"0
-MD)"0D)"0D)"0D)"02(M'4$R+"$&X`````$2-%!9##[:$"&`(```\_W1"#[;`
-M2(T40$B-%)!(P>(%2(G020.!.`D``$`XL`X!``!U($@YN"`!``!U%T2(D`T!
-M``!)BX$X"0``B(P"#`$``&:028/``4F!^(````!UI//#D$B+?U@/MH?`````
-M/$]W,0^VP$B-!$!(P>`$`?*(E`?)````#[:'P````$B-!$!(P>`$B(P'R```
-M`("'P`````'SPV9F9I!F9F:09F:09F:00;C_____9H7V=$Q(B?I!N/____^_
-M`````&9F9I!F9I`/M@J-0=`\"7<;08#X_[@`````1`]$P$$/ML"-!(!$C41!
-MT.L&08#X_W4,@\<!2(/"`68Y]W7)00^VP,-F9F:008G12(M'4$R+`+D`````
-MD$(/MH0!8`@``#S_=#,/ML!(C11`2(T4D$C!X@5(B=!)`X`X"0``2#FX(`$`
-M`'410#BP#0$``'4(1(B(#P$``,-(@\$!2('Y@````'6S\\.028G32(M'4$R+
-M"$R+5UA!N`````!##[:$"&`(```\_W1$#[;`2(T40$B-%)!(P>(%20.1.`D`
-M`$@YNB`!``!U)4`XL@T!``!U'(3)=`Q(BX(8`0``28D#ZQE)BP-(B8(8`0``
-MZPU)@\`!28'X@````'6B3(G7N`````!F9I!F9I`/MI?(````@/H!=D2`^A=T
-M/T`XM\D```!U-H3)=!9(F$B-!$!(P>`$28N$`M````!)B0/#2)A(C01`2,'@
-M!$F+$TF)E`+0````PV9FD&9FD(/``4B#QS"#^%!UI//#9I!!5D%505154TB#
-M[!!)B?Y!B?%(B[\H`0``#[9'`L'@"`^V5P-$C00000^WP(/`!#T`"```#X_L
-M````0(3V=$Q!#[:6$`$``+[@____(=8/MD<!@^`/B=&#X1`)\`G(O@@````A
-MUH/@\XG1@^$$"?`)R(/B`H/@_$$/MHX0`0``@^$!"=`)R(A'`>M*#[97`;[@
-M____(=9!#[:&$`$``(/@#XG1@^$0"?`)R+X(````(=:#X/.)T8/A!`GP"<B#
-MX@*#X/P/MD\!@^$!"=`)R$&(AA`!``!(C5<(00^WP$R-9`<$23G4=C](B50D
-M"+L`````00^VZ4R-;"0(9F:09F:0#[;SB>E,B>I,B??H`````$B+1"0(2(/`
-M!$B)1"0(@\,!3#G@<MI(@\006UU!7$%=05[#9F9FD&9FD&9FD&9FD%-(B?M(
-MBTY(#[9!`L'@"`^V40,!T`^WP(U0!`^W1C0YPG\?2(N_*`$``$ACTDB)SN@`
-M````O@````!(B=_H`````%O#9F9FD&9F9I!F9F:005=!5D%505154TB#[`A)
-MB?=!B=1(BU]828G>O0````!,C6X$#[:#R````#P!=D$\%W0]1#BCR0```'4T
-M00^V5P-(8\5(C01`2,'@!$F-O`;8````@/H@N"`````/1]`/MM),B>[H````
-M`&9FD&9FD(/%`4B#PS"#_5!UJ$B#Q`A;74%<05U!7D%?PV9FD&:02(/L2$B)
-M7"082(EL)"!,B60D*$R);"0P3(ET)#A,B7PD0$F)_$&)UXG+3(D$)$"(="0/
-M2(M'4$R+,$R)]^@`````2(G%2(7`#X3V````3(GWZ`````!)B<5(A<!U$DB)
-M[DR)]^@`````Z=8```!FD$B-15A(B40D$$F+?1")VDF+M"0H`0``Z`````#&
-MA9@````*QD4EK$$/MT0D.&:)12!(BQ0D2(E5:$R)=2B)732#C90````228M%
-M$$B)14A,B6UX28V$).P```!(B450QD4P($C'A:``````````QD4X.\9%.0(/
-MMD0D#XA%.D2)^,'H$(A%.TR)^@^VQHA%/$2(?3T/MD4VB$4^#[9%-8A%/XA=
-M0,9%00"^`````$B+?"00Z`````"+531)BW482(M\)!#H`````$B)[DR)]^@`
-M````2(M<)!A(BVPD($R+9"0H3(ML)#!,BW0D.$R+?"1`2(/$2,-F9I!F9I!F
-M9I!(@^Q(2(E<)!A(B6PD($R)9"0H3(EL)#!,B70D.$R)?"1`28G\08G7B4PD
-M"$R)PT"(="0/2(M'4$R+,$R)]^@`````2(G%2(7`#X3J````3(GWZ`````!)
-MB<5(A<!U$4B)[DR)]^@`````Z<H```"02(U%6$B)1"00QH68````"L9%):Q!
-M#[=$)#AFB44@2(E=:$R)=2C'A90````(````3(EM>$F+11!(B45(BU0D"(E5
-M-$F-A"3L````2(E%4,9%,"!(QX6@`````````,9%.#S&13D"#[9$)`^(13I$
-MB?C!Z!"(13M,B?H/ML:(13Q$B'T]#[9%-HA%/@^V136(13\/MD0D"(A%0,9%
-M00"^`````$B+?"00Z`````"+531)BW482(M\)!#H`````$B)[DR)]^@`````
-M2(M<)!A(BVPD($R+9"0H3(ML)#!,BW0D.$R+?"1`2(/$2,-F9F:02(/L.$B)
-M7"0(2(EL)!!,B60D&$R);"0@3(ET)"A,B7PD,$F)_$B+1U!,BSA(BY<H`0``
-M#[9"`L'@"`^V4@,!T`^WP$2-:`1!@?T`"```#X_.````3(G_Z`````!(B<5(
-MA<`/A+H```!,B?_H`````$F)QDB%P'402(GN3(G_Z`````#IF@```$B-75A(
-MBW@026/528NT)"@!``#H`````,9%):Q!#[=$)#AFB44@3(E]*$2);32#C90`
-M```228M&$$B)14A,B75X28V$).P```!(B450QD4P($C'A:``````````QD4X
-M'<9%.1#&13H"#[9%-8A%.T2(;3R^`````$B)W^@`````BU4T28MV&$B)W^@`
-M````2(GN3(G_Z`````!(BUPD"$B+;"003(MD)!A,BVPD($R+="0H3(M\)#!(
-M@\0XPV9F9I!F9F:09F:02(/L*$B)7"082(EL)"!(B?N)U4C'1"00`````(!_
-M2P%T04B-5"000`^V]KD!````Z`````!(BT0D$$B%P'0D@`B`0(3M=`M(BT0D
-M$(!(`R#K"4B+1"00@&`#WTB)W^@`````2(M<)!A(BVPD($B#Q"C#9F9FD&9F
-M9I!F9I!F9I!(@^PX2(E<)`A(B6PD$$R)9"083(EL)"!,B70D*$R)?"0P28G]
-M08GW2(M'4$R+,$R)]^@`````2(G%2(7`#X2I````3(GWZ`````!)B<1(A<!U
-M$$B)[DR)]^@`````Z8D```!(C5U8QD4EK$$/MT4X9HE%($R)=2C'A90````(
-M````3(EE>$F+1"002(E%2,=%-``(``!)C87L````2(E%4,9%,"!(QX6@````
-M`````,9%.!S&13D!1(A].L9%.PC&13P`O@````!(B=_H`````(M5-$F+="08
-M2(G?Z`````!(B>Y,B??H`````$B+7"0(2(ML)!!,BV0D&$R+;"0@3(MT)"A,
-MBWPD,$B#Q#C#D$%7059!54%455-(@^P82(D\)$B+3D@/MD$"P>`(#[91`XT\
-M$`^WQX/`!`^W5C0YT`^/6@$``$R-:0@/M\=,C70!!$R);"0(0;P`````QT0D
-M%`````!-.?4/@]D```!FD`^V1"04B$0D$T$/MD4"P>`(00^V50-$C3P000^W
-M]TB+?"0(2(/'!.@`````B<$\_W5>00^WQTB+7"0(2(U4`P1(B=-).=8/AL\`
-M``!!B<R0#[9"`L'@"`^V4@.-+!`/M_5(C7L$Z``````\_W4(08#\_W5YZW%!
-M.,1$#T?@#[?%2(U4`P1(B=-).=9V8.O!D(G"1"CB#[;2#[9<)!.)WDB+/"3H
-M`````(G:3(GN2(L\).@`````00^WQTB+5"0(3(UL`@1,B6PD"(-$)!0!33GN
-M#X<I____O@(```!(BSPDZ`````#K24&\``````^V5"033(GN2(L\).@`````
-M00^WQTB+7"0(3(UL`P1,B6PD"(-$)!0!Z>7^__\/ME0D$TR)[DB+/"3H````
-M`.NI9I!(@\086UU!7$%=05Y!7\.005=!5D%505154TB#[`A)B?Y(BTY(#[9!
-M`L'@"`^V40,!T`^WP(/`!`^W5C0YT`^/#`$``$B-40@/MG$!QD0D`P"Y````
-M``^V0@(`1"0##[9"`TB-5`($@\$!0#C.<^>`?"0#``^$O@```$B-:@1!OP``
-M``!!O0````#'1"0$``````^V5?U!`=4/MD7\/`%T!#P7=3M$B>LHTT$XW79Q
-M#[9$)`2#P`%$#[;@9F:09I`/MDW\#[;S1(GB3(GWZ`````"#PP%$..MT1NOD
-M9F9FD$F+1EB`N,$````!=#-$B>LHTT$XW78I#[9$)`2#P`%$#[;@#[9-_`^V
-M\T2)XDR)]^@`````@\,!1#CK=>9F9I!!@\<!@T0D!`%(@\4$1#I\)`,/A5K_
-M__])BT98QH#!`````;X'````3(GWZ`````!(@\0(6UU!7$%=05Y!7\.02(/L
-M*$B)'"1(B6PD"$R)9"003(EL)!A,B70D($F)_$B%_P^$Q````$B+1U!,BS!,
-MB??H`````$B)Q4B%P`^$J0```$R)]^@`````28G%2(7`=1!(B>Y,B??H````
-M`.F)````2(U=6,9%):Q!#[=$)#AFB44@3(EU*,>%E`````@```!,B6UX28M%
-M$$B)14C'130`"```28V$).P```!(B450QD4P($C'A:``````````QD4X',9%
-M.0'&13H"QD4[",9%/`"^`````$B)W^@`````BU4T28MU&$B)W^@`````2(GN
-M3(GWZ`````!(BQPD2(ML)`A,BV0D$$R+;"083(MT)"!(@\0HPV9F9I!F9I!(
-M@^P82(D<)$B);"0(3(ED)!!(B?-)B?Q(BVYH#[=.(&:!^84`#X>E````#[?!
-M#[:T!V`(``!`@/[_#X20````9H/Y?W<B0`^VUDB+CS@)``!(C0122(T$@DC!
-MX`5(BT0(4`^V0`CK2&:!^8$`=QU`#[;&2(N7B`D``$AIP,@/``!(BT00"`^V
-M0`CK)$`/ML9(BY=@"0``2(T$P$C!X`5(BX00B`````^V0`AF9I!FD#S_=!P/
-MML!!@+P$Y@@``/]T#D"`_O]T"`^V0R0\!G4P2(-[>`!T#$B-<WA,B>?H````
-M`$B)WDR)Y^@`````QT50_____TB)[_]52.MS9F:0A,!U.?:#E`````AT$TB+
-M?3"+4S1(BW-(Z`````!F9I#'15``````2(M5.$B%TG0%BT4@B0)(B>__54CK
-M$\=%4/____](B>__54AF9I!F9I!(@WMX`'0,2(US>$R)Y^@`````2(G>3(GG
-MZ`````!FD$B+'"1(BVPD"$R+9"002(/$&,-F9F:09F:09F:09F:02(/L*$B)
-M7"0(2(EL)!!,B60D&$R);"0@2(GS28G\1`^V;B0/MT8@9CV%`'<C2(N/.`D`
-M``^WP`^VA`=@"```2(T40$B-%)!(B=!(P>`%ZPQ(BX\X"0``N&">`0!(C2P!
-M183M=2!FQX7(``````"`>S@<=1&`>SH"=0M(B=Y(B>_H`````$B#>W@`=`Q(
-MC7-X3(GGZ`````!(B=Y,B>?H`````$&`_09T/4B-G6`!``!)BWPD*$B)WN@`
-M````QX5@`0``@(0>`$C'A7`!````````2(FM>`$``$F+?"0H2(G>Z`````!(
-MBUPD"$B+;"003(MD)!A,BVPD($B#Q"C#D$%7059!54%455-(@^P(28G_08G6
-M2(M'4$B+*$&\`````$R-;@Q!#[:$+&`(```\_W12#[;`2(T40$B-%)!(B=-(
-MP>,%2(G?2`.].`D``$B!Q]0```"Z"````$R)[N@`````A,!T'DB+A3@)``!$
-MB+0##@$``$B+A3@)``!,B;P#(`$``$F#Q`%)@?R`````=91(@\0(6UU!7$%=
-M05Y!7\-!5T%6055!5%532(/L&$B)?"0(2(M.2`^V00+!X`@/ME$#C3P0#[?'
-M@\`$#[=6-#G0#X_F````2(U9"`^WQTB-3`$$2(E,)!!)B=U(.=D/AKH```!!
-MO@````!F9I!F9I!$B?(/M@N$R0^(A0```(G(@^`//`9U?/9#`\!T!O9#!<!U
-M</;!$'0Y@'L$`&9F9I!T84F-;0A!O`````!F9F:0#[93`TB)[DB+?"0(Z```
-M``!(@\4<08/$`40X8P1V-.O?@'L"`'0L28UM!$&\`````$0/MOI$B?I(B>Y(
-MBWPD".@`````2(/%'$&#Q`%$.&,"=^(/MD,!28U<!0))B=U!@\8!2#M<)!`/
-M@E+___^^`0```$B+?"0(Z`````!(@\086UU!7$%=05Y!7\-F9F:005=!5D%5
-M05154TB#["A(B70D"$B)?"00#[9&)(A$)"</MTX@9H'YA0`/A_@#```/M\$/
-MMK0'8`@``+C_````0(#^_W1Z9H/Y?W<G0`^VUDB+1"002(N(.`D``$B-!%)(
-MC02"2,'@!4B+1`A0#[9`".M-9H'Y@0!W(D`/ML9(BTPD$$B+D8@)``!(:<#(
-M#P``2(M$$`@/MD`(ZR1`#[;&2(M,)!!(BY%@"0``2(T$P$C!X`5(BX00B```
-M``^V0`A(F$B+5"001`^VO`+F"```2XT$OTF-!(=(C83"P`$``$B)1"082(N*
-M.`D``$`/ML9(C11`2(T4D$B)T$C!X`5(C2P!@'PD)P`/A;,"``!FQX7(````
-M``!(BTPD"(!Y.!P/A9L"```/MD$Z/`)T6CP"=Q$\`0^%AP(``&9F9I!F9I#K
-M'CP'="\\"@^%<@(``$B+="0(2(GOZ`````#I8`(``$B+="0(2(GOZ`````!F
-M9I#I2P(``$B+="0(2(GOZ`````#I.0(``$B+="0(2(GOZ`````!(C9U@`0``
-M2(M%4$B+`$B+>"A(B=[H`````,>%8`$``("$'@!(QX5P`0```````$B)K7@!
-M``!(BT502(L`2(MX*$B)WN@`````QD5*_TN-!+])C02'2(M4)!"`O,+.`0``
-M``^$DP$``$&\`````$N-!+])C02'2,'@`TR-M`(@`@``2(T<$$R-J\`!``!,
-MB??H`````$B)Q4B+@R@"``!(B:LH`@``3(EU`$B)10A(B2B`?4K_#X26````
-M@'U)``^%EP```$B)[H"]Z0`````/A%<!```/ME5(2(G0@^`&2(/X!G4G]L(!
-M="(/MI6!````2(MU6$B)Z4B+?"08Z`````#I)0$``&9FD&:02(/X!'4;]L(!
-M9F9FD&9FD'0/2(M\)!#H`````.G_````2(/X!@^%]0```/;"`6:0#X7J````
-M2(M\)!#H`````.G;````QH7I`````&9F9I!!@\0!00^V10Y$..`/AQ____]!
-M.,0/A80```"$P`^$?````$&\`````$N-!+])C02'2,'@`TB+3"003(VL`2`"
-M``!(C1P(3(VSP`$``&9FD$R)[^@`````2(G%2(N#*`(``$B)JR@"``!,B6T`
-M2(E%"$B)*(!]2O]T&P^V14D\(G0$/`UU#[X*````2(GOZ`````#K.T&#Q`%%
-M.&8.=[%+C02_28T$ATB+5"00QH3"R0$``/](BW0D&$B)U^@`````@'PD)P`/
-MA:0```!F9F:02(M,)`A(@WEX`'012(G.2(/&>$B+?"00Z`````!(BW0D"$B+
-M?"00Z`````"`?"0G`'1M#[>%R````(/``6:)A<@```!F@_@*=@YFQX7(````
-M``#IQ?W__[X*````2(GOZ`````#K.4B+1"001`^VN.4)``!+C02_28T$ATB+
-M5"002(V$PL`!``!(B40D&$B+BC@)``"X8)X!`.F?_/__D$B#Q"A;74%<05U!
-M7D%?PY!(A?]T2TB%]G1&2(72=$%(A<ET/&9!@?B%`'<T00^WP("\!V`(``#_
-M=";&0CCAQD(Y`<9".A-F1(E"($B)<BA(B8J@````N`$```##9F9FD+@`````
-MPV9F9I!F9I!F9I!(BT<(BT`$B04`````B<*!R@``#``E___S_T"$]@]%PDB+
-M5PB)`DB+5PB)0@Q(BU<(B4(02(M7"(E"%$B+5PB)0AA(BU<(B4($PY"0D)"0
-MD$R+5"0@3(M<)#")^&:!_R(G=U]F@?\@)P^#E````&:!_T`A#X2)````9H'_
-M0"%FD'<@9H'_("%T>6:!_R(A9I!T<&:!_U`'=6]F9F:09F:0ZV!F@?]$(719
-M9H'_1"%FD')69BT0)V:#^`%W3&9F9I#K0&:!_X(G=#EF@?^")V:0=Q)F@?\D
-M)W0I9H'_@"=FD'4FZQYF@?^`D69F9I!F9I!T$&:!_X"4=`EF@?^`<F:0=0;&
-M!A3&`@+&`00/MA9(BT0D&(@09D''`H``9D''`P``0<8!($B+1"0(9L<```$/
-MMA9(BT0D$(@0#[8&9D$#`F9!`P-(BU0D*&:)`F9!B0!!#[<22(M$)#AFB1!!
-M#[<2@\(+2(M$)$!FB1##9F9FD%53B?,/MW=H9H7V#X0$`0``3(N7L`D``$&[
-M`````+W_____28L"2(7`#X34````#[=((+C_````08GH9H'YA0`/AXX````/
-MM\%$#[:,!V`(``!%B<A!@/G_='5F@_E_=R-!#[;12(N/.`D``$B-!%)(C02"
-M2,'@!4B+1`A01`^V0`CK3&:!^8$`=QY!#[;!2(N7B`D``$AIP,@/``!(BT00
-M"$0/MD`(ZR=!#[;!2(N78`D``$B-!,!(P>`%2(N$$(@```!$#[9`"&9F9I!F
-M9I!!#[;!2(N/.`D``$$XV'4C#[?`2(T40$B-%)!(P>(%#[9$"DBH`70+J`1T
-M![@!````ZQ=!@\,!28/""&9!.?,/A0[___^X`````%M=PV9FD$B+1U!,BQ!-
-MBYK8$```10^W2FBY`````$&X`````.M##[?Q28N"L`D``$B+%/!(A=)T+8M"
-M."7___\`/>$!$`!T'@^W1SAF.T(@=11(B?!(P>`&9D8Y1!@(=`YF9I!FD(/!
-M`69$.<ERMV9$.<ET$T&#P`%F08/X'W<(N0````"0Z^%!#[?`PV9FD&9FD&9F
-MD$B+1U!(A<!T&L8`<$B+1U!`B'`"2(M'4,9`!P!(BT=0B%`,\\-F9F:09F9F
-MD&9FD//#9F9FD&9F9I!F9I!F9I!!B?%,B<J!XO\!``!(BX>P"0``3(L$T$V%
-MP'0K#[:W[@```$$/MD`EB?'3X`^W^$$/M]&X__\``-/@(<(YU[@`````3`]%
-MP$R)P,-F9I!FD+@`````Q@0X`$B#P`%(/2`!``!U\,9'1/_&1U#_2(U'*$B)
-M1RA(B4<PPV9FD&9FD+@`````Q@0X`$B#P`%(/:`!``!U\,:'@````/_&1W+_
-MQH>"````'TB-1R!(B4<@2(E'*,-F9F:09F9FD&9F9I!(BP9(BY<P`0``2(F'
-M,`$``$B!QR@!``!(B3A(B5`(2(D"2,<&`````,-F9I!F9I!(BY<@`0``2(FW
-M(`$``$B-AQ@!``!(B09(B58(2(DR2(-^<`!T"4B#QG#H`````//#9F9FD&9F
-M9I!F9F:09F:02(L&2(N74`$``$B)AU`!``!(@<=(`0``2(DX2(E0"$B)`DC'
-M!@````##9F:09F:02(L&2(N70`$``$B)AT`!``!(@<<X`0``2(DX2(E0"$B)
-M`DC'!@````##9F:09F:02(N'<`$``$B)MW`!``!(@<=H`0``2(D^2(E&"$B)
-M,,-(BP9(BY>``0``2(F'@`$``$B!QW@!``!(B3A(B5`(2(D"2,<&`````,-F
-M9I!F9I!(BP9(BY=@`0``2(F'8`$``$B!QU@!``!(B3A(B5`(2(D"2,<&````
-M`,-F9I!F9I!`@/\7=Q%`#[;'_R3%`````+@T````P[@$````9F9FD,.X/```
-M`,.X%````&9F9I##N$````##N!P```!F9F:0P[@8````P[@H````9F9FD,.X
-M(````,.X3````&9F9I##9F9FD&9F9I!F9F:09F:0#[962$B)T(/@!DB#^`9U
-M$/;"`0^$VP```&9F9I!F9I"`?G+_#X7*````2(L'1(N(&`$``$2)#0````"Y
-M`````+@!````08G`0=/@187!=3.(3G)(BQ=$B<!$"<B)@A@!``!(BP>+@%@!
-M``")!0````!$B<(APG1X2(L'B9!8`0``ZVV#P0&#^2!UM4B+!T2+B!P!``!$
-MB0T`````L0!FD(G*N`$```!!B<!!T^!%A<%U-HU"((A&<DB+%T2)P$0)R(F"
-M'`$``$B+!XN`8`$``(D%`````$2)PB'"=!-(BP>)D&`!``#K"(/!`8/Y('6P
-M@$=$`?/#9F9FD&9FD&9FD(!^4/\/A<4```!(BP=$BX@8`0``1(D-`````+D`
-M````N`$```!!B<!!T^!%A<%U,XA.4$B+%T2)P$0)R(F"&`$``$B+!XN`6`$`
-M`(D%`````$2)PB'"='-(BP>)D%@!``#K:(/!`8/Y('6U2(L'1(N('`$``$2)
-M#0````"Q`&:0N`$```!!B<!!T^!%A<%U,XA.4$B+%T2)P$0)R(F"'`$``$B+
-M!XN`8`$``(D%`````$2)PB'"=!-(BP>)D&`!``#K"(/!`8/Y('6U@$=$`?/#
-M9F9FD&9F9I!F9F:09F:02(MW0$B%]G0YN0````!FD$B+1,Y82(7`=`@XD($`
-M``!T#$B#P0%(@_D%=!;KXF:!?D"%`'<,2(7`9F9FD&9FD'4%N`````#SPV9F
-M9I!F9I!!54%455-(B?U)B<W!Y@@/MM(!UH!_,``/A-4```!(@W]0``^$R@``
-M`(N'E````*@)00^4P+D`````2,?'`````$&)S`^W%,^)\"'09CG"#X60````
-M#[8$S0`````\`W0$/`=U"T0X!,T`````=7:0QD4D($UCY$C'PP````!"#[94
-MXP8/MO!(B>_H`````$B+55!"#[9$XP>(0@U-A>UT-$F+30!(B<I(P>H@2(M%
-M4(E0`TB+15"`"(#VA98````$=!*%TG0.2(M%4(E("$B+15"`('](BU50#[9%
-M,(/H!XA"!^L.2(/!`4B#^1`/A4[___];74%<05W#9F:09F:02(/L"$B-EU@!
-M``"X`````$@YEU@!``!T$$B)U^@`````2,=`(`````!(@\0(PV:02(/L"$B-
-MEW@!``"X`````$@YEW@!``!T"$B)U^@`````2(/$",-F9F:09F:09F:02(/L
-M"$B-EV@!``"X`````$@YEV@!``!T*$B)U^@`````2(G!N@````!F9F:09F:0
-MQ@0*`$B#P@%(@?J@````=>](@\0(PV9F9I!F9I!F9I!(@^P(2(V7.`$``+@`
-M````2#F7.`$``'0(2(G7Z`````!(@\0(PV9F9I!F9I!F9I!(@^P(2(V7*`$`
-M`+@`````2#F7*`$``'0,2(G7Z`````#&0!``2(/$",-F9I!F9I!!5T%6055!
-M5%532(/L"$F)_T&)]<=$)`0`````0;X`````0P^VA#[@"```//\/A!T!```/
-MMM!!C8:`````9CV!`'=]#[?"2&G`R`\``$B)PTD#GX@)``"`>U@`=%.]````
-M`$R-8TA,B>?H`````$B-2/!(BU-02(E#4$R)81!(B5$82(D"BT%()0#__P`]
-M``#_`'43]D%+!'0-2(M!0$B%P'0$1(AH`8/%`4`X:UAWMD2(J\(```!!@\4!
-MZ9`````/M\)(C03`2,'@!4B)QDD#MV`)``"`?CL`=#VY``````^VP4B+5,98
-M2(72=".+0D@E`/__`#T``/\`=13V0DL$=`Y(BT)`2(7`=`5$B&@!D(/!`3A.
-M.W?(1(BN%`$``("^%0$```-U'X-$)`0!BT0D!(/``X/X!G8708/%`<=$)`0`
-M````ZPE!@\4!9F:09I!)@\8!28/^!@^%Q/[__TF+A_`(``!,.?AU#TB-N(@4
-M``!$B>[HA_[__TB#Q`A;74%<05U!7D%?PV9F9I!F9F:02(/L"`^V1@@/MK0'
-MY@@``,:$!^8(``#_#[?V2(''@!```.@`````2(/$",-F9F:02(M6<$B%TG08
-M2(M"&$B)1CA(BT(@2(E&0$B+0BA(B49(\\-F9F:09F:09F:09F:02(M6<$B%
-MTG0<2(M&.$B)0AA(BT9`2(E"($B+1DA(B4(HQD(0`?/#9F:09F:09F:00515
-M4TF)_$B+'V:#>V@`#X3,````O0````!F9I!F9I`/M]5(BX.P"0``2(L\T$B%
-M_P^$G0````^W3R!F@?F%`'=^#[?!#[:$`V`(```\_W1O9H/Y?W<A#[;02(N+
-M.`D``$B-!%)(C02"2,'@!4B+1`A0#[90".M-9H'Y@0!W'`^VP$B+DX@)``!(
-M:<#(#P``2(M$$`@/ME`(ZRH/ML!(BY-@"0``2(T$P$C!X`5(BX00B`````^V
-M4`CK"F9FD&:0NO\```!!#[9$)`@YPG4%Z`````"#Q0%F.6MH#X<_____6UU!
-M7,-F9F:09F:09F:02(/L&$B)7"0(2(EL)!!(B?M(B?4/MD90//]T$P^V\$B+
-M/^@`````QD50_X!K1`%(BUPD"$B+;"002(/$&,-FD$B#[!A(B5PD"$B);"00
-M2(G[2(GU#[9&<CS_=!,/MO!(BS_H`````,9%<O^`:T0!2(M<)`A(BVPD$$B#
-MQ!C#9I!54TB#[`A(B?U(B?-(.7XH#X3;````@'XD``^%IP````^V1C@\%70(
-M/%4/A9<```!(BT-P2(7`#X2*````2(G!@'@0`0^%?0```&:!>!CA`75U2(NU
-M.`D```^W0R"Z8)X!`&8]A0!W%P^WP`^VA`5@"```2(T40$B-%)!(P>(%2(T$
-M%@^V21J`^0=T'8#Y!W<'@/D&=3'K&H#Y#&9FD&:0=""`^0UU(.L09H-@:OUF
-MD.L59H-(:@+K#F:#8&KW9I#K!6:#2&H(2(-[>`!T(X%[-``(``!W#DB-<WA(
-MB>_H`````.L,2(US>$B)[^@`````9H%[..$!#X4G`0``#[=#(&8]A0`/AXL`
-M```/M\`/MH0%8`@``#S_#X1X````2(N-.`D``(![)`!U:P^VP$B-%$!(C120
-M2,'B!4B-!!$/ME,Z@/H'=!V`^@=W!X#Z!G4VZQ^`^@QT*H#Z#69FD&:0=27K
-M%6:#8&K]9F9FD&9FD.L59H-(:@+K#F:#8&KW9I#K!6:#2&H(9H%[..$!9F:0
-M#X6.````@'LZ"P^%A`````^W<R`/MD5&C7C_B?+K&Y"#P@%F@?J%`'<0#[?*
-M2&/!@+P%8`@``/]U"0^WPCGX?-_K36:!^?\`=2)F9I!F9I#K/H/&`6:!_H4`
-M=Q`/M]9(8\*`O`5@"```_W4,#[?&.<=_W[K_````9HE3(,9#)(!(B=Y(B>_H
-M`````.DB`0``QD,D`$@Y:RAT)DB+0W!(A<!T'8!X$`%U"TB)WDB)[^@`````
-M2(US<$B)[^@`````2(.[@`````!T#TB-LX````!(B>_H`````$B+>RA(B=[_
-MDZ`````/MU,X9H'ZX0%U5P^V0SJ#Z!$\`7=,#[=#(&8]A0`/AZ@````/M\`/
-MMH0%8`@``#S_#X25````#[;`2(T$P$C!X`5(B<9(`[5@"0``@'Y%`'5Z@'Y0
-M_W1T2(GOZ`````#K:@^W0R!F/84`=V`/M\`/MHP%8`@``$B+M3@)``"+0S@E
-M____`#WA`1``=#^!^?\```!T-V:!^N$!=0X/MD,Z@^@1/`%V)69FD(G(2(T4
-M0$B-%)!(P>(%2`'6@+Z#`````'4(2(GOZ`````!(@\0(6UW#9F9FD&9FD%53
-M2(/L"$B)_4B)\P^W3B!F@?F%``^'I@````^WP0^VM`=@"```0(#^_P^$D0``
-M`&:#^7]W(D`/MM9(BX\X"0``2(T$4DB-!()(P>`%2(M$"%`/MD`(ZTAF@?F!
-M`'<=0`^VQDB+EX@)``!(:<#(#P``2(M$$`@/MD`(ZR1`#[;&2(N78`D``$B-
-M!,!(P>`%2(N$$(@````/MD`(9F:09I!F/?\`=!L/M\`/MKP%Y@@``$"`__]T
-M"D`/ML9F/?\`=1!(B=Y(B>_H`````.F!````#[93.P^V0SP/MDL]@/D!=`6`
-M^0AU8$B+2VC!X`@/MM(!T"7_`0``2(N5L`D``$@Y#,)U0@^W23*)RF;!Z@6!
-MXO\'``"#X1^X`0```$C3X/?0(425;$B+0V@/MW`R0`^VQTB-/(!(C3RX2(V\
-M_<`!``#H`````$B)WDB)[^@`````2(/$"%M=PV9F9I!F9I!(@^P82(E<)`A(
-MB6PD$$B)^TB-OQ@!``"]`````$@YNQ@!``!T'.@`````2(G%2(G'Z`````!(
-MB=_H`````$B)17!(B>A(BUPD"$B+;"002(/$&,-F9F:09F9FD&9F9I!(@^P8
-M2(D<)$B);"0(3(ED)!!(B?U(BT=03(L@3(GGZ`````!(B<-(A<!T<$R)Y^@`
-M````2(G"2(7`=13&A>D````!2(G>3(GGZ`````#K3,9#.``/MT4X9HE#(,:#
-MF`````],B6,HQT,T`````$C'0T@`````2(M"$$B)0U#&0S`D2(E3>$C'@Z``
-M````````2(G>3(GGZ`````!(BQPD2(ML)`A,BV0D$$B#Q!C#D$B#[!A(B1PD
-M2(EL)`A,B60D$$B)_4&)]$B+1U!(BQA(B=_H`````$B)PDB%P'1$QD`X&\9`
-M.0%$B&`\#[=%.&:)0B#&@I@````/2(E:*,="-`````!(QT)(`````$C'@J``
-M````````2(G62(G?Z`````!(BQPD2(ML)`A,BV0D$$B#Q!C#9F9FD&9FD&9F
-MD$B#[#A(B5PD"$B);"003(ED)!A,B6PD($R)="0H3(E\)#!)B?])B?5,BS=,
-MB??H`````$B)Q4B%P`^$C@```$R)]^@`````28G$2(7`=1%(B>Y,B??H````
-M`.MQ9F9FD$B-75C&13CAQD4Y`<9%.@Y!#[=%.&:)12!F08-E:/=)BP=(B44H
-MQT4T``@``$F+1"002(E%2$R)97A(QX6@`````````+X`````2(G?Z`````"+
-M531)BW0D&$B)W^@`````2(GN3(GWZ`````!(BUPD"$B+;"003(MD)!A,BVPD
-M($R+="0H3(M\)#!(@\0XPTB#["A(B5PD"$B);"003(ED)!A,B6PD($F)](G5
-M2(L?2(G?Z`````!(B<)(A<!T7\9`..'&0#D!0(AH.L9`.P]!#[=$)#AFB4(@
-M2(E:*,="-`````!(QT)(`````$C'@J``````````2(G62(G?Z`````!`@/T!
-M=0R_!0```.@`````ZPJ_4,,``.@`````2(M<)`A(BVPD$$R+9"083(ML)"!(
-M@\0HPV9F9I!F9F:055-(@^P(2(G]2(GS#[=.(&:!^84`#X>G````#[?!#[:T
-M!V`(``!`@/[_#X22````9H/Y?W<B0`^VUDB+CS@)``!(C0122(T$@DC!X`5(
-MBT0(4`^V0`CK2&:!^8$`=QU`#[;&2(N7B`D``$AIP,@/``!(BT00"`^V0`CK
-M)$`/ML9(BY=@"0``2(T$P$C!X`5(BX00B`````^V0`AF9I!FD#S_=!X/ML`/
-MMHP%Y@@``(#Y_W0.0(#^_W0(#[9#)#P&=3Y(@WMX`'0E@7LT``@``'<02(US
-M>$B)[^@`````9I#K#$B-<WA(B>_H`````$B)WDB)[^@`````ZWQF9I!FD$B+
-ME3@)``"$P'0U0`^VQDB--$!(C32P2,'F!4B--#(/ML%(C3R`2(T\N$B-O/W`
-M`0``N@$```#H`````&9F9I!(@WMX`'0E@7LT``@``'<02(US>$B)[^@`````
-MZPYFD$B-<WA(B>_H`````$B)WDB)[^@`````2(/$"%M=PV:02(/L*$B)'"1(
-MB6PD"$R)9"003(EL)!A,B70D($B)^TB)]0^W3B!F@?F%``^''P$```^WP0^V
-MM`=@"```0(#^_P^$"@$``&:#^7]W)$`/MM9(BX\X"0``2(T$4DB-!()(P>`%
-M2(M$"%`/MD`(ZT5FD&:!^8$`=QU`#[;&2(N7B`D``$AIP,@/``!(BT00"`^V
-M0`CK'T`/ML9(BY=@"0``2(T$P$C!X`5(BX00B`````^V0`@\_P^$E0```$0/
-MMN8/ML!$#[:L`^8(``!!@/W_=']F08'\_P!T=X!])`9T<4R+LS@)``"`?3H!
-M=4F_"@```.@`````2(GN2(G?Z`````!!#[?$2(TT0$B--+!(P>8%28TT-D$/
-MML5(C3R`2(T\N$B-O/O``0``N@(```#H`````.L;O_0!``#H`````$B)[DB)
-MW^@`````9F:09F:02(L<)$B+;"0(3(MD)!!,BVPD&$R+="0@2(/$*,-F9I!(
-M@^P82(D<)$B);"0(3(ED)!!)B?Q(BT=02(LH2(GOZ`````!(B<-(A<!U"T'&
-MA"3I`````>M?QD`X%<9`):M!#[=$)#AFB4,@2(EK*$&X`0```+D!````2(G:
-M3(GF2(GOZ`````"$P'462(G>2(GOZ`````!!QH0DZ0````'K%DC'@Z``````
-M````2(G>2(GOZ`````!(BQPD2(ML)`A,BV0D$$B#Q!C#9F9FD&9FD$B#["A(
-MB5PD"$B);"003(ED)!A,B6PD($B)^TB+1U!,BRA,B>_H`````$B)Q4B%P'4.
-MQH/I`````>FV````9I!,B>_H`````$F)Q$B%P'47QH/I`````4B)[DR)[^@`
-M````Z8T```#&13@:QD4Y",9%.@C&13L`QD4\_\9%/0#&126K#[=#.&:)12!,
-MB6THQT4T_P```,>%E`````@```!)BT0D$$B)14A(!?\```!(B450QD4P)$R)
-M97A(QX6@`````````$B-75B^`````$B)W^@`````28MT)!BZ_P```$B)W^@`
-M````2(GN3(GOZ`````!(BUPD"$B+;"003(MD)!A,BVPD($B#Q"C#9F:02(/L
-M.$B)7"0(2(EL)!!,B60D&$R);"0@3(ET)"A,B7PD,$F)_$&)]DB+1U!,BRA,
-MB>_H`````$B)PTB%P'410<:$).D````!Z;H```!F9I!,B>_H`````$B)Q4B%
-MP'4@0<:$).D````!2(G>3(GOZ`````#IC@```&9F9I!F9I!,C7M8QD,X$D6$
-M]G03QD,Y`<9#.H#&0SQ`ZPEF9I!FD,9#/"3&0R6K00^W1"0X9HE#($R):RC'
-M0S1@````QX.4````"````$B+11!(B4-(2(EK>$C'@Z``````````O@````!,
-MB?_H`````$B+=1BZ8````$R)_^@`````2(G>3(GOZ`````!(BUPD"$B+;"00
-M3(MD)!A,BVPD($R+="0H3(M\)#!(@\0XPV9FD&9FD$B#["A(B1PD2(EL)`A,
-MB60D$$R);"083(ET)"!)B?Q(BT=03(LP3(GWZ`````!(B<5(A<!U#D'&A"3I
-M`````>FR````3(GWZ`````!)B<5(A<!U'$'&A"3I`````4B)[DR)]^@`````
-MZ8D```!F9I!(C5U8QD4XGL9%.1#&144@QD4EJT$/MT0D.&:)12!,B74HQT4T
-M(````,>%E`````@```!)BT402(E%2$R);7A(@\`@2(E%4,9%,"1(QX6@````
-M`````,:%F`````^^`````$B)W^@`````28MU&+H@````2(G?Z`````!(B>Y,
-MB??H`````$B+'"1(BVPD"$R+9"003(ML)!A,BW0D($B#Q"C#9F9FD&9FD&9F
-MD&9FD$B#["A(B1PD2(EL)`A,B60D$$R);"083(ET)"!)B?Q(BT=03(LP3(GW
-MZ`````!(B<5(A<!U#D'&A"3I`````>FC````3(GWZ`````!)B<5(A<!U'$'&
-MA"3I`````4B)[DR)]^@`````ZWUF9I!F9I!(C5U8QD4X)<9%):M!#[=$)#AF
-MB44@3(EU*,=%-`@```#'A90````(````28M%$$B)14A(@\`(2(E%4,9%,"1,
-MB6UX2,>%H`````````"^`````$B)W^@`````28MU&+H(````2(G?Z`````!(
-MB>Y,B??H`````$B+'"1(BVPD"$R+9"003(ML)!A,BW0D($B#Q"C#9F9FD&9F
-M9I!F9F:02(/L.$B)7"0(2(EL)!!,B60D&$R);"0@3(ET)"A,B7PD,$F)_TF)
-M](E4)`1(BR],B[4X"0``#[=&($0/MJP%8`@``$B)[^@`````2(G#00^W="0R
-MB?!FP>@%#[?`BT2%;(GQ@^$?2-/XJ`$/A<(```!(A=L/A+D```!!#[;%2(T4
-M0$B-%)!(P>(%28T4%D$/MD0D)0^VC>X```#3X`GPQD,XX<9#.0'&0SH/B$,[
-M9L'H"(A#/`^V1"0$B$,]2(N"W````$B)0SY,B6-HQD,EJ@^W0CAFB4,@28L'
-M2(E#*,=#-`````!(QT-(`````$C'@Z``````````2(U[6+X`````Z`````!(
-MB=Y(B>_H`````$$/MTPD,HG*9L'J!8'B_P<``(/A'[@!````2-/@"425;$B+
-M7"0(2(ML)!!,BV0D&$R+;"0@3(MT)"A,BWPD,$B#Q#C#9F9FD&9FD&9FD$%7
-M059!54%455-(@^P(28G^28G508GW2(L?9H-[:``/A`X"``"]`````$&\____
-M_P^WU4B+@[`)``!(BS302(7V#X3?`0``1(M&.$&!X/___P!!@?CA`1``#X6A
-M````387M#X6^`0``#[=.(&:!^84`=WD/M\$/MH0#8`@``#S_=&IF@_E_=R$/
-MMM!(BXLX"0``2(T$4DB-!()(P>`%2(M$"%`/MD@(ZT9F@?F!`'<<#[;`2(N3
-MB`D``$AIP,@/``!(BT00"`^V2`CK(P^VP$B+DV`)``!(C03`2,'@!4B+A!"(
-M````#[9(".L#1(GAN@````#IOP```&9F9I!F9I`/MTX@9H'YA0`/AZ$````/
-MM\$/MKP#8`@``$"`__\/A(P```!F@_E_=R)`#[;72(N+.`D``$B-!%)(C02"
-M2,'@!4B+1`A0#[9(".M$9H'Y@0!W'4`/ML=(BY.("0``2&G`R`\``$B+1!`(
-M#[9(".L@0`^VQTB+DV`)``!(C03`2,'@!4B+A!"(````#[9(")!`#[;'2(T4
-M0$B-%)!(P>(%2`.3.`D``.L/9F9FD&9FD$2)X;H`````03A."'5H387M=`M!
-M#[=%.&8[1B!U6$&`_P9T0T&!^.$!$`!T.@^V2DA(B<B#X`9(@_@&=2KVP0%U
-M)8"ZZ`````!U'$&!^.$!#P!T(D2(?B2Z`0```$R)]^@`````ZP]$B'XD#[?U
-M3(GWZ`````"#Q0%F.6MH#X?]_?__08#_@0^$5P$``$B+@_@```!(C:OX````
-M2#G%#X1``0``N@````!F9F:09F:0@\(!2(L`2#G%=?5FA=(/A"`!``!$C6+_
-M2(GOZ`````!(B<9-A>UT*$$/MT4X9CM&('0=2(N#``$``$B)LP`!``!(B2Y(
-MB48(2(DPZ<@````/MTX@9H'YA0!W>0^WP0^VA`-@"```//]T:F:#^7]W(0^V
-MT$B+BS@)``!(C0122(T$@DC!X`5(BT0(4`^V0`CK2&:!^8$`=QP/ML!(BY.(
-M"0``2&G`R`\``$B+1!`(#[9`".LE#[;`2(N38`D``$B-!,!(P>`%2(N$$(@`
-M```/MD`(ZP6X_____T$Z1@AU(8M&."7___\`/>$!#P!T$D2(?B1(B=_H````
-M`.L<9F9FD$B+@P`!``!(B;,``0``2(DN2(E&"$B),$&-1"3_9D6%Y'012#NK
-M^````'0(08G$Z>3^__](@\0(6UU!7$%=05Y!7\-F9F:09F:09F:09F:02(/L
-M.$B)7"0(2(EL)!!,B60D&$R);"0@3(ET)"A,B7PD,$F)_$F)]DF)S4&)UTB+
-M+TB)[^@`````2(G#2(7`=0]!QH7I`````>F+````9I!(B>_H`````$B)PDB%
-MP'452(G>2(GOZ`````!!QH7I`````>MDQD,XX<9#.0'&0SH01(A[)4$/MD9;
-M9HE#($F+!"1(B4,HQT,TD````$B-0A!(B4-(2(E3>,9``1+&0A!`1(AX"4C'
-M@Z``````````2(U[6+X`````Z`````!(B=Y(B>_H`````$B+7"0(2(ML)!!,
-MBV0D&$R+;"0@3(MT)"A,BWPD,$B#Q#C#9F9FD$B#[#A(B5PD"$B);"003(ED
-M)!A,B6PD($R)="0H3(E\)#!)B?Q)B?5!B=9!B<](BR](B>_H`````$B)PTB%
-MP`^$@@```$B)[^@`````2(G"2(7`='+&0SCAQD,Y`<9#.A!$B',E00^V15MF
-MB4,@28L$)$B)0RC'0S20````2(U"$$B)0TA(B5-XQD`!D<9"$$!$B'`)1(AX
-M"DC'@Z``````````2(U[6+X`````Z`````!(B=Y(B>_H`````+^@A@$`Z```
-M``!(BUPD"$B+;"003(MD)!A,BVPD($R+="0H3(M\)#!(@\0XPV9FD&9FD$B#
-M["A(B1PD2(EL)`A,B60D$$R);"083(ET)"!)B?Q)B?5!B=9(BR](B>_H````
-M`$B)PTB%P'1T2(GOZ`````!(B<)(A<!T9,9#..'&0SD!QD,Z$,9#);M!#[9%
-M6V:)0R!)BP0D2(E#*,=#-)````!(C4(02(E#2$B)4WC&0`$0QD(00$2(<`E(
-MQX.@`````````$B->UB^`````.@`````2(G>2(GOZ`````!(BQPD2(ML)`A,
-MBV0D$$R+;"083(MT)"!(@\0HPV9F9I!F9I!(@^PH2(E<)`A(B6PD$$R)9"08
-M3(EL)"!)B?Q)B?5(BR](B>_H`````$B)PTB%P'1P2(GOZ`````!(B<)(A<!T
-M8,9#..'&0SD!QD,Z$,9#);M!#[9%6V:)0R!)BP0D2(E#*,=#-)````!(C4(0
-M2(E#2$B)4WC&0`$`QD(00$C'@Z``````````2(U[6+X`````Z`````!(B=Y(
-MB>_H`````$B+7"0(2(ML)!!,BV0D&$R+;"0@2(/$*,-F9I!F9I!54TB#[`A(
-MB?U(C9^`$```2(G?Z`````"$P`^%X````$B)W^@`````B<&X`````(G&@+PH
-MY@@``/]U"CA%3',2B$5,ZPV#Q@%(@\`!2(/X!'7=0(#^!`^$I````$`/ML:(
-MC`7F"```#[?Y2(T$OTB-!(=(C93%P`$``+@`````D,8$$`!(@\`!2#VH````
-M=?`/M\%(C12`2(T4D$C!X@-(C8P5\`$``$B-!"I(B8CP`0``2(F(^`$``$B-
-MC!4(`@``2(F("`(``$B)B!`"``!(C905(`(``$B)D"`"``!(B9`H`@``0(BP
-MR`$``$B-!+](C02'2(V$Q<`!``#K!V:0N`````!(@\0(6UW#9F9FD$B#[!A(
-MB1PD2(EL)`A,B60D$$B)_4B-G]@/``!(B=_H`````(3`#X4Y`0``2(G?Z```
-M``")PK@`````9F:09I")PX"\*&`(``#_=14/ML!F.87L````<QAFB87L````
-MZP^#PP%(@\`!2#V`````=="`^X`/A.P````/ML.(E`5@"```#[?"2(T40$B-
-M%)!)B=1)P>0%3(GG2`.].`D``.@`````2(N5.`D```^VPV9!B404.$B+A3@)
-M``!!QD0$2@!(BX4X"0``0<9$!&W_2(N%.`D``$'&1`1L_TB+A3@)``!!QD0$
-M;O](BX4X"0``0<9$!'#_2(N%.`D``$'&1`1O_TB+A3@)``!!QD0$<?](BX4X
-M"0``0<:$!.H`````2(N%.`D``$'&A`0/`0``_TB)[^@`````2(N5.`D``$F)
-MA!0H`0``@'U1`74-2(N%.`D``$&`3`1,`4R)X$@#A3@)``#K!;@`````2(L<
-M)$B+;"0(3(MD)!!(@\08PV9FD%-(B?OH1^'__TB+N_`(``#H`````%O#9F:0
-M9F:09F:02(/L&$B)'"1(B6PD"$R)9"002(G]2(V?$!```$B)W^@`````A,`/
-MA>8```!(B=_H`````(G"2(GHNX+___]FD("XX@@``/]U%SB=\````',AB)WP
-M````ZQEF9F:09F:0@\,!2(/``8#[A@^$H@```.O.@/N&#X27````#[;#B)0%
-M8`@```^WPDB-!,!)B<1)P>0%3(GG2`.]8`D``.@`````2(N58`D```^VPV9!
-MB4040(!]40%U#TB+A6`)``!F0<=$!$S__TB+A6`)``!!QD0$0@!(BX5@"0``
-M9D''1`1.``!(BX5@"0``9D''A`0``0````!(B[WP"```O@````#H`````$R)
-MX$@#A6`)``#K!;@`````2(L<)$B+;"0(3(MD)!!(@\08PV9FD&9FD%532(/L
-M"$B)_0^W1D`/MIP'8`@``,:$!V`(``#_#[?S2(V_$!```.@`````#[?;2(T<
-MVTC!XP5(B=Y(`[5@"0``@'Y0_W0(2(GOZ`````!(B[WP"```O@````#H````
-M`$B#Q`A;7<-F9I!F9I!F9I!32(G[#[9&6P^VM`=@"```QH0'8`@``/\/M_9(
-MC;]($```Z`````!(B[OP"```O@````#H`````%O#9F:09F:04TB)\X!^1/]T
-M%$B-MI````!(BW\HZ`````#&0T3_6\-32(GS@+Z`````_W072(VV,`$``$B+
-M?RCH`````,:#@````/];PV9F9I!F9I!F9I!(@^PH2(E<)`A(B6PD$$R)9"08
-M3(EL)"!(B?M)B?0/MT8X1`^VK`=@"```00^WQ4B-%$!(C1202(G52,'E!4B)
-M[D@#MS@)``!(@<8H`0``Z`````!!#[=4)#A(BX338`0``$B%P'092(.X@```
-M``!U#TC'A--@!````````&9FD$$/MT0D.,:$`V`(``#_00^W]4B-N]@/``#H
-M`````$B)[D@#LS@)``"`?G+_=`A(B=_H`````$R)YDB)W^@`````2(N#.`D`
-M`,9$!4H`2(N#.`D``,9$!4L!2(M<)`A(BVPD$$R+9"083(ML)"!(@\0HPV9F
-M9I!F9F:09F:09F:02(/L*$B)7"0(2(EL)!!,B60D&$R);"0@28G]2(GS9H%^
-M..$!#X7.````#[9&.H/H$3P!#X>_````#[=&(&8]A0`/AXH!```/M\`/MH0'
-M8`@``$B+EV`)```\_P^$<`$```^VP$B-!,!(P>`%2(TL`H!M10%,C64H3(GG
-MZ`````!(B<)(.=AU2DB)[DR)[^@`````3#ME*`^$-`$``,>%D``````2>@!(
-MQX6@`````````$B)K:@```!(C;60````28M]*.@`````QD5$`.G_````2(M%
-M*$B)4`A(B0),B6((2(E5*$B+$TB+0PA(B4((2(D0Z=D````/MT,@9CV%``^'
-MRP````^WP$$/MI0%8`@``$F+C3@)``"+0S@E____`#WA`1``#X2E````@?K_
-M````#X29````B=!(C11`2(T4D$C!X@5(C2P1@*V#`````4R-92!,B>?H````
-M`$B)PD@YV'5+2(GN3(GOZ`````!,.V4@=%O'A3`!````$GH`2,>%0`$`````
-M``!(B:U(`0``2(VU,`$``$F+?2CH`````,:%@`````#K)F9FD&:02(M%($B)
-M4`A(B0),B6((2(E5($B+$TB+0PA(B4((2(D02(M<)`A(BVPD$$R+9"083(ML
-M)"!(@\0HPV9FD&9FD%532(/L"$B)^TB)]0^W?C*)^F;!Z@4/M_>)\8/A'[@!
-M````2-/@B<'WT8'B_P<``"%,DVQF@?__#W1$#[?'2,'@`T@#@[`)``!(@S@`
-M=#!(QP``````(8R3N`D``$B-NZ`/``#H`````$B)[DB)W^@`````2(GN2(G?
-MZ`````!(@\0(6UW#9F9FD&9FD&9FD%532(/L"$B)]6:!?CCA`0^%K`````^V
-M1CJ#Z!$\`0^'G0````^W1B"Z_P```&8]A0!W"P^WP`^VE`=@"```B=!(C03`
-M2,'@!4B)PT@#GV`)``"`>T3_=4D/MI68````C002A-*Z"`````]$P@^VP&G`
-M0$(/`(F#D````$C'@Z``````````2(F;J````$B-LY````!(BW\HZ`````#&
-M0T0`2(M3,$B):S!(C4,H2(E%`$B)50A(B2J`0T4!Z;T````/MT4@NO\```!F
-M/84`=PL/M\`/MI0'8`@``$B+CS@)``"+13@E____`#WA`1``#X2)````B=!(
-MC11`2(T4D$C!X@5(C1P1@+N`````_W50#[:5F````(T$$H32N@@````/1,(/
-MML!IP$!"#P")@S`!``!(QX-``0```````$B)FT@!``!(C;,P`0``2(M_*.@`
-M````QH.``````&9F9I!(BU,H2(EK*$B-0R!(B44`2(E5"$B)*H"#@P````%(
-M@\0(6UW#9F9FD&9F9I!F9I!!5T%6055!5%532(/L*$F)_DB)="0(#[=.(&:!
-M^84`#X<%`P``#[?!#[:T!V`(``")\$"`_O]T:V:#^7]W(D`/MM9(BX\X"0``
-M2(T$4DB-!()(P>`%2(M$"%`/MD`(ZT-F@?F!`'<=0`^VQDB+EX@)``!(:<#(
-M#P``2(M$$`@/MD`(ZQ]`#[;&2(N78`D``$B-!,!(P>`%2(N$$(@````/MD`(
-M#[;`10^VA`;F"```2XT$@$F-!(!)C83&P`$``$B)1"0028N6B`D``$`/ML9(
-M:<#(#P``3(T\`DB+1"0(2(M02`^V0@$\$G0I/)$/A1("``!+C02`28T$@+D`
-M````08"\QLX!````#X3*`0``Z5L!``!+C02`28T$@$F-!,9(BXC``0``2(E,
-M)"`/MDH)B$PD'@^V4AJ(5"0?NP````"`N,X!````='!!O`````!+C02`28T$
-M@$C!X`--C:P&(`(``$J-+#!,C;7``0``D$R)[^@`````2(G#2(N%*`(``$B)
-MG2@"``!,B2M(B4,(2(D83#E[6'47#[:#@0```$B+5"0(.D(E=!!F9I!F9I!!
-M@\0!13AF#G>V2(M,)`A(BW%X2(7V=`I(BWPD(.@`````2(MT)`A(BWPD(.@`
-M````#[:#R@```(U0`8B3R@```#P#=RN`?"0?`'4D2(M$)`@/ME`E2(MS6$&X
-M`````+D"````2(M\)!#H`````.LSC4(!B(/*````@/H"=B6`?"0?`'4>QD-+
-M`L9#2O^`8TS^2(G>2(M\)"#H`````.D%`0``#[9,)!\/ME0D'DR)_DB+?"00
-MZ`````#IZ0```+T`````2XT$@$F-!(!(P>`#38VD!B`"``!*C1PP3(VKP`$`
-M`$R)Y^@`````2(G!2(N#*`(``$B)BR@"``!,B2%(B4$(2(D(3#EY6'44#[:!
-M@0```$B+5"0(.D(E=`QF9I"#Q0%!.&T.=[H/ME%(2(G0@^`&2(/X!G4<]L(!
-M=!=(BT0D"`^V4"5(BW%82(M\)!#H`````$B+5"0(2(MR>$B%]G0(3(GWZ```
-M``!(BW0D"$R)]^@`````ZRY$#[:'Y0D``$N-!(!)C02`2(V$Q\`!``!(B40D
-M$$B+EX@)``"X.+@/`.E^_?__2(/$*%M=05Q!74%>05_#9F:09F:09F:0055!
-M5%532(/L"$F)_4F)]$B)T\9"2P'&0DH`O@8```!,B>?H`````$B#>U@`=!=(
-MBU,02(M#&$B)0@A(B1!(BT-8@&A8`8"[@P````!T')!,B>_H`````+\!````
-MZ`````"`NX,`````=>5(B[L@`0``2(7_=!$/MK,-`0``N@$```#H`````$B+
-M>UA(A?]T$0^VLX$```"Z`0```.@`````2(MK0$B%[0^$B@```$B#O8``````
-M=7!(@[V(`````'5F]D-,!'493(GOZ`````!(BW-`N@$```!,B>_H`````$B+
-M0T`/ME`"#[9P`4C'QP````"X`````.@`````2(M30$F+M?`(``"_`0```.@`
-M````2(M30$F+M?`(``"_!@```.@`````2,=#0`````!(QT5@`````$B+4V!(
-MA=)T$`^V@X$```!(QT3"6`````!(BQ-(BT,(2(E""$B)$$&`;"0.`4B)WDR)
-M[^@`````08!\)`G_=%U!@'PD#@!T1+L`````28UL)&!F9I!FD$B)[^@`````
-M28M4)&A)B40D:$B)*$B)4`A(B0*`>$K_=0R#PP%!.%PD#G8)Z])!.%PD#G<1
-M0<9$)`G_3(GF3(GOZ`````!(@\0(6UU!7$%=PV9F9I!F9F:09F9FD&9FD$%7
-M059!54%455-(@^P(28G_28GV2(G5QD)+`<9"2@"^!@```$R)]^@`````2(-]
-M6`!T%TB+51!(BT482(E""$B)$$B+15B`:%@!@+V#`````'0;3(G_Z`````"_
-M`0```.@`````@+V#`````'7E2(N](`$``$B%_W01#[:U#0$``+H!````Z```
-M``!(BWU82(7_=!$/MK6!````N@$```#H`````$B+74!(A=L/A`0!``#V14P$
-M=1E,B?_H`````$B+=4"Z`0```$R)_^@`````2(M50`^V@LP```"-!(`/ME("
-M`=!(F`^VB`````!!#[97.D$/MG<Y1`^VA8,```!(Q\<`````N`````#H````
-M`$B+54!)B[?P"```OP$```#H`````$B+BX````!(A<D/A#X!```/MT4X2<>$
-MQV`$````````2,>#@`````````!(B[N0````NO____](B=[_T>D-`0``#[=%
-M.$G'A,=@!````````$C'@X@`````````2(N[D````/_2]D5,`G052(M50$F+
-MM_`(``"_!@```.@`````2,=%0`````!(QT-@`````$B+56!(A=)T$`^VA8$`
-M``!(QT3"6`````!(BU4`2(M%"$B)0@A(B1!!#[96#H/J`4&(5@Y(BT5@2(7`
-M=`=F@WA.`G5@A-)T7$&\`````$V-;F!,B>_H`````$B)PTF+1FA)B5YH3(DK
-M2(E#"$B)&$B%VW0F]D-,`G0@2(M30$F+M_`(``"_!@```.@`````@&-,_69F
-M9I!F9I!!@\0!13AF#G>N2(GN3(G_Z`````!(@\0(6UU!7$%=05Y!7\-(BY.(
-M````2(72#X7C_O__Z0+___]F9F:09F:02(/L*$B)7"0(2(EL)!!,B60D&$R)
-M;"0@2(G[2(M'4$R+*$R)[^@`````2(G%2(7`#X35````3(GOZ`````!)B<1(
-MA<!U&L:#Z0````%(B>Y,B>_H`````.FN````9F:0QD4XH$B-53FX`````&9F
-MD,8$$`!(@\`!2(/X!77RQD4^`,9%/P#&14``QD5!B,9%0@#&14,`QD4EJP^W
-M0SAFB44@3(EM*,>%E`````@```#'132(````28M$)!!(B45(2`6(````2(E%
-M4,9%,"1,B65X2,>%H`````````!(C5U8O@````!(B=_H`````$F+="08NH@`
-M``!(B=_H`````$B)[DR)[^@`````2(M<)`A(BVPD$$R+9"083(ML)"!(@\0H
-MPV9F9I!F9F:09F9FD%532(/L"$B)_4B-GT@0``!(B=_H`````(3`#X4(`0``
-M2(G?Z`````")PKF`____@+W@"```_W02@+WA"```_P^%XP```+F!____.(WO
-M````<P:(C>\```"`^8(/A,<````/ML&(E`5@"```#[?"2&G8R`\``$B)VD@#
-ME8@)``"X`````,8$$`!(@\`!2#W(#P``=?!(B=I(`Y6("0``2(U"&$B)0AA(
-MB=I(`Y6("0``2(U"&$B)0B!(B=I(`Y6("0``2(U"*$B)0BA(B=I(`Y6("0``
-M2(U"*$B)0C!(B=I(`Y6("0``2(U"2$B)0DA(B=I(`Y6("0``2(U"2$B)0E!(
-MBX6("0``B$P#6TB+O?`(``"^`````.@`````2(G82`.%B`D``.L%N`````!(
-M@\0(6UW#9F9FD&9F9I!F9F:005132(/L"$F)]$B+G]@0``!(@<>@#P``Z```
-M``")P0^WP$C!X`9(`=A)B00DN@````#&!`(`2(/"`4B#^D!U\@^WP4B#Q`A;
-M05S#9F:09I!(@^P(2(V72`$``+@`````2#F72`$``'0(2(G7Z`````!(@\0(
-MPY"0D)"0D)"0D)!`#[;V2(TT]DC!Y@>!QF!7``")-\-F9F:09F9FD&9FD`^V
-MT@^W1%9X@\`!9HE$5G@/ME8"`=`/M\##9F:09F:0N`$```"`O[M"```!=!.#
-MP`%(@<>P````@_@@=>AFN/__\\-F9F:09F:09F:09F:02(GYN`$```!`.+&X
-M0@``=1\XD;E"``!U%XG`2(T4@$B-%%!(P>($QH07"T(```'#@\`!2('!L```
-M`(/X('7)\\-F9F:09F9FD&9F9I!F9I#&`?Y$#[97!$6$TG1.28GX0;D`````
-M0;L`````N`````!).;#860``=1Y!.--U%4B82(T$P$C!X`</MH0'Q%<``(@!
-MPT&#PP%!@\$!@\`!28'`@`0``$4XT77&\\-F9I!)B?J`^@%T&$0/MD<$OP``
-M``!%A,`/A'`!``#I00$``$&[`````$V%P`^$'`$```^V5P1!NP````"$TG0T
-M2(GX0;L`````0;D`````9F9FD$@YL-A9``!U"4$XR70308/!`4&#PP%(!8`$
-M``!!.--UWT$/MOM(8\](C0S)2,'A!TF-E`I@5P``2(L"28D`2(M""$F)0`A(
-MBT(028E`$$B+0AA)B4`82(M"($F)0"!(BT(H28E`*$B+0C!)B4`P2(M".$F)
-M0#A(BT)`28E`0$B+0DA)B4!(2(M"4$F)0%!(BT)828E`6(M"8$&)0&!!@+P*
-M8%<```!T4[X`````2&/'2(T$P$B-/,4`````3HT,$4`/ML9(B<)(P>($28U,
-M$&!(C00'2,'@!$F-E`+@60``2(L"2(E!!$B+0@A(B4$,@\8!03BQ8%<``'?%
-M00^VPTB-!,!(P>`'00^VA`)@5P``PTR)TKD`````OP````!FD$@YLMA9```/
-ME,`!QX/!`4B!PH`$``!$.,%UY4`/ML?#055!5%532(GS28G538G,08G)1(G%
-M28GXO@````!F9I")\4@Y7R`/A84```!(8\9(:<!0$```38U4`"!!NP````!$
-MB=I!#[9"+(3`=`0\\'5/2&/22&/)2(G02,'@!4AIR5`0``!(`<A,`<!(B5@P
-M3(EH.$C!X@5(C50*($J-!`)(C4@@9HEI`D2(2"!)BP0D28E$$"3&00S_ZQ9F
-M9I!FD$&#PP%)@\(@08'[@@```'60@\8!2(''4!```(/^!`^%7/___UM=05Q!
-M7<-F9I!FD$%505154TB#[`A)B?5(B?V`?P0`=$9!O`````!F9F:000^VW$AC
-MPTB-!,!(P>`'@+P%Q%<``/UT&4B-O`6\5P``N@@```!,B>[H`````(3`=0]!
-M@\0!1#AE!'?$N_\```")V$B#Q`A;74%<05W#9I!32(G[Z`````"Z"0```#S_
-M=!,/ML!(C03`2,'@!P^VE`-F5P``B=!;PV9F9I!F9I!(@^P(28GR28G11(G"
-M2(G^3(V'8$$``+@`````9F9FD$+&!```2(/``4@]D````'7OQH9A00``$\:&
-M8$$``$`/ML:(AF9!``"(EF=!``"(CFE!``!(QX8`0@```````$B)OOA!``!)
-MBT%<2(F&\$$``$B!QF!!``!,B=?H`````$B#Q`C#9F9FD&9F9I!F9I!!54%4
-M55-(@^P(28GU28G43(G-08G)1(G#2(GX28GZN@$```!!B=-!B="`N+M"```!
-M#X7N````2&/22(T$DDB-!$)(P>`$3`'02(V0`$(``,9""P!,B9#X00``#[9*
-M"DACP4B-%(!(C1102,'B!$F-E!)@00``N`````!F9I!FD,8$$`!(@\`!2#V0
-M````=?!(8\%(C32`2(TT<$C!Y@1*C1062(V*8$$``,9!`9#&@F!!``!`#[;'
-MB$$&B)IG00``1(A)"4B+10!)B80R<$$``$ECP$B-%(!(C1102,'B!$J-!!)(
-MQX``0@```````$B)N/A!``!)BT0D7$F)A!+P00``00^VPTB-%(!(C1102,'B
-M!$F-M!)@00``3(GOZ`````#K%X/"`4@%L````(/Z(`^%[?[__[@!````2(/$
-M"%M=05Q!7<-F9I!F9I!F9I!(@^P(28GS08G22(GZ28GXN`$```")QH"ZNT(`
-M``$/A>$```!(F$B-%(!(C1102,'B!$F-A!``0@``1(A0"(A("<9`"P!$#[9(
-M"DECP4B-%(!(C1102,'B!$F-E!!@00``N`````#&!!``2(/``4@]D````'7P
-M26/12(T$DDB-!$)(P>`$3`'`2(V08$$``,9"`1#&@&!!``!`B$H)2&/&2(T,
-M@$B-#$A(P>$$00^VA`@*0@``2(T4@$B-%%!(P>($2HT$`DC'@`!"````````
-M2(FX^$$``$$/ML)(C03`2,'@!TF+A`"\5P``28F$"/!!``!)C;008$$``$R)
-MW^@`````ZQ6#P`%(@<*P````@_@@#X7]_O__L`%(@\0(PY!(@^P(28GQB=!(
-MB?[&APM"````3(V'8$$``+D`````D$+&!`$`2(/!`4B!^9````!U[L:&84$`
-M``'&AF!!``!`2,>&`$(```````!(B;[X00``#[;`2(T$P$C!X`=(BX0&O%<`
-M`$B)AO!!``!(@<9@00``3(G/Z`````!(@\0(PTB#[`A)B?&)T$B)_L:'"T(`
-M``!,C8=@00``N0````"00L8$`0!(@\$!2('YD````'7NQH9A00```,:&8$$`
-M`$!(QX8`0@```````$B)OOA!```/ML!(C03`2,'@!TB+A`:\5P``2(F&\$$`
-M`$B!QF!!``!,B<_H`````$B#Q`C#05=!5D%505154TB#[#A(B7PD&$B)="00
-M08G51(A$)`])B?Q%#[;U26/&2(T$P$C!X`>`O`?$5P``_0^$Q@@``(#Y$`^$
-MA0(``(#Y$'<7A,D/A)T```"`^0$/A:<(``"0Z08!``"`^>)T&X#Y_V9FD'0I
-M@/F0#X6+"```9F:09I#IR`8``+D`````@'\$`&:0#X7<!P``Z00(``!)8\9(
-MC03`2,'@!\:$!\17``#_@+\+0@```74E1(GR2(MT)!!(BWPD&.@`````A<`/
-MA34(``!!@$0D!@'I*@@``$ECQL9$!P<!2(M4)!!(B53'$.D3"```@+\+0@``
-M`7582(V/8$$``$ECQDB-!,!(P>`'2`'X#[91"8B08E<``$@%P%<```^V40J#
-MX@&(4`7&0`0`1(GR2(MT)!!(BWPD&.@`````A<`/A;T'``!!@$0D!@'IL@<`
-M`$ECQL9$!P<!2(M,)!!(B4S'$.F;!P``26/&2(T$P$C!X`=(C30X#[:7DD$`
-M`(B6LE<```^WEY!!``!FB90'L%<``$B+EXA!``!(B90'H%<``$B+EVQ!``!(
-MB90'<%<``$B-C`>`5P``2(N7=$$``$B)$4B+EWQ!``!(B5$(BY>$00``B90'
-MF%<``,:&Q%<```&`?P8?#X07!P``NP````!(C:Y@5P``3(VNL%<``.M)#[;+
-M1(GR2(MT)!!(BWPD&.@`````A<!T%4ECQDB-!,!(P>`'08B<!+-7``#K((/#
-M`4&`1"0&`3A=`@]%PT&(10-!@'PD!A]T!3I=`G*R0<:$)`M"```!00^V="0$
-M0(3V#X2<!@``N@````!!@'PD!P%T%^M#9F9FD&9FD`^VT4ACPD&`?`0'`74S
-M2&/"0<9$!`?_28MTQ!!!N0````!!N`````"Y_P```$B+?"08Z`````#I2@8`
-M`+D`````@\$!0#CQ=;?I.`8``$V)STF-01A(B40D($B-="0P28M!&$B)1"0P
-M26/&2(T$P$C!X`=(C2PX2(V%P%<``,9`!!!!]D$,<`^$0@,``$B+E<A7``!(
-MA=)T<0^V6`9(C7I<N@@```#H`````(3`=5M!]D</#W142(N%R%<``$B%P'1(
-M2(G%@'UE`'0_#[;;B=I(B>Y,B>?H`````$R+3"0@1`^WP(G92(GJ2(MT)!!(
-MBWPD&.@`````#[9=9DB+16A(A<!T!4B)Q>N[00^V3P_VP0T/A.L```!)8\9(
-MC13`2(G02,'@!T$/MK0$8%<``$"`_A\/A\H```#VP0AT%T`/ML9(C0302,'@
-M!$'&A`3@60``!NL<0`^VUDECQDB-!,!(C03"2,'@!$'&A`3@60``!T`/ML9)
-M8_9(C33V2(T4\$C!X@1)C;P4X%D``,9'`0!!#[9'#XA'`TB+1"0P28F$%.A9
-M``!!#[9'"8A'`D$/ME<-@^(/2,'F!TP!YDB-CF!7```/MD$&.,(/1]"#X@\/
-MMD<$@^#P"="(1P1!#[97*8/B#P^V208XR@]'T<'B!(/@#PG0B$<$@(9@5P``
-M`>G,`0``]L$"#X3#`0``2(UT)#!,B>?H`````(G!//\/A6(!``!!#[9,)`2$
-MR70]00^VA"3$5P``//]T,+H`````//UU'NLE#[;"2(T$P$C!X`=!#[:$!,17
-M```\_W02//UT#H/"`3C*==WK!;H`````#[;"2(T$P$C!X`=)C8P$8%<``+@`
-M````Q@0(`$B#P`%(@_AD=?)$#[;226/22(T4TDC!X@=*C3PB00^VQ4B-!,!(
-MP>`'28V$!&!7``!(B8?(5P``38V$%+!7``!)8]9(C1322,'B!TF+A!2\5P``
-M28E`!$B+3"002(F/V%D``$P!XDB+@M!7``!(B8?05P``3(V/P%<``$'&003_
-M2(VW8%<```^V3@=!#[9'"8B$#VA7``"`1@<!00^V1PV#X`\/MI)F5P``.-`/
-M1\*(1@9(BT0D,$F)0`Q!#[9'#XA&`P^V1"0/08A!!D$/MD0D!4$Z1"0$=09!
-MQD0D!0!!@$0D!0%)8\)!QD0$!P%(BU0D$$F)5,00ZTI)8\9(C03`2,'@!P^V
-MT4B-%-)(P>('28V4%&!7``!).90$R%<``'0B#[;!2(T$P$C!X`=,`>`/MG('
-M00^V3PF(C#!H5P``@$('`4$/ME<)1(GV3(GGZ`````!)8\9(C03`2,'@!T&`
-MO`2S5P````^$H````$&`?"0&'W5CZ8`"``!!QD<$$`^V2P-$B?)(BW0D$$B+
-M?"08Z`````"%P`^%70(``$&`1"0&`0^V2P,/ML&#P`$/ME4".=!U#\9#`P#I
-M/`(``&9FD&9FD(U!`8A#`T&`?"0&'P^$)`(``.LC26/&2(T$P$C!X`=,`>!(
-MC9BP5P``2(VH8%<``$R-N,!7```/MD,#.D4"#X)R____Z>T!``!!@'PD!@`/
-MA>$!``!!N0````!!N`````"YD````$2)\DB+="002(M\)!CH`````.FY`0``
-M28G]0;\`````2(M,)!!).4T@#X6#````1(GX2&G`4!```$F-7`0@O0````!$
-MB?A(:<!0$```2(D$)(![+/]U2D&`?"0&'P^$;0$``(GH2,'@!4B+%"1(C400
-M0`^V2R!(BU,838U,!`1$#[=#(DB+="002(M\)!CH`````(7`=0I!@$0D!@'&
-M0RSP2(/%`4B#PR!(@?V"````=9])@\<!28'%4!```$F#_P0/A5G___]!@'PD
-M!@`/A?T```!!#[9T)`1`A/8/A,L```"Z`````$&`?"0'`700ZSP/MM%(8\)!
-M@'P$!P%U,TACPD'&1`0'_TF+=,000;D`````0;@`````N?\```!(BWPD&.@`
-M````Z:,```"Y`````(/!`4`X\76WZW$/ML%(C03`2,'@!TF-E`3`5P``#[9"
-M!#S]=`@\_W0$QD($_H/!`4$X3"0$=]-)8\9(C03`2,'@!TF+K`305P``NP``
-M``!"@'PC*`%U$D+&1",H`$J+=",@2(M\)!C_U4B!PU`0``!(@?M`00``="7K
-MU$&Y`````$&X`````+GB````1(GR2(MT)!!(BWPD&.@`````2(/$.%M=05Q!
-M74%>05_#9F9FD&9F9I!F9I!(@^P82(D<)$B);"0(3(ED)!!)B?Q(B?5(BYZ8
-M````@'L&``^$1P$``$B-MI````!(B=_H`````(G!//\/A"X!``!(B>X/MD4!
-M/`%T6CP!<AH\$`^$B@```#R09F:09I`/A0H!``#IQ@```("["T(````/A?@`
-M``#&@PM"```!@&L&`0^VT4&Y`````$&X`````+D`````3(GF2(G?Z`````#I
-MR0```("["T(````/A;P```#&@PM"```!@&L&`0^VT4&Y`````$&X`````+D!
-M````3(GF2(G?Z`````#IC0```+H`````.HP:N$(``'4/#[:$&KE"```Z1@ET
-M$F:02('"L````$B!^E`5``!UV(!K!@$/MM%)B?%$#[9&";D0````3(GF2(G?
-MZ`````#K/P^VA:H```!(C12`2(T44$C!X@3&A!,+0@```8!K!@$/MM%!N0``
-M``!!N`````"YD````$R)YDB)W^@`````D$B+'"1(BVPD"$R+9"002(/$&,-F
-M9F:09F:09F:09F:008G0B?*%]G042(GY2(G0D,8!`$B#P0%(@^@!=?.)-TB!
-MZF!7``!(N(_C.([C.([C2/?B2,'J"D$XT$$/0M"(5P2$TG0KN@````!F9I!F
-M9I`/ML+&1`<'_TB-!,!(P>`'QH0'Q%<``/V#P@$X5P1WX,9'!@#&1P4`2(GX
-MN@````#&@`M"```!B)`*0@``@\(!2`6P````@_H@=>7SPV9FD$B)^8!_!``/
-MA)D```"_`````$0/ML=)8\!(C03`2,'@!T@YM`'860``=6ZX`````$`XO`BX
-M0@``=0C&A`B[0@```4@%L````$@]4!4``'7@26/`2(T$P$C!X`=(QX0!V%D`
-M``````!(C90!8%<``+@`````Q@00`$B#P`%(@_AD=?))8\!(C03`2,'@!\:$
-M`<17``#]@&D%`8/'`4`X>00/AVS___](B<]!N`````!(.7<@=3!(QT<@````
-M`,9'*`!)8\!(:<!0$```2(U$`2"Z`````,9`+`"#P@%(@\`@@/J"=?!!@\`!
-M2(''4!```$&#^`1UN?/#9F9FD&9F9I!!54%455-(@^P(2(G]2(GW28G438G%
-M08G(2(GK#[9%!3I%!'4$QD4%`$0/MEL%2(G>28G9N`````!!B<*)PDF+22!(
-M.?EU2TB82&G`4!```,9$`R@!#[9+!$&[`````(3)=&1!NP````!(.;[860``
-M=0X/MH;$5P``@\`#/`%V1T&#PP%(@<:`!```03C+=#?KUTB%R7492&/"2&G`
-M4!```$@!V$B)>"#&0"@!ZQEFD$&#P@&#P`%)@<%0$```@_@$#X5R____00^V
-MPDAIP%`0``!(C40#,+D`````9F9FD,8$`0!(@\$!2('Y`A```'7O10^VTTEC
-MPDB)?,,000^VPTB-!,!(P>`'2(V$`V!7``!FN0``Q@0!`$B#P0%(@_ED=?))
-M8\)(C03`2,'@!TB-C`/85P``N`````!F9I!FD,8$"`!(@\`!2#T``@``=?!)
-M8\)(C03`2,'@!TB-#!A(B;G860``3(FIT%<``,:!Q%<``/](QX'(5P``````
-M`$F+%"1(B90#O%<``$2(@697``!!N0````!!N`````"Y_P```$2)TDB)_DB)
-M[^@`````@$,%`4B#Q`A;74%<05W#2(L'3(L`#[9P0T"$]G1'#[97#;D`````
-M]L(!=`WK-Y!(B=!(T_BH`74(@\$!0#CQ=>Z`^0-V)$B-!(T`````)?P#``!)
-MC80`T`$``(L`B04`````ZR*Y`````$B-!(T`````)?P#``!)C80`T`$``(L`
-MB04`````P>@4@^`!PY!(BP=$#[9`0T&Y"@```$6$P'1*#[9_#4B)PKX`````
-M0;D*````N0````!F9I!F9I!(B?A(T_BH`704#[:"ZA(``(/@`X/`"$$XP40/
-M1\B#Q@&#P0%(@\)H1#C&==-!#[;!PV9F9I!F9F:09F:09F:02(L'1`^V0$-!
-MN0@```!%A,!T2@^V?PU(B<*^`````$&Y"````+D`````9F:09F:02(GX2-/X
-MJ`%T%`^V@NH2``"#X`.#P`A!.,%$#T+(@\8!@\$!2(/":$0XQG7300^VP<-F
-M9F:09F9FD&9FD&9FD`^V!\#H!(/@!P^V=P*)PH#.`D#VQ@0/1<(/MD\#B<*!
-MR@```@#VP00/1<*)PH#."$#VQ@@/1<*)PH'*```(`/;!"`]%PHG"@,X$0/;&
-M`@]%PHG"@<H```0`]L$"#T7"#[97%,'B&`G0PV9F9I!F9I#H`````//#9F:0
-M9F:09F:0BX<0"0``)?___P"Z`````#U0`9,`=1D/MH<3"0``P.@$/`P/E,`/
-MMM!F9F:09F:0B=##9F9FD&9FD&9FD&9FD(7V?D(/M@>$P'0$/"!U,4B)^KD`
-M````ZQ=F9F:09F:0#[9"`4B#P@&$P'0$/"!U$(/!`3GQ=>GK#69F9I!F9I"X
-M`````,.X`0```&9FD&:0PV9F9I!F9F:09F9FD&9FD`^V1P,/ME<"P>(("=#!
-MX!`/MD\!#[87P>(("=$)R,.008G0A=)T);D`````9F9FD`^V%P^V1P&(!HA6
-M`4B#Q@)(@\<"@\$!1#G!=>3SPV:02(/L"$F)\`^W1B"Z_P```&8]A0!W"P^W
-MP`^VE`=@"```#[?22(T4TDC!X@5(`Y=@"0``2(NW"!$```^V0E#!X`A(F$B-
-MA`9,"```BPB)#0````"!X?\````/MD)0P>`(2)A(C;0&1`@``(L&B04`````
-MP>`("<B)@A`!``!FQX(,`0````!,B<;H`````$B#Q`C#9F9FD&9FD&9FD&9F
-MD$B#["A(B5PD"$B);"003(ED)!A,B6PD($F)_4&)]$B++T"`_@-V.4J-'.4`
-M````@>/X!P``2(V$'3`"``#'``P```"_$"<``.@`````2(V$'30"``"+.(D]
-M`````.LWD$J-'.4`````@>/X!P``2(V$*U`"``#'``P```"_$"<``.@`````
-M2(V<*U0"``"+.XD]`````$$/MO1(8\9(C11`2(T4D$F-E-6P$@``#[9*$8/A
-M_(A*$8GX)0``/P`]```0`'4+B<B#R`*(0A'K&9!(8\9(C11`2(T4D(G(@\@!
-M08B$U<$2``!(BUPD"$B+;"003(MD)!A,BVPD($B#Q"C#9F9FD&9F9I!F9F:0
-M9F:005=!5D%505154TB#[!A)B?Y,BS])BP?&1DD`QD9(!<9&2P9(B7Y0N0``
-M``"]`````$B-D``"``!(B50D$$@%!`(``$B)1"0(ZQ9F9I!F9I!!#[9&#4C3
-M^*@!=0J#P0&003I/0W+J@/D#=GI(C1S-`````('C^`<``$R+;"0020'=0<=%
-M`"P```"_$"<``.@`````2`-<)`A$BR-$B24`````0<=%`"0```"_$"<``.@`
-M````BP.)!0````#!X`A!@>3_````00G$0<=%`"````"_$"<``.@`````BQN)
-M'0````#K>$B-',T`````@>/X!P``3(ML)!!)`=U!QT4`+````+\0)P``Z```
-M``!(`UPD"$2+(T2))0````!!QT4`)````+\0)P``Z`````"+`XD%`````,'@
-M"$&!Y/\```!!"<1!QT4`(````+\0)P``Z`````"+&XD=`````$&!_`$!:99U
-M&D&`3@P&B=C!Z!`\4`^4P`^VP.M(9F:09F:008'\`0$``'4/B=C!Z!`\4`^4
-MP`^VP.LJOX@3``#H`````(/%`4"`_01W"KD`````Z:O^__^)V,'H$#Q0#Y3`
-M#[;`2(/$&%M=05Q!74%>05_#9F9FD&9F9I!F9F:09F:0055!5%532(/L"$B)
-M_4&)]$B+AX@```!,BRAF@[\,`0```'0PB?._Z`,``.@`````187D=`6#^P%V
-M&DR)[V9FD.@`````9H.]#`$```!T!8/K`NO22(/$"%M=05Q!7<.02(/L.$B)
-M7"0(2(EL)!!,B60D&$R);"0@3(ET)"A,B7PD,$F)_(G+08GV08G518G'2(N'
-MB````$B+*$B)[^@`````2(G&QD`XX<9`.0'&0#H2N`\```!%A/9U!D$/MD0D
-M1XA&.T2(;CQ,B>H/ML:(1CT/ML>(1CZ)V,'H$(A&/XG8P>@8B$9`B%Y!00^W
-M1"1`9HE&($B);BC'1C0`````2,=&2`````!%A/](Q\``````2,?"`````$@/
-M1<)(B8:@````2(GOZ`````!(BUPD"$B+;"003(MD)!A,BVPD($R+="0H3(M\
-M)#!(@\0XPV:02(/L*$B)'"1(B6PD"$R)9"003(EL)!A,B70D($F)_(G+08GV
-M08G52(N'B````$B+*$B)[^@`````2(G&QD`XX<9`.0'&0#H2N`\```!%A/9U
-M!D$/MD0D1XA&.T2(;CQ,B>H/ML:(1CT/ML>(1CZ)V,'H$(A&/XG8P>@8B$9`
-MB%Y!00^W1"1`9HE&($B);BC'1C0`````2,=&2`````!(QX:@`````````$B)
-M[^@`````2(L<)$B+;"0(3(MD)!!,BVPD&$R+="0@2(/$*,-FD%-(B?M!B<I!
-MB=%(A?\/A`$!``!,BP=-A<`/A/4```!!#[9X0X7_?E=(BX.(````#[90#;D`
-M````]L(!=`WK0)!(B=!(T_BH`74'@\$!.?EU[X/Y`WXN28L`2`70`0``C12-
-M`````$ACTD@!T(L`B04`````P>@4@_`!@^`!ZRRY`````$F+`$@%T`$``(T4
-MC0````!(8])(`="+`(D%`````,'H%(/P`8/@`83`=66`NQP!````=0:`>T(`
-M=58/MT-`08"\`&`(``#_=$?&0T(E9L>##`$```$`00^WT4`/MO9!N`$```!$
-MB=%(B=_H`````+X%````2(G?Z`````#&0T(`9H.[#`$````/E,`/ML#K!;@`
-M````6\-F9I!FD$B#["A(B5PD"$B);"003(ED)!A,B6PD($B)_4&)]4&)U$B+
-MAX@```!(BQA(B=_H`````$B)QL9`..'&0#D!QD`Z$;@/````183M=00/MD5'
-MB$8[1(AF/$R)X@^VQHA&/0^W14!FB48@2(E>*,=&-`````!(QT9(`````$C'
-MAJ``````````2(G?Z`````!(BUPD"$B+;"003(MD)!A,BVPD($B#Q"C#9F:0
-M9F:09F:055-(@^P(2(G[2(G-08G12(7_#X0&`0``3(L'387`#X3Z````00^V
-M>$.%_WY62(N#B`````^V4`VY`````/;"`70,ZS](B=!(T_BH`74'@\$!.<]U
-M[X/Y`WXN28L`2`70`0``C12-`````$ACTD@!T(L`B04`````P>@4@_`!@^`!
-MZRRY`````$F+`$@%T`$``(T4C0````!(8])(`="+`(D%`````,'H%(/P`8/@
-M`83`=6N`NQP!````=0:`>T(`=5P/MT-`08"\`&`(``#_=$W&0T(E9L>##`$`
-M``$`00^WT4`/MO:Y`0```$B)W^@`````O@4```!(B=_H`````,9#0@!F@[L,
-M`0```'40BX,0`0``B44`N`$```#K!;@`````2(/$"%M=PV9FD&9FD$B#["A(
-MB1PD2(EL)`A,B60D$$R);"083(ET)"!(B?U!B?5!B=1!B<Y(BX>(````2(L8
-M2(G?Z`````!(B<;&0#CAQD`Y`<9`.A&X#P```$6$[74$#[9%1XA&.T2(9CQ,
-MB>(/ML:(1CT/MT5`9HE&($B)7BC'1C0`````2,=&2`````!%A/9(Q\``````
-M2,?"`````$@/1<)(B8:@````2(G?Z`````!(BQPD2(ML)`A,BV0D$$R+;"08
-M3(MT)"!(@\0HPV9F9I!F9I!F9I!F9I!(@^PH2(E<)`A(B6PD$$R)9"083(EL
-M)"!(B?5!B=1!B<U(BQ](B=_H`````$B)PDB%P'40QH7I`````<9%2@/IE```
-M`,9`..'&0#D!08#\`1G`]]"#P`*(0CI%A.UU4;@`````2(-]8`!T!P^VA8$`
-M``"(0CL/MT4X9HE"($B)6BC'0C0`````2,="2`````!(Q\``````2(F"H```
-M`$B)UDB)W^@`````ZRUF9I!FD,9".P\/MT4X9HE"($B)6BC'0C0`````2,="
-M2`````!(Q\``````Z[](BUPD"$B+;"003(MD)!A,BVPD($B#Q"C#9F9FD&9F
-M9I!F9F:09F:005=!5D%505154TB#[#B)]4F)U$B+#XT4[0````"-0N")P$B-
-MG`@@`@``2(D<)$B-A`@D`@``2(E$)`B)TDR-O`H``@``3(VL"@0"``"[````
-M`$R-="00@_T#=B6-@QP!``!(BQ0DB0*_$"<``.@`````2(M4)`B+`HD%````
-M`.L=C8,<`0``08D'OQ`G``#H`````$&+10")!0````!"B00S2(/#!$B#^QQU
-MJTB+1"0028D$)$B+1"0828E$)`A(BT0D($F)1"00BT0D*$&)1"082(/$.%M=
-M05Q!74%>05_#9F9FD&9F9I!F9F:09F:005=!5D%505154TB#[#B)]4F)U$B+
-M#XT4[0````"-0N")P$B-G`@@`@``2(D<)$B-A`@D`@``2(E$)`B)TDR-O`H`
-M`@``3(VL"@0"``"[`````$R-="00@_T#=B6-@P`!``!(BQ0DB0*_$"<``.@`
-M````2(M4)`B+`HD%`````.L=C8,``0``08D'OQ`G``#H`````$&+10")!0``
-M``!"B00S2(/#!$B#^QQUJTB+1"0028D$)$B+1"0828E$)`A(BT0D($F)1"00
-MBT0D*$&)1"082(/$.%M=05Q!74%>05_#9F9FD&9F9I!F9F:09F:005=!5D%5
-M05154TB#[#A)B?Y`B'0D"TR+/T0/MNY)8\5(C11`2(T4D$B-%-=(C8*P$@``
-M0(AP$$B)NK@2``#&0!(`1(GNZ`````!(C6PD$$B)Z$B)ZL8``$B#P`%(B=-,
-MC60D,$PYX'7L#[9$)`N)1"0,B<9,B??H`````$B)W^@`````26/52(T,4DB-
-M#(I(P>$#2HT4,8F"T!(``$B+0PQ)B80.U!(``(!\)`L#=CQ"C02M`````$B8
-M28V$!]`!``"+`(D%`````(F"Z!(``$*-!.T`````2)A)C80'@`$``(L(B0T`
-M````ZT="C02M`````$B828V$!]`!``"+"(D-`````$ECQ4B-%$!(C12008F,
-MUN@2``!"C03M`````$B828V$!X`!``"+"(D-`````$ECQ4B-%$!(C12028T4
-MUDB-@N`2``")2`SV0`H0#X0Z`0``]H+!$@```G1/D,9%``!(@\4!3#GE=?-(
-MC5PD$$B)VHMT)`Q,B??H`````$B)W^@`````26/52(T,4DB-#(I(P>$#08F$
-M#MP2``!(BT,,28F$#N`2``#K%TECQ4B-%$!(C1200<>$UMP2```!``(`@'PD
-M"P-V-4*-'.T`````2&/;2HV$.S`"``#'`!@```"_$"<``.@`````2HV<.S0"
-M``"+,XDU`````.LS0HT<[0````!(8]M*C80[4`(``,<`&````+\0)P``Z```
-M``!*C9P[5`(``(LSB34`````26/%2(T40$B-%)")\8'A____WXGP#0```"!!
-M]X36Z!(``````P")R@]%T(!\)`L#=A9"C03M`````$B828V$!S0"``")$.L4
-M0HT$[0````!(F$F-A`=4`@``B1!(@\0X6UU!7$%=05Y!7\.0059!54%455-(
-MB?U)B?9)B?4/MP9FA<!Y"R4`'P``P?@(B$=)2(V]A````$F-511)BT442(F%
-MA````$B+0@A(B4<(BT(0B4<03(VEP````$F+12Y(B87`````2(V=F````$F-
-M539)BT4V2(F%F````$B+0@A(B4,(2(M"$$B)0Q!(BT(82(E#&$B+0B!(B4,@
-MN@H```!(B?[H,_#__[H$````3(GF3(GGZ"/P__^Z%````$B)WDB)W^@3\/__
-M9L=%:```9L=%:@``9D&#OK(!```!#Y3"P>(##[9%3(/@]PG0B$5,0?:%IP``
-M``1T!F;'16@!`$'VA:0````!="1F@TUH`D'VA:H````!=`5F@TUJ`4'VA:@`
-M```!=`9F@4UH``%!]H6D````('049H--:`1!]H6J````('0%9H--:@)!]H6D
-M````0'069H%-:(``0?:%J@```$!T!F:#36H(D,:%@@````)!]H69`````70R
-M#[=%:*@!=`R#R`AFB45H9H--:A!!#[:%E@```(/@'X/``3P@NA\````/1,*(
-MA8(```!!]H68````"'0&9H%-:``"0?:%F`````1T!6:#36@@0?:%F`````)T
-M!6:#36@00?:%J````"!T%4'VA:X````@=`MF@TUH0&9FD&9FD/9%:`%T#4F+
-MA<@```!(B45XZPA!BT5X2(E%>$B#;7@!0?9%:@)T&D$/MX6`````J`]T#F:#
-M^`(9P(/`!(A%;.L$QD5L`L9%;?]!#[=5?@^WPJ@$=`O&16T"ZQMF9I!FD*@"
-M=`;&16T!ZPSVP@%F9I!T!,9%;0#&16[_0?9%:@1T'[D`````00^WA;````!(
-MT_BH`70#B$UN@\$!@_D'=>:^``(``$R)[^@`````B87,````0?:&I@```"!T
-M&T$/MX:L````@^`@@_@!&<"#P`*(A9@!``#K!\:%F`$```"X`0```%M=05Q!
-M74%>PV9FD$B#["A(B1PD2(EL)`A,B60D$$R);"083(ET)"!)B?U)B?9,BR>[
-M@/___^L)9F9FD(#[A7=##[;#00^VK`1@"```0(#]_W0Q0`^VQ4AIP,@/``!(
-MB<=)`[PDB`D``$PY;PAU%;H(````3(GVZ`````"$P'0$B>CK#X/#`8#[@6:0
-M=JZX_____P^VP$B+'"1(BVPD"$R+9"003(ML)!A,BW0D($B#Q"C#9F:09F:0
-M9F:005=!5D%505154TB#[#A)B?Y(BP>`?T,`#X01`P``QT0D-`````!(C9``
-M`@``2(E4)`A(!00"``!(B00D9F9FD`^V3"0TB$PD,T0/MOE)8\=(C11`2(T4
-MD$F---;VANH2```0#X2O`@``2(V6L!(``+@!````1(GY2-/@"$(22(NVR!(`
-M`$B)="0H]D(1`@^$'@$```^V1"0SC6@!03AN0P^&#`$``$ECQTB-%$!(C120
-M2,'B`TB)5"0@3`'R2(E4)!A(BU0D($F-E!;@$@``2(E4)!!$#[;M26/%2(T4
-M0$B-%)!(C1S5`````$Z-)#-!]H0DZA(``!`/A*<```!(BTPD&/>!W!(`````
-M#@`/A)(```!)C;0>X!(``+H(````2(M\)!#H`````(3`='=)C;0>U!(``$B+
-M1"0@28V\!M02``"Z"````.@`````A,!T5+@!````1(GI2-/@2(M4)!A(@<*P
-M$@``"D(2B$(208B$),(2``!(@WPD*`!U#TV+I"3($@``3(ED)"CK&$ECQ4B-
-M%$!(C1202(M$)"A)B836R!(``(/%`4$X;D,/AR+___](@WPD*``/A<0```!,
-MB??H`````$B)1"0H2(7`#X1;`0``26/'2(T,0$B-#(A)C0S.2(M4)"A(B9'(
-M$@``#[9$)#-(C11`2(T4D$F-E-:X$@``2(M$)"A(B5`@#[:!P1(``$B+5"0H
-MB$(*QD()`$R),L9"#@#&0E@`QD(H``^V3"0SC7$!03AV0W9=26/'2(T40$B-
-M%)!)C;S6L!(``$`/MLX/MD<22-/XJ`%T&$ACP4B-%$!(C1202(M$)"A)B836
-MR!(``(/&`4$X=D-V&NO.26/'2(T40$B-%)!(BTPD*$F)C-;($@``26/'2(T4
-M0$B-%)!)C936L!(```^V0A)(BTPD*(A!#0^V:A*`?"0S`W8K0HT<_0````!(
-M8]M(BT0D"$@!V,<`.````+\0)P``Z`````!(`QPDB2OK*4*-'/T`````2&/;
-M2(M$)`A(`=C'`#@```"_$"<``.@`````2`,<)(DK@T0D-`$/MD0D,X/``4$X
-M1D,/AQ']__](@\0X6UU!7$%=05Y!7\-FD$%7059!54%455-(@^QH2(G]3(LG
-MQD0D4%#&1"11!<9$)%($QD0D4S#&1"14$<9$)%6KQD0D5@#&1"17`$''A"0`
-M0`$`$R```$B+!\>`!$`!`/__``!(BP?'@`1``0``````2#N_\`@```^%U```
-M`$B-GX@4``!(C9<0"0``0;@!````N0@```"^```"`.@`````BX4("0``#[:5
-M$PD``(/J!(T$@HB%$PD``$B)[^@`````A,!U#$B+1"102(F%$`D``(L%````
-M``"%$PD``(/``8D%``````^VA1`)``"(@Q`)```/MH41"0``B(,1"0``#[:%
-M$@D``(B#$@D```^VA1,)``"#P`*(@Q,)```/MH44"0``B(,4"0``#[:%%0D`
-M`(B#%0D```^VA18)``"(@Q8)```/MH47"0``B(,7"0``38GG28V$)``!``!(
-MB40D0$&+A"0``0``B04`````#[?0B50D7*@@=`LEW_\``(E$)%SK&(G0@\@@
-MB40D7$B+5"1`B0*+`HD%`````$B+10#'@`0!````````2(M%`,>`&`$`````
-M``!(BT4`QX`<`0```````+^0T`,`Z`````!!QX=P`0``&`$``$&+AW0!``")
-M!0````"`Y/V`S`2)1"1<0<>'<`$``!@!``"+1"1<08F'=`$``$''AW`!```H
-M`0``0<>'=`$``']_``!!QX=P`0``)`$``$&+AW0!``")!0````!FN```#?\_
-M``")1"1<0<>'<`$``"0!``"+1"1<08F'=`$``$''AW`!```\`0``0<>'=`$`
-M````>@!!QX=P`0``I`$``$''AW0!``!]O^__0<>'<`$``+@!``!!BX=T`0``
-MB04`````)?__```-``#Z`(E$)%Q!QX=P`0``N`$``(M$)%Q!B8=T`0``0<>'
-MG````/\```!!QX>0`@``1`$``$''AY0"```&$``(0<>'D`(``+0!``!!QX>4
-M`@``7W```$''AY`"```P````08N'E`(``(D%`````##D@,PSB40D7$&)AY0"
-M``"`?4,`#X25`@``QT0D2`````!)C8=0`@``2(E$)#A)C9=4`@``2(E4)#!(
-MC840"0``2(E$)"A)C9>``0``2(E4)"!)C8>$`0``2(E$)!A)C9<P`@``2(E4
-M)!!)C8<T`@``2(E$)`AF9F:09F:0#[94)$B(5"1/@/H##X;^````1`^V\D*-
-M'/4`````2&/;3(ML)!!)`=U!QT4`"````+\0)P``Z`````!(BT0D"$R-)`-!
-MBP0DB04`````B40D7`T``(``08D$)$B+5"0H1(GV2(GOZ`````!$B?9(B>_H
-M`````$''10!$`0``OQ`G``#H`````$''!"0&$``(0<=%`+0!``"_$"<``.@`
-M````0<<$)%]P``!!QT4`"````+\0)P``Z`````#'1"1<_U2``$''!"3_5```
-MN@$```!$B?9(B>_H`````$B+1"0@2(T4`XL"B04`````)?___O^)`L=$)%P%
-M`<@`2`-<)!C'`P4!R`#I^P```&9F9I!$#[9T)$]"C1SU`````$ACVTR+;"0X
-M20'=0<=%``@```"_$"<``.@`````2(M4)#!,C20308L$)(D%`````(E$)%P-
-M``"``$&)!"1(BU0D*$2)]DB)[^@`````1(GV2(GOZ`````!!QT4`1`$``+\0
-M)P``Z`````!!QP0D!A``"$''10"T`0``OQ`G``#H`````$''!"1?<```0<=%
-M``@```"_$"<``.@`````QT0D7/]4@`!!QP0D_U0``+H!````1(GV2(GOZ```
+M?T5,1@(!`0D```````````$`/@`!`````````````````````````$#S!```
+M`````````$```````$``$``-`(GP9HEW",9'#@!FQT<,``!FA?9T'XU0_[D`
+M````9F:02(L'9HD4"$B#P0*#Z@%F@_K_=>SSPV9F9I!F9I!F9I!!B?!FB7<(
+MQD<.`6;'1PP``&:%]G0>N@````"Y`````$B+!V:)%`B#P@%(@\$"9D0YPG7L
+M\\-F9F:09F:09F:0@'\.`74J#[='#`^WR$B+%P^W%$J#P`%FB4<,9CM'"G(&
+M9L='#```9H-O"`$/M\+#2(L7#[='"(/H`6:)1P@/M\`/MP1"PV9F9I!F9I!F
+M9I"`?PX!=2H/MU<(#[='#`'"#[='"HG!B=#!^A_W^4ACTDB+!V:)-%!F@T<(
+M`<-F9I`/MT<(#[?(2(L79HDT2H/``6:)1PC#9F9FD&9FD&9FD&:#?P@`#Y3`
+M#[;`PY"0D)!(BP](.<]U"+D`````ZP^02(L12(M!"$B)0@A(B1!(B<C#9F9F
+MD&9F9I!F9I!F9I!!B="$TG0Z#[8'.@9U*$B)\;X`````ZQ0/ME<!#[9!`4B#
+MQP%(@\$!.,)U"H/&`40XQG7DZPNX`````&9FD&:0P[@!````PV9FD&9FD&9F
+MD,9'`0!`B'<"QT<$`````,-!B=`/ME<!#[;"2(T$0$C!X`)(B<%(`T\(@\(!
+MB%<!1`%'!+@`````Q@0(`$B#P`%(@_@,=?)(B3%$B$$(3(G"#[;&B$$)1(G"
+MP>H0@^(_#[9!"H/@P`G0B$$*PV9F9I`/MD<!.@</DL`/ML##9F:02(GYN```
+M``"`>0+_=0AFB3&(40+K#8/``4B#P01F/8``=>4/M\##9F:09F:09F:008G0
+M#[?&2(T$AX!X`O]U$&9$B0"(2`(/M\;#9F:09I`/MM%!#[?PZ``````/M\##
+M2(GYN``````X40)U$V8Y,74.QD$"_V;'`?__ZQ!F9I"#P`%(@\$$9CV``'7;
+M#[?`PV9F9I!F9F:09F9FD&9FD+D`````B<@X5(\"=09F.32/=!"#P`%(@\$!
+M2('Y@````'7B#[?`PV9FD&9FD&9FD`^V1S@\"'0^/"AT.CRH#X3_````/(@/
+MA#D!```\"F:0="0\*G0@/*H/A.4````\B@^$'P$``#PO=`P\CV9F9I`/A90!
+M```\+P^$D@```#PO=R(\"G1?/`IW"CP(9F9FD'5$ZU$\*'1X/"IF9I!F9I!U
+M-.ML/(\/A-D````\CV:0=Q4\B`^$RP```#R*9F9FD'44Z;X````\J&9F9I!F
+M9I!T<3RJ=&VY`````+@`````Z1,!```/MD<ZP>`(#[97.PG0#[97.8/B'\'B
+M$`G0B<$/MD<\Z>\```!F9F:09F:0#[97.L'B&`^V1SO!X!`)P@^V1ST)P@^V
+M1SS!X`B)T0G!#[9'/\'@"`^V5T`)T.FU````#[97.L'B&`^V1SO!X!`)P@^V
+M1ST)P@^V1SS!X`B)T0G!#[97/L'B&`^V1S_!X!`)P@^V1T$)P@^V1T#!X`@)
+MT.MS#[97.DC!XC@/MD<[2,'@,$@)P@^V1T%("<(/MD<\2,'@*$@)P@^V1SU(
+MP>`@2`G"#[9'/DC!X!A("<(/MD<_2,'@$$@)P@^V1T!(P>`(2(G12`G!#[97
+M0L'B&`^V1T/!X!`)P@^V1T4)P@^V1T3!X`@)T$B)CX@```")AY````!F@T\B
+M`?/#9F9FD$B#[%A$#[9//$0/MD<[#[9/.@^V5SD/MG<X#[9'1XE$)%`/MD=&
+MB40D2`^V1T6)1"1`#[9'1(E$)#@/MD=#B40D,`^V1T*)1"0H#[9'08E$)"`/
+MMD=`B40D&`^V1S^)1"00#[9'/HE$)`@/MD<]B00D2,?'`````+@`````Z```
+M``!(@\18PV9FD&9FD&9FD$B#[`@/MD8!B$<!#[9&`HA'`HM&!(E'!$B+1P@/
+MME<!2(T44DC!X@)(BW8(2(G'Z`````!(@\0(PV9F9I!F9I!(BT]@#[976+@`
+M````9F:0Q@0X`$B#P`%(/;````!U\$B)3V"(5UC#9F9FD&9F9I"X`````+K_
+M____9F:09F:0B!0X2(/``4@]``(``'7Q\\-F9F:09F9FD&9F9I!F9I"Y````
+M`$@[/W022(M/"$B+$4B+00A(B4((2(D02(G(PTB+#XN1!`$``(G0)7[__O^)
+M@00!``"!XG[_\O](BT<(B1!(BT<(B5`,2(L'BX!4`0``B04`````)?X`__](
+MBQ>)@E0!``##9F:09F:09F:0B?%(BP>+D`0!``")%0`````/MT<\9CV`9'0,
+M9CV`D70&9CV`E'41#[;)@\$(N`$```#3X`G"ZQ!`#[;.@\$,N`$```#3X`G"
+M2(L'B9`$`0``PV9F9I!F9F:09F:09F:0B?%(BP>+D`0!``")%0`````/MT<\
+M9CV`9'0,9CV`D70&9CV`E'41#[;)@\$(N/[____3P"'"ZQ!`#[;.@\$,N/[_
+M___3P"'"2(L'B9`$`0``PV9F9I!F9F:09F:09F:0B?%`@/[_=&]`@/X?=S*+
+MMQ@!``"Z`0```-/BB=#WT"'PB8<8`0``BX=8`0``B04`````(=!T0(F'6`$`
+M`,-FD(NW'`$```^VP8/H(+H!````B<'3XHG0]]`A\(F''`$``(N'8`$``(D%
+M`````"'0=`:)AV`!``#SPV9F9I!F9I!(@^PH2(E<)`A(B6PD$$R)9"083(EL
+M)"!(B=6)\$R++T"`_@,/AHD```!(C1S%`````('C^`<``$V-I!T``@``0<<$
+M)`P!``"_$"<``.@`````28V<'00"```/ME4#P>(8#[9%`L'@$`G"#[9%``G"
+M#[9%`<'@"`G"B1-!QP0D$`$``+\0)P``Z``````/ME4'P>(8#[9%!L'@$`G"
+M#[9%!`G"#[9%!<'@"`G"B1/IA````$B-',4`````@>/X!P``3HVD*P`"``!!
+MQP0D#`$``+\0)P``Z`````!*C9PK!`(```^V50/!XA@/MD4"P>`0"<(/MD4`
+M"<(/MD4!P>`("<*)$T''!"00`0``OQ`G``#H``````^V50?!XA@/MD4&P>`0
+M"<(/MD4$"<(/MD4%P>`("<*)$TB+7"0(2(ML)!!,BV0D&$R+;"0@2(/$*,-(
+M@^P82(E<)`A,B60D$$F)_$`/MMZ)WN@`````OQ`G``#H`````(G>3(GGZ```
+M``!(BUPD"$R+9"002(/$&,.005=!5D%505154TB#[%A)B?^(5"172(L7@'\^
+M``^$/`(``$&\`````$&]X/___T&^\/___T`/ML9(B40D2$B-@H`!``!(B40D
+M0$B-BH0!``!(B4PD.$B-@J`!``!(B40D,$B-BJ0!``!(B4PD*$B-@E`"``!(
+MB40D($B-BE0"``!(B4PD&$B-@N`!``!(B40D$$B!PM`!``!(B50D"&9FD$B+
+M1"1(1(GA2-/XJ`$/A(T!``!$B>6#_0-V%T2)ZD@#5"0HBP*)!0````"#X/Z)
+M`NL;C13M`````(G22`-4)#B+`HD%`````(/@_HD"OQ`G``#H`````(!\)%<`
+M='*#_0-V%T2)\D@#5"00BP*)!0````"#R`*)`NL;C12M`````(G22`-4)`B+
+M`HD%`````(/(`HD"1(GP2(M,)!!(`<&-!*T`````B<!(BU0D"$@!PH/]`W8*
+MBP&)!0````#K"(L"B04`````J`)T=.OC9I"#_0-V+T2)ZTB+1"0@2`'8QP``
+M````OQ`G``#H`````$@#7"08BP.)!0````"#R`&)`^M!C1SM`````(G;2(M$
+M)"!(`=C'``````"_$"<``.@`````2`-<)!B+`XD%`````(/(`8D#ZS=F9F:0
+M9F:0@_T#=BM$B>I(BT0D,$@!T,<``0```$@#5"0HBP*)!0````"#R`&)`NLV
+M9F:09F:0C03M`````(G`2(M4)$!(`<+'`@$```!(`T0D.(L0B14`````@\H!
+MB1!F9F:09F:008U4)`%)@\0!08/%"$&#Q@1!#[9'/CG0#X="_O__2(/$6%M=
+M05Q!74%>05_#9F:055-(@^P(B=%(BR^#_@-V((T$]>#___^)P$B-E`6@`0``
+MBP*)!0````"#X/Z)`NL>C03U`````(G`2(V4!8`!``"+`HD%`````(/@_HD"
+MA,ET?H/^`W8@C02U\/___XG`2(V4!>`!``"+`HD%`````(/(`HD"ZQZ-!+4`
+M````B<!(C90%T`$``(L"B04`````@\@"B0*-%+4`````C4+PB<!(C8P%X`$`
+M`(G22(V4%=`!``"#_@-V"HL!B04`````ZPB+`HD%`````*@"='7KXX/^`W8X
+MC1SUX/___XG;2(V$*U`"``#'``````"_$"<``.@`````2(V<*U0"``"+`XD%
+M`````(/(`8D#ZS:-'/4`````B=M(C80K4`(``,<``````+\0)P``Z`````!(
+MC9PK5`(``(L#B04`````@\@!B0-(@\0(6UW#D)"0D)"028G09H%^..$!=14/
+MMD8Z@^@10;D`````/`%V-V9F9I!(BS],BX]("```#[=&(+K8)@$`9CV#`'<7
+M#[?`#[:$!W@'``!(C13`2(T4D$C!X@-)`=%!QD`$!4&`8`7^08`@W[@`````
+M9H%^..$!=1(/MD8Z@^@!/`$/EL`/ML!F9I")PL'B!T$/M@"#X#\)T$&(`/:&
+ME@````%U!69!B4@(00^W0`B(1B5F@7XXX0%U(0^V5CJ-0O\\`7<)#[96.X/B
+M#^LAC4+ON@\````\`785D+H`````28-Y6`!T"$$/ME%Q@^(/00^V`(/@\`G0
+M08@`PV9F9I!F9F:09F9FD&9FD$B)^4B+/P^W@<@,``"#P`%FB8'(#```9CN!
+MS`P``'()9L>!R`P`````#[>!R`P``$C!X`)(`X&`"P``BQ:)$`^W@<@,``")
+MARP!``##9F:008G0N`````#&!`@`2(/``4B#^`1U\HGR9H'B_P\/MP%F)0#P
+M"=!FB0$/ME<,P>(,BP$E_P_P_PG0B0$/MD<*@^`"2(/X`1G2@^("@\(!P>(%
+M#[9!`X/@'PG0@\@0@^#WB$$#]D<*`7071(G"@^)_P>($#[=!`F8E#_@)T&:)
+M00+SPV9F9I!F9F:09F:09F:0N`````#&!#``2(/``4B#^`UU\@^V1SF(!@^V
+M1SJ(1@$/MD<[B$8"#[9'/(A&`P^V1SV(1@0/MD<^B$8%#[9'/XA&!O:'E@``
+M``1T(P^V1T"(1@@/MD=!B$8)#[9'0HA&"@^V1T.(1@L/MD=$B$8,N`$```##
+M9F9FD&9F9I!F9I"Z`````$&Z`````$&Y_____^M2`=)$B<#3^*@!=!+WP@``
+M``%U&H'R=R?;`.L29I")T#5W)]L`]\(````!#T70@^D!1#G)=<M)@\(!28/Z
+M"'43B=#!Z!"(!XG0P>@(B$<!B%<"PT4/M@0RN0<```#KHF9F9I!F9F:09F9F
+MD&9FD`^W]DC!Y@-(`[>8"```2(L.2(7)=#-(BQ</MT$R9L'H!0^WP(T$A0`#
+M``")@G`!``!(BQ</MTDR@^$?N`$```!(T^")@G0!``#SPV9FD&:0\\-F9F:0
+M9F9FD&9FD&9FD$B#["A(B5PD"$B);"003(ED)!A,B6PD($F)_(GU1`^V[DR)
+MZ4C!X01,B>A(P>`'2"G(2(V$!P`-``#'0`@`````A-(/A"H"``!`@/X#=D%(
+MC1SM`````('C^`<``$B+!T@%``(``$@!V,<`(````+\0)P``Z`````!)BP0D
+M2`4$`@``2`'#BP.)!0````#K/TB-'.T`````@>/X!P``2(L'2`4``@``2`'8
+MQP`@````OQ`G``#H`````$F+!"1(!00"``!(`<.+`XD%`````,'H$(3`>2I`
+M#[;%00^V="1!C32P2,?'`````+@`````Z`````"X`````.G^`0``9I!`@/T#
+M#X:F````2(T<[0````"!X_@'``!)BP0D2`4``@``2`'8QP`L````OQ`G``#H
+M`````$F+!"1(!00"``!(C00#BQ")%0````!,B>E(P>$$3(GH2,'@!T@IR('B
+M_P```$&)E`0(#0``28L$)$@%``(``$B-!`/'`"0```"_$"<``.@`````28L$
+M)$@%!`(``$@!PXL#B04`````B<&!X?___P#IH0```&9FD&9FD$B-'.T`````
+M@>/X!P``28L$)$@%``(``$@!V,<`+````+\0)P``Z`````!)BP0D2`4$`@``
+M2(T$`XL0B14`````3(GI2,'A!$R)Z$C!X`=(*<B!XO\```!!B90$"`T``$F+
+M!"1(!0`"``!(C00#QP`D````OQ`G``#H`````$F+!"1(!00"``!(`<.+`XD%
+M`````(G!@>'___\`3(GH2,'@!$R)ZDC!X@=(*<*)R,'@"$$)A!0(#0``N`$`
+M``#IB0```$`/MLZ)R,'@"$AC\$B)\D@#ER`+``"+`HD%`````,'H$(3`>1\/
+MMG=!C32Q2,?'`````+@`````Z`````"X`````.M%BTH,B0T`````3(GJ2,'B
+M!$R)Z$C!X`=(*=!(C90'``T``(E*"$B)\$@#AR`+``"+0`2)!0````#!X`@)
+MR(E""+@!````2(M<)`A(BVPD$$R+9"083(ML)"!(@\0HPV9F9I!F9F:09F:0
+M05=!5D%505154TB#[`A(B?U)B?>`?T,`="6Y`````/9&#`%T#NL800^V1PQ(
+MT_BH`74,@\$!#[9%0V8YR'?H28M'*$B%P'0<2(VPN````$B+?2CH`````$F+
+M=RA(B>_H`````$F-1T!).4=`#X1*`0``2(D$)$B+/"3H`````$F)Q$B#>$``
+M#X01`0``@'AS`'1P9H-]9`!T:4&^`````$&]`````$B+A9@(``!,`>A(BQA(
+MA=MT.@^W0R!F03M$)#AU+F8]@P!W*`^WP("\!7@'``#_=!O&0R0A#[=S,DB)
+M[^@`````2(G>2(GOZ`````!!@\8!28/%"`^W161$.?!_HTF+1"1`2,=`:```
+M``!!]D0D3`1U&DB)[^@`````28MT)$"Z`0```$B)[^@`````28M4)$`/MH++
+M````C02`#[92`@'02)@/MH@`````#[95.@^V=3E(Q\<`````N`````#H````
+M`$F+5"1`2(NU``@``+\!````Z`````!)BU0D0$B+M0`(``"_!@```.@`````
+M2<=$)$``````08!O#0%,B>9(B>_H`````$B+!"1).4=`#X6Z_O__2<='*```
+M``!(BT4`BY!8`0``B14`````A=)T"DB+10")D%@!``!(@\0(6UU!7$%=05Y!
+M7\-F9F:09F9FD&9F9I!F9I!!5T%6055!5%532(/L*$B)_4B+!XN(4`$``(D-
+M`````$B+%XG()?#__P")@E`!``#WP0#__P`/A.4'``"`?4,`#X3;!P``QD0D
+M$`")R4B)3"0(1`^V;"0008U-"$B+1"0(2-/XJ`%U%$&-31!(BT0D"$C3^*@!
+M#X22!P``@'PD$`-V+4B+10!(!8`!``!"C13M`````$ACTD@!T(L`B04`````
+MP>@3@^`!ZRMF9I!FD$B+10!(!8`!``!"C13M`````$ACTD@!T(L`B04`````
+MP>@3@^`!A,!T-KH`````1(GN2(GOZ`````"$P'0B26/%2(G"2,'B!$C!X`=(
+M*="!C`4$#0`````(`&9FD&9FD$B+50"`?"00`W8E0HT$[0````!(F$B-A`*`
+M`0``BP")!0`````E```!`.LC9F9FD$*-!.T`````2)A(C80"@`$``(L`B04`
+M````)0```0"%P'1=@'PD$`-V'4*-!.T`````2)A(C80"@`$``,<````!`.G)
+M!@``0HT$[0````!(F$B-A`*``0``QP````$`Z:P&``!)8\5(B<)(P>($2,'@
+M!T@IT(&,!00-``````$`@'U+`0^%.@4``(!\)!`#=B5(BT4`2`6``0``0HT4
+M[0````!(8])(`="+`(D%`````(/@`>LC2(M%`$@%@`$``$*-%.T`````2&/2
+M2`'0BP")!0````"#X`&$P`^$80$``$ECW4B)V$C!X`1(P>,'2"G#2(VT'1`-
+M``!(BWTHZ`````!(B[P=X`P``$B%_W0=2(M'*$B%P'04]D!*`G4.D.@`````
+MA,`/A14!``!)8\5(B<)(P>($2,'@!T@IT$B+A`7@#```2(7`='9)B<:`>`T`
+M#X2,````0;\`````3(U@0$R)Y^@`````2(G#28M$)`A)B5PD"$R)(TB)0PA(
+MB1CV0TP"=2Y(BU-`2(72=!5(B[4`"```OP4```#H`````(!+3`)(B=J^!@``
+M`$R)]^@`````08/'`44X?@UV)>NA#[9T)!"Z`0```$B)[^@`````OZ"&`0#H
+M`````+X`+3$!ZP6^0$M,`$ECU4B)T$C!X`1(P>('2"G"2(T,*HFQ$`T``$C'
+M@2`-````````#[9$)!!(B<9(P>8$2,'@!T@I\$B-A`70#```2(F!*`T``$B-
+MM!40#0``2(M]*.@`````@'PD$`-V/4*-%.T`````2&/22(M%`$@%@`$``$@!
+MT(L`B04`````2(M%`$@%@`$``$@!PHL"B04`````P>@'@^`!ZSM"C13M````
+M`$ACTDB+10!(!8`!``!(`="+`(D%`````$B+10!(!8`!``!(`<*+`HD%````
+M`,'H!X/@`83`='N`?"00`W8W0HT,[0````!(8\E(BT4`2`6$`0``2`'(BP")
+M!0````!(BU4`2('"A`$``$@!T0T```$`B0'K1$*-#.T`````2&/)2(M%`$@%
+MA`$``$@!R(L`B04`````2(M5`$B!PH0!``!(`=$-```!`(D!ZS9F9I!F9I"`
+M?"00`W8I2(M%`$@%@`$``$*-%.T`````2&/22`'0BP")!0````#!Z!*#X`'K
+M)Y!(BT4`2`6``0``0HT4[0````!(8])(`="+`(D%`````,'H$H/@`83`#X0F
+M`@``#[9-04&-3(T`#[95.@^V=3E(Q\<`````N`````#H`````(!\)!`#=C="
+MC0SM`````$ACR4B+10!(!8`!``!(`<B+`(D%``````T```0`2(M5`$B!PH`!
+M``!(`=&)`>LU0HT,[0````!(8\E(BT4`2`6``0``2`'(BP")!0`````-```$
+M`$B+50!(@<*``0``2`'1B0%)8\5(B<)(P>($2,'@!T@IT$B+A`7@#```2(7`
+M=!!(@W@H``^%I````.EC`0``@'PD$`-V2D*-%.T`````2&/22(M%`$@%@`$`
+M`$@!T(L(B0T`````2(M%`$@%@`$``$B-!`*)"$B+10!(!8`!``!(`<*+`HD%
+M`````.DO`@``0HT4[0````!(8])(BT4`2`6``0``2`'0BPB)#0````!(BT4`
+M2`6``0``2(T$`HD(2(M%`$@%@`$``$@!PHL"B04`````Z>4!``!F9F:03(M@
+M*$'V1"1*`@^$D@```,9$)!``08!\)#H`=$/&1"00``^V1"0028M<Q%A(A=MT
+M'DB+4T!(A=)T%4B+M0`(``"_!0```.@`````@$M,`H!$)!`!#[9$)!!!.$0D
+M.G?"28V<)+@```!(BWTH2(G>Z`````!!QX0DN````$!+3`!)QX0DR```````
+M``!-B:0DT````$B+?2A(B=[H`````.LB#[9-04&-3(T`#[95.@^V=3E(Q\<`
+M````N`````#H`````(!\)!`##X:"````#[9<)!!(P>,#@>/X!P``2(M%`$@%
+M@`$``$@!V(L0B14`````2(M%`$@%@`$``$B-!`.)$$B+10!(!8`!``!(C00#
+MBP")!0````!(BT4`2`4P`@``2(T$`\<``````+\0)P``Z`````!(BT4`2`4T
+M`@``2`'#BP.)!0````#I?0````^V7"002,'C`X'C^`<``$B+10!(!8`!``!(
+M`=B+$(D5`````$B+10!(!8`!``!(C00#B1!(BT4`2`6``0``2(T$`XL`B04`
+M````2(M%`$@%4`(``$B-!`/'``````"_$"<``.@`````2(M%`$@%5`(``$@!
+MPXL#B04`````@$0D$`$/MD0D$#A%0P^',?C__TB+10"+B%`!``")#0````!(
+MBU4`B<@E\/__`(F"4`$``/?!`/__`'0CZ>'W__^0N@$```!$B>Y(B>_H````
+M`(3`#X4\^?__Z5/Y__^X`````$B#Q"A;74%<05U!7D%?PV9F9I!F9F:09F9F
+MD&9FD$%455-(B?M,BR>`?SH`="V]`````$`/ML5(BU3#6$B%TG012(N[@```
+M`+XA````Z`````"#Q0%`.&LZ=]A(B[N`````N@````"^(0```.@`````9L=#
+M2B$`QD-"$4B)WDR)Y^@`````6UU!7,-F9I!!5T%6055!5%532(/L"$B)_4R+
+MIX````!-BRPD00^V1"0+J!!T"<9'30;I)P$```^V5TV`^@1T#H#Z!@^%A`$`
+M`.D0`0``@^#W@\@008A$)`N+E^P```"-0@&)A^P```"#^@(/A^T```!)BX6P
+M````2(EP"$B)!DF-A;````!(B48(28FUL````(!_0@!T#;L`````@'\Z`'4;
+MZSM!O@````!-C7PD0$&`?"0-`'4_D.F1````#[;#2(M4Q5A(A=)T#;XA````
+M3(GGZ`````"#PP$X73IWWKH`````OB$```!,B>?H`````.G7````3(G_Z```
+M``!(B<-)BT0D2$F)7"1(3(D[2(E#"$B)&$B+4T!(A=)T%4F+M0`(``"_!0``
+M`.@`````@$M,`DB)VKX&````3(GGZ`````!!@\8!13AT)`UWJ/9%2@)T>4B)
+M[^@`````ZV]!@&0D"_?'A>P`````````28N%L````$B)<`A(B09)C86P````
+M2(E&"$F)M;````"`?3H`=">[``````^VPTB+5,582(72=`V^!@```$R)Y^@`
+M````@\,!.%TZ=]ZZ`````+X&````3(GGZ`````!(@\0(6UU!7$%=05Y!7\-F
+M9F:09F9FD&9F9I!(@^PH2(E<)`A(B6PD$$R)9"083(EL)"!)B?Q(B?-)B=4/
+MMW8X9H'^X0%U%`^V0SJ#Z!$\`0^&%0$``&9FD&:0#[=#(+G_````9CV#`'<,
+M#[?`00^VC`1X!P``#[?!2(T4P$B-%)!(P>(#2(G520.L)$@(``!F@?[A`74+
+M#[9#.H/H`3P!=BEF@?G_`'0&]D5+!'4<QD,D!D''10``````N`$```#IJP``
+M`&9FD&9FD`^V14BH`71XJ`1T=$$/MDPD1$$/MD0D23C!<B8/MM`/MO%(Q\<`
+M````N`````#H`````$''10`!````N`$```#K8TB)WDB)[^@`````A,!U$\9#
+M)"%!QT4``````+@!````ZT&`?7,?=A9!QT4``0```+@!````ZRQF9F:09F:0
+M28V\)!@*``#H`````(3`=`]!QT4``0```+@!````ZP6X`````$B+7"0(2(ML
+M)!!,BV0D&$R+;"0@2(/$*,-FD$%7059!54%455-(@^Q828G\2(GU2(N?4`L`
+M`&;'1C+_#TB-5"0LZ`````"$P'0)BT0D+.D%!```#[=-(+__````9H'Y@P!W
+M#`^WP4$/MKP$>`<```^W=3AF@?[A`74/#[9%.H/H$3P!#X:E````9H'Y@P!W
+M40^WP4$/MH0$>`<``#S_=$%F@_E_=QX/MM!)BXPD2`@``$B-!-)(C02"2(M$
+MP5`/MD`(ZR(/ML!)BY0D<`@``$C!X`A(BX00@`````^V0`CK!;C_____#[;`
+M00^VA`3\!P``2(G"2,'B!TB-A,)0`0``28U$!`A(B40D$`^WQTB-%,!(C120
+M2,'B`TF)UTT#O"1("```9H'^X0%U/.LH#[?'2,'@"$D#A"1P"```2(E$)!A(
+MBX"`````2(E$)!!!OP````#K-P^V53J-0N\\`78CC4+_/`%V'&:!__\`=`=!
+M]D=+!'4.QD4D!K@`````Z=0"``!(QT0D&`````!(C70D2$R)Y^@`````08G&
+M9HE%,DR+;7@/M]!(B50D"$AIPK`$``!(C1P82(U#($DKA"10"P``20.$)%@+
+M``!(BU0D2(E"($C!Z"!(BU0D2(E")$F+11A(BU0D2(E"*$C!Z"!(BU0D2(E"
+M+$B+1"1(9D2)<`BX`````&9F9I#&!!@`2(/``4@]L`0``'7P9H%]..$!=5@/
+MMD4Z@^@1/`%W34B-3"0P2(M$)$@/ME`(2(GN3(G_Z`````!(C8,@!```22N$
+M)%`+``!)`X0D6`L``$B+5"1(B4(02,'H($B+5"1(B4(4Z98```!F9F:02(M$
+M)!#V0`H!#X2#````]H66````('0/2(UT)#!(B>_H`````.L92(U,)#!(BT0D
+M2`^V4`A(B>Y,B?_H`````$B-@R`$``!)*X0D4`L``$D#A"18"P``2(M4)$B)
+M0A!(P>@@2(M4)$B)0A1(B=A)*X0D4`L``$D#A"18"P``2(M4)$B)0AA(P>@@
+M2(M4)$B)0AP/ME592(M$)$AFB5`"@'U9`'0ROP````")^$B-!$!(P>`"28MU
+M$$B+36!(BQ0(2(D4!HM4"`B)5`8(@\<!#[9%63GX=].+531(BT0D2(E0#$4/
+MM^Y(BU0D2$2)Z4B)[DB+?"00Z`````!(C4PD,$B)VDB)[DR)Y^@`````28N$
+M))@(``!(BU0D"$B)+-!$B?)FP>H%@>+_!P``1(GI@^$?N`$```!(T^!!"824
+MH`@``&:!?3CA`74^#[9%.H/H$3P!=S-(BW0D&$R)Y^@`````2(U,)$!(BT0D
+M&`^V4$Q$B>Y(BWPD$.@`````@ST``````G4DZU!,B?Y,B>?H`````$B-3"1`
+M00^V5V9$B>Y(BWPD$.@`````2(UT)$!,B>?H`````$B+<R!(A?9T&$C'QP``
+M``"X`````.@`````N`,```#K!;@#````2(/$6%M=05Q!74%>05_#9F9FD$%4
+M55-(B?U,C:>P````Z0T!``!,B>?H`````$B)PP^V4"!FB5`@9H/Z?W849H%X
+M..$!=2,/MD`Z@^@1/`%W&)!F@?J#`'<0#[?"#[:4!7@'``"`^O]U&<9#)`9(
+MB=Y(B>_H`````.FU````9F:09I!F@7LXX0%U&`^V2SJ-0>\\`0^'J````.LW
+M9F9FD&9FD`^VPDB-%,!(C1202,'B`TB)T$@#A4@(``#V0$L$=1'&0R0&2(G>
+M2(GOZ`````#K8$B)WDB)[^@`````@_@"9I!W!X/X`7,;ZPN#^`-F9F:0=3[K
+M,$B)WDB)[^@`````D.LN2(V5L````$B+A;````!(B5@(2(D#2(E3"$B)G;``
+M``#K/4B)WDB)[^@`````D$PYI;`````/A>;^___K(DB+M4@(``"-0?\\`7:#
+M#[;"2(T4P$B-%)!(C036Z5C___];74%<PV9F9I!F9I!F9I!(@^PX2(E<)`A(
+MB6PD$$R)9"083(EL)"!,B70D*$R)?"0P2(G]3(MG4$V++"2[`````&:!?CCA
+M`746#[9&.H/H`3P!#Y;`#[;89F9FD&9FD`^VA<`````\!'0-/`8/A24"``#I
+MR`$``,:%P@````!(BTU`2(7)=1L/MI4A`0``C4(!B(4A`0``@/H"#X>?`0``
+MZQ*+402-0@&)002#^B@/AXL!``!)BX6P````2(EP"$B)!DF-A;````!(B48(
+M28FUL````,9&)(!(B>J^(0```$R)Y^@`````A=L/A:<!``"`?4K_=#9(BU58
+M2(729I`/A)(!``"`>D(`="'V0DH"#X2"`0``#[9-<;@!````T^`)0E"`34P0
+MZ6L!``!!#[9$)`N#X/>#R!!!B$0D"T&`?"0-`'130;X`````38U\)$!,B?_H
+M`````$B)PTF+1"1(28E<)$A,B3M(B4,(2(D82(M30$B%TG0528NU``@``+\%
+M````Z`````"`2TP"08/&`44X="0-=[A(BU582(72=2W&14H#9L>%N```````
+M2(GJOB$```!,B>?H`````$B)[DR)[^@`````Z<D```#V0DH"#X2_````#[9-
+M<;@!````T^`)0E"`34P02(MU6$B!QK@```!)BWTHZ`````!(BT58QX"X````
+M@(0>`$B+15A(QX#(`````````$B+15A(B8#0````2(MU6$B!QK@```!)BWTH
+MZ`````#K6V9FD`^V74I!@&0D"^])BX6P````2(EP"$B)!DF-A;````!(B48(
+M28FUL````$B)ZKX&````3(GGZ`````"`^_]U$4B)ZDR)YDR)[^@`````9F:0
+M3(GOZ`````!(BUPD"$B+;"003(MD)!A,BVPD($R+="0H3(M\)#!(@\0XPV9F
+MD&:005=!5D%505154TB#[`A(B?U)B?=(BX]("```#[=&(+K8)@$`9CV#`'<7
+M#[?`#[:$!W@'``!(C13`2(T4D$C!X@-,C2013(GF2(GOZ`````!,B>9(B>_H
+M`````$$/MW<R2(GOZ`````!!#[=W,DB)[^@`````9D''1S+_#TF+%TF+1PA(
+MB4((2(D008!L)',!38UL)"!-.6PD('163(VUL````$R)[^@`````2(G##[=P
+M,DB)[^@`````#[=S,DB)[^@`````9L=#,O\/08!L)',!2(N%L````$B)6`A(
+MB0-,B7,(2(F=L````$TY;"0@=;%!QH0DP`````1,B?Y,B>?H`````+@!````
+M2(/$"%M=05Q!74%>05_#9F:09F:02(/L:$B)7"0X2(EL)$!,B60D2$R);"10
+M3(ET)%A,B7PD8$B)5"0H3(LG#[?V2,'F`TD#M"28"```2(LN9H%]..$!=2X/
+MMD4Z@^@1/`%W(TB+5RA$#[9Z3$&^`````$B#?"0H`'5AQD)-`$&^`````.M5
+M28N,)$@(``"XV"8!`&:!?2"#`'<=#[=%($$/MH0$>`<``$B-%,!(C1202(T$
+MU0````!,C30!10^V?F:Z`````$B#?"0H`'4-0<:&P`````"Z`````(!])(%U
+M!(!G"_=(@WPD*``/A7,!``#&120`@ST``````7479H%]..$!=0\/MD4Z@^@1
+M/`%W!,9%)"'VA98````@#X1"!```2(M%:$B%P`^$-00``$B)P_:`L0````)T
+M'4B+N*````!(A?]T$4B+=4A(A?9T"(M5-.@`````28N4)"`+``!(@<)`"```
+M00^V1F;!X`A(F$@!PHL"B04`````B<+!ZA"(DYL```#!Z!AFB8.0````28N4
+M)"`+``!(@<)$"```00^V1F;!X`A(F$@!PHL2B14`````#[;"9HF#E`````^V
+MQF:)@Y8```")T,'H$`^VP&:)@Y@```#!ZAB(DYH```!)BY0D(`L``$B!PDP(
+M``!!#[9&9L'@"$B82`'"BP*)!0`````/ML!FB8.2````28N4)"`+``!(@<)(
+M"```00^V1F;!X`A(F$@!PHL"B04`````B<+!X@AF"9.4````B<*!X@#_``!F
+M"9.6````P>@()0#_``!F"8.8````Z0(#``!FD`^W13)(:<"P!```38NL)%`+
+M``!)`<5)C9T@!```@'TD@'4$QD4D(4V%]@^$D0```$F+5D!(A=)T0`^V@LL`
+M``"-!(`/ME("`=!(F`^VB`````!!#[94)#I!#[9T)#E,BT0D*$C'QP````"X
+M`````.@`````Z8<```!(BU<@00^V1"1!#[92"(T$@HT$@$$/ME9Q`=!(F`^V
+MB`````!!#[94)#I!#[9T)#E,BT0D*$C'QP````"X`````.@`````ZS](A=)T
+M.DB+1R!!#[9,)$$/MD`(C0R(00^V5"0Z00^V="0Y3(M$)"A(Q\<`````N```
+M``#H`````&9F9I!F9I"+2PB+4P2+,T2+0PQ(Q\<`````N`````#H`````$'V
+M12(!=1-!@'TG`'D,#[=U,DR)Y^@`````#[9$)"NH`0^$7`$``$R)^DC!X@B!
+MX@#_``!)BX0D(`L``$@%0`@``$@!T(LPB34`````08GW0<'O$(GPP>@8B$0D
+M$$F+A"0@"P``2`5$"```2(T$`D2+*$2)+0````!)BX0D(`L``$@%2`@``$B-
+M!`*+&(D=`````$F+A"0@"P``2`5,"```2`'"1(LR1(DU``````^V1"00B00D
+M10^VST6)\(G91(GJ2,?'`````+@`````Z`````!F@7TXX0%U#P^V13J#Z!$\
+M`0^&^0```,9%)`+VA98````@=&E(BTUH1(BYFP````^V1"009HF!D````(G8
+MP>`(00^VU0'09HF!E````(G>0(#F`$R)Z`^VU(T$%F:)@98```")VL'J$,'B
+M"$2)Z,'H$`^VP`'"9HF1F````$$/ML9FB8&2````Z8,```!F@7TXX0%U"P^V
+M13J#Z!H\`79P2(GN3(GGZ`````#K8V9FD(3`>5Q!@/\?=RI)BP0DBY!8`0``
+MB14`````N`$```!$B?G3X"'"=#A)BP0DB9!8`0``ZRQ)BP0DBY!@`0``B14`
+M````00^VSX/I(+@!````T^`APG0*28L$)(F08`$``$B+7"0X2(ML)$!,BV0D
+M2$R+;"103(MT)%A,BWPD8$B#Q&C#9F9FD&9FD&9FD&9FD$%7059!54%455-(
+M@^P82(G]2(E\)`A$#[>OR@P``$B+A[`+``"+`(D%`````&8E_P]FB8?*#```
+M9D0YZ'4^2(L'BX!0`0``B04`````2(L7)?#__P")@E`!``"Z`````(7`#X1$
+M!```2(M\)`CH`````+H!````Z3`$``!F@;_*#```_P\/A:4#``#IO@,``$R+
+MA5`+``!!@\4!9D0[K<X,``"X`````$0/0^A(BY6P"P``2(/"!$$/M\6+#()!
+MB<E!P>D00?;!"`^$M@```$B+10"+B%`!``")#0````!(BU4`B<@E\/__`(F"
+M4`$``(7`=&V`?4,`=&>)SO?&``$``'4NOP````#WQ@```0!T1.L?#[?7C4H(
+M2(GP2-/XJ`%U%(U*$$B)\$C3^*@!=0?K([\`````#[?'2(G"2,'B!TB-A,)0
+M`0``2(U<!0A(A=MU'>L,@\<!#[9%0V8Y^'>R2(M\)`CH`````.G0`@``2(M\
+M)`CH`````(A##F9FD.F[`@``08G/9D&!Y_\/00^WQTAIT+`$``!-BT00($B-
+M-,4`````2(N%F`@``$@!\$B+&$B%VP^%QP```$$/M_>)\DC'QP````"X````
+M`.@`````9H-]9``/A&("``!!OP````!!#[;73(TTU0````!(BX68"```3`'P
+M2(LP2(7V=&I(:=JP!```2`.=4`L```^V3B5%#[;G1(GB2,?'`````+@`````
+MZ`````!,B?!(`X68"```2(LXZ`````"+BR0$``"+DR`$``!$BXLL!```1(N#
+M*`0``$2)YDC'QP````"X`````.@`````08/'`4$/ML=F.T5D#X/"`0``Z6'_
+M__](B?!(`X68"```2(L`#[=0(&:!^H,`=W@/M\(/MH0%>`<``#S_=&EF@_I_
+M=R`/ML!(C13`2(T4D$C!X@-(`Y5("```2(M"4`^V0`CK+TB)\$@#A9@(``!(
+MBP`/MT`@#[:$!7@'``!(P>`(2`.%<`@``$B+@(`````/MD`(//]T$`^VT$AC
+MPH"\!?P'``#_=1S&0R0&2(G?Z`````!(B=Y(B>_H`````.D1`0``2&/"#[:$
+M!?P'``!(B<)(P>('2(V$PE`!``!(C7P%"$V%P'0-0?;!`K@`````3`]$P/9'
+M"@(/A=8```!!#[?'B40D%$R)PHG&Z`````!(BX7`````2#D$)'180;P`````
+M08/$`4B+`$@Y!"1U\T6$Y'1`0;X`````2(L\).@`````2(U(\$B+-"1(BU8(
+M2(E&"$B),$B)4`A(B0)(.=FX`0```$0/1/!!@.P!=<M%A/9U7X![)(%T66:!
+M>S+_#V9FD'1.2(L$)$B+4`A(C4,02(L,)$B)00A(B4L02(E0"$B)`D2)^F;!
+MZ@6#XG^+3"04@^$?N`$```!(T^`)1)5HZQ!(C;?`````2(DT)&9FD&:09D0Y
+MK<H,```/A4+\__](C87`````2#F%P````'1!2(G#2(G?Z`````!(C7#P#[=.
+M,HG*9L'J!8'B_P<``(/A'[@!````2-/@]]`A1)5H2(GOZ`````!(.9W`````
+M=<)(B>_H`````+H!````B=!(@\086UU!7$%=05Y!7\-F9I!54TB#[`A(BY<`
+M"```2(M""(LHB2T`````]\4```"0=`9(BT((B2A(BY\`"```]\4```0`="M(
+MBP.+D%`!``")%0````"%TG082(L#B9!0`0``2(L#BX!0`0``B04`````]\4`
+M``@`=#=(@</`#@``2(L#BY!0`0``B14`````A=)T'4B+`XF04`$``$B+`XN`
+M4`$``(D%`````&9FD&:02(N[``@``+X`````Z`````!(BYL`"```2(G?Z```
+M``!(C;O`#@``Z`````!(B[L`"```O@$```#H`````(7M#Y7`#[;`2(/$"%M=
+MPV9F9I!!5T%6055!5%532(/L.$F)_D"(="0?1`^V[DECQ4B)PDC!X@1(P>`'
+M2"G02`'X2(NHX`P``$0/MKC:#```2(L'0(#^`W8,QX!P`0``Q`$``.L*QX!P
+M`0``J`$``$B)1"0P2`5T`0``2(E$)"!(BU0D,(N"=`$``(D%`````$2)Z8/A
+M`[L'````T^-!B=Q!"<1$B:)T`0``O^@#``#H`````/?31"'C2(M,)#")F70!
+M``"`?"0?`W970HT$K0````!(F$B-E`'0`0``BP*)!0````"#R`B)`D*-'.T`
+M````2&/;2(V$&0`"``#'`#@```"_$"<``.@`````2(M4)#!(C80:!`(``,<`
+M`````.M:0HT$K0````!(F$B+3"0P2(V4`=`!``"+`HD%`````(/("(D"0HT<
+M[0````!(8]M(C809``(``,<`.````+\0)P``Z`````!(BU0D,$B-A!H$`@``
+MQP``````2(7M#X27`P``08!^0P!T,+L`````9I`/MLL/MD4,2-/XJ`%T$KH!
+M````B<Y,B??H`````&9FD(/#`4$X7D-WU_9%"@%T<$B)[DR)]^@`````1(GN
+M3(GWZ`````!)8\5(B<)(P>($2,'@!T@IT$J-%#"+@@`-``"I```0`'0+)?__
+M[_^)@@`-``!(B>Y,B??H`````$ECQ4B)PDC!X@1(P>`'2"G02<>$!N`,````
+M````Z>H"``!(Q\#^____1(GI2-/`1"#XB$0D+P^%G@$``+H`````O@8```!(
+MB>_H`````$2)[DR)]^@`````26/%2(G"2,'B!$C!X`=(*=!*C10PBX(`#0``
+MJ0``$`!T"R7__^__B8(`#0``2(U%,$@Y13!U^DB-14!(.45`#X04`0``0;\`
+M````2(D$)$B+/"3H`````$F)Q(!X<P!T-4&-7P%!@?]_EI@`=R5,B??H````
+M`+\!````Z`````!!@'PD<P!T"X/#`8'[@9:8`'7;08G?28M$)$!(A<`/A)@`
+M``!(QT!H`````$'V1"1,!'4:3(GWZ`````!)BW0D0+H!````3(GWZ`````!)
+MBU0D0`^V@LL```"-!(`/ME("`=!(F`^VB`````!!#[96.D$/MG8Y2,?'````
+M`+@`````Z`````!)BU0D0$F+M@`(``"_`0```.@`````28M4)$!)B[8`"```
+MOP8```#H`````$G'1"1``````(!M#0%,B>9,B??H`````$B+%"1(.55`#X7V
+M_O__2(GN3(GWZ`````!)8\5(B<)(P>($2,'@!T@IT$G'A`;@#````````$&`
+M?D,`#X0G`0``0;\`````#[9,)"](B4PD$$B+1"0P2`70`0``2(E$)`A%B?U!
+M#[;O2(M$)!")Z4C3^*@!=0M$.'PD'P^%U0```$&`_0-V:$B+1"0PQX!P`0``
+MQ`$``$B+5"0@BP*)!0````")Z8/A`XT,2;L'````T^-!B=Q!"<1$B2*_Z`,`
+M`.@`````]]-$(>-(BTPD((D9C12M`````$ACTD@#5"0(BP*)!0````"#R`B)
+M`NMG2(M$)##'@'`!``"H`0``2(M4)""+`HD%`````(GI@^$#C0Q)NP<```#3
+MXT&)W$$)Q$2)(K_H`P``Z`````#WTT$AW$B+3"0@1(DAC12M`````$ACTD@#
+M5"0(BP*)!0````"#R`B)`D&#QP%!C44!03A&0P^'^?[__TB#Q#A;74%<05U!
+M7D%?PV9F9I!F9F:005154TF)_$B)]0^V=T-`A/9T)@^V50R[`````/;"`70.
+MZQ9(B=")V4C3^*@!=0^#PP%`./-U[.L%NP````#V10L"=0I(C45`2#E%0'5E
+M2(GOZ`````"$P'1.3(GGZ`````!(B<9(A<!T24B+54A(B45(2(U%0$B)!DB)
+M5@A(B3*`10T!2(EN4,9&2`7&1DD`QD9Q#[D!````N@$```!(B>_H`````.L+
+M#[;S3(GGZ`````!;74%<PV9F9I!F9F:0059!54%455-(B?U!B?5$#[;V0HT$
+MM0````!,8^"[`````+\0)P``Z`````!!@/T#=AY(BT4`2`70`0``3`'@BP")
+M!0````#!Z!2#X`'K'9!(BT4`2`70`0``28T$!(L`B04`````P>@4@^`!A,!U
+M"H/#`6:!^RP!=:A$B?9(B>_H`````$B)[^@`````26/&2(G"2,'B!$C!X`=(
+M*=!(`>CV@-D,```!=`](B[#@#```2(GOZ`````!;74%<05U!7L-F9F:09F9F
+MD&9FD&9FD$%6055!5%5308GU2(G]1`^V]DECQDB)PDC!X@1(P>`'2"G03(ND
+M!^`,``!-A>0/A`@!``!(Q\#^____1(GQ2-/`081$)`P/A?````!!@'PD#0`/
+MA.@!``!!O0````!)C5PD0$B)W^@`````2(G"2(M#"$B)4PA(B1I(B4((2(D0
+M@'I)``^%G@````^W0CA(@[S%>`,```!U!TB#>D``=',/MT(X2(N$Q7@#``!(
+M@[B``````'1&QH+```````^V2DA(B<B#X`9(@_@&=07VP0%U5@^V2DA(B<B#
+MX`9(@_@$=4;VP0%T0<9"2@/&0DL$2(G62(GOZ`````#K+$B+4D!(B[4`"```
+MOP0```#H`````.L5#[=2.$B+M0`(``"_`@```.@`````08/%`44X;"0-#X8)
+M`0``Z2?___]"C02U`````$QCX+L`````9F9FD+\0)P``Z`````!!@/T#=B!(
+MBT4`2`70`0``3`'@BP")!0````#!Z!2#X`'K'F9FD$B+10!(!=`!``!,`>"+
+M`(D%`````,'H%(/@`83`=0J#PP%F@?LL`76G1(GV2(GOZ`````!(B>_H````
+M`$ECQDB)PDC!X@1(P>`'2"G03(ND!>`,``!-A>1T9H!]0P!T++L`````#[;+
+M00^V1"0,2-/XJ`%T#[H`````B<Y(B>_H`````(/#`3A=0W?900^VQ4B)PDC!
+MX@1(P>`'2"G02(V$!=`,``!)B40D($'V1"0*`70-3(GF2(GOZ`````!FD%M=
+M05Q!74%>PV9F9I!F9I!(@^P(3(L'1(M/-$$/MG!#0(3V=&A)C8#0#```N0``
+M``!(.?AU(.M5#[;!2(G"2,'B!$C!X`=(*=!)C80`T`P``$@Y^'0(@\$!0#CQ
+M==J`^0-V+TF+`$@%T`$``$B-%(T`````@>+\`P``2`'0BP")!0````#!Z!2#
+MX`'K+;D`````28L`2`70`0``2(T4C0````"!XOP#``!(`="+`(D%`````,'H
+M%(/@`83`=!`/MO%$B<I,B<?H`````.L+#[;Q3(G'Z`````!(@\0(PV:04TB#
+M[&!(B?M(C4PD74B-5"1>2(UT)%\/MW\\2(U$)%)(B40D.$B-1"142(E$)#!(
+MC40D3$B)1"0H2(U$)$Y(B40D($B-1"182(E$)!A(C40D6DB)1"002(U$)%M(
+MB40D"$B-1"162(D$)$R-3"1<3(U$)%#H``````^V1"1?2(T4P$B-%)!(P>(#
+M2(MS($B-NR@(``"Y`0```.@`````#[94)%U(P>((2(MS($B-NU`(``"Y`0``
+M`.@`````#[=4)%A(P>(#2(MS($B-NW@(``"Y`0```.@`````#[=$)%!(C12`
+M2(T44$C!X@1(BW,@2(V[4`D``+D!````Z``````/ME0D7`^W1"102`^OT$B-
+M%%)(P>("2(MS($B-N^`(``"Y`0```.@`````2(MS($B-NP@)``"Y`0```+H`
+M`@``Z``````/ME0D6TC!X@5(BW,@2(V[>`D``+D!````Z`````!(BW,@2(V[
+MH`D``+D!````N@`!``#H``````^W5"162(T4DDC!X@-(BW,@2(V[R`D``+D!
+M````Z``````/MU0D6$@!TDB+<R!(C;OP"0``N0$```#H``````^V5"1?2`'2
+M2(MS($B-NR@*``"Y`0```.@`````#[94)%U(`=)(BW,@2(V[8`H``+D!````
+MZ``````/ME,^2`'22(MS($B-NY@*``"Y`0```.@`````#[=4)%A(P>(&2(MS
+M($B-N]`*``!!N`$```"Y0````.@`````2(MS($B-NP`+``!!N`$```"Y``$`
+M`+H`20``Z``````/MU0D6$AITK`$``!(BW,@2(V[,`L``$&X`0```+F`````
+MZ``````/MU0D5$C!X@)(BW,@2(V[8`L``$&X`0```+D$````Z``````/MU0D
+M4DC!X@)(BW,@2(V[D`L``$&X`0```+D$````Z``````/ME0D6\'B#$B+<R!(
+MC;O`"P``0;@!````N0@```#H`````$B+<R!(C;OP"P``0;@!````N0@```"Z
+M```(`.@`````#[=4)%9(:=*,`0``2(MS($B!PR`,``!!N`$```"Y"````$B)
+MW^@`````N`````!(@\1@6\-FD$B#[`A(BY>X````2(FWN````$B-A[````!(
+MB09(B58(2(DRZ`````!(@\0(PV9FD$%7059!54%455-(@^P82(G]2,=$)!``
+M````2(M$)!`/MI0H_`<``(#Z_P^$Z0````^VRDB)R$C!X`=(C83(4`$``$B-
+M1`4(2(E$)`@/MO)(8\9(B<)(P>('2(T$PH"\!64!````#X2N````0;P`````
+M2(G(2,'@!TB-!,A,C;0%F`$``$R-+"A(8\9(B<)(P>('2(T$PDR-O`50`0``
+M3(GWZ`````!(B<-)BX6@`0``28F=H`$``$R),TB)0PA(B1A(BU-`2(72=!5(
+MB[4`"```OP4```#H`````(!+3`)(B=J^(0```$B+?"0(Z`````"`>W,`=!A(
+MB>_H`````+\!````Z`````"`>W,`=>A!@\0!13AG%7>%2(-$)!`!2(-\)!`$
+M#X7O_O__2(GOZ`````!(@\086UU!7$%=05Y!7\-F9F:09F9FD&9FD&9FD$%7
+M059!54%455-(@^P828G]2(E\)!!,BV=028LL)$B+A;`+``!$BS!(B?Y(B>_H
+M`````$F-72!!OP````!).5T@=!Y(B=_H`````$F)QTF+12!,B7@(28D'28E?
+M"$V)?2!)BU5`2(72=$1!N/__``!-A?]T!44/MT<R#[:"RP```(T$@`^V4@(!
+MT$B8#[:(``````^V53H/MG4Y2,?'`````+@`````Z`````#K3$&X__\``$V%
+M_W0%10^W1S(/MD5!28M4)"`/ME((C02"C02`00^V57$!T$B8#[:(``````^V
+M53H/MG4Y2,?'`````+@`````Z`````!-A?\/A,H!``!%#[=G,DUIY+`$``!,
+M`Z50"P``28V<)"`$``!,B?_H`````(M+!$$/MW<R1(M+#$2+0PA!BY0D(`0`
+M`$C'QP````"X`````.@`````9H-]9``/A#T!``!!O`````!(C86P````2(E$
+M)`AF9F:000^WU$B+A9@(``!(BQS02(7;#X0``0``00^W?3AF.WL@#X7Q````
+M#[>5R@P``$$YUG1B#[>US@P``$B+C;`+``"#P@$Y\K@`````#T/0C4(!BP2!
+MJ0``"`!U-68E_P]F1#G@=2M).=]U*TB)[^@`````00^W=S)(Q\<`````N```
+M``#H`````.G0````9F:01#GR=:QF@?^#`&9FD&9FD'=V#[?'@+P%>`<``/]T
+M:4B#?"00`'1A00^V14BH`718J`1T5$PY^W0L2(L#2(M3"$B)4`A(B0)(BX6P
+M````2(E8"$B)`TB+1"0(2(E#"$B)G;`````/MW,R2(GOZ``````/MW,R2(GO
+MZ`````!FQT,R_P]!@&US`4&#Q`%F1#EE9`^'V?[__TB#?"00`'0N00^V14BH
+M`70EJ`1T(4'&A<`````$28L728M'"$B)0@A(B1!,B?Y,B>_H`````$B#Q!A;
+M74%<05U!7D%?PV9F9I!!5T%6055!5%532(/L:$B)^\9'2P#&1TH`QH>A#@``
+M`$B-E]`,``"X`````&9F9I#&!!``2(/``4@]P`$``'7P2(V#L````$B)@[``
+M``!(B8.X````2(V#P````$B)@\````!(B8/(````3(VCT````$R)H]````!,
+MB:/8````2(V#X````$B)@^````!(B8/H````3(V[\````$R)N_````!,B;OX
+M````2(V#``$``$B)1"1`2(F#``$``$B)@P@!``!,C;,0`0``3(FS$`$``$R)
+MLQ@!``!(C4PD7DB-5"1@2(UT)&$/MWL\2(U$)&)(B40D.$B-1"1D2(E$)#!(
+MC40D5$B)1"0H2(U$)%I(B40D($B-1"1F2(E$)!A(C40D7$B)1"002(U$)%U(
+MB40D"$B-1"182(D$)$R-3"1?3(U$)%;H``````^V1"1AB$-&#[9$)%Z(@ZL`
+M```/MT0D9F:)0V0/MT0D9&:)@\P,```/MT0D8H/H`6:)@\X,```/MT0D5F:)
+M0TP/MT,\9CV`D70*9CV`E`^%RP8``,9#2`3&0T,$QD-)0,9#1P#&@ZH````)
+MQD-$`$B-NR@(``#H`````$B)P4B)@T@(```/MD0D84B-%,!(C1202,'B`TB%
+MTG002(G(Q@``2(/``4B#Z@%U\TB-NU`(``#H`````$B)P4B)@W`(```/MD0D
+M7DB)PDC!X@A(A=)T$$B)R,8``$B#P`%(@^H!=?-(C;MX"```Z`````!(B<%(
+MB8.8"```#[=$)&9(C13%`````$B%TG002(G(Q@``2(/``4B#Z@%U\TB-NP@)
+M``#H`````$B)@R@)``!(C;O@"```Z`````!(B<5(B8,`"0``2(V[4`D``.@`
+M````2(G"2(F#<`D``&:#?"16`'1(N0````!(B6I@#[9$)%^(0EA(BX/8````
+M2(F3V````$R)(DB)0@A(B1`/MD0D7TB-!$!(C6R%`$B!PK````"#P0%F.4PD
+M5G>]2(V[>`D``.@`````2(G"2(F#F`D``(!\)%T`="ZY`````$B+@_@```!(
+MB9/X````3(DZ2(E""$B)$$B#PB"#P0$/MD0D768YR'?72(V[H`D``.@`````
+M2(G"2(F#P`D``$B-B``!``!(BX,(`0``2(F3"`$``$B+="1`2(DR2(E""$B)
+M$$B#PB!(.<IUVDB-N\@)``#H`````$B)PDB)@^@)``!F@WPD6`!T*[D`````
+M2(N#&`$``$B)DQ@!``!,B3)(B4((2(D02(/"*(/!`68Y3"18=]I(C;OP"0``
+MZ`````!(B8,0"@``2(F#&`H```^W="1F9HFS(@H```^W]DB-NQ@*``#H````
+M`$B-NR@*``#H`````$B)@T@*``!(B8-0"@``#[9T)&%FB;-:"@``#[?V2(V[
+M4`H``.@`````2(V[8`H``.@`````2(F#@`H``$B)@X@*```/MG0D7F:)LY(*
+M```/M_9(C;N("@``Z`````!(C;N8"@``Z`````!(B8.X"@``2(F#P`H```^V
+M0SYFB8/*"@``#[9S/DB-N\`*``#H`````$&X`````(![/@!T?[\`````#[?7
+M2(G02,'@!TB-%-!,C8036`$``$B-!!I(C;!0`0``0(A^$,9&$0!(B9A8`0``
+MQD85`,>`V`$```````!(C8P3B`$``$B)B(@!``!(B8B0`0``2(V4$Y@!``!(
+MB9"8`0``2(F0H`$``,9&$@*#QP$/MD,^9CGX=X;&0T<`QH/\!P``_\:#_0<`
+M`/_&@_X'``#_QH/_!P``_X!\)&$`#X23````O@`````/M\Y(C03)2(T$@4C!
+MX`-(BY-("```QD0"2P%(BY-("```QD002@!(BY-("```QD00</](BY-("```
+MQD009O](BY-("```9L>$$+@``````$C'A,MX`P```````$B)P4@#BT@(``!(
+MC5$@2(E1($@#@T@(``!(C5`@2(E0*(/&`0^V1"1A9CGP#X=R____9L>#J```
+M````N`````#&A!AX!P``_TB#P`%(/80```!U[(!\)%X`='Z^``````^WUDC!
+MX@A(BX-P"```9L=$$$H$`$B+@W`(``#&1`)"`$B+@W`(``#&1`)#_TB+@W`(
+M``#&1`),_TB)T4@#BW`(``!(C4$H2(E!*$B)T4@#BW`(``!(C4$H2(E!,$B+
+M@W`(``!,B80"@````(/&`0^V1"1>9CGP=X=(C;/X"@``2(V[T`H``.@`````
+M2(F#\`H``$B-LR@+``!(C;L`"P``Z`````!(B8,@"P``2(VS6`L``$B-NS`+
+M``#H`````$B)@U`+``!(C;.("P``2(V[8`L``.@`````2(F#@`L``$B-L[@+
+M``!(C;N0"P``Z`````!(B8.P"P``2(VSZ`L``$B-N\`+``#H`````$F)Q$B)
+M@^`+``!(BZOH"P``@'PD70!T2T&]`````$R)_^@`````3(E@$$B):!A(BY/X
+M````2(F#^````$R).$B)4`A(B0))@<0`$```2('%`!```$&#Q0$/MD0D769$
+M.>AWNTB-LQ@,``!(C;OP"P``Z`````!)B<1(B8,0#```2(NK&`P``$&]````
+M`$B+?"1`Z`````!,B6`02(EH&$B+DP@!``!(B8,(`0``2(M,)$!(B0A(B5`(
+M2(D"28'$```!`$B!Q0```0!!@\4!9D&#_0AUN$B-LT@,``!(C;L@#```Z```
+M``!(B8-`#```3(NC2`P``&:#?"18`'1(2(G%0;4`3(GWZ`````!(B6@03(E@
+M&$B+DQ@!``!(B8,8`0``3(DP2(E0"$B)`DB!Q8P!``!)@<2,`0``08/%`69$
+M.6PD6'>^2(/$:%M=05Q!74%>05_#9F:09F:09F:005=!5D%505154TB#[`A)
+MB?U,BZ>`````28LL)$B+A;`+``!$BSA(B?Y(B>_H`````$F-72A).5TH#X2Q
+M````2(G?Z`````!)B<9)BT4H3(EP"$F)!DF)7@A-B74H387V#X3[`0``#[9-
+M04F+1"0@#[9`"(T,B`^V53H/MG4Y10^W1C)(Q\<`````N`````#H`````$4/
+MMV8R36GDL`0``$P#I5`+``!)C9PD(`0``$R)]^@`````BTL$00^W=C)$BTL,
+M1(M#"$&+E"0@!```2,?'`````+@`````Z`````!F@WUD`'4]Z54!``!F9F:0
+M#[9-04F+1"0@#[9`"(T,B`^V53H/MG4Y0;C__P``2,?'`````+@`````Z```
+M``#I;`$``$&\`````$B-A;````!(B00D00^WU$B+A9@(``!(BQS02(7;#X3E
+M````00^W?4!F.WL@#X76````#[>5R@P``$$YUW1?#[>US@P``$B+C;`+``"#
+MP@$Y\K@`````#T/0C4(!BP2!J0``"`!U,F8E_P]F1#G@=2A).=YU*$B)[^@`
+M````00^W=C)(Q\<`````N`````#H`````.G.````1#GZ=:]F@?^#`&9F9I!W
+M8`^WQX"\!7@'``#_=%-).=YT*TB+`TB+4PA(B5`(2(D"2(N%L````$B)6`A(
+MB0-(BP0D2(E#"$B)G;`````/MW,R2(GOZ``````/MW,R2(GOZ`````!FQT,R
+M_P]!@&U$`4&#Q`%F1#EE9`^']/[__TF+%DF+1@A(B4((2(D00<9%301,B?9,
+MB>_H`````.LO#[9-04F+1"0@#[9`"(T,B`^V53H/MG4Y0;C__P``2,?'````
+M`+@`````Z`````!(@\0(6UU!7$%=05Y!7\.00(#^`1G`]]`E```,@$B+5PB)
+M0@S#D)"0D)"0D)"0D)!32(M<)"!,BU0D*$R+7"0X9H'_(B=W6V:!_R`G#X.0
+M````9H'_0"$/A(4```!F@?]`(7<>9H'_("%T=V:!_R(A='!F@?]0!W5O9F9F
+MD&9FD.M@9H'_1"%T66:!_T0A9I!R5HV'\-C__V:#^`%W2F:0ZT!F@?^")W0Y
+M9H'_@B=FD'<29H'_)"=T*6:!_X`G9I!U)NL>9H'_@)%F9F:09F:0=!!F@?^`
+ME'0)9H'_@')FD'4&Q@84Q@(`Q@$$9H'_4`=T!<8#`.L)#[8&B`-F9F:09D''
+M`H``9D''`P``0<8!($B+1"009L<```$/MA9(BT0D&(@0#[8&9D$#`F9!`P-(
+MBU0D,&:)`F9!B0!!#[<22(M$)$!FB1!!#[<2@\(+2(M$)$AFB1!;PV9F9I!F
+M9F:0\\-F9F:09F9FD&9FD&9FD$&Y`````$$/MH0Y^`<``#S_=&`/ML!(P>`(
+M28G`3`.'<`@``$&`>#H`=#ZY``````^VP4F+5,!82(72=".+0D@E`/__`#T`
+M`/\`=13V0DL$=`Y(BT)`2(7`=`5`B'`!D(/!`4$X2#IWQT&(L/@```"#Q@%)
+M@\$!28/Y!'6)2(N'``@``$@Y^'4,2(VXP`X``.AK____\\-F9I!F9I!F9I"X
+M`````,8$.`!(@\`!2#T``0``=?#&1T/_QD=,_TB-1RA(B4<H2(E',,-F9I!F
+M9I"X`````,8$.`!(@\`!2#TH`0``=?#&1W#_QD=F_\9'<A](C4<@2(E'($B)
+M1RC#9I!(BP9(BY<(`0``2(F'"`$``$B!QP`!``!(B3A(B5`(2(D"2,<&````
+M`,-F9I!F9I!(BP9(BY?X````2(F'^````$B!Q_````!(B3A(B5`(2(D"2,<&
+M`````,-F9I!F9I!(BP9(BY<8`0``2(F'&`$``$B!QQ`!``!(B3A(B5`(2(D"
+M2,<&`````,-F9I!F9I!32(G[@'Y,_P^%_@```$B+!T2+@!@!``!$B04`````
+MN0````"X`0```(G'T^=!A?AU/HA.3$B+$XGX1`G`B8(8`0``2(L#BX!8`0``
+MB04`````B?HAP@^$K````$B+`XF06`$``.F>````9F:09F:0@\$!@_D@=:Q(
+MBP-$BX`<`0``1(D%`````+$`9F:09I"X`0```(G'T^=!A?AU,HA.3$B+$XGX
+M1`G`B8(<`0``2(L#BX!@`0``B04`````B?HAPG1$2(L#B9!@`0``ZSF0@\$!
+M@_D@=;A(BT,(BP!(BP.+D!P!``"+L!@!``")-0````")\8GR2,?'`````+@`
+M````Z`````"`0T0!6\-FD%-(B?L/ME9(2(G0@^`&2(/X!G4,]L(!#X0$`0``
+M9F:0@'YF_P^%]P```$B+`T2+@!@!``!$B04`````N0````"X`0```(G'T^=!
+MA?AU.(A.9DB+$XGX1`G`B8(8`0``2(L#BX!8`0``B04`````B?HAP@^$I0``
+M`$B+`XF06`$``.F7````@\$!@_D@=;)(BP-$BX`<`0``1(D%`````+$`B<JX
+M`0```(G'T^=!A?AU-(U"((A&9DB+$XGX1`G`B8(<`0``2(L#BX!@`0``B04`
+M````B?HAPG1#2(L#B9!@`0``ZSB#P0&#^2!UM$B+0PB+`$B+`XN0'`$``(NP
+M&`$``(DU`````(GQB?)(Q\<`````N`````#H`````(!#1`%;PV9F9I!F9I!F
+M9I!F9I!(@^P(2(V7$`$``+@`````2#F7$`$``'002(G7Z`````!(QT`@````
+M`$B#Q`C#9I!(@^P(#[?62(N'F`@``$C'!-``````B?)FP>H%#[?V@>+_!P``
+MB?&#X1^X`0```$C3X/?0(827H`@``$B!QQ@*``#H`````$B#Q`C#9F9FD$B#
+M[`@/MD8(#[:T!_P'``#&A`?\!P``_P^W]DB!Q\`*``#H`````$B#Q`C#9F9F
+MD$B#[!A(B5PD"$B);"002(G[2(GU#[9&3#S_=!,/MO!(BS_H`````,9%3/^`
+M:T0!2(M<)`A(BVPD$$B#Q!C#9I!(@^P82(E<)`A(B6PD$$B)^TB)]0^V1F8\
+M_W03#[;P2(L_Z`````#&16;_@&M$`4B+7"0(2(ML)!!(@\08PV:055-(@^P(
+M2(G]2(GS2#E^*'0N2(-^<`!T)X"^@`````!U'H%^-``0``!W"TB-=G#H````
+M`.L*2(UV<.@`````D&:!>SCA`0^%E`````^W0R!F/8,`#X=X````#[?`#[:$
+M!7@'```\_W1I2(N-2`@``(![)`!U7`^VP$B-%,!(C1202(T$T0^V4SJ`^@=T
+M&X#Z!W<'@/H&=2_K&(#Z#&9FD'0@@/H-=2#K$&:#8&+]9I#K%6:#2&("ZPYF
+M@V!B]V:0ZP5F@TAB"&:!>SCA`69FD'4.@'LZ"W4(QD,D`&9F9I!(BWLH2(G>
+M_Y.@````9H%[..$!=4L/MD,Z@^@1/`%W0`^W0R!F/8,`=W8/M\`/MH0%>`<`
+M`#S_=&</ML!(P>`(2(G&2`.U<`@``(!^1`!U4$B)[^@`````ZT9F9I!F9I`/
+MMT,@9CV#`'<V#[?`#[:$!7@'``!(BXU("```//]T(`^VP$B-%,!(C1202(TT
+MT8!^<P!U"TB)[^@`````9F:02(/$"%M=PV9FD&9FD&9FD$B#[!A(B5PD"$B)
+M;"002(G[2(V_T````+T`````2#F[T````'0GZ`````!(B<5(B<?H`````,9%
+M)(!(B=_H`````$B)17C&A:@````!2(GH2(M<)`A(BVPD$$B#Q!C#D%532(/L
+M"$B)_4B-G\`*``!(B=_H`````(3`#X70````2(G?Z`````")P;@`````B<:`
+MO"C\!P``_W4*.$5'<Q*(14?K#8/&`4B#P`%(@_@$==U`@/X$#X24````0`^V
+MQHB,!?P'```/M_E(B?A(P>`'2(V$^%`!``!(C50%"+@`````Q@00`$B#P`%(
+M/8@```!U\`^WP4B)PDC!X@=(C03"2(V,!8@!``!(C10H2(F*B`$``$B)BI`!
+M``!(C80%F`$``$B)@I@!``!(B8*@`0``0(BR8`$``$B)^$C!X`=(C83X4`$`
+M`$B-1`4(ZP=FD+@`````2(/$"%M=PV9F9I!(@^P82(D<)$B);"0(3(ED)!!(
+MB?U(C9]0"@``2(G?Z`````"$P`^%U````$B)W^@`````B<*X`````&9FD&:0
+MB<.`O"AX!P``_W45#[;`9CF%J````',89HF%J````.L/@\,!2(/``4@]@```
+M`'70@/N`#X2'````#[;#B)0%>`<```^WPDB-%,!(C1203(TDU0````!,B>=(
+M`[U("```Z`````!(BY5("```#[;#9D&)1!0X2(N%2`@``$'&1`1*`$B+A4@(
+M``!!QD0$9/](BX5("```0<9$!&7_@'U+`74-2(N%2`@``$&`3`1,`4R)X$@#
+MA4@(``#K"F9FD&:0N`````!(BQPD2(ML)`A,BV0D$$B#Q!C#9F9FD&9F9I!3
+M2(G[Z.?V__](B[L`"```Z`````!;PV9FD&9FD&9FD$B#[!A(B1PD2(EL)`A,
+MB60D$$B)_4B-GX@*``!(B=_H`````(3`#X6T````2(G?Z`````")PDB)Z$&\
+M@/___Y"`N/@'``#_=!1!@\0!2(/``4&`_(0/A(4```#KXT&`_(1T?4$/ML2(
+ME`5X!P``#[?:2,'C"$B)WT@#O7`(``#H`````$B+E7`(``!!#[;$9HE$$T!(
+MBX5P"```QD0#0@!(BX5P"```9L=$`TH``$B+A7`(``!FQX0#Z```````2(N]
+M``@``+X`````Z`````!(B=A(`X5P"```ZPEF9F:0N`````!(BQPD2(ML)`A,
+MBV0D$$B#Q!C#9F9FD&9F9I!54TB#[`A(B?T/MT9`#[:<!W@'``#&A`=X!P``
+M_P^W\TB-OX@*``#H``````^WVTC!XPA(B=Y(`[5P"```@'Y,_W0(2(GOZ```
+M``!(B[T`"```O@````#H`````$B#Q`A;7<-F9F:09F:09F:09F:04TB)\X!^
+M0_]T%$B-MH@```!(BW\HZ`````#&0T/_6\-32(GS@'YP_W042(VVZ````$B+
+M?RCH`````,9#</];PTB#[!A(B1PD2(EL)`A,B60D$$B)^TF)]`^W1C@/MJP'
+M>`<``$B+E,=X`P``2(72=!9(@[J``````'4,2,>$QW@#````````00^W1"0X
+MQH0#>`<``/\/M_5(C;M0"@``Z``````/M\5(C13`2(T4D$B-+-4`````2(GN
+M2`.S2`@``(!^9O]T"$B)W^@`````3(GF2(G?Z`````!(BX-("```QD0%2@!(
+MBX-("```QD0%2P%(BQPD2(ML)`A,BV0D$$B#Q!C#9F9FD&9F9I!F9I!(@^PH
+M2(E<)`A(B6PD$$R)9"083(EL)"!)B?U(B?-F@7XXX0$/A<P````/MD8Z@^@1
+M/`$/A[T````/MT8@9CV#``^':@$```^WP`^VA`=X!P``2(N7<`@``#S_#X10
+M`0``#[;`2,'@"$B-+`*`;40!3(UE*$R)Y^@`````2(G"2#G8=4Q(B>Y,B>_H
+M`````$P[92@/A!@!``#'A8@`````$GH`2,>%F`````````!(B:V@````2(VU
+MB````$F+?2CH`````,9%0P#IXP```&:02(M%*$B)4`A(B0),B6((2(E5*$B+
+M$TB+0PA(B4((2(D0Z;L````/MT,@9CV#``^'K0````^WP$$/MH0%>`<``$F+
+MC4@(```\_P^$D@````^VP$B-%,!(C1202(TLT8!M<P%,C64@3(GGZ`````!(
+MB<)(.=AU2DB)[DR)[^@`````3#ME('1:QX7H`````!)Z`$C'A?@`````````
+M2(FM``$``$B-M>@```!)BWTHZ`````#&17``ZRAF9F:09F:02(M%($B)4`A(
+MB0),B6((2(E5($B+$TB+0PA(B4((2(D02(M<)`A(BVPD$$R+9"083(ML)"!(
+M@\0HPV9FD&9FD$B#[!A(B5PD"$B);"002(G]2(GS#[=.,F:!^?\/=!$/M]%(
+MBX>8"```2(,\T`!U(`^WR4B)VDC'Q@````!(Q\<`````N`````#H`````.LD
+M#[?QZ`````!FQT,R_P](B=Y(B>_H`````$B)WDB)[^@`````2(M<)`A(BVPD
+M$$B#Q!C#9F9FD&9FD&9FD&9FD$%7059!54%455-(@^P(28G^28G50(AT)`=(
+MBQ]F@WMD``^$P````$&\`````$&______T$/M]1(BX.8"```2(LLT$B%[0^$
+MC0````^W=2!F@?Z#`'=.#[?&#[:$`W@'```\_W0_9H/^?W<=#[;02(N+2`@`
+M`$B-!-)(C02"2(M$P5`/MD`(ZQ\/ML!(BY-P"```2,'@"$B+A!"`````#[9`
+M".L#1(GX03I&"'4K387M=`=F03MU.'4?#[9$)`>(121!#[?T2(G?Z`````!(
+MB>Y(B=_H`````$&#Q`%F1#EC9`^'3/___X!\)`>!#X0:`0``2(N#L````$B-
+MJ[````!(.>@/A`,!``!!O`````"008/$`4B+`$@YZ'7T9D6%Y`^$Y@```$&_
+M_____V9F9I!(B>_H`````$B)Q@^W>"!F@?^#`'=.#[?'#[:$`W@'```\_W0_
+M9H/_?W<=#[;02(N+2`@``$B-!-)(C02"2(M$P5`/MD`(ZQ\/ML!(BY-P"```
+M2,'@"$B+A!"`````#[9`".L#1(GX387M="1F03M].'0=2(N#N````$B)L[@`
+M``!(B2Y(B48(2(DPZSMF9I!!.D8(=1J`?B2`=0@/MD0D!XA&)$B)W^@`````
+MZQIFD$B+@[@```!(B;.X````2(DN2(E&"$B),&9!@^P!=`U(.:NP````#X4D
+M____2(/$"%M=05Q!74%>05_#9F:09I!54TB#[`A(B?5F@7XXX0$/A:L````/
+MMD8Z@^@1/`$/AYP````/MT8@NO\```!F/8,`=PL/M\`/MI0'>`<``(G02,'@
+M"$B)PT@#GW`(``"`>T/_=4D/MI68````C002A-*Z"`````]$P@^VP&G`0$(/
+M`(F#B````$C'@Y@`````````2(F;H````$B-LX@```!(BW\HZ`````#&0T,`
+M2(M3,$B):S!(C4,H2(E%`$B)50A(B2J`0T0!Z9\```!F9I`/MT4@NO\```!F
+M/8,`=PL/M\`/MI0'>`<``(G02(T4P$B-%)!(P>(#2(G32`.?2`@``(![</]U
+M20^VE9@```"-!!*$TKH(````#T3"#[;`:<!`0@\`B8/H````2,>#^```````
+M``!(B9L``0``2(VSZ````$B+?RCH`````,9#<`!(BU,H2(EK*$B-0R!(B44`
+M2(E5"$B)*H!#<P%(@\0(6UW#9F9FD&9FD&9FD&9FD$%7059!54%455-(@^P(
+M28G_28GV2(G5QD)+`<9"2@"^!@```$R)]^@`````@'US`'083(G_Z`````"_
+M`0```.@`````@'US`'7H2(M=0$B%VP^$`P$``/9%3`1U&4R)_^@`````2(MU
+M0+H!````3(G_Z`````!(BU5`#[:"RP```(T$@`^V4@(!T$B8#[:(`````$$/
+MME<Z00^V=SE$#[9%<TC'QP````"X`````.@`````2(M50$F+MP`(``"_`0``
+M`.@`````2(N+@````$B%R0^$<P$```^W13A)QX3'>`,```````!(QX.`````
+M`````$B+NY````"Z_____TB)WO_1Z4(!```/MT4X2<>$QW@#````````2,>#
+MB`````````!(B[N0````_]+V14P"=!5(BU5`28NW``@``+\&````Z`````!(
+MQT5``````$C'0V@`````ZSU!#[9'04F+5B`/ME((C02"C02`#[95<0'02)@/
+MMH@`````00^V5SI!#[9W.4C'QP````"X`````.@`````2(M56$B%TG0-#[9%
+M<4C'1,)8`````$B+50!(BT4(2(E""$B)$$$/ME8-@^H!08A6#4B+15A(A<!T
+M!V:#>$H"=5F$TG150;P`````38UN0$R)[^@`````2(G#28M&2$F)7DA,B2M(
+MB4,(2(D82(7;=!_V0TP"=!E(BU-`28NW``@``+\&````Z`````"`8TS]08/$
+M`44X9@UWM4B)[DR)_^@`````2(/$"%M=05Q!74%>05_#2(N3B````$B%T@^%
+MKO[__^G-_O__4TB)\TB+E]@```!(B;?8````2(V'T````$B)!DB)5@A(B3)(
+M@WYX`'0)2(UV>.@`````QH.H`````%O#9F9FD$B#[`A(C9?P````N`````!(
+M.9?P````=`A(B=?H`````$B#Q`C#9F9FD&9FD&9FD$B#[`A(C9<``0``N```
+M``!(.9<``0``=`A(B=?H`````$B#Q`C#9F9FD&9FD&9FD$%44TB#[`A)B?1(
+MBY_P"@``2(''&`H``.@`````B<$/M\!(P>`&2`'828D$)+H`````Q@0"`$B#
+MP@%(@_I`=?(/M\%(@\0(6T%<PY"0D)"02(L'3(L`#[9P0T"$]G1'#[97#+D`
+M````]L(!=`WK-Y!(B=!(T_BH`74(@\$!0#CQ=>Z`^0-V)$B-!(T`````)?P#
+M``!)C80`T`$``(L`B04`````ZR*Y`````$B-!(T`````)?P#``!)C80`T`$`
+M`(L`B04`````P>@4@^`!PY`/M@?`Z`2#X`</MG<"B<*`S@)`]L8$#T7"#[9/
+M`XG"@<H```(`]L$$#T7"B<*`S@A`]L8(#T7"B<*!R@``"`#VP0@/1<*)PH#.
+M!$#VQ@(/1<*)PH'*```$`/;!`@]%P@^V5Q3!XA@)T,-F9F:09F:0A?9^0@^V
+M!X3`=`0\('4Q2(GZN0````#K%V9F9I!F9I`/MD(!2(/"`83`=`0\('40@\$!
+M.?%UZ>L-9F9FD&9FD+@`````P[@!````9F:09I##9F9FD&9F9I!F9F:09F:0
+M08G0A=)T);D`````9F9FD`^V%P^V1P&(!HA6`4B#Q@)(@\<"@\$!1#G!=>3S
+MPV:02(/L&$B)'"1,B60D"$R);"0028G]B?-(BX>`````3(L@3(GGZ`````!(
+MB<;&0#CAQD`Y`<9`.A+&0#L/QD`\H,9`/0,/ML>(1CZ)V,'H$(A&/XG8P>@8
+MB$9`B%Y!00^W14!FB48@3(EF*,=&-`````!(QT9(`````$C'AJ``````````
+M3(GGZ`````!(BQPD3(MD)`A,BVPD$$B#Q!C#D$B#["A(B5PD"$B);"003(ED
+M)!A,B6PD($B)]4&)U$&)S4B+'TB)W^@`````2(G"2(7`=1#&A<$````!QD5*
+M`^F,````QD`XX<9`.0%!@/P!&<#WT(/``HA".D6$[75)N`````!(@WU8`'0$
+M#[9%<8A".P^W13AFB4(@2(E:*,="-`````!(QT)(`````$C'P`````!(B8*@
+M````2(G62(G?Z`````#K*,9".P\/MT4X9HE"($B)6BC'0C0`````2,="2```
+M``!(Q\``````Z\1(BUPD"$B+;"003(MD)!A,BVPD($B#Q"C#9F9FD&9FD$B#
+M[#A(B5PD"$B);"003(ED)!A,B6PD($R)="0H3(E\)#!(B?U%B<5,B0PD08GV
+M08G708G,2(N'@````$B+&$B)W^@`````2(G"2(7`='K&0#CAQD`Y`4&`_@$/
+ME,"#P!&(0CJX#P```$6$_W4$#[9%18A".T2(8CQ,B>$/ML6(0CU!@/X!=1],
+MB>D/ML6(0CY$B>C!Z!"(0C]$B>C!Z!B(0D!$B&I!#[=%0&:)0B!(B5HH2(L$
+M)$B)@J````!(B=9(B=_H`````$B+7"0(2(ML)!!,BV0D&$R+;"0@3(MT)"A,
+MBWPD,$B#Q#C#9F9FD$B#["A(B1PD2(EL)`A,B60D$$R);"083(ET)"!(B?5-
+MB<9!B=1!B<U(BQ](B=_H`````$B)PDB%P'4-QH7!`````<9%2@/K5,9`..'&
+M0#D!08#\`1G`]]"#P`*(0CJX#P```$6$[74$#[9%<8A".P^W13AFB4(@2(E:
+M*,="-`````!(QT)(`````$R)LJ````!(B=9(B=_H`````$B+'"1(BVPD"$R+
+M9"003(ML)!A,BW0D($B#Q"C#9F9FD&9FD$B#["A(B5PD"$B);"003(ED)!A,
+MB6PD($F)_4&)]$B++T"`_@-V.DJ-'.4`````@>/X!P``2(V$'3`"``#'``P`
+M``"_$"<``.@`````2(V$'30"``!$BP!$B04`````ZSA*C1SE`````('C^`<`
+M`$B-A"M0`@``QP`,````OQ`G``#H`````$B-G"M4`@``1(L#1(D%`````$$/
+MMO1(8\9(B<)(P>($2,'@!T@IT$F-C`70#```O_S___]`(GD)0(AY"42)P"4`
+M`#\`/0``$`!U#HGX@\@"B$$)ZR)F9F:02&/&2(G"2,'B!$C!X`=(*=")^H/*
+M`4&(E`79#```2(M<)`A(BVPD$$R+9"083(ML)"!(@\0HPV9FD&9FD&9FD$%5
+M05154TB#[`A(B?U!B?1(BX>`````3(LH9H._\`````!T,(GSO^@#``#H````
+M`$6%Y'0%@_L!=AI,B>]F9I#H`````&:#O?``````=`6#ZP+KTDB#Q`A;74%<
+M05W#D$B#[`A)B?`/MT8@NO\```!F/8,`=PL/M\`/MI0'>`<```^WTDC!X@A(
+M`Y=P"```2(NW(`L```^V0DS!X`A(F$B-A`9,"```BPB)#0````"!X?\````/
+MMD),P>`(2)A(C;0&1`@``(L&B04`````P>`("<B)@O0```!FQX+P``````!,
+MB<;H`````$B#Q`C#D$%6055!5%532(G]28GV28GU#[<&9H7`>0LE`!\``,'X
+M"(A'24B-?71)C54428M%%$B)171(BT((2(E'"(M"$(E'$$R-I;````!)BT4N
+M2(F%L````$B-G8@```!)C54V28M%-DB)A8@```!(BT((2(E#"$B+0A!(B4,0
+M2(M"&$B)0QA(BT(@2(E#(+H*````2(G^Z.GY__^Z!````$R)YDR)Y^C9^?__
+MNA0```!(B=Y(B=_HR?G__V;'16```&;'16(``&9!@[ZR`0```0^4PL'B`P^V
+M14R#X/<)T(A%3$'VA:<````$=`9FQT5@`0!!]H6D`````70H9H--8`)!]H6J
+M`````70%9H--8@%!]H6H`````70*9H%-8``!9F9FD$'VA:0````@=!9F@TU@
+M!$'VA:H````@=`=F@TUB`F:00?:%I````$!T%F:!36"``$'VA:H```!`=`9F
+M@TUB")#&17(!]D5@`70-28N%R````$B)16CK"$&+17A(B45H00^WA=0````E
+M`-```+H``@``/0!0``!U&$$/MX7L````P>`000^WE>H````!T(T4`(F5O```
+M`$B#;6@!QD5D`D'V16H"=!I!#[>%@````*@/=`YF@_@"&<"#P`2(161FD,9%
+M9?]!]D5J!'0?N0````!!#[>%L````$C3^*@!=`.(366#P0&#^0=UYL:%(`$`
+M``!!]H:F````('0900^WAJP```"#X""#^`$9P(/``HB%(`$``+@!````6UU!
+M7$%=05[#9F9FD&9F9I!F9I!F9I!!5T%6055!5%532(/L.(GU28G42(L/C13M
+M`````(U"X(G`2(V<""`"``!(B1PD2(V$""0"``!(B40D"(G23(V\"@`"``!,
+MC:P*!`(``+L`````3(UT)!"#_0-V)8V#'`$``$B+%"2)`K\0)P``Z`````!(
+MBU0D"(L"B04`````ZQV-@QP!``!!B0>_$"<``.@`````08M%`(D%`````$*)
+M!#-(@\,$2(/[''6K2(M$)!!)B00D2(M$)!A)B40D"$B+1"0@28E$)!"+1"0H
+M08E$)!A(@\0X6UU!7$%=05Y!7\-F9F:09F9FD&9F9I!F9I!!5T%6055!5%53
+M2(/L.(GU28G42(L/C13M`````(U"X(G`2(V<""`"``!(B1PD2(V$""0"``!(
+MB40D"(G23(V\"@`"``!,C:P*!`(``+L`````3(UT)!"#_0-V)8V#``$``$B+
+M%"2)`K\0)P``Z`````!(BU0D"(L"B04`````ZQV-@P`!``!!B0>_$"<``.@`
+M````08M%`(D%`````$*)!#-(@\,$2(/[''6K2(M$)!!)B00D2(M$)!A)B40D
+M"$B+1"0@28E$)!"+1"0H08E$)!A(@\0X6UU!7$%=05Y!7\-F9F:09F9FD&9F
+M9I!F9I!!5D%505154TB#["!(B?U!B?9,BR]$#[;F26/$2(G"2,'B!$C!X`=(
+M*=!(`?A(C9#0#```0(AR"$B)N-`,``#&0@H`1(GFZ`````!(B>!(B>+&``!(
+M@\`!2(G32(U,)"!(.<AU[$$/MO9(B>)(B>_H`````$B)Y^@`````26/42(G1
+M2,'A!$C!X@=(*<I(C0PJB8'H#```2(M##$B)A!7L#```08#^`W8\0HT$I0``
+M``!(F$F-A`70`0``BP")!0````")@0`-``!"C03E`````$B828V$!8`!``"+
+M"(D-`````.M,0HT$I0````!(F$F-A`70`0``BPB)#0````!)8\1(B<)(P>($
+M2,'@!T@IT(F,!0`-``!"C03E`````$B828V$!8`!``"+"(D-`````$ECQ$B)
+MPDC!X@1(P>`'2"G02`'HB8@$#0``]H`"#0``$`^$X````/:`V0P```)U"L>`
+M]`P```$``@!!@/X#=C5"C1SE`````$ACVTJ-A"LP`@``QP`8````OQ`G``#H
+M`````$J-G"LT`@``BS.)-0````#K,T*-'.4`````2&/;2HV$*U`"``#'`!@`
+M``"_$"<``.@`````2HV<*U0"``"+,XDU`````$ECQ$B)PDC!X@1(P>`'2"G0
+MB?&!X?___]^)\H'*````(/>$!0`-``````,`#T3108#^`W860HT$Y0````!(
+MF$F-A`4T`@``B1#K%$*-!.4`````2)A)C80%5`(``(D02(/$(%M=05Q!74%>
+MPV9F9I!F9F:09F:005=!5D%505154TB#[!A)B?Y,BS])BP?&1DD`QD9(!<9&
+M2P9(B7Y0N0````"]`````$B-D``"``!(B50D$$@%!`(``$B)1"0(ZQ9F9I!F
+M9I!!#[9&#$C3^*@!=0J#P0&003I/0W+J@/D#=GI(C1S-`````('C^`<``$R+
+M;"0020'=0<=%`"P```"_$"<``.@`````2`-<)`A$BR-$B24`````0<=%`"0`
+M``"_$"<``.@`````BP.)!0````#!X`A!@>3_````00G$0<=%`"````"_$"<`
+M`.@`````BQN)'0````#K>$B-',T`````@>/X!P``3(ML)!!)`=U!QT4`+```
+M`+\0)P``Z`````!(`UPD"$2+(T2))0````!!QT4`)````+\0)P``Z`````"+
+M`XD%`````,'@"$&!Y/\```!!"<1!QT4`(````+\0)P``Z`````"+&XD=````
+M`$&!_`$!:99U&D&`3@L&B=C!Z!`\4`^4P`^VV.M>9F:09F:008'\`0$``'4/
+MB=C!Z!`\4`^4P`^VV.M`OX@3``#H`````(/%`4"`_01W"KD`````Z:O^__^)
+MV,'H$#Q0#Y3`#[;8B=I$B>9(Q\<`````N`````#H`````(G82(/$&%M=05Q!
+M74%>05_#9F9FD&9FD$%7059!54%455-(@^Q(28G]2(L'@']#``^$/P,``,=$
+M)$0`````2(V0``(``$B)5"002`4$`@``2(E$)`AF9I`/MDPD1(A,)$,/ML&)
+M1"0T2)A(B<)(P>($2,'@!T@IT$J--"CVA@(-```0#X35`@``2(V6T`P``+@!
+M````#[9,)#1(T^`(0@I(B[;@#```2(ET)#CV0@D"#X0@`0``#[9$)$.-:`%!
+M.&U##X8.`0``2&-$)#1(B<)(P>($2,'@!T@IT$B)1"0H28V4!?@,``!(B50D
+M($F-C`7L#```2(E,)!A$#[;U26/&2(G"2,'B!$C!X`=(B<-(*=-.C20K0?:$
+M)`(-```0#X2D````3(M\)"A-`>]!]X?T#``````.``^$BP```$F-M!WX#```
+MN@@```!(BWPD(.@`````A,!T<$F-M!WL#```N@@```!(BWPD&.@`````A,!T
+M5;@!````1(GQ2-/@28V7T`P```I""HA""D&(A"3:#```2(-\)#@`=0]-BZ0D
+MX`P``$R)9"0XZQY)8\9(B<)(P>($2,'@!T@IT$B+5"0X28F4!>`,``"#Q0%!
+M.&U##X<D____2(-\)#@`#X76````3(GOZ`````!(B40D.$B%P`^$?0$``$AC
+M5"0T2(G02,'@!$C!X@=(*<),`>I(BTPD.$B)BN`,```/MD0D0TB)P4C!X01(
+MP>`'2"G(28V$!=`,``!(BTPD.$B)02`/MH+9#```B$$*QD$)`$R)*<9!#0`/
+MMD0D0XUP`4$X=4-V=TAC1"0T2(G"2,'B!$C!X`=(*=!)C;P%T`P``$`/MLX/
+MMD<*2-/XJ`%T'DACP4B)PDC!X@1(P>`'2"G02(M4)#A)B90%X`P``(/&`4$X
+M=4-V)NO(9F9FD$AC1"0T2(G"2,'B!$C!X`=(*=!(BTPD.$F)C`7@#```2&-$
+M)#1(B<)(P>($2,'@!T@IT$F-E`70#```#[9""DB+3"0XB$$,#[9J"H!\)$,#
+M=BN+7"0TP>,#2&/;2(M$)!!(`=C'`#@```"_$"<``.@`````2`-<)`B)*^LI
+MBUPD-,'C`TACVTB+1"002`'8QP`X````OQ`G``#H`````$@#7"0(B2N#1"1$
+M`0^V1"1#@\`!03A%0P^'X_S__TB#Q$A;74%<05U!7D%?PV9F9I!!5T%6055!
+M5%532(/L:$F)_DB+#\9$)%!0QD0D40'&1"12D\9$)%/`QD0D5!'&1"15`\9$
+M)%8`QD0D5P!(.[\`"```#X63````2(V7P`X``$B+1"102(F'(`@``(L%````
+M``"'(P@``(/``8D%``````^VAR`(``"(@B`(```/MH<A"```B((A"```#[:'
+M(@@``(B"(@@```^VAR,(``"#P`*(@B,(```/MH<D"```B((D"```#[:')0@`
+M`(B")0@```^VAR8(``"(@B8(```/MH<G"```B((G"```28G/2(V!``$``$B)
+M1"1`BX$``0``B04`````#[?0B50D7*@@=`LEW_\``(E$)%SK&(G0@\@@B40D
+M7$B+5"1`B0*+`HD%`````$F+!L>`!`$```````!)BP;'@!@!````````28L&
+MQX`<`0```````+^0T`,`Z`````!!QX=P`0``&`$``$&+AW0!``")!0````"`
+MY/V`S`2)1"1<0<>'<`$``!@!``"+1"1<08F'=`$``$''AW`!```H`0``0<>'
+M=`$``']_``!!QX=P`0``)`$``$&+AW0!``")!0````!FN```#?\_``")1"1<
+M0<>'<`$``"0!``"+1"1<08F'=`$``$''AW`!```\`0``0<>'=`$`````>@!!
+MQX=P`0``I`$``$''AW0!``!]O^__0<>'<`$``+@!``!!BX=T`0``B04`````
+M)?__```-``#Z`(E$)%Q!QX=P`0``N`$``(M$)%Q!B8=T`0``0<>'G````/\`
+M``!!QX>0`@``1`$``$''AY0"```&$``(0<>'D`(``+0!``!!QX>4`@``7W``
+M`$''AY`"```P````08N'E`(``(D%`````##D@,PSB40D7$&)AY0"``!!@'Y#
+M``^$@P(``,=$)$@`````28V'4`(``$B)1"0X28V75`(``$B)5"0P28V&(`@`
+M`$B)1"0H28V7@`$``$B)5"0@28V'A`$``$B)1"0828V7,`(``$B)5"0028V'
+M-`(``$B)1"0(9F:0#[94)$B(5"1/@/H##X;U````#[;JC1SM`````$ACVTR+
+M;"0020'=0<=%``@```"_$"<``.@`````2(M$)`A,C20#08L$)(D%`````(E$
+M)%P-``"``$&)!"1(BU0D*(GN3(GWZ`````")[DR)]^@`````0<=%`$0!``"_
+M$"<``.@`````0<<$)`80``A!QT4`M`$``+\0)P``Z`````!!QP0D7W```$''
+M10`(````OQ`G``#H`````,=$)%S_5(``0<<$)/]4``"Z`0```(GN3(GWZ```
M``!(BT0D($B-%`.+`HD%`````"7___[_B0+'1"1<!0'(`$@#7"08QP,%`<@`
-MOZ"&`0#H`````$2)]DB)[^@`````@T0D2`$/MD0D3X/``3A%0P^'SOW__TB)
-M[^@`````08N'!`$``(D%`````(/(`HE$)%Q!B8<$`0``2(M4)$"+`HD%````
-M`"7P___]#0T```*)1"1<B0*+`HD%`````$B+A>`0``!!B8<(`0``BX7D$```
-M08F'#`$``$B+A1`1``!!B8<0`0``BX44$0``08F'%`$``$''AR`!````````
-M#[>%M!(``"7_#P``#0```0!!B8<@`0``2(N%<!$``$&)AR0!``"+A701``!!
-MB8<H`0``2(N%F!$``,<`_P\``$''AS0!````````#[>%MA(``"7_#P``#0``
-M`0!!B8<T`0``2(N%H!$``$&)AS@!``"+A:01``!!B8<\`0``0<>'2`$`````
-M``#'1"1<``$``$''ATP!`````0``08N'!`$``(D%`````(/(64&)AP0!``#'
-M1"1<^_\`#$''AU0!``#[_P`,0<>'7`$``/__``"Z`````$ACPL>$A;@)````
-M````QT2%;`````"#P@&#^A!UXF;'A;`2``#_#V;'A;(2``#_#\9%4`&X`0``
-M`$B#Q&A;74%<05U!7D%?PV9F9I!F9I!!5T%6055!5%532(/L"$F)_DF)]$R+
-M+TR)[^@`````2(G#2(7`=0Y!QH0DZ0````'IL0```$R)[^@`````2(G%2(7`
-M=1E!QH0DZ0````%(B=Y,B>_H`````.F(````3(U[6,9#..'&0SD!QD,Z`T$/
-MMT0D.&:)0R#&@Y@````/28L&2(E#*,=#-``"``!(BU402(E32+@`````9F:0
-M9F:0Q@00`$B#P`%(/0`"``!U\$B):WA(QX.@`````````+X`````3(G_Z```
-M``"+4S1(BW483(G_Z`````!(B=Y,B>_H`````$B#Q`A;74%<05U!7D%?PV9F
-M9I!F9F:09F:0059!54%455-(@^PP28G]3(LG#[9'#83`#X3"`P``#[;PO0``
-M``!`]L8!=16Z`````(/"`0^VZHGPB>G3^*@!=/!(8\5(C11`2(T4D$F-E-30
-M$@``BT(,J0```@!T#0T```0`)?___?^)0@Q(8\5(C11`2(T4D$&+A-3<$@``
-MJ0``!``/A*$"``!)BYPD\`@``$F-A"2(%```3#GC2`]$V$F---1$#[:.XA(`
-M`$0/MH;A$@``#[:.X!(``$$/ME0D00^VAN<2``")1"0@#[:&YA(``(E$)!@/
-MMH;E$@``B40D$`^VAN02``")1"0(#[:&XQ(``(D$)(GN2,?'`````+@`````
-MZ`````!!N`````!(8\5(C11`2(T4D$V-C-3@$@``00^VA!C@"```//\/A(0`
-M```/ML!(:<#(#P``28G"3`.3B`D``$R)UDR)S[D(````_/.F#Y?"#Y+`.,)U
-M6$4/MDH$10^V0@-!#[9*`D$/ME(!00^V,D$/MD('B40D$$$/MD(&B40D"$$/
-MMD(%B00D2,?'`````+@`````Z`````!!QD4)_TR)[DR)Y^@`````Z2@"``!)
-M@\`!28/X`@^%7?___TR)Y^@`````2(G#2(7`#X0&`@``2&/%2(T40$B-%)!!
-M]H34W1(```1T!(!+70)(8\5(C11`2(T4D$'VA-3>$@``!'0$@$M=$$ACQ4B-
-M%$!(C1200?:$U-T2```(=`2`2UT$2&/%2(T40$B-%)!!]H34WA(```AT!(!+
-M72!(8\5(C11`2(T4D$'VA-3=$@```G0$@$M=`4ACQ4B-%$!(C1200?:$U-X2
-M```"=`2`2UT(QD-8`$F)WDACQ4B-%$!(C12028N$U.`2``!(B0-,B6L(3(GO
-MZ`````"(@[L```!!@$4H`4&`?"1#`'0RN0````"Z`````&9F9I!!#[9%#4C3
-M^*@!=`X/ML*(3`-P@$-:`8/"`8/!`4$X3"1#=]Q)BTU02(U3.$F)55!)C45(
-M2(E#.$B)2T!(B1%!@$58`0^VB[L```!)B[PDL!```$G'P`````!,B?),B>[H
-M`````.FV````J0``"``/A*L```!,B>?H`````$B)PTB%P`^$EP```,9`2P;&
-M0$H%9L>`R```````QD!(!L9`20!(QT!X```%`$ACQ4B-%$!(C12028N$U.`2
-M``!(B8/4````2(F#S````$R):U!,B>_H`````(B#Z@```&:#2V@03(GOZ```
-M```\"78&9H%+:``"0<9%#@%)BU5H28E=:$F-16!(B0-(B5,(2(D:2(G>3(GG
-MZ`````!F9I!F9I!(@\0P6UU!7$%=05[#9F:005=!5D%505154TB#["A)B?Q(
-MB?-(A?9T%P^V1@F$P'0///\/A>T'``#I1P$``&:0N0````!"#[:$(>8(```\
-M_W03#[;`2(T4@$B-%)!)C9S4P`$``$B#P0%(@_D$==:]`````$(/MH0EY@@`
-M`#S_=#D/ML!(C12`2(T4D$C!X@-)C9P4P`$``$'VA!3*`0```G0/O@````!(
-MB=_H`````.L(2(G?Z`````!(@\4!2(/]!'6P00^V1"0^9D$YA"2($```#X5-
-M!P``2(7;#X6.````08!\)%$`#X4X!P``0<9$)%$!28NTW&`$``!(A?9T7TB+
-MAH````!(A<!T)TC'AH``````````2<>$W&`$````````2(N^D````+K_____
-M_]#K+$B+AH@```!(A<!T($C'AH@`````````2<>$W&`$````````2(N^D```
-M`/_02(/#`4B#^Q0/A+@&``#KA,9#"?](B=Y,B>?H`````)#IH08``+D`````
-M9F:09F:00@^VA"'F"```//\/A/<````/MM!(C0222(T$@DC!X`--C;P$P`$`
-M`$&`?PG_#X35````08!_#@`/A%@&``"]`````$B-!))(C02"2,'@`TV-K`0@
-M`@``2HT<($V)_DR)[^@`````2(G!2(N#*`(``$B)BR@"``!,B2E(B4$(2(D(
-M@'E*_W1O@+GI``````^$`@8```^V44A(B="#X`9(@_@&=1WVP@%T/0^VD8$`
-M``!(BW%83(G_Z`````#IU04``$B#^`0/A<L%``#VP@%FD`^$P`4``$B)SDR)
-MY^@`````Z;`%``!(B<Y,B>?H`````.F@!0``@\4!03AN#@^&DP4``.E6____
-M2(/!`4B#^00/A>K^__](QT0D$`````!!@'PD40`/A:8```"[`````$F+M-Q@
-M!```0@^VA"-@"```2(7V=')(BXZ`````2(7)=&9(@WY@`'5?//]T-@^V^`^W
-MQTB-%$!(C1202,'B!4B)T$D#A"0X"0``]D!+!'03@'A)`'4-#[?73(GGZ```
-M``#K)4G'A-Q@!````````$C'AH``````````2(N^D````+K______]%(@\,!
-M2(/[%`^%:O___T'&1"11`>G%!```2(M4)!!"#[:$(N8(```\_P^$G00```^V
-MT$B-!))(C02"2,'@`TF-C`3``0``2(E,)"!!@+P$S@$````/A'($``#&1"0?
-M`$B-!))(C02"2,'@`TF-E`0@`@``2(D4)$Z--"!)B<](BSPDZ`````!(B<-)
-MBX8H`@``28F>*`(``$B+#"1(B0M(B4,(2(D8@'M*_P^%"`0``$0/MVLX26/%
-M00^VE`1@"```9HE4)`Y)BZS$8`0``/9#3`1T;$B%[71G2(.]@`````!T74B#
-M?6``=5:`8TS[]D-+!'02#[=4)`Y(B>Y,B>?H`````.LZ2(N%@````$ECU4G'
-MA-1@!````````$C'A8``````````2,=#0`````!(B[V0````NO____](B>[_
-MT/9#2P0/A&X!``#&@^@`````08!G#.?V0TP!#X3X````@&-,_DB+4T!(A=)T
-M2X![20!U+O9#2P1T*$$/ME0D08T4DD&-5)4`2&/228NT)/`(``"_!P```.@`
-M````Z><```!)B[0D\`@``+\!````Z`````#IT````$B%[71C2(N-@````$B%
-MR9!T5H![20!U&_9#2P1T%0^W5"0.2(GN3(GGZ`````#IG0```$ECQ4G'A,1@
-M!````````$C'A8``````````2,=#0`````!(B[V0````NO____](B>[_T>MH
-M@'M)`'5B]D-+!'1<00^V5"1!C12208U4E0!(8]))B[0D\`@``+\"````Z```
-M``#K-V9F9I!F9I!(BT-`2(7`="=(BY"(````2(72=!M(QX"(`````````$B+
-M0T!(B[B0````_])F9I#V0TP"#X0F`@``2(M30$F+M"3P"```OP8```#H````
-M`(!C3/WIX`$``&9F9I!F9I!(BT-`2(7`#X3,`0``2(.XB``````/A+X!``#&
-M0TL!QD-*`$B)VKX&````2(M\)"#H`````$B#>U@`=!=(BU,02(M#&$B)0@A(
-MB1!(BT-8@&A8`8"[@P````!T'V9F9I!,B>?H`````+\!````Z`````"`NX,`
-M````=>5(B[L@`0``2(7_=!$/MK,-`0``N@$```#H`````$B+>UA(A?]T$0^V
-MLX$```"Z`0```.@`````2(MK0$B%[0^$XP```/9#3`1U3DR)Y^@`````2(MS
-M0+H!````3(GGZ`````!(BT-`#[90`@^V<`%(Q\<`````N`````#H`````$B+
-M4T!)B[0D\`@``+\!````Z`````#K+P^V50(/MG4!2,?'`````+@`````Z```
-M``!(BU-`28NT)/`(``"_`0```.@`````2(N5B````$B%TG0D#[=#.$G'A,1@
-M!````````$C'A8@`````````2(N]D````/_2]D-,`G0:2(M30$F+M"3P"```
-MOP8```#H`````(!C3/U(QT-``````$C'16``````2(M38$B%TG00#[:#@0``
-M`$C'1,)8`````$B+$TB+0PA(B4((2(D008!O#@%(B=Y,B>?H`````/9#3`)T
-M(4B+4T!)B[0D\`@``+\&````Z`````"`8TS]9F9FD&9FD(!$)!\!#[9,)!]!
-M.$\.#X>R^___2(-$)!`!2(-\)!`$#X4[^___N`$```!(@\0H6UU!7$%=05Y!
-M7\-F9I!F9I!54TB#[`A(B?M(BR_H`````(3`=!D/MG5#0(3V=#0/ME,-N0``
-M``#VP@%T'NLDQD,)_TB)WDB)[^@`````ZV*02(G02-/XJ`%U"(/!`4`X\77N
-M2(GOZ`````!(B<9(A<!T/TB+4VA(B4-H2(U#8$B)!DB)5@A(B3*`0PX!2(E>
-M4,9&2`7&1DD`QH:!````#[D!````N@$```!(B=_H`````$B#Q`A;7<-F9F:0
-M9F9FD$B#["A(B1PD2(EL)`A,B60D$$R);"083(ET)"!)B?Q(B?5(BYZ(````
-M#[9&0CPD#X<2!@``#[;`_R3%``````^W1DX/M]#VP@1T#&;'1DX!`,9&0@'K
-M0V:#^"!U#&;'1DX(`,9&0A'K,832>17V1DD#=`\D?X/("&:)1D[&1D(-ZQCV
-MP@AT!L9%0@?K#?;&`G0(QD5'`,9%0AY(B>Y,B>?H`````.F=!0``N0$```"Z
-M`@```+X!````2(GOZ`````#I@04``+D!````N@````"^`0```$B)[^@`````
-MZ64%``"Y`0```+H!````O@$```!(B>_H`````.E)!0``N0$```"Z8````+X!
-M````2(GOZ`````#I+04```^V3DA!N`$```"Z8````+X!````2(GOZ`````#I
-M#`4``$&X`0```+D```$$NB$```"^`0```$B)[^@`````Z>H$``!(BT,@@6`T
-M___W_T&X`0```+D!````N@(```"^`````$B)[^@`````Z;T$``!!N`$```"Y
-M`````+H"````O@````!(B>_H`````+\0)P``Z`````#ID00``$B+0R"!8#3_
-M__?_0;@!````N0$```"Z`@```+X`````2(GOZ`````#I9`0``$&X`0```+D`
-M````N@(```"^`````$B)[^@`````OQ`G``#H`````.DX!```N0$```"Z`@``
-M`+X`````2(GOZ`````#I'`0``+D!````N@````"^`````$B)[^@`````Z0`$
-M``"Y`0```+H!````O@````!(B>_H`````.GD`P``0;@!````N?____^Z`0``
-M`+X`````2(GOZ`````#IP@,``+D!````N@````"^`````$B)[^@`````Z:8#
-M```/MD9'3(MLQEA)B5U028EU8`^V1D=!B(6!````0<9%2@-!QD5)`$&`34@%
-M@$,.`4B+4VA(C4-@3(EK:$F)10!)B54(3(DJOX`:!@#H`````$&`?"1#`'0F
-MO0````#V0PT!=`_K&0^V0PV)Z4C3^*@!=1&#Q0%!.&PD0W?IZP6]`````$B+
-M4R"+0C2I```(`'0*)?__]_^)0C3K:4B-!.T`````28G&08'F^`<``+NX"P``
-M0(#]`W8=28L$)$@%@`$``$P!\(L`B04`````P>@3@^`!ZQQ)BP0D2`6``0``
-M28T$!HL`B04`````P>@3@^`!A,!U#[_H`P``Z`````"#ZP%UKF9!QX7(````
-M``!,B>Y,B>?H`````.F(`@``OT`-`P#H`````+D`````NB````"^`0```$B)
-M[^@`````OQ`G``#H`````.E8`@``N0````"Z`0```+X`````2(GOZ`````"_
-M$"<``.@`````Z3("``!(BT,@@6`T___W_T&X`````+G_____N@$```"^````
-M`$B)[^@`````OQ`G``#H`````.G[`0``N0````"Z`````+X`````2(GOZ```
-M``"_$"<``.@`````Z=4!``#H`````.G+`0``9F9FD.@`````Z;T!``!!N`$`
-M``"Y\````+J;````O@$```!(B>_H`````.F;`0``0;@!````N:#66BNZX`,`
-M`+X!````2(GOZ`````#I>0$``$&X`0```+D`X`,`NJ0#``"^`0```$B)[^@`
-M````Z5<!``!!N`$```"YY*@&`;K$`P``O@$```!(B>_H`````.DU`0``N0$`
-M``"Z2`,``+X!````2(GOZ`````#I&0$``+]`#0,`Z`````"Y`0```+H@````
-MO@$```!(B>_H`````+\0)P``Z`````#IZ0```$&X`0```+D`````NB$```"^
-M`0```$B)[^@`````Z<<```"Y`0```+I@````O@$```!(B>_H`````.FK````
-M#[9.2$&X`0```+I@````O@$```!(B>_H`````.F*````QD,)`$B+OH@```#H
-M`````.MXN0$```"Z`0```+X`````2(GOZ`````"_$"<``.@`````ZU5(BT,@
-M@6`T___W_T&X`0```+G_____N@$```"^`````$B)[^@`````OQ`G``#H````
-M`.LAN0$```"Z`0```+X`````2(GOZ`````"_$"<``.@`````N`$```!(BQPD
-M2(ML)`A,BV0D$$R+;"083(MT)"!(@\0HPV9F9I!F9I!(@^P82(D<)$B);"0(
-M3(ED)!!(B?M(B?4/MU8@9H'ZA0`/AXX````/M\(/MH0'8`@``#S_=']F@_I_
-M=R0/ML!(C11`2(T4D$C!X@5(`Y<X"0``2(M"4`^V4`CK7F9F9I`/MT8@9CV!
-M`'<C#[?`#[:$!V`(``!(:<#(#P``2`.'B`D``$B+0`@/ME`(ZRT/MT8@#[:$
-M!V`(``!(C03`2,'@!4@#AV`)``!(BX"(````#[90".L%NO____^Y_____V:!
-M?2"%`'<,#[=%(`^VC`-@"```2(NS8`D```^VPH#Z_W0>2)B`O`/F"```_W02
-M@/G_=`V`?20&=2IF9F:09F:02(-]>`!T#$B-=7A(B=_H`````$B)[DB)W^@`
-M````Z0T!```/ML%(C03`2,'@!4R-)`9!#[9$)$(\&@^$A0```#P:=PX\$0^%
-MNP```&9F9I#K$SP;='<\'`^%J0```&:0Z9P```!(BY,($0``2('"3`@``$$/
-MMD0D4,'@"$B82`'"BPJ)#0`````/MLE(BY,($0``2('"1`@``$$/MD0D4,'@
-M"$B82`'"BP*)!0````#!X`@)P4&)C"0$`0``0<9$)$(:ZT)!QD0D0AOK.DB+
-M@P@1``!(!4P(``!!#[94)%#!X@A(8])(`="+`(D%`````(/@]T&(1"1(0<9$
-M)$(<ZP9!QD0D0AU(@WUX`'0,2(UU>$B)W^@`````2(GN2(G?Z`````!,B>9(
-MB=_H`````$B+'"1(BVPD"$R+9"002(/$&,-F9F:09F:09F:09F:02(/L"$B)
-M_DB+/^@`````2(/$",-F9F:09F9FD&9F9I!(@^PX2(E<)`A(B6PD$$R)9"08
-M3(EL)"!,B70D*$R)?"0P28G_2(GS2(MN4`^W=CA(8\:Z`````("\!V`(``#_
-M#X0Z"0``#[9#2CP)#X1.!0``/`EW2CP%#X27````/`5W'CP##X2M````/`1F
-M9F:0#X7L"```Z=$```!F9I!FD#P'#X2A!```/`=F9I!F9I`/AQP$``#I@0(`
-M`&9FD&:0/!8/A'X#```\%F9FD&9FD'<C/!0/A-$%```\%&9F9I`/A]L"```\
-M"@^%E`@``&:0Z3L%```\&@^$'P(``#S_D`^$J04``#P7#X5T"```9I#I1@,`
-M``^V=T-`A/9F9F:0#X2'````#[95#4&\`````/;"`71MZW9(BT4@@6`T___^
-M_TB+>U"Y`````+H!````2(G>Z`````"_!0```.@`````N@$```#I-`@``+D`
-M````N@````!(B=Y(B>_H`````+]0PP``Z`````"Z`0```.D+"```2(G01(GA
-M2-/XJ`%U$4&#Q`%!./1UZNL&0;P`````#[932$B)T(/@!DB#^`9U"?;"`0^%
-MQ@```$B+52"+0C2I```!`'0-)?___O^)0C3IJP```$J-!.4`````28G&08'F
-M^`<``$&]$"<``)!)BQ=!@/P#=A=)C806@`$``(L`B04`````)0```0#K%4F-
-MA!:``0``BP")!0`````E```!`(7`="Q!@/P#=A-)C806@`$``,<````!`.DW
-M!P``28V$%H`!``#'`````0#I)`<``+_H`P``Z`````!!@^T!=8O&0TL"QD-*
-M_TB)WDR)_^@`````N@$```#I#@<``/9%"@%T-$B)WDB)[^@`````A,!U)4&]
-M^@```$B)WDB)[^@`````A,!U$+_H`P``Z`````!!@^T!=>%!@/P#=B9)BP=(
-M!8`!``!*C13E`````('B^`<``$@!T(L0B14`````B1#K)$F+!T@%@`$``$J-
-M%.4`````@>+X!P``2`'0BQ")%0````")$$B+>U!(B=[H2.;__[\@3@``Z```
-M``"Z`0```.ED!@``2,?'`````+@`````Z`````!(BVM03(ME`$R)Y^@`````
-M2(G!2(7`=1'&@^D````!N@$```#I*@8``,9`..'&0#D!QD`Z%P^W0SAFB4$@
+MZ?(````/MFPD3XT<[0````!(8]M,BVPD.$D!W4''10`(````OQ`G``#H````
+M`$B+5"0P3(TD$T&+!"2)!0````")1"1<#0``@`!!B00D2(M4)"B)[DR)]^@`
+M````B>Y,B??H`````$''10!$`0``OQ`G``#H`````$''!"0&$``(0<=%`+0!
+M``"_$"<``.@`````0<<$)%]P``!!QT4`"````+\0)P``Z`````#'1"1<_U2`
+M`$''!"3_5```N@$```")[DR)]^@`````2(M$)"!(C10#BP*)!0`````E___^
+M_XD"QT0D7`4!R`!(`UPD&,<#!0'(`+^@A@$`Z`````")[DR)]^@`````@T0D
+M2`$/MD0D3X/``4$X1D,/A]S]__],B??H`````$&+AP0!``")!0````"#R`*)
+M1"1<08F'!`$``$B+5"1`BP*)!0`````E\/___0T-```"B40D7(D"BP*)!0``
+M``!)BX;X"@``08F'"`$``$&+AOP*``!!B8<,`0``28N&*`L``$&)AQ`!``!!
+MBX8L"P``08F'%`$``$''AR`!````````00^WALP,```E_P\```T```$`08F'
+M(`$``$F+AH@+``!!B8<D`0``08N&C`L``$&)AR@!``!)BX:P"P``QP#_#P``
+M0<>'-`$```````!!#[>&S@P``"7_#P``#0```0!!B8<T`0``28N&N`L``$&)
+MAS@!``!!BX:\"P``08F'/`$``$''AT@!````````QT0D7``!``!!QX=,`0``
+M``$``$&+AP0!``")!0````"#R%E!B8<$`0``QT0D7/O_``Q!QX=4`0``^_\`
+M#$''AUP!``#__P``N@````!F9F:09F:02&/"0<>$AJ`(````````@\(!@_H0
+M=>EF0<>&R`P``/\/9D''ALH,``#_#[@!````2(/$:%M=05Q!74%>05_#D$%7
+M059!54%455-(@^P(28G^28GT3(LO3(GOZ`````!(B<-(A<!U#D'&A"3!````
+M`>FQ````3(GOZ`````!(B<5(A<!U&4'&A"3!`````4B)WDR)[^@`````Z8@`
+M``!,C7M8QD,XX<9#.0'&0SH#00^W1"0X9HE#(,:#F`````])BP9(B4,HQT,T
+M``(``$B+51!(B5-(N`````!F9I!F9I#&!!``2(/``4@]``(``'7P2(EK<$C'
+M@Z``````````O@````!,B?_H`````(M3-$B+=1A,B?_H`````$B)WDR)[^@`
+M````2(/$"%M=05Q!74%>05_#9F9FD&9F9I!F9I!!5T%6055!5%532(/L*$F)
+M_$B)\TB%]G07#[9&"83`=`\\_P^%'0<``.E'`0``9I"Y`````$(/MH0A_`<`
+M`#S_=!</ML!(B<)(P>('2(V$PE`!``!)C5P$"$B#P0%(@_D$==*]`````$(/
+MMH0E_`<``#S_="L/ML!(B<)(P>('2(T$PDF-G`18`0``0?:$!&(!```"=0I(
+MB=_H`````&:02(/%`4B#_01UOD$/MD0D/F9!.80DR`H```^%AP8``$B%VP^%
+MF````$&`?"1+``^%<@8``$'&1"1+`69FD&9FD$F+M-QX`P``2(7V=&-(BX:`
+M````2(7`="=(QX:``````````$G'A-QX`P```````$B+OI````"Z_______0
+MZS!(BX:(````2(7`="1(QX:(`````````$G'A-QX`P```````$B+OI````#_
+MT&9F9I!(@\,!2(/[%`^$Z`4``.N`QD,)_TB)WDR)Y^@`````D.G1!0``N0``
+M``!F9I!F9I!"#[:$(?P'```\_P^$@P````^VT$B)T$C!X`=(C03028V$!%`!
+M``"`>!'_=&>`>!4`#X2/!0``O0````!(B=!(P>`'2(T$T$V-K`28`0``2HT<
+M($R-HU`!``!,B>_H`````$B+DZ`!``!(B8.@`0``3(DH2(E0"$B)`H!X2O\/
+MA4(%``"#Q0%!.&PD%0^&-`4``.O&2(/!`4B#^00/A5[___](QT0D$`````!!
+M@'PD2P`/A:H```"[`````&9F9I!)B[3<>`,``$(/MH0C>`<``$B%]G1R2(N.
+M@````$B%R71F2(-^:`!U7SS_=#8/MO@/M\=(C13`2(T4D$C!X@-(B=!)`X0D
+M2`@``/9`2P1T$X!X20!U#0^WUTR)Y^@`````ZR5)QX3<>`,```````!(QX:`
+M`````````$B+OI````"Z_______12(/#`4B#^Q0/A6K___]!QD0D2P'I900`
+M`$B+5"000@^VA"+\!P``//\/A#T$```/MM!(B=!(P>`'2(T$T$F-C`18`0``
+M2(E,)"!!@+P$90$````/A!,$``#&1"0?`$B)T$C!X`=(C03028V4!)@!``!(
+MB10D3HTT($V-OE`!``!(BSPDZ`````!(B<-)BX:@`0``28F>H`$``$B+#"1(
+MB0M(B4,(2(D8@'M*_P^%I@,``$0/MVLX26/%00^VE`1X!P``9HE4)`Y)BZS$
+M>`,``/9#3`1T<DB%[71M2(.]@`````!T8TB#?6@`=5R`8TS[]D-+!'02#[=4
+M)`Y(B>Y,B>?H`````.M`2(N%@````$ECU4G'A-1X`P```````$C'A8``````
+M````2,=#0`````!(B[V0````NO____](B>[_T&9FD&9FD/9#2P0/A&8!``#&
+M@\``````08!G$^?V0TP!#X3W````@&-,_DB+4T!(A=)T2X![20!U+O9#2P1T
+M*$$/ME0D08T4DD&-5)4`2&/228NT)``(``"_!P```.@`````Z>,```!)B[0D
+M``@``+\!````Z`````#IS````$B%[71B2(N-@````$B%R716@'M)`'4;]D-+
+M!'05#[=4)`Y(B>Y,B>?H`````.F:````26/%2<>$Q'@#````````2,>%@```
+M``````!(QT-``````$B+O9````"Z_____TB)[O_1ZV6`>TD`=5_V0TL$9F9F
+MD&9FD'1200^V5"1!C12208U4E0!(8]))B[0D``@``+\"````Z`````#K+4B+
+M0T!(A<!T)$B+D(@```!(A=)T&$C'@(@`````````2(M#0$B+N)````#_TO9#
+M3`(/A,(!``!(BU-`28NT)``(``"_!@```.@`````@&-,_>E_`0``9F:02(M#
+M0$B%P`^$;P$``$B#N(@`````#X1A`0``QD-+`<9#2@!(B=J^!@```$B+?"0@
+MZ`````"`>W,`=!UF9I!FD$R)Y^@`````OP$```#H`````(![<P!UZ$B+:T!(
+MA>T/A.,```#V0TP$=4Y,B>?H`````$B+<T"Z`0```$R)Y^@`````2(M#0`^V
+M4`(/MG`!2,?'`````+@`````Z`````!(BU-`28NT)``(``"_`0```.@`````
+MZR\/ME4"#[9U`4C'QP````"X`````.@`````2(M30$F+M"0`"```OP$```#H
+M`````$B+E8@```!(A=)T)`^W0SA)QX3$>`,```````!(QX6(`````````$B+
+MO9````#_TO9#3`)T&DB+4T!)B[0D``@``+\&````Z`````"`8TS]2,=#0```
+M``!(QT5H`````$B+4UA(A=)T#0^V0W%(QT3"6`````!(BQ-(BT,(2(E""$B)
+M$$&`;Q4!2(G>3(GGZ`````#V0TP"=!Y(BU-`28NT)``(``"_!@```.@`````
+M@&-,_69F9I"`1"0?`0^V3"0?03A/%0^'%/S__TB#1"00`4B#?"00!`^%F_O_
+M_[@!````2(/$*%M=05Q!74%>05_#9F:09F:02(/L.$B)7"0(2(EL)!!,B60D
+M&$R);"0@3(ET)"A,B7PD,$F)_4B)\TR+9E`/MT8XN@````"`O`=X!P``_P^$
+MH@<```^V1DH\"0^$H04``#P)=TT\!0^$F@```#P%9F:0=QX\`P^$K@```#P$
+M9F9FD`^%6@<``.G0````9F:09I`\!P^$]`0``#P'9F:09F:0#X=O!```Z7P"
+M``!F9I!FD#P6#X34`P``/!9F9I!F9I!W(SP4#X0A!@``/!1F9F:0#X<'`P``
+M/`H/A0('``!FD.F+!0``/!H/A"0"```\_Y`/A/D%```\%P^%X@8``&:0Z9D#
+M```/MG=#0(3V9F9FD`^$@0```$$/ME0D#+T`````]L(!=&?K;TF+1"0@@6`T
+M___^_TB+?E"Y`````+H!````Z`````"_!0```.@`````N@$```#IF@8``+D`
+M````N@````!,B>?H`````+]0PP``Z`````"Z`0```.ET!@``2(G0B>E(T_BH
+M`74/@\4!0#CU=>SK!;T`````#[932$B)T(/@!DB#^`9U"?;"`0^%S@```$F+
+M5"0@BT(TJ0```0!T#27___[_B4(TZ;(```!(C03M`````$F)QT&!Y_@'``!!
+MOA`G``!F9F:09F:028M5`$"`_0-V%TF-A!>``0``BP")!0`````E```!`.L5
+M28V$%X`!``"+`(D%`````"4```$`A<!T+$"`_0-V$TF-A!>``0``QP````$`
+MZ:0%``!)C807@`$``,<````!`.F1!0``O^@#``#H`````$&#[@%UBL9#2P+&
+M0TK_2(G>3(GOZ`````"Z`0```.ER!0``0?9$)`H!=#1(B=Y,B>?H`````(3`
+M=25!OOH```!(B=Y,B>?H`````(3`=1"_Z`,``.@`````08/N`77A0(#]`W8G
+M28M%`$@%@`$``$B-%.T`````@>+X!P``2`'0BQ")%0````")$.LE28M%`$@%
+M@`$``$B-%.T`````@>+X!P``2`'0BQ")%0````")$$B+>U!(B=[HD_3__[H!
+M````Z<X$```/MD=!28M4)"`/ME((C02"C02`#[96<0'02)@/MH@`````#[97
+M.@^V=SE(Q\<`````N`````#H`````$B+:U!,BV4`3(GGZ`````!(B<%(A<!U
+M$<:#P0````&Z`0```.EJ!```QD`XX<9`.0'&0#H7#[=#.&:)02#&@9@````/
M2(M%`$B)02C'030`````2,=!2`````!(QX&@`````````$B)SDR)Y^@`````
-MN@$```#IWP4``$C'QP````"X`````.@`````2(MK4$R+90!,B>?H`````$B)
-MP4B%P'41QH/I`````;H!````Z:4%``#&0#CAQD`Y`<9`.A@/MT,X9HE!($B+
-M10!(B4$HQT$T`````$C'04@`````2,>!H`````````!(B<Y,B>?H`````+H!
-M````Z5H%``!(B=Y(B>_H'^7__[H!````Z44%``!,BV4`3(GGZ`````!(B<(/
-MMDML2(7`=0[&@^D````!L@'I'P4``,9`..'&0#D!QD`Z!8A(.P^W0SAFB4(@
-M2(M%`$B)0BC'0C0`````2,="2`````!(QX*@`````````(A+;TB)UDR)Y^@`
-M````N@$```#IS@0``$R+90!,B>?H`````$B)P@^V2VY(A<!U#L:#Z0````&R
-M`>FH!```QD`XX<9`.0'&0#H$B$@[#[=#.&:)0B!(BT4`2(E"*,="-`````!(
-MQT)(`````$C'@J``````````B$MQ2(G63(GGZ`````"Z`0```.E7!```3(ME
-M`$R)Y^@`````2(G!2(7`=1'&@^D````!N@$```#I,@0``,9`..'&0#D!QD`Z
-M!@^W0SAFB4$@2(M%`$B)02C'030`````2,=!2`````!(QX&@`````````$B)
-MSDR)Y^@`````N@$```#IYP,``&9F9I!F9I!,BV4`3(GGZ`````!(B<%(A<!U
-M$<:#Z0````&Z`0```.F[`P``QD`XX<9`.0'&0#H,#[=#.&:)02!(BT4`2(E!
-M*,=!-`````!(QT%(`````$C'@:``````````2(G.3(GGZ`````"Z`0```.EP
-M`P``3(ME`$R)Y^@`````2(G!2(7`=1'&@^D````!N@$```#I2P,``,9`..'&
-M0#D!QD`Z%L9`/`$/MT,X9HE!(,:!F`````](BT4`2(E!*,=!-`````!(QT%(
-M`````$C'@:``````````2(G.3(GGZ`````"Z`0```.GU`@``QD-*_V;'@\@`
-M``````^V4TA(B="#X`9(@_@&=07VP@%U%4B#>V``=0Y(B>_H`````(B#Z@``
-M`(![2P)U#TB+<U!(B=I,B?_H`````/9%#`)U&+L`````3(UE8(!]#@`/A4`!
-M``#I5P(``$B+=4`/MDY&#[;1#[9&.X/H`3G"?2Z-00&(1D:`1D<!QD9"``^W
-M1DZ#X/Z#R`AFB49.3(G_Z`````"Z`0```.E'`@``.<)T%+L`````3(UE8(!]
-M#@!U*>D1`@``QD9"``^W1DZ#X/:`S`)FB49.3(G_Z`````"Z`0```.D+`@``
-M3(GGZ`````!(B<%(BT5H2(E-:$R)(4B)00A(B0B`>4K_='R`N>D`````#X2]
-M`0``#[912$B)T(/@!DB#^`9U(O;"`71%#[:1@0```$B+<5A(B>_H`````+H!
-M````Z:D!``!(@_@$#X6!`0``]L(!#X1X`0``2(G.3(G_Z`````"Z`0```.F!
-M`0``2(G.3(G_Z`````"Z`0```.EL`0``QH'I`````(/#`3A=#@^&.P$``.E)
-M____9F9FD$R)Y^@`````2(G!2(M%:$B)36A,B2%(B4$(2(D(@'E*_P^$D```
-M`(!Y20`/A7\```"`N>D`````#X3T````#[912$B)T(/@!DB#^`9U(O;"`71(
-M#[:1@0```$B+<5A(B>_H`````+H!````Z>````!(@_@$#X6X````]L(!9F:0
-M#X2L````2(G.3(G_Z`````"Z`0```.FU````2(G.3(G_Z`````"Z`0```.F@
-M````QH'I`````(/#`0^V10XXV`^'.O___SC#=5*$P'1.NP````!,C65@3(GG
-MZ`````!(B<)(BT5H2(E5:$R)(DB)0@A(B1`/MD))/")T!#P-=12^"@```$B)
-MU^@`````N@$```#K/(/#`3A=#G>[QD4)_TB)[DR)_^@`````N@$```#K'KH!
-M````ZQ=%A>UF9F:0#X3?^/__Z??X__]F9I!FD(G02(M<)`A(BVPD$$R+9"08
-M3(ML)"!,BW0D*$R+?"0P2(/$.,-F9F:09F9FD&9FD$B#["A(B5PD"$B);"00
-M3(ED)!A,B6PD($B)^TF)]`^W3B!F@?F%``^'Z`````^WP0^VM`=@"```0(#^
-M_P^$TP```&:#^7]W*$`/MM9(BX\X"0``2(T$4DB-!()(P>`%2(M$"%`/MD`(
-MZTEF9I!F9I!F@?F!`'<=0`^VQDB+EX@)``!(:<#(#P``2(M$$`@/MD`(ZQ]`
-M#[;&2(N78`D``$B-!,!(P>`%2(N$$(@````/MD`(//]T7@^VP`^VK`/F"```
-M0(#]_W080(#^_W0200^V3"0D@/D&=6=F9F:09F:00(#]_W0O0(#^_W0I0`^V
-MQDB-%$!(C1202,'B!4F)U4P#JS@)``!!QD5+`D'&14K_Z9\"``!)@WPD>`!T
-M#4F-="1X2(G?Z`````!,B>9(B=_H`````.FE`@``9F:09F:00`^VQDB-%$!(
-MC1202,'B!4F)U4P#JS@)``!)BU0D2(3)#X2Y````00^V1"0Z/`8/A-`````\
-M#`^$R````$$/MY7(````C4(!9D&)A<@```!F@_H)=AM!@'U*!G040<9%2P)!
-MQD5*_T&`94S^Z0,"``"_Z`,``.@`````00^V54A(B="#X`9(@_@&=3KVP@%T
-M-4$/MI6!````28MU6$`/ML5(C3R`2(T\N$B-O/O``0``0;@`````N0(```#H
-M`````.G9`0``0<9%2@-,B>Y(B=_H`````.G$`0``9F:09I!!#[9$)#H\`74+
-M0<9%2@20Z7\!```\`G4,0<9%2@5FD.EO`0``/`,/A<\```!(B=9!@'U*!74K
-M9H%Z!,@W9F:0=2!!#[=U.$C'QP````"X`````.@`````0<9%2@;I,@$``$R)
-M[^@`````28V]F````+XH````Z"6___^$P'5!28V]A````+X4````Z!"___^$
-MP'4L28V]P````+X(````Z/N^__^$P'4728-]>`!T$$'&14H7Z=H```!F9I!F
-M9I!F08.]R````!UV%$'&14L"0<9%2O]!@&5,_NFU````O^@#``#H`````$'&
-M14H:9D&#A<@````!Z9@````\%W4*0<9%2A7IB@```#P89F9FD'4'0<9%2A;K
-M>SP$9F:09I!U!T'&14H'ZVL\!69FD&:0=0=!QD5*".M;/`9F9I!FD'4'0<9%
-M2@GK2SP,9F:09I!U!T'&14H*ZSL\%F9FD&:0=0=!QD5*%.LK/`YF9I!FD'4B
-M28-\)'@`=`U)C70D>$B)W^@`````3(GF2(G?Z`````#K*TF#?"1X`'0-28UT
-M)'A(B=_H`````$R)YDB)W^@`````3(GN2(G?Z`````!(BUPD"$B+;"003(MD
-M)!A,BVPD($B#Q"C#9F9FD&9F9I!(@^PH2(D<)$B);"0(3(ED)!!,B6PD&$R)
-M="0@28G^28GT2(MN4`^W1CBZ`````("\!V`(``#_#X3+`@``#[9&2CP4#X3'
-M````/!1W.#P-D`^$^P```#P-=PX\!69F9I`/A9T"``#K33P.9F:09F:0#X3O
-M````/`\/A84"``!FD.GR````/!L/A)4````\&Y!W$#P8=#D\&0^%90(``&:0
-MZT0\''17//\/A54"``!FD.G&````O@````!,B>=F9I#H`````+H!````Z3D"
-M``"^`0```$R)Y^@`````N@$```#I(@(``+X!````3(GGZ`````"Z`0```.D+
-M`@``2(GWZ`````"Z`0```.GY`0``D$B)]^@`````N@$```#IY@$``/9&:01T
-M%TB)]V9FD&:0Z`````"Z`0```.G)`0``2(GWZ`````"Z`0```.FW`0``2(GW
-MZ`````"Z`0```&:0Z:,!``!(B??H`````+H!````Z9$!``#&1DK_@'T.``^$
-MV0```+L`````3(UM8&:03(GOZ`````!(B<%(BT5H2(E-:$R)*4B)00A(B0B`
-M>4K_#X2)````@'E)``^%A@```("YZ0`````/A#4!```/ME%(2(G0@^`&2(/X
-M!G4B]L(!=$@/MI&!````2(MQ6$B)[^@`````N@$```#I"`$``$B#^`0/A?D`
-M``#VP@%F9I`/A.T```!(B<Y,B??H`````+H!````Z=T```!(B<Y,B??H````
-M`+H!````Z<@```#&@>D`````@\,!#[9%#CC8#X<Z____.,,/A8\```!!#[9$
-M)$D\(G06/`UT$D&\`````$R-;6"`?0X`=1;K;[X*````3(GGZ`````"Z`0``
-M`.MV3(GOZ`````!(B<-(BT5H2(E=:$R)*TB)0PA(B1@/MD-)/")T!#P-=2A(
-MB=Y(Q\<`````N`````#H`````+X*````2(G?Z`````"Z`0```.LE08/$`40X
-M90YWI<9%"?](B>Y,B??H`````+H!````ZP6Z`0```(G02(L<)$B+;"0(3(MD
-M)!!,BVPD&$R+="0@2(/$*,-F9I!F9I!F9I!!5T%6055!5%532(/L*$F)_0^W
-M5B!!N/____]$B<!F@?J%``^'@`````^WPD0/MH0'8`@``$2)P$&`^/]T:V:#
-M^G]W(D$/MM!(BX\X"0``2(T$4DB-!()(P>`%2(M$"%`/MD`(ZT-F@?J!`'<=
-M00^VP$B+EX@)``!(:<#(#P``2(M$$`@/MD`(ZQ]!#[;`2(N78`D``$B-!,!(
-MP>`%2(N$$(@````/MD`(#[;`00^VO`7F"```2(T$OTB-!(=)C83%P`$``$B)
-M1"0800^VP$B-%$!(C1202,'B!4D#E3@)``!(B50D($B+3D@/M@'!X!@/ME$!
-MP>(0"=`/ME$#"=`/ME$"P>(("=#!Z`-(C6D(@_@0NA`````/1\*)P$R--,%,
-M.?4/AX0!``#'1"04`````$B-!+](C02'2,'@`TZ-/"A)C9?``0``2(E4)`A)
-MC80%(`(``$B)!"1F9F:09F:02(GOZ`````!!B<1(C74$N00```#\2,?'````
-M`/.F#Y?"#Y+`.,(/A10!``!!@_P0#X<*`0``@T0D%`&#?"04`74K2(M$)"#'
-M@)`!```!````1(F@E`$``$B+10!(BU0D($B)@MP```#ITP```$R)[^@`````
-M2(G#2(7`#X3,````QD!+!L9`2@5FQX#(``````#&0$@&QD!)`$C'0'@```4`
-MQX"0`0```0```$2)H)0!``!(BU0D($B+@M0```!(B8/4````2(N"U````$B)
-M@\P```!(BT4`2(F#W````$B+1"082(E#4$B)Q^@`````B(/J````9H-+:!!(
-MBWPD&.@`````/`EV!F:!2V@``DB+5"0(@$(.`4F+AR@"``!)B9\H`@``2(L4
-M)$B)$TB)0PA(B1A(B=Y,B>_H`````)!(@\4(3#GU#X:S_O__2(/$*%M=05Q!
-M74%>05_#9F9FD$%7059!54%455-(@>Q(`@``2(E\)!A(B70D$(G02(M7"$B)
-M5"0@2(L*2(E,)"@/ME=8B%0D-TB)^4B#P4A(B4PD.$@Y3T@/A)$"``"`?"0W
-M``^$A@(```^VP(E$)`Q(BWPD..@`````3(U@\$R-1"1`BTPD#+H!````2(MT
-M)"!(BWPD$.@`````3(U\)$"`?"1```^$!0$``$&]`````$V-M"34````00^V
-M[4ACQ4B)PTC!XP1)C7P?;+H(````3(GVZ`````"$P`^$L0```$F-5!]@#[9"
-M"(/@#T&(A"3J````00^W3"1H9H'AW_V)R(/($&9!B40D:`^V0@C`Z`0\"74+
-MB<B#R#!F08E$)&A(8\5(P>`$00^V1`=HP.@$/`IU"&9!@4PD:``"2(M,)#A(
-MBU$(28U$)!!(B4$(28E,)!!)B50D&$B)`D'V1"1,`G1#08!D)$S]28M4)$!(
-MA=)T,TB+1"0H2(NP\`@``+\&````Z`````#K&V9FD&9FD$&#Q0%%."]V%69F
-M9I!F9I#I$O___T4X+P^')`$``$R)XKX&````2(M\)"#H`````$&`O"2#````
-M`'0D9F:09I!(BWPD*.@`````OP$```#H`````$&`O"2#`````'7A28N\)"`!
-M``!(A?]T$T$/MK0D#0$``+H!````Z`````!)BWPD6$B%_W0300^VM"2!````
-MN@$```#H`````$F+1"1`2(7`=&U(QT!@`````$'V1"1,!'4>2(M\)"CH````
-M`$F+="1`N@$```!(BWPD*.@`````28M4)$!(BTPD*$B+L?`(``"_!@```.@`
-M````28M4)$!(BT0D*$B+L/`(``"_`0```.@`````2<=$)$``````28L4)$F+
-M1"0(2(E""$B)$$B+5"0@@&H.`4B+3"08@&E8`4R)YDB+?"0HZ`````!(BU0D
-M.$B+1"082#E02'0+@&PD-P$/A8']__](@<1(`@``6UU!7$%=05Y!7\.005=!
-M5D%505154TB!["@"``!)B?])B?5(B=5(BP=(B40D$$0/MN%(C5PD($F)V$2)
-MX;H!````2(G^3(GOZ`````!$B>),B>Y(B>_H`````$R+=4A)@^X02(U=2$F-
-M1A!(.=AT+T$/MD9)/`UT%3PB=3/K#T$/MD9)/`UT!CPB9I!U(D'&1DH%0<9&
-M2P3&1"0>`>L%QD0D'@"`?"0@`'48Z=T!``!-BW8028/N$$F-1A!(.=AUONO<
-MQD0D'P!)C5=@2(E4)`A,BV5(28/L$$F-1"002#G##X2\`0``#[9$)!](P>`$
-M3(VL!(P```!F9F:028V\)-0```"Z"````$R)[N@`````A,`/A6`!``!-BV0D
-M$$F#[!!)C40D$$@YV`^$<P$``.O*08!'#@'&04H%QH'H`````,9!2P1FQX'(
-M``````#&@<H`````2,=!>```!0`/MGPD'TACQTC!X`1(C90$@`````^V0@2(
-M04@/MD(%B$%)3(EY4`^V0@B#X`^(@>H````/MW%H9H'FW_V)\(/($&:)06@/
-MMD((P.@$/`EU"8GP@\@P9HE!:$ACQTC!X`0/MH0$B````,#H!#P*=09F@4EH
-M``)(B6E82&/'2,'@!`^VE`2&````B)&!````2(N$!(P```!(B8'4````2(F!
-MS````(!%6`%)BT=H28E/:$B+5"0(2(D12(E!"$B)"$B+55!(C4$02(E%4$B)
-M61!(B5$82(D"#[912$B)T(/@!L9$)!X`2(/X!G4P]L(!=!D/MI&!````2(GN
-M3(G_Z`````#&1"0>`.L22(G.2(M\)!#H`````,9$)!X`@$0D'P$/MD0D'SA$
-M)"`/AT3^__^`?"0>`'0EO@H```!,B??H`````.L62(M\)!#H`````$B)P4B%
-MP`^%>?[__TB!Q"@"``!;74%<05U!7D%?PY!!5T%6055!5%532('L2`(``$F)
-M_4B)="0H2(LO#[9'*(A$)#=(C5=(2(E4)#A(.5=(#X2A`P``A,`/A)D#``!(
-MC4PD0$B#P5Q(B4PD($B-1"1`2(/`5$B)1"082(U4)$!(@\)`2(E4)!!(C4PD
-M0$B#P1!(B4PD"$B-1"1`2(/`($B)!"1(BWPD..@`````3(U@R$&X`````+D`
-M````N@````!,B>Y(BWPD*.@`````08G'A,`/A`L#``!!O@````"[`````(E<
-M)#!!N`````")V;H!````3(GN2(M\)"CH``````^VP$C!X`1(@\!D2#T``@``
-M#X>Y`0``3(U$)$")V;H!````3(GN2(M\)"CH`````+H(````3(GF2(M\)"#H
-M`````(3`#X2&`0``2(M,)#A(BU$(28U$)#A(B4$(28E,)#A)B50D0$B)`@^V
-M1"1"08A$)%E(BW0D&$R)[^@`````//]T%@^VP$AIP,@/``!(`X6("0``28E$
-M)!!%A/9T7P^V1"1#T>B#X`'!X`1!#[94)%V#XN\)PD&(5"1=#[9$)$/!Z`.#
-MX`'!X`6#XM\)PD&(5"1=#[9$)$/!Z`*#X`'!X`.#XO<)PD&(5"1=#[9$)$9!
-MB(0DNP```.FY````#[9$)$)!B$0D64V);"0(#[9$)$9!B(0DNP````^W1"1$
-M08E$)&`/MX0DD````&9!B80DN`````^VA"22````08B$)+H```!(BX0D@```
-M`$F)A"2H````2(M4)!!(BT((28F$)+````!(BT0D4$F)1"1X2(M,)`A(BT$(
-M28F$)(````!)C90DB````$B+1"1@28F$)(@```!(BPPD2(M!"$B)0@A(BT$0
-M2(E"$$B+1"1X28F$)*````"+3"0P3(GB2(MT)"A,B>_H`````.GY````08/&
-M`8/#`44X_@^$`@$``.G]_?__3(GWZ`````!(C5CP2(G:O@8```!,B>_H````
-M`("[@P````!T'F9FD$B)[^@`````OP$```#H`````("[@P````!UY4B+0T!(
-MA<!T64C'0&``````]D-,!'492(GOZ`````!(BW-`N@$```!(B>_H`````$B+
-M4T!(B[7P"```OP$```#H`````$B+4T!(B[7P"```OP8```#H`````$C'0T``
-M````2(L32(M#"$B)0@A(B1!!@&T.`4&`;"18`4B)WDB)[^@`````33ET)$@/
-MA2S___]!@&TH`4R)YDB)[^@`````2(M$)#A).45(="&`;"0W`70:9I#IO_S_
-M_TV-="1(33ET)$B0#X7R_O__Z\1(@<1(`@``6UU!7$%=05Y!7\-F9I!F9I!!
-M5T%6055!5%532('L.`(``$B)?"082(GU2(L&2(E$)"!(B?Y(B>_H`````$&X
-M`````+D`````N@````!(B>Y(BWPD&.@`````B$0D+X3`#X1N`P``0;\`````
-M0;X`````2(U52$B)5"0(2(U-8$B)#"1!N`````!$B?&Z`0```$B)[DB+?"08
-MZ``````/ML!(P>`$2(/`9$@]``(```^'#`,``$R-1"0P1(GQN@$```!(B>Y(
-MBWPD&.@`````3(UD)#!)C70D7$B)[^@`````//\/A=@"``!(BWPD(.@`````
-M2(G#2(7`#X3L`@``@$4H`<9`6`!)BT0D7$B)`TF-="142(GOZ``````\_W0:
-M#[;`2&G`R`\``$B+="0@2`.&B`D``$B)0Q!!#[9$)`*(0UE!#[9$)`/1Z(/@
-M`<'@!`^V4UV#XN\)PHA374$/MD0D`\'H`X/@`<'@!8/BWPG"B%-=00^V1"0#
-MP>@"@^`!P>`#@^+W"<*(4UU(B6L(00^V1"0&B(.[````28M$)`A(B4-P00^V
-M1"0'B$-:00^W1"0$B4-@00^W1"109HF#N````$$/MD0D4HB#N@```$F+1"1`
-M2(F#J````$F+1"1(2(F#L````$F+1"002(E#>$F+1"082(F#@````$B-BX@`
-M``!)C50D($F+1"0@2(F#B````$B+0@A(B4$(2(M"$$B)01!)BT0D.$B)@Z``
-M``!(BU502(U#.$B)15!(BTPD"$B)2SA(B5-`2(D"08`\)``/A&H!``!!O0``
-M``!(C7-(2(ET)!!(BWPD(.@`````2(G!2(7`#X1O`0``@$4.`<9`2@7&@.@`
-M````QD!+!$C'0'@```4`9L>`R```````00^W_4ACQTC!X`1)C50$8`^V0@2(
-M04@/MD(%B$%)2(EI4$B)65@/MD(&B(&!````#[9""(/@#XB!Z@````^W<6AF
-M@>;?_8GP@\@09HE!:`^V0@C`Z`0\"74)B?"#R#!FB4%H2&/'2,'@!$$/MD0$
-M:,#H!#P*=0IF@4EH``)F9F:02&/'2,'@!$F+1`1L2(F!U````$B)@<P```"`
-M0U@!2(M%:$B)36A(BQ0D2(D12(E!"$B)"$B+4U!(C4$02(E#4$B+="002(EQ
-M$$B)41A(B0(/ME%(2(G0@^`&2(/X!G4F]L(!=!0/MI&!````2(G>2(GOZ```
-M``#K#4B)SDB+?"0@Z`````!!@\4!00^V!"1F1#GH#X>L_O__9F9FD&9FD$&#
-MQP%!@\8!1#I\)"\/A:_\__^`?0X`=1'&10G_2(GN2(M\)"#H`````$B!Q#@"
-M``!;74%<05U!7D%?PV9F9I!!5T%6055!5%532(/L&$F)_DF)]$&X`````+D`
-M````N@````#H`````$&)Q83`=#:]`````+L`````3(U\)!>03(GYB=I,B>9,
-MB??H`````(!\)!?^#X6N````@\4!@\,!1#CM==I!#[9$)%B#Z`%!B$0D6(3`
-M='M)BRPD0<9$)%@`28M<)$A(@^LX28U4)$A(C4,X2#G0='!(@WL0`'5`ZP=(
-M@WL0`'4W0<9$)%@!3(GF3(GWZ``````/MHN[````2(N]L!```$G'P`````!(
-MB=I,B>;H`````.LM9F9FD$B+6SA(@^LX2(U#.$@YT'6QZQ9,B>9,B??H````
-M`$R)YDR)]^@`````2(/$&%M=05Q!74%>05_#9F9FD&9F9I!!54%455-(@^P(
-M2(G]28GT3(LONPH```!,B>9(B>_H`````(3`=0^_Z`,``.@`````@^L!=>)!
-M#[9U0T"$]G0B#[95#;D`````]L(!=`SK$DB)T$C3^*@!=0B#P0%`./%U[DF+
-M%"1)BT0D"$B)0@A(B1"`;0X!3(GF3(GOZ`````#V10P"=$E(BW5`2(7V=1A,
-MB>_H`````$B)QDB%P`^$4@$``$B)14!,B2Y(B:Z(````QD9&`,9&1P#&1D(`
-M9H-.3@1,B>_H`````.DF`0``2(M%0$B%P`^$N````$B-L)````!)BWTHZ```
-M``!(BW5`3(GOZ`````!,C65@3#EE8`^$A@```$R)Y^@`````2(G#2(M`0$B%
-MP'192,=`8`````#V0TP$=1E,B>_H`````$B+<T"Z`0```$R)[^@`````2(M3
-M0$F+M?`(``"_`0```.@`````2(M30$F+M?`(``"_!@```.@`````2,=#0```
-M``"`;0X!2(G>3(GOZ`````!,.65@#X5Z____2,=%0`````"`?0X`=!)(C7U@
-MZ`````!(B<&`;0X!ZPM,B>_H`````$B)P4B%R70Y2(M5:$B)36A(C45@2(D!
-M2(E1"$B)"H!%#@%(B6E0QD%(!<9!20#&04L&QD%*`TB)SDR)[^@`````2(/$
-M"%M=05Q!7<-F9F:09F9FD&9F9I!F9I!(@^PH2(E<)`A(B6PD$$R)9"083(EL
-M)"!(B?M(B?4/MTX@9H'YA0`/AY4````/M\$/MK0'8`@``$"`_O\/A(````!F
-M@_E_=RA`#[;62(N/.`D``$B-!%)(C02"2,'@!4B+1`A0#[9`".M)9F:09F:0
-M9H'Y@0!W'4`/ML9(BY>("0``2&G`R`\``$B+1!`(#[9`".L?0`^VQDB+EV`)
-M``!(C03`2,'@!4B+A!"(````#[9`"$`/MM8\_W0'9H'Z_P!U(TB#?7@`=`Q(
-MC75X2(G?Z`````!(B>Y(B=_H`````.D]`0``#[;`#[:,`^8(```/M\)(C11`
-M2(T4D$C!X@5)B=5,`ZLX"0``@'TD``^$K0```$B-!(E(C02!3(VDP\`!``!!
-M#[9,)`T/ME4[#[9U.D4/MD0D#DC'QP````"X`````.@`````28M5`$F+10A(
-MB4((2(D008!L)`X!3(GN2(G?Z`````!(B>Y(B=_H``````^V>T-`A/\/A*(`
-M``!!#[9T)`VY`````$#VQ@%U#^L9#[;*2(GP2-/XJ`%T$8G.2(G?Z`````#K
-M=KH`````@\(!0#CZ==KK9V9FD&:02(T$B4B-!(%,C:3#P`$``(!].@%U++\0
-M)P``Z`````!(B>Y(B=_H`````+D!````N@````!,B>Y,B>?H`````.L@OU##
-M``#H`````$B)[DB)W^@`````3(GN3(GGZ`````!(BUPD"$B+;"003(MD)!A,
-MBVPD($B#Q"C#9F:09I!!5T%6055!5%532(/L"$B)^TF)]4&)UD&)STB+!TB)
-M!"2`?PX`='F]`````$R-9V!,B>?H`````$B)PDB+0VA(B5-H3(DB2(E""$B)
-M$$PY:EAU#40XLH$```!T#69F9I"#Q0%`.&L.=\=`.&L.=#%!@/]0=2O&0DL&
-MQD)*!<9"2`?&0DD`3(EJ6$B)6E#&@LH`````2(G62(L\).@`````2(/$"%M=
-M05Q!74%>05_#D$B#[#A(B5PD"$B);"003(ED)!A,B6PD($R)="0H3(E\)#!(
-MB?U)B?0/MU8@9H'ZA0`/AXX````/M\(/MH0'8`@``#S_=']F@_I_=R0/ML!(
-MC11`2(T4D$C!X@5(`Y<X"0``2(M"4`^V4`CK7F9F9I`/MT8@9CV!`'<C#[?`
-M#[:$!V`(``!(:<#(#P``2`.'B`D``$B+0`@/ME`(ZRT/MT8@#[:$!V`(``!(
-MC03`2,'@!4@#AV`)``!(BX"(````#[90".L%NO____^Y_____V9!@7PD((4`
-M=PY!#[=$)"`/MHP%8`@```^VP@^VA`7F"```2(T4@$B-%)!,C;35P`$```^V
-MP4B-!,!(P>`%3(NM8`D``$D!Q4&`?"0\`@^%@````$$/MD0D0"7P````@_@@
-M=`6#^!!U:T$/ME0D0(G0@^`/@_@!=2B)T8'A\````$&X`0```+H"````O@``
-M``!,B>_H`````.GS"@``9F:000^V14=)BU3%6$$/MD0D0"7P````@_@@#Y3`
-M@\`(B(+J````2(M"8&:!8$[__NF]"@``00^V1"0DA,!T.XG#28-\)'@`=`U)
-MC70D>$B)[^@`````3(GF2(GOZ`````"`^P(/A8@*``!,B>Y(B>_H`````.EX
-M"@``0<>%"`$```````!!#[9%0CPD#X<#"@``#[;`_R3%`````$F+1B#V0#8(
-M#X0B"@``Z4<&``!F9I!(BY4($0``2('"3`@``$$/MD50P>`(2)A(`<*+`HD%
-M`````(/X!;H%````#T?"08A%.T&`?@\`=`]!QD5"`$'&1@\`Z9L)``!!QD5"
-M`NF1"0``2(N5"!$``$B!PDP(``!!#[9%4,'@"$B82`'"BP*)!0`````/ML!F
-M08E%/$B+E0@1``!(@<)$"```00^V15#!X`A(F$@!PHL"B04`````B<+!Z@AF
-M08E5/L'@"&9!"44\9H'Z0$&X`P```+H9````#T3"08A%0ND6"0``2(N5"!$`
-M`$B!PD0(``!!#[9%4,'@"$B82`'"BP*)!0````!!B$4Y2(N5"!$``$B!PDP(
-M``!!#[9%4,'@"$B82`'"BP*)!0````")P*@(=`=!QD4Z#.L@J`1T"D'&13H+
-M9F:0ZQ*#X`)(@_@!&<#WT(/@"D&(13I!#[9%1SP!&<"#X`*#P!1!B$5"Z8<(
-M``!(BX4($0``2`5,"```00^V55#!X@A(8])(`="+`(D%`````(/("$&(14A!
-MQD5"!>E3"```0<9%0@!!#[=%3F8E]_V#R`)F08E%3DF#?"1X`'0-28UT)'A(
-MB>_H`````$R)YDB)[^@`````0<9&"?],B?9(B>_H`````.EE"```0<9%0@3I
-M_@<``$$/MD5'@\`!08A%1T$Z13MS5T'&14(628-\)'@`=`U)C70D>$B)[^@`
-M````3(GF2(GOZ`````!!QX60````@(0>`$G'A:``````````38FMJ````$F-
-MM9````!(BWTHZ`````#I\@<``$'&14<`0<9%0A>_(*$'`.@`````Z7P'``!!
-MQD5"%.ER!P``0<9%0@CI:`<``$'&14(4Z5X'``!!QD5*`.@`````28F%\```
-M`$'&14(5Z4,'``!(BY4($0``2('"3`@``$$/MD50P>`(2)A(`<*+&HD=````
-M``^VVTB+E0@1``!(@<)$"```00^V15#!X`A(F$@!PHL"B04`````Z`````!)
-MB87X````@^,/@_L#=0I!QD5""NG<!@``08N%\`````5`#0,`03F%^````'D:
-M00^V14H\"G<10<9%0A6#P`%!B$5*Z:T&``!!#[9%1TF#?,58``^$U`$``$C'
-M!"0`````08!^#@!T0D&_`````$F-7F!(B=_H`````$B)!"1!#[9%1TB+%"1)
-M.53%6'0<2(M#"$B)4PA(B1I(B4((2(D008/'`44X?@YWR$&`;@X!2(L,)$B+
-M04!(A<`/A%,!``!(QT!@`````/9!3`1U-TB)[^@`````2(L4)$B+0F#&@!P!
-M```!2(MR0+H!````2(GOZ`````!(BPPD2(M!8,:`'`$```!(BP0D2(M00$B+
-MM?`(``"_`0```.@`````2(L4)$B+0D!(BXB`````2(7)=#$/MT(X2,>$Q6`$
-M````````2(M"0$C'@(``````````2(MR0$B+OI````"Z_______12(L,)$B+
-M04!(A<!T.$B+D(@```!(A=)T+`^W03A(QX3%8`0```````!(BT%`2,>`B```
-M``````!(BT%`2(NXD````/_22(L$)$B+4$`/MH+,````C02`#[92`@'02)@/
-MMH@`````#[95.@^V=3E(BP0D1`^V@(,```!(Q\<`````N`````#H`````$B+
-M#"1(BU%`2(NU\`@``+\&````Z`````!(BP0D2,=`0`````!!#[9%1TG'1,58
-M`````$B+-"1(B>_H`````$'&14()Z;X$``!(BY4($0``2('"3`@``$$/MD50
-MP>`(2)A(`<*+"HD-``````^VR4B+E0@1``!(@<)$"```00^V15#!X`A(F$@!
-MPHL"B04`````P>`("<A!B45408!]0@IT!ZD```$`=`I!QD5""^E4!```0<9%
-M0@Q!#[9%1TF#?,58`'1108!^#@`/A)0$``!!OP````!)C5Y@2(G?Z`````!(
-MB<)!#[9%1TDY5,58=0=!@&X.`>LI2(M#"$B)4PA(B1I(B4((2(D008/'`44X
-M?@YV#>O$2(GOZ`````!(B<)(A=(/A#H$``!!#[9%1TF)5,5800^V14N(@NH`
-M``#IPP,``$B)[^@`````OP$```#H`````(/K`8/[_W0*28M&(/9`-@ATW$'&
-M14()Z94#``!(BY4($0``2('"3`@``$$/MD50P>`(2)A(`<*+"HD-``````^V
-MR4B+E0@1``!(@<)$"```00^V15#!X`A(F$@!PHL"B04`````#[;`P>`("<@E
-M_P\``#T3`0``#Y3"/2,!```/E,&$TG40A,EU##TS`0``=4+I2`,``$'&14(8
-MA-*0=`I!QD5+".D'`P``A,EFD'0*0<9%2PGI]P(``#TS`0``#X7L`@``0<9%
-M2PIF9F:0Z=X"``!!#[9-1@^VT4$/MD4[@^@!.<)]%HU!`4&(149!@$5'`4'&
-M14('Z;0"``!!QD5'`$'&14(>Z:4"``!!QD5"`^F;`@``0<9%0B)F9I#IC@(`
-M`$'&14(CZ80"``!!QD5"`^EZ`@``2(N5"!$``$B!PDP(``!!#[9%4,'@"$B8
-M2`'"BPJ)#0````!(BY4($0``2('"1`@``$$/MD50P>`(2)A(`<*+$HD5````
-M`(G0P>`(#[;)"<AF/0,1#X6C````B=#!Z`AF/453=`IF/4`##X6.````9D''
-M13P#$69!B44^9CU%4W4?08"]%0$```)T%4'&A14!```"0<>%&`$``!\```#K
-M)F9!@7T^0`-U'4&`O14!```#=!-!QH45`0```T''A1@!```/^`,`0<:%'`$`
-M``%,B>_H`````$'&A1P!````28M%`$B+N/`(``"^`````.@`````0<9%0@/I
-M?0$``$'&14(A0<:%%0$```#I:P$``$B+E0@1``!(@<),"```00^V15#!X`A(
-MF$@!PHL"B04`````2(N5"!$``$B!PD0(``!!#[9%4,'@"$B82`'"BP*)!0``
-M``!!QD5"'^D;`0``0<9%0B#I$0$``$B+E0@1``!(@<),"```00^V15#!X`A(
-MF$@!PHL"B04`````2(N5"!$``$B!PD0(``!!#[9%4,'@"$B82`'"BP*)!0``
-M``!!#[9-1T$/MD4[C5$!08A51P^VR0^VP(/H`3G!N`8```"Z'P````],PD&(
-M14+IF0```$B+E0@1``!(@<),"```00^V15#!X`A(F$@!PHL*B0T`````#[;)
-M2(N5"!$``$B!PD0(``!!#[9%4,'@"$B82`'"BP*)!0````#!X`@)P4&)C00!
-M``!!QD5"&NL]0<9%0AOK-DB+A0@1``!(!4P(``!!#[954,'B"$ACTD@!T(L`
-MB04`````@^#W08A%2$'&14(<ZP5!QD5"'4F#?"1X`'0-28UT)'A(B>_H````
-M`$R)YDB)[^@`````3(GN2(GOZ`````#K,$'&14(8Z<+\__](B>]F9I#H````
-M`+\!````Z`````"[/D(/`.D!_/__9F9FD&9FD$B+7"0(2(ML)!!,BV0D&$R+
-M;"0@3(MT)"A,BWPD,$B#Q#C#9F9FD&9FD&9FD&9FD$B#[#A(B5PD"$B);"00
-M3(ED)!A,B6PD($R)="0H3(E\)#!(B?U(B?,/MTX@9H'YA0`/A]\````/M\$/
-MMK0'8`@``$"`_O\/A,H```!F@_E_=R)`#[;62(N/.`D``$B-!%)(C02"2,'@
-M!4B+1`A0#[9`".M#9H'Y@0!W'4`/ML9(BY>("0``2&G`R`\``$B+1!`(#[9`
-M".L?0`^VQDB+EV`)``!(C03`2,'@!4B+A!"(````#[9`"#S_=%L/ML`/MHP%
-MY@@``(#Y_W050(#^_W0/#[9[)$"`_P9U969FD&:0@/G_=#%`@/[_="M`#[;&
-M2(T40$B-%)!(P>(%28G43`.E.`D``$'&1"1+`D'&1"1*_^FZ!P``2(-[>`!T
-M#$B-<WA(B>_H`````$B)WDB)[^@`````Z<<'``!F9F:09F:00`^VQDB-%$!(
-MC1202,'B!4F)U$P#I3@)``!!#[>T),@```!F@?ZK#7<&0(#_`G4Z2(-[>`!T
-M#$B-<WA(B>_H`````$B)WDB)[^@`````0<9$)$K_0<9$)$L"3(GF2(GOZ```
-M``#I5@<``+H`````0(#_('4>2(M34`^V`H/@?SQQ=@D/ME(!@^(/ZP</ME("
-M@^(/1`^VZ4N-1*T`28U$A0!,C;3%P`$```^V0S@\&@^$Y@4``#P:=QP\$G1.
-M/!60#X2)!@``A,`/A(X%``!FD.F[!@``/"4/A"<#```\)9!W$SP;#X6F!@``
-M9F:09F:0Z5P%```\G@^$%`0``#R@D`^%B@8``.E8!@``0(3_9I`/A<T"``!(
-MBTM(@'LY`&:0=&9(A<ET2X!Y`8!U18!Y`@!U/P^V00,\/'<W#[;028VT)(0`
-M``"X`````,8$,"!(@\`!2(/X%'7R@_H4#T/028V\)(0```")TDB-<03H````
-M`&9!QX0DR```````0<9$)$H9Z0@&``!!QD0D2ACV009`=1$/M@&#X!^#^`T/
-MA9$!``#K"P^V`8/@'X/X#74(0<9$)$D-ZP9!QD0D22)!#[9T)$E(Q\<`````
-MN`````#H`````$B#>W@`=`Q(C7-X2(GOZ`````!(B=Y(B>_H`````$N-1*T`
-M28U$A0"`O,7.`0````^$M04``$&^`````$N-1*T`28U$A0!(P>`#3(VD!2`"
-M``!(C1PH3(V[P`$``$R)Y^@`````2(N3*`(``$B)@R@"``!,B2!(B5`(2(D"
-M#[9`23PB=`0\#74*08/&`44X=PYWRDN-1*T`28U$A0`/MH3%S@$``$0X\`^%
-M/04``(3`#X0U!0``0;P`````9L=$)`8``$&_`````$N-1*T`28U$A0!(P>`#
-M3(VL!2`"``!(C1PH3(VSP`$``$R)[^@`````2(G"2(N#*`(``$B)DR@"``!,
-MB2I(B4((2(D0#[9"23PB=`0\#743#[=".&8[1"0&<@AFB40D!DF)UT&#Q`%%
-M.&8.=[1-A?\/A*P$``!!@']*_P^$H00``$'&1TK_3(G^2(GOZ`````#IC`0`
-M`(/X`7410<9$)$D!0<9$)$K_Z48$``#V004!9I!T"&9!@4PD:``$2(MS2$B%
-M]G1F28V4))@```"X`````,8$$`!(@\`!2(/X*'7R28V4),````"P`,8$$`!(
-M@\`!2(/X"'7R28V,))@```!(C58(2(M&"$F)A"28````2(M""$B)00A(BT(0
-M2(E!$(M&($&)A"3`````08.\))`!````#X6X`P``0<9$)$H<Z:T#``"-1@%F
-M08F$),@```"_$"<``.@`````0<9$)$H%Z8P#``!(BTM(0(3_#X69````#[91
-M!L'B"`^V007!X!`)P@^V00<)P@^V003!X!@)PD&)E"3D````#[81P>(8#[9!
-M`PG"#[9!`L'@"`G"#[9!`<'@$`G0B<))B50D>$&#O"3D`````'4?9D&#A"3(
-M`````;\0)P``Z`````!!QD0D2AOI"0,``(/X_W439D&!3"1H``1!QD0D2AOI
-M\0(``$'&1"1*#>GF`@``0(#_(&:0=2Z`^@9T!8#Z`G4DC48!9D&)A"3(````
-MOQ`G``#H`````$'&1"1*!>FS`@``9F:02(-[>`!T#$B-<WA(B>_H`````$B)
-MWDB)[^@`````3(GB3(GV2(GOZ`````#IKP(``$R+0TA`A/\/A<P```!!#[90
-M"L'B"$$/MD`)P>`0"<)!#[9`"PG"00^V0`C!X!@)PD&)E"3D````00^V2`-(
-MP>$@00^V0`)(P>`H2`G!00^V`$C!X#A("<%!#[9``4C!X#!("<%!#[90!L'B
-M"$$/MD`%P>`0"<)!#[9`!PG"00^V0`3!X!@)PD@)T4F)3"1X0?9`#`%T!V9!
-M@TPD:@1!@[PDY`````!U'V9!@X0DR`````&_$"<``.@`````0<9$)$H;Z;@!
-M``!F08-,)&@!0<9$)$H-Z:8!``!`@/\@9I!U+H#Z!G0%@/H"=22-1@%F08F$
-M),@```"_$"<``.@`````0<9$)$H;Z7,!``!F9I!(@WMX`'0,2(US>$B)[^@`
-M````2(G>2(GOZ`````!,B>),B?9(B>_H`````.EO`0``0<9$)$H4Z30!``!`
-M@/\@=2Z`^@9T!8#Z`G4DC48!9D&)A"3(````OQ`G``#H`````$'&1"1*%.D#
-M`0``9F:00<9$)$H;Z?4```!`A/]FD'5M2(M#2&9!@TPD:`)F08-,)&H!9D&!
-M3"1HA`"`>`,`=06`.!9W'V9!@X0DR`````&_$"<``.@`````0<9$)$H-Z:H`
-M``#V0`8$=`EF08-,)&H"ZP=F08-D)&K]2(M#>$F)1"0P2,=#>`````#K.$"`
-M_R!U*X#Z!G0(@/H"9F:0=26-1@%F08F$),@```"_$"<``.@`````0<9$)$H%
-MZU!F08-D)&CY0<9$)$H.ZT%`A/]U!V9!@TPD:@-!QD0D2@_K+4"$_W4+2(G>
-M2(GOZ`````!!@[PDD`$```$9P(/@$X/`!4&(1"1*9F9FD&9FD$B#>W@`=`Q(
-MC7-X2(GOZ`````!(B=Y(B>_H`````$R)YDB)[^@`````9F9FD&9FD$B+7"0(
-M2(ML)!!,BV0D&$R+;"0@3(MT)"A,BWPD,$B#Q#C#D)"0D)"0D)"0D)"0D(/B
-M!\'B"(#.($B+1PA(+>0\``!(P>8(@>8`_P``2`'PB1`/MP!FB04`````#[;`
-MPX/B!\'B"(C*@,X02(M'"$@MY#P``$C!Y@B!Y@#_``!(`?")$,-F9F:09F9F
-MD&9FD%53O0````"[`````$&Y_____T&[`````$6)VD&#PP&X`0```$&)P$2)
-MV4'3X$2)P;X`````N,#AY`"Z`````/?Q.?AW$8GZ*<)$.<IS"$2)U8GS08G1
-M@\8!1`'!@_X0==1!@_L(=;&-!-T`````">@/ML!;7<-F9F:09F:09F:02(/L
-M$$B)'"1,B60D"$F)_$`/MMZY`````+H'````B=[H*____T$/MHPD.1(``+H#
-M````B=Y,B>?H$____TB+'"1,BV0D"$B#Q!##9F:09I!3B?,/MO*Z`P```.C`
-M_O__.-@/E,`/ML!;PV9FD&9FD$B%_W0WN@````!F9I!F9I`/MH0ZX@@```^V
-MR#S_=!,/M\%(C03`2,'@!4@#AV`)``##2(/"`4B#^@1UU+@`````PV9F9I!F
-M9F:09F:09F:055-(BY_X"```2(7;2`]$W[T`````N0````"Z!P```(GN2(G?
-MZ&?^__^Y1````+H"````B>Y(B=_H4_[__[G0````N@````")[DB)W^@__O__
-MN0````"Z!````(GN2(G?Z"O^__^#Q0&#_0)UJ+^@A@$`Z$G^__^(@SD2```/
-MMLBZ`P```+X`````2(G?Z/[]__];7<-F9F:09F9FD&9FD$%455-(B?L/MH<5
-M`0``/`(/A;(```!$BY<8`0``0;P`````O0```"I!N0````"^`````+\`````
-M0;@$````9I"Z`0```(G0B?'3X$&%PG48C4X&T^)!"=1!"=&X%0```(GYT^`)
-MQ>L)1(G`B?G3X`G%@\8!@\<%08/``X/^!77`1(G)NJ@#``!`M@%(B=_H````
-M`(GINL0#``"^`0```$B)W^@`````00^WS`N+&`$``+J@`P``O@$```!(B=_H
-M`````.FX````/`,/A;````!$BY<8`0``0;P`````O0```"I!N0````"^````
-M`+\`````0;@$````N@$```")T(GQT^!!A<)U&(U.!M/B00G400G1N!4```")
-M^=/@"<7K"42)P(GYT^`)Q8/&`8/'!4&#P`.#_@1UP$2)R;JH`P``0+8!2(G?
-MZ`````")Z;K$`P``O@$```!(B=_H`````$$/M\P+BQ@!``#WT;J@`P``O@$`
-M``!(B=_H`````&9FD%M=05S#9F9FD&9F9I!F9I!(@^P(B?&$TG06N/[____3
-MP"&'&`$``.L49F9FD&9FD+@!````T^`)AQ@!``#H`````$B#Q`C#9F:09F:0
-M9F:04TB)^V;'APP!```!``^W]HGQP>$-0;@!````NJ`#``"^`0```.@`````
-MOA0```!(B=_H`````%O#9F9FD&9FD$B#[`B)\832=1:X_O___]/`9B&'``$`
-M`.L49F:09F:0N`$```#3X&8)AP`!```/M[<``0``Z`````!(@\0(PY!(@^PH
-M2(E<)`A(B6PD$$R)9"083(EL)"!)B?U!B=0/MJ[,````#[9>`DB+?G!(A?]T
-M"P^VT@^V\^@`````@/L#=Q"-%*N-1*L$0(#]`P]&PNL-C540C44@0(#]`P]&
-MPD$/MM0/MO!,B>_H`````$B+7"0(2(ML)!!,BV0D&$R+;"0@2(/$*,-F9I!F
-M9I!F9I!!5%5328G\NP````!`#[;NN@(```")[DR)Y^C!^O__J`AT#;@`````
-MZR!F9I!F9I"_`0```.@`````@\,!@?L0)P``=<NX_P```%M=05S#D$B#["A(
-MB5PD"$B);"003(ED)!A,B6PD($B)_4F)S4&)U$`/MMZ)WNB$____A<!U,$$/
-MMO2)VDB)[^B"^___A<!T'KH!````B=Y(B>_H/_K__T&(10"X`````.L)9F9F
-MD+C_____2(M<)`A(BVPD$$R+9"083(ML)"!(@\0HPV:02(/L*$B)7"0(2(EL
-M)!!,B60D&$R);"0@2(G]08G-1`^VXD`/MMY$B>&Z`0```(G>Z`OZ__^Y0```
-M`+H"````B=Y(B>_H]_G__XG>2(GOZ-W^__^%P'5,187M=#1!]L0!=!6)VKY`
-M````2(GOZ,_Z__^%P'0NZS.)VKX8````2(GOZ+KZ__^%P'09ZQYF9F:0B=J^
-M*````$B)[^BA^O__A<!U![C_````ZP:X`````)!(BUPD"$B+;"003(MD)!A,
-MBVPD($B#Q"C#9F9FD&9FD$%7059!54%455-(@^P(28G]2(D,)$6)QHGSB=6$
-MT@^$\0```$0/MOZY9````+H"````1(G^Z#;Y__]$B?Y,B>_H&_[__X7`=1"Z
-M`P```$2)_DR)[^CG^/__0`^VU;D!````1(G^3(GOZ,/^__]!O/____^$P`^%
-M@P$``$&\`````$6%]@^.=`$``$B+'"1!O`````!!C6[_1#GE=36Y0````+H"
-M````1(G^3(GOZ+[X__])8\Q(`PPDNE@```!$B?Y,B>_HY_W__X7`=#7I+`$`
-M`+E$````N@(```!$B?Y,B>_HB?C__TB)V;I0````1(G^3(GOZ+;]__^%P`^%
-M_````$&#Q`%(@\,!13GT#X3K````ZX._H(8!`.B!^/__#[;K#[;(N@,```")
-M[DR)[^@\^/__B>Y,B>_H(OW__X7`=")!#[:-.1(``+H#````B>Y,B>_H%_C_
-M_T&\_____^F:````B>J^8````$R)[^C]^/__A<!T#4&\`````$6%]GYEZQ]!
-M#[:-.1(``+H#````B>Y,B>_HU??__T&\_____^M;2(L<)$&\`````&9FD+E$
-M````N@(```")[DR)[^BL]___2(G9NH````")[DR)[^C:_/__A<!U#4&#Q`%(
-M@\,!13GT=<E!#[:-.1(``+H#````B>Y,B>_H<O?__T2)X$B#Q`A;74%<05U!
-M7D%?PTB#[!A(B5PD"$R)9"0028G\2(G00`^VUD&)R$B)P;X!````Z,C]__^)
-MP[E4````N@(```"^`0```$R)Y^@?]___B=A(BUPD"$R+9"002(/$&,-F9F:0
-M9F9FD&9FD&9FD$B#[!A(B5PD"$R)9"0028G\2(G00`^VUD&)R$B)P;X`````
-MZ&C]__^)P[E4````N@(```"^`````$R)Y^B_]O__B=A(BUPD"$R+9"002(/$
-M&,-F9F:09F9FD&9FD&9FD$%6055!5%5328G]2(G-18G&B=-$#[;FN60```"Z
-M`@```$2)YNAW]O__1(GF3(GOZ%S[__^%P'40N@,```!$B>9,B>_H*/;__P^V
-MT[D!````1(GF3(GOZ`7\__^$P'4V187V?CA(B>N]`````&9F9I`/MA.Y````
-M`$2)YDR)[^C=^___A,!U#H/%`4B#PP%$.?5T">O;N/_____K!;@`````6UU!
-M7$%=05[#9F:09F:02(/L&$B)7"0(3(ED)!!)B?Q(B=!`#[;608G(2(G!O@``
-M``#H*/___XG#N50```"Z`@```+X`````3(GGZ*_U__^)V$B+7"0(3(MD)!!(
-M@\08PV9F9I!F9F:09F:09F:02(/L"$B+A_@(``!(A<!(#T3'0(@U`````+D@
-M````2,?"`````+X.````2(G'Z`````!(@\0(PV9FD&9FD&9FD$B#[`B)\832
-M=!:X`0```-/@9@F'9!0``.L49F:09F:0N/[____3P&8AAV04```/MK=D%```
-MZ`````!(@\0(PY!!5T%6055!5%532(/L2$B)^TF)]DB+3BA(@\$!BW8<@^X!
-MQT0D1`````!)BT8P2(E$)"`/ME$!@/H!=11!QT90`````.F'!```9F9FD&9F
-MD(#Z`G5)@'D"`74V2(N'^`@``$B%P$@/1,=(BY#P"```#[9!`XB"9A0```^V
-M00.(@NXH``!!QT90`````.D_!```0<=&4/[____I,@0``(#Z!`^%_@$```^V
-M00.#Z#L\`0^'[P$``$V+?BA)@\<!00^V;P)(BY_P"```0`^V]4B)W^@`````
-MB<*$P'0-#[;`@+P#8`@``/]U4$B+F_`(``!(@<.(%```2(N[\`@``.@`````
-MB>HHP@^V\DB)W^@`````B<*$P'0-#[;`@+P#8`@``/]U%$''1E#_____3(GW
-M0?]62.FM`P``#[;"#[:$`V`(``"`^H%W9`^VR$AIR<@/``!!#[9W!$$/ME<%
-MP>(000^V1P;!X`@)PD$/MD<'"<*)5"0L00^V5PC!XA!!#[9'"<'@"`G"00^V
-M1PH)PHE4)#!(B<U(`ZN("0``#X3M````@'U8`'4=Z>(```!!QT90_____TR)
-M]T'_5DAF9F:0Z2$#``!!O`````#&1"0W`$R-;4B+1"0L2(E$)!!)C5<+2(E4
-M)`A`#[;VB70D!$R)[^@`````2(U8\$B+55!(B4503(EK$$B)4QA(B0(/MD-)
-M/`UT!#PB=5U!#[9'`SP[="(\/'5038GPBTPD+(M4)#"+="0$2(G?Z`````#&
-M1"0W`>LR2(N[*`$``$B+5"002(MT)`CH`````$V)\(M,)"R+5"0PBW0D!$B)
-MW^@`````QD0D-P%!@\0!1#AE6`^':O___X!\)#<`#X57`@``0<=&4/____],
-MB?=!_U9(9I#I00(``(#Z`P^%F0```(!Y`@$/A8(````/MD,^C30`#[9Y`XGZ
-MB?C!^A_W_HG5.=9^6TR-:01$#[;B#[91!$2)YDB)W^@`````C47\@_@#=AB-
-M1?2#^`-V$(U%[(/X`W8(C47D@_@#=P=(@<.(%```00^V50!$B>9(B=_H````
-M`$''1E``````Z:,!``!!QT90_O___^F6`0``0<=&4/[____IB0$``(`Y!78W
-M@'D$_G4Q2(U4)$1(B[OP"```3(GVZ`````"$P`^%8@$``,=$)$0`````0<=&
-M4/_____I30$``$R+J_@(``!-A>U,#T3K2(G+N`(```!(*<A(B40D&$QC_NF<
-M````9F9FD&9FD`^V*TR-8@$/MM#VP@%T08M,)$2-1`T`03M&(`^'V@```(G)
-M2`-,)"!!B>B^`````$R)[^BX]___.>@/A;L````!;"1$3(GCZTQF9F:09F:0
-M2&/%2HT<($B+1"082`'83#GX#X^3````08GH3(GAO@````!,B>_H1?K__X7`
-M=7R`.P!U!H![`0!T"[\0)P``D.@`````2(U3`0^V0P&$P`^%6____P^V`X3`
-M=%</MMBY5````+H"````O@````!,B>_HFO#__XM,)$1!BT8@*<@YPP]'V(G)
-M2`-,)"!!B=BZ`````+X`````3(GOZ/_V__^%P'@&`40D1.L(0<=&4/____^Y
-M5````+H"````O@````!,B>_H1O#__V9FD&9FD$F+5CA(A=)T!HM$)$2)`DR)
-M]T'_5DA(@\1(6UU!7$%=05Y!7\-F9F:09F9FD&9FD$B#[`A(BX?X"```2(7`
-M2`]$QTB+N/`(```/MH=G%```A,!T#8/H`8B'9Q0``(3`=1W&!0``````N2``
-M``!(Q\(`````O@X```#H`````$B#Q`C#9F9FD&9FD&9FD&9FD$B#[`A(BX?X
-M"```2(7`2`]$QTB+N/`(``"`OV84````=22`AV<4```!Q@4``````;D@````
-M2,?"`````+X.````Z`````!(@\0(PV9FD&:02(/L&$B)7"0(3(ED)!!)B?Q(
-MB=!`#[;608G(2(G!O@````#HF/C__XG#N50```"Z`@```+X`````3(GGZ!_O
-M__^)V$B+7"0(3(MD)!!(@\08PY"0D)"0D)"0D)"0D)"0B?9(BT<(2"T``@$`
-M2`'&BP:)!0````##9F9FD&9F9I")]DB+1PA(+0`"`0!(`<:)%L-F9F:09F9F
-MD&9FD&9FD%-(B?M(BU<(2('J``(!`,>"@``!``````"+@@0!`0")!0````"`
-MS`&)@@0!`0"Z"````+X,P@``Z`````"ZN`L``+X(P@``2(G?Z`````"Z`0``
-M/+X`P@``2(G?Z`````"Z"````+X,PP``2(G?Z`````"ZN`L``+X(PP``2(G?
-MZ`````"Z`0``/+X`PP``2(G?Z`````"Z@("`@+XXP@``2(G?Z`````"Z"!@H
-M.+X@P@``2(G?Z`````"Z@("`@+X\P@``2(G?Z`````"Z"1DI.;XDP@``2(G?
-MZ`````"Z@("`@+Y`P@``2(G?Z`````"Z"AHJ.KXHP@``2(G?Z`````"Z@("`
-M@+Y$P@``2(G?Z`````"Z"QLK.[XLP@``2(G?Z`````"Z@("`@+Y(P@``2(G?
-MZ`````"Z2$E*2[XPP@``2(G?Z`````"Z@("`@+XXPP``2(G?Z`````"Z#!PL
-M/+X@PP``2(G?Z`````"Z@("`@+X\PP``2(G?Z`````"Z#1TM/;XDPP``2(G?
-MZ`````"Z@("`@+Y`PP``2(G?Z`````"Z#AXN/KXHPP``2(G?Z`````"Z@("`
-M@+Y$PP``2(G?Z`````"Z#Q\O/[XLPP``2(G?Z`````"Z@("`@+Y(PP``2(G?
-MZ`````"Z3$U.3[XPPP``2(G?Z`````#'0U2`@("`QT-8@("`@,=#7("`@(#'
-M0V"`@("`QT-D@("`@$B-@X@4``#'0%2`@("`QT!8@("`@,=`7("`@(#'0&"`
-M@("`QT!D@("`@%O#9I!(BU<(2('J``(!`(N";``!`(D%`````(F";``!`,-F
-MD$B+5PA(@>H``@$`BX)H``$`B04`````"?")@F@``0##55-(B?N)\4@YO_`(
-M```/A;P```")\,#H`D&X`````)`/MO")R/?0@^`#C3S%`````+@'````B?G3
-MX/?01(M,LU1!(<%$B4RS5(32=`ZX`0```-/@1`G(B42S5$$/ML")Q<'E"(M3
-M5(VU.,(``$B+N_`(``#H`````(M36(VU/,(``$B+N_`(``#H`````(M37(VU
-M0,(``$B+N_`(``#H`````(M38(VU1,(``$B+N_`(``#H`````(M39(VU2,(`
-M`$B+N_`(``#H`````%M=PXGPP.@"@^@%0;@!````Z3W___]F9F:09F:09F:0
-M9F:005=!5D%505154TB#[`A(B?U!B?9!B==!B<U(BT<(3(L@3(GGZ`````!(
-MB<-(A<`/A.L```!,B>?H`````$B)PDB%P`^$UP```,9%7`'&0SCAQD,Y`<9#
-M.A#&0R6[#[9%6V:)0R!,B6,HQT,TD````$B-0A!(B4-(2(E3>$B)P4B)PK@`
-M````Q@00`$B#P`%(/9````!U\,9!`8+&`4!$B'$"1(AY`T2(:01!@/T"=R%(
-MC7D(2HT4K0````"!XOP#``!)C;0DH!(``.@`````ZRM)BX0DH!(``$B)00A(
-MC7D000^VU8T4E?C___](8]))C;0DJ!(``.@`````2,>#H`````````!(C7M8
-MO@````#H`````$B)WDR)Y^@`````2(/$"%M=05Q!74%>05_#D$B#[#A(B5PD
-M"$B);"003(ED)!A,B6PD($R)="0H3(E\)#!(B?U!B?5!B=9!B<](BT<(3(L@
-M3(GGZ`````!(B<-(A<!T>TR)Y^@`````2(G"2(7`=&O&15P!QD,XX<9#.0'&
-M0SH0QD,ENP^V15MFB4,@3(EC*,=#-)````!(C4(02(E#2$B)4WC&0`$"QD(0
-M0$2(:`)$B'`#1(AX!$C'@Z``````````2(U[6+X`````Z`````!(B=Y,B>?H
+MN@$```#I&`0```^V1T%)BU0D(`^V4@B-!(*-!(`/ME9Q`=!(F`^VB``````/
+MME<Z#[9W.4C'QP````"X`````.@`````2(MK4$R+90!,B>?H`````$B)P4B%
+MP'41QH/!`````;H!````Z;0#``#&0#CAQD`Y`<9`.A@/MT,X9HE!($B+10!(
+MB4$HQT$T`````$C'04@`````2,>!H`````````!(B<Y,B>?H`````+H!````
+MZ6D#``!,B>?H'//__[H!````Z5<#``!)BRPD2(GOZ`````!(B<$/MD-D2(7)
+M=1'&@\$````!N@$```#I+@,``,9!..'&03D!QD$Z!8A!.P^W0SAFB4$@28L$
+M)$B)02C'030`````2,=!2`````!(QX&@`````````$B)SDB)[^@`````N@$`
+M``#IX`(``$F++"1(B>_H`````$B)P0^V0V5(A<EU$<:#P0````&Z`0```.FW
+M`@``QD$XX<9!.0'&03H$B$$[#[=#.&:)02!)BP0D2(E!*,=!-`````!(QT%(
+M`````$C'@:``````````2(G.2(GOZ`````"Z`0```.EI`@``28LL)$B)[^@`
+M````2(G!2(7`=1'&@\$````!N@$```#I1`(``,9`..'&0#D!QD`Z!@^W0SAF
+MB4$@28L$)$B)02C'030`````2,=!2`````!(QX&@`````````$B)SDB)[^@`
+M````N@$```#I^0$``&9F9I!)BRPD2(GOZ`````!(B<%(A<!U$<:#P0````&Z
+M`0```.G0`0``QD`XX<9`.0'&0#H,#[=#.&:)02!)BP0D2(E!*,=!-`````!(
+MQT%(`````$C'@:``````````2(G.2(GOZ`````"Z`0```.F%`0``28LL)$B)
+M[^@`````2(G!2(7`=1'&@\$````!N@$```#I8`$``,9`..'&0#D!QD`Z%L9`
+M/`$/MT,X9HE!(,:!F`````])BP0D2(E!*,=!-`````!(QT%(`````$C'@:``
+M````````2(G.2(GOZ`````"Z`0```.D*`0``QD9*_V;'@[@``````(![2P)U
+M$DB+<U!(B=I,B>_H`````&9FD$'V1"0+`G47NP````!)C6PD0$&`?"0-`'4F
+MZ9,```!)BW0D*(!&10%,B>_H`````+H!````Z:L```!F9I!F9I!(B>_H````
+M`$B)PDF+1"1(28E4)$A(B2I(B4((2(D0@'I*_W1#@'I)`'4V@+K!`````'1<
+M#[9*2$B)R(/@!DB#^`9T3$B#^`1U1O;!`71!2(G63(GOZ`````"Z`0```.M$
+MQH+!`````(/#`4$X7"0-=XY!QD0D"?],B>9,B>_H`````+H!````ZQMF9I!F
+M9I"Z`0```.L.187V#X1V^O__Z8[Z__^)T$B+7"0(2(ML)!!,BV0D&$R+;"0@
+M3(MT)"A,BWPD,$B#Q#C#9F:09F:02(/L*$B)7"002(EL)!A,B60D($B)^TB)
+M]4B+=DA$#[9%.@^W32!F@?F#``^'B@,```^WP0^VO`=X!P``0(#__P^$=0,`
+M`&:#^7]W)$`/MM=(BXM("```2(T$TDB-!()(BT3!4`^V0`CK(69FD&9FD$`/
+MML=(BY-P"```2,'@"$B+A!"`````#[9`"#S_#X0H`P``#[;`#[:$`_P'```\
+M_W010(#__W0+1`^V321!@/D&=3X\_P^$``,``$"`__^0#X3U`@``0`^VQTB-
+M%,!(C1202,'B`TF)U$P#HT@(``!!QD0D2P)!QD0D2O_IOP(``$`/ML=(C13`
+M2(T4D$C!X@-)B=1,`Z-("```183)#X2N````08#X!@^$I````$&`^`P/A-@!
+M``!%#[9$)$H/MD-!28M4)%!(BU(@#[92"(T$@HT$@$$/ME0D<0'02)@/MH@`
+M````#[93.@^V<SE!#[>$)+@```")!"1%#[;)2,?'`````+@`````Z`````!!
+M#[>4)+@```"-0@%F08F$)+@```!F@_H!=AE!@'PD2@9T$4'&1"1+`D'&1"1*
+M_^G]`0``O^@#``#H`````.GN`0``08#X`74-0<9$)$H$9I#IVP$``$&`^`)U
+M"T'&1"1*!>G*`0``08#X`P^%$`$``$&`?"1*&G4@9H%^!,@W9I!U%F9!QX0D
+MN```````0<9$)$H&Z9@!``!,B>?H`````$F-O"2(````OB@```#HOM3__X3`
+M=4I)C7PD=+X4````Z*O4__^$P'4W28V\)+````"^"````.B5U/__A,!U(4F#
+M?"1H`'099D''A"2X``````!!QD0D2A?I,P$``&9FD`^V0T%)BU0D4$B+4B`/
+MME((C02"C02`00^V5"1Q`=!(F`^VB``````/ME,Z#[9S.44/MX0DN````$C'
+MQP````"X`````.@`````9D&#O"2X````'7810<9$)$L"0<9$)$K_Z<D```"_
+MZ`,``.@`````9D&#A"2X`````>FP````08#X%W469D''A"2X``````!!QD0D
+M2A7IE````$&`^!AU$V9!QX0DN```````0<9$)$H6ZWM!@/@$=1-F0<>$)+@`
+M`````$'&1"1*!^MB08#X!7439D''A"2X``````!!QD0D2@CK24&`^`9U$V9!
+MQX0DN```````0<9$)$H)ZS!!@/@,=1-F0<>$)+@``````$'&1"1*"NL708#X
+M%G419D''A"2X``````!!QD0D2A1,B>9(B=_H`````$B#?7``=`Q(C75P2(G?
+MZ`````!(B>Y(B=_H`````$B+7"002(ML)!A,BV0D($B#Q"C#9F:02(/L&$B)
+M'"1(B6PD"$R)9"0028G\2(GU2(N^@`````^W3DKVP2!(Q\(`````2,?`````
+M`$@/1="`?D(:#X>^!```#[9&0O\DQ0`````/ME9%#[9&.CC"#X-5!```#[;"
+M2(MTQEA(A?8/A#8$``#I&@0``,9&0@'&144`2<?!`````$&X`````+D"````
+MN@$```"^`````$B)[^@`````N`````#I7`0``$G'P0````!!N`````"Y````
+M`+H!````O@````!(B>_H`````+@`````Z2X$``!)Q\$`````0;@`````N0$`
+M``"Z`0```+X`````2(GOZ`````"X`````.D`!```2<?!`````$&X`````+E@
+M````N@$```"^`````$B)[^@`````N`````#IT@,``$G'P0````!$#[9&1KE@
+M````N@$```"^`0```$B)[^@`````N`````#II0,``$G'P0````!!N````02Y
+M(0```+H!````O@$```!(B>_H`````+@`````Z7<#``!)Q\$`````0;@!````
+MN0(```"Z`````+X!````2(GOZ`````"X`````.E)`P``2<?!`````$&X````
+M`+D"````N@````"^`0```$B)[^@`````N`````#I&P,``$F)T4&X`````+D`
+M````N@````"^`````$B)[^@`````N`````#I\0(``$B+1R"!8#3___;_2<?!
+M`````$&X_____[D!````N@````"^`0```$B)[^@`````N`````#IN`(``$0/
+MMDY%2(M'($0/MD`(00^V1"1!08T$@(T$@$0!R$B8#[:(`````$$/ME0D.D$/
+MMG0D.4C'QP````"X`````.@`````#[9%14B+=,582(N]@````$G'P`````"Y
+M`````+H!````Z`````"X`````.E$`@``#[9&14B+=,982<?``````+D`````
+MN@````#H`````+@`````Z1L"``!(BT<@]T`T```)`'0&QD9"$.M.QH;Z````
+M`$B-GK@```!)BWPD*$B)WN@`````QX6X````0$(/`$C'A<@`````````2(FM
+MT````$F+?"0H2(G>Z`````"X`0```.FZ`0``]D5*('1L@WU0`'17QD5"$@^V
+M?3I`A/]T=HMU4+H`````N0````!`]L8!=1;K)F9F9I!F9I`/MLI(B?!(T_BH
+M`707B%5%2,?`_O___TC3P"%%4.L[N@````"#P@%`./IUU.LLQD5%`,9%0AEF
+M@V5*W^L=#[9%18/``8A%13I%.G(*QD5%`,9%0AGK!,9%0@M(B>Y,B>?H````
+M`+@!````Z18!``!)Q\$`````0;@`````N2````"Z`0```+X`````2(GOZ```
+M``"X`````.GH````2<?!`````$&X`````+D!````N@````"^`````$B)[^@`
+M````N`````#IN@```$G'P0````!!N/____^Y`0```+H`````O@$```!(B>_H
+M`````+@`````Z8P```!F9F:09F:0#[;"2(MTQ5A(A?9T%\9&2AK&1DL&3(GG
+MZ`````"X`0```.MA@\(!B%5%#[9%.CC0=\XXPG5*QD5%`,9%0A%(B>Y,B>?H
+M`````+@!````ZS6)R(/(`F:)1DK&1D(`2(N&@````,9`"?](B[:`````3(GG
+MZ`````"X`0```.L'9I"X`0```$B+'"1(BVPD"$R+9"002(/$&,-F9F:09F9F
+MD$B#[!A(B1PD2(EL)`A,B60D$$B)_4R+)TB+AX````!(BU`@]T(T```)`'5+
+M#[:'^@```#P*=EE$#[9/140/MD((00^V1"1!08T$@(T$@$0!R$B8#[:(````
+M`$$/ME0D.D$/MG0D.4C'QP````"X`````.@`````QD5"$$B)[DB+?0#H````
+M`.M-9F9FD&9FD(/``8B'^@```$B-G[@```!)BWPD*$B)WN@`````QX6X````
+M0$(/`$C'A<@`````````2(FMT````$F+?"0H2(G>Z`````!(BQPD2(ML)`A,
+MBV0D$$B#Q!C#9F9FD&9FD$%6055!5%532(/L$$F)_$F)]0^W5B!F@?J#`'=9
+M#[?"#[:$!W@'```\_W1*9H/Z?W<@#[;`2(T4P$B-%)!(P>(#2`.72`@``$B+
+M0E`/ME`(ZRD/MT8@#[:$!W@'``!(P>`(2`.'<`@``$B+@(`````/ME`(ZP6Z
+M_____[G_____9D&!?2"#`'<.00^W12!!#[:,!'@'```/ML)!#[:$!/P'``!(
+MB<)(P>('2(V$PE`!``!-C70$"`^VP4C!X`A)BZPD<`@``$@!Q4&`?20`#X2R
+M````#[9]140/MD5"28M&($0/MD@(00^V3"1!08T,B4$/ME0D.D$/MG0D.8D\
+M)$C'QP````"X`````.@`````@'TZ`'0JNP````!F9I!FD`^VPTB+5,582(72
+M=`M,B?9,B>?H`````(/#`3A=.G?@28-]<`!T#$F-=7!,B>?H`````$R)[DR)
+MY^@`````9H--2@+&14(`2(N%@````,9`"?](B[6`````3(GGZ`````#IM0$`
+M`$F+E"0@"P``2('"0`@```^V14S!X`A(F$@!PHL"B04`````28N4)"`+``!(
+M@<)$"```#[9%3,'@"$B82`'"BPJ)#0````!)BY0D(`L``$B!PD@(```/MD5,
+MP>`(2)A(`<*+`HD%`````$F+E"0@"P``2('"3`@```^V14S!X`A(F$@!PHL2
+MB14`````#[9%0CP1="L\$7<-/`L/A?\```#IIP```#P29F:0='X\$P^%ZP``
+M`&9FD&9FD.F#````B<C!X`@+15`/MM()T(E%4+H`````@'TZ`'0^N@````"Y
+M`````/9%4`%U#^L?#[;*BT502-/XJ`%T%XA514C'P/[___](T\`A15#K#;H`
+M````@\(!.%4Z=]0X53H/E,"-!,42````B$5"ZW6)R,'@"*D```$$=`;&14(3
+MZV/&14(+ZUW&14(+9F9FD.M32(N%@````$B+0""!8#3___?_QD5"$(G0@^`/
+M@_@#=1H/MD5%2(M$Q5A(A<!T!O9`3!!T'\9%0@SK&0^V145(BU3%6$B%TG0+
+M3(GV3(GGZ`````!,B>Y,B>?H`````$B)[DR)Y^@`````2(/$$%M=05Q!74%>
+MPV9F9I!F9F:02(/L"$B)_DB+/^@`````2(/$",-F9F:09F9FD&9F9I!(@^P(
+MQD=""$B)_DB+/^@`````2(/$",-F9F:09F9FD$B#[`C&1T(.2(G^2(L_Z```
+M``!(@\0(PV9F9I!F9F:055-(@^P(2(G[2(LOZ`````"$P'09#[9U0T"$]G0T
+M#[93#+D`````]L(!=![K),9#"?](B=Y(B>_H`````.M?D$B)T$C3^*@!=0B#
+MP0%`./%U[DB)[^@`````2(G&2(7`=#Q(BU-(2(E#2$B-0T!(B09(B58(2(DR
+M@$,-`4B)7E#&1D@%QD9)`,9&<0^Y`0```+H!````2(G?Z`````!(@\0(6UW#
+M9F9FD&9F9I!F9I!!54%455-(@^P(2(G]28GT3(LONPH```!,B>9(B>_H````
+M`(3`=0^_Z`,``.@`````@^L!=>)!#[9U0T"$]G0B#[95#+D`````]L(!=`SK
+M$DB)T$C3^*@!=0B#P0%`./%U[DF+%"1)BT0D"$B)0@A(B1"`;0T!3(GF3(GO
+MZ`````#V10L"=$9(BW4H2(7V=1A,B>_H`````$B)QDB%P`^$4`$``$B)12A,
+MB2Y(B:Z`````QD9%`,9&0@!FQT9*`0!,B>_H`````.DG`0``2(M%*$B%P`^$
+MN0```$B-L+@```!)BWTHZ`````!(BW4H3(GOZ`````!,C65`3#EE0`^$AP``
+M`$R)Y^@`````2(G#2(M`0$B%P'1:2,=`:`````#V0TP$=1I,B>_H`````$B+
+M<T"Z`0```$R)[^@`````D$B+4T!)B[4`"```OP$```#H`````$B+4T!)B[4`
+M"```OP8```#H`````$C'0T``````@&T-`4B)WDR)[^@`````3#EE0`^%>?__
+M_TC'12@`````@'T-`'022(U]0.@`````2(G!@&T-`>L+3(GOZ`````!(B<%(
+MA<ET.4B+54A(B4U(2(U%0$B)`4B)40A(B0J`10T!2(EI4,9!2`7&04D`QD%+
+M!L9!2@-(B<Y,B>_H`````$B#Q`A;74%<05W#D$B#["A(B5PD"$B);"003(ED
+M)!A,B6PD($B)_4B)\P^W3B!F@?F#`'=?#[?!#[:T!W@'``!`@/[_=$YF@_E_
+M=QY`#[;62(N/2`@``$B-!-)(C02"2(M$P5`/MD`(ZQM`#[;&2(N7<`@``$C!
+MX`A(BX00@`````^V0`A`#[;6//]T!V:!^O\`=1!(B=Y(B>_H`````.E.`0``
+M#[;`#[:,!?P'```/M\)(C13`2(T4D$C!X@-)B=5,`ZU("```@'LD``^$N@``
+M`$B)R$C!X`=(C03(3(VD!5`!``!!#[9,)!0/ME,[#[9S.D4/MD0D%4C'QP``
+M``"X`````.@`````28M5`$F+10A(B4((2(D008!L)!4!3(GN2(GOZ`````!(
+MB=Y(B>_H``````^V?4-`A/\/A+````!!#[9T)!2Y`````$#VQ@%U%NL@9F9F
+MD&9FD`^VRDB)\$C3^*@!=!.)SDB)[^@`````ZWVZ`````&:0@\(!0#CZ==CK
+M;&9FD&9FD$B)R$C!X`=(C83(4`$``$R-9`4(@'LZ`74LOQ`G``#H`````$B)
+MWDB)[^@`````N0$```"Z`````$R)[DR)Y^@`````ZR"_4,,``.@`````2(G>
+M2(GOZ`````!,B>Y,B>?H`````$B+7"0(2(ML)!!,BV0D&$R+;"0@2(/$*,.0
+M059!54%455-(@^P028G\28GU#[=6(&:!^H,`=UD/M\(/MH0'>`<``#S_=$IF
+M@_I_=R`/ML!(C13`2(T4D$C!X@-(`Y=("```2(M"4`^V4`CK*0^W1B`/MH0'
+M>`<``$C!X`A(`X=P"```2(N`@`````^V4`CK!;K_____N?____]F08%]((,`
+M=PY!#[=%($$/MHP$>`<```^VPD$/MH0$_`<``$B)PDC!X@=(C83"4`$``$V-
+M=`0(00^V13J#Z`&[`````#P!=QH/ML%(C13`2(T4D$C!X@-)BYPD2`@``$@!
+MTTF+;BA!@'TD``^$+P$``$F#?7``=`Q)C75P3(GGZ`````!,B>Y,B>?H````
+M`$$/ME4ZC4+_/`%W=(#Z`4`/E,=`#[;_28M&($0/MD`(1`^V345!#[9$)$%!
+MC02`C02`1`'(2)@/MH@`````00^V5"0Z00^V="0YB3PD2,?'`````+@`````
+MZ`````!(B=I,B?9,B>?H`````,9%0A!(B>Y,B>?H`````.E1!```#[9]140/
+MMD5"28M&($0/MD@(00^V3"1!08T,B4$/ME0D.D$/MG0D.8D\)$C'QP````"X
+M`````.@`````@'TZ`'0ENP`````/ML-(BU3%6$B%TG0+3(GV3(GGZ`````"#
+MPP$X73IWX&:#34H"QD5"`$B+A8````#&0`G_2(NU@````$R)Y^@`````Z<(#
+M``!FD`^V14*#Z`VZ`````+D`````/`$/AHP```!)BY0D(`L``$B!PD`(```/
+MMD5,P>`(2)A(`<*+`HD%`````$F+E"0@"P``2('"1`@```^V14S!X`A(F$@!
+MPHL*B0T`````28N4)"`+``!(@<)("```#[9%3,'@"$B82`'"BP*)!0````!)
+MBY0D(`L``$B!PDP(```/MD5,P>`(2)A(`<*+$HD5``````^V14(\#@^'#P,`
+M``^VP/\DQ0````"#^@6X!0````]&PHA%.L9%0@+IP`(``(G(P>`(#[;2"=!F
+MB44\B<C!Z`AFB44^QD5"`^F@`@``B$TXB="H"'0&QD4Y#.L;J`1T!L9%.0OK
+M$8/@`DB#^`$9P/?0@^`*B$4YQD5"!.EM`@``B="#R`B(14;&14(%Z5P"``#&
+M14(&Z5,"``#&14('Z4H"```/MD5%@\`!B$5%.D4Z<U!)@WUP`'0,28UU<$R)
+MY^@`````3(GN3(GGZ`````#'A;@```"`A!X`2,>%R`````````!(B:W0````
+M2(VUN````$F+?"0HZ`````#I&0(``,9%10!(C9VX````28M\)"A(B=[H````
+M`$R)[DR)Y^@`````QX6X````0$(/`$C'A<@`````````2(FMT````$F+?"0H
+M2(G>Z`````#IR`$```^V146#P`&(144Z13H/A8<!``#&144`QD5'9,9%0@OI
+M=@$``,9%0@KI;0$``,9%0@OI9`$``$B+A8````!(BT`@@6`T___W_XG0@^`/
+M@_@#=0G&14(,Z3\!```/MD5'A,!T%8/H`8A%1[_H`P``Z`````#I(@$```^V
+M146#P`&(144Z13H/@@\!``#&144`QD5"&>D"`0``#[9%14B+1,582(7`=!Q(
+MB<&`8$SO2(L02(M`"$B)0@A(B1!!@&X-`>LV3(GGZ`````!(B<%(A<!U)DF#
+M?7``=`Q)C75P3(GGZ`````!,B>Y,B>?H`````.G3````9F:0QD5"#0^V145(
+MB4S%6$R)<5!(B6E8#[9%18A!<<9!20"`24@%08!&#0%)C49`2(M0"$B)2`A(
+MB0%(B5$(2(D*ZV%(C9VX````28M\)"A(B=[H`````,>%N````%##``!(QX7(
+M`````````$B)K=````!)BWPD*$B)WN@`````28-]<`!T#$F-=7!,B>?H````
+M`$R)[DR)Y^@`````ZS+&14(/28-]<`!T#$F-=7!,B>?H`````$R)[DR)Y^@`
+M````2(GN3(GGZ`````!F9I!FD$B#Q!!;74%<05U!7L.0D)"#X@?!X@B`SB!(
+MBT<(2"WD/```2,'F"('F`/\``$@!\(D0#[<`9HD%``````^VP,.#X@?!X@B(
+MRH#.$$B+1PA(+>0\``!(P>8(@>8`_P``2`'PB1##9F9FD&9F9I!F9I!54[T`
+M````NP````!!N?____]!NP````!%B=I!@\,!N`$```!!B<!$B=E!T^!$B<&^
+M`````+C`X>0`N@````#W\3GX=Q&)^BG"1#G*<PA$B=6)\T&)T8/&`40!P8/^
+M$'7408/["'6QC03=``````GH#[;`6UW#9F9FD&9FD&9FD$B#[!!(B1PD3(ED
+M)`A)B?Q`#[;>N0````"Z!P```(G>Z"O___]!#[:,)%$,``"Z`P```(G>3(GG
+MZ!/___](BQPD3(MD)`A(@\00PV9FD&:04XGS#[;RN@,```#HP/[__SC8#Y3`
+M#[;`6\-F9I!F9I!(A?]T-;H`````9F:09F:0#[:$.O@'```/ML@\_W01#[?!
+M2,'@"$@#AW`(``##9I!(@\(!2(/Z!'76N`````##55-(BY\("```2(7;2`]$
+MW[T`````N0````"Z!P```(GN2(G?Z'?^__^Y1````+H"````B>Y(B=_H8_[_
+M_[G0````N@````")[DB)W^A/_O__N0````"Z!````(GN2(G?Z#O^__^#Q0&#
+M_0)UJ+^@A@$`Z%G^__^(@U$,```/MLBZ`P```+X`````2(G?Z`[^__];7<-F
+M9F:09F9FD&9FD%-(B?MFQX?P`````0`/M_;!Y@WH`````+X4````2(G?Z```
+M``!;PV9FD&9FD&9FD$B#[`B)\832=1:X_O___]/`9B&'Z````.L49F:09F:0
+MN`$```#3X&8)A^@````/M[?H````Z`````!(@\0(PY!(@^PH2(E<)`A(B6PD
+M$$R)9"083(EL)"!)B?U!B=0/MJ[+````#[9>`DB+?G!(A?]T"P^VT@^V\^@`
+M````@/L#=Q"-%*N-1*L$0(#]`P]&PNL-C540C44@0(#]`P]&PD$/MM0/MO!,
+MB>_H`````$B+7"0(2(ML)!!,BV0D&$R+;"0@2(/$*,-F9I!F9I!F9I!!5%53
+M28G\NP````!`#[;NN@(```")[DR)Y^BQ_/__J`AT#;@`````ZR!F9I!F9I"_
+M`0```.@`````@\,!@?L0)P``=<NX_P```%M=05S#D$B#["A(B5PD"$B);"00
+M3(ED)!A,B6PD($B)_4F)S4&)U$`/MMZ)WNB$____A<!U,$$/MO2)VDB)[^AR
+M_?__A<!T'KH!````B=Y(B>_H+_S__T&(10"X`````.L)9F9FD+C_____2(M<
+M)`A(BVPD$$R+9"083(ML)"!(@\0HPV:02(/L*$B)7"0(2(EL)!!,B60D&$R)
+M;"0@2(G]08G-1`^VXD`/MMY$B>&Z`0```(G>Z/O[__^Y0````+H"````B=Y(
+MB>_HY_O__XG>2(GOZ-W^__^%P'5,187M=#1!]L0!=!6)VKY`````2(GOZ+_\
+M__^%P'0NZS.)VKX8````2(GOZ*K\__^%P'09ZQYF9F:0B=J^*````$B)[^B1
+M_/__A<!U![C_````ZP:X`````)!(BUPD"$B+;"003(MD)!A,BVPD($B#Q"C#
+M9F9FD&9FD$%7059!54%455-(@^P(28G]2(D,)$6)QHGSB=6$T@^$\0```$0/
+MMOZY9````+H"````1(G^Z";[__]$B?Y,B>_H&_[__X7`=1"Z`P```$2)_DR)
+M[^C7^O__0`^VU;D!````1(G^3(GOZ,/^__]!O/____^$P`^%@P$``$&\````
+M`$6%]@^.=`$``$B+'"1!O`````!!C6[_1#GE=36Y0````+H"````1(G^3(GO
+MZ*[Z__])8\Q(`PPDNE@```!$B?Y,B>_HY_W__X7`=#7I+`$``+E$````N@(`
+M``!$B?Y,B>_H>?K__TB)V;I0````1(G^3(GOZ+;]__^%P`^%_````$&#Q`%(
+M@\,!13GT#X3K````ZX._H(8!`.AQ^O__#[;K#[;(N@,```")[DR)[^@L^O__
+MB>Y,B>_H(OW__X7`=")!#[:-40P``+H#````B>Y,B>_H!_K__T&\_____^F:
+M````B>J^8````$R)[^CM^O__A<!T#4&\`````$6%]GYEZQ]!#[:-40P``+H#
+M````B>Y,B>_HQ?G__T&\_____^M;2(L<)$&\`````&9FD+E$````N@(```")
+M[DR)[^B<^?__2(G9NH````")[DR)[^C:_/__A<!U#4&#Q`%(@\,!13GT=<E!
+M#[:-40P``+H#````B>Y,B>_H8OG__T2)X$B#Q`A;74%<05U!7D%?PTB#[!A(
+MB5PD"$R)9"0028G\2(G00`^VUD&)R$B)P;X!````Z,C]__^)P[E4````N@(`
+M``"^`0```$R)Y^@/^?__B=A(BUPD"$R+9"002(/$&,-F9F:09F9FD&9FD&9F
+MD$B#[!A(B5PD"$R)9"0028G\2(G00`^VUD&)R$B)P;X`````Z&C]__^)P[E4
+M````N@(```"^`````$R)Y^BO^/__B=A(BUPD"$R+9"002(/$&,-F9F:09F9F
+MD&9FD&9FD$%6055!5%5328G]2(G-18G&B=-$#[;FN60```"Z`@```$2)YNAG
+M^/__1(GF3(GOZ%S[__^%P'40N@,```!$B>9,B>_H&/C__P^VT[D!````1(GF
+M3(GOZ`7\__^$P'4V187V?CA(B>N]`````&9F9I`/MA.Y`````$2)YDR)[^C=
+M^___A,!U#H/%`4B#PP%$.?5T">O;N/_____K!;@`````6UU!7$%=05[#9F:0
+M9F:02(/L&$B)7"0(3(ED)!!)B?Q(B=!`#[;608G(2(G!O@````#H*/___XG#
+MN50```"Z`@```+X`````3(GGZ)_W__^)V$B+7"0(3(MD)!!(@\08PV9F9I!F
+M9F:09F:09F:02(/L"$B+AP@(``!(A<!(#T3'0(@U`````+D@````2,?"````
+M`+X.````2(G'Z`````!(@\0(PV9FD&9FD&9FD$B#[`B)\832=!:X`0```-/@
+M9@F'G`X``.L49F:09F:0N/[____3P&8AAYP.```/MK><#@``Z`````!(@\0(
+MPY!!5T%6055!5%532(/L&$B)^TF)]DB+3BA(@\$!BU8<@^H!2(M&,$B)1"00
+M#[9!`3P!=13'1E``````QT0D#`````#I<@(``#P"=5B`>0(!D'4]2(N'"`@`
+M`$B%P$@/1,=(BY``"```#[9!`XB"G@X```^V00.(@EX=``#'1E``````QT0D
+M#`````#I*@(``,=&4/[____'1"0,`````.D6`@``/`,/A;$```"`>0(!D`^%
+MD@````^V1SZ--``/MGD#B?J)^,'Z'_?^B=4YUGYC3(UI!$0/MN(/ME$$1(GF
+M2(G?Z`````"-1?R#^`-V&(U%](/X`W80C47L@_@#=@B-1>2#^`-W!TB!P\`.
+M``!!#[95`$2)YDB)W^@`````0<=&4`````#'1"0,`````.F&`0``0<=&4/[_
+M___'1"0,`````.EQ`0``QT90_O___\=$)`P`````Z5T!``!,BZ\("```387M
+M3`]$[TB)R\=$)`P`````N`(```!(*<A(B00D3&/ZZ:<```!F9F:09F:0#[8K
+M3(UB`0^VT/;"`71!BT0D#(U<!0!!.UX@#X?I````B<%(`TPD$$&)Z+X`````
+M3(GOZ-CY__\YZ`^%R@```(E<)`Q,B>/K5V9F9I!F9I!(8\5*C1P@2(L$)$@!
+MV$PY^`^/HP```$&)Z$R)X;X`````3(GOZ&;\__^%P`^%B````(`[`'4+@'L!
+M`&9FD&:0=`Z_$"<``.@`````9F9FD$B-4P$/MD,!A,`/A5#___^+;"0,#[8#
+MA,!T5P^VV+E4````N@(```"^`````$R)[^B;]/__08M&("M$)`PYPP]'V(GI
+M2`-,)!!!B=BZ`````+X`````3(GOZ!+Y__^%P'@(`>B)1"0,ZPA!QT90____
+M_[E4````N@(```"^`````$R)[^A']/__28M&.$B%P'0&BU0D#(D03(GW0?]6
+M2$B#Q!A;74%<05U!7D%?PV:02(/L"$B+AP@(``!(A<!(#T3'2(NX``@```^V
+MAY\.``"$P'0-@^@!B(>?#@``A,!U'<8%``````"Y(````$C'P@````"^#@``
+M`.@`````2(/$",-F9F:09F:09F:09F:02(/L"$B+AP@(``!(A<!(#T3'2(NX
+M``@``("_G@X```!U)("'GPX```'&!0`````!N2````!(Q\(`````O@X```#H
+M`````$B#Q`C#9F:09I!(@^P82(E<)`A,B60D$$F)_$B)T$`/MM9!B<A(B<&^
+M`````.BX^O__B<.Y5````+H"````O@````!,B>?H+_/__XG82(M<)`A,BV0D
+M$$B#Q!C#D)"0D)"0D)"0D)"0D)")]DB+1PA(+0`"`0!(`<:+!HD%`````,-F
+M9F:09F9FD(GV2(M'"$@M``(!`$@!QHD6PV9F9I!F9F:09F:09F:04TB)^TB+
+M5PA(@>H``@$`QX*```$``````(N"!`$!`(D%`````(#,`8F"!`$!`+H(````
+MO@S"``#H`````+JX"P``O@C"``!(B=_H`````+H!```\O@#"``!(B=_H````
+M`+H(````O@S#``!(B=_H`````+JX"P``O@C#``!(B=_H`````+H!```\O@##
+M``!(B=_H`````+J`@("`OCC"``!(B=_H`````+H(&"@XOB#"``!(B=_H````
+M`+J`@("`OCS"``!(B=_H`````+H)&2DYOB3"``!(B=_H`````+J`@("`OD#"
+M``!(B=_H`````+H*&BHZOBC"``!(B=_H`````+J`@("`OD3"``!(B=_H````
+M`+H+&RL[OBS"``!(B=_H`````+J`@("`ODC"``!(B=_H`````+I(24I+OC#"
+M``!(B=_H`````+J`@("`OCC#``!(B=_H`````+H,'"P\OB##``!(B=_H````
+M`+J`@("`OCS#``!(B=_H`````+H-'2T]OB3#``!(B=_H`````+J`@("`OD##
+M``!(B=_H`````+H.'BX^OBC#``!(B=_H`````+J`@("`OD3#``!(B=_H````
+M`+H/'R\_OBS#``!(B=_H`````+J`@("`ODC#``!(B=_H`````+I,34Y/OC##
+M``!(B=_H`````,=#4("`@(#'0U2`@("`QT-8@("`@,=#7("`@(#'0V"`@("`
+M2(V#P`X``,=`4("`@(#'0%2`@("`QT!8@("`@,=`7("`@(#'0&"`@("`6\-F
+MD$B+5PA(@>H``@$`BX)L``$`B04`````B8)L``$`PV:02(M7"$B!Z@`"`0"+
+M@F@``0")!0`````)\(F":``!`,-54TB)^XGQ2#F_``@```^%O````(GPP.@"
+M0;@`````D`^V\(G(]]"#X`.-/,4`````N`<```")^=/@]]!$BTRS4$$AP42)
+M3+-0A-)T#K@!````T^!$"<B)1+-000^VP(G%P>4(BU-0C;4XP@``2(N[``@`
+M`.@`````BU-4C;4\P@``2(N[``@``.@`````BU-8C;5`P@``2(N[``@``.@`
+M````BU-<C;5$P@``2(N[``@``.@`````BU-@C;5(P@``2(N[``@``.@`````
+M6UW#B?#`Z`*#Z`5!N`$```#I/?___Y"0D)"0D)"0D)"0D)!)B=%,BY=("```
+M#[=&(+K8)@$`9CV#`'<7#[?`#[:$!W@'``!(C13`2(T4D$C!X@--C8$@!```
+M0<:!(`0``"=F@7XXX0%U*40/MDXZ08U!_SP!=PQ!N0\```!$(DX[ZRM!C4'O
+M0;D/````/`%V'6:028T$$D&Y`````$B#>%@`=`I!N0\```!$(DAQ00^V0`&#
+MX/!$"<A!B$`!N`$```!F@7XXX0%U#P^V1CJ#Z`$\`0^7P`^VP(G"P>('00^V
+M0`&#X'\)T$&(0`$/MD$&08A``@^V`4&(0`,/MD$%08A`!P^V00=!B$`/#[9!
+M`D&(0`0/MD$#08A`!0^V001!B$`&#[9!`4&(0`P/MD$*08A`"`^V00M!B$`)
+M#[9!#$&(0`H/MD$(08A`"P^V00E!B$`-PV9F9I!F9F:09F9FD&9FD,9')`)(
+MBT=00(AP`DB+1U#&0`<`2(M'4(A0#,-F9F:0#[9'/8A&`@^V1SR(1@,/MD<[
+MB$8$#[9'.HA&"L-F9I`/MD=!B$8"#[9'0(A&`P^V1S^(1@0/MD<^B$8*#[9'
+M/8A&"P^V1SR(1@S#9F:09I"%TGXAN0````!F9F:09F:0B=`IR(/X`@^=P`^V
+MP(U,`0$YRG_K\\-F9I!F9I!F9I!(@^P@2(D<)$B);"0(3(ED)!!,B6PD&$B)
+M^TB)U0^V1S@\*G0C/"IW"CPH#X6E````ZQ4\B'0I/(IF9F:09F:0#X60````
+MZQA$#[9C0$0/MFL_2(GN2(G?Z`````#K%I!$#[9C140/MFM$2(GN2(G?Z```
+M``#&105`BX.4````J0```0!U4*D```0`="5$B&4!1(AM"0^V0S@\*'0$/(AU
+M!L9%!B7K+\9%!C5F9I!FD.LD1(AE`0^V0SJ#X`\(104/MD,X/"AT!#R(=0;&
+M10;(ZP3&10;*2(L<)$B+;"0(3(MD)!!,BVPD&$B#Q"##9I`/MD<Z"D<["D<\
+M"D<]#[;`#[970(/B`0G0=!6Z)````+X%````Z`````#SPV9F9I#&1@;L2,>'
+MH`````````##2(/L($B)'"1(B6PD"$R)9"003(EL)!A(B?M(B?4/MD<X/"]T
+M"SR/=5GK%V9FD&:01`^V9T!$#[9O/^@`````D.L/1`^V9T5$#[9O1.@`````
+MQD4%0/:#E@````1T$D2(90%$B&T)QD4&0NL69F9FD$2(90$/MD,Z@^`/"$4%
+MQD4&0$B+'"1(BVPD"$R+9"003(ML)!A(@\0@PV9FD&9FD$B)\<9"!4`/MD8X
+M/#5T!CR1=2/K&P^W1V"#X`&#^`$9P(/@_8/H%HA"!NLD9F9FD,9"!NKK&KHD
+M````O@4```!(B<_H`````//#9F:09F:0]D$Y`G0$QD$D`//#9F9FD/9'//!T
+M#[HD````O@4```#H`````//#9F:09F:09F:02(/L"$F)\+@`````9F9FD,8$
+M"`!(@\`!2(/X#77R00^V0#@\-0^$G0```#PU=RD\*'1B/"AW#CP;#X6"`P``
+MD.F;````/"IT3#PO9F:09I`/A6L#``#K6#R/9F:09F:0=$X\CW<2/(AT*SR*
+M9F9FD`^%2P,``.L=/)%F9I!F9I!T1CSA#X4W`P``9F:09F:0Z80````/MO)(
+MB<I,B<?H`````,=$)`0!````Z1D#``!(B<Y,B<?H`````,=$)`0!````Z0$#
+M``!(B<I,B<;H`````,=$)`0!````Z>D"``!!]D`\`70AQD$&<,9!!`#&00,`
+MQD$"`,9!!4#'1"0$`0```.G!`@``QD$&X,=$)`0!````Z;`"``!!@'@Y`0^%
+MG0(``$&`>#H<#X>2`@``00^V0#K_),4`````QD$'!,=$)`0!````Z7T"``#&
+M00<`QT0D!`$```#I;`(``,9!!NS'1"0$`0```.E;`@``QD$&[\8!`T$/MD`[
+M@\A`B$$!QT0D!`$```#I/`(``,9!!N_&`0?'1"0$`0```.DH`@``QD$&0,9!
+M`0'&005`QT0D!`$```#I#P(``,9!!N_&`0-!#[9`.X/("(A!`<=$)`0!````
+MZ?`!``#&00;OQ@$"QT0D!`$```#IW`$``,9!!N_&`8+'1"0$`0```.G(`0``
+MQD$&[\8!!L=$)`0!````Z;0!``#&00;OQ@&&QT0D!`$```#IH`$``,9!!N-!
+M#[9`.XA!`<=$)`0!````Z8<!``#&00:PQ@'8QD$#3\9!!,+'1"0$`0```.EK
+M`0``QD$&L,8!V<9!`T_&003"QT0D!`$```#I3P$``,9!!K#&`=K&00-/QD$$
+MPL=$)`0!````Z3,!``#V1V`!=!'&00;JQT0D!`$```#I'`$``,9!!N?'1"0$
+M`0```.D+`0``QD$&[\8!JL=$)`0!````Z?<```#&00;OQ@%5QT0D!`$```#I
+MXP```,9!!N1!#[9`/(@!00^V0#V(00A!#[9`.XA!!<=$)`0!````Z;L```!!
+M#[9`.XA!!D$/MD`\B`%!#[9`/8A!`D$/MD`^B$$#00^V0#^(001!#[9`08A!
+M"D$/MD!`B$$!QT0D!`$```#K>L9!!NA!#[9`/(@!00^V0#V(00A!#[9`.XA!
+M!4$/MD`^B$$"00^V0#^(00-!#[9`0(A!!$$/MD!!B$$!QT0D!`$```#K-<=$
+M)`0!````0?9`/`%T)L9!!G#&000`QD$#`,9!`@#&005`QT0D!`$```#K",=$
+M)`0`````BT0D!$B#Q`C#9F9FD&9F9I!F9I!F9I!32(/L($B)\TB+3DA(QP0D
+M`````$C'1"0(`````$C'1"00`````$C'1"08`````/:!IP````1T#4B+D<@`
+M``!(@^H!ZP:+47B#Z@&`>S@E=6%(B=!(P>@8B`0D2(G02,'H$(A$)`%(B=!(
+MP>@(B$0D`HA4)`/V@=4````0=13&1"0&`L9$)`<`N`@```#IK@```$B-?"0$
+M2(VQZ@```+H$````Z`````"X"````.F.````2(G02,'H.(@$)$B)T$C!Z#"(
+M1"0!2(G02,'H*(A$)`)(B=!(P>@@B$0D`TB)T$C!Z!B(1"0$2(G02,'H$(A$
+M)`5(B=!(P>@(B$0D!HA4)`?V@=4````0=17&1"0*`L9$)`L`N"````#K)&9F
+M9I!(C7PD"$B-L>H```"Z!````.@`````N"````!F9I!FD$B+>TA(8]!(B>;H
+M`````$B#Q"!;PV9F9I!F9F:09F:02(/L"`^V1C@\-0^$E0```#PU=RX\*'10
+M/"AW%CP29I!T1CP;#X66````9F:09F:0ZW,\*G0R/"\/A8(```!FD.LF/(]T
+M(CR/=PX\B&9F9I!T%CR*=6KK$#RP9F:09F:0='4\X75:ZQOV1V`!9F9FD'1E
+M@8Z4```````$`+@!````ZUF`?CD!=4>`?CH<=T%(#[Y..K@!````2-/@J?X_
+MQAUU-.LK]D=@`70L@8Z4```````$`+@!````ZR!F9F:02(GWZ`````"X````
+M`.L-D+@`````ZP6X`0```$B#Q`C#D)"0D)"0D)"0D)"0D)"02(M_"$4/ML!!
+MP>`$#[;2P>((00G01(G`@\@$A,E$#T7`08/Y_W092(V7`/[^_T2)R"7__P,`
+MB8($R```08/(`D2)!L-F9F:09F9FD&9F9I!(BT<(2"T``@$`@\X!B;``R```
+MPV9F9I!F9F:09F9FD$%455-!B?1(BT<(A?9T3$@M``(!`$B-J`#(``"+@`#(
+M``")!0````"[`````*@!=0_K(8M%`(D%`````*@!=!2_"@```.@`````@\,!
+M1#GC=>'K![@`````ZP6X_____UM=05S#9F9FD&9F9I!F9I!54TB#[!A(B?O'
+M1"04`````$B+;PC&AZ`.````#[85`````$B-="040;D`````0;@"````N0$`
+M``#HXO[__XMT)!1(B=_H)O___[Z@A@$`2(G?Z#G___^%P'552(V%`/[^_XN`
+M#,@``(D%`````(E$)!0]'V,``'4WQX.0#@``'V,``,>#E`X`````!`#'@Y@.
+M``````$`2,>#J`X```````!FN```Z5<"``!F9I!FD,=$)!0`````2(MK",:#
+MH`X```$/MA4`````2(UT)!1!N?____]!N`(```"Y`0```$B)W^@X_O__BW0D
+M%$B)W^A\_O__OA`G``!(B=_HC_[__X7`=6Y(C84`_O[_BX`,R```B04`````
+MB40D%#T?0P``="T]'T0``'5)QX.0#@``'T0``,>#E`X`````!P#'@Y@.````
+M``$`Z9,!``!F9I#'@Y`.```?0P``QX.4#@`````$`,>#F`X``````0#I;0$`
+M`,=$)!0`````2(MK",:#H`X````/MA4`````2(UT)!1!N0````!!N`(```"Y
+M`0```$B)W^AU_?__BW0D%$B)W^BY_?__OA`G``!(B=_HS/W__X7`=5!(C84`
+M_O[_BX`,R```B04`````B40D%#V_0P``=3+'@Y`.``"_0P``QX.4#@`````@
+M`,>#F`X````0``!(QX.H#@```````&:X``#IZ@```,=$)!0`````2(MK",:#
+MH`X````/MA4`````2(UT)!1!N0````!!N`(```"Y`0```$B)W^C0_/__BW0D
+M%$B)W^@4_?__OA`G``!(B=_H)_W__X7`=6=(C84`_O[_BX`,R```B04`````
+MB40D%#WO$0``=`D][Q(``'5"ZR#'@Y`.``#O$0``QX.4#@`````$`,>#F`X`
+M`````0#K/L>#D`X``.\2``#'@Y0.``````@`QX.8#@`````!`.L>N/_____K
+M)V9FD&:02,>#J`X```````"X`````.L02,>#J`X```````"X`````$B#Q!A;
+M7<-F9F:09F:02(/L*$B)7"002(EL)!A,B60D($B)^XGW28G42(MK"(#Y!+@$
+M````#T?(2(N#J`X```^V4`1(C70D#$&)^40/ML&Y`0```$B)W^C"^___BW0D
+M#$B)W^@&_/__OA`G``!(B=_H&?S__[K_____A<!U($B-A0#^_O^+@`S(``")
+M!0````")1"0,08D$)+H`````B=!(BUPD$$B+;"083(MD)"!(@\0HPV9F9I!F
+M9I!F9I!54TB#[!A(B?M(B=5(BX>H#@``#[90"TB-1"0408GQ0;@!````N0$`
+M``!(B<;H+OO__XMT)!1(B=_H<OO__[X0)P``2(G?Z(7[__^Z_____X7`=1I(
+MBT,(2"WT.0``BP")!0````"(10"Z`````(G02(/$&%M=PV9FD&9FD&9FD$%7
+M059!54%455-(@^P82(G[08G-08GW08G6A<D/A(X```"]`````$R+8PA(BX.H
+M#@``#[90`D&Y_____T&X`0```+D!````2(UT)!1(B=_HC/K__XMT)!1(B=_H
+MT/K__[X0)P``2(G?Z./Z__^%P'4I28V$)`#^_O^+D`S(``")%0````!$B?@A
+MT$0X\'4'N`````#K'XE4)!2_"@```.@`````@\4!1#GM#X5W____N/____](
+M@\086UU!7$%=05Y!7\-F9F:09F9FD&9F9I!32(/L$$B)^TB+AZ@.```/MA!(
+MC70D#$&Y_____T&X`````+D`````Z./Y__^+="0,2(G?Z"?Z__^^$"<``$B)
+MW^@Z^O__A<!U)KG@DP0`N@(```"^`P```$B)W^C/_O__N@````"%P'0+9F:0
+M9F:0NO____^)T$B#Q!!;PV9FD$B#["A(B5PD&$B);"0@2(G[B?7&1"07_TB-
+M5"07Z`````"%P'5R@'PD%P!T<TB)W^A+____@_C_=%Y(BX.H#@``#[90"DB-
+M="0008GI0;@`````N0````!(B=_H,/G__XMT)!!(B=_H=/G__[X0)P``2(G?
+MZ(?Y__^%P'4;N>"3!`"Z`````+X#````2(G?Z!S^__^%P'0(N/_____K!I"X
+M`````$B+7"082(ML)"!(@\0HPV9F9I!F9F:09F9FD$B#[%A(B5PD*$B);"0P
+M3(ED)#A,B6PD0$R)="1(3(E\)%!(B?U!B?:)RTB#OZ@.````#X3X`@``28G7
+M183`#X1<`0``@_[_=1</MX>0#@``9HD"N`$```#I^0(``&9FD(/^_G42BX>4
+M#@``B0*X`0```.G?`@``@_[]=12+AY@.``")`K@!````Z<@"``!FD`'SB5PD
+M##N?E`X```^'C@(``(GS@^/\08GT08/D`W1B3(UL)"2Y!````$R)ZHG>Z/S[
+M__^#PP2Z!````#E<)`QS#42)X$0I\(M,)`R-%`A$.>)V+D2)X4R)_V9FD&9F
+MD(G(00^V1`4`B`=(@\<!@\$!.=%UZXG01"G@@^@!38U\!P%$BV0D#$&#Y/Q$
+M.>-S*DR-;"0DN00```!,B>J)WDB)[^B)^___BT0D)$&)!TF#QP2#PP1!.=QW
+MVSE<)`P/AN,!``!,C60D)+D$````3(GBB=Y(B>_H5?O__XMT)`PIW@^$P`$`
+M`+D`````N@````!!#[8$%$*(!#J#P0%(@\(!.?$/A)X!``#KYF9FD&:0@_[_
+M=2N`.@]U$<:'H0X```&X`0```.F;`0``QH>A#@```+@!````Z8H!``!F9F:0
+MB4PD%(G(`?`[AY0.```/ATP!``"`OZ$.````#X0_`0``B?"Z`````/>WF`X`
+M`(72#X6-````@+^@#@```'0-Z`````"%P`^%%`$``$B)[^B<_/__@_C_#X0#
+M`0``2(N%J`X```^V4`9(C70D)$6)\4&X`````+D`````2(GOZ'WV__^+="0D
+M2(GOZ,'V__^^$"<``$B)[^C4]O__A<`/A;P```"YX),$`+H`````O@,```!(
+MB>_H9?O__X7`#X6=````A=L/A)P```#'1"00`````(M$)!!%BR0'1(ML)!!%
+M`?5(BUT(2('K``(!`$B)[^CZ^___1(FC",@``$B+A:@.```/ME`%18GI0;@$
+M````N0````!(C70D)$B)[^C=]?__BW0D)$B)[^@A]O__OA`G``!(B>_H-/;_
+M_X7`=2"YB!,``+H`````O@$```!(B>_HR?K__X7`=!=F9I!FD+@`````ZQ^X
+M`0```&9F9I#K%(-$)!`$BT0D$#E$)!1VYNE-____2(M<)"A(BVPD,$R+9"0X
+M3(ML)$!,BW0D2$R+?"102(/$6,.0D)"0D)"0N`````##9F9FD&9FD&9FD+@`
+M````.3T`````?C=(8\=(Q\$`````2(T$0$C!X`,/MQ0(9HD6#[=4"`)FB58"
+M#[94"`B(5@@/MD0("8A&";@!````\\-F9F:09F:09F:0N(`?``##9F9FD&9F
+MD&9FD+C0````PV9F9I!F9I!F9I"X"````,-F9F:09F:09F:0\\-F9F:09F9F
+MD&9FD&9FD,:'R@````#&AJ@`````PY!(A?]T$TB+1W!(A<!T"@^V@/@```"(
+M1P'SPV9FD&9FD%532(G[2(7_='N]`````)`/MH0=>`<``#S_=$0/MM!(C032
+M2(T$@DC!X`-(B<)(`Y-("```="F+0D@E`/__`#T``/\`=1KV0DL$=!1(BWI`
+M2(7_=`OH`````&9FD&9FD$B#Q0%(@?V`````=:-(BX,`"```2#G8=0Q(C;C`
+M#@``Z`````!;7<-F9F:09F9FD+@`````PV9F9I!F9I!F9I"X`````,-F9F:0
+M9F:09F:0N/_____#9F9FD&9FD&9FD+C_____PV9F9I!F9I!F9I"X_____\-F
+M9F:09F:09F:0N/_____#9F9FD&9FD&9FD,="!`````#'`@````"X`````,-F
+M9F:09F:09F:09F:02(M':$B%P'1)2,=`0`````"`2$P$2,=':`````!(QT=P
+M`````(M'"(/X/W\32(M7>$B82,>$PG@#````````PTB+5WA(F$C'A,)X`0``
+M`````//#9F9FD&9F9I!F9F:02(M':$B%P'1)2,=`0`````"`8$S[2,=':```
+M``!(QT=P`````(M'"(/X/W\32(M7>$B82,>$PG@#````````PTB+5WA(F$C'
+MA,)X`0```````//#9F9FD&9F9I!F9F:02(/L"$C'QP````#H`````+@`````
+M2(/$",-F9I!F9I!54TB#[#C&!"1MQD0D`?_&1"0"(\9$)`,4QD0D!#K&1"0%
+M[\9$)`86QD0D!Y)(BZ\("```2(7M2`]$[TB-1"002(G"Q@``2(/``4B)TTB-
+M3"0P2#G(=>S&1"04`;D@````O@X```!(B>_H`````(7`=4*_@!H&`.@`````
+MN2````!(B=J^#P```$B)[^@`````@_@@=1Y(C7,02(GGN0@```#\\Z8/E\(/
+MDL"Y`0```#C"=!9(Q\<`````N`````#H`````+D`````#[;!2(/$.%M=PV9F
+M9I!F9F:09F9FD%532(/L:$B)^TB+KP`(``!(@<7`#@``2(L'2(7`=!-(C;``
+M`/[_2(DW2(M_(.@`````2(MS$$B%]G0)2(M[(.@`````2(MS&$B%]G0)2(M[
+M(.@`````2(U,)&5(C50D9DB-="1G#[=[/$B-1"1:2(E$)#A(C40D7$B)1"0P
+M2(U$)%9(B40D*$B-1"182(E$)"!(C40D8$B)1"082(U$)&)(B40D$$B-1"1C
+M2(E$)`A(C40D7DB)!"1,C4PD9$R-1"14Z`````!(B[-("```2(7V=!](C;LH
+M"```Z`````!(B[5("```2(V]*`@``.@`````2(NS<`@``$B%]G0?2(V[4`@`
+M`.@`````2(NU<`@``$B-O5`(``#H`````$B+LX`*``!(A?9T'TB-NV`*``#H
+M`````$B+M8`*``!(C;U@"@``Z`````!(B[.8"```2(7V=!](C;MX"```Z```
+M``!(B[68"```2(V]>`@``.@`````2(NS<`D``$B%]G0?2(V[4`D``.@`````
+M2(NU<`D``$B-O5`)``#H`````$B+LP`)``!(A?9T'TB-N^`(``#H`````$B+
+MM0`)``!(C;W@"```Z`````!(B[,H"0``2(7V=!](C;L("0``Z`````!(B[4H
+M"0``2(V]"`D``.@`````2(NSF`D``$B%]G0?2(V[>`D``.@`````2(NUF`D`
+M`$B-O7@)``#H`````$B+L\`)``!(A?9T'TB-NZ`)``#H`````$B+M<`)``!(
+MC;V@"0``Z`````!(B[/H"0``2(7V=!](C;O("0``Z`````!(B[7H"0``2(V]
+MR`D``.@`````2(NS$`H``$B%]G0?2(V[\`D``.@`````2(NU$`H``$B-O?`)
+M``#H`````$B+LT@*``!(A?9T'TB-NR@*``#H`````$B+M4@*``!(C;TH"@``
+MZ`````!(B[.X"@``2(7V=!](C;N8"@``Z`````!(B[6X"@``2(V]F`H``.@`
+M````2(NS\`H``$B%]G0M2(N3^`H``$B-N]`*``#H`````$B+E?@*``!(B[7P
+M"@``2(V]T`H``.@`````2(NS(`L``$B%]G0M2(N3*`L``$B-NP`+``#H````
+M`$B+E2@+``!(B[4@"P``2(V]``L``.@`````2(NS4`L``$B%]G0M2(N36`L`
+M`$B-NS`+``#H`````$B+E5@+``!(B[50"P``2(V],`L``.@`````2(NSL`L`
+M`$B%]G0M2(N3N`L``$B-NY`+``#H`````$B+E;@+``!(B[6P"P``2(V]D`L`
+M`.@`````2(NS@`L``$B%]G0M2(N3B`L``$B-NV`+``#H`````$B+E8@+``!(
+MB[6`"P``2(V]8`L``.@`````2(NSX`L``$B%]G0M2(N3Z`L``$B-N\`+``#H
+M`````$B+E>@+``!(B[7@"P``2(V]P`L``.@`````2(NS$`P``$B%]G0M2(N3
+M&`P``$B-N_`+``#H`````$B+E1@,``!(B[40#```2(V]\`L``.@`````2(NS
+M0`P``$B%]G0M2(N32`P``$B-NR`,``#H`````$B+E4@,``!(B[5`#```2(V]
+M(`P``.@`````2(/$:%M=PV9F9I!F9F:09F:02(/L&$B)7"0(3(ED)!!(B?OH
+M`````$B)W^@`````3(VCP`X``$R)Y^@`````2(G?Z`````"_T`<``.@`````
+M2(G?Z`````"^`0```$B)W^@`````O@$```!,B>?H`````$B+7"0(3(MD)!!(
+M@\08PTB#[`A`B'=*0`^V]N@`````N`$```!(@\0(PV9FD&:04TB)^^@`````
+M2(N[``@``$B!Q\`.``#H`````%O#9I!32(G[Z`````!(B[L`"```2(''P`X`
+M`.@`````6\-FD$B#[`CH``````^VP(,]``````"Z`0````]%PDB#Q`C#2(/L
+M.$B)7"0(2(EL)!!,B60D&$R);"0@3(ET)"A,B7PD,$B)^T&)]$&)U4B+;VA,
+MBW=X2(7M#X06`0``@+_*``````^%"0$``$R)]^@`````28G'2(7`#X3U````
+MQD`XX<9`.0%%A.1T#4&`_0$9P/?0@\`'ZPM!@/T!&<#WT(/`#4&(1SH/MT4X
+M9D&)1R!)B5\H0<='-`````!)QT=(`````$G'AZ``````````3(G^3(GWZ```
+M``#&@\H````!9L>#R````/0!2(7;=$Y(BU-H2(72=$]F@;O(````E@!U#DB+
+M>E"^(0```.@`````9H.KR`````&_T`<``.@`````3(GWZ`````!(BU-H2(72
+M=`F`N\H`````=;MF@[O(`````'0:08!_)`!U$TB+0V@/MT!B9HE#7KL`````
+MZP6[_____TR)_DR)]^@`````ZP6[_____XG82(M<)`A(BVPD$$R+9"083(ML
+M)"!,BW0D*$R+?"0P2(/$.,-F9F:02(/L*$B)'"1(B6PD"$R)9"003(EL)!A,
+MB70D($B)^XGU3(MG:$R+;WA-A>0/A"8!``"`O\H`````#X49`0``3(GOZ```
+M``!)B<9(A<`/A`4!``#V`P(/A>H```!`@/T4=PQ`#[;%C01`P>`"ZQ>XB?__
+M_T#VY6;!Z`C`Z`0/ML`%\````$'&1CCA0<9&.0%!QD8Z'$&(1CM!#[=$)#AF
+M08E&($F)7BA!QT8T`````$G'1D@`````2<>&H`````````!,B?9,B>_H````
+M`,:#R@````%FQX/(````Q`E(A=MT3DB+4VA(A=)T3V:!N\@```"6`'4.2(MZ
+M4+XA````Z`````!F@ZO(`````;_0!P``Z`````!,B>_H`````$B+4VA(A=)T
+M"8"[R@````!UNV:#N\@`````=`R[`````$&`?B0`=`6[_____TR)]DR)[^@`
+M````ZP6[_____XG82(L<)$B+;"0(3(MD)!!,BVPD&$R+="0@2(/$*,-F9F:0
+M2(/L&$B)'"1(B6PD"$R)9"002(GS2(M'4$R+($B+;F@/MD8D/`9T2#P&=PJ$
+MP'0@/`)U#NLN/"%T-CR`9F9FD'0NN`````#K<69F9I!F9I!(BT=`QT`$````
+M`,:%L@````'K$\:%L@```!#K"F9FD,:%L@````U(@WMP`'0C@7LT`!```'<.
+M2(US<$R)Y^@`````ZPQ(C7-P3(GGZ`````!(B=Y,B>?H`````$B)[_^5R```
+M`+@!````2(L<)$B+;"0(3(MD)!!(@\08PV9FD$%6055!5%532(G[2(GU08G,
+M3(MV>$R-;UA!@/@!&<"#X`B#P`J)AY0```!(BT9H]D!@`71\08#X`1G`@^`"
+M@^AXB$<XQD<Y`$B)T$C!Z#B(1SI(B=!(P>@PB$<[2(G02,'H*(A'/$B)T$C!
+MZ""(1SU(B=!(P>@8B$<^2(G02,'H$(A'/TB)T$C!Z`B(1T"(5T'&1T(`QD=#
+M`$2)X&;!Z`B(1T1$B&=%QD=&`,9'1P#K2D&`^`$9P(/@`H/`*(A'.,9'.0!(
+MB=!(P>@8B$<Z2(G02,'H$(A'.TB)T$C!Z`B(1SR(5SW&1SX`1(G@9L'H"(A'
+M/T2(9T#&1T$`2(G?Z`````!(BT5H#[=`.&:)0R#&0R2`2(EK*$B+0W!(BT`0
+M2(E#2$$/M\0/KT58B4,TQD,P($B+16A(!<,```!(B4-02,>#H`````````"^
+M`````$R)[^@`````BU,T2(M#<$B+<!A,B>_H`````,:%R@````%(B=Y,B??H
+M`````$B%[71N2(M5:$B%TG1E@+W*`````'1C9H&]R````)8`=1%(BWI0OB$`
+M``#H`````&9FD&:#K<@````!O]`'``#H`````$R)]^@`````2(M5:$B%TG0=
+M@+W*`````'0;Z[:X`````(![)`!T&F9F9I!F9I"X_____^L,9H.]R`````!T
+M[^O;6UU!7$%=05[#9F9FD$B#['A(B5PD2$B);"103(ED)%A,B6PD8$R)="1H
+M3(E\)'!(B?M)B?5)B<]!B=1%B<9(BV]H2(7M#X1R`@``@+_*``````^%90(`
+M`$B+15!(B40D&$B+5WA(B10D9L>'R````!`G2(G7Z`````!(B40D$$B%P`^$
+M-0(``&9!@_P$=AY!#[?T2,?'`````+@`````Z`````#K&F9F9I!F9I!(BSPD
+MZ`````!(B40D"$B%P'492(MT)!!(BSPDZ`````!!O/_____IZ@$``$B+5"0(
+M2(M$)!!(B5!PQH"``````4B+!"1(B[``"```QD8_`4B)VK\%````Z`````"`
+M34P"2(M3:+XA````2(M\)!CH`````$B#>V@`#X01`0``@+O*``````^%!`$`
+M`$$/M]2)T,'@"8E$)#R+2UC&1"0@`('Y`!```'4<1(GH@^`'B$0D($G![0,/
+MML"-1`('08G$0<'L`T6$]G5M@?D`$```=3Y!#[?,0;@!````3(GJ2(G>2(M\
+M)!#H9/S__X7`="!(Q\<`````N`````#H`````$&\_____^F*````9F9FD`^V
+M5"0@2,'B"4B)UX'G``X``$B+1"0(2`-X$(M4)#Q,B?[H`````$$/M\Q%#[;&
+M3(GJ2(G>2(M\)!#H`?S__X7`=3U!O`````!%A/9T.(M4)#P/MD0D($C!X`E(
+MB<:!Y@`.``!(BT0D"$@#<!!,B?_H`````$&\`````.L)9F:00;S_____2(M4
+M)!!(@WIP`'0Y@7HT`!```'<22(G62(/&<$B+/"3H`````.L22(MT)!!(@\9P
+M2(L\).@`````2(M$)!#&@(``````2(MT)!!(BSPDZ`````!(BQ0D2(NR``@`
+M`,9&/P!(B=J_!@```.@`````@&5,_>L+9F:09I!!O/____]$B>!(BUPD2$B+
+M;"103(MD)%A,BVPD8$R+="1H3(M\)'!(@\1XPV9F9I!(@^PH2(D<)$B);"0(
+M3(ED)!!,B6PD&$R)="0@2(G[28GU28G42(MO:$B%[74*2(G7_];I^````$B#
+MOX@`````=0Y(@[^``````'0/9F9FD$R)YT'_U>G5````@+W```````^%O0``
+M`(!]2O]F9F:0#X6O````2(M%6$B%P'07@'A-``^%G````/9`2@)F9I`/A(\`
+M``!(BWU0]D<+$&:0#X5_````3(LW@'US`'0-2(GJO@8```#H`````$R)JX@`
+M``!,B:.0````#[952$B)T(/@!DB#^`9T5DB#^`1U4/;"`71+2(M%6$B%P'0B
+M]D!*`G0\9L=`2@$`2(M%6,9`0@%(BW583(GWZ`````#K(,9%2@/&14L$2(GN
+M3(GWZ`````#K"TR)YT'_U69FD&:02(L<)$B+;"0(3(MD)!!,BVPD&$R+="0@
+M2(/$*,-F9I!54TB#[`A(B?M(C:_`#@``Z`````!(B4,H2(E%*$B)FP`(``!(
+MB9T`"```BX,8"```B848"```QH.>#@```<:%G@X```%(B=_H`````$B)W^@`
+M````2(GOZ`````"^`````$B)W^@`````2(G?Z`````"$P'1J2(GOZ`````"$
+MP'1>2(G?Z`````"_T`<``.@`````2(G?Z`````#'@R@!``#H`P``2,>#.`$`
+M``````!(B9M``0``2(VS*`$``$B+>RCH`````+X`````2(G?Z`````"X`0``
+M`.L)9F9FD+@`````2(/$"%M=PV9F9I!32(G[Z`````!(@</`#@``2(G?Z```
+M``"X`0```%O#D$%7059!54%455-(@^P82(ET)`A(B10D@ST```````^%;P$`
+M`,<%``````$```!$BST`````QT0D%`````!)Q\4`````2,?#`````$G'Q@``
+M``#I=@(```^WA@````#!X!!"#[<4+@G0.<4/A?$```!!N`````"_`````&9F
+MD&:09H,\'P!U7TECT$B)T4C!X05*BP0N2(D$&4*+1"X(B409"`^V@0````!(
+MP>(#2(T\`@^V1"03B$2[#0^V@0````!(C3P"#[9$)!*(1+L.#[:!`````$@!
+MPL9$DP\`@($``````>MT#[:/``````^VP;H`````0O<T-H72=$L/ML%)8]!(
+MC0S5`````$B-/`$/MD0D$XA$NPU(P>(%#[:"`````$B-/`$/MD0D$HA$NPX/
+MMH(`````2`'!QD2+#P"`@@`````!ZQ)!@\`!2(/'($&#^`0/A2;___^#A@``
+M```!08/"`4B#QAA%.?H/A>7^__]!@\0!08/\(`^%%P$``(-$)!0!@7PD%/\`
+M```/A3H!``!(@WPD"`!T"$B+5"0(Q@(`BS4`````O0````"%]GXUN0````"]
+M`````+H``````ZH`````2(-\)`@`=`V+@@````!(BUPD"``#@\$!2(/"&#GQ
+M==I(@SPD``^$[````$&Y`````$&Z`````$G'Q`````!F0X,\(@`/A,T```!!
+M#[:2`````(32=&=!N`````!)8\%,C1S%``````^VPH/H`4B-6`%+C00#2(TT
+MA0````!(BSPDN00```#\\Z8/E\(/DL`XPG4A2(-\)`@`=`]!#[:"`````$B+
+M5"0(B`)!#[:J`````.L)28/``4DYV'6T08/!`4F#PB!!@_D$=$SI;O___T2(
+M9"02N0````"Z`````$2)YHM\)!3H`````(G%0;H`````O@````!%A?\/CX_]
+M___II?[__P^V1"04B$0D$T&\`````.NY0`^VQ4B#Q!A;74%<05U!7D%?PV9F
+M9I!F9F:09F9FD&9FD$B#[!A(B1PD2(EL)`A,B60D$$&)]$B+7WA(BV]H]@<!
+M="Y(B=_H`````$B%P'0Q@+CY`````'0H00^VU$B+=4!(B=_H`````.L69F:0
+M9F:00`^VUDB+=4!(B=_H`````$B+'"1(BVPD"$R+9"002(/$&,-F9F:09F:0
+M9F:09F:02(/L.$B)7"0(2(EL)!!,B60D&$R);"0@3(ET)"A,B7PD,$B)_4&)
+M]$B+7VA,BV]X2(7;#X0N`P``@+_*``````^%(0,``/8'`@^%&`,```^V@R`!
+M``"$P'0+0#CP=4R0Z0(#``!(BU-`#[:"RP```(T$@`^V4@(!T$B8#[:(````
+M`$$/ME4Z00^V=3E%#[;$2,?'`````+@`````Z`````"X_____^G!`@``3(GO
+MZ`````!)B<9(A<`/A*@"``!(BU-`#[:"RP```(T$@`^V4@(!T$B8#[:(````
+M`$$/ME4Z00^V=3E%#[;$2,?'`````+@`````Z`````!!QD8XX4'&1CD!08#\
+M`@^5P(/`&D&(1CH/MT,X9D&)1B!)B6XH0<=&-`````!)QT9(`````$G'AJ``
+M````````3(GV3(GOZ`````#&A<H````!9L>%R````/0!2(7M=$Y(BU5H2(72
+M=$5F@;W(````E@!U#DB+>E"^(0```.@`````9H.MR`````&_T`<``.@`````
+M3(GOZ`````!(BU5H2(72=`F`O<H`````=;M,B?9,B>_H`````&:#O<@`````
+M#X2>`0``08!^)``/A9,!``!,BW5H28M&4$R+*$R)[^@`````2(G#2(7`=1)!
+MQH;!`````;@`````Z7(!``!,B>_H`````$F)Q$B%P'4=0<:&P0````%(B=Y,
+MB>_H`````+@`````Z44!``!,C7M8QD,XX<9#.0'&0SH#00^W1CAFB4,@QH.8
+M````#TB):RC'0S0``@``28M4)!!(B5-(N`````#&!!``2(/``4@]``(``'7P
+M3(EC<$C'@Z``````````O@````!,B?_H`````(M3-$F+="083(G_Z`````!(
+MB=Y,B>_H`````,:%R@````%FQX7(````^@!(A>UT3DB+56A(A=)T3V:!O<@`
+M``"6`'4.2(MZ4+XA````Z`````!F@ZW(`````;_0!P``Z`````!,B>_H````
+M`$B+56A(A=)T"8"]R@````!UNV:#O<@`````=""`>R0`=1I(BW-(3(GWZ```
+M``!!#[:&(`$``(B%S@```$B#>W``=`Q(C7-P3(GOZ`````!(B=Y,B>_H````
+M`+@`````ZQ-F9F:09F:0N/_____K!;C_____2(M<)`A(BVPD$$R+9"083(ML
+M)"!,BW0D*$R+?"0P2(/$.,.02(/L"(`^"7<*#[8&_R3%`````+C_____ZW9(
+MBT8(2(N0"`@``$B%TD@/1-!(B[H`"```QH>?#@```>@`````N`````#K2@^V
+M5@B^`````.A\[?__ZSH/ME8(O@$```#H;.W__^LJ#[9V".@`````D.L>#[9V
+M".@`````9F:09I#K#@^V=@CH`````+@`````2(/$",-F9F:09F9FD&9FD$B#
+M[!A(B1PD2(EL)`A,B60D$$B)_4R+9WA)BX0D``@``(!X/P!U84B+GX`````/
+MMH?+````C02`#[97`@'02)@/MH@`````00^V5"0Z00^V="0Y1`^VA\X```!(
+MQ\<`````N`````#H`````$C'A8``````````BU4(2(N]D````$B)[O_3ZSU(
+MC9^8````28M\)"A(B=[H`````,>%F````/0!``!(QX6H`````````$B)K;``
+M``!)BWPD*$B)WN@`````2(L<)$B+;"0(3(MD)!!(@\08PV9F9I!F9F:00515
+M4TF)_$B)\P^WTDB-!-)(C02"2,'@`TB)Q4@#KT@(``!,BX<`"```28'`P`X`
+M`$B);FA(B75`QH4A`0```$B#?5@`=2D/MG]#0(3_#X19`0``2(MU4+D`````
+M23NT).`,```/A!8!``#I,`$``(`.`4B+15A(B49P#[9_0T"$_W152(MU4+D`
+M````23NT).`,``!T).LS9F9FD&9FD`^VP4B)PDC!X@1(P>`'2"G023FT!.`,
+M``!U%D$/MD0D08T$@8B#RP```.L-N0````"#P0%`./EUQTF+C"0`"```O@``
+M``"Z`````&9FD&:0#[:$"O@'```\_W0=#[;`2,'@"$@#@7`(``!(.T58=09`
+MB',!ZT>#Q@%(@\(!2(/Z!'7-L@!"#[:$`O@'```\_W0A#[;`2,'@"$D#@'`(
+M``!(.T58=0I`B',!ZQ%F9F:0@\8!2(/"`4B#^@1UR`^V17&(0P+K80^VP4B)
+MPDC!X@1(P>`'2"G023FT!.`,``!U)$$/MD0D08T$@8A#`8B#RP```$$X3"1#
+M=1?K$69F9I"Y`````(/!`4`X^76YQD,!_\9#`@"#O1@!````=`F+A1P!``"(
+M0P)(C4L@2(V5B````$B+A8@```!(B4,@2(M""$B)00A(BT(02(E!$$B+0AA(
+MB4$82(M"($B)02!(C4L,2(U5=$B+171(B4,,2(M""$B)00B+0A")01!(BX6P
+M````2(E#2`^W16!FB4-<#[=%8F:)0UY(BT5H2(E#4(N%O````(E#6`^V17*(
+M0V`/MH4@`0``B(/.````]D5,!'4/3(GGZ`````!F9F:09F:0#[952$B)T(/@
+M!DB#^`9U!?;"`70#@"/]#[953-#J@^($#[8#@^#["="(`P^V0P&(@\T````/
+MMD,"B(/,````2(G?Z`````!(BW5`N@````!,B>?H`````$B)W^A0_/__6UU!
+M7,-F9F:09F9FD&9FD$B#[!A(B5PD"$B);"002(G]2(N?``@``.@`````@'U+
+M`74M2(V[P`X``(!_2P%T6X"]L`X```!U%[X`````Z`````"`A;`.```!9F:0
+M9F:02(V=*`$``$B+?2A(B=[H`````,>%*`$``.@#``!(QX4X`0```````$B)
+MK4`!``!(BWTH2(G>Z`````!(BUPD"$B+;"002(/$&,-F9I!F9I!!5T%6055!
+M5%532(/L.$F)_(GP2(G328G-08GV0<'N&$&)]T'![Q`/MM2(5"000(AT)`](
+MC:O`#@``N`````"0Q@08`$B#P`%(/8`?``!U\$R):R"+!0````"(0T"#P`&)
+M!0````!$B',[1(A[.@^V1"00B$,Y#[94)`^(4SC&0T$`00^W!"1FB4,P00^W
+M1"0"9HE#,D&+1"0$B4,T2(V3@!T``$B)D[@.``!,B6T@#[9#0(A%0$2(=3M$
+MB'TZ#[9$)!"(13D/MD0D#XA%.,9%00%!#[<$)&:)13!!#[=$)`)FB44R08M$
+M)`2)131(B96X#@``#[=#,F8])"</A!0!``!F/20G#X>$````9CU$(0^$``$`
+M`&8]1"%W1&8]("$/A/````!F/2`A=P]F/5`'#X7T````Z=L```!F/2(AD`^$
+MT````&8]0"%F9I!F9I`/A=0```#INP```&9FD&:09CT0)P^"P````&8]$2=F
+MD`^&H````&8M("=F@_@"9I`/AZ0```#IBP```&9FD&:09CV`)P^$?````&8]
+M@"=FD'<N9CU`)W1N9CU`)V9F9I!W"&8],"=U<NM<9CU$)V:0=%1F/6`G=6+K
+M3&9FD&9FD&8]@')T0&8]@')F9I!F9I!W"&8]@B=U0NLL9CV`D6:0=`YF/8"4
+M=3+K'&9FD&9FD&;'0SR`D<9#/@1FQT4\@)'&13X$ZQ1FQT,\@)3&0SX$9L=%
+M/("4QD4^!$$/MD0D"(A#0D$/MD0D"(A%0KD```0`N@````"^`@```$R)[^@`
+M````2(D#N0`@``"Z`````+X`````3(GOZ`````!(B<%(B4,02(L#2(7`#X3E
+M`0``2(7)#X3<`0``2(V0``(!`$B)4PA(C8````(`2(D#2`4`0```2(E%`$B)
+M50A(B4T01(L%`````$6%P'YGO@````"Y`````$C'QP`````/MP0Y9D$[!"1U
+M/P^W@0````!F03M$)`)U,(N1`````(/"`8F1`````$2+B0````!%A<ET%40Y
+MRG80B="Z`````$'W\8F1`````(/&`4B#P1A$.<9UJDB+0PA(+>!]``#'``'P
+M`P!(BT,(2"W8?0``QP`!``#H2(M[(+YX````Z`````")PB4`<```/0`@``!V
+M%(#FCX#.($B+>R"^>````.@`````1(AT)"-$B'PD(@^V5"00B%0D(0^V1"0/
+MB$0D(+T`````0;D`````2<?$`````$R-;"0@9D.#/"$`#X2B````08"Y````
+M```/A(0```!!N`````!(8\5,C13%`````$V)ZTN-!`)(C32%`````+D$````
+M_$R)W_.F#Y?"#Y+`.,)U.T$/MH$`````@\`!08B!`````$$/MI$`````A-)T
+M'3C0=AD/ML`/MLJZ`````&;W\4&(D0````!F9F:008U0`4F#P`%!#[:!````
+M`#G0?Y"#Q0%)@\$@@_T$#X52____QX,8"````0```+@!````ZP6X`````$B#
+MQ#A;74%<05U!7D%?PV9F9I!F9I!)B?!,BT]X#[8'@^`!1`^VT+@`````0L8$
+M``!(@\`!2(/X,'7Q28NQN`X``$B)\K``Q@00`$B#P`%(/0`"``!U\$B-3C:Z
+M`````&9FD&9FD`^V1%<AB`11#[9$5R"(1%$!2(/"`4B#^A1UY4B-3A2R``^V
+M1%<-B`11#[9$5PR(1%$!2(/"`4B#^@IUY4B-3BZR``^V1%=)B`11#[9$5TB(
+M1%$!2(/"`4B#^@1UY4F)<"!(BT=02(/``4F)`(M'6$&)0`@]`!```'4$2<$@
+M`TB#?V@`=2+V!P%T'4B+1W!(A<!T-TV%R70R#[=`0$&`O`%X!P``_W0C#[:'
+MRP```(T$@`^V5P(!T$B8#[:``````$&(0!!!N@````!!QD`1`$'&0!(!0<9`
+M%A!!QD`5$$2)T(T4`+[]____02)P#@G608AP#L'@!4$/ME`,@^+?"<)!B%`,
+M#[='7$C!Z`>#X`'!X`:#XK\)PD&(4`P/MT=<2,'H`H/@`4$/MD@-@^'^"<%!
+MB$@-#[='7DC!Z`/!X`>#XG\)PD&(4`P/MT=>2-'H@^`!`<"#X3T)P4&(2`V#
+MRA!!B%`,#[8'T.B#X`&#YOX)QD&(<`X/M@>#X`2#YOL)QD&(<`YF0<=`&``0
+M#[:'S@```$&(0!,/MH?+````08A`*,-F9F:09F9FD&9FD&9FD$B#["A(B1PD
+M2(EL)`A,B60D$$R);"083(ET)"!(B?M(B?5,BW=X2(M&2$B).$B+1VA(A<!U
+M&L:&L@````)(B??_EL@```#I%08``&9FD&:0]D!,`G0:QH:R`````DB)]_^6
+MR````.GU!0``9F:09I!,B??H`````$F)Q$B%P&:0=17&A;(````"2(GO_Y7(
+M````Z<D%``#'@)0`````````2(EH:$B+0VA)B40D*$B+0V@/MT`X9D&)1"0@
+M#[:%L````#P"#X2;`0``/`)W"83`="+I'P,``#P#9F:09F:0#X36`0``/`0/
+MA0D#``!FD.F7`0``2(N5D`````^WC9@```"!>U@`$```=0A(P>H#9L'I`TB+
+M0VCV0&`!#X2N````#[:%L0```*@"=`A!QD0D.(CK$H/@!#P!&<"#X`6#Z'9!
+MB$0D.$'&1"0Y`$B)T$C!Z#A!B$0D.DB)T$C!Z#!!B$0D.TB)T$C!Z"A!B$0D
+M/$B)T$C!Z"!!B$0D/4B)T$C!Z!A!B$0D/DB)T$C!Z!!!B$0D/TB)T$C!Z`A!
+MB$0D0$&(5"1!0<9$)$(`0<9$)$,`B<AFP>@(08A$)$1!B$PD14'&1"1&`$'&
+M1"1'`.MP#[:%L0```*@"=`A!QD0D."CK$H/@!#P!&<"#X`6#P"I!B$0D.$'&
+M1"0Y`$B)T$C!Z!A!B$0D.DB)T$C!Z!!!B$0D.TB)T$C!Z`A!B$0D/$&(5"0]
+M0<9$)#X`B<AFP>@(08A$)#]!B$PD0$'&1"1!`$B+0VA(!<,```!)B40D4$'&
+M1"0P(`^WP0^O0UA!B40D-.F=`0``@+V0````$'<%]@,"=0S&A;(````&Z;`#
+M``#&A;(````&Z:0#```/MH6Q````@^`P/"!U%T'&1"0X&T'&1"0Y`4'&1"0\
+M`.E2`0``0<9$)#@UZ4<!``!(BT-H#[9`2*@!="BH!'0D08&,))0``````"``
+M#[>5G````&8[E9(```!U%.M=9F:09F:0QH6R````!NDT`P``#[:%FP```#SC
+M=$`\XW<./$)T.#RP=!\\0'4DZRX\[&9FD&:0=!`\[W0A/.5U$69FD&9FD.L5
+M9HF5D@```.L,QH6R````!NGI`@``0<9$)#BP#[>%D````$&(1"0Y#[>%D@``
+M`$&(1"0Z#[>%E````$&(1"0[#[>%E@```$&(1"0\#[>%F````$&(1"0]#[:%
+MF@```$&(1"0^#[:%FP```$&(1"0_#[:%D0```$&(1"1`#[:%DP```$&(1"1!
+M#[:%E0```$&(1"1"#[:%EP```$&(1"1##[:%F0```$&(1"1$]H6Q````!G0=
+M#[>%G````,'@"4&)1"0TZPS&A;(````&Z2T"``!)QX0DH``````````/MH6Q
+M````J`8/A`("``!-C6PD6$B+G;@```!(A=MT!*@!=35(BX7`````2(7`#X0#
+M`@``28NV*`D``+H`````2(GO_]"%P`^$Z@$``$F+GB@)``!(A=MT.4R)Y^@`
+M````O@````!,B>_H`````$B#PQ"+4_!(BW/X3(GOZ`````"+0_1(@\,0A<`/
+MA8$!``#KX+X`````3(GOZ`````!!BT0D-#T`$```=SU,B??H`````$B)P4B%
+MP'4,QH6R````"^E:`0``2(M`$$F)1"1(28E,)'!!BU0D-$B+<1A,B>_H````
+M`.M0/0```0!W/4R)]^@`````2(G!2(7`=0S&A;(````+Z18!``!(BT`028E$
+M)$A)B4PD<$&+5"0T2(MQ&$R)[^@`````ZPS&A;(````&Z>D````/MH6Q````
+MJ`0/A,H```"`O;`````#=2!(B[6@````2(7V=!1)BWPD2$&+5"0TZ`````#I
+MH0```$B+E;@```!(A=)U%4B+A<````!(A<`/A;4```#K8V9FD$V+;"1(J`%U
+M"4B)TV9F9I#K*$B+A<````!(A<!T'$F+MB@)``"Z`0```$B)[__0A<!T!TF+
+MGB@)``!(@\,0BU/P2(MS^$R)[^@`````BT/P20'%BT/T2(/#$(7`=2+KWD&+
+M1"0T28M,)$B%P'02B<)(B<C&``!(@\`!2(/J`77S3(GF3(GWZ`````#K,V9F
+MD$R)YDR)]^@`````2(GO_Y7(````ZQJ[`````.E1_O__38ML)$CI9/___V9F
+MD&9FD$B+'"1(BVPD"$R+9"003(ML)!A,BW0D($B#Q"C#9F:055-(@^P(2(G]
+M2(GSN`````#&!!@`2(/``4@]@````'7P@[T8"````0^40Q,/ME4Z#[9-.0^V
+M=3@/MD4[B$,#B%,"B$L!0(@S@$L1$`^W13!FB4,$#[=%,F:)0P:+A1@(``"(
+M0W#&0Q(@#[=5,F:!^B`A=`=F@?HB(75(QD,7`DB-0SS'0SQ2;V-KQT-`9712
+M0<=`"$E$(%/'0`Q31"`RQT`0,3)X(,=`%$-O;G3'0!AR;VQL9L=`'&5RQD`>
+M`.D!`0``C8+PV/__9H/X`7829H'Z0"%T"V:!^D0A#X6G````QD,7!`^W53*-
+M@O#8__]F@_@!=T1(C4,\QT,\4F]C:\=#0&5T4D''0`A)1"`RQT`,-S%X(,=`
+M$%-!4R#'0!1#;VYTQT`8<F]L;&;'0!QE<L9`'@#IBP```&:!^D`A=`=F@?I$
+M(75]2(U#/,=#/%)O8VO'0T!E=%)!QT`(240@4\=`#%-$(#+'0!`Q-'@@QT`4
+M0V]N=,=`&')O;&QFQT`<97+&0!X`ZSS&0Q<(2(U#/,=#/%)O8VO'0T!E="`W
+MQT`(-3`@4\=`#$%402#'0!!#;VYTQT`4<F]L;&;'0!AE<L9`&@#&0Q<HQD,2
+M`<9#$"A(C4,8QT,82&EG:,=#'%!O:6['0`AT(%1EQT`,8VAN;\=`$&QO9VG'
+M0!1E<RP@QT`826YC+L9`'`!(BX40"```2(7`=`I(BT`02(E#:.L(2(M%$$B)
+M0VC'0V``(```2(M](+Y\````Z`````")PH'B\`,``,'J!(A3<8/@#XA#<TB+
+M?2"^@````.@`````B<*!X@``\`/!ZA2(4W(E```/`,'H$(A#=$B#Q`A;7<-F
+MD$%7059!54%455-(@^P(28G]B?5(B=.X`````&9FD&:0Q@08`$B#P`%(/=``
+M``!U\(EK"(/]$WX*28'%P`X``(/M%$ACQ;H`````28.\Q7@#````#X4D`@``
+M2&/%28F<Q7@#``!,B6MX2(F+@````$R)@Y````!!@'U+`0^%]P$``(']@P``
+M``^/U0$``$$/MH0%>`<``#S_#X3$`0``#[;`9HE$)`8/M\!(C13`2(T4D$C!
+MX@-)B=1-`Z5("```0?9$)$L$#X27`0``08M$)$@E`/__`#T``/\`#X6"`0``
+M0?9$)$P$#X3Q````0<:$),``````00^V5"1(2(G0@^`&2(/X!@^$;0$``$B#
+M^`0/A6,!``#VP@$/A%H!``!)BUPD4$F+1"182(7`#X6%````0<9$)$H#0<9$
+M)$L$@'L-`'1/O0````!,C7-`3(GWZ`````!(B<)(BT-(2(E32$R),DB)0@A(
+MB1"`>DK_=!A).=1T$T'&A"3!`````;H!````Z?8```"#Q0$/MD,-.>A_ND&`
+MO"3!`````0^$UP```$R)YDR)[^@`````N@$```#IQP```(!X0@`/A;@```!F
+MQT!*`0!)BW0D6$R)[^@`````N@$```#IH````$V+9"1008!\)`T`=&%!O@``
+M``!-C7PD0$R)_^@`````2(G"28M$)$A)B50D2$R).DB)0@A(B1"`>DK_="8/
+MMD))/")T!#P-=1I(8\5)QX3%>`,```````"Z`````.M!9F9FD$&#Q@%%.'0D
+M#7>J#[=4)`9(B=Y,B>_H`````+H!````ZQM(8\5)QX3%>`,```````"Z````
+M`.L%N@$```")T$B#Q`A;74%<05U!7D%?PY"0B=#&!PC&1P$20(3V=`:`3P($
+MZP2`9P+[A,!T!H!G#-_K!(!/#""X%````,-F9F:0\\-F9F:09F9FD&9FD&9F
+MD$%7059!54%455-(@^P828G]28GV2(G5B$PD!T6)QTB+1C!(B40D$$C'1C``
+M````2(7`#X5T`0``Z`````!)B<2X`````$V%Y`^$$0(``$R)[^@`````2(E$
+M)!!(A<!U%4R)YDR)[^@`````N`````#IZ@$``$'&1"0X&D'&1"0Y"$'&1"0Z
+M"$'&1"0[`$'&1"0\_T'&1"0]`$'&1"0EJT$/MT8X9D&)1"0@38EL)"A!QT0D
+M-/\```!!QX0DE`````@```!(BT0D$$B+0!!)B40D2$@%_P```$F)1"100<9$
+M)#`D2(M$)!!)B40D>$G'A"2@`````````$'&1"0D@$F-7"18O@````!(B=_H
+M`````$B+1"002(MP&+K_````2(G?Z`````!,B>9,B>_H`````+O(____ZR!F
+M9F:09F:0O^@#``#H`````(/K`4R)[^@`````A-MT#D$/MD0D)#R`=-V$P'0Q
+M2(UT)!!,B>_H`````$$/MW0D,DF+?E#H`````$R)YDR)[^@`````N`````#I
+MQP```$G'1"1X`````$R)YDR)[^@`````2(M$)!!(BU@000^VUP^V="0'2(U[
+M!.@`````08G$Q@,`QD,!`,9#`@#&0P,`2(GN3(GOZ`````!(C54XN`````!F
+M9I#&!!``2(/``4B#^!!U\D&-1"0$QD4X%<9%.1&(13S&13T`2(U=6$0/MN!$
+MB64TQX64`````````$B+5"002(M"$$B)14A(B55XO@````!(B=_H`````$B+
+M1"002(MP&$2)XDB)W^@`````N`$```!(@\086UU!7$%=05Y!7\.0D(GP9HEW
+M",9'#@!FQT<,``!FA?9T'XU0_[D`````9F:02(L'9HD4"$B#P0*#Z@%F@_K_
+M=>SSPV9F9I!F9I!F9I!!B?!FB7<(QD<.`6;'1PP``&:%]G0>N@````"Y````
+M`$B+!V:)%`B#P@%(@\$"9D0YPG7L\\-F9F:09F:09F:0@'\.`74J#[='#`^W
+MR$B+%P^W%$J#P`%FB4<,9CM'"G(&9L='#```9H-O"`$/M\+#2(L7#[='"(/H
+M`6:)1P@/M\`/MP1"PV9F9I!F9I!F9I"`?PX!=2H/MU<(#[='#`'"#[='"HG!
+MB=#!^A_W^4ACTDB+!V:)-%!F@T<(`<-F9I`/MT<(#[?(2(L79HDT2H/``6:)
+M1PC#9F9FD&9FD&9FD&:#?P@`#Y3`#[;`PY"0D)!(BP](.<]U"+D`````ZP^0
+M2(L12(M!"$B)0@A(B1!(B<C#9F9FD&9F9I!F9I!F9I!!B="$TG0Z#[8'2(GY
+MOP`````Z!G06ZQX/ME$!#[9&`4B#Q@%(@\$!.,)U"H/'`40XQW7DZPNX````
+M`&9FD&:0P[@!````PV9FD&9FD&9FD,9'`0!`B'<"QT<$`````,-!B=`/ME<!
+M#[;"2(T$0$C!X`)(B<%(`T\(@\(!B%<!1`%'!+@`````Q@0(`$B#P`%(@_@,
+M=?)(B3%$B$$(3(G"#[;&B$$)1(G"P>H0@^(_#[9!"H/@P`G0B$$*PV9F9I`/
+MMD<!.@</DL`/ML##9F:02(GYN`````"`>0+_=0AFB3&(40+K#8/``4B#P01F
+M/8``=>4/M\##9F:09F:09F:008G0#[?&2(T$AX!X`O]U$&9$B0"(2`(/M\;#
+M9F:09I`/MM%!#[?PZ``````/M\##2(GYN``````X40)U$V8Y,74.QD$"_V;'
+M`?__ZQ!F9I"#P`%(@\$$9CV``'7;#[?`PV9F9I!F9F:09F9FD&9FD+@`````
+MB<$X5(<"=09F.32'=`^#P0%(@\`!2#V`````=>-F@?F``+B``0``#T3(#[?!
+MPV9F9I!F9I!F9I!F9I`/MD<X/`AT/CPH=#H\J`^$_P```#R(#X0Y`0``/`IF
+MD'0D/"IT(#RJ#X3E````/(H/A!\!```\+W0,/(]F9F:0#X64`0``/"\/A)(`
+M```\+W<B/`IT7SP*=PH\"&9F9I!U1.M1/"AT>#PJ9F:09F:0=33K;#R/#X39
+M````/(]FD'<5/(@/A,L````\BF9F9I!U%.F^````/*AF9F:09F:0='$\JG1M
+MN0````"X`````.D3`0``#[9'.L'@"`^V5SL)T`^V5SF#XA_!XA`)T(G!#[9'
+M/.GO````9F9FD&9FD`^V5SK!XA@/MD<[P>`0"<(/MD<]"<(/MD<\P>`(B=$)
+MP0^V1S_!X`@/ME=`"=#IM0````^V5SK!XA@/MD<[P>`0"<(/MD<]"<(/MD<\
+MP>`(B=$)P0^V5S[!XA@/MD<_P>`0"<(/MD=!"<(/MD=`P>`("=#K<P^V5SI(
+MP>(X#[9'.TC!X#!("<(/MD=!2`G"#[9'/$C!X"A("<(/MD<]2,'@($@)P@^V
+M1SY(P>`82`G"#[9'/TC!X!!("<(/MD=`2,'@"$B)T4@)P0^V5T+!XA@/MD=#
+MP>`0"<(/MD=%"<(/MD=$P>`("=!(B8^(````B8>0````9H-/(@'SPV9F9I"Z
+M_____V:%]G0Q2(GYOP````"Z_____TG'P`````!FD`^V`3'0#[;`P>H(03,4
+M@(/'`4B#P0%F.?=UY8G0PV:02(/L:$0/MD\[1`^V1SH/MD\Y#[97.`^V1T>)
+M1"18#[9'1HE$)%`/MD=%B40D2`^V1T2)1"1`#[9'0XE$)#@/MD="B40D,`^V
+M1T&)1"0H#[9'0(E$)"`/MD<_B40D&`^V1SZ)1"00#[9'/8E$)`@/MD<\B00D
+M2(G^2,?'`````+@`````Z`````!(@\1HPV:02(/L"`^V1@&(1P$/MD8"B$<"
+MBT8$B4<$2(M'"`^V5P%(C1122,'B`DB+=@A(B<?H`````$B#Q`C#9F9FD&9F
+MD$B+3V`/ME=8N`````!F9I#&!#@`2(/``4@]J````'7P2(E/8(A76,-F9F:0
+M9F9FD+@`````NO____]F9I!F9I"(%#A(@\`!2#T``@``=?'SPV9F9I!F9F:0
+M9F9FD&9FD+D`````2#L_=!)(BT\(2(L12(M!"$B)0@A(B1!(B<C#2(L/BY$$
+M`0``B=`E?O_^_XF!!`$``('B?O_R_TB+1PB)$$B+1PB)4`Q(BP>+@%0!``")
+M!0`````E_@#__TB+%XF"5`$``,-F9I!F9I!F9I")\4B+!XN0!`$``(D5````
+M``^W1SQF/8!D=`QF/8"1=`9F/8"4=1$/MLF#P0BX`0```-/@"<+K$$`/MLZ#
+MP0RX`0```-/@"<)(BP>)D`0!``##9F9FD&9F9I!F9I!F9I")\4B+!XN0!`$`
+M`(D5``````^W1SQF/8!D=`QF/8"1=`9F/8"4=1$/MLF#P0BX_O___]/`(<+K
+M$$`/MLZ#P0RX_O___]/`(<)(BP>)D`0!``##9F9FD&9F9I!F9I!F9I")\4"`
+M_O]T;T"`_A]W,HNW&`$``+H!````T^*)T/?0(?")AQ@!``"+AU@!``")!0``
+M```AT'1`B8=8`0``PV:0B[<<`0``#[;!@^@@N@$```")P=/BB=#WT"'PB8<<
+M`0``BX=@`0``B04`````(=!T!HF'8`$``//#9F9FD&9FD$B#["A(B5PD"$B)
+M;"003(ED)!A,B6PD($B)U8GP3(LO0(#^`P^&B0```$B-',4`````@>/X!P``
+M38VD'0`"``!!QP0D#`$``+\0)P``Z`````!)C9P=!`(```^V50/!XA@/MD4"
+MP>`0"<(/MD4`"<(/MD4!P>`("<*)$T''!"00`0``OQ`G``#H``````^V50?!
+MXA@/MD4&P>`0"<(/MD4$"<(/MD4%P>`("<*)$^F$````2(T<Q0````"!X_@'
+M``!.C:0K``(``$''!"0,`0``OQ`G``#H`````$J-G"L$`@``#[95`\'B&`^V
+M10+!X!`)P@^V10`)P@^V10'!X`@)PHD30<<$)!`!``"_$"<``.@`````#[95
+M!\'B&`^V10;!X!`)P@^V100)P@^V107!X`@)PHD32(M<)`A(BVPD$$R+9"08
+M3(ML)"!(@\0HPTB#[!A(B5PD"$R)9"0028G\0`^VWHG>Z`````"_$"<``.@`
+M````B=Y,B>?H`````$B+7"0(3(MD)!!(@\08PY!!5T%6055!5%532(/L6$F)
+M_XA4)%=(BQ>`?SX`#X0\`@``0;P`````0;W@____0;[P____0`^VQDB)1"1(
+M2(V"@`$``$B)1"1`2(V*A`$``$B)3"0X2(V"H`$``$B)1"0P2(V*I`$``$B)
+M3"0H2(V"4`(``$B)1"0@2(V*5`(``$B)3"082(V"X`$``$B)1"002('"T`$`
+M`$B)5"0(9F:02(M$)$A$B>%(T_BH`0^$C0$``$2)Y8/]`W871(GJ2`-4)"B+
+M`HD%`````(/@_HD"ZQN-%.T`````B=)(`U0D.(L"B04`````@^#^B0*_$"<`
+M`.@`````@'PD5P!T<H/]`W871(GR2`-4)!"+`HD%`````(/(`HD"ZQN-%*T`
+M````B=)(`U0D"(L"B04`````@\@"B0)$B?!(BTPD$$@!P8T$K0````")P$B+
+M5"0(2`'"@_T#=@J+`8D%`````.L(BP*)!0````"H`G1TZ^-FD(/]`W8O1(GK
+M2(M$)"!(`=C'``````"_$"<``.@`````2`-<)!B+`XD%`````(/(`8D#ZT&-
+M'.T`````B=M(BT0D($@!V,<``````+\0)P``Z`````!(`UPD&(L#B04`````
+M@\@!B0/K-V9F9I!F9I"#_0-V*T2)ZDB+1"0P2`'0QP`!````2`-4)"B+`HD%
+M`````(/(`8D"ZS9F9I!F9I"-!.T`````B<!(BU0D0$@!PL<"`0```$@#1"0X
+MBQ")%0````"#R@&)$&9F9I!F9I!!C50D`4F#Q`%!@\4(08/&!$$/MD<^.=`/
+MAT+^__](@\186UU!7$%=05Y!7\-F9I!54TB#[`B)T4B++X/^`W8@C03UX/__
+M_XG`2(V4!:`!``"+`HD%`````(/@_HD"ZQZ-!/4`````B<!(C90%@`$``(L"
+MB04`````@^#^B0*$R71^@_X#=B"-!+7P____B<!(C90%X`$``(L"B04`````
+M@\@"B0+K'HT$M0````")P$B-E`70`0``BP*)!0````"#R`*)`HT4M0````"-
+M0O")P$B-C`7@`0``B=)(C905T`$``(/^`W8*BP&)!0````#K"(L"B04`````
+MJ`)T=>OC@_X#=CB-'/7@____B=M(C80K4`(``,<``````+\0)P``Z`````!(
+MC9PK5`(``(L#B04`````@\@!B0/K-HT<]0````")VTB-A"M0`@``QP``````
+MOQ`G``#H`````$B-G"M4`@``BP.)!0````"#R`&)`TB#Q`A;7<.0D)"0D)!(
+MB?E(BS\/MX&X$@``@\`!9HF!N!(``&8[@;P2``!R"6;'@;@2``````^W@;@2
+M``!(P>`"2`.!<!$``(L6B1`/MX&X$@``B8<L`0``PV9FD$&)T+@`````Q@0(
+M`$B#P`%(@_@$=?*)\F:!XO\/#[<!9B4`\`G09HD!#[97#<'B#(L!)?\/\/\)
+MT(D!#[9'"H/@`DB#^`$9TH/B`H/"`<'B!0^V00.#X!\)T(/($(/@]XA!`_9'
+M"@%T%T2)PH/B?\'B!`^W00)F)0_X"=!FB4$"\\-F9F:09F9FD&9FD&9FD+@`
+M````Q@0P`$B#P`%(@_@-=?(/MD<YB`8/MD<ZB$8!#[9'.XA&`@^V1SR(1@,/
+MMD<]B$8$#[9'/HA&!0^V1S^(1@;VAY8````$=",/MD=`B$8(#[9'08A&"0^V
+M1T*(1@H/MD=#B$8+#[9'1(A&#+@!````PV9F9I!F9F:09F:0N@````!!N@``
+M``!!N?_____K4@'21(G`T_BH`702]\(````!=1J!\G<GVP#K$F:0B=`U=R?;
+M`/?"`````0]%T(/I`40YR77+28/"`4F#^@AU$XG0P>@0B`>)T,'H"(A'`8A7
+M`L-%#[8$,KD'````ZZ)F9F:09F9FD&9F9I!F9I!(BX<0$0``BQ"+4`2+4`B+
+M0`R)!0````##9F9FD&9FD$B#[`A(BX:(````1`^V1T-%A,!T(@^V4`VY````
+M`/;"`70,ZQ)(B=!(T_BH`74(@\$!1#C!=>[&1D(,Z`````!(@\0(PV9F9I!F
+M9F:09F:02(/L"$B)^$B+/V;'0$X!`,9`0AU(B<;H`````$B#Q`C#9F9FD&9F
+M9I!F9F:09F:02(/L"$B+/P^W]DC!Y@-(`[>X"0``2(LV2(7V=#U(BQ</MT8R
+M9L'H!0^WP(T$A0`#``")@G`!``!(BQ</MTXR@^$?N`$```!(T^")@G0!``"Z
+M`````.@`````2(/$",.005=!5D%505154TB#[`A(B?U)B?:`?T,`="6Y````
+M`/9&#0%T#NL800^V1@U(T_BH`74,@\$!#[9%0V8YR'?H28M&0$B%P'0<2(VP
+MD````$B+?2CH`````$F+=D!(B>_H`````$F-1F!).49@#X1<`0``28G'3(G_
+MZ`````!(B<-(@WA```^$*0$``("X@P`````/A*(```!F@WUP``^$EP```$&]
+M`````$&\`````)!(BX6X"0``3`'@2(LP2(7V=&,/MT8@9CM#.'599CV%`'=3
+M#[?`@+P%:`@``/]T1DB+50`/MT8R9L'H!0^WP(T$A0`#``")@G`!``!(BU4`
+M#[=.,H/A'[@!````2-/@B8)T`0``QD8D(;H`````2(GOZ`````!!@\4!28/$
+M"`^W17!$.>@/CW;___](BT-`2,=`8`````#V0TP$=1E(B>_H`````$B+<T"Z
+M`0```$B)[^@`````2(M#0`^V4`(/MG`!2,?'`````+@`````Z`````!(BU-`
+M2(NU^`@``+\!````Z`````!(BU-`2(NU^`@``+\&````Z`````!(QT-`````
+M`$&`;@X!2(G>2(GOZ`````!-.7Y@#X6G_O__2<=&0`````!(BT4`BXA8`0``
+MB0T`````A<ET"DB+10")B%@!``!(@\0(6UU!7$%=05Y!7\-F9F:09F:09F:0
+M9F:02(/L"$R+!T$/MG!#0(3V=#5)C8#`$@``N0````!(.?AU&NLB#[;!2(T4
+M0$B-%)!)C930P!(``$@Y^G0/@\$!0#CQ=>#K!;D`````#[;!2(T40$B-%)!(
+MC035`````$F+M`#0$@``2(7V='WV1@H"='=)C80`P!(``$@Y1B!U:0^V1EB$
+MP'0(@\`!B$98ZUE(BU9(2(/J.$B-3DA(C4(X2#G(=$1(@WH0`'4LZPIF9I!(
+M@WH0`'4@QD98`0^VBKL```!)B[BX$```2<?``````.@`````ZQ%(BU(X2(/J
+M.$B-0CA(.<AUR$B#Q`C#9F:02(/L*$B)7"0(2(EL)!!,B60D&$R);"0@2(G[
+M2(GU2(M&<$R+:"@/MTX@9H'YA0!W?P^WP0^VA`=H"```//]T<&:#^7]W(0^V
+MT$B+CT`)``!(C0122(T$@DC!X`5(BT0(4`^V0`CK3F:!^8$`=QP/ML!(BY>0
+M"0``2&G`R`\``$B+1!`(#[9`".LK#[;`2(N7:`D``$B-!,!(P>`%2(N$$(@`
+M```/MD`(ZPMF9I!F9I"X_P```$B81`^VI`/N"```2(MU>$B%]G0(2(G?Z```
+M``!(B>Y(B=_H`````$$/ML1(C3R`2(T\N$B-O/O(`0``3(GN0?^5H````$B+
+M7"0(2(ML)!!,BV0D&$R+;"0@2(/$*,-F9F:09F:09F:09F:005154TB)]4B)
+MTV:!?CCA`741#[9&.H/H$4&\`````#P!=C1(BS=(B[Y`"0``#[=%(+I@G@$`
+M9CV%`'<7#[?`#[:$!F@(``!(C11`2(T4D$C!X@5,C207QD,$!8!C!?Z`(]^X
+M`````&:!?3CA`741#[9%.H/H`3P!#Y;`#[;`9I#!X`</MA.#XG\)PH@3#[:%
+ME@```(/@`<'@!H/BOPG"B!/VA98````!=`Y,B>?H`````&:)0PCK!&:)2P@/
+MMT,(B$4E9H%]..$!=24/ME4ZC4+_/`%W"@^V53N#X@_K*I"-0N^Z#P```#P!
+M=AUF9F:0N@````!)@WPD8`!T#$$/MI0D@0```(/B#P^V`X/@\`G0B`-;74%<
+MPV9F9I!F9F:02(/L.$B)7"0(2(EL)!!,B60D&$R);"0@3(ET)"A,B7PD,$F)
+M_$B)\TF)UP^V1C@\"'0//"AT"SRH=`<\B&9FD'4.@XN4````"NLE9F:09I`\
+M"G0./"IT"CRJ=`8\BF:0=0Z#BY0````"9F9FD&9FD`^W>SAF@?_A`74<#[9#
+M.H/H$3P!=Q&#BY0````(N`````#I204``$2+0SA!@>#___\`08'XX0$0``^%
+MY@````^W2R!F@?F%``^'\@0```^WP4$/MKP$:`@``(GX0(#__W1N9H/Y?W<C
+M0`^VUTF+C"1`"0``2(T$4DB-!()(P>`%2(M$"%`/MD`(ZT5F@?F!`'<>0`^V
+MQTF+E"20"0``2&G`R`\``$B+1!`(#[9`".L@0`^VQTF+E"1H"0``2(T$P$C!
+MX`5(BX00B`````^V0`@/ML!!#[:$!.X(``!(C12`2(T4D$F-M-3(`0``28N4
+M))`)``!`#[;'2&G`R`\``$&]`````/9$`ET0#X5@`@``QD,D!$''!P````"X
+M`0```.E+!```#[=3(+G_````N/____]F@?J%``^'BP````^WPD$/MK0$:`@`
+M`(GP0(#^_W1S9H/Z?W<H0`^VUDF+C"1`"0``2(T$4DB-!()(P>`%2(M$"%`/
+MMD`(ZTIF9I!FD&:!^H$`=QY`#[;&28N4))`)``!(:<#(#P``2(M$$`@/MD`(
+MZR!`#[;&28N4)&@)``!(C03`2,'@!4B+A!"(````#[9`"$`/MLY$#[;P26/&
+M00^VK`3N"```2(U$K0!(C42%`$F-M,3(`0``#[?!2(T40$B-%)!(P>(%28G5
+M30.L)$`)``!F@?_A`74+#[9#.H/H`3P!=BEF@?G_`'0'0?9%2P1U&\9#)`9!
+MQP<`````N`$```#I-@,``&9FD&9FD$$/ME5(B=&#X0%T)/;"!'0?00^V1"1$
+M03I$)$IR$D''!P$```"X`0```.D!`P``D$V%[0^$]P```(7)#X3O````]L($
+M#X3F````2(G>3(GOZ`````"$P'45QD,D!$''!P````"X`0```.G"`@``08"]
+M@P```!]V$4''!P$```"X`0```.FG`@``]H.6`````7072(U$K0!(C42%`$'V
+MA,34`0```70;ZU](C42M`$B-1(4`0?:$Q-0!```!#X2_`0``1(GV3(GGZ```
+M``"$P'010<<'`0```+@!````Z4X"``#V@Y8````!#X22`0``2(U$K0!(C42%
+M`$'VA,34`0```0^$>0$``$R)[^@`````9H/X'P^&9P$``$''!P$```"X`0``
+M`.D%`@``9F:09I#V1@H"=#)!@?CA`1``9F:0#X0[`0``00^VA8,```!!.H6"
+M````<AY!QP<!````N`$```#IR`$``$&!^.$!$``/A`P!``!!#[=%:H![..$/
+MA?T```"`>SD!#X7S````2-'H2(G"@^(!#[9#.H/H!CP)#X?&````#[;`_R3%
+M`````$&X`0```+D!````2(G:3(GN3(GGZ`````"$P`^%L````$''!P(```"X
+M`0```.E.`0``0;@!````N0````!(B=I,B>Y,B>?H`````(3`#X5^````0<<'
+M`@```+@!````Z1P!```/MLI!N`$```!(B=I,B>Y,B>?H`````(3`=5)!QP<"
+M````N`$```#I\`````^VRD&X`````$B)VDR)[DR)Y^@`````A,!U)D''!P(`
+M``"X`0```.G$````QD,D!$''!P````"X`0```.FO````28V\)*@/``#H````
+M`(3`=!%!QP<!````N`$```#IC0```(![..%U3H![.0%F9I!U18![.@]U/X![
+M/0%F9F:0=34/MG,\P>8(#[9#.P'&#[?V3(GGZ`````!(.T-H=05(A<!U$L9#
+M)`1!QP<`````N`$```#K.;@`````ZS)FD$$/MH0D[0D``$B-%(!(C12028VT
+MU,@!``!)BY0DD`D``+@XN`\`Z93[__]F9I!FD$B+7"0(2(ML)!!,BV0D&$R+
+M;"0@3(MT)"A,BWPD,$B#Q#C#9F9FD&9FD&9FD&9FD$B#[`A(BS_H`````$B#
+MQ`C#9F9FD&9F9I!F9F:09F:005=!5D%505154TB#[%A)B?U(B?5(BY]`$0``
+M9L=&,O\/2(U4)"SH`````(3`=`F+1"0LZ0X+``"+13@E____`#WA`1``#X7E
+M````OX@3``#H``````^W32!F@?F%``^'N0H```^WP4$/MK0%:`@``(GP0(#^
+M_W1K9H/Y?W<B0`^VUDF+C4`)``!(C0122(T$@DC!X`5(BT0(4`^V0`CK0V:!
+M^8$`=QU`#[;&28N5D`D``$AIP,@/``!(BT00"`^V0`CK'T`/ML9)BY5H"0``
+M2(T$P$C!X`5(BX00B`````^V0`@/ML!!#[:$!>X(``!(C12`2(T4D$V-M-7(
+M`0``28N5D`D``$`/ML9(:<#(#P``2`'"2(E4)!!(QT0D"`````!(QT0D&```
+M``#I<@$```^W52"^_P```&:!^H4`=PP/M\)!#[:T!6@(```/MWTX9H'_X0%U
+M#P^V13J#Z!$\`0^&Q@```&:!^H4`=WH/M\)!#[:$!6@(```\_W1J9H/Z?W<A
+M#[;028N-0`D``$B-!%)(C02"2,'@!4B+1`A0#[9`".M(9H'Z@0!W'`^VP$F+
+ME9`)``!(:<#(#P``2(M$$`@/MD`(ZR4/ML!)BY5H"0``2(T$P$C!X`5(BX00
+MB`````^V0`CK!;C_____#[;`00^VA`7N"```2(T4@$B-%)!-C;35R`$```^W
+MQDB-%$!(C1202,'B!4D#E4`)``!(B50D"&:!_^$!=4;K,@^WQDB-!,!(P>`%
+M20.%:`D``$B)1"083(NPB````$C'1"0(`````$C'1"00`````.M$#[95.HU"
+M[SP!=B>-0O\\`78@9H'^_P!T"TB+1"0(]D!+!'4.QD4D!K@`````Z;8(``!(
+MQT0D$`````!(QT0D&`````!(C70D2$R)[^@`````08G'9HE%,DR)[^@`````
+M28G$N`(```!-A>0/A'<(``!,B:6`````00^WUTB)%"1(:<*P!```2(T<&$B-
+M0R!)*X5`$0``20.%2!$``$B+5"1(B4(@2,'H($B+5"1(B4(D28M$)!A(BU0D
+M2(E"*$C!Z"!(BU0D2(E"+$B+1"1(9D2)>`BX`````,8$&`!(@\`!2#VP!```
+M=?!F@7TXX0%U5`^V13J#Z!$\`7=)2(U,)#!(BT0D2`^V4`A(B>Y(BWPD".@`
+M````2(V#(`0``$DKA4`1``!)`X5($0``2(M4)$B)0A!(P>@@2(M4)$B)0A3I
+M%0$``$$/ME8*]L(!=2R+13@E____`#WA`1``#X2<````2(M,)`@/MD%(J`$/
+MA(L```"H!`^$@P```/:%E@```"!T#TB-="0P2(GOZ`````#K&TB-3"0P2(M$
+M)$@/ME`(2(GN2(M\)`CH`````$B-@R`$``!)*X5`$0``20.%2!$``$B+5"1(
+MB4(02,'H($B+5"1(B4(42(G822N%0!$``$D#A4@1``!(BU0D2(E"&$C!Z"!(
+MBU0D2(E"'.M<]L("=%=(B=A)*X5`$0``20.%2!$``$B+5"1(B4(82,'H($B+
+M5"1(B4(<2(V#(`0``$DKA4`1``!)`X5($0``2(M4)$B)0A!(P>@@2(M4)$B)
+M0A1(BT0D2(!(`0(/ME592(M$)$AFB5`"@'U9`'0SOP````")^$B-!$!(P>`"
+M28MT)!!(BTU@2(L4"$B)%`:+5`@(B50&"(/'`0^V15DY^'?2BU4T2(M$)$B)
+M4`QF@7TXX0%U/P^V13J#Z!$\`7<T00^WSTB+5"1(2(GN3(GWZ`````!(C4PD
+M,$B)VDB)[DR)]^@`````08!F#/[IBP0``&9FD$$/MD8*J`(/A"($``!(BT0D
+M2,9`!OY(BT0D2(!@!_Y(@WPD"``/A+@```!(BT0D"`^V4$A(B="#X`9(@_@&
+M#X6?````]L(!#X26````00^WSTB+5"1(2(GN3(GWZ`````#VA98````!=!!(
+MBT0D2`^W0`C!X`.(1"0Q2(U,)#!(B=I(B>Y,B??H`````/:%E@````%T!T&`
+M3@P!ZP5!@&8,_L8#H4B+5"0(#[:"Z@```(/@#P^V4P&#XO`)PHA3`4B+3"0(
+M#[=!.(/``6;!P`AFB4,"28G,28'$U````.D]`P``9H%]..$!#X4D`@``#[9%
+M.CP/=!-!O``````\$`^%&P,``.FN````#[95/,'B"`^V13L!PDB+1"1(QD`$
+M#4B+1"1(@&`%_H!,)$,(2(MT)$@/MD4E00^VC?8```#3X&8)1@A(BTPD2`^V
+M00&#X!^#R""(00%(BT4^2(F#.`0``&;!P@AFB9-$!```#[9%/8B#0@0``,8#
+MD4B+5"0(#[=".(/``6;!P`AFB4,"2(M,)`@/MI'J````@^(/#[9#`8/@\`G0
+MB$,!28G,28'$U````.EH`@``2(M4)$@/MD4E00^VC?8```#3X&8)0@C&`X%F
+MQT,"__](BT0D$`^VD+L```"#X@\/MD,!@^#P"="(0P%(@WU(`'4.QD4D(;@`
+M````Z>X#``#V13L!="E,BV50387D="!)B[VX$```3(GFZ`````"#X`\/ME,!
+M@^+P"<*(4P'K!4R+9"002(M52`^V0@&^$````#R`#X2&````/(!W'SP5=Q(\
+M$&9FD&:0<V>#Z`(\`7=$ZU<\%V9FD'<[ZUX\A70N/(5F9I!F9I!W$#R!=$,\
+M@G4C9F:09F:0ZR(\D'(7OB@````\DF9FD'8U/)-U![Z,````ZRJ^!````.LC
+M#[9"!(TTA0@```"0ZQ6^"````.L.O@P```!FD.L%OAP```")\L'J`DB+1"1(
+MB%`$2(M,)$AFP>H(@^(!#[9!!8/@_@G0B$$%2(V[(`0``(GR2(MU2.@`````
+MZ0T!```/MD4X@^@$/*MW0`^VP/\DQ0`````/MD5`P>`(#[9508T,$(/Y#7<8
+MN`$```!(T^"IV#X``'0)2(M$)$B`2`$$2(M$)$B`2`$!ZPE(BT0D2(!@`?M(
+MBT0D2,9`!`U(BT0D2(!@!?Y(BU0D2`^V125!#[:-]@```-/@9@E""$B+1"1(
+M@&`!'\:#(`0```9,BV0D"$F!Q-0```!(C;LA!```3(GFZ`````!(C;LE!```
+M3(GFZ`````!(BT4X2(F#1`0``$B+14!(B8-,!```2(M4)`A(BX+<````2(F#
+M.`0``,8#D4B+3"0(#[:1Z@```(/B#P^V0P&#X/`)T(A#`0^W03B#P`%FP<`(
+M9HE#`DV%Y'1C28L$)$B)0P3K6:@!=%5!#[?/2(M4)$A(B>Y,B??H`````/:%
+ME@````%T$$B+1"1(#[=`",'@`XA$)#%(C4PD,$B)VDB)[DR)]^@`````]H66
+M`````70'08!.#`'K!4&`9@S^28N%N`D``$B+%"1(B2S01(GZ9L'J!44/M^>!
+MXO\'``!$B>&#X1^X`0```$C3X$$)A)7`"0``BT4X)?___P`]X0$0`'4I2(U,
+M)$"Z`````$2)YDR)]^@`````#[9$)$.#X!^#R$"(1"1#Z:0```!F@7TXX0%U
+M,P^V13J#Z!$\`7<H2(MT)!A,B>_H`````$B-3"1`2(M$)!@/ME!01(GF3(GW
+MZ`````#K:4B+="0(3(GOZ`````!(C4PD0$B+1"0(#[90<D2)YDR)]^@`````
+M2(M,)`@/ME%(2(G0@^`&2(/X!G4N]L(!="D/MD0D0X/@'X/(8(A$)$,/ME%R
+M@^)_P>($#[=$)$)F)0_X"=!FB40D0DB-="1`3(GOZ`````!(BW,@N`,```!(
+MA?9T04C'QP````"X`````.@`````N`,```#K*4$/MH7M"0``2(T4@$B-%)!-
+MC;35R`$``$F+E9`)``"X.+@/`.G+]?__2(/$6%M=05Q!74%>05_#9F9FD&9F
+M9I!F9I!!54%455-(@^P(2(G]0;T`````3(VG``$``.FY`0``D$R)Y^@`````
+M2(G#2(-X<`!U-DB)[^@`````2(E#<$B%P'4E2(V5``$``$B+A0`!``!(B5@(
+M2(D#2(E3"$B)G0`!``#IG0$``(M#."7___\`/>$!$``/A-T````/MT,@9CV`
+M``^$SP````^VR&:)2R!F@_E_=AIF@7LXX0%U*0^V0SJ#Z!$\`7<>9F9FD&9F
+MD&:!^84`=Q`/M\$/MI0%:`@``(#Z_W49QD,D!DB)WDB)[^@`````Z?T```!F
+M9I!FD`^W<SAF@?[A`745#[9[.HU'[SP!#X?M````ZQ]F9F:0#[;"2(T40$B-
+M%)!(P>(%28G53`.M0`D``.L'C4?_/`%V-F:!^8``="]F@?[A`6:0=0L/MD,Z
+M@^@1/`%V&T'V14L$=13&0R0&2(G>2(GOZ`````#I@````$B)WDB)[^@`````
+M@_@"=PJ#^`%S)69FD.L0@_@#=6%F9I!F9I!F9I#K2TB)WDB)[^@`````9F:0
+MZT9(@[N``````'0/2(VS@````$B)[^@`````2(V5``$``$B+A0`!``!(B5@(
+M2(D#2(E3"$B)G0`!``#K.$B)WDB)[^@`````3#FE``$```^%._[__^L>#[;"
+M2(T40$B-%)!(P>(%28G53`.M0`D``.D6____2(/$"%M=05Q!7<-(@^Q(2(E<
+M)!A(B6PD($R)9"0H3(EL)#!,B70D.$R)?"1`2(GU28G]3(MG4$V+-"1!#[9$
+M)`RH$'0,QH?H````!NF,`@``#[:7Z````(#Z`0^$@@```(#Z`7(:@/H$#X2C
+M````@/H&#X7-`@``9F:0Z5T"``#&A^@````!2(G^3(GWZ`````#&122!08!,
+M)`P(2(.]@`````!T#TB-M8````!,B??H`````$F+A@`!``!(B6@(2(E%`$F-
+MA@`!``!(B44(28FN``$``$R)]^@`````Z6("``"#X/=!B$0D#("'ZP````'&
+MA^@`````QD8D`DR)]^@`````3(GWZ`````#I,P(``,:'ZP````!(@[Z`````
+M`'0/2(VV@````$R)]^@`````28M-0$B%R0^$G@$``(M1!(U"`8E!!(/Z*`^'
+MC`$``$F+A@`!``!(B6@(2(E%`$F-A@`!``!(B44(28FN``$``$&`?4K_="1)
+MBT5@2(7`=`:`>$(`=!5,B>J^`@```$R)Y^@`````Z:@!``!!#[9$)`R#X/>#
+MR!!!B$0D#$F+=5A(A?9U%$&`?"0.`'4LZ>4```!F9F:09F:000^VE8$```!!
+MN`````"Y`@```$R)Y^@`````Z5H!``!!OP````#&1"07`$F-1"1@2(E$)`A(
+MBWPD".@`````2(G%28M$)&A)B6PD:$B+5"0(2(E5`$B)10A(B2A(BU5`2(72
+M=!5)B[;X"```OP4```#H`````(!-3`)(B>J^!@```$R)Y^@`````@+V#````
+M`'0V08U?`4&!_W^6F`!W)DR)]^@`````OP$```#H`````("]@P````!T"X/#
+M`8'[@9:8`'7:08G?@$0D%P$/MD0D%T$X1"0.#X=7____28M]8$B%_W4<0<9%
+M2@-F0<>%R```````3(GN3(GWZ`````#K=^@`````9F9FD&9F9I#K:$$/MEU*
+M2,?'`````+@`````Z`````!!@&0D#.])BX8``0``2(EH"$B)10!)C88``0``
+M2(E%"$F)K@`!``!,B>J^!@```$R)Y^@`````@/O_=0Y,B>I,B>9,B??H````
+M`$R)]^@`````2(M<)!A(BVPD($R+9"0H3(ML)#!,BW0D.$R+?"1`2(/$2,-F
+M9I!!5T%6055!5%532(/L*$B)_4F)]4B+CT`)``"X8)X!`&:!?B"%`'<;#[=&
+M(`^VA`=H"```2(T40$B-%)!(B=!(P>`%3(TD`4B+E1`1``!(@<)`"```00^V
+M1"1RP>`(2)A(`<*+,HDU`````$&)]T'![Q!(BY40$0``2('"0`@``$$/MD0D
+M<L'@"$B82`'"BT($B04`````B$0D$(G"P>H(B%0D$<'H$(A$)!)(BY40$0``
+M2('"0`@``$$/MD0D<L'@"$B82`'"BT((B04`````B$0D$XG"P>H(B%0D%,'H
+M$(A$)!7&1"06`,9$)!<`BTPD$$&)]D'![AA!#[;?1(M$)!1$B?*)WDC'QP``
+M``"X`````.@`````B=B#\`&)PH/B`704183_=`]!QD4D`+@`````Z:@"``!!
+M@'TD@69FD'4A2(U,)!!$B?*)WDR)[^@`````0<9%)`*X`````.E]`@``08M%
+M."7___\`/>$!#@!U#T'&120AN`````#I7@(``$'VA98````!=2B$TG4D08!\
+M)$K_=!Q(C4PD$$2)\HG>3(GOZ`````"X`````.DL`@``3(GF2(GOZ`````!,
+MB>9(B>_H`````$B+50!!#[=%,F;!Z`4/M\"-!(4``P``B8)P`0``2(M%`$$/
+MMTTR@^$?N@$```!(B=-(T^.)F'0!``!!#[=%,DC!X`-(`X6X"0``2,<`````
+M`$$/MTTRB<AFP>@%)?\'``"#X1](B=9(T^9(B?'WT2&,A<`)``!!#[=-,HG(
+M9L'H!27_!P``@^$?2-/B]](A5(5T28M5`$F+10A(B4((2(D000^W=3)(C;VH
+M#P``Z`````!!@*PD@P````%!QD4D@4F#O8``````=`])C;6`````2(GOZ```
+M``!)C40D($DY1"0@#X0)`0``28G&2(V%J`\``$B)1"0(3(V]``$``&9F9I!F
+M9I!,B??H`````$B)PTB+50`/MT`R9L'H!0^WP(T$A0`#``")@G`!``!(BT4`
+M#[=+,H/A'[H!````2(G62-/FB;!T`0``#[=#,DC!X`-(`X6X"0``2,<`````
+M``^W2S*)R&;!Z`4E_P<``(/A'TB)UDC3YDB)\??1(8R%P`D```^W2S*)R&;!
+MZ`4E_P<``(/A'TC3XO?2(52%=`^W<S)(BWPD".@`````08"L)(,````!2(.[
+M@`````!T#TB-LX````!(B>_H`````$B+A0`!``!(B5@(2(D#3(E["$B)G0`!
+M``!-.70D(`^%%/___T&!I90```#___[_0<:$).@````$3(GN3(GGZ`````"X
+M`0```$B#Q"A;74%<05U!7D%?PY!(@^Q82(E<)"A(B6PD,$R)9"0X3(EL)$!,
+MB70D2$R)?"102(E4)!!(BR],BX5`$0``2(72#X3&`@``#[?62&G"L`0``$J-
+M#`#V02$"=!A(C035`````$@#A;@)``!(BP#&0"0"ZQ9(C035`````$@#A;@)
+M``!(BP#&0"0A3(T4U0````!(BX6X"0``3`'02(L0BT(X)?___P`]X0$0``^$
+ML`$```^W0B!F/84`=Q(/M\`/MH0%:`@``#S_=1EF9I!,B=!(`X6X"0``2(L`
+MQD`D!NG*"```#[;`2(T40$B-%)!(P>(%3(N=0`D``$D!TX!\)!,`>6Y!#[93
+M2$B)T(/@!DB#^`9U(_;"`70>2(M%`(N06`$``(D5`````(72=`I(BT4`B9!8
+M`0``2(M%`(N`4`$``(D%`````(/(`DB+50")@E`!``!(BT4`BX`$`0``B04`
+M````@,S_2(M5`(F"!`$``&;W02`""`^$Z@```(!]0P`/A.````"[`````$&Y
+M`````$6)R$$/MLD/MD<-2-/XJ`%T8$&`^0-V)TB+10!(!=`!``"-%(T`````
+M2&/22`'0BP")!0````#!Z!2#X`'K)4B+10!(!=`!``"-%(T`````2&/22`'0
+MBP")!0````#!Z!2#X`&$P'0*N`$```!(T^`)PT&#P0%!C4`!.$5#=X&$VW12
+M.%\-=4V)\&;!Z`4E_P<``(M$A72)\8/A'TC3^*@!=3)!@+OH`````G<(0<:#
+MZ`````-,B=!(`X6X"0``2(LP3(G?Z`````#I3`<``$&[`````/9$)!,!#X0[
+M!P``3(G02`.%N`D``$B+,,9&)"&+1C@E____`#WA`0X`#X07!P``2(N5$!$`
+M`$B!PD`(``!!#[9#<L'@"$B82`'"BP*)!0````!(BY40$0``2('"1`@``$$/
+MMD-RP>`(2)A(`<*+`HD%`````$B+E1`1``!(@<)("```00^V0W+!X`A(F$@!
+MPHL"B04`````2(GOZ`````#IH08``)`/M_9(C1SU`````$B+A;@)``!(`=A(
+MBQ!F@7HXX0$/A0P!```/MGHZ0(#_$`^';@8``+@!````B?E(T^"IP#````^%
+MS````*D```$`=53VQ(`/A$D&``!(:<:P!```2HT,``^V03.(0B1(B=A(`X6X
+M"0``2(L`]D`C!`^$(`8``(!X)``/A!8&``!(BU!02(72#X0)!@``#[9!,X@"
+MZ?X%``!(:<:P!```2HT,`$R-82A(B=A(`X6X"0``2(L000^V1"0"B$(D2(G8
+M2`.%N`D``$B+`$B#>$@`#X3!!0``#[:Y(00``.@`````2(G:2`.5N`D``$B+
+M"HM1-#G0#T?"B<)(BWE(3(GFZ`````#IC04``$B)V$@#A;@)``!(BP#&0"0`
+MZ7<%``!F9F:09F:02(G82`.%N`D``$R+*$V+?6BX_____V9!@7T@A0!W&4B)
+MV$@#A;@)``!(BP`/MT`@#[:$!6@(```/ML!(C11`2(T4D$C!X@5,BZ5`"0``
+M20'40<:$).@`````00^V5"1(2(G0@^`&2(/X!@^%EP$``/;"`0^$C@$``$'&
+M120`0?:%E@```"`/A.0$``!-A?\/A-L$``!!]H>Q`````@^$H0```$&+132%
+MP`^$E0```$F+OZ````!(A?]T#8G"28MU2.@`````ZWQ)@WU(`'1U28._N```
+M``!U"DF#O\``````=&%-BVU(28N'N````$B%P'0-2(G#0?:'L0````%T)DB+
+MM4@*``"Z`0```$R)_T'_E\````"[`````(7`=`=(BYU("@``2(M["(L33(GN
+MZ`````"+`TD!Q8M#!$B#PQ"%P'3B2(N5$!$``$B!PD`(``!!#[9$)'+!X`A(
+MF$@!PHL"B04`````B<+!ZA!!B)>;````P>@89D&)AY````!(BY40$0``2('"
+M1`@``$$/MD0D<L'@"$B82`'"BQ*)%0`````/ML)F08F'E`````^VQF9!B8>6
+M````B=#!Z!`/ML!F08F'F````,'J&$&(EYH```!(BY40$0``2('"3`@``$$/
+MMD0D<L'@"$B82`'"BP*)!0`````/ML!F08F'D@```.EI`P``2&G&L`0``$Z-
+M-`!!#[9&,X3`#X71````2(G82`.%N`D``$B+`,9`)`!!]H66````$`^$,@,`
+M`$V%_P^$*0,``$$/MD8S08B'D@```$'VA[$````"#X0/`P``08-]-``/A`0#
+M``!)@[^X`````'4.28._P``````/A.P"``!-BV5(28N'N````$B%P'0-2(G#
+M0?:'L0````%T)DB+M4@*``"Z`0```$R)_T'_E\````"[`````(7`=`=(BYU(
+M"@``2(M["(L33(GFZ`````"+`TD!Q(M#!$B#PQ"%P`^%AP(``.O<9F:09I`\
+M`@^%*`(``$$/MDY`08M&.(E$)"0/ME0D)P^V1"0DP>`8"<(/MD0D)<'@$`G"
+M#[9$)";!X`A!B=1!"<2#X7^`^7%V/,9$)`T`08/\`78,00^V1D&#X`^(1"0-
+MQD0D#@!!@_P"=@E!#[9.0HA,)`Y!@_P#=F9!#[9&0XA$)`_K8,9$)`T`08/\
+M`G8,00^V3D*#X0^(3"0-QD0D#@#&1"0/`$&#_`=V.4$/MD9'@\`(03G$1`]'
+MX,9$)`X`08/\#'8)00^V1DR(1"0.08/\#78+00^V3DV(3"0/ZP7&1"0/`$B)
+MV$@#A;@)``!(BP"`>#``=$A%A>1T0\9`)"!(B=A(`X6X"0``2(L`#[9`,`^V
+MT$0XX$0/0N)(B=A(`X6X"0``2(L`2(MX4$B%_W0?1(GB28UV0.@`````ZQ%(
+MB=A(`X6X"0``2(L`QD`D(H!\)`T$=1%(B=A(`X6X"0``2(L`QD`D`DDY;2@/
+MA!(!``!-A?\/A`D!``!!]H66````$'1`00^V1C-!B(>2````0?:'L0````)T
+M*D$/MD4P1(GB03C$#T?0A-)T&$F+OZ@```!(A?]T#`^VTDF-=D#H`````(!\
+M)`T+=UP/MD0D#?\DQ0````!!QH>R`````>F?````@'PD#@1U%(!\)`\"=0U!
+MQH>R````$>F$````0<:'L@````+K>D'&A[(````0ZW!!QH>R````"^MF0<:'
+ML@````;K7$'&A[(````-ZU)FD#PH=2=!#[:$)(,```"#Z`%!B(0D@@```$B)
+MV$@#A;@)``!(BP#&0"2!ZR4\"'4*OQ`G``#H`````$B)V$@#A;@)``!(BP#&
+M0"0A9F:09F:02(M<)"A(BVPD,$R+9"0X3(ML)$!,BW0D2$R+?"102(/$6,-F
+M9F:09F:09F:09F:005=!5D%505154TB![*@```!(B?U(B7PD<`^WA[H2``!F
+MB80D@````$B+AZ`1``"+`(D%`````&8E_P]FB8>Z$@``9CN$)(````!U4DB+
+M!XNP4`$``(DU`````$B+!XGR@>+P__\`B9!0`0``N`````"%T@^$F@@``$C'
+MQP````"X`````.@`````2(M\)'#H`````+@!````Z74(``!F@;^Z$@``_P\/
+MA<,'``!F9I#I]`<``$R+A4`1``!F@X0D@`````$/MY0D@````&8[E;X2``"X
+M``````]#T&:)E"2`````2(N5H!$``$B#P@0/MX0D@````(L,@D&)R4'!Z1!!
+M]L$(#X2U````2(M%`(N(4`$``(D-`````$B+50")R"7P__\`B8)0`0``A<!T
+M;(!]0P!T9HG.]\8``0``=3&_`````/?&```!`'1#9F:0ZQ\/M]>-2@A(B?!(
+MT_BH`744C4H02(GP2-/XJ`%U!^L?OP`````/M\=(C12`2(T4D$B-G-7(`0``
+M2(7;=1WK#(/'`0^V14-F.?AWMDB+?"1PZ`````#IZ08``$B+?"1PZ`````"(
+M0P_IUP8``&9FD(G.9H'F_P\/M\9(:="P!```38M$$"!(C3S%`````$B+A;@)
+M``!(`?A(BQA(A=L/A6P!```/M_:)\DC'QP````"X`````.@`````9H-]<``/
+MA'\&``#&A"2?`````&9FD$0/MK0DGP```$Z-//4`````2(N%N`D``$P!^$B+
+M,$B%]@^$^0```$UIYK`$``!,`Z5`$0``2(N=X!````^V3B5$#[:L))\```!$
+MB>I(Q\<`````N`````#H`````$R)^$@#A;@)``!(BSCH`````$&+C"0D!```
+M08N4)"`$``!%BXPD+`0``$6+A"0H!```1(GN2,?'`````+@`````Z`````!,
+MB?!(P>`&2`'#BT,TBWLP1(M3+$2+6RA$BV,D1(MK($2+<QQ$BWL8BTL4B4PD
+M?$2+2Q!$BT,,BTL(BU,$BS.)1"1`B7PD.$2)5"0P1(E<)"A$B60D($2);"08
+M1(ET)!!$B7PD"(M$)'R)!"1(Q\<`````N`````#H`````("$))\````!#[:$
+M))\```!F.T5P#X,Z!0``Z<'^__^00?;!(`^$B`$``(![)(%FD`^%6P$``,9#
+M)"$/MT,R2,'@`T@#A;@)``!(QP``````#[=+,HG(9L'H!27_!P``@^$?N@$`
+M``!(B=9(T^9(B?'WT2&,A<`)```/MTLRB<AFP>@%)?\'``"#X1](T^+WTB%4
+MA70/MW,R2(M\)&#H`````$B#NX``````=`](C;.`````2(GOZ``````/MU,@
+M9H'ZA0`/A\<````/M\(/MH0%:`@``#S_#X2T````9H/Z?W<C#[;`2(T40$B-
+M%)!(P>(%2`.50`D``$B+0E"`>`C_#Y7`ZUD/MT,@9CV!`'<F#[?`#[:$!6@(
+M``!(:<#(#P``2`.%D`D``$B+0`B`>`C_#Y7`ZRD/MT,@#[:$!6@(``!(C03`
+M2,'@!4@#A6@)``!(BX"(````@'@(_P^5P(3`="Y(B=Y(B>_H`````$B+A0`!
+M``!(B5@(2(D#2(M$)%A(B4,(2(F=``$``.G#`P``2(M,)&A(BU$(2(U#$$B)
+M00A(B4L02(E0"$B)`NFB`P``B?!FP>@%1`^W\$ECQ@^W]D&)]T&#YQ^+1(5T
+M1(GY2-/XJ`$/A7D#``!(B?A(`X6X"0``2(L`#[=0(&:!^H4`#X>Z````#[?"
+M#[:$!6@(```\_P^$IP```&:#^G]W(`^VP$B-%$!(C1202,'B!4@#E4`)``!(
+MBT)0#[9`".MM2(GX2`.%N`D``$B+``^W0"!F/8$`=R,/M\`/MH0%:`@``$AI
+MP,@/``!(`X60"0``2(M`"`^V0`CK,TB)^$@#A;@)``!(BP`/MT`@#[:$!6@(
+M``!(C03`2,'@!4@#A6@)``!(BX"(````#[9`"#S_=!`/MM!(8\*`O`7N"```
+M_W4V26/&BT2%=$2)^4C3^*@!#X6.`@``QD,D!DB)W^@`````N@````!(B=Y(
+MB>_H`````.EM`@``2&/"#[:$!>X(``!(C12`2(T4D$B-O-7(`0``387`=`U!
+M]L$"N`````!,#T3`]D<*`@^$7@$``$R)PN@`````26/&BT2%=$2)^4C3^*@!
+M#X49`@``@'LD@0^%CP````^W0S)(P>`#2`.%N`D``$C'```````/MTLRB<IF
+MP>H%@>+_!P``@^$?N`$```!(T^#WT"&$E<`)```/MW,R2(M\)&#H`````$B)
+MWDB)[^@`````2(.[@`````!T#TB-LX````!(B>_H`````$B+A0`!``!(B5@(
+M2(D#2(MT)%A(B7,(2(F=``$``.F``0``2(N%$`$``$@[1"1H=%]!O`````!!
+M@\0!2(L`2#E$)&AU\D6$Y'1&0;T`````2(M\)&CH`````$B-2/!(BW0D:$B+
+M5@A(B48(2(DP2(E0"$B)`D@YV;@!````1`]$Z$&`[`%UR46$[0^%$P$``$B+
+M1"1H2(M0"$B-0Q!(BTPD:$B)00A(B4L02(E0"$B)`DECUK@!````1(GY2-/@
+M"825M````.G8````3(G"Z`````!(BX40`0``2#M$)&AT6T&\`````$&#Q`%(
+MBP!(.40D:'7R183D=$)!O0````!(BWPD:.@`````2(U(\$B+="1H2(M6"$B)
+M1@A(B3!(B5`(2(D"2#G9N`$```!$#T3H08#L`77)183M=6>`>R2!=&%(BT0D
+M:$B+4`A(C4,02(M,)&A(B4$(2(E+$$B)4`A(B0))8]:X`0```$2)^4C3X`F$
+ME;0```#K*69FD&:02(VW$`$``$B)="1H2(V'J`\``$B)1"1@2(V7``$``$B)
+M5"18#[>,)(````!F.8VZ$@``#X4,^/__2(V%$`$``$@YA1`!``!T34B)PV9F
+M9I!(B=_H`````$B-</`/MTXRB<IFP>H%@>+_!P``@^$?N`$```!(T^#WT"&$
+ME;0```"Z`````$B)[^@`````2#F=$`$``'6Z2(GOZ`````"X`0```$B!Q*@`
+M``!;74%<05U!7D%?PV9F9I!F9F:09F:055-(@^P(2(N7^`@``$B+0@B+*(DM
+M`````/?%````D'0&2(M""(DH2(N?^`@``/?%```$`'0K2(L#BY!0`0``B14`
+M````A=)T&$B+`XF04`$``$B+`XN`4`$``(D%`````/?%```(`'0W2('#D!0`
+M`$B+`XN04`$``(D5`````(72=!U(BP.)D%`!``!(BP.+@%`!``")!0````!F
+M9I!FD$B+N_@(``"^`````.@`````2(N;^`@``$B)W^@`````2(V[D!0``.@`
+M````2(N[^`@``+X!````Z`````"X`0```(7M=0NX`````(![2P!U`$B#Q`A;
+M7<-F9F:09F9FD$%7059!54%455-(@^PH28G\2(L'BXA0`0``B0T`````2(L7
+MB<@E\/__`(F"4`$``/?!`/__``^$*`D``$&`?"1#``^$'`D``,9$)!``B<E(
+MB4PD"$0/MFPD$$&-30A(BT0D"$C3^*@!=11!C4T02(M$)`A(T_BH`0^$T0@`
+M`(!\)!`#=BM)BP0D2`6``0``0HT4[0````!(8])(`="+`(D%`````,'H$X/@
+M`>LI9F:028L$)$@%@`$``$*-%.T`````2&/22`'0BP")!0````#!Z!.#X`&$
+MP'0F3(GGZ`````!)8]5(C0122(T$@D&!C,3T$@`````(`&9F9I!F9I!)BQ0D
+M@'PD$`-V)4*-!.T`````2)A(C80"@`$``(L`B04`````)0```0#K(V9F9I!"
+MC03M`````$B82(V$`H`!``"+`(D%`````"4```$`A<!T08!\)!`#=AU"C03M
+M`````$B82(V$`H`!``#'`````0#I&P@``$*-!.T`````2)A(C80"@`$``,<`
+M```!`.G^!P``08!\)$T!#X6H!@``@'PD$`-V*4F+!"1(!8`!``!"C13M````
+M`$ACTD@!T(L`B04`````@^`!ZR=F9F:028L$)$@%@`$``$*-%.T`````2&/2
+M2`'0BP")!0````"#X`&$P`^$50$``$ECQ4B-'$!(C1R82,'C`TF-M!SX$@``
+M28M\)"CH`````$F+O!S0$@``2(7_=!U(BT=`2(7`=!3V0$X"=0[H`````(3`
+MD`^%"@$``$ECQ4B-%$!(C12028N$U-`2``!(A<!T=4F)QH!X#@`/A(L```!!
+MOP````!(C6A@2(GOZ`````!(B<-(BT4(2(E="$B)*TB)0PA(B1CV0TP"=2](
+MBU-`2(72=!9)B[0D^`@``+\%````Z`````"`2TP"2(G:O@8```!,B??H````
+M`$&#QP%%.'X.=B7KH@^V="00N@$```!,B>?H`````+^@A@$`Z`````"Z`"TQ
+M`>L%ND!+3`!)8\5(C0Q`2(T,B$C!X0-*C30AB9;X$@``2,>&"!,````````/
+MMD0D$$B-%$!(C12028V4U,`2``!(B980$P``28VT#/@2``!)BWPD*.@`````
+M9F:0@'PD$`-V/4*-%.T`````2&/228L$)$@%@`$``$@!T(L`B04`````28L$
+M)$@%@`$``$@!PHL"B04`````P>@'@^`!ZSM"C13M`````$ACTDF+!"1(!8`!
+M``!(`="+`(D%`````$F+!"1(!8`!``!(`<*+`HD%`````,'H!X/@`83`='6`
+M?"00`W8W0HT,[0````!(8\E)BP0D2`6$`0``2`'(BP")!0````!)BQ0D2('"
+MA`$``$@!T0T```$`B0'K/D*-#.T`````2&/)28L$)$@%A`$``$@!R(L`B04`
+M````28L4)$B!PH0!``!(`=$-```!`(D!ZR^`?"00`W8H28L$)$@%@`$``$*-
+M%.T`````2&/22`'0BP")!0````#!Z!*#X`'K)DF+!"1(!8`!``!"C13M````
+M`$ACTD@!T(L`B04`````P>@2@^`!A,`/A"("``"`?"00`W8W0HT,[0````!(
+M8\E)BP0D2`6``0``2`'(BP")!0`````-```$`$F+%"1(@<*``0``2`'1B0'K
+M-4*-#.T`````2&/)28L$)$@%@`$``$@!R(L`B04`````#0``!`!)BQ0D2('"
+M@`$``$@!T8D!26/%2(T40$B-%)!)BX34T!(``$B%P'0328G%2(-X0``/A:(`
+M``#IA`$``(!\)!`#=DI"C13M`````$ACTDF+!"1(!8`!``!(`="+"(D-````
+M`$F+!"1(!8`!``!(C00"B0A)BP0D2`6``0``2`'"BP*)!0````#IT`,``$*-
+M%.T`````2&/228L$)$@%@`$``$@!T(L(B0T`````28L$)$@%@`$``$B-!`*)
+M"$F+!"1(!8`!``!(`<*+`HD%`````.F&`P``9I!(BTA`#[=!3@^WT/;&`0^%
+MTP```$B)S?;"`@^$QP```(/@_6:)04Y(C;'`````28M\)"CH`````,9$)!``
+M@'T[`'1WQD0D$``/MD0D$$B+7,582(7;=%1(BU-`2(72=!9)B[0D^`@``+\%
+M````Z`````"`2TP"2(G:O@8```!,B>_H`````("[@P````!T')!,B>?H````
+M`+\!````Z`````"`NX,`````=>6`1"00`0^V1"00.$4[=X['A<````!`2TP`
+M2,>%T`````````!(B:W8````2(VUP````$F+?"0HZ`````"`?"00`W8R28L$
+M)$@%@`$```^V5"002,'B`X'B^`<``$@!T(L`B04`````P>@(@^`!ZS!F9I!F
+M9I!)BP0D2`6``0``#[94)!!(P>(#@>+X!P``2`'0BP")!0````#!Z`B#X`&$
+MP`^$%@$``(!\)!`#=BQ)BP0D2`6``0``#[94)!!(P>(#@>+X!P``2`'0BP")
+M!0````"#\`&#X`'K*DF+!"1(!8`!```/ME0D$$C!X@.!XO@'``!(`="+`(D%
+M`````(/P`8/@`83`#X2Q````#[9$)!!(C11`2(T4D$V-O-3`$@``28M'$$B%
+MP`^$CP```$F)QDF-=SA)BWPD*.@`````08!^#@!T54&]`````$F-;F!F9I!F
+MD$B)[^@`````2(G#2(M%"$B)70A(B2M(B4,(2(D82(M30$B%TG0628NT)/@(
+M``"_!0```.@`````@$M,`D&#Q0%%.&X.=[I!QT<X@(0>`$G'1T@`````38E_
+M4$F-=SA)BWPD*.@`````@'PD$`,/AG\````/MEPD$$C!XP.!X_@'``!)BP0D
+M2`6``0``2`'8BQ")%0````!)BP0D2`6``0``2(T$`XD028L$)$@%@`$``$B-
+M!`.+`(D%`````$F+!"1(!3`"``!(C00#QP``````OQ`G``#H`````$F+!"1(
+M!30"``!(`<.+`XD%`````.M]#[9<)!!(P>,#@>/X!P``28L$)$@%@`$``$@!
+MV(L0B14`````28L$)$@%@`$``$B-!`.)$$F+!"1(!8`!``!(C00#BP")!0``
+M``!)BP0D2`50`@``2(T$`\<``````+\0)P``Z`````!)BP0D2`54`@``2`'#
+MBP.)!0````"`1"00`0^V1"0003A$)$,/A_#V__])BP0DBXA0`0``B0T`````
+M28L4)(G()?#__P")@E`!``#WP0#__P!T(>F>]O__26/52(T$4DB-!()!@8S$
+M]!(``````0#IYO?__[@`````2(/$*%M=05Q!74%>05_#9F9FD&9F9I!F9I!F
+M9I!!5T%6055!5%532(/L:$F)_4"(="1+0`^VQHE$)$Q(F$B-%$!(C1202(T4
+MUTR+NM`2```/MJK*$@``2(L'0(#^`W8,QX!P`0``Q`$``.L*QX!P`0``J`$`
+M`$B)1"1@2`5T`0``2(E$)%!(BU0D8(N"=`$``(D%`````(M,)$R#X0.[!P``
+M`-/C08G<00G$1(FB=`$``+_H`P``Z`````#WTT0AXTB+3"1@B9ET`0``@'PD
+M2P-V58M$)$S!X`)(F$B-E`'0`0``BP*)!0````"#R`B)`HM<)$S!XP-(8]M(
+MC809``(``,<`.````+\0)P``Z`````!(BU0D8$B-A!H$`@``QP``````ZUB+
+M1"1,P>`"2)A(BTPD8$B-E`'0`0``BP*)!0````"#R`B)`HM<)$S!XP-(8]M(
+MC809``(``,<`.````+\0)P``Z`````!(BU0D8$B-A!H$`@``QP``````387_
+M#X0Y"```08!]0P!T++L`````#[;+00^V1PU(T_BH`70/N@$```")SDR)[^@`
+M````@\,!03A=0W?90?9'"@%T:DR)_DR)[^@`````BW0D3$R)[^@`````2&-$
+M)$Q(C11`2(T4D$F-5-4`BX+P$@``J0``$`!T"R7__^__B8+P$@``3(G^3(GO
+MZ`````!(8T0D3$B-%$!(C1202<>$U=`2````````Z94'``!!@']8`'0428N]
+MN!```$R)_N@`````08!O6`%(Q\#^____#[9,)$Q(T\!`(.B(1"1;#X3``@``
+MBW0D3$R)[^@`````2&-$)$Q(C11`2(T4D$F-5-4`BX+P$@``J0``$`!T"R7_
+M_^__B8+P$@``#[9$)%M!B$<-08!]0P`/A.\!``#'1"1<``````^VT$B)5"0P
+M2(M,)&!(@<$``@``2(E,)"A(BT0D8$@%!`(``$B)1"0@#[94)%N)5"0<2(M,
+M)&!(@<'0`0``2(E,)!!$#[9T)%Q!#[;N2(M$)#")Z4C3^*@!#X1-`0``2&/%
+M2(T40$B-%)`/MD0D6T&(A-7*$@``08#^`P^&E0```(T<[0````!(8]M(BT0D
+M*$@!V,<`.````+\0)P``Z`````!(`UPD((M4)!R)$TB+3"1@QX%P`0``Q`$`
+M`$B+5"10BP*)!0````")Z8/A`[L'````T^-!B=Q!"<1$B2*_Z`,``.@`````
+M]]-$(>-(BTPD4(D9C12M`````$ACTD@#5"00BP*)!0````"#R`B)`NF6````
+MC1SM`````$ACVTB+1"0H2`'8QP`X````OQ`G``#H`````$@#7"0@BT0D'(D#
+M2(M4)&#'@G`!``"H`0``2(M,)%"+`8D%`````(GI@^$#NP<```#3XT&)W$$)
+MQ$B+1"101(D@O^@#``#H`````/?302'<2(M4)%!$B2*-%*T`````2&/22`-4
+M)!"+`HD%`````(/("(D"@T0D7`%!C48!03A%0W8LZ8/^__](B=_H`````$B-
+M<,A(BU,(2(E#"$B)&$B)4`A(B0)(@WC8`'01ZPF^`````$F-7TA).5](=<I(
+MA?9T.,9&6@!!@'U#`'0MN0````"Z`````$$/MD<-2-/XJ`%T#@^VPHA,!G"`
+M1EH!@\(!@\$!03A-0W?=N@````"^@0```$R)_^@`````2&-$)$Q(C11`2(T4
+MD$G'A-70$@```````$&`?4,`#X5[`P``Z9X$``"Z`````+X&````3(G_Z```
+M``"+="1,3(GOZ`````!(8T0D3$B-%$!(C12028U4U0"+@O`2``"I```0`'0+
+M)?__[_^)@O`2``!)C4=(23E'2`^$_0$``$B)!"1(BSPDZ`````!,C7#(2(U0
+M$$@Y4!`/A,`!``!)C49(2(E$)`A(BWPD".@`````2(U8\(![20UU%TB-L%`!
+M``!(BT-02(L`2(MX*.@`````2(L32(M#"$B)0@A(B1"`NX,`````=!M,B>_H
+M`````+\!````Z`````"`NX,`````=>5(BT-`2(7`#X0I`0``2,=`8`````"`
+MNX,`````#X2F````9D&#?7``#X2:````O0````!!O`````!F9I!FD$R)X$D#
+MA;@)``!(BS!(A?9T9`^W1B!F.T,X=5IF/84`=U0/M\!!@+P%:`@``/]T1DF+
+M50`/MT8R9L'H!0^WP(T$A0`#``")@G`!``!)BU4`#[=.,H/A'[@!````2-/@
+MB8)T`0``QD8D(;H`````3(GOZ`````"#Q0%)@\0(00^W17`YZ`^/=O____9#
+M3`1U&4R)[^@`````2(MS0+H!````3(GOZ`````!(BT-`#[90`@^V<`%(Q\<`
+M````N`````#H`````$B+4T!)B[7X"```OP$```#H`````$B+4T!)B[7X"```
+MOP8```#H`````$C'0T``````08!O#@%!@&Y8`4B)WDR)[^@`````2(M4)`A)
+M.59(#X5)_O__08!O*`%,B?9,B>_H`````$B+#"1).4](#X4'_O__28U'8$DY
+M1V`/A.P```"]`````$F)Q$R)Y^@`````2(G#@+B#`````'0WC44!@?U_EI@`
+M=@2)Q>LHB<5,B>_H`````+\!````Z`````"`NX,`````=`N#Q0&!_8&6F`!U
+MVDB+0T!(A<!T=DC'0&``````]D-,!'493(GOZ`````!(BW-`N@$```!,B>_H
+M`````$B+0T`/ME`"#[9P`4C'QP````"X`````.@`````2(M30$F+M?@(``"_
+M`0```.@`````2(M30$F+M?@(``"_!@```.@`````2,=#0`````!!@&\.`4B)
+MWDR)[^@`````33EG8`^%'/___TR)_DR)[^@`````2&-$)$Q(C11`2(T4D$G'
+MA-70$@```````.EZ_/__0;\`````#[9$)%M(B40D0$B+5"1@2('"T`$``$B)
+M5"0X18G^00^V[TB+1"1`B>E(T_BH`74+1#A\)$L/A=4```!!@/X#=FA(BT0D
+M8,>`<`$``,0!``!(BU0D4(L"B04`````B>F#X0.-#$F[!P```-/C08G<00G$
+M1(DBO^@#``#H`````/?31"'C2(M,)%")&8T4K0````!(8])(`U0D.(L"B04`
+M````@\@(B0+K9TB+1"1@QX!P`0``J`$``$B+5"10BP*)!0````")Z8/A`XT,
+M2;L'````T^-!B=Q!"<1$B2*_Z`,``.@`````]]-!(=Q(BTPD4$2)(8T4K0``
+M``!(8])(`U0D.(L"B04`````@\@(B0)!@\<!08U&`4$X14,/A_G^__](@\1H
+M6UU!7$%=05Y!7\-F9F:09F9FD&9F9I!!5%5328G\2(GU#[9W0T"$]G0F#[95
+M#;L`````]L(!=`[K%DB)T(G92-/XJ`%U#X/#`4`X\W7LZP6[`````/9%#`)U
+M"DB-16!(.45@=6A(B>_H`````(3`=%%,B>?H`````$B)QDB%P'1,2(M5:$B)
+M16A(C45@2(D&2(E6"$B),H!%#@%(B6Y0QD9(!<9&20#&AH$````/N0$```"Z
+M`0```$B)[^@`````ZPL/MO-,B>?H`````%M=05S#9F:09I!!5D%505154TB)
+M_4&)]40/MO9"C02U`````$QCX+L`````OQ`G``#H`````$&`_0-V'DB+10!(
+M!=`!``!,`>"+`(D%`````,'H%(/@`>L=D$B+10!(!=`!``!)C00$BP")!0``
+M``#!Z!2#X`&$P'4*@\,!9H'[+`%UJ$2)]DB)[^@`````2(GOZ`````!)8\9(
+MC11`2(T4D$B-1-4`]H#)$@```70/2(NPT!(``$B)[^@`````6UU!7$%=05[#
+M9I!!5D%505154T&)]4F)_$0/MO9)8\9(C11`2(T4D$B+K-?0$@``2(7M#X26
+M`0``2,?`_O___T2)\4C3P(1%#0^%@`$``$B-14A(.45(=15!O0````!(C5U@
+M@'T.`'4CZ?,"``!`#[;&2(T\0$B-/+A)C;S\P!(``.@`````Z=4"``!(B=_H
+M`````$B)P4B+0PA(B4L(2(D92(E!"$B)"(!Y20`/A0D!```/MT$X28.\Q&@$
+M````=0M(@WE```^$V0````^W03A)BX3$:`0``$B#N(``````#X2G````QH'H
+M``````^V44A(B="#X`9(@_@&=2WVP@%T*,9!2@7&04L$#[:1@0```$B+<5A(
+MBWE0Z`````#IF````&9F9I!F9I`/ME%(2(G0@^`&2(/X!'4@]L(!=!O&04H#
+MQD%+!$B)SDR)Y^@`````ZV=F9I!F9I`/ME%(2(G0@^`&2(/X!G51]L(!=4S&
+M04L&QD%*!6;'@<@``````$B)SDR)Y^@`````ZRY(BU%`28NT)/@(``"_!```
+M`.@`````ZQ8/MU$X28NT)/@(``"_`@```.@`````08/%`40X;0X/AI<!``#I
+MO?[__T*-!+4`````2&/HNP````"_$"<``.@`````08#]`W8=28L$)$@%T`$`
+M`$@!Z(L`B04`````P>@4@^`!ZQM)BP0D2`70`0``2`'HBP")!0````#!Z!2#
+MX`&$P'4*@\,!9H'[+`%UJD2)]DR)Y^@`````3(GGZ`````!)8\9(C11`2(T4
+MD$F+K-30$@``2(7M#X3]````08!\)$,`="R[``````^VRP^V10U(T_BH`70/
+MN@````")SDR)Y^@`````@\,!03A<)$-WV4$/ML5(C11`2(T4D$F-E-3`$@``
+M2(E5($B-14A(.45(=3A(C45@2#E%8'4NZWMF9I!FD$B)W^@`````2(UPR$B+
+M4PA(B4,(2(D82(E0"$B)`DB#>-@`=!'K";X`````2(U=2$@Y74AURDB%]G1;
+MQD9:`$&`?"1#`'1/N0````"Z``````^V10U(T_BH`70.#[;"B$P&<(!&6@&#
+MP@&#P0%!.$PD0W8BZ]OV10H!=`U(B>Y,B>?H`````.L-O@````!(B>_H````
+M`%M=05Q!74%>PY!(@^P(3(L'1(M/-$$/MG!#0(3V=&))C8#`$@``N0````!(
+M.?AU&NM/#[;!2(T40$B-%)!)C930P!(``$@Y^G0(@\$!0#CQ=>"`^0-V+TF+
+M`$@%T`$``$B-%(T`````@>+\`P``2`'0BP")!0````#!Z!2#X`'K+;D`````
+M28L`2`70`0``2(T4C0````"!XOP#``!(`="+`(D%`````,'H%(/@`83`=!`/
+MMO%$B<I,B<?H`````.L+#[;Q3(G'Z`````!(@\0(PV9F9I!F9F:005=!5D%5
+M05154TB#[`A(B?-)B?Y,BZ>(````28LL)$'V1"0,$'0$QD=1!D$/MD91/`%T
+M>3P!<A4\!`^$F0```#P&#X5(`P``Z;H!``!!QD91`4R)]DB)[^@`````QD,D
+M@4&`3"0,"$B#NX``````=`](C;.`````2(GOZ`````!(C94``0``2(N%``$`
+M`$B)6`A(B0-(B5,(2(F=``$``$B)[^@`````Z>,"``!!@&0D#/=!@$92`4'&
+M1E$`QD,D`DB)WDB)[^@`````2(GOZ`````#IMP(``$$/MD0D#(/@]X/($$&(
+M1"0,08N6"`$``(U"`4&)A@@!``"#^@(/AP,!``!(@[N``````'0/2(VS@```
+M`$B)[^@`````2(V5``$``$B+A0`!``!(B5@(2(D#2(E3"$B)G0`!``!!@'Y"
+M`'480;\`````38UL)&!!@'PD#@!U'NF>````N@````"^`@```$R)Y^@`````
+M9I#I&P(``$R)[^@`````2(G#28M%"$F)70A,B2M(B4,(2(D82(M30$B%TG05
+M2(NU^`@``+\%````Z`````"`2TP"2(G:O@8```!,B>?H`````("[@P````!T
+M(F9F9I!F9I!(B>_H`````+\!````Z`````"`NX,`````=>5!@\<!13A\)`X/
+MAWO___],B??H`````.F)`0``08!D)`SW0<>&"`$```````!(@[N``````'0/
+M2(VS@````$B)[^@`````2(V5``$``$B+A0`!``!(B5@(2(D#2(E3"$B)G0`!
+M``"Z`````+X&````3(GGZ`````!)C40D8$DY1"1@='Q)B<5,B>_H`````$B)
+MPTB+0$!(A<!T4TC'0&``````2(GOZ`````!(BW-`N@$```!(B>_H`````$B+
+M4T!(B[7X"```OP$```#H`````$B+4T!(B[7X"```OP8```#H`````$C'0T``
+M````2(G>2(GOZ`````!-.6PD8'6'3(GV2(GOZ`````!)QT0D0`````!(BT4`
+MBY!8`0``B14`````A=)T"DB+10")D%@!``!!]D0D"@%T:X!]0P!T++D`````
+M0?9$)`T!=!7K'69FD&9FD$$/MD0D#4C3^*@!=0^#P0$X34-WZ^L%N0`````/
+MMMF)WDB)[^@`````3(GF2(GOZ`````!(8]M(C01;2(T$@TC'A,70$@``````
+M`&9FD&:02(/$"%M=05Q!74%>05_#D$B#["A(B5PD"$B);"003(ED)!A,B6PD
+M($B)\TB)_4R+;U!-BV4`#[=.,HG(9L'H!0^W\$ACQD&+1(1T@^$?2-/XJ`$/
+MA6<#``!)BQ0DC02U``,``(F"<`$``$F+!"2+D'0!``")%0````#&0R0ABT,X
+M)?___P`]X0$/`'4C2(G?Z`````"Z`````$B)WDR)Y^@`````Z18#``!F9I!F
+M9I")T`^W2S*#X1](T_BH`7002(G?Z`````!,B>?H``````^VA>@````\!`^'
+MX0(```^VP/\DQ0````#&A>@````!N@$```!(B=Y,B>_H`````.F[`@``QH7H
+M`````KH(````2(G>3(GOZ`````#IGP(``,:%Z`````-(B>J^(0```$R)[^@`
+M````2(MU6$B%]G0?#[:5@0```$&X`````+D!````3(GOZ`````#I8`(``$$/
+MMG4-N@````!,B>?H`````.E)`@``QH7H````!$B#?5@`=#-(B>J^(0```$R)
+M[^@`````#[:5@0```$B+=5A!N`````"Y`@```$R)[^@`````Z0@"``"Z````
+M`+XA````3(GOZ`````!!#[9U#;H!````3(GGZ`````#IWP$``(!]2O]T%4B)
+MZKX&````3(GOZ`````#IQ`$``$B)ZKX&````3(GOZ`````!(BTU`2(7)=!*+
+M402-0@&)002#^@4/AID!``#&14L!QD5*`("]@P````!T&TR)Y^@`````OP$`
+M``#H`````("]@P````!UY4B#?5@`=!E(BU402(M%&$B)0@A(B1!(BT58@&A8
+M`>L92(M58$B%TG00#[:%@0```$C'1,)8`````$B+50!(BT4(2(E""$B)$$&`
+M;0X!2(N](`$``$B%_W01#[:U#0$``+H!````Z`````!(BWU82(7_=!$/MK6!
+M````N@$```#H`````$B+14!(A<!T<DC'0&``````3(GGZ`````!(BW5`N@$`
+M``!,B>?H`````$B+14`/ME`"#[9P`4C'QP````"X`````.@`````2(M50$F+
+MM"3X"```OP$```#H`````$B+54!)B[0D^`@``+\&````Z`````!(QT5`````
+M`$B)[DR)Y^@`````08!]"?]T7+T`````08!]#@!T.;T`````28U=8&9F9I!F
+M9I!(B=_H`````$B+4PA(B4,(2(D82(E0"$B)`H!X2O]U"8/%`4$X;0YWUT$X
+M;0YW$4'&10G_3(GN3(GGZ`````"02(M<)`A(BVPD$$R+9"083(ML)"!(@\0H
+MPV9F9I!F9I!!5T%6055!5%532(/L:$F)_TB+AX@```!(B40D8$B+*$B+A:`1
+M``!$BS!(B?Y(B>_H`````$&`?U(!=@5!QD=1!$F-7RA).5\H#X13`0``2(G?
+MZ`````!(B40D6$F+1RA(BU0D6$B)4`A(B0)(B5H(28E7*$B%T@^$.P,``$B+
+M3"1@2(M!(`^V34$/ME4Z#[9U.4B+7"181`^W2S)$#[9`"$C'QP````"X````
+M`.@`````1`^W:S)-:>6P!```3`.E0!$``$B+G>`0``!(BWPD6.@`````08N,
+M)"0$``!!BY0D(`0``$B+?"18#[=W,D6+C"0L!```18N$)"@$``!(Q\<`````
+MN`````#H`````$G!Y09,`>N+0S2+>S!$BU,L1(M;*$2+8R1$BVL@BU,<B50D
+M3(M+&(E,)%"+4Q2)5"141(M+$$2+0PR+2PB+4P2+,XE$)$")?"0X1(E4)#!$
+MB5PD*$2)9"0@1(EL)!B+7"1,B5PD$(M\)%")?"0(BT0D5(D$)$C'QP````"X
+M`````.@`````9H-]<`!U.^GK`0``2(M4)&!(BT(@#[9-00^V53H/MG4Y0;G_
+M__\`1`^V0`A(Q\<`````N`````#H`````.D1`@``NP````!,C:6H#P``3(VM
+M``$``&9FD&:0#[?#2,'@`T@#A;@)``!(BS!(A?8/A'8!```/MT8@9D$Y1T`/
+MA6<!```/MY6Z$@``03G6=%"#P@$/MX6^$@``.<*X``````]#T(U"`4C!X`)(
+M`X6@$0``BP"I```(`'4@9B7_#V8YV'472#ET)%AU%4B)[^@`````Z7P!``!F
+M9I!$.?)UL`^W1B!F/84`9F:0#X?Z````#[?`@+P%:`@``/\/A.D```!(BTPD
+M8(!Y6``/A=H```#V00H!#X30````2(M5``^W1C)FP>@%#[?`C02%``,``(F"
+M<`$``$B+10`/MTXR@^$?N@$```!(B==(T^>)N'0!```/MT8R2,'@`T@#A;@)
+M``!(QP``````#[=.,HG(9L'H!27_!P``@^$?2(G72-/G2(GY]]$AC(7`"0``
+M#[=.,HG(9L'H!27_!P``@^$?2-/B]](A5(5T2#ET)%AT)TB+!DB+5@A(B5`(
+M2(D"2(N%``$``$B)<`A(B09,B6X(2(FU``$```^W=C),B>?H`````$&`;T4!
+M9F9FD(/#`68Y77`/AV/^__](BT0D8/9`"@%T44B+3"182(L12(M!"$B)0@A(
+MB1!(B<Y,B?_H`````.LQ2(M<)&!(BT,@#[9-00^V53H/MG4Y0;G___\`1`^V
+M0`A(Q\<`````N`````#H`````$B#Q&A;74%<05U!7D%?PV9F9I!F9F:005=!
+M5D%505154TB#["A)B?A(B50D($R++P^W]DC!Y@-)`[6X"0``2(LN9H%]..$!
+M=2X/MD4Z@^@1/`%W(TR+?T!(QT0D&`````!(A=)U:4'&1U$`2,=$)!@`````
+MZUF028N-0`D``+A@G@$`9H%]((4`=QP/MT4@00^VA`5H"```2(T40$B-%)!(
+MB=!(P>`%2`'!2(E,)!A!OP````!(@WPD(`!U$DB+1"08QH#H`````$&_````
+M`(!])(%U!4&`8`SW2(-\)"``#X4"`0``QD4D`/:%E@```"`/A$(%``!(BT5H
+M2(7`#X0U!0``2(G#]H"Q`````G0=2(NXH````$B%_W012(MU2$B%]G0(BU4T
+MZ`````!)BY40$0``2('"0`@``$B+3"08#[9!<L'@"$B82`'"BP*)!0````")
+MPL'J$(B3FP```,'H&&:)@Y````!)BY40$0``2('"1`@```^V07+!X`A(F$@!
+MPHL2B14`````#[;"9HF#E`````^VQF:)@Y8```")T,'H$`^VP&:)@Y@```#!
+MZAB(DYH```!)BY40$0``2('"3`@```^V07+!X`A(F$@!PHL"B04`````#[;`
+M9HF#D@```.E1!```#[=%,DAIP+`$``!-BZ5`$0``20'$28V<)"`$``"`?22`
+M=03&120A2(-\)!@`=%-(BT0D&$B#>$``#X6`````BWTT1`^VB($```!)BT`@
+M1`^V0`A!#[9-04$/ME4Z00^V=3E(BT0D($B)1"0(B3PD2,?'`````+@`````
+MZ`````#K/4V%_W0X1(M--$F+0"!$#[9`"$$/MDU!00^V53I!#[9U.4B+1"0@
+M2(D$)$C'QP````"X`````.@`````9I"+2P2+$P^W=3)$BTL,1(M#"$C'QP``
+M``"X`````.@`````0?9$)"(!='U,C6583(NU@````$&+5"0$00^V="0!2,?'
+M`````+@`````Z`````"`?5@`#X3U````NP`````/ML-(C01`2,'@`DF+5"0(
+M2`'"20-&$(M*"$B+$@^V\T2+2`A,BP!(Q\<`````N`````#H`````(/#`4$X
+M'"0/AJL```#KN4&`?"0G`&9FD`^)F@````^W=3*)\F;!Z@4/M](/M_9(Q\<`
+M````N`````#H`````$&+C<@)``!!BY7$"0``08NUP`D``$6+A<P)``!(Q\<`
+M````N`````#H``````^W=3)(Q\<`````N`````#H`````$F+50`/MT4R9L'H
+M!0^WP(T$A0`#``")@G`!``!)BU4`#[=-,H/A'[@!````2-/@B8)T`0``9I!F
+M@7TXX0%U&`^V13J#Z!$\`7<-3(G_Z`````#I(@(```^V5"0C]L(!#X3R`0``
+MBT4X)?___P`]X0$.``^$WP$``$F+E1`1``!(@<)`"```2(M,)!@/MD%RP>`(
+M2)A(`<)$BR)$B24`````28N5$!$``$B!PD0(```/MD%RP>`(2)A(`<)$BS)$
+MB34`````28N5$!$``$B!PD@(```/MD%RP>`(2)A(`<*+&HD=`````$F+E1`1
+M``!(@<),"```#[9!<L'@"$B82`'"1(L"1(D%`````(G91(GR1(GF2,?'````
+M`+@`````Z`````#VA98````@#X3J````2(M]:,:'L@```!#&120@1(G@P>@0
+MB(>;````1(G@P>@89HF'D````(G8P>`(00^VU@'09HF'E````(G8L`!,B?$/
+MMM4!T&:)AY8```")VL'J$,'B"$2)\,'H$`^VP`'"9HF7F````$F+E1`1``!(
+M@<),"```2(M,)!@/MD%RP>`(2)A(`<*+,HDU`````$`/MO9FB;>2````#[>/
+ME@````^WEY@````/M_9$#[>'E````$C'QP````"X`````.@`````28N5$!$`
+M`$B!PD`(``!(BTPD&`^V07+!X`A(F$@!PL<"`````.M>9H%]..$!=20/MD4Z
+M@^@:/`%W&4C'QP````"X`````.@`````QD4D(>LT9I!(B>Y,B>_H`````.LE
+M9F:0A-)Y'DF+10"+B%@!``")#0````"%R70*28M%`(F(6`$``$B#Q"A;74%<
+M05U!7D%?PV9F9I!F9F:09F9FD&9FD$B#[`@/MD8X2#E^*'5*/`AT93PH=&$\
+MJ'1=/(AF9F:0=%4\"G11/"IT33RJ9F9FD'1%/(IT04B+AP`!``!(B7`(2(D&
+M2(V'``$``$B)1@A(B;<``0``ZQ](BY<(`0``2(FW"`$``$B-AP`!``!(B09(
+MB58(2(DRZ`````!(@\0(PV9F9I!F9F:09F9FD&9FD$B#[`CH`````$B#Q`C#
+M9I!32(/L8$B)^TB-3"1=2(U4)%Y(C70D7P^W?SQ(C40D4DB)1"0X2(U$)%1(
+MB40D,$B-1"1,2(E$)"A(C40D3DB)1"0@2(U$)%A(B40D&$B-1"1:2(E$)!!(
+MC40D6TB)1"0(2(U$)%9(B00D3(U,)%Q,C40D4.@`````#[94)%\/MG0D7DB-
+M?"1(Z``````/MD0D7TB-%$!(C1202,'B!4B+<R!(C;L@"0``N0$```#H````
+M``^V5"1=2(T4TDC!X@5(BW,@2(V[2`D``+D!````Z``````/ME0D7DAITL@/
+M``!(BW,@2(V[<`D``+D!````Z``````/MU0D6$C!X@-(BW,@2(V[F`D``+D!
+M````Z``````/MT0D4$B-%(!(C1202,'B`TB+<R!(C;MP"@``N0$```#H````
+M``^V5"1<#[=$)%!(#Z_02(T44DC!X@)(BW,@2(V[``H``+D!````Z`````!(
+MBW,@2(V[*`H``+D!````N@`"``#H``````^V3"1?2(MS($B-NV`+``"Z``@`
+M`.@`````#[94)%M(P>(%2(MS($B-N\`*``"Y`0```.@`````2(MS($B-N^@*
+M``"Y`0```+H``0``Z``````/ME0D6DB-%))(P>(%2(MS($B-NQ`+``"Y`0``
+M`.@`````#[=4)%9(C1222,'B`TB+<R!(C;LX"P``N0$```#H``````^W5"18
+M2`'22(MS($B-NX`/``"Y`0```.@`````#[94)%](`=)(BW,@2(V[N`\``+D!
+M````Z``````/ME0D74@!TDB+<R!(C;OP#P``N0$```#H``````^V5"1>2`'2
+M2(MS($B-NR@0``"Y`0```.@`````#[93/D@!TDB+<R!(C;M@$```N0$```#H
+M``````^W5"1.2(T44DC!X@1(BW,@2(V[F`H``+D!````Z`````"+5"1(2(MS
+M($B-NY@0``"Y`0```.@`````#[=4)%A(P>(&2(MS($B-N\`0``!!N`$```"Y
+M0````.@`````2(MS($B-N_`0``!!N`$```"Y``$``+H`&0``Z``````/MU0D
+M6$AITK`$``!(BW,@2(V[(!$``$&X`0```+F`````Z``````/MU0D5$C!X@)(
+MBW,@2(V[4!$``$&X`0```+D$````Z``````/MU0D4DC!X@)(BW,@2(V[@!$`
+M`$&X`0```+D$````Z``````/ME0D6\'B"TB+<R!(C;NP$0``0;@!````N0@`
+M``#H`````$B+<R!(C;O@$0``0;@!````N0@```"Z```(`.@`````#[=4)%9(
+M:=*,`0``2(MS($B!PQ`2``!!N`$```"Y"````$B)W^@`````N`````!(@\1@
+M6\-F9I!FD$B#[#A(B5PD"$B);"003(ED)!A,B6PD($R)="0H3(E\)#!)B?=)
+MB?U(BP=(B00D3(UG2$R)Y^@`````2(G#3(UPR$B+/"3H`````$B)Q4F+15!)
+MB5U038EF.$F)1D!(B1BX`0```$B%[71XQD4XX<9%.0'&13H0@$T[`4F+AZ``
+M``!(B45H2(M%<$R)>"A)C8>0````2(E%4,9%)<Q!#[9&6V:)12!)BT4`2(E%
+M*,=%-)````!,B7U(2,>%H`````````!(C7U8O@````#H`````$B)[DB+/"3H
+M`````+@`````2(M<)`A(BVPD$$R+9"083(ML)"!,BW0D*$R+?"0P2(/$.,-F
+M9F:09F:09F:005=!5D%505154TB#[!A(B?U(QT0D$`````!(BT0D$`^VE"CN
+M"```@/K_#X3J````#[;*2(T$B4B-!(%(C83%R`$``$B)1"0(#[;R2&/&2(T4
+M@$B-%)"`O-76`0````^$M@```$&\`````$B-!(E(C02!2,'@`TR-M`4H`@``
+M3(TL*$ACQDB-%(!(C1203(V\U<`!``!,B??H`````$B)PTF+A3`"``!)B9TP
+M`@``3(DS2(E#"$B)&$B+4T!(A=)T%4B+M?@(``"_!0```.@`````@$M,`DB)
+MVKX"````2(M\)`CH`````("[@P````!T&TB)[^@`````OP$```#H`````("[
+M@P````!UY4&#Q`%%.&<6#X=[____2(-$)!`!2(-\)!`$#X7N_O__2(GOZ```
+M``!(@\086UU!7$%=05Y!7\-F9F:09F:09F:09F:005=!5D%505154TB#['A(
+MB?O&1TT`QD=,`,9'2P#&AW$4````2(V7P!(``+@`````Q@00`$B#P`%(/:`!
+M``!U\$B-@P`!``!(B8,``0``2(F#"`$``$B-@Q`!``!(B8,0`0``2(F#&`$`
+M`$R-HR`!``!,B:,@`0``3(FC*`$``$R-JS`!``!,B:LP`0``3(FK.`$``$B-
+M@T`!``!(B40D2$B)@T`!``!(B8-(`0``2(V+4`$``$B)3"102(F+4`$``$B)
+MBU@!``!,C;-P`0``3(FS<`$``$R)LW@!``!(C;.``0``2(ET)$!(B;.``0``
+M2(FSB`$``$R-NV`!``!,B;M@`0``3(F[:`$``$B-3"1N2(U4)'!(C70D<0^W
+M>SQ(C40D<DB)1"0X2(U$)'1(B40D,$B-1"1D2(E$)"A(C40D:DB)1"0@2(U$
+M)'9(B40D&$B-1"1L2(E$)!!(C40D;4B)1"0(2(U$)&A(B00D3(U,)&],C40D
+M9N@`````#[9$)'&(0T8/MD0D<(A#1P^V1"1NB(/Y````#[=$)'9FB4-P#[=$
+M)'1FB8.\$@``#[=$)'*#Z`%FB8.^$@``#[=$)&9FB4-.#[=#/&8]@)%T"F8]
+M@)0/A:@)``#&0TD$QD-#!,9#2D#&0T@`QH/V````"<9#1`!(C;L@"0``Z```
+M``!(B<%(B8-`"0``#[9$)'%(C11`2(T4D$C!X@5(A=)T$$B)R,8``$B#P`%(
+M@^H!=?-(C;M("0``Z`````!(B<%(B8-H"0``#[9$)&Y(C03`2(G"2,'B!4B%
+MTG002(G(Q@``2(/``4B#Z@%U\TB-NW`)``#H`````$B)P4B)@Y`)```/MD0D
+M<$AIT,@/``!(A=)T$$B)R,8``$B#P`%(@^H!=?-(C;N8"0``Z`````!(B<%(
+MB8.X"0``#[=$)'9(C13%`````$B%TG002(G(Q@``2(/``4B#Z@%U\TB-NR@*
+M``#H`````$B)@T@*``!(C;L`"@``Z`````!(B<5(B8,@"@``2(V[<`H``.@`
+M````2(G"2(F#D`H``&:#?"1F`'1(N0````!(B6I@#[9$)&^(0EA(BX,H`0``
+M2(F3*`$``$R)(DB)0@A(B1`/MD0D;TB-!$!(C6R%`$B!PJ@```"#P0%F.4PD
+M9G>]2(V[F`H``.@`````2(G"2(F#N`H``&:#?"1J`'0ON0````#&0A``2(N#
+M.`$``$B)DS@!``!,B2I(B4((2(D02(/",(/!`68Y3"1J=]9(C;O`"@``Z```
+M``!(B<)(B8/@"@``@'PD;0!T,[D`````2(N#2`$``$B)DT@!``!(BW0D2$B)
+M,DB)0@A(B1!(@\(@@\$!#[9$)&UF.<AWTDB-N^@*``#H`````$B)PDB)@P@+
+M``!(C8@``0``2(N#6`$``$B)DU@!``!(BW0D4$B),DB)0@A(B1!(@\(@2#G*
+M==I(C;L0"P``Z`````!(B<)(B8,P"P``@'PD;`!T,;D`````2(N#>`$``$B)
+MDW@!``!,B3)(B4((2(D02('"H````(/!`0^V1"1L9CG(=]1(C;LX"P``Z```
+M``!(B<)(B8-8"P``9H-\)&@`="NY`````$B+@V@!``!(B9-H`0``3(DZ2(E"
+M"$B)$$B#PBB#P0%F.4PD:'?:@'PD<0!T2;T`````3(VC8`L``$R)Y^@`````
+M#[?52(F$TX`+``!(BY.(`0``2(F#B`$``$B+3"1`2(D(2(E0"$B)`H/%`0^V
+M1"1Q9CGH=\-(C;N`#P``Z`````!(B8.@#P``2(F#J`\```^W="1V9HFSL@\`
+M``^W]DB-NZ@/``#H`````$B-N[@/``#H`````$B)@]@/``!(B8/@#P``#[9T
+M)'%FB;/J#P``#[?V2(V[X`\``.@`````2(V[\`\``.@`````2(F#$!```$B)
+M@Q@0```/MG0D;F:)LR(0```/M_9(C;L8$```Z`````!(C;LH$```Z`````!(
+MB8-($```2(F#4!````^V="1P9HFS6A````^W]DB-NU`0``#H`````$B-NV`0
+M``#H`````$B)@X`0``!(B8.($```#[9#/F:)@Y(0```/MG,^2(V[B!```.@`
+M````2(V[F!```.@`````2(G!2(F#N!````^V1"1P2(T$P$C!X`>)QH'&8%<`
+M`'02B?)(B<C&``!(@\`!2(/J`77S2(N#N!```(DP2(N3N!````^V1"1PB$($
+M#[94)'!(B[NX$```Z`````!!N`````"`>SX`#X2H````OP`````/M\=(C12`
+M2(T4D$C!X@-,C803R`$``$B-!!I(C;#``0``0(A^$,9&$0!(B9C(`0``QD86
+M`,:`(`(```#&@/`!````QX!H`@```````$B-C!/X`0``2(F(^`$``$B)B``"
+M``!(C8P3$`(``$B)B!`"``!(B8@8`@``2(V4$R@"``!(B9`H`@``2(F0,`(`
+M`,9&$@*#QP$/MD,^9CGX#X==____QD-(`,:#[@@``/_&@^\(``#_QH/P"```
+M_\:#\0@``/^`?"1Q``^$E@```+X`````#[?.2(T$24B-!(%(P>`%2(N30`D`
+M`,9$`DL!2(N30`D``,9$$$H`2(N30`D``,:$$(````#_2(N30`D``,9$$'+_
+M2(N30`D``&;'A!#(``````!(QX3+:`0```````!(B<%(`XM`"0``2(U1($B)
+M42!(`X-`"0``2(U0($B)4"B#Q@$/MD0D<68Y\`^';____V;'@_0``````+@`
+M````QH08:`@``/](@\`!2#V&````=>R`?"1P``^$O0```+X`````#[?&2&G`
+MR`\``$B+DY`)``#&1`)8`$B+DY`)``#&1!!9`$B+DY`)``!(QT00$`````!(
+MB<%(`XN0"0``2(U1&$B)41A(B<%(`XN0"0``2(U1&$B)42!(B<%(`XN0"0``
+M2(U1*$B)42A(B<%(`XN0"0``2(U1*$B)43!(BY.0"0``3(E$$`A(B<%(`XN0
+M"0``2(U12$B)44A(`X.0"0``2(U02$B)4%"#Q@$/MD0D<&8Y\`^'2/___\:#
+M]P```("`?"1N``^$@@```+X`````#[?&2(T$P$C!X`5(BY-H"0``9L=$`DX$
+M`$B+DV@)``#&1!!"`$B+DV@)``#&1!!$_TB+DV@)``#&1!!0_TB)P4@#BV@)
+M``!(C5$H2(E1*$B)P4@#BV@)``!(C5$H2(E1,$B+DV@)``!,B800B````(/&
+M`0^V1"1N9CGP=X/&@_@```""2(VSZ!```$B-N\`0``#H`````$B)@^`0``!(
+MC;,8$0``2(V[\!```.@`````2(F#$!$``$B-LT@1``!(C;L@$0``Z`````!(
+MB8-`$0``2(VS>!$``$B-NU`1``#H`````$B)@W`1``!(C;.H$0``2(V[@!$`
+M`.@`````2(F#H!$``$B-L]@1``!(C;NP$0``Z`````!)B<1(B8/0$0``2(NK
+MV!$``(!\)&T`=%)!O0````!(BWPD2.@`````3(E@$$B):!A(BY-(`0``2(F#
+M2`$``$B+="1(2(DP2(E0"$B)`DF!Q``(``!(@<4`"```08/%`0^V1"1M9D0Y
+MZ'>T2(VS"!(``$B-N^`1``#H`````$F)Q$B)@P`2``!(BZL($@``0;T`````
+M2(M\)%#H`````$R)8!!(B6@82(N36`$``$B)@U@!``!(BTPD4$B)"$B)4`A(
+MB0))@<0```$`2('%```!`$&#Q0%F08/]"'6X2(VS.!(``$B-NQ`2``#H````
+M`$B)@S`2``!,BZ,X$@``9H-\)&@`=$A(B<5!M0!,B?_H`````$B):!!,B6`8
+M2(N3:`$``$B)@V@!``!,B3A(B5`(2(D"2('%C`$``$F!Q(P!``!!@\4!9D0Y
+M;"1H=[Y(@\1X6UU!7$%=05Y!7\-!54%455-(@^P(28G]28GT2(N>B`````^V
+M5D=(B?Y(B=_H`````$B)Q69!@TPD3A!!@'U#`'19N0````#V0PT!=`WK3`^V
+M0PU(T_BH`74-@\$!00^V14-F.<AWZ&:#^0-V,TF+10!(!=`!``!(C12-````
+M`('B_/\#`$@!T(L`B04`````P>@4@_`!@^`!ZS&Y`````$F+10!(!=`!``!(
+MC12-`````('B_/\#`$@!T(L`B04`````P>@4@_`!@^`!A,!T$`^V\4R)[^@`
+M````Z9<!``!(C4-@2#E#8`^$&0$``$B%[0^$$`$```^VA8$```!)QT3$6```
+M``!(BU4`2(M%"$B)0@A(B1!(B>J^!@```$B)W^@`````@+V#`````'0;3(GO
+MZ`````"_`0```.@`````@+V#`````'7E2(M%0$B%P'1(2,=`8`````#V14P$
+M=0A,B>_H`````$B+54!)B[7X"```OP$```#H`````$B+54!)B[7X"```OP8`
+M``#H`````$C'14``````@&L.`4B)[DR)[^@`````28M%`(N06`$``(D5````
+M`(72=`I)BT4`B9!8`0``0<9$)$(`9D&#9"1.[T&`?"0[`'0JN@`````/M\))
+MBT3$6$B%P'0*@'A*_P^%?@```(/"`4$/MD0D.V8YT'?;08!\)$X`>`^]````
+M`$&`?"0[`'41ZTM,B>9,B>_H`````&:0ZTH/M\5)BUS$6$B%VW0A]D-,`G0;
+M2(M30$F+M?@(``"_!@```.@`````@&-,_6:0@\4!00^V1"0[9CGH=\1F0<=$
+M)$X"`$&`9"1)_4B#Q`A;74%<05W#9F:09F:09F:005=!5D%505154TB#['A)
+MB?](B7PD4$B+1U!(B40D<$B+*$B+A:`1``!$BS!(B?Y(B>_H`````$&`O^L`
+M```!=@A!QH?H````!$F-1R!(QT0D:`````!).4<@="E)C5\@2(G?Z`````!(
+MB40D:$F+1R!(BU0D:$B)4`A(B0)(B5H(28E7($F#?T``=4R_____`$B#?"1H
+M`'0)2(M,)&@/MWDR10^VCX$```!(BW0D<$B+1B!$#[9`"`^V34$/ME4Z#[9U
+M.8D\)$C'QP````"X`````.@`````2(-\)&@`#X3.`P``2(M$)&A$#[=H,DUI
+MY;`$``!,`Z5`$0``2(N=X!```$B)Q^@`````08N,)"0$``!!BY0D(`0``$B+
+M1"1H#[=P,D6+C"0L!```18N$)"@$``!(Q\<`````N`````#H`````$G!Y09,
+M`>N+0S2+>S!$BU,L1(M;*$2+8R1$BVL@BU,<B50D7(M+&(E,)&"+<Q2)="1D
+M1(M+$$2+0PR+2PB+4P2+,XE$)$")?"0X1(E4)#!$B5PD*$2)9"0@1(EL)!B+
+M1"1<B40D$(M$)&")1"0(BT0D9(D$)$C'QP````"X`````.@`````3(MD)&A)
+M@\182(M4)&A,BZJ`````08M4)`1!#[9T)`%(Q\<`````N`````#H`````$&`
+M?"0!`'1.NP````!F9F:09F:0#[;#2(T$0$C!X`))BU0D"$@!PDD#11"+2@A(
+MBQ(/MO-$BT@(3(L`2,?'`````+@`````Z`````"#PP%!.%PD`7>^9H-]<``/
+MA"("``!!O`````!,C:VH#P``2(V-``$``$B)3"1(00^WQ$C!X`-(`X6X"0``
+M2(L82(7;#X3?`0``#[=#(&9!.4<X#X70`0``#[>5NA(``$$YUG1L9F9FD(/"
+M`0^WA;X2```YPK@`````#T/0C4(!2,'@`D@#A:`1``"+`*D```@`=3AF)?\/
+M9D0YX'4N2#E<)&AU+$B)[^@`````2(M$)&@/MW`R2,?'`````+@`````Z```
+M``#IGP$``$0Y\G682(M4)'"`>E@`#X5)`0``#[=#(&8]A0`/ASL!```/M\"`
+MO`5H"```_P^$*@$``$B#?"10``^$!`$``$$/MD=(J`$/A/<```"H!`^$[P``
+M`$B+50`/MT,R9L'H!0^WP(T$A0`#``")@G`!``!(BT4`#[=+,H/A'[H!````
+M2(G62-/FB;!T`0``#[=#,DC!X`-(`X6X"0``2,<```````^W2S*)R&;!Z`4E
+M_P<``(/A'TB)UDC3YDB)\??1(8R%P`D```^W2S*)R&;!Z`4E_P<``(/A'TC3
+MXO?2(52%=$@[7"1H=$5(BQ-(BT,(2(E""$B)$$B#NX``````=`](C;.`````
+M2(GOZ`````!(BX4``0``2(E8"$B)`TB+1"1(2(E#"$B)G0`!```/MW,R3(GO
+MZ`````!!@*^#`````>L:2(M4)'#V0@H"=`](B=Y,B?_H`````&9F9I!!@\0!
+M9D0Y97`/A_?]__](@WPD4`!T*T$/MD=(J`%T(J@$=!Y(BTPD:$B+$4B+00A(
+MB4((2(D02(G.3(G_Z`````!(@\1X6UU!7$%=05Y!7\.0D)"0D)"0D)"0D)"0
+MD)!(BT=03(L(0;@`````1(T4%D,/MH0(:`@``#S_=$(/ML!(C11`2(T4D$C!
+MX@5(B=!)`X%`"0``0#BP#@$``'4@2#FX(`$``'471(B0#0$``$F+@4`)``"(
+MC`(,`0``9I!)@\`!28'X@````'6D\\.02(M_6`^VA\`````\3W<Q#[;`2(T$
+M0$C!X`0!\HB4!\D````/MH?`````2(T$0$C!X`2(C`?(````@(?``````?/#
+M9F9FD&9F9I!F9I!F9I!!N/____]FA?9T3$B)^D&X_____[\`````9F9FD&9F
+MD`^V"HU!T#P)=QM!@/C_N`````!$#T3`00^VP(T$@$2-1$'0ZP9!@/C_=0R#
+MQP%(@\(!9CGW=<E!#[;`PV9F9I!!B=%(BT=03(L`N0````"00@^VA`%H"```
+M//]T,P^VP$B-%$!(C1202,'B!4B)T$D#@$`)``!(.;@@`0``=1%`.+`-`0``
+M=0A$B(@/`0``PTB#P0%(@?F`````=;/SPY!)B=-(BT=03(L(3(M76$&X````
+M`$,/MH0(:`@``#S_=$0/ML!(C11`2(T4D$C!X@5)`Y%`"0``2#FZ(`$``'4E
+M0#BR#0$``'4<A,ET#$B+@A@!``!)B0/K&4F+`TB)@A@!``#K#4F#P`%)@?B`
+M````=:),B=>X`````&9FD&9FD`^VE\@```"`^@%V1(#Z%W0_0#BWR0```'4V
+MA,ET%DB82(T$0$C!X`1)BX0"T````$F)`\-(F$B-!$!(P>`$28L328F4`M``
+M``##9F:09F:0@\`!2(/',(/X4'6D\\-FD$%6055!5%532(/L$$F)_D&)\4B+
+MOR@!```/MD<"P>`(#[97`T2-!!!!#[?`@\`$/0`(```/C^P```!`A/9T3$$/
+MMI80`0``ON#___\AU@^V1P&#X`^)T8/A$`GP"<B^"````"'6@^#SB=&#X00)
+M\`G(@^("@^#\00^VCA`!``"#X0$)T`G(B$<!ZTH/ME<!ON#___\AUD$/MH80
+M`0``@^`/B=&#X1`)\`G(O@@````AUH/@\XG1@^$$"?`)R(/B`H/@_`^V3P&#
+MX0$)T`G(08B&$`$``$B-5PA!#[?`3(UD!P1).=1V/TB)5"0(NP````!!#[;I
+M3(UL)`AF9I!F9I`/MO.)Z4R)ZDR)]^@`````2(M$)`A(@\`$2(E$)`B#PP%,
+M.>!RVDB#Q!!;74%<05U!7L-F9F:09F:09F:09F:04TB)^TB+3D@/MD$"P>`(
+M#[91`P'0#[?`C5`$#[=&-#G"?Q](B[\H`0``2&/22(G.Z`````"^`````$B)
+MW^@`````6\-F9F:09F9FD&9F9I!!5T%6055!5%532(/L"$F)]T&)U$B+7UA)
+MB=Z]`````$R-;@0/MH/(````/`%V03P7=#U$.*/)````=31!#[97`TACQ4B-
+M!$!(P>`$28V\!M@```"`^B"X(`````]'T`^VTDR)[N@`````9F:09F:0@\4!
+M2(/#,(/]4'6H2(/$"%M=05Q!74%>05_#9F:09I!(@^Q(2(E<)!A(B6PD($R)
+M9"0H3(EL)#!,B70D.$R)?"1`28G\08G7B<M,B00D0(AT)`](BT=03(LP3(GW
+MZ`````!(B<5(A<`/A/8```!,B??H`````$F)Q4B%P'422(GN3(GWZ`````#I
+MU@```&:02(U%6$B)1"0028M]$(G:28NT)"@!``#H`````,:%F`````K&126L
+M00^W1"0X9HE%($B+%"1(B55H3(EU*(E=-(.-E````!))BT402(E%2$R);7A)
+MC80D[````$B)15#&13`@2,>%H`````````#&13@[QD4Y`@^V1"0/B$4Z1(GX
+MP>@0B$4[3(GZ#[;&B$4\1(A]/0^V13:(13X/MD4UB$4_B%U`QD5!`+X`````
+M2(M\)!#H`````(M5-$F+=1A(BWPD$.@`````2(GN3(GWZ`````!(BUPD&$B+
+M;"0@3(MD)"A,BVPD,$R+="0X3(M\)$!(@\1(PV9FD&9FD&9FD$B#[$A(B5PD
+M&$B);"0@3(ED)"A,B6PD,$R)="0X3(E\)$!)B?Q!B=>)3"0(3(G#0(AT)`](
+MBT=03(LP3(GWZ`````!(B<5(A<`/A.H```!,B??H`````$F)Q4B%P'412(GN
+M3(GWZ`````#IR@```)!(C4582(E$)!#&A9@````*QD4EK$$/MT0D.&:)12!(
+MB5UH3(EU*,>%E`````@```!,B6UX28M%$$B)14B+5"0(B54T28V$).P```!(
+MB450QD4P($C'A:``````````QD4X/,9%.0(/MD0D#XA%.D2)^,'H$(A%.TR)
+M^@^VQHA%/$2(?3T/MD4VB$4^#[9%-8A%/P^V1"0(B$5`QD5!`+X`````2(M\
+M)!#H`````(M5-$F+=1A(BWPD$.@`````2(GN3(GWZ`````!(BUPD&$B+;"0@
+M3(MD)"A,BVPD,$R+="0X3(M\)$!(@\1(PV9F9I!(@^PX2(E<)`A(B6PD$$R)
+M9"083(EL)"!,B70D*$R)?"0P28G\2(M'4$R+.$B+ER@!```/MD("P>`(#[92
+M`P'0#[?`1(UH!$&!_0`(```/C\X```!,B?_H`````$B)Q4B%P`^$N@```$R)
+M_^@`````28G&2(7`=1!(B>Y,B?_H`````.F:````2(U=6$B+>!!)8]5)B[0D
+M*`$``.@`````QD4EK$$/MT0D.&:)12!,B7TH1(EM-(.-E````!))BT802(E%
+M2$R)=7A)C80D[````$B)15#&13`@2,>%H`````````#&13@=QD4Y$,9%.@(/
+MMD4UB$4[1(AM/+X`````2(G?Z`````"+531)BW882(G?Z`````!(B>Y,B?_H
M`````$B+7"0(2(ML)!!,BV0D&$R+;"0@3(MT)"A,BWPD,$B#Q#C#9F9FD&9F
-MD&9FD&9FD$%6055!5%532(G[08GU08G62(M'"$B+*+D"````N@````"^````
-M`.@`````@'M<`'082(GOZ`````"_`0```.@`````@'M<`'7H2(M#"$B+`$@%
-MH!(``(!X`@!X.X!(`H"Y`0```+H`````O@````!(B=_H`````(![7`!T&F:0
-M2(GOZ`````"_`0```.@`````@'M<`'7H1(GHP.@"1`^VX+D!````1(GBO@,`
-M``!(B=_H`````(![7`!T&V9FD$B)[^@`````OP$```#H`````(![7`!UZ$B+
-M0PA(BS!$B>GWT8/A`T6$]@^5PL'B`P^VA`Z@$@``@^#G"="(A`Z@$@``N0$`
-M``!$B>*^`P```$B)W^@`````6UU!7$%=05[#9F9FD&9F9I!F9I!F9I!(@^PH
-M2(E<)`A(B6PD$$R)9"083(EL)"!(B?M(B?4/MT8@9CV%`'<;3(NOB`D```^W
-MP`^VA`=@"```3&G@R`\``.L-3(NOB`D``$&\.+@/`$B+54B`>@$"=19(BT($
-M2(F#H!(``$B+0@Q(B8.H$@``2(MU>$B%]G0(2(G?Z`````!(B>Y(B=_H````
-M`$/&1"5<`$B+7"0(2(ML)!!,BV0D&$R+;"0@2(/$*,.0D)"0D$F)T4R+ES@)
-M```/MT8@NF">`0!F/84`=Q</M\`/MH0'8`@``$B-%$!(C1202,'B!4V-@2`$
-M``!!QH$@!```)V:!?CCA`74I1`^V3CI!C4'_/`%W#$&Y#P```$0B3COK+D&-
-M0>]!N0\````\`78@9I!)C0020;D`````2(-X8`!T#4&Y#P```$0BB($```!!
-M#[9``8/@\$0)R$&(0`&X`0```&:!?CCA`746#[9&.H/H`3P!#Y?`#[;`9F9F
-MD&9FD(G"P>('00^V0`&#X'\)T$&(0`$/MD$&08A``@^V`4&(0`,/MD$%08A`
-M!P^V00=!B$`/#[9!`D&(0`0/MD$#08A`!0^V001!B$`&#[9!`4&(0`P/MD$*
-M08A`"`^V00M!B$`)#[9!#$&(0`H/MD$(08A`"P^V00E!B$`-PV9FD&:00`^V
-MQ\-F9F:09F9FD&9FD(GX#[;$PV9F9I!F9I!F9I#&1R0"2(M'4$"(<`)(BT=0
-MQD`'`$B+1U"(4`S#9F9FD`^V1SV(1@(/MD<\B$8##[9'.XA&!`^V1SJ(1@K#
-M9F:0#[9'08A&`@^V1T"(1@,/MD<_B$8$#[9'/HA&"@^V1SV(1@L/MD<\B$8,
-MPV9FD&:0A=)^(;D`````9F9FD&9FD(G0*<B#^`(/G<`/ML"-3`$!.<I_Z_/#
-M9F:09F:09F:02(/L*$B)'"1(B6PD"$R)9"003(EL)!A,B70D($B)^TB)U4&)
-M]@^V1S@\*G0E/"IW$3PH#X7=````9F9FD&9FD.L0/(AT*CR*#X7(````9I#K
-M'D0/MF-`1`^V:S](B>Y(B=_H`````.L<9F9FD&9FD$0/MF-%1`^V:T1(B>Y(
-MB=_H`````,9%!4"+@Y0```"I```!`'0P1(AE`$2(;0A"C03U`````(A%`0^V
-M0S@\*'0$/(AU"\9%!F#K6V9FD&:0QD4&8>M0J0``!`!F9I!FD'0@1(AE`42(
-M;0D/MD,X/"AT!#R(=0;&108EZRK&108UZR1$B&4!#[9#.H/@#PA%!0^V0S@\
-M*'0$/(AU!L9%!LCK!,9%!LI(BQPD2(ML)`A,BV0D$$R+;"083(MT)"!(@\0H
-MPV9F9I!F9I!F9I!F9I`/MD<Z"D<["D<\"D<]#[;`#[970(/B`0G0=!6Z)```
-M`+X%````Z`````#SPV9F9I#&1@;L2,>'H`````````##2(/L($B)'"1(B6PD
-M"$R)9"003(EL)!A(B?M(B?4/MD<X/"]T"SR/=5GK%V9FD&:01`^V9T!$#[9O
-M/^@`````D.L/1`^V9T5$#[9O1.@`````QD4%0/:#E@````1T$D2(90%$B&T)
-MQD4&0NL69F9FD$2(90$/MD,Z@^`/"$4%QD4&0$B+'"1(BVPD"$R+9"003(ML
-M)!A(@\0@PV9FD&9FD$B)\<9"!4`/MD8X/#5T!CR1=2/K&P^W1VB#X`&#^`$9
-MP(/@_8/H%HA"!NLD9F9FD,9"!NKK&KHD````O@4```!(B<_H`````//#9F:0
-M9F:0]D$Y`G0$QD$D`//#9F9FD/9'//!T#[HD````O@4```#H`````//#9F:0
-M9F:09F:02(/L"$F)\+@`````9F9FD,8$"`!(@\`!2(/X#77R00^V0#@\-0^$
-MG0```#PU=RD\*'1B/"AW#CP;#X6A`P``D.F;````/"IT3#PO9F:09I`/A8H#
-M``#K6#R/9F:09F:0=$X\CW<2/(AT*SR*9F9FD`^%:@,``.L=/)%F9I!F9I!T
-M1CSA#X56`P``9F:09F:0Z80````/MO)(B<I,B<?H`````,=$)`0!````Z3@#
-M``!(B<Y,B<?H`````,=$)`0!````Z2`#``!(B<I,B<;H`````,=$)`0!````
-MZ0@#``!!]D`\`70AQD$&<,9!!`#&00,`QD$"`,9!!4#'1"0$`0```.G@`@``
-MQD$&X,=$)`0!````Z<\"``!!@'@Y`0^%O`(``$&`>#H<#X>Q`@``00^V0#K_
-M),4`````QD$'!,=$)`0!````Z9P"``#&00<`QT0D!`$```#IBP(``,9!!NS'
-M1"0$`0```.EZ`@``QD$&[\8!`T$/MD`[@\A`B$$!QT0D!`$```#I6P(``,9!
-M!N_&`0?'1"0$`0```.E'`@``QD$&0,9!`0'&005`QT0D!`$```#I+@(``,9!
-M!N_&`0-!#[9`.X/("(A!`<=$)`0!````Z0\"``#&00;OQ@$"QT0D!`$```#I
-M^P$``,9!!N_&`8+'1"0$`0```.GG`0``QD$&[\8!!L=$)`0!````Z=,!``#&
-M00;OQ@&&QT0D!`$```#IOP$``,9!!N-!#[9`.XA!`<=$)`0!````Z:8!``#&
-M00:PQ@'8QD$#3\9!!,+'1"0$`0```.F*`0``QD$&L,8!V<9!`T_&003"QT0D
-M!`$```#I;@$``,9!!K#&`=K&00-/QD$$PL=$)`0!````Z5(!``#V1V@!=!'&
-M00;JQT0D!`$```#I.P$``,9!!N?'1"0$`0```.DJ`0``QD$&[\8!JL=$)`0!
-M````Z18!``#&00;OQ@%5QT0D!`$```#I`@$``,9!!B_&00$!QD$"$,=$)`0!
-M````Z>D```#&00;D00^V0#R(`4$/MD`]B$$(00^V0#N(007'1"0$`0```.G!
-M````00^V0#N(009!#[9`/(@!00^V0#V(00)!#[9`/HA!`T$/MD`_B$$$00^V
-M0$&(00I!#[9`0(A!`<=$)`0!````Z7T```#&00;H00^V0#R(`4$/MD`]B$$(
-M00^V0#N(005!#[9`/HA!`D$/MD`_B$$#00^V0$"(001!#[9`08A!`<=$)`0!
-M````ZSC'1"0$`0```$'V0#P!="G&009PQD$$`,9!`P#&00(`QD$%0,=$)`0!
-M````ZPMF9I#'1"0$`````(M$)`1(@\0(PV9F9I!F9F:09F9FD&9FD%-(@^P@
-M2(GS2(M.2$C'!"0`````2,=$)`@`````2,=$)!``````2,=$)!@`````]H&G
-M````!'0-2(N1R````$B#Z@'K!HM1>(/J`8![."5U84B)T$C!Z!B(!"1(B=!(
-MP>@0B$0D`4B)T$C!Z`B(1"0"B%0D`_:!U0```!!U%,9$)`8"QD0D!P"X"```
-M`.FN````2(U\)`1(C;'J````N@0```#H`````+@(````Z8X```!(B=!(P>@X
-MB`0D2(G02,'H,(A$)`%(B=!(P>@HB$0D`DB)T$C!Z""(1"0#2(G02,'H&(A$
-M)`1(B=!(P>@0B$0D!4B)T$C!Z`B(1"0&B%0D!_:!U0```!!U%<9$)`H"QD0D
-M"P"X(````.LD9F9FD$B-?"0(2(VQZ@```+H$````Z`````"X(````&9FD&:0
-M2(M[2$ACT$B)YN@`````2(/$(%O#9F9FD&9F9I!F9I!32(GS2(M74$B+"@^V
-M1C@\+W1?/"]W*SP;#X0Q`0``/!MW#SP2#X5%`0``9F:09I#K0#PH=#P\*@^%
-M,@$``&:0ZS`\BG0L/(IW&#PU9F9FD`^$^@```#R(#X42`0``9I#K$#R/=`P\
-MX0^%`@$``&:0ZW7V1V@!=`J!BY0```````0`]D=J$`^$%`$``$B#?V``#X4)
-M`0``#[9#.#PH=!`\*G0,/(AT"#R*#X7Q````]D(,`744#[9R"$B)S^@`````
-MA,`/A-<```"`>R2!#X3-````@8N4```````!`+@!````Z;X```"`?CD!#X6D
-M````@'XZ'`^'F@```$@/ODXZN`$```!(T^"I]C_`'74CJ0A`!@!U#*D``"``
-M=2-F9I#K<X..E`````BX`0```&:0ZW.#CI0````!N`$```#K98..E````""X
-M`0```.M79I#V1V@!=`J!BY0```````0`@XN4`````;@!````ZS=FD(N#E```
-M`*D``"``=!CV1V@!=!T-```$`(F#E````+@!````ZQ"X`````.L)9F9FD+@!
-M````6\.0D)"0D)"0D)!(BW\(10^VP$'!X`0/MM+!X@A!"=!$B<"#R`2$R40/
-M1<!!@_G_=!E(C9<`_O[_1(G()?__`P")@@3(``!!@\@"1(D&PV9F9I!F9F:0
-M9F9FD$B+1PA(+0`"`0"#S@&)L`#(``##9F9FD&9F9I!F9F:005154T&)]$B+
-M1PB%]G1,2"T``@$`2(VH`,@``(N``,@``(D%`````+L`````J`%U#^LABT4`
-MB04`````J`%T%+\*````Z`````"#PP%$.>-UX>L'N`````#K!;C_____6UU!
-M7,-F9F:09F9FD&9FD%532(/L&$B)^\=$)!0`````2(MO",:':!0````/MA4`
-M````2(UT)!1!N0````!!N`(```"Y`0```.CB_O__BW0D%$B)W^@F____OJ"&
-M`0!(B=_H.?___X7`=55(C84`_O[_BX`,R```B04`````B40D%#T?8P``=3?'
-M@U@4```?8P``QX-<%``````$`,>#8!0``````0!(QX-P%````````&:X``#I
-M5P(``&9FD&:0QT0D%`````!(BVL(QH-H%````0^V%0````!(C70D%$&Y____
-M_T&X`@```+D!````2(G?Z#C^__^+="042(G?Z'S^__^^$"<``$B)W^B/_O__
-MA<!U;DB-A0#^_O^+@`S(``")!0````")1"04/1]#``!T+3T?1```=4G'@U@4
-M```?1```QX-<%``````'`,>#8!0``````0#IDP$``&9FD,>#6!0``!]#``#'
-M@UP4``````0`QX-@%``````!`.EM`0``QT0D%`````!(BVL(QH-H%`````^V
-M%0````!(C70D%$&Y`````$&X`@```+D!````2(G?Z'7]__^+="042(G?Z+G]
-M__^^$"<``$B)W^C,_?__A<!U4$B-A0#^_O^+@`S(``")!0````")1"04/;]#
-M``!U,L>#6!0``+]#``#'@UP4`````"``QX-@%````!```$C'@W`4````````
-M9K@``.GJ````QT0D%`````!(BVL(QH-H%`````^V%0````!(C70D%$&Y````
-M`$&X`@```+D!````2(G?Z-#\__^+="042(G?Z!3]__^^$"<``$B)W^@G_?__
-MA<!U9TB-A0#^_O^+@`S(``")!0````")1"04/>\1``!T"3WO$@``=4+K(,>#
-M6!0``.\1``#'@UP4``````0`QX-@%``````!`.L^QX-8%```[Q(``,>#7!0`
-M````"`#'@V`4``````$`ZQZX_____^LG9F:09I!(QX-P%````````+@`````
-MZQ!(QX-P%````````+@`````2(/$&%M=PV9F9I!F9I!(@^PH2(E<)!!(B6PD
-M&$R)9"0@2(G[B?=)B=1(BVL(@/D$N`0````/1\A(BX-P%```#[90!$B-="0,
-M08GY1`^VP;D!````2(G?Z,+[__^+="0,2(G?Z`;\__^^$"<``$B)W^@9_/__
-MNO____^%P'4@2(V%`/[^_XN`#,@``(D%`````(E$)`Q!B00DN@````")T$B+
-M7"002(ML)!A,BV0D($B#Q"C#9F9FD&9FD&9FD%532(/L&$B)^TB)U4B+AW`4
-M```/ME`+2(U$)!1!B?%!N`$```"Y`0```$B)QN@N^___BW0D%$B)W^AR^___
-MOA`G``!(B=_HA?O__[K_____A<!U&DB+0PA(+?0Y``"+`(D%`````(A%`+H`
-M````B=!(@\086UW#9F:09F:09F:005=!5D%505154TB#[!A(B?M!B<U!B?=!
-MB=:%R0^$C@```+T`````3(MC"$B+@W`4```/ME`"0;G_____0;@!````N0$`
-M``!(C70D%$B)W^B,^O__BW0D%$B)W^C0^O__OA`G``!(B=_HX_K__X7`=2E)
-MC80D`/[^_XN0#,@``(D5`````$2)^"'01#CP=0>X`````.L?B50D%+\*````
-MZ`````"#Q0%$.>T/A7?___^X_____TB#Q!A;74%<05U!7D%?PV9F9I!F9F:0
-M9F9FD%-(@^P02(G[2(N'<!0```^V$$B-="0,0;G_____0;@`````N0````#H
-MX_G__XMT)`Q(B=_H)_K__[X0)P``2(G?Z#KZ__^%P'4FN>"3!`"Z`@```+X#
-M````2(G?Z,_^__^Z`````(7`=`MF9I!F9I"Z_____XG02(/$$%O#9F:02(/L
-M*$B)7"082(EL)"!(B?N)]<9$)!?_2(U4)!?H`````(7`=7*`?"07`'1S2(G?
-MZ$O___^#^/]T7DB+@W`4```/ME`*2(UT)!!!B>E!N`````"Y`````$B)W^@P
-M^?__BW0D$$B)W^AT^?__OA`G``!(B=_HA_G__X7`=1NYX),$`+H`````O@,`
-M``!(B=_H'/[__X7`=`BX_____^L&D+@`````2(M<)!A(BVPD($B#Q"C#9F9F
-MD&9F9I!F9F:02(/L6$B)7"0H2(EL)#!,B60D.$R);"1`3(ET)$A,B7PD4$B)
-M_4&)]HG+2(._<!0````/A/@"``!)B==%A,`/A%P!``"#_O]U%P^WAU@4``!F
-MB0*X`0```.GY`@``9F:0@_[^=1*+AUP4``")`K@!````Z=\"``"#_OUU%(N'
-M8!0``(D"N`$```#IR`(``&:0`?.)7"0,.Y]<%```#X>.`@``B?.#X_Q!B?1!
-M@^0#=&),C6PD)+D$````3(GJB=[H_/O__X/#!+H$````.5PD#',-1(G@1"GP
-MBTPD#(T4"$0YXG8N1(GA3(G_9F:09F:0B<A!#[9$!0"(!TB#QP&#P0$YT77K
-MB=!$*>"#Z`%-C7P'`42+9"0,08/D_$0YXW,J3(UL)"2Y!````$R)ZHG>2(GO
-MZ(G[__^+1"0D08D'28/'!(/#!$$YW'?;.5PD#`^&XP$``$R-9"0DN00```!,
-MB>*)WDB)[^A5^___BW0D#"G>#X3``0``N0````"Z`````$$/M@040H@$.H/!
-M`4B#P@$Y\0^$G@$``.OF9F:09I"#_O]U*X`Z#W41QH=I%````;@!````Z9L!
-M``#&AVD4````N`$```#IB@$``&9F9I")3"04B<@!\#N'7!0```^'3`$``("_
-M:10````/A#\!``")\+H`````][=@%```A=(/A8T```"`OV@4````=`WH````
-M`(7`#X44`0``2(GOZ)S\__^#^/\/A`,!``!(BX5P%```#[90!DB-="0D18GQ
-M0;@`````N0````!(B>_H??;__XMT)"1(B>_HP?;__[X0)P``2(GOZ-3V__^%
-MP`^%O````+G@DP0`N@````"^`P```$B)[^AE^___A<`/A9T```"%VP^$G```
-M`,=$)!``````BT0D$$6+)`=$BVPD$$4!]4B+70A(@>L``@$`2(GOZ/K[__]$
-MB:,(R```2(N%<!0```^V4`5%B>E!N`0```"Y`````$B-="0D2(GOZ-WU__^+
-M="0D2(GOZ"'V__^^$"<``$B)[^@T]O__A<!U(+F($P``N@````"^`0```$B)
-M[^C)^O__A<!T%V9FD&:0N`````#K'[@!````9F9FD.L4@T0D$`2+1"00.40D
-M%';FZ4W___](BUPD*$B+;"0P3(MD)#A,BVPD0$R+="1(3(M\)%!(@\18PY"0
-MD)"0D)"X`````,-F9F:09F:09F:0N``````Y/0````!^-TACQTC'P0````!(
-MC01`2,'@`P^W%`AFB18/MU0(`F:)5@(/ME0("(A6"`^V1`@)B$8)N`$```#S
-MPV9F9I!F9I!F9I"X$"L``,-F9F:09F:09F:0N-````##9F9FD&9FD&9FD+@(
-M````PV9F9I!F9I!F9I"^`````$&X`````+D`````#[:4.>`(``"`^O]T2HV!
-M@````&8]@0!W!X/&`>LY9I`/ML)(BY=@"0``2(T$P$C!X`6`O!`5`0```W48
-M08/``4&-0`.#^`9V#H/&`4&X`````.L#@\8!2(/!`4B#^09UGXGPPV9F9I!F
-M9F:09F9FD$B)^4&Z`````$&[`````$&Y@````$`/MO:#Q@%F9F:018G(#[:!
-MX`@``#S_=%!F08'Y@0!W"D&#P@'K/69F9I`/ML!(BY=@"0``2(T$P$C!X`6`
-MO!`5`0```W4908/#`4&-0P.#^`9V$$&#P@%!NP````#K!$&#P@%$.=9T%TB#
-MP0%!@\$!08'YA@```'610;@`````1(G`PV9F9I!F9I#SPV9F9I!F9F:09F:0
-M9F:0QH?+`````,-F9F:09F9FD+C_````2(7_=$2^_____[D`````#[:$.>((
-M```\_W0@#[;`2(N78`D``$B-!,!(P>`%#[:$$!0!``!`.,8/1_!(@\$!2(/Y
-M!'7*0`^VQO/#N`````##9F9FD&9FD&9FD+@`````PV9F9I!F9I!F9I")\,#H
-M!(U(5XU0,#P*#T/1B!>)\(/@#X/X"7X*B?"#X`^#P%?K"(GP@^`/@\`PB$<!
-MPV9F9I!F9F:09F:09F:02(/L$$B)'"1,B60D"$B)^T&)]$R)X`^V].BB____
-M00^V]$B#PP)(B=_HDO___TB+'"1,BV0D"$B#Q!##9F9FD,="!`````#'`@``
-M``"X`````,-F9F:09F:09F:09F:02(M'8$B%P'112,=`0`````"`2$P$2,='
-M8`````!(QT=P`````$C'1V@`````BT<(@_@_?Q-(BU=X2)A(QX3"8`0`````
-M``##2(M7>$B82,>$PF`"````````\\-F9F:02(M'8$B%P'112,=`0`````"`
-M8$S[2,='8`````!(QT=P`````$C'1V@`````BT<(@_@_?Q-(BU=X2)A(QX3"
-M8`0```````##2(M7>$B82,>$PF`"````````\\-F9F:02(/L"$C'QP````#H
-M`````+@`````2(/$",-F9I!F9I!54TB#[#C&!"1MQD0D`?_&1"0"(\9$)`,4
-MQD0D!#K&1"0%[\9$)`86QD0D!Y)(BZ_X"```2(7M2`]$[TB-1"002(G"Q@``
-M2(/``4B)TTB-3"0P2#G(=>S&1"04`;D@````O@X```!(B>_H`````(7`=4*_
-M@!H&`.@`````N2````!(B=J^#P```$B)[^@`````@_@@=1Y(C7,02(GGN0@`
-M``#\\Z8/E\(/DL"Y`0```#C"=!9(Q\<`````N`````#H`````+D`````#[;!
-M2(/$.%M=PV9F9I!F9F:09F9FD$%7059!54%455-(@^QH28G\3(N_\`@``$F!
-MQX@4``!(BP=(A<!T$TB-L```_O](B3=(BW\@Z`````!)BW0D$$B%]G0*28M\
-M)"#H`````$F+="082(7V=`I)BWPD(.@`````2(U,)&5(C50D9DB-="1G00^W
-M?"0\2(U$)%I(B40D.$B-1"1<2(E$)#!(C40D5DB)1"0H2(U$)%A(B40D($B-
-M1"1@2(E$)!A(C40D8DB)1"002(U$)&-(B40D"$B-1"1>2(D$)$R-3"1D3(U$
-M)%3H`````$F+M"0X"0``2(7V="!)C;PD&`D``.@`````28NW.`D``$F-OQ@)
-M``#H`````$F+M"1@"0``2(7V="!)C;PD0`D``.@`````28NW8`D``$F-OT`)
-M``#H`````$F+M"2("0``2(7V="!)C;PD:`D``.@`````28NWB`D``$F-OV@)
-M``#H`````$F+M"0H"P``2(7V="!)C;PD"`L``.@`````28NW*`L``$F-OP@+
-M``#H`````(!\)&<`=$2]`````$V-M"18"P``38VO6`L```^WW4F+M-QX"P``
-M3(GWZ`````!)B[3?>`L``$R)[^@`````@\4!#[9$)&=F.>AWT$F+M"0($```
-M2(7V="!)C;PDZ`\``.@`````28NW"!```$F-O^@/``#H`````$F+M"1`$```
-M2(7V="!)C;PD(!```.@`````28NW0!```$F-OR`0``#H`````$F+M"2P$```
-M2(7V="!)C;PDD!```.@`````28NWL!```$F-OY`0``#H`````$F+M"2P"0``
-M2(7V="!)C;PDD`D``.@`````28NWL`D``$F-OY`)``#H`````$F+M"2("@``
-M2(7V="!)C;PD:`H``.@`````28NWB`H``$F-OV@*``#H`````$F+M"08"@``
-M2(7V="!)C;PD^`D``.@`````28NW&`H``$F-O_@)``#H`````$F+M"1`"@``
-M2(7V="!)C;PD(`H``.@`````28NW0`H``$F-OR`*``#H`````$F+M"38"@``
-M2(7V="!)C;PDN`H``.@`````28NWV`H``$F-O[@*``#H`````$F+M"0`"P``
-M2(7V="!)C;PDX`H``.@`````28NW``L``$F-O^`*``#H`````$F+M"10"P``
-M2(7V="!)C;PD,`L``.@`````28NW4`L``$F-OS`+``#H`````$F+M"28#P``
-M2(7V="!)C;PD>`\``.@`````28NWF`\``$F-OW@/``#H`````$F+M"30#P``
-M2(7V="!)C;PDL`\``.@`````28NWT`\``$F-O[`/``#H`````$F+M"1X$```
-M2(7V="!)C;PD6!```.@`````28NW>!```$F-OU@0``#H`````$F+M"2P"@``
-M2(7V="!)C;PDD`H``.@`````28NWL`H``$F-OY`*``#H`````$F+M"38$```
-M2(7V="])BY0DX!```$F-O"2X$```Z`````!)BY?@$```28NWV!```$F-O[@0
-M``#H`````$F+M"0($0``2(7V="])BY0D$!$``$F-O"3H$```Z`````!)BY<0
-M$0``28NW"!$``$F-O^@0``#H`````$F+M"0X$0``2(7V="])BY0D0!$``$F-
-MO"08$0``Z`````!)BY=`$0``28NW.!$``$F-OQ@1``#H`````$F+M"28$0``
-M2(7V="])BY0DH!$``$F-O"1X$0``Z`````!)BY>@$0``28NWF!$``$F-OW@1
-M``#H`````$F+M"1H$0``2(7V="])BY0D<!$``$F-O"1($0``Z`````!)BY=P
-M$0``28NW:!$``$F-OT@1``#H`````$F+M"3($0``2(7V="])BY0DT!$``$F-
-MO"2H$0``Z`````!)BY?0$0``28NWR!$``$F-OZ@1``#H`````$F+M"3X$0``
-M2(7V="])BY0D`!(``$F-O"38$0``Z`````!)BY<`$@``28NW^!$``$F-O]@1
-M``#H`````$F+M"0H$@``2(7V="])BY0D,!(``$F-O"0($@``Z`````!)BY<P
-M$@``28NW*!(``$F-OP@2``#H`````$B#Q&A;74%<05U!7D%?PV9F9I!F9I!(
-M@^P82(E<)`A,B60D$$F)_$&(="1/0`^VWHG>Z`````!)@<2(%```B=Y,B>?H
-M`````+@!````2(M<)`A,BV0D$$B#Q!C#9F9FD&9FD&9FD%532(/L"$B)_>@`
-M````2(GOZ`````!(C9V(%```2(G?Z`````!(B>_H`````+_0!P``Z`````!(
-MB>_H`````+X!````2(GOZ`````"^`0```$B)W^@`````NX````!FD$B+E?`(
-M``!(8\,/MH0"8`@``#S_="T/ML!(C03`2,'@!4B)QD@#LF`)``#V1DX"=!)F
-MQT9.`0#&1D(=2(GOZ`````"#PP&!^X8```!ULDB+G?`(``!(@<.(%```O0``
-M```/MH0=X`@``#S_=#,/ML!(C03`2,'@!4B)QD@#LV`)``#V1DX"=!AFQT9.
-M`0#&1D(=2(G?Z`````!F9I!F9I!(@\4!2(/]!G6W2(/$"%M=PV9F9I!F9F:0
-M9F9FD&9FD%-(B?OH`````$B+N_`(``!(@<>(%```Z`````!;PV:04TB)^^@`
-M````2(N[\`@``$B!QX@4``#H`````%O#9I!(@^P(Z``````/ML!(@\0(PV9F
-M9I!F9F:09F9FD&9FD$B#[#A(B5PD"$B);"003(ED)!A,B6PD($R)="0H3(E\
-M)#!(B?M!B?1!B=5(BV]@3(MW>$B%[0^$&P$``("_RP`````/A0X!``!,B??H
-M`````$F)QTB%P`^$^@```,9`..'&0#D!183D=`U!@/T!&<#WT(/`!^L+08#]
-M`1G`]]"#P`U!B$<Z0<9')(`/MT4X9D&)1R!)B5\H0<='-`````!)QT=(````
-M`$G'AZ``````````3(G^3(GWZ`````#&@\L````!9L>#R````/0!2(7;=$Y(
-MBU-@2(72=$]F@;O(````E@!U#DB+>E"^(0```.@`````9H.KR`````&_T`<`
-M`.@`````3(GWZ`````!(BU-@2(72=`F`N\L`````=;MF@[O(`````'0:08!_
-M)`!U$TB+0V`/MT!J9HE#6KL`````ZP6[_____TR)_DR)]^@`````ZP6[____
-M_XG82(M<)`A(BVPD$$R+9"083(ML)"!,BW0D*$R+?"0P2(/$.,-F9F:09F9F
-MD&9F9I!F9I!(@^Q(2(E<)!A(B6PD($R)9"0H3(EL)#!,B70D.$R)?"1`2(G]
-M08GU3(MG8$R+=WA-A>0/A'D$``"`O\L`````#X5L!```3(GWZ`````!)B<=(
-MA<`/A%@$``#V10`"#X7\````08#]%'<,00^VQ8T$0,'@`NL7N(G___]!]N5F
-MP>@(P.@$#[;`!?````!!QD<XX4'&1SD!0<9'.AQ!B$<[0<9')(!!#[=$)#AF
-M08E'($F);RA!QT<T`````$G'1T@`````2<>'H`````````!,B?Y,B??H````
-M`,:%RP````%FQX7(````Q`E(A>UT3DB+56!(A=)T4V:!O<@```"6`'4.2(MZ
-M4+XA````Z`````!F@ZW(`````;_0!P``Z`````!,B??H`````$B+56!(A=)T
-M"8"]RP````!UNV:#O<@`````#X15`P``NP````!!@'\D``^$2@,``.E``P``
-M3(GWZ`````!(B40D$$B%P`^$*@,``$F-7UA(BT`02(D$)$'&1S@:0<9'.0A!
-MQD<Z&D'&1SL`0<9'/!!!QD<]`$B+1"0028E'>$'&1R2`00^W1"0X9D&)1R!)
-MB6\H2(M$)!!(BT`028E'2$''1S00````2(M%8$@%[````$F)1U!!QD<P($G'
-MAZ``````````O@````!(B=_H`````$&+5S1(BT0D$$B+<!A(B=_H`````$R)
-M_DR)]^@`````QH7+`````6;'A<@```#Z`$B%[71.2(M58$B%TG1/9H&]R```
-M`)8`=0Y(BWI0OB$```#H`````&:#K<@````!O]`'``#H`````$R)]^@`````
-M2(M58$B%TG0)@+W+`````'6[9H.]R`````!T!T&`?R0`=!=(C70D$$R)]^@`
-M````N______I_0$``$R)_DR)]^@`````3(GWZ`````!)B<=(A<!U'4B-="00
-M3(GWZ`````"[_____^G=`0``9F:09F:02(U86$B+/"1(@\<$2(L4)`^V0@,/
-MM@0'B$($QD<!"L9'`@"X`````$B+%"3&!!``2(/``4B#^`1U[D6$[74&@&<#
-M_.M!00^VU6G28.H``+@?A>M1]^K!^@6`3P,#B='!Z1B(3P2)UL'N$$"(=P6)
-MT,'H"(A'!HA7!XA/"$"(=PF(1PJ(5PM(BT0D$$F)1WA!QD<X%0^V!\#X!_?0
-M@\`108A'.4'&1SH`0<9'.P!!QD<\$$'&1ST`@"<_0<9')(!!#[=$)#AF08E'
-M($F);RA(BT0D$$B+0!!)B4=(0<='-!````!(BT5@2`7L````28E'4$'&1S`@
-M2<>'H`````````"^`````$B)W^@`````08M7-$B+1"002(MP&$B)W^@`````
-M3(G^3(GWZ`````#&A<L````!9L>%R````/H`2(7M=$Y(BU5@2(72=$]F@;W(
-M````E@!U#DB+>E"^(0```.@`````9H.MR`````&_T`<``.@`````3(GWZ```
-M``!(BU5@2(72=`F`O<L`````=;MF@[W(`````'0,NP````!!@'\D`'0%N___
-M__](C70D$$R)]^@`````ZPIF9I!FD+O_____3(G^3(GWZ`````#K!;O_____
-MB=A(BUPD&$B+;"0@3(MD)"A,BVPD,$R+="0X3(M\)$!(@\1(PV9F9I!(@^QH
-M2(E<)#A(B6PD0$R)9"1(3(EL)%!,B70D6$R)?"1@2(G]2(GS28G/08G518G&
-M3(MG8$V%Y`^$M@,``("_RP`````/A:D#``!)BT0D4$B)1"0P2(M7>$B)5"0(
-M9L>'R````!`G2(G7Z`````!(B40D*$B%P`^$=P,``$$/M\6)1"0$9D&#_01V
-M%8G&2,?'`````+@`````Z`````#K%$B+?"0(Z`````!(B40D$$B%P'492(MT
-M)"A(BWPD".@`````N______I0@,``(M4)`3!X@F)5"0D2(M$)`A(B[#P"```
-MQD8_`4B)ZK\%````Z`````!!@$PD3`)(BU5@OB$```!(BWPD,.@`````2(M4
-M)"A(@\)82(E4)!A%A/9T%4B+1"0HQX"4````"@```,9`."CK*$B+5"0HQX*4
-M````$@```,9"."I(BT0D$$B+>!"+5"0D3(G^Z`````!(BT5@]D!H`0^$@0``
-M`$&`_@$9P(/@`H/H>$B+5"0HB$(XQD(Y`$B)V$C!Z#B(0CI(B=A(P>@PB$([
-M2(G82,'H*(A"/$B)V$C!Z""(0CU(B=A(P>@8B$(^2(G82,'H$(A"/TB)V$C!
-MZ`B(0D"(6D'&0D(`QD)#`$2)Z&;!Z`B(0D1$B&I%QD)&`,9"1P#K3T&`_@$9
-MP(/@`H/`*$B+5"0HB$(XQD(Y`$B)V$C!Z!B(0CI(B=A(P>@0B$([2(G82,'H
-M"(A"/(A:/<9"/@!$B>AFP>@(B$(_1(AJ0,9"00!(BWPD*.@`````2(M%8`^W
-M0#A(BU0D*&:)0B#&0B2`2(EJ*$B+5"002(M"$$B+5"0H2(E"2(M$)"2)0C1(
-MBT0D$$B)0GC&0C`@2(M%8$@%[````$B)0E!(QX*@`````````+X`````2(M\
-M)!CH`````$B+1"0HBU`T2(M$)!!(BW`82(M\)!CH`````,:%RP````%(BW0D
-M*$B+?"0(Z`````!(A>T/A)@```!(BU5@2(72#X2+````@+W+``````^$^0``
-M`&:!O<@```"6`'4.2(MZ4+XA````Z`````!F@ZW(`````;_0!P``Z`````!(
-MBWPD".@`````2(M58$B%TG1`@+W+``````^$K@```.NS2(M4)"B`>B0`=2:[
-M`````$6$]G0ABU0D)$B+1"002(MP$$R)_^@`````NP````#K!;O_____2(M4
-M)"A(@WIX`'0O@7HT``@``'<32(G62(/&>$B+?"0(Z`````#K$TB+="0H2(/&
-M>$B+?"0(Z`````!(BW0D*$B+?"0(Z`````!(BT0D"$B+L/`(``#&1C\`2(GJ
-MOP8```#H`````$&`9"1,_>L<N______K%6:#O<@`````#X5&____Z7+___]F
-MD(G82(M<)#A(BVPD0$R+9"1(3(ML)%!,BW0D6$R+?"1@2(/$:,-F9F:09F9F
-MD&9FD$B#[!A(B1PD2(EL)`A,B60D$$B)\TB+1U!,BR!(BVYH#[9&)#P@=$@\
-M('<*A,!T(CP&=Q7K,#PB=#8\(F9F9I!R)(/`@#P!=AVX`````&:0ZV-(BT=`
-MQT`$`````,:%L@````'K"L:%L@````UF9I!(@WMX`'0E@7LT``@``'<02(US
-M>$R)Y^@`````ZPYFD$B-<WA,B>?H`````$B)WDR)Y^@`````2(GO_Y7(````
-MN`$```!(BQPD2(ML)`A,BV0D$$B#Q!C#9F9FD&9F9I!(@^PH2(D<)$B);"0(
-M3(ED)!!,B6PD&$R)="0@2(G[28GU28G42(MO8$B%[74*2(G7_];I/@$``$B#
-MOX@`````=0Y(@[^``````'0/9F9FD$R)YT'_U>D;`0``@+WH``````^%"`$`
-M`(!]2O]F9F:0#X7Z````2(M%8$B%P'0*@'A1``^%YP```$B+?5#V1PP0#X79
-M````3(LW@+V#`````'0-2(GJO@8```#H`````$R)JX@```!,B:.0````#[95
-M2$B)T(/@!DB#^`9U*?;"`71]QD5*!<9%2P0/MI6!````2(MU6$B+?5!(B>GH
-M`````.E_````2(/X!'5Y]L(!='1(BU5@2(72="\/MT).J`)T8X/@_6:)0DY(
-MBT5@9L=`3@$`2(M%8,9`0AU(BW5@3(GWZ`````#K/,9%2@/&14L$2(GN3(GW
-MZ`````#K)Y#&14H%QD5+!F;'A<@``````$B)[DR)]^@`````ZPAFD$R)YT'_
-MU4B+'"1(BVPD"$R+9"003(ML)!A,BW0D($B#Q"C#9F9FD&9FD&9FD&9FD%-(
-MB?M(A?\/A,,```!(BW]XZ`````!(B<)(A<`/A'X```"`N!4!````='6`"P$/
-MMH`5`0``/`)U.DB#>W``=1D/MH/,````@^`#B$,"#[:"%`$``(A#`>MW#[:#
-MS0```(A#`DB+0W`/MH`4`0``B$,!ZUT\`W59#[:#S````(/@`\'@`@*#S0``
-M`(A#`DB+0W`/MH`4`0``B$,!ZS-F9I!(BT-P2(7`=0M(BT-H2(7`=0[K'`^V
-M@!0!``"(0P'K$`^V@,(```"(0P%F9I!F9I!;PV9F9I!F9F:09F:09F:055-(
-M@^P(2(G[2(7_='>]``````^VA!U@"```//]T00^VT$B-!%)(C02"2,'@!4B)
-MPD@#DS@)``!T)HM"2"4`__\`/0``_P!U%_9"2P1T$4B+>D!(A?]T".@`````
-M9F:02(/%`4B!_8````!UIDB+@_`(``!(.=AU#$B-N(@4``#H`````$B#Q`A;
-M7<-F9F:055-(@^P(2(G[2(VOB!0``.@`````2(E#*$B)12A(B9OP"```2(F=
-M\`@``(N#"`D``(F%"`D``,:#9A0```'&A684```!2(G?Z`````!(B=_H````
-M`$B)[^@`````2(G?Z`````"$P'1G2(GOZ`````"$P'1;2(G?Z`````"_T`<`
-M`.@`````2(G?Z`````#'@Y`!``#H`P``2,>#H`$```````!(B9NH`0``2(VS
-MD`$``$B+>RCH`````+X`````2(G?Z`````"X`0```.L&D+@`````2(/$"%M=
-MPV9F9I!32(G[Z`````!(@<.(%```2(G?Z`````"X`0```%O#D$%7059!54%4
-M55-(@^P82(ET)`A(B10D@ST```````^%;P$``,<%``````$```!$BST`````
-MQT0D%`````!)Q\4`````2,?#`````$G'Q@````#I=@(```^WA@````#!X!!"
-M#[<4+@G0.<4/A?$```!!N`````"_`````&9FD&:09H,\'P!U7TECT$B)T4C!
-MX05*BP0N2(D$&4*+1"X(B409"`^V@0````!(P>(#2(T\`@^V1"03B$2[#0^V
-M@0````!(C3P"#[9$)!*(1+L.#[:!`````$@!PL9$DP\`@($``````>MT#[:/
-M``````^VP;H`````0O<T-H72=$L/ML%)8]!(C0S5`````$B-/`$/MD0D$XA$
-MNPU(P>(%#[:"`````$B-/`$/MD0D$HA$NPX/MH(`````2`'!QD2+#P"`@@``
-M```!ZQ)!@\`!2(/'($&#^`0/A2;___^#A@`````!08/"`4B#QAA%.?H/A>7^
-M__]!@\0!08/\(`^%%P$``(-$)!0!@7PD%/\````/A3H!``!(@WPD"`!T"$B+
-M5"0(Q@(`BS4`````O0````"%]GXUN0````"]`````+H``````ZH`````2(-\
-M)`@`=`V+@@````!(BUPD"``#@\$!2(/"&#GQ==I(@SPD``^$[````$&Y````
-M`$&Z`````$G'Q`````!F0X,\(@`/A,T```!!#[:2`````(32=&=!N`````!)
-M8\%,C1S%``````^VPH/H`4B-6`%+C00#2(TTA0````!(BSPDN00```#\\Z8/
-ME\(/DL`XPG4A2(-\)`@`=`]!#[:"`````$B+5"0(B`)!#[:J`````.L)28/`
-M`4DYV'6T08/!`4F#PB!!@_D$=$SI;O___T2(9"02N0````"Z`````$2)YHM\
-M)!3H`````(G%0;H`````O@````!%A?\/CX_]___II?[__P^V1"04B$0D$T&\
-M`````.NY0`^VQ4B#Q!A;74%<05U!7D%?PV9F9I!F9F:09F9FD&9FD$B#[!A(
-MB1PD2(EL)`A,B60D$(GU3(MG>$B+7V#V!P%T7TB+>UA(A?]T$$`/MM8/MK.!
-M````Z`````!(B[L@`0``2(7_=!!`#[;5#[:S#0$``.@`````3(GGZ`````!(
-MA<!T+8"X%0$```!T)$`/MM5(BW-`3(GGZ`````#K$F:00`^VUDB+<T!,B>?H
-M`````$B+'"1(BVPD"$R+9"002(/$&,-F9F:09F:09F:09F:02(/L2$B)7"08
-M2(EL)"!,B60D*$R);"0P3(ET)#A,B7PD0$B)^T&)]$B+;V!,BV]X2(7M#X0^
-M`P``@+_+``````^%,0,``/8'`@^%*`,```^VA9@!``"$P'0+0#CP=3J0Z1(#
-M```/M@^#X0$/MLD/ME<"#[9W`40/MH4/`0``2,?'`````+@`````Z`````"[
-M_____^GC`@``3(GOZ`````!)B<=(A<`/A,H"``!(BU5`#[:"S````(T$@`^V
-M4@(!T$B8#[:(`````$$/ME4Z00^V=3E%#[;$2,?'`````+@`````Z`````!!
-MQD<XX4'&1SD!08#\`@^5P(/`&D&(1SI!QD<D@`^W13AF08E'($F)7RA!QT<T
-M`````$G'1T@`````2<>'H`````````!,B?Y,B>_H`````,:#RP````%FQX/(
-M````]`%(A=MT3DB+4V!(A=)T4V:!N\@```"6`'4.2(MZ4+XA````Z`````!F
-M@ZO(`````;_0!P``Z`````!,B>_H`````$B+4V!(A=)T"8"[RP````!UNV:#
-MN\@`````#X2[`0``08!_)``/A;`!``!(BT-@2(E$)!!(BT!03(LP3(GWZ```
-M``!(B<5(A<!U%DB+1"00QH#I`````;L`````Z7\!``!,B??H`````$F)Q$B%
-MP'4E2(M4)!#&@ND````!2(GN3(GWZ`````"[`````.E.`0``9F9FD$B-15A(
-MB40D",9%..'&13D!QD4Z`TB+5"00#[=".&:)12#&A9@````/2(E=*,=%-``"
-M``!)BU0D$$B)54BX`````,8$$`!(@\`!2#T``@``=?!,B65X2,>%H```````
-M``"^`````$B+?"0(Z`````"+531)BW0D&$B+?"0(Z`````!(B>Y,B??H````
-M`,:#RP````%FQX/(````^@!(A=MT3DB+4V!(A=)T3V:!N\@```"6`'4.2(MZ
-M4+XA````Z`````!F@ZO(`````;_0!P``Z`````!,B??H`````$B+4V!(A=)T
-M"8"[RP````!UNV:#N\@`````=":`?20`=2!(BW5(2(M\)!#H`````$B+5"00
-M#[:"F`$``(B#SP```$B#?7@`=`Q(C75X3(GWZ`````!(B>Y,B??H`````+L`
-M````ZP6[_____TR)_DR)[^@`````ZP6[_____XG82(M<)!A(BVPD($R+9"0H
-M3(ML)#!,BW0D.$R+?"1`2(/$2,-F9F:09F9FD&9F9I!F9I!(@^PH2(E<)`A(
-MB6PD$$R)9"083(EL)"!(B?N`/@EW$`^V!O\DQ0````!F9I!F9I"X_____^DF
-M`0``2(M&"$B+D/@(``!(A=)(#T302(NZ\`@``,:'9Q0```'H`````+@`````
-MZ?<````/ME8(O@````#HF>C__^GD````#[96"+X!````Z(;H___IT0````^V
-M=@CH`````.G#````1`^V;@A,BV=X2(MO8+C_____]D=8"`^$IP```$F+M"3P
-M"```2(GZOP4```#H`````(!-3`)(BWU02(GJOB$```#H`````("]@P````!T
-M'V9F9I"_T`<``.@`````3(GGZ`````"`O8,`````=>5%A.UT#&:#2UH09H--
-M:A#K"F:#8UKO9H-E:N])B[0D\`@``$B)VK\&````Z`````"`94S]N`````#K
-M&@^V=@CH`````)#K#@^V=@CH`````+@`````2(M<)`A(BVPD$$R+9"083(ML
-M)"!(@\0HPV9F9I!F9I!(@^P82(D<)$B);"0(3(ED)!!(B?U,BV=X28N$)/`(
-M``"`>#\`=6%(BY^`````#[:'S````(T$@`^V5P(!T$B8#[:(`````$$/ME0D
-M.D$/MG0D.40/MH?/````2,?'`````+@`````Z`````!(QX6``````````(M5
-M"$B+O9````!(B>[_T^L]2(V?F````$F+?"0H2(G>Z`````#'A9@```#T`0``
-M2,>%J`````````!(B:VP````28M\)"A(B=[H`````$B+'"1(BVPD"$R+9"00
-M2(/$&,-F9F:09F9FD$%7059!54%455-(@^P(2(D\)$F)]@^WTDB-!%)(C02"
-M2,'@!4F)Q4P#KS@)``!,BX?P"```28'`B!0``$R);F!)B75`28-]6`!U-4F#
-M?6``=2Y(BP0D#[9X0T"$_P^$/`0``$F+=5"Y`````$@[L,@2```/A/P#``#I
-M%`0``&:008`.`4F+16!)B49P28M%6$F)1FA(BQ0D#[9Z0T"$_W1.28MU4+D`
-M````2#NRR!(``'0;ZRT/ML%(C11`2(T4D$B+!"1(.;30R!(``'492(L4)`^V
-M0D&-!(%!B(;,````ZPVY`````(/!`4`X^77&2(L$)$B+B/`(```/MH'@"```
-MO@`````\_W0I28M56$B%TG0;#[;`2&G`R`\``$@#@8@)``"^`````$@YPG0O
-MO@$````/MH'A"```//]T*TF+55A(A=)T'P^VP$AIP,@/``!(`X&("0``2#G"
-M=0E!B'8!Z?<```"#Q@&Z`````&:0#[:$"N((```\_W0G#[;`2(T$P$C!X`5(
-M`X%@"0``23M%8'4,08AV`>G`````9F:0@\8!2(/"`4B#^@1UPXGQ00^V@.`(
-M```\_W0F28M56$B%TG4%C7$!ZQ@/ML!(:<#(#P``20.`B`D``$@YPG7EZRM!
-M#[:`X0@``#S_="A)BU582(72=!P/ML!(:<#(#P``20.`B`D``$@YPG4&08AV
-M`>M+@\8!N@````!F9I!F9I!"#[:$`N((```\_W0F#[;`2(T$P$C!X`5)`X!@
-M"0``23M%8'4+08AV`>L29F:09I"#Q@%(@\(!2(/Z!'7#2(L4)(!Z40%U/4F+
-M?5A(A?]T$D$/MK6!````N@````#H`````$F+O2`!``!(A?\/A+P!``!!#[:U
-M#0$``+H`````Z`````!)@[T@`0````^$G`$``$F+;5B`?5@`=%E!O`````!(
-MC5U(28G?2(G?Z`````!(C4CP2(M54$B)15!(B5D02(E1&$B)`H"Y#P$``/]U
-M$(!Y20!U"DB#N2`!````=0I!@\0!1#AE6'>[1#AE6`^%D0```$$/MH4/`0``
-M08A&`H!]6``/A),!``"[`````$R-94A,B>?H`````$B-2/!(BU502(E%4$R)
-M81!(B5$82(D"2(M!0$B%P'0\#[:1#P$``#A0`G0P2(.X@`````!U)DB#N(@`
-M````=1R(4`(/MU$X2(L$)$B+L/`(``"_!P```.@`````@\,!.%U8#X8:`0``
-MZXY!#[:%@0```$&(1@)!QH4/`0``_X!]6``/A/H```"[`````&9F9I!F9I!,
-MB?_H`````$B-2/!(BU502(E%4$R)>1!(B5$82(D"@+D/`0``_W1,QH$/`0``
-M_TB+04!(A<!T/`^VD8$````X4`)T,$B#N(``````=29(@[B(`````'4<B%`"
-M#[=1.$B+!"1(B[#P"```OP<```#H`````(/#`3A=6'9RZX)!#[:%@0```$&(
-M1@+K8@^VP4B-%$!(C1202(L$)$@YM-#($@``=2)(BQ0D#[9"08T$@4&(1@%!
-MB(;,````.$I#=13K#;D`````@\$!0#CY=;U!QD8!_T'&1@(`08.]D`$```!T
-M"T&+A90!``!!B$8"28U.($F-E9@```!)BX68````28E&($B+0@A(B4$(2(M"
-M$$B)01!(BT(82(E!&$B+0B!(B4$@28U.#$F-E80```!)BX6$````28E&#$B+
-M0@A(B4$(BT(0B4$028N%P````$F)1DA!#[=%:&9!B49800^W16IF08E&6DF+
-M17A)B49000^VA8(```!!B$9<00^VA9@!``!!B(;/````0?9%3`1U"4B+/"3H
-M`````$$/ME5(2(G0@^`&2(/X!G4+]L(!=09!@`X"ZP1!@";]00^V54S0ZH/B
-M!$$/M@:#X/L)T$&(!D$/MD8!08B&S@```$$/MD8"08B&S0```$R)]^@`````
-M28MU0+H`````2(L\).@`````3(GWZ$;Y__](@\0(6UU!7$%=05Y!7\-F9F:0
-M9F:02(/L&$B)7"0(2(EL)!!(B?U(BY_P"```Z`````"`?5$!=2U(C;N(%```
-M@']1`71;@+UX%````'47O@````#H`````("%>!0```%F9I!F9I!(C9V0`0``
-M2(M]*$B)WN@`````QX60`0``Z`,``$C'A:`!````````2(FMJ`$``$B+?2A(
-MB=[H`````$B+7"0(2(ML)!!(@\08PV9FD&9FD$%455-(@^PP28G[2(G32(MN
-M*$R+9C!$#[95"TB+A_`(``!(B[#P"```OP````!!N`````"Y`````&9F9I!F
-M9I`/MI0QX`@``(#Z_W1*C8&`````9CV!`'<'@\<!ZSEFD`^VPDB+EF`)``!(
-MC03`2,'@!8"\$!4!```#=1A!@\`!08U``X/X!G8.@\<!0;@`````ZP.#QP%(
-M@\$!2(/Y!G6?08GY2(NV\`@``$B!QH@4``"Q``^VE#'@"```@/K_=$^-@8``
-M``!F/8$`=P6#QP'K/@^VPDB+EF`)``!(C03`2,'@!8"\$!4!```#=1A!@\`!
-M08U``X/X!G85@\<!0;@`````ZPJ#QP%F9F:09F:02(/!`4B#^09UFD$Y^@^-
-M[P<``$4YT0^>P,<#`````#S_#X34!P``#[;X2&G_B!0``$D#N_`(``#H````
-M`$B)QTB%P`^$L@<```^V@!4!```\`@^%Q0$``,<#!`````^V=0=(BQ</MT=`
-MN0````"`O`)@"```_P^$F0$``$"`_B,/AX`!``!`#[;&_R3%`````$''!"1%
-M4P,1N`$```!FD.EM`0``2(U,)"RZ$`,``+X!````Z`````"$P`^$10$``(M$
-M)"R%P`^$0`$``"7_`P``:<`0)P``C8@0EJ__NG.(JTR)R/?BB<@IT-'H`<+!
-MZ@=!B10DN`$```#I$@$``$B-3"0LN@@#``"^`0```.@`````A,`/A.H```"+
-M1"0LA<`/A.4````E_P,``&G`Z`,``(V(R.7W_[K+:RBOB<CWXHG(*=#1Z`'"
-MP>H$08D4)+@!````Z;<```!(C4PD++H(`P``O@$```#H`````(3`#X2/````
-MBT0D+(7`#X2*````P>@0)?\#``!IP.@#``"-B,CE]_^ZRVLHKXG(]^*)R"G0
-MT>@!PL'J!$&)%"2X`0```.M<2(U,)"RZ#`,``+X!````Z`````"$P'0XBT0D
-M+(7`=#<E_P,``&G`Z`,``(V(R.7W_[K+:RBOB<CWXHG(*=#1Z`'"P>H$08D4
-M)+@!````ZPRX`````.L%N`$````/ML@/ML'I\`4``#P##X76!0``QP,$````
-M1`^V30=(QP0D`````$C'1"0(`````$C'1"00`````$C'1"08`````$B+%P^V
-M@O$```"$P`^$H0```$&X`````$F)XP^VP(/H`4R-4`&^`````+@!````B<=$
-MB<'3YP^VA!;B"```//]T*`^VP$B-!,!(P>`%2(G!2`.*8`D``$B+@8@```!(
-MBT`@#[9`"CGX=!!(@\8!2(/^!`^$)@4``.N\2(7)#X0;!0``#[=!0("\`F`(
-M``#_#X0)!0``@+D5`0```P^%_`0``$N)#,-)@\`!33G0#X5R____08#Y50^'
-MUP0``$$/ML'_),4`````0<<$)$`#`Q&X`0```.F_!```2(U,)"Q!C4$!@^`#
-M2(L\Q+HT`P``O@$```#H`````(3`#X23!```#[=4)"R)5"0L@?K__P``=1)!
-MQP0D_____[@!````Z74$``"XP.'D`(G1N@````#W\4&)!"2X`0```.E9!```
-M2(U,)"Q(BWPD"+H0`P``O@$```#H`````(3`#X0S!```BT0D+"7_`P``:<`0
-M)P``C8@0EJ__NG.(JTR)R/?BB<@IT-'H`<+!Z@=!B10DN`$```#I`00``$B-
-M3"0L2(M\)`BZ"`,``+X!````Z`````"$P`^$VP,``(M$)"PE_P,``&G`Z`,`
-M`(V(R.7W_[K+:RBOB<CWXHG(*=#1Z`'"P>H$08D4)+@!````Z:D#``!(C4PD
-M+$B+?"0(N@@#``"^`0```.@`````A,`/A(,#```/MT0D+B7_`P``:<#H`P``
-MC8C(Y??_NLMK**^)R/?BB<@IT-'H`<+!Z@1!B10DN`$```#I4`,``$B-3"0L
-M2(M\)`BZ#`,``+X!````Z`````"$P`^$*@,``(M$)"PE_P,``&G`Z`,``(V(
-MR.7W_[K+:RBOB<CWXHG(*=#1Z`'"P>H$08D4)+@!````Z?@"``!(C4PD+$B+
-M/"2Z%`,``+X!````Z`````"$P`^$TP(``(M4)"R!XO\#``!(:=(ZN`$`2('"
-MXTH#`$C!Z@5(N$-XM''$6GP*2/?B2,'J!T&)%"2X`0```.F=`@``2(U,)"Q(
-MBWPD"+H4`P``O@$```#H`````(3`#X1W`@``BU0D+('B_P,``$AITCJX`0!(
-M@<+C2@,`2,'J!$BXA?!HXXBU^!1(]^)(P>H(08D4)+@!````Z4$"``!(C4PD
-M+$B+?"00NA0#``"^`0```.@`````A,`/A!L"``"+5"0L@>+_`P``2&G2YA-`
-M`DB!P@W_3@1(N+U">N75E+_62/?B2,'J%T&)%"2X`0```.GI`0``2(U,)"Q(
-MBWPD&+H4`P``O@$```#H`````(3`#X3#`0``BU0D+('B_P,``$AITJY%X0!(
-M@<(I4J\!2+C;-+;7@MX;0TCWXDC!ZA)!B10DN`$```#ID0$``$B-3"0L2(M\
-M)`BZL`,``+X!````Z`````"$P`^$:P$``(M$)"S!Z`^#X`%!B00DN`$```#I
-M6`$``(!]"`!T$4B+1"0(@:`8`0``__?__^L/2(M$)`B!B!@!````"```2(M\
-M)`CH`````+@!````Z1X!``"`?0@`=!%(BT0D"(&@&`$``/_O___K#TB+1"0(
-M@8@8`0```!```$B+?"0(Z`````"X`0```.GD````@'T(`'012(M$)`B!H!@!
-M``#_W___ZP](BT0D"(&(&`$````@``!(BWPD".@`````N`$```#IJ@```(!]
-M"`!T$4B+1"0(@:`8`0``_[___^L/2(M$)`B!B!@!````0```2(M\)`CH````
-M`+@!````ZW.`?0@`=!%(BT0D"(&@&`$``/___O_K#TB+1"0(@8@8`0`````!
-M`$B+?"0(Z`````"X`0```.L\@'T(`'012(M$)`B!H!@!``#___W_ZP](BT0D
-M"(&(&`$``````@!(BWPD".@`````N`$```#K!;@`````#[;`ZP6X``````^V
-MP.L2N`````#K"\<#`````+@`````2(/$,%M=05S#9F9FD&9FD&9FD$%7059!
-M54%455-(@^PX28G\B?!(B=-)B<U!B?9!P>X808GW0<'O$`^VU(A4)!!`B'0D
-M#TB-JX@4``"X`````)#&!!@`2(/``4@]$"L``'7P3(EK((L%`````(A#0(/`
-M`8D%`````$2(<SM$B'LZ#[9$)!"(0SD/ME0D#XA3.,9#00!!#[<$)&:)0S!!
-M#[=$)`)FB4,R08M$)`2)0S1(C9,0*0``2(F3@!0``$R);2`/MD-`B$5`1(AU
-M.T2(?3H/MD0D$(A%.0^V1"0/B$4XQD5!`4$/MP0D9HE%,$$/MT0D`F:)13)!
-MBT0D!(E%-$B)E8`4```/MT,R9CTD)P^$%`$``&8])"</AX0```!F/40A#X0`
-M`0``9CU$(7=$9CT@(0^$\````&8]("%W#V8]4`</A?0```#IVP```&8](B&0
-M#X30````9CU`(69FD&9FD`^%U````.F[````9F:09I!F/1`G#X+`````9CT1
-M)V:0#X:@````9BT@)V:#^`)FD`^'I````.F+````9F:09I!F/8`G#X1\````
-M9CV`)V:0=RYF/4`G=&YF/4`G9F9FD'<(9CTP)W5RZUQF/40G9I!T5&8]8"=U
-M8NM,9F:09F:09CV`<G1`9CV`<F9FD&9FD'<(9CV")W5"ZRQF/8"19I!T#F8]
-M@)1U,NL<9F:09F:09L=#/("1QD,^!&;'13R`D<9%/@3K%&;'0SR`E,9#/@1F
-MQT4\@)3&13X$00^V1"0(B$-"00^V1"0(B$5"N0``!`"Z`````+X"````3(GO
-MZ`````!(B0.Y`"```+H`````O@````!,B>_H`````$B)P4B)0Q!(BP-(A<`/
-MA.4!``!(A<D/A-P!``!(C9```@$`2(E3"$B-@````@!(B0-(!0!```!(B44`
-M2(E5"$B)31!$BP4`````187`?F>^`````+D`````2,?'``````^W!#EF03L$
-M)'4_#[>!`````&9!.T0D`G4PBY$`````@\(!B9$`````1(N)`````$6%R705
-M1#G*=A")T+H`````0??QB9$`````@\8!2(/!&$0YQG6J2(M#"$@MX'T``,<`
-M`?`#`$B+0PA(+=A]``#'``$``.A(BWL@OG@```#H`````(G")0!P```]`"``
-M`'84@.:/@,X@2(M[(+YX````Z`````!$B'0D(T2(?"0B#[94)!"(5"0A#[9$
-M)`^(1"0@O0````!!N0````!)Q\0`````3(UL)"!F0X,\(0`/A*(```!!@+D`
-M``````^$A````$&X`````$ACQ4R-%,4`````38GK2XT$`DB--(4`````N00`
-M``#\3(G?\Z8/E\(/DL`XPG4[00^V@0````"#P`%!B($`````00^VD0````"$
-MTG0=.-!V&0^VP`^VRKH`````9O?Q08B1`````&9F9I!!C5`!28/``4$/MH$`
-M````.=!_D(/%`4F#P2"#_00/A5+____'@P@)```!````N`$```#K!;@`````
-M2(/$.%M=05Q!74%>05_#9F9FD&9FD$%455-(B?M(B?5(BW]X#[8#@^`!1`^V
-MX+@`````9F:0Q@0H`$B#P`%(@_@H=?)(B[>`%```2(GRL`!F9I!F9I#&!!``
-M2(/``4@]``(``'7P2(U.-KH`````9F9FD&9FD`^V1%,AB`11#[9$4R"(1%$!
-M2(/"`4B#^A1UY4B-3A2R``^V1%,-B`11#[9$4PR(1%$!2(/"`4B#^@IUY4B-
-M3BZR``^V1%-)B`11#[9$4TB(1%$!2(/"`4B#^@1UY4B)=1A(BT-02(/``4B)
-M10!(@WM@`'5!]@,!=#Q(BT-H2(7_#Y7"2(7`=!*$TG0.#[9`6X"\!V`(``#_
-M=1M(BT-PA-)T-TB%P'0R#[=`0("\!V`(``#_="0/MH/,````C02`#[93`@'0
-M2)@/MH``````B$4,0;P`````ZR#H`````$B%P'02@+@5`0```G4)#[9#`8A%
-M#.L$QD4,_\9%#0#&10X!QD42$,9%$1!$B>"-%`"^_?___T`B=0H)UD"(=0K!
-MX`4/MDT(@^'?"<&(30@/MT-82,'H!X/@`<'@!H/AOPG!B$T(#[=#6$C!Z`*#
-MX`$/ME4)@^+^"<*(50D/MT-:2,'H`\'@!X/A?PG!B$T(#[=#6DC1Z(/@`0'`
-M@^+]"<*(50D/MT-82,'H`X/@`<'@!H/BOPG"B%4)#[=#6DC!Z`3!X`>#XG\)
-MPHA5"8/)$(A-"`^V`]#H@^`!@^;^"<9`B'4*#[8#@^`$@^;["<9`B'4*9L=%
-M%``0#[:#SP```(A%#P^V@\P```"(12!;74%<PY!!5D%505154T&)]4&)UDB)
-MRTR)Q4B%R707N`````!FD,8$&`!(@\`!2#VL````=?!(A>UT&;@`````9F:0
-M9F:0Q@0H`$B#P`%(@_@H=?),BZ?P"```00^V]4R)Y^@`````B<)FA<!T#@^W
-MP$&`O`1@"```_W5(38ND)/`(``!)@<2(%```28N\)/`(``#H`````$$IQ4$/
-MMO5,B>?H`````(G"9H7`#X1/`P``#[?`08"\!&`(``#_#X0]`P``#[?"00^V
-MA`1@"```9H'Z@0`/AU("``!)BXPDB`D```^WP$AIP,@/``!(C30!2(7;#X36
-M````2(M6$$B%TG1U00^VA"3@"```//]T&`^VP$AIP,@/``!(C00!OX````!(
-M.<)T)4$/MH0DX0@``#S_=!P/ML!(:<#(#P``2(T$`4@YPG4)OX$```!`B'L"
-M@'Y:`'0PN@`````/ML(/MDP&<+@!````T^`)0R"#P@$X5EIV$>ODQD,"_TB+
-M1@@/MD`-B4,@Q@,!#[9&68A#`4B+1GA(B4,$2(N&B````$B)0PQ(BX:0````
-M2(E#%(N&H````(E#'$2):R0/MH;`````B4,HN`````#I-@(``$B%[0^$*`(`
-M`$6%]@^('P(```^VAL````!!.<8/C0\"``!)8\9(C01`2,'@!$@!\$B-D,``
-M```/MDH(B$T`#[92"8A5`4B+@-`````/M@"#X`^(10*`^0-T+H#Y`W<.@/D"
-M#X6I````Z:L```"`^01F9I!F9I!T0(#Y$@^%D````&9FD&:0ZU])8\9(C01`
-M2,'@!$B+E`;0````#[9"`8/@!P^VP,'@"`^V4@(!T(T$@`'`B44$ZV!)8\9(
-MC01`2,'@!$B+A`;0````#[9``H3`=0G'100`````ZSP/ML"#Z!2)103K,4EC
-MQDB-!$!(P>`$2(N4!M`````/MD("P>`(#[92`P'0C02``<")103K!\=%!```
-M``!(C4T(26/&2(T$0$C!X`1(C80&T````$B-4`A(BT`(2(E%"$B+0@A(B4$(
-M2(M"$$B)01!(BT(82(E!&+@`````Z=D````/M\!(C03`2,'@!4B)Q4D#K"1@
-M"0``QD,"_\8#`DF+E"1@"0``#[9$$#N(0P%(BX6(````#[9`#8E#(`^VA14!
-M```\`G4KQT,$2%!4`,=##%)O8VO'0Q!E=%-TQT,4;W(@``^W=3Y(C7L7Z%K"
-M___K1SP#=2'&0P$0QT,@`0```,=#!$A05`#'0PQ%2C,T9L=#$#``ZR+&0P1V
-M#[=U/$B->P7H(L+__\9##&0/MW4^2(U[#>@1PO__QD,<<@^V=3E(C7L=Z,#!
-M__]$B6LDN`````#K!;C_____6UU!7$%=05[#9F9FD&9FD$%505154T&)]4B)
-MT[@`````Q@08`$B#P`%(/2@-``!U\$B+K_`(``!!#[;U2(GOZ`````")PF:%
-MP'0-#[?`@+P%8`@``/]U14B+K?`(``!(@<6(%```2(N]\`@``.@`````02G%
-M00^V]4B)[^@`````B<)FA<`/A)$#```/M\"`O`5@"```_P^$@`,```^WP@^V
-MA`5@"```9H'Z@0`/AXT"``!(BXV("0``#[?`2&G`R`\``$R-!`%)BU`02(72
-M='0/MH7@"```//]T&`^VP$AIP,@/``!(C00!OH````!(.<)T(P^VA>$(```\
-M_W0<#[;`2&G`R`\``$B-!`%(.<)U";Z!````0(AS`D&`>%H`=#*Z``````^V
-MPD$/MDP`<+@!````T^`)0R"#P@%!.%!:=A'KXL9#`O])BT`(#[9`#8E#(,8#
-M`4$/MD!9B$,!28M`>$B)0P1)BX"(````2(E##$F+@)````!(B4,408N`H```
-M`(E#'$2):R1!@+C```````^$BP(``$&Y`````$$/MOE(8\=(C0R`2(T,RTB-
-M!$!(P>`$3`'`2(V0P`````^V<@A`B+&H````#[92"8B1J0```$B+@-`````/
-MM@"#X`^(@:H```!`@/X#=#1`@/X#=Q%`@/X"#X73````9I#IW@```$"`_@1F
-M9F:09F:0=$M`@/X2#X6U````9F9FD.M]2&//2(T$24C!X`1)BY0`T````$B-
-M#(D/MD(!@^`'#[;`P>`(#[92`@'0C02``<")A,NL````Z88```!(8]=(C012
-M2,'@!$F+A`#0````#[9``H3`=1%(C022QX3#K`````````#K6DACUTB-%)(/
-MML"#Z!2)A-.L````ZT1(8\](C01)2,'@!$F+E`#0````2(T,B0^V0@+!X`@/
-MME(#`="-!(`!P(F$RZP```#K$DACQTB-!(#'A,.L`````````$ACQTB-%(!(
-MC933H````$B-<A!(C01`2,'@!$F-A`#0````2(U("$B+0`A(B4(02(M!"$B)
-M1@A(BT$02(E&$$B+01A(B48808/!`44XB,`````/AND```#I7_[__P^WP$B-
-M!,!(P>`%28G$3`.E8`D``,9#`O_&`P)(BY5@"0``#[9$$#N(0P%)BX0DB```
-M``^V0`V)0R!!#[:$)!4!```\`G4MQT,$2%!4`,=##%)O8VO'0Q!E=%-TQT,4
-M;W(@`$$/MW0D/DB->Q?H/K[__^M+/`-U(<9#`1#'0R`!````QT,$2%!4`,=#
-M#$5*,S1FQT,0,`#K)L9#!'9!#[=T)#Q(C7L%Z`2^___&0PQD00^W="0^2(U[
-M#>CQO?__QD,<<D$/MG0D.4B->QWHGKW__T2):R2X`````.L,N/_____K!;@`
-M````6UU!7$%=PT%455-!B?1(B=.X`````)#&!!@`2(/``4@]I`P``'7P2(NO
-M\`@``$$/MO1(B>_H`````(G"9H7`=`T/M\"`O`5@"```_W5'2(NM\`@``$B!
-MQ8@4``!(B[WP"```Z`````!$B>8IQD`/MO9(B>_H`````(G"9H7`#X1G`P``
-M#[?`@+P%8`@``/\/A%8#```/M\(/MH0%8`@``&:!^H$`#X=G`@``2(N-B`D`
-M``^WP$AIP,@/``!,C00!28M0$$B%TG1T#[:%X`@``#S_=!@/ML!(:<#(#P``
-M2(T$`;Z`````2#G"=",/MH7A"```//]T'`^VP$AIP,@/``!(C00!2#G"=0F^
-M@0```$"(<P)!@'A:`'0RN@`````/ML)!#[9,`'"X`0```-/@"4,@@\(!03A0
-M6G81Z^+&0P+_28M`"`^V0`V)0R#&`P%!#[9`68A#`4F+0'A(B4,$28N`B```
-M`$B)0PQ)BX"0````2(E#%$&+@*````")0QQ!@+C```````^$90(``$&Y````
-M`$$/MOE(8\=(C0R`2(T,RTB-!$!(P>`$3`'`2(V0P`````^V<@A`B'$D#[92
-M"8A1)4B+@-`````/M@"#X`^(029`@/X#=#!`@/X#=P]`@/X"#X7`````Z<H`
-M``!`@/X$9F:09I!T14"`_A(/A:8```!F9F:0ZW%(8\](C01)2,'@!$F+E`#0
-M````2(T,B0^V0@&#X`</ML#!X`@/ME("`="-!(`!P(E$RRCK>DACUTB-!%)(
-MP>`$28N$`-`````/MD`"A,!U#DB-!)+'1,,H`````.M12&/72(T4D@^VP(/H
-M%(E$TRCK/DACSTB-!$E(P>`$28N4`-````!(C0R)#[9"`L'@"`^V4@,!T(T$
-M@`'`B43+*.L/2&/'2(T$@,=$PR@`````2&/'2(T4@$B-5-,@2(UR#$B-!$!(
-MP>`$28V$`-````!(C4@(2(M`"$B)0@Q(BT$(2(E&"$B+01!(B4802(M!&$B)
-M1AA!@\$!13B(P`````^&Y0```.F!_O__#[?`2(T$P$C!X`5)B<1,`Z5@"0``
-MQD,"_\8#`DB+E6`)```/MD00.XA#`4F+A"2(````#[9`#8E#($$/MH0D%0$`
-M`#P"=2W'0P1(4%0`QT,,4F]C:\=#$&5T4W3'0Q1O<B``00^W="0^2(U[%^A#
-MNO__ZTL\`W4AQD,!$,=#(`$```#'0P1(4%0`QT,,14HS-&;'0Q`P`.LFQD,$
-M=D$/MW0D/$B->P7H";K__\9##&1!#[=T)#Y(C7L-Z/:Y___&0QQR00^V="0Y
-M2(U['>BCN?__N`````#K#+C_____ZP6X`````%M=05S#9F9FD&9F9I!F9I!!
-M5%5308GT2(G3N`````"0Q@08`$B#P`%(/0`!``!U\$B+K_`(``!!#[;T2(GO
-MZ`````")PF:%P'0-#[?`@+P%8`@``/]U1TB+K?`(``!(@<6(%```2(N]\`@`
-M`.@`````1(GF*<9`#[;V2(GOZ`````")PF:%P`^$V0$```^WP("\!6`(``#_
-M#X3(`0``#[?"#[:$!6`(``!F@?J!``^'V0```$B+C8@)```/M\!(:<#(#P``
-M2(TT`4B+5A!(A=)T<0^VA>`(```\_W08#[;`2&G`R`\``$B-!`&_@````$@Y
-MPG0C#[:%X0@``#S_=!P/ML!(:<#(#P``2(T$`4@YPG4)OX$```!`B'L"@'Y:
-M`'0PN@`````/ML(/MDP&<+@!````T^`)0R"#P@$X5EIV$>ODQD,"_TB+1@@/
-MMD`-B4,@Q@,!#[9&68A#`4B+1GA(B4,$2(N&B````$B)0PQ(BX:0````2(E#
-M%(N&H````(E#'+@`````Z=X````/M\!(C03`2,'@!4F)Q$P#I6`)``#&0P+_
-MQ@,"2(N58`D```^V1!`[B$,!28N$)(@````/MD`-B4,@00^VA"05`0``/`)U
-M+<=#!$A05`#'0PQ2;V-KQT,09713=,=#%&]R(`!!#[=T)#Y(C7L7Z-&W___K
-M2SP#=2'&0P$0QT,@`0```,=#!$A05`#'0PQ%2C,T9L=#$#``ZR;&0P1V00^W
-M="0\2(U[!>B7M___QD,,9$$/MW0D/DB->PWHA+?__\9#'')!#[9T)#E(C7L=
-MZ#&W__^X`````.L%N/____];74%<PTB#["A(B1PD2(EL)`A,B60D$$R);"08
-M3(ET)"!(B?M)B?1,BW=X2(M&2$B).$B+1V!(A<!U&L:&L@````)(B??_EL@`
-M``#I:@8``&9FD&:0]D!,`G0:QH:R`````DB)]_^6R````.E*!@``9F:09I!,
-MB??H`````$B)Q4B%P&:0=1Y!QH0DL@````),B>=!_Y0DR````.D:!@``9F:0
-M9I#'@)0`````````3(E@:$B+0V!(B44H2(M#8`^W0#AFB44@QD4D@$$/MH0D
-ML````#P"#X1I`0``/`)W"H3`=!R0Z4(#```\`P^$\`$``#P$D`^%,0,``.FX
-M`0``2(M#8/9`:`$/A)\```!!#[:$)+$```"H`G0&QD4XB.L0@^`$/`$9P(/@
-M!8/H=HA%.$F+E"20````00^WC"28````QD4Y`$B)T$C!Z#B(13I(B=!(P>@P
-MB$4[2(G02,'H*(A%/$B)T$C!Z""(13U(B=!(P>@8B$4^2(G02,'H$(A%/TB)
-MT$C!Z`B(14"(54'&14(`QD5#`(G(9L'H"(A%1(A-1<9%1@#&14<`ZVU!#[:$
-M)+$```"H`G0&QD4X*.L0@^`$/`$9P(/@!8/`*HA%.$F+E"20````00^WC"28
-M````QD4Y`$B)T$C!Z!B(13I(B=!(P>@0B$4[2(G02,'H"(A%/(A5/<9%/@")
-MR&;!Z`B(13^(34#&14$`2(M#8$@%[````$B)15#&13`@#[?!P>`)B44T@XV4
-M`````NGY`0``9F9FD$$/MH0DD````#P0=P7V`P)U#D'&A"2R````!NDD!```
-M2(U].`^VT$F-M"28````Z`````!(BT-@2`7L````2(E%4,9%,""!C90`````
-M`!``QD4EJT'VA"2Q````!@^$D@$``$&+A"24````B44TZ8(!``!!#[:$)+$`
-M``"#X#`\('41QD4X&\9%.0'&13P`Z6$!``#&13@UZ5@!``!(BT-@#[9`2*@!
-M=">H!'0C@8V4```````@`$$/MY0DG````&9!.Y0DD@```'43ZV-F9I!!QH0D
-ML@````;I9@,``$$/MH0DFP```#SC=$4\XW<3/$)T/3RP=!T\0'4G9F:09I#K
-M+CSL=`X\[W0F/.5F9F:0=1#K'&9!B90DD@```&9FD.L.0<:$)+(````&Z10#
-M``#&13BP00^WA"20````B$4Y00^WA"22````B$4Z00^WA"24````B$4[00^W
-MA"26````B$4\00^WA"28````B$4]00^VA"2:````B$4^00^VA"2;````B$4_
-M00^VA"21````B$5`00^VA"23````B$5!00^VA"25````B$5"00^VA"27````
-MB$5#00^VA"29````B$5$0?:$)+$````&="9!#[>$))P```#!X`F)132#C90`
-M```$ZPY!QH0DL@````;I3P(``$C'A:``````````00^VA"2Q````J`8/A!\"
-M``"H`G0)@XV4````".L'@XV4````$$R-;5A)BYPDN````$B%VW0+0?:$)+$`
-M```!=39)BX0DP````$B%P`^$"@(``$F+MD`*``"Z`````$R)Y__0A<`/A/$!
-M``!)BYY`"@``2(7;=#E(B>_H`````+X`````3(GOZ`````!(@\,0BU/P2(MS
-M^$R)[^@`````BT/T2(/#$(7`#X6)`0``Z^"^`````$R)[^@`````BT4T/0`(
-M``!W.TR)]^@`````2(G!2(7`=0Y!QH0DL@````OI7P$``$B+0!!(B45(2(E-
-M>(M5-$B+<1A,B>_H`````.M4/0```0!W/TR)]V9F9I#H`````$B)P4B%P'4.
-M0<:$)+(````+Z1D!``!(BT`02(E%2$B)37B+531(BW$83(GOZ`````#K#D'&
-MA"2R````!NGN````00^VA"2Q````J`0/A-````!!@+PDL`````-U'DF+M"2@
-M````2(7V=!%(BWU(BU4TZ`````#IIP```$F+E"2X````2(72=1-)BX0DP```
-M`$B%P`^%N````.MA3(MM2*@!=0I(B=-F9I!FD.LI28N$),````!(A<!T'$F+
-MMD`*``"Z`0```$R)Y__0A<!T!TF+GD`*``!(@\,0BU/P2(MS^$R)[^@`````
-MBT/P20'%BT/T2(/#$(7`=2CKWHM%-$B+34B%P'0;B<)(B<C&``!(@\`!2(/J
-M`70)Z_&#C90````!2(GN3(GWZ`````#K,4B)[DR)]^@`````3(GG0?^4),@`
-M``#K&;L`````Z4K^__],BVU(9F:09F:0Z5K___](BQPD2(ML)`A,BV0D$$R+
-M;"083(MT)"!(@\0HPV9F9I!F9F:09F:09F:055-(@^P(2(G]2(GSN`````#&
-M!!@`2(/``4@]@````'7P@[T("0```0^40Q,/ME4Z#[9-.0^V=3@/MD4[B$,#
-MB%,"B$L!0(@S@$L1$`^W13!FB4,$#[=%,F:)0P:+A0@)``"(0W#&0Q(@#[=5
-M,F:!^B`A=`=F@?HB(75(QD,7`DB-0SS'0SQ2;V-KQT-`97120<=`"$E$(%/'
-M0`Q31"`RQT`0,3)X(,=`%$-O;G3'0!AR;VQL9L=`'&5RQD`>`.D!`0``C8+P
-MV/__9H/X`7829H'Z0"%T"V:!^D0A#X6G````QD,7!`^W53*-@O#8__]F@_@!
-M=T1(C4,\QT,\4F]C:\=#0&5T4D''0`A)1"`RQT`,-S%X(,=`$%-!4R#'0!1#
-M;VYTQT`8<F]L;&;'0!QE<L9`'@#IBP```&:!^D`A=`=F@?I$(75]2(U#/,=#
-M/%)O8VO'0T!E=%)!QT`(240@4\=`#%-$(#+'0!`Q-'@@QT`40V]N=,=`&')O
-M;&QFQT`<97+&0!X`ZSS&0Q<(2(U#/,=#/%)O8VO'0T!E="`WQT`(-3`@4\=`
-M#$%402#'0!!#;VYTQT`4<F]L;&;'0!AE<L9`&@#&0Q<HQD,2`<9#$"A(C4,8
-MQT,82&EG:,=#'%!O:6['0`AT(%1EQT`,8VAN;\=`$&QO9VG'0!1E<RP@QT`8
-M26YC+L9`'`!(BX4`"0``2(7`=`I(BT`02(E#:.L(2(M%$$B)0VC'0V``(```
-M2(M](+Y\````Z`````")PH'B\`,``,'J!(A3<8/@#XA#<TB+?2"^@````.@`
-M````B<*!X@``\`/!ZA2(4W(E```/`,'H$(A#=$B#Q`A;7<-FD$%7059!54%4
-M55-(@^P(28G]B?5(B=.X`````&9FD&:0Q@08`$B#P`%(/=````!U\(EK"(/]
-M$WX*28'%B!0``(/M%$ACQ;H`````28.\Q6`$````#X72`@``2&/%28F<Q6`$
-M``!,B6MX2(F+@````$R)@Y````!!@'U1`0^%I0(``(']A0````^/@P(``$$/
-MMH0%8`@``#S_#X1R`@``#[;`9HE$)`8/M\!(C11`2(T4D$C!X@5)B=1-`Z4X
-M"0``0?9$)$L$#X1%`@``08M$)$@E`/__`#T``/\`#X4P`@``0?9$)$P$#X2<
-M`0``0<:$).@`````00^V1"1(2(G"@^(&2(/Z!G4YJ`$/A!`!``!!QD0D2@5!
-MQD0D2P1!#[:4)($```!)BW0D6$F+?"103(GAZ`````"Z`0```.GK`0``2(/Z
-M!`^%W`$``*@!9F9FD`^$T`$``$F+7"1028M$)&!(A<`/A84```!!QD0D2@-!
-MQD0D2P2`>PX`=$^]`````$R-<V!,B??H`````$B)PDB+0VA(B5-H3(DR2(E"
-M"$B)$(!Z2O]T&$DYU'030<:$).D````!N@$```#I;`$``(/%`0^V0PXYZ'^Z
-M08"\).D````!#X1-`0``3(GF3(GOZ`````"Z`0```.D]`0``@'A"``^%+@$`
-M`&:#8$[]28M$)&!FQT!.(`!)BW0D8$R)[^@`````N@$```#I#`$``$F+1"10
-M#[9`#4&`?3X`="V[``````^VZ`^VRTB)Z$C3^*@!=`^Z`````(G.3(GOZ```
-M``"#PP%!.%T^=]M!QD0D2P9!QD0D2@5F0<>$),@``````$R)YDR)[^@`````
-MN@$```#IHP```$V+9"1008!\)`X`=%U!O@````!-C7PD8$R)_^@`````2(G"
-M28M$)&A)B50D:$R).DB)0@A(B1"`>DK_="(/MD))/")T!#P-=19(8\5)QX3%
-M8`0```````"Z`````.M$08/&`44X="0.=ZX/MU0D!DB)WDR)[^@`````N@$`
-M``#K(F9F9I!F9I!(8\5)QX3%8`0```````"Z`````.L%N@$```")T$B#Q`A;
-M74%<05U!7D%?PY"0D)")T,8'",9'`1)`A/9T!H!/`@3K!(!G`ON$P'0&@&<,
-MW^L$@$\,(+@4````PV9F9I#SPV9F9I!F9F:09F:09F:005=!5D%505154TB#
-M[!A)B?U)B?9(B=6(3"0'18G'2(M&,$B)1"002,=&,`````!(A<`/A70!``#H
-M`````$F)Q+@`````387D#X01`@``3(GOZ`````!(B40D$$B%P'453(GF3(GO
-MZ`````"X`````.GJ`0``0<9$)#@:0<9$)#D(0<9$)#H(0<9$)#L`0<9$)#S_
-M0<9$)#T`0<9$)"6K00^W1CAF08E$)"!-B6PD*$''1"0T_P```$''A"24````
-M"````$B+1"002(M`$$F)1"1(2`7_````28E$)%!!QD0D,"1(BT0D$$F)1"1X
-M2<>$)*``````````0<9$)"2`28U<)%B^`````$B)W^@`````2(M$)!!(BW`8
-MNO\```!(B=_H`````$R)YDR)[^@`````N\C____K(&9F9I!F9I"_Z`,``.@`
-M````@^L!3(GOZ`````"$VW0.00^V1"0D/(!TW83`=#%(C70D$$R)[^@`````
-M00^W="0R28M^4.@`````3(GF3(GOZ`````"X`````.G'````2<=$)'@`````
-M3(GF3(GOZ`````!(BT0D$$B+6!!!#[;7#[9T)`=(C7L$Z`````!!B<3&`P#&
-M0P$`QD,"`,9#`P!(B>Y,B>_H`````$B-53BX`````&9FD,8$$`!(@\`!2(/X
-M$'7R08U$)`3&13@5QD4Y$8A%/,9%/0!(C5U81`^VX$2)933'A90`````````
-M2(M4)!!(BT(02(E%2$B)57B^`````$B)W^@`````2(M$)!!(BW`81(GB2(G?
-MZ`````"X`0```$B#Q!A;74%<05U!7D%?PY"0B?!FB7<(QD<.`&;'1PP``&:%
-M]G0?C5#_N0````!F9I!(BP=FB10(2(/!`H/J`6:#^O]U[//#9F9FD&9FD&9F
-MD$&)\&:)=PC&1PX!9L='#```9H7V=!ZZ`````+D`````2(L'9HD4"(/"`4B#
-MP0)F1#G"=>SSPV9F9I!F9I!F9I"`?PX!=2H/MT<,#[?(2(L7#[<42H/``6:)
-M1PQF.T<*<@9FQT<,``!F@V\(`0^WPL-(BQ</MT<(@^@!9HE'"`^WP`^W!$+#
-M9F9FD&9FD&9FD(!_#@%U*@^W5P@/MT<,`<(/MT<*B<&)T,'Z'_?Y2&/22(L'
-M9HDT4&:#1P@!PV9FD`^W1P@/M\A(BQ=FB31*@\`!9HE'",-F9F:09F:09F:0
-M9H-_"``/E,`/ML##D)"0D$B+#T@YSW4(N0````#K#Y!(BQ%(BT$(2(E""$B)
-M$$B)R,-F9F:09F9FD&9FD&9FD$&)T(32=#H/M@<Z!G4H2(GQO@````#K%`^V
-M5P$/MD$!2(/'`4B#P0$XPG4*@\8!1#C&=>3K"[@`````9F:09I##N`$```##
-M9F:09F:09F:0QD<!`$"(=P+'1P0`````PT&)T`^V5P$/ML)(C01`2,'@`DB)
-MP4@#3PB#P@&(5P%$`4<$N`````#&!`@`2(/``4B#^`QU\DB),42(00A,B<(/
-MML:(00E$B<+!ZA"#XC\/MD$*@^#`"="(00K#9F9FD`^V1P$Z!P^2P`^VP,-F
-M9I!(B?FX`````(!Y`O]U"&:),8A1`NL-@\`!2(/!!&8]@`!UY0^WP,-F9I!F
-M9I!F9I!!B=`/M\9(C02'@'@"_W409D2)`(A(`@^WQL-F9I!FD`^VT4$/M_#H
-M``````^WP,-(B?FX`````#A1`G439CDQ=0[&00+_9L<!___K$&9FD(/``4B#
-MP01F/8``==L/M\##9F9FD&9F9I!F9F:09F:0N`````")P3A4AP)U!F8Y-(=T
-M#X/!`4B#P`%(/8````!UXV:!^8``N(`!```/1,@/M\'#9F9FD&9FD&9FD&9F
-MD`^V1S@\"'0^/"AT.CRH#X3_````/(@/A#D!```\"F:0="0\*G0@/*H/A.4`
-M```\B@^$'P$``#PO=`P\CV9F9I`/A90!```\+P^$D@```#PO=R(\"G1?/`IW
-M"CP(9F9FD'5$ZU$\*'1X/"IF9I!F9I!U-.ML/(\/A-D````\CV:0=Q4\B`^$
-MRP```#R*9F9FD'44Z;X````\J&9F9I!F9I!T<3RJ=&VY`````+@`````Z1,!
-M```/MD<ZP>`(#[97.PG0#[97.8/B'\'B$`G0B<$/MD<\Z>\```!F9F:09F:0
-M#[97.L'B&`^V1SO!X!`)P@^V1ST)P@^V1SS!X`B)T0G!#[9'/\'@"`^V5T`)
-MT.FU````#[97.L'B&`^V1SO!X!`)P@^V1ST)P@^V1SS!X`B)T0G!#[97/L'B
-M&`^V1S_!X!`)P@^V1T$)P@^V1T#!X`@)T.MS#[97.DC!XC@/MD<[2,'@,$@)
-MP@^V1T%("<(/MD<\2,'@*$@)P@^V1SU(P>`@2`G"#[9'/DC!X!A("<(/MD<_
-M2,'@$$@)P@^V1T!(P>`(2(G12`G!#[970L'B&`^V1T/!X!`)P@^V1T4)P@^V
-M1T3!X`@)T$B)CX@```")AY````!F@T\B`?/#9F9FD+K_____9H7V=#%(B?F_
-M`````+K_____2<?``````&:0#[8!,=`/ML#!Z@A!,Q2`@\<!2(/!`68Y]W7E
-MB=##9I!(@^QH1`^V3SM$#[9'.@^V3SD/ME<X#[9'1XE$)%@/MD=&B40D4`^V
-M1T6)1"1(#[9'1(E$)$`/MD=#B40D.`^V1T*)1"0P#[9'08E$)"@/MD=`B40D
-M(`^V1S^)1"08#[9'/HE$)!`/MD<]B40D"`^V1SR)!"1(B?Y(Q\<`````N```
-M``#H`````$B#Q&C#9I!(@^P(#[9&`8A'`0^V1@*(1P*+1@2)1P1(BT<(#[97
-M`4B-%%)(P>("2(MV"$B)Q^@`````2(/$",-F9F:09F:02(M/8`^V5UBX````
-M`&9FD,8$.`!(@\`!2#VH````=?!(B4]@B%=8PV9F9I!F9F:0N`````"Z____
-M_V9FD&9FD(@4.$B#P`%(/0`"``!U\?/#9F9FD&9F9I!F9F:09F:0N0````!(
-M.S]T$DB+3PA(BQ%(BT$(2(E""$B)$$B)R,-(BP^+@00!``")PH'B?O_^_XF1
-M!`$``"5^__+_2(M7"(D"2(M7"(E"#$B+5PB)0A!(BU<(B4(42(M7"(E"&$B+
-M5PB)0@1(BP>+@%0!``")!0`````E_@#__TB+%XF"5`$``,-F9F:09F:09F:0
-M9F:0B?%(BP>+D`0!``")%0`````/MT<\9CV`9'0,9CV`D70&9CV`E'41#[;)
-M@\$(N`$```#3X`G"ZQ!`#[;.@\$,N`$```#3X`G"2(L'B9`$`0``PV9F9I!F
-M9F:09F:09F:0B?%(BP>+D`0!``")%0`````/MT<\9CV`9'0,9CV`D70&9CV`
-ME'41#[;)@\$(N/[____3P"'"ZQ!`#[;.@\$,N/[____3P"'"2(L'B9`$`0``
-MPV9F9I!F9F:09F:09F:0B?%`@/[_=&]`@/X?=S*+MQ@!``"Z`0```-/BB=#W
-MT"'PB8<8`0``BX=8`0``B04`````(=!T0(F'6`$``,-FD(NW'`$```^VP8/H
-M(+H!````B<'3XHG0]]`A\(F''`$``(N'8`$``(D%`````"'0=`:)AV`!``#S
-MPV9F9I!F9I!(@^PH2(E<)`A(B6PD$$R)9"083(EL)"!(B=6)\$R++T"`_@,/
-MAHD```!(C1S%`````('C^`<``$V-I!T``@``0<<$)`P!``"_$"<``.@`````
-M28V<'00"```/ME4#P>(8#[9%`L'@$`G"#[9%``G"#[9%`<'@"`G"B1-!QP0D
-M$`$``+\0)P``Z``````/ME4'P>(8#[9%!L'@$`G"#[9%!`G"#[9%!<'@"`G"
-MB1/IA````$B-',4`````@>/X!P``3HVD*P`"``!!QP0D#`$``+\0)P``Z```
-M``!*C9PK!`(```^V50/!XA@/MD4"P>`0"<(/MD4`"<(/MD4!P>`("<*)$T''
-M!"00`0``OQ`G``#H``````^V50?!XA@/MD4&P>`0"<(/MD4$"<(/MD4%P>`(
-M"<*)$TB+7"0(2(ML)!!,BV0D&$R+;"0@2(/$*,-(@^P82(E<)`A,B60D$$F)
-M_$`/MMZ)WN@`````OQ`G``#H`````(G>3(GGZ`````!(BUPD"$R+9"002(/$
-M&,.005=!5D%505154TB#[%A)B?^(5"172(L7@'\^``^$/`(``$&\`````$&]
-MX/___T&^\/___T`/ML9(B40D2$B-@H`!``!(B40D0$B-BH0!``!(B4PD.$B-
-M@J`!``!(B40D,$B-BJ0!``!(B4PD*$B-@E`"``!(B40D($B-BE0"``!(B4PD
-M&$B-@N`!``!(B40D$$B!PM`!``!(B50D"&9FD$B+1"1(1(GA2-/XJ`$/A(T!
-M``!$B>6#_0-V%T2)ZD@#5"0HBP*)!0````"#X/Z)`NL;C13M`````(G22`-4
-M)#B+`HD%`````(/@_HD"OQ`G``#H`````(!\)%<`='*#_0-V%T2)\D@#5"00
-MBP*)!0````"#R`*)`NL;C12M`````(G22`-4)`B+`HD%`````(/(`HD"1(GP
-M2(M,)!!(`<&-!*T`````B<!(BU0D"$@!PH/]`W8*BP&)!0````#K"(L"B04`
-M````J`)T=.OC9I"#_0-V+T2)ZTB+1"0@2`'8QP``````OQ`G``#H`````$@#
-M7"08BP.)!0````"#R`&)`^M!C1SM`````(G;2(M$)"!(`=C'``````"_$"<`
-M`.@`````2`-<)!B+`XD%`````(/(`8D#ZS=F9F:09F:0@_T#=BM$B>I(BT0D
-M,$@!T,<``0```$@#5"0HBP*)!0````"#R`&)`NLV9F:09F:0C03M`````(G`
-M2(M4)$!(`<+'`@$```!(`T0D.(L0B14`````@\H!B1!F9F:09F:008U4)`%)
-M@\0!08/%"$&#Q@1!#[9'/CG0#X="_O__2(/$6%M=05Q!74%>05_#9F:055-(
-M@^P(B=%(BR^#_@-V((T$]>#___^)P$B-E`6@`0``BP*)!0````"#X/Z)`NL>
-MC03U`````(G`2(V4!8`!``"+`HD%`````(/@_HD"A,ET?H/^`W8@C02U\/__
-M_XG`2(V4!>`!``"+`HD%`````(/(`HD"ZQZ-!+4`````B<!(C90%T`$``(L"
-MB04`````@\@"B0*-%+4`````C4+PB<!(C8P%X`$``(G22(V4%=`!``"#_@-V
-M"HL!B04`````ZPB+`HD%`````*@"='7KXX/^`W8XC1SUX/___XG;2(V$*U`"
-M``#'``````"_$"<``.@`````2(V<*U0"``"+`XD%`````(/(`8D#ZS:-'/4`
-M````B=M(C80K4`(``,<``````+\0)P``Z`````!(C9PK5`(``(L#B04`````
-M@\@!B0-(@\0(6UW#D)"0D)"02(GY2(L_#[>!N!(``(/``6:)@;@2``!F.X&\
-M$@``<@EFQX&X$@`````/MX&X$@``2,'@`D@#@7`1``"+%HD0#[>!N!(``(F'
-M+`$``,-F9I!!B="X`````,8$"`!(@\`!2(/X!'7RB?)F@>+_#P^W`68E`/`)
-MT&:)`0^V5PW!X@R+`27_#_#_"=")`0^V1PJ#X`)(@_@!&=*#X@*#P@'!X@4/
-MMD$#@^`?"="#R!"#X/>(00/V1PH!=!=$B<*#XG_!X@0/MT$"9B4/^`G09HE!
-M`O/#9F9FD&9F9I!F9I!F9I"X`````,8$,`!(@\`!2(/X#77R#[9'.8@&#[9'
-M.HA&`0^V1SN(1@(/MD<\B$8##[9'/8A&!`^V1SZ(1@4/MD<_B$8&]H>6````
-M!'0C#[9'0(A&"`^V1T&(1@D/MD="B$8*#[9'0XA&"P^V1T2(1@RX`0```,-F
-M9F:09F9FD&9FD+H`````0;H`````0;G_____ZU(!TD2)P-/XJ`%T$O?"````
-M`74:@?)W)]L`ZQ)FD(G0-7<GVP#WP@````$/1="#Z0%$.<EURTF#P@%)@_H(
-M=1.)T,'H$(@'B=#!Z`B(1P&(5P+#10^V!#*Y!P```.NB9F9FD&9F9I!F9F:0
-M9F:02(N'$!$``(L0BU`$BU`(BT`,B04`````PV9F9I!F9I!(@^P(2(N&B```
-M`$0/MD=#183`="(/ME`-N0````#VP@%T#.L22(G02-/XJ`%U"(/!`40XP77N
-MQD9"#.@`````2(/$",-F9F:09F9FD&9FD$B#[`A(B?A(BS]FQT!.`0#&0$(=
-M2(G&Z`````!(@\0(PV9F9I!F9F:09F9FD&9FD$B#[`A(BS\/M_9(P>8#2`.W
-MN`D``$B+-DB%]G0]2(L7#[=&,F;!Z`4/M\"-!(4``P``B8)P`0``2(L7#[=.
-M,H/A'[@!````2-/@B8)T`0``N@````#H`````$B#Q`C#D$%7059!54%455-(
-M@^P(2(G]28GV@']#`'0EN0````#V1@T!=`[K&$$/MD8-2-/XJ`%U#(/!`0^V
-M14-F.<AWZ$F+1D!(A<!T'$B-L)````!(BWTHZ`````!)BW9`2(GOZ`````!)
-MC49@23E&8`^$7`$``$F)QTR)_^@`````2(G#2(-X0``/A"D!``"`N(,`````
-M#X2B````9H-]=``/A)<```!!O0````!!O`````"02(N%N`D``$P!X$B+,$B%
-M]G1C#[=&(&8[0SAU668]A0!W4P^WP("\!6@(``#_=$9(BU4`#[=&,F;!Z`4/
-MM\"-!(4``P``B8)P`0``2(M5``^W3C*#X1^X`0```$C3X(F"=`$``,9&)"&Z
-M`````$B)[^@`````08/%`4F#Q`@/MT5T1#GH#X]V____2(M#0$C'0&``````
-M]D-,!'492(GOZ`````!(BW-`N@$```!(B>_H`````$B+0T`/ME`"#[9P`4C'
-MQP````"X`````.@`````2(M30$B+M?@(``"_`0```.@`````2(M30$B+M?@(
-M``"_!@```.@`````2,=#0`````!!@&X.`4B)WDB)[^@`````33E^8`^%I_[_
-M_TG'1D``````2(M%`(N(6`$``(D-`````(7)=`I(BT4`B8A8`0``2(/$"%M=
-M05Q!74%>05_#9F9FD&9FD&9FD&9FD$B#[`A,BP=!#[9P0T"$]G0U28V`P!(`
-M`+D`````2#GX=1KK(@^VP4B-%$!(C12028V4T,`2``!(.?IT#X/!`4`X\77@
-MZP6Y``````^VP4B-%$!(C1202(T$U0````!)B[0`T!(``$B%]G1]]D8*`G1W
-M28V$`,`2``!(.48@=6D/MD98A,!T"(/``8A&6.M92(M62$B#ZCA(C4Y(2(U"
-M.$@YR'1$2(-Z$`!U+.L*9F:02(-Z$`!U(,9&6`$/MHJ[````28NXN!```$G'
-MP`````#H`````.L12(M2.$B#ZCA(C4(X2#G(=<A(@\0(PV9FD$B#["A(B5PD
-M"$B);"003(ED)!A,B6PD($B)^TB)]4B+1G!,BV@H#[=.(&:!^84`=W\/M\$/
-MMH0':`@``#S_='!F@_E_=R$/MM!(BX]`"0``2(T$4DB-!()(P>`%2(M$"%`/
-MMD`(ZTYF@?F!`'<<#[;`2(N7D`D``$AIP,@/``!(BT00"`^V0`CK*P^VP$B+
-MEV@)``!(C03`2,'@!4B+A!"(````#[9`".L+9F:09F:0N/\```!(F$0/MJ0#
-M[@@``$B+=7A(A?9T"$B)W^@`````2(GN2(G?Z`````!!#[;$2(T\@$B-/+A(
-MC;S[R`$``$R)[D'_E:````!(BUPD"$B+;"003(MD)!A,BVPD($B#Q"C#9F9F
-MD&9FD&9FD&9FD$%455-(B?5(B=-F@7XXX0%U$0^V1CJ#Z!%!O``````\`78T
-M2(LW2(N^0`D```^W12"Z8)X!`&8]A0!W%P^WP`^VA`9H"```2(T40$B-%)!(
-MP>(%3(TD%\9#!`6`8P7^@"/?N`````!F@7TXX0%U$0^V13J#Z`$\`0^6P`^V
-MP&:0P>`'#[83@^)_"<*($P^VA98```"#X`'!X`:#XK\)PH@3]H66`````70.
-M3(GGZ`````!FB4,(ZP1FB4L(#[=#"(A%)6:!?3CA`74E#[95.HU"_SP!=PH/
-MME4[@^(/ZRJ0C4+ON@\````\`78=9F9FD+H`````28-\)&``=`Q!#[:4)($`
-M``"#X@\/M@.#X/`)T(@#6UU!7,-F9F:09F9FD$B#[#A(B5PD"$B);"003(ED
-M)!A,B6PD($R)="0H3(E\)#!)B?Q(B?-)B=</MD8X/`AT#SPH=`L\J'0'/(AF
-M9I!U#H.+E`````KK)69FD&:0/`IT#CPJ=`H\JG0&/(IFD'4.@XN4`````F9F
-M9I!F9I`/MWLX9H'_X0%U'`^V0SJ#Z!$\`7<1@XN4````"+@`````Z4D%``!$
-MBT,X08'@____`$&!^.$!$``/A>8````/MTL@9H'YA0`/A_($```/M\%!#[:\
-M!&@(``")^$"`__]T;F:#^7]W(T`/MM=)BXPD0`D``$B-!%)(C02"2,'@!4B+
-M1`A0#[9`".M%9H'Y@0!W'D`/ML=)BY0DD`D``$AIP,@/``!(BT00"`^V0`CK
-M($`/ML=)BY0D:`D``$B-!,!(P>`%2(N$$(@````/MD`(#[;`00^VA`3N"```
-M2(T4@$B-%)!)C;34R`$``$F+E"20"0``0`^VQTAIP,@/``!!O0````#V1`)=
-M$`^%8`(``,9#)`1!QP<`````N`$```#I2P0```^W4R"Y_P```+C_____9H'Z
-MA0`/AXL````/M\)!#[:T!&@(``")\$"`_O]T<V:#^G]W*$`/MM9)BXPD0`D`
-M`$B-!%)(C02"2,'@!4B+1`A0#[9`".M*9F:09I!F@?J!`'<>0`^VQDF+E"20
-M"0``2&G`R`\``$B+1!`(#[9`".L@0`^VQDF+E"1H"0``2(T$P$C!X`5(BX00
-MB`````^V0`A`#[;.1`^V\$ECQD$/MJP$[@@``$B-1*T`2(U$A0!)C;3$R`$`
-M``^WP4B-%$!(C1202,'B!4F)U4T#K"1`"0``9H'_X0%U"P^V0SJ#Z`$\`78I
-M9H'Y_P!T!T'V14L$=1O&0R0&0<<'`````+@!````Z38#``!F9I!F9I!!#[95
-M2(G1@^$!="3VP@1T'T$/MD0D1$$Z1"1.<A)!QP<!````N`$```#I`0,``)!-
-MA>T/A/<```"%R0^$[P```/;"!`^$Y@```$B)WDR)[^@`````A,!U%<9#)`1!
-MQP<`````N`$```#IP@(``$&`O8,````?=A%!QP<!````N`$```#IIP(``/:#
-ME@````%T%TB-1*T`2(U$A0!!]H3$U`$```%T&^M?2(U$K0!(C42%`$'VA,34
-M`0```0^$OP$``$2)]DR)Y^@`````A,!T$4''!P$```"X`0```.E.`@``]H.6
-M`````0^$D@$``$B-1*T`2(U$A0!!]H3$U`$```$/A'D!``!,B>_H`````&:#
-M^!\/AF<!``!!QP<!````N`$```#I!0(``&9FD&:0]D8*`G0R08'XX0$0`&9F
-MD`^$.P$``$$/MH6#````03J%@@```'(>0<<'`0```+@!````Z<@!``!!@?CA
-M`1``#X0,`0``00^W16J`>SCA#X7]````@'LY`0^%\P```$C1Z$B)PH/B`0^V
-M0SJ#Z`8\"0^'Q@````^VP/\DQ0````!!N`$```"Y`0```$B)VDR)[DR)Y^@`
-M````A,`/A;````!!QP<"````N`$```#I3@$``$&X`0```+D`````2(G:3(GN
-M3(GGZ`````"$P`^%?@```$''!P(```"X`0```.D<`0``#[;*0;@!````2(G:
-M3(GN3(GGZ`````"$P'520<<'`@```+@!````Z?`````/MLI!N`````!(B=I,
-MB>Y,B>?H`````(3`=29!QP<"````N`$```#IQ````,9#)`1!QP<`````N`$`
-M``#IKP```$F-O"2H#P``Z`````"$P'010<<'`0```+@!````Z8T```"`>SCA
-M=4Z`>SD!9F:0=46`>SH/=3^`>ST!9F9FD'4U#[9S/,'F"`^V0SL!Q@^W]DR)
-MY^@`````2#M#:'4%2(7`=1+&0R0$0<<'`````+@!````ZSFX`````.LR9I!!
-M#[:$).T)``!(C12`2(T4D$F-M-3(`0``28N4))`)``"X.+@/`.F4^___9F:0
-M9I!(BUPD"$B+;"003(MD)!A,BVPD($R+="0H3(M\)#!(@\0XPV9F9I!F9I!F
-M9I!F9I!(@^P(2(L_Z`````!(@\0(PV9F9I!F9F:09F9FD&9FD$%7059!54%4
-M55-(@^Q828G]2(GU2(N?0!$``&;'1C+_#TB-5"0LZ`````"$P'0)BT0D+.D.
-M"P``BT4X)?___P`]X0$0``^%Y0```+^($P``Z``````/MTT@9H'YA0`/A[D*
-M```/M\%!#[:T!6@(``")\$"`_O]T:V:#^7]W(D`/MM9)BXU`"0``2(T$4DB-
-M!()(P>`%2(M$"%`/MD`(ZT-F@?F!`'<=0`^VQDF+E9`)``!(:<#(#P``2(M$
-M$`@/MD`(ZQ]`#[;&28N5:`D``$B-!,!(P>`%2(N$$(@````/MD`(#[;`00^V
-MA`7N"```2(T4@$B-%)!-C;35R`$``$F+E9`)``!`#[;&2&G`R`\``$@!PDB)
-M5"002,=$)`@`````2,=$)!@`````Z7(!```/MU4@OO\```!F@?J%`'<,#[?"
-M00^VM`5H"```#[=].&:!_^$!=0\/MD4Z@^@1/`$/AL8```!F@?J%`'=Z#[?"
-M00^VA`5H"```//]T:F:#^G]W(0^VT$F+C4`)``!(C0122(T$@DC!X`5(BT0(
-M4`^V0`CK2&:!^H$`=QP/ML!)BY60"0``2&G`R`\``$B+1!`(#[9`".LE#[;`
-M28N5:`D``$B-!,!(P>`%2(N$$(@````/MD`(ZP6X_____P^VP$$/MH0%[@@`
-M`$B-%(!(C12038VTU<@!```/M\9(C11`2(T4D$C!X@5)`Y5`"0``2(E4)`AF
-M@?_A`75&ZS(/M\9(C03`2,'@!4D#A6@)``!(B40D&$R+L(@```!(QT0D"```
-M``!(QT0D$`````#K1`^V53J-0N\\`78GC4+_/`%V(&:!_O\`=`M(BT0D"/9`
-M2P1U#L9%)`:X`````.FV"```2,=$)!``````2,=$)!@`````2(UT)$A,B>_H
-M`````$&)QV:)13),B>_H`````$F)Q+@"````387D#X1W"```3(FE@````$$/
-MM]=(B10D2&G"L`0``$B-'!A(C4,@22N%0!$``$D#A4@1``!(BU0D2(E"($C!
-MZ"!(BU0D2(E")$F+1"082(M4)$B)0BA(P>@@2(M4)$B)0BQ(BT0D2&9$B7@(
-MN`````#&!!@`2(/``4@]L`0``'7P9H%]..$!=50/MD4Z@^@1/`%W24B-3"0P
-M2(M$)$@/ME`(2(GN2(M\)`CH`````$B-@R`$``!)*X5`$0``20.%2!$``$B+
-M5"1(B4(02,'H($B+5"1(B4(4Z14!``!!#[96"O;"`74LBT4X)?___P`]X0$0
-M``^$G````$B+3"0(#[9!2*@!#X2+````J`0/A(,```#VA98````@=`](C70D
-M,$B)[^@`````ZQM(C4PD,$B+1"1(#[90"$B)[DB+?"0(Z`````!(C8,@!```
-M22N%0!$``$D#A4@1``!(BU0D2(E"$$C!Z"!(BU0D2(E"%$B)V$DKA4`1``!)
-M`X5($0``2(M4)$B)0AA(P>@@2(M4)$B)0ASK7/;"`G172(G822N%0!$``$D#
-MA4@1``!(BU0D2(E"&$C!Z"!(BU0D2(E"'$B-@R`$``!)*X5`$0``20.%2!$`
-M`$B+5"1(B4(02,'H($B+5"1(B4(42(M$)$B`2`$"#[9564B+1"1(9HE0`H!]
-M60!T,[\`````B?A(C01`2,'@`DF+="002(M-8$B+%`A(B10&BU0("(E4!@B#
-MQP$/MD59.?AWTHM5-$B+1"1(B5`,9H%]..$!=3\/MD4Z@^@1/`%W-$$/M\](
-MBU0D2$B)[DR)]^@`````2(U,)#!(B=I(B>Y,B??H`````$&`9@S^Z8L$``!F
-M9I!!#[9&"J@"#X0B!```2(M$)$C&0`;^2(M$)$B`8`?^2(-\)`@`#X2X````
-M2(M$)`@/ME!(2(G0@^`&2(/X!@^%GP```/;"`0^$E@```$$/M\](BU0D2$B)
-M[DR)]^@`````]H66`````7002(M$)$@/MT`(P>`#B$0D,4B-3"0P2(G:2(GN
-M3(GWZ`````#VA98````!=`=!@$X,`>L%08!F#/[&`Z%(BU0D"`^V@NH```"#
-MX`\/ME,!@^+P"<*(4P%(BTPD"`^W03B#P`%FP<`(9HE#`DF)S$F!Q-0```#I
-M/0,``&:!?3CA`0^%)`(```^V13H\#W030;P`````/!`/A1L#``#IK@````^V
-M53S!X@@/MD4[`<)(BT0D2,9`!`U(BT0D2(!@!?Z`3"1#"$B+="1(#[9%)4$/
-MMHWZ````T^!F"48(2(M,)$@/MD$!@^`?@\@@B$$!2(M%/DB)@S@$``!FP<((
-M9HF31`0```^V13V(@T($``#&`Y%(BU0D"`^W0CB#P`%FP<`(9HE#`DB+3"0(
-M#[:1Z@```(/B#P^V0P&#X/`)T(A#`4F)S$F!Q-0```#I:`(``$B+5"1(#[9%
-M)4$/MHWZ````T^!F"4((Q@.!9L=#`O__2(M$)!`/MI"[````@^(/#[9#`8/@
-M\`G0B$,!2(-]2`!U#L9%)"&X`````.GN`P``]D4[`70I3(ME4$V%Y'0@28N]
-MN!```$R)YN@`````@^`/#[93`8/B\`G"B%,!ZP5,BV0D$$B+54@/MD(!OA``
-M```\@`^$A@```#R`=Q\\%7<2/!!F9I!FD'-G@^@"/`%W1.M7/!=F9I!W.^M>
-M/(5T+CR%9F:09F:0=Q`\@71#/()U(V9FD&9FD.LB/)!R%[XH````/))F9I!V
-M-3R3=0>^C````.LJO@0```#K(P^V0@2--(4(````D.L5O@@```#K#KX,````
-M9I#K!;X<````B?+!Z@)(BT0D2(A0!$B+3"1(9L'J"(/B`0^V006#X/X)T(A!
-M!4B-NR`$``")\DB+=4CH`````.D-`0``#[9%.(/H!#RK=T`/ML#_),4`````
-M#[9%0,'@"`^V54&-#!"#^0UW&+@!````2-/@J=@^``!T"4B+1"1(@$@!!$B+
-M1"1(@$@!`>L)2(M$)$B`8`'[2(M$)$C&0`0-2(M$)$B`8`7^2(M4)$@/MD4E
-M00^VC?H```#3X&8)0@A(BT0D2(!@`1_&@R`$```&3(MD)`A)@<34````2(V[
-M(00``$R)YN@`````2(V[)00``$R)YN@`````2(M%.$B)@T0$``!(BT5`2(F#
-M3`0``$B+5"0(2(N"W````$B)@S@$``#&`Y%(BTPD"`^VD>H```"#X@\/MD,!
-M@^#P"="(0P$/MT$X@\`!9L'`"&:)0P)-A>1T8TF+!"1(B4,$ZUFH`71500^W
-MSTB+5"1(2(GN3(GWZ`````#VA98````!=!!(BT0D2`^W0`C!X`.(1"0Q2(U,
-M)#!(B=I(B>Y,B??H`````/:%E@````%T!T&`3@P!ZP5!@&8,_DF+A;@)``!(
-MBQ0D2(DLT$2)^F;!Z@5%#[?G@>+_!P``1(GA@^$?N`$```!(T^!!"825P`D`
-M`(M%."7___\`/>$!$`!U*4B-3"1`N@````!$B>9,B??H``````^V1"1#@^`?
-M@\A`B$0D0^FD````9H%]..$!=3,/MD4Z@^@1/`%W*$B+="083(GOZ`````!(
-MC4PD0$B+1"08#[904$2)YDR)]^@`````ZVE(BW0D"$R)[^@`````2(U,)$!(
-MBT0D"`^V4')$B>9,B??H`````$B+3"0(#[912$B)T(/@!DB#^`9U+O;"`70I
-M#[9$)$.#X!^#R&"(1"1##[91<H/B?\'B!`^W1"1"9B4/^`G09HE$)$)(C70D
-M0$R)[^@`````2(MS(+@#````2(7V=$%(Q\<`````N`````#H`````+@#````
-MZRE!#[:%[0D``$B-%(!(C12038VTU<@!``!)BY60"0``N#BX#P#IR_7__TB#
-MQ%A;74%<05U!7D%?PV9F9I!F9F:09F:0055!5%532(/L"$B)_4&]`````$R-
-MIP`!``#IN0$``)!,B>?H`````$B)PTB#>'``=39(B>_H`````$B)0W!(A<!U
-M)4B-E0`!``!(BX4``0``2(E8"$B)`TB)4PA(B9T``0``Z9T!``"+0S@E____
-M`#WA`1``#X3=````#[=#(&8]@``/A,\````/MLAFB4L@9H/Y?W8:9H%[..$!
-M=2D/MD,Z@^@1/`%W'F9F9I!F9I!F@?F%`'<0#[?!#[:4!6@(``"`^O]U&<9#
-M)`9(B=Y(B>_H`````.G]````9F:09I`/MW,X9H'^X0%U%0^V>SJ-1^\\`0^'
-M[0```.L?9F9FD`^VPDB-%$!(C1202,'B!4F)U4P#K4`)``#K!XU'_SP!=C9F
-M@?F``'0O9H'^X0%FD'4+#[9#.H/H$3P!=AM!]D5+!'44QD,D!DB)WDB)[^@`
-M````Z8````!(B=Y(B>_H`````(/X`G<*@_@!<R5F9I#K$(/X`W5A9F:09F:0
-M9F:0ZTM(B=Y(B>_H`````&9FD.M&2(.[@`````!T#TB-LX````!(B>_H````
-M`$B-E0`!``!(BX4``0``2(E8"$B)`TB)4PA(B9T``0``ZSA(B=Y(B>_H````
-M`$PYI0`!```/A3O^___K'@^VPDB-%$!(C1202,'B!4F)U4P#K4`)``#I%O__
-M_TB#Q`A;74%<05W#2(/L2$B)7"082(EL)"!,B60D*$R);"0P3(ET)#A,B7PD
-M0$B)]4F)_4R+9U!-BS0D00^V1"0,J!!T#,:'Z`````;IC`(```^VE^@```"`
-M^@$/A((```"`^@%R&H#Z!`^$HP```(#Z!@^%S0(``&9FD.E=`@``QH?H````
-M`4B)_DR)]^@`````QD4D@4&`3"0,"$B#O8``````=`](C;6`````3(GWZ```
-M``!)BX8``0``2(EH"$B)10!)C88``0``2(E%"$F)K@`!``!,B??H`````.EB
-M`@``@^#W08A$)`R`A^L````!QH?H`````,9&)`),B??H`````$R)]^@`````
-MZ3,"``#&A^L`````2(.^@`````!T#TB-MH````!,B??H`````$F+34!(A<D/
-MA)X!``"+402-0@&)002#^B@/AXP!``!)BX8``0``2(EH"$B)10!)C88``0``
-M2(E%"$F)K@`!``!!@'U*_W0D28M%8$B%P'0&@'A"`'053(GJO@(```!,B>?H
-M`````.FH`0``00^V1"0,@^#W@\@008A$)`Q)BW582(7V=11!@'PD#@!U+.GE
-M````9F9FD&9FD$$/MI6!````0;@`````N0(```!,B>?H`````.E:`0``0;\`
-M````QD0D%P!)C40D8$B)1"0(2(M\)`CH`````$B)Q4F+1"1H28EL)&A(BU0D
-M"$B)50!(B44(2(DH2(M50$B%TG0528NV^`@``+\%````Z`````"`34P"2(GJ
-MO@8```!,B>?H`````("]@P````!T-D&-7P%!@?]_EI@`=R9,B??H`````+\!
-M````Z`````"`O8,`````=`N#PP&!^X&6F`!UVD&)WX!$)!<!#[9$)!=!.$0D
-M#@^'5____TF+?6!(A?]U'$'&14H#9D''A<@``````$R)[DR)]^@`````ZW?H
-M`````&9F9I!F9F:0ZVA!#[9=2DC'QP````"X`````.@`````08!D)`SO28N&
-M``$``$B):`A(B44`28V&``$``$B)10A)B:X``0``3(GJO@8```!,B>?H````
-M`(#[_W4.3(GJ3(GF3(GWZ`````!,B??H`````$B+7"082(ML)"!,BV0D*$R+
-M;"0P3(MT)#A,BWPD0$B#Q$C#9F:005=!5D%505154TB#["A(B?U)B?5(BX]`
-M"0``N&">`0!F@7X@A0!W&P^W1B`/MH0':`@``$B-%$!(C1202(G02,'@!4R-
-M)`%(BY40$0``2('"0`@``$$/MD0D<L'@"$B82`'"BS*)-0````!!B?=!P>\0
-M2(N5$!$``$B!PD`(``!!#[9$)'+!X`A(F$@!PHM"!(D%`````(A$)!")PL'J
-M"(A4)!'!Z!"(1"022(N5$!$``$B!PD`(``!!#[9$)'+!X`A(F$@!PHM""(D%
-M`````(A$)!.)PL'J"(A4)!3!Z!"(1"05QD0D%@#&1"07`(M,)!!!B?9!P>X8
-M00^VWT2+1"041(GRB=Y(Q\<`````N`````#H`````(G8@_`!B<*#X@%T%$6$
-M_W0/0<9%)`"X`````.FH`@``08!])(%F9I!U(4B-3"001(GRB=Y,B>_H````
-M`$'&120"N`````#I?0(``$&+13@E____`#WA`0X`=0]!QD4D(;@`````Z5X"
-M``!!]H66`````74HA-)U)$&`?"1*_W0<2(U,)!!$B?*)WDR)[^@`````N```
-M``#I+`(``$R)YDB)[^@`````3(GF2(GOZ`````!(BU4`00^W13)FP>@%#[?`
-MC02%``,``(F"<`$``$B+10!!#[=-,H/A'[H!````2(G32-/CB9AT`0``00^W
-M13)(P>`#2`.%N`D``$C'``````!!#[=-,HG(9L'H!27_!P``@^$?2(G62-/F
-M2(GQ]]$AC(7`"0``00^W33*)R&;!Z`4E_P<``(/A'TC3XO?2(52%>$F+50!)
-MBT4(2(E""$B)$$$/MW4R2(V]J`\``.@`````08"L)(,````!0<9%)(%)@[V`
-M`````'0/28VU@````$B)[^@`````28U$)"!).40D(`^$"0$``$F)QDB-A:@/
-M``!(B40D"$R-O0`!``!F9F:09F:03(GWZ`````!(B<-(BU4`#[=`,F;!Z`4/
-MM\"-!(4``P``B8)P`0``2(M%``^W2S*#X1^Z`0```$B)UDC3YHFP=`$```^W
-M0S)(P>`#2`.%N`D``$C'```````/MTLRB<AFP>@%)?\'``"#X1](B=9(T^9(
-MB?'WT2&,A<`)```/MTLRB<AFP>@%)?\'``"#X1](T^+WTB%4A7@/MW,R2(M\
-M)`CH`````$&`K"2#`````4B#NX``````=`](C;.`````2(GOZ`````!(BX4`
-M`0``2(E8"$B)`TR)>PA(B9T``0``33ET)"`/A13___]!@:64````___^_T'&
-MA"3H````!$R)[DR)Y^@`````N`$```!(@\0H6UU!7$%=05Y!7\.02(/L6$B)
-M7"0H2(EL)#!,B60D.$R);"1`3(ET)$A,B7PD4$B)5"002(LO3(N%0!$``$B%
-MT@^$Q@(```^WUDAIPK`$``!*C0P`]D$A`G082(T$U0````!(`X6X"0``2(L`
-MQD`D`NL62(T$U0````!(`X6X"0``2(L`QD`D(4R-%-4`````2(N%N`D``$P!
-MT$B+$(M"."7___\`/>$!$``/A+`!```/MT(@9CV%`'<2#[?`#[:$!6@(```\
-M_W499F:03(G02`.%N`D``$B+`,9`)`;IR@@```^VP$B-%$!(C1202,'B!4R+
-MG4`)``!)`=.`?"03`'EN00^V4TA(B="#X`9(@_@&=2/VP@%T'DB+10"+D%@!
-M``")%0````"%TG0*2(M%`(F06`$``$B+10"+@%`!``")!0````"#R`)(BU4`
-MB8)0`0``2(M%`(N`!`$``(D%`````(#,_TB+50")@@0!``!F]T$@`@@/A.H`
-M``"`?4,`#X3@````NP````!!N0````!%B<A!#[;)#[9'#4C3^*@!=&!!@/D#
-M=B=(BT4`2`70`0``C12-`````$ACTD@!T(L`B04`````P>@4@^`!ZR5(BT4`
-M2`70`0``C12-`````$ACTD@!T(L`B04`````P>@4@^`!A,!T"K@!````2-/@
-M"<-!@\$!08U``3A%0W>!A-MT4CA?#75-B?!FP>@%)?\'``"+1(5XB?&#X1](
-MT_BH`74R08"[Z`````)W"$'&@^@````#3(G02`.%N`D``$B+,$R)W^@`````
-MZ4P'``!!NP````#V1"03`0^$.P<``$R)T$@#A;@)``!(BS#&1B0ABT8X)?__
-M_P`]X0$.``^$%P<``$B+E1`1``!(@<)`"```00^V0W+!X`A(F$@!PHL"B04`
-M````2(N5$!$``$B!PD0(``!!#[9#<L'@"$B82`'"BP*)!0````!(BY40$0``
-M2('"2`@``$$/MD-RP>`(2)A(`<*+`HD%`````$B)[^@`````Z:$&``"0#[?V
-M2(T<]0````!(BX6X"0``2`'82(L09H%Z..$!#X4,`0``#[9Z.D"`_Q`/AVX&
-M``"X`0```(GY2-/@J<`P```/A<P```"I```!`'54]L2`#X1)!@``2&G&L`0`
-M`$J-#``/MD$SB$(D2(G82`.%N`D``$B+`/9`(P0/A"`&``"`>"0`#X06!@``
-M2(M04$B%T@^$"08```^V03.(`NG^!0``2&G&L`0``$J-#`!,C6$H2(G82`.%
-MN`D``$B+$$$/MD0D`HA")$B)V$@#A;@)``!(BP!(@WA(``^$P04```^VN2$$
-M``#H`````$B)VD@#E;@)``!(BPJ+430YT`]'PHG"2(MY2$R)YN@`````Z8T%
-M``!(B=A(`X6X"0``2(L`QD`D`.EW!0``9F9FD&9FD$B)V$@#A;@)``!,BRA-
-MBWUHN/____]F08%]((4`=QE(B=A(`X6X"0``2(L`#[=`(`^VA`5H"```#[;`
-M2(T40$B-%)!(P>(%3(NE0`D``$D!U$'&A"3H`````$$/ME0D2$B)T(/@!DB#
-M^`8/A9<!``#VP@$/A(X!``!!QD4D`$'VA98````@#X3D!```387_#X3;!```
-M0?:'L0````(/A*$```!!BT4TA<`/A)4```!)B[^@````2(7_=`V)PDF+=4CH
-M`````.M\28-]2`!T=4F#O[@`````=0I)@[_``````'1A38MM2$F+A[@```!(
-MA<!T#4B)PT'VA[$````!="9(B[5("@``N@$```!,B?]!_Y?`````NP````"%
-MP'0'2(N=2`H``$B+>PB+$TR)[N@`````BP-)`<6+0P1(@\,0A<!TXDB+E1`1
-M``!(@<)`"```00^V1"1RP>`(2)A(`<*+`HD%`````(G"P>H008B7FP```,'H
-M&&9!B8>0````2(N5$!$``$B!PD0(``!!#[9$)'+!X`A(F$@!PHL2B14`````
-M#[;"9D&)AY0````/ML9F08F'E@```(G0P>@0#[;`9D&)AY@```#!ZAA!B)>:
-M````2(N5$!$``$B!PDP(``!!#[9$)'+!X`A(F$@!PHL"B04`````#[;`9D&)
-MAY(```#I:0,``$AIQK`$``!.C30`00^V1C.$P`^%T0```$B)V$@#A;@)``!(
-MBP#&0"0`0?:%E@```!`/A#(#``!-A?\/A"D#``!!#[9&,T&(AY(```!!]H>Q
-M`````@^$#P,``$&#?30`#X0$`P``28._N`````!U#DF#O\``````#X3L`@``
-M38ME2$F+A[@```!(A<!T#4B)PT'VA[$````!="9(B[5("@``N@$```!,B?]!
-M_Y?`````NP````"%P'0'2(N=2`H``$B+>PB+$TR)YN@`````BP-)`<2+0P1(
-M@\,0A<`/A8<"``#KW&9FD&:0/`(/A2@"``!!#[9.0$&+1CB)1"0D#[94)"</
-MMD0D),'@&`G"#[9$)"7!X!`)P@^V1"0FP>`(08G400G$@^%_@/EQ=CS&1"0-
-M`$&#_`%V#$$/MD9!@^`/B$0D#<9$)`X`08/\`G8)00^V3D*(3"0.08/\`W9F
-M00^V1D.(1"0/ZV#&1"0-`$&#_`)V#$$/MDY"@^$/B$PD#<9$)`X`QD0D#P!!
-M@_P'=CE!#[9&1X/`"$$YQ$0/1^#&1"0.`$&#_`QV"4$/MD9,B$0D#D&#_`UV
-M"T$/MDY-B$PD#^L%QD0D#P!(B=A(`X6X"0``2(L`@'@P`'1(187D=$/&0"0@
-M2(G82`.%N`D``$B+``^V0#`/MM!$..!$#T+B2(G82`.%N`D``$B+`$B+>%!(
-MA?]T'T2)XDF-=D#H`````.L12(G82`.%N`D``$B+`,9`)"*`?"0-!'412(G8
-M2`.%N`D``$B+`,9`)`)).6TH#X02`0``387_#X0)`0``0?:%E@```!!T0$$/
-MMD8S08B'D@```$'VA[$````"="I!#[9%,$2)XD$XQ`]'T(32=!A)B[^H````
-M2(7_=`P/MM))C79`Z`````"`?"0-"W=<#[9$)`W_),4`````0<:'L@````'I
-MGP```(!\)`X$=12`?"0/`G4-0<:'L@```!'IA````$'&A[(````"ZWI!QH>R
-M````$.MP0<:'L@````OK9D'&A[(````&ZUQ!QH>R````#>M29I`\*'4G00^V
-MA"2#````@^@!08B$)((```!(B=A(`X6X"0``2(L`QD`D@>LE/`AU"K\0)P``
-MZ`````!(B=A(`X6X"0``2(L`QD`D(69FD&9FD$B+7"0H2(ML)#!,BV0D.$R+
-M;"1`3(MT)$A,BWPD4$B#Q%C#9F9FD&9FD&9FD&9FD$%7059!54%455-(@>RH
-M````2(G]2(E\)'`/MX>Z$@``9HF$)(````!(BP>+@$`!``")!0````!F)?\/
-M9HF'NA(``&8[A"2`````=7%(BP>+L%`!``")-0````!(BP>)L%`!``"X````
-M`/?&`/__``^$!`D``$C'QP````"X`````.@`````2(M\)'#H`````+@!````
-MZ=\(``!F9I!F9I!(BT4`BX!``0``B04`````9B7_#V:)A;H2``#K)$B-EQ`!
-M``!(B50D:$B-CZ@/``!(B4PD8$B-MP`!``!(B70D6$B+A:`1``"+`(D%````
-M``^WC;H2```E_P\```^WT3G0=9UF@?G_#P^%P@<``.G2!P``3(N%0!$``&:#
-MA"2``````0^WA"2`````9CN%OA(``+@`````#[>4)(`````/0]!FB90D@```
-M`$B+E:`1``!(@\($#[>$)(````"+#()!B<E!P>D00?;!"`^$KP```$B+10"+
-MD%`!``")%0````!(BT4`B9!0`0``]\(`__\`=&F`?4,`=&.)UO?&``$``'4N
-MOP````#WQ@```0!T0.L?#[?7C4H(2(GP2-/XJ`%U%(U*$$B)\$C3^*@!=0?K
-M'[\`````#[?'2(T4@$B-%)!(C9S5R`$``$B%VW4=ZPR#QP$/MD5#9CGX=[9(
-MBWPD<.@`````Z<4&``!(BWPD<.@`````B$,/Z;,&``!F9I")SF:!YO\/#[?&
-M2&G0L`0``$V+1!`@2(T\Q0````!(BX6X"0``2`'X2(L82(7;#X5L`0``#[?V
-MB?)(Q\<`````N`````#H`````&:#?70`#X1;!@``QH0DGP````!F9I!$#[:T
-M))\```!.C3SU`````$B+A;@)``!,`?A(BS!(A?8/A/D```!-:>:P!```3`.E
-M0!$``$B+G>`0```/MDXE1`^VK"2?````1(GJ2,?'`````+@`````Z`````!,
-MB?A(`X6X"0``2(LXZ`````!!BXPD)`0``$&+E"0@!```18N,)"P$``!%BX0D
-M*`0``$2)[DC'QP````"X`````.@`````3(GP2,'@!D@!PXM#-(M[,$2+4RQ$
-MBULH1(MC)$2+:R!$BW,<1(M[&(M+%(E,)'Q$BTL01(M##(M+"(M3!(LSB40D
-M0(E\)#A$B50D,$2)7"0H1(ED)"!$B6PD&$2)="001(E\)`B+1"1\B00D2,?'
-M`````+@`````Z`````"`A"2?`````0^VA"2?````9CM%=`^#%@4``.G!_O__
-MD$'VP2`/A(@!``"`>R2!9I`/A5L!``#&0R0A#[=#,DC!X`-(`X6X"0``2,<`
-M``````^W2S*)R&;!Z`4E_P<``(/A'[H!````2(G62-/F2(GQ]]$AC(7`"0``
-M#[=+,HG(9L'H!27_!P``@^$?2-/B]](A5(5X#[=S,DB+?"1@Z`````!(@[N`
-M`````'0/2(VS@````$B)[^@`````#[=3(&:!^H4`#X?'````#[?"#[:$!6@(
-M```\_P^$M````&:#^G]W(P^VP$B-%$!(C1202,'B!4@#E4`)``!(BT)0@'@(
-M_P^5P.M9#[=#(&8]@0!W)@^WP`^VA`5H"```2&G`R`\``$@#A9`)``!(BT`(
-M@'@(_P^5P.LI#[=#(`^VA`5H"```2(T$P$C!X`5(`X5H"0``2(N`B````(!X
-M"/\/E<"$P'0N2(G>2(GOZ`````!(BX4``0``2(E8"$B)`TB+1"182(E#"$B)
-MG0`!``#IGP,``$B+3"1H2(M1"$B-0Q!(B4$(2(E+$$B)4`A(B0+I?@,``(GP
-M9L'H!40/M_!)8\8/M_9!B?=!@^<?BT2%>$2)^4C3^*@!#X55`P``2(GX2`.%
-MN`D``$B+``^W4"!F@?J%``^'N@````^WP@^VA`5H"```//\/A*<```!F@_I_
-M=R`/ML!(C11`2(T4D$C!X@5(`Y5`"0``2(M"4`^V0`CK;4B)^$@#A;@)``!(
-MBP`/MT`@9CV!`'<C#[?`#[:$!6@(``!(:<#(#P``2`.%D`D``$B+0`@/MD`(
-MZS-(B?A(`X6X"0``2(L`#[=`(`^VA`5H"```2(T$P$C!X`5(`X5H"0``2(N`
-MB`````^V0`@\_W00#[;02&/"@+P%[@@``/]U-DECQHM$A7A$B?E(T_BH`0^%
-M:@(``,9#)`9(B=_H`````+H`````2(G>2(GOZ`````#I20(``$ACP@^VA`7N
-M"```2(T4@$B-%)!(C;S5R`$``$V%P'0-0?;!`K@`````3`]$P/9'"@(/A%X!
-M``!,B<+H`````$ECQHM$A7A$B?E(T_BH`0^%]0$``(![)($/A8\````/MT,R
-M2,'@`T@#A;@)``!(QP``````#[=+,HG*9L'J!8'B_P<``(/A'[@!````2-/@
-M]]`AA)7`"0``#[=S,DB+?"1@Z`````!(B=Y(B>_H`````$B#NX``````=`](
-MC;.`````2(GOZ`````!(BX4``0``2(E8"$B)`TB+="182(ES"$B)G0`!``#I
-M7`$``$B+A1`!``!(.T0D:'1?0;P`````08/$`4B+`$@Y1"1H=?)%A.1T1D&]
-M`````$B+?"1HZ`````!(C4CP2(MT)&A(BU8(2(E&"$B),$B)4`A(B0)(.=FX
-M`0```$0/1.A!@.P!=<E%A.T/A>\```!(BT0D:$B+4`A(C4,02(M,)&A(B4$(
-M2(E+$$B)4`A(B0))8]:X`0```$2)^4C3X`F$E;@```#IM````$R)PN@`````
-M2(N%$`$``$@[1"1H=%M!O`````!!@\0!2(L`2#E$)&AU\D6$Y'1"0;T`````
-M2(M\)&CH`````$B-2/!(BW0D:$B+5@A(B48(2(DP2(E0"$B)`D@YV;@!````
-M1`]$Z$&`[`%UR46$[75#@'LD@70]2(M$)&A(BU`(2(U#$$B+3"1H2(E!"$B)
-M2Q!(B5`(2(D"26/6N`$```!$B?E(T^`)A)6X````9F9FD&9FD`^WM"2`````
-M9CFUNA(```^%+OC__V:!O;H2``#_#W0C2(N%H!$``(L`B04`````)?\/```/
-MMY6Z$@``.=`/A<[W__](C840`0``2#F%$`$``'1)2(G#2(G?Z`````!(C7#P
-M#[=.,HG*9L'J!8'B_P<``(/A'[@!````2-/@]]`AA)6X````N@````!(B>_H
-M`````$@YG1`!``!UNDB)[^@`````N`$```!(@<2H````6UU!7$%=05Y!7\-F
-M9I!FD$B#["A(B5PD"$B);"003(ED)!A,B6PD($B+G_@(``!(BT,(1(LH1(DM
-M`````$'WQ0```)!T>DB+0PA$B2CK<9!(@<.0%```2(L#BY!0`0``B14`````
-M2(L#B9!0`0``A=)T//?"````$'0<2(L#QX!0`0``````$$B+`XN`4`$``(D%
-M`````$B+`\>`4`$```$```!(B=_H`````$$!Q(/%`8/]`G69ZQ=F9F:09F:0
-M0;P`````O0````#KBF9FD$6$Y`^5P$6%[0^5P@G0#[;`2(M<)`A(BVPD$$R+
-M9"083(ML)"!(@\0HPV9FD&9FD$%7059!54%455-(@^PH28G\2(L'BY!0`0``
-MB14`````2(L'B9!0`0``9F9FD&9FD/?"`/__``^$*`D``$&`?"1#``^$'`D`
-M`,9$)!``B=)(B50D"$0/MFPD$$&-30A(BT0D"$C3^*@!=11!C4T02(M$)`A(
-MT_BH`0^$T0@``(!\)!`#=BM)BP0D2`6``0``0HT4[0````!(8])(`="+`(D%
-M`````,'H$X/@`>LI9F:028L$)$@%@`$``$*-%.T`````2&/22`'0BP")!0``
-M``#!Z!.#X`&$P'0F3(GGZ`````!)8]5(C0122(T$@D&!C,3T$@`````(`&9F
-M9I!F9I!)BQ0D@'PD$`-V)4*-!.T`````2)A(C80"@`$``(L`B04`````)0``
-M`0#K(V9F9I!"C03M`````$B82(V$`H`!``"+`(D%`````"4```$`A<!T08!\
-M)!`#=AU"C03M`````$B82(V$`H`!``#'`````0#I&0@``$*-!.T`````2)A(
-MC80"@`$``,<````!`.G\!P``08!\)%$!#X6H!@``@'PD$`-V*4F+!"1(!8`!
-M``!"C13M`````$ACTD@!T(L`B04`````@^`!ZR=F9F:028L$)$@%@`$``$*-
-M%.T`````2&/22`'0BP")!0````"#X`&$P`^$50$``$ECQ4B-'$!(C1R82,'C
-M`TF-M!SX$@``28M\)"CH`````$F+O!S0$@``2(7_=!U(BT=`2(7`=!3V0$X"
-M=0[H`````(3`D`^%"@$``$ECQ4B-%$!(C12028N$U-`2``!(A<!T=4F)QH!X
-M#@`/A(L```!!OP````!(C6A@2(GOZ`````!(B<-(BT4(2(E="$B)*TB)0PA(
-MB1CV0TP"=2](BU-`2(72=!9)B[0D^`@``+\%````Z`````"`2TP"2(G:O@8`
-M``!,B??H`````$&#QP%%.'X.=B7KH@^V="00N@$```!,B>?H`````+^@A@$`
-MZ`````"Z`"TQ`>L%ND!+3`!)8\5(C0Q`2(T,B$C!X0-*C30AB9;X$@``2,>&
-M"!,````````/MD0D$$B-%$!(C12028V4U,`2``!(B980$P``28VT#/@2``!)
-MBWPD*.@`````9F:0@'PD$`-V/4*-%.T`````2&/228L$)$@%@`$``$@!T(L`
-MB04`````28L$)$@%@`$``$@!PHL"B04`````P>@'@^`!ZSM"C13M`````$AC
-MTDF+!"1(!8`!``!(`="+`(D%`````$F+!"1(!8`!``!(`<*+`HD%`````,'H
-M!X/@`83`='6`?"00`W8W0HT,[0````!(8\E)BP0D2`6$`0``2`'(BP")!0``
-M``!)BQ0D2('"A`$``$@!T0T```$`B0'K/D*-#.T`````2&/)28L$)$@%A`$`
-M`$@!R(L`B04`````28L4)$B!PH0!``!(`=$-```!`(D!ZR^`?"00`W8H28L$
-M)$@%@`$``$*-%.T`````2&/22`'0BP")!0````#!Z!*#X`'K)DF+!"1(!8`!
-M``!"C13M`````$ACTD@!T(L`B04`````P>@2@^`!A,`/A"("``"`?"00`W8W
-M0HT,[0````!(8\E)BP0D2`6``0``2`'(BP")!0`````-```$`$F+%"1(@<*`
-M`0``2`'1B0'K-4*-#.T`````2&/)28L$)$@%@`$``$@!R(L`B04`````#0``
-M!`!)BQ0D2('"@`$``$@!T8D!26/%2(T40$B-%)!)BX34T!(``$B%P'0328G%
-M2(-X0``/A:(```#IA`$``(!\)!`#=DI"C13M`````$ACTDF+!"1(!8`!``!(
-M`="+"(D-`````$F+!"1(!8`!``!(C00"B0A)BP0D2`6``0``2`'"BP*)!0``
-M``#IT`,``$*-%.T`````2&/228L$)$@%@`$``$@!T(L(B0T`````28L$)$@%
-M@`$``$B-!`*)"$F+!"1(!8`!``!(`<*+`HD%`````.F&`P``9I!(BTA`#[=!
-M3@^WT/;&`0^%TP```$B)S?;"`@^$QP```(/@_6:)04Y(C;'`````28M\)"CH
-M`````,9$)!``@'T[`'1WQD0D$``/MD0D$$B+7,582(7;=%1(BU-`2(72=!9)
-MB[0D^`@``+\%````Z`````"`2TP"2(G:O@8```!,B>_H`````("[@P````!T
-M')!,B>?H`````+\!````Z`````"`NX,`````=>6`1"00`0^V1"00.$4[=X['
-MA<````!`2TP`2,>%T`````````!(B:W8````2(VUP````$F+?"0HZ`````"`
-M?"00`W8R28L$)$@%@`$```^V5"002,'B`X'B^`<``$@!T(L`B04`````P>@(
-M@^`!ZS!F9I!F9I!)BP0D2`6``0``#[94)!!(P>(#@>+X!P``2`'0BP")!0``
-M``#!Z`B#X`&$P`^$%@$``(!\)!`#=BQ)BP0D2`6``0``#[94)!!(P>(#@>+X
-M!P``2`'0BP")!0````"#\`&#X`'K*DF+!"1(!8`!```/ME0D$$C!X@.!XO@'
-M``!(`="+`(D%`````(/P`8/@`83`#X2Q````#[9$)!!(C11`2(T4D$V-O-3`
-M$@``28M'$$B%P`^$CP```$F)QDF-=SA)BWPD*.@`````08!^#@!T54&]````
-M`$F-;F!F9I!FD$B)[^@`````2(G#2(M%"$B)70A(B2M(B4,(2(D82(M30$B%
-MTG0628NT)/@(``"_!0```.@`````@$M,`D&#Q0%%.&X.=[I!QT<X@(0>`$G'
-M1T@`````38E_4$F-=SA)BWPD*.@`````@'PD$`,/AG\````/MEPD$$C!XP.!
-MX_@'``!)BP0D2`6``0``2`'8BQ")%0````!)BP0D2`6``0``2(T$`XD028L$
-M)$@%@`$``$B-!`.+`(D%`````$F+!"1(!3`"``!(C00#QP``````OQ`G``#H
-M`````$F+!"1(!30"``!(`<.+`XD%`````.M]#[9<)!!(P>,#@>/X!P``28L$
-M)$@%@`$``$@!V(L0B14`````28L$)$@%@`$``$B-!`.)$$F+!"1(!8`!``!(
-MC00#BP")!0````!)BP0D2`50`@``2(T$`\<``````+\0)P``Z`````!)BP0D
-M2`54`@``2`'#BP.)!0````"`1"00`0^V1"0003A$)$,/A_#V__])BP0DBY!0
-M`0``B14`````28L$)(F04`$``/?"`/__`'0FZ:7V__]F9I!FD$ECU4B-!%)(
-MC02"08&,Q/02``````$`Z>CW__^X`````$B#Q"A;74%<05U!7D%?PT%7059!
-M54%455-(@^QH28G]0(AT)$M`#[;&B40D3$B82(T40$B-%)!(C1373(NZT!(`
-M``^VJLH2``!(BP=`@/X#=@S'@'`!``#$`0``ZPK'@'`!``"H`0``2(E$)&!(
-M!70!``!(B40D4$B+5"1@BX)T`0``B04`````BTPD3(/A`[L'````T^-!B=Q!
-M"<1$B:)T`0``O^@#``#H`````/?31"'C2(M,)&")F70!``"`?"1+`W95BT0D
-M3,'@`DB82(V4`=`!``"+`HD%`````(/("(D"BUPD3,'C`TACVTB-A!D``@``
-MQP`X````OQ`G``#H`````$B+5"1@2(V$&@0"``#'``````#K6(M$)$S!X`)(
-MF$B+3"1@2(V4`=`!``"+`HD%`````(/("(D"BUPD3,'C`TACVTB-A!D``@``
-MQP`X````OQ`G``#H`````$B+5"1@2(V$&@0"``#'``````!-A?\/A#D(``!!
-M@'U#`'0LNP`````/MLM!#[9'#4C3^*@!=`^Z`0```(G.3(GOZ`````"#PP%!
-M.%U#=]E!]D<*`71J3(G^3(GOZ`````"+="1,3(GOZ`````!(8T0D3$B-%$!(
-MC12028U4U0"+@O`2``"I```0`'0+)?__[_^)@O`2``!,B?Y,B>_H`````$AC
-M1"1,2(T40$B-%)!)QX35T!(```````#IE0<``$&`?U@`=!1)B[VX$```3(G^
-MZ`````!!@&]8`4C'P/[___\/MDPD3$C3P$`@Z(A$)%L/A,`"``"+="1,3(GO
-MZ`````!(8T0D3$B-%$!(C12028U4U0"+@O`2``"I```0`'0+)?__[_^)@O`2
-M```/MD0D6T&(1PU!@'U#``^$[P$``,=$)%P`````#[;02(E4)#!(BTPD8$B!
-MP0`"``!(B4PD*$B+1"1@2`4$`@``2(E$)"`/ME0D6XE4)!Q(BTPD8$B!P=`!
-M``!(B4PD$$0/MG0D7$$/MNY(BT0D,(GI2-/XJ`$/A$T!``!(8\5(C11`2(T4
-MD`^V1"1;08B$U<H2``!!@/X##X:5````C1SM`````$ACVTB+1"0H2`'8QP`X
-M````OQ`G``#H`````$@#7"0@BU0D'(D32(M,)&#'@7`!``#$`0``2(M4)%"+
-M`HD%`````(GI@^$#NP<```#3XT&)W$$)Q$2)(K_H`P``Z`````#WTT0AXTB+
-M3"10B1F-%*T`````2&/22`-4)!"+`HD%`````(/("(D"Z98```"-'.T`````
-M2&/;2(M$)"A(`=C'`#@```"_$"<``.@`````2`-<)""+1"0<B0-(BU0D8,>"
-M<`$``*@!``!(BTPD4(L!B04`````B>F#X0.[!P```-/C08G<00G$2(M$)%!$
-MB2"_Z`,``.@`````]]-!(=Q(BU0D4$2)(HT4K0````!(8])(`U0D$(L"B04`
-M````@\@(B0*#1"1<`4&-1@%!.$5#=BSI@_[__TB)W^@`````2(UPR$B+4PA(
-MB4,(2(D82(E0"$B)`DB#>-@`=!'K";X`````28U?2$DY7TAURDB%]G0XQD9:
-M`$&`?4,`="VY`````+H`````00^V1PU(T_BH`70.#[;"B$P&<(!&6@&#P@&#
-MP0%!.$U#=]VZ`````+Z!````3(G_Z`````!(8T0D3$B-%$!(C1202<>$U=`2
-M````````08!]0P`/A7L#``#IG@0``+H`````O@8```!,B?_H`````(MT)$Q,
-MB>_H`````$AC1"1,2(T40$B-%)!)C535`(N"\!(``*D``!``=`LE___O_XF"
-M\!(``$F-1TA).4=(#X3]`0``2(D$)$B+/"3H`````$R-<,A(C5`02#E0$`^$
-MP`$``$F-1DA(B40D"$B+?"0(Z`````!(C5CP@'M)#7472(VP4`$``$B+0U!(
-MBP!(BW@HZ`````!(BQ-(BT,(2(E""$B)$("[@P````!T&TR)[^@`````OP$`
-M``#H`````("[@P````!UY4B+0T!(A<`/A"D!``!(QT!@`````("[@P`````/
-MA*8```!F08-]=``/A)H```"]`````$&\`````&9FD&:03(G@20.%N`D``$B+
-M,$B%]G1D#[=&(&8[0SAU6F8]A0!W5`^WP$&`O`5H"```_W1&28M5``^W1C)F
-MP>@%#[?`C02%``,``(F"<`$``$F+50`/MTXR@^$?N`$```!(T^")@G0!``#&
-M1B0AN@````!,B>_H`````(/%`4F#Q`A!#[=%=#GH#X]V____]D-,!'493(GO
-MZ`````!(BW-`N@$```!,B>_H`````$B+0T`/ME`"#[9P`4C'QP````"X````
-M`.@`````2(M30$F+M?@(``"_`0```.@`````2(M30$F+M?@(``"_!@```.@`
-M````2,=#0`````!!@&\.`4&`;E@!2(G>3(GOZ`````!(BU0D"$DY5D@/A4G^
-M__]!@&\H`4R)]DR)[^@`````2(L,)$DY3T@/A0?^__])C4=@23E'8`^$[```
-M`+T`````28G$3(GGZ`````!(B<.`N(,`````=#>-10&!_7^6F`!V!(G%ZRB)
-MQ4R)[^@`````OP$```#H`````("[@P````!T"X/%`8']@9:8`'7:2(M#0$B%
-MP'1V2,=`8`````#V0TP$=1E,B>_H`````$B+<T"Z`0```$R)[^@`````2(M#
-M0`^V4`(/MG`!2,?'`````+@`````Z`````!(BU-`28NU^`@``+\!````Z```
-M``!(BU-`28NU^`@``+\&````Z`````!(QT-``````$&`;PX!2(G>3(GOZ```
-M``!-.6=@#X4<____3(G^3(GOZ`````!(8T0D3$B-%$!(C1202<>$U=`2````
-M````Z7K\__]!OP`````/MD0D6TB)1"1`2(M4)&!(@<+0`0``2(E4)#A%B?Y!
-M#[;O2(M$)$")Z4C3^*@!=0M$.'PD2P^%U0```$&`_@-V:$B+1"1@QX!P`0``
-MQ`$``$B+5"10BP*)!0````")Z8/A`XT,2;L'````T^-!B=Q!"<1$B2*_Z`,`
-M`.@`````]]-$(>-(BTPD4(D9C12M`````$ACTD@#5"0XBP*)!0````"#R`B)
-M`NMG2(M$)&#'@'`!``"H`0``2(M4)%"+`HD%`````(GI@^$#C0Q)NP<```#3
-MXT&)W$$)Q$2)(K_H`P``Z`````#WTT$AW$B+3"101(DAC12M`````$ACTD@#
-M5"0XBP*)!0````"#R`B)`D&#QP%!C48!03A%0P^'^?[__TB#Q&A;74%<05U!
-M7D%?PV9F9I!F9F:09F9FD$%455-)B?Q(B?4/MG=#0(3V="8/ME4-NP````#V
-MP@%T#NL62(G0B=E(T_BH`74/@\,!0#CS=>SK!;L`````]D4,`G4*2(U%8$@Y
-M16!U:$B)[^@`````A,!T44R)Y^@`````2(G&2(7`=$Q(BU5H2(E%:$B-16!(
-MB09(B58(2(DR@$4.`4B);E#&1D@%QD9)`,:&@0````^Y`0```+H!````2(GO
-MZ`````#K"P^V\TR)Y^@`````6UU!7,-F9I!FD$%6055!5%532(G]08GU1`^V
-M]D*-!+4`````3&/@NP````"_$"<``.@`````08#]`W8>2(M%`$@%T`$``$P!
-MX(L`B04`````P>@4@^`!ZQV02(M%`$@%T`$``$F-!`2+`(D%`````,'H%(/@
-M`83`=0J#PP%F@?LL`76H1(GV2(GOZ`````!(B>_H`````$ECQDB-%$!(C120
-M2(U$U0#V@,D2```!=`](B[#0$@``2(GOZ`````!;74%<05U!7L-FD$%6055!
-M5%5308GU28G\1`^V]DECQDB-%$!(C1202(NLU]`2``!(A>T/A)8!``!(Q\#^
-M____1(GQ2-/`A$4-#X6``0``2(U%2$@Y14AU%4&]`````$B-76"`?0X`=2/I
-M\P(``$`/ML9(C3Q`2(T\N$F-O/S`$@``Z`````#IU0(``$B)W^@`````2(G!
-M2(M#"$B)2PA(B1E(B4$(2(D(@'E)``^%"0$```^W03A)@[S$:`0```!U"TB#
-M>4``#X39````#[=!.$F+A,1H!```2(.X@``````/A*<```#&@>@`````#[91
-M2$B)T(/@!DB#^`9U+?;"`70HQD%*!<9!2P0/MI&!````2(MQ6$B+>5#H````
-M`.F8````9F9FD&9FD`^V44A(B="#X`9(@_@$=2#VP@%T&\9!2@/&04L$2(G.
-M3(GGZ`````#K9V9FD&9FD`^V44A(B="#X`9(@_@&=5'VP@%U3,9!2P;&04H%
-M9L>!R```````2(G.3(GGZ`````#K+DB+44!)B[0D^`@``+\$````Z`````#K
-M%@^W43A)B[0D^`@``+\"````Z`````!!@\4!1#AM#@^&EP$``.F]_O__0HT$
-MM0````!(8^B[`````+\0)P``Z`````!!@/T#=AU)BP0D2`70`0``2`'HBP")
-M!0````#!Z!2#X`'K&TF+!"1(!=`!``!(`>B+`(D%`````,'H%(/@`83`=0J#
-MPP%F@?LL`76J1(GV3(GGZ`````!,B>?H`````$ECQDB-%$!(C12028NLU-`2
-M``!(A>T/A/T```!!@'PD0P!T++L`````#[;+#[9%#4C3^*@!=`^Z`````(G.
-M3(GGZ`````"#PP%!.%PD0W?900^VQ4B-%$!(C12028V4U,`2``!(B54@2(U%
-M2$@Y14AU.$B-16!(.45@=2[K>V9FD&:02(G?Z`````!(C7#(2(M3"$B)0PA(
-MB1A(B5`(2(D"2(-XV`!T$>L)O@````!(C5U(2#E=2'7*2(7V=%O&1EH`08!\
-M)$,`=$^Y`````+H`````#[9%#4C3^*@!=`X/ML*(3`9P@$9:`8/"`8/!`4$X
-M3"1#=B+KV_9%"@%T#4B)[DR)Y^@`````ZPV^`````$B)[^@`````6UU!7$%=
-M05[#D$B#[`A,BP=$BT\T00^V<$-`A/9T8DF-@,`2``"Y`````$@Y^'4:ZT\/
-MML%(C11`2(T4D$F-E-#`$@``2#GZ=`B#P0%`./%UX(#Y`W8O28L`2`70`0``
-M2(T4C0````"!XOP#``!(`="+`(D%`````,'H%(/@`>LMN0````!)BP!(!=`!
-M``!(C12-`````('B_`,``$@!T(L`B04`````P>@4@^`!A,!T$`^V\42)RDR)
-MQ^@`````ZPL/MO%,B<?H`````$B#Q`C#9F9FD&9F9I!!5T%6055!5%532(/L
-M"$B)\TF)_DR+IX@```!)BRPD0?9$)`P0=`3&1U$&00^V1E$\`71Y/`%R%3P$
-M#X29````/`8/A4@#``#IN@$``$'&1E$!3(GV2(GOZ`````#&0R2!08!,)`P(
-M2(.[@`````!T#TB-LX````!(B>_H`````$B-E0`!``!(BX4``0``2(E8"$B)
-M`TB)4PA(B9T``0``2(GOZ`````#IXP(``$&`9"0,]T&`1E(!0<9&40#&0R0"
-M2(G>2(GOZ`````!(B>_H`````.FW`@``00^V1"0,@^#W@\@008A$)`Q!BY8(
-M`0``C4(!08F&"`$``(/Z`@^'`P$``$B#NX``````=`](C;.`````2(GOZ```
-M``!(C94``0``2(N%``$``$B)6`A(B0-(B5,(2(F=``$``$&`?D(`=1A!OP``
-M``!-C6PD8$&`?"0.`'4>Z9X```"Z`````+X"````3(GGZ`````!FD.D;`@``
-M3(GOZ`````!(B<-)BT4(28E="$R)*TB)0PA(B1A(BU-`2(72=!5(B[7X"```
-MOP4```#H`````(!+3`)(B=J^!@```$R)Y^@`````@+N#`````'0B9F9FD&9F
-MD$B)[^@`````OP$```#H`````("[@P````!UY4&#QP%%.'PD#@^'>____TR)
-M]^@`````Z8D!``!!@&0D#/=!QX8(`0```````$B#NX``````=`](C;.`````
-M2(GOZ`````!(C94``0``2(N%``$``$B)6`A(B0-(B5,(2(F=``$``+H`````
-MO@8```!,B>?H`````$F-1"1@23E$)&!T?$F)Q4R)[^@`````2(G#2(M`0$B%
-MP'132,=`8`````!(B>_H`````$B+<T"Z`0```$B)[^@`````2(M30$B+M?@(
-M``"_`0```.@`````2(M30$B+M?@(``"_!@```.@`````2,=#0`````!(B=Y(
-MB>_H`````$TY;"1@=8=,B?9(B>_H`````$G'1"1``````$B+10"+D%@!``")
-M%0````"%TG0*2(M%`(F06`$``$'V1"0*`71K@'U#`'0LN0````!!]D0D#0%T
-M%>L=9F:09F:000^V1"0-2-/XJ`%U#X/!`3A-0W?KZP6Y``````^VV8G>2(GO
-MZ`````!,B>9(B>_H`````$ACVTB-!%M(C02#2,>$Q=`2````````9F:09I!(
-M@\0(6UU!7$%=05Y!7\.02(/L*$B)7"0(2(EL)!!,B60D&$R);"0@2(GS2(G]
-M3(MO4$V+90`/MTXRB<AFP>@%#[?P2&/&08M$A'B#X1](T_BH`0^%9P,``$F+
-M%"2-!+4``P``B8)P`0``28L$)(N0=`$``(D5`````,9#)"&+0S@E____`#WA
-M`0\`=2-(B=_H`````+H`````2(G>3(GGZ`````#I%@,``&9FD&9FD(G0#[=+
-M,H/A'TC3^*@!=!!(B=_H`````$R)Y^@`````#[:%Z````#P$#X?A`@``#[;`
-M_R3%`````,:%Z`````&Z`0```$B)WDR)[^@`````Z;L"``#&A>@````"N@@`
-M``!(B=Y,B>_H`````.F?`@``QH7H`````TB)ZKXA````3(GOZ`````!(BW58
-M2(7V=!\/MI6!````0;@`````N0$```!,B>_H`````.E@`@``00^V=0VZ````
-M`$R)Y^@`````Z4D"``#&A>@````$2(-]6`!T,TB)ZKXA````3(GOZ``````/
-MMI6!````2(MU6$&X`````+D"````3(GOZ`````#I"`(``+H`````OB$```!,
-MB>_H`````$$/MG4-N@$```!,B>?H`````.G?`0``@'U*_W052(GJO@8```!,
-MB>_H`````.G$`0``2(GJO@8```!,B>_H`````$B+34!(A<ET$HM1!(U"`8E!
-M!(/Z!0^&F0$``,9%2P'&14H`@+V#`````'0;3(GGZ`````"_`0```.@`````
-M@+V#`````'7E2(-]6`!T&4B+51!(BT482(E""$B)$$B+15B`:%@!ZQE(BU5@
-M2(72=!`/MH6!````2,=$PE@`````2(M5`$B+10A(B4((2(D008!M#@%(B[T@
-M`0``2(7_=!$/MK4-`0``N@$```#H`````$B+?5A(A?]T$0^VM8$```"Z`0``
-M`.@`````2(M%0$B%P'1R2,=`8`````!,B>?H`````$B+=4"Z`0```$R)Y^@`
-M````2(M%0`^V4`(/MG`!2,?'`````+@`````Z`````!(BU5`28NT)/@(``"_
-M`0```.@`````2(M50$F+M"3X"```OP8```#H`````$C'14``````2(GN3(GG
-MZ`````!!@'T)_W1<O0````!!@'T.`'0YO0````!)C5U@9F9FD&9FD$B)W^@`
-M````2(M3"$B)0PA(B1A(B5`(2(D"@'A*_W4)@\4!03AM#G?703AM#G<10<9%
-M"?],B>Y,B>?H`````)!(BUPD"$B+;"003(MD)!A,BVPD($B#Q"C#9F9FD&9F
-MD$%7059!54%455-(@^QH28G_2(N'B````$B)1"1@2(LH2(N%H!$``$2+,$B)
-M_DB)[^@`````08!_4@%V!4'&1U$$28U?*$DY7R@/A%,!``!(B=_H`````$B)
-M1"1828M'*$B+5"182(E0"$B)`DB)6@A)B5<H2(72#X0[`P``2(M,)&!(BT$@
-M#[9-00^V53H/MG4Y2(M<)%A$#[=+,D0/MD`(2,?'`````+@`````Z`````!$
-M#[=K,DUIY;`$``!,`Z5`$0``2(N=X!```$B+?"18Z`````!!BXPD)`0``$&+
-ME"0@!```2(M\)%@/MW<R18N,)"P$``!%BX0D*`0``$C'QP````"X`````.@`
-M````2<'E!DP!ZXM#-(M[,$2+4RQ$BULH1(MC)$2+:R"+4QR)5"1,BTL8B4PD
-M4(M3%(E4)%1$BTL01(M##(M+"(M3!(LSB40D0(E\)#A$B50D,$2)7"0H1(ED
-M)"!$B6PD&(M<)$R)7"00BWPD4(E\)`B+1"14B00D2,?'`````+@`````Z```
-M``!F@WUT`'4[Z>L!``!(BU0D8$B+0B`/MDU!#[95.@^V=3E!N?___P!$#[9`
-M"$C'QP````"X`````.@`````Z1$"``"[`````$R-I:@/``!,C:T``0``9F:0
-M9I`/M\-(P>`#2`.%N`D``$B+,$B%]@^$=@$```^W1B!F03E'0`^%9P$```^W
-ME;H2``!!.=9T4(/"`0^WA;X2```YPK@`````#T/0C4(!2,'@`D@#A:`1``"+
-M`*D```@`=2!F)?\/9CG8=1=(.70D6'452(GOZ`````#I?`$``&9FD$0Y\G6P
-M#[=&(&8]A0!F9I`/A_H````/M\"`O`5H"```_P^$Z0```$B+3"1@@'E8``^%
-MV@```/9!"@$/A-````!(BU4`#[=&,F;!Z`4/M\"-!(4``P``B8)P`0``2(M%
-M``^W3C*#X1^Z`0```$B)UTC3YXFX=`$```^W1C)(P>`#2`.%N`D``$C'````
-M```/MTXRB<AFP>@%)?\'``"#X1](B==(T^=(B?GWT2&,A<`)```/MTXRB<AF
-MP>@%)?\'``"#X1](T^+WTB%4A7A(.70D6'0G2(L&2(M6"$B)4`A(B0)(BX4`
-M`0``2(EP"$B)!DR);@A(B;4``0``#[=V,DR)Y^@`````08!O10%F9F:0@\,!
-M9CE==`^'8_[__TB+1"1@]D`*`7112(M,)%A(BQ%(BT$(2(E""$B)$$B)SDR)
-M_^@`````ZS%(BUPD8$B+0R`/MDU!#[95.@^V=3E!N?___P!$#[9`"$C'QP``
-M``"X`````.@`````2(/$:%M=05Q!74%>05_#9F9FD&9F9I!!5T%6055!5%53
-M2(/L*$F)^$B)5"0@3(LO#[?V2,'F`TD#M;@)``!(BRYF@7TXX0%U+@^V13J#
-MZ!$\`7<C3(M_0$C'1"08`````$B%TG5I0<9'40!(QT0D&`````#K69!)BXU`
-M"0``N&">`0!F@7T@A0!W'`^W12!!#[:$!6@(``!(C11`2(T4D$B)T$C!X`5(
-M`<%(B4PD&$&_`````$B#?"0@`'422(M$)!C&@.@`````0;\`````@'TD@74%
-M08!@#/=(@WPD(``/A0(!``#&120`]H66````(`^$0@4``$B+16A(A<`/A#4%
-M``!(B</V@+$````"=!U(B[B@````2(7_=!%(BW5(2(7V=`B+533H`````$F+
-ME1`1``!(@<)`"```2(M,)!@/MD%RP>`(2)A(`<*+`HD%`````(G"P>H0B).;
-M````P>@89HF#D````$F+E1`1``!(@<)$"```#[9!<L'@"$B82`'"BQ*)%0``
-M```/ML)FB8.4````#[;&9HF#E@```(G0P>@0#[;`9HF#F````,'J&(B3F@``
-M`$F+E1`1``!(@<),"```#[9!<L'@"$B82`'"BP*)!0`````/ML!FB8.2````
-MZ5$$```/MT4R2&G`L`0``$V+I4`1``!)`<1)C9PD(`0``(!])(!U!,9%)"%(
-M@WPD&`!T4TB+1"082(-X0``/A8````"+?31$#[:(@0```$F+0"!$#[9`"$$/
-MMDU!00^V53I!#[9U.4B+1"0@2(E$)`B)/"1(Q\<`````N`````#H`````.L]
-M387_=#A$BTTT28M`($0/MD`(00^V34%!#[95.D$/MG4Y2(M$)"!(B00D2,?'
-M`````+@`````Z`````!FD(M+!(L3#[=U,D2+2PQ$BT,(2,?'`````+@`````
-MZ`````!!]D0D(@%T?4R-95A,B[6`````08M4)`1!#[9T)`%(Q\<`````N```
-M``#H`````(!]6``/A/4```"[``````^VPTB-!$!(P>`"28M4)`A(`<))`T80
-MBTH(2(L2#[;S1(M("$R+`$C'QP````"X`````.@`````@\,!03@<)`^&JP``
-M`.NY08!\)"<`9F:0#XF:````#[=U,HGR9L'J!0^WT@^W]DC'QP````"X````
-M`.@`````08N-R`D``$&+E<0)``!!B[7`"0``18N%S`D``$C'QP````"X````
-M`.@`````#[=U,DC'QP````"X`````.@`````28M5``^W13)FP>@%#[?`C02%
-M``,``(F"<`$``$F+50`/MTTR@^$?N`$```!(T^")@G0!``!FD&:!?3CA`748
-M#[9%.H/H$3P!=PU,B?_H`````.DB`@``#[94)"/VP@$/A/(!``"+13@E____
-M`#WA`0X`#X3?`0``28N5$!$``$B!PD`(``!(BTPD&`^V07+!X`A(F$@!PD2+
-M(D2))0````!)BY40$0``2('"1`@```^V07+!X`A(F$@!PD2+,D2)-0````!)
-MBY40$0``2('"2`@```^V07+!X`A(F$@!PHL:B1T`````28N5$!$``$B!PDP(
-M```/MD%RP>`(2)A(`<)$BP)$B04`````B=E$B?)$B>9(Q\<`````N`````#H
-M`````/:%E@```"`/A.H```!(BWUHQH>R````$,9%)"!$B>#!Z!"(AYL```!$
-MB>#!Z!AFB8>0````B=C!X`A!#[;6`=!FB8>4````B=BP`$R)\0^VU0'09HF'
-ME@```(G:P>H0P>((1(GPP>@0#[;``<)FB9>8````28N5$!$``$B!PDP(``!(
-MBTPD&`^V07+!X`A(F$@!PHLRB34`````0`^V]F:)MY(````/MX^6````#[>7
-MF`````^W]D0/MX>4````2,?'`````+@`````Z`````!)BY40$0``2('"0`@`
-M`$B+3"08#[9!<L'@"$B82`'"QP(`````ZUYF@7TXX0%U)`^V13J#Z!H\`7<9
-M2,?'`````+@`````Z`````#&120AZS1FD$B)[DR)[^@`````ZR5F9I"$TGD>
-M28M%`(N(6`$``(D-`````(7)=`I)BT4`B8A8`0``2(/$*%M=05Q!74%>05_#
-M9F9FD&9F9I!F9F:09F:02(/L"`^V1CA(.7XH=4H\"'1E/"AT83RH=%T\B&9F
-M9I!T53P*=%$\*G1-/*IF9F:0=$4\BG1!2(N'``$``$B)<`A(B09(C8<``0``
-M2(E&"$B)MP`!``#K'TB+EP@!``!(B;<(`0``2(V'``$``$B)!DB)5@A(B3+H
-M`````$B#Q`C#9F9FD&9F9I!F9F:09F:02(/L".@`````2(/$",-FD%-(@^Q@
-M2(G[2(U,)%U(C50D7DB-="1?#[=_/$B-1"122(E$)#A(C40D5$B)1"0P2(U$
-M)$Q(B40D*$B-1"1.2(E$)"!(C40D6$B)1"082(U$)%I(B40D$$B-1"1;2(E$
-M)`A(C40D5DB)!"1,C4PD7$R-1"10Z``````/ME0D7P^V="1>2(U\)$CH````
-M``^V1"1?2(T40$B-%)!(P>(%2(MS($B-NR`)``"Y`0```.@`````#[94)%U(
-MC1322,'B!4B+<R!(C;M("0``N0$```#H``````^V5"1>2&G2R`\``$B+<R!(
-MC;MP"0``N0$```#H``````^W5"182,'B`TB+<R!(C;N8"0``N0$```#H````
-M``^W1"102(T4@$B-%)!(P>(#2(MS($B-NW`*``"Y`0```.@`````#[94)%P/
-MMT0D4$@/K]!(C1122,'B`DB+<R!(C;L`"@``N0$```#H`````$B+<R!(C;LH
-M"@``N0$```"Z``(``.@`````#[9,)%](BW,@2(V[8`L``+H`"```Z``````/
-MME0D6TC!X@5(BW,@2(V[P`H``+D!````Z`````!(BW,@2(V[Z`H``+D!````
-MN@`!``#H``````^V5"1:2(T4DDC!X@5(BW,@2(V[$`L``+D!````Z``````/
-MMU0D5DB-%))(P>(#2(MS($B-NS@+``"Y`0```.@`````#[=4)%A(`=)(BW,@
-M2(V[@`\``+D!````Z``````/ME0D7T@!TDB+<R!(C;NX#P``N0$```#H````
-M``^V5"1=2`'22(MS($B-N_`/``"Y`0```.@`````#[94)%Y(`=)(BW,@2(V[
-M*!```+D!````Z``````/ME,^2`'22(MS($B-NV`0``"Y`0```.@`````#[=4
-M)$Y(C1122,'B!$B+<R!(C;N8"@``N0$```#H`````(M4)$A(BW,@2(V[F!``
-M`+D!````Z``````/MU0D6$C!X@9(BW,@2(V[P!```$&X`0```+E`````Z```
-M``!(BW,@2(V[\!```$&X`0```+D``0``N@`9``#H``````^W5"182&G2L`0`
-M`$B+<R!(C;L@$0``0;@!````N8````#H``````^W5"142,'B`DB+<R!(C;M0
-M$0``0;@!````N00```#H``````^W5"122,'B`DB+<R!(C;N`$0``0;@!````
-MN00```#H``````^V5"1;P>(+2(MS($B-N[`1``!!N`$```"Y"````.@`````
-M2(MS($B-N^`1``!!N`$```"Y"````+H```@`Z``````/MU0D5DAITHP!``!(
-MBW,@2('#$!(``$&X`0```+D(````2(G?Z`````"X`````$B#Q&!;PV9FD&:0
-M2(/L.$B)7"0(2(EL)!!,B60D&$R);"0@3(ET)"A,B7PD,$F)]TF)_4B+!TB)
-M!"1,C6=(3(GGZ`````!(B<-,C7#(2(L\).@`````2(G%28M%4$F)75!-B68X
-M28E&0$B)&+@!````2(7M='C&13CAQD4Y`<9%.A"`33L!28N'H````$B)16A(
-MBT5P3(EX*$F-AY````!(B450QD4ES$$/MD9;9HE%($F+10!(B44HQT4TD```
-M`$R)?4A(QX6@`````````$B-?5B^`````.@`````2(GN2(L\).@`````N```
-M``!(BUPD"$B+;"003(MD)!A,BVPD($R+="0H3(M\)#!(@\0XPV9F9I!F9I!F
-M9I!!5T%6055!5%532(/L&$B)_4C'1"00`````$B+1"00#[:4*.X(``"`^O\/
-MA.H````/MLI(C02)2(T$@4B-A,7(`0``2(E$)`@/MO)(8\9(C12`2(T4D("\
-MU=8!````#X2V````0;P`````2(T$B4B-!(%(P>`#3(VT!2@"``!,C2PH2&/&
-M2(T4@$B-%)!,C;S5P`$``$R)]^@`````2(G#28N%,`(``$F)G3`"``!,B3-(
-MB4,(2(D82(M30$B%TG052(NU^`@``+\%````Z`````"`2TP"2(G:O@(```!(
-MBWPD".@`````@+N#`````'0;2(GOZ`````"_`0```.@`````@+N#`````'7E
-M08/$`44X9Q8/AWO___](@T0D$`%(@WPD$`0/A>[^__](B>_H`````$B#Q!A;
-M74%<05U!7D%?PV9F9I!F9I!F9I!F9I!!5T%6055!5%532(/L>$B)^\9'40#&
-M1U``QD=/`,:'<10```!(C9?`$@``N`````#&!!``2(/``4@]H`$``'7P2(V#
-M``$``$B)@P`!``!(B8,(`0``2(V#$`$``$B)@Q`!``!(B8,8`0``3(VC(`$`
-M`$R)HR`!``!,B:,H`0``3(VK,`$``$R)JS`!``!,B:LX`0``2(V#0`$``$B)
-M1"1(2(F#0`$``$B)@T@!``!(C8M0`0``2(E,)%!(B8M0`0``2(F+6`$``$R-
-MLW`!``!,B;-P`0``3(FS>`$``$B-LX`!``!(B70D0$B)LX`!``!(B;.(`0``
-M3(V[8`$``$R)NV`!``!,B;MH`0``2(U,)&Y(C50D<$B-="1Q#[=[/$B-1"1R
-M2(E$)#A(C40D=$B)1"0P2(U$)&1(B40D*$B-1"1J2(E$)"!(C40D=DB)1"08
-M2(U$)&Q(B40D$$B-1"1M2(E$)`A(C40D:$B)!"1,C4PD;TR-1"1FZ``````/
-MMD0D<8A#1@^V1"1PB$-'#[9$)&Z(@_T````/MT0D=F:)0W0/MT0D=&:)@[P2
-M```/MT0D<H/H`6:)@[X2```/MT0D9F:)0U(/MT,\9CV`D70*9CV`E`^%J`D`
-M`,9#303&0T,$QD-.0,9#3`#&@_H````)QD-$`$B-NR`)``#H`````$B)P4B)
-M@T`)```/MD0D<4B-%$!(C1202,'B!4B%TG002(G(Q@``2(/``4B#Z@%U\TB-
-MNT@)``#H`````$B)P4B)@V@)```/MD0D;DB-!,!(B<)(P>(%2(72=!!(B<C&
-M``!(@\`!2(/J`77S2(V[<`D``.@`````2(G!2(F#D`D```^V1"1P2&G0R`\`
-M`$B%TG002(G(Q@``2(/``4B#Z@%U\TB-NY@)``#H`````$B)P4B)@[@)```/
-MMT0D=DB-%,4`````2(72=!!(B<C&``!(@\`!2(/J`77S2(V[*`H``.@`````
-M2(F#2`H``$B-NP`*``#H`````$B)Q4B)@R`*``!(C;MP"@``Z`````!(B<)(
-MB8.0"@``9H-\)&8`=$BY`````$B):F`/MD0D;XA"6$B+@R@!``!(B9,H`0``
-M3(DB2(E""$B)$`^V1"1O2(T$0$B-;(4`2('"J````(/!`68Y3"1F=[U(C;N8
-M"@``Z`````!(B<)(B8.X"@``9H-\)&H`="^Y`````,9"$`!(BX,X`0``2(F3
-M.`$``$R)*DB)0@A(B1!(@\(P@\$!9CE,)&IWUDB-N\`*``#H`````$B)PDB)
-M@^`*``"`?"1M`'0SN0````!(BX-(`0``2(F32`$``$B+="1(2(DR2(E""$B)
-M$$B#PB"#P0$/MD0D;68YR'?22(V[Z`H``.@`````2(G"2(F#"`L``$B-B``!
-M``!(BX-8`0``2(F36`$``$B+="102(DR2(E""$B)$$B#PB!(.<IUVDB-NQ`+
-M``#H`````$B)PDB)@S`+``"`?"1L`'0QN0````!(BX-X`0``2(F3>`$``$R)
-M,DB)0@A(B1!(@<*@````@\$!#[9$)&QF.<AWU$B-NS@+``#H`````$B)PDB)
-M@U@+``!F@WPD:`!T*[D`````2(N#:`$``$B)DV@!``!,B3I(B4((2(D02(/"
-M*(/!`68Y3"1H=]J`?"1Q`'1)O0````!,C:-@"P``3(GGZ``````/M]5(B833
-M@`L``$B+DX@!``!(B8.(`0``2(M,)$!(B0A(B5`(2(D"@\4!#[9$)'%F.>AW
-MPTB-NX`/``#H`````$B)@Z`/``!(B8.H#P``#[=T)'9FB;.R#P``#[?V2(V[
-MJ`\``.@`````2(V[N`\``.@`````2(F#V`\``$B)@^`/```/MG0D<6:)L^H/
-M```/M_9(C;O@#P``Z`````!(C;OP#P``Z`````!(B8,0$```2(F#&!````^V
-M="1N9HFS(A````^W]DB-NQ@0``#H`````$B-NR@0``#H`````$B)@T@0``!(
-MB8-0$```#[9T)'!FB;-:$```#[?V2(V[4!```.@`````2(V[8!```.@`````
-M2(F#@!```$B)@X@0```/MD,^9HF#DA````^V<SY(C;N($```Z`````!(C;N8
-M$```Z`````!(B<%(B8.X$```#[9$)'!(C03`2,'@!XG&@<9@5P``=!*)\DB)
-MR,8``$B#P`%(@^H!=?-(BX.X$```B3!(BY.X$```#[9$)'"(0@0/ME0D<$B+
-MN[@0``#H`````$&X`````(![/@`/A*@```"_``````^WQTB-%(!(C1202,'B
-M`TR-A!/(`0``2(T$&DB-L,`!``!`B'X0QD81`$B)F,@!``#&1A8`QH`@`@``
-M`,:`\`$```#'@&@"````````2(V,$_@!``!(B8CX`0``2(F(``(``$B-C!,0
-M`@``2(F($`(``$B)B!@"``!(C903*`(``$B)D"@"``!(B9`P`@``QD82`H/'
-M`0^V0SYF.?@/AUW____&0TP`QH/N"```_\:#[P@``/_&@_`(``#_QH/Q"```
-M_X!\)'$`#X26````O@`````/M\Y(C01)2(T$@4C!X`5(BY-`"0``QD0"2P%(
-MBY-`"0``QD002@!(BY-`"0``QH00@````/](BY-`"0``QD00<O](BY-`"0``
-M9L>$$,@``````$C'A,MH!````````$B)P4@#BT`)``!(C5$@2(E1($@#@T`)
-M``!(C5`@2(E0*(/&`0^V1"1Q9CGP#X=O____9L>#^```````N`````#&A!AH
-M"```_TB#P`%(/88```!U[(!\)'``#X2]````O@`````/M\9(:<#(#P``2(N3
-MD`D``,9$`E@`2(N3D`D``,9$$%D`2(N3D`D``$C'1!`0`````$B)P4@#BY`)
-M``!(C5$82(E1&$B)P4@#BY`)``!(C5$82(E1($B)P4@#BY`)``!(C5$H2(E1
-M*$B)P4@#BY`)``!(C5$H2(E1,$B+DY`)``!,B400"$B)P4@#BY`)``!(C5%(
-M2(E12$@#@Y`)``!(C5!(2(E04(/&`0^V1"1P9CGP#X=(____QH/[````@(!\
-M)&X`#X2"````O@`````/M\9(C03`2,'@!4B+DV@)``!FQT0"3@0`2(N3:`D`
-M`,9$$$(`2(N3:`D``,9$$$3_2(N3:`D``,9$$%#_2(G!2`.+:`D``$B-42A(
-MB5$H2(G!2`.+:`D``$B-42A(B5$P2(N3:`D``$R)A!"(````@\8!#[9$)&YF
-M.?!W@\:#_````()(C;/H$```2(V[P!```.@`````2(F#X!```$B-LQ@1``!(
-MC;OP$```Z`````!(B8,0$0``2(VS2!$``$B-NR`1``#H`````$B)@T`1``!(
-MC;-X$0``2(V[4!$``.@`````2(F#<!$``$B-LZ@1``!(C;N`$0``Z`````!(
-MB8.@$0``2(VSV!$``$B-N[`1``#H`````$F)Q$B)@]`1``!(BZO8$0``@'PD
-M;0!T4D&]`````$B+?"1(Z`````!,B6`02(EH&$B+DT@!``!(B8-(`0``2(MT
-M)$A(B3!(B5`(2(D"28'$``@``$B!Q0`(``!!@\4!#[9$)&UF1#GH=[1(C;,(
-M$@``2(V[X!$``.@`````28G$2(F#`!(``$B+JP@2``!!O0````!(BWPD4.@`
-M````3(E@$$B):!A(BY-8`0``2(F#6`$``$B+3"102(D(2(E0"$B)`DF!Q```
-M`0!(@<4```$`08/%`69!@_T(=;A(C;,X$@``2(V[$!(``.@`````2(F#,!(`
-M`$R+HS@2``!F@WPD:`!T2$B)Q4&U`$R)_^@`````2(EH$$R)8!A(BY-H`0``
-M2(F#:`$``$R).$B)4`A(B0)(@<6,`0``28'$C`$``$&#Q0%F1#EL)&AWODB#
-MQ'A;74%<05U!7D%?PT%505154TB#[`A)B?U)B?1(BYZ(````#[961TB)_DB)
-MW^@`````2(G%9D&#3"1.$$&`?4,`=%FY`````/9##0%T#>M,#[9##4C3^*@!
-M=0V#P0%!#[9%0V8YR'?H9H/Y`W8S28M%`$@%T`$``$B-%(T`````@>+\_P,`
-M2`'0BP")!0````#!Z!2#\`&#X`'K,;D`````28M%`$@%T`$``$B-%(T`````
-M@>+\_P,`2`'0BP")!0````#!Z!2#\`&#X`&$P'00#[;Q3(GOZ`````#IEP$`
-M`$B-0V!(.4-@#X09`0``2(7M#X00`0``#[:%@0```$G'1,18`````$B+50!(
-MBT4(2(E""$B)$$B)ZKX&````2(G?Z`````"`O8,`````=!M,B>_H`````+\!
-M````Z`````"`O8,`````=>5(BT5`2(7`=$A(QT!@`````/9%3`1U"$R)[^@`
-M````2(M50$F+M?@(``"_`0```.@`````2(M50$F+M?@(``"_!@```.@`````
-M2,=%0`````"`:PX!2(GN3(GOZ`````!)BT4`BY!8`0``B14`````A=)T"DF+
-M10")D%@!``!!QD0D0@!F08-D)$[O08!\)#L`="JZ``````^WPDF+1,182(7`
-M=`J`>$K_#X5^````@\(!00^V1"0[9CG0=]M!@'PD3@!X#[T`````08!\)#L`
-M=1'K2TR)YDR)[^@`````9I#K2@^WQ4F+7,182(7;="'V0TP"=!M(BU-`28NU
-M^`@``+\&````Z`````"`8TS]9I"#Q0%!#[9$)#MF.>AWQ&9!QT0D3@(`08!D
-M)$G]2(/$"%M=05Q!7<-F9I!F9I!F9I!!5T%6055!5%532(/L>$F)_TB)?"10
-M2(M'4$B)1"1P2(LH2(N%H!$``$2+,$B)_DB)[^@`````08"_ZP````%V"$'&
-MA^@````$28U'($C'1"1H`````$DY1R!T*4F-7R!(B=_H`````$B)1"1H28M'
-M($B+5"1H2(E0"$B)`DB)6@A)B5<@28-_0`!U3+____\`2(-\)&@`=`E(BTPD
-M:`^W>3)%#[:/@0```$B+="1P2(M&($0/MD`(#[9-00^V53H/MG4YB3PD2,?'
-M`````+@`````Z`````!(@WPD:``/A,X#``!(BT0D:$0/MV@R36GEL`0``$P#
-MI4`1``!(BYW@$```2(G'Z`````!!BXPD)`0``$&+E"0@!```2(M$)&@/MW`R
-M18N,)"P$``!%BX0D*`0``$C'QP````"X`````.@`````2<'E!DP!ZXM#-(M[
-M,$2+4RQ$BULH1(MC)$2+:R"+4QR)5"1<BTL8B4PD8(MS%(ET)&1$BTL01(M#
-M#(M+"(M3!(LSB40D0(E\)#A$B50D,$2)7"0H1(ED)"!$B6PD&(M$)%R)1"00
-MBT0D8(E$)`B+1"1DB00D2,?'`````+@`````Z`````!,BV0D:$F#Q%A(BU0D
-M:$R+JH````!!BU0D!$$/MG0D`4C'QP````"X`````.@`````08!\)`$`=$Z[
-M`````&9F9I!F9I`/ML-(C01`2,'@`DF+5"0(2`'"20-%$(M*"$B+$@^V\T2+
-M2`A,BP!(Q\<`````N`````#H`````(/#`4$X7"0!=[YF@WUT``^$(@(``$&\
-M`````$R-K:@/``!(C8T``0``2(E,)$A!#[?$2,'@`T@#A;@)``!(BQA(A=L/
-MA-\!```/MT,@9D$Y1S@/A=`!```/MY6Z$@``03G6=&QF9F:0@\(!#[>%OA(`
-M`#G"N``````/0]"-0@%(P>`"2`.%H!$``(L`J0``"`!U.&8E_P]F1#G@=2Y(
-M.5PD:'4L2(M$)&@/MW`R2,?'`````+@`````Z`````!(B>_H`````.F?`0``
-M1#GR=9A(BU0D<(!Z6``/A4D!```/MT,@9CV%``^'.P$```^WP("\!6@(``#_
-M#X0J`0``2(-\)%``#X0$`0``00^V1TBH`0^$]P```*@$#X3O````2(M5``^W
-M0S)FP>@%#[?`C02%``,``(F"<`$``$B+10`/MTLR@^$?N@$```!(B=9(T^:)
-ML'0!```/MT,R2,'@`T@#A;@)``!(QP``````#[=+,HG(9L'H!27_!P``@^$?
-M2(G62-/F2(GQ]]$AC(7`"0``#[=+,HG(9L'H!27_!P``@^$?2-/B]](A5(5X
-M2#M<)&AT14B+$TB+0PA(B4((2(D02(.[@`````!T#TB-LX````!(B>_H````
-M`$B+A0`!``!(B5@(2(D#2(M$)$A(B4,(2(F=``$```^W<S),B>_H`````$&`
-MKX,````!ZQI(BU0D</9""@)T#TB)WDR)_^@`````9F9FD$&#Q`%F1#EE=`^'
-M]_W__TB#?"10`'0K00^V1TBH`70BJ`1T'DB+3"1H2(L12(M!"$B)0@A(B1!(
-MB<Y,B?_H`````$B#Q'A;74%<05U!7D%?PY"0D)"0D)"0D)"0D)"0D$B+1U!,
-MBPA!N`````!$C1060P^VA`AH"```//]T0@^VP$B-%$!(C1202,'B!4B)T$D#
-M@4`)``!`.+`.`0``=2!(.;@@`0``=1=$B)`-`0``28N!0`D``(B,`@P!``!F
-MD$F#P`%)@?B`````=:3SPY!(BW]8#[:'P````#Q/=S$/ML!(C01`2,'@!`'R
-MB)0'R0````^VA\````!(C01`2,'@!(B,!\@```"`A\`````!\\-F9F:09F9F
-MD&9FD&9FD$&X_____V:%]G1,2(GZ0;C_____OP````!F9F:09F:0#[8*C4'0
-M/`EW&T&`^/^X`````$0/1,!!#[;`C02`1(U$0=#K!D&`^/]U#(/'`4B#P@%F
-M.?=UR4$/ML##9F9FD$&)T4B+1U!,BP"Y`````)!"#[:$`6@(```\_W0S#[;`
-M2(T40$B-%)!(P>(%2(G020.`0`D``$@YN"`!``!U$4`XL`T!``!U"$2(B`\!
-M``##2(/!`4B!^8````!UL_/#D$F)TTB+1U!,BPA,BU=80;@`````0P^VA`AH
-M"```//]T1`^VP$B-%$!(C1202,'B!4D#D4`)``!(.;H@`0``=25`.+(-`0``
-M=1R$R70,2(N"&`$``$F)`^L928L#2(F"&`$``.L-28/``4F!^(````!UHDR)
-MU[@`````9F:09F:0#[:7R````(#Z`79$@/H7=#]`.+?)````=3:$R7062)A(
-MC01`2,'@!$F+A`+0````28D#PTB82(T$0$C!X`1)BQ-)B90"T````,-F9I!F
-M9I"#P`%(@\<P@_A0=:3SPV:0059!54%455-(@^P028G^08GQ2(N_*`$```^V
-M1P+!X`@/ME<#1(T$$$$/M\"#P`0]``@```^/[````$"$]G1,00^VEA`!``"^
-MX/___R'6#[9'`8/@#XG1@^$0"?`)R+X(````(=:#X/.)T8/A!`GP"<B#X@*#
-MX/Q!#[:.$`$``(/A`0G0"<B(1P'K2@^V5P&^X/___R'600^VAA`!``"#X`^)
-MT8/A$`GP"<B^"````"'6@^#SB=&#X00)\`G(@^("@^#\#[9/`8/A`0G0"<A!
-MB(80`0``2(U7"$$/M\!,C60'!$DYU'8_2(E4)`B[`````$$/MNE,C6PD"&9F
-MD&9FD`^V\XGI3(GJ3(GWZ`````!(BT0D"$B#P`1(B40D"(/#`4PYX'+:2(/$
-M$%M=05Q!74%>PV9F9I!F9I!F9I!F9I!32(G[2(M.2`^V00+!X`@/ME$#`=`/
-MM\"-4`0/MT8T.<)_'TB+OR@!``!(8])(B<[H`````+X`````2(G?Z`````!;
-MPV9F9I!F9F:09F9FD$%7059!54%455-(@^P(28GW08G42(M?6$F)WKT`````
-M3(UN!`^V@\@````\`79!/!=T/40XH\D```!U-$$/ME<#2&/%2(T$0$C!X`1)
-MC;P&V````(#Z(+@@````#T?0#[;23(GNZ`````!F9I!F9I"#Q0%(@\,P@_U0
-M=:A(@\0(6UU!7$%=05Y!7\-F9I!FD$B#[$A(B5PD&$B);"0@3(ED)"A,B6PD
-M,$R)="0X3(E\)$!)B?Q!B=>)RTR)!"1`B'0D#TB+1U!,BS!,B??H`````$B)
-MQ4B%P`^$]@```$R)]^@`````28G%2(7`=1)(B>Y,B??H`````.G6````9I!(
-MC4582(E$)!!)BWT0B=I)B[0D*`$``.@`````QH68````"L9%):Q!#[=$)#AF
-MB44@2(L4)$B)56A,B74HB5TT@XV4````$DF+11!(B45(3(EM>$F-A"3L````
-M2(E%4,9%,"!(QX6@`````````,9%.#O&13D"#[9$)`^(13I$B?C!Z!"(13M,
-MB?H/ML:(13Q$B'T]#[9%-HA%/@^V136(13^(74#&14$`O@````!(BWPD$.@`
-M````BU4T28MU&$B+?"00Z`````!(B>Y,B??H`````$B+7"082(ML)"!,BV0D
-M*$R+;"0P3(MT)#A,BWPD0$B#Q$C#9F:09F:09F:02(/L2$B)7"082(EL)"!,
-MB60D*$R);"0P3(ET)#A,B7PD0$F)_$&)UXE,)`A,B<-`B'0D#TB+1U!,BS!,
-MB??H`````$B)Q4B%P`^$Z@```$R)]^@`````28G%2(7`=1%(B>Y,B??H````
-M`.G*````D$B-15A(B40D$,:%F`````K&126L00^W1"0X9HE%($B)76A,B74H
-MQX64````"````$R);7A)BT402(E%2(M4)`B)531)C80D[````$B)15#&13`@
-M2,>%H`````````#&13@\QD4Y`@^V1"0/B$4Z1(GXP>@0B$4[3(GZ#[;&B$4\
-M1(A]/0^V13:(13X/MD4UB$4_#[9$)`B(14#&14$`O@````!(BWPD$.@`````
-MBU4T28MU&$B+?"00Z`````!(B>Y,B??H`````$B+7"082(ML)"!,BV0D*$R+
-M;"0P3(MT)#A,BWPD0$B#Q$C#9F9FD$B#[#A(B5PD"$B);"003(ED)!A,B6PD
-M($R)="0H3(E\)#!)B?Q(BT=03(LX2(N7*`$```^V0@+!X`@/ME(#`=`/M\!$
-MC6@$08']``@```^/S@```$R)_^@`````2(G%2(7`#X2Z````3(G_Z`````!)
-MB<9(A<!U$$B)[DR)_^@`````Z9H```!(C5U82(MX$$ECU4F+M"0H`0``Z```
-M``#&126L00^W1"0X9HE%($R)?2A$B6TT@XV4````$DF+1A!(B45(3(EU>$F-
-MA"3L````2(E%4,9%,"!(QX6@`````````,9%.!W&13D0QD4Z`@^V136(13M$
-MB&T\O@````!(B=_H`````(M5-$F+=AA(B=_H`````$B)[DR)_^@`````2(M<
-M)`A(BVPD$$R+9"083(ML)"!,BW0D*$R+?"0P2(/$.,-F9F:09F9FD&9FD$B#
-M["A(B5PD&$B);"0@2(G[B=5(QT0D$`````"`?TL!=$%(C50D$$`/MO:Y`0``
-M`.@`````2(M$)!!(A<!T)(`(@$"$[70+2(M$)!"`2`,@ZPE(BT0D$(!@`]](
-MB=_H`````$B+7"082(ML)"!(@\0HPV9F9I!F9F:09F:09F:02(/L.$B)7"0(
-M2(EL)!!,B60D&$R);"0@3(ET)"A,B7PD,$F)_4&)]TB+1U!,BS!,B??H````
-M`$B)Q4B%P`^$J0```$R)]^@`````28G$2(7`=1!(B>Y,B??H`````.F)````
-M2(U=6,9%):Q!#[=%.&:)12!,B74HQX64````"````$R)97A)BT0D$$B)14C'
-M130`"```28V%[````$B)15#&13`@2,>%H`````````#&13@<QD4Y`42(?3K&
-M13L(QD4\`+X`````2(G?Z`````"+531)BW0D&$B)W^@`````2(GN3(GWZ```
-M``!(BUPD"$B+;"003(MD)!A,BVPD($R+="0H3(M\)#!(@\0XPY!!5T%6055!
-M5%532(/L&$B)/"1(BTY(#[9!`L'@"`^V40.-/!`/M\>#P`0/MU8T.=`/CUH!
-M``!,C6D(#[?'3(UT`01,B6PD"$&\`````,=$)!0`````33GU#X/9````9I`/
-MMD0D%(A$)!-!#[9%`L'@"$$/ME4#1(T\$$$/M_=(BWPD"$B#QP3H`````(G!
-M//]U7D$/M\=(BUPD"$B-5`,$2(G323G6#X;/````08G,D`^V0@+!X`@/ME(#
-MC2P0#[?U2(U[!.@`````//]U"$&`_/]U>>MQ03C$1`]'X`^WQ4B-5`,$2(G3
-M23G6=F#KP9")PD0HX@^VT@^V7"03B=Y(BSPDZ`````")VDR)[DB+/"3H````
-M`$$/M\=(BU0D"$R-;`($3(EL)`B#1"04`4TY[@^'*?___[X"````2(L\).@`
-M````ZTE!O``````/ME0D$TR)[DB+/"3H`````$$/M\=(BUPD"$R-;`,$3(EL
-M)`B#1"04`>GE_O__#[94)!-,B>Y(BSPDZ`````#KJ6:02(/$&%M=05Q!74%>
-M05_#D$%7059!54%455-(@^P(28G^2(M.2`^V00+!X`@/ME$#`=`/M\"#P`0/
-MMU8T.=`/CPP!``!(C5$(#[9Q`<9$)`,`N0`````/MD("`$0D`P^V0@-(C50"
-M!(/!`4`XSG/G@'PD`P`/A+X```!(C6H$0;\`````0;T`````QT0D!``````/
-MME7]00'5#[9%_#P!=`0\%W4[1(GK*--!.-UV<0^V1"0$@\`!1`^VX&9FD&:0
-M#[9-_`^V\T2)XDR)]^@`````@\,!1#CK=$;KY&9F9I!)BT98@+C!`````70S
-M1(GK*--!.-UV*0^V1"0$@\`!1`^VX`^V3?P/MO-$B>),B??H`````(/#`40X
-MZW7F9F:008/'`8-$)`0!2(/%!$0Z?"0##X5:____28M&6,:`P0````&^!P``
-M`$R)]^@`````2(/$"%M=05Q!74%>05_#D$B#["A(B1PD2(EL)`A,B60D$$R)
-M;"083(ET)"!)B?Q(A?\/A,0```!(BT=03(LP3(GWZ`````!(B<5(A<`/A*D`
-M``!,B??H`````$F)Q4B%P'402(GN3(GWZ`````#IB0```$B-75C&126L00^W
-M1"0X9HE%($R)=2C'A90````(````3(EM>$F+11!(B45(QT4T``@``$F-A"3L
-M````2(E%4,9%,"!(QX6@`````````,9%.!S&13D!QD4Z`L9%.PC&13P`O@``
-M``!(B=_H`````(M5-$F+=1A(B=_H`````$B)[DR)]^@`````2(L<)$B+;"0(
-M3(MD)!!,BVPD&$R+="0@2(/$*,-F9F:09F:02(/L&$B)'"1(B6PD"$R)9"00
-M2(GS28G\2(MN:`^W3B!F@?F%``^'I0````^WP0^VM`=H"```0(#^_P^$D```
-M`&:#^7]W(D`/MM9(BX]`"0``2(T$4DB-!()(P>`%2(M$"%`/MD`(ZTAF@?F!
-M`'<=0`^VQDB+EY`)``!(:<#(#P``2(M$$`@/MD`(ZR1`#[;&2(N7:`D``$B-
-M!,!(P>`%2(N$$(@````/MD`(9F:09I`\_W0<#[;`08"\!.X(``#_=`Y`@/[_
-M=`@/MD,D/`9U,$B#>W@`=`Q(C7-X3(GGZ`````!(B=Y,B>?H`````,=%4/__
-M__](B>__54CK<V9FD(3`=3GV@Y0````(=!-(BWTPBU,T2(MS2.@`````9F:0
-MQT50`````$B+53A(A=)T!8M%((D"2(GO_U5(ZQ/'15#_____2(GO_U5(9F:0
-M9F:02(-[>`!T#$B-<WA,B>?H`````$B)WDR)Y^@`````9I!(BQPD2(ML)`A,
-MBV0D$$B#Q!C#9F9FD&9FD&9FD&9FD$B#["A(B5PD"$B);"003(ED)!A,B6PD
-M($B)\TF)_$0/MFXD#[=&(&8]A0!W(TB+CT`)```/M\`/MH0':`@``$B-%$!(
-MC1202(G02,'@!>L,2(N/0`D``+A@G@$`2(TL`46$[74@9L>%R```````@'LX
-M''41@'LZ`G4+2(G>2(GOZ`````!(@WMX`'0,2(US>$R)Y^@`````2(G>3(GG
-MZ`````!!@/T&=#U(C9U@`0``28M\)"A(B=[H`````,>%8`$``("$'@!(QX5P
-M`0```````$B)K7@!``!)BWPD*$B)WN@`````2(M<)`A(BVPD$$R+9"083(ML
-M)"!(@\0HPY!!5T%6055!5%532(/L"$F)_T&)UDB+1U!(BRA!O`````!,C6X,
-M00^VA"QH"```//]T4@^VP$B-%$!(C1202(G32,'C!4B)WT@#O4`)``!(@<?4
-M````N@@```!,B>[H`````(3`=!Y(BX5`"0``1(BT`PX!``!(BX5`"0``3(F\
-M`R`!``!)@\0!28'\@````'642(/$"%M=05Q!74%>05_#05=!5D%505154TB#
-M[!A(B7PD"$B+3D@/MD$"P>`(#[91`XT\$`^WQX/`!`^W5C0YT`^/Y@```$B-
-M60@/M\=(C4P!!$B)3"0028G=2#G9#X:Z````0;X`````9F:09F:01(GR#[8+
-MA,D/B(4```")R(/@#SP&=7SV0P/`=`;V0P7`=7#VP1!T.8![!`!F9F:0=&%)
-MC6T(0;P`````9F9FD`^V4P-(B>Y(BWPD".@`````2(/%'$&#Q`%$.&,$=C3K
-MWX![`@!T+$F-;01!O`````!$#[;Z1(GZ2(GN2(M\)`CH`````$B#Q1Q!@\0!
-M1#AC`G?B#[9#`4F-7`4"28G=08/&`4@[7"00#X)2____O@$```!(BWPD".@`
-M````2(/$&%M=05Q!74%>05_#9F9FD$%7059!54%455-(@^PH2(ET)`A(B7PD
-M$`^V1B2(1"0G#[=.(&:!^84`#X?X`P``#[?!#[:T!V@(``"X_P```$"`_O]T
-M>F:#^7]W)T`/MM9(BT0D$$B+B$`)``!(C0122(T$@DC!X`5(BT0(4`^V0`CK
-M36:!^8$`=R)`#[;&2(M,)!!(BY&0"0``2&G`R`\``$B+1!`(#[9`".LD0`^V
-MQDB+3"002(N1:`D``$B-!,!(P>`%2(N$$(@````/MD`(2)A(BU0D$$0/MKP"
-M[@@``$N-!+])C02'2(V$PL@!``!(B40D&$B+BD`)``!`#[;&2(T40$B-%)!(
-MB=!(P>`%2(TL`8!\)"<`#X6S`@``9L>%R```````2(M,)`B`>3@<#X6;`@``
-M#[9!.CP"=%H\`G<1/`$/A8<"``!F9F:09F:0ZQX\!W0O/`H/A7("``!(BW0D
-M"$B)[^@`````Z6`"``!(BW0D"$B)[^@`````9F:0Z4L"``!(BW0D"$B)[^@`
-M````Z3D"``!(BW0D"$B)[^@`````2(V=8`$``$B+15!(BP!(BW@H2(G>Z```
-M``#'A6`!``"`A!X`2,>%<`$```````!(B:UX`0``2(M%4$B+`$B+>"A(B=[H
-M`````,9%2O]+C02_28T$ATB+5"00@+S"U@$````/A),!``!!O`````!+C02_
-M28T$ATC!X`-,C;0"*`(``$B-'!!,C:O``0``3(GWZ`````!(B<5(BX,P`@``
-M2(FK,`(``$R)=0!(B44(2(DH@'U*_P^$E@```(!]20`/A9<```!(B>Z`O>D`
-M````#X17`0``#[952$B)T(/@!DB#^`9U)_;"`70B#[:5@0```$B+=5A(B>E(
-MBWPD&.@`````Z24!``!F9I!FD$B#^`1U&_;"`69F9I!F9I!T#TB+?"00Z```
-M``#I_P```$B#^`8/A?4```#VP@%FD`^%Z@```$B+?"00Z`````#IVP```,:%
-MZ0````!F9F:008/$`4$/MD461#C@#X<?____03C$#X6$````A,`/A'P```!!
-MO`````!+C02_28T$ATC!X`-(BTPD$$R-K`$H`@``2(T<"$R-L\`!``!F9I!,
-MB>_H`````$B)Q4B+@S`"``!(B:LP`@``3(EM`$B)10A(B2B`?4K_=!L/MD5)
-M/")T!#P-=0^^"@```$B)[^@`````ZSM!@\0!13AF%G>Q2XT$OTF-!(=(BU0D
-M$,:$PM$!``#_2(MT)!A(B=?H`````(!\)"<`#X6D````9F9FD$B+3"0(2(-Y
-M>`!T$4B)SDB#QGA(BWPD$.@`````2(MT)`A(BWPD$.@`````@'PD)P!T;0^W
-MA<@```"#P`%FB87(````9H/X"G8.9L>%R```````Z<7]__^^"@```$B)[^@`
-M````ZSE(BT0D$$0/MKCM"0``2XT$OTF-!(=(BU0D$$B-A,+(`0``2(E$)!A(
-MBXI`"0``N&">`0#IG_S__Y!(@\0H6UU!7$%=05Y!7\.02(7_=$M(A?9T1DB%
-MTG1!2(7)=#QF08'XA0!W-$$/M\"`O`=H"```_W0FQD(XX<9".0'&0CH39D2)
-M0B!(B7(H2(F*H````+@!````PV9F9I"X`````,-F9F:09F:09F:02(M'"(M`
-M!(D%`````(G"@<H```P`)?__\_]`A/8/1<)(BU<(B0)(BU<(B4(,2(M7"(E"
-M$$B+5PB)0A1(BU<(B4(82(M7"(E"!,.0D)"0D)!,BU0D($R+7"0PB?AF@?\B
-M)W=?9H'_("</@Y0```!F@?]`(0^$B0```&:!_T`A9I!W(&:!_R`A='EF@?\B
-M(6:0='!F@?]0!W5O9F9FD&9FD.M@9H'_1"%T66:!_T0A9I!R5F8M$"=F@_@!
-M=TQF9F:0ZT!F@?^")W0Y9H'_@B=FD'<29H'_)"=T*6:!_X`G9I!U)NL>9H'_
-M@)%F9F:09F:0=!!F@?^`E'0)9H'_@')FD'4&Q@9`Q@("Q@$$#[862(M$)!B(
-M$&9!QP*``&9!QP,``$'&`2!(BT0D"&;'```!#[862(M$)!"($`^V!F9!`P)F
-M00,#2(M4)"AFB0)F08D`00^W$DB+1"0X9HD000^W$H/""TB+1"1`9HD0PV9F
-M9I!54XGS#[=W=&:%]@^$!`$``$R+E[@)``!!NP````"]_____TF+`DB%P`^$
-MU`````^W2""X_P```$&)Z&:!^84`#X>.````#[?!1`^VC`=H"```18G(08#Y
-M_W1U9H/Y?W<C00^VT4B+CT`)``!(C0122(T$@DC!X`5(BT0(4$0/MD`(ZTQF
-M@?F!`'<>00^VP4B+EY`)``!(:<#(#P``2(M$$`A$#[9`".LG00^VP4B+EV@)
-M``!(C03`2,'@!4B+A!"(````1`^V0`AF9F:09F:000^VP4B+CT`)``!!.-AU
-M(P^WP$B-%$!(C1202,'B!0^V1`I(J`%T"Z@$=`>X`0```.L708/#`4F#P@AF
-M03GS#X4.____N`````!;7<-F9I!(BT=03(L038N:X!```$4/MTITN0````!!
-MN`````#K0P^W\4F+@K@)``!(BQ3P2(72="V+0C@E____`#WA`1``=!X/MT<X
-M9CM"('442(GP2,'@!F9&.408"'0.9F:09I"#P0%F1#G)<K=F1#G)=!-!@\`!
-M9D&#^!]W"+D`````D.OA00^WP,-F9I!F9I!F9I!(BT=02(7`=!K&`'!(BT=0
-M0(AP`DB+1U#&0`<`2(M'4(A0#//#9F9FD&9F9I!F9I#SPV9F9I!F9F:09F:0
-M9F:008GQ3(G*@>+_`0``2(N'N`D``$R+!-!-A<!T*P^VM_H```!!#[9`)8GQ
-MT^`/M_A!#[?1N/__``#3X"'".=>X`````$P/1<!,B<##9F:09I"X`````,8$
-M.`!(@\`!2#T@`0``=?#&1T3_QD=0_TB-1RA(B4<H2(E',,-F9I!F9I"X````
-M`,8$.`!(@\`!2#V@`0``=?#&AX````#_QD=R_\:'@@```!](C4<@2(E'($B)
-M1RC#9F9FD&9F9I!F9F:02(L&2(N7.`$``$B)AS@!``!(@<<P`0``2(DX2(E0
-M"$B)`DC'!@````##9F:09F:02(N7*`$``$B)MR@!``!(C8<@`0``2(D&2(E6
-M"$B),DB#?G``=`E(@\9PZ`````#SPV9F9I!F9F:09F9FD&9FD$B+!DB+EU@!
-M``!(B8=8`0``2(''4`$``$B).$B)4`A(B0)(QP8`````PV9FD&9FD$B+!DB+
-MET@!``!(B8=(`0``2(''0`$``$B).$B)4`A(B0)(QP8`````PV9FD&9FD$B+
-MAW@!``!(B;=X`0``2(''<`$``$B)/DB)1@A(B3##2(L&2(N7B`$``$B)AX@!
-M``!(@<>``0``2(DX2(E0"$B)`DC'!@````##9F:09F:02(L&2(N7:`$``$B)
-MAV@!``!(@<=@`0``2(DX2(E0"$B)`DC'!@````##9F:09F:00(#_%W<10`^V
-MQ_\DQ0````"X-````,.X!````&9F9I##N#P```##N!0```!F9F:0P[A`````
-MP[@<````9F9FD,.X&````,.X*````&9F9I##N"````##N$P```!F9F:0PV9F
-M9I!F9F:09F9FD&9FD`^V5DA(B="#X`9(@_@&=1#VP@$/A-L```!F9F:09F:0
-M@'YR_P^%R@```$B+!T2+B!@!``!$B0T`````N0````"X`0```$&)P$'3X$6%
-MP74SB$YR2(L71(G`1`G(B8(8`0``2(L'BX!8`0``B04`````1(G"(<)T>$B+
-M!XF06`$``.MM@\$!@_D@=;5(BP=$BX@<`0``1(D-`````+$`9I")RK@!````
-M08G`0=/@187!=3:-0B"(1G)(BQ=$B<!$"<B)@AP!``!(BP>+@&`!``")!0``
-M``!$B<(APG032(L'B9!@`0``ZPB#P0&#^2!UL(!'1`'SPV9F9I!F9I!F9I"`
-M?E#_#X7%````2(L'1(N(&`$``$2)#0````"Y`````+@!````08G`0=/@187!
-M=3.(3E!(BQ=$B<!$"<B)@A@!``!(BP>+@%@!``")!0````!$B<(APG1S2(L'
-MB9!8`0``ZVB#P0&#^2!UM4B+!T2+B!P!``!$B0T`````L0!FD+@!````08G`
-M0=/@187!=3.(3E!(BQ=$B<!$"<B)@AP!``!(BP>+@&`!``")!0````!$B<(A
-MPG032(L'B9!@`0``ZPB#P0&#^2!UM8!'1`'SPV9F9I!F9F:09F9FD&9FD$B+
-M=T!(A?9T.;D`````9I!(BT3.6$B%P'0(.)"!````=`Q(@\$!2(/Y!706Z^)F
-M@7Y`A0!W#$B%P&9F9I!F9I!U!;@`````\\-F9F:09F:0055!5%532(G]28G-
-MP>8(#[;2`=:`?S``#X35````2(-_4``/A,H```"+AY0```"H"4$/E,"Y````
-M`$C'QP````!!B<P/MQ3/B?`AT&8YP@^%D`````^V!,T`````/`-T!#P'=0M$
-M.`3-`````'5VD,9%)"!-8^1(Q\,`````0@^V5.,&#[;P2(GOZ`````!(BU50
-M0@^V1.,'B$(-387M=#1)BTT`2(G*2,'J($B+15")4`-(BT50@`B`]H66````
-M!'02A=)T#DB+15")2`A(BT50@"!_2(M54`^V13"#Z`>(0@?K#DB#P0%(@_D0
-M#X5.____6UU!7$%=PV9FD&9FD$B#[`A(C9=@`0``N`````!(.9=@`0``=!!(
-MB=?H`````$C'0"``````2(/$",-FD$B#[`A(C9>``0``N`````!(.9>``0``
-M=`A(B=?H`````$B#Q`C#9F9FD&9FD&9FD$B#[`A(C9=P`0``N`````!(.9=P
-M`0``="A(B=?H`````$B)P;H`````9F9FD&9FD,8$"@!(@\(!2('ZH````'7O
-M2(/$",-F9F:09F:09F:02(/L"$B-ET`!``"X`````$@YET`!``!T"$B)U^@`
-M````2(/$",-F9F:09F:09F:02(/L"$B-ES`!``"X`````$@YES`!``!T#$B)
-MU^@`````QD`0`$B#Q`C#9F:09F:005=!5D%505154TB#[`A)B?]!B?7'1"0$
-M`````$&^`````$,/MH0^Z`@``#S_#X0=`0``#[;008V&@````&8]@0!W?0^W
-MPDAIP,@/``!(B<-)`Y^0"0``@'M8`'13O0````!,C6-(3(GGZ`````!(C4CP
-M2(M34$B)0U!,B6$02(E1&$B)`HM!2"4`__\`/0``_P!U$_9!2P1T#4B+04!(
-MA<!T!$2(:`&#Q0%`.&M8=[9$B*O"````08/%`>F0````#[?"2(T$P$C!X`5(
-MB<9)`[=H"0``@'X[`'0]N0`````/ML%(BU3&6$B%TG0CBT)()0#__P`]``#_
-M`'44]D)+!'0.2(M"0$B%P'0%1(AH`9"#P0$X3CMWR$2(KA0!``"`OA4!```#
-M=1^#1"0$`8M$)`2#P`.#^`9V%T&#Q0''1"0$`````.L)08/%`69FD&:028/&
-M`4F#_@8/A<3^__])BX?X"```3#GX=0](C;B0%```1(GNZ(?^__](@\0(6UU!
-M7$%=05Y!7\-F9F:09F9FD$B#[`@/MD8(#[:T!^X(``#&A`?N"```_P^W]DB!
-MQX@0``#H`````$B#Q`C#9F9FD$B+5G!(A=)T&$B+0AA(B48X2(M"($B)1D!(
-MBT(H2(E&2//#9F9FD&9FD&9FD&9FD$B+5G!(A=)T'$B+1CA(B4(82(M&0$B)
-M0B!(BT9(2(E"*,9"$`'SPV9FD&9FD&9FD$%455-)B?Q(BQ]F@WMT``^$S```
-M`+T`````9F:09F:0#[?52(N#N`D``$B+/-!(A?\/A)T````/MT\@9H'YA0!W
-M?@^WP0^VA`-H"```//]T;V:#^7]W(0^VT$B+BT`)``!(C0122(T$@DC!X`5(
-MBT0(4`^V4`CK36:!^8$`=QP/ML!(BY.0"0``2&G`R`\``$B+1!`(#[90".LJ
-M#[;`2(N3:`D``$B-!,!(P>`%2(N$$(@````/ME`(ZPIF9I!FD+K_````00^V
-M1"0(.<)U!>@`````@\4!9CEK=`^'/____UM=05S#9F9FD&9FD&9FD$B#[!A(
-MB5PD"$B);"002(G[2(GU#[9&4#S_=!,/MO!(BS_H`````,9%4/^`:T0!2(M<
-M)`A(BVPD$$B#Q!C#9I!(@^P82(E<)`A(B6PD$$B)^TB)]0^V1G(\_W03#[;P
-M2(L_Z`````#&17+_@&M$`4B+7"0(2(ML)!!(@\08PV:055-(@^P(2(G]2(GS
-M2#E^*`^$VP```(!^)``/A:<````/MD8X/!5T"#Q5#X67````2(M#<$B%P`^$
-MB@```$B)P8!X$`$/A7T```!F@7@8X0%U=4B+M4`)```/MT,@NF">`0!F/84`
-M=Q</M\`/MH0%:`@``$B-%$!(C1202,'B!4B-!!8/MDD:@/D'=!V`^0=W!X#Y
-M!G4QZQJ`^0QF9I!FD'0@@/D-=2#K$&:#8&K]9I#K%6:#2&H"ZPYF@V!J]V:0
-MZP5F@TAJ"$B#>W@`=".!>S0`"```=PY(C7-X2(GOZ`````#K#$B-<WA(B>_H
-M`````&:!>SCA`0^%)P$```^W0R!F/84`#X>+````#[?`#[:$!6@(```\_P^$
-M>````$B+C4`)``"`>R0`=6L/ML!(C11`2(T4D$C!X@5(C001#[93.H#Z!W0=
-M@/H'=P>`^@9U-NL?@/H,="J`^@UF9I!FD'4EZQ5F@V!J_69F9I!F9I#K%6:#
-M2&H"ZPYF@V!J]V:0ZP5F@TAJ"&:!>SCA`69FD`^%C@```(![.@L/A80````/
-MMW,@#[9%1HUX_XGRZQN0@\(!9H'ZA0!W$`^WRDACP8"\!6@(``#_=0D/M\(Y
-M^'S?ZTUF@?G_`'4B9F:09F:0ZSZ#Q@%F@?Z%`'<0#[?62&/"@+P%:`@``/]U
-M#`^WQCG'?]^Z_P```&:)4R#&0R2`2(G>2(GOZ`````#I(@$``,9#)`!(.6LH
-M="9(BT-P2(7`=!V`>!`!=0M(B=Y(B>_H`````$B-<W!(B>_H`````$B#NX``
-M````=`](C;.`````2(GOZ`````!(BWLH2(G>_Y.@````#[=3.&:!^N$!=5</
-MMD,Z@^@1/`%W3`^W0R!F/84`#X>H````#[?`#[:$!6@(```\_P^$E0````^V
-MP$B-!,!(P>`%2(G&2`.U:`D``(!^10!U>H!^4/]T=$B)[^@`````ZVH/MT,@
-M9CV%`'=@#[?`#[:,!6@(``!(B[5`"0``BT,X)?___P`]X0$0`'0_@?G_````
-M=#=F@?KA`74.#[9#.H/H$3P!=B5F9I")R$B-%$!(C1202,'B!4@!UH"^@P``
-M``!U"$B)[^@`````2(/$"%M=PV9F9I!F9I!54TB#[`A(B?U(B?,/MTX@9H'Y
-MA0`/AZ8````/M\$/MK0':`@``$"`_O\/A)$```!F@_E_=R)`#[;62(N/0`D`
-M`$B-!%)(C02"2,'@!4B+1`A0#[9`".M(9H'Y@0!W'4`/ML9(BY>0"0``2&G`
-MR`\``$B+1!`(#[9`".LD0`^VQDB+EV@)``!(C03`2,'@!4B+A!"(````#[9`
-M"&9FD&:09CW_`'0;#[?`#[:\!>X(``!`@/__=`I`#[;&9CW_`'402(G>2(GO
-MZ`````#I@0````^V4SL/MD,\#[9+/8#Y`70%@/D(=6!(BTMHP>`(#[;2`=`E
-M_P$``$B+E;@)``!(.0S"=4(/MTDRB<IFP>H%@>+_!P``@^$?N`$```!(T^#W
-MT"%$E7A(BT-H#[=P,D`/ML=(C3R`2(T\N$B-O/W(`0``Z`````!(B=Y(B>_H
-M`````$B#Q`A;7<-F9F:09F:02(/L&$B)7"0(2(EL)!!(B?M(C;\@`0``O0``
-M``!(.;L@`0``=!SH`````$B)Q4B)Q^@`````2(G?Z`````!(B45P2(GH2(M<
-M)`A(BVPD$$B#Q!C#9F9FD&9F9I!F9F:02(/L&$B)'"1(B6PD"$R)9"002(G]
-M2(M'4$R+($R)Y^@`````2(G#2(7`='!,B>?H`````$B)PDB%P'44QH7I````
-M`4B)WDR)Y^@`````ZTS&0S@`#[=%.&:)0R#&@Y@````/3(EC*,=#-`````!(
-MQT-(`````$B+0A!(B4-0QD,P)$B)4WA(QX.@`````````$B)WDR)Y^@`````
-M2(L<)$B+;"0(3(MD)!!(@\08PY!(@^P82(D<)$B);"0(3(ED)!!(B?U!B?1(
-MBT=02(L82(G?Z`````!(B<)(A<!T1,9`.!O&0#D!1(A@/`^W13AFB4(@QH*8
-M````#TB)6BC'0C0`````2,="2`````!(QX*@`````````$B)UDB)W^@`````
-M2(L<)$B+;"0(3(MD)!!(@\08PV9F9I!F9I!F9I!(@^PX2(E<)`A(B6PD$$R)
-M9"083(EL)"!,B70D*$R)?"0P28G_28GU3(LW3(GWZ`````!(B<5(A<`/A(X`
-M``!,B??H`````$F)Q$B%P'412(GN3(GWZ`````#K<69F9I!(C5U8QD4XX<9%
-M.0'&13H.00^W13AFB44@9D&#96CW28L'2(E%*,=%-``(``!)BT0D$$B)14A,
-MB65X2,>%H`````````"^`````$B)W^@`````BU4T28MT)!A(B=_H`````$B)
-M[DR)]^@`````2(M<)`A(BVPD$$R+9"083(ML)"!,BW0D*$R+?"0P2(/$.,-(
-M@^PH2(E<)`A(B6PD$$R)9"083(EL)"!)B?2)U4B+'TB)W^@`````2(G"2(7`
-M=%_&0#CAQD`Y`4"(:#K&0#L/00^W1"0X9HE"($B)6BC'0C0`````2,="2```
-M``!(QX*@`````````$B)UDB)W^@`````0(#]`74,OP4```#H`````.L*OU##
-M``#H`````$B+7"0(2(ML)!!,BV0D&$R+;"0@2(/$*,-F9F:09F9FD%532(/L
-M"$B)_4B)\P^W3B!F@?F%``^'IP````^WP0^VM`=H"```0(#^_P^$D@```&:#
-M^7]W(D`/MM9(BX]`"0``2(T$4DB-!()(P>`%2(M$"%`/MD`(ZTAF@?F!`'<=
-M0`^VQDB+EY`)``!(:<#(#P``2(M$$`@/MD`(ZR1`#[;&2(N7:`D``$B-!,!(
-MP>`%2(N$$(@````/MD`(9F:09I`\_W0>#[;`#[:,!>X(``"`^?]T#D"`_O]T
-M"`^V0R0\!G4^2(-[>`!T)8%[-``(``!W$$B-<WA(B>_H`````&:0ZPQ(C7-X
-M2(GOZ`````!(B=Y(B>_H`````.M\9F:09I!(BY5`"0``A,!T-4`/ML9(C31`
-M2(TTL$C!Y@5(C30R#[;!2(T\@$B-/+A(C;S]R`$``+H!````Z`````!F9F:0
-M2(-[>`!T)8%[-``(``!W$$B-<WA(B>_H`````.L.9I!(C7-X2(GOZ`````!(
-MB=Y(B>_H`````$B#Q`A;7<-FD$B#["A(B1PD2(EL)`A,B60D$$R);"083(ET
-M)"!(B?M(B?4/MTX@9H'YA0`/AQ\!```/M\$/MK0':`@``$"`_O\/A`H!``!F
-M@_E_=R1`#[;62(N/0`D``$B-!%)(C02"2,'@!4B+1`A0#[9`".M%9I!F@?F!
-M`'<=0`^VQDB+EY`)``!(:<#(#P``2(M$$`@/MD`(ZQ]`#[;&2(N7:`D``$B-
-M!,!(P>`%2(N$$(@````/MD`(//\/A)4```!$#[;F#[;`1`^VK`/N"```08#]
-M_W1_9D&!_/\`='>`?20&='%,B[-`"0``@'TZ`75)OPH```#H`````$B)[DB)
-MW^@`````00^WQ$B--$!(C32P2,'F!4F--#9!#[;%2(T\@$B-/+A(C;S[R`$`
-M`+H"````Z`````#K&[_T`0``Z`````!(B>Y(B=_H`````&9FD&9FD$B+'"1(
-MBVPD"$R+9"003(ML)!A,BW0D($B#Q"C#9F:02(/L&$B)'"1(B6PD"$R)9"00
-M28G\2(M'4$B+*$B)[^@`````2(G#2(7`=0M!QH0DZ0````'K7\9`.!7&0"6K
-M00^W1"0X9HE#($B):RA!N`$```"Y`0```$B)VDR)YDB)[^@`````A,!U%DB)
-MWDB)[^@`````0<:$).D````!ZQ9(QX.@`````````$B)WDB)[^@`````2(L<
-M)$B+;"0(3(MD)!!(@\08PV9F9I!F9I!(@^PH2(E<)`A(B6PD$$R)9"083(EL
-M)"!(B?M(BT=03(LH3(GOZ`````!(B<5(A<!U#L:#Z0````'IM@```&:03(GO
-MZ`````!)B<1(A<!U%\:#Z0````%(B>Y,B>_H`````.F-````QD4X&L9%.0C&
-M13H(QD4[`,9%//_&13T`QD4EJP^W0SAFB44@3(EM*,=%-/\```#'A90````(
-M````28M$)!!(B45(2`7_````2(E%4,9%,"1,B65X2,>%H`````````!(C5U8
-MO@````!(B=_H`````$F+="08NO\```!(B=_H`````$B)[DR)[^@`````2(M<
-M)`A(BVPD$$R+9"083(ML)"!(@\0HPV9FD$B#[#A(B5PD"$B);"003(ED)!A,
-MB6PD($R)="0H3(E\)#!)B?Q!B?9(BT=03(LH3(GOZ`````!(B<-(A<!U$4'&
-MA"3I`````>FZ````9F:03(GOZ`````!(B<5(A<!U($'&A"3I`````4B)WDR)
-M[^@`````Z8X```!F9F:09F:03(U[6,9#.!)%A/9T$\9#.0'&0SJ`QD,\0.L)
-M9F:09I#&0SPDQD,EJT$/MT0D.&:)0R!,B6LHQT,T8````,>#E`````@```!(
-MBT402(E#2$B):WA(QX.@`````````+X`````3(G_Z`````!(BW48NF````!,
-MB?_H`````$B)WDR)[^@`````2(M<)`A(BVPD$$R+9"083(ML)"!,BW0D*$R+
-M?"0P2(/$.,-F9I!F9I!(@^PH2(D<)$B);"0(3(ED)!!,B6PD&$R)="0@28G\
-M2(M'4$R+,$R)]^@`````2(G%2(7`=0Y!QH0DZ0````'IL@```$R)]^@`````
-M28G%2(7`=1Q!QH0DZ0````%(B>Y,B??H`````.F)````9F:02(U=6,9%.)[&
-M13D0QD5%(,9%):M!#[=$)#AFB44@3(EU*,=%-"````#'A90````(````28M%
-M$$B)14A,B6UX2(/`($B)15#&13`D2,>%H`````````#&A9@````/O@````!(
-MB=_H`````$F+=1BZ(````$B)W^@`````2(GN3(GWZ`````!(BQPD2(ML)`A,
-MBV0D$$R+;"083(MT)"!(@\0HPV9F9I!F9I!F9I!F9I!(@^PH2(D<)$B);"0(
-M3(ED)!!,B6PD&$R)="0@28G\2(M'4$R+,$R)]^@`````2(G%2(7`=0Y!QH0D
-MZ0````'IHP```$R)]^@`````28G%2(7`=1Q!QH0DZ0````%(B>Y,B??H````
-M`.M]9F:09F:02(U=6,9%."7&126K00^W1"0X9HE%($R)=2C'130(````QX64
-M````"````$F+11!(B45(2(/`"$B)15#&13`D3(EM>$C'A:``````````O@``
-M``!(B=_H`````$F+=1BZ"````$B)W^@`````2(GN3(GWZ`````!(BQPD2(ML
-M)`A,BV0D$$R+;"083(MT)"!(@\0HPV9F9I!F9F:09F9FD$B#[#A(B5PD"$B)
-M;"003(ED)!A,B6PD($R)="0H3(E\)#!)B?])B?2)5"0$2(LO3(NU0`D```^W
-M1B!$#[:L!6@(``!(B>_H`````$B)PT$/MW0D,HGP9L'H!0^WP(M$A7B)\8/A
-M'TC3^*@!#X7"````2(7;#X2Y````00^VQ4B-%$!(C1202,'B!4F-%!9!#[9$
-M)"4/MHWZ````T^`)\,9#..'&0SD!QD,Z#XA#.V;!Z`B(0SP/MD0D!(A#/4B+
-M@MP```!(B4,^3(EC:,9#):H/MT(X9HE#($F+!TB)0RC'0S0`````2,=#2```
-M``!(QX.@`````````$B->UB^`````.@`````2(G>2(GOZ`````!!#[=,)#*)
-MRF;!Z@6!XO\'``"#X1^X`0```$C3X`E$E7A(BUPD"$B+;"003(MD)!A,BVPD
-M($R+="0H3(M\)#!(@\0XPV9F9I!F9I!F9I!!5T%6055!5%532(/L"$F)_DF)
-MU4&)]TB+'V:#>W0`#X0.`@``O0````!!O/____\/M]5(BX.X"0``2(LTT$B%
-M]@^$WP$``$2+1CA!@>#___\`08'XX0$0``^%H0```$V%[0^%O@$```^W3B!F
-M@?F%`'=Y#[?!#[:$`V@(```\_W1J9H/Y?W<A#[;02(N+0`D``$B-!%)(C02"
-M2,'@!4B+1`A0#[9(".M&9H'Y@0!W'`^VP$B+DY`)``!(:<#(#P``2(M$$`@/
-MMD@(ZR,/ML!(BY-H"0``2(T$P$C!X`5(BX00B`````^V2`CK`T2)X;H`````
-MZ;\```!F9F:09F:0#[=.(&:!^84`#X>A````#[?!#[:\`V@(``!`@/__#X2,
-M````9H/Y?W<B0`^VUTB+BT`)``!(C0122(T$@DC!X`5(BT0(4`^V2`CK1&:!
-M^8$`=QU`#[;'2(N3D`D``$AIP,@/``!(BT00"`^V2`CK($`/ML=(BY-H"0``
-M2(T$P$C!X`5(BX00B`````^V2`B00`^VQTB-%$!(C1202,'B!4@#DT`)``#K
-M#V9F9I!F9I!$B>&Z`````$$X3@AU:$V%[70+00^W13AF.T8@=5A!@/\&=$-!
-M@?CA`1``=#H/MDI(2(G(@^`&2(/X!G4J]L$!=26`NN@`````=1Q!@?CA`0\`
-M=")$B'XDN@$```!,B??H`````.L/1(A^)`^W]4R)]^@`````@\4!9CEK=`^'
-M_?W__T&`_X$/A%<!``!(BX,``0``2(VK``$``$@YQ0^$0`$``+H`````9F9F
-MD&9FD(/"`4B+`$@YQ77U9H72#X0@`0``1(UB_TB)[^@`````2(G&387M="A!
-M#[=%.&8[1B!T'4B+@P@!``!(B;,(`0``2(DN2(E&"$B),.G(````#[=.(&:!
-M^84`=WD/M\$/MH0#:`@``#S_=&IF@_E_=R$/MM!(BXM`"0``2(T$4DB-!()(
-MP>`%2(M$"%`/MD`(ZTAF@?F!`'<<#[;`2(N3D`D``$AIP,@/``!(BT00"`^V
-M0`CK)0^VP$B+DV@)``!(C03`2,'@!4B+A!"(````#[9`".L%N/____]!.D8(
-M=2&+1C@E____`#WA`0\`=!)$B'XD2(G?Z`````#K'&9F9I!(BX,(`0``2(FS
-M"`$``$B)+DB)1@A(B3!!C40D_V9%A>1T$4@[JP`!``!T"$&)Q.GD_O__2(/$
-M"%M=05Q!74%>05_#9F9FD&9FD&9FD&9FD$B#[#A(B5PD"$B);"003(ED)!A,
-MB6PD($R)="0H3(E\)#!)B?Q)B?9)B<U!B==(BR](B>_H`````$B)PTB%P'4/
-M0<:%Z0````'IBP```&:02(GOZ`````!(B<)(A<!U%4B)WDB)[^@`````0<:%
-MZ0````'K9,9#..'&0SD!QD,Z$$2(>R5!#[9&6V:)0R!)BP0D2(E#*,=#-)``
-M``!(C4(02(E#2$B)4WC&0`$2QD(00$2(>`E(QX.@`````````$B->UB^````
-M`.@`````2(G>2(GOZ`````!(BUPD"$B+;"003(MD)!A,BVPD($R+="0H3(M\
-M)#!(@\0XPV9F9I!(@^PX2(E<)`A(B6PD$$R)9"083(EL)"!,B70D*$R)?"0P
-M28G\28GU08G608G/2(LO2(GOZ`````!(B<-(A<`/A((```!(B>_H`````$B)
-MPDB%P'1RQD,XX<9#.0'&0SH01(AS)4$/MD5;9HE#($F+!"1(B4,HQT,TD```
-M`$B-0A!(B4-(2(E3>,9``9'&0A!`1(AP"42(>`I(QX.@`````````$B->UB^
-M`````.@`````2(G>2(GOZ`````"_H(8!`.@`````2(M<)`A(BVPD$$R+9"08
-M3(ML)"!,BW0D*$R+?"0P2(/$.,-F9I!F9I!(@^PH2(D<)$B);"0(3(ED)!!,
-MB6PD&$R)="0@28G\28GU08G62(LO2(GOZ`````!(B<-(A<!T=$B)[^@`````
-M2(G"2(7`=&3&0SCAQD,Y`<9#.A#&0R6[00^V15MFB4,@28L$)$B)0RC'0S20
-M````2(U"$$B)0TA(B5-XQD`!$,9"$$!$B'`)2,>#H`````````!(C7M8O@``
-M``#H`````$B)WDB)[^@`````2(L<)$B+;"0(3(MD)!!,BVPD&$R+="0@2(/$
-M*,-F9F:09F:02(/L*$B)7"0(2(EL)!!,B60D&$R);"0@28G\28GU2(LO2(GO
-MZ`````!(B<-(A<!T<$B)[^@`````2(G"2(7`=&#&0SCAQD,Y`<9#.A#&0R6[
-M00^V15MFB4,@28L$)$B)0RC'0S20````2(U"$$B)0TA(B5-XQD`!`,9"$$!(
-MQX.@`````````$B->UB^`````.@`````2(G>2(GOZ`````!(BUPD"$B+;"00
-M3(MD)!A,BVPD($B#Q"C#9F:09F:055-(@^P(2(G]2(V?B!```$B)W^@`````
-MA,`/A>````!(B=_H`````(G!N`````")QH"\*.X(``#_=0HX14QS$HA%3.L-
-M@\8!2(/``4B#^`1UW4"`_@0/A*0```!`#[;&B(P%[@@```^W^4B-!+](C02'
-M2(V4Q<@!``"X`````)#&!!``2(/``4@]J````'7P#[?!2(T4@$B-%)!(P>(#
-M2(V,%?@!``!(C00J2(F(^`$``$B)B``"``!(C8P5$`(``$B)B!`"``!(B8@8
-M`@``2(V4%2@"``!(B9`H`@``2(F0,`(``$"(L-`!``!(C02_2(T$ATB-A,7(
-M`0``ZP=FD+@`````2(/$"%M=PV9F9I!(@^P82(D<)$B);"0(3(ED)!!(B?U(
-MC9_@#P``2(G?Z`````"$P`^%.0$``$B)W^@`````B<*X`````&9FD&:0B<.`
-MO"AH"```_W45#[;`9CF%^````',89HF%^````.L/@\,!2(/``4@]@````'70
-M@/N`#X3L````#[;#B)0%:`@```^WPDB-%$!(C12028G42<'D!4R)YT@#O4`)
-M``#H`````$B+E4`)```/ML-F08E$%#A(BX5`"0``0<9$!$H`2(N%0`D``$'&
-M1`1M_TB+A4`)``!!QD0$;/](BX5`"0``0<9$!&[_2(N%0`D``$'&1`1P_TB+
-MA4`)``!!QD0$;_](BX5`"0``0<9$!''_2(N%0`D``$'&A`3J`````$B+A4`)
-M``!!QH0$#P$``/](B>_H`````$B+E4`)``!)B804*`$``(!]40%U#4B+A4`)
-M``!!@$P$3`%,B>!(`X5`"0``ZP6X`````$B+'"1(BVPD"$R+9"002(/$&,-F
-M9I!32(G[Z$?A__](B[OX"```Z`````!;PV9FD&9FD&9FD$B#[!A(B1PD2(EL
-M)`A,B60D$$B)_4B-GQ@0``!(B=_H`````(3`#X7F````2(G?Z`````")PDB)
-MZ+N"____9I"`N.H(``#_=1<XG?P```!S(8B=_````.L99F9FD&9FD(/#`4B#
-MP`&`^X8/A*(```#KSH#[A@^$EP````^VPXB4!6@(```/M\)(C03`28G$2<'D
-M!4R)YT@#O6@)``#H`````$B+E6@)```/ML-F08E$%$"`?5$!=0](BX5H"0``
-M9D''1`1,__](BX5H"0``0<9$!$(`2(N%:`D``&9!QT0$3@``2(N%:`D``&9!
-MQX0$``$``/__2(N]^`@``+X`````Z`````!,B>!(`X5H"0``ZP6X`````$B+
-M'"1(BVPD"$R+9"002(/$&,-F9I!F9I!54TB#[`A(B?T/MT9`#[:<!V@(``#&
-MA`=H"```_P^W\TB-OQ@0``#H``````^WVTB-'-M(P>,%2(G>2`.U:`D``(!^
-M4/]T"$B)[^@`````2(N]^`@``+X`````Z`````!(@\0(6UW#9F:09F:09F:0
-M4TB)^P^V1EL/MK0':`@``,:$!V@(``#_#[?V2(V_4!```.@`````2(N[^`@`
-M`+X`````Z`````!;PV9FD&9FD%-(B?.`?D3_=!1(C;:0````2(M_*.@`````
-MQD-$_UO#4TB)\X"^@````/]T%TB-MC`!``!(BW\HZ`````#&@X````#_6\-F
-M9F:09F:09F:02(/L*$B)7"0(2(EL)!!,B60D&$R);"0@2(G[28GT#[=&.$0/
-MMJP':`@``$$/M\5(C11`2(T4D$B)U4C!Y05(B>Y(`[=`"0``2('&*`$``.@`
-M````00^W5"0X2(N$TV@$``!(A<!T&4B#N(``````=0](QX33:`0```````!F
-M9I!!#[=$)#C&A`-H"```_T$/M_5(C;O@#P``Z`````!(B>Y(`[-`"0``@'YR
-M_W0(2(G?Z`````!,B>9(B=_H`````$B+@T`)``#&1`5*`$B+@T`)``#&1`5+
-M`4B+7"0(2(ML)!!,BV0D&$R+;"0@2(/$*,-F9F:09F9FD&9FD&9FD$B#["A(
-MB5PD"$B);"003(ED)!A,B6PD($F)_4B)\V:!?CCA`0^%S@````^V1CJ#Z!$\
-M`0^'OP````^W1B!F/84`#X>*`0``#[?`#[:$!V@(``!(BY=H"0``//\/A'`!
-M```/ML!(C03`2,'@!4B-+`*`;44!3(UE*$R)Y^@`````2(G"2#G8=4I(B>Y,
-MB>_H`````$P[92@/A#0!``#'A9``````$GH`2,>%H`````````!(B:VH````
-M2(VUD````$F+?2CH`````,9%1`#I_P```$B+12A(B5`(2(D"3(EB"$B)52A(
-MBQ-(BT,(2(E""$B)$.G9````#[=#(&8]A0`/A\L````/M\!!#[:4!6@(``!)
-MBXU`"0``BT,X)?___P`]X0$0``^$I0```('Z_P````^$F0```(G02(T40$B-
-M%)!(P>(%2(TL$8"M@P````%,C64@3(GGZ`````!(B<)(.=AU2TB)[DR)[^@`
-M````3#ME('1;QX4P`0```!)Z`$C'A4`!````````2(FM2`$``$B-M3`!``!)
-MBWTHZ`````#&A8``````ZR9F9I!FD$B+12!(B5`(2(D"3(EB"$B)52!(BQ-(
-MBT,(2(E""$B)$$B+7"0(2(ML)!!,BV0D&$R+;"0@2(/$*,-F9I!F9I!54TB#
-M[`A(B?M(B?4/MWXRB?IFP>H%#[?WB?&#X1^X`0```$C3X(G!]]&!XO\'```A
-M3)-X9H'__P]T1`^WQTC!X`-(`X.X"0``2(,X`'0P2,<``````"&,D\`)``!(
-MC;NH#P``Z`````!(B>Y(B=_H`````$B)[DB)W^@`````2(/$"%M=PV9F9I!F
-M9I!F9I!54TB#[`A(B?5F@7XXX0$/A:P````/MD8Z@^@1/`$/AYT````/MT8@
-MNO\```!F/84`=PL/M\`/MI0':`@``(G02(T$P$C!X`5(B<-(`Y]H"0``@'M$
-M_W5)#[:5F````(T$$H32N@@````/1,(/ML!IP$!"#P")@Y````!(QX.@````
-M`````$B)FZ@```!(C;.0````2(M_*.@`````QD-$`$B+4S!(B6LP2(U#*$B)
-M10!(B54(2(DJ@$-%`>F]````#[=%(+K_````9CV%`'<+#[?`#[:4!V@(``!(
-MBX]`"0``BT4X)?___P`]X0$0``^$B0```(G02(T40$B-%)!(P>(%2(T<$8"[
-M@````/]U4`^VE9@```"-!!*$TKH(````#T3"#[;`:<!`0@\`B8,P`0``2,>#
-M0`$```````!(B9M(`0``2(VS,`$``$B+?RCH`````,:#@`````!F9F:02(M3
-M*$B):RA(C4,@2(E%`$B)50A(B2J`@X,````!2(/$"%M=PV9F9I!F9F:09F:0
-M05=!5D%505154TB#["A)B?Y(B70D"`^W3B!F@?F%``^'!0,```^WP0^VM`=H
-M"```B?!`@/[_=&MF@_E_=R)`#[;62(N/0`D``$B-!%)(C02"2,'@!4B+1`A0
-M#[9`".M#9H'Y@0!W'4`/ML9(BY>0"0``2&G`R`\``$B+1!`(#[9`".L?0`^V
-MQDB+EV@)``!(C03`2,'@!4B+A!"(````#[9`"`^VP$4/MH0&[@@``$N-!(!)
-MC02`28V$QL@!``!(B40D$$F+EI`)``!`#[;&2&G`R`\``$R-/`)(BT0D"$B+
-M4$@/MD(!/!)T*3R1#X42`@``2XT$@$F-!("Y`````$&`O,;6`0````^$R@$`
-M`.E;`0``2XT$@$F-!(!)C03&2(N(R`$``$B)3"0@#[9*"8A,)!X/ME(:B%0D
-M'[L`````@+C6`0```'1P0;P`````2XT$@$F-!(!(P>`#38VL!B@"``!*C2PP
-M3(VUP`$``)!,B>_H`````$B)PTB+A3`"``!(B9TP`@``3(DK2(E#"$B)&$PY
-M>UAU%P^V@X$```!(BU0D"#I")7009F:09F:008/$`44X9A9WMDB+3"0(2(MQ
-M>$B%]G0*2(M\)"#H`````$B+="0(2(M\)"#H``````^V@\H```"-4`&(D\H`
-M```\`W<K@'PD'P!U)$B+1"0(#[90)4B+<UA!N`````"Y`@```$B+?"00Z```
-M``#K,XU"`8B#R@```(#Z`G8E@'PD'P!U'L9#2P+&0TK_@&-,_DB)WDB+?"0@
-MZ`````#I!0$```^V3"0?#[94)!Y,B?Y(BWPD$.@`````Z>D```"]`````$N-
-M!(!)C02`2,'@`TV-I`8H`@``2HT<,$R-J\`!``!,B>?H`````$B)P4B+@S`"
-M``!(B8LP`@``3(DA2(E!"$B)"$PY>5AU%`^V@8$```!(BU0D"#I")70,9F:0
-M@\4!03AM%G>Z#[912$B)T(/@!DB#^`9U'/;"`7072(M$)`@/ME`E2(MQ6$B+
-M?"00Z`````!(BU0D"$B+<GA(A?9T"$R)]^@`````2(MT)`A,B??H`````.LN
-M1`^VA^T)``!+C02`28T$@$B-A,?(`0``2(E$)!!(BY>0"0``N#BX#P#I?OW_
-M_TB#Q"A;74%<05U!7D%?PV9FD&9FD&9FD$%505154TB#[`A)B?U)B?1(B=/&
-M0DL!QD)*`+X&````3(GGZ`````!(@WM8`'072(M3$$B+0QA(B4((2(D02(M#
-M6(!H6`&`NX,`````=!R03(GOZ`````"_`0```.@`````@+N#`````'7E2(N[
-M(`$``$B%_W01#[:S#0$``+H!````Z`````!(BWM82(7_=!$/MK.!````N@$`
-M``#H`````$B+:T!(A>T/A(H```!(@[V``````'5P2(.]B`````!U9O9#3`1U
-M&4R)[^@`````2(MS0+H!````3(GOZ`````!(BT-`#[90`@^V<`%(Q\<`````
-MN`````#H`````$B+4T!)B[7X"```OP$```#H`````$B+4T!)B[7X"```OP8`
-M``#H`````$C'0T``````2,=%8`````!(BU-@2(72=!`/MH.!````2,=$PE@`
-M````2(L32(M#"$B)0@A(B1!!@&PD#@%(B=Y,B>_H`````$&`?"0)_W1=08!\
-M)`X`=$2[`````$F-;"1@9F:09I!(B>_H`````$F+5"1H28E$)&A(B2A(B5`(
-M2(D"@'A*_W4,@\,!03A<)`YV">O203A<)`YW$4'&1"0)_TR)YDR)[^@`````
-M2(/$"%M=05Q!7<-F9F:09F9FD&9F9I!F9I!!5T%6055!5%532(/L"$F)_TF)
-M]DB)U<9"2P'&0DH`O@8```!,B??H`````$B#?5@`=!=(BU402(M%&$B)0@A(
-MB1!(BT58@&A8`8"]@P````!T&TR)_^@`````OP$```#H`````("]@P````!U
-MY4B+O2`!``!(A?]T$0^VM0T!``"Z`0```.@`````2(M]6$B%_W01#[:U@0``
-M`+H!````Z`````!(BUU`2(7;#X01`0``]D5,!'5-3(G_Z`````!(BW5`N@$`
-M``!,B?_H`````$B+14`/ME`"#[9P`4C'QP````"X`````.@`````2(M50$F+
-MM_@(``"_`0```.@`````ZRX/ME,"#[9S`4C'QP````"X`````.@`````2(M5
-M0$F+M_@(``"_`0```.@`````2(N+@````$B%R0^$-P$```^W13A)QX3':`0`
-M``````!(QX.``````````$B+NY````"Z_____TB)WO_1Z08!```/MT4X2<>$
-MQV@$````````2,>#B`````````!(B[N0````_]+V14P"=!5(BU5`28NW^`@`
-M`+\&````Z`````!(QT5``````$C'0V``````2(M58$B%TG00#[:%@0```$C'
-M1,)8`````$B+50!(BT4(2(E""$B)$$$/ME8.@^H!08A6#DB+16!(A<!T!V:#
-M>$X"=5F$TG150;P`````38UN8$R)[^@`````2(G#28M&:$F)7FA,B2M(B4,(
-M2(D82(7;=!_V0TP"=!E(BU-`28NW^`@``+\&````Z`````"`8TS]08/$`44X
-M9@YWM4B)[DR)_^@`````2(/$"%M=05Q!74%>05_#2(N3B````$B%T@^%ZO[_
-M_^D)____D$B#["A(B5PD"$B);"003(ED)!A,B6PD($B)^TB+1U!,BRA,B>_H
-M`````$B)Q4B%P`^$U0```$R)[^@`````28G$2(7`=1K&@^D````!2(GN3(GO
-MZ`````#IK@```&9FD,9%.*!(C54YN`````!F9I#&!!``2(/``4B#^`5U\L9%
-M/@#&13\`QD5``,9%08C&14(`QD5#`,9%):L/MT,X9HE%($R);2C'A90````(
-M````QT4TB````$F+1"002(E%2$@%B````$B)15#&13`D3(EE>$C'A:``````
-M````2(U=6+X`````2(G?Z`````!)BW0D&+J(````2(G?Z`````!(B>Y,B>_H
-M`````$B+7"0(2(ML)!!,BV0D&$R+;"0@2(/$*,-F9F:09F9FD&9F9I!54TB#
-M[`A(B?U(C9]0$```2(G?Z`````"$P`^%"`$``$B)W^@`````B<*Y@/___X"]
-MZ`@``/]T$H"]Z0@``/\/A>,```"Y@?___SB-^P```',&B(W[````@/F"#X3'
-M````#[;!B)0%:`@```^WPDAIV,@/``!(B=I(`Y60"0``N`````#&!!``2(/`
-M`4@]R`\``'7P2(G:2`.5D`D``$B-0AA(B4(82(G:2`.5D`D``$B-0AA(B4(@
-M2(G:2`.5D`D``$B-0BA(B4(H2(G:2`.5D`D``$B-0BA(B4(P2(G:2`.5D`D`
-M`$B-0DA(B4)(2(G:2`.5D`D``$B-0DA(B4)02(N%D`D``(A,`UM(B[WX"```
-MO@````#H`````$B)V$@#A9`)``#K!;@`````2(/$"%M=PV9F9I!F9F:09F9F
-MD$%44TB#[`A)B?1(BY_@$```2(''J`\``.@`````B<$/M\!(P>`&2`'828D$
-M)+H`````Q@0"`$B#P@%(@_I`=?(/M\%(@\0(6T%<PV9FD&:02(/L"$B-EU`!
-M``"X`````$@YEU`!``!T"$B)U^@`````2(/$",.0D)"0D)"0D)"00`^V]DB-
-M-/9(P>8'@<9@5P``B3?#9F9FD&9F9I!F9I`/MM(/MT16>(/``6:)1%9X#[96
-M`@'0#[?`PV9FD&9FD+@!````@+^[0@```703@\`!2(''L````(/X('7H9KC_
-M__/#9F9FD&9FD&9FD&9FD$B)^;@!````0#BQN$(``'4?.)&Y0@``=1>)P$B-
-M%(!(C1102,'B!,:$%PM"```!PX/``4B!P;````"#^"!UR?/#9F9FD&9F9I!F
-M9F:09F:0Q@'^1`^V5P1%A-)T3DF)^$&Y`````$&[`````+@`````23FPV%D`
-M`'4>03C3=15(F$B-!,!(P>`'#[:$!\17``"(`<-!@\,!08/!`8/``4F!P(`$
-M``!%.-%UQO/#9F:028GZ@/H!=!A$#[9'!+\`````183`#X1P`0``Z4$!``!!
-MNP````!-A<`/A!P!```/ME<$0;L`````A-)T-$B)^$&[`````$&Y`````&9F
-M9I!(.;#860``=0E!.,ET$T&#P0%!@\,!2`6`!```03C3==]!#[;[2&//2(T,
-MR4C!X0=)C90*8%<``$B+`DF)`$B+0@A)B4`(2(M"$$F)0!!(BT(828E`&$B+
-M0B!)B4`@2(M"*$F)0"A(BT(P28E`,$B+0CA)B4`X2(M"0$F)0$!(BT)(28E`
-M2$B+0E!)B4!02(M"6$F)0%B+0F!!B4!@08"\"F!7````=%.^`````$ACQTB-
-M!,!(C3S%`````$Z-#!%`#[;&2(G"2,'B!$F-3!!@2(T$!TC!X`1)C90"X%D`
-M`$B+`DB)001(BT((2(E!#(/&`4$XL6!7``!WQ4$/ML-(C03`2,'@!T$/MH0"
-M8%<``,-,B=*Y`````+\`````9I!(.;+860``#Y3``<>#P0%(@<*`!```1#C!
-M=>5`#[;'PT%505154TB)\TF)U4V)S$&)R42)Q4F)^+X`````9F:0B?%(.5\@
-M#X6%````2&/&2&G`4!```$V-5``@0;L`````1(G:00^V0BR$P'0$//!U3TAC
-MTDACR4B)T$C!X`5(:<E0$```2`'(3`'`2(E8,$R):#A(P>(%2(U4"B!*C00"
-M2(U((&:):0)$B$@@28L$)$F)1!`DQD$,_^L69F:09I!!@\,!28/"($&!^X(`
-M``!UD(/&`4B!QU`0``"#_@0/A5S___];74%<05W#9F:09I!!54%455-(@^P(
-M28GU2(G]@'\$`'1&0;P`````9F9FD$$/MMQ(8\-(C03`2,'@!X"\!<17``#]
-M=!E(C;P%O%<``+H(````3(GNZ`````"$P'4/08/$`40X901WQ+O_````B=A(
-M@\0(6UU!7$%=PV:04TB)^^@`````N@D````\_W03#[;`2(T$P$C!X`</MI0#
-M9E<``(G06\-F9F:09F:02(/L"$F)\DF)T42)PDB)_DR-AV!!``"X`````&9F
-M9I!"Q@0``$B#P`%(/9````!U[\:&84$``!/&AF!!``!`#[;&B(9F00``B)9G
-M00``B(YI00``2,>&`$(```````!(B;[X00``28M!7$B)AO!!``!(@<9@00``
-M3(G7Z`````!(@\0(PV9F9I!F9F:09F:0055!5%532(/L"$F)]4F)U$R)S4&)
-MR42)PTB)^$F)^KH!````08G308G0@+B[0@```0^%[@```$ACTDB-!))(C01"
-M2,'@!$P!T$B-D`!"``#&0@L`3(F0^$$```^V2@I(8\%(C12`2(T44$C!X@1)
-MC9028$$``+@`````9F:09I#&!!``2(/``4@]D````'7P2&/!2(TT@$B--'!(
-MP>8$2HT4%DB-BF!!``#&00&0QH)@00``0`^VQXA!!HB:9T$``$2(20E(BT4`
-M28F$,G!!``!)8\!(C12`2(T44$C!X@1*C0022,>``$(```````!(B;CX00``
-M28M$)%Q)B802\$$``$$/ML-(C12`2(T44$C!X@1)C;028$$``$R)[^@`````
-MZQ>#P@%(!;````"#^B`/A>W^__^X`0```$B#Q`A;74%<05W#9F:09F:09F:0
-M2(/L"$F)\T&)TDB)^DF)^+@!````B<:`NKM"```!#X7A````2)A(C12`2(T4
-M4$C!X@1)C800`$(``$2(4`B(2`G&0`L`1`^V2`I)8\%(C12`2(T44$C!X@1)
-MC9008$$``+@`````Q@00`$B#P`%(/9````!U\$ECT4B-!))(C01"2,'@!$P!
-MP$B-D&!!``#&0@$0QH!@00``0(A*"4ACQDB-#(!(C0Q(2,'A!$$/MH0("D(`
-M`$B-%(!(C1102,'B!$J-!`)(QX``0@```````$B)N/A!``!!#[;"2(T$P$C!
-MX`=)BX0`O%<``$F)A`CP00``28VT$&!!``!,B=_H`````.L5@\`!2('"L```
-M`(/X(`^%_?[__[`!2(/$",.02(/L"$F)\8G02(G^QH<+0@```$R-AV!!``"Y
-M`````)!"Q@0!`$B#P0%(@?F0````=>[&AF%!```!QH9@00``0$C'A@!"````
-M````2(F^^$$```^VP$B-!,!(P>`'2(N$!KQ7``!(B8;P00``2('&8$$``$R)
-MS^@`````2(/$",-(@^P(28GQB=!(B?[&APM"````3(V'8$$``+D`````D$+&
-M!`$`2(/!`4B!^9````!U[L:&84$```#&AF!!``!`2,>&`$(```````!(B;[X
-M00``#[;`2(T$P$C!X`=(BX0&O%<``$B)AO!!``!(@<9@00``3(G/Z`````!(
-M@\0(PT%7059!54%455-(@^PX2(E\)!A(B70D$$&)U42(1"0/28G\10^V]4EC
-MQDB-!,!(P>`'@+P'Q%<``/T/A,8(``"`^1`/A(4"``"`^1!W%X3)#X2=````
-M@/D!#X6G"```D.D&`0``@/GB=!N`^?]F9I!T*8#YD`^%BP@``&9FD&:0Z<@&
-M``"Y`````(!_!`!FD`^%W`<``.D$"```26/&2(T$P$C!X`?&A`?$5P``_X"_
-M"T(```%U)42)\DB+="002(M\)!CH`````(7`#X4U"```08!$)`8!Z2H(``!)
-M8\;&1`<'`4B+5"002(E4QQ#I$P@``("_"T(```%U6$B-CV!!``!)8\9(C03`
-M2,'@!T@!^`^V40F(D&)7``!(!<!7```/ME$*@^(!B%`%QD`$`$2)\DB+="00
-M2(M\)!CH`````(7`#X6]!P``08!$)`8!Z;('``!)8\;&1`<'`4B+3"002(E,
-MQQ#IFP<``$ECQDB-!,!(P>`'2(TT.`^VEY)!``"(EK)7```/MY>000``9HF4
-M![!7``!(BY>(00``2(F4!Z!7``!(BY=L00``2(F4!W!7``!(C8P'@%<``$B+
-MEW1!``!(B1%(BY=\00``2(E1"(N7A$$``(F4!YA7``#&AL17```!@'\&'P^$
-M%P<``+L`````2(VN8%<``$R-KK!7``#K20^VRT2)\DB+="002(M\)!CH````
-M`(7`=!5)8\9(C03`2,'@!T&(G`2S5P``ZR"#PP%!@$0D!@$X70(/1<-!B$4#
-M08!\)`8?=`4Z70)RLD'&A"0+0@```4$/MG0D!$"$]@^$G`8``+H`````08!\
-M)`<!=!?K0V9F9I!F9I`/MM%(8\)!@'P$!P%U,TACPD'&1`0'_TF+=,000;D`
-M````0;@`````N?\```!(BWPD&.@`````Z4H&``"Y`````(/!`4`X\76WZ3@&
-M``!-B<])C4$82(E$)"!(C70D,$F+01A(B40D,$ECQDB-!,!(P>`'2(TL.$B-
-MA<!7``#&0`000?9!#'`/A$(#``!(BY7(5P``2(72='$/ME@&2(UZ7+H(````
-MZ`````"$P'5;0?9'#P]T5$B+A<A7``!(A<!T2$B)Q8!]90!T/P^VVXG:2(GN
-M3(GGZ`````!,BTPD($0/M\")V4B)ZDB+="002(M\)!CH``````^V769(BT5H
-M2(7`=`5(B<7KNT$/MD\/]L$-#X3K````26/&2(T4P$B)T$C!X`=!#[:T!&!7
-M``!`@/X?#X?*````]L$(=!=`#[;&2(T$T$C!X`1!QH0$X%D```;K'$`/MM9)
-M8\9(C03`2(T$PDC!X`1!QH0$X%D```=`#[;&26/V2(TT]DB-%/!(P>($28V\
-M%.!9``#&1P$`00^V1P^(1P-(BT0D,$F)A!3H60``00^V1PF(1P)!#[97#8/B
-M#TC!Y@=,`>9(C8Y@5P``#[9!!CC"#T?0@^(/#[9'!(/@\`G0B$<$00^V5RF#
-MX@\/MDD&.,H/1]'!X@2#X`\)T(A'!("&8%<```'IS`$``/;!`@^$PP$``$B-
-M="0P3(GGZ`````")P3S_#X5B`0``00^V3"0$A,ET/4$/MH0DQ%<``#S_=#"Z
-M`````#S]=1[K)0^VPDB-!,!(P>`'00^VA`3$5P``//]T$CS]=`Z#P@$XRG7=
-MZP6Z``````^VPDB-!,!(P>`'28V,!&!7``"X`````,8$"`!(@\`!2(/X9'7R
-M1`^VTDECTDB-%-)(P>('2HT\(D$/ML5(C03`2,'@!TF-A`1@5P``2(F'R%<`
-M`$V-A!2P5P``26/62(T4TDC!X@=)BX04O%<``$F)0`1(BTPD$$B)C]A9``!,
-M`>)(BX+05P``2(F'T%<``$R-C\!7``!!QD$$_TB-MV!7```/MDX'00^V1PF(
-MA`]H5P``@$8'`4$/MD<-@^`/#[:29E<``#C0#T?"B$8&2(M$)#!)B4`,00^V
-M1P^(1@,/MD0D#T&(009!#[9$)`5!.D0D!'4&0<9$)`4`08!$)`4!26/"0<9$
-M!`<!2(M4)!!)B53$$.M*26/&2(T$P$C!X`</MM%(C1322,'B!TF-E!1@5P``
-M23F4!,A7``!T(@^VP4B-!,!(P>`'3`'@#[9R!T$/MD\)B(PP:%<``(!"!P%!
-M#[97"42)]DR)Y^@`````26/&2(T$P$C!X`=!@+P$LU<````/A*````!!@'PD
-M!A]U8^F``@``0<9'!!`/MDL#1(GR2(MT)!!(BWPD&.@`````A<`/A5T"``!!
-M@$0D!@$/MDL##[;!@\`!#[95`CG0=0_&0P,`Z3P"``!F9I!F9I"-00&(0P-!
-M@'PD!A\/A"0"``#K(TECQDB-!,!(P>`'3`'@2(V8L%<``$B-J&!7``!,C;C`
-M5P``#[9#`SI%`@^"<O___^GM`0``08!\)`8`#X7A`0``0;D`````0;@`````
-MN9````!$B?)(BW0D$$B+?"08Z`````#IN0$``$F)_4&_`````$B+3"0023E-
-M(`^%@P```$2)^$AIP%`0``!)C5P$(+T`````1(GX2&G`4!```$B)!"2`>RS_
-M=4I!@'PD!A\/A&T!``")Z$C!X`5(BQ0D2(U$$$`/MDL@2(M3&$V-3`0$1`^W
-M0R)(BW0D$$B+?"08Z`````"%P'4*08!$)`8!QD,L\$B#Q0%(@\,@2(']@@``
-M`'6?28/'`4F!Q5`0``!)@_\$#X59____08!\)`8`#X7]````00^V="0$0(3V
-M#X3+````N@````!!@'PD!P%T$.L\#[;12&/"08!\!`<!=3-(8\)!QD0$!_])
-MBW3$$$&Y`````$&X`````+G_````2(M\)!CH`````.FC````N0````"#P0%`
-M./%UM^MQ#[;!2(T$P$C!X`=)C90$P%<```^V0@0\_70(//]T!,9"!/Z#P0%!
-M.$PD!'?326/&2(T$P$C!X`=)BZP$T%<``+L`````0H!\(R@!=1)"QD0C*`!*
-MBW0C($B+?"08_]5(@<-0$```2('[0$$``'0EZ]1!N0````!!N`````"YX@``
-M`$2)\DB+="002(M\)!CH`````$B#Q#A;74%<05U!7D%?PV9F9I!F9F:09F:0
-M2(/L&$B)'"1(B6PD"$R)9"0028G\2(GU2(N>F````(![!@`/A$<!``!(C;:0
-M````2(G?Z`````")P3S_#X0N`0``2(GN#[9%`3P!=%H\`7(:/!`/A(H````\
-MD&9FD&:0#X4*`0``Z<8```"`NPM"````#X7X````QH,+0@```8!K!@$/MM%!
-MN0````!!N`````"Y`````$R)YDB)W^@`````Z<D```"`NPM"````#X6\````
-MQH,+0@```8!K!@$/MM%!N0````!!N`````"Y`0```$R)YDB)W^@`````Z8T`
-M``"Z`````#J,&KA"``!U#P^VA!JY0@``.D8)=!)FD$B!PK````!(@?I0%0``
-M==B`:P8!#[;128GQ1`^V1@FY$````$R)YDB)W^@`````ZS\/MH6J````2(T4
-M@$B-%%!(P>($QH03"T(```&`:P8!#[;10;D`````0;@`````N9````!,B>9(
-MB=_H`````)!(BQPD2(ML)`A,BV0D$$B#Q!C#9F9FD&9FD&9FD&9FD$&)T(GR
-MA?9T%$B)^4B)T)#&`0!(@\$!2(/H`77SB3=(@>I@5P``2+B/XSB.XSB.XTCW
-MXDC!Z@I!.-!!#T+0B%<$A-)T*[H`````9F:09F:0#[;"QD0'!_](C03`2,'@
-M!\:$!\17``#]@\(!.%<$=^#&1P8`QD<%`$B)^+H`````QH`+0@```8B0"D(`
-M`(/"`4@%L````(/Z('7E\\-F9I!(B?F`?P0`#X29````OP````!$#[;'26/`
-M2(T$P$C!X`=(.;0!V%D``'5NN`````!`.+P(N$(``'4(QH0(NT(```%(!;``
-M``!(/5`5``!UX$ECP$B-!,!(P>`'2,>$`=A9````````2(V4`6!7``"X````
-M`,8$$`!(@\`!2(/X9'7R26/`2(T$P$C!X`?&A`'$5P``_8!I!0&#QP%`.'D$
-M#X=L____2(G/0;@`````2#EW('4P2,='(`````#&1R@`26/`2&G`4!```$B-
-M1`$@N@````#&0"P`@\(!2(/`((#Z@G7P08/``4B!QU`0``!!@_@$=;GSPV9F
-M9I!F9F:0055!5%532(/L"$B)_4B)]TF)U$V)Q4&)R$B)ZP^V104Z101U!,9%
-M!0!$#[9;!4B)WDF)V;@`````08G"B<))BTD@2#GY=4M(F$AIP%`0``#&1`,H
-M`0^V2P1!NP````"$R71D0;L`````2#F^V%D``'4.#[:&Q%<``(/``SP!=D=!
-M@\,!2('&@`0``$$XRW0WZ]=(A<EU&4ACPDAIP%`0``!(`=A(B7@@QD`H`>L9
-M9I!!@\(!@\`!28'!4!```(/X!`^%<O___T$/ML)(:<!0$```2(U$`S"Y````
-M`&9F9I#&!`$`2(/!`4B!^0(0``!U[T4/MM-)8\)(B7S#$$$/ML-(C03`2,'@
-M!TB-A`-@5P``9KD``,8$`0!(@\$!2(/Y9'7R26/"2(T$P$C!X`=(C8P#V%<`
-M`+@`````9F:09I#&!`@`2(/``4@]``(``'7P26/"2(T$P$C!X`=(C0P82(FY
-MV%D``$R)J=!7``#&@<17``#_2,>!R%<```````!)BQ0D2(F4`[Q7``!$B(%F
-M5P``0;D`````0;@`````N?\```!$B=)(B?Y(B>_H`````(!#!0%(@\0(6UU!
-M7$%=PTB+!TR+``^V<$-`A/9T1P^V5PVY`````/;"`70-ZS>02(G02-/XJ`%U
-M"(/!`4`X\77N@/D#=B1(C02-`````"7\`P``28V$`-`!``"+`(D%`````.LB
-MN0````!(C02-`````"7\`P``28V$`-`!``"+`(D%`````,'H%(/@`<.02(L'
-M1`^V0$-!N0H```!%A,!T2@^V?PU(B<*^`````$&Y"@```+D`````9F:09F:0
-M2(GX2-/XJ`%T%`^V@O(2``"#X`.#P`A!.,%$#T?(@\8!@\$!2(/":$0XQG73
-M00^VP<-F9F:09F9FD&9FD&9FD$B+!T0/MD!#0;D(````183`=$H/MG\-2(G"
-MO@````!!N0@```"Y`````&9FD&9FD$B)^$C3^*@!=!0/MH+R$@``@^`#@\`(
-M03C!1`]"R(/&`8/!`4B#PFA$.,9UTT$/ML'#9F9FD&9F9I!F9I!F9I`/M@?`
-MZ`2#X`</MG<"B<*`S@)`]L8$#T7"#[9/`XG"@<H```(`]L$$#T7"B<*`S@A`
-M]L8(#T7"B<*!R@``"`#VP0@/1<*)PH#.!$#VQ@(/1<*)PH'*```$`/;!`@]%
-MP@^V5Q3!XA@)T,-F9F:09F:0Z`````#SPV9FD&9FD&9FD(N'&`D``"7___\`
-MN@`````]4`&3`'49#[:'&PD``,#H!#P,#Y3`#[;09F9FD&9FD(G0PV9F9I!F
-M9I!F9I!F9I"%]GY"#[8'A,!T!#P@=3%(B?JY`````.L79F9FD&9FD`^V0@%(
-M@\(!A,!T!#P@=1"#P0$Y\77IZPUF9F:09F:0N`````##N`$```!F9I!FD,-F
-M9F:09F9FD&9F9I!F9I`/MD<##[97`L'B"`G0P>`0#[9/`0^V%\'B"`G1"<C#
-MD$&)T(72="6Y`````&9F9I`/MA</MD<!B`:(5@%(@\8"2(/'`H/!`40YP77D
-M\\-FD$B#[`A)B?`/MT8@NO\```!F/84`=PL/M\`/MI0':`@```^WTDB-%-)(
-MP>(%2`.7:`D``$B+MQ`1```/MD)0P>`(2)A(C80&3`@``(L(B0T`````@>'_
-M````#[9"4,'@"$B82(VT!D0(``"+!HD%`````,'@"`G(B8(0`0``9L>"#`$`
-M````3(G&Z`````!(@\0(PV9F9I!F9I!F9I!F9I!(@^PH2(E<)`A(B6PD$$R)
-M9"083(EL)"!)B?U!B?1(BR]`@/X#=CE*C1SE`````('C^`<``$B-A!TP`@``
-MQP`,````OQ`G``#H`````$B-A!TT`@``BSB)/0````#K-Y!*C1SE`````('C
-M^`<``$B-A"M0`@``QP`,````OQ`G``#H`````$B-G"M4`@``BSN)/0````!!
-M#[;T2&/&2(T40$B-%)!)C935P!(```^V2@F#X?R(2@F)^"4``#\`/0``$`!U
-M"XG(@\@"B$()ZQF02&/&2(T40$B-%)")R(/(`4&(A-7)$@``2(M<)`A(BVPD
-M$$R+9"083(ML)"!(@\0HPV9F9I!F9F:09F9FD&9FD$%7059!54%455-(@^P8
-M28G^3(L_28L'QD9)`,9&2`7&1DL&2(E^4+D`````O0````!(C9```@``2(E4
-M)!!(!00"``!(B40D".L69F:09F:000^V1@U(T_BH`74*@\$!D$$Z3T-RZH#Y
-M`W9Z2(T<S0````"!X_@'``!,BVPD$$D!W4''10`L````OQ`G``#H`````$@#
-M7"0(1(LC1(DE`````$''10`D````OQ`G``#H`````(L#B04`````P>`(08'D
-M_P```$$)Q$''10`@````OQ`G``#H`````(L;B1T`````ZWA(C1S-`````('C
-M^`<``$R+;"0020'=0<=%`"P```"_$"<``.@`````2`-<)`A$BR-$B24`````
-M0<=%`"0```"_$"<``.@`````BP.)!0````#!X`A!@>3_````00G$0<=%`"``
-M``"_$"<``.@`````BQN)'0````!!@?P!`6F6=1I!@$X,!HG8P>@0/%`/E,`/
-MML#K2&9FD&9FD$&!_`$!``!U#XG8P>@0/%`/E,`/ML#K*K^($P``Z`````"#
-MQ0%`@/T$=PJY`````.FK_O__B=C!Z!`\4`^4P`^VP$B#Q!A;74%<05U!7D%?
-MPV9F9I!F9F:09F9FD&9FD$%505154TB#[`A(B?U!B?1(BX>(````3(LH9H._
-M#`$```!T,(GSO^@#``#H`````$6%Y'0%@_L!=AI,B>]F9I#H`````&:#O0P!
-M````=`6#ZP+KTDB#Q`A;74%<05W#D$B#[#A(B5PD"$B);"003(ED)!A,B6PD
-M($R)="0H3(E\)#!)B?R)RT&)]D&)U46)QTB+AX@```!(BRA(B>_H`````$B)
-MQL9`..'&0#D!QD`Z$K@/````183V=09!#[9$)$>(1CM$B&X\3(GJ#[;&B$8]
-M#[;'B$8^B=C!Z!"(1C^)V,'H&(A&0(A>04$/MT0D0&:)1B!(B6XHQT8T````
-M`$C'1D@`````183_2,?``````$C'P@````!(#T7"2(F&H````$B)[^@`````
-M2(M<)`A(BVPD$$R+9"083(ML)"!,BW0D*$R+?"0P2(/$.,-FD$B#["A(B1PD
-M2(EL)`A,B60D$$R);"083(ET)"!)B?R)RT&)]D&)U4B+AX@```!(BRA(B>_H
-M`````$B)QL9`..'&0#D!QD`Z$K@/````183V=09!#[9$)$>(1CM$B&X\3(GJ
-M#[;&B$8]#[;'B$8^B=C!Z!"(1C^)V,'H&(A&0(A>04$/MT0D0&:)1B!(B6XH
-MQT8T`````$C'1D@`````2,>&H`````````!(B>_H`````$B+'"1(BVPD"$R+
-M9"003(ML)!A,BW0D($B#Q"C#9I!32(G[08G*08G12(7_#X0!`0``3(L'387`
-M#X3U````00^V>$.%_WY72(N#B`````^V4`VY`````/;"`70-ZT"02(G02-/X
-MJ`%U!X/!`3GY=>^#^0-^+DF+`$@%T`$``(T4C0````!(8])(`="+`(D%````
-M`,'H%(/P`8/@`>LLN0````!)BP!(!=`!``"-%(T`````2&/22`'0BP")!0``
-M``#!Z!2#\`&#X`&$P'5E@+L<`0```'4&@'M"`'56#[=#0$&`O`!H"```_W1'
-MQD-")6;'@PP!```!`$$/M]%`#[;V0;@!````1(G12(G?Z`````"^!0```$B)
-MW^@`````QD-"`&:#NPP!````#Y3`#[;`ZP6X`````%O#9F:09I!(@^PH2(E<
-M)`A(B6PD$$R)9"083(EL)"!(B?U!B?5!B=1(BX>(````2(L82(G?Z`````!(
-MB<;&0#CAQD`Y`<9`.A&X#P```$6$[74$#[9%1XA&.T2(9CQ,B>(/ML:(1CT/
-MMT5`9HE&($B)7BC'1C0`````2,=&2`````!(QX:@`````````$B)W^@`````
-M2(M<)`A(BVPD$$R+9"083(ML)"!(@\0HPV9FD&9FD&9FD%532(/L"$B)^TB)
-MS4&)T4B%_P^$!@$``$R+!TV%P`^$^@```$$/MGA#A?]^5DB+@X@````/ME`-
-MN0````#VP@%T#.L_2(G02-/XJ`%U!X/!`3G/=>^#^0-^+DF+`$@%T`$``(T4
-MC0````!(8])(`="+`(D%`````,'H%(/P`8/@`>LLN0````!)BP!(!=`!``"-
-M%(T`````2&/22`'0BP")!0````#!Z!2#\`&#X`&$P'5K@+L<`0```'4&@'M"
-M`'5<#[=#0$&`O`!H"```_W1-QD-")6;'@PP!```!`$$/M]%`#[;VN0$```!(
-MB=_H`````+X%````2(G?Z`````#&0T(`9H.[#`$```!U$(N#$`$``(E%`+@!
-M````ZP6X`````$B#Q`A;7<-F9I!F9I!(@^PH2(D<)$B);"0(3(ED)!!,B6PD
-M&$R)="0@2(G]08GU08G408G.2(N'B````$B+&$B)W^@`````2(G&QD`XX<9`
-M.0'&0#H1N`\```!%A.UU!`^V14>(1CM$B&8\3(GB#[;&B$8]#[=%0&:)1B!(
-MB5XHQT8T`````$C'1D@`````183V2,?``````$C'P@````!(#T7"2(F&H```
-M`$B)W^@`````2(L<)$B+;"0(3(MD)!!,BVPD&$R+="0@2(/$*,-F9F:09F:0
-M9F:09F:02(/L*$B)7"0(2(EL)!!,B60D&$R);"0@2(GU08G408G-2(L?2(G?
-MZ`````!(B<)(A<!U$,:%Z0````'&14H#Z90```#&0#CAQD`Y`4&`_`$9P/?0
-M@\`"B$(Z183M=5&X`````$B#?6``=`</MH6!````B$([#[=%.&:)0B!(B5HH
-MQT(T`````$C'0D@`````2,?``````$B)@J````!(B=9(B=_H`````.LM9F:0
-M9I#&0CL/#[=%.&:)0B!(B5HHQT(T`````$C'0D@`````2,?``````.N_2(M<
-M)`A(BVPD$$R+9"083(ML)"!(@\0HPV9F9I!F9F:09F9FD&9FD$%7059!54%4
-M55-(@^PXB?5)B=1(BP^-%.T`````C4+@B<!(C9P((`(``$B)'"1(C80()`(`
-M`$B)1"0(B=),C;P*``(``$R-K`H$`@``NP````!,C70D$(/]`W8EC8,<`0``
-M2(L4)(D"OQ`G``#H`````$B+5"0(BP*)!0````#K'8V#'`$``$&)![\0)P``
-MZ`````!!BT4`B04`````0HD$,TB#PP1(@_L<=:M(BT0D$$F)!"1(BT0D&$F)
-M1"0(2(M$)"!)B40D$(M$)"A!B40D&$B#Q#A;74%<05U!7D%?PV9F9I!F9F:0
-M9F9FD&9FD$%7059!54%455-(@^PXB?5)B=1(BP^-%.T`````C4+@B<!(C9P(
-M(`(``$B)'"1(C80()`(``$B)1"0(B=),C;P*``(``$R-K`H$`@``NP````!,
-MC70D$(/]`W8EC8,``0``2(L4)(D"OQ`G``#H`````$B+5"0(BP*)!0````#K
-M'8V#``$``$&)![\0)P``Z`````!!BT4`B04`````0HD$,TB#PP1(@_L<=:M(
-MBT0D$$F)!"1(BT0D&$F)1"0(2(M$)"!)B40D$(M$)"A!B40D&$B#Q#A;74%<
-M05U!7D%?PV9F9I!F9F:09F9FD&9FD$%7059!54%455-(@^PX28G^0(AT)`M,
-MBS]$#[;N26/%2(T40$B-%)!(C1372(V"P!(``$"(<`A(B;K`$@``QD`*`$2)
-M[N@`````2(UL)!!(B>A(B>K&``!(@\`!2(G33(UD)#!,.>!U[`^V1"0+B40D
-M#(G&3(GWZ`````!(B=_H`````$ECU4B-#%)(C0R*2,'A`TJ-%#&)@M@2``!(
-MBT,,28F$#MP2``"`?"0+`W8\0HT$K0````!(F$F-A`?0`0``BP")!0````")
-M@O`2``!"C03M`````$B828V$!X`!``"+"(D-`````.M'0HT$K0````!(F$F-
-MA`?0`0``BPB)#0````!)8\5(C11`2(T4D$&)C-;P$@``0HT$[0````!(F$F-
-MA`>``0``BPB)#0````!)8\5(C11`2(T4D$F-!-:)B/02``#V@/(2```0#X0[
-M`0``]H#)$@```G109I#&10``2(/%`4PYY77S2(U<)!!(B=J+="0,3(GWZ```
-M``!(B=_H`````$ECU4B-#%)(C0R*2,'A`T&)A`[D$@``2(M##$F)A`[H$@``
-MZQ=)8\5(C11`2(T4D$''A-;D$@```0`"`(!\)`L#=C5"C1SM`````$ACVTJ-
-MA#LP`@``QP`8````OQ`G``#H`````$J-G#LT`@``BS.)-0````#K,T*-'.T`
-M````2&/;2HV$.U`"``#'`!@```"_$"<``.@`````2HV<.U0"``"+,XDU````
-M`$ECQ4B-%$!(C120B?&!X?___]^)\`T````@0?>$UO`2``````,`B<H/1="`
-M?"0+`W860HT$[0````!(F$F-A`<T`@``B1#K%$*-!.T`````2)A)C80'5`(`
-M`(D02(/$.%M=05Q!74%>05_#D$%6055!5%532(G]28GV28GU#[<&9H7`>0LE
-M`!\``,'X"(A'24B-O80```!)C54428M%%$B)A80```!(BT((2(E'"(M"$(E'
-M$$R-I<````!)BT4N2(F%P````$B-G9@```!)C54V28M%-DB)A9@```!(BT((
-M2(E#"$B+0A!(B4,02(M"&$B)0QA(BT(@2(E#(+H*````2(G^Z#/P__^Z!```
-M`$R)YDR)Y^@C\/__NA0```!(B=Y(B=_H$_#__V;'16@``&;'16H``&9!@[ZR
-M`0```0^4PL'B`P^V14R#X/<)T(A%3$'VA:<````$=`9FQT5H`0!!]H6D````
-M`70D9H--:`)!]H6J`````70%9H--:@%!]H6H`````70&9H%-:``!0?:%I```
-M`"!T%&:#36@$0?:%J@```"!T!6:#36H"0?:%I````$!T%F:!36B``$'VA:H`
-M``!`=`9F@TUJ")#&A8(````"0?:%F0````%T,@^W16BH`70,@\@(9HE%:&:#
-M36H000^VA98```"#X!^#P`$\(+H?````#T3"B(6"````0?:%F`````AT!F:!
-M36@``D'VA9@````$=`5F@TUH($'VA9@````"=`5F@TUH$$'VA:@````@=!5!
-M]H6N````('0+9H--:$!F9I!F9I#V16@!=`U)BX7(````2(E%>.L(08M%>$B)
-M17A(@VUX`4'V16H"=!I!#[>%@````*@/=`YF@_@"&<"#P`2(16SK!,9%;`+&
-M16W_00^W57X/M\*H!'0+QD5M`NL;9F:09I"H`G0&QD5M`>L,]L(!9F:0=`3&
-M16T`QD5N_T'V16H$=!^Y`````$$/MX6P````2-/XJ`%T`XA-;H/!`8/Y!W7F
-MO@`"``!,B>_H`````(F%S````$'VAJ8````@=!M!#[>&K````(/@((/X`1G`
-M@\`"B(68`0``ZP?&A9@!````N`$```!;74%<05U!7L-F9I!(@^PH2(D<)$B)
-M;"0(3(ED)!!,B6PD&$R)="0@28G]28GV3(LGNX#____K"69F9I"`^X5W0P^V
-MPT$/MJP$:`@``$"`_?]T,4`/ML5(:<#(#P``2(G'20.\))`)``!,.6\(=16Z
-M"````$R)]N@`````A,!T!(GHZP^#PP&`^X%FD':NN/____\/ML!(BQPD2(ML
-M)`A,BV0D$$R+;"083(MT)"!(@\0HPV9FD&9FD&9FD$%7059!54%455-(@^PX
-M28G^2(L'@']#``^$$0,``,=$)#0`````2(V0``(``$B)5"0(2`4$`@``2(D$
-M)&9F9I`/MDPD-(A,)#-$#[;Y26/'2(T40$B-%)!)C336]H;R$@``$`^$KP(`
-M`$B-EL`2``"X`0```$2)^4C3X`A""DB+MM`2``!(B70D*/9""0(/A!X!```/
-MMD0D,XUH`4$X;D,/A@P!``!)8\=(C11`2(T4D$C!X@-(B50D($P!\DB)5"08
-M2(M4)"!)C906Z!(``$B)5"001`^V[4ECQ4B-%$!(C1202(T<U0````!.C20S
-M0?:$)/(2```0#X2G````2(M,)!CW@>02``````X`#X22````28VT'N@2``"Z
-M"````$B+?"00Z`````"$P'1W28VT'MP2``!(BT0D($F-O`;<$@``N@@```#H
-M`````(3`=%2X`0```$2)Z4C3X$B+5"082('"P!(```I""HA""D&(A"3*$@``
-M2(-\)"@`=0]-BZ0DT!(``$R)9"0HZQA)8\5(C11`2(T4D$B+1"0H28F$UM`2
-M``"#Q0%!.&Y##X<B____2(-\)"@`#X7$````3(GWZ`````!(B40D*$B%P`^$
-M6P$``$ECQTB-#$!(C0R(28T,SDB+5"0H2(F1T!(```^V1"0S2(T40$B-%)!)
-MC936P!(``$B+1"0H2(E0(`^V@<D2``!(BU0D*(A""L9""0!,B3+&0@X`QD)8
-M`,9"*``/MDPD,XUQ`4$X=D-V74ECQTB-%$!(C12028V\UL`2``!`#[;.#[9'
-M"DC3^*@!=!A(8\%(C11`2(T4D$B+1"0H28F$UM`2``"#Q@%!.'9#=AKKSDEC
-MQTB-%$!(C1202(M,)"A)B8S6T!(``$ECQTB-%$!(C12028V4UL`2```/MD(*
-M2(M,)"B(00T/MFH*@'PD,P-V*T*-'/T`````2&/;2(M$)`A(`=C'`#@```"_
-M$"<``.@`````2`,<)(DKZRE"C1S]`````$ACVTB+1"0(2`'8QP`X````OQ`G
-M``#H`````$@#'"2)*X-$)#0!#[9$)#.#P`%!.$9##X<1_?__2(/$.%M=05Q!
-M74%>05_#9I!!5T%6055!5%532(/L:$B)_4R+)\9$)%!0QD0D407&1"12!,9$
-M)%,PQD0D5!'&1"15J\9$)%8`QD0D5P!!QX0D`$`!`!,@``!(BP?'@`1``0#_
-M_P``2(L'QX`$0`$``````$@[O_@(```/A=0```!(C9^0%```2(V7&`D``$&X
-M`0```+D(````O@```@#H`````(N%$`D```^VE1L)``"#Z@2-!(*(A1L)``!(
-MB>_H`````(3`=0Q(BT0D4$B)A1@)``"+!0``````A1L)``"#P`&)!0`````/
-MMH48"0``B(,8"0``#[:%&0D``(B#&0D```^VA1H)``"(@QH)```/MH4;"0``
-M@\`"B(,;"0``#[:%'`D``(B#'`D```^VA1T)``"(@QT)```/MH4>"0``B(,>
-M"0``#[:%'PD``(B#'PD``$V)YTF-A"0``0``2(E$)$!!BX0D``$``(D%````
-M``^WT(E4)%RH('0+)=__``")1"1<ZQB)T(/(((E$)%Q(BU0D0(D"BP*)!0``
-M``!(BT4`QX`$`0```````$B+10#'@!@!````````2(M%`,>`'`$```````"_
-MD-`#`.@`````0<>'<`$``!@!``!!BX=T`0``B04`````@.3]@,P$B40D7$''
-MAW`!```8`0``BT0D7$&)AW0!``!!QX=P`0``*`$``$''AW0!``!_?P``0<>'
-M<`$``"0!``!!BX=T`0``B04`````9K@```W_/P``B40D7$''AW`!```D`0``
-MBT0D7$&)AW0!``!!QX=P`0``/`$``$''AW0!`````'H`0<>'<`$``*0!``!!
-MQX=T`0``?;_O_T''AW`!``"X`0``08N'=`$``(D%`````"7__P``#0``^@")
-M1"1<0<>'<`$``+@!``"+1"1<08F'=`$``$''AYP```#_````0<>'D`(``$0!
-M``!!QX>4`@``!A``"$''AY`"``"T`0``0<>'E`(``%]P``!!QX>0`@``,```
-M`$&+AY0"``")!0`````PY(#,,XE$)%Q!B8>4`@``@'U#``^$E0(``,=$)$@`
-M````28V'4`(``$B)1"0X28V75`(``$B)5"0P2(V%&`D``$B)1"0H28V7@`$`
-M`$B)5"0@28V'A`$``$B)1"0828V7,`(``$B)5"0028V'-`(``$B)1"0(9F9F
-MD&9FD`^V5"1(B%0D3X#Z`P^&_@```$0/MO)"C1SU`````$ACVTR+;"0020'=
-M0<=%``@```"_$"<``.@`````2(M$)`A,C20#08L$)(D%`````(E$)%P-``"`
-M`$&)!"1(BU0D*$2)]DB)[^@`````1(GV2(GOZ`````!!QT4`1`$``+\0)P``
-MZ`````!!QP0D!A``"$''10"T`0``OQ`G``#H`````$''!"1?<```0<=%``@`
-M``"_$"<``.@`````QT0D7/]4@`!!QP0D_U0``+H!````1(GV2(GOZ`````!(
-MBT0D($B-%`.+`HD%`````"7___[_B0+'1"1<!0'(`$@#7"08QP,%`<@`Z?L`
-M``!F9F:01`^V="1/0HT<]0````!(8]M,BVPD.$D!W4''10`(````OQ`G``#H
-M`````$B+5"0P3(TD$T&+!"2)!0````")1"1<#0``@`!!B00D2(M4)"A$B?9(
-MB>_H`````$2)]DB)[^@`````0<=%`$0!``"_$"<``.@`````0<<$)`80``A!
-MQT4`M`$``+\0)P``Z`````!!QP0D7W```$''10`(````OQ`G``#H`````,=$
-M)%S_5(``0<<$)/]4``"Z`0```$2)]DB)[^@`````2(M$)"!(C10#BP*)!0``
-M```E___^_XD"QT0D7`4!R`!(`UPD&,<#!0'(`+^@A@$`Z`````!$B?9(B>_H
-M`````(-$)$@!#[9$)$^#P`$X14,/A\[]__](B>_H`````$&+AP0!``")!0``
-M``"#R`*)1"1<08F'!`$``$B+5"1`BP*)!0`````E\/___0T-```"B40D7(D"
-MBP*)!0````!(BX7H$```08F'"`$``(N%[!```$&)APP!``!(BX48$0``08F'
-M$`$``(N%'!$``$&)AQ0!``!!QX<@`0````````^WA;P2```E_P\```T```$`
-M08F'(`$``$B+A7@1``!!B8<D`0``BX5\$0``08F'*`$``$B+A:`1``#'`/\/
-M``!!QX<T`0````````^WA;X2```E_P\```T```$`08F'-`$``$B+A:@1``!!
-MB8<X`0``BX6L$0``08F'/`$``$''AT@!````````QT0D7``!``!!QX=,`0``
-M``$``$&+AP0!``")!0````"#R%E!B8<$`0``QT0D7/O_``Q!QX=4`0``^_\`
-M#$''AUP!``#__P``N@````!(8\+'A(7`"0```````,=$A7@`````@\(!@_H0
-M=>)FQX6X$@``_P]FQX6Z$@``_P_&15`!N`$```!(@\1H6UU!7$%=05Y!7\-F
-M9F:09F:005=!5D%505154TB#[`A)B?Y)B?1,BR],B>_H`````$B)PTB%P'4.
-M0<:$).D````!Z;$```!,B>_H`````$B)Q4B%P'490<:$).D````!2(G>3(GO
-MZ`````#IB````$R->UC&0SCAQD,Y`<9#.@-!#[=$)#AFB4,@QH.8````#TF+
-M!DB)0RC'0S0``@``2(M5$$B)4TBX`````&9FD&9FD,8$$`!(@\`!2#T``@``
-M=?!(B6MX2,>#H`````````"^`````$R)_^@`````BU,T2(MU&$R)_^@`````
-M2(G>3(GOZ`````!(@\0(6UU!7$%=05Y!7\-F9F:09F9FD&9FD$%6055!5%53
-M2(/L,$F)_4R+)P^V1PV$P`^$P@,```^V\+T`````0/;&`745N@````"#P@$/
-MMNJ)\(GIT_BH`73P2&/%2(T40$B-%)!)C934X!(``(M"!*D```(`=`T-```$
-M`"7___W_B4($2&/%2(T40$B-%)!!BX34Y!(``*D```0`#X2A`@``28N<)/@(
-M``!)C80DD!0``$PYXT@/1-A)C3341`^VCNH2``!$#[:&Z1(```^VCN@2``!!
-M#[94)$$/MH;O$@``B40D(`^VANX2``")1"08#[:&[1(``(E$)!`/MH;L$@``
-MB40D"`^VANL2``")!"2)[DC'QP````"X`````.@`````0;@`````2&/%2(T4
-M0$B-%)!-C8S4Z!(``$$/MH08Z`@``#S_#X2$````#[;`2&G`R`\``$F)PDP#
-MDY`)``!,B=9,B<^Y"````/SSI@^7P@^2P#C"=5A%#[9*!$4/MD(#00^V2@)!
-M#[92`4$/MC)!#[9"!XE$)!!!#[9"!HE$)`A!#[9"!8D$)$C'QP````"X````
-M`.@`````0<9%"?],B>Y,B>?H`````.DH`@``28/``4F#^`(/A5W___],B>?H
-M`````$B)PTB%P`^$!@(``$ACQ4B-%$!(C1200?:$U.42```$=`2`2UT"2&/%
-M2(T40$B-%)!!]H34YA(```1T!(!+71!(8\5(C11`2(T4D$'VA-3E$@``"'0$
-M@$M=!$ACQ4B-%$!(C1200?:$U.82```(=`2`2UT@2&/%2(T40$B-%)!!]H34
-MY1(```)T!(!+70%(8\5(C11`2(T4D$'VA-3F$@```G0$@$M=",9#6`!)B=Y(
-M8\5(C11`2(T4D$F+A-3H$@``2(D#3(EK"$R)[^@`````B(.[````08!%*`%!
-M@'PD0P!T,KD`````N@````!F9F:000^V10U(T_BH`70.#[;"B$P#<(!#6@&#
-MP@&#P0%!.$PD0W?<28M-4$B-4SA)B55028U%2$B)0SA(B4M`2(D108!%6`$/
-MMHN[````28N\)+@0``!)Q\``````3(GR3(GNZ`````#IM@```*D```@`#X2K
-M````3(GGZ`````!(B<-(A<`/A)<```#&0$L&QD!*!6;'@,@``````,9`2`;&
-M0$D`2,=`>```!0!(8\5(C11`2(T4D$F+A-3H$@``2(F#U````$B)@\P```!,
-MB6M03(GOZ`````"(@^H```!F@TMH$$R)[^@`````/`EV!F:!2V@``D'&10X!
-M28M5:$F)76A)C45@2(D#2(E3"$B)&DB)WDR)Y^@`````9F:09F:02(/$,%M=
-M05Q!74%>PV9FD$%7059!54%455-(@^PH2(G]2(GS2(7V=!4/MD8)A,!T#3S_
-M#X7M!P``Z4<!``"Y``````^VA"GN"```//]T$P^VP$B-%(!(C1202(V<U<@!
-M``!(@\$!2(/Y!'770;P`````00^VA"SN"```//]T.`^VP$B-%(!(C1202,'B
-M`TB-G!7(`0``]H05T@$```)T#[X`````2(G?Z`````#K"$B)W^@`````28/$
-M`4F#_`20=;`/MD4^9CF%D!````^%4P<``$B%VP^%E````(!]40`/A4`'``#&
-M15$!9F:09F:02(NTW6@$``!(A?9T8TB+AH````!(A<!T)TC'AH``````````
-M2,>$W6@$````````2(N^D````+K______]#K,$B+AH@```!(A<!T)$C'AH@`
-M````````2,>$W6@$````````2(N^D````/_09F9FD$B#PP%(@_M`#X2X!@``
-MZX#&0PG_2(G>2(GOZ`````"0Z:$&``"Y`````&9FD&9FD`^VA"GN"```//\/
-MA`4!```/MM!(C0222(T$@DC!X`-,C;P%R`$``$B-A`7``0``@'@1_P^$W```
-M`(!X%@`/A%,&``!!O`````!(C0222(T$@DC!X`-,C:P%*`(``$B-'"A,C;/`
-M`0``3(GOZ`````!(B<%(BX,P`@``2(F+,`(``$R)*4B)00A(B0B`>4K_=&^`
-MN>D`````#X3X!0``#[9!2$B)PH/B!DB#^@9U'*@!=#H/MI&!````2(MQ6$R)
-M_^@`````Z<P%``!(@_H$#X7"!0``J`$/A+H%``!(B<Y(B>_H`````.FJ!0``
-M2(G.2(GOZ`````#IF@4``&9F9I!!@\0!13AF%@^&B`4``&:0Z5/___](@\$!
-M2(/Y!&9FD`^%VO[__TC'1"00`````(!]40`/A:4```"[`````&:02(NTW6@$
-M```/MH0K:`@``$B%]G1R2(N.@````$B%R71F2(-^8`!U7SS_=#8/MO@/M\=(
-MC11`2(T4D$C!X@5(B=!(`X5`"0``]D!+!'04@'A)`'4.#[?72(GOZ`````"0
-MZR5(QX3=:`0```````!(QX:``````````$B+OI````"Z_______12(/#`4B#
-M^T`/A6O____&15$!Z;@$``!(BU0D$`^VA"KN"```//\/A)$$```/MM!(C022
-M2(T$@DC!X`-(C8P%R`$``$B)3"0@@+P%U@$````/A&<$``#&1"0?`$B-!))(
-MC02"2,'@`TB-E`4H`@``2(D4)$R--"A-C;[``0``2(L\).@`````2(G#28N&
-M,`(``$F)GC`"``!(BPPD2(D+2(E#"$B)&(![2O\/A?D#``!$#[=K.$ECQ0^V
-ME`5H"```9HE4)`Y,BZ3%:`0``/9#3`1T=DV%Y'1Q28.\)(``````=&9)@WPD
-M8`!U7H!C3/OV0TL$=!(/MU0D#DR)YDB)[^@`````ZT))BX0D@````$ECU4C'
-MA-5H!````````$G'A"2``````````$C'0T``````28N\))````"Z_____TR)
-MYO_09F:09I#V0TL$#X13`0``QH/H`````$&`9Q3G]D-,`0^$Z````(!C3/Y(
-MBU-`2(72=$6`>TD`=2GV0TL$=",/ME5!P>(&1`'J2&/22(NU^`@``+\'````
-MZ`````#IV0```$B+M?@(``"_`0```.@`````Z<,```!-A>1T94F+C"2`````
-M2(7)=%B`>TD`=1OV0TL$=!4/MU0D#DR)YDB)[^@`````Z9````!)8\5(QX3%
-M:`0```````!)QX0D@`````````!(QT-``````$F+O"20````NO____],B>;_
-MT>M9@'M)`'53]D-+!'1-#[950<'B!D0!ZDACTDB+M?@(``"_`@```.@`````
-MZRU(BT-`2(7`="1(BY"(````2(72=!A(QX"(`````````$B+0T!(B[B0````
-M_]+V0TP"#X0A`@``2(M30$B+M?@(``"_!@```.@`````@&-,_>GA`0``2(M#
-M0$B%P`^$U`$``$B#N(@`````#X3&`0``QD-+`<9#2@!(B=J^!@```$B+?"0@
-MZ`````!(@WM8`'072(M3$$B+0QA(B4((2(D02(M#6(!H6`&`NX,`````=")F
-M9F:09F:02(GOZ`````"_`0```.@`````@+N#`````'7E2(N[(`$``$B%_W01
-M#[:S#0$``+H!````Z`````!(BWM82(7_=!$/MK.!````N@$```#H`````$R+
-M8T!-A>0/A.@```#V0TP$=4U(B>_H`````$B+<T"Z`0```$B)[^@`````2(M#
-M0`^V4`(/MG`!2,?'`````+@`````Z`````!(BU-`2(NU^`@``+\!````Z```
-M``#K,D$/ME0D`D$/MG0D`4C'QP````"X`````.@`````2(M30$B+M?@(``"_
-M`0```.@`````28N4)(@```!(A=)T)@^W0SA(QX3%:`0```````!)QX0DB```
-M``````!)B[PDD````/_2]D-,`G092(M30$B+M?@(``"_!@```.@`````@&-,
-M_4C'0T``````2<=$)&``````2(M38$B%TG00#[:#@0```$C'1,)8`````$B+
-M$TB+0PA(B4((2(D008!O%@%(B=Y(B>_H`````/9#3`)T'$B+4T!(B[7X"```
-MOP8```#H`````(!C3/UF9I"`1"0?`0^V3"0?03A/%@^'P?O__TB#1"00`4B#
-M?"00!`^%2/O__[@!````2(/$*%M=05Q!74%>05_#9F:09F:055-(@^P(2(G[
-M2(LOZ`````"$P'09#[9U0T"$]G0T#[93#;D`````]L(!=![K),9#"?](B=Y(
-MB>_H`````.MBD$B)T$C3^*@!=0B#P0%`./%U[DB)[^@`````2(G&2(7`=#](
-MBU-H2(E#:$B-0V!(B09(B58(2(DR@$,.`4B)7E#&1D@%QD9)`,:&@0````^Y
-M`0```+H!````2(G?Z`````!(@\0(6UW#9F9FD&9F9I!(@^PH2(D<)$B);"0(
-M3(ED)!!,B6PD&$R)="0@28G\2(GU2(N>B`````^V1D(\)`^'$@8```^VP/\D
-MQ0`````/MT9.#[?0]L($=`QFQT9.`0#&1D(!ZT-F@_@@=0QFQT9."`#&1D(1
-MZS&$TGD5]D9)`W0/)'^#R`AFB49.QD9"#>L8]L((=`;&14('ZPWVQ@)T",9%
-M1P#&14(>2(GN3(GGZ`````#IG04``+D!````N@(```"^`0```$B)[^@`````
-MZ8$%``"Y`0```+H`````O@$```!(B>_H`````.EE!0``N0$```"Z`0```+X!
-M````2(GOZ`````#I204``+D!````NF````"^`0```$B)[^@`````Z2T%```/
-MMDY(0;@!````NF````"^`0```$B)[^@`````Z0P%``!!N`$```"Y```!!+HA
-M````O@$```!(B>_H`````.GJ!```2(M#((%@-/__]_]!N`$```"Y`0```+H"
-M````O@````!(B>_H`````.F]!```0;@!````N0````"Z`@```+X`````2(GO
-MZ`````"_$"<``.@`````Z9$$``!(BT,@@6`T___W_T&X`0```+D!````N@(`
-M``"^`````$B)[^@`````Z60$``!!N`$```"Y`````+H"````O@````!(B>_H
-M`````+\0)P``Z`````#I.`0``+D!````N@(```"^`````$B)[^@`````Z1P$
-M``"Y`0```+H`````O@````!(B>_H`````.D`!```N0$```"Z`0```+X`````
-M2(GOZ`````#IY`,``$&X`0```+G_____N@$```"^`````$B)[^@`````Z<(#
-M``"Y`0```+H`````O@````!(B>_H`````.FF`P``#[9&1TR+;,9828E=4$F)
-M=6`/MD9'08B%@0```$'&14H#0<9%20!!@$U(!8!##@%(BU-H2(U#8$R):VA)
-MB44`28E5"$R)*K^`&@8`Z`````!!@'PD0P!T)KT`````]D,-`70/ZQD/MD,-
-MB>E(T_BH`741@\4!03AL)$-WZ>L%O0````!(BU,@BT(TJ0``"`!T"B7___?_
-MB4(TZVE(C03M`````$F)QD&!YO@'``"[N`L``$"`_0-V'4F+!"1(!8`!``!,
-M`?"+`(D%`````,'H$X/@`>L<28L$)$@%@`$``$F-!`:+`(D%`````,'H$X/@
-M`83`=0^_Z`,``.@`````@^L!=:YF0<>%R```````3(GN3(GGZ`````#IB`(`
-M`+]`#0,`Z`````"Y`````+H@````O@$```!(B>_H`````+\0)P``Z`````#I
-M6`(``+D`````N@$```"^`````$B)[^@`````OQ`G``#H`````.DR`@``2(M#
-M((%@-/__]_]!N`````"Y_____[H!````O@````!(B>_H`````+\0)P``Z```
-M``#I^P$``+D`````N@````"^`````$B)[^@`````OQ`G``#H`````.G5`0``
-MZ`````#IRP$``&9F9I#H`````.F]`0``0;@!````N?````"ZFP```+X!````
-M2(GOZ`````#IFP$``$&X`0```+F@UEHKNN`#``"^`0```$B)[^@`````Z7D!
-M``!!N`$```"Y`.`#`+JD`P``O@$```!(B>_H`````.E7`0``0;@!````N>2H
-M!@&ZQ`,``+X!````2(GOZ`````#I-0$``+D!````ND@#``"^`0```$B)[^@`
-M````Z1D!``"_0`T#`.@`````N0$```"Z(````+X!````2(GOZ`````"_$"<`
-M`.@`````Z>D```!!N`$```"Y`````+HA````O@$```!(B>_H`````.G'````
-MN0$```"Z8````+X!````2(GOZ`````#IJP````^V3DA!N`$```"Z8````+X!
-M````2(GOZ`````#IB@```,9#"0!(B[Z(````Z`````#K>+D!````N@$```"^
-M`````$B)[^@`````OQ`G``#H`````.M52(M#((%@-/__]_]!N`$```"Y____
-M_[H!````O@````!(B>_H`````+\0)P``Z`````#K(;D!````N@$```"^````
-M`$B)[^@`````OQ`G``#H`````+@!````2(L<)$B+;"0(3(MD)!!,BVPD&$R+
-M="0@2(/$*,-F9F:09F:02(/L&$B)'"1(B6PD"$R)9"002(G[2(GU#[=6(&:!
-M^H4`#X>.````#[?"#[:$!V@(```\_W1_9H/Z?W<D#[;`2(T40$B-%)!(P>(%
-M2`.70`D``$B+0E`/ME`(ZUYF9F:0#[=&(&8]@0!W(P^WP`^VA`=H"```2&G`
-MR`\``$@#AY`)``!(BT`(#[90".LM#[=&(`^VA`=H"```2(T$P$C!X`5(`X=H
-M"0``2(N`B`````^V4`CK!;K_____N?____]F@7T@A0!W#`^W12`/MHP#:`@`
-M`$B+LV@)```/ML*`^O]T'DB8@+P#[@@``/]T$H#Y_W0-@'TD!G4J9F9FD&9F
-MD$B#?7@`=`Q(C75X2(G?Z`````!(B>Y(B=_H`````.D-`0``#[;!2(T$P$C!
-MX`5,C20&00^V1"1"/!H/A(4````\&G<./!$/A;L```!F9F:0ZQ,\&W1W/!P/
-MA:D```!FD.F<````2(N3$!$``$B!PDP(``!!#[9$)%#!X`A(F$@!PHL*B0T`
-M````#[;)2(N3$!$``$B!PD0(``!!#[9$)%#!X`A(F$@!PHL"B04`````P>`(
-M"<%!B8PD!`$``$'&1"1"&NM"0<9$)$(;ZSI(BX,0$0``2`5,"```00^V5"10
-MP>((2&/22`'0BP")!0````"#X/=!B$0D2$'&1"1"'.L&0<9$)$(=2(-]>`!T
-M#$B-=7A(B=_H`````$B)[DB)W^@`````3(GF2(G?Z`````!(BQPD2(ML)`A,
-MBV0D$$B#Q!C#9F9FD&9FD&9FD&9FD$B#[`A(B?Y(BS_H`````$B#Q`C#9F9F
-MD&9F9I!F9F:02(/L.$B)7"0(2(EL)!!,B60D&$R);"0@3(ET)"A,B7PD,$F)
-M_TB)\TB+;E`/MW8X2&/&N@````"`O`=H"```_P^$.@D```^V0TH\"0^$3@4`
-M`#P)=TH\!0^$EP```#P%=QX\`P^$K0```#P$9F9FD`^%[`@``.G1````9F:0
-M9I`\!P^$H00``#P'9F:09F:0#X<<!```Z8$"``!F9I!FD#P6#X1^`P``/!9F
-M9I!F9I!W(SP4#X31!0``/!1F9F:0#X?;`@``/`H/A90(``!FD.D[!0``/!H/
-MA!\"```\_Y`/A*D%```\%P^%=`@``&:0Z48#```/MG=#0(3V9F9FD`^$AP``
-M``^V50U!O`````#VP@%T;>MV2(M%((%@-/___O](BWM0N0````"Z`0```$B)
-MWN@`````OP4```#H`````+H!````Z30(``"Y`````+H`````2(G>2(GOZ```
-M``"_4,,``.@`````N@$```#I"P@``$B)T$2)X4C3^*@!=1%!@\0!03CT=>KK
-M!D&\``````^V4TA(B="#X`9(@_@&=0GVP@$/A<8```!(BU4@BT(TJ0```0!T
-M#27___[_B4(TZ:L```!*C03E`````$F)QD&!YO@'``!!O1`G``"028L708#\
-M`W8728V$%H`!``"+`(D%`````"4```$`ZQ5)C806@`$``(L`B04`````)0``
-M`0"%P'0L08#\`W8328V$%H`!``#'`````0#I-P<``$F-A!:``0``QP````$`
-MZ20'``"_Z`,``.@`````08/M`76+QD-+`L9#2O](B=Y,B?_H`````+H!````
-MZ0X'``#V10H!=#1(B=Y(B>_H`````(3`=25!O?H```!(B=Y(B>_H`````(3`
-M=1"_Z`,``.@`````08/M`77A08#\`W8F28L'2`6``0``2HT4Y0````"!XO@'
-M``!(`="+$(D5`````(D0ZR1)BP=(!8`!``!*C13E`````('B^`<``$@!T(L0
-MB14`````B1!(BWM02(G>Z$CF__^_($X``.@`````N@$```#I9`8``$C'QP``
-M``"X`````.@`````2(MK4$R+90!,B>?H`````$B)P4B%P'41QH/I`````;H!
-M````Z2H&``#&0#CAQD`Y`<9`.A</MT,X9HE!($B+10!(B4$HQT$T`````$C'
-M04@`````2,>!H`````````!(B<Y,B>?H`````+H!````Z=\%``!(Q\<`````
-MN`````#H`````$B+:U!,BV4`3(GGZ`````!(B<%(A<!U$<:#Z0````&Z`0``
-M`.FE!0``QD`XX<9`.0'&0#H8#[=#.&:)02!(BT4`2(E!*,=!-`````!(QT%(
-M`````$C'@:``````````2(G.3(GGZ`````"Z`0```.E:!0``2(G>2(GOZ!_E
-M__^Z`0```.E%!0``3(ME`$R)Y^@`````2(G"#[9+;$B%P'4.QH/I`````;(!
-MZ1\%``#&0#CAQD`Y`<9`.@6(2#L/MT,X9HE"($B+10!(B4(HQT(T`````$C'
-M0D@`````2,>"H`````````"(2V](B=9,B>?H`````+H!````Z<X$``!,BV4`
-M3(GGZ`````!(B<(/MDMN2(7`=0[&@^D````!L@'IJ`0``,9`..'&0#D!QD`Z
-M!(A(.P^W0SAFB4(@2(M%`$B)0BC'0C0`````2,="2`````!(QX*@````````
-M`(A+<4B)UDR)Y^@`````N@$```#I5P0``$R+90!,B>?H`````$B)P4B%P'41
-MQH/I`````;H!````Z3($``#&0#CAQD`Y`<9`.@8/MT,X9HE!($B+10!(B4$H
-MQT$T`````$C'04@`````2,>!H`````````!(B<Y,B>?H`````+H!````Z><#
-M``!F9F:09F:03(ME`$R)Y^@`````2(G!2(7`=1'&@^D````!N@$```#INP,`
-M`,9`..'&0#D!QD`Z#`^W0SAFB4$@2(M%`$B)02C'030`````2,=!2`````!(
-MQX&@`````````$B)SDR)Y^@`````N@$```#I<`,``$R+90!,B>?H`````$B)
-MP4B%P'41QH/I`````;H!````Z4L#``#&0#CAQD`Y`<9`.A;&0#P!#[=#.&:)
-M02#&@9@````/2(M%`$B)02C'030`````2,=!2`````!(QX&@`````````$B)
-MSDR)Y^@`````N@$```#I]0(``,9#2O]FQX/(```````/ME-(2(G0@^`&2(/X
-M!G4%]L(!=15(@WM@`'4.2(GOZ`````"(@^H```"`>TL"=0](BW-02(G:3(G_
-MZ`````#V10P"=1B[`````$R-96"`?0X`#X5``0``Z5<"``!(BW5`#[9.1@^V
-MT0^V1CN#Z`$YPGTNC4$!B$9&@$9'`<9&0@`/MT9.@^#^@\@(9HE&3DR)_^@`
-M````N@$```#I1P(``#G"=!2[`````$R-96"`?0X`=2GI$0(``,9&0@`/MT9.
-M@^#V@,P"9HE&3DR)_^@`````N@$```#I"P(``$R)Y^@`````2(G!2(M%:$B)
-M36A,B2%(B4$(2(D(@'E*_W1\@+GI``````^$O0$```^V44A(B="#X`9(@_@&
-M=2+VP@%T10^VD8$```!(BW%82(GOZ`````"Z`0```.FI`0``2(/X!`^%@0$`
-M`/;"`0^$>`$``$B)SDR)_^@`````N@$```#I@0$``$B)SDR)_^@`````N@$`
-M``#I;`$``,:!Z0````"#PP$X70X/ACL!``#I2?___V9F9I!,B>?H`````$B)
-MP4B+16A(B4UH3(DA2(E!"$B)"(!Y2O\/A)````"`>4D`#X5_````@+GI````
-M``^$]`````^V44A(B="#X`9(@_@&=2+VP@%T2`^VD8$```!(BW%82(GOZ```
-M``"Z`0```.G@````2(/X!`^%N````/;"`69FD`^$K````$B)SDR)_^@`````
-MN@$```#IM0```$B)SDR)_^@`````N@$```#IH````,:!Z0````"#PP$/MD4.
-M.-@/ASK___\XPW52A,!T3KL`````3(UE8$R)Y^@`````2(G"2(M%:$B)56A,
-MB2)(B4((2(D0#[9"23PB=`0\#744O@H```!(B=?H`````+H!````ZSR#PP$X
-M70YWN\9%"?](B>Y,B?_H`````+H!````ZQZZ`0```.L7187M9F9FD`^$W_C_
-M_^GW^/__9F:09I")T$B+7"0(2(ML)!!,BV0D&$R+;"0@3(MT)"A,BWPD,$B#
-MQ#C#9F9FD&9F9I!F9I!(@^PH2(E<)`A(B6PD$$R)9"083(EL)"!(B?M)B?0/
-MMTX@9H'YA0`/A^@````/M\$/MK0':`@``$"`_O\/A-,```!F@_E_=RA`#[;6
-M2(N/0`D``$B-!%)(C02"2,'@!4B+1`A0#[9`".M)9F:09F:09H'Y@0!W'4`/
-MML9(BY>0"0``2&G`R`\``$B+1!`(#[9`".L?0`^VQDB+EV@)``!(C03`2,'@
-M!4B+A!"(````#[9`"#S_=%X/ML`/MJP#[@@``$"`_?]T&$"`_O]T$D$/MDPD
-M)(#Y!G5G9F9FD&9FD$"`_?]T+T"`_O]T*4`/ML9(C11`2(T4D$C!X@5)B=5,
-M`ZM`"0``0<9%2P)!QD5*_^F?`@``28-\)'@`=`U)C70D>$B)W^@`````3(GF
-M2(G?Z`````#II0(``&9FD&9FD$`/ML9(C11`2(T4D$C!X@5)B=5,`ZM`"0``
-M28M4)$B$R0^$N0```$$/MD0D.CP&#X30````/`P/A,@```!!#[>5R````(U"
-M`69!B87(````9H/Z"78;08!]2@9T%$'&14L"0<9%2O]!@&5,_ND#`@``O^@#
-M``#H`````$$/ME5(2(G0@^`&2(/X!G4Z]L(!=#5!#[:5@0```$F+=5A`#[;%
-M2(T\@$B-/+A(C;S[R`$``$&X`````+D"````Z`````#IV0$``$'&14H#3(GN
-M2(G?Z`````#IQ`$``&9FD&:000^V1"0Z/`%U"T'&14H$D.E_`0``/`)U#$'&
-M14H%9I#I;P$``#P##X7/````2(G608!]2@5U*V:!>@3(-V9FD'4@00^W=3A(
-MQ\<`````N`````#H`````$'&14H&Z3(!``!,B>_H`````$F-O9@```"^*```
-M`.@EO___A,!U04F-O80```"^%````.@0O___A,!U+$F-O<````"^"````.C[
-MOO__A,!U%TF#?7@`=!!!QD5*%^G:````9F:09F:09D&#O<@````==A1!QD5+
-M`D'&14K_08!E3/[IM0```+_H`P``Z`````!!QD5*&F9!@X7(`````>F8````
-M/!=U"D'&14H5Z8H````\&&9F9I!U!T'&14H6ZWL\!&9FD&:0=0=!QD5*!^MK
-M/`5F9I!FD'4'0<9%2@CK6SP&9F:09I!U!T'&14H)ZTL\#&9FD&:0=0=!QD5*
-M"NL[/!9F9I!FD'4'0<9%2A3K*SP.9F:09I!U(DF#?"1X`'0-28UT)'A(B=_H
-M`````$R)YDB)W^@`````ZRM)@WPD>`!T#4F-="1X2(G?Z`````!,B>9(B=_H
-M`````$R)[DB)W^@`````2(M<)`A(BVPD$$R+9"083(ML)"!(@\0HPV9F9I!F
-M9F:02(/L*$B)'"1(B6PD"$R)9"003(EL)!A,B70D($F)_DF)]$B+;E`/MT8X
-MN@````"`O`=H"```_P^$RP(```^V1DH\%`^$QP```#P4=S@\#9`/A/L````\
-M#7<./`5F9F:0#X6=`@``ZTT\#F9FD&9FD`^$[P```#P/#X6%`@``9I#I\@``
-M`#P;#X25````/!N0=Q`\&'0Y/!D/A64"``!FD.M$/!QT5SS_#X55`@``9I#I
-MQ@```+X`````3(GG9F:0Z`````"Z`0```.DY`@``O@$```!,B>?H`````+H!
-M````Z2("``"^`0```$R)Y^@`````N@$```#I"P(``$B)]^@`````N@$```#I
-M^0$``)!(B??H`````+H!````Z>8!``#V1FD$=!=(B?=F9I!FD.@`````N@$`
-M``#IR0$``$B)]^@`````N@$```#IMP$``$B)]^@`````N@$```!FD.FC`0``
-M2(GWZ`````"Z`0```.F1`0``QD9*_X!]#@`/A-D```"[`````$R-;6!FD$R)
-M[^@`````2(G!2(M%:$B)36A,B2E(B4$(2(D(@'E*_P^$B0```(!Y20`/A88`
-M``"`N>D`````#X0U`0``#[912$B)T(/@!DB#^`9U(O;"`71(#[:1@0```$B+
-M<5A(B>_H`````+H!````Z0@!``!(@_@$#X7Y````]L(!9F:0#X3M````2(G.
-M3(GWZ`````"Z`0```.G=````2(G.3(GWZ`````"Z`0```.G(````QH'I````
-M`(/#`0^V10XXV`^'.O___SC##X6/````00^V1"1)/")T%CP-=!)!O`````!,
-MC6U@@'T.`'46ZV^^"@```$R)Y^@`````N@$```#K=DR)[^@`````2(G#2(M%
-M:$B)76A,B2M(B4,(2(D8#[9#23PB=`0\#74H2(G>2,?'`````+@`````Z```
-M``"^"@```$B)W^@`````N@$```#K)4&#Q`%$.&4.=Z7&10G_2(GN3(GWZ```
-M``"Z`0```.L%N@$```")T$B+'"1(BVPD"$R+9"003(ML)!A,BW0D($B#Q"C#
-M9F:09F:09F:005=!5D%505154TB#["A)B?T/MU8@0;C_____1(G`9H'ZA0`/
-MAX`````/M\)$#[:$!V@(``!$B<!!@/C_=&MF@_I_=R)!#[;02(N/0`D``$B-
-M!%)(C02"2,'@!4B+1`A0#[9`".M#9H'Z@0!W'4$/ML!(BY>0"0``2&G`R`\`
-M`$B+1!`(#[9`".L?00^VP$B+EV@)``!(C03`2,'@!4B+A!"(````#[9`"`^V
-MP$$/MKP%[@@``$B-!+](C02'28V$Q<@!``!(B40D($$/ML!(C11`2(T4D$C!
-MX@5)B==-`[U`"0``2(M.2`^V`<'@&`^V40'!XA`)T`^V40,)T`^V40+!X@@)
-MT,'H`TB-:0B#^!"Z$`````]'PHG`3(TTP4PY]0^'?`$``,=$)!P`````2(T$
-MOTB-!(=(P>`#2HT4*$B)5"002('"P`$``$B)5"0(28V$!2@"``!(B00D9F9F
-MD$B)[^@`````08G$2(UU!$C'QP````"Y!````/SSI@^7P@^2P#C"#X4*`0``
-M08/\$`^'``$``(-$)!P!@WPD'`%U(D''AY`!```!````18FGE`$``$B+10!)
-MB8?<````Z=(```!,B>_H`````$B)PTB%P`^$RP```,9`2P;&0$H%9L>`R```
-M````QD!(!L9`20!(QT!X```%`,>`D`$```$```!$B:"4`0``28N'U````$B)
-M@]0```!)BX?4````2(F#S````$B+10!(B8/<````2(M$)"!(B4-02(G'Z```
-M``"(@^H```!F@TMH$$B+?"0@Z``````\"78&9H%+:``"2(M4)`B`0A8!2(M4
-M)!!(BX(P`@``2(F:,`(``$B+%"1(B1-(B4,(2(D82(G>3(GOZ`````!(@\4(
-M3#GU#X:]_O__2(/$*%M=05Q!74%>05_#9F9FD&9F9I!F9I!F9I!!5T%6055!
-M5%532('L2`(``$B)?"082(ET)!")T$B+5PA(B50D($B+"DB)3"0H#[976(A4
-M)#=(B?E(@\%(2(E,)#A(.4](#X21`@``@'PD-P`/A(8"```/ML")1"0,2(M\
-M)#CH`````$R-8/!,C40D0(M,)`RZ`0```$B+="0@2(M\)!#H`````$R-?"1`
-M@'PD0``/A`4!``!!O0````!-C;0DU````$$/MNU(8\5(B<-(P>,$28U\'VRZ
-M"````$R)]N@`````A,`/A+$```!)C50?8`^V0@B#X`]!B(0DZ@```$$/MTPD
-M:&:!X=_]B<B#R!!F08E$)&@/MD((P.@$/`EU"XG(@\@P9D&)1"1H2&/%2,'@
-M!$$/MD0':,#H!#P*=0AF08%,)&@``DB+3"0X2(M1"$F-1"002(E!"$F)3"00
-M28E4)!A(B0)!]D0D3`)T0T&`9"1,_4F+5"1`2(72=#-(BT0D*$B+L/@(``"_
-M!@```.@`````ZQMF9I!F9I!!@\4!13@O=A5F9F:09F:0Z1+___]%."\/AR0!
-M``!,B>*^!@```$B+?"0@Z`````!!@+PD@P````!T)&9FD&:02(M\)"CH````
-M`+\!````Z`````!!@+PD@P````!UX4F+O"0@`0``2(7_=!-!#[:T)`T!``"Z
-M`0```.@`````28M\)%A(A?]T$T$/MK0D@0```+H!````Z`````!)BT0D0$B%
-MP'1M2,=`8`````!!]D0D3`1U'DB+?"0HZ`````!)BW0D0+H!````2(M\)"CH
-M`````$F+5"1`2(M,)"A(B['X"```OP8```#H`````$F+5"1`2(M$)"A(B[#X
-M"```OP$```#H`````$G'1"1``````$F+%"1)BT0D"$B)0@A(B1!(BU0D((!J
-M#@%(BTPD&(!I6`%,B>9(BWPD*.@`````2(M4)#A(BT0D&$@Y4$AT"X!L)#<!
-M#X6!_?__2('$2`(``%M=05Q!74%>05_#D$%7059!54%455-(@>PH`@``28G_
-M28GU2(G52(L'2(E$)!!$#[;A2(U<)"!)B=A$B>&Z`0```$B)_DR)[^@`````
-M1(GB3(GN2(GOZ`````!,BW5(28/N$$B-74A)C4802#G8="]!#[9&23P-=!4\
-M(G4SZP]!#[9&23P-=`8\(F:0=2)!QD9*!4'&1DL$QD0D'@'K!<9$)!X`@'PD
-M(`!U&.G=`0``38MV$$F#[A!)C4802#G8=;[KW,9$)!\`28U78$B)5"0(3(ME
-M2$F#[!!)C40D$$@YPP^$O`$```^V1"0?2,'@!$R-K`2,````9F9FD$F-O"34
-M````N@@```!,B>[H`````(3`#X5@`0``38MD)!!)@^P028U$)!!(.=@/A',!
-M``#KRD&`1PX!QD%*!<:!Z`````#&04L$9L>!R```````QH'*`````$C'07@`
-M``4`#[9\)!](8\=(P>`$2(V4!(`````/MD($B$%(#[9"!8A!24R)>5`/MD((
-M@^`/B('J````#[=Q:&:!YM_]B?"#R!!FB4%H#[9"",#H!#P)=0F)\(/(,&:)
-M06A(8\=(P>`$#[:$!(@```#`Z`0\"G4&9H%):``"2(EI6$ACQTC!X`0/MI0$
-MA@```(B1@0```$B+A`2,````2(F!U````$B)@<P```"`15@!28M':$F)3VA(
-MBU0D"$B)$4B)00A(B0A(BU502(U!$$B)15!(B5D02(E1&$B)`@^V44A(B="#
-MX`;&1"0>`$B#^`9U,/;"`709#[:1@0```$B)[DR)_^@`````QD0D'@#K$DB)
-MSDB+?"00Z`````#&1"0>`(!$)!\!#[9$)!\X1"0@#X=$_O__@'PD'@!T);X*
-M````3(GWZ`````#K%DB+?"00Z`````!(B<%(A<`/A7G^__](@<0H`@``6UU!
-M7$%=05Y!7\.005=!5D%505154TB![$@"``!)B?U(B70D*$B++P^V1RB(1"0W
-M2(U72$B)5"0X2#E72`^$H0,``(3`#X29`P``2(U,)$!(@\%<2(E,)"!(C40D
-M0$B#P%1(B40D&$B-5"1`2(/"0$B)5"002(U,)$!(@\$02(E,)`A(C40D0$B#
-MP"!(B00D2(M\)#CH`````$R-8,A!N`````"Y`````+H`````3(GN2(M\)"CH
-M`````$&)QX3`#X0+`P``0;X`````NP````")7"0P0;@`````B=FZ`0```$R)
-M[DB+?"0HZ``````/ML!(P>`$2(/`9$@]``(```^'N0$``$R-1"1`B=FZ`0``
-M`$R)[DB+?"0HZ`````"Z"````$R)YDB+?"0@Z`````"$P`^$A@$``$B+3"0X
-M2(M1"$F-1"0X2(E!"$F)3"0X28E4)$!(B0(/MD0D0D&(1"192(MT)!A,B>_H
-M`````#S_=!8/ML!(:<#(#P``2`.%D`D``$F)1"00183V=%\/MD0D0]'H@^`!
-MP>`$00^V5"1=@^+O"<)!B%0D70^V1"1#P>@#@^`!P>`%@^+?"<)!B%0D70^V
-M1"1#P>@"@^`!P>`#@^+W"<)!B%0D70^V1"1&08B$)+L```#IN0````^V1"1"
-M08A$)%E-B6PD"`^V1"1&08B$)+L````/MT0D1$&)1"1@#[>$))````!F08F$
-M)+@````/MH0DD@```$&(A"2Z````2(N$)(````!)B80DJ````$B+5"002(M"
-M"$F)A"2P````2(M$)%!)B40D>$B+3"0(2(M!"$F)A"2`````28V4)(@```!(
-MBT0D8$F)A"2(````2(L,)$B+00A(B4((2(M!$$B)0A!(BT0D>$F)A"2@````
-MBTPD,$R)XDB+="0H3(GOZ`````#I^0```$&#Q@&#PP%%./X/A`(!``#I_?W_
-M_TR)]^@`````2(U8\$B)VKX&````3(GOZ`````"`NX,`````=!YF9I!(B>_H
-M`````+\!````Z`````"`NX,`````=>5(BT-`2(7`=%E(QT!@`````/9#3`1U
-M&4B)[^@`````2(MS0+H!````2(GOZ`````!(BU-`2(NU^`@``+\!````Z```
-M``!(BU-`2(NU^`@``+\&````Z`````!(QT-``````$B+$TB+0PA(B4((2(D0
-M08!M#@%!@&PD6`%(B=Y(B>_H`````$TY="1(#X4L____08!M*`%,B>9(B>_H
-M`````$B+1"0X23E%2'0A@&PD-P%T&F:0Z;_\__]-C70D2$TY="1(D`^%\O[_
-M_^O$2('$2`(``%M=05Q!74%>05_#9F:09F:005=!5D%505154TB![#@"``!(
-MB7PD&$B)]4B+!DB)1"0@2(G^2(GOZ`````!!N`````"Y`````+H`````2(GN
-M2(M\)!CH`````(A$)"^$P`^$;@,``$&_`````$&^`````$B-54A(B50D"$B-
-M36!(B0PD0;@`````1(GQN@$```!(B>Y(BWPD&.@`````#[;`2,'@!$B#P&1(
-M/0`"```/APP#``!,C40D,$2)\;H!````2(GN2(M\)!CH`````$R-9"0P28UT
-M)%Q(B>_H`````#S_#X78`@``2(M\)"#H`````$B)PTB%P`^$[`(``(!%*`'&
-M0%@`28M$)%Q(B0-)C70D5$B)[^@`````//]T&@^VP$AIP,@/``!(BW0D($@#
-MAI`)``!(B4,000^V1"0"B$-900^V1"0#T>B#X`'!X`0/ME-=@^+O"<*(4UU!
-M#[9$)`/!Z`.#X`'!X`6#XM\)PHA374$/MD0D`\'H`H/@`<'@`X/B]PG"B%-=
-M2(EK"$$/MD0D!HB#NP```$F+1"0(2(E#<$$/MD0D!XA#6D$/MT0D!(E#8$$/
-MMT0D4&:)@[@```!!#[9$)%*(@[H```!)BT0D0$B)@Z@```!)BT0D2$B)@[``
-M``!)BT0D$$B)0WA)BT0D&$B)@X````!(C8N(````28U4)"!)BT0D($B)@X@`
-M``!(BT((2(E!"$B+0A!(B4$028M$)#A(B8.@````2(M54$B-0SA(B4502(M,
-M)`A(B4LX2(E30$B)`D&`/"0`#X1J`0``0;T`````2(US2$B)="002(M\)"#H
-M`````$B)P4B%P`^$;P$``(!%#@'&0$H%QH#H`````,9`2P1(QT!X```%`&;'
-M@,@``````$$/M_U(8\=(P>`$28U4!&`/MD($B$%(#[9"!8A!24B):5!(B5E8
-M#[9"!HB!@0````^V0@B#X`^(@>H````/MW%H9H'FW_V)\(/($&:)06@/MD((
-MP.@$/`EU"8GP@\@P9HE!:$ACQTC!X`1!#[9$!&C`Z`0\"G4*9H%):``"9F9F
-MD$ACQTC!X`1)BT0$;$B)@=0```!(B8',````@$-8`4B+16A(B4UH2(L4)$B)
-M$4B)00A(B0A(BU-02(U!$$B)0U!(BW0D$$B)<1!(B5$82(D"#[912$B)T(/@
-M!DB#^`9U)O;"`704#[:1@0```$B)WDB)[^@`````ZPU(B<Y(BWPD(.@`````
-M08/%`4$/M@0D9D0YZ`^'K/[__V9F9I!F9I!!@\<!08/&`40Z?"0O#X6O_/__
-M@'T.`'41QD4)_TB)[DB+?"0@Z`````!(@<0X`@``6UU!7$%=05Y!7\-F9F:0
-M05=!5D%505154TB#[!A)B?Y)B?1!N`````"Y`````+H`````Z`````!!B<6$
-MP'0VO0````"[`````$R-?"07D$R)^8G:3(GF3(GWZ`````"`?"07_@^%K@``
-M`(/%`8/#`40X[77:00^V1"18@^@!08A$)%B$P'1[28LL)$'&1"18`$F+7"1(
-M2(/K.$F-5"1(2(U#.$@YT'1P2(-[$`!U0.L'2(-[$`!U-T'&1"18`4R)YDR)
-M]^@`````#[:+NP```$B+O;@0``!)Q\``````2(G:3(GFZ`````#K+69F9I!(
-MBULX2(/K.$B-0SA(.=!UL>L63(GF3(GWZ`````!,B>9,B??H`````$B#Q!A;
-M74%<05U!7D%?PV9F9I!F9F:0055!5%532(/L"$B)_4F)]$R++[L*````3(GF
-M2(GOZ`````"$P'4/O^@#``#H`````(/K`77B00^V=4-`A/9T(@^V50VY````
-M`/;"`70,ZQ)(B=!(T_BH`74(@\$!0#CQ=>Y)BQ0D28M$)`A(B4((2(D0@&T.
-M`4R)YDR)[^@`````]D4,`G1)2(MU0$B%]G483(GOZ`````!(B<9(A<`/A%(!
-M``!(B45`3(DN2(FNB````,9&1@#&1D<`QD9"`&:#3DX$3(GOZ`````#I)@$`
-M`$B+14!(A<`/A+@```!(C;"0````28M]*.@`````2(MU0$R)[^@`````3(UE
-M8$PY96`/A(8```!,B>?H`````$B)PTB+0$!(A<!T64C'0&``````]D-,!'49
-M3(GOZ`````!(BW-`N@$```!,B>_H`````$B+4T!)B[7X"```OP$```#H````
-M`$B+4T!)B[7X"```OP8```#H`````$C'0T``````@&T.`4B)WDR)[^@`````
-M3#EE8`^%>O___TC'14``````@'T.`'022(U]8.@`````2(G!@&T.`>L+3(GO
-MZ`````!(B<%(A<ET.4B+56A(B4UH2(U%8$B)`4B)40A(B0J`10X!2(EI4,9!
-M2`7&04D`QD%+!L9!2@-(B<Y,B>_H`````$B#Q`A;74%<05W#9F9FD&9F9I!F
-M9F:09F:02(/L*$B)7"0(2(EL)!!,B60D&$R);"0@2(G[2(GU#[=.(&:!^84`
-M#X>5````#[?!#[:T!V@(``!`@/[_#X2`````9H/Y?W<H0`^VUDB+CT`)``!(
-MC0122(T$@DC!X`5(BT0(4`^V0`CK269FD&9FD&:!^8$`=QU`#[;&2(N7D`D`
+M9I!F9I!(@^PH2(E<)!A(B6PD($B)^XG52,=$)!``````@']+`71!2(U4)!!`
+M#[;VN0$```#H`````$B+1"002(7`="2`"(!`A.UT"TB+1"00@$@#(.L)2(M$
+M)!"`8`/?2(G?Z`````!(BUPD&$B+;"0@2(/$*,-F9F:09F9FD&9FD&9FD$B#
+M[#A(B5PD"$B);"003(ED)!A,B6PD($R)="0H3(E\)#!)B?U!B?=(BT=03(LP
+M3(GWZ`````!(B<5(A<`/A*D```!,B??H`````$F)Q$B%P'402(GN3(GWZ```
+M``#IB0```$B-75C&126L00^W13AFB44@3(EU*,>%E`````@```!,B65X28M$
+M)!!(B45(QT4T``@``$F-A>P```!(B450QD4P($C'A:``````````QD4X',9%
+M.0%$B'TZQD4[",9%/`"^`````$B)W^@`````BU4T28MT)!A(B=_H`````$B)
+M[DR)]^@`````2(M<)`A(BVPD$$R+9"083(ML)"!,BW0D*$R+?"0P2(/$.,.0
+M05=!5D%505154TB#[!A(B3PD2(M.2`^V00+!X`@/ME$#C3P0#[?'@\`$#[=6
+M-#G0#X]:`0``3(UI"`^WQTR-=`$$3(EL)`A!O`````#'1"04`````$TY]0^#
+MV0```&:0#[9$)!2(1"0300^V10+!X`A!#[95`T2-/!!!#[?W2(M\)`A(@\<$
+MZ`````")P3S_=5Y!#[?'2(M<)`A(C50#!$B)TTDYU@^&SP```$&)S)`/MD("
+MP>`(#[92`XTL$`^W]4B->P3H`````#S_=0A!@/S_=7GK<4$XQ$0/1^`/M\5(
+MC50#!$B)TTDYUG9@Z\&0B<)$*.(/MM(/MEPD$XG>2(L\).@`````B=I,B>Y(
+MBSPDZ`````!!#[?'2(M4)`A,C6P"!$R);"0(@T0D%`%-.>X/ARG___^^`@``
+M`$B+/"3H`````.M)0;P`````#[94)!-,B>Y(BSPDZ`````!!#[?'2(M<)`A,
+MC6P#!$R);"0(@T0D%`'IY?[__P^V5"033(GN2(L\).@`````ZZEFD$B#Q!A;
+M74%<05U!7D%?PY!!5T%6055!5%532(/L"$F)_DB+3D@/MD$"P>`(#[91`P'0
+M#[?`@\`$#[=6-#G0#X\,`0``2(U1"`^V<0'&1"0#`+D`````#[9"`@!$)`,/
+MMD(#2(U4`@2#P0%`.,YSYX!\)`,`#X2^````2(UJ!$&_`````$&]`````,=$
+M)`0`````#[95_4$!U0^V1?P\`70$/!=U.T2)ZRC303C==G$/MD0D!(/``40/
+MMN!F9I!FD`^V3?P/MO-$B>),B??H`````(/#`40XZW1&Z^1F9F:028M&6("X
+MP0````%T,T2)ZRC303C==BD/MD0D!(/``40/MN`/MDW\#[;S1(GB3(GWZ```
+M``"#PP%$..MUYF9FD$&#QP&#1"0$`4B#Q01$.GPD`P^%6O___TF+1EC&@,$`
+M```!O@<```!,B??H`````$B#Q`A;74%<05U!7D%?PY!(@^PH2(D<)$B);"0(
+M3(ED)!!,B6PD&$R)="0@28G\2(7_#X3$````2(M'4$R+,$R)]^@`````2(G%
+M2(7`#X2I````3(GWZ`````!)B<5(A<!U$$B)[DR)]^@`````Z8D```!(C5U8
+MQD4EK$$/MT0D.&:)12!,B74HQX64````"````$R);7A)BT402(E%2,=%-``(
+M``!)C80D[````$B)15#&13`@2,>%H`````````#&13@<QD4Y`<9%.@+&13L(
+MQD4\`+X`````2(G?Z`````"+531)BW482(G?Z`````!(B>Y,B??H`````$B+
+M'"1(BVPD"$R+9"003(ML)!A,BW0D($B#Q"C#9F9FD&9FD$B#[!A(B1PD2(EL
+M)`A,B60D$$B)\TF)_$B+;F@/MTX@9H'YA0`/AZ4````/M\$/MK0':`@``$"`
+M_O\/A)````!F@_E_=R)`#[;62(N/0`D``$B-!%)(C02"2,'@!4B+1`A0#[9`
+M".M(9H'Y@0!W'4`/ML9(BY>0"0``2&G`R`\``$B+1!`(#[9`".LD0`^VQDB+
+MEV@)``!(C03`2,'@!4B+A!"(````#[9`"&9FD&:0//]T'`^VP$&`O`3N"```
+M_W0.0(#^_W0(#[9#)#P&=3!(@WMX`'0,2(US>$R)Y^@`````2(G>3(GGZ```
+M``#'15#_____2(GO_U5(ZW-F9I"$P'4Y]H.4````"'032(M],(M3-$B+<TCH
+M`````&9FD,=%4`````!(BU4X2(72=`6+12")`DB)[_]52.L3QT50_____TB)
+M[_]52&9FD&9FD$B#>W@`=`Q(C7-X3(GGZ`````!(B=Y,B>?H`````&:02(L<
+M)$B+;"0(3(MD)!!(@\08PV9F9I!F9I!F9I!F9I!(@^PH2(E<)`A(B6PD$$R)
+M9"083(EL)"!(B?-)B?Q$#[9N)`^W1B!F/84`=R-(BX]`"0``#[?`#[:$!V@(
+M``!(C11`2(T4D$B)T$C!X`7K#$B+CT`)``"X8)X!`$B-+`%%A.UU(&;'A<@`
+M`````(![.!QU$8![.@)U"TB)WDB)[^@`````2(-[>`!T#$B-<WA,B>?H````
+M`$B)WDR)Y^@`````08#]!G0]2(V=8`$``$F+?"0H2(G>Z`````#'A6`!``"`
+MA!X`2,>%<`$```````!(B:UX`0``28M\)"A(B=[H`````$B+7"0(2(ML)!!,
+MBV0D&$R+;"0@2(/$*,.005=!5D%505154TB#[`A)B?]!B=9(BT=02(LH0;P`
+M````3(UN#$$/MH0L:`@``#S_=%(/ML!(C11`2(T4D$B)TTC!XP5(B=](`[U`
+M"0``2(''U````+H(````3(GNZ`````"$P'0>2(N%0`D``$2(M`,.`0``2(N%
+M0`D``$R)O`,@`0``28/$`4F!_(````!UE$B#Q`A;74%<05U!7D%?PT%7059!
+M54%455-(@^P82(E\)`A(BTY(#[9!`L'@"`^V40.-/!`/M\>#P`0/MU8T.=`/
+MC^8```!(C5D(#[?'2(U,`01(B4PD$$F)W4@YV0^&N@```$&^`````&9FD&9F
+MD$2)\@^V"X3)#XB%````B<B#X`\\!G5\]D,#P'0&]D,%P'5P]L$0=#F`>P0`
+M9F9FD'1A28UM"$&\`````&9F9I`/ME,#2(GN2(M\)`CH`````$B#Q1Q!@\0!
+M1#AC!'8TZ]^`>P(`="Q)C6T$0;P`````1`^V^D2)^DB)[DB+?"0(Z`````!(
+M@\4<08/$`40X8P)WX@^V0P%)C5P%`DF)W4&#Q@%(.UPD$`^"4O___[X!````
+M2(M\)`CH`````$B#Q!A;74%<05U!7D%?PV9F9I!!5T%6055!5%532(/L*$B)
+M="0(2(E\)!`/MD8DB$0D)P^W3B!F@?F%``^'^`,```^WP0^VM`=H"```N/\`
+M``!`@/[_='IF@_E_=R=`#[;62(M$)!!(BXA`"0``2(T$4DB-!()(P>`%2(M$
+M"%`/MD`(ZTUF@?F!`'<B0`^VQDB+3"002(N1D`D``$AIP,@/``!(BT00"`^V
+M0`CK)$`/ML9(BTPD$$B+D6@)``!(C03`2,'@!4B+A!"(````#[9`"$B82(M4
+M)!!$#[:\`NX(``!+C02_28T$ATB-A,+(`0``2(E$)!A(BXI`"0``0`^VQDB-
+M%$!(C1202(G02,'@!4B-+`&`?"0G``^%LP(``&;'A<@``````$B+3"0(@'DX
+M'`^%FP(```^V03H\`G1:/`)W$3P!#X6'`@``9F9FD&9FD.L>/`=T+SP*#X5R
+M`@``2(MT)`A(B>_H`````.E@`@``2(MT)`A(B>_H`````&9FD.E+`@``2(MT
+M)`A(B>_H`````.DY`@``2(MT)`A(B>_H`````$B-G6`!``!(BT502(L`2(MX
+M*$B)WN@`````QX5@`0``@(0>`$C'A7`!````````2(FM>`$``$B+15!(BP!(
+MBW@H2(G>Z`````#&14K_2XT$OTF-!(=(BU0D$("\PM8!````#X23`0``0;P`
+M````2XT$OTF-!(=(P>`#3(VT`B@"``!(C1P03(VKP`$``$R)]^@`````2(G%
+M2(N#,`(``$B)JS`"``!,B74`2(E%"$B)*(!]2O\/A)8```"`?4D`#X67````
+M2(GN@+WI``````^$5P$```^V54A(B="#X`9(@_@&=2?VP@%T(@^VE8$```!(
+MBW582(GI2(M\)!CH`````.DE`0``9F:09I!(@_@$=1OVP@%F9F:09F:0=`](
+MBWPD$.@`````Z?\```!(@_@&#X7U````]L(!9I`/A>H```!(BWPD$.@`````
+MZ=L```#&A>D`````9F9FD$&#Q`%!#[9%%D0XX`^''____T$XQ`^%A````(3`
+M#X1\````0;P`````2XT$OTF-!(=(P>`#2(M,)!!,C:P!*`(``$B-'`A,C;/`
+M`0``9F:03(GOZ`````!(B<5(BX,P`@``2(FK,`(``$R);0!(B44(2(DH@'U*
+M_W0;#[9%23PB=`0\#74/O@H```!(B>_H`````.L[08/$`44X9A9WL4N-!+])
+MC02'2(M4)!#&A,+1`0``_TB+="082(G7Z`````"`?"0G``^%I````&9F9I!(
+MBTPD"$B#>7@`=!%(B<Y(@\9X2(M\)!#H`````$B+="0(2(M\)!#H`````(!\
+M)"<`=&T/MX7(````@\`!9HF%R````&:#^`IV#F;'A<@``````.G%_?__O@H`
+M``!(B>_H`````.LY2(M$)!!$#[:X[0D``$N-!+])C02'2(M4)!!(C83"R`$`
+M`$B)1"082(N*0`D``+A@G@$`Z9_\__^02(/$*%M=05Q!74%>05_#D$B%_W1+
+M2(7V=$9(A=)T04B%R70\9D&!^(4`=S1!#[?`@+P':`@``/]T)L9"..'&0CD!
+MQD(Z$V9$B4(@2(ER*$B)BJ````"X`0```,-F9F:0N`````##9F9FD&9FD&9F
+MD$"`_@$9P/?0)0``#(!(BU<(B4(,PY"0D)"0D)"0D)"03(M4)"!,BUPD,(GX
+M9H'_(B=W7V:!_R`G#X.4````9H'_0"$/A(D```!F@?]`(6:0=R!F@?\@(71Y
+M9H'_(B%FD'1P9H'_4`=U;V9F9I!F9I#K8&:!_T0A=%EF@?]$(6:0<E9F+1`G
+M9H/X`7=,9F9FD.M`9H'_@B=T.6:!_X(G9I!W$F:!_R0G="EF@?^`)V:0=2;K
+M'F:!_X"19F9FD&9FD'009H'_@)1T"6:!_X!R9I!U!L8&0,8"`L8!!`^V%DB+
+M1"08B!!F0<<"@`!F0<<#``!!Q@$@2(M$)`AFQP```0^V%DB+1"00B!`/M@9F
+M00,"9D$#`TB+5"0H9HD"9D&)`$$/MQ)(BT0D.&:)$$$/MQ*#P@M(BT0D0&:)
+M$,-F9F:055.)\P^W=W!FA?8/A`0!``!,BY>X"0``0;L`````O?____])BP)(
+MA<`/A-0````/MT@@N/\```!!B>AF@?F%``^'C@````^WP40/MHP':`@``$6)
+MR$&`^?]T=6:#^7]W(T$/MM%(BX]`"0``2(T$4DB-!()(P>`%2(M$"%!$#[9`
+M".M,9H'Y@0!W'D$/ML%(BY>0"0``2&G`R`\``$B+1!`(1`^V0`CK)T$/ML%(
+MBY=H"0``2(T$P$C!X`5(BX00B````$0/MD`(9F9FD&9FD$$/ML%(BX]`"0``
+M03C8=2,/M\!(C11`2(T4D$C!X@4/MD0*2*@!=`NH!'0'N`$```#K%T&#PP%)
+M@\((9D$Y\P^%#O___[@`````6UW#9F:02(M'4$R+$$V+FN`0``!%#[=*<+D`
+M````0;@`````ZT,/M_%)BX*X"0``2(L4\$B%TG0MBT(X)?___P`]X0$0`'0>
+M#[='.&8[0B!U%$B)\$C!X`9F1CE$&`AT#F9FD&:0@\$!9D0YR7*W9D0YR703
+M08/``69!@_@?=PBY`````)#KX4$/M\##9F:09F:09F:02(M'4$B%P'0:Q@!P
+M2(M'4$"(<`)(BT=0QD`'`$B+1U"(4`SSPV9F9I!F9F:09F:0\\-F9F:09F9F
+MD&9FD&9FD$&)\4R)RH'B_P$``$B+A[@)``!,BP30387`="L/MK?V````00^V
+M0"6)\=/@#[?X00^WT;C__P``T^`APCG7N`````!,#T7`3(G`PV9FD&:0N```
+M``#&!#@`2(/``4@](`$``'7PQD=$_\9'4/](C4<H2(E'*$B)1S##9F:09F:0
+MN`````#&!#@`2(/``4@]H`$``'7PQH>`````_\9'<O_&AX(````?2(U'($B)
+M1R!(B4<HPV9F9I!F9F:09F9FD$B+!DB+ES@!``!(B8<X`0``2('',`$``$B)
+M.$B)4`A(B0)(QP8`````PV9FD&9FD$B+ER@!``!(B;<H`0``2(V'(`$``$B)
+M!DB)5@A(B3)(@WYP`'0)2(/&<.@`````\\-F9F:09F9FD&9F9I!F9I!(BP9(
+MBY=8`0``2(F'6`$``$B!QU`!``!(B3A(B5`(2(D"2,<&`````,-F9I!F9I!(
+MBP9(BY=(`0``2(F'2`$``$B!QT`!``!(B3A(B5`(2(D"2,<&`````,-F9I!F
+M9I!(BX=X`0``2(FW>`$``$B!QW`!``!(B3Y(B48(2(DPPTB+!DB+EX@!``!(
+MB8>(`0``2(''@`$``$B).$B)4`A(B0)(QP8`````PV9FD&9FD$B+!DB+EV@!
+M``!(B8=H`0``2(''8`$``$B).$B)4`A(B0)(QP8`````PV9FD&9FD$"`_Q=W
+M$4`/ML?_),4`````N#0```##N`0```!F9F:0P[@\````P[@4````9F9FD,.X
+M0````,.X'````&9F9I##N!@```##N"@```!F9F:0P[@@````P[A,````9F9F
+MD,-F9F:09F9FD&9F9I!F9I`/ME9(2(G0@^`&2(/X!G40]L(!#X3;````9F9F
+MD&9FD(!^<O\/A<H```!(BP=$BX@8`0``1(D-`````+D`````N`$```!!B<!!
+MT^!%A<%U,XA.<DB+%T2)P$0)R(F"&`$``$B+!XN`6`$``(D%`````$2)PB'"
+M='A(BP>)D%@!``#K;8/!`8/Y('6U2(L'1(N('`$``$2)#0````"Q`&:0B<JX
+M`0```$&)P$'3X$6%P74VC4(@B$9R2(L71(G`1`G(B8(<`0``2(L'BX!@`0``
+MB04`````1(G"(<)T$TB+!XF08`$``.L(@\$!@_D@=;"`1T0!\\-F9F:09F:0
+M9F:0@'Y0_P^%Q0```$B+!T2+B!@!``!$B0T`````N0````"X`0```$&)P$'3
+MX$6%P74SB$Y02(L71(G`1`G(B8(8`0``2(L'BX!8`0``B04`````1(G"(<)T
+M<TB+!XF06`$``.MH@\$!@_D@=;5(BP=$BX@<`0``1(D-`````+$`9I"X`0``
+M`$&)P$'3X$6%P74SB$Y02(L71(G`1`G(B8(<`0``2(L'BX!@`0``B04`````
+M1(G"(<)T$TB+!XF08`$``.L(@\$!@_D@=;6`1T0!\\-F9F:09F9FD&9F9I!F
+M9I!(BW=`2(7V=#FY`````&:02(M$SEA(A<!T"#B0@0```'0,2(/!`4B#^05T
+M%NOB9H%^0(4`=PQ(A<!F9F:09F:0=06X`````//#9F9FD&9FD$%505154TB)
+M_4F)S<'F"`^VT@'6@'\P``^$U0```$B#?U``#X3*````BX>4````J`E!#Y3`
+MN0````!(Q\<`````08G,#[<4SXGP(=!F.<(/A9`````/M@3-`````#P#=`0\
+M!W4+1#@$S0````!U=I#&120@36/D2,?#`````$(/ME3C!@^V\$B)[^@`````
+M2(M54$(/MD3C!XA"#4V%[70T28M-`$B)RDC!ZB!(BT50B5`#2(M%4(`(@/:%
+ME@````1T$H72=`Y(BT50B4@(2(M%4(`@?TB+55`/MD4P@^@'B$('ZPY(@\$!
+M2(/Y$`^%3O___UM=05Q!7<-F9I!F9I!(@^P(2(V78`$``+@`````2#F78`$`
+M`'002(G7Z`````!(QT`@`````$B#Q`C#9I!(@^P(2(V7@`$``+@`````2#F7
+M@`$``'0(2(G7Z`````!(@\0(PV9F9I!F9I!F9I!(@^P(2(V7<`$``+@`````
+M2#F7<`$``'0H2(G7Z`````!(B<&Z`````&9F9I!F9I#&!`H`2(/"`4B!^J``
+M``!U[TB#Q`C#9F9FD&9FD&9FD$B#[`A(C9=``0``N`````!(.9=``0``=`A(
+MB=?H`````$B#Q`C#9F9FD&9FD&9FD$B#[`A(C9<P`0``N`````!(.9<P`0``
+M=`Q(B=?H`````,9`$`!(@\0(PV9FD&9FD$%7059!54%455-(@^P(28G_08GU
+MQT0D!`````!!O@````!##[:$/N@(```\_P^$'0$```^VT$&-AH````!F/8$`
+M=WT/M\)(:<#(#P``2(G#20.?D`D``(![6`!T4[T`````3(UC2$R)Y^@`````
+M2(U(\$B+4U!(B4-03(EA$$B)41A(B0*+04@E`/__`#T``/\`=1/V04L$=`U(
+MBT%`2(7`=`1$B&@!@\4!0#AK6'>V1(BKP@```$&#Q0'ID`````^WPDB-!,!(
+MP>`%2(G&20.W:`D``(!^.P!T/;D`````#[;!2(M4QEA(A=)T(XM"2"4`__\`
+M/0``_P!U%/9"2P1T#DB+0D!(A<!T!42(:`&0@\$!.$X[=\A$B*X4`0``@+X5
+M`0```W4?@T0D!`&+1"0$@\`#@_@&=A=!@\4!QT0D!`````#K"4&#Q0%F9I!F
+MD$F#Q@%)@_X&#X7$_O__28N'^`@``$PY^'4/2(VXD!0``$2)[NB'_O__2(/$
+M"%M=05Q!74%>05_#9F9FD&9F9I!(@^P(#[9&"`^VM`?N"```QH0'[@@``/\/
+MM_9(@<>($```Z`````!(@\0(PV9F9I!(BU9P2(72=!A(BT(82(E&.$B+0B!(
+MB49`2(M"*$B)1DCSPV9F9I!F9I!F9I!F9I!(BU9P2(72=!Q(BT8X2(E"&$B+
+M1D!(B4(@2(M&2$B)0BC&0A`!\\-F9I!F9I!F9I!!5%5328G\2(L?9H-[<``/
+MA,P```"]`````&9FD&9FD`^WU4B+@[@)``!(BSS02(7_#X2=````#[=/(&:!
+M^84`=WX/M\$/MH0#:`@``#S_=&]F@_E_=R$/MM!(BXM`"0``2(T$4DB-!()(
+MP>`%2(M$"%`/ME`(ZTUF@?F!`'<<#[;`2(N3D`D``$AIP,@/``!(BT00"`^V
+M4`CK*@^VP$B+DV@)``!(C03`2,'@!4B+A!"(````#[90".L*9F:09I"Z_P``
+M`$$/MD0D"#G"=07H`````(/%`68Y:W`/AS____];74%<PV9F9I!F9I!F9I!(
+M@^P82(E<)`A(B6PD$$B)^TB)]0^V1E`\_W03#[;P2(L_Z`````#&15#_@&M$
+M`4B+7"0(2(ML)!!(@\08PV:02(/L&$B)7"0(2(EL)!!(B?M(B?4/MD9R//]T
+M$P^V\$B+/^@`````QD5R_X!K1`%(BUPD"$B+;"002(/$&,-FD%532(/L"$B)
+M_4B)\T@Y?B@/A-L```"`?B0`#X6G````#[9&.#P5=`@\50^%EP```$B+0W!(
+MA<`/A(H```!(B<&`>!`!#X5]````9H%X&.$!=75(B[5`"0``#[=#(+I@G@$`
+M9CV%`'<7#[?`#[:$!6@(``!(C11`2(T4D$C!X@5(C006#[9)&H#Y!W0=@/D'
+M=P>`^09U,>L:@/D,9F:09I!T((#Y#74@ZQ!F@V!J_6:0ZQ5F@TAJ`NL.9H-@
+M:O=FD.L%9H-(:@A(@WMX`'0C@7LT``@``'<.2(US>$B)[^@`````ZPQ(C7-X
+M2(GOZ`````!F@7LXX0$/A2<!```/MT,@9CV%``^'BP````^WP`^VA`5H"```
+M//\/A'@```!(BXU`"0``@'LD`'5K#[;`2(T40$B-%)!(P>(%2(T$$0^V4SJ`
+M^@=T'8#Z!W<'@/H&=3;K'X#Z#'0J@/H-9F:09I!U)>L59H-@:OUF9F:09F:0
+MZQ5F@TAJ`NL.9H-@:O=FD.L%9H-(:@AF@7LXX0%F9I`/A8X```"`>SH+#X6$
+M````#[=S(`^V14:->/^)\NL;D(/"`6:!^H4`=Q`/M\I(8\&`O`5H"```_W4)
+M#[?".?A\W^M-9H'Y_P!U(F9FD&9FD.L^@\8!9H'^A0!W$`^WUDACPH"\!6@(
+M``#_=0P/M\8YQW_?NO\```!FB5,@QD,D@$B)WDB)[^@`````Z2(!``#&0R0`
+M2#EK*'0F2(M#<$B%P'0=@'@0`74+2(G>2(GOZ`````!(C7-P2(GOZ`````!(
+M@[N``````'0/2(VS@````$B)[^@`````2(M[*$B)WO^3H`````^W4SAF@?KA
+M`757#[9#.H/H$3P!=TP/MT,@9CV%``^'J`````^WP`^VA`5H"```//\/A)4`
+M```/ML!(C03`2,'@!4B)QD@#M6@)``"`?D4`=7J`?E#_='1(B>_H`````.MJ
+M#[=#(&8]A0!W8`^WP`^VC`5H"```2(NU0`D``(M#."7___\`/>$!$`!T/X'Y
+M_P```'0W9H'ZX0%U#@^V0SJ#Z!$\`78E9F:0B<A(C11`2(T4D$C!X@5(`=:`
+MOH,`````=0A(B>_H`````$B#Q`A;7<-F9F:09F:055-(@^P(2(G]2(GS#[=.
+M(&:!^84`#X>F````#[?!#[:T!V@(``!`@/[_#X21````9H/Y?W<B0`^VUDB+
+MCT`)``!(C0122(T$@DC!X`5(BT0(4`^V0`CK2&:!^8$`=QU`#[;&2(N7D`D`
+M`$AIP,@/``!(BT00"`^V0`CK)$`/ML9(BY=H"0``2(T$P$C!X`5(BX00B```
+M``^V0`AF9I!FD&8]_P!T&P^WP`^VO`7N"```0(#__W0*0`^VQF8]_P!U$$B)
+MWDB)[^@`````Z8$````/ME,[#[9#/`^V2SV`^0%T!8#Y"'5@2(M+:,'@"`^V
+MT@'0)?\!``!(BY6X"0``2#D,PG5"#[=),HG*9L'J!8'B_P<``(/A'[@!````
+M2-/@]]`A1)5T2(M#:`^W<#)`#[;'2(T\@$B-/+A(C;S]R`$``.@`````2(G>
+M2(GOZ`````!(@\0(6UW#9F9FD&9FD$B#[!A(B5PD"$B);"002(G[2(V_(`$`
+M`+T`````2#F[(`$``'0<Z`````!(B<5(B<?H`````$B)W^@`````2(E%<$B)
+MZ$B+7"0(2(ML)!!(@\08PV9F9I!F9F:09F9FD$B#[!A(B1PD2(EL)`A,B60D
+M$$B)_4B+1U!,BR!,B>?H`````$B)PTB%P'1P3(GGZ`````!(B<)(A<!U%,:%
+MZ0````%(B=Y,B>?H`````.M,QD,X``^W13AFB4,@QH.8````#TR)8RC'0S0`
+M````2,=#2`````!(BT(02(E#4,9#,"1(B5-X2,>#H`````````!(B=Y,B>?H
+M`````$B+'"1(BVPD"$R+9"002(/$&,.02(/L&$B)'"1(B6PD"$R)9"002(G]
+M08GT2(M'4$B+&$B)W^@`````2(G"2(7`=$3&0#@;QD`Y`42(8#P/MT4X9HE"
+M(,:"F`````](B5HHQT(T`````$C'0D@`````2,>"H`````````!(B=9(B=_H
+M`````$B+'"1(BVPD"$R+9"002(/$&,-F9F:09F:09F:02(/L.$B)7"0(2(EL
+M)!!,B60D&$R);"0@3(ET)"A,B7PD,$F)_TF)]4R+-TR)]^@`````2(G%2(7`
+M#X2.````3(GWZ`````!)B<1(A<!U$4B)[DR)]^@`````ZW%F9F:02(U=6,9%
+M..'&13D!QD4Z#D$/MT4X9HE%(&9!@V5H]TF+!TB)12C'130`"```28M$)!!(
+MB45(3(EE>$C'A:``````````O@````!(B=_H`````(M5-$F+="082(G?Z```
+M``!(B>Y,B??H`````$B+7"0(2(ML)!!,BV0D&$R+;"0@3(MT)"A,BWPD,$B#
+MQ#C#2(/L*$B)7"0(2(EL)!!,B60D&$R);"0@28GTB=5(BQ](B=_H`````$B)
+MPDB%P'1?QD`XX<9`.0%`B&@ZQD`[#T$/MT0D.&:)0B!(B5HHQT(T`````$C'
+M0D@`````2,>"H`````````!(B=9(B=_H`````$"`_0%U#+\%````Z`````#K
+M"K]0PP``Z`````!(BUPD"$B+;"003(MD)!A,BVPD($B#Q"C#9F9FD&9F9I!5
+M4TB#[`A(B?U(B?,/MTX@9H'YA0`/AZ<````/M\$/MK0':`@``$"`_O\/A)(`
+M``!F@_E_=R)`#[;62(N/0`D``$B-!%)(C02"2,'@!4B+1`A0#[9`".M(9H'Y
+M@0!W'4`/ML9(BY>0"0``2&G`R`\``$B+1!`(#[9`".LD0`^VQDB+EV@)``!(
+MC03`2,'@!4B+A!"(````#[9`"&9FD&:0//]T'@^VP`^VC`7N"```@/G_=`Y`
+M@/[_=`@/MD,D/`9U/DB#>W@`="6!>S0`"```=Q!(C7-X2(GOZ`````!FD.L,
+M2(US>$B)[^@`````2(G>2(GOZ`````#K?&9FD&:02(N50`D``(3`=#5`#[;&
+M2(TT0$B--+!(P>8%2(TT,@^VP4B-/(!(C3RX2(V\_<@!``"Z`0```.@`````
+M9F9FD$B#>W@`="6!>S0`"```=Q!(C7-X2(GOZ`````#K#F:02(US>$B)[^@`
+M````2(G>2(GOZ`````!(@\0(6UW#9I!(@^PH2(D<)$B);"0(3(ED)!!,B6PD
+M&$R)="0@2(G[2(GU#[=.(&:!^84`#X<?`0``#[?!#[:T!V@(``!`@/[_#X0*
+M`0``9H/Y?W<D0`^VUDB+CT`)``!(C0122(T$@DC!X`5(BT0(4`^V0`CK16:0
+M9H'Y@0!W'4`/ML9(BY>0"0``2&G`R`\``$B+1!`(#[9`".L?0`^VQDB+EV@)
+M``!(C03`2,'@!4B+A!"(````#[9`"#S_#X25````1`^VY@^VP$0/MJP#[@@`
+M`$&`_?]T?V9!@?S_`'1W@'TD!G1Q3(NS0`D``(!].@%U2;\*````Z`````!(
+MB>Y(B=_H`````$$/M\1(C31`2(TTL$C!Y@5)C30V00^VQ4B-/(!(C3RX2(V\
+M^\@!``"Z`@```.@`````ZQN_]`$``.@`````2(GN2(G?Z`````!F9I!F9I!(
+MBQPD2(ML)`A,BV0D$$R+;"083(MT)"!(@\0HPV9FD$B#[!A(B1PD2(EL)`A,
+MB60D$$F)_$B+1U!(BRA(B>_H`````$B)PTB%P'4+0<:$).D````!ZU_&0#@5
+MQD`EJT$/MT0D.&:)0R!(B6LH0;@!````N0$```!(B=I,B>9(B>_H`````(3`
+M=19(B=Y(B>_H`````$'&A"3I`````>L62,>#H`````````!(B=Y(B>_H````
+M`$B+'"1(BVPD"$R+9"002(/$&,-F9F:09F:02(/L*$B)7"0(2(EL)!!,B60D
+M&$R);"0@2(G[2(M'4$R+*$R)[^@`````2(G%2(7`=0[&@^D````!Z;8```!F
+MD$R)[^@`````28G$2(7`=1?&@^D````!2(GN3(GOZ`````#IC0```,9%.!K&
+M13D(QD4Z",9%.P#&13S_QD4]`,9%):L/MT,X9HE%($R);2C'133_````QX64
+M````"````$F+1"002(E%2$@%_P```$B)15#&13`D3(EE>$C'A:``````````
+M2(U=6+X`````2(G?Z`````!)BW0D&+K_````2(G?Z`````!(B>Y,B>_H````
+M`$B+7"0(2(ML)!!,BV0D&$R+;"0@2(/$*,-F9I!(@^PX2(E<)`A(B6PD$$R)
+M9"083(EL)"!,B70D*$R)?"0P28G\08GV2(M'4$R+*$R)[^@`````2(G#2(7`
+M=1%!QH0DZ0````'IN@```&9FD$R)[^@`````2(G%2(7`=2!!QH0DZ0````%(
+MB=Y,B>_H`````.F.````9F9FD&9FD$R->UC&0S@2183V=!/&0SD!QD,Z@,9#
+M/$#K"69FD&:0QD,\),9#):M!#[=$)#AFB4,@3(EK*,=#-&````#'@Y0````(
+M````2(M%$$B)0TA(B6MX2,>#H`````````"^`````$R)_^@`````2(MU&+I@
+M````3(G_Z`````!(B=Y,B>_H`````$B+7"0(2(ML)!!,BV0D&$R+;"0@3(MT
+M)"A,BWPD,$B#Q#C#9F:09F:02(/L*$B)'"1(B6PD"$R)9"003(EL)!A,B70D
+M($F)_$B+1U!,BS!,B??H`````$B)Q4B%P'4.0<:$).D````!Z;(```!,B??H
+M`````$F)Q4B%P'4<0<:$).D````!2(GN3(GWZ`````#IB0```&9FD$B-75C&
+M13B>QD4Y$,9%12#&126K00^W1"0X9HE%($R)=2C'130@````QX64````"```
+M`$F+11!(B45(3(EM>$B#P"!(B450QD4P)$C'A:``````````QH68````#[X`
+M````2(G?Z`````!)BW48NB````!(B=_H`````$B)[DR)]^@`````2(L<)$B+
+M;"0(3(MD)!!,BVPD&$R+="0@2(/$*,-F9F:09F:09F:09F:02(/L*$B)'"1(
+MB6PD"$R)9"003(EL)!A,B70D($F)_$B+1U!,BS!,B??H`````$B)Q4B%P'4.
+M0<:$).D````!Z:,```!,B??H`````$F)Q4B%P'4<0<:$).D````!2(GN3(GW
+MZ`````#K?69FD&9FD$B-75C&13@EQD4EJT$/MT0D.&:)12!,B74HQT4T"```
+M`,>%E`````@```!)BT402(E%2$B#P`A(B450QD4P)$R);7A(QX6@````````
+M`+X`````2(G?Z`````!)BW48N@@```!(B=_H`````$B)[DR)]^@`````2(L<
+M)$B+;"0(3(MD)!!,BVPD&$R+="0@2(/$*,-F9F:09F9FD&9F9I!(@^PX2(E<
+M)`A(B6PD$$R)9"083(EL)"!,B70D*$R)?"0P28G_28GTB50D!$B++TR+M4`)
+M```/MT8@1`^VK`5H"```2(GOZ`````!(B<-!#[=T)#*)\&;!Z`4/M\"+1(5T
+MB?&#X1](T_BH`0^%P@```$B%VP^$N0```$$/ML5(C11`2(T4D$C!X@5)C106
+M00^V1"0E#[:-]@```-/@"?#&0SCAQD,Y`<9#.@^(0SMFP>@(B$,\#[9$)`2(
+M0SU(BX+<````2(E#/DR)8VC&0R6J#[=".&:)0R!)BP=(B4,HQT,T`````$C'
+M0T@`````2,>#H`````````!(C7M8O@````#H`````$B)WDB)[^@`````00^W
+M3"0RB<IFP>H%@>+_!P``@^$?N`$```!(T^`)1)5T2(M<)`A(BVPD$$R+9"08
+M3(ML)"!,BW0D*$R+?"0P2(/$.,-F9F:09F:09F:005=!5D%505154TB#[`A)
+MB?Y)B=5!B?=(BQ]F@WMP``^$#@(``+T`````0;S_____#[?52(N#N`D``$B+
+M--!(A?8/A-\!``!$BT8X08'@____`$&!^.$!$``/A:$```!-A>T/A;X!```/
+MMTX@9H'YA0!W>0^WP0^VA`-H"```//]T:F:#^7]W(0^VT$B+BT`)``!(C012
+M2(T$@DC!X`5(BT0(4`^V2`CK1F:!^8$`=QP/ML!(BY.0"0``2&G`R`\``$B+
+M1!`(#[9(".LC#[;`2(N3:`D``$B-!,!(P>`%2(N$$(@````/MD@(ZP-$B>&Z
+M`````.F_````9F9FD&9FD`^W3B!F@?F%``^'H0````^WP0^VO`-H"```0(#_
+M_P^$C````&:#^7]W(D`/MM=(BXM`"0``2(T$4DB-!()(P>`%2(M$"%`/MD@(
+MZT1F@?F!`'<=0`^VQTB+DY`)``!(:<#(#P``2(M$$`@/MD@(ZR!`#[;'2(N3
+M:`D``$B-!,!(P>`%2(N$$(@````/MD@(D$`/ML=(C11`2(T4D$C!X@5(`Y-`
+M"0``ZP]F9F:09F:01(GAN@````!!.$X(=6A-A>UT"T$/MT4X9CM&('5808#_
+M!G1#08'XX0$0`'0Z#[9*2$B)R(/@!DB#^`9U*O;!`74E@+KH`````'4<08'X
+MX0$/`'0B1(A^)+H!````3(GWZ`````#K#T2(?B0/M_5,B??H`````(/%`68Y
+M:W`/A_W]__]!@/^!#X17`0``2(N#``$``$B-JP`!``!(.<4/A$`!``"Z````
+M`&9F9I!F9I"#P@%(BP!(.<5U]6:%T@^$(`$``$2-8O](B>_H`````$B)QDV%
+M[70H00^W13AF.T8@=!U(BX,(`0``2(FS"`$``$B)+DB)1@A(B3#IR`````^W
+M3B!F@?F%`'=Y#[?!#[:$`V@(```\_W1J9H/Y?W<A#[;02(N+0`D``$B-!%)(
+MC02"2,'@!4B+1`A0#[9`".M(9H'Y@0!W'`^VP$B+DY`)``!(:<#(#P``2(M$
+M$`@/MD`(ZR4/ML!(BY-H"0``2(T$P$C!X`5(BX00B`````^V0`CK!;C_____
+M03I&"'4ABT8X)?___P`]X0$/`'021(A^)$B)W^@`````ZQQF9F:02(N#"`$`
+M`$B)LP@!``!(B2Y(B48(2(DP08U$)/]F187D=!%(.ZL``0``=`A!B<3IY/[_
+M_TB#Q`A;74%<05U!7D%?PV9F9I!F9I!F9I!F9I!(@^PX2(E<)`A(B6PD$$R)
+M9"083(EL)"!,B70D*$R)?"0P28G\28GV28G-08G72(LO2(GOZ`````!(B<-(
+MA<!U#T'&A>D````!Z8L```!FD$B)[^@`````2(G"2(7`=15(B=Y(B>_H````
+M`$'&A>D````!ZV3&0SCAQD,Y`<9#.A!$B'LE00^V1EMFB4,@28L$)$B)0RC'
+M0S20````2(U"$$B)0TA(B5-XQD`!$L9"$$!$B'@)2,>#H`````````!(C7M8
+MO@````#H`````$B)WDB)[^@`````2(M<)`A(BVPD$$R+9"083(ML)"!,BW0D
+M*$R+?"0P2(/$.,-F9F:02(/L.$B)7"0(2(EL)!!,B60D&$R);"0@3(ET)"A,
+MB7PD,$F)_$F)]4&)UD&)STB++TB)[^@`````2(G#2(7`#X2"````2(GOZ```
+M``!(B<)(A<!T<L9#..'&0SD!QD,Z$$2(<R5!#[9%6V:)0R!)BP0D2(E#*,=#
+M-)````!(C4(02(E#2$B)4WC&0`&1QD(00$2(<`E$B'@*2,>#H`````````!(
+MC7M8O@````#H`````$B)WDB)[^@`````OZ"&`0#H`````$B+7"0(2(ML)!!,
+MBV0D&$R+;"0@3(MT)"A,BWPD,$B#Q#C#9F:09F:02(/L*$B)'"1(B6PD"$R)
+M9"003(EL)!A,B70D($F)_$F)]4&)UDB++TB)[^@`````2(G#2(7`='1(B>_H
+M`````$B)PDB%P'1DQD,XX<9#.0'&0SH0QD,ENT$/MD5;9HE#($F+!"1(B4,H
+MQT,TD````$B-0A!(B4-(2(E3>,9``1#&0A!`1(AP"4C'@Z``````````2(U[
+M6+X`````Z`````!(B=Y(B>_H`````$B+'"1(BVPD"$R+9"003(ML)!A,BW0D
+M($B#Q"C#9F9FD&9FD$B#["A(B5PD"$B);"003(ED)!A,B6PD($F)_$F)]4B+
+M+TB)[^@`````2(G#2(7`='!(B>_H`````$B)PDB%P'1@QD,XX<9#.0'&0SH0
+MQD,ENT$/MD5;9HE#($F+!"1(B4,HQT,TD````$B-0A!(B4-(2(E3>,9``0#&
+M0A!`2,>#H`````````!(C7M8O@````#H`````$B)WDB)[^@`````2(M<)`A(
+MBVPD$$R+9"083(ML)"!(@\0HPV9FD&9FD%532(/L"$B)_4B-GX@0``!(B=_H
+M`````(3`#X7@````2(G?Z`````")P;@`````B<:`O"CN"```_W4*.$5(<Q*(
+M14CK#8/&`4B#P`%(@_@$==U`@/X$#X2D````0`^VQHB,!>X(```/M_E(C02_
+M2(T$ATB-E,7(`0``N`````"0Q@00`$B#P`%(/:@```!U\`^WP4B-%(!(C120
+M2,'B`TB-C!7X`0``2(T$*DB)B/@!``!(B8@``@``2(V,%1`"``!(B8@0`@``
+M2(F(&`(``$B-E!4H`@``2(F0*`(``$B)D#`"``!`B+#0`0``2(T$OTB-!(=(
+MC83%R`$``.L'9I"X`````$B#Q`A;7<-F9F:02(/L&$B)'"1(B6PD"$R)9"00
+M2(G]2(V?X`\``$B)W^@`````A,`/A3D!``!(B=_H`````(G"N`````!F9I!F
+MD(G#@+PH:`@``/]U%0^VP&8YA?0```!S&&:)A?0```#K#X/#`4B#P`%(/8``
+M``!UT(#[@`^$[`````^VPXB4!6@(```/M\)(C11`2(T4D$F)U$G!Y`5,B>=(
+M`[U`"0``Z`````!(BY5`"0``#[;#9D&)1!0X2(N%0`D``$'&1`1*`$B+A4`)
+M``!!QD0$;?](BX5`"0``0<9$!&S_2(N%0`D``$'&1`1N_TB+A4`)``!!QD0$
+M</](BX5`"0``0<9$!&__2(N%0`D``$'&1`1Q_TB+A4`)``!!QH0$Z@````!(
+MBX5`"0``0<:$!`\!``#_2(GOZ`````!(BY5`"0``28F$%"@!``"`?4T!=0U(
+MBX5`"0``08!,!$P!3(G@2`.%0`D``.L%N`````!(BQPD2(ML)`A,BV0D$$B#
+MQ!C#9F:04TB)^^A'X?__2(N[^`@``.@`````6\-F9I!F9I!F9I!(@^P82(D<
+M)$B);"0(3(ED)!!(B?U(C9\8$```2(G?Z`````"$P`^%Y@```$B)W^@`````
+MB<)(B>B[@O___V:0@+CJ"```_W47.)WX````<R&(G?@```#K&69F9I!F9I"#
+MPP%(@\`!@/N&#X2B````Z\Z`^X8/A)<````/ML.(E`5H"```#[?"2(T$P$F)
+MQ$G!Y`5,B>=(`[UH"0``Z`````!(BY5H"0``#[;#9D&)1!1`@'U-`74/2(N%
+M:`D``&9!QT0$3/__2(N%:`D``$'&1`1"`$B+A6@)``!F0<=$!$X``$B+A6@)
+M``!F0<>$!``!``#__TB+O?@(``"^`````.@`````3(G@2`.%:`D``.L%N```
+M``!(BQPD2(ML)`A,BV0D$$B#Q!C#9F:09F:055-(@^P(2(G]#[=&0`^VG`=H
+M"```QH0':`@``/\/M_-(C;\8$```Z``````/M]M(C1S;2,'C!4B)WD@#M6@)
+M``"`?E#_=`A(B>_H`````$B+O?@(``"^`````.@`````2(/$"%M=PV9FD&9F
+MD&9FD%-(B?L/MD9;#[:T!V@(``#&A`=H"```_P^W]DB-OU`0``#H`````$B+
+MN_@(``"^`````.@`````6\-F9I!F9I!32(GS@'Y$_W042(VVD````$B+?RCH
+M`````,9#1/];PU-(B?.`OH````#_=!=(C;8P`0``2(M_*.@`````QH.`````
+M_UO#9F9FD&9FD&9FD$B#["A(B5PD"$B);"003(ED)!A,B6PD($B)^TF)]`^W
+M1CA$#[:L!V@(``!!#[?%2(T40$B-%)!(B=5(P>4%2(GN2`.W0`D``$B!QB@!
+M``#H`````$$/MU0D.$B+A--H!```2(7`=!E(@[B``````'4/2,>$TV@$````
+M````9F:000^W1"0XQH0#:`@``/]!#[?U2(V[X`\``.@`````2(GN2`.S0`D`
+M`(!^<O]T"$B)W^@`````3(GF2(G?Z`````!(BX-`"0``QD0%2@!(BX-`"0``
+MQD0%2P%(BUPD"$B+;"003(MD)!A,BVPD($B#Q"C#9F9FD&9F9I!F9I!F9I!(
+M@^PH2(E<)`A(B6PD$$R)9"083(EL)"!)B?U(B?-F@7XXX0$/A<X````/MD8Z
+M@^@1/`$/A[\````/MT8@9CV%``^'B@$```^WP`^VA`=H"```2(N7:`D``#S_
+M#X1P`0``#[;`2(T$P$C!X`5(C2P"@&U%`4R-92A,B>?H`````$B)PD@YV'5*
+M2(GN3(GOZ`````!,.V4H#X0T`0``QX60`````!)Z`$C'A:``````````2(FM
+MJ````$B-M9````!)BWTHZ`````#&140`Z?\```!(BT4H2(E0"$B)`DR)8@A(
+MB54H2(L32(M#"$B)0@A(B1#IV0````^W0R!F/84`#X?+````#[?`00^VE`5H
+M"```28N-0`D``(M#."7___\`/>$!$``/A*4```"!^O\````/A)D```")T$B-
+M%$!(C1202,'B!4B-+!&`K8,````!3(UE($R)Y^@`````2(G"2#G8=4M(B>Y,
+MB>_H`````$P[92!T6\>%,`$````2>@!(QX5``0```````$B)K4@!``!(C;4P
+M`0``28M]*.@`````QH6``````.LF9F:09I!(BT4@2(E0"$B)`DR)8@A(B54@
+M2(L32(M#"$B)0@A(B1!(BUPD"$B+;"003(MD)!A,BVPD($B#Q"C#9F:09F:0
+M55-(@^P(2(G[2(GU#[=^,HGZ9L'J!0^W]XGQ@^$?N`$```!(T^")P??1@>+_
+M!P``(4R3=&:!__\/=$0/M\=(P>`#2`.#N`D``$B#.`!T,$C'```````AC)/`
+M"0``2(V[J`\``.@`````2(GN2(G?Z`````!(B>Y(B=_H`````$B#Q`A;7<-F
+M9F:09F:09F:055-(@^P(2(GU9H%^..$!#X6L````#[9&.H/H$3P!#X>=````
+M#[=&(+K_````9CV%`'<+#[?`#[:4!V@(``")T$B-!,!(P>`%2(G#2`.?:`D`
+M`(![1/]U20^VE9@```"-!!*$TKH(````#T3"#[;`:<!`0@\`B8.0````2,>#
+MH`````````!(B9NH````2(VSD````$B+?RCH`````,9#1`!(BU,P2(EK,$B-
+M0RA(B44`2(E5"$B)*H!#10'IO0````^W12"Z_P```&8]A0!W"P^WP`^VE`=H
+M"```2(N/0`D``(M%."7___\`/>$!$``/A(D```")T$B-%$!(C1202,'B!4B-
+M'!&`NX````#_=5`/MI68````C002A-*Z"`````]$P@^VP&G`0$(/`(F#,`$`
+M`$C'@T`!````````2(F;2`$``$B-LS`!``!(BW\HZ`````#&@X``````9F9F
+MD$B+4RA(B6LH2(U#($B)10!(B54(2(DJ@(.#`````4B#Q`A;7<-F9F:09F9F
+MD&9FD$%7059!54%455-(@^PH28G^2(ET)`@/MTX@9H'YA0`/AP4#```/M\$/
+MMK0':`@``(GP0(#^_W1K9H/Y?W<B0`^VUDB+CT`)``!(C0122(T$@DC!X`5(
+MBT0(4`^V0`CK0V:!^8$`=QU`#[;&2(N7D`D``$AIP,@/``!(BT00"`^V0`CK
+M'T`/ML9(BY=H"0``2(T$P$C!X`5(BX00B`````^V0`@/ML!%#[:$!NX(``!+
+MC02`28T$@$F-A,;(`0``2(E$)!!)BY:0"0``0`^VQDAIP,@/``!,C3P"2(M$
+M)`A(BU!(#[9"`3P2="D\D0^%$@(``$N-!(!)C02`N0````!!@+S&U@$````/
+MA,H!``#I6P$``$N-!(!)C02`28T$QDB+B,@!``!(B4PD(`^V2@F(3"0>#[92
+M&HA4)!^[`````("XU@$```!T<$&\`````$N-!(!)C02`2,'@`TV-K`8H`@``
+M2HTL,$R-M<`!``"03(GOZ`````!(B<-(BX4P`@``2(F=,`(``$R)*TB)0PA(
+MB1A,.7M8=1</MH.!````2(M4)`@Z0B5T$&9FD&9FD$&#Q`%%.&86=[9(BTPD
+M"$B+<7A(A?9T"DB+?"0@Z`````!(BW0D"$B+?"0@Z``````/MH/*````C5`!
+MB)/*````/`-W*X!\)!\`=21(BT0D"`^V4"5(BW-80;@`````N0(```!(BWPD
+M$.@`````ZS.-0@&(@\H```"`^@)V)8!\)!\`=1[&0TL"QD-*_X!C3/Y(B=Y(
+MBWPD(.@`````Z04!```/MDPD'P^V5"0>3(G^2(M\)!#H`````.GI````O0``
+M``!+C02`28T$@$C!X`--C:0&*`(``$J-'#!,C:O``0``3(GGZ`````!(B<%(
+MBX,P`@``2(F+,`(``$R)(4B)00A(B0A,.7E8=10/MH&!````2(M4)`@Z0B5T
+M#&9FD(/%`4$X;19WN@^V44A(B="#X`9(@_@&=1SVP@%T%TB+1"0(#[90)4B+
+M<5A(BWPD$.@`````2(M4)`A(BW)X2(7V=`A,B??H`````$B+="0(3(GWZ```
+M``#K+D0/MH?M"0``2XT$@$F-!(!(C83'R`$``$B)1"002(N7D`D``+@XN`\`
+MZ7[]__](@\0H6UU!7$%=05Y!7\-F9I!F9I!F9I!!54%455-(@^P(28G]28GT
+M2(G3QD)+`<9"2@"^!@```$R)Y^@`````2(-[6`!T%TB+4Q!(BT,82(E""$B)
+M$$B+0UB`:%@!@+N#`````'0<D$R)[^@`````OP$```#H`````("[@P````!U
+MY4B+NR`!``!(A?]T$0^VLPT!``"Z`0```.@`````2(M[6$B%_W01#[:S@0``
+M`+H!````Z`````!(BVM`2(7M#X2*````2(.]@`````!U<$B#O8@`````=6;V
+M0TP$=1E,B>_H`````$B+<T"Z`0```$R)[^@`````2(M#0`^V4`(/MG`!2,?'
+M`````+@`````Z`````!(BU-`28NU^`@``+\!````Z`````!(BU-`28NU^`@`
+M`+\&````Z`````!(QT-``````$C'16``````2(M38$B%TG00#[:#@0```$C'
+M1,)8`````$B+$TB+0PA(B4((2(D008!L)`X!2(G>3(GOZ`````!!@'PD"?]T
+M74&`?"0.`'1$NP````!)C6PD8&9FD&:02(GOZ`````!)BU0D:$F)1"1H2(DH
+M2(E0"$B)`H!X2O]U#(/#`4$X7"0.=@GKTD$X7"0.=Q%!QD0D"?],B>9,B>_H
+M`````$B#Q`A;74%<05W#9F9FD&9F9I!F9F:09F:005=!5D%505154TB#[`A)
+MB?])B?9(B=7&0DL!QD)*`+X&````3(GWZ`````!(@WU8`'072(M5$$B+11A(
+MB4((2(D02(M%6(!H6`&`O8,`````=!M,B?_H`````+\!````Z`````"`O8,`
+M````=>5(B[T@`0``2(7_=!$/MK4-`0``N@$```#H`````$B+?5A(A?]T$0^V
+MM8$```"Z`0```.@`````2(M=0$B%VP^$$0$``/9%3`1U34R)_^@`````2(MU
+M0+H!````3(G_Z`````!(BT5`#[90`@^V<`%(Q\<`````N`````#H`````$B+
+M54!)B[?X"```OP$```#H`````.LN#[93`@^V<P%(Q\<`````N`````#H````
+M`$B+54!)B[?X"```OP$```#H`````$B+BX````!(A<D/A#<!```/MT4X2<>$
+MQV@$````````2,>#@`````````!(B[N0````NO____](B=[_T>D&`0``#[=%
+M.$G'A,=H!````````$C'@X@`````````2(N[D````/_2]D5,`G052(M50$F+
+MM_@(``"_!@```.@`````2,=%0`````!(QT-@`````$B+56!(A=)T$`^VA8$`
+M``!(QT3"6`````!(BU4`2(M%"$B)0@A(B1!!#[96#H/J`4&(5@Y(BT5@2(7`
+M=`=F@WA.`G59A-)T54&\`````$V-;F!,B>_H`````$B)PTF+1FA)B5YH3(DK
+M2(E#"$B)&$B%VW0?]D-,`G092(M30$F+M_@(``"_!@```.@`````@&-,_4&#
+MQ`%%.&8.=[5(B>Y,B?_H`````$B#Q`A;74%<05U!7D%?PTB+DX@```!(A=(/
+MA>K^___I"?___Y!(@^PH2(E<)`A(B6PD$$R)9"083(EL)"!(B?M(BT=03(LH
+M3(GOZ`````!(B<5(A<`/A-4```!,B>_H`````$F)Q$B%P'4:QH/I`````4B)
+M[DR)[^@`````Z:X```!F9I#&13B@2(U5.;@`````9F:0Q@00`$B#P`%(@_@%
+M=?+&13X`QD4_`,9%0`#&14&(QD5"`,9%0P#&126K#[=#.&:)12!,B6THQX64
+M````"````,=%-(@```!)BT0D$$B)14A(!8@```!(B450QD4P)$R)97A(QX6@
+M`````````$B-75B^`````$B)W^@`````28MT)!BZB````$B)W^@`````2(GN
+M3(GOZ`````!(BUPD"$B+;"003(MD)!A,BVPD($B#Q"C#9F9FD&9F9I!F9F:0
+M55-(@^P(2(G]2(V?4!```$B)W^@`````A,`/A0@!``!(B=_H`````(G"N8#_
+M__^`O>@(``#_=!*`O>D(``#_#X7C````N8'___\XC?<```!S!HB-]P```(#Y
+M@@^$QP````^VP8B4!6@(```/M\)(:=C(#P``2(G:2`.5D`D``+@`````Q@00
+M`$B#P`%(/<@/``!U\$B)VD@#E9`)``!(C4(82(E"&$B)VD@#E9`)``!(C4(8
+M2(E"($B)VD@#E9`)``!(C4(H2(E"*$B)VD@#E9`)``!(C4(H2(E",$B)VD@#
+ME9`)``!(C4)(2(E"2$B)VD@#E9`)``!(C4)(2(E"4$B+A9`)``"(3`-;2(N]
+M^`@``+X`````Z`````!(B=A(`X60"0``ZP6X`````$B#Q`A;7<-F9F:09F9F
+MD&9F9I!!5%-(@^P(28GT2(N?X!```$B!QZ@/``#H`````(G!#[?`2,'@!D@!
+MV$F)!"2Z`````,8$`@!(@\(!2(/Z0'7R#[?!2(/$"%M!7,-F9I!FD$B#[`A(
+MC9=0`0``N`````!(.9=0`0``=`A(B=?H`````$B#Q`C#D)"0D)"0D)"0D$`/
+MMO9(C33V2,'F!X'&8%<``(DWPV9F9I!F9F:09F:0#[;2#[=$5GB#P`%FB416
+M>`^V5@(!T`^WP,-F9I!F9I"X`0```("_NT(```%T$X/``4B!Q[````"#^"!U
+MZ&:X___SPV9F9I!F9I!F9I!F9I!(B?FX`0```$`XL;A"``!U'SB1N4(``'47
+MB<!(C12`2(T44$C!X@3&A!<+0@```<.#P`%(@<&P````@_@@=<GSPV9F9I!F
+M9F:09F9FD&9FD,8!_D0/ME<$1832=$Y)B?A!N0````!!NP````"X`````$DY
+ML-A9``!U'D$XTW452)A(C03`2,'@!P^VA`?$5P``B`'#08/#`4&#P0&#P`%)
+M@<"`!```13C1=<;SPV9FD$F)^H#Z`7081`^V1P2_`````$6$P`^$<`$``.E!
+M`0``0;L`````387`#X0<`0``#[97!$&[`````(32=#1(B?A!NP````!!N0``
+M``!F9F:02#FPV%D``'4)03C)=!-!@\$!08/#`4@%@`0``$$XTW7?00^V^TAC
+MSTB-#,E(P>$'28V4"F!7``!(BP))B0!(BT((28E`"$B+0A!)B4`02(M"&$F)
+M0!A(BT(@28E`($B+0BA)B4`H2(M",$F)0#!(BT(X28E`.$B+0D!)B4!`2(M"
+M2$F)0$A(BT)028E`4$B+0EA)B4!8BT)@08E`8$&`O`I@5P```'13O@````!(
+M8\=(C03`2(T\Q0````!.C0P10`^VQDB)PDC!X@1)C4P08$B-!`=(P>`$28V4
+M`N!9``!(BP)(B4$$2(M""$B)00R#Q@%!.+%@5P``=\5!#[;#2(T$P$C!X`=!
+M#[:$`F!7``##3(G2N0````"_`````&:02#FRV%D```^4P`''@\$!2('"@`0`
+M`$0XP77E0`^VQ\-!54%455-(B?-)B=5-B<Q!B<E$B<5)B?B^`````&9FD(GQ
+M2#E?(`^%A0```$ACQDAIP%`0``!-C50`($&[`````$2)VD$/MD(LA,!T!#SP
+M=4](8])(8\E(B=!(P>`%2&G)4!```$@!R$P!P$B)6#!,B6@X2,'B!4B-5`H@
+M2HT$`DB-2"!FB6D"1(A(($F+!"1)B400),9!#/_K%F9FD&:008/#`4F#PB!!
+M@?N"````=9"#Q@%(@<=0$```@_X$#X5<____6UU!7$%=PV9FD&:0055!5%53
+M2(/L"$F)]4B)_8!_!`!T1D&\`````&9F9I!!#[;<2&/#2(T$P$C!X`>`O`7$
+M5P``_7092(V\!;Q7``"Z"````$R)[N@`````A,!U#T&#Q`%$.&4$=\2[_P``
+M`(G82(/$"%M=05Q!7<-FD%-(B?OH`````+H)````//]T$P^VP$B-!,!(P>`'
+M#[:4`V97``")T%O#9F9FD&9FD$B#[`A)B?))B=%$B<)(B?Y,C8=@00``N```
+M``!F9F:00L8$``!(@\`!2#V0````=>_&AF%!```3QH9@00``0`^VQHB&9D$`
+M`(B69T$``(B.:4$``$C'A@!"````````2(F^^$$``$F+05Q(B8;P00``2('&
+M8$$``$R)U^@`````2(/$",-F9F:09F9FD&9FD$%505154TB#[`A)B?5)B=1,
+MB<U!B<E$B<-(B?A)B?JZ`0```$&)TT&)T("XNT(```$/A>X```!(8])(C022
+M2(T$0DC!X`1,`=!(C9``0@``QD(+`$R)D/A!```/MDH*2&/!2(T4@$B-%%!(
+MP>($28V4$F!!``"X`````&9FD&:0Q@00`$B#P`%(/9````!U\$ACP4B--(!(
+MC31P2,'F!$J-%!9(C8I@00``QD$!D,:"8$$``$`/ML>(00:(FF=!``!$B$D)
+M2(M%`$F)A#)P00``26/`2(T4@$B-%%!(P>($2HT$$DC'@`!"````````2(FX
+M^$$``$F+1"1<28F$$O!!``!!#[;#2(T4@$B-%%!(P>($28VT$F!!``!,B>_H
+M`````.L7@\(!2`6P````@_H@#X7M_O__N`$```!(@\0(6UU!7$%=PV9FD&9F
+MD&9FD$B#[`A)B?-!B=)(B?I)B?BX`0```(G&@+J[0@```0^%X0```$B82(T4
+M@$B-%%!(P>($28V$$`!"``!$B%`(B$@)QD`+`$0/MD@*26/!2(T4@$B-%%!(
+MP>($28V4$&!!``"X`````,8$$`!(@\`!2#V0````=?!)8]%(C0222(T$0DC!
+MX`1,`<!(C9!@00``QD(!$,:`8$$``$"(2@E(8\9(C0R`2(T,2$C!X01!#[:$
+M"`I"``!(C12`2(T44$C!X@1*C00"2,>``$(```````!(B;CX00``00^VPDB-
+M!,!(P>`'28N$`+Q7``!)B80(\$$``$F-M!!@00``3(G?Z`````#K%8/``4B!
+MPK````"#^"`/A?W^__^P`4B#Q`C#D$B#[`A)B?&)T$B)_L:'"T(```!,C8=@
+M00``N0````"00L8$`0!(@\$!2('YD````'7NQH9A00```<:&8$$``$!(QX8`
+M0@```````$B)OOA!```/ML!(C03`2,'@!TB+A`:\5P``2(F&\$$``$B!QF!!
+M``!,B<_H`````$B#Q`C#2(/L"$F)\8G02(G^QH<+0@```$R-AV!!``"Y````
+M`)!"Q@0!`$B#P0%(@?F0````=>[&AF%!````QH9@00``0$C'A@!"````````
+M2(F^^$$```^VP$B-!,!(P>`'2(N$!KQ7``!(B8;P00``2('&8$$``$R)S^@`
+M````2(/$",-!5T%6055!5%532(/L.$B)?"082(ET)!!!B=5$B$0D#TF)_$4/
+MMO5)8\9(C03`2,'@!X"\!\17``#]#X3&"```@/D0#X2%`@``@/D0=Q>$R0^$
+MG0```(#Y`0^%IP@``)#I!@$``(#YXG0;@/G_9F:0="F`^9`/A8L(``!F9I!F
+MD.G(!@``N0````"`?P0`9I`/A=P'``#I!`@``$ECQDB-!,!(P>`'QH0'Q%<`
+M`/^`OPM"```!=25$B?)(BW0D$$B+?"08Z`````"%P`^%-0@``$&`1"0&`>DJ
+M"```26/&QD0'!P%(BU0D$$B)5,<0Z1,(``"`OPM"```!=5A(C8]@00``26/&
+M2(T$P$C!X`=(`?@/ME$)B)!B5P``2`7`5P``#[91"H/B`8A0!<9`!`!$B?)(
+MBW0D$$B+?"08Z`````"%P`^%O0<``$&`1"0&`>FR!P``26/&QD0'!P%(BTPD
+M$$B)3,<0Z9L'``!)8\9(C03`2,'@!TB--#@/MI>200``B):R5P``#[>7D$$`
+M`&:)E`>P5P``2(N7B$$``$B)E`>@5P``2(N7;$$``$B)E`=P5P``2(V,!X!7
+M``!(BY=T00``2(D12(N7?$$``$B)40B+EX1!``")E`>85P``QH;$5P```8!_
+M!A\/A!<'``"[`````$B-KF!7``!,C:ZP5P``ZTD/MLM$B?)(BW0D$$B+?"08
+MZ`````"%P'0526/&2(T$P$C!X`=!B)P$LU<``.L@@\,!08!$)`8!.%T"#T7#
+M08A%`T&`?"0&'W0%.ET"<K)!QH0D"T(```%!#[9T)`1`A/8/A)P&``"Z````
+M`$&`?"0'`707ZT-F9F:09F:0#[;12&/"08!\!`<!=3-(8\)!QD0$!_])BW3$
+M$$&Y`````$&X`````+G_````2(M\)!CH`````.E*!@``N0````"#P0%`./%U
+MM^DX!@``38G/28U!&$B)1"0@2(UT)#!)BT$82(E$)#!)8\9(C03`2,'@!TB-
+M+#A(C87`5P``QD`$$$'V00QP#X1"`P``2(N5R%<``$B%TG1Q#[98!DB->ERZ
+M"````.@`````A,!U6T'V1P\/=%1(BX7(5P``2(7`=$A(B<6`?64`=#\/MMN)
+MVDB)[DR)Y^@`````3(M,)"!$#[?`B=E(B>I(BW0D$$B+?"08Z``````/MEUF
+M2(M%:$B%P'0%2(G%Z[M!#[9/#_;!#0^$ZP```$ECQDB-%,!(B=!(P>`'00^V
+MM`1@5P``0(#^'P^'R@```/;!"'070`^VQDB-!-!(P>`$0<:$!.!9```&ZQQ`
+M#[;626/&2(T$P$B-!,)(P>`$0<:$!.!9```'0`^VQDEC]DB--/9(C13P2,'B
+M!$F-O!3@60``QD<!`$$/MD</B$<#2(M$)#!)B804Z%D``$$/MD<)B$<"00^V
+M5PV#X@](P>8'3`'F2(V.8%<```^V008XP@]'T(/B#P^V1P2#X/`)T(A'!$$/
+MME<I@^(/#[9)!CC*#T?1P>($@^`/"="(1P2`AF!7```!Z<P!``#VP0(/A,,!
+M``!(C70D,$R)Y^@`````B<$\_P^%8@$``$$/MDPD!(3)=#U!#[:$),17```\
+M_W0PN@`````\_74>ZR4/ML)(C03`2,'@!T$/MH0$Q%<``#S_=!(\_70.@\(!
+M.,IUW>L%N@`````/ML)(C03`2,'@!TF-C`1@5P``N`````#&!`@`2(/``4B#
+M^&1U\D0/MM))8])(C1322,'B!TJ-/")!#[;%2(T$P$C!X`=)C80$8%<``$B)
+MA\A7``!-C804L%<``$ECUDB-%-)(P>('28N$%+Q7``!)B4`$2(M,)!!(B8_8
+M60``3`'B2(N"T%<``$B)A]!7``!,C8_`5P``0<9!!/](C;=@5P``#[9.!T$/
+MMD<)B(0/:%<``(!&!P%!#[9'#8/@#P^VDF97```XT`]'PHA&!DB+1"0P28E`
+M#$$/MD</B$8##[9$)`]!B$$&00^V1"0%03I$)`1U!D'&1"0%`$&`1"0%`4EC
+MPD'&1`0'`4B+5"0028E4Q!#K2DECQDB-!,!(P>`'#[;12(T4TDC!X@=)C904
+M8%<``$DYE`3(5P``="(/ML%(C03`2,'@!TP!X`^V<@=!#[9/"8B,,&A7``"`
+M0@<!00^V5PE$B?9,B>?H`````$ECQDB-!,!(P>`'08"\!+-7````#X2@````
+M08!\)`8?=6/I@`(``$'&1P00#[9+`T2)\DB+="002(M\)!CH`````(7`#X5=
+M`@``08!$)`8!#[9+`P^VP8/``0^V50(YT'4/QD,#`.D\`@``9F:09F:0C4$!
+MB$,#08!\)`8?#X0D`@``ZR-)8\9(C03`2,'@!TP!X$B-F+!7``!(C:A@5P``
+M3(VXP%<```^V0P,Z10(/@G+____I[0$``$&`?"0&``^%X0$``$&Y`````$&X
+M`````+F0````1(GR2(MT)!!(BWPD&.@`````Z;D!``!)B?U!OP````!(BTPD
+M$$DY32`/A8,```!$B?A(:<!0$```28U<!""]`````$2)^$AIP%`0``!(B00D
+M@'LL_W5*08!\)`8?#X1M`0``B>A(P>`%2(L4)$B-1!!`#[9+($B+4QA-C4P$
+M!$0/MT,B2(MT)!!(BWPD&.@`````A<!U"D&`1"0&`<9#+/!(@\4!2(/#($B!
+M_8(```!UGTF#QP%)@<50$```28/_!`^%6?___T&`?"0&``^%_0```$$/MG0D
+M!$"$]@^$RP```+H`````08!\)`<!=!#K/`^VT4ACPD&`?`0'`74S2&/"0<9$
+M!`?_28MTQ!!!N0````!!N`````"Y_P```$B+?"08Z`````#IHP```+D`````
+M@\$!0#CQ=;?K<0^VP4B-!,!(P>`'28V4!,!7```/MD($//UT"#S_=`3&0@3^
+M@\$!03A,)`1WTTECQDB-!,!(P>`'28NL!-!7``"[`````$*`?",H`7420L9$
+M(R@`2HMT(R!(BWPD&/_52('#4!```$B!^T!!``!T)>O40;D`````0;@`````
+MN>(```!$B?)(BW0D$$B+?"08Z`````!(@\0X6UU!7$%=05Y!7\-F9F:09F9F
+MD&9FD$B#[!A(B1PD2(EL)`A,B60D$$F)_$B)]4B+GI@```"`>P8`#X1'`0``
+M2(VVD````$B)W^@`````B<$\_P^$+@$``$B)[@^V10$\`71:/`%R&CP0#X2*
+M````/)!F9I!FD`^%"@$``.G&````@+L+0@````^%^````,:#"T(```&`:P8!
+M#[;10;D`````0;@`````N0````!,B>9(B=_H`````.G)````@+L+0@````^%
+MO````,:#"T(```&`:P8!#[;10;D`````0;@`````N0$```!,B>9(B=_H````
+M`.F-````N@`````ZC!JX0@``=0\/MH0:N4(``#I&"7029I!(@<*P````2('Z
+M4!4``'78@&L&`0^VT4F)\40/MD8)N1````!,B>9(B=_H`````.L_#[:%J@``
+M`$B-%(!(C1102,'B!,:$$PM"```!@&L&`0^VT4&Y`````$&X`````+F0````
+M3(GF2(G?Z`````"02(L<)$B+;"0(3(MD)!!(@\08PV9F9I!F9I!F9I!F9I!!
+MB=")\H7V=!1(B?E(B="0Q@$`2(/!`4B#Z`%U\XDW2('J8%<``$BXC^,XCN,X
+MCN-(]^)(P>H*03C000]"T(A7!(32="NZ`````&9FD&9FD`^VPL9$!P?_2(T$
+MP$C!X`?&A`?$5P``_8/"`3A7!'?@QD<&`,9'!0!(B?BZ`````,:`"T(```&(
+MD`I"``"#P@%(!;````"#^B!UY?/#9F:02(GY@'\$``^$F0```+\`````1`^V
+MQTECP$B-!,!(P>`'2#FT`=A9``!U;K@`````0#B\"+A"``!U",:$"+M"```!
+M2`6P````2#U0%0``=>!)8\!(C03`2,'@!TC'A`'860```````$B-E`%@5P``
+MN`````#&!!``2(/``4B#^&1U\DECP$B-!,!(P>`'QH0!Q%<``/V`:04!@\<!
+M0#AY!`^';/___TB)ST&X`````$@Y=R!U,$C'1R``````QD<H`$ECP$AIP%`0
+M``!(C40!(+H`````QD`L`(/"`4B#P""`^H)U\$&#P`%(@<=0$```08/X!'6Y
+M\\-F9F:09F9FD$%505154TB#[`A(B?U(B?=)B=1-B<5!B<A(B>L/MD4%.D4$
+M=03&104`1`^V6P5(B=Y)B=FX`````$&)PHG"28M)($@Y^75+2)A(:<!0$```
+MQD0#*`$/MDL$0;L`````A,ET9$&[`````$@YOMA9``!U#@^VAL17``"#P`,\
+M`79'08/#`4B!QH`$``!!.,MT-^O72(7)=1E(8\)(:<!0$```2`'82(EX(,9`
+M*`'K&6:008/"`8/``4F!P5`0``"#^`0/A7+___]!#[;"2&G`4!```$B-1`,P
+MN0````!F9F:0Q@0!`$B#P0%(@?D"$```=>]%#[;326/"2(E\PQ!!#[;#2(T$
+MP$C!X`=(C80#8%<``&:Y``#&!`$`2(/!`4B#^61U\DECPDB-!,!(P>`'2(V,
+M`]A7``"X`````&9FD&:0Q@0(`$B#P`%(/0`"``!U\$ECPDB-!,!(P>`'2(T,
+M&$B)N=A9``!,B:G05P``QH'$5P``_TC'@<A7````````28L4)$B)E`.\5P``
+M1(B!9E<``$&Y`````$&X`````+G_````1(G22(G^2(GOZ`````"`0P4!2(/$
+M"%M=05Q!7<-(BP=,BP`/MG!#0(3V=$</ME<-N0````#VP@%T#>LWD$B)T$C3
+M^*@!=0B#P0%`./%U[H#Y`W8D2(T$C0`````E_`,``$F-A`#0`0``BP")!0``
+M``#K(KD`````2(T$C0`````E_`,``$F-A`#0`0``BP")!0````#!Z!2#X`'#
+MD$B+!T0/MD!#0;D*````183`=$H/MG\-2(G"0;D*````O@````"Y`````&9F
+MD&9FD$B)^$C3^*@!=!0/MH+R$@``@^`#@\`(03C!1`]'R(/&`8/!`4B#PFA$
+M.,9UTT$/ML'#9F9FD&9F9I!F9I!F9I!(BP=$#[9`0T&Y"````$6$P'1*#[9_
+M#4B)PKX`````0;D(````N0````!F9I!F9I!(B?A(T_BH`704#[:"\A(``(/@
+M`X/`"$$XP40/0LB#Q@&#P0%(@\)H1#C&==-!#[;!PV9F9I!F9F:09F:09F:0
+M#[8'P.@$@^`'#[9W`HG"@,X"0/;&!`]%P@^V3P.)PH'*```"`/;!!`]%PHG"
+M@,X(0/;&"`]%PHG"@<H```@`]L$(#T7"B<*`S@1`]L8"#T7"B<*!R@``!`#V
+MP0(/1<(/ME<4P>(8"=##9F9FD&9FD.@`````\\-F9I!F9I!F9I"+AQ@)```E
+M____`+H`````/5`!DP!U&0^VAQL)``#`Z`0\#`^4P`^VT&9F9I!F9I")T,-F
+M9F:09F:09F:09F:0A?9^0@^V!X3`=`0\('4Q2(GZN0````#K%V9F9I!F9I`/
+MMD(!2(/"`83`=`0\('40@\$!.?%UZ>L-9F9FD&9FD+@`````P[@!````9F:0
+M9I##9F9FD&9F9I!F9F:09F:0#[9'`P^V5P+!X@@)T,'@$`^V3P$/MA?!X@@)
+MT0G(PY!!B="%TG0EN0````!F9F:0#[87#[9'`8@&B%8!2(/&`DB#QP*#P0%$
+M.<%UY//#9I!(@^P(28GP#[=&(+K_````9CV%`'<+#[?`#[:4!V@(```/M])(
+MC1322,'B!4@#EV@)``!(B[<0$0``#[9"4,'@"$B82(V$!DP(``"+"(D-````
+M`('A_P````^V0E#!X`A(F$B-M`9$"```BP:)!0````#!X`@)R(F"$`$``&;'
+M@@P!`````$R)QN@`````2(/$",-F9F:09F:09F:09F:02(/L*$B)7"0(2(EL
+M)!!,B60D&$R);"0@28G]08GT2(LO0(#^`W8Y2HT<Y0````"!X_@'``!(C80=
+M,`(``,<`#````+\0)P``Z`````!(C80=-`(``(LXB3T`````ZS>02HT<Y0``
+M``"!X_@'``!(C80K4`(``,<`#````+\0)P``Z`````!(C9PK5`(``(L[B3T`
+M````00^V]$ACQDB-%$!(C12028V4U<`2```/MDH)@^'\B$H)B?@E```_`#T`
+M`!``=0N)R(/(`HA"">L9D$ACQDB-%$!(C120B<B#R`%!B(35R1(``$B+7"0(
+M2(ML)!!,BV0D&$R+;"0@2(/$*,-F9F:09F9FD&9F9I!F9I!!5T%6055!5%53
+M2(/L&$F)_DR+/TF+!\9&20#&1D@%QD9+!DB)?E"Y`````+T`````2(V0``(`
+M`$B)5"002`4$`@``2(E$)`CK%F9FD&9FD$$/MD8-2-/XJ`%U"H/!`9!!.D]#
+M<NJ`^0-V>DB-',T`````@>/X!P``3(ML)!!)`=U!QT4`+````+\0)P``Z```
+M``!(`UPD"$2+(T2))0````!!QT4`)````+\0)P``Z`````"+`XD%`````,'@
+M"$&!Y/\```!!"<1!QT4`(````+\0)P``Z`````"+&XD=`````.MX2(T<S0``
+M``"!X_@'``!,BVPD$$D!W4''10`L````OQ`G``#H`````$@#7"0(1(LC1(DE
+M`````$''10`D````OQ`G``#H`````(L#B04`````P>`(08'D_P```$$)Q$''
+M10`@````OQ`G``#H`````(L;B1T`````08'\`0%IEG4:08!.#`:)V,'H$#Q0
+M#Y3`#[;`ZTAF9I!F9I!!@?P!`0``=0^)V,'H$#Q0#Y3`#[;`ZRJ_B!,``.@`
+M````@\4!0(#]!'<*N0````#IJ_[__XG8P>@0/%`/E,`/ML!(@\086UU!7$%=
+M05Y!7\-F9F:09F9FD&9F9I!F9I!!54%455-(@^P(2(G]08GT2(N'B````$R+
+M*&:#OPP!````=#")\[_H`P``Z`````!%A>1T!8/[`78:3(GO9F:0Z`````!F
+M@[T,`0```'0%@^L"Z])(@\0(6UU!7$%=PY!(@^PX2(E<)`A(B6PD$$R)9"08
+M3(EL)"!,B70D*$R)?"0P28G\B<M!B?9!B=5%B<=(BX>(````2(LH2(GOZ```
+M``!(B<;&0#CAQD`Y`<9`.A*X#P```$6$]G4&00^V1"1'B$8[1(AN/$R)Z@^V
+MQHA&/0^VQXA&/HG8P>@0B$8_B=C!Z!B(1D"(7D%!#[=$)$!FB48@2(EN*,=&
+M-`````!(QT9(`````$6$_TC'P`````!(Q\(`````2`]%PDB)AJ````!(B>_H
+M`````$B+7"0(2(ML)!!,BV0D&$R+;"0@3(MT)"A,BWPD,$B#Q#C#9I!(@^PH
+M2(D<)$B);"0(3(ED)!!,B6PD&$R)="0@28G\B<M!B?9!B=5(BX>(````2(LH
+M2(GOZ`````!(B<;&0#CAQD`Y`<9`.A*X#P```$6$]G4&00^V1"1'B$8[1(AN
+M/$R)Z@^VQHA&/0^VQXA&/HG8P>@0B$8_B=C!Z!B(1D"(7D%!#[=$)$!FB48@
+M2(EN*,=&-`````!(QT9(`````$C'AJ``````````2(GOZ`````!(BQPD2(ML
+M)`A,BV0D$$R+;"083(MT)"!(@\0HPV:04TB)^T&)RD&)T4B%_P^$`0$``$R+
+M!TV%P`^$]0```$$/MGA#A?]^5TB+@X@````/ME`-N0````#VP@%T#>M`D$B)
+MT$C3^*@!=0>#P0$Y^77O@_D#?BY)BP!(!=`!``"-%(T`````2&/22`'0BP")
+M!0````#!Z!2#\`&#X`'K++D`````28L`2`70`0``C12-`````$ACTD@!T(L`
+MB04`````P>@4@_`!@^`!A,!U98"['`$```!U!H![0@!U5@^W0T!!@+P`:`@`
+M`/]T1\9#0B5FQX,,`0```0!!#[?10`^V]D&X`0```$2)T4B)W^@`````O@4`
+M``!(B=_H`````,9#0@!F@[L,`0````^4P`^VP.L%N`````!;PV9FD&:02(/L
+M*$B)7"0(2(EL)!!,B60D&$R);"0@2(G]08GU08G42(N'B````$B+&$B)W^@`
+M````2(G&QD`XX<9`.0'&0#H1N`\```!%A.UU!`^V14>(1CM$B&8\3(GB#[;&
+MB$8]#[=%0&:)1B!(B5XHQT8T`````$C'1D@`````2,>&H`````````!(B=_H
+M`````$B+7"0(2(ML)!!,BV0D&$R+;"0@2(/$*,-F9I!F9I!F9I!54TB#[`A(
+MB?M(B<U!B=%(A?\/A`8!``!,BP=-A<`/A/H```!!#[9X0X7_?E9(BX.(````
+M#[90#;D`````]L(!=`SK/TB)T$C3^*@!=0>#P0$YSW7O@_D#?BY)BP!(!=`!
+M``"-%(T`````2&/22`'0BP")!0````#!Z!2#\`&#X`'K++D`````28L`2`70
+M`0``C12-`````$ACTD@!T(L`B04`````P>@4@_`!@^`!A,!U:X"['`$```!U
+M!H![0@!U7`^W0T!!@+P`:`@``/]T3<9#0B5FQX,,`0```0!!#[?10`^V]KD!
+M````2(G?Z`````"^!0```$B)W^@`````QD-"`&:#NPP!````=1"+@Q`!``")
+M10"X`0```.L%N`````!(@\0(6UW#9F:09F:02(/L*$B)'"1(B6PD"$R)9"00
+M3(EL)!A,B70D($B)_4&)]4&)U$&)SDB+AX@```!(BQA(B=_H`````$B)QL9`
+M..'&0#D!QD`Z$;@/````183M=00/MD5'B$8[1(AF/$R)X@^VQHA&/0^W14!F
+MB48@2(E>*,=&-`````!(QT9(`````$6$]DC'P`````!(Q\(`````2`]%PDB)
+MAJ````!(B=_H`````$B+'"1(BVPD"$R+9"003(ML)!A,BW0D($B#Q"C#9F9F
+MD&9FD&9FD&9FD$B#["A(B5PD"$B);"003(ED)!A,B6PD($B)]4&)U$&)S4B+
+M'TB)W^@`````2(G"2(7`=1#&A>D````!QD5*`^F4````QD`XX<9`.0%!@/P!
+M&<#WT(/``HA".D6$[751N`````!(@WU@`'0'#[:%@0```(A".P^W13AFB4(@
+M2(E:*,="-`````!(QT)(`````$C'P`````!(B8*@````2(G62(G?Z`````#K
+M+69FD&:0QD([#P^W13AFB4(@2(E:*,="-`````!(QT)(`````$C'P`````#K
+MOTB+7"0(2(ML)!!,BV0D&$R+;"0@2(/$*,-F9F:09F9FD&9F9I!F9I!!5T%6
+M055!5%532(/L.(GU28G42(L/C13M`````(U"X(G`2(V<""`"``!(B1PD2(V$
+M""0"``!(B40D"(G23(V\"@`"``!,C:P*!`(``+L`````3(UT)!"#_0-V)8V#
+M'`$``$B+%"2)`K\0)P``Z`````!(BU0D"(L"B04`````ZQV-@QP!``!!B0>_
+M$"<``.@`````08M%`(D%`````$*)!#-(@\,$2(/[''6K2(M$)!!)B00D2(M$
+M)!A)B40D"$B+1"0@28E$)!"+1"0H08E$)!A(@\0X6UU!7$%=05Y!7\-F9F:0
+M9F9FD&9F9I!F9I!!5T%6055!5%532(/L.(GU28G42(L/C13M`````(U"X(G`
+M2(V<""`"``!(B1PD2(V$""0"``!(B40D"(G23(V\"@`"``!,C:P*!`(``+L`
+M````3(UT)!"#_0-V)8V#``$``$B+%"2)`K\0)P``Z`````!(BU0D"(L"B04`
+M````ZQV-@P`!``!!B0>_$"<``.@`````08M%`(D%`````$*)!#-(@\,$2(/[
+M''6K2(M$)!!)B00D2(M$)!A)B40D"$B+1"0@28E$)!"+1"0H08E$)!A(@\0X
+M6UU!7$%=05Y!7\-F9F:09F9FD&9F9I!F9I!!5T%6055!5%532(/L.$F)_D"(
+M="0+3(L_1`^V[DECQ4B-%$!(C1202(T4UTB-@L`2``!`B'`(2(FZP!(``,9`
+M"@!$B>[H`````$B-;"002(GH2(GJQ@``2(/``4B)TTR-9"0P3#G@=>P/MD0D
+M"XE$)`R)QDR)]^@`````2(G?Z`````!)8]5(C0Q22(T,BDC!X0-*C10QB8+8
+M$@``2(M##$F)A`[<$@``@'PD"P-V/$*-!*T`````2)A)C80'T`$``(L`B04`
+M````B8+P$@``0HT$[0````!(F$F-A`>``0``BPB)#0````#K1T*-!*T`````
+M2)A)C80'T`$``(L(B0T`````26/%2(T40$B-%)!!B8S6\!(``$*-!.T`````
+M2)A)C80'@`$``(L(B0T`````26/%2(T40$B-%)!)C036B8CT$@``]H#R$@``
+M$`^$.P$``/:`R1(```)T4&:0QD4``$B#Q0%,.>5U\TB-7"002(G:BW0D#$R)
+M]^@`````2(G?Z`````!)8]5(C0Q22(T,BDC!X0-!B80.Y!(``$B+0PQ)B80.
+MZ!(``.L726/%2(T40$B-%)!!QX36Y!(```$``@"`?"0+`W8U0HT<[0````!(
+M8]M*C80[,`(``,<`&````+\0)P``Z`````!*C9P[-`(``(LSB34`````ZS-"
+MC1SM`````$ACVTJ-A#M0`@``QP`8````OQ`G``#H`````$J-G#M4`@``BS.)
+M-0````!)8\5(C11`2(T4D(GQ@>'____?B?`-````($'WA-;P$@`````#`(G*
+M#T70@'PD"P-V%D*-!.T`````2)A)C80'-`(``(D0ZQ1"C03M`````$B828V$
+M!U0"``")$$B#Q#A;74%<05U!7D%?PY!!5D%505154TB)_4F)]DF)]0^W!F:%
+MP'D+)0`?``#!^`B(1TE(C;V$````28U5%$F+111(B86$````2(M""$B)1PB+
+M0A")1Q!,C:7`````28M%+DB)A<````!(C9V8````28U5-DF+139(B868````
+M2(M""$B)0PA(BT(02(E#$$B+0AA(B4,82(M"($B)0R"Z"@```$B)_N@S\/__
+MN@0```!,B>9,B>?H(_#__[H4````2(G>2(G?Z!/P__]FQT5H``!FQT5J``!F
+M08.^L@$```$/E,+!X@,/MD5,@^#W"="(14Q!]H6G````!'0&9L=%:`$`0?:%
+MI`````%T)&:#36@"0?:%J@````%T!6:#36H!0?:%J`````%T!F:!36@``4'V
+MA:0````@=!1F@TUH!$'VA:H````@=`5F@TUJ`D'VA:0```!`=!9F@4UH@`!!
+M]H6J````0'0&9H--:@B0QH6"`````D'VA9D````!=#(/MT5HJ`%T#(/("&:)
+M16AF@TUJ$$$/MH66````@^`?@\`!/""Z'P````]$PHB%@@```$'VA9@````(
+M=`9F@4UH``)!]H68````!'0%9H--:"!!]H68`````G0%9H--:!!!]H6H````
+M('050?:%K@```"!T"V:#36A`9F:09F:0]D5H`70-28N%R````$B)17CK"$&+
+M17A(B45X2(-M>`%!]D5J`G0:00^WA8````"H#W0.9H/X`AG`@\`$B$5LZP3&
+M16P"QD5M_T$/MU5^#[?"J`1T"\9%;0+K&V9FD&:0J`)T!L9%;0'K#/;"`69F
+MD'0$QD5M`,9%;O]!]D5J!'0?N0````!!#[>%L````$C3^*@!=`.(36Z#P0&#
+M^0=UYKX``@``3(GOZ`````")A<P```!!]H:F````('0;00^WAJP```"#X""#
+M^`$9P(/``HB%F`$``.L'QH68`0```+@!````6UU!7$%=05[#9F:02(/L*$B)
+M'"1(B6PD"$R)9"003(EL)!A,B70D($F)_4F)]DR+)[N`____ZPEF9F:0@/N%
+M=T,/ML-!#[:L!&@(``!`@/W_=#%`#[;%2&G`R`\``$B)QTD#O"20"0``3#EO
+M"'45N@@```!,B?;H`````(3`=`2)Z.L/@\,!@/N!9I!VKKC_____#[;`2(L<
+M)$B+;"0(3(MD)!!,BVPD&$R+="0@2(/$*,-F9I!F9I!F9I!!5T%6055!5%53
+M2(/L.$F)_DB+!X!_0P`/A!$#``#'1"0T`````$B-D``"``!(B50D"$@%!`(`
+M`$B)!"1F9F:0#[9,)#2(3"0S1`^V^4ECQTB-%$!(C12028TTUO:&\A(``!`/
+MA*\"``!(C9;`$@``N`$```!$B?E(T^`(0@I(B[;0$@``2(ET)"CV0@D"#X0>
+M`0``#[9$)#.-:`%!.&Y##X8,`0``26/'2(T40$B-%)!(P>(#2(E4)"!,`?)(
+MB50D&$B+5"0@28V4%N@2``!(B50D$$0/MNU)8\5(C11`2(T4D$B-'-4`````
+M3HTD,T'VA"3R$@``$`^$IP```$B+3"08]X'D$@`````.``^$D@```$F-M![H
+M$@``N@@```!(BWPD$.@`````A,!T=TF-M![<$@``2(M$)"!)C;P&W!(``+H(
+M````Z`````"$P'14N`$```!$B>E(T^!(BU0D&$B!PL`2```*0@J(0@I!B(0D
+MRA(``$B#?"0H`'4/38ND)-`2``!,B60D*.L826/%2(T40$B-%)!(BT0D*$F)
+MA-;0$@``@\4!03AN0P^'(O___TB#?"0H``^%Q````$R)]^@`````2(E$)"A(
+MA<`/A%L!``!)8\=(C0Q`2(T,B$F-#,Y(BU0D*$B)D=`2```/MD0D,TB-%$!(
+MC12028V4UL`2``!(BT0D*$B)4"`/MH')$@``2(M4)"B(0@K&0@D`3(DRQD(.
+M`,9"6`#&0B@`#[9,)#.-<0%!.'9#=EU)8\=(C11`2(T4D$F-O-;`$@``0`^V
+MS@^V1PI(T_BH`7082&/!2(T40$B-%)!(BT0D*$F)A-;0$@``@\8!03AV0W8:
+MZ\Y)8\=(C11`2(T4D$B+3"0H28F,UM`2``!)8\=(C11`2(T4D$F-E-;`$@``
+M#[9""DB+3"0HB$$-#[9J"H!\)#,#=BM"C1S]`````$ACVTB+1"0(2`'8QP`X
+M````OQ`G``#H`````$@#'"2)*^LI0HT<_0````!(8]M(BT0D"$@!V,<`.```
+M`+\0)P``Z`````!(`QPDB2N#1"0T`0^V1"0S@\`!03A&0P^'$?W__TB#Q#A;
+M74%<05U!7D%?PV:005=!5D%505154TB#[&A(B?U,BR?&1"104,9$)%$%QD0D
+M4@3&1"13,,9$)%01QD0D5:O&1"16`,9$)%<`0<>$)`!``0`3(```2(L'QX`$
+M0`$`__\``$B+!\>`!$`!``````!(.[_X"```#X74````2(V?D!0``$B-EQ@)
+M``!!N`$```"Y"````+X```(`Z`````"+A1`)```/MI4;"0``@^H$C02"B(4;
+M"0``2(GOZ`````"$P'4,2(M$)%!(B848"0``BP4``````(4;"0``@\`!B04`
+M````#[:%&`D``(B#&`D```^VA1D)``"(@QD)```/MH4:"0``B(,:"0``#[:%
+M&PD``(/``HB#&PD```^VA1P)``"(@QP)```/MH4="0``B(,="0``#[:%'@D`
+M`(B#'@D```^VA1\)``"(@Q\)``!-B>=)C80D``$``$B)1"1`08N$)``!``")
+M!0`````/M]")5"1<J"!T"R7?_P``B40D7.L8B="#R"")1"1<2(M4)$")`HL"
+MB04`````2(M%`,>`!`$```````!(BT4`QX`8`0```````$B+10#'@!P!````
+M````OY#0`P#H`````$''AW`!```8`0``08N'=`$``(D%`````(#D_8#,!(E$
+M)%Q!QX=P`0``&`$``(M$)%Q!B8=T`0``0<>'<`$``"@!``!!QX=T`0``?W\`
+M`$''AW`!```D`0``08N'=`$``(D%`````&:X```-_S\``(E$)%Q!QX=P`0``
+M)`$``(M$)%Q!B8=T`0``0<>'<`$``#P!``!!QX=T`0````!Z`$''AW`!``"D
+M`0``0<>'=`$``'V_[_]!QX=P`0``N`$``$&+AW0!``")!0`````E__\```T`
+M`/H`B40D7$''AW`!``"X`0``BT0D7$&)AW0!``!!QX><````_P```$''AY`"
+M``!$`0``0<>'E`(```80``A!QX>0`@``M`$``$''AY0"``!?<```0<>'D`(`
+M`#````!!BX>4`@``B04`````,.2`S#.)1"1<08F'E`(``(!]0P`/A)4"``#'
+M1"1(`````$F-AU`"``!(B40D.$F-EU0"``!(B50D,$B-A1@)``!(B40D*$F-
+MEX`!``!(B50D($F-AX0!``!(B40D&$F-ES`"``!(B50D$$F-AS0"``!(B40D
+M"&9F9I!F9I`/ME0D2(A4)$^`^@,/AOX```!$#[;R0HT<]0````!(8]M,BVPD
+M$$D!W4''10`(````OQ`G``#H`````$B+1"0(3(TD`T&+!"2)!0````")1"1<
+M#0``@`!!B00D2(M4)"A$B?9(B>_H`````$2)]DB)[^@`````0<=%`$0!``"_
+M$"<``.@`````0<<$)`80``A!QT4`M`$``+\0)P``Z`````!!QP0D7W```$''
+M10`(````OQ`G``#H`````,=$)%S_5(``0<<$)/]4``"Z`0```$2)]DB)[^@`
+M````2(M$)"!(C10#BP*)!0`````E___^_XD"QT0D7`4!R`!(`UPD&,<#!0'(
+M`.G[````9F9FD$0/MG0D3T*-'/4`````2&/;3(ML)#A)`=U!QT4`"````+\0
+M)P``Z`````!(BU0D,$R-)!-!BP0DB04`````B40D7`T``(``08D$)$B+5"0H
+M1(GV2(GOZ`````!$B?9(B>_H`````$''10!$`0``OQ`G``#H`````$''!"0&
+M$``(0<=%`+0!``"_$"<``.@`````0<<$)%]P``!!QT4`"````+\0)P``Z```
+M``#'1"1<_U2``$''!"3_5```N@$```!$B?9(B>_H`````$B+1"0@2(T4`XL"
+MB04`````)?___O^)`L=$)%P%`<@`2`-<)!C'`P4!R`"_H(8!`.@`````1(GV
+M2(GOZ`````"#1"1(`0^V1"1/@\`!.$5##X?._?__2(GOZ`````!!BX<$`0``
+MB04`````@\@"B40D7$&)AP0!``!(BU0D0(L"B04`````)?#___T-#0```HE$
+M)%R)`HL"B04`````2(N%Z!```$&)AP@!``"+A>P0``!!B8<,`0``2(N%&!$`
+M`$&)AQ`!``"+A1P1``!!B8<4`0``0<>'(`$````````/MX6\$@``)?\/```-
+M```!`$&)AR`!``!(BX5X$0``08F')`$``(N%?!$``$&)AR@!``!(BX6@$0``
+MQP#_#P``0<>'-`$````````/MX6^$@``)?\/```-```!`$&)AS0!``!(BX6H
+M$0``08F'.`$``(N%K!$``$&)ASP!``!!QX=(`0```````,=$)%P``0``0<>'
+M3`$````!``!!BX<$`0``B04`````@\A908F'!`$``,=$)%S[_P`,0<>'5`$`
+M`/O_``Q!QX=<`0``__\``+H`````2&/"QX2%P`D```````#'1(5T`````(/"
+M`8/Z$'7B9L>%N!(``/\/9L>%NA(``/\/QD5,`;@!````2(/$:%M=05Q!74%>
+M05_#9F9FD&9FD$%7059!54%455-(@^P(28G^28GT3(LO3(GOZ`````!(B<-(
+MA<!U#D'&A"3I`````>FQ````3(GOZ`````!(B<5(A<!U&4'&A"3I`````4B)
+MWDR)[^@`````Z8@```!,C7M8QD,XX<9#.0'&0SH#00^W1"0X9HE#(,:#F```
+M``])BP9(B4,HQT,T``(``$B+51!(B5-(N`````!F9I!F9I#&!!``2(/``4@]
+M``(``'7P2(EK>$C'@Z``````````O@````!,B?_H`````(M3-$B+=1A,B?_H
+M`````$B)WDR)[^@`````2(/$"%M=05Q!74%>05_#9F9FD&9F9I!F9I!!5D%5
+M05154TB#[#!)B?U,BR</MD<-A,`/A,(#```/MO"]`````$#VQ@%U%;H`````
+M@\(!#[;JB?")Z=/XJ`%T\$ACQ4B-%$!(C12028V4U.`2``"+0@2I```"`'0-
+M#0``!``E___]_XE"!$ACQ4B-%$!(C12008N$U.02``"I```$``^$H0(``$F+
+MG"3X"```28V$))`4``!,.>-(#T3828TTU$0/MH[J$@``1`^VAND2```/MH[H
+M$@``00^V5"1!#[:&[Q(``(E$)"`/MH;N$@``B40D&`^VANT2``")1"00#[:&
+M[!(``(E$)`@/MH;K$@``B00DB>Y(Q\<`````N`````#H`````$&X`````$AC
+MQ4B-%$!(C12038V,U.@2``!!#[:$&.@(```\_P^$A`````^VP$AIP,@/``!)
+MB<),`Y.0"0``3(G63(G/N0@```#\\Z8/E\(/DL`XPG5810^V2@1%#[9"`T$/
+MMDH"00^V4@%!#[8R00^V0@>)1"0000^V0@:)1"0(00^V0@6)!"1(Q\<`````
+MN`````#H`````$'&10G_3(GN3(GGZ`````#I*`(``$F#P`%)@_@"#X5=____
+M3(GGZ`````!(B<-(A<`/A`8"``!(8\5(C11`2(T4D$'VA-3E$@``!'0$@$M=
+M`DACQ4B-%$!(C1200?:$U.82```$=`2`2UT02&/%2(T40$B-%)!!]H34Y1(`
+M``AT!(!+701(8\5(C11`2(T4D$'VA-3F$@``"'0$@$M=($ACQ4B-%$!(C120
+M0?:$U.42```"=`2`2UT!2&/%2(T40$B-%)!!]H34YA(```)T!(!+70C&0U@`
+M28G>2&/%2(T40$B-%)!)BX34Z!(``$B)`TR):PA,B>_H`````(B#NP```$&`
+M12@!08!\)$,`=#*Y`````+H`````9F9FD$$/MD4-2-/XJ`%T#@^VPHA,`W"`
+M0UH!@\(!@\$!03A,)$-WW$F+35!(C5,X28E54$F-14A(B4,X2(E+0$B)$4&`
+M15@!#[:+NP```$F+O"2X$```2<?``````$R)\DR)[N@`````Z;8```"I```(
+M``^$JP```$R)Y^@`````2(G#2(7`#X27````QD!+!L9`2@5FQX#(``````#&
+M0$@&QD!)`$C'0'@```4`2&/%2(T40$B-%)!)BX34Z!(``$B)@]0```!(B8/,
+M````3(EK4$R)[^@`````B(/J````9H-+:!!,B>_H`````#P)=@9F@4MH``)!
+MQD4.`4F+56A)B5UH28U%8$B)`TB)4PA(B1I(B=Y,B>?H`````&9FD&9FD$B#
+MQ#!;74%<05U!7L-F9I!!5T%6055!5%532(/L*$B)_4B)\TB%]G05#[9&"83`
+M=`T\_P^%[0<``.E'`0``N0`````/MH0I[@@``#S_=!,/ML!(C12`2(T4D$B-
+MG-7(`0``2(/!`4B#^01UUT&\`````$$/MH0L[@@``#S_=#@/ML!(C12`2(T4
+MD$C!X@-(C9P5R`$``/:$%=(!```"=`^^`````$B)W^@`````ZPA(B=_H````
+M`$F#Q`%)@_P$D'6P#[9%/F8YA9`0```/A5,'``!(A=L/A90```"`?4T`#X5`
+M!P``QD5-`69FD&9FD$B+M-UH!```2(7V=&-(BX:`````2(7`="=(QX:`````
+M`````$C'A-UH!````````$B+OI````"Z_______0ZS!(BX:(````2(7`="1(
+MQX:(`````````$C'A-UH!````````$B+OI````#_T&9F9I!(@\,!2(/[0`^$
+MN`8``.N`QD,)_TB)WDB)[^@`````D.FA!@``N0````!F9I!F9I`/MH0I[@@`
+M`#S_#X0%`0``#[;02(T$DDB-!()(P>`#3(V\!<@!``!(C80%P`$``(!X$?\/
+MA-P```"`>!8`#X13!@``0;P`````2(T$DDB-!()(P>`#3(VL!2@"``!(C1PH
+M3(VSP`$``$R)[^@`````2(G!2(N#,`(``$B)BS`"``!,B2E(B4$(2(D(@'E*
+M_W1O@+GI``````^$^`4```^V04A(B<*#X@9(@_H&=1RH`70Z#[:1@0```$B+
+M<5A,B?_H`````.G,!0``2(/Z!`^%P@4``*@!#X2Z!0``2(G.2(GOZ`````#I
+MJ@4``$B)SDB)[^@`````Z9H%``!F9F:008/$`44X9A8/AH@%``!FD.E3____
+M2(/!`4B#^01F9I`/A=K^__](QT0D$`````"`?4T`#X6E````NP````!FD$B+
+MM-UH!```#[:$*V@(``!(A?9T<DB+CH````!(A<ET9DB#?F``=5\\_W0V#[;X
+M#[?'2(T40$B-%)!(P>(%2(G02`.%0`D``/9`2P1T%(!X20!U#@^WUTB)[^@`
+M````D.LE2,>$W6@$````````2,>&@`````````!(B[Z0````NO______T4B#
+MPP%(@_M`#X5K____QD5-`>FX!```2(M4)!`/MH0J[@@``#S_#X21!```#[;0
+M2(T$DDB-!()(P>`#2(V,!<@!``!(B4PD(("\!=8!````#X1G!```QD0D'P!(
+MC0222(T$@DC!X`-(C90%*`(``$B)%"1,C30H38V^P`$``$B+/"3H`````$B)
+MPTF+AC`"``!)B9XP`@``2(L,)$B)"TB)0PA(B1B`>TK_#X7Y`P``1`^W:SA)
+M8\4/MI0%:`@``&:)5"0.3(NDQ6@$``#V0TP$='9-A>1T<4F#O"2``````'1F
+M28-\)&``=5Z`8TS[]D-+!'02#[=4)`Y,B>9(B>_H`````.M"28N$)(````!)
+M8]5(QX35:`0```````!)QX0D@`````````!(QT-``````$F+O"20````NO__
+M__],B>;_T&9FD&:0]D-+!`^$4P$``,:#Z`````!!@&<4Y_9#3`$/A.@```"`
+M8TS^2(M30$B%TG1%@'M)`'4I]D-+!'0C#[950<'B!D0!ZDACTDB+M?@(``"_
+M!P```.@`````Z=D```!(B[7X"```OP$```#H`````.G#````387D=&5)BXPD
+M@````$B%R718@'M)`'4;]D-+!'05#[=4)`Y,B>9(B>_H`````.F0````26/%
+M2,>$Q6@$````````2<>$)(``````````2,=#0`````!)B[PDD````+K_____
+M3(GF_]'K68![20!U4_9#2P1T30^V54'!X@9$`>I(8])(B[7X"```OP(```#H
+M`````.LM2(M#0$B%P'0D2(N0B````$B%TG082,>`B`````````!(BT-`2(NX
+MD````/_2]D-,`@^$(0(``$B+4T!(B[7X"```OP8```#H`````(!C3/WIX0$`
+M`$B+0T!(A<`/A-0!``!(@[B(``````^$Q@$``,9#2P'&0TH`2(G:O@8```!(
+MBWPD(.@`````2(-[6`!T%TB+4Q!(BT,82(E""$B)$$B+0UB`:%@!@+N#````
+M`'0B9F9FD&9FD$B)[^@`````OP$```#H`````("[@P````!UY4B+NR`!``!(
+MA?]T$0^VLPT!``"Z`0```.@`````2(M[6$B%_W01#[:S@0```+H!````Z```
+M``!,BV-`387D#X3H````]D-,!'5-2(GOZ`````!(BW-`N@$```!(B>_H````
+M`$B+0T`/ME`"#[9P`4C'QP````"X`````.@`````2(M30$B+M?@(``"_`0``
+M`.@`````ZS)!#[94)`)!#[9T)`%(Q\<`````N`````#H`````$B+4T!(B[7X
+M"```OP$```#H`````$F+E"2(````2(72="8/MT,X2,>$Q6@$````````2<>$
+M)(@`````````28N\))````#_TO9#3`)T&4B+4T!(B[7X"```OP8```#H````
+M`(!C3/U(QT-``````$G'1"1@`````$B+4V!(A=)T$`^V@X$```!(QT3"6```
+M``!(BQ-(BT,(2(E""$B)$$&`;Q8!2(G>2(GOZ`````#V0TP"=!Q(BU-`2(NU
+M^`@``+\&````Z`````"`8TS]9F:0@$0D'P$/MDPD'T$X3Q8/A\'[__](@T0D
+M$`%(@WPD$`0/A4C[__^X`0```$B#Q"A;74%<05U!7D%?PV9FD&9FD%532(/L
+M"$B)^TB++^@`````A,!T&0^V=4-`A/9T-`^V4PVY`````/;"`70>ZR3&0PG_
+M2(G>2(GOZ`````#K8I!(B=!(T_BH`74(@\$!0#CQ=>Y(B>_H`````$B)QDB%
+MP'0_2(M3:$B)0VA(C4-@2(D&2(E6"$B),H!##@%(B5Y0QD9(!<9&20#&AH$`
+M```/N0$```"Z`0```$B)W^@`````2(/$"%M=PV9F9I!F9F:02(/L*$B)'"1(
+MB6PD"$R)9"003(EL)!A,B70D($F)_$B)]4B+GH@````/MD9"/"0/AQ(&```/
+MML#_),4`````#[=&3@^WT/;"!'0,9L=&3@$`QD9"`>M#9H/X('4,9L=&3@@`
+MQD9"$>LQA-)Y%?9&20-T#R1_@\@(9HE&3L9&0@WK&/;""'0&QD5"!^L-]L8"
+M=`C&14<`QD5"'DB)[DR)Y^@`````Z9T%``"Y`0```+H"````O@$```!(B>_H
+M`````.F!!0``N0$```"Z`````+X!````2(GOZ`````#I904``+D!````N@$`
+M``"^`0```$B)[^@`````Z4D%``"Y`0```+I@````O@$```!(B>_H`````.DM
+M!0``#[9.2$&X`0```+I@````O@$```!(B>_H`````.D,!0``0;@!````N0``
+M`02Z(0```+X!````2(GOZ`````#IZ@0``$B+0R"!8#3___?_0;@!````N0$`
+M``"Z`@```+X`````2(GOZ`````#IO00``$&X`0```+D`````N@(```"^````
+M`$B)[^@`````OQ`G``#H`````.F1!```2(M#((%@-/__]_]!N`$```"Y`0``
+M`+H"````O@````!(B>_H`````.ED!```0;@!````N0````"Z`@```+X`````
+M2(GOZ`````"_$"<``.@`````Z3@$``"Y`0```+H"````O@````!(B>_H````
+M`.D<!```N0$```"Z`````+X`````2(GOZ`````#I``0``+D!````N@$```"^
+M`````$B)[^@`````Z>0#``!!N`$```"Y_____[H!````O@````!(B>_H````
+M`.G"`P``N0$```"Z`````+X`````2(GOZ`````#II@,```^V1D=,BVS&6$F)
+M75!)B75@#[9&1T&(A8$```!!QD5*`T'&14D`08!-2`6`0PX!2(M3:$B-0V!,
+MB6MH28E%`$F)50A,B2J_@!H&`.@`````08!\)$,`=":]`````/9##0%T#^L9
+M#[9##8GI2-/XJ`%U$8/%`4$X;"1#=^GK!;T`````2(M3((M"-*D```@`=`HE
+M___W_XE"-.MI2(T$[0````!)B<9!@>;X!P``N[@+``!`@/T#=AU)BP0D2`6`
+M`0``3`'PBP")!0````#!Z!.#X`'K'$F+!"1(!8`!``!)C00&BP")!0````#!
+MZ!.#X`&$P'4/O^@#``#H`````(/K`76N9D''A<@``````$R)[DR)Y^@`````
+MZ8@"``"_0`T#`.@`````N0````"Z(````+X!````2(GOZ`````"_$"<``.@`
+M````Z5@"``"Y`````+H!````O@````!(B>_H`````+\0)P``Z`````#I,@(`
+M`$B+0R"!8#3___?_0;@`````N?____^Z`0```+X`````2(GOZ`````"_$"<`
+M`.@`````Z?L!``"Y`````+H`````O@````!(B>_H`````+\0)P``Z`````#I
+MU0$``.@`````Z<L!``!F9F:0Z`````#IO0$``$&X`0```+GP````NIL```"^
+M`0```$B)[^@`````Z9L!``!!N`$```"YH-9:*[K@`P``O@$```!(B>_H````
+M`.EY`0``0;@!````N0#@`P"ZI`,``+X!````2(GOZ`````#I5P$``$&X`0``
+M`+GDJ`8!NL0#``"^`0```$B)[^@`````Z34!``"Y`0```+I(`P``O@$```!(
+MB>_H`````.D9`0``OT`-`P#H`````+D!````NB````"^`0```$B)[^@`````
+MOQ`G``#H`````.GI````0;@!````N0````"Z(0```+X!````2(GOZ`````#I
+MQP```+D!````NF````"^`0```$B)[^@`````Z:L````/MDY(0;@!````NF``
+M``"^`0```$B)[^@`````Z8H```#&0PD`2(N^B````.@`````ZWBY`0```+H!
+M````O@````!(B>_H`````+\0)P``Z`````#K54B+0R"!8#3___?_0;@!````
+MN?____^Z`0```+X`````2(GOZ`````"_$"<``.@`````ZR&Y`0```+H!````
+MO@````!(B>_H`````+\0)P``Z`````"X`0```$B+'"1(BVPD"$R+9"003(ML
+M)!A,BW0D($B#Q"C#9F9FD&9FD$B#[!A(B1PD2(EL)`A,B60D$$B)^TB)]0^W
+M5B!F@?J%``^'C@````^WP@^VA`=H"```//]T?V:#^G]W)`^VP$B-%$!(C120
+M2,'B!4@#ET`)``!(BT)0#[90".M>9F9FD`^W1B!F/8$`=R,/M\`/MH0':`@`
+M`$AIP,@/``!(`X>0"0``2(M`"`^V4`CK+0^W1B`/MH0':`@``$B-!,!(P>`%
+M2`.':`D``$B+@(@````/ME`(ZP6Z_____[G_____9H%]((4`=PP/MT4@#[:,
+M`V@(``!(B[-H"0``#[;"@/K_=!Y(F("\`^X(``#_=!*`^?]T#8!])`9U*F9F
+M9I!F9I!(@WUX`'0,2(UU>$B)W^@`````2(GN2(G?Z`````#I#0$```^VP4B-
+M!,!(P>`%3(TD!D$/MD0D0CP:#X2%````/!IW#CP1#X6[````9F9FD.L3/!MT
+M=SP<#X6I````9I#IG````$B+DQ`1``!(@<),"```00^V1"10P>`(2)A(`<*+
+M"HD-``````^VR4B+DQ`1``!(@<)$"```00^V1"10P>`(2)A(`<*+`HD%````
+M`,'@"`G!08F,)`0!``!!QD0D0AKK0D'&1"1"&^LZ2(N#$!$``$@%3`@``$$/
+MME0D4,'B"$ACTD@!T(L`B04`````@^#W08A$)$A!QD0D0ASK!D'&1"1"'4B#
+M?7@`=`Q(C75X2(G?Z`````!(B>Y(B=_H`````$R)YDB)W^@`````2(L<)$B+
+M;"0(3(MD)!!(@\08PV9F9I!F9I!F9I!F9I!(@^P(2(G^2(L_Z`````!(@\0(
+MPV9F9I!F9F:09F9FD$B#[#A(B5PD"$B);"003(ED)!A,B6PD($R)="0H3(E\
+M)#!)B?](B?-(BVY0#[=V.$ACQKH`````@+P':`@``/\/A#H)```/MD-*/`D/
+MA$X%```\"7=*/`4/A)<````\!7<>/`,/A*T````\!&9F9I`/A>P(``#IT0``
+M`&9FD&:0/`</A*@$```\!V9FD&9FD`^'(P0``.F!`@``9F:09I`\%@^$A0,`
+M`#P69F:09F:0=R,\%`^$T04``#P49F9FD`^'X@(``#P*#X64"```9I#I.P4`
+M`#P:#X0?`@``//^0#X2I!0``/!</A70(``!FD.E-`P``#[9W0T"$]F9F9I`/
+MA(<````/ME4-0;P`````]L(!=&WK=DB+12"!8#3___[_2(M[4+D`````N@$`
+M``!(B=[H`````+\%````Z`````"Z`0```.DT"```N0````"Z`````$B)WDB)
+M[^@`````OU##``#H`````+H!````Z0L(``!(B=!$B>%(T_BH`74108/$`4$X
+M]'7JZP9!O``````/ME-(2(G0@^`&2(/X!G4)]L(!#X7&````2(M5((M"-*D`
+M``$`=`TE___^_XE"-.FK````2HT$Y0````!)B<9!@>;X!P``0;T0)P``D$F+
+M%T&`_`-V%TF-A!:``0``BP")!0`````E```!`.L528V$%H`!``"+`(D%````
+M`"4```$`A<!T+$&`_`-V$TF-A!:``0``QP````$`Z3<'``!)C806@`$``,<`
+M```!`.DD!P``O^@#``#H`````$&#[0%UB\9#2P+&0TK_2(G>3(G_Z`````"Z
+M`0```.D.!P``]D4*`70T2(G>2(GOZ`````"$P'4E0;WZ````2(G>2(GOZ```
+M``"$P'40O^@#``#H`````$&#[0%UX4&`_`-V)DF+!T@%@`$``$J-%.4`````
+M@>+X!P``2`'0BQ")%0````")$.LD28L'2`6``0``2HT4Y0````"!XO@'``!(
+M`="+$(D5`````(D02(M[4$B)WNA(YO__OR!.``#H`````+H!````Z60&``!(
+MQ\<`````N`````#H`````$B+:U!,BV4`3(GGZ`````!(B<%(A<!U$<:#Z0``
+M``&Z`0```.DJ!@``QD`XX<9`.0'&0#H7#[=#.&:)02#&@9@````/2(M%`$B)
+M02C'030`````2,=!2`````!(QX&@`````````$B)SDR)Y^@`````N@$```#I
+MV`4``$C'QP````"X`````.@`````2(MK4$R+90!,B>?H`````$B)P4B%P'41
+MQH/I`````;H!````Z9X%``#&0#CAQD`Y`<9`.A@/MT,X9HE!($B+10!(B4$H
+MQT$T`````$C'04@`````2,>!H`````````!(B<Y,B>?H`````+H!````Z5,%
+M``!(B=Y(B>_H&.7__[H!````Z3X%``!,BV4`3(GGZ`````!(B<(/MDML2(7`
+M=0[&@^D````!L@'I&`4``,9`..'&0#D!QD`Z!8A(.P^W0SAFB4(@2(M%`$B)
+M0BC'0C0`````2,="2`````!(QX*@`````````(A+;TB)UDR)Y^@`````N@$`
+M``#IQP0``$R+90!,B>?H`````$B)P@^V2VY(A<!U#L:#Z0````&R`>FA!```
+MQD`XX<9`.0'&0#H$B$@[#[=#.&:)0B!(BT4`2(E"*,="-`````!(QT)(````
+M`$C'@J``````````B$MQ2(G63(GGZ`````"Z`0```.E0!```3(ME`$R)Y^@`
+M````2(G!2(7`=1'&@^D````!N@$```#I*P0``,9`..'&0#D!QD`Z!@^W0SAF
+MB4$@2(M%`$B)02C'030`````2,=!2`````!(QX&@`````````$B)SDR)Y^@`
+M````N@$```#IX`,``$R+90!,B>?H`````$B)P4B%P'41QH/I`````;H!````
+MZ;L#``#&0#CAQD`Y`<9`.@P/MT,X9HE!($B+10!(B4$HQT$T`````$C'04@`
+M````2,>!H`````````!(B<Y,B>?H`````+H!````Z7`#``!,BV4`3(GGZ```
+M``!(B<%(A<!U$<:#Z0````&Z`0```.E+`P``QD`XX<9`.0'&0#H6QD`\`0^W
+M0SAFB4$@QH&8````#TB+10!(B4$HQT$T`````$C'04@`````2,>!H```````
+M``!(B<Y,B>?H`````+H!````Z?4"``#&0TK_9L>#R```````#[932$B)T(/@
+M!DB#^`9U!?;"`7452(-[8`!U#DB)[^@`````B(/J````@'M+`G4/2(MS4$B)
+MVDR)_^@`````]D4,`G48NP````!,C65@@'T.``^%0`$``.E7`@``2(MU0`^V
+M3D8/MM$/MD8[@^@!.<)]+HU!`8A&1H!&1P'&1D(`#[=&3H/@_H/("&:)1DY,
+MB?_H`````+H!````Z4<"```YPG04NP````!,C65@@'T.`'4IZ1$"``#&1D(`
+M#[=&3H/@]H#,`F:)1DY,B?_H`````+H!````Z0L"``!,B>?H`````$B)P4B+
+M16A(B4UH3(DA2(E!"$B)"(!Y2O]T?("YZ0`````/A+T!```/ME%(2(G0@^`&
+M2(/X!G4B]L(!=$4/MI&!````2(MQ6$B)[^@`````N@$```#IJ0$``$B#^`0/
+MA8$!``#VP@$/A'@!``!(B<Y,B?_H`````+H!````Z8$!``!(B<Y,B?_H````
+M`+H!````Z6P!``#&@>D`````@\,!.%T.#X8[`0``Z4G___]F9F:03(GGZ```
+M``!(B<%(BT5H2(E-:$R)(4B)00A(B0B`>4K_#X20````@'E)``^%?P```("Y
+MZ0`````/A/0````/ME%(2(G0@^`&2(/X!G4B]L(!=$@/MI&!````2(MQ6$B)
+M[^@`````N@$```#IX````$B#^`0/A;@```#VP@%F9I`/A*P```!(B<Y,B?_H
+M`````+H!````Z;4```!(B<Y,B?_H`````+H!````Z:````#&@>D`````@\,!
+M#[9%#CC8#X<Z____.,-U4H3`=$Z[`````$R-96!,B>?H`````$B)PDB+16A(
+MB55H3(DB2(E""$B)$`^V0DD\(G0$/`UU%+X*````2(G7Z`````"Z`0```.L\
+M@\,!.%T.=[O&10G_2(GN3(G_Z`````"Z`0```.L>N@$```#K%T6%[69F9I`/
+MA-_X___I]_C__V9FD&:0B=!(BUPD"$B+;"003(MD)!A,BVPD($R+="0H3(M\
+M)#!(@\0XPV9F9I!F9F:09F:02(/L*$B)7"0(2(EL)!!,B60D&$R);"0@2(G[
+M28GT#[=.(&:!^84`#X?H````#[?!#[:T!V@(``!`@/[_#X33````9H/Y?W<H
+M0`^VUDB+CT`)``!(C0122(T$@DC!X`5(BT0(4`^V0`CK269FD&9FD&:!^8$`
+M=QU`#[;&2(N7D`D``$AIP,@/``!(BT00"`^V0`CK'T`/ML9(BY=H"0``2(T$
+MP$C!X`5(BX00B`````^V0`@\_W1>#[;`#[:L`^X(``!`@/W_=!A`@/[_=!)!
+M#[9,)"2`^09U9V9F9I!F9I!`@/W_="]`@/[_="E`#[;&2(T40$B-%)!(P>(%
+M28G53`.K0`D``$'&14L"0<9%2O_IGP(``$F#?"1X`'0-28UT)'A(B=_H````
+M`$R)YDB)W^@`````Z:4"``!F9I!F9I!`#[;&2(T40$B-%)!(P>(%28G53`.K
+M0`D``$F+5"1(A,D/A+D```!!#[9$)#H\!@^$T````#P,#X3(````00^WE<@`
+M``"-0@%F08F%R````&:#^@EV&T&`?4H&=!1!QD5+`D'&14K_08!E3/[I`P(`
+M`+_H`P``Z`````!!#[952$B)T(/@!DB#^`9U.O;"`70U00^VE8$```!)BW58
+M0`^VQ4B-/(!(C3RX2(V\^\@!``!!N`````"Y`@```.@`````Z=D!``!!QD5*
+M`TR)[DB)W^@`````Z<0!``!F9I!FD$$/MD0D.CP!=0M!QD5*!)#I?P$``#P"
+M=0Q!QD5*!6:0Z6\!```\`P^%SP```$B)UD&`?4H%=2MF@7H$R#=F9I!U($$/
+MMW4X2,?'`````+@`````Z`````!!QD5*!NDR`0``3(GOZ`````!)C;V8````
+MOB@```#H);___X3`=4%)C;V$````OA0```#H$+___X3`=2Q)C;W`````O@@`
+M``#H^[[__X3`=1=)@WUX`'000<9%2A?IV@```&9FD&9FD&9!@[W(````'784
+M0<9%2P)!QD5*_T&`94S^Z;4```"_Z`,``.@`````0<9%2AIF08.%R`````'I
+MF````#P7=0I!QD5*%>F*````/!AF9F:0=0=!QD5*%NM[/`1F9I!FD'4'0<9%
+M2@?K:SP%9F:09I!U!T'&14H(ZUL\!F9FD&:0=0=!QD5*">M+/`QF9I!FD'4'
+M0<9%2@KK.SP69F:09I!U!T'&14H4ZRL\#F9FD&:0=2))@WPD>`!T#4F-="1X
+M2(G?Z`````!,B>9(B=_H`````.LK28-\)'@`=`U)C70D>$B)W^@`````3(GF
+M2(G?Z`````!,B>Y(B=_H`````$B+7"0(2(ML)!!,BV0D&$R+;"0@2(/$*,-F
+M9F:09F9FD$B#["A(B1PD2(EL)`A,B60D$$R);"083(ET)"!)B?Y)B?1(BVY0
+M#[=&.+H`````@+P':`@``/\/A,L"```/MD9*/!0/A,<````\%'<X/`V0#X3[
+M````/`UW#CP%9F9FD`^%G0(``.M-/`YF9I!F9I`/A.\````\#P^%A0(``&:0
+MZ?(````\&P^$E0```#P;D'<0/!AT.3P9#X5E`@``9I#K1#P<=%<\_P^%50(`
+M`&:0Z<8```"^`````$R)YV9FD.@`````N@$```#I.0(``+X!````3(GGZ```
+M``"Z`0```.DB`@``O@$```!,B>?H`````+H!````Z0L"``!(B??H`````+H!
+M````Z?D!``"02(GWZ`````"Z`0```.GF`0``]D9I!'072(GW9F:09I#H````
+M`+H!````Z<D!``!(B??H`````+H!````Z;<!``!(B??H`````+H!````9I#I
+MHP$``$B)]^@`````N@$```#ID0$``,9&2O^`?0X`#X39````NP````!,C6U@
+M9I!,B>_H`````$B)P4B+16A(B4UH3(DI2(E!"$B)"(!Y2O\/A(D```"`>4D`
+M#X6&````@+GI``````^$-0$```^V44A(B="#X`9(@_@&=2+VP@%T2`^VD8$`
+M``!(BW%82(GOZ`````"Z`0```.D(`0``2(/X!`^%^0```/;"`69FD`^$[0``
+M`$B)SDR)]^@`````N@$```#IW0```$B)SDR)]^@`````N@$```#IR````,:!
+MZ0````"#PP$/MD4..-@/ASK___\XPP^%CP```$$/MD0D23PB=!8\#7020;P`
+M````3(UM8(!]#@!U%NMOO@H```!,B>?H`````+H!````ZW9,B>_H`````$B)
+MPTB+16A(B5UH3(DK2(E#"$B)&`^V0TD\(G0$/`UU*$B)WDC'QP````"X````
+M`.@`````O@H```!(B=_H`````+H!````ZR5!@\0!1#AE#G>EQD4)_TB)[DR)
+M]^@`````N@$```#K!;H!````B=!(BQPD2(ML)`A,BV0D$$R+;"083(MT)"!(
+M@\0HPV9FD&9FD&9FD$%7059!54%455-(@^PH28G]#[=6($&X_____T2)P&:!
+M^H4`#X>`````#[?"1`^VA`=H"```1(G`08#X_W1K9H/Z?W<B00^VT$B+CT`)
+M``!(C0122(T$@DC!X`5(BT0(4`^V0`CK0V:!^H$`=QU!#[;`2(N7D`D``$AI
+MP,@/``!(BT00"`^V0`CK'T$/ML!(BY=H"0``2(T$P$C!X`5(BX00B`````^V
+M0`@/ML!!#[:\!>X(``!(C02_2(T$ATF-A,7(`0``2(E$)"!!#[;`2(T40$B-
+M%)!(P>(%28G730.]0`D``$B+3D@/M@'!X!@/ME$!P>(0"=`/ME$#"=`/ME$"
+MP>(("=#!Z`-(C6D(@_@0NA`````/1\*)P$R--,%,.?4/AWP!``#'1"0<````
+M`$B-!+](C02'2,'@`TJ-%"A(B50D$$B!PL`!``!(B50D"$F-A`4H`@``2(D$
+M)&9F9I!(B>_H`````$&)Q$B-=01(Q\<`````N00```#\\Z8/E\(/DL`XP@^%
+M"@$``$&#_!`/AP`!``"#1"0<`8-\)!P!=2)!QX>0`0```0```$6)IY0!``!(
+MBT4`28F'W````.G2````3(GOZ`````!(B<-(A<`/A,L```#&0$L&QD!*!6;'
+M@,@``````,9`2`;&0$D`2,=`>```!0#'@)`!```!````1(F@E`$``$F+A]0`
+M``!(B8/4````28N'U````$B)@\P```!(BT4`2(F#W````$B+1"0@2(E#4$B)
+MQ^@`````B(/J````9H-+:!!(BWPD(.@`````/`EV!F:!2V@``DB+5"0(@$(6
+M`4B+5"002(N",`(``$B)FC`"``!(BQ0D2(D32(E#"$B)&$B)WDR)[^@`````
+M2(/%"$PY]0^&O?[__TB#Q"A;74%<05U!7D%?PV9F9I!F9F:09F:09F:005=!
+M5D%505154TB![$@"``!(B7PD&$B)="00B=!(BU<(2(E4)"!(BPI(B4PD*`^V
+M5UB(5"0W2(GY2(/!2$B)3"0X2#E/2`^$D0(``(!\)#<`#X2&`@``#[;`B40D
+M#$B+?"0XZ`````!,C6#P3(U$)$"+3"0,N@$```!(BW0D($B+?"00Z`````!,
+MC7PD0(!\)$``#X0%`0``0;T`````38VT)-0```!!#[;M2&/%2(G#2,'C!$F-
+M?!]LN@@```!,B?;H`````(3`#X2Q````28U4'V`/MD((@^`/08B$).H```!!
+M#[=,)&AF@>'?_8G(@\@09D&)1"1H#[9"",#H!#P)=0N)R(/(,&9!B40D:$AC
+MQ4C!X`1!#[9$!VC`Z`0\"G4(9D&!3"1H``)(BTPD.$B+40A)C40D$$B)00A)
+MB4PD$$F)5"082(D"0?9$)$P"=$-!@&0D3/U)BU0D0$B%TG0S2(M$)"A(B[#X
+M"```OP8```#H`````.L;9F:09F:008/%`44X+W859F9FD&9FD.D2____13@O
+M#X<D`0``3(GBO@8```!(BWPD(.@`````08"\)(,`````="1F9I!FD$B+?"0H
+MZ`````"_`0```.@`````08"\)(,`````=>%)B[PD(`$``$B%_W0300^VM"0-
+M`0``N@$```#H`````$F+?"182(7_=!-!#[:T)($```"Z`0```.@`````28M$
+M)$!(A<!T;4C'0&``````0?9$)$P$=1Y(BWPD*.@`````28MT)$"Z`0```$B+
+M?"0HZ`````!)BU0D0$B+3"0H2(NQ^`@``+\&````Z`````!)BU0D0$B+1"0H
+M2(NP^`@``+\!````Z`````!)QT0D0`````!)BQ0D28M$)`A(B4((2(D02(M4
+M)""`:@X!2(M,)!B`:5@!3(GF2(M\)"CH`````$B+5"0X2(M$)!A(.5!(=`N`
+M;"0W`0^%@?W__TB!Q$@"``!;74%<05U!7D%?PY!!5T%6055!5%532('L*`(`
+M`$F)_TF)]4B)U4B+!TB)1"001`^VX4B-7"0@28G81(GAN@$```!(B?Y,B>_H
+M`````$2)XDR)[DB)[^@`````3(MU2$F#[A!(C5U(28U&$$@YV'0O00^V1DD\
+M#705/")U,^L/00^V1DD\#70&/")FD'4B0<9&2@5!QD9+!,9$)!X!ZP7&1"0>
+M`(!\)"``=1CIW0$``$V+=A!)@^X028U&$$@YV'6^Z]S&1"0?`$F-5V!(B50D
+M"$R+94A)@^P028U$)!!(.<,/A+P!```/MD0D'TC!X`1,C:P$C````&9F9I!)
+MC;PDU````+H(````3(GNZ`````"$P`^%8`$``$V+9"0028/L$$F-1"002#G8
+M#X1S`0``Z\I!@$<.`<9!2@7&@>@`````QD%+!&;'@<@``````,:!R@````!(
+MQT%X```%``^V?"0?2&/'2,'@!$B-E`2`````#[9"!(A!2`^V0@6(04E,B7E0
+M#[9""(/@#XB!Z@````^W<6AF@>;?_8GP@\@09HE!:`^V0@C`Z`0\"74)B?"#
+MR#!FB4%H2&/'2,'@!`^VA`2(````P.@$/`IU!F:!26@``DB):5A(8\=(P>`$
+M#[:4!(8```"(D8$```!(BX0$C````$B)@=0```!(B8',````@$58`4F+1VA)
+MB4]H2(M4)`A(B1%(B4$(2(D(2(M54$B-01!(B4502(E9$$B)41A(B0(/ME%(
+M2(G0@^`&QD0D'@!(@_@&=3#VP@%T&0^VD8$```!(B>Y,B?_H`````,9$)!X`
+MZQ)(B<Y(BWPD$.@`````QD0D'@"`1"0?`0^V1"0?.$0D(`^'1/[__X!\)!X`
+M="6^"@```$R)]^@`````ZQ9(BWPD$.@`````2(G!2(7`#X5Y_O__2('$*`(`
+M`%M=05Q!74%>05_#D$%7059!54%455-(@>Q(`@``28G]2(ET)"A(BR\/MD<H
+MB$0D-TB-5TA(B50D.$@Y5T@/A*$#``"$P`^$F0,``$B-3"1`2(/!7$B)3"0@
+M2(U$)$!(@\!42(E$)!A(C50D0$B#PD!(B50D$$B-3"1`2(/!$$B)3"0(2(U$
+M)$!(@\`@2(D$)$B+?"0XZ`````!,C6#(0;@`````N0````"Z`````$R)[DB+
+M?"0HZ`````!!B<>$P`^$"P,``$&^`````+L`````B5PD,$&X`````(G9N@$`
+M``!,B>Y(BWPD*.@`````#[;`2,'@!$B#P&1(/0`"```/A[D!``!,C40D0(G9
+MN@$```!,B>Y(BWPD*.@`````N@@```!,B>9(BWPD(.@`````A,`/A(8!``!(
+MBTPD.$B+40A)C40D.$B)00A)B4PD.$F)5"1`2(D"#[9$)$)!B$0D64B+="08
+M3(GOZ``````\_W06#[;`2&G`R`\``$@#A9`)``!)B40D$$6$]G1?#[9$)$/1
+MZ(/@`<'@!$$/ME0D78/B[PG"08A4)%T/MD0D0\'H`X/@`<'@!8/BWPG"08A4
+M)%T/MD0D0\'H`H/@`<'@`X/B]PG"08A4)%T/MD0D1D&(A"2[````Z;D````/
+MMD0D0D&(1"1938EL)`@/MD0D1D&(A"2[````#[=$)$1!B40D8`^WA"20````
+M9D&)A"2X````#[:$))(```!!B(0DN@```$B+A"2`````28F$)*@```!(BU0D
+M$$B+0@A)B80DL````$B+1"1028E$)'A(BTPD"$B+00A)B80D@````$F-E"2(
+M````2(M$)&!)B80DB````$B+#"1(BT$(2(E""$B+01!(B4(02(M$)'A)B80D
+MH````(M,)#!,B>)(BW0D*$R)[^@`````Z?D```!!@\8!@\,!13C^#X0"`0``
+MZ?W]__],B??H`````$B-6/!(B=J^!@```$R)[^@`````@+N#`````'0>9F:0
+M2(GOZ`````"_`0```.@`````@+N#`````'7E2(M#0$B%P'192,=`8`````#V
+M0TP$=1E(B>_H`````$B+<T"Z`0```$B)[^@`````2(M30$B+M?@(``"_`0``
+M`.@`````2(M30$B+M?@(``"_!@```.@`````2,=#0`````!(BQ-(BT,(2(E"
+M"$B)$$&`;0X!08!L)%@!2(G>2(GOZ`````!-.70D2`^%+/___T&`;2@!3(GF
+M2(GOZ`````!(BT0D.$DY14AT(8!L)#<!=!IFD.F__/__38UT)$A-.70D2)`/
+MA?+^___KQ$B!Q$@"``!;74%<05U!7D%?PV9FD&9FD$%7059!54%455-(@>PX
+M`@``2(E\)!A(B?5(BP9(B40D($B)_DB)[^@`````0;@`````N0````"Z````
+M`$B)[DB+?"08Z`````"(1"0OA,`/A&X#``!!OP````!!O@````!(C55(2(E4
+M)`A(C4U@2(D,)$&X`````$2)\;H!````2(GN2(M\)!CH``````^VP$C!X`1(
+M@\!D2#T``@``#X<,`P``3(U$)#!$B?&Z`0```$B)[DB+?"08Z`````!,C60D
+M,$F-="1<2(GOZ``````\_P^%V`(``$B+?"0@Z`````!(B<-(A<`/A.P"``"`
+M12@!QD!8`$F+1"1<2(D#28UT)%1(B>_H`````#S_=!H/ML!(:<#(#P``2(MT
+M)"!(`X:0"0``2(E#$$$/MD0D`HA#64$/MD0D`]'H@^`!P>`$#[9378/B[PG"
+MB%-=00^V1"0#P>@#@^`!P>`%@^+?"<*(4UU!#[9$)`/!Z`*#X`'!X`.#XO<)
+MPHA374B):PA!#[9$)`:(@[L```!)BT0D"$B)0W!!#[9$)`>(0UI!#[=$)`2)
+M0V!!#[=$)%!FB8.X````00^V1"12B(.Z````28M$)$!(B8.H````28M$)$A(
+MB8.P````28M$)!!(B4-X28M$)!A(B8.`````2(V+B````$F-5"0@28M$)"!(
+MB8.(````2(M""$B)00A(BT(02(E!$$F+1"0X2(F#H````$B+55!(C4,X2(E%
+M4$B+3"0(2(E+.$B)4T!(B0)!@#PD``^$:@$``$&]`````$B-<TA(B70D$$B+
+M?"0@Z`````!(B<%(A<`/A&\!``"`10X!QD!*!<:`Z`````#&0$L$2,=`>```
+M!0!FQX#(``````!!#[?]2&/'2,'@!$F-5`1@#[9"!(A!2`^V0@6(04E(B6E0
+M2(E96`^V0@:(@8$````/MD((@^`/B('J````#[=Q:&:!YM_]B?"#R!!FB4%H
+M#[9"",#H!#P)=0F)\(/(,&:)06A(8\=(P>`$00^V1`1HP.@$/`IU"F:!26@`
+M`F9F9I!(8\=(P>`$28M$!&Q(B8'4````2(F!S````(!#6`%(BT5H2(E-:$B+
+M%"1(B1%(B4$(2(D(2(M34$B-01!(B4-02(MT)!!(B7$02(E1&$B)`@^V44A(
+MB="#X`9(@_@&=2;VP@%T%`^VD8$```!(B=Y(B>_H`````.L-2(G.2(M\)"#H
+M`````$&#Q0%!#[8$)&9$.>@/AZS^__]F9F:09F:008/'`4&#Q@%$.GPD+P^%
+MK_S__X!]#@!U$<9%"?](B>Y(BWPD(.@`````2('$.`(``%M=05Q!74%>05_#
+M9F9FD$%7059!54%455-(@^P828G^28GT0;@`````N0````"Z`````.@`````
+M08G%A,!T-KT`````NP````!,C7PD%Y!,B?F)VDR)YDR)]^@`````@'PD%_X/
+MA:X```"#Q0&#PP%$..UUVD$/MD0D6(/H`4&(1"18A,!T>TF++"1!QD0D6`!)
+MBUPD2$B#ZSA)C50D2$B-0SA(.=!T<$B#>Q``=4#K!TB#>Q``=3=!QD0D6`%,
+MB>9,B??H``````^VB[L```!(B[VX$```2<?``````$B)VDR)YN@`````ZRUF
+M9F:02(M;.$B#ZSA(C4,X2#G0=;'K%DR)YDR)]^@`````3(GF3(GWZ`````!(
+M@\086UU!7$%=05Y!7\-F9F:09F9FD$%505154TB#[`A(B?U)B?1,BR^["@``
+M`$R)YDB)[^@`````A,!U#[_H`P``Z`````"#ZP%UXD$/MG5#0(3V="(/ME4-
+MN0````#VP@%T#.L22(G02-/XJ`%U"(/!`4`X\77N28L4)$F+1"0(2(E""$B)
+M$(!M#@%,B>9,B>_H`````/9%#`)T24B+=4!(A?9U&$R)[^@`````2(G&2(7`
+M#X12`0``2(E%0$R)+DB)KH@```#&1D8`QD9'`,9&0@!F@TY.!$R)[^@`````
+MZ28!``!(BT5`2(7`#X2X````2(VPD````$F+?2CH`````$B+=4!,B>_H````
+M`$R-96!,.65@#X2&````3(GGZ`````!(B<-(BT!`2(7`=%E(QT!@`````/9#
+M3`1U&4R)[^@`````2(MS0+H!````3(GOZ`````!(BU-`28NU^`@``+\!````
+MZ`````!(BU-`28NU^`@``+\&````Z`````!(QT-``````(!M#@%(B=Y,B>_H
+M`````$PY96`/A7K___](QT5``````(!]#@!T$DB-?6#H`````$B)P8!M#@'K
+M"TR)[^@`````2(G!2(7)=#E(BU5H2(E-:$B-16!(B0%(B5$(2(D*@$4.`4B)
+M:5#&04@%QD%)`,9!2P;&04H#2(G.3(GOZ`````!(@\0(6UU!7$%=PV9F9I!F
+M9F:09F9FD&9FD$B#["A(B5PD"$B);"003(ED)!A,B6PD($B)^TB)]0^W3B!F
+M@?F%``^'E0````^WP0^VM`=H"```0(#^_P^$@````&:#^7]W*$`/MM9(BX]`
+M"0``2(T$4DB-!()(P>`%2(M$"%`/MD`(ZTEF9I!F9I!F@?F!`'<=0`^VQDB+
+MEY`)``!(:<#(#P``2(M$$`@/MD`(ZQ]`#[;&2(N7:`D``$B-!,!(P>`%2(N$
+M$(@````/MD`(0`^VUCS_=`=F@?K_`'4C2(-]>`!T#$B-=7A(B=_H`````$B)
+M[DB)W^@`````Z3T!```/ML`/MHP#[@@```^WPDB-%$!(C1202,'B!4F)U4P#
+MJT`)``"`?20`#X2M````2(T$B4B-!(%,C:3#P`$``$$/MDPD%0^V53L/MG4Z
+M10^V1"062,?'`````+@`````Z`````!)BU4`28M%"$B)0@A(B1!!@&PD%@%,
+MB>Y(B=_H`````$B)[DB)W^@`````#[9[0T"$_P^$H@```$$/MG0D%;D`````
+M0/;&`74/ZQD/MLI(B?!(T_BH`701B<Y(B=_H`````.MVN@````"#P@%`./IU
+MVNMG9F:09I!(C02)2(T$@4R-I,/(`0``@'TZ`74LOQ`G``#H`````$B)[DB)
+MW^@`````N0$```"Z`````$R)[DR)Y^@`````ZR"_4,,``.@`````2(GN2(G?
+MZ`````!,B>Y,B>?H`````$B+7"0(2(ML)!!,BV0D&$R+;"0@2(/$*,-F9I!F
+MD$%7059!54%455-(@^P(2(G[28GU08G608G/2(L'2(D$)(!_#@!T>;T`````
+M3(UG8$R)Y^@`````2(G"2(M#:$B)4VA,B2)(B4((2(D03#EJ6'4-1#BR@0``
+M`'0-9F9FD(/%`4`X:PYWQT`X:PYT,4&`_U!U*\9"2P;&0DH%QD)(!\9"20!,
+MB6I82(E:4,:"R@````!(B=9(BSPDZ`````!(@\0(6UU!7$%=05Y!7\.02(/L
+M.$B)7"0(2(EL)!!,B60D&$R);"0@3(ET)"A,B7PD,$B)_4F)]`^W5B!F@?J%
+M``^'C@````^WP@^VA`=H"```//]T?V:#^G]W)`^VP$B-%$!(C1202,'B!4@#
+MET`)``!(BT)0#[90".M>9F9FD`^W1B!F/8$`=R,/M\`/MH0':`@``$AIP,@/
+M``!(`X>0"0``2(M`"`^V4`CK+0^W1B`/MH0':`@``$B-!,!(P>`%2`.':`D`
+M`$B+@(@````/ME`(ZP6Z_____[G_____9D&!?"0@A0!W#D$/MT0D(`^VC`5H
+M"```#[;"#[:$!>X(``!(C12`2(T4D$R-M-7(`0``#[;!2(T$P$C!X`5,BZUH
+M"0``20'%08!\)#P"#X6`````00^V1"1`)?````"#^"!T!8/X$'5K00^V5"1`
+MB="#X`^#^`%U*(G1@>'P````0;@!````N@(```"^`````$R)[^@`````Z>,*
+M``!F9I!!#[9%1TF+5,5800^V1"1`)?````"#^"`/E,"#P`B(@NH```!(BT)@
+M9H%@3O_^Z:T*``!!#[9$)"2$P'0[B<-)@WPD>`!T#4F-="1X2(GOZ`````!,
+MB>9(B>_H`````(#[`@^%>`H``$R)[DB)[^@`````Z6@*``!!QX4(`0``````
+M`$$/MD5"/"0/A_,)```/ML#_),4`````28M&(/9`-@@/A!(*``#I-P8``&9F
+MD$B+E1`1``!(@<),"```00^V15#!X`A(F$@!PHL"B04`````@_@%N@4````/
+M1\)!B$4[08!^#P!T#T'&14(`0<9&#P#IBPD``$'&14("Z8$)``!(BY40$0``
+M2('"3`@``$$/MD50P>`(2)A(`<*+`HD%``````^VP&9!B44\2(N5$!$``$B!
+MPD0(``!!#[9%4,'@"$B82`'"BP*)!0````")PL'J"&9!B54^P>`(9D$)13QF
+M@?I`074*0<9%0AGI$`D``&9!@7T^%9>X`P```+HD````#T3"08A%0NGS"```
+M2(N5$!$``$B!PD0(``!!#[9%4,'@"$B82`'"BP*)!0````!!B$4Y2(N5$!$`
+M`$B!PDP(``!!#[9%4,'@"$B82`'"BP*)!0````")P*@(=`=!QD4Z#.L=J`1T
+M!T'&13H+ZQ*#X`)(@_@!&<#WT(/@"D&(13I!#[9%1SP!&<"#X`*#P!1!B$5"
+MZ6<(``!(BX40$0``2`5,"```00^V55#!X@A(8])(`="+`(D%`````(/("$&(
+M14A!QD5"!>DS"```0<9%0@!!#[=%3F8E]_V#R`)F08E%3DF#?"1X`'0-28UT
+M)'A(B>_H`````$R)YDB)[^@`````0<9&"?],B?9(B>_H`````.E%"```0<9%
+M0@3IW@<``$$/MD5'@\`!08A%1T$Z13MS5T'&14(628-\)'@`=`U)C70D>$B)
+M[^@`````3(GF2(GOZ`````!!QX60````@(0>`$G'A:``````````38FMJ```
+M`$F-M9````!(BWTHZ`````#IT@<``$'&14<`0<9%0A>_(*$'`.@`````Z5P'
+M``!!QD5"%.E2!P``0<9%0@CI2`<``$'&14(4Z3X'``!!QD5*`.@`````28F%
+M\````$'&14(5Z2,'``!(BY40$0``2('"3`@``$$/MD50P>`(2)A(`<*+&HD=
+M``````^VVTB+E1`1``!(@<)$"```00^V15#!X`A(F$@!PHL"B04`````Z```
+M``!)B87X````@^,/@_L#=0I!QD5""NF\!@``08N%\`````5`#0,`03F%^```
+M`'D:00^V14H\"G<10<9%0A6#P`%!B$5*Z8T&``!!#[9%1TF#?,58``^$KP$`
+M`$C'!"0`````08!^#@!T0D&_`````$F-7F!(B=_H`````$B)!"1!#[9%1TB+
+M%"1).53%6'0<2(M#"$B)4PA(B1I(B4((2(D008/'`44X?@YWR$&`;@X!2(L,
+M)$B+04!(A<`/A"X!``!(QT!@`````/9!3`1U-TB)[^@`````2(L4)$B+0F#&
+M@!P!```!2(MR0+H!````2(GOZ`````!(BPPD2(M!8,:`'`$```!(BP0D2(M0
+M0$B+M?@(``"_`0```.@`````2(L4)$B+0D!(BXB`````2(7)=#$/MT(X2,>$
+MQ6@$````````2(M"0$C'@(``````````2(MR0$B+OI````"Z_______12(L,
+M)$B+04!(A<!T.$B+D(@```!(A=)T+`^W03A(QX3%:`0```````!(BT%`2,>`
+MB`````````!(BT%`2(NXD````/_22(L4)$B+0D`/ME`"#[9P`4C'QP````"X
+M`````.@`````2(L,)$B+44!(B[7X"```OP8```#H`````$B+!"1(QT!`````
+M`$$/MD5'2<=$Q5@`````2(LT)$B)[^@`````0<9%0@GIPP0``$B+E1`1``!(
+M@<),"```00^V15#!X`A(F$@!PHL*B0T`````#[;)2(N5$!$``$B!PD0(``!!
+M#[9%4,'@"$B82`'"BP*)!0````#!X`@)R$&)151!@'U""G0'J0```0!T"D'&
+M14(+Z5D$``!!QD5"#$$/MD5'28-\Q5@`=%)!@'X.``^$F00``$&_`````$F-
+M7F!(B=_H`````$B)PD$/MD5'23E4Q5AU"$&`;@X!ZRJ02(M#"$B)4PA(B1I(
+MB4((2(D008/'`44X?@YV#>O#2(GOZ`````!(B<)(A=(/A#X$``!!#[9%1TF)
+M5,5800^V14N(@NH```#IQP,``&9F9I!(B>_H`````+\!````Z`````"#ZP&#
+M^_]T"DF+1B#V0#8(=-Q!QD5"">F5`P``2(N5$!$``$B!PDP(``!!#[9%4,'@
+M"$B82`'"BPJ)#0`````/MLE(BY40$0``2('"1`@``$$/MD50P>`(2)A(`<*+
+M`HD%``````^VP,'@"`G()?\/```]$P$```^4PCTC`0``#Y3!A-)U$(3)=0P]
+M,P$``'5"Z4@#``!!QD5"&(32D'0*0<9%2PCI!P,``(3)9I!T"D'&14L)Z?<"
+M```],P$```^%[`(``$'&14L*9F9FD.G>`@``00^V348/MM%!#[9%.X/H`3G"
+M?1:-00%!B$5&08!%1P%!QD5"!^FT`@``0<9%1P!!QD5"'NFE`@``0<9%0@/I
+MFP(``$'&14(B9F:0Z8X"``!!QD5"(^F$`@``0<9%0@/I>@(``$B+E1`1``!(
+M@<),"```00^V15#!X`A(F$@!PHL*B0T`````2(N5$!$``$B!PD0(``!!#[9%
+M4,'@"$B82`'"BQ*)%0````")T,'@"`^VR0G(9CT#$0^%HP```(G0P>@(9CU%
+M4W0*9CU``P^%C@```&9!QT4\`Q%F08E%/F8]15-U'T&`O14!```"=!5!QH45
+M`0```D''A1@!```?````ZR9F08%]/D`#=1U!@+T5`0```W030<:%%0$```-!
+MQX48`0``#_@#`$'&A1P!```!3(GOZ`````!!QH4<`0```$F+10!(B[CX"```
+MO@````#H`````$'&14(#Z7T!``!!QD5"(4'&A14!````Z6L!``!(BY40$0``
+M2('"3`@``$$/MD50P>`(2)A(`<*+`HD%`````$B+E1`1``!(@<)$"```00^V
+M15#!X`A(F$@!PHL"B04`````0<9%0A_I&P$``$'&14(@Z1$!``!(BY40$0``
+M2('"3`@``$$/MD50P>`(2)A(`<*+`HD%`````$B+E1`1``!(@<)$"```00^V
+M15#!X`A(F$@!PHL"B04`````00^V34=!#[9%.XU1`4&(54</MLD/ML"#Z`$Y
+MP;@&````NA\````/3,)!B$5"Z9D```!(BY40$0``2('"3`@``$$/MD50P>`(
+M2)A(`<*+"HD-``````^VR4B+E1`1``!(@<)$"```00^V15#!X`A(F$@!PHL"
+MB04`````P>`("<%!B8T$`0``0<9%0AKK/4'&14(;ZS9(BX40$0``2`5,"```
+M00^V55#!X@A(8])(`="+`(D%`````(/@]T&(14A!QD5"'.L%0<9%0AU)@WPD
+M>`!T#4F-="1X2(GOZ`````!,B>9(B>_H`````$R)[DB)[^@`````ZS!!QD5"
+M&.G"_/__2(GO9F:0Z`````"_`0```.@`````NSY"#P#I`?S__V9F9I!F9I!(
+MBUPD"$B+;"003(MD)!A,BVPD($R+="0H3(M\)#!(@\0XPV9F9I!F9I!F9I!F
+M9I!(@^PX2(E<)`A(B6PD$$R)9"083(EL)"!,B70D*$R)?"0P2(G]2(GS#[=.
+M(&:!^84`#X??````#[?!#[:T!V@(``!`@/[_#X3*````9H/Y?W<B0`^VUDB+
+MCT`)``!(C0122(T$@DC!X`5(BT0(4`^V0`CK0V:!^8$`=QU`#[;&2(N7D`D`
M`$AIP,@/``!(BT00"`^V0`CK'T`/ML9(BY=H"0``2(T$P$C!X`5(BX00B```
-M``^V0`A`#[;6//]T!V:!^O\`=2-(@WUX`'0,2(UU>$B)W^@`````2(GN2(G?
-MZ`````#I/0$```^VP`^VC`/N"```#[?"2(T40$B-%)!(P>(%28G53`.K0`D`
-M`(!])``/A*T```!(C02)2(T$@4R-I,/``0``00^V3"05#[95.P^V=3I%#[9$
-M)!9(Q\<`````N`````#H`````$F+50!)BT4(2(E""$B)$$&`;"06`4R)[DB)
-MW^@`````2(GN2(G?Z``````/MGM#0(3_#X2B````00^V="05N0````!`]L8!
-M=0_K&0^VRDB)\$C3^*@!=!&)SDB)W^@`````ZW:Z`````(/"`4`X^G7:ZV=F
-M9I!FD$B-!(E(C02!3(VDP\@!``"`?3H!=2R_$"<``.@`````2(GN2(G?Z```
-M``"Y`0```+H`````3(GN3(GGZ`````#K(+]0PP``Z`````!(B>Y(B=_H````
-M`$R)[DR)Y^@`````2(M<)`A(BVPD$$R+9"083(ML)"!(@\0HPV9FD&:005=!
-M5D%505154TB#[`A(B?M)B?5!B=9!B<](BP=(B00D@'\.`'1YO0````!,C6=@
-M3(GGZ`````!(B<)(BT-H2(E3:$R)(DB)0@A(B1!,.6I8=0U$.+*!````=`UF
-M9F:0@\4!0#AK#G?'0#AK#G0Q08#_4'4KQD)+!L9"2@7&0D@'QD))`$R):EA(
-MB5I0QH+*`````$B)UDB+/"3H`````$B#Q`A;74%<05U!7D%?PY!(@^PX2(E<
-M)`A(B6PD$$R)9"083(EL)"!,B70D*$R)?"0P2(G]28GT#[=6(&:!^H4`#X>.
-M````#[?"#[:$!V@(```\_W1_9H/Z?W<D#[;`2(T40$B-%)!(P>(%2`.70`D`
-M`$B+0E`/ME`(ZUYF9F:0#[=&(&8]@0!W(P^WP`^VA`=H"```2&G`R`\``$@#
-MAY`)``!(BT`(#[90".LM#[=&(`^VA`=H"```2(T$P$C!X`5(`X=H"0``2(N`
-MB`````^V4`CK!;K_____N?____]F08%\)""%`'<.00^W1"0@#[:,!6@(```/
-MML(/MH0%[@@``$B-%(!(C1203(VTU<@!```/ML%(C03`2,'@!4R+K6@)``!)
-M`<5!@'PD/`(/A8````!!#[9$)$`E\````(/X('0%@_@0=6M!#[94)$")T(/@
-M#X/X`74HB=&!X?````!!N`$```"Z`@```+X`````3(GOZ`````#IXPH``&9F
-MD$$/MD5'28M4Q5A!#[9$)$`E\````(/X(`^4P(/`"(B"Z@```$B+0F!F@6!.
-M__[IK0H``$$/MD0D)(3`=#N)PTF#?"1X`'0-28UT)'A(B>_H`````$R)YDB)
-M[^@`````@/L"#X5X"@``3(GN2(GOZ`````#I:`H``$''A0@!````````00^V
-M14(\)`^'\PD```^VP/\DQ0````!)BT8@]D`V"`^$$@H``.DW!@``9F:02(N5
-M$!$``$B!PDP(``!!#[9%4,'@"$B82`'"BP*)!0````"#^`6Z!0````]'PD&(
-M13M!@'X/`'0/0<9%0@!!QD8/`.F+"0``0<9%0@+I@0D``$B+E1`1``!(@<),
-M"```00^V15#!X`A(F$@!PHL"B04`````#[;`9D&)13Q(BY40$0``2('"1`@`
-M`$$/MD50P>`(2)A(`<*+`HD%`````(G"P>H(9D&)53[!X`AF00E%/&:!^D!!
-M=0I!QD5"&>D0"0``9D&!?3X5E[@#````NB0````/1,)!B$5"Z?,(``!(BY40
-M$0``2('"1`@``$$/MD50P>`(2)A(`<*+`HD%`````$&(13E(BY40$0``2('"
-M3`@``$$/MD50P>`(2)A(`<*+`HD%`````(G`J`AT!T'&13H,ZQVH!'0'0<9%
-M.@OK$H/@`DB#^`$9P/?0@^`*08A%.D$/MD5'/`$9P(/@`H/`%$&(14+I9P@`
-M`$B+A1`1``!(!4P(``!!#[954,'B"$ACTD@!T(L`B04`````@\@(08A%2$'&
-M14(%Z3,(``!!QD5"`$$/MT5.9B7W_8/(`F9!B45.28-\)'@`=`U)C70D>$B)
-M[^@`````3(GF2(GOZ`````!!QD8)_TR)]DB)[^@`````Z44(``!!QD5"!.G>
-M!P``00^V14>#P`%!B$5'03I%.W-70<9%0A9)@WPD>`!T#4F-="1X2(GOZ```
-M``!,B>9(B>_H`````$''A9````"`A!X`2<>%H`````````!-B:VH````28VU
-MD````$B+?2CH`````.G2!P``0<9%1P!!QD5"%[\@H0<`Z`````#I7`<``$'&
-M14(4Z5('``!!QD5"".E(!P``0<9%0A3I/@<``$'&14H`Z`````!)B87P````
-M0<9%0A7I(P<``$B+E1`1``!(@<),"```00^V15#!X`A(F$@!PHL:B1T`````
-M#[;;2(N5$!$``$B!PD0(``!!#[9%4,'@"$B82`'"BP*)!0````#H`````$F)
-MA?@```"#XP^#^P-U"D'&14(*Z;P&``!!BX7P````!4`-`P!!.87X````>1I!
-M#[9%2CP*=Q%!QD5"%8/``4&(14KIC08``$$/MD5'28-\Q5@`#X2O`0``2,<$
-M)`````!!@'X.`'1"0;\`````28U>8$B)W^@`````2(D$)$$/MD5'2(L4)$DY
-M5,58=!Q(BT,(2(E3"$B)&DB)0@A(B1!!@\<!13A^#G?(08!N#@%(BPPD2(M!
-M0$B%P`^$+@$``$C'0&``````]D%,!'4W2(GOZ`````!(BQ0D2(M"8,:`'`$`
-M``%(BW)`N@$```!(B>_H`````$B+#"1(BT%@QH`<`0```$B+!"1(BU!`2(NU
-M^`@``+\!````Z`````!(BQ0D2(M"0$B+B(````!(A<ET,0^W0CA(QX3%:`0`
-M``````!(BT)`2,>`@`````````!(BW)`2(N^D````+K______]%(BPPD2(M!
-M0$B%P'0X2(N0B````$B%TG0L#[=!.$C'A,5H!````````$B+04!(QX"(````
-M`````$B+04!(B[B0````_])(BQ0D2(M"0`^V4`(/MG`!2,?'`````+@`````
-MZ`````!(BPPD2(M10$B+M?@(``"_!@```.@`````2(L$)$C'0$``````00^V
-M14=)QT3%6`````!(BS0D2(GOZ`````!!QD5"">G#!```2(N5$!$``$B!PDP(
-M``!!#[9%4,'@"$B82`'"BPJ)#0`````/MLE(BY40$0``2('"1`@``$$/MD50
-MP>`(2)A(`<*+`HD%`````,'@"`G(08E%5$&`?4(*=`>I```!`'0*0<9%0@OI
-M600``$'&14(,00^V14=)@WS%6`!T4D&`?@X`#X29!```0;\`````28U>8$B)
-MW^@`````2(G"00^V14=).53%6'4(08!N#@'K*I!(BT,(2(E3"$B)&DB)0@A(
-MB1!!@\<!13A^#G8-Z\-(B>_H`````$B)PDB%T@^$/@0``$$/MD5'28E4Q5A!
-M#[9%2XB"Z@```.G'`P``9F9FD$B)[^@`````OP$```#H`````(/K`8/[_W0*
-M28M&(/9`-@ATW$'&14()Z94#``!(BY40$0``2('"3`@``$$/MD50P>`(2)A(
-M`<*+"HD-``````^VR4B+E1`1``!(@<)$"```00^V15#!X`A(F$@!PHL"B04`
-M````#[;`P>`("<@E_P\``#T3`0``#Y3"/2,!```/E,&$TG40A,EU##TS`0``
-M=4+I2`,``$'&14(8A-*0=`I!QD5+".D'`P``A,EFD'0*0<9%2PGI]P(``#TS
-M`0``#X7L`@``0<9%2PIF9F:0Z=X"``!!#[9-1@^VT4$/MD4[@^@!.<)]%HU!
-M`4&(149!@$5'`4'&14('Z;0"``!!QD5'`$'&14(>Z:4"``!!QD5"`^F;`@``
-M0<9%0B)F9I#IC@(``$'&14(CZ80"``!!QD5"`^EZ`@``2(N5$!$``$B!PDP(
-M``!!#[9%4,'@"$B82`'"BPJ)#0````!(BY40$0``2('"1`@``$$/MD50P>`(
-M2)A(`<*+$HD5`````(G0P>`(#[;)"<AF/0,1#X6C````B=#!Z`AF/453=`IF
-M/4`##X6.````9D''13P#$69!B44^9CU%4W4?08"]%0$```)T%4'&A14!```"
-M0<>%&`$``!\```#K)F9!@7T^0`-U'4&`O14!```#=!-!QH45`0```T''A1@!
-M```/^`,`0<:%'`$```%,B>_H`````$'&A1P!````28M%`$B+N/@(``"^````
-M`.@`````0<9%0@/I?0$``$'&14(A0<:%%0$```#I:P$``$B+E1`1``!(@<),
-M"```00^V15#!X`A(F$@!PHL"B04`````2(N5$!$``$B!PD0(``!!#[9%4,'@
-M"$B82`'"BP*)!0````!!QD5"'^D;`0``0<9%0B#I$0$``$B+E1`1``!(@<),
-M"```00^V15#!X`A(F$@!PHL"B04`````2(N5$!$``$B!PD0(``!!#[9%4,'@
-M"$B82`'"BP*)!0````!!#[9-1T$/MD4[C5$!08A51P^VR0^VP(/H`3G!N`8`
-M``"Z'P````],PD&(14+IF0```$B+E1`1``!(@<),"```00^V15#!X`A(F$@!
-MPHL*B0T`````#[;)2(N5$!$``$B!PD0(``!!#[9%4,'@"$B82`'"BP*)!0``
-M``#!X`@)P4&)C00!``!!QD5"&NL]0<9%0AOK-DB+A1`1``!(!4P(``!!#[95
-M4,'B"$ACTD@!T(L`B04`````@^#W08A%2$'&14(<ZP5!QD5"'4F#?"1X`'0-
-M28UT)'A(B>_H`````$R)YDB)[^@`````3(GN2(GOZ`````#K,$'&14(8Z<+\
-M__](B>]F9I#H`````+\!````Z`````"[/D(/`.D!_/__9F9FD&9FD$B+7"0(
-M2(ML)!!,BV0D&$R+;"0@3(MT)"A,BWPD,$B#Q#C#9F9FD&9FD&9FD&9FD$B#
-M[#A(B5PD"$B);"003(ED)!A,B6PD($R)="0H3(E\)#!(B?U(B?,/MTX@9H'Y
-MA0`/A]\````/M\$/MK0':`@``$"`_O\/A,H```!F@_E_=R)`#[;62(N/0`D`
-M`$B-!%)(C02"2,'@!4B+1`A0#[9`".M#9H'Y@0!W'4`/ML9(BY>0"0``2&G`
-MR`\``$B+1!`(#[9`".L?0`^VQDB+EV@)``!(C03`2,'@!4B+A!"(````#[9`
-M"#S_=%L/ML`/MHP%[@@``(#Y_W050(#^_W0/#[9[)$"`_P9U969FD&:0@/G_
-M=#%`@/[_="M`#[;&2(T40$B-%)!(P>(%28G43`.E0`D``$'&1"1+`D'&1"1*
-M_^FZ!P``2(-[>`!T#$B-<WA(B>_H`````$B)WDB)[^@`````Z<<'``!F9F:0
-M9F:00`^VQDB-%$!(C1202,'B!4F)U$P#I4`)``!!#[>T),@```!F@?ZK#7<&
-M0(#_`G4Z2(-[>`!T#$B-<WA(B>_H`````$B)WDB)[^@`````0<9$)$K_0<9$
-M)$L"3(GF2(GOZ`````#I5@<``+H`````0(#_('4>2(M34`^V`H/@?SQQ=@D/
-MME(!@^(/ZP</ME("@^(/1`^VZ4N-1*T`28U$A0!,C;3%R`$```^V0S@\&@^$
-MY@4``#P:=QP\$G1./!60#X2)!@``A,`/A(X%``!FD.F[!@``/"4/A"<#```\
-M)9!W$SP;#X6F!@``9F:09F:0Z5P%```\G@^$%`0``#R@D`^%B@8``.E8!@``
-M0(3_9I`/A<T"``!(BTM(@'LY`&:0=&9(A<ET2X!Y`8!U18!Y`@!U/P^V00,\
-M/'<W#[;028VT)(0```"X`````,8$,"!(@\`!2(/X%'7R@_H4#T/028V\)(0`
-M``")TDB-<03H`````&9!QX0DR```````0<9$)$H9Z0@&``!!QD0D2ACV009`
-M=1$/M@&#X!^#^`T/A9$!``#K"P^V`8/@'X/X#74(0<9$)$D-ZP9!QD0D22)!
-M#[9T)$E(Q\<`````N`````#H`````$B#>W@`=`Q(C7-X2(GOZ`````!(B=Y(
-MB>_H`````$N-1*T`28U$A0"`O,76`0````^$M04``$&^`````$N-1*T`28U$
-MA0!(P>`#3(VD!2@"``!(C1PH3(V[P`$``$R)Y^@`````2(N3,`(``$B)@S`"
-M``!,B2!(B5`(2(D"#[9`23PB=`0\#74*08/&`44X=Q9WRDN-1*T`28U$A0`/
-MMH3%U@$``$0X\`^%/04``(3`#X0U!0``0;P`````9L=$)`8``$&_`````$N-
-M1*T`28U$A0!(P>`#3(VL!2@"``!(C1PH3(VSP`$``$R)[^@`````2(G"2(N#
-M,`(``$B)DS`"``!,B2I(B4((2(D0#[9"23PB=`0\#743#[=".&8[1"0&<@AF
-MB40D!DF)UT&#Q`%%.&86=[1-A?\/A*P$``!!@']*_P^$H00``$'&1TK_3(G^
-M2(GOZ`````#IC`0``(/X`7410<9$)$D!0<9$)$K_Z48$``#V004!9I!T"&9!
-M@4PD:``$2(MS2$B%]G1F28V4))@```"X`````,8$$`!(@\`!2(/X*'7R28V4
-M),````"P`,8$$`!(@\`!2(/X"'7R28V,))@```!(C58(2(M&"$F)A"28````
-M2(M""$B)00A(BT(02(E!$(M&($&)A"3`````08.\))`!````#X6X`P``0<9$
-M)$H<Z:T#``"-1@%F08F$),@```"_$"<``.@`````0<9$)$H%Z8P#``!(BTM(
-M0(3_#X69````#[91!L'B"`^V007!X!`)P@^V00<)P@^V003!X!@)PD&)E"3D
-M````#[81P>(8#[9!`PG"#[9!`L'@"`G"#[9!`<'@$`G0B<))B50D>$&#O"3D
-M`````'4?9D&#A"3(`````;\0)P``Z`````!!QD0D2AOI"0,``(/X_W439D&!
-M3"1H``1!QD0D2AOI\0(``$'&1"1*#>GF`@``0(#_(&:0=2Z`^@9T!8#Z`G4D
-MC48!9D&)A"3(````OQ`G``#H`````$'&1"1*!>FS`@``9F:02(-[>`!T#$B-
-M<WA(B>_H`````$B)WDB)[^@`````3(GB3(GV2(GOZ`````#IKP(``$R+0TA`
-MA/\/A<P```!!#[90"L'B"$$/MD`)P>`0"<)!#[9`"PG"00^V0`C!X!@)PD&)
-ME"3D````00^V2`-(P>$@00^V0`)(P>`H2`G!00^V`$C!X#A("<%!#[9``4C!
-MX#!("<%!#[90!L'B"$$/MD`%P>`0"<)!#[9`!PG"00^V0`3!X!@)PD@)T4F)
-M3"1X0?9`#`%T!V9!@TPD:@1!@[PDY`````!U'V9!@X0DR`````&_$"<``.@`
-M````0<9$)$H;Z;@!``!F08-,)&@!0<9$)$H-Z:8!``!`@/\@9I!U+H#Z!G0%
-M@/H"=22-1@%F08F$),@```"_$"<``.@`````0<9$)$H;Z7,!``!F9I!(@WMX
-M`'0,2(US>$B)[^@`````2(G>2(GOZ`````!,B>),B?9(B>_H`````.EO`0``
-M0<9$)$H4Z30!``!`@/\@=2Z`^@9T!8#Z`G4DC48!9D&)A"3(````OQ`G``#H
-M`````$'&1"1*%.D#`0``9F:00<9$)$H;Z?4```!`A/]FD'5M2(M#2&9!@TPD
-M:`)F08-,)&H!9D&!3"1HA`"`>`,`=06`.!9W'V9!@X0DR`````&_$"<``.@`
-M````0<9$)$H-Z:H```#V0`8$=`EF08-,)&H"ZP=F08-D)&K]2(M#>$F)1"0P
-M2,=#>`````#K.$"`_R!U*X#Z!G0(@/H"9F:0=26-1@%F08F$),@```"_$"<`
-M`.@`````0<9$)$H%ZU!F08-D)&CY0<9$)$H.ZT%`A/]U!V9!@TPD:@-!QD0D
-M2@_K+4"$_W4+2(G>2(GOZ`````!!@[PDD`$```$9P(/@$X/`!4&(1"1*9F9F
-MD&9FD$B#>W@`=`Q(C7-X2(GOZ`````!(B=Y(B>_H`````$R)YDB)[^@`````
-M9F9FD&9FD$B+7"0(2(ML)!!,BV0D&$R+;"0@3(MT)"A,BWPD,$B#Q#C#D)"0
-MD)"0D)"0D)"0D(/B!\'B"(#.($B+1PA(+>0\``!(P>8(@>8`_P``2`'PB1`/
-MMP!FB04`````#[;`PX/B!\'B"(C*@,X02(M'"$@MY#P``$C!Y@B!Y@#_``!(
-M`?")$,-F9F:09F9FD&9FD%53O0````!!N?____^[`````$&[`````$6)VD&#
-MPP&X`0```$&)P$2)V4'3X$2)P;X`````N,#AY`"Z`````/?Q.?AW$8GZ*<)$
-M.<IS"(GU08G11(G3@\8!1`'!@_X0==1!@_L(=;&-!.T`````"=@/ML!;7<-F
-M9F:09F:09F:02(/L$$B)'"1,B60D"$F)_$`/MMZY`````+H'````B=[H*___
-M_T$/MHPD01(``+H#````B=Y,B>?H$____TB+'"1,BV0D"$B#Q!##9F:09I!3
-MB?,/MO*Z`P```.C`_O__.-@/E,`/ML!;PV9FD&9FD$B%_W0WN@````!F9I!F
-M9I`/MH0ZZ@@```^VR#S_=!,/M\%(C03`2,'@!4@#AV@)``##2(/"`4B#^@1U
-MU+@`````PV9F9I!F9F:09F:09F:055-(BY\`"0``2(7;2`]$W[T`````N0``
-M``"Z!P```(GN2(G?Z&?^__^Y1````+H"````B>Y(B=_H4_[__[G0````N@``
-M``")[DB)W^@__O__N0````"Z!````(GN2(G?Z"O^__^#Q0&#_0)UJ+^@A@$`
-MZ$G^__^(@T$2```/MLBZ`P```+X`````2(G?Z/[]__];7<-F9F:09F9FD&9F
-MD$%455-(B?L/MH<5`0``/`(/A;(```!$BY<8`0``0;P`````O0```"I!N0``
-M``"^`````+\`````0;@$````9I"Z`0```(G0B?'3X$&%PG48C4X&T^)!"=1!
-M"=&X%0```(GYT^`)Q>L)1(G`B?G3X`G%@\8!@\<%08/``X/^!77`1(G)NJ@#
-M``!`M@%(B=_H`````(GINL0#``"^`0```$B)W^@`````00^WS`N+&`$``+J@
-M`P``O@$```!(B=_H`````.FX````/`,/A;````!$BY<8`0``0;P`````O0``
-M`"I!N0````"^`````+\`````0;@$````N@$```")T(GQT^!!A<)U&(U.!M/B
-M00G400G1N!4```")^=/@"<7K"42)P(GYT^`)Q8/&`8/'!4&#P`.#_@1UP$2)
+M``^V0`@\_W1;#[;`#[:,!>X(``"`^?]T%4"`_O]T#P^V>R1`@/\&=65F9I!F
+MD(#Y_W0Q0(#^_W0K0`^VQDB-%$!(C1202,'B!4F)U$P#I4`)``!!QD0D2P)!
+MQD0D2O_IN@<``$B#>W@`=`Q(C7-X2(GOZ`````!(B=Y(B>_H`````.G'!P``
+M9F9FD&9FD$`/ML9(C11`2(T4D$C!X@5)B=1,`Z5`"0``00^WM"3(````9H'^
+MJPUW!D"`_P)U.DB#>W@`=`Q(C7-X2(GOZ`````!(B=Y(B>_H`````$'&1"1*
+M_T'&1"1+`DR)YDB)[^@`````Z58'``"Z`````$"`_R!U'DB+4U`/M@*#X'\\
+M<78)#[92`8/B#^L'#[92`H/B#T0/MNE+C42M`$F-1(4`3(VTQ<@!```/MD,X
+M/!H/A.8%```\&G<</!)T3CP5D`^$B08``(3`#X2.!0``9I#INP8``#PE#X0G
+M`P``/"60=Q,\&P^%I@8``&9FD&9FD.E<!0``/)X/A!0$```\H)`/A8H&``#I
+M6`8``$"$_V:0#X7-`@``2(M+2(![.0!FD'1F2(7)=$N`>0&`=46`>0(`=3\/
+MMD$#/#QW-P^VT$F-M"2$````N`````#&!#`@2(/``4B#^!1U\H/Z%`]#T$F-
+MO"2$````B=)(C7$$Z`````!F0<>$),@``````$'&1"1*&>D(!@``0<9$)$H8
+M]D$&0'41#[8!@^`?@_@-#X61`0``ZPL/M@&#X!^#^`UU"$'&1"1)#>L&0<9$
+M)$DB00^V="1)2,?'`````+@`````Z`````!(@WMX`'0,2(US>$B)[^@`````
+M2(G>2(GOZ`````!+C42M`$F-1(4`@+S%U@$````/A+4%``!!O@````!+C42M
+M`$F-1(4`2,'@`TR-I`4H`@``2(T<*$R-N\`!``!,B>?H`````$B+DS`"``!(
+MB8,P`@``3(D@2(E0"$B)`@^V0$D\(G0$/`UU"D&#Q@%%.'<6=\I+C42M`$F-
+M1(4`#[:$Q=8!``!$./`/A3T%``"$P`^$-04``$&\`````&;'1"0&``!!OP``
+M``!+C42M`$F-1(4`2,'@`TR-K`4H`@``2(T<*$R-L\`!``!,B>_H`````$B)
+MPDB+@S`"``!(B9,P`@``3(DJ2(E""$B)$`^V0DD\(G0$/`UU$P^W0CAF.T0D
+M!G((9HE$)`9)B==!@\0!13AF%G>T387_#X2L!```08!_2O\/A*$$``!!QD=*
+M_TR)_DB)[^@`````Z8P$``"#^`%U$4'&1"1)`4'&1"1*_^E&!```]D$%`6:0
+M=`AF08%,)&@`!$B+<TA(A?9T9DF-E"28````N`````#&!!``2(/``4B#^"AU
+M\DF-E"3`````L`#&!!``2(/``4B#^`AU\DF-C"28````2(U6"$B+1@A)B80D
+MF````$B+0@A(B4$(2(M"$$B)01"+1B!!B80DP````$&#O"20`0````^%N`,`
+M`$'&1"1*'.FM`P``C48!9D&)A"3(````OQ`G``#H`````$'&1"1*!>F,`P``
+M2(M+2$"$_P^%F0````^V40;!X@@/MD$%P>`0"<(/MD$'"<(/MD$$P>`8"<)!
+MB90DY`````^V$<'B&`^V00,)P@^V00+!X`@)P@^V00'!X!`)T(G"28E4)'A!
+M@[PDY`````!U'V9!@X0DR`````&_$"<``.@`````0<9$)$H;Z0D#``"#^/]U
+M$V9!@4PD:``$0<9$)$H;Z?$"``!!QD0D2@WIY@(``$"`_R!FD'4N@/H&=`6`
+M^@)U)(U&`69!B80DR````+\0)P``Z`````!!QD0D2@7ILP(``&9FD$B#>W@`
+M=`Q(C7-X2(GOZ`````!(B=Y(B>_H`````$R)XDR)]DB)[^@`````Z:\"``!,
+MBT-(0(3_#X7,````00^V4`K!X@A!#[9`"<'@$`G"00^V0`L)PD$/MD`(P>`8
+M"<)!B90DY````$$/MD@#2,'A($$/MD`"2,'@*$@)P4$/M@!(P>`X2`G!00^V
+M0`%(P>`P2`G!00^V4`;!X@A!#[9`!<'@$`G"00^V0`<)PD$/MD`$P>`8"<)(
+M"=%)B4PD>$'V0`P!=`=F08-,)&H$08.\).0`````=1]F08.$),@````!OQ`G
+M``#H`````$'&1"1*&^FX`0``9D&#3"1H`4'&1"1*#>FF`0``0(#_(&:0=2Z`
+M^@9T!8#Z`G4DC48!9D&)A"3(````OQ`G``#H`````$'&1"1*&^ES`0``9F:0
+M2(-[>`!T#$B-<WA(B>_H`````$B)WDB)[^@`````3(GB3(GV2(GOZ`````#I
+M;P$``$'&1"1*%.DT`0``0(#_('4N@/H&=`6`^@)U)(U&`69!B80DR````+\0
+M)P``Z`````!!QD0D2A3I`P$``&9FD$'&1"1*&^GU````0(3_9I!U;4B+0TAF
+M08-,)&@"9D&#3"1J`69!@4PD:(0`@'@#`'4%@#@6=Q]F08.$),@````!OQ`G
+M``#H`````$'&1"1*#>FJ````]D`&!'0)9D&#3"1J`NL'9D&#9"1J_4B+0WA)
+MB40D,$C'0W@`````ZSA`@/\@=2N`^@9T"(#Z`F9FD'4EC48!9D&)A"3(````
+MOQ`G``#H`````$'&1"1*!>M09D&#9"1H^4'&1"1*#NM!0(3_=0=F08-,)&H#
+M0<9$)$H/ZRU`A/]U"TB)WDB)[^@`````08.\))`!```!&<"#X!.#P`5!B$0D
+M2F9F9I!F9I!(@WMX`'0,2(US>$B)[^@`````2(G>2(GOZ`````!,B>9(B>_H
+M`````&9F9I!F9I!(BUPD"$B+;"003(MD)!A,BVPD($R+="0H3(M\)#!(@\0X
+MPY"0D)"0D)"0D)"0D)"#X@?!X@B`SB!(BT<(2"WD/```2,'F"('F`/\``$@!
+M\(D0#[<`9HD%``````^VP,.#X@?!X@B(RH#.$$B+1PA(+>0\``!(P>8(@>8`
+M_P``2`'PB1##9F9FD&9F9I!F9I!54[T`````NP````!!N?____]!NP````!%
+MB=I!@\,!N`$```!!B<!$B=E!T^!$B<&^`````+C`X>0`N@````#W\3GX=Q&)
+M^BG"1#G*<PA$B=6)\T&)T8/&`40!P8/^$'7408/["'6QC03=``````GH#[;`
+M6UW#9F9FD&9FD&9FD$B#[!!(B1PD3(ED)`A)B?Q`#[;>N0````"Z!P```(G>
+MZ"O___]!#[:,)$$2``"Z`P```(G>3(GGZ!/___](BQPD3(MD)`A(@\00PV9F
+MD&:04XGS#[;RN@,```#HP/[__SC8#Y3`#[;`6\-F9I!F9I!(A?]T-[H`````
+M9F:09F:0#[:$.NH(```/ML@\_W03#[?!2(T$P$C!X`5(`X=H"0``PTB#P@%(
+M@_H$==2X`````,-F9F:09F9FD&9FD&9FD%532(N?``D``$B%VT@/1-^]````
+M`+D`````N@<```")[DB)W^AG_O__N40```"Z`@```(GN2(G?Z%/^__^YT```
+M`+H`````B>Y(B=_H/_[__[D`````N@0```")[DB)W^@K_O__@\4!@_T"=:B_
+MH(8!`.A)_O__B(-!$@``#[;(N@,```"^`````$B)W^C^_?__6UW#9F9FD&9F
+M9I!F9I!!5%532(G[#[:'%0$``#P"#X6R````1(N7&`$``$&\`````+T````J
+M0;D`````O@````"_`````$&X!````&:0N@$```")T(GQT^!!A<)U&(U.!M/B
+M00G400G1N!4```")^=/@"<7K"42)P(GYT^`)Q8/&`8/'!4&#P`.#_@5UP$2)
MR;JH`P``0+8!2(G?Z`````")Z;K$`P``O@$```!(B=_H`````$$/M\P+BQ@!
-M``#WT;J@`P``O@$```!(B=_H`````&9FD%M=05S#9F9FD&9F9I!F9I!(@^P(
-MB?&$TG06N/[____3P"&'&`$``.L49F9FD&9FD+@!````T^`)AQ@!``#H````
-M`$B#Q`C#9F:09F:09F:02(/L"`^W]L'F"(U.#T&X`0```+J:````O@$```#H
-M`````$B#Q`C#9F:09F:09F:02(/L"(GQA-)T%KC^____T\!F(8<``0``ZQ1F
-M9I!F9I"X`0```-/@9@F'``$```^WMP`!``#H`````$B#Q`C#D$B#["A(B1PD
-M2(EL)`A,B60D$$R);"083(ET)"!(B?U!B=8/MI[,````1`^V;@)(BWYP2(7_
-M=`P/MM)!#[;UZ`````!(B>_H`````(#[!W=(#[;#_R3%`````$&\^P```.LV
-M0;PS````ZRY!O#L```#K)D&\<P```.L>0;Q[````ZQ9!O+,```#K#D&\NP``
-M`.L&0;SS````1(GF2(GOZ`````!!#[;608UTG0!`#[;V2(GOZ`````!(BQPD
-M2(ML)`A,BV0D$$R+;"083(MT)"!(@\0HPV9F9I!F9F:09F:005154TF)_+L`
-M````0`^V[KH"````B>Y,B>?H@?K__Z@(=`VX`````.L@9F:09F:0OP$```#H
-M`````(/#`8'[$"<``'7+N/\```!;74%<PY!(@^PH2(E<)`A(B6PD$$R)9"08
-M3(EL)"!(B?U)B<U!B=1`#[;>B=[HA/___X7`=3!!#[;TB=I(B>_H0OO__X7`
-M=!ZZ`0```(G>2(GOZ/_Y__]!B$4`N`````#K"69F9I"X_____TB+7"0(2(ML
-M)!!,BV0D&$R+;"0@2(/$*,-FD$B#["A(B5PD"$B);"003(ED)!A,B6PD($B)
-M_4&)S40/MN)`#[;>1(GAN@$```")WNC+^?__N4````"Z`@```(G>2(GOZ+?Y
-M__^)WDB)[^C=_O__A<!U3$6%[70T0?;$`705B=J^0````$B)[^B/^O__A<!T
-M+NLSB=J^&````$B)[^AZ^O__A<!T&>L>9F9FD(G:OB@```!(B>_H8?K__X7`
-M=0>X_P```.L&N`````"02(M<)`A(BVPD$$R+9"083(ML)"!(@\0HPV9F9I!F
-M9I!!5T%6055!5%532(/L"$F)_4B)#"1%B<:)\XG5A-(/A/$```!$#[;^N60`
-M``"Z`@```$2)_NCV^/__1(G^3(GOZ!O^__^%P'40N@,```!$B?Y,B>_HI_C_
-M_T`/MM6Y`0```$2)_DR)[^C#_O__0;S_____A,`/A8,!``!!O`````!%A?8/
-MCG0!``!(BQPD0;P`````08UN_T0YY74UN4````"Z`@```$2)_DR)[^A^^/__
-M26/,2`,,)+I8````1(G^3(GOZ.?]__^%P'0UZ2P!``"Y1````+H"````1(G^
-M3(GOZ$GX__](B=FZ4````$2)_DR)[^BV_?__A<`/A?P```!!@\0!2(/#`44Y
-M]`^$ZP```.N#OZ"&`0#H0?C__P^VZP^VR+H#````B>Y,B>_H_/?__XGN3(GO
-MZ"+]__^%P'0B00^VC4$2``"Z`P```(GN3(GOZ-?W__]!O/_____IF@```(GJ
-MOF````!,B>_HO?C__X7`=`U!O`````!%A?9^9>L?00^VC4$2``"Z`P```(GN
-M3(GOZ)7W__]!O/_____K6TB+'"1!O`````!F9I"Y1````+H"````B>Y,B>_H
-M;/?__TB)V;J`````B>Y,B>_HVOS__X7`=0U!@\0!2(/#`44Y]'7)00^VC4$2
-M``"Z`P```(GN3(GOZ#+W__]$B>!(@\0(6UU!7$%=05Y!7\-(@^P82(E<)`A,
-MB60D$$F)_$B)T$`/MM9!B<A(B<&^`````.C(_?__B<.Y5````+H"````O@``
-M``!,B>?HW_;__XG82(M<)`A,BV0D$$B#Q!C#9F9FD&9F9I!F9I!F9I!(@^P8
-M2(E<)`A,B60D$$F)_$B)T$`/MM9!B<A(B<&^`0```.AH_?__B<.Y5````+H"
-M````O@$```!,B>?H?_;__XG82(M<)`A,BV0D$$B#Q!C#9F9FD&9F9I!F9I!F
-M9I!!5D%505154TF)_4B)S46)QHG31`^VYKED````N@(```!$B>;H-_;__T2)
-MYDR)[^A<^___A<!U$+H#````1(GF3(GOZ.CU__\/MM.Y`0```$2)YDR)[^@%
-M_/__A,!U-D6%]GXX2(GKO0````!F9F:0#[83N0````!$B>9,B>_HW?O__X3`
-M=0Z#Q0%(@\,!1#GU=`GKV[C_____ZP6X`````%M=05Q!74%>PV9FD&9FD$B#
-M[!A(B5PD"$R)9"0028G\2(G00`^VUD&)R$B)P;X!````Z"C___^)P[E4````
-MN@(```"^`0```$R)Y^AO]?__B=A(BUPD"$R+9"002(/$&,-F9F:09F9FD&9F
-MD&9FD$B#[`A(BX<`"0``2(7`2`]$QT"(-0````"Y(````$C'P@````"^#@``
-M`$B)Q^@`````2(/$",-F9I!F9I!F9I!(@^P(B?&$TG06N`$```#3X&8)AVP4
-M``#K%&9FD&9FD+C^____T\!F(8=L%```#[:W;!0``.@`````2(/$",.005=!
-M5D%505154TB#[%A(B?M)B?9(BTXH2(/!`HMV'(/N`<=$)%0`````28M&,$B)
-M1"0P28M&*`^V40&`^@%U$$''1E``````Z?,$``!F9I"`^@)U28!Y`@%U-DB+
-MAP`)``!(A<!(#T3'2(N0^`@```^V00.(@FX4```/MD$#B(+^*```0<=&4```
-M``#IKP0``$''1E#^____Z:($``!,C7@!@/H$#X7U`0``#[9!`X/H.SP!#X?F
-M`0``00^V;P)(BY_X"```0`^V]4B)W^@`````B<*$P'0-#[;`@+P#:`@``/]U
-M4$B+F_@(``!(@<.0%```2(N[^`@``.@`````B>HHP@^V\DB)W^@`````B<*$
-MP'0-#[;`@+P#:`@``/]U%$''1E#_____3(GW0?]62.DA!```#[;"#[:$`V@(
-M``"`^H%W9`^VR$AIR<@/``!!#[9W!$$/ME<%P>(000^V1P;!X`@)PD$/MD<'
-M"<*)5"0\00^V5PC!XA!!#[9'"<'@"`G"00^V1PH)PHE4)$!(B<U(`ZN0"0``
-M#X3I````@'U8`'49Z=X```!!QT90_____TR)]T'_5DCIF0,``$&\`````,9$
-M)$<`3(UM2(M$)#Q(B40D&$F-5PM(B50D$$`/MO:)="0,3(GOZ`````!(C5CP
-M2(M54$B)15!,B6L02(E3&$B)`@^V0TD\#70$/")U74$/MD<#/#MT(CP\=5!-
-MB?"+3"0\BU0D0(MT)`Q(B=_H`````,9$)$<!ZS)(B[LH`0``2(M4)!A(BW0D
-M$.@`````38GPBTPD/(M4)$"+="0,2(G?Z`````#&1"1'`4&#Q`%$.&58#X=J
-M____@'PD1P`/A<\"``!!QT90_____TR)]T'_5DCINP(``&9FD&:0@/H##X6<
-M````@'D"`69FD`^%@@````^V0SZ--``/MGD#B?J)^,'Z'_?^B=4YUGY;3(UI
-M!$0/MN(/ME$$1(GF2(G?Z`````"-1?R#^`-V&(U%](/X`W80C47L@_@#=@B-
-M1>2#^`-W!TB!PY`4``!!#[95`$2)YDB)W^@`````0<=&4`````#I%0(``$''
-M1E#^____Z0@"``!!QT90_O___^G[`0``@#D%=CF`>03^9I!U,4B-5"142(N[
-M^`@``$R)]N@`````A,`/A=(!``#'1"14`````$''1E#_____Z;T!``!,BZL`
-M"0``387M3`]$ZTB)R[@"````2"G(2(E$)"A(8_9(B70D(.GG````9I`/MBM,
-MC6(!#[;0]L(!=&F+3"14B>N-1`T`03M&(`^'3`$``$&`/P%U)XG)2`-,)#!!
-MB>B^`0```$R)[^BP]___.>AT*^DF`0``9F9FD&9FD(G)2`-,)#!!B>B^````
-M`$R)[^B)]___.>@/A0`!```!7"143(GCZVU(8\5*C1P@2(M$)"A(`=A(.T0D
-M(`^/W0```$&`/P%U'$&)Z$R)X;X!````3(GOZ!7Z__^%P'0@Z;L```!!B>A,
-MB>&^`````$R)[^CY^?__A<`/A:````"`.P!U!H![`0!T"[\0)P``D.@`````
-M2(U3`0^V0P&$P`^%"____P^V`X3`='L/MMBY5````+H"````O@````!,B>_H
-M"O#__XM4)%1!BT8@*=`YPP]'V$&`/P%U'HG12`-,)#!!B=BZ`````+X!````
-M3(GOZ*GV___K'(G12`-,)#!!B=BZ`````+X`````3(GOZ(OV__^%P'@&`40D
-M5.L(0<=&4/____^Y5````+H"````O@````!,B>_HDN___V:028M6.$B%TG0&
-MBT0D5(D"3(GW0?]62$B#Q%A;74%<05U!7D%?PV9F9I!F9F:09F:02(/L"$B+
-MAP`)``!(A<!(#T3'2(NX^`@```^VAV\4``"$P'0-@^@!B(=O%```A,!U'<8%
-M``````"Y(````$C'P@````"^#@```.@`````2(/$",-F9F:09F:09F:09F:0
-M2(/L"$B+AP`)``!(A<!(#T3'2(NX^`@``("_;A0```!U)("';Q0```'&!0``
-M```!N2````!(Q\(`````O@X```#H`````$B#Q`C#9F:09I!(@^P82(E<)`A,
-MB60D$$F)_$B)T$`/MM9!B<A(B<&^`````.@H^/__B<.Y5````+H"````O@``
-M``!,B>?H;^[__XG82(M<)`A,BV0D$$B#Q!C#D)"0D)"0D)"0D)"0D)")]DB+
-M1PA(+0`"`0!(`<:+!HD%`````,-F9F:09F9FD(GV2(M'"$@M``(!`$@!QHD6
-MPV9F9I!F9F:09F:09F:04TB)^TB+5PA(@>H``@$`QX*```$``````(N"!`$!
-M`(D%`````(#,`8F"!`$!`+H$````O@S"``#H`````+JX"P``O@C"``!(B=_H
-M`````+H!``P`O@#"``!(B=_H`````+H$````O@S#``!(B=_H`````+JX"P``
-MO@C#``!(B=_H`````+H!``P`O@##``!(B=_H`````$B+0PA(+;0!``!FQP``
-M`$B+0PA(+90!```/MP!FB04`````#[?`2(M3"$B!ZI0!``"#R`1FB0)(BT,(
-M2"V8`0``9L<`!`!FQX-L%```__];PV9F9I!F9F:02(M7"$B!Z@`"`0"+@FP`
-M`0")!0`````,R(F";``!`,-(BU<(2('J``(!`(N":``!`(D%`````"0W"?")
-M@F@``0##9F9FD&9F9I!F9I!F9I!32#F_^`@``'5HB?#`Z`)!NP````!$#[;0
-M26/:B?"#X`-$C0Q`N`<```!$B<G3X/?01(M$GU1!(<!$B42?5(32=`ZX!```
-M`-/@1`G`B42?5$ECPHM4AU1!#[;SP>8(@<90P@``2(N_^`@``.@`````6\.)
-M\,#H`H/H!$&[`0```.N39F9FD&9F9I!F9I!F9I!!5T%6055!5%532(/L"$B)
-M_4&)]D&)UT&)S4B+1PA,BR!,B>?H`````$B)PTB%P`^$ZP```$R)Y^@`````
-M2(G"2(7`#X37````QD5<`<9#..'&0SD!QD,Z$,9#);L/MD5;9HE#($R)8RC'
-M0S20````2(U"$$B)0TA(B5-X2(G!2(G"N`````#&!!``2(/``4@]D````'7P
-MQD$!@L8!0$2(<0)$B'D#1(AI!$&`_0)W(4B->0A*C12M`````('B_`,``$F-
-MM"2H$@``Z`````#K*TF+A"2H$@``2(E!"$B->1!!#[;5C125^/___TACTDF-
-MM"2P$@``Z`````!(QX.@`````````$B->UB^`````.@`````2(G>3(GGZ```
-M``!(@\0(6UU!7$%=05Y!7\.02(/L.$B)7"0(2(EL)!!,B60D&$R);"0@3(ET
-M)"A,B7PD,$B)_4&)]4&)UD&)STB+1PA,BR!,B>?H`````$B)PTB%P'1[3(GG
-MZ`````!(B<)(A<!T:\9%7`'&0SCAQD,Y`<9#.A#&0R6[#[9%6V:)0R!,B6,H
-MQT,TD````$B-0A!(B4-(2(E3>,9``0+&0A!`1(AH`D2(<`-$B'@$2,>#H```
-M``````!(C7M8O@````#H`````$B)WDR)Y^@`````2(M<)`A(BVPD$$R+9"08
-M3(ML)"!,BW0D*$R+?"0P2(/$.,-F9F:09F:09F:09F:0059!54%455-(B?M!
-MB?5!B=9(BT<(2(LHN0(```"Z`````+X`````Z`````"`>UP`=!A(B>_H````
-M`+\!````Z`````"`>UP`=>A(BT,(2(L`2`6H$@``@'@"`'@[@$@"@+D!````
-MN@````"^`````$B)W^@`````@'M<`'0:9I!(B>_H`````+\!````Z`````"`
-M>UP`=>A$B>C`Z`)$#[;@N0$```!$B>*^`P```$B)W^@`````@'M<`'0;9F:0
-M2(GOZ`````"_`0```.@`````@'M<`'7H2(M#"$B+,$2)Z??1@^$#183V#Y7"
-MP>(##[:$#J@2``"#X.<)T(B$#J@2``"Y`0```$2)XKX#````2(G?Z`````!;
-M74%<05U!7L-F9F:09F9FD&9FD&9FD$B#["A(B5PD"$B);"003(ED)!A,B6PD
-M($B)^TB)]0^W1B!F/84`=QM,BZ^0"0``#[?`#[:$!V@(``!,:>#(#P``ZPU,
-MBZ^0"0``0;PXN`\`2(M52(!Z`0)U%DB+0@1(B8.H$@``2(M"#$B)@[`2``!(
-MBW5X2(7V=`A(B=_H`````$B)[DB)W^@`````0\9$)5P`2(M<)`A(BVPD$$R+
-M9"083(ML)"!(@\0HPY"0D)"028G13(N70`D```^W1B"Z8)X!`&8]A0!W%P^W
-MP`^VA`=H"```2(T40$B-%)!(P>(%38V!(`0``$'&@2`$```G9H%^..$!=2E$
-M#[9..D&-0?\\`7<,0;D/````1")..^LN08U![T&Y#P```#P!=B!FD$F-!!)!
-MN0````!(@WA@`'0-0;D/````1"*(@0```$$/MD`!@^#P1`G(08A``;@!````
-M9H%^..$!=18/MD8Z@^@!/`$/E\`/ML!F9F:09F:0B<+!X@=!#[9``8/@?PG0
-M08A``0^V009!B$`"#[8!08A``P^V005!B$`'#[9!!T&(0`\/MD$"08A`!`^V
-M00-!B$`%#[9!!$&(0`8/MD$!08A`#`^V00I!B$`(#[9!"T&(0`D/MD$,08A`
-M"@^V00A!B$`+#[9!"4&(0`W#9F:09I!`#[;'PV9F9I!F9F:09F:0B?@/ML3#
-M9F9FD&9FD&9FD,9')`)(BT=00(AP`DB+1U#&0`<`2(M'4(A0#,-F9F:0#[9'
-M/8A&`@^V1SR(1@,/MD<[B$8$#[9'.HA&"L-F9I`/MD=!B$8"#[9'0(A&`P^V
-M1S^(1@0/MD<^B$8*#[9'/8A&"P^V1SR(1@S#9F:09I"%TGXAN0````!F9F:0
-M9F:0B=`IR(/X`@^=P`^VP(U,`0$YRG_K\\-F9I!F9I!F9I!(@^PH2(D<)$B)
-M;"0(3(ED)!!,B6PD&$R)="0@2(G[2(G508GV#[9'.#PJ="4\*G<1/"@/A=T`
-M``!F9F:09F:0ZQ`\B'0J/(H/A<@```!FD.L>1`^V8T!$#[9K/TB)[DB)W^@`
-M````ZQQF9F:09F:01`^V8T5$#[9K1$B)[DB)W^@`````QD4%0(N#E````*D`
-M``$`=#!$B&4`1(AM"$*-!/4`````B$4!#[9#.#PH=`0\B'4+QD4&8.M;9F:0
-M9I#&109AZU"I```$`&9FD&:0="!$B&4!1(AM"0^V0S@\*'0$/(AU!L9%!B7K
-M*L9%!C7K)$2(90$/MD,Z@^`/"$4%#[9#.#PH=`0\B'4&QD4&R.L$QD4&RDB+
-M'"1(BVPD"$R+9"003(ML)!A,BW0D($B#Q"C#9F9FD&9FD&9FD&9FD`^V1SH*
-M1SL*1SP*1ST/ML`/ME=`@^(!"=!T%;HD````O@4```#H`````//#9F9FD,9&
-M!NQ(QX>@`````````,-(@^P@2(D<)$B);"0(3(ED)!!,B6PD&$B)^TB)]0^V
-M1S@\+W0+/(]U6>L79F:09I!$#[9G0$0/MF\_Z`````"0ZP]$#[9G140/MF]$
-MZ`````#&105`]H.6````!'021(AE`42(;0G&109"ZQ9F9F:01(AE`0^V0SJ#
-MX`\(107&109`2(L<)$B+;"0(3(MD)!!,BVPD&$B#Q"##9F:09F:02(GQQD(%
-M0`^V1C@\-70&/)%U(^L;#[=':(/@`8/X`1G`@^#]@^@6B$(&ZR1F9F:0QD(&
-MZNL:NB0```"^!0```$B)S^@`````\\-F9I!F9I#V03D"=`3&020`\\-F9F:0
-M]D<\\'0/NB0```"^!0```.@`````\\-F9I!F9I!F9I!(@^P(28GPN`````!F
-M9F:0Q@0(`$B#P`%(@_@-=?)!#[9`.#PU#X2=````/#5W*3PH=&(\*'<./!L/
-MA:$#``"0Z9L````\*G1,/"]F9I!FD`^%B@,``.M8/(]F9I!F9I!T3CR/=Q(\
-MB'0K/(IF9F:0#X5J`P``ZQT\D69FD&9FD'1&/.$/A58#``!F9I!F9I#IA```
-M``^V\DB)RDR)Q^@`````QT0D!`$```#I.`,``$B)SDR)Q^@`````QT0D!`$`
-M``#I(`,``$B)RDR)QN@`````QT0D!`$```#I"`,``$'V0#P!="'&009PQD$$
-M`,9!`P#&00(`QD$%0,=$)`0!````Z>`"``#&00;@QT0D!`$```#ISP(``$&`
-M>#D!#X6\`@``08!X.AP/A[$"``!!#[9`.O\DQ0````#&00<$QT0D!`$```#I
-MG`(``,9!!P#'1"0$`0```.F+`@``QD$&[,=$)`0!````Z7H"``#&00;OQ@$#
-M00^V0#N#R$"(00''1"0$`0```.E;`@``QD$&[\8!!\=$)`0!````Z4<"``#&
-M009`QD$!`<9!!4#'1"0$`0```.DN`@``QD$&[\8!`T$/MD`[@\@(B$$!QT0D
-M!`$```#I#P(``,9!!N_&`0+'1"0$`0```.G[`0``QD$&[\8!@L=$)`0!````
-MZ><!``#&00;OQ@$&QT0D!`$```#ITP$``,9!!N_&`8;'1"0$`0```.F_`0``
-MQD$&XT$/MD`[B$$!QT0D!`$```#II@$``,9!!K#&`=C&00-/QD$$PL=$)`0!
-M````Z8H!``#&00:PQ@'9QD$#3\9!!,+'1"0$`0```.EN`0``QD$&L,8!VL9!
-M`T_&003"QT0D!`$```#I4@$``/9':`%T$<9!!NK'1"0$`0```.D[`0``QD$&
-MY\=$)`0!````Z2H!``#&00;OQ@&JQT0D!`$```#I%@$``,9!!N_&`57'1"0$
-M`0```.D"`0``QD$&+\9!`0'&00(0QT0D!`$```#IZ0```,9!!N1!#[9`/(@!
-M00^V0#V(00A!#[9`.XA!!<=$)`0!````Z<$```!!#[9`.XA!!D$/MD`\B`%!
-M#[9`/8A!`D$/MD`^B$$#00^V0#^(001!#[9`08A!"D$/MD!`B$$!QT0D!`$`
-M``#I?0```,9!!NA!#[9`/(@!00^V0#V(00A!#[9`.XA!!4$/MD`^B$$"00^V
-M0#^(00-!#[9`0(A!!$$/MD!!B$$!QT0D!`$```#K.,=$)`0!````0?9`/`%T
-M*<9!!G#&000`QD$#`,9!`@#&005`QT0D!`$```#K"V9FD,=$)`0`````BT0D
-M!$B#Q`C#9F9FD&9F9I!F9F:09F:04TB#["!(B?-(BTY(2,<$)`````!(QT0D
-M"`````!(QT0D$`````!(QT0D&`````#V@:<````$=`U(BY'(````2(/J`>L&
-MBU%X@^H!@'LX)75A2(G02,'H&(@$)$B)T$C!Z!"(1"0!2(G02,'H"(A$)`*(
-M5"0#]H'5````$'44QD0D!@+&1"0'`+@(````Z:X```!(C7PD!$B-L>H```"Z
-M!````.@`````N`@```#IC@```$B)T$C!Z#B(!"1(B=!(P>@PB$0D`4B)T$C!
-MZ"B(1"0"2(G02,'H((A$)`-(B=!(P>@8B$0D!$B)T$C!Z!"(1"0%2(G02,'H
-M"(A$)`:(5"0']H'5````$'45QD0D"@+&1"0+`+@@````ZR1F9F:02(U\)`A(
-MC;'J````N@0```#H`````+@@````9F:09I!(BWM(2&/02(GFZ`````!(@\0@
-M6\-F9F:09F9FD&9FD%-(B?-(BU=02(L*#[9&.#PO=%\\+W<K/!L/A#$!```\
-M&W<//!(/A44!``!F9I!FD.M`/"AT/#PJ#X4R`0``9I#K,#R*="P\BG<8/#5F
-M9F:0#X3Z````/(@/A1(!``!FD.L0/(]T##SA#X4"`0``9I#K=?9':`%T"H&+
-ME```````!`#V1VH0#X04`0``2(-_8``/A0D!```/MD,X/"AT$#PJ=`P\B'0(
-M/(H/A?$```#V0@P!=10/MG((2(G/Z`````"$P`^$UP```(![)($/A,T```"!
-MBY0```````$`N`$```#IO@```(!^.0$/A:0```"`?CH<#X>:````2`^^3CJX
-M`0```$C3X*GV/\`==2.I"$`&`'4,J0``(`!U(V9FD.MS@XZ4````"+@!````
-M9I#K<X..E`````&X`0```.ME@XZ4````(+@!````ZU=FD/9':`%T"H&+E```
-M````!`"#BY0````!N`$```#K-V:0BX.4````J0``(`!T&/9':`%T'0T```0`
-MB8.4````N`$```#K$+@`````ZPEF9F:0N`$```!;PY"0D)"0D)"0D$B+?PA%
-M#[;`0<'@!`^VTL'B"$$)T$2)P(/(!(3)1`]%P$&#^?]T&4B-EP#^_O]$B<@E
-M__\#`(F"!,@``$&#R`)$B0;#9F9FD&9F9I!F9F:02(M'"$@M``(!`(/.`8FP
-M`,@``,-F9F:09F9FD&9F9I!!5%5308GT2(M'"(7V=$Q(+0`"`0!(C:@`R```
-MBX``R```B04`````NP````"H`74/ZR&+10")!0````"H`704OPH```#H````
-M`(/#`40YXW7AZP>X`````.L%N/____];74%<PV9F9I!F9F:09F:055-(@^P8
-M2(G[QT0D%`````!(BV\(QH=P%`````^V%0````!(C70D%$&Y`````$&X`@``
-M`+D!````Z.+^__^+="042(G?Z";___^^H(8!`$B)W^@Y____A<!U54B-A0#^
-M_O^+@`S(``")!0````")1"04/1]C``!U-\>#8!0``!]C``#'@V04``````0`
-MQX-H%``````!`$C'@W@4````````9K@``.E7`@``9F:09I#'1"04`````$B+
-M:PC&@W`4```!#[85`````$B-="040;G_____0;@"````N0$```!(B=_H./[_
-M_XMT)!1(B=_H?/[__[X0)P``2(G?Z(_^__^%P'5N2(V%`/[^_XN`#,@``(D%
-M`````(E$)!0]'T,``'0M/1]$``!U2<>#8!0``!]$``#'@V04``````<`QX-H
-M%``````!`.F3`0``9F:0QX-@%```'T,``,>#9!0`````!`#'@V@4``````$`
-MZ6T!``#'1"04`````$B+:PC&@W`4````#[85`````$B-="040;D`````0;@"
-M````N0$```!(B=_H=?W__XMT)!1(B=_HN?W__[X0)P``2(G?Z,S]__^%P'50
-M2(V%`/[^_XN`#,@``(D%`````(E$)!0]OT,``'4RQX-@%```OT,``,>#9!0`
-M````(`#'@V@4````$```2,>#>!0```````!FN```Z>H```#'1"04`````$B+
-M:PC&@W`4````#[85`````$B-="040;D`````0;@"````N0$```!(B=_HT/S_
-M_XMT)!1(B=_H%/W__[X0)P``2(G?Z"?]__^%P'5G2(V%`/[^_XN`#,@``(D%
-M`````(E$)!0][Q$``'0)/>\2``!U0NL@QX-@%```[Q$``,>#9!0`````!`#'
-M@V@4``````$`ZS['@V`4``#O$@``QX-D%``````(`,>#:!0``````0#K'KC_
-M____ZR=F9I!FD$C'@W@4````````N`````#K$$C'@W@4````````N`````!(
-M@\086UW#9F9FD&9FD$B#["A(B5PD$$B);"083(ED)"!(B?N)]TF)U$B+:PB`
-M^02X!`````]'R$B+@W@4```/ME`$2(UT)`Q!B?E$#[;!N0$```!(B=_HPOO_
-M_XMT)`Q(B=_H!OS__[X0)P``2(G?Z!G\__^Z_____X7`=2!(C84`_O[_BX`,
-MR```B04`````B40D#$&)!"2Z`````(G02(M<)!!(BVPD&$R+9"0@2(/$*,-F
-M9F:09F:09F:055-(@^P82(G[2(G52(N'>!0```^V4`M(C40D%$&)\4&X`0``
-M`+D!````2(G&Z"[[__^+="042(G?Z'+[__^^$"<``$B)W^B%^___NO____^%
-MP'4:2(M#"$@M]#D``(L`B04`````B$4`N@````")T$B#Q!A;7<-F9I!F9I!F
-M9I!!5T%6055!5%532(/L&$B)^T&)S4&)]T&)UH7)#X2.````O0````!,BV,(
-M2(N#>!0```^V4`)!N?____]!N`$```"Y`0```$B-="042(G?Z(SZ__^+="04
-M2(G?Z-#Z__^^$"<``$B)W^CC^O__A<!U*4F-A"0`_O[_BY`,R```B14`````
-M1(GX(=!$./!U![@`````ZQ^)5"04OPH```#H`````(/%`40Y[0^%=____[C_
-M____2(/$&%M=05Q!74%>05_#9F9FD&9F9I!F9F:04TB#[!!(B?M(BX=X%```
-M#[802(UT)`Q!N?____]!N`````"Y`````.CC^?__BW0D#$B)W^@G^O__OA`G
-M``!(B=_H.OK__X7`=2:YX),$`+H"````O@,```!(B=_HS_[__[H`````A<!T
-M"V9FD&9FD+K_____B=!(@\006\-F9I!(@^PH2(E<)!A(B6PD($B)^XGUQD0D
-M%_](C50D%^@`````A<!U<H!\)!<`='-(B=_H2____X/X_W1>2(N#>!0```^V
-M4`I(C70D$$&)Z4&X`````+D`````2(G?Z##Y__^+="002(G?Z'3Y__^^$"<`
-M`$B)W^B'^?__A<!U&[G@DP0`N@````"^`P```$B)W^@<_O__A<!T"+C_____
-MZP:0N`````!(BUPD&$B+;"0@2(/$*,-F9F:09F9FD&9F9I!(@^Q82(E<)"A(
-MB6PD,$R)9"0X3(EL)$!,B70D2$R)?"102(G]08GVB<M(@[]X%`````^$^`(`
-M`$F)UT6$P`^$7`$``(/^_W47#[>'8!0``&:)`K@!````Z?D"``!F9I"#_OYU
-M$HN'9!0``(D"N`$```#IWP(``(/^_744BX=H%```B0*X`0```.G(`@``9I`!
-M\XE<)`P[GV04```/AXX"``")\X/C_$&)]$&#Y`-T8DR-;"0DN00```!,B>J)
-MWNC\^___@\,$N@0````Y7"0,<PU$B>!$*?"+3"0,C10(1#GB=BY$B>%,B?]F
-M9I!F9I")R$$/MD0%`(@'2(/'`8/!`3G1=>N)T$0IX(/H`4V-?`<!1(MD)`Q!
-M@^3\1#GC<RI,C6PD)+D$````3(GJB=Y(B>_HB?O__XM$)"1!B0=)@\<$@\,$
-M03G<=]LY7"0,#X;C`0``3(UD)"2Y!````$R)XHG>2(GOZ%7[__^+="0,*=X/
-MA,`!``"Y`````+H`````00^V!!1"B`0Z@\$!2(/"`3GQ#X2>`0``Z^9F9I!F
-MD(/^_W4K@#H/=1'&AW$4```!N`$```#IFP$``,:'<10```"X`0```.F*`0``
-M9F9FD(E,)!2)R`'P.X=D%```#X=,`0``@+]Q%`````^$/P$``(GPN@````#W
-MMV@4``"%T@^%C0```("_<!0```!T#>@`````A<`/A10!``!(B>_HG/S__X/X
-M_P^$`P$``$B+A7@4```/ME`&2(UT)"1%B?%!N`````"Y`````$B)[^A]]O__
-MBW0D)$B)[^C!]O__OA`G``!(B>_HU/;__X7`#X6\````N>"3!`"Z`````+X#
-M````2(GOZ&7[__^%P`^%G0```(7;#X2<````QT0D$`````"+1"0018LD!T2+
-M;"0010'U2(M="$B!ZP`"`0!(B>_H^OO__T2)HPC(``!(BX5X%```#[90!46)
-MZ4&X!````+D`````2(UT)"1(B>_HW?7__XMT)"1(B>_H(?;__[X0)P``2(GO
-MZ#3V__^%P'4@N8@3``"Z`````+X!````2(GOZ,GZ__^%P'079F:09I"X````
-M`.L?N`$```!F9F:0ZQ2#1"00!(M$)!`Y1"04=N;I3?___TB+7"0H2(ML)#!,
-MBV0D.$R+;"1`3(MT)$A,BWPD4$B#Q%C#D)"0D)"0D+@`````PV9F9I!F9I!F
-M9I"X`````#D]`````'XW2&/'2,?!`````$B-!$!(P>`##[<4"&:)%@^W5`@"
-M9HE6`@^V5`@(B%8(#[9$"`F(1@FX`0```//#9F9FD&9FD&9FD+@@*P``PV9F
-M9I!F9I!F9I"XT````,-F9F:09F:09F:0N`@```##9F9FD&9FD&9FD+X`````
-M0;@`````N0`````/MI0YZ`@``(#Z_W1*C8&`````9CV!`'<'@\8!ZSEFD`^V
-MPDB+EV@)``!(C03`2,'@!8"\$!4!```#=1A!@\`!08U``X/X!G8.@\8!0;@`
-M````ZP.#Q@%(@\$!2(/Y!G6?B?##9F9FD&9F9I!F9F:02(GY0;H`````0;L`
-M````0;F`````0`^V]H/&`69F9I!%B<@/MH'H"```//]T4&9!@?F!`'<*08/"
-M`>L]9F9FD`^VP$B+EV@)``!(C03`2,'@!8"\$!4!```#=1E!@\,!08U#`X/X
-M!G8008/"`4&[`````.L$08/"`40YUG072(/!`4&#P0%!@?F&````=9%!N```
-M``!$B<##9F9FD&9FD//#9F9FD&9F9I!F9I!F9I#&A\L`````PV9F9I!F9F:0
-MN/\```!(A?]T1+[_____N0`````/MH0YZ@@``#S_="`/ML!(BY=H"0``2(T$
-MP$C!X`4/MH00%`$``$`XQ@]'\$B#P0%(@_D$=<I`#[;&\\.X`````,-F9F:0
-M9F:09F:02(NW^`@``+\`````0;@`````N0`````/MI0QZ`@``(#Z_W1/C8&`
-M````9CV!`'<%@\<!ZSX/ML)(BY9H"0``2(T$P$C!X`6`O!`5`0```W4?08/`
-M`4&-0`.#^`9V%8/'`4&X`````.L*9F9FD&9FD(/'`4B#P0%(@_D&=9I(B[;X
-M"```2('&D!0``+$`9F:0#[:4,>@(``"`^O]T2HV!@````&8]@0!W!X/'`>LY
-M9I`/ML)(BY9H"0``2(T$P$C!X`6`O!`5`0```W4808/``4&-0`.#^`9V#H/'
-M`4&X`````.L#@\<!2(/!`4B#^09UGXGXPV9F9I!F9F:09F9FD(GPP.@$C4A7
-MC5`P/`H/0]&(%XGP@^`/@_@)?@J)\(/@#X/`5^L(B?"#X`^#P#"(1P'#9F9F
-MD&9F9I!F9I!F9I!(@^P02(D<)$R)9"0(2(G[08GT3(G@#[;TZ*+___]!#[;T
-M2(/#`DB)W^B2____2(L<)$R+9"0(2(/$$,-F9F:0QT($`````,<"`````+@`
-M````PV9F9I!F9I!F9I!F9I!(BT=@2(7`=%%(QT!``````(!(3`1(QT=@````
-M`$C'1W``````2,=':`````"+1PB#^#]_$TB+5WA(F$C'A,)H!````````,-(
-MBU=X2)A(QX3":`(```````#SPV9F9I!(BT=@2(7`=%%(QT!``````(!@3/M(
-MQT=@`````$C'1W``````2,=':`````"+1PB#^#]_$TB+5WA(F$C'A,)H!```
-M`````,-(BU=X2)A(QX3":`(```````#SPV9F9I!(@^P(2,?'`````.@`````
-MN`````!(@\0(PV9FD&9FD%532(/L.,8$)&W&1"0!_\9$)`(CQD0D`Q3&1"0$
-M.L9$)`7OQD0D!A;&1"0'DDB+KP`)``!(A>U(#T3O2(U$)!!(B<+&``!(@\`!
-M2(G32(U,)#!(.<AU[,9$)!0!N2````"^#@```$B)[^@`````A<!U0K^`&@8`
-MZ`````"Y(````$B)VKX/````2(GOZ`````"#^"!U'DB-<Q!(B>>Y"````/SS
-MI@^7P@^2P+D!````.,)T%DC'QP````"X`````.@`````N0`````/ML%(@\0X
-M6UW#9F9FD&9F9I!F9F:005=!5D%505154TB#[&A)B?Q,B[_X"```28''D!0`
-M`$B+!TB%P'032(VP``#^_TB)-TB+?R#H`````$F+="002(7V=`I)BWPD(.@`
-M````28MT)!A(A?9T"DF+?"0@Z`````!(C4PD94B-5"1F2(UT)&=!#[=\)#Q(
-MC40D6DB)1"0X2(U$)%Q(B40D,$B-1"162(E$)"A(C40D6$B)1"0@2(U$)&!(
-MB40D&$B-1"1B2(E$)!!(C40D8TB)1"0(2(U$)%Y(B00D3(U,)&1,C40D5.@`
-M````28NT)$`)``!(A?9T($F-O"0@"0``Z`````!)B[=`"0``28V_(`D``.@`
-M````28NT)&@)``!(A?9T($F-O"1("0``Z`````!)B[=H"0``28V_2`D``.@`
-M````28NT))`)``!(A?9T($F-O"1P"0``Z`````!)B[>0"0``28V_<`D``.@`
-M````28NT)#`+``!(A?9T($F-O"00"P``Z`````!)B[<P"P``28V_$`L``.@`
-M````@'PD9P!T1+T`````38VT)&`+``!-C:]@"P``#[?=28NTW(`+``!,B??H
-M`````$F+M-^`"P``3(GOZ`````"#Q0$/MD0D9V8YZ'?028NT)!`0``!(A?9T
-M($F-O"3P#P``Z`````!)B[<0$```28V_\`\``.@`````28NT)$@0``!(A?9T
-M($F-O"0H$```Z`````!)B[=($```28V_*!```.@`````28NT)+@0``!(A?9T
-M($F-O"28$```Z`````!)B[>X$```28V_F!```.@`````28NT)+@)``!(A?9T
-M($F-O"28"0``Z`````!)B[>X"0``28V_F`D``.@`````28NT))`*``!(A?9T
-M($F-O"1P"@``Z`````!)B[>0"@``28V_<`H``.@`````28NT)"`*``!(A?9T
-M($F-O"0`"@``Z`````!)B[<@"@``28V_``H``.@`````28NT)$@*``!(A?9T
-M($F-O"0H"@``Z`````!)B[=("@``28V_*`H``.@`````28NT).`*``!(A?9T
-M($F-O"3`"@``Z`````!)B[?@"@``28V_P`H``.@`````28NT)`@+``!(A?9T
-M($F-O"3H"@``Z`````!)B[<("P``28V_Z`H``.@`````28NT)%@+``!(A?9T
-M($F-O"0X"P``Z`````!)B[=8"P``28V_.`L``.@`````28NT)*`/``!(A?9T
-M($F-O"2`#P``Z`````!)B[>@#P``28V_@`\``.@`````28NT)-@/``!(A?9T
-M($F-O"2X#P``Z`````!)B[?8#P``28V_N`\``.@`````28NT)(`0``!(A?9T
-M($F-O"1@$```Z`````!)B[>`$```28V_8!```.@`````28NT)+@*``!(A?9T
-M($F-O"28"@``Z`````!)B[>X"@``28V_F`H``.@`````28NT).`0``!(A?9T
-M+TF+E"3H$```28V\),`0``#H`````$F+E^@0``!)B[?@$```28V_P!```.@`
-M````28NT)!`1``!(A?9T+TF+E"08$0``28V\)/`0``#H`````$F+EQ@1``!)
-MB[<0$0``28V_\!```.@`````28NT)$`1``!(A?9T+TF+E"1($0``28V\)"`1
-M``#H`````$F+ET@1``!)B[=`$0``28V_(!$``.@`````28NT)*`1``!(A?9T
-M+TF+E"2H$0``28V\)(`1``#H`````$F+EZ@1``!)B[>@$0``28V_@!$``.@`
-M````28NT)'`1``!(A?9T+TF+E"1X$0``28V\)%`1``#H`````$F+EW@1``!)
-MB[=P$0``28V_4!$``.@`````28NT)-`1``!(A?9T+TF+E"38$0``28V\)+`1
-M``#H`````$F+E]@1``!)B[?0$0``28V_L!$``.@`````28NT)``2``!(A?9T
-M+TF+E"0($@``28V\).`1``#H`````$F+EP@2``!)B[<`$@``28V_X!$``.@`
-M````28NT)#`2``!(A?9T+TF+E"0X$@``28V\)!`2``#H`````$F+ES@2``!)
-MB[<P$@``28V_$!(``.@`````2(/$:%M=05Q!74%>05_#9F9FD&9FD$B#[!A(
-MB5PD"$R)9"002(G[Z`````!(B=_H`````$R-HY`4``!,B>?H`````$B)W^@`
-M````O]`'``#H`````$B)W^@`````O@$```!(B=_H`````+X!````3(GGZ```
-M``!(BUPD"$R+9"002(/$&,-(@^P82(E<)`A,B60D$$F)_$&(="1/0`^VWHG>
-MZ`````!)@<20%```B=Y,B>?H`````+@!````2(M<)`A,BV0D$$B#Q!C#9F9F
-MD&9FD&9FD%-(B?OH`````$B+N_@(``!(@<>0%```Z`````!;PV:04TB)^^@`
-M````2(N[^`@``$B!QY`4``#H`````%O#9I!(@^P(Z``````/ML!(@\0(PV9F
-M9I!F9F:09F9FD&9FD$B#[#A(B5PD"$B);"003(ED)!A,B6PD($R)="0H3(E\
-M)#!(B?M!B?1!B=5(BV]@3(MW>$B%[0^$&P$``("_RP`````/A0X!``!,B??H
-M`````$F)QTB%P`^$^@```,9`..'&0#D!183D=`U!@/T!&<#WT(/`!^L+08#]
-M`1G`]]"#P`U!B$<Z0<9')(`/MT4X9D&)1R!)B5\H0<='-`````!)QT=(````
-M`$G'AZ``````````3(G^3(GWZ`````#&@\L````!9L>#R````/0!2(7;=$Y(
-MBU-@2(72=$]F@;O(````E@!U#DB+>E"^(0```.@`````9H.KR`````&_T`<`
-M`.@`````3(GWZ`````!(BU-@2(72=`F`N\L`````=;MF@[O(`````'0:08!_
-M)`!U$TB+0V`/MT!J9HE#6KL`````ZP6[_____TR)_DR)]^@`````ZP6[____
-M_XG82(M<)`A(BVPD$$R+9"083(ML)"!,BW0D*$R+?"0P2(/$.,-F9F:09F9F
-MD&9F9I!F9I!(@^Q(2(E<)!A(B6PD($R)9"0H3(EL)#!,B70D.$R)?"1`2(G]
-M08GU3(MG8$R+=WA-A>0/A'D$``"`O\L`````#X5L!```3(GWZ`````!)B<=(
-MA<`/A%@$``#V10`"#X7\````08#]%'<,00^VQ8T$0,'@`NL7N(G___]!]N5F
-MP>@(P.@$#[;`!?````!!QD<XX4'&1SD!0<9'.AQ!B$<[0<9')(!!#[=$)#AF
-M08E'($F);RA!QT<T`````$G'1T@`````2<>'H`````````!,B?Y,B??H````
-M`,:%RP````%FQX7(````Q`E(A>UT3DB+56!(A=)T4V:!O<@```"6`'4.2(MZ
-M4+XA````Z`````!F@ZW(`````;_0!P``Z`````!,B??H`````$B+56!(A=)T
-M"8"]RP````!UNV:#O<@`````#X15`P``NP````!!@'\D``^$2@,``.E``P``
-M3(GWZ`````!(B40D$$B%P`^$*@,``$F-7UA(BT`02(D$)$'&1S@:0<9'.0A!
-MQD<Z&D'&1SL`0<9'/!!!QD<]`$B+1"0028E'>$'&1R2`00^W1"0X9D&)1R!)
-MB6\H2(M$)!!(BT`028E'2$''1S00````2(M%8$@%[````$F)1U!!QD<P($G'
-MAZ``````````O@````!(B=_H`````$&+5S1(BT0D$$B+<!A(B=_H`````$R)
-M_DR)]^@`````QH7+`````6;'A<@```#Z`$B%[71.2(M58$B%TG1/9H&]R```
-M`)8`=0Y(BWI0OB$```#H`````&:#K<@````!O]`'``#H`````$R)]^@`````
-M2(M58$B%TG0)@+W+`````'6[9H.]R`````!T!T&`?R0`=!=(C70D$$R)]^@`
-M````N______I_0$``$R)_DR)]^@`````3(GWZ`````!)B<=(A<!U'4B-="00
-M3(GWZ`````"[_____^G=`0``9F:09F:02(U86$B+/"1(@\<$2(L4)`^V0@,/
-MM@0'B$($QD<!"L9'`@"X`````$B+%"3&!!``2(/``4B#^`1U[D6$[74&@&<#
-M_.M!00^VU6G28.H``+@?A>M1]^K!^@6`3P,#B='!Z1B(3P2)UL'N$$"(=P6)
-MT,'H"(A'!HA7!XA/"$"(=PF(1PJ(5PM(BT0D$$F)1WA!QD<X%0^V!\#X!_?0
-M@\`108A'.4'&1SH`0<9'.P!!QD<\$$'&1ST`@"<_0<9')(!!#[=$)#AF08E'
-M($F);RA(BT0D$$B+0!!)B4=(0<='-!````!(BT5@2`7L````28E'4$'&1S`@
-M2<>'H`````````"^`````$B)W^@`````08M7-$B+1"002(MP&$B)W^@`````
-M3(G^3(GWZ`````#&A<L````!9L>%R````/H`2(7M=$Y(BU5@2(72=$]F@;W(
-M````E@!U#DB+>E"^(0```.@`````9H.MR`````&_T`<``.@`````3(GWZ```
-M``!(BU5@2(72=`F`O<L`````=;MF@[W(`````'0,NP````!!@'\D`'0%N___
-M__](C70D$$R)]^@`````ZPIF9I!FD+O_____3(G^3(GWZ`````#K!;O_____
-MB=A(BUPD&$B+;"0@3(MD)"A,BVPD,$R+="0X3(M\)$!(@\1(PV9F9I!(@^QH
-M2(E<)#A(B6PD0$R)9"1(3(EL)%!,B70D6$R)?"1@2(G]2(GS28G/08G518G&
-M3(MG8$V%Y`^$M@,``("_RP`````/A:D#``!)BT0D4$B)1"0P2(M7>$B)5"0(
-M9L>'R````!`G2(G7Z`````!(B40D*$B%P`^$=P,``$$/M\6)1"0$9D&#_01V
-M%8G&2,?'`````+@`````Z`````#K%$B+?"0(Z`````!(B40D$$B%P'492(MT
-M)"A(BWPD".@`````N______I0@,``(M4)`3!X@F)5"0D2(M$)`A(B[#X"```
-MQD8_`4B)ZK\%````Z`````!!@$PD3`)(BU5@OB$```!(BWPD,.@`````2(M4
-M)"A(@\)82(E4)!A%A/9T%4B+1"0HQX"4````"@```,9`."CK*$B+5"0HQX*4
-M````$@```,9"."I(BT0D$$B+>!"+5"0D3(G^Z`````!(BT5@]D!H`0^$@0``
-M`$&`_@$9P(/@`H/H>$B+5"0HB$(XQD(Y`$B)V$C!Z#B(0CI(B=A(P>@PB$([
-M2(G82,'H*(A"/$B)V$C!Z""(0CU(B=A(P>@8B$(^2(G82,'H$(A"/TB)V$C!
-MZ`B(0D"(6D'&0D(`QD)#`$2)Z&;!Z`B(0D1$B&I%QD)&`,9"1P#K3T&`_@$9
-MP(/@`H/`*$B+5"0HB$(XQD(Y`$B)V$C!Z!B(0CI(B=A(P>@0B$([2(G82,'H
-M"(A"/(A:/<9"/@!$B>AFP>@(B$(_1(AJ0,9"00!(BWPD*.@`````2(M%8`^W
-M0#A(BU0D*&:)0B#&0B2`2(EJ*$B+5"002(M"$$B+5"0H2(E"2(M$)"2)0C1(
-MBT0D$$B)0GC&0C`@2(M%8$@%[````$B)0E!(QX*@`````````+X`````2(M\
-M)!CH`````$B+1"0HBU`T2(M$)!!(BW`82(M\)!CH`````,:%RP````%(BW0D
-M*$B+?"0(Z`````!(A>T/A)@```!(BU5@2(72#X2+````@+W+``````^$^0``
-M`&:!O<@```"6`'4.2(MZ4+XA````Z`````!F@ZW(`````;_0!P``Z`````!(
-MBWPD".@`````2(M58$B%TG1`@+W+``````^$K@```.NS2(M4)"B`>B0`=2:[
-M`````$6$]G0ABU0D)$B+1"002(MP$$R)_^@`````NP````#K!;O_____2(M4
-M)"A(@WIX`'0O@7HT``@``'<32(G62(/&>$B+?"0(Z`````#K$TB+="0H2(/&
-M>$B+?"0(Z`````!(BW0D*$B+?"0(Z`````!(BT0D"$B+L/@(``#&1C\`2(GJ
-MOP8```#H`````$&`9"1,_>L<N______K%6:#O<@`````#X5&____Z7+___]F
-MD(G82(M<)#A(BVPD0$R+9"1(3(ML)%!,BW0D6$R+?"1@2(/$:,-F9F:09F9F
-MD&9FD$B#[!A(B1PD2(EL)`A,B60D$$B)\TB+1U!,BR!(BVYH#[9&)#P@=$@\
-M('<*A,!T(CP&=Q7K,#PB=#8\(F9F9I!R)(/`@#P!=AVX`````&:0ZV-(BT=`
-MQT`$`````,:%L@````'K"L:%L@````UF9I!(@WMX`'0E@7LT``@``'<02(US
-M>$R)Y^@`````ZPYFD$B-<WA,B>?H`````$B)WDR)Y^@`````2(GO_Y7(````
-MN`$```!(BQPD2(ML)`A,BV0D$$B#Q!C#9F9FD&9F9I!(@^PH2(D<)$B);"0(
-M3(ED)!!,B6PD&$R)="0@2(G[28GU28G42(MO8$B%[74*2(G7_];I/@$``$B#
-MOX@`````=0Y(@[^``````'0/9F9FD$R)YT'_U>D;`0``@+WH``````^%"`$`
-M`(!]2O]F9F:0#X7Z````2(M%8$B%P'0*@'A1``^%YP```$B+?5#V1PP0#X79
-M````3(LW@+V#`````'0-2(GJO@8```#H`````$R)JX@```!,B:.0````#[95
-M2$B)T(/@!DB#^`9U*?;"`71]QD5*!<9%2P0/MI6!````2(MU6$B+?5!(B>GH
-M`````.E_````2(/X!'5Y]L(!='1(BU5@2(72="\/MT).J`)T8X/@_6:)0DY(
-MBT5@9L=`3@$`2(M%8,9`0AU(BW5@3(GWZ`````#K/,9%2@/&14L$2(GN3(GW
-MZ`````#K)Y#&14H%QD5+!F;'A<@``````$B)[DR)]^@`````ZPAFD$R)YT'_
-MU4B+'"1(BVPD"$R+9"003(ML)!A,BW0D($B#Q"C#9F9FD&9FD&9FD&9FD%-(
-MB?M(A?\/A,,```!(BW]XZ`````!(B<)(A<`/A'X```"`N!4!````='6`"P$/
-MMH`5`0``/`)U.DB#>W``=1D/MH/,````@^`#B$,"#[:"%`$``(A#`>MW#[:#
-MS0```(A#`DB+0W`/MH`4`0``B$,!ZUT\`W59#[:#S````(/@`\'@`@*#S0``
-M`(A#`DB+0W`/MH`4`0``B$,!ZS-F9I!(BT-P2(7`=0M(BT-H2(7`=0[K'`^V
-M@!0!``"(0P'K$`^V@,(```"(0P%F9I!F9I!;PV9F9I!F9F:09F:09F:055-(
-M@^P(2(G[2(7_='>]``````^VA!UH"```//]T00^VT$B-!%)(C02"2,'@!4B)
-MPD@#DT`)``!T)HM"2"4`__\`/0``_P!U%_9"2P1T$4B+>D!(A?]T".@`````
-M9F:02(/%`4B!_8````!UIDB+@_@(``!(.=AU#$B-N)`4``#H`````$B#Q`A;
-M7<-F9F:055-(@^P(2(G[2(VOD!0``.@`````2(E#*$B)12A(B9OX"```2(F=
-M^`@``(N#$`D``(F%$`D``,:#;A0```'&A6X4```!2(G?Z`````!(B=_H````
-M`$B)[^@`````2(G?Z`````"$P'1G2(GOZ`````"$P'1;2(G?Z`````"_T`<`
-M`.@`````2(G?Z`````#'@Y@!``#H`P``2,>#J`$```````!(B9NP`0``2(VS
-MF`$``$B+>RCH`````+X`````2(G?Z`````"X`0```.L&D+@`````2(/$"%M=
-MPV9F9I!32(G[Z`````!(@<.0%```2(G?Z`````"X`0```%O#D$%7059!54%4
-M55-(@^P82(ET)`A(B10D@ST```````^%;P$``,<%``````$```!$BST`````
-MQT0D%`````!)Q\4`````2,?#`````$G'Q@````#I=@(```^WA@````#!X!!"
-M#[<4+@G0.<4/A?$```!!N`````"_`````&9FD&:09H,\'P!U7TECT$B)T4C!
-MX05*BP0N2(D$&4*+1"X(B409"`^V@0````!(P>(#2(T\`@^V1"03B$2[#0^V
-M@0````!(C3P"#[9$)!*(1+L.#[:!`````$@!PL9$DP\`@($``````>MT#[:/
-M``````^VP;H`````0O<T-H72=$L/ML%)8]!(C0S5`````$B-/`$/MD0D$XA$
-MNPU(P>(%#[:"`````$B-/`$/MD0D$HA$NPX/MH(`````2`'!QD2+#P"`@@``
-M```!ZQ)!@\`!2(/'($&#^`0/A2;___^#A@`````!08/"`4B#QAA%.?H/A>7^
-M__]!@\0!08/\(`^%%P$``(-$)!0!@7PD%/\````/A3H!``!(@WPD"`!T"$B+
-M5"0(Q@(`BS4`````O0````"%]GXUN0````"]`````+H``````ZH`````2(-\
-M)`@`=`V+@@````!(BUPD"``#@\$!2(/"&#GQ==I(@SPD``^$[````$&Y````
-M`$&Z`````$G'Q`````!F0X,\(@`/A,T```!!#[:2`````(32=&=!N`````!)
-M8\%,C1S%``````^VPH/H`4B-6`%+C00#2(TTA0````!(BSPDN00```#\\Z8/
-ME\(/DL`XPG4A2(-\)`@`=`]!#[:"`````$B+5"0(B`)!#[:J`````.L)28/`
-M`4DYV'6T08/!`4F#PB!!@_D$=$SI;O___T2(9"02N0````"Z`````$2)YHM\
-M)!3H`````(G%0;H`````O@````!%A?\/CX_]___II?[__P^V1"04B$0D$T&\
-M`````.NY0`^VQ4B#Q!A;74%<05U!7D%?PV9F9I!F9F:09F9FD&9FD$B#[!A(
-MB1PD2(EL)`A,B60D$(GU3(MG>$B+7V#V!P%T7TB+>UA(A?]T$$`/MM8/MK.!
-M````Z`````!(B[L@`0``2(7_=!!`#[;5#[:S#0$``.@`````3(GGZ`````!(
-MA<!T+8"X%0$```!T)$`/MM5(BW-`3(GGZ`````#K$F:00`^VUDB+<T!,B>?H
-M`````$B+'"1(BVPD"$R+9"002(/$&,-F9F:09F:09F:09F:02(/L2$B)7"08
-M2(EL)"!,B60D*$R);"0P3(ET)#A,B7PD0$B)^T&)]$B+;V!,BV]X2(7M#X0W
-M`P``@+_+``````^%*@,``/8'`@^%(0,```^VA9@!``"$P'0+0#CP=3J0Z0L#
-M```/M@^#X0$/MLD/ME<"#[9W`40/MH4/`0``2,?'`````+@`````Z`````"[
-M_____^G<`@``3(GOZ`````!)B<9(A<`/A,,"``!(BT-@#[8+@^$!#[;)#[93
-M`@^V<P%%#[;,1`^V@`\!``!(Q\<`````N`````#H`````$'&1CCA0<9&.0%!
-M@/P"#Y7`@\`:08A&.D'&1B2`#[=%.&9!B48@28E>*$''1C0`````2<=&2```
-M``!)QX:@`````````$R)]DR)[^@`````QH/+`````6;'@\@```#T`4B%VW1.
-M2(M38$B%TG139H&[R````)8`=0Y(BWI0OB$```#H`````&:#J\@````!O]`'
-M``#H`````$R)[^@`````2(M38$B%TG0)@+O+`````'6[9H.[R``````/A+<!
-M``!!@'XD``^%K`$``$B+0V!(B40D$$B+0%!,BSA,B?_H`````$B)Q4B%P'46
-M2(M$)!#&@.D````!NP````#I>P$``$R)_^@`````28G$2(7`=2%(BU0D$,:"
-MZ0````%(B>Y,B?_H`````+L`````Z4H!``!(C4582(E$)`C&13CAQD4Y`<9%
-M.@-(BU0D$`^W0CAFB44@QH68````#TB)72C'130``@``28M4)!!(B55(N```
-M``#&!!``2(/``4@]``(``'7P3(EE>$C'A:``````````O@````!(BWPD".@`
-M````BU4T28MT)!A(BWPD".@`````2(GN3(G_Z`````#&@\L````!9L>#R```
-M`/H`2(7;=$Y(BU-@2(72=$]F@;O(````E@!U#DB+>E"^(0```.@`````9H.K
-MR`````&_T`<``.@`````3(G_Z`````!(BU-@2(72=`F`N\L`````=;MF@[O(
-M`````'0F@'TD`'4@2(MU2$B+?"00Z`````!(BU0D$`^V@I@!``"(@\\```!(
-M@WUX`'0,2(UU>$R)_^@`````2(GN3(G_Z`````"[`````.L%N_____],B?9,
-MB>_H`````.L,9F9FD&9FD+O_____B=A(BUPD&$B+;"0@3(MD)"A,BVPD,$R+
-M="0X3(M\)$!(@\1(PV9FD&9FD$B#["A(B5PD"$B);"003(ED)!A,B6PD($B)
-M^X`^"7<0#[8&_R3%`````&9FD&9FD+C_____Z28!``!(BT8(2(N0``D``$B%
-MTD@/1-!(B[KX"```QH=O%````>@`````N`````#I]P````^V5@B^`````.BI
-MZ/__Z>0````/ME8(O@$```#HENC__^G1````#[9V".@`````Z<,```!$#[9N
-M"$R+9WA(BV]@N/_____V1U@(#X2G````28NT)/@(``!(B?J_!0```.@`````
-M@$U,`DB+?5!(B>J^(0```.@`````@+V#`````'0?9F9FD+_0!P``Z`````!,
-MB>?H`````("]@P````!UY46$[70,9H-+6A!F@TUJ$.L*9H-C6N]F@V5J[TF+
-MM"3X"```2(G:OP8```#H`````(!E3/VX`````.L:#[9V".@`````D.L.#[9V
-M".@`````N`````!(BUPD"$B+;"003(MD)!A,BVPD($B#Q"C#9F9FD&9FD$B#
-M[%A(B5PD0$B);"1(3(ED)%!(B?U,BV=X28N$)/@(``"`>#\`#X6T````2(N?
-M@````$B+?V!$#[:/#P$``$&X`0```$0B10`/MDT"#[95`8MU"`^VA]L```")
-M1"0X#[:'V@```(E$)#`/MH?9````B40D*`^VA]@```")1"0@#[:'UP```(E$
-M)!@/MH?6````B40D$`^VA]4```")1"0(#[:'U````(D$)$&#X`%(Q\<`````
-MN`````#H`````$C'A8``````````BU4(2(N]D````$B)[O_3ZT%F9F:02(V?
-MF````$F+?"0H2(G>Z`````#'A9@```#T`0``2,>%J`````````!(B:VP````
-M28M\)"A(B=[H`````$B+7"1`2(ML)$A,BV0D4$B#Q%C#9F9FD&9F9I!F9F:0
-M9F:005=!5D%505154TB#[`A(B3PD28GV#[?22(T$4DB-!()(P>`%28G%3`.O
-M0`D``$R+A_@(``!)@<"0%```3(EN8$F)=4!)@WU8`'4U28-]8`!U+DB+!"0/
-MMGA#0(3_#X0\!```28MU4+D`````2#NPT!(```^$_`,``.D4!```9I!!@`X!
-M28M%8$F)1G!)BT5828E&:$B+%"0/MGI#0(3_=$Y)BW50N0````!(.[+0$@``
-M=!OK+0^VP4B-%$!(C1202(L$)$@YM-#0$@``=1E(BQ0D#[9"08T$@4&(ALP`
-M``#K#;D`````@\$!0#CY=<9(BP0D2(N(^`@```^V@>@(``"^`````#S_="E)
-MBU582(72=!L/ML!(:<#(#P``2`.!D`D``+X`````2#G"="^^`0````^V@>D(
-M```\_W0K28M56$B%TG0?#[;`2&G`R`\``$@#@9`)``!(.<)U"4&(=@'I]P``
-M`(/&`;H`````9I`/MH0*Z@@``#S_="</ML!(C03`2,'@!4@#@6@)``!).T5@
-M=0Q!B'8!Z<````!F9I"#Q@%(@\(!2(/Z!'7#B?%!#[:`Z`@``#S_="9)BU58
-M2(72=06-<0'K&`^VP$AIP,@/``!)`X"0"0``2#G"=>7K*T$/MH#I"```//]T
-M*$F+55A(A=)T'`^VP$AIP,@/``!)`X"0"0``2#G"=09!B'8!ZTN#Q@&Z````
-M`&9FD&9FD$(/MH0"Z@@``#S_="8/ML!(C03`2,'@!4D#@&@)``!).T5@=0M!
-MB'8!ZQ)F9I!FD(/&`4B#P@%(@_H$=<-(BQ0D@'I1`74]28M]6$B%_W0200^V
-MM8$```"Z`````.@`````28N](`$``$B%_P^$O`$``$$/MK4-`0``N@````#H
-M`````$F#O2`!````#X2<`0``28MM6(!]6`!T64&\`````$B-74A)B=](B=_H
-M`````$B-2/!(BU502(E%4$B)61!(B5$82(D"@+D/`0``_W40@'E)`'4*2(.Y
-M(`$```!U"D&#Q`%$.&58=[M$.&58#X61````00^VA0\!``!!B$8"@'U8``^$
-MDP$``+L`````3(UE2$R)Y^@`````2(U(\$B+55!(B4503(EA$$B)41A(B0)(
-MBT%`2(7`=#P/MI$/`0``.%`"=#!(@[B``````'4F2(.XB`````!U'(A0`@^W
-M43A(BP0D2(NP^`@``+\'````Z`````"#PP$X75@/AAH!``#KCD$/MH6!````
-M08A&`D'&A0\!``#_@'U8``^$^@```+L`````9F9FD&9FD$R)_^@`````2(U(
-M\$B+55!(B4503(EY$$B)41A(B0*`N0\!``#_=$S&@0\!``#_2(M!0$B%P'0\
-M#[:1@0```#A0`G0P2(.X@`````!U)DB#N(@`````=1R(4`(/MU$X2(L$)$B+
-ML/@(``"_!P```.@`````@\,!.%U8=G+K@D$/MH6!````08A&`NMB#[;!2(T4
-M0$B-%)!(BP0D2#FTT-`2``!U(DB+%"0/MD)!C02!08A&`4&(ALP````X2D-U
-M%.L-N0````"#P0%`./EUO4'&1@'_0<9&`@!!@[V0`0```'0+08N%E`$``$&(
-M1@))C4X@28V5F````$F+A9@```!)B48@2(M""$B)00A(BT(02(E!$$B+0AA(
-MB4$82(M"($B)02!)C4X,28V5A````$F+A80```!)B48,2(M""$B)00B+0A")
-M01!)BX7`````28E&2$$/MT5H9D&)1EA!#[=%:F9!B49:28M%>$F)1E!!#[:%
-M@@```$&(1EQ!#[:%F`$``$&(AL\```!!]D5,!'4)2(L\).@`````00^V54A(
-MB="#X`9(@_@&=0OVP@%U!D&`#@+K!$&`)OU!#[953-#J@^($00^V!H/@^PG0
-M08@&00^V1@%!B(;.````00^V1@)!B(;-````3(GWZ`````!)BW5`N@````!(
-MBSPDZ`````!,B??HYOC__TB#Q`A;74%<05U!7D%?PV9F9I!F9I!(@^P82(E<
-M)`A(B6PD$$B)_4B+G_@(``#H`````(!]40%U+4B-NY`4``"`?U$!=%N`O8`4
-M````=1>^`````.@`````@(6`%````69FD&9FD$B-G9@!``!(BWTH2(G>Z```
-M``#'A9@!``#H`P``2,>%J`$```````!(B:VP`0``2(M]*$B)WN@`````2(M<
-M)`A(BVPD$$B#Q!C#9F:09F:005154TB#[#!)B?M(B=-(BVXH3(MF,$0/ME4+
-M2(N'^`@``$B+L/@(``!!N`````"_`````+D`````9F9FD&9FD`^VE#'H"```
-M@/K_=$J-@8````!F/8$`=P>#QP'K.6:0#[;"2(N6:`D``$B-!,!(P>`%@+P0
-M%0$```-U&$&#P`%!C4`#@_@&=@Z#QP%!N`````#K`X/'`4B#P0%(@_D&=9]!
-MB?E(B[;X"```2('&D!0``+$`#[:4,>@(``"`^O]T3XV!@````&8]@0!W!8/'
-M`>L^#[;"2(N6:`D``$B-!,!(P>`%@+P0%0$```-U&$&#P`%!C4`#@_@&=A6#
-MQP%!N`````#K"H/'`69F9I!F9I!(@\$!2(/Y!G6:03GZ#XWO!P``13G1#Y[`
-MQP,`````//\/A-0'```/MOA(:?^0%```20.[^`@``.@`````2(G'2(7`#X2R
-M!P``#[:`%0$``#P"#X7%`0``QP,$````#[9U!TB+%P^W1T"Y`````("\`F@(
-M``#_#X29`0``0(#^(P^'@`$``$`/ML;_),4`````0<<$)$53`Q&X`0```&:0
-MZ6T!``!(C4PD++H0`P``O@$```#H`````(3`#X1%`0``BT0D+(7`#X1``0``
-M)?\#``!IP!`G``"-B!"6K_^Z<XBK3(G(]^*)R"G0T>@!PL'J!T&)%"2X`0``
-M`.D2`0``2(U,)"RZ"`,``+X!````Z`````"$P`^$Z@```(M$)"R%P`^$Y0``
-M`"7_`P``:<#H`P``C8C(Y??_NLMK**^)R/?BB<@IT-'H`<+!Z@1!B10DN`$`
-M``#IMP```$B-3"0LN@@#``"^`0```.@`````A,`/A(\```"+1"0LA<`/A(H`
-M``#!Z!`E_P,``&G`Z`,``(V(R.7W_[K+:RBOB<CWXHG(*=#1Z`'"P>H$08D4
-M)+@!````ZUQ(C4PD++H,`P``O@$```#H`````(3`=#B+1"0LA<!T-R7_`P``
-M:<#H`P``C8C(Y??_NLMK**^)R/?BB<@IT-'H`<+!Z@1!B10DN`$```#K#+@`
-M````ZP6X`0````^VR`^VP>GP!0``/`,/A=8%``#'`P0```!$#[9-!TC'!"0`
-M````2,=$)`@`````2,=$)!``````2,=$)!@`````2(L7#[:"_0```(3`#X2A
-M````0;@`````28GC#[;`@^@!3(U0`;X`````N`$```")QT2)P=/G#[:$%NH(
-M```\_W0H#[;`2(T$P$C!X`5(B<%(`XIH"0``2(N!B````$B+0"`/MD`*.?AT
-M$$B#Q@%(@_X$#X0F!0``Z[Q(A<D/A!L%```/MT%`@+P":`@``/\/A`D%``"`
-MN14!```##X7\!```2XD,PTF#P`%-.=`/A7+___]!@/E5#X?7!```00^VP?\D
-MQ0````!!QP0D0`,#$;@!````Z;\$``!(C4PD+$&-00&#X`-(BSS$NC0#``"^
-M`0```.@`````A,`/A),$```/MU0D+(E4)"R!^O__``!U$D''!"3_____N`$`
-M``#I=00``+C`X>0`B=&Z`````/?Q08D$)+@!````Z5D$``!(C4PD+$B+?"0(
-MNA`#``"^`0```.@`````A,`/A#,$``"+1"0L)?\#``!IP!`G``"-B!"6K_^Z
-M<XBK3(G(]^*)R"G0T>@!PL'J!T&)%"2X`0```.D!!```2(U,)"Q(BWPD"+H(
-M`P``O@$```#H`````(3`#X3;`P``BT0D+"7_`P``:<#H`P``C8C(Y??_NLMK
-M**^)R/?BB<@IT-'H`<+!Z@1!B10DN`$```#IJ0,``$B-3"0L2(M\)`BZ"`,`
-M`+X!````Z`````"$P`^$@P,```^W1"0N)?\#``!IP.@#``"-B,CE]_^ZRVLH
-MKXG(]^*)R"G0T>@!PL'J!$&)%"2X`0```.E0`P``2(U,)"Q(BWPD"+H,`P``
-MO@$```#H`````(3`#X0J`P``BT0D+"7_`P``:<#H`P``C8C(Y??_NLMK**^)
-MR/?BB<@IT-'H`<+!Z@1!B10DN`$```#I^`(``$B-3"0L2(L\)+H4`P``O@$`
-M``#H`````(3`#X33`@``BU0D+('B_P,``$AITCJX`0!(@<+C2@,`2,'J!4BX
-M0WBT<<1:?`I(]^)(P>H'08D4)+@!````Z9T"``!(C4PD+$B+?"0(NA0#``"^
-M`0```.@`````A,`/A'<"``"+5"0L@>+_`P``2&G2.K@!`$B!PN-*`P!(P>H$
-M2+B%\&CCB+7X%$CWXDC!Z@A!B10DN`$```#I00(``$B-3"0L2(M\)!"Z%`,`
-M`+X!````Z`````"$P`^$&P(``(M4)"R!XO\#``!(:=+F$T`"2('"#?].!$BX
-MO4)ZY=64O]9(]^)(P>H708D4)+@!````Z>D!``!(C4PD+$B+?"08NA0#``"^
-M`0```.@`````A,`/A,,!``"+5"0L@>+_`P``2&G2KD7A`$B!PBE2KP%(N-LT
-MMM>"WAM#2/?B2,'J$D&)%"2X`0```.F1`0``2(U,)"Q(BWPD"+JP`P``O@$`
-M``#H`````(3`#X1K`0``BT0D+,'H#X/@`4&)!"2X`0```.E8`0``@'T(`'01
-M2(M$)`B!H!@!``#_]___ZP](BT0D"(&(&`$````(``!(BWPD".@`````N`$`
-M``#I'@$``(!]"`!T$4B+1"0(@:`8`0``_^___^L/2(M$)`B!B!@!````$```
-M2(M\)`CH`````+@!````Z>0```"`?0@`=!%(BT0D"(&@&`$``/_?___K#TB+
-M1"0(@8@8`0```"```$B+?"0(Z`````"X`0```.FJ````@'T(`'012(M$)`B!
-MH!@!``#_O___ZP](BT0D"(&(&`$```!```!(BWPD".@`````N`$```#K<X!]
-M"`!T$4B+1"0(@:`8`0``___^_^L/2(M$)`B!B!@!``````$`2(M\)`CH````
-M`+@!````ZSR`?0@`=!%(BT0D"(&@&`$``/___?_K#TB+1"0(@8@8`0`````"
-M`$B+?"0(Z`````"X`0```.L%N``````/ML#K!;@`````#[;`ZQ*X`````.L+
-MQP,`````N`````!(@\0P6UU!7,-F9F:09F:09F:005=!5D%505154TB#[#A)
-MB?R)\$B)TTF)S4&)]D'![AA!B?=!P>\0#[;4B%0D$$"(="0/2(VKD!0``+@`
-M````D,8$&`!(@\`!2#T@*P``=?!,B6L@BP4`````B$-`@\`!B04`````1(AS
-M.T2(>SH/MD0D$(A#.0^V5"0/B%,XQD-!`$$/MP0D9HE#,$$/MT0D`F:)0S)!
-MBT0D!(E#-$B-DR`I``!(B9.(%```3(EM(`^V0T"(14!$B'4[1(A].@^V1"00
-MB$4Y#[9$)`^(13C&14$!00^W!"1FB44P00^W1"0"9HE%,D&+1"0$B44T2(F5
-MB!0```^W0S)F/20G#X04`0``9CTD)P^'A````&8]1"$/A``!``!F/40A=T1F
-M/2`A#X3P````9CT@(7</9CU0!P^%]````.G;````9CTB(9`/A-````!F/4`A
-M9F:09F:0#X74````Z;L```!F9I!FD&8]$"</@L````!F/1$G9I`/AJ````!F
-M+2`G9H/X`F:0#X>D````Z8L```!F9I!FD&8]@"</A'P```!F/8`G9I!W+F8]
-M0"=T;F8]0"=F9F:0=PAF/3`G=7+K7&8]1"=FD'149CU@)W5BZTQF9I!F9I!F
-M/8!R=$!F/8!R9F:09F:0=PAF/8(G=4+K+&8]@)%FD'0.9CV`E'4RZQQF9I!F
-M9I!FQT,\@)'&0SX$9L=%/("1QD4^!.L49L=#/("4QD,^!&;'13R`E,9%/@1!
-M#[9$)`B(0T)!#[9$)`B(14*Y```$`+H`````O@(```!,B>_H`````$B)`[D`
-M(```N@````"^`````$R)[^@`````2(G!2(E#$$B+`TB%P`^$Y0$``$B%R0^$
-MW`$``$B-D``"`0!(B5,(2(V````"`$B)`T@%`$```$B)10!(B54(2(E-$$2+
-M!0````!%A<!^9[X`````N0````!(Q\<`````#[<$.69!.P0D=3\/MX$`````
-M9D$[1"0"=3"+D0````"#P@&)D0````!$BXD`````187)=!5$.<IV$(G0N@``
-M``!!]_&)D0````"#Q@%(@\$81#G&=:I(BT,(2"W@?0``QP`!\`,`2(M#"$@M
-MV'T``,<``0``Z$B+>R"^>````.@`````B<(E`'```#T`(```=A2`YH^`SB!(
-MBWL@OG@```#H`````$2(="0C1(A\)"(/ME0D$(A4)"$/MD0D#XA$)""]````
-M`$&Y`````$G'Q`````!,C6PD(&9#@SPA``^$H@```$&`N0``````#X2$````
-M0;@`````2&/%3(T4Q0````!-B>M+C00"2(TTA0````"Y!````/Q,B=_SI@^7
-MP@^2P#C"=3M!#[:!`````(/``4&(@0````!!#[:1`````(32=!TXT'89#[;`
-M#[;*N@````!F]_%!B)$`````9F9FD$&-4`%)@\`!00^V@0`````YT'^0@\4!
-M28/!((/]!`^%4O___\>#$`D```$```"X`0```.L%N`````!(@\0X6UU!7$%=
-M05Y!7\-F9F:09F:005154TB)^TB)]4B+?WA!O`$```!$(B.X`````&9F9I#&
-M!"@`2(/``4B#^"AU\DB+MX@4``!(B?*P`&9FD&9FD,8$$`!(@\`!2#T``@``
-M=?!(C4XVN@````!F9F:09F:0#[9$4R&(!%$/MD13((A$40%(@\(!2(/Z%'7E
-M2(U.%+(`#[9$4PV(!%$/MD13#(A$40%(@\(!2(/Z"G7E2(U.+K(`#[9$4TF(
-M!%$/MD132(A$40%(@\(!2(/Z!'7E2(EU&$B+0U!(@\`!2(E%`$B#>V``=4'V
-M`P%T/$B+0VA(A?\/E<)(A<!T$H32=`X/MD!;@+P':`@``/]U&TB+0W"$TG0<
-M2(7`=!</MT!`@+P':`@``/]T"0^V0P&(10SK(.@`````2(7`=!*`N!4!```"
-M=0D/MD,!B$4,ZP3&10S_#[9#`HA%#;@!````]D-:$'0$#[9#7(A%#L9%$A#&
-M11$01(G@C10`OOW___]`(G4*"=9`B'4*P>`%#[9-"(/AWPG!B$T(#[=#6$C!
-MZ`>#X`'!X`:#X;\)P8A-"`^W0UA(P>@"@^`!#[95"8/B_@G"B%4)#[=#6DC!
-MZ`/!X`>#X7\)P8A-"`^W0UI(T>B#X`$!P(/B_0G"B%4)#[=#6$C!Z`.#X`'!
-MX`:#XK\)PHA5"0^W0UI(P>@$P>`'@^)_"<*(50F#R1"(30@/M@/0Z(/@`8/F
-M_@G&0(AU"@^V`X/@!(/F^PG&0(AU"F;'110`$`^V@\\```"(10\/MH/,````
-MB$4@6UU!7,-F9F:09F9FD&9FD$%6055!5%5308GU08G62(G+3(G%2(7)=!>X
-M`````&:0Q@08`$B#P`%(/:P```!U\$B%[709N`````!F9I!F9I#&!"@`2(/`
-M`4B#^"AU\DR+I_@(``!!#[;U3(GGZ`````")PF:%P'0.#[?`08"\!&@(``#_
-M=4A-BZ0D^`@``$F!Q)`4``!)B[PD^`@``.@`````02G%00^V]4R)Y^@`````
-MB<)FA<`/A$\#```/M\!!@+P$:`@``/\/A#T#```/M\)!#[:$!&@(``!F@?J!
-M``^'4@(``$F+C"20"0``#[?`2&G`R`\``$B--`%(A=L/A-8```!(BU802(72
-M='5!#[:$).@(```\_W08#[;`2&G`R`\``$B-!`&_@````$@YPG0E00^VA"3I
-M"```//]T'`^VP$AIP,@/``!(C00!2#G"=0F_@0```$"(>P*`?EH`=#"Z````
-M``^VP@^V3`9PN`$```#3X`E#((/"`3A66G81Z^3&0P+_2(M&"`^V0`V)0R#&
-M`P$/MD99B$,!2(M&>$B)0P1(BX:(````2(E##$B+AI````!(B4,4BX:@````
-MB4,<1(EK)`^VAL````")0RBX`````.DV`@``2(7M#X0H`@``187V#X@?`@``
-M#[:&P````$$YQ@^-#P(``$ECQDB-!$!(P>`$2`'P2(V0P`````^V2@B(30`/
-MME()B%4!2(N`T`````^V`(/@#XA%`H#Y`W0N@/D#=PZ`^0(/A:D```#IJP``
-M`(#Y!&9FD&9FD'1`@/D2#X60````9F:09I#K7TECQDB-!$!(P>`$2(N4!M``
-M```/MD(!@^`'#[;`P>`(#[92`@'0C02``<")103K8$ECQDB-!$!(P>`$2(N$
-M!M`````/MD`"A,!U"<=%!`````#K/`^VP(/H%(E%!.LQ26/&2(T$0$C!X`1(
-MBY0&T`````^V0@+!X`@/ME(#`="-!(`!P(E%!.L'QT4$`````$B-30A)8\9(
-MC01`2,'@!$B-A`;0````2(U0"$B+0`A(B44(2(M""$B)00A(BT(02(E!$$B+
-M0AA(B4$8N`````#IV0````^WP$B-!,!(P>`%2(G%20.L)&@)``#&0P+_Q@,"
-M28N4)&@)```/MD00.XA#`4B+A8@````/MD`-B4,@#[:%%0$``#P"=2O'0P1(
-M4%0`QT,,4F]C:\=#$&5T4W3'0Q1O<B``#[=U/DB->Q?HNL+__^M'/`-U(<9#
-M`1#'0R`!````QT,$2%!4`,=##$5*,S1FQT,0,`#K(L9#!'8/MW4\2(U[!>B"
-MPO__QD,,9`^W=3Y(C7L-Z''"___&0QQR#[9U.4B->QWH(,+__T2):R2X````
-M`.L%N/____];74%<05U!7L-F9F:09F:0055!5%5308GU2(G3N`````#&!!@`
-M2(/``4@]*`T``'7P2(NO^`@``$$/MO5(B>_H`````(G"9H7`=`T/M\"`O`5H
-M"```_W5%2(NM^`@``$B!Q9`4``!(B[WX"```Z`````!!*<5!#[;U2(GOZ```
-M``")PF:%P`^$D0,```^WP("\!6@(``#_#X2``P``#[?"#[:$!6@(``!F@?J!
-M``^'C0(``$B+C9`)```/M\!(:<#(#P``3(T$`4F+4!!(A=)T=`^VA>@(```\
-M_W08#[;`2&G`R`\``$B-!`&^@````$@YPG0C#[:%Z0@``#S_=!P/ML!(:<#(
-M#P``2(T$`4@YPG4)OH$```!`B',"08!X6@!T,KH`````#[;"00^V3`!PN`$`
-M``#3X`E#((/"`4$X4%IV$>OBQD,"_TF+0`@/MD`-B4,@Q@,!00^V0%F(0P%)
-MBT!X2(E#!$F+@(@```!(B4,,28N`D````$B)0Q1!BX"@````B4,<1(EK)$&`
-MN,``````#X2+`@``0;D`````00^V^4ACQTB-#(!(C0S+2(T$0$C!X`1,`<!(
-MC9#`````#[9R"$"(L:@````/ME()B)&I````2(N`T`````^V`(/@#XB!J@``
-M`$"`_@-T-$"`_@-W$4"`_@(/A=,```!FD.G>````0(#^!&9F9I!F9I!T2T"`
-M_A(/A;4```!F9F:0ZWU(8\](C01)2,'@!$F+E`#0````2(T,B0^V0@&#X`</
-MML#!X`@/ME("`="-!(`!P(F$RZP```#IA@```$ACUTB-!%)(P>`$28N$`-``
-M```/MD`"A,!U$4B-!)+'A,.L`````````.M:2&/72(T4D@^VP(/H%(F$TZP`
-M``#K1$ACSTB-!$E(P>`$28N4`-````!(C0R)#[9"`L'@"`^V4@,!T(T$@`'`
-MB83+K````.L22&/'2(T$@,>$PZP`````````2&/'2(T4@$B-E-.@````2(UR
-M$$B-!$!(P>`$28V$`-````!(C4@(2(M`"$B)0A!(BT$(2(E&"$B+01!(B480
-M2(M!&$B)1AA!@\$!13B(P`````^&Z0```.E?_O__#[?`2(T$P$C!X`5)B<1,
-M`Z5H"0``QD,"_\8#`DB+E6@)```/MD00.XA#`4F+A"2(````#[9`#8E#($$/
-MMH0D%0$``#P"=2W'0P1(4%0`QT,,4F]C:\=#$&5T4W3'0Q1O<B``00^W="0^
-M2(U[%^B>OO__ZTL\`W4AQD,!$,=#(`$```#'0P1(4%0`QT,,14HS-&;'0Q`P
-M`.LFQD,$=D$/MW0D/$B->P7H9+[__\9##&1!#[=T)#Y(C7L-Z%&^___&0QQR
-M00^V="0Y2(U['>C^O?__1(EK)+@`````ZPRX_____^L%N`````!;74%<05W#
-M05154T&)]$B)T[@`````D,8$&`!(@\`!2#VD#```=?!(BZ_X"```00^V]$B)
-M[^@`````B<)FA<!T#0^WP("\!6@(``#_=4=(BZWX"```2('%D!0``$B+O?@(
-M``#H`````$2)YBG&0`^V]DB)[^@`````B<)FA<`/A&<#```/M\"`O`5H"```
-M_P^$5@,```^WP@^VA`5H"```9H'Z@0`/AV<"``!(BXV0"0``#[?`2&G`R`\`
-M`$R-!`%)BU`02(72='0/MH7H"```//]T&`^VP$AIP,@/``!(C00!OH````!(
-M.<)T(P^VA>D(```\_W0<#[;`2&G`R`\``$B-!`%(.<)U";Z!````0(AS`D&`
-M>%H`=#*Z``````^VPD$/MDP`<+@!````T^`)0R"#P@%!.%!:=A'KXL9#`O])
-MBT`(#[9`#8E#(,8#`4$/MD!9B$,!28M`>$B)0P1)BX"(````2(E##$F+@)``
-M``!(B4,408N`H````(E#'$&`N,``````#X1E`@``0;D`````00^V^4ACQTB-
-M#(!(C0S+2(T$0$C!X`1,`<!(C9#`````#[9R"$"(<20/ME()B%$E2(N`T```
-M``^V`(/@#XA!)D"`_@-T,$"`_@-W#T"`_@(/A<````#IR@```$"`_@1F9I!F
-MD'1%0(#^$@^%I@```&9F9I#K<4ACSTB-!$E(P>`$28N4`-````!(C0R)#[9"
-M`8/@!P^VP,'@"`^V4@(!T(T$@`'`B43+*.MZ2&/72(T$4DC!X`1)BX0`T```
-M``^V0`*$P'4.2(T$DL=$PR@`````ZU%(8]=(C122#[;`@^@4B433*.L^2&//
-M2(T$24C!X`1)BY0`T````$B-#(D/MD("P>`(#[92`P'0C02``<")1,LHZP](
-M8\=(C02`QT3#*`````!(8\=(C12`2(U4TR!(C7(,2(T$0$C!X`1)C80`T```
-M`$B-2`A(BT`(2(E"#$B+00A(B48(2(M!$$B)1A!(BT$82(E&&$&#P0%%.(C`
-M````#X;E````Z8'^__\/M\!(C03`2,'@!4F)Q$P#I6@)``#&0P+_Q@,"2(N5
-M:`D```^V1!`[B$,!28N$)(@````/MD`-B4,@00^VA"05`0``/`)U+<=#!$A0
-M5`#'0PQ2;V-KQT,09713=,=#%&]R(`!!#[=T)#Y(C7L7Z*.Z___K2SP#=2'&
-M0P$0QT,@`0```,=#!$A05`#'0PQ%2C,T9L=#$#``ZR;&0P1V00^W="0\2(U[
-M!>AINO__QD,,9$$/MW0D/DB->PWH5KK__\9#'')!#[9T)#E(C7L=Z`.Z__^X
-M`````.L,N/_____K!;@`````6UU!7,-F9F:09F9FD&9FD$%455-!B?1(B=.X
-M`````)#&!!@`2(/``4@]``$``'7P2(NO^`@``$$/MO1(B>_H`````(G"9H7`
-M=`T/M\"`O`5H"```_W5'2(NM^`@``$B!Q9`4``!(B[WX"```Z`````!$B>8I
-MQD`/MO9(B>_H`````(G"9H7`#X39`0``#[?`@+P%:`@``/\/A,@!```/M\(/
-MMH0%:`@``&:!^H$`#X?9````2(N-D`D```^WP$AIP,@/``!(C30!2(M6$$B%
-MTG1Q#[:%Z`@``#S_=!@/ML!(:<#(#P``2(T$`;^`````2#G"=",/MH7I"```
-M//]T'`^VP$AIP,@/``!(C00!2#G"=0F_@0```$"(>P*`?EH`=#"Z``````^V
-MP@^V3`9PN`$```#3X`E#((/"`3A66G81Z^3&0P+_2(M&"`^V0`V)0R#&`P$/
-MMD99B$,!2(M&>$B)0P1(BX:(````2(E##$B+AI````!(B4,4BX:@````B4,<
-MN`````#IW@````^WP$B-!,!(P>`%28G$3`.E:`D``,9#`O_&`P)(BY5H"0``
-M#[9$$#N(0P%)BX0DB`````^V0`V)0R!!#[:$)!4!```\`G4MQT,$2%!4`,=#
-M#%)O8VO'0Q!E=%-TQT,4;W(@`$$/MW0D/DB->Q?H,;C__^M+/`-U(<9#`1#'
-M0R`!````QT,$2%!4`,=##$5*,S1FQT,0,`#K)L9#!'9!#[=T)#Q(C7L%Z/>W
-M___&0PQD00^W="0^2(U[#>CDM___QD,<<D$/MG0D.4B->QWHD;?__[@`````
-MZP6X_____UM=05S#2(/L*$B)'"1(B6PD"$R)9"003(EL)!A,B70D($B)^TF)
-M]$R+=WA(BT9(2(DX2(M'8$B%P'4:QH:R`````DB)]_^6R````.EJ!@``9F:0
-M9I#V0$P"=!K&AK(````"2(GW_Y;(````Z4H&``!F9I!FD$R)]^@`````2(G%
-M2(7`9I!U'D'&A"2R`````DR)YT'_E"3(````Z1H&``!F9I!FD,>`E```````
-M``!,B6!H2(M#8$B)12A(BT-@#[=`.&:)12#&122`00^VA"2P````/`(/A&D!
-M```\`G<*A,!T')#I0@,``#P##X3P`0``/`20#X4Q`P``Z;@!``!(BT-@]D!H
-M`0^$GP```$$/MH0DL0```*@"=`;&13B(ZQ"#X`0\`1G`@^`%@^AVB$4X28N4
-M))````!!#[>,))@```#&13D`2(G02,'H.(A%.DB)T$C!Z#"(13M(B=!(P>@H
-MB$4\2(G02,'H((A%/4B)T$C!Z!B(13Y(B=!(P>@0B$4_2(G02,'H"(A%0(A5
-M0<9%0@#&14,`B<AFP>@(B$5$B$U%QD5&`,9%1P#K;4$/MH0DL0```*@"=`;&
-M13@HZQ"#X`0\`1G`@^`%@\`JB$4X28N4))````!!#[>,))@```#&13D`2(G0
-M2,'H&(A%.DB)T$C!Z!"(13M(B=!(P>@(B$4\B%4]QD4^`(G(9L'H"(A%/XA-
-M0,9%00!(BT-@2`7L````2(E%4,9%,"`/M\'!X`F)132#C90````"Z?D!``!F
-M9F:000^VA"20````/!!W!?8#`G4.0<:$)+(````&Z20$``!(C7TX#[;028VT
-M))@```#H`````$B+0V!(!>P```!(B450QD4P((&-E```````$`#&126K0?:$
-M)+$````&#X22`0``08N$))0```")133I@@$``$$/MH0DL0```(/@,#P@=1'&
-M13@;QD4Y`<9%/`#I80$``,9%.#7I6`$``$B+0V`/MD!(J`%T)Z@$=".!C90`
-M`````"``00^WE"2<````9D$[E"22````=1/K8V9FD$'&A"2R````!NEF`P``
-M00^VA"2;````/.-T13SC=Q,\0G0]/+!T'3Q`=2=F9I!FD.LN/.QT#CSO="8\
-MY69F9I!U$.L<9D&)E"22````9F:0ZPY!QH0DL@````;I%`,``,9%.+!!#[>$
-M))````"(13E!#[>$))(```"(13I!#[>$))0```"(13M!#[>$))8```"(13Q!
-M#[>$))@```"(13U!#[:$))H```"(13Y!#[:$))L```"(13]!#[:$))$```"(
-M14!!#[:$)),```"(14%!#[:$))4```"(14)!#[:$))<```"(14-!#[:$))D`
-M``"(141!]H0DL0````9T)D$/MX0DG````,'@"8E%-(.-E`````3K#D'&A"2R
-M````!NE/`@``2,>%H`````````!!#[:$)+$```"H!@^$'P(``*@"=`F#C90`
-M```(ZP>#C90````03(UM6$F+G"2X````2(7;=`M!]H0DL0````%U-DF+A"3`
-M````2(7`#X0*`@``28NV2`H``+H`````3(GG_]"%P`^$\0$``$F+GD@*``!(
-MA=MT.4B)[^@`````O@````!,B>_H`````$B#PQ"+4_!(BW/X3(GOZ`````"+
-M0_1(@\,0A<`/A8D!``#KX+X`````3(GOZ`````"+130]``@``'<[3(GWZ```
-M``!(B<%(A<!U#D'&A"2R````"^E?`0``2(M`$$B)14A(B4UXBU4T2(MQ&$R)
-M[^@`````ZU0]```!`'<_3(GW9F9FD.@`````2(G!2(7`=0Y!QH0DL@````OI
-M&0$``$B+0!!(B45(2(E->(M5-$B+<1A,B>_H`````.L.0<:$)+(````&Z>X`
-M``!!#[:$)+$```"H!`^$T````$&`O"2P`````W4>28NT)*````!(A?9T$4B+
-M?4B+533H`````.FG````28N4)+@```!(A=)U$TF+A"3`````2(7`#X6X````
-MZV%,BVU(J`%U"DB)TV9FD&:0ZRE)BX0DP````$B%P'0<28NV2`H``+H!````
-M3(GG_]"%P'0'28N>2`H``$B#PQ"+4_!(BW/X3(GOZ`````"+0_!)`<6+0_1(
-M@\,0A<!U*.O>BT4T2(M-2(7`=!N)PDB)R,8``$B#P`%(@^H!=`GK\8.-E```
-M``%(B>Y,B??H`````.LQ2(GN3(GWZ`````!,B>=!_Y0DR````.L9NP````#I
-M2O[__TR+;4AF9I!F9I#I6O___TB+'"1(BVPD"$R+9"003(ML)!A,BW0D($B#
-MQ"C#9F9FD&9F9I!F9I!F9I!54TB#[`A(B?U(B?.X`````,8$&`!(@\`!2#V`
-M````=?"#O1`)```!#Y1#$P^V53H/MDTY#[9U.`^V13N(0P.(4P*(2P%`B#.`
-M2Q$0#[=%,&:)0P0/MT4R9HE#!HN%$`D``(A#<,9#$B`/MU4R9H'Z("%T!V:!
-M^B(A=4C&0Q<"2(U#/,=#/%)O8VO'0T!E=%)!QT`(240@4\=`#%-$(#+'0!`Q
-M,G@@QT`40V]N=,=`&')O;&QFQT`<97+&0!X`Z0D!``"-@O#8__]F@_@!=A)F
-M@?I`(70+9H'Z1"$/A:L```#&0Q<$#[=5,HV"\-C__V:#^`%W1$B-0SS'0SQ2
-M;V-KQT-`97120<=`"$E$(#+'0`PW,7@@QT`04T%3(,=`%$-O;G3'0!AR;VQL
-M9L=`'&5RQD`>`.F3````9H'Z0"%T"V:!^D0A#X6!````2(U#/,=#/%)O8VO'
-M0T!E=%)!QT`(240@4\=`#%-$(#+'0!`Q-'@@QT`40V]N=,=`&')O;&QFQT`<
-M97+&0!X`ZT#&0Q<(2(U#/,=#/$1A=&''0T!#96YTQT`(97(@-\=`##(X,"#'
-M0!!3051!QT`4($-O;L=`&'1R;VS'0!QL97(`#[9#$O9C%X3`NH#___\/1,*(
-M0Q!(C4,8QT,82&EG:,=#'%!O:6['0`AT(%1EQT`,8VAN;\=`$&QO9VG'0!1E
-M<RP@QT`826YC+L9`'`!(BX4("0``2(7`=`I(BT`02(E#:.L(2(M%$$B)0VC'
-M0V``(```2(M](+Y\````Z`````")PH'B\`,``,'J!(A3<8/@#XA#<TB+?2"^
-M@````.@`````B<*!X@``\`/!ZA2(4W(E```/`,'H$(A#=$B#Q`A;7<-FD$%7
-M059!54%455-(@^P(28G]B?5(B=.X`````&9FD&:0Q@08`$B#P`%(/=````!U
-M\(EK"(/]/WX*28'%D!0``(/M0$ACQ;H`````28.\Q6@$````#X72`@``2&/%
-M28F<Q6@$``!,B6MX2(F+@````$R)@Y````!!@'U1`0^%I0(``(']A0````^/
-M@P(``$$/MH0%:`@``#S_#X1R`@``#[;`9HE$)`8/M\!(C11`2(T4D$C!X@5)
-MB=1-`Z5`"0``0?9$)$L$#X1%`@``08M$)$@E`/__`#T``/\`#X4P`@``0?9$
-M)$P$#X2<`0``0<:$).@`````00^V1"1(2(G"@^(&2(/Z!G4YJ`$/A!`!``!!
-MQD0D2@5!QD0D2P1!#[:4)($```!)BW0D6$F+?"103(GAZ`````"Z`0```.GK
-M`0``2(/Z!`^%W`$``*@!9F9FD`^$T`$``$F+7"1028M$)&!(A<`/A84```!!
-MQD0D2@-!QD0D2P2`>PX`=$^]`````$R-<V!,B??H`````$B)PDB+0VA(B5-H
-M3(DR2(E""$B)$(!Z2O]T&$DYU'030<:$).D````!N@$```#I;`$``(/%`0^V
-M0PXYZ'^Z08"\).D````!#X1-`0``3(GF3(GOZ`````"Z`0```.D]`0``@'A"
-M``^%+@$``&:#8$[]28M$)&!FQT!.(`!)BW0D8$R)[^@`````N@$```#I#`$`
-M`$F+1"10#[9`#4&`?3X`="V[``````^VZ`^VRTB)Z$C3^*@!=`^Z`````(G.
-M3(GOZ`````"#PP%!.%T^=]M!QD0D2P9!QD0D2@5F0<>$),@``````$R)YDR)
-M[^@`````N@$```#IHP```$V+9"1008!\)`X`=%U!O@````!-C7PD8$R)_^@`
-M````2(G"28M$)&A)B50D:$R).DB)0@A(B1"`>DK_="(/MD))/")T!#P-=19(
-M8\5)QX3%:`0```````"Z`````.M$08/&`44X="0.=ZX/MU0D!DB)WDR)[^@`
-M````N@$```#K(F9F9I!F9I!(8\5)QX3%:`0```````"Z`````.L%N@$```")
-MT$B#Q`A;74%<05U!7D%?PY"0D)!(BP4`````2(E'"$B)/0````##9F9FD&9F
-MD&9FD&9FD(L%``````6H`@0`PV9F9I!(A?]T&TB+%TB%TG0,2(7V=`=(BT((
-M2(D&2(G0PV9FD$B+%0````#KWV9F9I!F9I"+1A1(C80'J`($`,-F9F:04TB)
-M\TB![``!``!(BT<(2(M_$$B-M"2`````_U`X2(M#"$B)YDB+>Q#_4#@/MD0D
-M`3B$)($```!V#K@!````2('$``$``%O#<B8/MD0D`CB$)((```!WXG(6#[9$
-M)`,XA"2#````=])R!C'`Z]%FD+C_____Z\AF9I!F9I!F9I!!5%5(B?U32(L=
-M`````$B%VW4*ZWM(BQM(A=MT<TB+0Q!(A<!T<4B+50A(.U`(=>5(BW`02(M]
-M$/]22(3`=-9(BW,03(UC$$B%]G4=ZV-FD$B)[^@`````A<!X54V+)"1)BS0D
-M2(7V=$A(BT4(2(N0``$``$B%TG372#M&"'712(MV$$B+?1#_TNO-9F:09I`Q
-MP%M=05S#2,=%``````!(B5T8N`$```!(B6L06UU!7,-)BP0D2(E=&$B)10"X
-M`0```$F)+"3KRF9F9I!F9F:02(L%`````$B)!XM'$$B)/0````"%P'02BP4`
-M````B4<4`T<0B04`````\\-F9F:00515B?U32(L=`````$B%VW0Q0#A["$0/
-MMN=U"NLE9I!`.&L(=!U(BT-H2(7`9F:0=`E$B>?_T(7`=0A(BQM(A=MUW4B)
-MV%M=05S#9F:09I!,BT<82(U7&#')3#G"="-!.8B@_/__3(G`=0WK&69FD#F(
-MH/S__W0.2(L`2#G"9I!U[HE.,,.#P0'KSV9FD&:02(L5`````+C0````2(72
-M=!@QR8M"'$B+$CG!#T+(2(72=?"-@=````#SPV9FD&:02(M7&$B-3QA(.<IT
-M*CFRH/S__TB-@G#\__]U$^L=9I`YLJ#\__](C8)P_/__=`I(BQ)(.<IUZ3'`
-M\\/SPV9FD%-(BU\02(7;=!QF9I!F9I!(BT,(2(M[$/^0V````$B+&TB%VW7J
-M6\-F9F:09F9FD$B)_DB+/^D5____9F:09I"+5S"%TG@'QT<P______/#,<"%
-M]G0=,<DQTF9FD&9FD`^V!X/"`4B#QP$!P3GR=?`/ML'SPV9F9I!F9F:09F:0
-M2(L%`````$B%P'0N2(M0$$B%TG0=2#EZ$'4-9F:09I#K&D@Y>A!T$DB+$DB%
-MTF:0=?!(BP!(A<!UTO/#\\-FD$B+3QA(@\<82#GY=$-,8\KK"$B+"4@YSW0V
-M@+F`_/__!$B-@7#\__]VZ#FQJ/S__W7@A=)X'4R+@8C\__]-A<!TT$LY1,A@
-M=<GSPV9FD&:0,<##2(.YB/S__P!UM?/#D$%428G\54F-;"084^@`````28M<
-M)!A(.>MT+69FD&:0BW/X2(V[</S__X7V=!)(BX-X_/__2(M`6$B%P'0"_]!(
-MBQM(.>MUV$R)YV9FD&:0Z`````!)BT0D&$@YZ'4+D.L:2(L`2#GH=!*+2/2%
-MR9!T\%M=05RX`0```,-;74%<,<##9F9FD&9FD&9FD&9FD$%4,<!)B?Q54X"_
-MD`($``!U+4B+7Q!(A=MT(C'M9F:02(M#"$B+>Q#_D*@```!(BQL)Q4B%VW7H
-M0(3M=0<QP%M=05S#3(GGZ`````!;0`^VQ5U!7,-F9F:09F9FD&9FD$%6055!
-M5%5(B?U3Z`````!(BYTP`0``28G&2(7;#X2<````08G%2(M#"$B)VDR-I3`!
-M``!$*?"%P'X0Z8\```!(BT((1"GHA<!_.DB+0BA(A<!T!$R)8"!(B84P`0``
-M2,="(`````!(B<-(QT(H`````$B+>AC_4A!(BY4P`0``2(72=;M(B>_H````
-M`$B%VW0,2(N%,`$``$@YV'0)6UU!7$%=05[#6TB+<`A(BWT(74%<05U$*?9!
-M7ND`````6TB)[UU!7$%=05[I`````$B)[^@`````Z[EF9F:09F:054B)_5-(
-MB?-(@^P(Z`````!(BU,@2(G!2(72=!Q(BT,H2(7`=`A(B5`@2(M3($B)`DC'
-M0R``````BP-(BY4P`0``2(722(T$`4B-C3`!``!(B4,(="6)QDB+0@@I\(7`
-M?@SK,DB+0@@I\(7`?RA(C4HH2(M2*$B%TG7I2(E3*$B)&4@YG3`!``!(B4L@
-M="-(@\0(6UW#2(E3*$B)&4B-0RA(.9TP`0``2(E+($B)0B!UW4B+?0B+,TB#
-MQ`A;7>D`````9F9FD&9FD&9FD&9FD%5(B?U32(/L"$B+5B!(A=)T7DB+1BA(
-MBX\P`0``2(7`=`A(B5`@2(M6($B)`DC'1B@`````2(N%,`$``$C'1B``````
-M2(7`="=(.<%T(HM8".@`````2(M]"$B#Q`@IPXG>6UWI`````&9F9I!F9I!(
-M@\0(6UW#9F:09F:09F:054B)_5-(@^P(2(M?$$B%VW48ZRY(BT,(2(M[$/^0
-MT````$B+&TB%VW08@'MH`'3D2(M#"$B+>Q`Q]O]04&9FD.O22(/$"$B-M3@!
-M``!(B>];7>D`````9F:09F:09F:0051)B?Q54TB+7Q!(A=MU"NLT2(L;2(7;
-M="Q(BT,(2(M[$/^0X````(![:`!TY$B+0PA(BWL0O@$```#_4%!(BQM(A=MU
-MU$F+7"0828UL)!A(.>MU"NLR2(L;2#GK="J`NX#\__\!2(V[</S__W7H2(N#
-M>/S__TB+0%A(A<!TV/_02(L;2#GK==:`/0``````=05;74%<PTF-G"0X`0``
-M3(GG2(G>Z`````!!QX0D.`$```"'DP-)QX0D2`$```````!(B=Y-B:0D4`$`
-M`$R)YUM=05SI`````&9F9I!F9I!!54F)_4%454B)]5-(@^P(2(7V='U(BT4(
-M2(M]$/^0X````(!]:``/A;<```!)BUT838UE&$PYXW4.ZS]F9F:02(L;3#GC
-M=#.`NX#\__\!2(V[</S__W7H2#FKZ/S__W7?2(N#>/S__TB+0%A(A<!TS__0
-M2(L;3#GC=<U(BVT`2(7M=!M(@\0(2(GH6UU!7$%=PTB+;Q!(A>T/A7;___^`
-M/0``````=-Q)C9TX`0``3(GO2(G>Z`````!!QX4X`0```(>3`TG'A4@!````
-M````2(G>38FM4`$``$R)[^@`````ZZ!(BT4(2(M]$+X!````_U!0Z33___]F
-M9F:09F:04TB)^^@`````2(G!QT`0`````$B-@-````!(C5%02(E!2(M##"W0
-M````B4%`2(U!&$B)01A(B4$@,<!F9I!FD,8$$`!(@\`!2#V`````=?!;2(G(
-MPV9F9I!F9F:09F:02(/L&$B)'"1(B6PD"(G53(ED)!`QTCEN"$F)_$B)\W(@
-M2(GWZ`````"):!!(B<),B2!(B5@(BT,(@\`!*>B)0PA(BQPD2(ML)`A(B=!,
-MBV0D$$B#Q!C#9F:09F:09F:0B?!(C;>P````B<+I`````(M&$`-'"(/H`8E'
-M".D`````9F9FD&9F9I!F9F:09F:02(GX2(L_2(G&2(''L````.D`````9F9F
-MD&9F9I!F9I!!5D%528G]051,C6<855-(BU\83#GC=1#K6F9FD&9FD$B+&TPY
-MXW1,@+N`_/__`4B-NW#\__]UZ`^V@]3\__^H0`^%N@$``(`]``````!TT*@"
-M=<RH`0^%YP$``/:#U/S__P1UNX"+U/S__R1(BQM,.>-UM$F+72A)C6TH2#GK
-M=!%(C7OHZ`````!(BQM(.>MU[TF+;1A,.>4/A-````"0@+V`_/__!$B-O7#\
-M__]V#DB#O8C\__\`#X1R`0``2(MM`$PYY77928M=&$PYXP^$FP```$4Q]NL/
-M9F9FD&9FD$B+&T@YZW19@+N`_/__`4B-NW#\__]UZ/:#U/S__R!TWTB+@ZC\
-M__^`H]3\___;2(7`=1CI\@```&9F9I!F9I!(BP!(A<`/A-\```!(@W@8`'3M
-M2(L;0;X!````2#GK=:=)BUT823G<="5F9I!F9I#V0_`!2(VK</S__W0*2(.[
-MB/S__P!T*DB+&TPYXW7A28N%F`($`$B%P`^$NP```%M=05Q)BWT(28G#05U!
-M7D'_XP^VDX#\__^`^@1V$DB+@_#^__](A<!T%$@Y:`AT#H#J`76S]H/4_/__
-M`G2JBWTPA?\/B(4```#VA8`#```"=)8Q]DR)[^@`````2(7`2(G"=(1(.<4/
-MA'O____V@(`#```"=&B`I8`#``#]Z6;____H`````.D5_O__183V9I`/A<K^
-M__^`/0`````!9F:0#X6Z_O__Z`````#IL/[__^@`````Z83^__];74%<05U!
-M7L/H`````.D/_O__2(GN3(GOZ&CU___I:____XM%,(E",,=%,`````#I^/[_
-M_Y!!5T%6055!5%532(G[2('LB````$B%_TR+9Q@/A,P```!%,?9(BT,(2(M[
-M$$B)YO]0.`^V1"00.P4`````#XZ4````3(U[(.LG9F9FD&9FD$0Y:RA!@]8`
-MBQ4`````#[9$)!"#P@$YT(D5`````'YG]D0D$0%U$`^V!0````!$.?`/A(D`
-M``!$BVLH08.$)*`"!``!3(G_Z`````!(B<5(BT,(BS4`````2(M[$$F)V$C'
-MP0````!(B>K_4&B$P'6/2(GN3(G_Z`````!!@ZPDH`($``'K@4B+&\<%````
-M``````!(A=L/A3?___]!BX0DH`($`(/H`87`08F$)*`"!`!U0$R)Y^B$_/__
-MZS9FD`^V!0````!(Q\8`````3(GG2,<%``````````!(B1T`````:<!`0@\`
-MB04`````Z`````!(@<2(````6UU!7$%=05Y!7\-F9F:09F:09F:0055)B=5!
-M5$F)]%5(B?U32(/L"$B+7Q!(B968`@0`2(7;=0KK+$B+&TB%VW0D2(M#"$B+
-M>Q#_D/````"$P'7FQH60`@0``4B#Q`A;74%<05W#2(L=`````$B%VW099F:0
-M2(M#.$B%P'0%2(GO_]!(BQM(A=MUZDV%Y'0828M$)`A)BWPD$+X!````_U!0
-M0<9$)&@!2(M]$,>%H`($``$```#H`````$2+C:`"!`!%A<ETE$V%[7092(/$
-M"$B)[UM=05Q!7>D`````9F9FD&9FD+^@A@$`Z`````!(B>_H`````$2+A:`"
-M!`!%A<!UXNE3____9F9FD&9FD&9FD&9FD$B#[!A(B6PD"$R)9"002(G]2(D<
-M)$B+7QA)B?2#JZ`"!``!A=)X2>@`````2(7`=$I$BY.@`@0`1872=!-(BQPD
-M2(ML)`A,BV0D$$B#Q!C#2(G?2(ML)`A(BQPD3(MD)!!(@\08Z<;Z__]F9I!F
-M9I!(C7\@Z`````#KMDB+10A,B>?_D(````!(C7T@3(GFZ`````#KFV9F9I!F
-M9I!F9I!!54%454B)_5-(@^P(3(LO28M=.$V-93CK$V9FD&9FD$B->^A(BQM(
-M.6]0=$)).=QU[DB+10A(BT!02(7`=`5(B>__T$B+A9`#``!(BY68`P``2(GN
-M28U]<$B)4`A(B0)(@\0(6UU!7$%=Z0````!(BU<82(M'($B-3QA(B4((2(D0
-M2(E/($B)3QC&A[(````"Z`````#KE69F9I!F9F:005=)B==!5DF)SD%508GU
-M05152(G]4TB#[`A(BT<82(M0&$B#P!A(.<)U$>G&````2(L22#G"#X2Z````
-M@+J`_/__`4B-FG#\__]UY$0[JN#\__]UVT@[JNC\__]UTDB%VP^$CP```/9"
-M\`$/A=D```!$BZ)8_?__187D#X7)````1(N:./W__T6%VP^%N0```$B+0SA(
-MA<!U#NM29F9FD$B+`$B%P'1&2(MX&$B%_Y!T[DB+=QA(A?8/A(\```"`?D0`
-M#X2%````,<GK#P^V1D2-40%(@\$!.=!^<D@Y?,Y@=>I(QT3.8`````#KWTB)
-MW^@`````3(UE($R)Y^@`````2(7`2(G#=$!(BT4(2(G:2(M]$$V)\$R)^42)
-M[O]0:(3`N@$```!T$4B#Q`B)T%M=05Q!74%>05_#2(G>3(GGZ``````QTNO@
-M,=+KW&:0Z`````#I-____V9FD&9FD$%6055)B?5!5$F)_%532(/$@$B%]@^$
-MHP$``$F+;"002(7M=&!!BX0DI`($`$B+?1!(B>:)14!(BT4(_U`X#[9<)!!(
-MBT4(00&<)*0"!`!(BWT0_U!@2(U]((G"B=E,B>[H``````^V3"002(U]2+HH
-M````3(GNZ`````!(BVT`2(7M=:!(BPT`````NO@#``!(A<ET(&8QTF9F9I!F
-M9I"+01A(BPDYP@]"T$B%R77P@<+X`P``08N,)*0"!`!)C7PD<$R)[HT,R>@`
-M````08N,)*0"!`!)C;PDD````+H``@``3(GNZ`````!)C;PD\````+D!````
-MND@```!,B>[H`````$&+C"2D`@0`28V\)!`!``"Z*````$R)[N@`````08N,
-M)*0"!`!)C;PDT````+JP````3(GNC0S)Z`````!!QX0D:`$```$```!!QX0D
-M=`$````0``!!QX0D;`$````0``#H`````$F-O"2P````N4(A``")PDR)[N@`
-M````2(L=`````$B%VW0C9I!(BT,@2(7`=!!!BY0DI`($`$R)[DR)Y__02(L;
-M2(7;==](@^R`6UU!7$%=05[#3(MO".E4_O__9F:09F:09F:0051)B?152(LM
-M`````%-(B?OH`````(7`=!.)P$B)VI#&`@!(@\(!2(/H`77S2(,]``````!U
-M#.MQ9F9FD&9FD$B)Q4B+10!(A<!U]$B)70!(C4,83(EC",>#6`($```0``!(
-MB4,82(E#($B-0RA(B4,H2(E#,$B-0SA(B4,X2(E#0$B-@Q`"``!(B8,0`@``
-M2(F#&`(``$B-@U`"``!(B8-0`@0`6UU!7,-(B1T`````ZYUF9F:09F:09F:0
-M9F:02(/L*(`]``````)(B6PD"$R)9"00B?5(B1PD3(EL)!A)B?Q,B70D(`^$
-M%P$``$`/MOWH`````$B%P$F)Q0^$#`$``$V-="1P3(GWZ`````!(B<,QP,8$
-M&`!(@\`!2#WX`P``=?"+!0````!,B6L(3(DC@\`!B04`````B8/H`P``2(V#
-MR`,``("+@`,```%`B&L02(F#R`,``$B)@]`#``!!BT48A<!T*4B-@_@#``!(
-MB4,@08M%&(7`=!:)PDB)V,:`^`,```!(@\`!2(/J`77O2(V#H`,``,=#-`(!
-M``#'0S#_____2(F#H`,``$B)@Z@#``!(C8.P`P``2(F#L`,``$B)@[@#``!)
-MBT5(2(7`=`E(B=__T(7`=55)BTPD($B-DY`#``!)C40D&$F)5"0@2(F#D`,`
-M`$B)BY@#``!(B1'K#$"`_@$/A-_^__\QVTB)V$B+;"0(2(L<)$R+9"003(ML
-M)!A,BW0D($B#Q"C#2(G>3(GW,=OH`````.O1051(BQ4`````54B)_4@Y^E-U
-M".G3````2(G"2(72=`](BP)(.>AU\$B+10!(B0)(BT482(U=&$@YV'099F9F
-MD$B-N'#\___H`````$B+11A(.=AUZTB+12A,C64H3#G@=#)(C9W0````9F9F
-MD&9FD$B-<.A(B=](BT8@2(M6&$B)0@A(B1#H`````$B+12A,.>!UW("]D`($
-M``!U*4B+'0````!(A=MT'69F9I!F9I!(BT-`2(7`=`5(B>__T$B+&TB%VW7J
-M2(M=$$B%VW07D$B+0PA(BWL0_Y#H````2(L;2(7;=>I;74%<PTB+!TB)!0``
-M``#I-?___Y"0D)"0D$B+5R`QP,8$$`!(@\`!2(/X4'7R2(U"$$B)$DB)4@A(
-MQT(H`````$B)>C!(B4(02(E"&#'`2,=".`````##9I!(BT=(BQ4`````2(/H
-M*$@!T,-F9F:09F9FD&9FD&9FD$B+1R`QTDB+"$@YP7092(L12(M!"$B)0@A(
-MB1!(BU$82(D)2(E)"$B)T,-F9I!FD("^L`````!(BU<@=1(/MX:8````2`.&
-MD````$B)1UB#0B`!2(M':$B+OX````!,BYB8````0?_C9F9FD&9F9I#VAX`#
-M```(2(GZ2(M'('0"\\/'0$0`````2(M':$C'Q@````"`CX`#```(2(N_@```
-M`$R+F(@```!!_^-F9F:0]H>``P```;C_____="%%A,!T&@^WPL'@"87`=!!(
-MF)#&`0!(@\$!2(/H`77S,<#SPV9F9I!F9F:09F9FD&9FD/9'9$!(QT=(````
-M`'5)2(M7.$B%TG1*,?8QR>L.9F:02(L2@\$!2(72=")(@WH8`'7N2(M"$$@!
-M1TA(BT(02(L22#GP2`]'\$B%TG7>@_D#?P5(B7=`PTC'1T``````D,,Q]NOM
-M9F9FD&9F9I!F9I!(8_9(`?Y(.?=S'$B)\6:0#[91_@^V0?^(4?^(0?Y(@^D"
-M2#G/<NE(.?=T*`^V!SP@=2-(B?KK!P^V`CP@=1I(@\(!2#GR=?#&!P!(@\<!
-M2#GW=?3SPTB)^H3`="%F9I!(@\(!/"!T*@^V0O^(!TB#QP%(.=9T!P^V`H3`
-M=>)(.?YTT<8'`$B#QP%(.?=UN9#KPD@Y\G3G#[8"A,!F9F:0=+<\('2S#[9"
-M_X@'2(/'`>O%9F9FD&9F9I!F9I!F9I!(BT<@QT!$`0```,-F9F:054B)_5-(
-M@^P(]D=D`G4R2(M?.$B%VW082(M[&$B%_W0'2(M'"/]0,$B+&TB%VW7HQX7H
-M`````````$B#Q`A;7</H`````.OH9F9FD&9F9I!3]D=F`DB)^TB+1R!T!O9`
-M2`)T#(-`1`%;PV9FD&9FD#EP1'+O2(L_O@$```#H`````$B%P$B)PG3>#[:`
-ML0```$B)6E!(B==(B5I8QH*P````!,:"L@````!(QX+(`````````(/@SX/(
-M((B"L0```%OI`````&9FD&9FD&9FD%-(B?M(BS^^`0```.@`````2(7`2(G"
-M=&#V0V8"=6'&@+`````#2,>`H`````````#&@)L```!`9L>`E```````9L>`
-ME@``````9L>`F```````QH":````0&;'@)```````&;'@)(````!`&;'@)P`
-M`````$B)6E!;2(G0PV:0QH"P`````HL%`````(F"F`````^W!0````#&@I``
-M```&QX*4`````````,:"D0````!FB8*<````Z[IF9I!FD$B#[!A(B5PD"$B)
-M;"002(G[2(MO(.@F____2(G"N/____](A=)T)4C'@L@`````````@$U(`4B)
-MUDB+0VA(B[N`````_Y"8````,<!(BUPD"$B+;"002(/$&,-F9I!FD$%428GT
-M55.`?Q`$2(G[=E6`?T0`=$HQ[>L59F:09F:0#[9#1(U5`4B#Q0$YT'XQ2(M\
-MZV!(A?]TY_:'@`,```%TWDR)YN@`````#[9#1(U5`4B#Q0$YT'_69F9FD&9F
-MD%M=05S#=#CV@X`#```!9I!T[DB)W^AF_O__2(7`=.%!@P0D`4R)8%A(B<=(
-MQX#(`````````%M=05SI`````$B+7SCV@X`#```!=+3KQ&:0Z0````!F9F:0
-M9F9FD&9FD$B#[!A(B5PD"$B);"002(M?6$B++^@`````BP.#Z`&%P(D#=`](
-MBUPD"$B+;"002(/$&,-(C7,(2(GO2(M<)`A(BVPD$$B#Q!CI`````&:055-(
-M@^P(2(LM`````,<%``````````!(A>UU#>LP9I!(BVT(2(7M="6+'0````#_
-ME9`````YPW/G_Y60````2(MM"(D%`````$B%[77;2,?'`````(,%`````"CH
-M`````$B#Q`@QP%M=PV9FD&9FD$B#[!A(B5PD"$B);"002(MO4$B+72`/ME-(
-MB="#X/Z(0TB`O[(````!=$7H`````(M#0(7`=`](BUPD"$B+;"002(/$&,-(
-MBWT`2(US*,=#0`$```!(BUPD"$B+;"002(/$&$B#QUCI`````&9F9I"#XOR(
-M4TCKLV9F9I!F9F:02(M'(("G@`,``/?'A\@`````````BU!`A=)T!//#9I!(
-MBS](C7`HQT!``0```$B#QUCI`````&9FD&9FD&9FD%-(BU\@2(GX2(G&2(L[
-M2(''$`$``.@`````2(L[2,>#T`````````!(C;/0````2(F;V````$C'@^``
-M````````6TB#QTCI`````&9FD&:054B)_5-(B?-(Q\8`````2(/L"$B+/^@`
-M````2(G!2(M%.$B%P'0;2#G82(U5.'4'ZQ=(.=AT$DB)PDB+`$B%P'7P2(/$
-M"%M=PTB+`TB)WDB)STB)`DB#Q`A;7>D`````2(/L.$B)7"0(2(EL)!`Q[4R)
-M="0H3(E\)#!)B?Y,B60D&$R);"0@2(GS2(M/.$F)UTB%R70@2(G-,<!F9I!F
-MD$B#?1@!2(MM`(/8_TB%[77O@_@#?B9(B>A(BUPD"$B+;"003(MD)!A,BVPD
-M($R+="0H3(M\)#!(@\0XPTF-/!])B<SK&$DY7"0(#X2R````38LD)$V%Y`^$
-MG0```$F#?"08`'7@28M4)`A(.=IWX4F+="0028G]2(T$%D@YQW?02#G:#X21
-M`0``<\5)BSY(Q\8`````Z`````!(B<?H`````$B%P$B)P@^$:/___S'`Q@00
-M`$B#P`%(@_@@=?))BT0D"$B)0@A(B=A)*T0D"$F)7"0(2(E"$$F+!"1(B0))
-MBT0D$$@K0A!)B10D23G'28E$)!`/@FX!``!,B>7I%/___TF+!"1(A<!T.+H!
-M````ZPA(BP!(A<!T($B#>!@`D'3P2#E8"'7J28MT)!!(.7`03`]'X(/"`>O8
-M@^H!#X_3_O__28M4)!!)B<U).==W$NF0````38MM`$V%[0^$M/[__TF#?1@`
-M=>Q(B=!)`T0D"$DY10AUWDD#51!).=</AY+^__])BSY(Q\8`````Z`````!(
-MB<?H`````$B)PC'`Q@00`$B#P`%(@_@@=?),B?A)`T0D"$F)10A)BT4020-$
-M)!!,*?A)B44028L$)$B)U4B)6@A,B7H02(D"28D4).DQ_O__28L^2,?&````
-M`.@`````2(G'Z`````!(A<!(B<(/A`[^__\QP,8$$`!(@\`!2(/X('7RZ[!)
-M.?</A-?^__])BSY(Q\8`````Z`````!(B<?H`````$B%P$B)P@^$T/W__S'`
-MQ@00`$B#P`%(@_@@=?))BT0D$$R):@A,*?A(B4(0ZT=)BSY(Q\8`````Z```
-M``!(B<?H`````$B)PC'`2(72=#[&!!``2(/``4B#^"!U\DR)^$D#1"0(2(E"
-M"$F+1"003"GX2(E"$$F+!"1,B>5-B7PD$$B)`DF)%"3I3_W__TF+'"1)BSY(
-MQ\8`````2(M#"$F)1"0(2(L#28D$).@`````2(G>2(G'Z`````#I'/W__V9F
-MD&9FD$%42,?&`````%5(B?U32(L_Z`````#V160(28G$=1Q(BW4X2(7V=!-(
-MBQY,B>?H`````$B%VTB)WG7M2(M%:$B+O8````#_D(````!;2(M]>$B+M8``
-M``!=05Q(@\<@Z0````!F9F:09F9FD&9F9I!54TB)^TB#[`A(BU<X@*>``P``
-M_DB%TG0?9F9FD&9FD$B+0AA(A<!T!X"@@`,``/Y(BQ)(A=)UZ$B)WK\!````
-MZ`````!(BSO'@^@````!````2(''$`$``.@`````2(7`2(G%=&;'``$```!(
-MQT`(`````$B)11!(QT`8`````$B)6"!(BULX2(7;=#)F9I!(BT,82(7`=0KK
-M'&9FD&:02(GX2(MX&$B%_W7T2(GN2(G'Z`````!(BQM(A=MUT8M%`(/H`87`
-MB44`=`=(@\0(6UW#2(/$"$B)[UM=Z;_Z__]F9F:09F9FD&9F9I!F9I!(@^P8
-M2(E<)`A,B60D$(G328GT2,?&`````.@`````C0S;3(GF2(M<)`A,BV0D$$B)
-MQ[H@````2(/$&.D`````2(/L6(/_!TB);"0X3(ED)$!(B?5,B6PD2$B)7"0P
-M08G\3(ET)%!)B=5W54&)_D+_)/4`````B[O(````A?]U0$B+0PC'@\@````!
-M````2(VSL````$B->5A(BT!82(F;N````$C'@\``````````2(F#L````.@`
-M````9F:09I!(BUPD,$B+;"0X3(MD)$!,BVPD2$R+="102(/$6,-(BUX@OP,`
-M``!(QT8@`````.@`````2(E=(.O&2(GWZ`````!(BU@028G$2(7;=0KK$DB+
-M&TB%VW0*2#EK$&9F9I!U[DB->TCH`````$B%P&:0=(Y)C7PD2$B)6!A$B6@@
-M2,<``````$B)0`A(B<9(QT`0`````.@`````Z6'___](B??H`````$B)P4B+
-M0!A(C5$82#G0=17I1/___V9F9I!(BP!(.=`/A#3___^`N(#\__\!2(V8</S_
-M_W7D3#FH\/S__W7;08/\!P^'$?___Y!"_R3U`````$B+0WA(B>9,B>](BT`(
-M_U!X#[9$)`Z(0V(/ME0D"@^V0V:#X@$!TH/@_0G0B$-FZ=3^__](BT,@@*.`
-M`P``[XMP0(7V#X6^_O__2(G&2(UY6,=`0`$```!(@\8HZ`````#IHO[__X"+
-M@`,``!#IEO[__TB+0PA(B=__4##IA_[__V9F9I!F9I!(@^P82(GX2(E<)`A,
-MB60D$$B)QDB+7QA$BV<@2(U[2.@`````2(G91(GF2(G?3(MD)!!(BUPD"$C'
-MP@````!(@\08Z0````!F9F:09F9FD$B![!@"``"`/0``````2(F<)`@"``!(
-MB:PD$`(``$B)^W4=2(N<)`@"``!(BZPD$`(``$B!Q!@"``##9F:09I`/MD=D
-M0;@!````2(GAN@$```"^"0```(/(`X/@^XA'9.@`````A<!U2($\)'EC9VQT
-M7/9#9`%TJTB+:SA(A>V0=")(BSM(Q\8`````Z`````!(B>Y(B<?H`````$C'
-M0S@`````2(M#4$B)0RCI<O___X"C@`,``/Y(B=Z_`0```.@`````@$MD`>E5
-M____O@`"``!(B>?H`````(3`=9,/MDPD!`^V@X`#``")RH/@_<#J!(/B`@G0
-M]L$0B(.``P``=`P/MD0D!8!+9("(0V/V1"0'`707#[9398G(P.@"@^`"@\H!
-M@^+]"<*(4V7V1"0'`G05#[9398T$"8/@"(/*!(/B]PG"B%-E]D0D!PAT%0^V
-M0V7!X02#X2"#R!"#X-\)R(A#9?9$)`<$#X0"____#[9390^V1"0$@\I`@^`!
-MP>`'@^)_"<*(4V7IX_[__Y!52(U/.%-(B?M(@>P(`@``#[9!+(/@`RP!#X0@
-M`@``O^____]`(GMD2(GE2(G@0(A[9$B-E"0``@``Q@``2(/``4@YT'7L]D$L
-M`@^%[P$``$B+0RB^]____\<$)%]W85(A_D"(<V1(B40D!(!Y+`!Y#0^V0V.`
-M3"0,$(A$)`WV02T!=!T/ME-E#[9$)`R`3"0/`<'B`H/@]X/B"`G0B$0D#/9!
-M+01T'`^V4V4/MD0D#(!,)`\"T.J#X/N#X@0)T(A$)`SV02T0=!T/ME-E#[9$
-M)`R`3"0/",#J!(/@_8/B`@G0B$0D#/9!+4!T&@^V1"0,#[9398!,)`\$P.H'
-M@^#^"="(1"0,2(%[0/__'P!W"[[S____(?Y`B'-D]D$L(`^$)`$``$B+2SA(
-MA<ET/#'V2(-Y&`!T*TACQDB+40B#Q@%(C01`2(U$Q0!(B5`02(M1$$B)4!A(
-MBU$82(M20$B)4"!(BPE(A<EUQ@^V0V:^``(``$B)Y\:%_P$```&#X`&(A?X!
-M``#H`````/?813'`2(GAB(4``0``2(MS4+H!````2(G?2('N```"`$B!Y@``
-M_O_H`````$B+<SA(A?9T1#'_2(M6&$B%TG0Q2(M#4$R+0D!(8\](C0Q)@\<!
-M2HT4`$@M```"`$@E``#^_TB!Z@`(``!(*<)(B53-($B+-DB%]G6^O@`"``!(
-MB>?&A0`!````Z`````#WV$4QP$B)X8B%``$``$B+<U"Z`0```$B)WTB![@`(
-M``#H`````$B!Q`@"``!;7<-`P.X"@^8!0(AT)`[IR_[__V9FD&9FD%-(B?M(
-MBS](Q\8`````Z`````!(B<?H`````$B)PC'`2(72="C&!!``2(/``4B#^"!U
-M\DB+0RA(B4(02(M#*$B)4SA(B4-(2(E#0%O#2(G?6^D`````9F9FD&9FD&9F
-MD$B![$@#``"`/0`````"2(FL)"`#``!,B:0D*`,``$B)_4B)G"08`P``3(FL
-M)#`#``!,C6<X3(FT)#@#``!,B;PD0`,```^$JP$``$B+=U!,C7PD($&X`0``
-M`+H!````3(GY2('N``@``.@`````A<!!B<4/A!T#``!(BW500;@!````3(GY
-MN@$```!(B>](@>X```(`2('F``#^_^@`````A<!!B<8/A"\#``!!@_W_#Y3`
-M08/^_P^$Q04``$6%]@^51"07='1%A>UU;TB+=5!!N`$```!,B?FZ`0```$B)
-M[TB![@`(``#H`````(7`08G%=$>`I8`#``#^2(GNOP$```#H`````(!-9`'I
-MGP$``+X``@``3(G_Z`````"$P`^%[0(``$&`O_\!````=09!O?[____&1"07
-M`$&!/U]W85(/A#(#``!(BW502('N```"`$B)\$C!Z"!(A<`/A<0"``"`360!
-M#[8%`````#P"#X2%````+`$/A&(%``#VA8`#```!='B`I8`#``#[28V7``(`
-M`$R)^,8``$B#P`%(.=!U]#'V0;@!````3(GYN@$```!(B>_H`````(!\)"!%
-M#X3.!```@+PD'@(``%5U+H"\)!\"``"J=20QP$:+A#C*`0``187`=1%(@\`0
-M2(/X0'7IZPE,C7PD((!-9`+V160"=`T/MD5D@\@!@^#[B$5D0?9$)"P!=#1(
-MBUTX2(7;="-(BWT`2,?&`````.@`````2(G>2(G'Z`````!(QT4X`````$B+
-M15!(B44H08!\)"P`#X@6`0``0?9$)"T!#X7?````0?9$)"T$#X6G````0?9$
-M)"T0=6Y!]D0D+4!T+L9$)"`%#[9%94R)_L9$)"D`P.@'B$0D*$B+16A(B[V`
-M````_Y#`````9F:09I!(BYPD&`,``$B+K"0@`P``3(ND)"@#``!,BZPD,`,`
-M`$R+M"0X`P``3(N\)$`#``!(@<1(`P``P\9$)"`$#[9%94R)_L9$)"D`P.@%
-M@^`!B$0D*$B+16A(B[V`````_Y#`````Z6'____&1"0@`P^V165,B?[`Z`.#
-MX`&(1"0H2(M%:$B+O8````#_D,````#I+?___\9$)"`"#[9%94R)_M#H@^`!
-MB$0D*$B+16A(B[V`````_Y#`````Z?;^___&1"0@``^V16-,B?Z(1"0H2(M%
-M:$B+O8````#_D,````#IQ/[__P^VG"0?`@``O@`"``!,B?_H`````(MT)"`/
-MMM!(Q\<`````,<")V>@`````@7PD(%]W85(/A"4#``!!O?[____IGOS__T$/
-MMI__`0``O@`"``!,B?_H`````$&+-P^VT$C'QP`````QP(G9Z`````!!@3]?
-M=V%2#X3^_/__187M#X6A_/__0;W_____Z9;\__^!Y@``_O]!N`$```!,B?FZ
-M`0```$B)[^@`````A<`/A:G\__]!@3]?=V%2#X4+_?__O@`"``!,B?_H````
-M`(3`#X0I!0``08$_7W=A4@^%Z?S__[X``@``3(G_Z`````"$P`^%U/S__T&`
-M?PX`#[9%9$R)YDC'QP`````/E<*#X/O!X@()T(A%9`^V169!@+_^`0````^5
-MPH/@_@G0#[;2B$5F,<#H`````$B+15!(B>](+0```@!()0``_O](B44HZ+/Z
-M__]!]D<,$'0,@$UD@$$/MD<-B$5C0?9'#P%T&@^V565!#[9'#(/*`<#H`H/@
-M`H/B_0G"B%5E0?9'#P)T&0^V565!#[9'#(/*!`'`@^`(@^+W"<*(565!]D</
-M"'0:#[9594$/MD<,@\H0P>`$@^`@@^+?"<*(565!]D</!'0:#[9594$/MD<,
-M@\I`@^`!P>`'@^)_"<*(565(QT0D&``````QVTJ#?#L8``^%=0$``$B#PQA(
-M@_M@=>J`?"07``^$60(``#')2H-\.1@`="=*BU0Y($B+15!(@<(`"```2"G"
-M2"T```(`2"4``/[_2`'"2HE4.2!(@\$82(/Y8'7'O@`"``!,B?]!QH<``0``
-M`.@`````]]A%,<!,B?E!B(<``0``2(MU4+H!````2(GO,=M(@>X```(`2('F
-M``#^_^@`````2(MU4$&X`0```$R)^;H!````2(GO2('N_P<``$@!WN@`````
-MA<`/A!\!``!(@\,!2(/[!'7*2(-\)!@`#X3#`@``@$UD0$B)[^@`````Z<S[
-M__^$P`^$,_K__V9FD&9FD.E?^O__@'PD(5)F9I!F9I`/A2'[__]!N`$```!,
-MB?FZ`0```+X!````2(GOZ`````"`?"0@4`^%^_K__X!\)"%-#X7P^O__Z1_[
-M__]F9F:0@#T```````^%D?K__V9FD.D&^___O@`"``!,B?_H`````(3`#X1O
-M^?__Z<'\__](BWT`O@0```#H`````$B%P$B)1"08#X2%^___2HM4.QA*BW0[
-M$$B)[^A#[?__2(7`2(G!#X1(`P``2(M4)!A%A?9(B6HX=7Q*BT0[($B)0D!(
-MBU0D&$B)2DA(BT$02(E1&$B)0BCI(/[__TB+15!(B>]%,<!,B?FZ`0```$@M
-M```"`$@E``#^_TB-=`,!Z`````!(BW502,?'`````$B-A@``_O](C;0>`?C_
-M_T@E``#^_TB-5`,!,<#H`````.F(_O__187M=8A*BU0[($B+15!(@<(`"```
-M2"G"2"T```(`2"4``/[_2`'"2(M$)!A(B5!`Z5C___]%A>T/A%3^__]!@+__
-M`0````^$MP```#')2H-\.1@`="=(BT502(G"2@-4.2!(+0```@!()0``_O](
-M@>H`"```2"G"2HE4.2!(@\$82(/Y8'7'O@`"``!,B?]!QH<``0```.@`````
-M]]A%,<!,B?E!B(<``0``2(MU4+H!````2(GO,=M(@>X`"```Z`````!(BT50
-M0;@!````3(GYN@$```!(B>](+0```@!()0``_O](C70#`>@`````A<!T?DB#
-MPP%(@_L$=<?IC_W__TC'QP`````QP.@`````3(G_O@`"``!!QH?_`0```4'&
-MAP`!````Z`````#WV$4QP$R)^4&(AP`!``!(BW50N@$```!(B>](@>X```(`
-M2('F``#^_^@`````Z>O^__]!]D0D+`0/A"?X___I+/W__TB+=5!(B>]%,<!,
-MB?FZ`0```$B![O\'``!(`=[H`````$B+15!(Q\<`````2(V4&`'X__](+0``
-M`@!()0``_O](C70#`3'`Z`````#I,?___TB-G"0@`@``28UW$+KP````2(G?
-M2(/#".@`````2(V$)!@#``!(B40D".L+2(/#&$@[7"0(=&-(@SL`=.](BW,(
-M0;@!````3(GYN@$```!(B>^#YO_H`````(7`#X7\]O__3(G_Z`````!!@3_T
-M%GA:#X28````2(MS"$4QP$R)^;H!````2(GOZ`````"%P'2:Z<?V__]F9I!(
-MBW500;@!````3(GYN@$```!(B>](@>X```(`@>8``/[_Z`````"%P`^%E?;_
-M_TB+=5!%,<!,B?FZ`0```$B)[TB![@```@!(@>8``/[_Z`````"%P`^%:/;_
-M_^G<^?__2(M\)!CH`````&9FD&:0Z0OX__^^``(``$R)_^@`````Z5;___]F
-M9I!F9I!F9I!!5TF)][X!````059!54F)_4%455-(@^QX2(M_&(E4)`SH````
-M`$B)Q4F+10A(C70D0$R)__]0>$B+A9@#``!(BY60`P``2(E""$B)$$B+10!(
-MBU@82(/`&$@YPP^$GP```$R-="00ZQMF9F:09F:02(M%`$B+&TB#P!A(.=@/
-MA'T```"`NX#\__\!3(VC</S__W7<2(NSZ/S__TF+10A(.T8(#X0G`0``3(GO
-MZ`````"#^`!\2W6X28M%"$F+O"2`````3(GV_U!X#[94)$H/MD0D&M#JT.B#
-MX@&#X`$YPG^.?!T/MD0D'#A$)$QW@9!R#P^V1"1-.D0D'0^';____TB+4PA(
-MC860`P``2(F=D`,``,=%-`$```!(C;V(````OB@```!(B4,(2(D"@(V``P``
-M`4F+10A,B;V`````3(EM>$B)E9@#``!(B45HBT0D#(E%<$B+1"1`2(E%4$B)
-M12@/MD0D3HA%8@^W1"149HE%8`^V5"1*#[9%9H/B`0'2@^#]"="(16;H````
-M`$B+16A(B[V`````2(UT)$#_4'CV1"1*`4B+1"18=0GV@``!```$=0A(B>_H
-M`````$B#Q'A(B>A;74%<05U!7D%?PTB+@``!``!(A<`/A,G^__](BW8028M]
-M$/_0Z<+^__^04X!_$`%(B?MT!UNX_____\.`/0`````"=/!(BT=02"T```(`
-M2"4``/[_2(E'*.B]\O__@&-D],=#,/____](B=_H`````%LQP,-F9I!F9I!(
-M@^P8A=)(B6PD"$R)9"002(G]2(D<)$F)]'AHZ`````!(A<!(B<-T3@^V0&1(
-MBVT8J`)U;8`]``````!T&J@!=6KV0V1$=02`2V0D1(N-V`$``$6%R71>2(G>
-M2(ML)`A(BQPD3(MD)!"_`@```$B#Q!CI`````$B+10A,B>?_D(````!(C7T@
-M3(GF2(L<)$B+;"0(3(MD)!!(@\08Z0````!(B=_H`````.NL2(G?Z`````#K
-MC$B-M<`!``!(C7U(QX78`0```0```$C'A<`!````````2(FMR`$``$C'A=`!
-M````````Z`````#I9O___V9F9I!F9F:09F:09F:0055!5$F)_%532(/L"$B+
-M;SA(BU](2(M5.$B%T@^$-@$``$B)T#'V2#G8=`Q(BTL(2#E("$@/1/!(BP!(
-MA<!UYTB%]@^$A@```$B+?A!(BTL02#G/<@KK-$B+$DB%TG0Y2(-Z&`!U\4B)
-MR$@#0PA(.4((=>1(BT(02`-#$$@#?@A(*T802(EZ"$B)0A!(B=Y(B>_H````
-M`.L82(M&"$@#1A!(*7L02,=#&`````!(B4,(@$UD$$R)Y^@`````2(/$"$B)
-M[UM=05Q!7>D`````13'MZPA(BQ)(A=)T+DB#>A@`=?%(BWL(2(M*"$B)^$@#
-M0Q!(.<%T64@#2A!(.<](#T3R2(L22(72==)(A?9(QT,8`````'082(M&"$B)
-M[TB)0PA(BT802`%#$.@`````387M#X1Y____28M%$$@!0Q!,B>Y(B>_H````
-M`.EA____28G5Z7S___](QT,8`````.E,____9F9FD&9F9I!F9I!!54F)_3'_
-M051)B?154TB#[`A(A=(/A)@```!(BWI(2(7_#X2+````28M-.$B%R71R,>U%
-M,<#K#4@YPG012(L)2(7)=$5(BT$82(7`=>I(BW$023GT=PY(A>UT!D@[=1!S
-M`TB)S4B%P'732(7_9F:0=,M(BT<(2`-'$$@Y00A,#T3!2(L)2(7)=;M-A<!T
-M#TF+0!!(`T<023G$2`]&[TB%[74<,=M(@\0(2(G86UU!7$%=PTTY94`/@VO_
-M___KY$F+?0"^!````.@`````2(7`2(G#=-!,B6@X28M%4#'V28M5.$@M```"
-M`$@E``#^_TB%TDB->`%T($B+0AA(A<!T#TB+2$"X`0```"GYT^`)QDB+$DB%
-MTG7@,<FX`0```-/@A<9T'X/!`8/Y!'7M2,=#0`````!(B=\QV^@`````Z6'_
-M__](8\%(`?A(A<!(B4-`=.),B6,H2(MU"$R)XDR)[^BJX___2(7`=,I(B5@8
-M2(E#2$R)[T&`3600Z`````#I(/___V9F9I!F9F:09F:04TB)^TB+0SA(A<!U
-M"^M;D$B+`$B%P'122(MX&$B%_Y!T[DB+=QA(A?9T.(!^1`!T,C')ZP\/MD9$
-MC5$!2(/!`3G0?A](.7S.8'7J#[9&1(U1`4C'1,Y@`````$B#P0$YT'_AZ```
-M``#KFDB)WV9FD.@`````2(M#:$B+NX````#_D,@```!(B=];Z0````"054B)
-M_5-(@^P(2(M?.(!G9+](A=MT0DB+>QA(A?]T!>@`````2(L;2(7;=>I(BT4X
-MZP-(BP!(A<!T'DB+>!A(A?]T[TB#?Q@`=>CH`````$B+13A(A<!UXDB#Q`A(
-MB>];7>D`````9F9FD&9FD&9FD$%62(GX2(G&055!5%533(MO($F-O1`!``!-
-MC648Z`````!)BUT80<>%V`$```````!,.>-U"NLT2(L;3#GC="R`NX#\__\!
-M2(V[</S__W7H]H/4_/__0'3?]D/P`739Z`````!(BQM,.>-UU$F+72A)C6TH
-M2#GK=!AF9F:09F:02(U[Z.@`````2(L;2#GK=>])BVT83#GE#X3@````9I"`
-MO8#\__\$2(V]</S__W8.2(.]B/S__P`/A'H!``!(BVT`3#GE==E)BUT83#GC
-M#X2J````13'VZP]F9F:09F:02(L;2#GK=%F`NX#\__\!2(V[</S__W7H]H/4
-M_/__('3?2(N#J/S__X"CU/S__]M(A<!U&.GL````9F9FD&9FD$B+`$B%P`^$
-MV0```$B#>!@`=.U(BQM!O@$```!(.>MUITF+71A).=QU#NLR9F9FD$B+&TPY
-MXW0F1(N3H/S__TB-NW#\__]%A=)X'/9#\`%UW^@`````2(L;3#GC==I;74%<
-M05U!7L/V0_`!=,,/MH.`_/__/`0/AGX```!(@[N(_/__`'6J]H/0_O__0'6A
-M2(N#\/[__TB%P'0&2#EX"'6/#[:#M/S__X7`?B^#Z`$QR4B#P`%(BU3/8$B%
-MTG03@'H0!'8-]H)@`@``0`^%7O___TB#P0%(.<%UVN@`````Z4O___]%A/8/
-MA=+^__]FD.@`````Z<;^__\L`69F9I`/A2K____V@]3\__\"9F:0#X0:____
-MZ\/H`````&9FD.EY_O__9F9FD&9F9I!F9I!!5$F)_$B-OQ`!``!54^@`````
-M2(7`2(G%=&I)BUPD&$R)8"!)@\08QP`!````2,=`"`````!(B4402,=`&```
-M``!,.>-U$>LO9F9FD&9FD$B+&TPYXW0@@+N`_/__`4B-NW#\__]UZ$B)[N@`
-M````2(L;3#GC=>"+10"#Z`&%P(E%`'0%6UU!7,-;2(GO74%<Z1K]__]F9F:0
-M9F:09F:02(/L&$B);"0(2(D<)$B)_4R)9"002(M?(,=#0`````#VAX`#```8
-M#X6C````1(NGR````$6%Y`^%DP````^V0TBH`0^%AP```*@"3(UC$'0?3#EC
-M$'4%2#D;=!U(B>^0Z-O;___V0T@!=65F9I!FD$B+2Q!,.>%U:@^V16(Y0R!R
-M%NM,2(G62(GOZ"'8__\/MD5B.4,@<SA(B>_HX-?__TB%P$B)PG0H#[>`L```
-M`&8E_S!F/00@=<M(.1MU8?9%9@)TP(!+2`+KNF9FD&9FD$B+'"1(BVPD"$R+
-M9"002(/$&,-$BUL@187;=>1(BQ%(BT$(2(GO2(MQ&$B)0@A(B1!(B4D(2(D)
-M2(L<)$B+;"0(3(MD)!!(@\08Z9'7__](B=?&@K(````!Z`````!(B>_H2M?_
-M_TB)PNE&____9I!(@^P82(D<)$B);"0(2(G[3(ED)!!,BV=0Z`+7__^`N[``
-M```$2(G"28ML)"`/A(T```!(BX/(````QT5$`````$B)*L="(`````!(B5H8
-M2,>#R`````````!(B4(02(M%"$B)50A(B1!(B4((00^V1"1B.44@<P>+14"%
-MP'032(L<)$B+;"0(3(MD)!!(@\08PTF+/"1(C74HQT5``0```$B+'"1(BVPD
-M"$R+9"002(/$&$B#QUCI`````&9F9I#V@[$````P=`KV14@"#X1@____QH.R
-M`````4B)WTB+;"0(2(L<)$R+9"002(/$&.D`````9F9FD&9F9I!F9F:02(/L
-M*$B);"0(3(ED)!!(B?U,B6PD&$R)="0@2(D<).C\U?__3(MU4$F)Q4V+9B!!
-M@VPD(`$/MH6R````/`UT4#P1#X3(````/`MT9#P09I`/A.````!)BT402(GO
-M2(F%R````.@`````08M$)$"%P'1H2(L<)$B+;"0(3(MD)!!,BVPD&$R+="0@
-M2(/$*,.0@+VP`````'6]@+VS``````^%NP```,:%LP````%F9I!)C40D$,:%
-ML@````!)BU0D&$V);"0828E%`$&+1"1`28E5"$R)*H7`=9A)BSY)C70D*$''
-M1"1``0```$B+'"1(BVPD"$R+9"003(ML)!A,BW0D($B#QUA(@\0HZ0````!,
-MB??HZ-C__X7`=0L/MH6S````/`%V0P^VA;(````\$`^%(/___X"]L`````,/
-MA!/___])BUX@3(GV28EN(+\#````Z`````!)B5X@Z?7^___&A;(````0Z\R#
-MP`&(A;,```#I./___Y"0D)"0D)"02(LU`````$B%]G1#2(M6&$B-3AA(.<IT
-M+DB-@G#\__\YN.@#``!U%^LI9F:09F:02(V"</S__SFXZ`,``'022(L22#G*
-M=>E(BS9(A?9UO3'`\\/SPV9F9I!F9F:09F:0@'\$`'4,,<"!/WL!```/E\##
-M,<"!/WL!```/E\##9I`/M@</M@XXR'0:ZRQF9F:0#[97`0^V1@$XPG412(/'
-M`4B#Q@&$P'7H,=*)T,,/OL`/OM(IPHG0PP^^T`^^P2G"Z^AF9F:09F9FD&9F
-MD&9FD$%728GW059!B?Y!54%455-(@>R8````3(LM`````$V%[71#3(UD)!`Q
-M[4F+71!(A=MT*DR)9"0(2(M#"$B+>Q!,B>;_4#B`?"0C`'0(1#GU="N#Q0%(
-MBQM(A=MUVTV+;0!-A>UUQ#';2('$F````$B)V%M=05Q!74%>05_#387_=.8/
-MME0D)T&+!SG0?-I(BQM(A=MTTBG02(M[$$B+="0(08D'2(M#"/]0.(!\)",`
-M=-#KLF9F9I!F9F:09F9FD$%7059)B?Y!54%428G454B)S5-(@>RH````2(L%
-M`````,<"`````$B)="0(QP$`````2(7`2(E$)!`/A)X```!!O?_____'1"0<
-M`````$B+1"002(M8$$B%VP^$D````$B%[4$/E<?K'V9F9I!F9I!(BQL/MD0D
-M-T$!!"2+1"0<`44`2(7;=&A(BT,(2(M[$$B-="0@_U`X2(M#"$B+@`@!``!(
-MA<!T#T6$_W0*2(M[$/_0B40D'(!\)#,`=!-!QP0D`````$&#Q0''10``````
-M3#GS=9I(BT0D"$2)*$B!Q*@```!;74%<05U!7D%?PTB+1"002(L`2(7`2(E$
-M)!`/A4C____KUF9F9I!F9F:0055!5%4Q[5-(@>R(````3(LE`````$V%Y'0Q
-M28M<)!!(A=MT'DB+0PA(BWL02(GF_U`X@'PD$P%(BQN#W?](A=MUXDV+)"1-
-MA>1USTB!Q(@```")Z%M=05Q!7<-F9F:005=!5D%505152(G54TB![-@```")
-M="0,2(UT)`SHKOW__TF)QKC_____387V#X3Y````38MF&#'`9F9FD&9FD,8$
-M*`!(@\`!2(/X1'7R28M&"$B-="0028M^$/]0.(!\)"(0#[94)"*X#P```(MT
-M)`P/0L)(C90DP````(A$)"))BT8(28M^$/^0N````(7`#X2H````28M<)!A-
-MC6PD&$PYZP^$@0```$4Q_^L*9I!(BQM,.>MT<H"[@/S__P%,C:-P_/__=>A,
-M.[/H_/__==](BX/8_/__2(N[\/S__TB-M"20````_U!X]H0DF@````)UO`^V
-MA"2<````.T0D#'6N#[:$))T````Z1"0B<Z`/MM!!BX0DZ`,``$&#QP&)1)4(
-M1#A\)")UAC'`2('$V````%M=05Q!74%>05_#BX0DQ````(E%!(N$),````")
-M10#I/____V9FD&9FD&9FD(U'^S'2@_@'=PZ)P/\DQ0````"Z`0```(G0P[H(
-M````B=##N@(```")T,.Z!P```(G0P[H#````B=##N@0```")T,.Z!0```(G0
-MP[H&````B=##9F9FD&9FD&9FD&9FD`^VCX`#``!$#[9&"(G*@_(!@^(!B="#
-MR"!!]L`@#T3"B<*#R@+VP00/1<*)PH/*!(/A`@^V3@H/1<*)PH/*$$&#X!`/
-M1<*)PH/*0/;!`0]%PHG"@,J`@^$"#T7"#[979(G!@<D```"`]L($#T7!B<&!
-MR0```@#VP@(/1<&)P8')```!`(/B`0]%P8G"@<H```0`]D=F`0]%PL-F9I!F
-M9I!(BX=H`@``2(M/*$0/MD=$2,'H"TC!Z0M(:=#H`P``2(G0,=)(]_%$B<)(
-MB<%(BT<(#[9`"BG"B=!(F$@/K\A%A<!(C02)1(T4`'Y]08U`_S'V3(U(`4B+
-M3/=@2(7)=&#V@8`#```!=%>`>1`$=E'V@6`"``!P=$A(BU$(#[9!1`^V4@HI
-MT(T$@$2-!`!(BX%H`@``2(M)*$C!Z`M(P>D+:=#H`P``B=`QTO?Q1`^OP$6%
-MTG0%13G"=@9%B<)F9I!(@\8!3#G.=8U!@?H0)P``N!`G``!!#T;"PV9FD&9F
-MD$B+CX`"```/MH&J````/`)U<DB+01"_$"<``$B+<"A(BT$(3(M`*$B)\DPI
-MPDC!Z@M(A=)T-H!Y*`!U-$B+@:````!,*<!(P>@+2&G`Z`,``$B)T3'22/?Q
-M2(T$@`'`OQ`G```]$"<```]&^(GXPY!(*[&@````2,'N"TAIQN@#``#KS3P#
-M=%>`>2@`="-(BT$02(M0*$B)T$@K@:````!(P>H+2,'H"TAIP.@#``#KH$B+
-M@:````!(P>@+2&G0Z`,``$B+01!(BT@H2(G0,=)(P>D+2/?Q2(T$@`'`ZX"`
-M>2@`=`9(BT$(ZZ=(BX&@````2,'H"TAIT.@#``!(BT$(Z\1F9F:09F:09F:0
-M9F:03(M'&$V%P'0\00^V0$2$P`^V\'0C,<E).7A@=!Y,B<(QR>L-2(M":$B#
-MP@A(.?AT"H/!`3GQ=>PQP,-!BT`X@\`!`<C#BT<XPV9F9I!F9I`/MD=$A<!^
-M8X/H`44QR4R-4`%*BTS/8$B%R71&]H&``P```70]@'D0!'9$#[9!1(7`?B^#
-MZ`$QTDR-0`%F9F:02(M$T6!(A<!T#_:`@`,```%T!D@Y<#AT%$B#P@%,.<)U
-MWDF#P0%-.=%UIS'`\\-(.7$X=>U(B<C#9F9FD&9FD$%708G7059)B?Y!54F)
-MS4%455-(@^P(2(7_0(AT)`-$B$0D`D2(3"0!#X0)`0``@'\0!P^4P$"`_@</
-ME,*$P`^%VP```(32#X7K````187_#X0L`@``3(GMQT0D!`````!)Q\7_____
-M13'D9F:09I"+?0#H`````$B%P$B)PP^$AP```$F+!D@Y`P^%>P```(![$`%U
-M=4B)WDR)]^C?_O__,?](A<!(B<9T!$B+>$A(BTLX2(7)#X39````2(G(,=)(
-M@W@8`4B+`$B#VO](A<!U[TB#^@,/AKD````QTD4Q[8-$)`0!20'42(/%!$0Y
-M?"0$#X5X____#[9,)`*#X0^`?"0#!P^&+0$``$4QY$B#Q`A,B>!;74%<05U!
-M7D%?PP^V1T0\`0^$(?___X32=`B$P`^%00$``$6%_V9FD&:0#X0\`0``3(GM
-M,=M)Q\7_____13'DZRF`>!`!=:Y(BT!`2(7`=*5)`<1).<5,#T?H@\,!2(/%
-M!$0Y^P^$>/___XM]`.@`````2(7`=<IF9I#I=O___S'22(7V=`1(BU8H2(7)
-M=&E%,<#K(69FD&9FD$B+01A(.<9T"DB%_W0=2(7`=%=(BPE(A<ET*DB%]F:0
-M==Y(A?](BT$8=>-(A<!FD'7A2(M!$$@YT$@/1]!(BPE(A<EUUDB%_W04387`
-M=`])BT`02`-'$$@YPD@/0M!).=5,#T?JZ<?^__](BT<(2`-'$$@Y00AUNDB+
-M01!)B<A(.=!(#T?0Z[4/MD0D`_\DQ0````!!@_\!#X:]_O__08/_`DV)[`^&
-ML_[__P^VR;C_____0='OT^!(F$DAQ$2)^$P/K^#IE?[__T6%_P^%NP```$G'
-MQ?____]%,>3I9_[__T&#_P,/AG#^__\/MLFX_____TV)[-/@2)A)(<1!C4?^
-M3`^OX.E4_O__08/_`@^&1_[__P^VR;C_____38GLT^!(F$DAQ$&-1_],#Z_@
-MZ2O^__^`?"0!`0^&_0```(!\)`$"#X9+____1`^V3"0!,=)$B?A!]_&%T@^%
-M_/W__X/X`0^.\_W__TQCX$&-0?\/MLE(F$P/K^"X_____]/@2)A)(<5-#Z_E
-MZ=']__](BT=@,>TQTDB%P'4>Z;S]__]!.>\/AN#]__^)ZDF+1-9@2(7`#X2C
-M_?__2(M8.$&+?)4`Z`````!(.<-T$D$/MD9$@\4!.>@/AJW]___KPD$/MD9$
-M#[;803G?#X)M_?__A,!T9TF+1F`Q[3'22(7`=23I5_W__T$/MD9$@\4!#[;8
-M.>MV1HGJ28M$UF!(A<`/A#C]__](BU@X08M\E0#H`````$@YPW3.Z2#]__\/
-MMLFX_____TV)[-/@2)A)(<1$B?A,#Z_@Z07]__\/ML!-BV8H28MTQEA(BT8X
-M2(M(.$B%R74*ZR5(BPE(A<ET'4B#>1@`=?%(BU9(2(M""$@#0A!(.4$(==],
-M`V$003G?=ROIN_S__TF+%D@Y$`^%K/S__X!X$`$/A:+\__^#PP%,`V!`1#G[
-M#X25_/__B=A!BWR%`.@`````2(7`=<GI?/S__Y#SPV9F9I!F9F:09F:09F:0
-MBPT`````C5$!B=#!^!_!Z!Q$C00"08/@#T$IP$0[!0````"X_____W192&/!
-M2,?&`````$B-%(!(C1102(L'2(T,E0````!(B025`````$B+1PA(B40Q"$B+
-M1Q!(B40Q$$B+1QA(B40Q&$B+1R!(B40Q((M'*$2)!0````")1#$H,<#SPV9F
-M9I!F9F:09F:02(/L.`^V1Q!)B=`\`70F/`1T/4B-5"0,@_X!2(GG&<"#P!F(
-M1"0(9HE*".@`````2(/$.,.+A^@#``!(C50D#$R)1"0,B40D!.O-9F:09I!(
-MBU<X2(M'2(N2Z`,``$P#0`B)5"0$2(U4)`Q,B40D#.NF9F9FD&9F9I!F9I!F
-M9I!54TB#[!C&!"0&2(M?$$B%VW0@2(M#$#'_2(GF2(E$)`A(BT,(_Y#`````
-M2(L;2(7;=>!(@\086UW#9F:09F:02(M'4$0/MX^8````28GP08G22(NP@`(`
-M`$R+&$2)R<'A"8!^*`!T#?:'L0````0/A8@````/MY::````P>()A<E)B[-0
-M`@0`18N+6`($`'1>B=`QTD'W\8G`2,'@!$B-/`9)C7`0ZS:)T$@#!TB)1OA$
-MB<C'1O0`````28GP*=")1O`YR(G(#T9&\"G!B4;P2(UV$(7)=!=(@\<0,=)%
-MA=)UQ8G02`-'"$B)1OCKPK@!````0<=`]`$```###[>6F`````^WAIH````I
-MPD0IRL'B">EG____9F9FD&9F9I!!5$F)_%5(B?53@'Y$`'1J,=OK(DB+5DA)
-MBT0D2$B+2`A(.4H(=#D/MD5$C5,!2(/#`3G0?D1(BW3=8$B%]G3G@'X0!';.
-M3(GGZ++___^$P'356UU!7+@!````PV9F9I!)BT0D.$@Y1CATYP^V142-4P%(
-M@\,!.=!_O%M=05PQP,-F9F:09F9FD&9F9I!F9I!!54F)]4%428G\55.`?T0`
-M=%(Q[>L<3(GN2(G?Z-____]!#[9$)$2-50%(@\4!.=!^,DF+7.Q@2(7;=.6`
-M>Q`$=]1,B>Y(B=_H(____X3`C54!#Y1#4$$/MD0D1$B#Q0$YT'_.6UU!7$%=
-MPV9FD&:0@'\0`70#,<##2(7V=%I(BX:``@``2(7`=$Y,BT`(23GP=$I(BT\X
-M2(7)=#9F9F:02(M1&$B%TG0?2(7V=0=FD.O$2(G"2(M"&$B%P'7T2#GR=`5,
-M.<)UKDB+"4B%R6:0=<ZX`0```,-)B?#KMDR+0!#KL&9F9I!F9I!F9I!F9I"+
-M1QR%P'@&@W\@`W<'QT=0_O____/#9F9FD&9FD&9FD(%_',<```!V"8%_(,<`
-M``!W!\='4/[____SPV9FD&:0@7\<QP```'8)BU<@A=)X`O/#QT=0_O___\-F
-M9I!F9I"+3QR%R7@&@W\@`W<'QT=0_O____/#9F9FD&9FD&9FD(-_'`-V!H-_
-M($MW!\='4/[____SPV9F9I!F9F:09F:0@W\<`W8&@W\@5W<'QT=0_O____/#
-M9F9FD&9F9I!F9I"#?QP#=@:#?R!#=P?'1U#^____\\-F9F:09F9FD&9FD(-_
-M'`=V!H-_(`]W!\='4/[____SPV9F9I!F9F:09F:0@W\<!W8&@W\@0W<'QT=0
-M_O____/#9F9FD&9F9I!F9I"#?QP#=@:#?R`#=P?'1U#^____\\-F9F:09F9F
-MD&9FD(-_'`=V"8%_(/\```!W!\='4/[____SPV9F9I!F9F:0@W\<!W8)@7\@
-MHPP``'<'QT=0_O____/#9F9FD&9F9I"#?QP'=@F!?R`G#0``=P?'1U#^____
-M\\-F9F:09F9FD(-_'`=V"8%_(*L```!W!\='4/[____SPV9F9I!F9F:0@W\<
-M"W8&@W\@)W<'QT=0_O____/#9F9FD&9F9I!F9I"#?QP#2(M'*(L`=A-(8U<@
-MB<!(C02%!````$@YPG,'QT=0_O____/#9F9FD&9F9I"#?QP#2(M'*(L`=A-(
-M8U<@B<!(C02%!````$@YPG,'QT=0_O____/#9F9FD&9F9I!32(G[2(M'*(-[
-M'`.+.'8)@7L@K0```'<)QT-0_O___UO#Z`````!(A<!T[5MF9I##9F9FD&9F
-M9I!F9F:09F:04TB)^TB+1RB#>QP#BSAV"8%[(-<```!W"<=#4/[___];P^@`
-M````2(7`=.U;9F:0PV9F9I!F9F:09F9FD&9FD%-(B?M(BT<H@WL<`XLX=@F!
-M>R#Y````=PG'0U#^____6\/H`````$B%P'3M6V9FD,-F9F:09F9FD&9F9I!F
-M9I!32(G[2(M'*(-['`A(BTLPBSAV#(-[(`1_%F9FD&9FD,=#4/[___];PV9F
-M9I!F9I`/ME`(BT`$B0&$THA1!'04@3G#`0``=MCH`````$B%P'3.6\,]PP$`
-M`&9F9I!F9I!VONOD9F9FD&9F9I!F9F:02(/L$$B);"0(2(D<)$B)_8%_'+,`
-M``!V!H-_(`=W%<=%4/[___](BQPD2(ML)`A(@\00PTB+1RB+&(G?@^L!Z```
-M``"#^_UWW4B%P'31@'@0!';+2(.X@`(```!UP6:0Z\1F9F:09F9FD&9FD&9F
-MD$B#[!A(B6PD"$B)'"1(B?U,B60D$(-_'`AV!H-_(`=W'\=%4/[___](BQPD
-M2(ML)`A,BV0D$$B#Q!C#9F:09I!,BV<H08L<)(G?@^L!Z`````"#^_UW$DB%
-MP'0&@'@0!'<7QT50_O___TF-?"0$Z)WK__\L`76JZZ](@[B``@```'7?Z^1F
-M9F:09F9FD&9FD$B#["A(B6PD"$B)'"1(B?U,B60D$$R);"083(ET)"!(BT\H
-M2&-7'$2+,42)\$B-!(4$````2#G"<F:+=R"%]GA?@#T``````G1613'M187V
-M0;P$````=3'K369FD&9FD(G?Z`````!(BU402#D09I!U4O9`9`%T*$&#Q0%)
-M@\0$13GU=")(BTTH0HL<(8G?Z`````!(A<!UQV9F9I!F9I#'15#^____2(L<
-M)$B+;"0(3(MD)!!,BVPD&$R+="0@2(/$*,/'15#\____Z]IF9I!(@^P@2(D<
-M)$B);"0(2(G[3(ED)!!,B6PD&(%_'(<```!,BV<H=@F#?R`#=R-F9I#'0U#^
-M____2(L<)$B+;"0(3(MD)!!,BVPD&$B#Q"##D$$/MD0D`3P(=]9%,>V$P'4=
-MZ]2)[^@`````2(M3$$@Y$'4B08/%`44X;"0!=KE!#[;%08MLA&B)[^@`````
-M2(7`==#KF\=#4/S___]F9F:0ZY5F9F:09F9FD&9FD&9FD(-_'`-V!H-_(`-_
-M!\='4/[____SPV9F9I!F9F:09F:02(M'*(M7'+D0````BW`(1(M`#(7V=`=$
-MB<!(C4@02&/"2#G!=PR%]HM'('4,03G`=@?'1U#^____\\-F9I!FD$B#["!(
-MB1PD2(EL)`A(B?M,B60D$$R);"08@7\<KP```$R+9RAV"8-_(`-W(V9FD,=#
-M4/[___](BQPD2(ML)`A,BV0D$$R+;"082(/$(,.000^V1"0!/!!WUD4Q[83`
-M=1WKU(GOZ`````!(BU,02#D0=2)!@\4!13AL)`%VN4$/ML5!BVR$<(GOZ```
-M``!(A<!UT.N;QT-0_/___V9F9I#KE69F9I!F9F:09F:09F:02(/L($B)'"1(
-MB6PD"$B)^TR)9"003(EL)!B#?QP$2(MO*'X&@W\@`W<FQT-0_O___TB+'"1(
-MBVPD"$R+9"003(ML)!A(@\0@PV9F9I!F9I!(B>_HF.C__RP!=<X/MD4-/$!W
-MQD4Q[83`=2'KQ&9FD$2)Y^@`````2(M3$$@Y$)!U(D&#Q0%$.&T-=J5!#[;%
-M1(MDA7Q$B>?H`````$B%P'7.ZX;'0U#\____9F:09I#I?/___V9F9I!F9F:0
-M9F:02(/L($B)'"1(B6PD"$B)^TR)9"003(EL)!B!?QRS````2(MO*$2+90!V
-M!H-_(`-W'\=#4/[___](BQPD2(ML)`A,BV0D$$R+;"082(/$(,-$B>?H````
-M`$B%P'341(GGZ`````!(BU,02#D0=`G'0U#\____Z\%,C64$00^V1"0!/!!W
-MK$4Q[83`=2'KJF:0B>_H`````$B+4Q!(.1!FD'7,08/%`44X;"0!=HM!#[;%
-M08MLA'")[^@`````2(7`=<[I:O___V9FD&9FD&9FD$B#["!(B1PD2(EL)`A(
-MB?M,B60D$$R);"08@W\<"$B+;RA$BV4`=@:#?R`#=R+'0U#^____2(L<)$B+
-M;"0(3(MD)!!,BVPD&$B#Q"##9F:01(GGZ`````!(A<!TT42)Y^@`````2(M3
-M$$@Y$'0)QT-0_/___^N^3(UE!$R)Y^C=YO__+`%UIT$/MD0D#3Q`=YU%,>V$
-MP'4IZYMF9I!F9I")[^@`````2(M3$$@Y$&:0=;Q!@\4!13AL)`T/AG3___]!
-M#[;%08MLA'R)[^@`````2(7`=<KI4____V9FD&:01(M''$6%P'@&@W\@*W<'
-MQT=0_O____/#9F9FD&9F9I!(@^P02(D<)$B);"0(2(G[@W\<"$B+1RB+*'8T
-M1(M/($6%R7@KB>_H`````$B%P'0?B>_H`````$B+4Q!(.1!T%L=#4/S____K
-M#69FD&9FD,=#4/[___](BQPD2(ML)`A(@\00PV9F9I!F9F:09F:02(/L$$B)
-M'"1(B6PD"$B)^X-_'`A(BT<HBRAV-$2+5R!%A=)^*XGOZ`````!(A<!T'XGO
-MZ`````!(BU,02#D0=!;'0U#\____ZPUF9I!F9I#'0U#^____2(L<)$B+;"0(
-M2(/$$,-F9F:09F9FD&9FD$B#[!!(B1PD2(EL)`A(B?N#?QP(2(M'*(LH=C1$
-MBU\@187;>"N)[^@`````2(7`=!^)[^@`````2(M3$$@Y$'06QT-0_/___^L-
-M9F:09F:0QT-0_O___TB+'"1(BVPD"$B#Q!##9F9FD&9F9I!F9I!(@^P02(D<
-M)$B);"0(2(G[@W\<#4B+1RB+*'8LBT<@A<!X)8GOZ`````!(A<!T&8GOZ```
-M``!(BU,02#D0=!#'0U#\____ZP?'0U#^____2(L<)$B+;"0(2(/$$,-F9I!(
-M@^P02(D<)$B);"0(2(G[@W\<#4B+1RB+*'8LBT<@A<!^)8GOZ`````!(A<!T
-M&8GOZ`````!(BU,02#D0=!#'0U#\____ZP?'0U#^____2(L<)$B+;"0(2(/$
-M$,-F9I!(@^P02(D<)$B);"0(2(G[@W\<#4B+1RB+*'8LBT<@A<!X)8GOZ```
-M``!(A<!T&8GOZ`````!(BU,02#D0=!#'0U#\____ZP?'0U#^____2(L<)$B+
-M;"0(2(/$$,-F9I!(@^P02(D<)$B);"0(2(G[@W\<`TB+1RB+*'95BT<@A<!X
-M3HGOZ`````!(A<!T0HGOZ`````!(BU,02#D0=`G'0U#\____ZS"`>!`$=B-(
-MBY"``@``2(72=!>`NJL`````=0X/MH!A`@``@^`8/`AT!\=#4/[___](BQPD
-M2(ML)`A(@\00PV9F9I!F9I!F9I!(@^P02(D<)$B);"0(2(G[@W\<`TB+1RB+
-M*'8TBT<@A<!X+8GOZ`````!(A<!T(8GOZ`````!(BU,02#D0=`G'0U#\____
-MZP^`>!`!=`EFD,=#4/[___](BQPD2(ML)`A(@\00PV9F9I!F9F:09F:02(/L
-M$$B)'"1(B6PD"$B)^X-_'`-(BT<HBRAV-(M'((7`>"V)[^@`````2(7`="&)
-M[^@`````2(M3$$@Y$'0)QT-0_/___^L/@'@0`70)9I#'0U#^____2(L<)$B+
-M;"0(2(/$$,-F9F:09F9FD&9FD$B#[!A(B1PD2(EL)`A(B?M,B60D$(-_'`=(
-MBT<HBRA$BV`$=GN+5R"%TGATB>_H`````$B%P'1H1(GGZ`````!(A<!T6XGO
-MZ`````!$B>=(B<7H`````$B)PDB+10!(.T,0=`G'0U#\____ZSI(.P)U\DB+
-M10B`>`H`="2`>A`!=1Y(@WU8`'072(N%@`(``$B%P'02@+BK`````'0)9I#'
-M0U#^____2(L<)$B+;"0(3(MD)!!(@\08PV9FD&9FD$B#[!!(B1PD2(EL)`A(
-MB?N#?QP'2(M'*(LH=C2+3R"%R7@MB>_H`````$B%P'0AB>_H`````$B+4Q!(
-M.1!T"<=#4/S____K#X!X$`1W"6:0QT-0_O___TB+'"1(BVPD"$B#Q!##9F9F
-MD&9F9I!F9I!(@^P02(D<)$B);"0(2(G[@W\<5TB+1RB+*'8YBW<@A?9X,HGO
-MZ`````!(A<!T)HGOZ`````!(BU,02#D0=`G'0U#\____ZQ2`>!`$=@=(@W@8
-M`'0'QT-0_O___TB+'"1(BVPD"$B#Q!##9F:09F:02(/L$$B)'"1(B6PD"$B)
-M^X-_'$-(BT<HBRAV-HM_((7_>"^%[70RB>_H`````$B%P'0?B>_H`````$B+
-M4Q!(.1!T"<=#4/S____K#8!X$`%T!\=#4/[___](BQPD2(ML)`A(@\00PV9F
-MD&9FD&9FD$B#[!!(B1PD2(EL)`A(B?N#?QP(2(M'*(LH=CA$BT<@187`>"^%
-M[70RB>_H`````$B%P'0?B>_H`````$B+4Q!(.1!T"<=#4/S____K#8!X$`%T
-M!\=#4/[___](BQPD2(ML)`A(@\00PV9F9I!F9I!$BU<<1872>`M$BT\@187)
-M>`+SP\='4/[____#9F9FD$2+7QQ%A=MX!H-_("MW!\='4/[____SPV9F9I!F
-M9F:0BT<<A<!X!H-_(']W!\='4/[____SPV9F9I!F9I!F9I!(@^P02(D<)$B)
-M;"0(2(G[2(MO*(M/'+\0````#[95"P^V=0S!X@E`@/X"=#A(8\%(.<=W&T"`
-M[@&+2R"_$````'142&/!2#G'=B5F9I!FD,=#4/[___](BQPD2(ML)`A(@\00
-MPXG02(UX$.O`9F:0BWT`Z`````!(A<!TTXM]`.@`````2(M3$$@Y$'09QT-0
-M_/___^O`B=!(C7@02&/!2#G'=ZOKR8!X$`%UHV9FD.NE9F9FD&9F9I!F9I!F
-M9I!(@^P02(D<)$B);"0(2(G[2(MO*(M/'+\4````#[=5$`^V=1+!X@E`@/X"
-M=#A(8\%(.<=W&T"`[@&+2R"_%````'142&/!2#G'=B5F9I!FD,=#4/[___](
-MBQPD2(ML)`A(@\00PXG02(UX%.O`9F:0BWT`Z`````!(A<!TTXM]`.@`````
-M2(M3$$@Y$'09QT-0_/___^O`B=!(C7@42&/!2#G'=ZOKR8!X$`%UHV9FD.NE
-M9F9FD&9F9I!F9I!F9I!(@^P02(D<)$B);"0(2(G[@W\<`TB+1RB+*'8LBT<@
-MA<!X)8GOZ`````!(A<!T&8GOZ`````!(BU,02#D0=!#'0U#\____ZP?'0U#^
-M____2(L<)$B+;"0(2(/$$,-F9I!(@^PH2(EL)`A(B1PD2(G]3(ED)!!,B6PD
-M&$R)="0@2(M/*$AC5QQ$#[8Q1(GP2(T$A00```!(.<)R2(-_(`-V0D4Q[46%
-M]D&\!````'4DD.LXB=_H`````$B+51!(.1!U14&#Q0%)@\0$13GU=!M(BTTH
-M0HL<(8G?Z`````!(A<!US\=%4/[___](BQPD2(ML)`A,BV0D$$R+;"083(MT
-M)"!(@\0HP\=%4/S____KVDB#["A(B6PD"$B)'"1(B?U,B60D$$R);"083(ET
-M)"!(BT\H2&-7'$0/MC%$B?!(C02%!````$@YPG)(@W\@`W9"13'M187V0;P$
-M````=220ZSB)W^@`````2(M5$$@Y$'5%08/%`4F#Q`1%.?5T&TB+32A"BQPA
-MB=_H`````$B%P'7/QT50_O___TB+'"1(BVPD"$R+9"003(ML)!A,BW0D($B#
-MQ"C#QT50_/___^O:2(/L$$B)'"1(B6PD"$B)^X-_'`=(BT<HBRAW%<=#4/[_
-M__](BQPD2(ML)`A(@\00PXGOZ`````!(A<!TWXGOZ`````!(BU,02#D0=-;'
-M0U#\____Z\UF9F:09F:09F:0@W\<`TB+1RB+`'832&-7((G`2(T$A00```!(
-M.<)S!\='4/[____SPV9F9I!F9F:04X-_'`)(B?M(BT<H#[8`=C^+5R"%TG@X
-M,?8/MOCH'MS__TB%P$B)PG0F2(M`"$B#N/@`````=!A(BT,02#E"&'0'QT-0
-M_/___UO#9F:09I#'0U#^____6\-F9F:09F:02(/L$+X<````2(D<)$B);"0(
-M2(G[2(MO*(M7'`^V302`^0)T,DACPD@YQG<5@.D!BU,@O@@```!T34ACPD@Y
-MQG8>QT-0_O___TB+'"1(BVPD"$B#Q!##BT482(UP'.O%BWT`Z`````!(A<!T
-MU8M]`.@`````2(M3$$@Y$'0:QT-0_/___^O"BT482(UP"$ACPD@YQG>LZ\B`
-M>!`!=:2`?0<0=Y[KHV9F9I!F9I!F9I!(BW]8,<"%TDB+3RAT'X!Y!`%T'$B-
-M01Q(B48(BT$8QT8$`0```(D&N`$```#SPY!(BT<P2(/`"$B)1@CKWF:02(/L
-M$$B)'"1(B6PD"$B)^XMW'$B+;RB#_@MV=(M7((72>&V`?0<`=7P/MD4&,<G!
-MX`F)P$B->`Q(8\9(.?AR4(G(2&/22(/`!$@YPG)"BWT`Z`````!(A<!T-8M]
-M`.@`````2(M3$$@Y$'0)QT-0_/___^LB@'@0`745#[9%!@^W500!T#T`(```
-M?@MF9F:0QT-0_O___TB+'"1(BVPD"$B#Q!###[9-!K\,````P>$)ZX5F9F:0
-M9F:09F:09F:02(/L$$B)'"1(B6PD"$B)^XMW'$B+;RB#_@=V*XM'((7`>"2%
-M]@^V300/ME4%>!@/MM(/MLE(F`'*P>()B=)(@\((2#G0<Q7'0U#^____2(L<
-M)$B+;"0(2(/$$,.+?0#H`````$B%P'3>BWT`Z`````!(BU,02#D0=`G'0U#\
-M____Z\N`>!`!=;YF9F:09F:0Z[QF9F:09F9FD&9FD&9FD$%4BP4`````28G\
-M54B)]8/X_U-T?HM6&$C'PP````#K"TB#PRB+`X/X_W1G.=!U\8/``71>QT50
-M`````$B)[Y#_4PB+=5"%]G5008"\))`"!```=3Z+2R"%R0^%H````$F#O"3@
-M`0```'0]28N4)!@"``!)C80D$`(``$F)K"08`@``2(E%`$B)50A(B2I;74%<
-MP\=%4/[___];2(GO3(M=2%U!7$'_XTB#>Q``28FL).`!``!T24B+0QA!QX0D
-MZ`$```$```!(B>])B:PD^`$``$G'A"0``@```````$F)A"3P`0``_U,008N$
-M).@!``"#Z`&%P$&)A"3H`0``=8Y,BUL82(GO6UU!7$'_XV:02(L'2(V7:`,`
-M`,>'$`,```__``#'AQ0#```(````QX<8`P```````$B)ER`#``!(QX<P`P``
-M`````$B)AP@#``"+A^@#``")<@1(QX=``P```````$B-M_@"``")AV@#``!(
-MB[\(`P``Z8+^__]FD%-(B?M(BW\02#F?X`$``'0/2(G?3(M;2%M!_^-F9F:0
-M2(NW$`(``$B-AQ`"``!(QX?@`0```````$@YQG332(L62(M&"$B)0@A(B1!(
-MB78(2(DVZ"C^___KMV9FD&9FD(N'Z`,``,-F9I!F9I!F9I!(@^PXB?E)B?!(
-MC50D+$B)YTB)X,8``$B#P`%(.=!U](#Y!XA,)`@/A*L```"`^09T$(#Y!'0+
-M@/D%=`:`^0B0=1@/ME0D#/:&8`(```&X`0````]$PHA$)`R`^1QT88#Y`W08
-M08N`Z`,``$B)YXE$)`3H`````$B#Q#C#28M0($B%TG3?#[:"L````(A$)`R`
-MNK``````=<M(BX*0````2(E'$`^W@I@```")1Q@/MH*Q````T.B#X`&(1"0-
-MZZ1(BX9H`@``2(E'#`^WAG0#``!FB4<4ZXQ(BT882(7`=`F+@.@#``")1PQ,
-MBT8XZ7'___]F9F:09F:09F:09F:00(@U`````,-F9F:09F9FD$B+5QA(C4\8
-M2#G*=0OK+I!(BQ)(.<IT)8"Z@/S__P%(C8)P_/__=>CV0O`!=.*%]G0-2(L2
-M@^X!2#G*==LQP//#9F9FD&9F9I!F9F:09F:02(/L&$B)7"0(3(ED)!!(B?M!
-MB?2+=S1(BS]%B>3H`````$B)QP^V@+$```!(B5]0QH>P````!$B)7UA,B6=@
-MQH>R`````$C'A\@`````````@^#/@\@@B(>Q````2(M<)`A,BV0D$$B#Q!CI
-M`````$B#["A(B1PD3(ED)!!)B?Q,B6PD&$R)="0@28GU2(EL)`A(BR])B=:+
-M=S1(B>_H`````$B-O?````!(B</H`````$C'``````!)BU0D*$B)WTC'0#``
-M````2,=`$`````!(QT`H`````$C'0#@`````2(E0"$B-4!C'0$``````2(E#
-M>$R)8U!(B5`82(E0($R):UC&@[`````$3(FSR````,:#L@````!(BQPD2(ML
-M)`A,BV0D$$R+;"083(MT)"!(@\0HZ0````!F9I!F9I!(@^P82(D<)$B);"0(
-M2(G]3(ED)!"#`@%!B?2+=S1(BS](B=/H`````$B)QT&#_`$/MI>Q````&<!(
-MB6]0@\`"QH>P````!$B)7UB#X`/&A[(`````P>`$@^+/"<*(E[$```"`?1`$
-M=A=(@[V``@```'0-2,>'R`````````#K"TC'A\@`````````Z`````!(BWT`
-M2(L<)$B+;"0(3(MD)!!(@\08Z0````!F9I!FD$B#[#A,B7PD,$R-OQ`!``!,
-MB60D&$F)_$B);"003(EL)"!,B?],B70D*$B)7"0(28GV28G5Z`````!(A<!(
-MB<4/A,,```!)BUPD&$R)8"!)@\08QP`!````3(EP"$R):!!(QT`8`````$PY
-MXW4*ZS-(BQM,.>-T*X"[@/S__P%(C;MP_/__=>CV0_`!=.)(B>J^`0```.BU
-M_O__2(L;3#GC==6+10"#Z`&%P(E%`'0C2(M<)`A(BVPD$$R+9"083(ML)"!,
-MBW0D*$R+?"0P2(/$.,-(B>Y,B?_H`````$R)[TV)\TB+7"0(2(ML)!!,BV0D
-M&$R+;"0@3(MT)"A,BWPD,$B#Q#A!_^-(Q\<`````,<#H`````.O%9F9FD&9F
-MD$B#[#A,B7PD,$R-OQ`!``!,B60D&$F)_$B);"003(EL)"!,B?],B70D*$B)
-M7"0(28GV28G5Z`````!(A<!(B<4/A+(```!)BUPD&$R)8"!)@\08QP`!````
-M3(EP"$R):!!(QT`8`````$PYXW0D9I"#NZ#\____2(V[</S__W0*2(GJ,?;H
-MIOW__TB+&TPYXW7>BT4`@^@!A<")10!T(TB+7"0(2(ML)!!,BV0D&$R+;"0@
-M3(MT)"A,BWPD,$B#Q#C#2(GN3(G_Z`````!,B>]-B?-(BUPD"$B+;"003(MD
-M)!A,BVPD($R+="0H3(M\)#!(@\0X0?_C2,?'`````#'`Z`````#KQ69F9I!F
-M9F:02(M6.%-(B?M(B7X02(72=`6+1B")`DB)W^AR^/__2(G?6^D`````9F:0
-M9F:09F:0BX;H`P``2(V6:`,``$B)O@@#``#'AA`#```/_P``QX84`P``"```
-M`$B)EB`#``#'0@0,````B89H`P``2(V&>@,``,>&&`,```````!(QX8P`P``
-M`````$B)MC@#``!(B88H`P``2,>&0`,```````!(@<;X`@``Z0````!F9I!(
+M``"ZH`,``+X!````2(G?Z`````#IN````#P##X6P````1(N7&`$``$&\````
+M`+T````J0;D`````O@````"_`````$&X!````+H!````B=")\=/@087"=1B-
+M3@;3XD$)U$$)T;@5````B?G3X`G%ZPE$B<")^=/@"<6#Q@&#QP5!@\`#@_X$
+M=<!$B<FZJ`,``$"V`4B)W^@`````B>FZQ`,``+X!````2(G?Z`````!!#[?,
+M"XL8`0``]]&ZH`,``+X!````2(G?Z`````!F9I!;74%<PV9F9I!F9F:09F:0
+M2(/L"(GQA-)T%KC^____T\`AAQ@!``#K%&9F9I!F9I"X`0```-/@"8<8`0``
+MZ`````!(@\0(PV9FD&9FD&9FD$B#[`@/M_;!Y@B-3@]!N`$```"ZF@```+X!
+M````Z`````!(@\0(PV9FD&9FD&9FD$B#[`B)\832=!:X_O___]/`9B&'``$`
+M`.L49F:09F:0N`$```#3X&8)AP`!```/M[<``0``Z`````!(@\0(PY!(@^PH
+M2(D<)$B);"0(3(ED)!!,B6PD&$R)="0@2(G]08G6#[:>S````$0/MFX"2(M^
+M<$B%_W0,#[;200^V]>@`````2(GOZ`````"`^P=W2`^VP_\DQ0````!!O/L`
+M``#K-D&\,P```.LN0;P[````ZR9!O',```#K'D&\>P```.L60;RS````ZPY!
+MO+L```#K!D&\\P```$2)YDB)[^@`````00^VUD&-=)T`0`^V]DB)[^@`````
+M2(L<)$B+;"0(3(MD)!!,BVPD&$R+="0@2(/$*,-F9F:09F9FD&9FD$%455-)
+MB?R[`````$`/MNZZ`@```(GN3(GGZ('Z__^H"'0-N`````#K(&9FD&9FD+\!
+M````Z`````"#PP&!^Q`G``!UR[C_````6UU!7,.02(/L*$B)7"0(2(EL)!!,
+MB60D&$R);"0@2(G]28G-08G40`^VWHG>Z(3___^%P'4P00^V](G:2(GOZ$+[
+M__^%P'0>N@$```")WDB)[^C_^?__08A%`+@`````ZPEF9F:0N/____](BUPD
+M"$B+;"003(MD)!A,BVPD($B#Q"C#9I!(@^PH2(E<)`A(B6PD$$R)9"083(EL
+M)"!(B?U!B<U$#[;B0`^VWD2)X;H!````B=[HR_G__[E`````N@(```")WDB)
+M[^BW^?__B=Y(B>_HW?[__X7`=4Q%A>UT-$'VQ`%T%8G:OD````!(B>_HC_K_
+M_X7`="[K,XG:OA@```!(B>_H>OK__X7`=!GK'F9F9I")VKXH````2(GOZ&'Z
+M__^%P'4'N/\```#K!K@`````D$B+7"0(2(ML)!!,BV0D&$R+;"0@2(/$*,-F
+M9F:09F:005=!5D%505154TB#[`A)B?U)B<]%B<:)\XG5A-(/A`T!``!`#[;>
+MB1PDN60```"Z`@```(G>Z/7X__^+-"1,B>_H&O[__X7`=1"Z`P```(LT)$R)
+M[^BF^/__0`^VU;D!````BS0D3(GOZ,+^__]!O/____^$P`^%J0$``$&\````
+M`$6%]@^.F@$``$R)^\=$)`0`````08UN_TACQ4Z-/#A!B>P[;"0$=3:Y0```
+M`+H"````BS0D3(GOZ''X__],B?FZ6````(LT)$R)[^C>_?__A<!T.NE*`0``
+M9F:09I"Y1````+H"````BS0D3(GOZ#OX__](B=FZ4````(LT)$R)[^BH_?__
+MA<`/A1`!``"#1"0$`4B#PP%$.70D!`^$_````.EX____9F9FD&9FD+^@A@$`
+MZ";X__\/MNL/MLBZ`P```(GN3(GOZ.'W__^)[DR)[^@'_?__A<!T(T$/MHU!
+M$@``N@,```")[DR)[^B\]___0;S_____Z:8```"0B>J^8````$R)[^BA^/__
+MA<!T#T&\`````$6%]GYI9I#K'T$/MHU!$@``N@,```")[DR)[^AW]___0;S_
+M____ZV1,B?M!O`````!F9I!F9I"Y1````+H"````B>Y,B>_H3/?__TB)V;J`
+M````B>Y,B>_HNOS__X7`=0U!@\0!2(/#`44Y]'7)00^VC4$2``"Z`P```(GN
+M3(GOZ!+W___K!42+9"0$1(G@2(/$"%M=05Q!74%>05_#9F:09F:09F:02(/L
+M&$B)7"0(3(ED)!!)B?Q(B=!`#[;608G(2(G!O@````#HF/W__XG#N50```"Z
+M`@```+X`````3(GGZ*_V__^)V$B+7"0(3(MD)!!(@\08PV9F9I!F9F:09F:0
+M9F:02(/L&$B)7"0(3(ED)!!)B?Q(B=!`#[;608G(2(G!O@$```#H./W__XG#
+MN50```"Z`@```+X!````3(GGZ$_V__^)V$B+7"0(3(MD)!!(@\08PV9F9I!F
+M9F:09F:09F:0059!54%455-)B?U(B<U%B<:)TT0/MN:Y9````+H"````1(GF
+MZ`?V__]$B>9,B>_H+/O__X7`=1"Z`P```$2)YDR)[^BX]?__#[;3N0$```!$
+MB>9,B>_HU?O__X3`=39%A?9^.$B)Z[T`````9F9FD`^V$[D`````1(GF3(GO
+MZ*W[__^$P'4.@\4!2(/#`40Y]70)Z]NX_____^L%N`````!;74%<05U!7L-F
+M9I!F9I!(@^P82(E<)`A,B60D$$F)_$B)T$`/MM9!B<A(B<&^`0```.@H____
+MB<.Y5````+H"````O@$```!,B>?H/_7__XG82(M<)`A,BV0D$$B#Q!C#9F9F
+MD&9F9I!F9I!F9I!(@^P(2(N'``D``$B%P$@/1,=`B#4`````N2````!(Q\(`
+M````O@X```!(B<?H`````$B#Q`C#9F:09F:09F:02(/L"(GQA-)T%K@!````
+MT^!F"8=L%```ZQ1F9I!F9I"X_O___]/`9B&';!0```^VMVP4``#H`````$B#
+MQ`C#D$%7059!54%455-(@^Q82(G[28GV2(M.*$B#P0*+=AR#[@''1"14````
+M`$F+1C!(B40D,$F+1B@/ME$!@/H!=1!!QT90`````.GS!```9F:0@/H"=4F`
+M>0(!=39(BX<`"0``2(7`2`]$QTB+D/@(```/MD$#B()N%```#[9!`XB"_B@`
+M`$''1E``````Z:\$``!!QT90_O___^FB!```3(UX`8#Z!`^%]0$```^V00.#
+MZ#L\`0^'Y@$``$$/MF\"2(N?^`@``$`/MO5(B=_H`````(G"A,!T#0^VP("\
+M`V@(``#_=5!(BYOX"```2('#D!0``$B+N_@(``#H`````(GJ*,(/MO)(B=_H
+M`````(G"A,!T#0^VP("\`V@(``#_=11!QT90_____TR)]T'_5DCI(00```^V
+MP@^VA`-H"```@/J!=V0/MLA(:<G(#P``00^V=P1!#[97!<'B$$$/MD<&P>`(
+M"<)!#[9'!PG"B50D/$$/ME<(P>(000^V1PG!X`@)PD$/MD<*"<*)5"1`2(G-
+M2`.KD`D```^$Z0```(!]6`!U&>G>````0<=&4/____],B?=!_U9(Z9D#``!!
+MO`````#&1"1'`$R-;4B+1"0\2(E$)!A)C5<+2(E4)!!`#[;VB70D#$R)[^@`
+M````2(U8\$B+55!(B4503(EK$$B)4QA(B0(/MD-)/`UT!#PB=5U!#[9'`SP[
+M="(\/'5038GPBTPD/(M4)$"+="0,2(G?Z`````#&1"1'`>LR2(N[*`$``$B+
+M5"082(MT)!#H`````$V)\(M,)#R+5"1`BW0D#$B)W^@`````QD0D1P%!@\0!
+M1#AE6`^':O___X!\)$<`#X7/`@``0<=&4/____],B?=!_U9(Z;L"``!F9I!F
+MD(#Z`P^%G````(!Y`@%F9I`/A8(````/MD,^C30`#[9Y`XGZB?C!^A_W_HG5
+M.=9^6TR-:01$#[;B#[91!$2)YDB)W^@`````C47\@_@#=AB-1?2#^`-V$(U%
+M[(/X`W8(C47D@_@#=P=(@<.0%```00^V50!$B>9(B=_H`````$''1E``````
+MZ14"``!!QT90_O___^D(`@``0<=&4/[____I^P$``(`Y!78Y@'D$_F:0=3%(
+MC50D5$B+N_@(``!,B?;H`````(3`#X72`0``QT0D5`````!!QT90_____^F]
+M`0``3(NK``D``$V%[4P/1.M(B<NX`@```$@IR$B)1"0H2&/V2(ET)"#IYP``
+M`&:0#[8K3(UB`0^VT/;"`71IBTPD5(GKC40-`$$[1B`/ATP!``!!@#\!=2>)
+MR4@#3"0P08GHO@$```!,B>_H@/?__SGH="OI)@$``&9F9I!F9I")R4@#3"0P
+M08GHO@````!,B>_H6??__SGH#X4``0```5PD5$R)X^MM2&/%2HT<($B+1"0H
+M2`'82#M$)"`/C]T```!!@#\!=1Q!B>A,B>&^`0```$R)[^@5^O__A<!T(.F[
+M````08GH3(GAO@````!,B>_H^?G__X7`#X6@````@#L`=0:`>P$`=`N_$"<`
+M`)#H`````$B-4P$/MD,!A,`/A0O___\/M@.$P'1[#[;8N50```"Z`@```+X`
+M````3(GOZ-KO__^+5"1408M&("G0.<,/1]A!@#\!=1Z)T4@#3"0P08G8N@``
+M``"^`0```$R)[^AY]O__ZQR)T4@#3"0P08G8N@````"^`````$R)[^A;]O__
+MA<!X!@%$)%3K"$''1E#_____N50```"Z`@```+X`````3(GOZ&+O__]FD$F+
+M5CA(A=)T!HM$)%2)`DR)]T'_5DA(@\186UU!7$%=05Y!7\-F9F:09F9FD&9F
+MD$B#[`A(BX<`"0``2(7`2`]$QTB+N/@(```/MH=O%```A,!T#8/H`8B';Q0`
+M`(3`=1W&!0``````N2````!(Q\(`````O@X```#H`````$B#Q`C#9F9FD&9F
+MD&9FD&9FD$B#[`A(BX<`"0``2(7`2`]$QTB+N/@(``"`OVX4````=22`AV\4
+M```!Q@4``````;D@````2,?"`````+X.````Z`````!(@\0(PV9FD&:02(/L
+M&$B)7"0(3(ED)!!)B?Q(B=!`#[;608G(2(G!O@````#H*/C__XG#N50```"Z
+M`@```+X`````3(GGZ#_N__^)V$B+7"0(3(MD)!!(@\08PY"0D)"0D)"0D)"0
+MD)"0B?9(BT<(2"T``@$`2`'&BP:)!0````##9F9FD&9F9I")]DB+1PA(+0`"
+M`0!(`<:)%L-F9F:09F9FD&9FD&9FD%-(B?M(BU<(2('J``(!`,>"@``!````
+M``"+@@0!`0")!0````"`S`&)@@0!`0"Z!````+X,P@``Z`````"ZN`L``+X(
+MP@``2(G?Z`````"Z`0`,`+X`P@``2(G?Z`````"Z!````+X,PP``2(G?Z```
+M``"ZN`L``+X(PP``2(G?Z`````"Z`0`,`+X`PP``2(G?Z`````!(BT,(2"VT
+M`0``9L<```!(BT,(2"V4`0``#[<`9HD%``````^WP$B+4PA(@>J4`0``@\@$
+M9HD"2(M#"$@MF`$``&;'``0`9L>#;!0``/__6\-F9F:09F9FD$B+5PA(@>H`
+M`@$`BX)L``$`B04`````#,B)@FP``0##2(M7"$B!Z@`"`0"+@F@``0")!0``
+M```D-PGPB8)H``$`PV9F9I!F9F:09F:09F:04T@YO_@(``!U:(GPP.@"0;L`
+M````1`^VT$ECVHGP@^`#1(T,0+@'````1(G)T^#WT$2+1)]002'`1(E$GU"$
+MTG0.N`0```#3X$0)P(E$GU!)8\*+5(=000^V\\'F"('&4,(``$B+O_@(``#H
+M`````%O#B?#`Z`*#Z`1!NP$```#KDV9F9I!F9F:09F:09F:005=!5D%50515
+M4TB#[`A(B?U!B?9!B==!B<U(BT<(3(L@3(GGZ`````!(B<-(A<`/A.L```!,
+MB>?H`````$B)PDB%P`^$UP```,9%7`'&0SCAQD,Y`<9#.A#&0R6[#[9%6V:)
+M0R!,B6,HQT,TD````$B-0A!(B4-(2(E3>$B)P4B)PK@`````Q@00`$B#P`%(
+M/9````!U\,9!`8+&`4!$B'$"1(AY`T2(:01!@/T"=R%(C7D(2HT4K0````"!
+MXOP#``!)C;0DJ!(``.@`````ZRM)BX0DJ!(``$B)00A(C7D000^VU8T4E?C_
+M__](8]))C;0DL!(``.@`````2,>#H`````````!(C7M8O@````#H`````$B)
+MWDR)Y^@`````2(/$"%M=05Q!74%>05_#D$B#[#A(B5PD"$B);"003(ED)!A,
+MB6PD($R)="0H3(E\)#!(B?U!B?5!B=9!B<](BT<(3(L@3(GGZ`````!(B<-(
+MA<!T>TR)Y^@`````2(G"2(7`=&O&15P!QD,XX<9#.0'&0SH0QD,ENP^V15MF
+MB4,@3(EC*,=#-)````!(C4(02(E#2$B)4WC&0`$"QD(00$2(:`)$B'`#1(AX
+M!$C'@Z``````````2(U[6+X`````Z`````!(B=Y,B>?H`````$B+7"0(2(ML
+M)!!,BV0D&$R+;"0@3(MT)"A,BWPD,$B#Q#C#9F9FD&9FD&9FD&9FD$%6055!
+M5%532(G[08GU08G62(M'"$B+*+D"````N@````"^`````.@`````@'M<`'08
+M2(GOZ`````"_`0```.@`````@'M<`'7H2(M#"$B+`$@%J!(``(!X`@!X.X!(
+M`H"Y`0```+H`````O@````!(B=_H`````(![7`!T&F:02(GOZ`````"_`0``
+M`.@`````@'M<`'7H1(GHP.@"1`^VX+D!````1(GBO@,```!(B=_H`````(![
+M7`!T&V9FD$B)[^@`````OP$```#H`````(![7`!UZ$B+0PA(BS!$B>GWT8/A
+M`T6$]@^5PL'B`P^VA`ZH$@``@^#G"="(A`ZH$@``N0$```!$B>*^`P```$B)
+MW^@`````6UU!7$%=05[#9F9FD&9F9I!F9I!F9I!(@^PH2(E<)`A(B6PD$$R)
+M9"083(EL)"!(B?M(B?4/MT8@9CV%`'<;3(NOD`D```^WP`^VA`=H"```3&G@
+MR`\``.L-3(NOD`D``$&\.+@/`$B+54B`>@$"=19(BT($2(F#J!(``$B+0@Q(
+MB8.P$@``2(MU>$B%]G0(2(G?Z`````!(B>Y(B=_H`````$/&1"5<`$B+7"0(
+M2(ML)!!,BV0D&$R+;"0@2(/$*,.0D)"0D$F)T4R+ET`)```/MT8@NF">`0!F
+M/84`=Q</M\`/MH0':`@``$B-%$!(C1202,'B!4V-@2`$``!!QH$@!```)V:!
+M?CCA`74I1`^V3CI!C4'_/`%W#$&Y#P```$0B3COK+D&-0>]!N0\````\`78@
+M9I!)C0020;D`````2(-X8`!T#4&Y#P```$0BB($```!!#[9``8/@\$0)R$&(
+M0`&X`0```&:!?CCA`746#[9&.H/H`3P!#Y?`#[;`9F9FD&9FD(G"P>('00^V
+M0`&#X'\)T$&(0`$/MD$&08A``@^V`4&(0`,/MD$%08A`!P^V00=!B$`/#[9!
+M`D&(0`0/MD$#08A`!0^V001!B$`&#[9!`4&(0`P/MD$*08A`"`^V00M!B$`)
+M#[9!#$&(0`H/MD$(08A`"P^V00E!B$`-PV9FD&:00`^VQ\-F9F:09F9FD&9F
+MD(GX#[;$PV9F9I!F9I!F9I#&1R0"2(M'4$"(<`)(BT=0QD`'`$B+1U"(4`S#
+M9F9FD`^V1SV(1@(/MD<\B$8##[9'.XA&!`^V1SJ(1@K#9F:0#[9'08A&`@^V
+M1T"(1@,/MD<_B$8$#[9'/HA&"@^V1SV(1@L/MD<\B$8,PV9FD&:0A=)^(;D`
+M````9F9FD&9FD(G0*<B#^`(/G<`/ML"-3`$!.<I_Z_/#9F:09F:09F:02(/L
+M*$B)'"1(B6PD"$R)9"003(EL)!A,B70D($B)^TB)U4&)]@^V1S@\*G0E/"IW
+M$3PH#X7=````9F9FD&9FD.L0/(AT*CR*#X7(````9I#K'D0/MF-`1`^V:S](
+MB>Y(B=_H`````.L<9F9FD&9FD$0/MF-%1`^V:T1(B>Y(B=_H`````,9%!4"+
+M@Y0```"I```!`'0P1(AE`$2(;0A"C03U`````(A%`0^V0S@\*'0$/(AU"\9%
+M!F#K6V9FD&:0QD4&8>M0J0``!`!F9I!FD'0@1(AE`42(;0D/MD,X/"AT!#R(
+M=0;&108EZRK&108UZR1$B&4!#[9#.H/@#PA%!0^V0S@\*'0$/(AU!L9%!LCK
+M!,9%!LI(BQPD2(ML)`A,BV0D$$R+;"083(MT)"!(@\0HPV9F9I!F9I!F9I!F
+M9I`/MD<Z"D<["D<\"D<]#[;`#[970(/B`0G0=!6Z)````+X%````Z`````#S
+MPV9F9I#&1@;L2,>'H`````````##2(/L($B)'"1(B6PD"$R)9"003(EL)!A(
+MB?M(B?4/MD<X/"]T"SR/=5GK%V9FD&:01`^V9T!$#[9O/^@`````D.L/1`^V
+M9T5$#[9O1.@`````QD4%0/:#E@````1T$D2(90%$B&T)QD4&0NL69F9FD$2(
+M90$/MD,Z@^`/"$4%QD4&0$B+'"1(BVPD"$R+9"003(ML)!A(@\0@PV9FD&9F
+MD$B)\<9"!4`/MD8X/#5T!CR1=2/K&P^W1VB#X`&#^`$9P(/@_8/H%HA"!NLD
+M9F9FD,9"!NKK&KHD````O@4```!(B<_H`````//#9F:09F:0]D$Y`G0$QD$D
+M`//#9F9FD/9'//!T#[HD````O@4```#H`````//#9F:09F:09F:02(/L"$F)
+M\+@`````9F9FD,8$"`!(@\`!2(/X#77R00^V0#@\-0^$G0```#PU=RD\*'1B
+M/"AW#CP;#X6A`P``D.F;````/"IT3#PO9F:09I`/A8H#``#K6#R/9F:09F:0
+M=$X\CW<2/(AT*SR*9F9FD`^%:@,``.L=/)%F9I!F9I!T1CSA#X56`P``9F:0
+M9F:0Z80````/MO)(B<I,B<?H`````,=$)`0!````Z3@#``!(B<Y,B<?H````
+M`,=$)`0!````Z2`#``!(B<I,B<;H`````,=$)`0!````Z0@#``!!]D`\`70A
+MQD$&<,9!!`#&00,`QD$"`,9!!4#'1"0$`0```.G@`@``QD$&X,=$)`0!````
+MZ<\"``!!@'@Y`0^%O`(``$&`>#H<#X>Q`@``00^V0#K_),4`````QD$'!,=$
+M)`0!````Z9P"``#&00<`QT0D!`$```#IBP(``,9!!NS'1"0$`0```.EZ`@``
+MQD$&[\8!`T$/MD`[@\A`B$$!QT0D!`$```#I6P(``,9!!N_&`0?'1"0$`0``
+M`.E'`@``QD$&0,9!`0'&005`QT0D!`$```#I+@(``,9!!N_&`0-!#[9`.X/(
+M"(A!`<=$)`0!````Z0\"``#&00;OQ@$"QT0D!`$```#I^P$``,9!!N_&`8+'
+M1"0$`0```.GG`0``QD$&[\8!!L=$)`0!````Z=,!``#&00;OQ@&&QT0D!`$`
+M``#IOP$``,9!!N-!#[9`.XA!`<=$)`0!````Z:8!``#&00:PQ@'8QD$#3\9!
+M!,+'1"0$`0```.F*`0``QD$&L,8!V<9!`T_&003"QT0D!`$```#I;@$``,9!
+M!K#&`=K&00-/QD$$PL=$)`0!````Z5(!``#V1V@!=!'&00;JQT0D!`$```#I
+M.P$``,9!!N?'1"0$`0```.DJ`0``QD$&[\8!JL=$)`0!````Z18!``#&00;O
+MQ@%5QT0D!`$```#I`@$``,9!!B_&00$!QD$"$,=$)`0!````Z>D```#&00;D
+M00^V0#R(`4$/MD`]B$$(00^V0#N(007'1"0$`0```.G!````00^V0#N(009!
+M#[9`/(@!00^V0#V(00)!#[9`/HA!`T$/MD`_B$$$00^V0$&(00I!#[9`0(A!
+M`<=$)`0!````Z7T```#&00;H00^V0#R(`4$/MD`]B$$(00^V0#N(005!#[9`
+M/HA!`D$/MD`_B$$#00^V0$"(001!#[9`08A!`<=$)`0!````ZSC'1"0$`0``
+M`$'V0#P!="G&009PQD$$`,9!`P#&00(`QD$%0,=$)`0!````ZPMF9I#'1"0$
+M`````(M$)`1(@\0(PV9F9I!F9F:09F9FD&9FD%-(@^P@2(GS2(M.2$C'!"0`
+M````2,=$)`@`````2,=$)!``````2,=$)!@`````]H&G````!'0-2(N1R```
+M`$B#Z@'K!HM1>(/J`8![."5U84B)T$C!Z!B(!"1(B=!(P>@0B$0D`4B)T$C!
+MZ`B(1"0"B%0D`_:!U0```!!U%,9$)`8"QD0D!P"X"````.FN````2(U\)`1(
+MC;'J````N@0```#H`````+@(````Z8X```!(B=!(P>@XB`0D2(G02,'H,(A$
+M)`%(B=!(P>@HB$0D`DB)T$C!Z""(1"0#2(G02,'H&(A$)`1(B=!(P>@0B$0D
+M!4B)T$C!Z`B(1"0&B%0D!_:!U0```!!U%<9$)`H"QD0D"P"X(````.LD9F9F
+MD$B-?"0(2(VQZ@```+H$````Z`````"X(````&9FD&:02(M[2$ACT$B)YN@`
+M````2(/$(%O#9F9FD&9F9I!F9I!32(GS2(M74$B+"@^V1C@\+W1?/"]W*SP;
+M#X0Q`0``/!MW#SP2#X5%`0``9F:09I#K0#PH=#P\*@^%,@$``&:0ZS`\BG0L
+M/(IW&#PU9F9FD`^$^@```#R(#X42`0``9I#K$#R/=`P\X0^%`@$``&:0ZW7V
+M1V@!=`J!BY0```````0`]D=J$`^$%`$``$B#?V``#X4)`0``#[9#.#PH=!`\
+M*G0,/(AT"#R*#X7Q````]D(,`744#[9R"$B)S^@`````A,`/A-<```"`>R2!
+M#X3-````@8N4```````!`+@!````Z;X```"`?CD!#X6D````@'XZ'`^'F@``
+M`$@/ODXZN`$```!(T^"I]C_`'74CJ0A`!@!U#*D``"``=2-F9I#K<X..E```
+M``BX`0```&:0ZW.#CI0````!N`$```#K98..E````""X`0```.M79I#V1V@!
+M=`J!BY0```````0`@XN4`````;@!````ZS=FD(N#E````*D``"``=!CV1V@!
+M=!T-```$`(F#E````+@!````ZQ"X`````.L)9F9FD+@!````6\.0D)"0D)"0
+MD)!(BW\(10^VP$'!X`0/MM+!X@A!"=!$B<"#R`2$R40/1<!!@_G_=!E(C9<`
+M_O[_1(G()?__`P")@@3(``!!@\@"1(D&PV9F9I!F9F:09F9FD$B+1PA(+0`"
+M`0"#S@&)L`#(``##9F9FD&9F9I!F9F:005154T&)]$B+1PB%]G1,2"T``@$`
+M2(VH`,@``(N``,@``(D%`````+L`````J`%U#^LABT4`B04`````J`%T%+\*
+M````Z`````"#PP%$.>-UX>L'N`````#K!;C_____6UU!7,-F9F:09F9FD&9F
+MD%532(/L&$B)^\=$)!0`````2(MO",:'<!0````/MA4`````2(UT)!1!N0``
+M``!!N`(```"Y`0```.CB_O__BW0D%$B)W^@F____OJ"&`0!(B=_H.?___X7`
+M=55(C84`_O[_BX`,R```B04`````B40D%#T?8P``=3?'@V`4```?8P``QX-D
+M%``````$`,>#:!0``````0!(QX-X%````````&:X``#I5P(``&9FD&:0QT0D
+M%`````!(BVL(QH-P%````0^V%0````!(C70D%$&Y_____T&X`@```+D!````
+M2(G?Z#C^__^+="042(G?Z'S^__^^$"<``$B)W^B/_O__A<!U;DB-A0#^_O^+
+M@`S(``")!0````")1"04/1]#``!T+3T?1```=4G'@V`4```?1```QX-D%```
+M```'`,>#:!0``````0#IDP$``&9FD,>#8!0``!]#``#'@V04``````0`QX-H
+M%``````!`.EM`0``QT0D%`````!(BVL(QH-P%`````^V%0````!(C70D%$&Y
+M`````$&X`@```+D!````2(G?Z'7]__^+="042(G?Z+G]__^^$"<``$B)W^C,
+M_?__A<!U4$B-A0#^_O^+@`S(``")!0````")1"04/;]#``!U,L>#8!0``+]#
+M``#'@V04`````"``QX-H%````!```$C'@W@4````````9K@``.GJ````QT0D
+M%`````!(BVL(QH-P%`````^V%0````!(C70D%$&Y`````$&X`@```+D!````
+M2(G?Z-#\__^+="042(G?Z!3]__^^$"<``$B)W^@G_?__A<!U9TB-A0#^_O^+
+M@`S(``")!0````")1"04/>\1``!T"3WO$@``=4+K(,>#8!0``.\1``#'@V04
+M``````0`QX-H%``````!`.L^QX-@%```[Q(``,>#9!0`````"`#'@V@4````
+M``$`ZQZX_____^LG9F:09I!(QX-X%````````+@`````ZQ!(QX-X%```````
+M`+@`````2(/$&%M=PV9F9I!F9I!(@^PH2(E<)!!(B6PD&$R)9"0@2(G[B?=)
+MB=1(BVL(@/D$N`0````/1\A(BX-X%```#[90!$B-="0,08GY1`^VP;D!````
+M2(G?Z,+[__^+="0,2(G?Z`;\__^^$"<``$B)W^@9_/__NO____^%P'4@2(V%
+M`/[^_XN`#,@``(D%`````(E$)`Q!B00DN@````")T$B+7"002(ML)!A,BV0D
+M($B#Q"C#9F9FD&9FD&9FD%532(/L&$B)^TB)U4B+AW@4```/ME`+2(U$)!1!
+MB?%!N`$```"Y`0```$B)QN@N^___BW0D%$B)W^AR^___OA`G``!(B=_HA?O_
+M_[K_____A<!U&DB+0PA(+?0Y``"+`(D%`````(A%`+H`````B=!(@\086UW#
+M9F:09F:09F:005=!5D%505154TB#[!A(B?M!B<U!B?=!B=:%R0^$C@```+T`
+M````3(MC"$B+@W@4```/ME`"0;G_____0;@!````N0$```!(C70D%$B)W^B,
+M^O__BW0D%$B)W^C0^O__OA`G``!(B=_HX_K__X7`=2E)C80D`/[^_XN0#,@`
+M`(D5`````$2)^"'01#CP=0>X`````.L?B50D%+\*````Z`````"#Q0%$.>T/
+MA7?___^X_____TB#Q!A;74%<05U!7D%?PV9F9I!F9F:09F9FD%-(@^P02(G[
+M2(N'>!0```^V$$B-="0,0;G_____0;@`````N0````#HX_G__XMT)`Q(B=_H
+M)_K__[X0)P``2(G?Z#KZ__^%P'4FN>"3!`"Z`@```+X#````2(G?Z,_^__^Z
+M`````(7`=`MF9I!F9I"Z_____XG02(/$$%O#9F:02(/L*$B)7"082(EL)"!(
+MB?N)]<9$)!?_2(U4)!?H`````(7`=7*`?"07`'1S2(G?Z$O___^#^/]T7DB+
+M@W@4```/ME`*2(UT)!!!B>E!N`````"Y`````$B)W^@P^?__BW0D$$B)W^AT
+M^?__OA`G``!(B=_HA_G__X7`=1NYX),$`+H`````O@,```!(B=_H'/[__X7`
+M=`BX_____^L&D+@`````2(M<)!A(BVPD($B#Q"C#9F9FD&9F9I!F9F:02(/L
+M6$B)7"0H2(EL)#!,B60D.$R);"1`3(ET)$A,B7PD4$B)_4&)]HG+2(._>!0`
+M```/A/@"``!)B==%A,`/A%P!``"#_O]U%P^WAV`4``!FB0*X`0```.GY`@``
+M9F:0@_[^=1*+AV04``")`K@!````Z=\"``"#_OUU%(N':!0``(D"N`$```#I
+MR`(``&:0`?.)7"0,.Y]D%```#X>.`@``B?.#X_Q!B?1!@^0#=&),C6PD)+D$
+M````3(GJB=[H_/O__X/#!+H$````.5PD#',-1(G@1"GPBTPD#(T4"$0YXG8N
+M1(GA3(G_9F:09F:0B<A!#[9$!0"(!TB#QP&#P0$YT77KB=!$*>"#Z`%-C7P'
+M`42+9"0,08/D_$0YXW,J3(UL)"2Y!````$R)ZHG>2(GOZ(G[__^+1"0D08D'
+M28/'!(/#!$$YW'?;.5PD#`^&XP$``$R-9"0DN00```!,B>*)WDB)[^A5^___
+MBW0D#"G>#X3``0``N0````"Z`````$$/M@040H@$.H/!`4B#P@$Y\0^$G@$`
+M`.OF9F:09I"#_O]U*X`Z#W41QH=Q%````;@!````Z9L!``#&AW$4````N`$`
+M``#IB@$``&9F9I")3"04B<@!\#N'9!0```^'3`$``("_<10````/A#\!``")
+M\+H`````][=H%```A=(/A8T```"`OW`4````=`WH`````(7`#X44`0``2(GO
+MZ)S\__^#^/\/A`,!``!(BX5X%```#[90!DB-="0D18GQ0;@`````N0````!(
+MB>_H??;__XMT)"1(B>_HP?;__[X0)P``2(GOZ-3V__^%P`^%O````+G@DP0`
+MN@````"^`P```$B)[^AE^___A<`/A9T```"%VP^$G````,=$)!``````BT0D
+M$$6+)`=$BVPD$$4!]4B+70A(@>L``@$`2(GOZ/K[__]$B:,(R```2(N%>!0`
+M``^V4`5%B>E!N`0```"Y`````$B-="0D2(GOZ-WU__^+="0D2(GOZ"'V__^^
+M$"<``$B)[^@T]O__A<!U(+F($P``N@````"^`0```$B)[^C)^O__A<!T%V9F
+MD&:0N`````#K'[@!````9F9FD.L4@T0D$`2+1"00.40D%';FZ4W___](BUPD
+M*$B+;"0P3(MD)#A,BVPD0$R+="1(3(M\)%!(@\18PY"0D)"0D)"X`````,-F
+M9F:09F:09F:0N``````Y/0````!^-TACQTC'P0````!(C01`2,'@`P^W%`AF
+MB18/MU0(`F:)5@(/ME0("(A6"`^V1`@)B$8)N`$```#SPV9F9I!F9I!F9I"X
+M("L``,-F9F:09F:09F:0N-````##9F9FD&9FD&9FD+@(````PV9F9I!F9I!F
+M9I"^`````$&X`````+D`````#[:4.>@(``"`^O]T2HV!@````&8]@0!W!X/&
+M`>LY9I`/ML)(BY=H"0``2(T$P$C!X`6`O!`5`0```W4808/``4&-0`.#^`9V
+M#H/&`4&X`````.L#@\8!2(/!`4B#^09UGXGPPV9F9I!F9F:09F9FD$B)^4&Z
+M`````$&[`````$&Y@````$`/MO:#Q@%F9F:018G(#[:!Z`@``#S_=%!F08'Y
+M@0!W"D&#P@'K/69F9I`/ML!(BY=H"0``2(T$P$C!X`6`O!`5`0```W4908/#
+M`4&-0P.#^`9V$$&#P@%!NP````#K!$&#P@%$.=9T%TB#P0%!@\$!08'YA@``
+M`'610;@`````1(G`PV9F9I!F9I#SPV9F9I!F9F:09F:09F:0QH?+`````,-F
+M9F:09F9FD+C_````2(7_=$2^_____[D`````#[:$.>H(```\_W0@#[;`2(N7
+M:`D``$B-!,!(P>`%#[:$$!0!``!`.,8/1_!(@\$!2(/Y!'7*0`^VQO/#N```
+M``##9F9FD&9FD&9FD$B+M_@(``"_`````$&X`````+D`````#[:4,>@(``"`
+M^O]T3XV!@````&8]@0!W!8/'`>L^#[;"2(N6:`D``$B-!,!(P>`%@+P0%0$`
+M``-U'T&#P`%!C4`#@_@&=A6#QP%!N`````#K"F9F9I!F9I"#QP%(@\$!2(/Y
+M!G6:2(NV^`@``$B!QI`4``"Q`&9FD`^VE#'H"```@/K_=$J-@8````!F/8$`
+M=P>#QP'K.6:0#[;"2(N6:`D``$B-!,!(P>`%@+P0%0$```-U&$&#P`%!C4`#
+M@_@&=@Z#QP%!N`````#K`X/'`4B#P0%(@_D&=9^)^,-F9F:09F9FD&9F9I")
+M\,#H!(U(5XU0,#P*#T/1B!>)\(/@#X/X"7X*B?"#X`^#P%?K"(GP@^`/@\`P
+MB$<!PV9F9I!F9F:09F:09F:02(/L$$B)'"1,B60D"$B)^T&)]$R)X`^V].BB
+M____00^V]$B#PP)(B=_HDO___TB+'"1,BV0D"$B#Q!##9F9FD,="!`````#'
+M`@````"X`````,-F9F:09F:09F:09F:02(M'8$B%P'112,=`0`````"`2$P$
+M2,='8`````!(QT=P`````$C'1V@`````BT<(@_@_?Q-(BU=X2)A(QX3":`0`
+M``````##2(M7>$B82,>$PF@"````````\\-F9F:02(M'8$B%P'112,=`0```
+M``"`8$S[2,='8`````!(QT=P`````$C'1V@`````BT<(@_@_?Q-(BU=X2)A(
+MQX3":`0```````##2(M7>$B82,>$PF@"````````\\-F9F:02(/L"$C'QP``
+M``#H`````+@`````2(/$",-F9I!F9I!54TB#[#C&!"1MQD0D`?_&1"0"(\9$
+M)`,4QD0D!#K&1"0%[\9$)`86QD0D!Y)(BZ\`"0``2(7M2`]$[TB-1"002(G"
+MQ@``2(/``4B)TTB-3"0P2#G(=>S&1"04`;D@````O@X```!(B>_H`````(7`
+M=4*_@!H&`.@`````N2````!(B=J^#P```$B)[^@`````@_@@=1Y(C7,02(GG
+MN0@```#\\Z8/E\(/DL"Y`0```#C"=!9(Q\<`````N`````#H`````+D`````
+M#[;!2(/$.%M=PV9F9I!F9F:09F9FD$%7059!54%455-(@^QH28G\3(N_^`@`
+M`$F!QY`4``!(BP=(A<!T$TB-L```_O](B3=(BW\@Z`````!)BW0D$$B%]G0*
+M28M\)"#H`````$F+="082(7V=`I)BWPD(.@`````2(U,)&5(C50D9DB-="1G
+M00^W?"0\2(U$)%I(B40D.$B-1"1<2(E$)#!(C40D5DB)1"0H2(U$)%A(B40D
+M($B-1"1@2(E$)!A(C40D8DB)1"002(U$)&-(B40D"$B-1"1>2(D$)$R-3"1D
+M3(U$)%3H`````$F+M"1`"0``2(7V="!)C;PD(`D``.@`````28NW0`D``$F-
+MOR`)``#H`````$F+M"1H"0``2(7V="!)C;PD2`D``.@`````28NW:`D``$F-
+MOT@)``#H`````$F+M"20"0``2(7V="!)C;PD<`D``.@`````28NWD`D``$F-
+MOW`)``#H`````$F+M"0P"P``2(7V="!)C;PD$`L``.@`````28NW,`L``$F-
+MOQ`+``#H`````(!\)&<`=$2]`````$V-M"1@"P``38VO8`L```^WW4F+M-R`
+M"P``3(GWZ`````!)B[3?@`L``$R)[^@`````@\4!#[9$)&=F.>AWT$F+M"00
+M$```2(7V="!)C;PD\`\``.@`````28NW$!```$F-O_`/``#H`````$F+M"1(
+M$```2(7V="!)C;PD*!```.@`````28NW2!```$F-OR@0``#H`````$F+M"2X
+M$```2(7V="!)C;PDF!```.@`````28NWN!```$F-OY@0``#H`````$F+M"2X
+M"0``2(7V="!)C;PDF`D``.@`````28NWN`D``$F-OY@)``#H`````$F+M"20
+M"@``2(7V="!)C;PD<`H``.@`````28NWD`H``$F-OW`*``#H`````$F+M"0@
+M"@``2(7V="!)C;PD``H``.@`````28NW(`H``$F-OP`*``#H`````$F+M"1(
+M"@``2(7V="!)C;PD*`H``.@`````28NW2`H``$F-OR@*``#H`````$F+M"3@
+M"@``2(7V="!)C;PDP`H``.@`````28NWX`H``$F-O\`*``#H`````$F+M"0(
+M"P``2(7V="!)C;PDZ`H``.@`````28NW"`L``$F-O^@*``#H`````$F+M"18
+M"P``2(7V="!)C;PD.`L``.@`````28NW6`L``$F-OS@+``#H`````$F+M"2@
+M#P``2(7V="!)C;PD@`\``.@`````28NWH`\``$F-OX`/``#H`````$F+M"38
+M#P``2(7V="!)C;PDN`\``.@`````28NWV`\``$F-O[@/``#H`````$F+M"2`
+M$```2(7V="!)C;PD8!```.@`````28NW@!```$F-OV`0``#H`````$F+M"2X
+M"@``2(7V="!)C;PDF`H``.@`````28NWN`H``$F-OY@*``#H`````$F+M"3@
+M$```2(7V="])BY0DZ!```$F-O"3`$```Z`````!)BY?H$```28NWX!```$F-
+MO\`0``#H`````$F+M"00$0``2(7V="])BY0D&!$``$F-O"3P$```Z`````!)
+MBY<8$0``28NW$!$``$F-O_`0``#H`````$F+M"1`$0``2(7V="])BY0D2!$`
+M`$F-O"0@$0``Z`````!)BY=($0``28NW0!$``$F-OR`1``#H`````$F+M"2@
+M$0``2(7V="])BY0DJ!$``$F-O"2`$0``Z`````!)BY>H$0``28NWH!$``$F-
+MOX`1``#H`````$F+M"1P$0``2(7V="])BY0D>!$``$F-O"10$0``Z`````!)
+MBY=X$0``28NW<!$``$F-OU`1``#H`````$F+M"30$0``2(7V="])BY0DV!$`
+M`$F-O"2P$0``Z`````!)BY?8$0``28NWT!$``$F-O[`1``#H`````$F+M"0`
+M$@``2(7V="])BY0D"!(``$F-O"3@$0``Z`````!)BY<($@``28NW`!(``$F-
+MO^`1``#H`````$F+M"0P$@``2(7V="])BY0D.!(``$F-O"00$@``Z`````!)
+MBY<X$@``28NW,!(``$F-OQ`2``#H`````$B#Q&A;74%<05U!7D%?PV9F9I!F
+M9I!(@^P82(E<)`A,B60D$$B)^^@`````2(G?Z`````!,C:.0%```3(GGZ```
+M``!(B=_H`````+_0!P``Z`````!(B=_H`````+X!````2(G?Z`````"^`0``
+M`$R)Y^@`````2(M<)`A,BV0D$$B#Q!C#2(/L"$"(=TM`#[;VZ`````"X`0``
+M`$B#Q`C#9F:09I!32(G[Z`````!(B[OX"```2(''D!0``.@`````6\-FD%-(
+MB?OH`````$B+N_@(``!(@<>0%```Z`````!;PV:02(/L".@`````#[;`@ST`
+M`````+H!````#T7"2(/$",-(@^PX2(E<)`A(B6PD$$R)9"083(EL)"!,B70D
+M*$R)?"0P2(G[08GT08G52(MO8$R+=WA(A>T/A!L!``"`O\L`````#X4.`0``
+M3(GWZ`````!)B<=(A<`/A/H```#&0#CAQD`Y`46$Y'0-08#]`1G`]]"#P`?K
+M"T&`_0$9P/?0@\`-08A'.D'&1R2`#[=%.&9!B4<@28E?*$''1S0`````2<='
+M2`````!)QX>@`````````$R)_DR)]^@`````QH/+`````6;'@\@```#T`4B%
+MVW1.2(M38$B%TG1/9H&[R````)8`=0Y(BWI0OB$```#H`````&:#J\@````!
+MO]`'``#H`````$R)]^@`````2(M38$B%TG0)@+O+`````'6[9H.[R`````!T
+M&D&`?R0`=1-(BT-@#[=`:F:)0UJ[`````.L%N_____],B?Y,B??H`````.L%
+MN_____^)V$B+7"0(2(ML)!!,BV0D&$R+;"0@3(MT)"A,BWPD,$B#Q#C#9F9F
+MD&9F9I!F9F:09F:02(/L2$B)7"082(EL)"!,B60D*$R);"0P3(ET)#A,B7PD
+M0$B)_4&)]4R+9V!,BW=X387D#X1Y!```@+_+``````^%;`0``$R)]^@`````
+M28G'2(7`#X18!```]D4``@^%_````$&`_11W#$$/ML6-!$#!X`+K%[B)____
+M0?;E9L'H",#H!`^VP`7P````0<9'..%!QD<Y`4'&1SH<08A'.T'&1R2`00^W
+M1"0X9D&)1R!)B6\H0<='-`````!)QT=(`````$G'AZ``````````3(G^3(GW
+MZ`````#&A<L````!9L>%R````,0)2(7M=$Y(BU5@2(72=%-F@;W(````E@!U
+M#DB+>E"^(0```.@`````9H.MR`````&_T`<``.@`````3(GWZ`````!(BU5@
+M2(72=`F`O<L`````=;MF@[W(``````^$50,``+L`````08!_)``/A$H#``#I
+M0`,``$R)]^@`````2(E$)!!(A<`/A"H#``!)C5]82(M`$$B)!"1!QD<X&D'&
+M1SD(0<9'.AI!QD<[`$'&1SP00<9'/0!(BT0D$$F)1WA!QD<D@$$/MT0D.&9!
+MB4<@28EO*$B+1"002(M`$$F)1TA!QT<T$````$B+16!(!>P```!)B4=00<9'
+M,"!)QX>@`````````+X`````2(G?Z`````!!BU<T2(M$)!!(BW`82(G?Z```
+M``!,B?Y,B??H`````,:%RP````%FQX7(````^@!(A>UT3DB+56!(A=)T3V:!
+MO<@```"6`'4.2(MZ4+XA````Z`````!F@ZW(`````;_0!P``Z`````!,B??H
+M`````$B+56!(A=)T"8"]RP````!UNV:#O<@`````=`=!@'\D`'072(UT)!!,
+MB??H`````+O_____Z?T!``!,B?Y,B??H`````$R)]^@`````28G'2(7`=1U(
+MC70D$$R)]^@`````N______IW0$``&9FD&9FD$B-6%A(BSPD2(/'!$B+%"0/
+MMD(##[8$!XA"!,9'`0K&1P(`N`````!(BQ0DQ@00`$B#P`%(@_@$=>Y%A.UU
+M!H!G`_SK04$/MM5ITF#J``"X'X7K4??JP?H%@$\#`XG1P>D8B$\$B=;![A!`
+MB'<%B=#!Z`B(1P:(5P>(3PA`B'<)B$<*B%<+2(M$)!!)B4=X0<9'.!4/M@?`
+M^`?WT(/`$4&(1SE!QD<Z`$'&1SL`0<9'/!!!QD<]`(`G/T'&1R2`00^W1"0X
+M9D&)1R!)B6\H2(M$)!!(BT`028E'2$''1S00````2(M%8$@%[````$F)1U!!
+MQD<P($G'AZ``````````O@````!(B=_H`````$&+5S1(BT0D$$B+<!A(B=_H
+M`````$R)_DR)]^@`````QH7+`````6;'A<@```#Z`$B%[71.2(M58$B%TG1/
+M9H&]R````)8`=0Y(BWI0OB$```#H`````&:#K<@````!O]`'``#H`````$R)
+M]^@`````2(M58$B%TG0)@+W+`````'6[9H.]R`````!T#+L`````08!_)`!T
+M!;O_____2(UT)!!,B??H`````.L*9F:09I"[_____TR)_DR)]^@`````ZP6[
+M_____XG82(M<)!A(BVPD($R+9"0H3(ML)#!,BW0D.$R+?"1`2(/$2,-F9F:0
+M2(/L:$B)7"0X2(EL)$!,B60D2$R);"103(ET)%A,B7PD8$B)_4B)\TF)ST&)
+MU46)QDR+9V!-A>0/A+8#``"`O\L`````#X6I`P``28M$)%!(B40D,$B+5WA(
+MB50D"&;'A\@````0)TB)U^@`````2(E$)"A(A<`/A'<#``!!#[?%B40D!&9!
+M@_T$=A6)QDC'QP````"X`````.@`````ZQ1(BWPD".@`````2(E$)!!(A<!U
+M&4B+="0H2(M\)`CH`````+O_____Z4(#``"+5"0$P>()B50D)$B+1"0(2(NP
+M^`@``,9&/P%(B>J_!0```.@`````08!,)$P"2(M58+XA````2(M\)##H````
+M`$B+5"0H2(/"6$B)5"08183V=!5(BT0D*,>`E`````H```#&0#@HZRA(BU0D
+M*,>"E````!(```#&0C@J2(M$)!!(BW@0BU0D)$R)_N@`````2(M%8/9`:`$/
+MA($```!!@/X!&<"#X`*#Z'A(BU0D*(A".,9".0!(B=A(P>@XB$(Z2(G82,'H
+M,(A".TB)V$C!Z"B(0CQ(B=A(P>@@B$(]2(G82,'H&(A"/DB)V$C!Z!"(0C](
+MB=A(P>@(B$)`B%I!QD)"`,9"0P!$B>AFP>@(B$)$1(AJ1<9"1@#&0D<`ZT]!
+M@/X!&<"#X`*#P"A(BU0D*(A".,9".0!(B=A(P>@8B$(Z2(G82,'H$(A".TB)
+MV$C!Z`B(0CR(6CW&0CX`1(GH9L'H"(A"/T2(:D#&0D$`2(M\)"CH`````$B+
+M16`/MT`X2(M4)"AFB4(@QD(D@$B):BA(BU0D$$B+0A!(BU0D*$B)0DB+1"0D
+MB4(T2(M$)!!(B4)XQD(P($B+16!(!>P```!(B4)02,>"H`````````"^````
+M`$B+?"08Z`````!(BT0D*(M0-$B+1"002(MP&$B+?"08Z`````#&A<L````!
+M2(MT)"A(BWPD".@`````2(7M#X28````2(M58$B%T@^$BP```("]RP`````/
+MA/D```!F@;W(````E@!U#DB+>E"^(0```.@`````9H.MR`````&_T`<``.@`
+M````2(M\)`CH`````$B+56!(A=)T0("]RP`````/A*X```#KLTB+5"0H@'HD
+M`'4FNP````!%A/9T(8M4)"1(BT0D$$B+<!!,B?_H`````+L`````ZP6[____
+M_TB+5"0H2(-Z>`!T+X%Z-``(``!W$TB)UDB#QGA(BWPD".@`````ZQ-(BW0D
+M*$B#QGA(BWPD".@`````2(MT)"A(BWPD".@`````2(M$)`A(B[#X"```QD8_
+M`$B)ZK\&````Z`````!!@&0D3/WK'+O_____ZQ5F@[W(``````^%1O___^ER
+M____9I")V$B+7"0X2(ML)$!,BV0D2$R+;"103(MT)%A,BWPD8$B#Q&C#9F9F
+MD&9F9I!F9I!(@^P82(D<)$B);"0(3(ED)!!(B?-(BT=03(L@2(MN:`^V1B0\
+M('1(/"!W"H3`="(\!G<5ZS`\(G0V/")F9F:0<B2#P(`\`78=N`````!FD.MC
+M2(M'0,=`!`````#&A;(````!ZPK&A;(````-9F:02(-[>`!T)8%[-``(``!W
+M$$B-<WA,B>?H`````.L.9I!(C7-X3(GGZ`````!(B=Y,B>?H`````$B)[_^5
+MR````+@!````2(L<)$B+;"0(3(MD)!!(@\08PV9F9I!F9F:02(/L*$B)'"1(
+MB6PD"$R)9"003(EL)!A,B70D($B)^TF)]4F)U$B+;V!(A>UU"DB)U__6Z3X!
+M``!(@[^(`````'4.2(._@`````!T#V9F9I!,B>=!_]7I&P$``("]Z``````/
+MA0@!``"`?4K_9F9FD`^%^@```$B+16!(A<!T"H!X40`/A><```!(BWU0]D<,
+M$`^%V0```$R+-X"]@P````!T#4B)ZKX&````Z`````!,B:N(````3(FCD```
+M``^V54A(B="#X`9(@_@&=2GVP@%T?<9%2@7&14L$#[:5@0```$B+=5A(BWU0
+M2(GIZ`````#I?P```$B#^`1U>?;"`71T2(M58$B%TG0O#[="3J@"=&.#X/UF
+MB4).2(M%8&;'0$X!`$B+16#&0$(=2(MU8$R)]^@`````ZSS&14H#QD5+!$B)
+M[DR)]^@`````ZR>0QD5*!<9%2P9FQX7(``````!(B>Y,B??H`````.L(9I!,
+MB>=!_]5(BQPD2(ML)`A,BV0D$$R+;"083(MT)"!(@\0HPV9F9I!F9I!F9I!F
+M9I!32(G[2(7_#X3#````2(M_>.@`````2(G"2(7`#X1^````@+@5`0```'1U
+M@`L!#[:`%0$``#P"=3I(@WMP`'49#[:#S````(/@`XA#`@^V@A0!``"(0P'K
+M=P^V@\T```"(0P)(BT-P#[:`%`$``(A#`>M=/`-U60^V@\P```"#X`/!X`("
+M@\T```"(0P)(BT-P#[:`%`$``(A#`>LS9F:02(M#<$B%P'4+2(M#:$B%P'4.
+MZQP/MH`4`0``B$,!ZQ`/MH#"````B$,!9F:09F:06\-F9F:09F9FD&9FD&9F
+MD%532(/L"$B)^TB%_W1WO0`````/MH0=:`@``#S_=$$/MM!(C0122(T$@DC!
+MX`5(B<)(`Y-`"0``=":+0D@E`/__`#T``/\`=1?V0DL$=!%(BWI`2(7_=`CH
+M`````&9FD$B#Q0%(@?V`````=:9(BX/X"```2#G8=0Q(C;B0%```Z`````!(
+M@\0(6UW#9F9FD%532(/L"$B)^TB-KY`4``#H`````$B)0RA(B44H2(F;^`@`
+M`$B)G?@(``"+@Q`)``")A1`)``#&@VX4```!QH5N%````4B)W^@`````2(G?
+MZ`````!(B>_H`````+X`````2(G?Z`````!(B=_H`````(3`=&I(B>_H````
+M`(3`=%Y(B=_H`````+_0!P``Z`````!(B=_H`````,>#F`$``.@#``!(QX.H
+M`0```````$B)F[`!``!(C;.8`0``2(M[*.@`````O@````!(B=_H`````+@!
+M````ZPEF9F:0N`````!(@\0(6UW#9F9FD%-(B?OH`````$B!PY`4``!(B=_H
+M`````+@!````6\.005=!5D%505154TB#[!A(B70D"$B)%"2#/0``````#X5O
+M`0``QP4``````0```$2+/0````#'1"04`````$G'Q0````!(Q\,`````2<?&
+M`````.EV`@``#[>&`````,'@$$(/MQ0N"=`YQ0^%\0```$&X`````+\`````
+M9F:09I!F@SP?`'5?26/02(G12,'A!4J+!"Y(B0090HM$+@B)1!D(#[:!````
+M`$C!X@-(C3P"#[9$)!.(1+L-#[:!`````$B-/`(/MD0D$HA$NPX/MH$`````
+M2`'"QD23#P"`@0`````!ZW0/MH\`````#[;!N@````!"]S0VA=)T2P^VP4EC
+MT$B-#-4`````2(T\`0^V1"03B$2[#4C!X@4/MH(`````2(T\`0^V1"02B$2[
+M#@^V@@````!(`<'&1(L/`(""``````'K$D&#P`%(@\<@08/X!`^%)O___X.&
+M``````%!@\(!2(/&&$4Y^@^%Y?[__T&#Q`%!@_P@#X47`0``@T0D%`&!?"04
+M_P````^%.@$``$B#?"0(`'0(2(M4)`C&`@"+-0````"]`````(7V?C6Y````
+M`+T`````N@`````#J@````!(@WPD"`!T#8N"`````$B+7"0(``.#P0%(@\(8
+M.?%UVDB#/"0`#X3L````0;H`````0;D`````2<?$`````&9#@SPA``^$S0``
+M`$$/MI$`````A-)T9T&X`````$ECPDR-',4`````#[;"@^@!2(U8`4N-!`-(
+MC32%`````$B+/"2Y!````/SSI@^7P@^2P#C"=2%(@WPD"`!T#T$/MH$`````
+M2(M4)`B(`D$/MJD`````ZPE)@\`!23G8=;1!@\(!28/!($&#^@1T3.EN____
+M1(AD)!*Y`````+H`````1(GFBWPD%.@`````B<5!N@````"^`````$6%_P^/
+MC_W__^FE_O__#[9$)!2(1"030;P`````Z[E`#[;%2(/$&%M=05Q!74%>05_#
+M9F9FD&9F9I!F9F:09F:02(/L&$B)'"1(B6PD"$R)9"00B?5,BV=X2(M?8/8'
+M`71?2(M[6$B%_W000`^VU@^VLX$```#H`````$B+NR`!``!(A?]T$$`/MM4/
+MMK,-`0``Z`````!,B>?H`````$B%P'0M@+@5`0```'0D0`^VU4B+<T!,B>?H
+M`````.L29I!`#[;62(MS0$R)Y^@`````2(L<)$B+;"0(3(MD)!!(@\08PV9F
+M9I!F9I!F9I!F9I!(@^Q(2(E<)!A(B6PD($R)9"0H3(EL)#!,B70D.$R)?"1`
+M2(G[08GT2(MO8$R+;WA(A>T/A#<#``"`O\L`````#X4J`P``]@<"#X4A`P``
+M#[:%F`$``(3`=`M`./!U.I#I"P,```^V#X/A`0^VR0^V5P(/MG<!1`^VA0\!
+M``!(Q\<`````N`````#H`````+O_____Z=P"``!,B>_H`````$F)QDB%P`^$
+MPP(``$B+0V`/M@N#X0$/MLD/ME,"#[9S`44/MLQ$#[:`#P$``$C'QP````"X
+M`````.@`````0<9&..%!QD8Y`4&`_`(/E<"#P!I!B$8Z0<9&)(`/MT4X9D&)
+M1B!)B5XH0<=&-`````!)QT9(`````$G'AJ``````````3(GV3(GOZ`````#&
+M@\L````!9L>#R````/0!2(7;=$Y(BU-@2(72=%-F@;O(````E@!U#DB+>E"^
+M(0```.@`````9H.KR`````&_T`<``.@`````3(GOZ`````!(BU-@2(72=`F`
+MN\L`````=;MF@[O(``````^$MP$``$&`?B0`#X6L`0``2(M#8$B)1"002(M`
+M4$R+.$R)_^@`````2(G%2(7`=19(BT0D$,:`Z0````&[`````.E[`0``3(G_
+MZ`````!)B<1(A<!U(4B+5"00QH+I`````4B)[DR)_^@`````NP````#I2@$`
+M`$B-15A(B40D",9%..'&13D!QD4Z`TB+5"00#[=".&:)12#&A9@````/2(E=
+M*,=%-``"``!)BU0D$$B)54BX`````,8$$`!(@\`!2#T``@``=?!,B65X2,>%
+MH`````````"^`````$B+?"0(Z`````"+531)BW0D&$B+?"0(Z`````!(B>Y,
+MB?_H`````,:#RP````%FQX/(````^@!(A=MT3DB+4V!(A=)T3V:!N\@```"6
+M`'4.2(MZ4+XA````Z`````!F@ZO(`````;_0!P``Z`````!,B?_H`````$B+
+M4V!(A=)T"8"[RP````!UNV:#N\@`````=":`?20`=2!(BW5(2(M\)!#H````
+M`$B+5"00#[:"F`$``(B#SP```$B#?7@`=`Q(C75X3(G_Z`````!(B>Y,B?_H
+M`````+L`````ZP6[_____TR)]DR)[^@`````ZPQF9F:09F:0N_____^)V$B+
+M7"082(ML)"!,BV0D*$R+;"0P3(MT)#A,BWPD0$B#Q$C#9F:09F:02(/L*$B)
+M7"0(2(EL)!!,B60D&$R);"0@2(G[@#X)=Q`/M@;_),4`````9F:09F:0N/__
+M___I)@$``$B+1@A(BY``"0``2(722`]$T$B+NO@(``#&AV\4```!Z`````"X
+M`````.GW````#[96"+X`````Z)GH___IY`````^V5@B^`0```.B&Z/__Z=$`
+M```/MG8(Z`````#IPP```$0/MFX(3(MG>$B+;V"X______9'6`@/A*<```!)
+MB[0D^`@``$B)^K\%````Z`````"`34P"2(M]4$B)ZKXA````Z`````"`O8,`
+M````=!]F9F:0O]`'``#H`````$R)Y^@`````@+V#`````'7E183M=`QF@TM:
+M$&:#36H0ZPIF@V-:[V:#96KO28NT)/@(``!(B=J_!@```.@`````@&5,_;@`
+M````ZQH/MG8(Z`````"0ZPX/MG8(Z`````"X`````$B+7"0(2(ML)!!,BV0D
+M&$R+;"0@2(/$*,-F9F:09F:02(/L6$B)7"1`2(EL)$A,B60D4$B)_4R+9WA)
+MBX0D^`@``(!X/P`/A;0```!(BY^`````2(M_8$0/MH\/`0``0;@!````1")%
+M``^V30(/ME4!BW4(#[:'VP```(E$)#@/MH?:````B40D,`^VA]D```")1"0H
+M#[:'V````(E$)"`/MH?7````B40D&`^VA]8```")1"00#[:'U0```(E$)`@/
+MMH?4````B00D08/@`4C'QP````"X`````.@`````2,>%@`````````"+50A(
+MB[V0````2(GN_]/K069F9I!(C9^8````28M\)"A(B=[H`````,>%F````/0!
+M``!(QX6H`````````$B)K;````!)BWPD*$B)WN@`````2(M<)$!(BVPD2$R+
+M9"102(/$6,-F9F:09F9FD&9F9I!F9I!!5T%6055!5%532(/L"$B)/"1)B?8/
+MM])(C0122(T$@DC!X`5)B<5,`Z]`"0``3(N'^`@``$F!P)`4``!,B6Y@28EU
+M0$F#?5@`=35)@WU@`'4N2(L$)`^V>$-`A/\/A#P$``!)BW50N0````!(.[#0
+M$@``#X3\`P``Z10$``!FD$&`#@%)BT5@28E&<$F+15A)B49H2(L4)`^V>D-`
+MA/]T3DF+=5"Y`````$@[LM`2``!T&^LM#[;!2(T40$B-%)!(BP0D2#FTT-`2
+M``!U&4B+%"0/MD)!C02!08B&S````.L-N0````"#P0%`./EUQDB+!"1(BXCX
+M"```#[:!Z`@``+X`````//]T*4F+55A(A=)T&P^VP$AIP,@/``!(`X&0"0``
+MO@````!(.<)T+[X!````#[:!Z0@``#S_="M)BU582(72=!\/ML!(:<#(#P``
+M2`.!D`D``$@YPG4)08AV`>GW````@\8!N@````!FD`^VA`KJ"```//]T)P^V
+MP$B-!,!(P>`%2`.!:`D``$D[16!U#$&(=@'IP````&9FD(/&`4B#P@%(@_H$
+M=<.)\4$/MH#H"```//]T)DF+55A(A=)U!8UQ`>L8#[;`2&G`R`\``$D#@)`)
+M``!(.<)UY>LK00^V@.D(```\_W0H28M56$B%TG0<#[;`2&G`R`\``$D#@)`)
+M``!(.<)U!D&(=@'K2X/&`;H`````9F:09F:00@^VA`+J"```//]T)@^VP$B-
+M!,!(P>`%20.`:`D``$D[16!U"T&(=@'K$F9FD&:0@\8!2(/"`4B#^@1UPTB+
+M%"2`>DT!=3U)BWU82(7_=!)!#[:U@0```+H`````Z`````!)B[T@`0``2(7_
+M#X2\`0``00^VM0T!``"Z`````.@`````28.](`$````/A)P!``!)BVU8@'U8
+M`'190;P`````2(U=2$F)WTB)W^@`````2(U(\$B+55!(B4502(E9$$B)41A(
+MB0*`N0\!``#_=1"`>4D`=0I(@[D@`0```'4*08/$`40X95AWNT0X95@/A9$`
+M``!!#[:%#P$``$&(1@*`?5@`#X23`0``NP````!,C65(3(GGZ`````!(C4CP
+M2(M54$B)15!,B6$02(E1&$B)`DB+04!(A<!T/`^VD0\!```X4`)T,$B#N(``
+M````=29(@[B(`````'4<B%`"#[=1.$B+!"1(B[#X"```OP<```#H`````(/#
+M`3A=6`^&&@$``.N.00^VA8$```!!B$8"0<:%#P$``/^`?5@`#X3Z````NP``
+M``!F9F:09F:03(G_Z`````!(C4CP2(M54$B)15!,B7D02(E1&$B)`H"Y#P$`
+M`/]T3,:!#P$``/](BT%`2(7`=#P/MI&!````.%`"=#!(@[B``````'4F2(.X
+MB`````!U'(A0`@^W43A(BP0D2(NP^`@``+\'````Z`````"#PP$X75AV<NN"
+M00^VA8$```!!B$8"ZV(/ML%(C11`2(T4D$B+!"1(.;30T!(``'4B2(L4)`^V
+M0D&-!(%!B$8!08B&S````#A*0W44ZPVY`````(/!`4`X^76]0<9&`?]!QD8"
+M`$&#O9`!````=`M!BX64`0``08A&`DF-3B!)C968````28N%F````$F)1B!(
+MBT((2(E!"$B+0A!(B4$02(M"&$B)01A(BT(@2(E!($F-3@Q)C96$````28N%
+MA````$F)1@Q(BT((2(E!"(M"$(E!$$F+A<````!)B49(00^W16AF08E&6$$/
+MMT5J9D&)1EI)BT5X28E&4$$/MH6"````08A&7$$/MH68`0``08B&SP```$'V
+M14P$=0E(BSPDZ`````!!#[952$B)T(/@!DB#^`9U"_;"`74&08`.`NL$08`F
+M_4$/ME5,T.J#X@1!#[8&@^#["=!!B`9!#[9&`4&(ALX```!!#[9&`D&(ALT`
+M``!,B??H`````$F+=4"Z`````$B+/"3H`````$R)]^CF^/__2(/$"%M=05Q!
+M74%>05_#9F9FD&9FD$B#[!A(B5PD"$B);"002(G]2(N?^`@``.@`````@'U-
+M`74M2(V[D!0``(!_30%T6X"]@!0```!U%[X`````Z`````"`A8`4```!9F:0
+M9F:02(V=F`$``$B+?2A(B=[H`````,>%F`$``.@#``!(QX6H`0```````$B)
+MK;`!``!(BWTH2(G>Z`````!(BUPD"$B+;"002(/$&,-F9I!F9I!!5%532(/L
+M,$F)^TB)TTB+;BA,BV8P1`^V50M(BX?X"```2(NP^`@``+\`````0;@`````
+MN0````!F9F:09F:0#[:4,>@(``"`^O]T2HV!@````&8]@0!W!X/'`>LY9I`/
+MML)(BY9H"0``2(T$P$C!X`6`O!`5`0```W4808/``4&-0`.#^`9V#H/'`4&X
+M`````.L#@\<!2(/!`4B#^09UGT&)^4B+MO@(``!(@<:0%```L0`/MI0QZ`@`
+M`(#Z_W1/C8&`````9CV!`'<%@\<!ZSX/ML)(BY9H"0``2(T$P$C!X`6`O!`5
+M`0```W4808/``4&-0`.#^`9V%8/'`4&X`````.L*@\<!9F9FD&9FD$B#P0%(
+M@_D&=9I!.?H/C>\'``!%.=$/GL#'`P`````\_P^$U`<```^V^$AI_Y`4``!)
+M`[OX"```Z`````!(B<=(A<`/A+('```/MH`5`0``/`(/A<4!``#'`P0````/
+MMG4'2(L7#[='0+D`````@+P":`@``/\/A)D!``!`@/XC#X>``0``0`^VQO\D
+MQ0````!!QP0D15,#$;@!````9I#I;0$``$B-3"0LNA`#``"^`0```.@`````
+MA,`/A$4!``"+1"0LA<`/A$`!```E_P,``&G`$"<``(V($):O_[ISB*M,B<CW
+MXHG(*=#1Z`'"P>H'08D4)+@!````Z1(!``!(C4PD++H(`P``O@$```#H````
+M`(3`#X3J````BT0D+(7`#X3E````)?\#``!IP.@#``"-B,CE]_^ZRVLHKXG(
+M]^*)R"G0T>@!PL'J!$&)%"2X`0```.FW````2(U,)"RZ"`,``+X!````Z```
+M``"$P`^$CP```(M$)"R%P`^$B@```,'H$"7_`P``:<#H`P``C8C(Y??_NLMK
+M**^)R/?BB<@IT-'H`<+!Z@1!B10DN`$```#K7$B-3"0LN@P#``"^`0```.@`
+M````A,!T.(M$)"R%P'0W)?\#``!IP.@#``"-B,CE]_^ZRVLHKXG(]^*)R"G0
+MT>@!PL'J!$&)%"2X`0```.L,N`````#K!;@!````#[;(#[;!Z?`%```\`P^%
+MU@4``,<#!````$0/MDT'2,<$)`````!(QT0D"`````!(QT0D$`````!(QT0D
+M&`````!(BQ</MH+Y````A,`/A*$```!!N`````!)B>,/ML"#Z`%,C5`!O@``
+M``"X`0```(G'1(G!T^</MH06Z@@``#S_="@/ML!(C03`2,'@!4B)P4@#BF@)
+M``!(BX&(````2(M`(`^V0`HY^'002(/&`4B#_@0/A"8%``#KO$B%R0^$&P4`
+M``^W04"`O`)H"```_P^$"04``("Y%0$```,/A?P$``!+B0S#28/``4TYT`^%
+M<O___T&`^54/A]<$``!!#[;!_R3%`````$''!"1``P,1N`$```#IOP0``$B-
+M3"0L08U!`8/@`TB+/,2Z-`,``+X!````Z`````"$P`^$DP0```^W5"0LB50D
+M+('Z__\``'420<<$)/____^X`0```.EU!```N,#AY`")T;H`````]_%!B00D
+MN`$```#I600``$B-3"0L2(M\)`BZ$`,``+X!````Z`````"$P`^$,P0``(M$
+M)"PE_P,``&G`$"<``(V($):O_[ISB*M,B<CWXHG(*=#1Z`'"P>H'08D4)+@!
+M````Z0$$``!(C4PD+$B+?"0(N@@#``"^`0```.@`````A,`/A-L#``"+1"0L
+M)?\#``!IP.@#``"-B,CE]_^ZRVLHKXG(]^*)R"G0T>@!PL'J!$&)%"2X`0``
+M`.FI`P``2(U,)"Q(BWPD"+H(`P``O@$```#H`````(3`#X2#`P``#[=$)"XE
+M_P,``&G`Z`,``(V(R.7W_[K+:RBOB<CWXHG(*=#1Z`'"P>H$08D4)+@!````
+MZ5`#``!(C4PD+$B+?"0(N@P#``"^`0```.@`````A,`/A"H#``"+1"0L)?\#
+M``!IP.@#``"-B,CE]_^ZRVLHKXG(]^*)R"G0T>@!PL'J!$&)%"2X`0```.GX
+M`@``2(U,)"Q(BSPDNA0#``"^`0```.@`````A,`/A-,"``"+5"0L@>+_`P``
+M2&G2.K@!`$B!PN-*`P!(P>H%2+A#>+1QQ%I\"DCWXDC!Z@=!B10DN`$```#I
+MG0(``$B-3"0L2(M\)`BZ%`,``+X!````Z`````"$P`^$=P(``(M4)"R!XO\#
+M``!(:=(ZN`$`2('"XTH#`$C!Z@1(N(7P:..(M?@42/?B2,'J"$&)%"2X`0``
+M`.E!`@``2(U,)"Q(BWPD$+H4`P``O@$```#H`````(3`#X0;`@``BU0D+('B
+M_P,``$AITN830`)(@<(-_TX$2+B]0GKEU92_UDCWXDC!ZA=!B10DN`$```#I
+MZ0$``$B-3"0L2(M\)!BZ%`,``+X!````Z`````"$P`^$PP$``(M4)"R!XO\#
+M``!(:=*N1>$`2('"*5*O`4BXVS2VUX+>&T-(]^)(P>H208D4)+@!````Z9$!
+M``!(C4PD+$B+?"0(NK`#``"^`0```.@`````A,`/A&L!``"+1"0LP>@/@^`!
+M08D$)+@!````Z5@!``"`?0@`=!%(BT0D"(&@&`$``/_W___K#TB+1"0(@8@8
+M`0````@``$B+?"0(Z`````"X`0```.D>`0``@'T(`'012(M$)`B!H!@!``#_
+M[___ZP](BT0D"(&(&`$````0``!(BWPD".@`````N`$```#IY````(!]"`!T
+M$4B+1"0(@:`8`0``_]___^L/2(M$)`B!B!@!````(```2(M\)`CH`````+@!
+M````Z:H```"`?0@`=!%(BT0D"(&@&`$``/^____K#TB+1"0(@8@8`0```$``
+M`$B+?"0(Z`````"X`0```.MS@'T(`'012(M$)`B!H!@!``#___[_ZP](BT0D
+M"(&(&`$``````0!(BWPD".@`````N`$```#K/(!]"`!T$4B+1"0(@:`8`0``
+M___]_^L/2(M$)`B!B!@!``````(`2(M\)`CH`````+@!````ZP6X``````^V
+MP.L%N``````/ML#K$K@`````ZPO'`P````"X`````$B#Q#!;74%<PV9F9I!F
+M9I!F9I!!5T%6055!5%532(/L.$F)_(GP2(G328G-08GV0<'N&$&)]T'![Q`/
+MMM2(5"000(AT)`](C:N0%```N`````"0Q@08`$B#P`%(/2`K``!U\$R):R"+
+M!0````"(0T"#P`&)!0````!$B',[1(A[.@^V1"00B$,Y#[94)`^(4SC&0T$`
+M00^W!"1FB4,P00^W1"0"9HE#,D&+1"0$B4,T2(V3("D``$B)DX@4``!,B6T@
+M#[9#0(A%0$2(=3M$B'TZ#[9$)!"(13D/MD0D#XA%.,9%00%!#[<$)&:)13!!
+M#[=$)`)FB44R08M$)`2)131(B96(%```#[=#,F8])"</A!0!``!F/20G#X>$
+M````9CU$(0^$``$``&8]1"%W1&8]("$/A/````!F/2`A=P]F/5`'#X7T````
+MZ=L```!F/2(AD`^$T````&8]0"%F9I!F9I`/A=0```#INP```&9FD&:09CT0
+M)P^"P````&8]$2=FD`^&H````&8M("=F@_@"9I`/AZ0```#IBP```&9FD&:0
+M9CV`)P^$?````&8]@"=FD'<N9CU`)W1N9CU`)V9F9I!W"&8],"=U<NM<9CU$
+M)V:0=%1F/6`G=6+K3&9FD&9FD&8]@')T0&8]@')F9I!F9I!W"&8]@B=U0NLL
+M9CV`D6:0=`YF/8"4=3+K'&9FD&9FD&;'0SR`D<9#/@1FQT4\@)'&13X$ZQ1F
+MQT,\@)3&0SX$9L=%/("4QD4^!$$/MD0D"(A#0D$/MD0D"(A%0KD```0`N@``
+M``"^`@```$R)[^@`````2(D#N0`@``"Z`````+X`````3(GOZ`````!(B<%(
+MB4,02(L#2(7`#X3E`0``2(7)#X3<`0``2(V0``(!`$B)4PA(C8````(`2(D#
+M2`4`0```2(E%`$B)50A(B4T01(L%`````$6%P'YGO@````"Y`````$C'QP``
+M```/MP0Y9D$[!"1U/P^W@0````!F03M$)`)U,(N1`````(/"`8F1`````$2+
+MB0````!%A<ET%40YRG80B="Z`````$'W\8F1`````(/&`4B#P1A$.<9UJDB+
+M0PA(+>!]``#'``'P`P!(BT,(2"W8?0``QP`!``#H2(M[(+YX````Z`````")
+MPB4`<```/0`@``!V%(#FCX#.($B+>R"^>````.@`````1(AT)"-$B'PD(@^V
+M5"00B%0D(0^V1"0/B$0D(+T`````0;D`````2<?$`````$R-;"0@9D.#/"$`
+M#X2B````08"Y```````/A(0```!!N`````!(8\5,C13%`````$V)ZTN-!`)(
+MC32%`````+D$````_$R)W_.F#Y?"#Y+`.,)U.T$/MH$`````@\`!08B!````
+M`$$/MI$`````A-)T'3C0=AD/ML`/MLJZ`````&;W\4&(D0````!F9F:008U0
+M`4F#P`%!#[:!`````#G0?Y"#Q0%)@\$@@_T$#X52____QX,0"0```0```+@!
+M````ZP6X`````$B#Q#A;74%<05U!7D%?PV9F9I!F9I!!5%532(G[2(GU2(M_
+M>`^V`X/@`40/MN"X`````&9FD,8$*`!(@\`!2(/X,'7R2(NWB!0``$B)\K``
+M9F:09F:0Q@00`$B#P`%(/0`"``!U\$B-3C:Z`````&9F9I!F9I`/MD13(8@$
+M40^V1%,@B$11`4B#P@%(@_H4=>5(C4X4L@`/MD13#8@$40^V1%,,B$11`4B#
+MP@%(@_H*=>5(C4XNL@`/MD1328@$40^V1%-(B$11`4B#P@%(@_H$=>5(B74@
+M2(M#4$B#P`%(B44`2(-[8`!U0?8#`70\2(M#:$B%_P^5PDB%P'02A-)T#@^V
+M0%N`O`=H"```_W4;2(M#<(32="M(A<!T)@^W0$"`O`=H"```_W08#[:#S```
+M`,'@`@)#`HA%$$&\`````.L@Z`````!(A<!T$H"X%0$```)U"0^V0P&(11#K
+M!,9%$/\/MD,"B$41N`$```#V0UH0=`0/MD-<B$42QD46$,9%%1!$B>"-%`"^
+M_?___T`B=0X)UD"(=0[!X`4/MDT,@^'?"<&(30P/MT-82,'H!X/@`<'@!H/A
+MOPG!B$T,#[=#6$C!Z`*#X`$/ME4-@^+^"<*(50T/MT-:2,'H`\'@!X/A?PG!
+MB$T,#[=#6DC1Z(/@`0'`@^+]"<*(50T/MT-82,'H`X/@`<'@!H/BOPG"B%4-
+M#[=#6DC!Z`3!X`>#XG\)PHA5#8/)$(A-#`^V`]#H@^`!@^;^"<9`B'4.#[8#
+M@^`$@^;["<9`B'4.9L=%&``0#[:#SP```(A%$P^V@\P```"(12A;74%<PV9F
+M9I!F9F:09F9FD$%6055!5%5308GU08G62(G+3(G%2(7)=!>X`````&:0Q@08
+M`$B#P`%(/:P```!U\$B%[709N`````!F9I!F9I#&!"@`2(/``4B#^"AU\DR+
+MI_@(``!!#[;U3(GGZ`````")PF:%P'0.#[?`08"\!&@(``#_=4A-BZ0D^`@`
+M`$F!Q)`4``!)B[PD^`@``.@`````02G%00^V]4R)Y^@`````B<)FA<`/A$\#
+M```/M\!!@+P$:`@``/\/A#T#```/M\)!#[:$!&@(``!F@?J!``^'4@(``$F+
+MC"20"0``#[?`2&G`R`\``$B--`%(A=L/A-8```!(BU802(72='5!#[:$).@(
+M```\_W08#[;`2&G`R`\``$B-!`&_@````$@YPG0E00^VA"3I"```//]T'`^V
+MP$AIP,@/``!(C00!2#G"=0F_@0```$"(>P*`?EH`=#"Z``````^VP@^V3`9P
+MN`$```#3X`E#((/"`3A66G81Z^3&0P+_2(M&"`^V0`V)0R#&`P$/MD99B$,!
+M2(M&>$B)0P1(BX:(````2(E##$B+AI````!(B4,4BX:@````B4,<1(EK)`^V
+MAL````")0RBX`````.DV`@``2(7M#X0H`@``187V#X@?`@``#[:&P````$$Y
+MQ@^-#P(``$ECQDB-!$!(P>`$2`'P2(V0P`````^V2@B(30`/ME()B%4!2(N`
+MT`````^V`(/@#XA%`H#Y`W0N@/D#=PZ`^0(/A:D```#IJP```(#Y!&9FD&9F
+MD'1`@/D2#X60````9F:09I#K7TECQDB-!$!(P>`$2(N4!M`````/MD(!@^`'
+M#[;`P>`(#[92`@'0C02``<")103K8$ECQDB-!$!(P>`$2(N$!M`````/MD`"
+MA,!U"<=%!`````#K/`^VP(/H%(E%!.LQ26/&2(T$0$C!X`1(BY0&T`````^V
+M0@+!X`@/ME(#`="-!(`!P(E%!.L'QT4$`````$B-30A)8\9(C01`2,'@!$B-
+MA`;0````2(U0"$B+0`A(B44(2(M""$B)00A(BT(02(E!$$B+0AA(B4$8N```
+M``#IV0````^WP$B-!,!(P>`%2(G%20.L)&@)``#&0P+_Q@,"28N4)&@)```/
+MMD00.XA#`4B+A8@````/MD`-B4,@#[:%%0$``#P"=2O'0P1(4%0`QT,,4F]C
+M:\=#$&5T4W3'0Q1O<B``#[=U/DB->Q?HRL+__^M'/`-U(<9#`1#'0R`!````
+MQT,$2%!4`,=##$5*,S1FQT,0,`#K(L9#!'8/MW4\2(U[!>B2PO__QD,,9`^W
+M=3Y(C7L-Z('"___&0QQR#[9U.4B->QWH,,+__T2):R2X`````.L%N/____];
+M74%<05U!7L-F9F:09F:0055!5%5308GU2(G3N`````#&!!@`2(/``4@]*`T`
+M`'7P2(NO^`@``$$/MO5(B>_H`````(G"9H7`=`T/M\"`O`5H"```_W5%2(NM
+M^`@``$B!Q9`4``!(B[WX"```Z`````!!*<5!#[;U2(GOZ`````")PF:%P`^$
+MD0,```^WP("\!6@(``#_#X2``P``#[?"#[:$!6@(``!F@?J!``^'C0(``$B+
+MC9`)```/M\!(:<#(#P``3(T$`4F+4!!(A=)T=`^VA>@(```\_W08#[;`2&G`
+MR`\``$B-!`&^@````$@YPG0C#[:%Z0@``#S_=!P/ML!(:<#(#P``2(T$`4@Y
+MPG4)OH$```!`B',"08!X6@!T,KH`````#[;"00^V3`!PN`$```#3X`E#((/"
+M`4$X4%IV$>OBQD,"_TF+0`@/MD`-B4,@Q@,!00^V0%F(0P%)BT!X2(E#!$F+
+M@(@```!(B4,,28N`D````$B)0Q1!BX"@````B4,<1(EK)$&`N,``````#X2+
+M`@``0;D`````00^V^4ACQTB-#(!(C0S+2(T$0$C!X`1,`<!(C9#`````#[9R
+M"$"(L:@````/ME()B)&I````2(N`T`````^V`(/@#XB!J@```$"`_@-T-$"`
+M_@-W$4"`_@(/A=,```!FD.G>````0(#^!&9F9I!F9I!T2T"`_A(/A;4```!F
+M9F:0ZWU(8\](C01)2,'@!$F+E`#0````2(T,B0^V0@&#X`</ML#!X`@/ME("
+M`="-!(`!P(F$RZP```#IA@```$ACUTB-!%)(P>`$28N$`-`````/MD`"A,!U
+M$4B-!)+'A,.L`````````.M:2&/72(T4D@^VP(/H%(F$TZP```#K1$ACSTB-
+M!$E(P>`$28N4`-````!(C0R)#[9"`L'@"`^V4@,!T(T$@`'`B83+K````.L2
+M2&/'2(T$@,>$PZP`````````2&/'2(T4@$B-E-.@````2(UR$$B-!$!(P>`$
+M28V$`-````!(C4@(2(M`"$B)0A!(BT$(2(E&"$B+01!(B4802(M!&$B)1AA!
+M@\$!13B(P`````^&Z0```.E?_O__#[?`2(T$P$C!X`5)B<1,`Z5H"0``QD,"
+M_\8#`DB+E6@)```/MD00.XA#`4F+A"2(````#[9`#8E#($$/MH0D%0$``#P"
+M=2W'0P1(4%0`QT,,4F]C:\=#$&5T4W3'0Q1O<B``00^W="0^2(U[%^BNOO__
+MZTL\`W4AQD,!$,=#(`$```#'0P1(4%0`QT,,14HS-&;'0Q`P`.LFQD,$=D$/
+MMW0D/$B->P7H=+[__\9##&1!#[=T)#Y(C7L-Z&&^___&0QQR00^V="0Y2(U[
+M'>@.OO__1(EK)+@`````ZPRX_____^L%N`````!;74%<05W#05154T&)]$B)
+MT[@`````D,8$&`!(@\`!2#VD#```=?!(BZ_X"```00^V]$B)[^@`````B<)F
+MA<!T#0^WP("\!6@(``#_=4=(BZWX"```2('%D!0``$B+O?@(``#H`````$2)
+MYBG&0`^V]DB)[^@`````B<)FA<`/A&<#```/M\"`O`5H"```_P^$5@,```^W
+MP@^VA`5H"```9H'Z@0`/AV<"``!(BXV0"0``#[?`2&G`R`\``$R-!`%)BU`0
+M2(72='0/MH7H"```//]T&`^VP$AIP,@/``!(C00!OH````!(.<)T(P^VA>D(
+M```\_W0<#[;`2&G`R`\``$B-!`%(.<)U";Z!````0(AS`D&`>%H`=#*Z````
+M``^VPD$/MDP`<+@!````T^`)0R"#P@%!.%!:=A'KXL9#`O])BT`(#[9`#8E#
+M(,8#`4$/MD!9B$,!28M`>$B)0P1)BX"(````2(E##$F+@)````!(B4,408N`
+MH````(E#'$&`N,``````#X1E`@``0;D`````00^V^4ACQTB-#(!(C0S+2(T$
+M0$C!X`1,`<!(C9#`````#[9R"$"(<20/ME()B%$E2(N`T`````^V`(/@#XA!
+M)D"`_@-T,$"`_@-W#T"`_@(/A<````#IR@```$"`_@1F9I!FD'1%0(#^$@^%
+MI@```&9F9I#K<4ACSTB-!$E(P>`$28N4`-````!(C0R)#[9"`8/@!P^VP,'@
+M"`^V4@(!T(T$@`'`B43+*.MZ2&/72(T$4DC!X`1)BX0`T`````^V0`*$P'4.
+M2(T$DL=$PR@`````ZU%(8]=(C122#[;`@^@4B433*.L^2&//2(T$24C!X`1)
+MBY0`T````$B-#(D/MD("P>`(#[92`P'0C02``<")1,LHZP](8\=(C02`QT3#
+M*`````!(8\=(C12`2(U4TR!(C7(,2(T$0$C!X`1)C80`T````$B-2`A(BT`(
+M2(E"#$B+00A(B48(2(M!$$B)1A!(BT$82(E&&$&#P0%%.(C`````#X;E````
+MZ8'^__\/M\!(C03`2,'@!4F)Q$P#I6@)``#&0P+_Q@,"2(N5:`D```^V1!`[
+MB$,!28N$)(@````/MD`-B4,@00^VA"05`0``/`)U+<=#!$A05`#'0PQ2;V-K
+MQT,09713=,=#%&]R(`!!#[=T)#Y(C7L7Z+.Z___K2SP#=2'&0P$0QT,@`0``
+M`,=#!$A05`#'0PQ%2C,T9L=#$#``ZR;&0P1V00^W="0\2(U[!>AYNO__QD,,
+M9$$/MW0D/DB->PWH9KK__\9#'')!#[9T)#E(C7L=Z!.Z__^X`````.L,N/__
+M___K!;@`````6UU!7,-F9F:09F9FD&9FD$%455-!B?1(B=.X`````)#&!!@`
+M2(/``4@]``$``'7P2(NO^`@``$$/MO1(B>_H`````(G"9H7`=`T/M\"`O`5H
+M"```_W5'2(NM^`@``$B!Q9`4``!(B[WX"```Z`````!$B>8IQD`/MO9(B>_H
+M`````(G"9H7`#X39`0``#[?`@+P%:`@``/\/A,@!```/M\(/MH0%:`@``&:!
+M^H$`#X?9````2(N-D`D```^WP$AIP,@/``!(C30!2(M6$$B%TG1Q#[:%Z`@`
+M`#S_=!@/ML!(:<#(#P``2(T$`;^`````2#G"=",/MH7I"```//]T'`^VP$AI
+MP,@/``!(C00!2#G"=0F_@0```$"(>P*`?EH`=#"Z``````^VP@^V3`9PN`$`
+M``#3X`E#((/"`3A66G81Z^3&0P+_2(M&"`^V0`V)0R#&`P$/MD99B$,!2(M&
+M>$B)0P1(BX:(````2(E##$B+AI````!(B4,4BX:@````B4,<N`````#IW@``
+M``^WP$B-!,!(P>`%28G$3`.E:`D``,9#`O_&`P)(BY5H"0``#[9$$#N(0P%)
+MBX0DB`````^V0`V)0R!!#[:$)!4!```\`G4MQT,$2%!4`,=##%)O8VO'0Q!E
+M=%-TQT,4;W(@`$$/MW0D/DB->Q?H0;C__^M+/`-U(<9#`1#'0R`!````QT,$
+M2%!4`,=##$5*,S1FQT,0,`#K)L9#!'9!#[=T)#Q(C7L%Z`>X___&0PQD00^W
+M="0^2(U[#>CTM___QD,<<D$/MG0D.4B->QWHH;?__[@`````ZP6X_____UM=
+M05S#2(/L*$B)'"1(B6PD"$R)9"003(EL)!A,B70D($B)^TF)]$R+=WA(BT9(
+M2(DX2(M'8$B%P'4:QH:R`````DB)]_^6R````.EJ!@``9F:09I#V0$P"=!K&
+MAK(````"2(GW_Y;(````Z4H&``!F9I!FD$R)]^@`````2(G%2(7`9I!U'D'&
+MA"2R`````DR)YT'_E"3(````Z1H&``!F9I!FD,>`E`````````!,B6!H2(M#
+M8$B)12A(BT-@#[=`.&:)12#&122`00^VA"2P````/`(/A&D!```\`G<*A,!T
+M')#I0@,``#P##X3P`0``/`20#X4Q`P``Z;@!``!(BT-@]D!H`0^$GP```$$/
+MMH0DL0```*@"=`;&13B(ZQ"#X`0\`1G`@^`%@^AVB$4X28N4))````!!#[>,
+M))@```#&13D`2(G02,'H.(A%.DB)T$C!Z#"(13M(B=!(P>@HB$4\2(G02,'H
+M((A%/4B)T$C!Z!B(13Y(B=!(P>@0B$4_2(G02,'H"(A%0(A50<9%0@#&14,`
+MB<AFP>@(B$5$B$U%QD5&`,9%1P#K;4$/MH0DL0```*@"=`;&13@HZQ"#X`0\
+M`1G`@^`%@\`JB$4X28N4))````!!#[>,))@```#&13D`2(G02,'H&(A%.DB)
+MT$C!Z!"(13M(B=!(P>@(B$4\B%4]QD4^`(G(9L'H"(A%/XA-0,9%00!(BT-@
+M2`7L````2(E%4,9%,"`/M\'!X`F)132#C90````"Z?D!``!F9F:000^VA"20
+M````/!!W!?8#`G4.0<:$)+(````&Z20$``!(C7TX#[;028VT))@```#H````
+M`$B+0V!(!>P```!(B450QD4P((&-E```````$`#&126K0?:$)+$````&#X22
+M`0``08N$))0```")133I@@$``$$/MH0DL0```(/@,#P@=1'&13@;QD4Y`<9%
+M/`#I80$``,9%.#7I6`$``$B+0V`/MD!(J`%T)Z@$=".!C90``````"``00^W
+ME"2<````9D$[E"22````=1/K8V9FD$'&A"2R````!NEF`P``00^VA"2;````
+M/.-T13SC=Q,\0G0]/+!T'3Q`=2=F9I!FD.LN/.QT#CSO="8\Y69F9I!U$.L<
+M9D&)E"22````9F:0ZPY!QH0DL@````;I%`,``,9%.+!!#[>$))````"(13E!
+M#[>$))(```"(13I!#[>$))0```"(13M!#[>$))8```"(13Q!#[>$))@```"(
+M13U!#[:$))H```"(13Y!#[:$))L```"(13]!#[:$))$```"(14!!#[:$)),`
+M``"(14%!#[:$))4```"(14)!#[:$))<```"(14-!#[:$))D```"(141!]H0D
+ML0````9T)D$/MX0DG````,'@"8E%-(.-E`````3K#D'&A"2R````!NE/`@``
+M2,>%H`````````!!#[:$)+$```"H!@^$'P(``*@"=`F#C90````(ZP>#C90`
+M```03(UM6$F+G"2X````2(7;=`M!]H0DL0````%U-DF+A"3`````2(7`#X0*
+M`@``28NV2`H``+H`````3(GG_]"%P`^$\0$``$F+GD@*``!(A=MT.4B)[^@`
+M````O@````!,B>_H`````$B#PQ"+4_!(BW/X3(GOZ`````"+0_1(@\,0A<`/
+MA8D!``#KX+X`````3(GOZ`````"+130]``@``'<[3(GWZ`````!(B<%(A<!U
+M#D'&A"2R````"^E?`0``2(M`$$B)14A(B4UXBU4T2(MQ&$R)[^@`````ZU0]
+M```!`'<_3(GW9F9FD.@`````2(G!2(7`=0Y!QH0DL@````OI&0$``$B+0!!(
+MB45(2(E->(M5-$B+<1A,B>_H`````.L.0<:$)+(````&Z>X```!!#[:$)+$`
+M``"H!`^$T````$&`O"2P`````W4>28NT)*````!(A?9T$4B+?4B+533H````
+M`.FG````28N4)+@```!(A=)U$TF+A"3`````2(7`#X6X````ZV%,BVU(J`%U
+M"DB)TV9FD&:0ZRE)BX0DP````$B%P'0<28NV2`H``+H!````3(GG_]"%P'0'
+M28N>2`H``$B#PQ"+4_!(BW/X3(GOZ`````"+0_!)`<6+0_1(@\,0A<!U*.O>
+MBT4T2(M-2(7`=!N)PDB)R,8``$B#P`%(@^H!=`GK\8.-E`````%(B>Y,B??H
+M`````.LQ2(GN3(GWZ`````!,B>=!_Y0DR````.L9NP````#I2O[__TR+;4AF
+M9I!F9I#I6O___TB+'"1(BVPD"$R+9"003(ML)!A,BW0D($B#Q"C#9F9FD&9F
+M9I!F9I!F9I!54TB#[`A(B?U(B?.X`````,8$&`!(@\`!2#V`````=?"#O1`)
+M```!#Y1#$P^V53H/MDTY#[9U.`^V13N(0P.(4P*(2P%`B#.`2Q$0#[=%,&:)
+M0P0/MT4R9HE#!HN%$`D``(A#<,9#$B`/MU4R9H'Z("%T!V:!^B(A=4C&0Q<"
+M2(U#/,=#/%)O8VO'0T!E=%)!QT`(240@4\=`#%-$(#+'0!`Q,G@@QT`40V]N
+M=,=`&')O;&QFQT`<97+&0!X`Z0D!``"-@O#8__]F@_@!=A)F@?I`(70+9H'Z
+M1"$/A:L```#&0Q<$#[=5,HV"\-C__V:#^`%W1$B-0SS'0SQ2;V-KQT-`9712
+M0<=`"$E$(#+'0`PW,7@@QT`04T%3(,=`%$-O;G3'0!AR;VQL9L=`'&5RQD`>
+M`.F3````9H'Z0"%T"V:!^D0A#X6!````2(U#/,=#/%)O8VO'0T!E=%)!QT`(
+M240@4\=`#%-$(#+'0!`Q-'@@QT`40V]N=,=`&')O;&QFQT`<97+&0!X`ZT#&
+M0Q<(2(U#/,=#/$1A=&''0T!#96YTQT`(97(@-\=`##(X,"#'0!!3051!QT`4
+M($-O;L=`&'1R;VS'0!QL97(`#[9#$O9C%X3`NH#___\/1,*(0Q!(C4,8QT,8
+M2&EG:,=#'%!O:6['0`AT(%1EQT`,8VAN;\=`$&QO9VG'0!1E<RP@QT`826YC
+M+L9`'`!(BX4("0``2(7`=`I(BT`02(E#:.L(2(M%$$B)0VC'0V``(```2(M]
+M(+Y\````Z`````")PH'B\`,``,'J!(A3<8/@#XA#<TB+?2"^@````.@`````
+MB<*!X@``\`/!ZA2(4W(E```/`,'H$(A#=$B#Q`A;7<-FD$%7059!54%455-(
+M@^P(28G]B?5(B=.X`````&9FD&:0Q@08`$B#P`%(/=````!U\(EK"(/]/WX*
+M28'%D!0``(/M0$ACQ;H`````28.\Q6@$````#X72`@``2&/%28F<Q6@$``!,
+MB6MX2(F+@````$R)@Y````!!@'U-`0^%I0(``(']A0````^/@P(``$$/MH0%
+M:`@``#S_#X1R`@``#[;`9HE$)`8/M\!(C11`2(T4D$C!X@5)B=1-`Z5`"0``
+M0?9$)$L$#X1%`@``08M$)$@E`/__`#T``/\`#X4P`@``0?9$)$P$#X2<`0``
+M0<:$).@`````00^V1"1(2(G"@^(&2(/Z!G4YJ`$/A!`!``!!QD0D2@5!QD0D
+M2P1!#[:4)($```!)BW0D6$F+?"103(GAZ`````"Z`0```.GK`0``2(/Z!`^%
+MW`$``*@!9F9FD`^$T`$``$F+7"1028M$)&!(A<`/A84```!!QD0D2@-!QD0D
+M2P2`>PX`=$^]`````$R-<V!,B??H`````$B)PDB+0VA(B5-H3(DR2(E""$B)
+M$(!Z2O]T&$DYU'030<:$).D````!N@$```#I;`$``(/%`0^V0PXYZ'^Z08"\
+M).D````!#X1-`0``3(GF3(GOZ`````"Z`0```.D]`0``@'A"``^%+@$``&:#
+M8$[]28M$)&!FQT!.(`!)BW0D8$R)[^@`````N@$```#I#`$``$F+1"10#[9`
+M#4&`?3X`="V[``````^VZ`^VRTB)Z$C3^*@!=`^Z`````(G.3(GOZ`````"#
+MPP%!.%T^=]M!QD0D2P9!QD0D2@5F0<>$),@``````$R)YDR)[^@`````N@$`
+M``#IHP```$V+9"1008!\)`X`=%U!O@````!-C7PD8$R)_^@`````2(G"28M$
+M)&A)B50D:$R).DB)0@A(B1"`>DK_="(/MD))/")T!#P-=19(8\5)QX3%:`0`
+M``````"Z`````.M$08/&`44X="0.=ZX/MU0D!DB)WDR)[^@`````N@$```#K
+M(F9F9I!F9I!(8\5)QX3%:`0```````"Z`````.L%N@$```")T$B#Q`A;74%<
+M05U!7D%?PY"0D)!(BP4`````2(E'"$B)/0````##9F9FD&9FD&9FD&9FD(L%
+M``````6H`@0`PV9F9I!(A?]T&TB+%TB%TG0,2(7V=`=(BT((2(D&2(G0PV9F
+MD$B+%0````#KWV9F9I!F9I"+1A1(C80'J`($`,-F9F:04TB)\TB![``!``!(
+MBT<(2(M_$$B-M"2`````_U`X2(M#"$B)YDB+>Q#_4#@/MD0D`3B$)($```!V
+M#K@!````2('$``$``%O#<B8/MD0D`CB$)((```!WXG(6#[9$)`,XA"2#````
+M=])R!C'`Z]%FD+C_____Z\AF9I!F9I!F9I!!5%5(B?U32(L=`````$B%VW4*
+MZWM(BQM(A=MT<TB+0Q!(A<!T<4B+50A(.U`(=>5(BW`02(M]$/]22(3`=-9(
+MBW,03(UC$$B%]G4=ZV-FD$B)[^@`````A<!X54V+)"1)BS0D2(7V=$A(BT4(
+M2(N0``$``$B%TG372#M&"'712(MV$$B+?1#_TNO-9F:09I`QP%M=05S#2,=%
+M``````!(B5T8N`$```!(B6L06UU!7,-)BP0D2(E=&$B)10"X`0```$F)+"3K
+MRF9F9I!F9F:02(L%`````$B)!XM'$$B)/0````"%P'02BP4`````B4<4`T<0
+MB04`````\\-F9F:00515B?U32(L=`````$B%VW0Q0#A["$0/MN=U"NLE9I!`
+M.&L(=!U(BT-H2(7`9F:0=`E$B>?_T(7`=0A(BQM(A=MUW4B)V%M=05S#9F:0
+M9I!32(GS2(/L,(`]``````)T/TB+=QA(C5<8,<E(.?)T(CF.H/S__TB)\'4-
+MZQYF9I`YB*#\__]T$TB+`$@YT&:0=>Z)2S!(@\0P6\.#P0'KRTB+1G!(B[N(
+M````2(GF_U!X2(N3@`````^V1"00`T)`B4,P2(/$,%O#9F9FD&9FD$B+%0``
+M``"XT````$B%TG08,<F+0AQ(BQ(YP0]"R$B%TG7PC8'0````\\-F9I!FD$B+
+M5QA(C4\82#G*="HYLJ#\__](C8)P_/__=1/K'6:0.;*@_/__2(V"</S__W0*
+M2(L22#G*=>DQP//#\\-F9I!32(M?$$B%VW0<9F:09F:02(M#"$B+>Q#_D-@`
+M``!(BQM(A=MUZEO#9F9FD&9F9I!(B?Y(BS_IU?[__V9FD&:0BU<PA=)X!\='
+M,/_____SPS'`A?9T'3'),=)F9I!F9I`/M@>#P@%(@\<!`<$Y\G7P#[;!\\-F
+M9F:09F9FD&9FD$B+!0````!(A<!T+DB+4!!(A=)T'4@Y>A!U#69FD&:0ZQI(
+M.7H0=!)(BQ)(A=)FD'7P2(L`2(7`==+SP_/#9I!(BT\82(/'&$@Y^71#3&/*
+MZPA(BPE(.<]T-H"Y@/S__P1(C8%P_/__=N@YL:C\__]UX(72>!U,BX&(_/__
+M387`=-!+.43(8'7)\\-F9I!FD#'`PTB#N8C\__\`=;7SPY!!5$F)_%5)C6PD
+M&%/H`````$F+7"082#GK="UF9I!FD(MS^$B-NW#\__^%]G022(N#>/S__TB+
+M0%A(A<!T`O_02(L;2#GK==A,B>=F9I!FD.@`````28M$)!A(.>AU"Y#K&DB+
+M`$@YZ'02BTCTA<F0=/!;74%<N`$```##6UU!7#'`PV9F9I!F9I!F9I!F9I!!
+M5#'`28G\55.`OY`"!```=2U(BU\02(7;="(Q[69FD$B+0PA(BWL0_Y"H````
+M2(L;"<5(A=MUZ$"$[74',<!;74%<PTR)Y^@`````6T`/ML5=05S#9F9FD&9F
+M9I!F9I!!5D%505152(G]4^@`````2(N=,`$``$F)QDB%VP^$G````$&)Q4B+
+M0PA(B=I,C:4P`0``1"GPA<!^$.F/````2(M""$0IZ(7`?SI(BT(H2(7`=`1,
+MB6`@2(F%,`$``$C'0B``````2(G#2,="*`````!(BWH8_U(02(N5,`$``$B%
+MTG6[2(GOZ`````!(A=MT#$B+A3`!``!(.=AT"5M=05Q!74%>PUM(BW`(2(M]
+M"%U!7$%=1"GV05[I`````%M(B>]=05Q!74%>Z0````!(B>_H`````.NY9F9F
+MD&9FD%5(B?U32(GS2(/L".@`````2(M3($B)P4B%TG0<2(M#*$B%P'0(2(E0
+M($B+4R!(B0)(QT,@`````(L#2(N5,`$``$B%TDB-!`%(C8TP`0``2(E#"'0E
+MB<9(BT((*?"%P'X,ZS)(BT((*?"%P'\H2(U**$B+4BA(A=)UZ4B)4RA(B1E(
+M.9TP`0``2(E+('0C2(/$"%M=PTB)4RA(B1E(C4,H2#F=,`$``$B)2R!(B4(@
+M==U(BWT(BS-(@\0(6UWI`````&9F9I!F9I!F9I!F9I!32(M6($B)^TB%TG1C
+M2(M&*$B+CS`!``!(A<!T"$B)4"!(BU8@2(D"2,=&*`````!(BX,P`0``2,=&
+M(`````!(A<!T+$@YP70GZ`````!(BY,P`0``2(MR""G&A?9^$TB+>PA;Z0``
+M``!F9F:09F:06\-(Q\<`````,<#H`````+[H`P``Z]AF9I!F9I!F9I!52(G]
+M4TB#[`A(BU\02(7;=1CK+DB+0PA(BWL0_Y#0````2(L;2(7;=!B`>V@`=.1(
+MBT,(2(M[$#'V_U!09F:0Z])(@\0(2(VU.`$``$B)[UM=Z0````!F9I!F9I!F
+M9I!!5$F)_%532(M?$$B%VW4*ZS1(BQM(A=MT+$B+0PA(BWL0_Y#@````@'MH
+M`'3D2(M#"$B+>Q"^`0```/]04$B+&TB%VW7428M<)!A)C6PD&$@YZW4*ZS)(
+MBQM(.>MT*H"[@/S__P%(C;MP_/__=>A(BX-X_/__2(M`6$B%P'38_]!(BQM(
+M.>MUUH`]``````!U!5M=05S#28V<)#@!``!,B>=(B=[H`````$''A"0X`0``
+M`(>3`TG'A"1(`0```````$B)WDV)I"10`0``3(GG6UU!7.D`````9F9FD&9F
+MD$%528G]05152(GU4TB#[`A(A?9T?4B+10A(BWT0_Y#@````@'UH``^%MP``
+M`$F+71A-C6483#GC=0[K/V9F9I!(BQM,.>-T,X"[@/S__P%(C;MP_/__=>A(
+M.:OP_/__==](BX-X_/__2(M`6$B%P'3/_]!(BQM,.>-US4B+;0!(A>UT&TB#
+MQ`A(B>A;74%<05W#2(MO$$B%[0^%=O___X`]``````!TW$F-G3@!``!,B>](
+MB=[H`````$''A3@!````AY,#2<>%2`$```````!(B=Y-B:U0`0``3(GOZ```
+M``#KH$B+10A(BWT0O@$```#_4%#I-/___V9F9I!F9I!32(G[Z`````!(B<''
+M0!``````2(V`T````$B-45!(B4%(BT,,+=````")04!(C4$82(E!&$B)02`Q
+MP&9FD&:0Q@00`$B#P`%(/8````!U\%M(B<C#9F9FD&9F9I!F9I!(@^P82(D<
+M)$B);"0(B=5,B60D$#'2.6X(28G\2(GS<B!(B??H`````(EH$$B)PDR)($B)
+M6`B+0PB#P`$IZ(E#"$B+'"1(BVPD"$B)T$R+9"002(/$&,-F9I!F9I!F9I")
+M\$B-M[````")PND`````BT80`T<(@^@!B4<(Z0````!F9F:09F9FD&9F9I!F
+M9I!(B?A(BS](B<9(@<>P````Z0````!F9F:09F9FD&9FD$%6055)B?U!5$R-
+M9QA54TB+7QA,.>-U$.M:9F:09F:02(L;3#GC=$R`NX#\__\!2(V[</S__W7H
+M#[:#V/S__ZA`#X6Z`0``@#T``````'30J`)US*@!#X7G`0``]H/8_/__!'6[
+M@(O8_/__)$B+&TPYXW6T28M=*$F-;2A(.>MT$4B->^CH`````$B+&T@YZW7O
+M28MM&$PYY0^$T````)"`O8#\__\$2(V]</S__W8.2(.]B/S__P`/A'(!``!(
+MBVT`3#GE==E)BUT83#GC#X2;````13'VZP]F9F:09F:02(L;2#GK=%F`NX#\
+M__\!2(V[</S__W7H]H/8_/__('3?2(N#J/S__X"CV/S__]M(A<!U&.GR````
+M9F9FD&9FD$B+`$B%P`^$WP```$B#>!@`=.U(BQM!O@$```!(.>MUITF+71A)
+M.=QT)69FD&9FD/9#\`%(C:MP_/__=`I(@[N(_/__`'0J2(L;3#GC=>%)BX68
+M`@0`2(7`#X2[````6UU!7$F+?0A)B<-!74%>0?_C#[:3@/S__X#Z!'822(N#
+M\/[__TB%P'042#EH"'0.@.H!=;/V@]C\__\"=*J+?3"%_P^(A0```/:%@`,`
+M``)TEC'V3(GOZ`````!(A<!(B<)TA$@YQ0^$>_____:`@`,```)T:("E@`,`
+M`/WI9O___^@`````Z17^__]%A/9FD`^%RO[__X`]``````%F9I`/A;K^___H
+M`````.FP_O__Z`````#IA/[__UM=05Q!74%>P^@`````Z0_^__](B>Y,B>_H
+M&/7__^EK____BT4PB4(PQT4P`````.GX_O__D$%7059!54%455-(B?M(@>R(
+M````2(7_3(MG&`^$S````$4Q]DB+0PA(BWL02(GF_U`X#[9$)!`[!0`````/
+MCI0```!,C7L@ZR=F9F:09F:01#EK*$&#U@"+%0`````/MD0D$(/"`3G0B14`
+M````?F?V1"01`740#[8%`````$0Y\`^$B0```$2+:RA!@X0DH`($``%,B?_H
+M`````$B)Q4B+0PB+-0````!(BWL028G82,?!`````$B)ZO]0:(3`=8](B>Y,
+MB?_H`````$&#K"2@`@0``>N!2(L;QP4``````````$B%VP^%-____T&+A"2@
+M`@0`@^@!A<!!B80DH`($`'5`3(GGZ(3\___K-F:0#[8%`````$C'Q@````!,
+MB>=(QP4``````````$B)'0````!IP$!"#P")!0````#H`````$B!Q(@```!;
+M74%<05U!7D%?PV9F9I!F9I!F9I!!54F)U4%428GT54B)_5-(@^P(2(M?$$B)
+ME9@"!`!(A=MU"NLL2(L;2(7;="1(BT,(2(M[$/^0\````(3`=>;&A9`"!``!
+M2(/$"%M=05Q!7<-(BQT`````2(7;=!EF9I!(BT,X2(7`=`5(B>__T$B+&TB%
+MVW7J387D=!A)BT0D"$F+?"00O@$```#_4%!!QD0D:`%(BWT0QX6@`@0``0``
+M`.@`````1(N-H`($`$6%R724387M=!E(@\0(2(GO6UU!7$%=Z0````!F9F:0
+M9F:0OZ"&`0#H`````$B)[^@`````1(N%H`($`$6%P'7BZ5/___]F9F:09F:0
+M9F:09F:02(/L&$B);"0(3(ED)!!(B?U(B1PD2(M?&$F)](.KH`($``&%TGA)
+MZ`````!(A<!T2D2+DZ`"!`!%A=)T$TB+'"1(BVPD"$R+9"002(/$&,-(B=](
+MBVPD"$B+'"1,BV0D$$B#Q!CIQOK__V9FD&9FD$B-?R#H`````.NV2(M%"$R)
+MY_^0@````$B-?2!,B>;H`````.N;9F9FD&9FD&9FD$%505152(G]4TB#[`A,
+MBR])BUTX38UE..L39F:09F:02(U[Z$B+&T@Y;U!T0DDYW'7N2(M%"$B+0%!(
+MA<!T!4B)[__02(N%D`,``$B+E9@#``!(B>Y)C7UP2(E0"$B)`DB#Q`A;74%<
+M05WI`````$B+5QA(BT<@2(U/&$B)0@A(B1!(B4\@2(E/&,:'L@````+H````
+M`.N59F9FD&9F9I!!5TF)UT%628G.055!B?5!5%5(B?U32(/L"$B+1QA(BU`8
+M2(/`&$@YPG41Z<8```!(BQ)(.<(/A+H```"`NH#\__\!2(V:</S__W7D1#NJ
+MZ/S__W7;2#NJ\/S__W722(7;#X2/````]D+P`0^%V0```$2+HF#]__]%A>0/
+MA<D```!$BYI`_?__187;#X6Y````2(M#.$B%P'4.ZU)F9F:02(L`2(7`=$9(
+MBW@82(7_D'3N2(MW&$B%]@^$CP```(!^1``/A(4````QR>L/#[9&1(U1`4B#
+MP0$YT'YR2#E\SF!UZDC'1,Y@`````.O?2(G?Z`````!,C64@3(GGZ`````!(
+MA<!(B<-T0$B+10A(B=I(BWT038GP3(GY1(GN_U!HA,"Z`0```'012(/$"(G0
+M6UU!7$%=05Y!7\-(B=Y,B>?H`````#'2Z^`QTNO<9I#H`````.DW____9F:0
+M9F:0059!54F)]4%428G\55-(@\2`2(7V#X2C`0``28ML)!!(A>UT8$&+A"2D
+M`@0`2(M]$$B)YHE%0$B+10C_4#@/MEPD$$B+10A!`9PDI`($`$B+?1#_4&!(
+MC7T@B<*)V4R)[N@`````#[9,)!!(C7U(NB@```!,B>[H`````$B+;0!(A>UU
+MH$B+#0````"Z^`,``$B%R70@9C'29F9FD&9FD(M!&$B+"3G"#T+02(7)=?"!
+MPO@#``!!BXPDI`($`$F-?"1P3(GNC0S)Z`````!!BXPDI`($`$F-O"20````
+MN@`"``!,B>[H`````$F-O"3P````N0$```"Z2````$R)[N@`````08N,)*0"
+M!`!)C;PD$`$``+HH````3(GNZ`````!!BXPDI`($`$F-O"30````NK````!,
+MB>Z-#,GH`````$''A"1H`0```0```$''A"1T`0```!```$''A"1L`0```!``
+M`.@`````28V\)+````"Y0B$``(G"3(GNZ`````!(BQT`````2(7;="-FD$B+
+M0R!(A<!T$$&+E"2D`@0`3(GN3(GG_]!(BQM(A=MUWTB#[(!;74%<05U!7L-,
+MBV\(Z53^__]F9I!F9I!F9I!!5$F)]%5(BRT`````4TB)^^@`````A<!T$XG`
+M2(G:D,8"`$B#P@%(@^@!=?-(@ST``````'4,ZW%F9F:09F:02(G%2(M%`$B%
+MP'7T2(E=`$B-0QA,B6,(QX-8`@0``!```$B)0QA(B4,@2(U#*$B)0RA(B4,P
+M2(U#.$B)0SA(B4-`2(V#$`(``$B)@Q`"``!(B8,8`@``2(V#4`(``$B)@U`"
+M!`!;74%<PTB)'0````#KG69F9I!F9I!F9I!F9I!(@^PH@#T``````DB);"0(
+M3(ED)!")]4B)'"1,B6PD&$F)_$R)="0@#X07`0``0`^V_>@`````2(7`28G%
+M#X0,`0``38UT)'!,B??H`````$B)PS'`Q@08`$B#P`%(/?@#``!U\(L%````
+M`$R):PA,B2.#P`&)!0````")@^@#``!(C8/(`P``@(N``P```4"(:Q!(B8/(
+M`P``2(F#T`,``$&+11B%P'0I2(V#^`,``$B)0R!!BT48A<!T%HG"2(G8QH#X
+M`P```$B#P`%(@^H!=>](C8.@`P``QT,T`@$``,=#,/____](B8.@`P``2(F#
+MJ`,``$B-@[`#``!(B8.P`P``2(F#N`,``$F+14A(A<!T"4B)W__0A<!U54F+
+M3"0@2(V3D`,``$F-1"0828E4)"!(B8.0`P``2(F+F`,``$B)$>L,0(#^`0^$
+MW_[__S';2(G82(ML)`A(BQPD3(MD)!!,BVPD&$R+="0@2(/$*,-(B=Y,B?<Q
+MV^@`````Z]%!5$B+%0````!52(G]2#GZ4W4(Z=,```!(B<)(A=)T#TB+`D@Y
+MZ'7P2(M%`$B)`DB+11A(C5T82#G8=!EF9F:02(VX</S__^@`````2(M%&$@Y
+MV'7K2(M%*$R-92A,.>!T,DB-G=````!F9F:09F:02(UPZ$B)WTB+1B!(BU88
+M2(E""$B)$.@`````2(M%*$PYX'7<@+V0`@0``'4I2(L=`````$B%VW0=9F9F
+MD&9FD$B+0T!(A<!T!4B)[__02(L;2(7;=>I(BUT02(7;=!>02(M#"$B+>Q#_
+MD.@```!(BQM(A=MUZEM=05S#2(L'2(D%`````.DU____D)"0D)"02(M7(#'`
+MQ@00`$B#P`%(@_A0=?)(C4(02(D22(E2"$C'0B@`````2(EZ,$B)0A!(B4(8
+M,<!(QT(X`````,-FD$B+1TB+%0````!(@^@H2`'0PV9F9I!F9F:09F:09F:0
+M2(M'(#'22(L(2#G!=!E(BQ%(BT$(2(E""$B)$$B+41A(B0E(B4D(2(G0PV9F
+MD&:0@+ZP`````$B+5R!U$@^WAI@```!(`X:0````2(E'6(-"(`%(BT=P2(N_
+MB````$R+F)@```!!_^-F9F:09F9FD/:'@`,```A(B?I(BT<@=`+SP\=`1```
+M``!(BT=P2,?&`````("/@`,```A(B[^(````3(N8B````$'_XV9F9I#VAX`#
+M```!N/____]T(46$P'0:#[?"P>`)A<!T$$B8D,8!`$B#P0%(@^@!=?,QP//#
+M9F9FD&9F9I!F9F:09F:0]D=H0$C'1T@`````=4E(BU<X2(72=$HQ]C')ZPYF
+M9I!(BQ*#P0%(A=)T(DB#>A@`=>Y(BT(02`%'2$B+0A!(BQ)(.?!(#T?P2(72
+M==Z#^0-_!4B)=T##2,='0`````"0PS'VZ^UF9F:09F9FD&9FD$AC]D@!_D@Y
+M]W,<2(GQ9I`/ME'^#[9!_XA1_XA!_DB#Z0)(.<]RZ4@Y]W0H#[8'/"!U(TB)
+M^NL'#[8"/"!U&DB#P@%(.?)U\,8'`$B#QP%(.?=U]//#2(GZA,!T(69FD$B#
+MP@$\('0J#[9"_X@'2(/'`4@YUG0'#[8"A,!UXD@Y_G31Q@<`2(/'`4@Y]W6Y
+MD.O"2#GR=.</M@*$P&9F9I!TMSP@=+,/MD+_B`=(@\<!Z\5F9F:09F9FD&9F
+MD&9FD$B+1R#'0$0!````PV9F9I!52(G]4TB#[`CV1V@"=3)(BU\X2(7;=!A(
+MBWL82(7_=`=(BT<(_U`P2(L;2(7;=>C'A?``````````2(/$"%M=P^@`````
+MZ^AF9F:09F9FD%/V1VH"2(G[2(M'('0&]D!(`G0,@T!$`5O#9F:09F:0.7!$
+M<N](BS^^`0```.@`````2(7`2(G"=-X/MH"Q````2(E:4$B)UTB)6EC&@K``
+M```$QH*R`````$C'@L@`````````@^#/@\@@B(*Q````6^D`````9F:09F:0
+M9F:04TB)^TB+/[X!````Z`````!(A<!(B<)T8/9#:@)U8<:`L`````-(QX"@
+M`````````,:`FP```$!FQX"4``````!FQX"6``````!FQX"8``````#&@)H`
+M``!`9L>`D```````9L>`D@````$`9L>`G```````2(E:4%M(B=##9I#&@+``
+M```"BP4`````B8*8````#[<%`````,:"D`````;'@I0`````````QH*1````
+M`&:)@IP```#KNF9FD&:02(/L&$B)7"0(2(EL)!!(B?M(BV\@Z";___](B<*X
+M_____TB%TG0E2,>"R`````````"`34@!2(G62(M#<$B+NX@```#_D)@````Q
+MP$B+7"0(2(ML)!!(@\08PV9FD&:0051)B?154X!_$`1(B?MV58!_1`!T2C'M
+MZQ5F9I!F9I`/MD-$C54!2(/%`3G0?C%(BWSK8$B%_W3G]H>``P```73>3(GF
+MZ``````/MD-$C54!2(/%`3G0?]9F9F:09F:06UU!7,-T./:#@`,```%FD'3N
+M2(G?Z&;^__](A<!TX4&#!"0!3(E@6$B)QTC'@,@`````````6UU!7.D`````
+M2(M?./:#@`,```%TM.O$9I#I`````&9F9I!F9F:09F:02(/L&$B)7"0(2(EL
+M)!!(BU]82(LOZ`````"+`X/H`87`B0-T#TB+7"0(2(ML)!!(@\08PTB-<PA(
+MB>](BUPD"$B+;"002(/$&.D`````9I!54TB#[`A(BRT`````QP4`````````
+M`$B%[74-ZS!FD$B+;0A(A>UT)8L=`````/^5D````#G#<^?_E9````!(BVT(
+MB04`````2(7M==M(Q\<`````@P4`````*.@`````2(/$"#'`6UW#9F:09F:0
+M2(/L&$B)7"0(2(EL)!!(BV]02(M=(`^V4TB)T(/@_HA#2("_L@````%T1>@`
+M````BT-`A<!T#TB+7"0(2(ML)!!(@\08PTB+?0!(C7,HQT-``0```$B+7"0(
+M2(ML)!!(@\082(/'6.D`````9F9FD(/B_(A32.NS9F9FD&9F9I!(BT<@@*>`
+M`P``]\>'T`````````"+4$"%TG0$\\-FD$B+/TB-<"C'0$`!````2(/'6.D`
+M````9F:09F:09F:04TB+7R!(B?A(B<9(BSM(@<<0`0``Z`````!(BSM(QX/8
+M`````````$B-L]@```!(B9O@````2,>#Z`````````!;2(/'2.D`````9F:0
+M9I!52(G]4TB)\TC'Q@````!(@^P(2(L_Z`````!(B<%(BT4X2(7`=!M(.=A(
+MC54X=0?K%T@YV'022(G"2(L`2(7`=?!(@\0(6UW#2(L#2(G>2(G/2(D"2(/$
+M"%M=Z0````!(@^PX2(E<)`A(B6PD$#'M3(ET)"A,B7PD,$F)_DR)9"083(EL
+M)"!(B?-(BT\X28G72(7)="!(B<TQP&9FD&:02(-]&`%(BVT`@]C_2(7M=>^#
+M^`-^)DB)Z$B+7"0(2(ML)!!,BV0D&$R+;"0@3(MT)"A,BWPD,$B#Q#C#28T\
+M'TF)S.L823E<)`@/A+(```!-BR0D387D#X2=````28-\)!@`=>!)BU0D"$@Y
+MVG?A28MT)!!)B?U(C0062#G'=]!(.=H/A)$!``!SQ4F+/DC'Q@````#H````
+M`$B)Q^@`````2(7`2(G"#X1H____,<#&!!``2(/``4B#^"!U\DF+1"0(2(E"
+M"$B)V$DK1"0(28E<)`A(B4(028L$)$B)`DF+1"002"M"$$F)%"1).<=)B40D
+M$`^";@$``$R)Y>D4____28L$)$B%P'0XN@$```#K"$B+`$B%P'0@2(-X&`"0
+M=/!(.5@(=>I)BW0D$$@Y<!!,#T?@@\(!Z]B#Z@$/C]/^__])BU0D$$F)S4DY
+MUW<2Z9````!-BVT`387M#X2T_O__28-]&`!U[$B)T$D#1"0(23E%"'7>20-5
+M$$DYUP^'DO[__TF+/DC'Q@````#H`````$B)Q^@`````2(G",<#&!!``2(/`
+M`4B#^"!U\DR)^$D#1"0(28E%"$F+11!)`T0D$$PI^$F)11!)BP0D2(G52(E:
+M"$R)>A!(B0))B10DZ3'^__])BSY(Q\8`````Z`````!(B<?H`````$B%P$B)
+MP@^$#O[__S'`Q@00`$B#P`%(@_@@=?+KL$DY]P^$U_[__TF+/DC'Q@````#H
+M`````$B)Q^@`````2(7`2(G"#X30_?__,<#&!!``2(/``4B#^"!U\DF+1"00
+M3(EJ"$PI^$B)0A#K1TF+/DC'Q@````#H`````$B)Q^@`````2(G",<!(A=)T
+M/L8$$`!(@\`!2(/X('7R3(GX20-$)`A(B4((28M$)!!,*?A(B4(028L$)$R)
+MY4V)?"002(D"28D4).E/_?__28L<)$F+/DC'Q@````!(BT,(28E$)`A(BP-)
+MB00DZ`````!(B=Y(B<?H`````.D<_?__9F:09F:0051(Q\8`````54B)_5-(
+MBS_H`````/9%:`A)B<1U'$B+=3A(A?9T$TB+'DR)Y^@`````2(7;2(G>=>U(
+MBT5P2(N]B````/^0@````%M(B[V`````2(NUB````%U!7$B#QR#I`````&9F
+MD&9FD&9FD%532(G[2(/L"$B+5SB`IX`#``#^2(72=!]F9F:09F:02(M"&$B%
+MP'0'@*"``P``_DB+$DB%TG7H2(G>OP$```#H`````$B+.\>#\`````$```!(
+M@<<0`0``Z`````!(A<!(B<5T9L<``0```$C'0`@`````2(E%$$C'0!@`````
+M2(E8($B+6SA(A=MT,F9FD$B+0QA(A<!U"NL<9F:09I!(B?A(BW@82(7_=?1(
+MB>Y(B<?H`````$B+&TB%VW71BT4`@^@!A<")10!T!TB#Q`A;7<-(@\0(2(GO
+M6UWIO_K__V9F9I!F9F:09F9FD&9FD$B#[!A(B5PD"$R)9"00B=-)B?1(Q\8`
+M````Z`````"-#-M,B>9(BUPD"$R+9"002(G'NB````!(@\08Z0````!(@^Q8
+M@_\'2(EL)#A,B60D0$B)]4R);"1(2(E<)#!!B?Q,B70D4$F)U7=508G^0O\D
+M]0````"+N]````"%_W5`2(M#",>#T`````$```!(C;.X````2(UY6$B+0%A(
+MB9O`````2,>#R`````````!(B8.X````Z`````!F9I!FD$B+7"0P2(ML)#A,
+MBV0D0$R+;"1(3(MT)%!(@\18PTB+7B"_`P```$C'1B``````Z`````!(B5T@
+MZ\9(B??H`````$B+6!!)B<1(A=MU"NL22(L;2(7;=`I(.6L09F9FD'7N2(U[
+M2.@`````2(7`9I!TCDF-?"1(2(E8&$2):"!(QP``````2(E`"$B)QDC'0!``
+M````Z`````#I8?___TB)]^@`````2(G!2(M`&$B-41A(.=!U%>E$____9F9F
+MD$B+`$@YT`^$-/___X"X@/S__P%(C9AP_/__=>1,.:CX_/__==M!@_P'#X<1
+M____D$+_)/4`````2(N#@````$B)YDR)[TB+0`C_4'@/MD0D$HA#9@^V5"0.
+M#[9#:H/B`0'2@^#]"="(0VKIT?[__TB+0R"`HX`#``#OBW!`A?8/A;O^__](
+MB<9(C7E8QT!``0```$B#QBCH`````.F?_O__@(N``P``$.F3_O__2(M#"$B)
+MW_]0,.F$_O__9F9FD$B#[!A(B?A(B5PD"$R)9"002(G&2(M?&$2+9R!(C7M(
+MZ`````!(B=E$B>9(B=],BV0D$$B+7"0(2,?"`````$B#Q!CI`````&9F9I!F
+M9F:02('L&`(``(`]``````!(B9PD"`(``$B)K"00`@``2(G[=1U(BYPD"`(`
+M`$B+K"00`@``2('$&`(``,-F9I!FD`^V1VA!N`$```!(B>&Z`0```+X)````
+M@\@#@^#[B$=HZ`````"%P'5(@3PD>6-G;'1<]D-H`72K2(MK.$B%[9!T(DB+
+M.TC'Q@````#H`````$B)[DB)Q^@`````2,=#.`````!(BT-02(E#*.ER____
+M@*.``P``_DB)WK\!````Z`````"`2V@!Z57___^^``(``$B)Y^@`````A,!U
+MDP^V3"0$#[:#@`,``(G*@^#]P.H$@^(""=#VP1"(@X`#``!T#`^V1"0%@$MH
+M@(A#9_9$)`<!=!</ME-IB<C`Z`*#X`*#R@&#XOT)PHA3:?9$)`<"=!4/ME-I
+MC00)@^`(@\H$@^+W"<*(4VGV1"0'"'05#[9#:<'A!(/A((/($(/@WPG(B$-I
+M]D0D!P0/A`+___\/ME-I#[9$)`2#RD"#X`'!X`>#XG\)PHA3:>GC_O__D%5(
+MC4\X4TB)^TB![`@"```/MD$P@^`#+`$/A"`"``"_[____T`B>VA(B>5(B>!`
+MB'MH2(V4)``"``#&``!(@\`!2#G0=>SV03`"#X7O`0``2(M#*+[W____QP0D
+M7W=A4B'^0(AS:$B)1"0$@'DP`'D-#[9#9X!,)`P0B$0D#?9!,0%T'0^V4VD/
+MMD0D#(!,)`\!P>("@^#W@^(("="(1"0,]D$Q!'0<#[93:0^V1"0,@$PD#P+0
+MZH/@^X/B!`G0B$0D#/9!,1!T'0^V4VD/MD0D#(!,)`\(P.H$@^#]@^(""="(
+M1"0,]D$Q0'0:#[9$)`P/ME-I@$PD#P3`Z@>#X/X)T(A$)`Q(@7M`__\?`'<+
+MOO/___\A_D"(<VCV03`@#X0D`0``2(M+.$B%R70\,?9(@WD8`'0K2&/&2(M1
+M"(/&`4B-!$!(C43%`$B)4!!(BU$02(E0&$B+41A(BU)`2(E0($B+"4B%R77&
+M#[9#:KX``@``2(GGQH7_`0```8/@`8B%_@$``.@`````]]A%,<!(B>&(A0`!
+M``!(BW-0N@$```!(B=](@>X```(`2('F``#^_^@`````2(MS.$B%]G1$,?](
+MBU882(72=#%(BT-03(M"0$ACSTB-#$F#QP%*C10`2"T```(`2"4``/[_2('J
+M``@``$@IPDB)5,T@2(LV2(7V=;Z^``(``$B)Y\:%``$```#H`````/?813'`
+M2(GAB(4``0``2(MS4+H!````2(G?2('N``@``.@`````2('$"`(``%M=PT#`
+M[@*#Y@%`B'0D#NG+_O__9F:09F:04TB)^TB+/TC'Q@````#H`````$B)Q^@`
+M````2(G",<!(A=)T*,8$$`!(@\`!2(/X('7R2(M#*$B)0A!(BT,H2(E3.$B)
+M0TA(B4-`6\-(B=];Z0````!F9F:09F:09F:02('L2`,``(`]``````)(B:PD
+M(`,``$R)I"0H`P``2(G]2(F<)!@#``!,B:PD,`,``$R-9SA,B;0D.`,``$R)
+MO"1``P``#X2K`0``2(MW4$R-?"0@0;@!````N@$```!,B?E(@>X`"```Z```
+M``"%P$&)Q0^$'0,``$B+=5!!N`$```!,B?FZ`0```$B)[TB![@```@!(@>8`
+M`/[_Z`````"%P$&)Q@^$+P,``$&#_?\/E,!!@_[_#X3%!0``187V#Y5$)!=T
+M=$6%[75O2(MU4$&X`0```$R)^;H!````2(GO2('N``@``.@`````A<!!B<5T
+M1X"E@`,``/Y(B>Z_`0```.@`````@$UH`>F?`0``O@`"``!,B?_H`````(3`
+M#X7M`@``08"__P$```!U!D&]_O___\9$)!<`08$_7W=A4@^$,@,``$B+=5!(
+M@>X```(`2(GP2,'H($B%P`^%Q`(``(!-:`$/M@4`````/`(/A(4````L`0^$
+M8@4``/:%@`,```%T>("E@`,``/M)C9<``@``3(GXQ@``2(/``4@YT'7T,?9!
+MN`$```!,B?FZ`0```$B)[^@`````@'PD($4/A,X$``"`O"0>`@``574N@+PD
+M'P(``*IU)#'`1HN$.,H!``!%A<!U$4B#P!!(@_A`=>GK"4R-?"0@@$UH`O9%
+M:`)T#0^V16B#R`&#X/N(16A!]D0D,`%T-$B+73A(A=MT(TB+?0!(Q\8`````
+MZ`````!(B=Y(B<?H`````$C'13@`````2(M%4$B)12A!@'PD,``/B!8!``!!
+M]D0D,0$/A=\```!!]D0D,00/A:<```!!]D0D,1!U;D'V1"0Q0'0NQD0D(`4/
+MMD5I3(G^QD0D*0#`Z`>(1"0H2(M%<$B+O8@```#_D,````!F9I!FD$B+G"08
+M`P``2(NL)"`#``!,BZ0D*`,``$R+K"0P`P``3(NT)#@#``!,B[PD0`,``$B!
+MQ$@#``##QD0D(`0/MD5I3(G^QD0D*0#`Z`6#X`&(1"0H2(M%<$B+O8@```#_
+MD,````#I8?___\9$)"`##[9%:4R)_L#H`X/@`8A$)"A(BT5P2(N]B````/^0
+MP````.DM____QD0D(`(/MD5I3(G^T.B#X`&(1"0H2(M%<$B+O8@```#_D,``
+M``#I]O[__\9$)"``#[9%9TR)_HA$)"A(BT5P2(N]B````/^0P````.G$_O__
+M#[:<)!\"``"^``(``$R)_^@`````BW0D(`^VT$C'QP`````QP(G9Z`````"!
+M?"0@7W=A4@^$)0,``$&]_O___^F>_/__00^VG_\!``"^``(``$R)_^@`````
+M08LW#[;02,?'`````#'`B=GH`````$&!/U]W85(/A/[\__]%A>T/A:'\__]!
+MO?_____IEOS__X'F``#^_T&X`0```$R)^;H!````2(GOZ`````"%P`^%J?S_
+M_T&!/U]W85(/A0O]__^^``(``$R)_^@`````A,`/A"D%``!!@3]?=V%2#X7I
+M_/__O@`"``!,B?_H`````(3`#X74_/__08!_#@`/MD5H3(GF2,?'``````^5
+MPH/@^\'B`@G0B$5H#[9%:D&`O_X!````#Y7"@^#^"=`/MM*(16HQP.@`````
+M2(M%4$B)[T@M```"`$@E``#^_TB)12CHL_K__T'V1PP0=`R`36B`00^V1PV(
+M16=!]D</`70:#[95:4$/MD<,@\H!P.@"@^`"@^+]"<*(56E!]D</`G09#[95
+M:4$/MD<,@\H$`<"#X`B#XO<)PHA5:4'V1P\(=!H/ME5I00^V1PR#RA#!X`2#
+MX""#XM\)PHA5:4'V1P\$=!H/ME5I00^V1PR#RD"#X`'!X`>#XG\)PHA5:4C'
+M1"08`````#';2H-\.Q@`#X5U`0``2(/#&$B#^V!UZH!\)!<`#X19`@``,<E*
+M@WPY&`!T)TJ+5#D@2(M%4$B!P@`(``!(*<)(+0```@!()0``_O](`<)*B50Y
+M($B#P1A(@_E@=<>^``(``$R)_T'&AP`!````Z`````#WV$4QP$R)^4&(AP`!
+M``!(BW50N@$```!(B>\QVTB![@```@!(@>8``/[_Z`````!(BW500;@!````
+M3(GYN@$```!(B>](@>[_!P``2`'>Z`````"%P`^$'P$``$B#PP%(@_L$=<I(
+M@WPD&``/A,,"``"`36A`2(GOZ`````#IS/O__X3`#X0S^O__9F:09F:0Z5_Z
+M__^`?"0A4F9FD&9FD`^%(?O__T&X`0```$R)^;H!````O@$```!(B>_H````
+M`(!\)"!0#X7[^O__@'PD(4T/A?#Z___I'_O__V9F9I"`/0``````#X61^O__
+M9F:0Z0;[__^^``(``$R)_^@`````A,`/A&_Y___IP?S__TB+?0"^!````.@`
+M````2(7`2(E$)!@/A(7[__]*BU0[&$J+=#L02(GOZ$/M__](A<!(B<$/A$@#
+M``!(BU0D&$6%]DB):CAU?$J+1#L@2(E"0$B+5"082(E*2$B+01!(B5$82(E"
+M*.D@_O__2(M%4$B)[T4QP$R)^;H!````2"T```(`2"4``/[_2(UT`P'H````
+M`$B+=5!(Q\<`````2(V&``#^_TB-M!X!^/__2"4``/[_2(U4`P$QP.@`````
+MZ8C^__]%A>UUB$J+5#L@2(M%4$B!P@`(``!(*<)(+0```@!()0``_O](`<)(
+MBT0D&$B)4$#I6/___T6%[0^$5/[__T&`O_\!````#X2W````,<E*@WPY&`!T
+M)TB+15!(B<)*`U0Y($@M```"`$@E``#^_TB!Z@`(``!(*<)*B50Y($B#P1A(
+M@_E@=<>^``(``$R)_T'&AP`!````Z`````#WV$4QP$R)^4&(AP`!``!(BW50
+MN@$```!(B>\QVTB![@`(``#H`````$B+15!!N`$```!,B?FZ`0```$B)[T@M
+M```"`$@E``#^_TB-=`,!Z`````"%P'1^2(/#`4B#^P1UQ^F/_?__2,?'````
+M`#'`Z`````!,B?^^``(``$'&A_\!```!0<:'``$```#H`````/?813'`3(GY
+M08B'``$``$B+=5"Z`0```$B)[TB![@```@!(@>8``/[_Z`````#IZ_[__T'V
+M1"0P!`^$)_C__^DL_?__2(MU4$B)[T4QP$R)^;H!````2('N_P<``$@!WN@`
+M````2(M%4$C'QP````!(C908`?C__T@M```"`$@E``#^_TB-=`,!,<#H````
+M`.DQ____2(V<)"`"``!)C7<0NO````!(B=](@\,(Z`````!(C80D&`,``$B)
+M1"0(ZPM(@\,82#M<)`AT8TB#.P!T[TB+<PA!N`$```!,B?FZ`0```$B)[X/F
+M_^@`````A<`/A?SV__],B?_H`````$&!/_06>%H/A)@```!(BW,(13'`3(GY
+MN@$```!(B>_H`````(7`=)KIQ_;__V9FD$B+=5!!N`$```!,B?FZ`0```$B)
+M[TB![@```@"!Y@``_O_H`````(7`#X65]O__2(MU4$4QP$R)^;H!````2(GO
+M2('N```"`$B!Y@``_O_H`````(7`#X5H]O__Z=SY__](BWPD&.@`````9F:0
+M9I#I"_C__[X``@``3(G_Z`````#I5O___V9FD&9FD&9FD$%728GWO@$```!!
+M5D%528G]05154TB#['A(BW\8B50D#.@`````2(G%28M%"$B-="1`3(G__U!X
+M2(N%F`,``$B+E9`#``!(B4((2(D02(M%`$B+6!A(@\`82#G##X2?````3(UT
+M)!#K&V9F9I!F9I!(BT4`2(L;2(/`&$@YV`^$?0```("[@/S__P%,C:-P_/__
+M==Q(B[/P_/__28M%"$@[1@@/A#<!``!,B>_H`````(/X`'Q+=;A)BT4(28N\
+M)(@```!,B?;_4'@/ME0D3@^V1"0>T.K0Z(/B`8/@`3G"?XY\'0^V1"0@.$0D
+M4'>!D'(/#[9$)%$Z1"0A#X=O____2(M3"$B-A9`#``!(B9V0`P``QT4T`0``
+M`$B-O9````"^*````$B)0PA(B0*`C8`#```!28M%"$R)O8@```!,B:V`````
+M2(F5F`,``$B)17"+1"0,B45X2(M4)$!(B550BT0D2$B)52B)16`/MD0D4HA%
+M9@^W1"189HE%9`^V5"1.#[9%:H/B`0'2@^#]"="(16KH`````$B+17!(B[V(
+M````2(UT)$#_4'CV1"1.`4B+1"1@=0GV@``!```$=0A(B>_H`````$B#Q'A(
+MB>A;74%<05U!7D%?PV9FD&9FD$B+@``!``!(A<`/A+G^__](BW8028M]$/_0
+MZ;+^__^04X!_$`%(B?MT!UNX_____\.`/0`````"=/!(BT=02"T```(`2"4`
+M`/[_2(E'*.BM\O__@&-H],=#,/____](B=_H`````%LQP,-F9I!F9I!(@^P8
+MA=)(B6PD"$R)9"002(G]2(D<)$F)]'AHZ`````!(A<!(B<-T3@^V0&A(BVT8
+MJ`)U;8`]``````!T&J@!=6KV0VA$=02`2V@D1(N-V`$``$6%R71>2(G>2(ML
+M)`A(BQPD3(MD)!"_`@```$B#Q!CI`````$B+10A,B>?_D(````!(C7T@3(GF
+M2(L<)$B+;"0(3(MD)!!(@\08Z0````!(B=_H`````.NL2(G?Z`````#KC$B-
+MM<`!``!(C7U(QX78`0```0```$C'A<`!````````2(FMR`$``$C'A=`!````
+M````Z`````#I9O___V9F9I!F9F:09F:09F:0055!5$F)_%532(/L"$B+;SA(
+MBU](2(M5.$B%T@^$-@$``$B)T#'V2#G8=`Q(BTL(2#E("$@/1/!(BP!(A<!U
+MYTB%]@^$A@```$B+?A!(BTL02#G/<@KK-$B+$DB%TG0Y2(-Z&`!U\4B)R$@#
+M0PA(.4((=>1(BT(02`-#$$@#?@A(*T802(EZ"$B)0A!(B=Y(B>_H`````.L8
+M2(M&"$@#1A!(*7L02,=#&`````!(B4,(@$UH$$R)Y^@`````2(/$"$B)[UM=
+M05Q!7>D`````13'MZPA(BQ)(A=)T+DB#>A@`=?%(BWL(2(M*"$B)^$@#0Q!(
+M.<%T64@#2A!(.<](#T3R2(L22(72==)(A?9(QT,8`````'082(M&"$B)[TB)
+M0PA(BT802`%#$.@`````387M#X1Y____28M%$$@!0Q!,B>Y(B>_H`````.EA
+M____28G5Z7S___](QT,8`````.E,____9F9FD&9F9I!F9I!!54F)_3'_051)
+MB?154TB#[`A(A=(/A)@```!(BWI(2(7_#X2+````28M-.$B%R71R,>U%,<#K
+M#4@YPG012(L)2(7)=$5(BT$82(7`=>I(BW$023GT=PY(A>UT!D@[=1!S`TB)
+MS4B%P'732(7_9F:0=,M(BT<(2`-'$$@Y00A,#T3!2(L)2(7)=;M-A<!T#TF+
+M0!!(`T<023G$2`]&[TB%[74<,=M(@\0(2(G86UU!7$%=PTTY94`/@VO____K
+MY$F+?0"^!````.@`````2(7`2(G#=-!,B6@X28M%4#'V28M5.$@M```"`$@E
+M``#^_TB%TDB->`%T($B+0AA(A<!T#TB+2$"X`0```"GYT^`)QDB+$DB%TG7@
+M,<FX`0```-/@A<9T'X/!`8/Y!'7M2,=#0`````!(B=\QV^@`````Z6'___](
+M8\%(`?A(A<!(B4-`=.),B6,H2(MU"$R)XDR)[^B:X___2(7`=,I(B5@82(E#
+M2$R)[T&`36@0Z`````#I(/___V9F9I!F9F:09F:04TB)^TB+0SA(A<!U"^M;
+MD$B+`$B%P'122(MX&$B%_Y!T[DB+=QA(A?9T.(!^1`!T,C')ZP\/MD9$C5$!
+M2(/!`3G0?A](.7S.8'7J#[9&1(U1`4C'1,Y@`````$B#P0$YT'_AZ`````#K
+MFDB)WV9FD.@`````2(M#<$B+NX@```#_D,@```!(B=];Z0````"054B)_5-(
+M@^P(2(M?.(!G:+](A=MT0DB+>QA(A?]T!>@`````2(L;2(7;=>I(BT4XZP-(
+MBP!(A<!T'DB+>!A(A?]T[TB#?Q@`=>CH`````$B+13A(A<!UXDB#Q`A(B>];
+M7>D`````9F9FD&9FD&9FD$%62(GX2(G&055!5%533(MO($F-O1`!``!-C648
+MZ`````!)BUT80<>%V`$```````!,.>-U"NLT2(L;3#GC="R`NX#\__\!2(V[
+M</S__W7H]H/8_/__0'3?]D/P`739Z`````!(BQM,.>-UU$F+72A)C6TH2#GK
+M=!AF9F:09F:02(U[Z.@`````2(L;2#GK=>])BVT83#GE#X3@````9I"`O8#\
+M__\$2(V]</S__W8.2(.]B/S__P`/A'H!``!(BVT`3#GE==E)BUT83#GC#X2J
+M````13'VZP]F9F:09F:02(L;2#GK=%F`NX#\__\!2(V[</S__W7H]H/8_/__
+M('3?2(N#J/S__X"CV/S__]M(A<!U&.GL````9F9FD&9FD$B+`$B%P`^$V0``
+M`$B#>!@`=.U(BQM!O@$```!(.>MUITF+71A,.>-U#NLR9F9FD$B+&TPYXW0F
+M1(N3H/S__TB-NW#\__]%A=)X'/9#\`%UW^@`````2(L;3#GC==I;74%<05U!
+M7L/V0_`!=,,/MH.`_/__/`0/AGX```!(@[N(_/__`'6J]H/0_O__0'6A2(N#
+M\/[__TB%P'0&2#EX"'6/#[:#M/S__X7`?B^#Z`$QR4B#P`%(BU3/8$B%TG03
+M@'H0!'8-]H)@`@``0`^%7O___TB#P0%(.<%UVN@`````Z4O___]%A/8/A=+^
+M__]FD.@`````Z<;^__\L`69F9I`/A2K____V@]C\__\"9F:0#X0:____Z\/H
+M`````&9FD.EY_O__9F9FD&9F9I!F9I!!5$F)_$B-OQ`!``!54^@`````2(7`
+M2(G%=&I)BUPD&$R)8"!)@\08QP`!````2,=`"`````!(B4402,=`&`````!,
+M.>-U$>LO9F9FD&9FD$B+&TPYXW0@@+N`_/__`4B-NW#\__]UZ$B)[N@`````
+M2(L;3#GC=>"+10"#Z`&%P(E%`'0%6UU!7,-;2(GO74%<Z1K]__]F9F:09F:0
+M9F:02(/L&$B);"0(2(D<)$B)_4R)9"002(M?(,=#0`````#VAX`#```8#X6C
+M````1(NGT````$6%Y`^%DP````^V0TBH`0^%AP```*@"3(UC$'0?3#EC$'4%
+M2#D;=!U(B>^0Z,O;___V0T@!=65F9I!FD$B+2Q!,.>%U:@^V168Y0R!R%NM,
+M2(G62(GOZ!'8__\/MD5F.4,@<SA(B>_HT-?__TB%P$B)PG0H#[>`L````&8E
+M_S!F/00@=<M(.1MU8?9%:@)TP(!+2`+KNF9FD&9FD$B+'"1(BVPD"$R+9"00
+M2(/$&,-$BUL@187;=>1(BQ%(BT$(2(GO2(MQ&$B)0@A(B1!(B4D(2(D)2(L<
+M)$B+;"0(3(MD)!!(@\08Z8'7__](B=?&@K(````!Z`````!(B>_H.M?__TB)
+MPNE&____9I!(@^P82(D<)$B);"0(2(G[3(ED)!!,BV=0Z/+6__^`N[`````$
+M2(G"28ML)"`/A(T```!(BX/(````QT5$`````$B)*L="(`````!(B5H82,>#
+MR`````````!(B4(02(M%"$B)50A(B1!(B4((00^V1"1F.44@<P>+14"%P'03
+M2(L<)$B+;"0(3(MD)!!(@\08PTF+/"1(C74HQT5``0```$B+'"1(BVPD"$R+
+M9"002(/$&$B#QUCI`````&9F9I#V@[$````P=`KV14@"#X1@____QH.R````
+M`4B)WTB+;"0(2(L<)$R+9"002(/$&.D`````9F9FD&9F9I!F9F:02(/L*$B)
+M;"0(3(ED)!!(B?U,B6PD&$R)="0@2(D<).CLU?__3(MU4$F)Q4V+9B!!@VPD
+M(`$/MH6R````/`UT4#P1#X3(````/`MT9#P09I`/A.````!)BT402(GO2(F%
+MR````.@`````08M$)$"%P'1H2(L<)$B+;"0(3(MD)!!,BVPD&$R+="0@2(/$
+M*,.0@+VP`````'6]@+VS``````^%NP```,:%LP````%F9I!)C40D$,:%L@``
+M``!)BU0D&$V);"0828E%`$&+1"1`28E5"$R)*H7`=9A)BSY)C70D*$''1"1`
+M`0```$B+'"1(BVPD"$R+9"003(ML)!A,BW0D($B#QUA(@\0HZ0````!,B??H
+MV-C__X7`=0L/MH6S````/`%V0P^VA;(````\$`^%(/___X"]L`````,/A!/_
+M__])BUX@3(GV28EN(+\#````Z`````!)B5X@Z?7^___&A;(````0Z\R#P`&(
+MA;,```#I./___Y"0D)"0D)"02(LU`````$B%]G1#2(M6&$B-3AA(.<IT+DB-
+M@G#\__\YN.@#``!U%^LI9F:09F:02(V"</S__SFXZ`,``'022(L22#G*=>E(
+MBS9(A?9UO3'`\\/SPV9F9I!F9F:09F:0@'\$`'4,,<"!/WL!```/E\##,<"!
+M/WL!```/E\##9I`/M@</M@XXR'0:ZRQF9F:0#[97`0^V1@$XPG412(/'`4B#
+MQ@&$P'7H,=*)T,,/OL`/OM(IPHG0PP^^T`^^P2G"Z^AF9F:09F9FD&9FD&9F
+MD$%728GW059!B?Y!54%455-(@>R8````3(LM`````$V%[71#3(UD)!`Q[4F+
+M71!(A=MT*DR)9"0(2(M#"$B+>Q!,B>;_4#B`?"0C`'0(1#GU="N#Q0%(BQM(
+MA=MUVTV+;0!-A>UUQ#';2('$F````$B)V%M=05Q!74%>05_#387_=.8/ME0D
+M)T&+!SG0?-I(BQM(A=MTTBG02(M[$$B+="0(08D'2(M#"/]0.(!\)",`=-#K
+MLF9F9I!F9F:09F9FD$%7059)B?Y!54%428G454B)S5-(@>RH````2(L%````
+M`,<"`````$B)="0(QP$`````2(7`2(E$)!`/A)X```!!O?_____'1"0<````
+M`$B+1"002(M8$$B%VP^$D````$B%[4$/E<?K'V9F9I!F9I!(BQL/MD0D-T$!
+M!"2+1"0<`44`2(7;=&A(BT,(2(M[$$B-="0@_U`X2(M#"$B+@`@!``!(A<!T
+M#T6$_W0*2(M[$/_0B40D'(!\)#,`=!-!QP0D`````$&#Q0''10``````3#GS
+M=9I(BT0D"$2)*$B!Q*@```!;74%<05U!7D%?PTB+1"002(L`2(7`2(E$)!`/
+MA4C____KUF9F9I!F9F:0055!5%4Q[5-(@>R(````3(LE`````$V%Y'0Q28M<
+M)!!(A=MT'DB+0PA(BWL02(GF_U`X@'PD$P%(BQN#W?](A=MUXDV+)"1-A>1U
+MSTB!Q(@```")Z%M=05Q!7<-F9F:005=!5D%505152(G54TB![-@```")="0,
+M2(UT)`SHKOW__TF)QKC_____387V#X3Y````38MF&#'`9F9FD&9FD,8$*`!(
+M@\`!2(/X1'7R28M&"$B-="0028M^$/]0.(!\)"(0#[94)"*X#P```(MT)`P/
+M0L)(C90DP````(A$)"))BT8(28M^$/^0N````(7`#X2H````28M<)!A-C6PD
+M&$PYZP^$@0```$4Q_^L*9I!(BQM,.>MT<H"[@/S__P%,C:-P_/__=>A,.[/P
+M_/__==](BX/@_/__2(N[^/S__TB-M"20````_U!X]H0DG@````)UO`^VA"2@
+M````.T0D#'6N#[:$)*$````Z1"0B<Z`/MM!!BX0DZ`,``$&#QP&)1)4(1#A\
+M)")UAC'`2('$V````%M=05Q!74%>05_#BX0DQ````(E%!(N$),````")10#I
+M/____V9FD&9FD&9FD(U'^S'2@_@'=PZ)P/\DQ0````"Z`0```(G0P[H(````
+MB=##N@(```")T,.Z!P```(G0P[H#````B=##N@0```")T,.Z!0```(G0P[H&
+M````B=##9F9FD&9FD&9FD&9FD`^VCX`#``!$#[9&#(G*@_(!@^(!B="#R"!!
+M]L`@#T3"B<*#R@+VP00/1<*)PH/*!(/A`@^V3@X/1<*)PH/*$$&#X!`/1<*)
+MPH/*0/;!`0]%PHG"@,J`@^$"#T7"#[97:(G!@<D```"`]L($#T7!B<&!R0``
+M`@#VP@(/1<&)P8')```!`(/B`0]%P8G"@<H```0`]D=J`0]%PL-F9I!F9I!(
+MBX=H`@``2(M/*$0/MD=$2,'H"TC!Z0M(:=#H`P``2(G0,=)(]_%$B<)(B<%(
+MBT<(#[9`"BG"B=!(F$@/K\A%A<!(C02)1(T4`'Y]08U`_S'V3(U(`4B+3/=@
+M2(7)=&#V@8`#```!=%>`>1`$=E'V@6`"``!P=$A(BU$(#[9!1`^V4@HIT(T$
+M@$2-!`!(BX%H`@``2(M)*$C!Z`M(P>D+:=#H`P``B=`QTO?Q1`^OP$6%TG0%
+M13G"=@9%B<)F9I!(@\8!3#G.=8U!@?H0)P``N!`G``!!#T;"PV9FD&9FD$B+
+MCX`"```/MH&J````/`)U<DB+01"_$"<``$B+<"A(BT$(3(M`*$B)\DPIPDC!
+MZ@M(A=)T-H!Y*`!U-$B+@:````!,*<!(P>@+2&G`Z`,``$B)T3'22/?Q2(T$
+M@`'`OQ`G```]$"<```]&^(GXPY!(*[&@````2,'N"TAIQN@#``#KS3P#=%>`
+M>2@`="-(BT$02(M0*$B)T$@K@:````!(P>H+2,'H"TAIP.@#``#KH$B+@:``
+M``!(P>@+2&G0Z`,``$B+01!(BT@H2(G0,=)(P>D+2/?Q2(T$@`'`ZX"`>2@`
+M=`9(BT$(ZZ=(BX&@````2,'H"TAIT.@#``!(BT$(Z\1F9F:09F:09F:09F:0
+M3(M'&$V%P'0\00^V0$2$P`^V\'0C,<E).7A@=!Y,B<(QR>L-2(M":$B#P@A(
+M.?AT"H/!`3GQ=>PQP,-!BT`X@\`!`<C#BT<XPV9F9I!F9I`/MD=$A<!^8X/H
+M`44QR4R-4`%*BTS/8$B%R71&]H&``P```70]@'D0!'9$#[9!1(7`?B^#Z`$Q
+MTDR-0`%F9F:02(M$T6!(A<!T#_:`@`,```%T!D@Y<#AT%$B#P@%,.<)UWDF#
+MP0%-.=%UIS'`\\-(.7$X=>U(B<C#9F9FD&9FD$%708G7059)B?Y!54F)S4%4
+M55-(@^P(2(7_0(AT)`-$B$0D`D2(3"0!#X0)`0``@'\0!P^4P$"`_@</E,*$
+MP`^%VP```(32#X7K````187_#X0L`@``3(GMQT0D!`````!)Q\7_____13'D
+M9F:09I"+?0#H`````$B%P$B)PP^$AP```$F+!D@Y`P^%>P```(![$`%U=4B)
+MWDR)]^C?_O__,?](A<!(B<9T!$B+>$A(BTLX2(7)#X39````2(G(,=)(@W@8
+M`4B+`$B#VO](A<!U[TB#^@,/AKD````QTD4Q[8-$)`0!20'42(/%!$0Y?"0$
+M#X5X____#[9,)`*#X0^`?"0#!P^&+0$``$4QY$B#Q`A,B>!;74%<05U!7D%?
+MPP^V1T0\`0^$(?___X32=`B$P`^%00$``$6%_V9FD&:0#X0\`0``3(GM,=M)
+MQ\7_____13'DZRF`>!`!=:Y(BT!`2(7`=*5)`<1).<5,#T?H@\,!2(/%!$0Y
+M^P^$>/___XM]`.@`````2(7`=<IF9I#I=O___S'22(7V=`1(BU8H2(7)=&E%
+M,<#K(69FD&9FD$B+01A(.<9T"DB%_W0=2(7`=%=(BPE(A<ET*DB%]F:0==Y(
+MA?](BT$8=>-(A<!FD'7A2(M!$$@YT$@/1]!(BPE(A<EUUDB%_W04387`=`])
+MBT`02`-'$$@YPD@/0M!).=5,#T?JZ<?^__](BT<(2`-'$$@Y00AUNDB+01!)
+MB<A(.=!(#T?0Z[4/MD0D`_\DQ0````!!@_\!#X:]_O__08/_`DV)[`^&L_[_
+M_P^VR;C_____0='OT^!(F$DAQ$2)^$P/K^#IE?[__T6%_P^%NP```$G'Q?__
+M__]%,>3I9_[__T&#_P,/AG#^__\/MLFX_____TV)[-/@2)A)(<1!C4?^3`^O
+MX.E4_O__08/_`@^&1_[__P^VR;C_____38GLT^!(F$DAQ$&-1_],#Z_@Z2O^
+M__^`?"0!`0^&_0```(!\)`$"#X9+____1`^V3"0!,=)$B?A!]_&%T@^%_/W_
+M_X/X`0^.\_W__TQCX$&-0?\/MLE(F$P/K^"X_____]/@2)A)(<5-#Z_EZ=']
+M__](BT=@,>TQTDB%P'4>Z;S]__]!.>\/AN#]__^)ZDF+1-9@2(7`#X2C_?__
+M2(M8.$&+?)4`Z`````!(.<-T$D$/MD9$@\4!.>@/AJW]___KPD$/MD9$#[;8
+M03G?#X)M_?__A,!T9TF+1F`Q[3'22(7`=23I5_W__T$/MD9$@\4!#[;8.>MV
+M1HGJ28M$UF!(A<`/A#C]__](BU@X08M\E0#H`````$@YPW3.Z2#]__\/MLFX
+M_____TV)[-/@2)A)(<1$B?A,#Z_@Z07]__\/ML!-BV8H28MTQEA(BT8X2(M(
+M.$B%R74*ZR5(BPE(A<ET'4B#>1@`=?%(BU9(2(M""$@#0A!(.4$(==],`V$0
+M03G?=ROIN_S__TF+%D@Y$`^%K/S__X!X$`$/A:+\__^#PP%,`V!`1#G[#X25
+M_/__B=A!BWR%`.@`````2(7`=<GI?/S__Y#SPV9F9I!F9F:09F:09F:0BPT`
+M````C5$!B=#!^!_!Z!Q$C00"08/@#T$IP$0[!0````"X_____W192&/!2,?&
+M`````$B-%(!(C1102(L'2(T,E0````!(B025`````$B+1PA(B40Q"$B+1Q!(
+MB40Q$$B+1QA(B40Q&$B+1R!(B40Q((M'*$2)!0````")1#$H,<#SPV9F9I!F
+M9F:09F:02(/L.`^V1Q!)B=`\`70F/`1T/4B-5"0,@_X!2(GG&<"#P!F(1"0(
+M9HE*".@`````2(/$.,.+A^@#``!(C50D#$R)1"0,B40D!.O-9F:09I!(BU<X
+M2(M'2(N2Z`,``$P#0`B)5"0$2(U4)`Q,B40D#.NF9F9FD&9F9I!F9I!F9I!5
+M4TB#[!C&!"0&2(M?$$B%VW0@2(M#$#'_2(GF2(E$)`A(BT,(_Y#`````2(L;
+M2(7;=>!(@\086UW#9F:09F:02(M'4$0/MY>8````28GP08G32(NP@`(``$R+
+M"$2)T<'A"8!^*`!T#?:'L0````0/A8L````/MY::````P>()A<E)B[%0`@0`
+M08NY6`($`'1AB=`QTO?WB<!(P>`$2(T\!DF-<!#K.HG02`,'2(E&^$&+@5@"
+M!`!)B?#'1O0`````*=")1O`YR(G(#T9&\"G!B4;P2(UV$(7)=!=(@\<0,=)%
+MA=MUP8G02`-'"$B)1OCKOK@!````0<=`]`$```###[>6F`````^WAIH````I
+MPD0ITL'B">ED____9F:09I!!5$F)_%5(B?53@'Y$`'1J,=OK(DB+5DA)BT0D
+M2$B+2`A(.4H(=#D/MD5$C5,!2(/#`3G0?D1(BW3=8$B%]G3G@'X0!';.3(GG
+MZ++___^$P'356UU!7+@!````PV9F9I!)BT0D.$@Y1CATYP^V142-4P%(@\,!
+M.=!_O%M=05PQP,-F9F:09F9FD&9F9I!F9I!!54F)]4%428G\55.`?T0`=%(Q
+M[>L<3(GN2(G?Z-____]!#[9$)$2-50%(@\4!.=!^,DF+7.Q@2(7;=.6`>Q`$
+M=]1,B>Y(B=_H(____X3`C54!#Y1#4$$/MD0D1$B#Q0$YT'_.6UU!7$%=PV9F
+MD&:0@'\0`70#,<##2(7V=%I(BX:``@``2(7`=$Y,BT`(23GP=$I(BT\X2(7)
+M=#9F9F:02(M1&$B%TG0?2(7V=0=FD.O$2(G"2(M"&$B%P'7T2#GR=`5,.<)U
+MKDB+"4B%R6:0=<ZX`0```,-)B?#KMDR+0!#KL&9F9I!F9I!F9I!F9I"+1QR%
+MP'@&@W\@`W<'QT=0_O____/#9F9FD&9FD&9FD(%_',<```!V"8%_(,<```!W
+M!\='4/[____SPV9FD&:0@7\<QP```'8)BU<@A=)X`O/#QT=0_O___\-F9I!F
+M9I"+3QR%R7@&@W\@`W<'QT=0_O____/#9F9FD&9FD&9FD(-_'`-V!H-_($MW
+M!\='4/[____SPV9F9I!F9F:09F:0@W\<`W8&@W\@5W<'QT=0_O____/#9F9F
+MD&9F9I!F9I"#?QP#=@:#?R!#=P?'1U#^____\\-F9F:09F9FD&9FD(-_'`=V
+M!H-_(`]W!\='4/[____SPV9F9I!F9F:09F:0@W\<!W8&@W\@0W<'QT=0_O__
+M__/#9F9FD&9F9I!F9I"#?QP#=@:#?R`#=P?'1U#^____\\-F9F:09F9FD&9F
+MD(-_'`=V"8%_(/\```!W!\='4/[____SPV9F9I!F9F:0@W\<!W8)@7\@HPP`
+M`'<'QT=0_O____/#9F9FD&9F9I"#?QP'=@F!?R`G#0``=P?'1U#^____\\-F
+M9F:09F9FD(-_'`=V"8%_(*L```!W!\='4/[____SPV9F9I!F9F:0@W\<"W8&
+M@W\@)W<'QT=0_O____/#9F9FD&9F9I!F9I"#?QP#2(M'*(L`=A-(8U<@B<!(
+MC02%!````$@YPG,'QT=0_O____/#9F9FD&9F9I"#?QP#2(M'*(L`=A-(8U<@
+MB<!(C02%!````$@YPG,'QT=0_O____/#9F9FD&9F9I!32(G[2(M'*(-['`.+
+M.'8)@7L@K0```'<)QT-0_O___UO#Z`````!(A<!T[5MF9I##9F9FD&9F9I!F
+M9F:09F:04TB)^TB+1RB#>QP#BSAV"8%[(-<```!W"<=#4/[___];P^@`````
+M2(7`=.U;9F:0PV9F9I!F9F:09F9FD&9FD%-(B?M(BT<H@WL<`XLX=@F!>R#Y
+M````=PG'0U#^____6\/H`````$B%P'3M6V9FD,-F9F:09F9FD&9F9I!F9I!3
+M2(G[2(M'*(-['`A(BTLPBSAV#(-[(`1_%F9FD&9FD,=#4/[___];PV9F9I!F
+M9I`/ME`(BT`$B0&$THA1!'04@3G#`0``=MCH`````$B%P'3.6\,]PP$``&9F
+M9I!F9I!VONOD9F9FD&9F9I!F9F:02(/L$$B);"0(2(D<)$B)_8%_'+,```!V
+M!H-_(`=W%<=%4/[___](BQPD2(ML)`A(@\00PTB+1RB+&(G?@^L!Z`````"#
+M^_UWW4B%P'31@'@0!';+2(.X@`(```!UP6:0Z\1F9F:09F9FD&9FD&9FD$B#
+M[!A(B6PD"$B)'"1(B?U,B60D$(-_'`AV!H-_(`=W'\=%4/[___](BQPD2(ML
+M)`A,BV0D$$B#Q!C#9F:09I!,BV<H08L<)(G?@^L!Z`````"#^_UW$DB%P'0&
+M@'@0!'<7QT50_O___TF-?"0$Z)WK__\L`76JZZ](@[B``@```'7?Z^1F9F:0
+M9F9FD&9FD$B#["A(B6PD"$B)'"1(B?U,B60D$$R);"083(ET)"!(BT\H2&-7
+M'$2+,42)\$B-!(4$````2#G"<F:+=R"%]GA?@#T``````G1613'M187V0;P$
+M````=3'K369FD&9FD(G?Z`````!(BU402#D09I!U4O9`:`%T*$&#Q0%)@\0$
+M13GU=")(BTTH0HL<(8G?Z`````!(A<!UQV9F9I!F9I#'15#^____2(L<)$B+
+M;"0(3(MD)!!,BVPD&$R+="0@2(/$*,/'15#\____Z]IF9I!(@^P@2(D<)$B)
+M;"0(2(G[3(ED)!!,B6PD&(%_'(<```!,BV<H=@F#?R`#=R-F9I#'0U#^____
+M2(L<)$B+;"0(3(MD)!!,BVPD&$B#Q"##D$$/MD0D`3P(=]9%,>V$P'4=Z]2)
+M[^@`````2(M3$$@Y$'4B08/%`44X;"0!=KE!#[;%08MLA&B)[^@`````2(7`
+M==#KF\=#4/S___]F9F:0ZY5F9F:09F9FD&9FD&9FD(-_'`-V!H-_(`-_!\='
+M4/[____SPV9F9I!F9F:09F:02(M'*(M7'+D0````BW`(1(M`#(7V=`=$B<!(
+MC4@02&/"2#G!=PR%]HM'('4,03G`=@?'1U#^____\\-F9I!FD$B#["!(B1PD
+M2(EL)`A(B?M,B60D$$R);"08@7\<KP```$R+9RAV"8-_(`-W(V9FD,=#4/[_
+M__](BQPD2(ML)`A,BV0D$$R+;"082(/$(,.000^V1"0!/!!WUD4Q[83`=1WK
+MU(GOZ`````!(BU,02#D0=2)!@\4!13AL)`%VN4$/ML5!BVR$<(GOZ`````!(
+MA<!UT.N;QT-0_/___V9F9I#KE69F9I!F9F:09F:09F:02(/L($B)'"1(B6PD
+M"$B)^TR)9"003(EL)!B#?QP$2(MO*'X&@W\@`W<FQT-0_O___TB+'"1(BVPD
+M"$R+9"003(ML)!A(@\0@PV9F9I!F9I!(B>_HF.C__RP!=<X/MD4-/$!WQD4Q
+M[83`=2'KQ&9FD$2)Y^@`````2(M3$$@Y$)!U(D&#Q0%$.&T-=J5!#[;%1(MD
+MA7Q$B>?H`````$B%P'7.ZX;'0U#\____9F:09I#I?/___V9F9I!F9F:09F:0
+M2(/L($B)'"1(B6PD"$B)^TR)9"003(EL)!B!?QRS````2(MO*$2+90!V!H-_
+M(`-W'\=#4/[___](BQPD2(ML)`A,BV0D$$R+;"082(/$(,-$B>?H`````$B%
+MP'341(GGZ`````!(BU,02#D0=`G'0U#\____Z\%,C64$00^V1"0!/!!WK$4Q
+M[83`=2'KJF:0B>_H`````$B+4Q!(.1!FD'7,08/%`44X;"0!=HM!#[;%08ML
+MA'")[^@`````2(7`=<[I:O___V9FD&9FD&9FD$B#["!(B1PD2(EL)`A(B?M,
+MB60D$$R);"08@W\<"$B+;RA$BV4`=@:#?R`#=R+'0U#^____2(L<)$B+;"0(
+M3(MD)!!,BVPD&$B#Q"##9F:01(GGZ`````!(A<!TT42)Y^@`````2(M3$$@Y
+M$'0)QT-0_/___^N^3(UE!$R)Y^C=YO__+`%UIT$/MD0D#3Q`=YU%,>V$P'4I
+MZYMF9I!F9I")[^@`````2(M3$$@Y$&:0=;Q!@\4!13AL)`T/AG3___]!#[;%
+M08MLA'R)[^@`````2(7`=<KI4____V9FD&:01(M''$6%P'@&@W\@*W<'QT=0
+M_O____/#9F9FD&9F9I!(@^P02(D<)$B);"0(2(G[@W\<"$B+1RB+*'8T1(M/
+M($6%R7@KB>_H`````$B%P'0?B>_H`````$B+4Q!(.1!T%L=#4/S____K#69F
+MD&9FD,=#4/[___](BQPD2(ML)`A(@\00PV9F9I!F9F:09F:02(/L$$B)'"1(
+MB6PD"$B)^X-_'`A(BT<HBRAV-$2+5R!%A=)^*XGOZ`````!(A<!T'XGOZ```
+M``!(BU,02#D0=!;'0U#\____ZPUF9I!F9I#'0U#^____2(L<)$B+;"0(2(/$
+M$,-F9F:09F9FD&9FD$B#[!!(B1PD2(EL)`A(B?N#?QP(2(M'*(LH=C1$BU\@
+M187;>"N)[^@`````2(7`=!^)[^@`````2(M3$$@Y$'06QT-0_/___^L-9F:0
+M9F:0QT-0_O___TB+'"1(BVPD"$B#Q!##9F9FD&9F9I!F9I!(@^P02(D<)$B)
+M;"0(2(G[@W\<#4B+1RB+*'8LBT<@A<!X)8GOZ`````!(A<!T&8GOZ`````!(
+MBU,02#D0=!#'0U#\____ZP?'0U#^____2(L<)$B+;"0(2(/$$,-F9I!(@^P0
+M2(D<)$B);"0(2(G[@W\<#4B+1RB+*'8LBT<@A<!^)8GOZ`````!(A<!T&8GO
+MZ`````!(BU,02#D0=!#'0U#\____ZP?'0U#^____2(L<)$B+;"0(2(/$$,-F
+M9I!(@^P02(D<)$B);"0(2(G[@W\<#4B+1RB+*'8LBT<@A<!X)8GOZ`````!(
+MA<!T&8GOZ`````!(BU,02#D0=!#'0U#\____ZP?'0U#^____2(L<)$B+;"0(
+M2(/$$,-F9I!(@^P02(D<)$B);"0(2(G[@W\<`TB+1RB+*'95BT<@A<!X3HGO
+MZ`````!(A<!T0HGOZ`````!(BU,02#D0=`G'0U#\____ZS"`>!`$=B-(BY"`
+M`@``2(72=!>`NJL`````=0X/MH!A`@``@^`8/`AT!\=#4/[___](BQPD2(ML
+M)`A(@\00PV9F9I!F9I!F9I!(@^P02(D<)$B);"0(2(G[@W\<`TB+1RB+*'8T
+MBT<@A<!X+8GOZ`````!(A<!T(8GOZ`````!(BU,02#D0=`G'0U#\____ZP^`
+M>!`!=`EFD,=#4/[___](BQPD2(ML)`A(@\00PV9F9I!F9F:09F:02(/L$$B)
+M'"1(B6PD"$B)^X-_'`-(BT<HBRAV-(M'((7`>"V)[^@`````2(7`="&)[^@`
+M````2(M3$$@Y$'0)QT-0_/___^L/@'@0`70)9I#'0U#^____2(L<)$B+;"0(
+M2(/$$,-F9F:09F9FD&9FD$B#[!A(B1PD2(EL)`A(B?M,B60D$(-_'`=(BT<H
+MBRA$BV`$=GN+5R"%TGATB>_H`````$B%P'1H1(GGZ`````!(A<!T6XGOZ```
+M``!$B>=(B<7H`````$B)PDB+10!(.T,0=`G'0U#\____ZSI(.P)U\DB+10B`
+M>`H`="2`>A`!=1Y(@WU8`'072(N%@`(``$B%P'02@+BK`````'0)9I#'0U#^
+M____2(L<)$B+;"0(3(MD)!!(@\08PV9FD&9FD$B#[!!(B1PD2(EL)`A(B?N#
+M?QP'2(M'*(LH=C2+3R"%R7@MB>_H`````$B%P'0AB>_H`````$B+4Q!(.1!T
+M"<=#4/S____K#X!X$`1W"6:0QT-0_O___TB+'"1(BVPD"$B#Q!##9F9FD&9F
+M9I!F9I!(@^P02(D<)$B);"0(2(G[@W\<5TB+1RB+*'8YBW<@A?9X,HGOZ```
+M``!(A<!T)HGOZ`````!(BU,02#D0=`G'0U#\____ZQ2`>!`$=@=(@W@8`'0'
+MQT-0_O___TB+'"1(BVPD"$B#Q!##9F:09F:02(/L$$B)'"1(B6PD"$B)^X-_
+M'$-(BT<HBRAV-HM_((7_>"^%[70RB>_H`````$B%P'0?B>_H`````$B+4Q!(
+M.1!T"<=#4/S____K#8!X$`%T!\=#4/[___](BQPD2(ML)`A(@\00PV9FD&9F
+MD&9FD$B#[!!(B1PD2(EL)`A(B?N#?QP(2(M'*(LH=CA$BT<@187`>"^%[70R
+MB>_H`````$B%P'0?B>_H`````$B+4Q!(.1!T"<=#4/S____K#8!X$`%T!\=#
+M4/[___](BQPD2(ML)`A(@\00PV9F9I!F9I!$BU<<1872>`M$BT\@187)>`+S
+MP\='4/[____#9F9FD$2+7QQ%A=MX!H-_("MW!\='4/[____SPV9F9I!F9F:0
+MBT<<A<!X!H-_(']W!\='4/[____SPV9F9I!F9I!F9I!(@^P02(D<)$B);"0(
+M2(G[2(MO*(M/'+\0````#[95"P^V=0S!X@E`@/X"=#A(8\%(.<=W&T"`[@&+
+M2R"_$````'142&/!2#G'=B5F9I!FD,=#4/[___](BQPD2(ML)`A(@\00PXG0
+M2(UX$.O`9F:0BWT`Z`````!(A<!TTXM]`.@`````2(M3$$@Y$'09QT-0_/__
+M_^O`B=!(C7@02&/!2#G'=ZOKR8!X$`%UHV9FD.NE9F9FD&9F9I!F9I!F9I!(
+M@^P02(D<)$B);"0(2(G[2(MO*(M/'+\4````#[=5$`^V=1+!X@E`@/X"=#A(
+M8\%(.<=W&T"`[@&+2R"_%````'142&/!2#G'=B5F9I!FD,=#4/[___](BQPD
+M2(ML)`A(@\00PXG02(UX%.O`9F:0BWT`Z`````!(A<!TTXM]`.@`````2(M3
+M$$@Y$'09QT-0_/___^O`B=!(C7@42&/!2#G'=ZOKR8!X$`%UHV9FD.NE9F9F
+MD&9F9I!F9I!F9I!(@^P02(D<)$B);"0(2(G[@W\<`TB+1RB+*'8LBT<@A<!X
+M)8GOZ`````!(A<!T&8GOZ`````!(BU,02#D0=!#'0U#\____ZP?'0U#^____
+M2(L<)$B+;"0(2(/$$,-F9I!(@^PH2(EL)`A(B1PD2(G]3(ED)!!,B6PD&$R)
+M="0@2(M/*$AC5QQ$#[8Q1(GP2(T$A00```!(.<)R2(-_(`-V0D4Q[46%]D&\
+M!````'4DD.LXB=_H`````$B+51!(.1!U14&#Q0%)@\0$13GU=!M(BTTH0HL<
+M(8G?Z`````!(A<!US\=%4/[___](BQPD2(ML)`A,BV0D$$R+;"083(MT)"!(
+M@\0HP\=%4/S____KVDB#["A(B6PD"$B)'"1(B?U,B60D$$R);"083(ET)"!(
+MBT\H2&-7'$0/MC%$B?!(C02%!````$@YPG)(@W\@`W9"13'M187V0;P$````
+M=220ZSB)W^@`````2(M5$$@Y$'5%08/%`4F#Q`1%.?5T&TB+32A"BQPAB=_H
+M`````$B%P'7/QT50_O___TB+'"1(BVPD"$R+9"003(ML)!A,BW0D($B#Q"C#
+MQT50_/___^O:2(/L$$B)'"1(B6PD"$B)^X-_'`=(BT<HBRAW%<=#4/[___](
+MBQPD2(ML)`A(@\00PXGOZ`````!(A<!TWXGOZ`````!(BU,02#D0=-;'0U#\
+M____Z\UF9F:09F:09F:0@W\<`TB+1RB+`'832&-7((G`2(T$A00```!(.<)S
+M!\='4/[____SPV9F9I!F9F:04X-_'`)(B?M(BT<H#[8`=C^+5R"%TG@X,?8/
+MMOCH'MS__TB%P$B)PG0F2(M`"$B#N/@`````=!A(BT,02#E"&'0'QT-0_/__
+M_UO#9F:09I#'0U#^____6\-F9F:09F:02(/L$+X<````2(D<)$B);"0(2(G[
+M2(MO*(M7'`^V302`^0)T,DACPD@YQG<5@.D!BU,@O@@```!T34ACPD@YQG8>
+MQT-0_O___TB+'"1(BVPD"$B#Q!##BT482(UP'.O%BWT`Z`````!(A<!TU8M]
+M`.@`````2(M3$$@Y$'0:QT-0_/___^O"BT482(UP"$ACPD@YQG>LZ\B`>!`!
+M=:2`?0<0=Y[KHV9F9I!F9I!F9I!(BW]8,<"%TDB+3RAT'X!Y!`%T'$B-01Q(
+MB48(BT$8QT8$`0```(D&N`$```#SPY!(BT<P2(/`"$B)1@CKWF:02(/L$$B)
+M'"1(B6PD"$B)^XMW'$B+;RB#_@MV=(M7((72>&V`?0<`=7P/MD4&,<G!X`F)
+MP$B->`Q(8\9(.?AR4(G(2&/22(/`!$@YPG)"BWT`Z`````!(A<!T-8M]`.@`
+M````2(M3$$@Y$'0)QT-0_/___^LB@'@0`745#[9%!@^W500!T#T`(```?@MF
+M9F:0QT-0_O___TB+'"1(BVPD"$B#Q!###[9-!K\,````P>$)ZX5F9F:09F:0
+M9F:09F:02(/L$$B)'"1(B6PD"$B)^XMW'$B+;RB#_@=V*XM'((7`>"2%]@^V
+M300/ME4%>!@/MM(/MLE(F`'*P>()B=)(@\((2#G0<Q7'0U#^____2(L<)$B+
+M;"0(2(/$$,.+?0#H`````$B%P'3>BWT`Z`````!(BU,02#D0=`G'0U#\____
+MZ\N`>!`!=;YF9F:09F:0Z[QF9F:09F9FD&9FD&9FD$%4BP4`````28G\54B)
+M]8/X_U-T?HM6&$C'PP````#K"TB#PRB+`X/X_W1G.=!U\8/``71>QT50````
+M`$B)[Y#_4PB+=5"%]G5008"\))`"!```=3Z+2R"%R0^%H````$F#O"3@`0``
+M`'0]28N4)!@"``!)C80D$`(``$F)K"08`@``2(E%`$B)50A(B2I;74%<P\=%
+M4/[___];2(GO3(M=2%U!7$'_XTB#>Q``28FL).`!``!T24B+0QA!QX0DZ`$`
+M``$```!(B>])B:PD^`$``$G'A"0``@```````$F)A"3P`0``_U,008N$).@!
+M``"#Z`&%P$&)A"3H`0``=8Y,BUL82(GO6UU!7$'_XV:02(L'2(V7:`,``,>'
+M$`,```__``#'AQ0#```(````QX<8`P```````$B)ER`#``!(QX<P`P``````
+M`$B)AP@#``"+A^@#``")<@1(QX=``P```````$B-M_@"``")AV@#``!(B[\(
+M`P``Z8+^__]FD%-(B?M(BW\02#F?X`$``'0/2(G?3(M;2%M!_^-F9F:02(NW
+M$`(``$B-AQ`"``!(QX?@`0```````$@YQG332(L62(M&"$B)0@A(B1!(B78(
+M2(DVZ"C^___KMV9FD&9FD(N'Z`,``,-F9I!F9I!F9I!(@^PXB?E)B?!(C50D
+M+$B)YTB)X,8``$B#P`%(.=!U](#Y!XA,)`@/A*L```"`^09T$(#Y!'0+@/D%
+M=`:`^0B0=1@/ME0D#/:&8`(```&X`0````]$PHA$)`R`^1QT88#Y`W0808N`
+MZ`,``$B)YXE$)`3H`````$B#Q#C#28M0($B%TG3?#[:"L````(A$)`R`NK``
+M````=<M(BX*0````2(E'$`^W@I@```")1Q@/MH*Q````T.B#X`&(1"0-ZZ1(
+MBX9H`@``2(E'#`^WAG0#``!FB4<4ZXQ(BT882(7`=`F+@.@#``")1PQ,BT8X
+MZ7'___]F9F:09F:09F:09F:00(@U`````,-F9F:09F9FD$B+5QA(C4\82#G*
+M=0OK+I!(BQ)(.<IT)8"Z@/S__P%(C8)P_/__=>CV0O`!=.*%]G0-2(L2@^X!
+M2#G*==LQP//#9F9FD&9F9I!F9F:09F:02(/L&$B)7"0(3(ED)!!(B?M!B?2+
+M=S1(BS]%B>3H`````$B)QP^V@+$```!(B5]0QH>P````!$B)7UA,B6=@QH>R
+M`````$C'A\@`````````@^#/@\@@B(>Q````2(M<)`A,BV0D$$B#Q!CI````
+M`$B#["A(B1PD3(ED)!!)B?Q,B6PD&$R)="0@28GU2(EL)`A(BR])B=:+=S1(
+MB>_H`````$B-O?````!(B</H`````$C'``````!)BU0D*$B)WTC'0#``````
+M2,=`$`````!(QT`H`````$C'0#@`````2(E0"$B-4!C'0$``````2(E#>$R)
+M8U!(B5`82(E0($R):UC&@[`````$3(FSR````,:#L@````!(BQPD2(ML)`A,
+MBV0D$$R+;"083(MT)"!(@\0HZ0````!F9I!F9I!(@^P82(D<)$B);"0(2(G]
+M3(ED)!"#`@%!B?2+=S1(BS](B=/H`````$B)QT&#_`$/MI>Q````&<!(B6]0
+M@\`"QH>P````!$B)7UB#X`/&A[(`````P>`$@^+/"<*(E[$```"`?1`$=A=(
+M@[V``@```'0-2,>'R`````````#K"TC'A\@`````````Z`````!(BWT`2(L<
+M)$B+;"0(3(MD)!!(@\08Z0````!F9I!FD$B#[#A,B7PD,$R-OQ`!``!,B60D
+M&$F)_$B);"003(EL)"!,B?],B70D*$B)7"0(28GV28G5Z`````!(A<!(B<4/
+MA,,```!)BUPD&$R)8"!)@\08QP`!````3(EP"$R):!!(QT`8`````$PYXW4*
+MZS-(BQM,.>-T*X"[@/S__P%(C;MP_/__=>CV0_`!=.)(B>J^`0```.BU_O__
+M2(L;3#GC==6+10"#Z`&%P(E%`'0C2(M<)`A(BVPD$$R+9"083(ML)"!,BW0D
+M*$R+?"0P2(/$.,-(B>Y,B?_H`````$R)[TV)\TB+7"0(2(ML)!!,BV0D&$R+
+M;"0@3(MT)"A,BWPD,$B#Q#A!_^-(Q\<`````,<#H`````.O%9F9FD&9FD$B#
+M[#A,B7PD,$R-OQ`!``!,B60D&$F)_$B);"003(EL)"!,B?],B70D*$B)7"0(
+M28GV28G5Z`````!(A<!(B<4/A+(```!)BUPD&$R)8"!)@\08QP`!````3(EP
+M"$R):!!(QT`8`````$PYXW0D9I"#NZ#\____2(V[</S__W0*2(GJ,?;HIOW_
+M_TB+&TPYXW7>BT4`@^@!A<")10!T(TB+7"0(2(ML)!!,BV0D&$R+;"0@3(MT
+M)"A,BWPD,$B#Q#C#2(GN3(G_Z`````!,B>]-B?-(BUPD"$B+;"003(MD)!A,
+MBVPD($R+="0H3(M\)#!(@\0X0?_C2,?'`````#'`Z`````#KQ69F9I!F9F:0
+M2(M6.%-(B?M(B7X02(72=`6+1B")`DB)W^AR^/__2(G?6^D`````9F:09F:0
+M9F:0BX;H`P``2(V6:`,``$B)O@@#``#'AA`#```/_P``QX84`P``"````$B)
+MEB`#``#'0@0,````B89H`P``2(V&>@,``,>&&`,```````!(QX8P`P``````
+M`$B)MC@#``!(B88H`P``2,>&0`,```````!(@<;X`@``Z0````!F9I!(BT<0
+M2(FX*`(``$B-L"`"``!(C7A(2,>`(`(```````!(QX`P`@```````.D`````
+M9F9FD&9F9I!F9F:09F:02(M'$$B)N"@"``!(C;`@`@``2(UX2$C'@"`"````
+M````2,>`,`(```````#I`````&9F9I!F9F:09F9FD&9FD$B+1Q!(B;@H`@``
+M2(VP(`(``$B->$A(QX`@`@```````$C'@#`"````````Z0````!F9F:09F9F
+MD&9F9I!F9I!(BT<02(FX*`(``$B-L"`"``!(C7A(2,>`(`(```````!(QX`P
+M`@```````.D`````9F9FD&9F9I!F9F:09F:02(M'$$B)N"@"``!(C;`@`@``
+M2(UX2$C'@"`"````````2,>`,`(```````#I`````&9F9I!F9F:09F9FD&9F
+MD$B+1Q!(B;@H`@``2(VP(`(``$B->$A(QX`@`@```````$C'@#`"````````
+MZ0````!F9F:09F9FD&9F9I!F9I!(BT<02(FX*`(``$B-L"`"``!(C7A(2,>`
+M(`(```````!(QX`P`@```````.D`````9F9FD&9F9I!F9F:09F:02(M'$$B)
+MN"@"``!(C;`@`@``2(UX2$C'@"`"````````2,>`,`(```````#I`````&9F
+M9I!F9F:09F9FD&9FD$B+1Q!(B;@H`@``2(VP(`(``$B->$A(QX`@`@``````
+M`$C'@#`"````````Z0````!F9F:09F9FD&9F9I!F9I!(BT<02(FX*`(``$B-
+ML"`"``!(C7A(2,>`(`(```````!(QX`P`@```````.D`````9F9FD&9F9I!F
+M9F:09F:02(M'$$B)N"@"``!(C;`@`@``2(UX2$C'@"`"````````2,>`,`(`
+M``````#I`````&9F9I!F9F:09F9FD&9FD$B+1Q!(B;@H`@``2(VP(`(``$B-
+M>$A(QX`@`@```````$C'@#`"````````Z0````!F9F:09F9FD&9F9I!F9I!(
MBT<02(FX*`(``$B-L"`"``!(C7A(2,>`(`(```````!(QX`P`@```````.D`
M````9F9FD&9F9I!F9F:09F:02(M'$$B)N"@"``!(C;`@`@``2(UX2$C'@"`"
M````````2,>`,`(```````#I`````&9F9I!F9F:09F9FD&9FD$B+1Q!(B;@H
@@ -6303,420 +4975,404 @@ MD&9FD$B+1Q!(B;@H`@``2(VP(`(``$B->$A(QX`@`@```````$C'@#`"````
M````Z0````!F9F:09F9FD&9F9I!F9I!(BT<02(FX*`(``$B-L"`"``!(C7A(
M2,>`(`(```````!(QX`P`@```````.D`````9F9FD&9F9I!F9F:09F:02(M'
M$$B)N"@"``!(C;`@`@``2(UX2$C'@"`"````````2,>`,`(```````#I````
-M`&9F9I!F9F:09F9FD&9FD$B+1Q!(B;@H`@``2(VP(`(``$B->$A(QX`@`@``
-M`````$C'@#`"````````Z0````!F9F:09F9FD&9F9I!F9I!(BT<02(FX*`(`
-M`$B-L"`"``!(C7A(2,>`(`(```````!(QX`P`@```````.D`````9F9FD&9F
-M9I!F9F:09F:02(M'$$B)N"@"``!(C;`@`@``2(UX2$C'@"`"````````2,>`
-M,`(```````#I`````&9F9I!F9F:09F9FD&9FD$B+1Q!(B;@H`@``2(VP(`(`
-M`$B->$A(QX`@`@```````$C'@#`"````````Z0````!F9F:09F9FD&9F9I!F
-M9I!(BT<02(FX*`(``$B-L"`"``!(C7A(2,>`(`(```````!(QX`P`@``````
-M`.D`````9F9FD&9F9I!F9F:09F:02(M'$$B)N"@"``!(C;`@`@``2(UX2$C'
-M@"`"````````2,>`,`(```````#I`````&9F9I!F9F:09F9FD&9FD$B+1Q!(
-MB;@H`@``2(VP(`(``$B->$A(QX`@`@```````$C'@#`"````````Z0````!F
-M9F:09F9FD&9F9I!F9I!(BT<02(FX*`(``$B-L"`"``!(C7A(2,>`(`(`````
-M``!(QX`P`@```````.D`````9F9FD&9F9I!F9F:09F:02(M'$$B)N"@"``!(
-MC;`@`@``2(UX2$C'@"`"````````2,>`,`(```````#I`````&9F9I!F9F:0
-M9F9FD&9FD$B+1Q!(B;@H`@``2(VP(`(``$B->$A(QX`@`@```````$C'@#`"
-M````````Z0````!F9F:09F9FD&9F9I!F9I!(BT<02(FX*`(``$B-L"`"``!(
-MC7A(2,>`(`(```````!(QX`P`@```````.D`````9F9FD&9F9I!F9F:09F:0
-M2(M'$$B)N"@"``!(C;`@`@``2(UX2$C'@"`"````````2,>`,`(```````#I
-M`````&9F9I!F9F:09F9FD&9FD$C'1R@`````2(E_,$B-=RA(QT<X`````$B+
-M/TB#QTCI`````&9F9I!F9F:09F9FD$B+1PA(QT<P`````$B-=S!(B7\X2,='
-M0`````!(BSA(@\=(Z0````!F9F:09F9FD%.`O[(````!2(G[=!0/MH>S````
-M@\`!/`*(A[,```!V/TB+.TB+<WA(@<?P````Z`````!(BSM(QT,H`````$B-
-M<RA(B5LP2,=#.`````!;2(/'2.D`````9F9FD&9FD$B+1WC&A[(`````2,=`
-M$`````!(BT=X2(U0&$C'0"@`````2,=`,`````!(QT`X`````,=`0`````!(
-MB5`82(E0(%OI`````&9F9I!F9F:02(M'6(L0@^H!A=*)$'4D2,='*`````!(
-MB7\P2(UW*$C'1S@`````2(L_2(/'6.D`````Z0````!F9F:09F9FD$B#[!A(
-MB1PD2(EL)`A,B60D$$B+1U!(BY"``@``2(MJ"$@YQ0^$F````$B%[70)]H6`
-M`P```7482(L<)$B+;"0(3(MD)!!(@\08Z7'___^03(MG6`^VG[$```#H````
-M`$B+?0"+=33`ZP3H`````$B)QP^V@+$```"#XP/!XP1(B6]0QH>P````!$R)
-M9UC&A[(`````2,>'R`````````"#X,\)V(B'L0```$B+'"1(BVPD"$R+9"00
-M2(/$&.D`````2(MJ$.E?____9F:09I!(@^P83(ED)!!(B5PD"$F)_$B+7UA(
-MBWL0_U,(28L\)$B)WDB!QQ`!``#H`````$R)YTB+7"0(3(MD)!!(@\08Z0``
-M``!F9F:09F9FD&9FD$%428G\55-(@>S`````2(MO4$B-M"2`````2(M=>$B+
-M16A(B[V`````_U!X2(M#"$B)YDB+>Q#_4#A(C8PDM````$B-E"2X````2(VT
-M)+P```!(B=_H9LK___:$)(H````"=&R+E"2T````#[:$)(P````!PD&`O"2R
-M`````71@B[0DO````$C'QP`````QP.@`````2(GNOQH```#H`````$B+?0!)
-MBW0D6$B!QY````#H`````$R)Y^@`````2('$P````%M=05S#9F:09I"+E"2X
-M````ZY)F9F:09F:0B[0DO````$C'QP`````QP.@`````2(GNOQL```#H````
-M`.N>9F9FD&9F9I!F9F:02(/L&$B)7"0(2(EL)!!(BU]82(M#"$B+*.@`````
-M2(US,$C'0S``````2(E;.$B-?4A(QT-``````$B+7"0(2(ML)!!(@\08Z0``
-M``!F9I!(@^PX2(E<)`A(B6PD$$B)^TR)9"083(EL)"!,B70D*$R)?"0P@+^R
-M`````4B+;UA,BR],BW4(3(ME$$V+O>`!``!T&`^VA[,```"#P`$\`HB'LP``
-M``^&UP```$B+<WA)C;WP````Z`````!(B=_H`````$V%Y$F+5S`/A)\```!!
-MBX0DZ`,``(D"@\`!#X22````08".80(```1)B:PD@`(``$B-51A!@(PD80(`
-M``1)C44H2(UU,$&`I"1@`@``_4F)KH`"``!)C7U(28M-,$B)11A)B54P2(D1
-M2(E-($C'13``````2(EM.$C'14``````2(M<)`A(BVPD$$R+9"083(ML)"!,
-MBW0D*$R+?"0P2(/$..D`````9F:09I#'`O____]!QT=0_____^EA____2(M'
-M>,:'L@````!(QT`0`````$B+1WA(C5`82,=`*`````!(QT`P`````$C'0#@`
-M````QT!``````$B)4!A(B5`@2(M<)`A(BVPD$$R+9"083(ML)"!,BW0D*$R+
-M?"0P2(/$..D`````9F9FD$%7059)B?Y!54%455-(@^P(2(MO*$R+;S"+?0#H
-M``````^V300/MG4%28G$0<=&4/____\/ME4&@/H+#X>O````@'T'"P^'I0``
-M``^VP8E$)`0/ML(#1"0$@_@+?@>Y"P```"C108A-!`^V30=`#[;6#[;!`="#
-M^`M^"+X+````0"C.08!]!`!-C7T(08AU!0^$B0```#';ZP]F9I!F9I"#PP%!
-M.%T$=G9)BW0D4`^V109(B=E(P>$)0;@!````N@$```"!X0#^`0!,B>=(@>X`
-M``(`3`'Y2('F``#^_T@!Q@^VPT@!QN@`````A<!TL$G'1E@`````38EV8$F-
-M=EA)QT9H`````$F+?A!(@\0(6UU!7$%=05Y!7^D`````08!]!0!T4S';ZP]F
-M9I!F9I"#PP%!.%T%=D`/MG4'#[;+`TPD!$D#="10#[;#0;@!````N@$```!,
-MB>?!X0E(8\E(C;0&`/C__TP!^>@`````A<!TO.EW____0<=&4`````#I:O__
-M_V9F9I!F9I!F9I!!5D%5051)B?Q54TB+7RB+.TR-<PSH`````$F)Q4F+1"0P
-MQP``````0<=$)%``````@'L'`'0'28G&28/&!(![!@!T9S'MZPF#Q0%`.&L&
-M=EI)BT50#[=S!$B)Z40/MD,'2,'A";H!````@>$`_@$`3(GO2"T```(`3`'Q
-M2"4``/[_2(UT!@M`#[;%2`'&Z`````"%P'2Q28M$)##'`/____]!QT0D4/__
-M__])QT0D6`````!-B60D8$F-="182<=$)&@`````28M\)!!;74%<05U!7ND`
-M````9F9FD&9FD%.`O[(````!2(M?6$B+2S!T/H"_D@````!U-<=#4/_____H
-M`````$C'0U@`````2(E;8$B-<UA(QT-H`````$B+>Q!;Z0````!F9F:09F:0
-MQT-0``````^VAY(```"$P(@!=1R+AY0```")001(BU,X2(72=*R+002#P`B)
-M`NNB#[:'D0```(E!!.OA9F9FD$B![,@```!(B:PDH````$B)G"28````2(G]
-M3(FD)*@```!,B:PDL````$R)M"2X````3(F\),````!(BT<H#[90`@^V"(#Z
-M`P^$*0$``(#Z!`^$20$``(!X`05V!H!X!?YT?P^V^3'VZ)/#__](B<-(BT40
-M2(M52$B)[DC'14@`````2(FH*`(``$B)D"`"``!(QX`P`@```````$B+0PA(
-MBWL0_Y#X````2(N<))@```!(BZPDH````$R+I"2H````3(NL)+````!,B[0D
-MN````$R+O"3`````2('$R````,-$BW<@,?8/MOE,C7@+1`^V8`OH!\/__TB%
-MP$B)PW0_2(M#"$B+@`@!``!(A<!T$DB+>Q#_T$0XX`^'ZP```$$HQ$B+&TB%
-MVW052(M#"$B+>Q!(B>;_4#B`?"03`'3!2(M%.,<``````$B+?1!(C758QT50
-M_____TC'15@`````2(EM8$C'16@`````Z`````#I,____P^V0`1(C;0DC```
-M``^V^8F$)(P```#H;L+__TB)P^G6_O__9F:09F:0,?8/MOE,C7`#1`^V8`/H
-M3<+__TB%P$B)PW4MZXUF9I!!*,1(BQM(A=L/A'O___](BT,(2(M[$$B)YO]0
-M.(!\)!,`#X5B____2(M#"$B+@`@!``!(A<!TRTB+>Q#_T$0XX':]18@FZ67^
-M__]%B"=(BT4X1(DPZ5;^__]F9I!F9I!(BU<02(UW6$B)?V!(QT=H`````$B+
-M@B`"``!(QT=8`````$B)1TA(B=?I`````)!!5T4QP$%6055)B?U!5%532('L
-MJ````$B+1RA(BRT`````BP!(A>V)1"0<2(M','1I3(UX!$R-="0@13'D2(M=
-M$$B%VW4.ZT5!@\0!2(L;2(7;=#E(BT,(1(E$)`A,B?9(BWL0_U`X@'PD,P!$
-MBT0D"'3923EM$'7/08/``40Y1"0<18DG=@])@\<$Z[M(BVT`2(7M=:=)BT4P
-M28M]$$F-=5A)QT58`````$V);6!)QT5H`````$2)`.@`````2('$J````%M=
-M05Q!74%>05_#BS4`````.S4`````2(M/,`^$B@```$ACQDB-%(!(C1102(L$
-ME0````!(B0%(BP25`````$B)00A(BP25`````$B)01!(BP25`````$B)01A(
-MBP25`````$B)02"+!)4`````B4$HC48!B<+!^A_!ZAP!T(/@#RG0B04`````
-M2,='6`````!(B7]@2(UW6$C'1V@`````2(M_$.D`````D,='4/_____KU69F
-M9I!F9I!(@^PH,?9(B5PD"$B);"002(G[3(ED)!A,B6PD($B+1RB+.$2+:`2+
-M:`A$BV`,Z/V___](A<!(B<%T?(7M=%A(BU,H2(M`"$4QP$B+>1!$B>Y$B>%(
-M@\(0_Y`P`0``2(M[$$B-<UA(QT-8`````$B)6V!(QT-H`````$B+7"0(2(ML
-M)!!,BV0D&$R+;"0@2(/$*.D`````2(MY$$B+4S!!N`$```!(BT`(1(GA1(GN
-M_Y`P`0``ZZ?'0U#^____ZYY5,?932(G[2('LB````$B+1RB+..A7O___2(7`
-M2(G"2(MK,'1+2(M`"$B)YDB+>A#_4#@/MT0D!&:)10`/MT0D!F:)10)(BWL0
-M2(US6$C'0U@`````2(E;8$C'0V@`````Z`````!(@<2(````6UW#QT-0_O__
-M_^O,9F9FD&9FD$B#["A(B6PD$$R)9"082(G]2(E<)`A,B6PD($B+1RA,BV\P
-MBQA,C6`$B=^#ZP'H`````(/[_4B)Q[@`````2`]'^$$/MD0D"H3`=0E!#[9$
-M)`[`Z`1%#[9$)`Y!#[9T)`P/ML!!#[94)`U)C4PD?$&)P4&#X`_HQ<7__TB+
-M?1!(C75828E%`$C'15@`````2(EM8$C'16@`````2(M<)`A(BVPD$$R+9"08
-M3(ML)"!(@\0HZ0````!F9F:09F9FD$B#["A,B60D"$R)="0828G\2(D<)$R)
-M;"003(E\)"!,BV\H3(M_,$&+70!-C74$B=^#ZP'H`````$4/MD8"00^V=02#
-M^_U!#[96`4B)QTF-372X`````$@/1_A%,<E!@^`/Z!G%__])BWPD$$F-="18
-M28D'2<=$)%@`````38ED)&!)QT0D:`````!(BQPD3(MD)`A,BVPD$$R+="08
-M3(M\)"!(@\0HZ0````!F9F:04TB+1RA(BU\P1(L03(U;!$6%TGY]3(L-````
-M`$V%R71Q13'`28M)&$F-<1A(.?%U"NM52(L)2#GQ=$V`N8#\__\!2(V!</S_
-M_W7HBX#H`P``26/008/``44YPD&)!)-UTD2)P$C'1U@`````2(E_8$B-=UA(
-MQT=H`````(D#6TB+?Q#I`````$V+"4V%R764Z\\QP.O.9F9FD&9FD&9FD%53
-M2(M'*$B+;S!$BQA(C5T$187;#X[(````3(L5`````$V%T@^$N````$4QR4F+
-M2AA-C4(83#G!=1+IDP```)!(BPE,.<$/A(8```!(@[F(_/__`$B-L7#\__]U
-MXP^V@8#\__\\!'972(N!\/[__TB%P'0-2(-X"`!T!D@Y<!!TOXN&Z`,``$EC
-MT4&#P0&)!)-%.=EUJD2)R$C'1U@`````2(E_8$B-=UA(QT=H`````(E%`%M=
-M2(M_$.D`````+`%USO:!U/S__P)TQ69F9I#KKTV+$DV%T@^%3____V:0Z[0Q
-MP.NS9F9FD&9FD&9FD$%7,?9!5D%5051)B?Q54TB![(@```!(BT<H3(MW,(LX
-MBV@$1(MX".C$N___2(7`2(G#0<=$)%#_____=#QF9I!(BT,(2(N`"`$``$B%
-MP'0,2(M[$/_0.<5\5RG%2(L;2(7;=!5(BT,(2(M[$$B)YO]0.(!\)!,`=,=)
+M`&9F9I!F9F:09F9FD&9FD$C'1R@`````2(E_,$B-=RA(QT<X`````$B+/TB#
+MQTCI`````&9F9I!F9F:09F9FD$B+1PA(QT<P`````$B-=S!(B7\X2,='0```
+M``!(BSA(@\=(Z0````!F9F:09F9FD%.`O[(````!2(G[=!0/MH>S````@\`!
+M/`*(A[,```!V/TB+.TB+<WA(@<?P````Z`````!(BSM(QT,H`````$B-<RA(
+MB5LP2,=#.`````!;2(/'2.D`````9F9FD&9FD$B+1WC&A[(`````2,=`$```
+M``!(BT=X2(U0&$C'0"@`````2,=`,`````!(QT`X`````,=`0`````!(B5`8
+M2(E0(%OI`````&9F9I!F9F:02(M'6(L0@^H!A=*)$'4D2,='*`````!(B7\P
+M2(UW*$C'1S@`````2(L_2(/'6.D`````Z0````!F9F:09F9FD$B#[!A(B1PD
+M2(EL)`A,B60D$$B+1U!(BY"``@``2(MJ"$@YQ0^$F````$B%[70)]H6``P``
+M`7482(L<)$B+;"0(3(MD)!!(@\08Z7'___^03(MG6`^VG[$```#H`````$B+
+M?0"+=33`ZP3H`````$B)QP^V@+$```"#XP/!XP1(B6]0QH>P````!$R)9UC&
+MA[(`````2,>'R`````````"#X,\)V(B'L0```$B+'"1(BVPD"$R+9"002(/$
+M&.D`````2(MJ$.E?____9F:09I!(@^P83(ED)!!(B5PD"$F)_$B+7UA(BWL0
+M_U,(28L\)$B)WDB!QQ`!``#H`````$R)YTB+7"0(3(MD)!!(@\08Z0````!F
+M9F:09F9FD&9FD$%428G\55-(@>S`````2(MO4$B-M"2`````2(N=@````$B+
+M17!(B[V(````_U!X2(M#"$B)YDB+>Q#_4#A(C8PDM````$B-E"2X````2(VT
+M)+P```!(B=_H8\K___:$)(X````"=&F+E"2T````#[:$))`````!PD&`O"2R
+M`````71=B[0DO````$C'QP`````QP.@`````2(GNOQH```#H`````$B+?0!)
+MBW0D6$B!QY````#H`````$R)Y^@`````2('$P````%M=05S#9I"+E"2X````
+MZY5F9F:09F:0B[0DO````$C'QP`````QP.@`````2(GNOQL```#H`````.NA
+M9F9FD&9F9I!F9F:02(/L&$B)7"0(2(EL)!!(BU]82(M#"$B+*.@`````2(US
+M,$C'0S``````2(E;.$B-?4A(QT-``````$B+7"0(2(ML)!!(@\08Z0````!F
+M9I!(@^PX2(E<)`A(B6PD$$B)^TR)9"083(EL)"!,B70D*$R)?"0P@+^R````
+M`4B+;UA,BR],BW4(3(ME$$V+O>`!``!T&`^VA[,```"#P`$\`HB'LP````^&
+MUP```$B+<WA)C;WP````Z`````!(B=_H`````$V%Y$F+5S`/A)\```!!BX0D
+MZ`,``(D"@\`!#X22````08".80(```1)B:PD@`(``$B-51A!@(PD80(```1)
+MC44H2(UU,$&`I"1@`@``_4F)KH`"``!)C7U(28M-,$B)11A)B54P2(D12(E-
+M($C'13``````2(EM.$C'14``````2(M<)`A(BVPD$$R+9"083(ML)"!,BW0D
+M*$R+?"0P2(/$..D`````9F:09I#'`O____]!QT=0_____^EA____2(M'>,:'
+ML@````!(QT`0`````$B+1WA(C5`82,=`*`````!(QT`P`````$C'0#@`````
+MQT!``````$B)4!A(B5`@2(M<)`A(BVPD$$R+9"083(ML)"!,BW0D*$R+?"0P
+M2(/$..D`````9F9FD$%7059)B?Y!54%455-(@^P(2(MO*$R+;S"+?0#H````
+M``^V300/MG4%28G$0<=&4/____\/ME4&@/H+#X>O````@'T'"P^'I0````^V
+MP8E$)`0/ML(#1"0$@_@+?@>Y"P```"C108A-!`^V30=`#[;6#[;!`="#^`M^
+M"+X+````0"C.08!]!`!-C7T(08AU!0^$B0```#';ZP]F9I!F9I"#PP%!.%T$
+M=G9)BW0D4`^V109(B=E(P>$)0;@!````N@$```"!X0#^`0!,B>=(@>X```(`
+M3`'Y2('F``#^_T@!Q@^VPT@!QN@`````A<!TL$G'1E@`````38EV8$F-=EA)
+MQT9H`````$F+?A!(@\0(6UU!7$%=05Y!7^D`````08!]!0!T4S';ZP]F9I!F
+M9I"#PP%!.%T%=D`/MG4'#[;+`TPD!$D#="10#[;#0;@!````N@$```!,B>?!
+MX0E(8\E(C;0&`/C__TP!^>@`````A<!TO.EW____0<=&4`````#I:O___V9F
+M9I!F9I!F9I!!5D%5051)B?Q54TB+7RB+.TR-<PSH`````$F)Q4F+1"0PQP``
+M````0<=$)%``````@'L'`'0'28G&28/&!(![!@!T9S'MZPF#Q0%`.&L&=EI)
+MBT50#[=S!$B)Z40/MD,'2,'A";H!````@>$`_@$`3(GO2"T```(`3`'Q2"4`
+M`/[_2(UT!@M`#[;%2`'&Z`````"%P'2Q28M$)##'`/____]!QT0D4/____])
+MQT0D6`````!-B60D8$F-="182<=$)&@`````28M\)!!;74%<05U!7ND`````
+M9F9FD&9FD%.`O[(````!2(M?6$B+2S!T/H"_D@````!U-<=#4/_____H````
+M`$C'0U@`````2(E;8$B-<UA(QT-H`````$B+>Q!;Z0````!F9F:09F:0QT-0
+M``````^VAY(```"$P(@!=1R+AY0```")001(BU,X2(72=*R+002#P`B)`NNB
+M#[:'D0```(E!!.OA9F9FD$B![,@```!(B:PDH````$B)G"28````2(G]3(FD
+M)*@```!,B:PDL````$R)M"2X````3(F\),````!(BT<H#[90`@^V"(#Z`P^$
+M*0$``(#Z!`^$20$``(!X`05V!H!X!?YT?P^V^3'VZ)/#__](B<-(BT402(M5
+M2$B)[DC'14@`````2(FH*`(``$B)D"`"``!(QX`P`@```````$B+0PA(BWL0
+M_Y#X````2(N<))@```!(BZPDH````$R+I"2H````3(NL)+````!,B[0DN```
+M`$R+O"3`````2('$R````,-$BW<@,?8/MOE,C7@+1`^V8`OH!\/__TB%P$B)
+MPW0_2(M#"$B+@`@!``!(A<!T$DB+>Q#_T$0XX`^'ZP```$$HQ$B+&TB%VW05
+M2(M#"$B+>Q!(B>;_4#B`?"03`'3!2(M%.,<``````$B+?1!(C758QT50____
+M_TC'15@`````2(EM8$C'16@`````Z`````#I,____P^V0`1(C;0DC`````^V
+M^8F$)(P```#H;L+__TB)P^G6_O__9F:09F:0,?8/MOE,C7`#1`^V8`/H3<+_
+M_TB%P$B)PW4MZXUF9I!!*,1(BQM(A=L/A'O___](BT,(2(M[$$B)YO]0.(!\
+M)!,`#X5B____2(M#"$B+@`@!``!(A<!TRTB+>Q#_T$0XX':]18@FZ67^__]%
+MB"=(BT4X1(DPZ5;^__]F9I!F9I!(BU<02(UW6$B)?V!(QT=H`````$B+@B`"
+M``!(QT=8`````$B)1TA(B=?I`````)!!5T4QP$%6055)B?U!5%532('LJ```
+M`$B+1RA(BRT`````BP!(A>V)1"0<2(M','1I3(UX!$R-="0@13'D2(M=$$B%
+MVW4.ZT5!@\0!2(L;2(7;=#E(BT,(1(E$)`A,B?9(BWL0_U`X@'PD,P!$BT0D
+M"'3923EM$'7/08/``40Y1"0<18DG=@])@\<$Z[M(BVT`2(7M=:=)BT4P28M]
+M$$F-=5A)QT58`````$V);6!)QT5H`````$2)`.@`````2('$J````%M=05Q!
+M74%>05_#BS4`````.S4`````2(M/,`^$B@```$ACQDB-%(!(C1102(L$E0``
+M``!(B0%(BP25`````$B)00A(BP25`````$B)01!(BP25`````$B)01A(BP25
+M`````$B)02"+!)4`````B4$HC48!B<+!^A_!ZAP!T(/@#RG0B04`````2,='
+M6`````!(B7]@2(UW6$C'1V@`````2(M_$.D`````D,='4/_____KU69F9I!F
+M9I!(@^PH,?9(B5PD"$B);"002(G[3(ED)!A,B6PD($B+1RB+.$2+:`2+:`A$
+MBV`,Z/V___](A<!(B<%T?(7M=%A(BU,H2(M`"$4QP$B+>1!$B>Y$B>%(@\(0
+M_Y`P`0``2(M[$$B-<UA(QT-8`````$B)6V!(QT-H`````$B+7"0(2(ML)!!,
+MBV0D&$R+;"0@2(/$*.D`````2(MY$$B+4S!!N`$```!(BT`(1(GA1(GN_Y`P
+M`0``ZZ?'0U#^____ZYY5,?932(G[2('LB````$B+1RB+..A7O___2(7`2(G"
+M2(MK,'1+2(M`"$B)YDB+>A#_4#@/MT0D!&:)10`/MT0D!F:)10)(BWL02(US
+M6$C'0U@`````2(E;8$C'0V@`````Z`````!(@<2(````6UW#QT-0_O___^O,
+M9F9FD&9FD$B#["A(B6PD$$R)9"082(G]2(E<)`A,B6PD($B+1RA,BV\PBQA,
+MC6`$B=^#ZP'H`````(/[_4B)Q[@`````2`]'^$$/MD0D"H3`=0E!#[9$)`[`
+MZ`1%#[9$)`Y!#[9T)`P/ML!!#[94)`U)C4PD?$&)P4&#X`_HQ<7__TB+?1!(
+MC75828E%`$C'15@`````2(EM8$C'16@`````2(M<)`A(BVPD$$R+9"083(ML
+M)"!(@\0HZ0````!F9F:09F9FD$B#["A,B60D"$R)="0828G\2(D<)$R);"00
+M3(E\)"!,BV\H3(M_,$&+70!-C74$B=^#ZP'H`````$4/MD8"00^V=02#^_U!
+M#[96`4B)QTF-372X`````$@/1_A%,<E!@^`/Z!G%__])BWPD$$F-="1828D'
+M2<=$)%@`````38ED)&!)QT0D:`````!(BQPD3(MD)`A,BVPD$$R+="083(M\
+M)"!(@\0HZ0````!F9F:04TB+1RA(BU\P1(L03(U;!$6%TGY]3(L-`````$V%
+MR71Q13'`28M)&$F-<1A(.?%U"NM52(L)2#GQ=$V`N8#\__\!2(V!</S__W7H
+MBX#H`P``26/008/``44YPD&)!)-UTD2)P$C'1U@`````2(E_8$B-=UA(QT=H
+M`````(D#6TB+?Q#I`````$V+"4V%R764Z\\QP.O.9F9FD&9FD&9FD%532(M'
+M*$B+;S!$BQA(C5T$187;#X[(````3(L5`````$V%T@^$N````$4QR4F+2AA-
+MC4(83#G!=1+IDP```)!(BPE,.<$/A(8```!(@[F(_/__`$B-L7#\__]UXP^V
+M@8#\__\\!'972(N!\/[__TB%P'0-2(-X"`!T!D@Y<!!TOXN&Z`,``$ECT4&#
+MP0&)!)-%.=EUJD2)R$C'1U@`````2(E_8$B-=UA(QT=H`````(E%`%M=2(M_
+M$.D`````+`%USO:!V/S__P)TQ69F9I#KKTV+$DV%T@^%3____V:0Z[0QP.NS
+M9F9FD&9FD&9FD$%7,?9!5D%5051)B?Q54TB![(@```!(BT<H3(MW,(LXBV@$
+M1(MX".C$N___2(7`2(G#0<=$)%#_____=#QF9I!(BT,(2(N`"`$``$B%P'0,
+M2(M[$/_0.<5\5RG%2(L;2(7;=!5(BT,(2(M[$$B)YO]0.(!\)!,`=,=)BWPD
+M$$F-="182<=$)%@`````38ED)&!)QT0D:`````#H`````$B!Q(@```!;74%<
+M05U!7D%?PTB+0P@QR4B+>Q!-B?!$B?J)[O^0*`$``(7`=:Q!QT0D4`````#K
+MH69F9I!F9F:005<Q]D%6055!5$F)_%532('LB````$B+1RA,BW\PBSB+:`3H
+MZ+K__TB%P$B)PT''1"10_____W1#13'M9F9FD$B+0PA(BX`(`0``2(7`=`](
+MBWL0_]`YQ7Q:*<5!`<5(BQM(A=MT%4B+0PA(BWL02(GF_U`X@'PD$P!TQ$F+
+M?"0028UT)%A)QT0D6`````!-B60D8$G'1"1H`````.@`````2('$B````%M=
+M05Q!74%>05_#2(M#"$B+@"@!``!(A<!TN$4QP#'22(M[$$R)^8GN_]"%P'6D
+M00^V1P(\_W0'1`'H08A'`D''1"10`````.N)9F9FD&9FD&9FD&9FD$%7,?9!
+M5D%5051)B?Q54TB![(@```!(BT<H3(M_,(LXBV@$Z.BY__](A<!(B<-!QT0D
+M4/____]T0T4Q[69F9I!(BT,(2(N`"`$``$B%P'0/2(M[$/_0.<5\6BG%00'%
+M2(L;2(7;=!5(BT,(2(M[$$B)YO]0.(!\)!,`=,1)BWPD$$F-="182<=$)%@`
+M````38ED)&!)QT0D:`````#H`````$B!Q(@```!;74%<05U!7D%?PTB+0PA(
+MBX`@`0``2(7`=+A(BWL03(GZB>[_T(7`=:E!#[9'`CS_=`=$`>A!B$<"0<=$
+M)%``````ZXYFD$%7,?9!5D%5051)B?Q54TB![(@```!(BT<H3(M_,(LXBV@$
+MZ/BX__](A<!(B<-!QT0D4/____]T0T4Q[69F9I!(BT,(2(N`"`$``$B%P'0/
+M2(M[$/_0.<5\6BG%00'%2(L;2(7;=!5(BT,(2(M[$$B)YO]0.(!\)!,`=,1)
MBWPD$$F-="182<=$)%@`````38ED)&!)QT0D:`````#H`````$B!Q(@```!;
-M74%<05U!7D%?PTB+0P@QR4B+>Q!-B?!$B?J)[O^0*`$``(7`=:Q!QT0D4```
-M``#KH69F9I!F9F:005<Q]D%6055!5$F)_%532('LB````$B+1RA,BW\PBSB+
-M:`3HZ+K__TB%P$B)PT''1"10_____W1#13'M9F9FD$B+0PA(BX`(`0``2(7`
-M=`](BWL0_]`YQ7Q:*<5!`<5(BQM(A=MT%4B+0PA(BWL02(GF_U`X@'PD$P!T
-MQ$F+?"0028UT)%A)QT0D6`````!-B60D8$G'1"1H`````.@`````2('$B```
-M`%M=05Q!74%>05_#2(M#"$B+@"@!``!(A<!TN$4QP#'22(M[$$R)^8GN_]"%
-MP'6D00^V1P(\_W0'1`'H08A'`D''1"10`````.N)9F9FD&9FD&9FD&9FD$%7
-M,?9!5D%5051)B?Q54TB![(@```!(BT<H3(M_,(LXBV@$Z.BY__](A<!(B<-!
-MQT0D4/____]T0T4Q[69F9I!(BT,(2(N`"`$``$B%P'0/2(M[$/_0.<5\6BG%
-M00'%2(L;2(7;=!5(BT,(2(M[$$B)YO]0.(!\)!,`=,1)BWPD$$F-="182<=$
-M)%@`````38ED)&!)QT0D:`````#H`````$B!Q(@```!;74%<05U!7D%?PTB+
-M0PA(BX`@`0``2(7`=+A(BWL03(GZB>[_T(7`=:E!#[9'`CS_=`=$`>A!B$<"
-M0<=$)%``````ZXYFD$%7,?9!5D%5051)B?Q54TB![(@```!(BT<H3(M_,(LX
-MBV@$Z/BX__](A<!(B<-!QT0D4/____]T0T4Q[69F9I!(BT,(2(N`"`$``$B%
-MP'0/2(M[$/_0.<5\6BG%00'%2(L;2(7;=!5(BT,(2(M[$$B)YO]0.(!\)!,`
-M=,1)BWPD$$F-="182<=$)%@`````38ED)&!)QT0D:`````#H`````$B!Q(@`
-M``!;74%<05U!7D%?PTB+0PA(BX`8`0``2(7`=+A(BWL03(GZB>[_T(7`=:E!
-M#[9'`CS_=`=$`>A!B$<"0<=$)%``````ZXYFD$%7,?9!5D%5051)B?Q54TB!
-M[(@```!(BT<H3(M_,(LXBV@$Z`BX__](A<!(B<-!QT0D4/____]T0T4Q[69F
-M9I!(BT,(2(N`"`$``$B%P'0/2(M[$/_0.<5\6BG%00'%2(L;2(7;=!5(BT,(
-M2(M[$$B)YO]0.(!\)!,`=,1)BWPD$$F-="182<=$)%@`````38ED)&!)QT0D
-M:`````#H`````$B!Q(@```!;74%<05U!7D%?PTB+0PA(BX`0`0``2(7`=+A(
-MBWL03(GZB>[_T(7`=:E!#[9'`CS_=`=$`>A!B$<"0<=$)%``````ZXYFD$%5
-M,?9!5%5(B?U32('LB````$B+1RB+..@CM___,=)(A<!(B<-T0D4QY&9FD&9F
-MD$B+0PA(BX`(`0``2(7`=`E(BWL0_]!!`<1(BQM(A=MT%4B+0PA(BWL02(GF
-M_U`X@'PD$P!TRD2)XDB+13!(BWT02(UU6$C'15@`````2(EM8$C'16@`````
-MB1#H`````$B!Q(@```!;74%<05W#9I!32(M'*$B)^TB+5S"+<`2+..BZN/__
-MA<!T!\=#4/____](QT-8`````$B)6V!(C7-82,=#:`````!(BWL06^D`````
-M9F9FD&9FD&9FD&9FD%5(B?TQ]E-(@>R(````2(M'*$B+7S"+..@SMO__2(7`
-M2(G"='\QP,8$&`!(@\`!2(/X1'7R2(G@2(V,)(````#&``!(@\`!2#G(=>Q(
-MBT((2(MZ$$B)YO]0.`^V1"1QB`,/MD0D<HA#`0^V1"1SB$,"#[9$)'2(0P-(
-MBWT02(UU6$C'15@`````2(EM8$C'16@`````Z`````!(@<2(````6UW#QT50
-M_____^O,9F:02(/L&$B)7"0(3(ED)!!(B?M,BV<PZ%:W__](BWL02(US6$C'
-M0U@`````08D$)$B)6V!(QT-H`````$B+7"0(3(MD)!!(@\08Z0````!F9I!5
-M2,?&`````%-(B?M(@^P(2(MO*$B)[^CDM/__A<!U,0^V12"(!0````!(QT-8
-M`````$B)6V!(C7-82,=#:`````!(BWL02(/$"%M=Z0````!(Q\8`````2(GO
-MZ*"T__^%P'43#[9%((T$Q7#^__^)!0````#KLTC'Q@````!(B>_H>K3__X7`
-M=$I(Q\8`````2(GOZ&>T__^%P'5&2(M[$$C'AR`"````````2(F?*`(``$C'
-MAS`"````````2(/$"%M=2(VW(`(``$B#QTCI``````^V12"(!0````#I1___
-M_TC'Q@````!(B>_H#K3__X7`=1%(BWL02,>'(`(```````#KI<=#4/_____I
-M%____V9F9I!F9I!F9I!F9I!(BT<P2,='6`````!(C7=82(E_8$C'1V@`````
-M2(M_$,<````!`ND`````9F:09I!!5D%505152(G]4TB#[$!(BT4H2(M_$,9$
-M)#`'@'@@`4R-9Q@9P(/``HA$)#A(BU\83#GC="5,C70D,&9FD&:0]D/P`70)
-M@+N`_/__`70]2(L;3#GC=>E(BWT02(UU6,=%4`````!(QT58`````$B);6!(
-MQT5H`````.@`````2(/$0%M=05Q!74%>PTB+@]C\__](B[OP_/__2(GF_U!X
-M#[9$)`\Z1"0X=*1(BX/8_/__2(N[\/S__TR)]O^0P````.N+9F9FD&9F9I!F
-M9F:02(/L*$B)'"1,B60D$$B)^TB);"0(3(EL)!A,B70D($B+;UA,BS=(BT4H
-M1(LH1(GOZ`````"`N[(````!28G$=!@/MH.S````@\`!/`*(@[,````/AI<`
-M``!(BW-X28V^\````.@`````2(G?Z`````"+11@]*?\``'1E/3G_``!T7DV%
-MY'0/28L$)$PY\&:0#X3`````2(M]$$B-=5C'15#^____2,=%6`````!(B6U@
-M2,=%:`````!(BQPD2(ML)`A,BV0D$$R+;"083(MT)"!(@\0HZ0````!F9I!F
-M9I!(BT4P1(DHZYEF9F:09F:02(M#>,:#L@````!(B=](QT`0`````$B+0WA(
-MC5`82,=`*`````!(QT`P`````$C'0#@`````QT!``````$B)4!A(B5`@2(L<
-M)$B+;"0(3(MD)!!,BVPD&$R+="0@2(/$*.D`````2(VP(`(``$B->$A(QX`@
-M`@```````$B)J"@"``!(QX`P`@```````$B+'"1(BVPD"$R+9"003(ML)!A,
-MBW0D($B#Q"CI`````)!(BS=(@<;H`0``Z0````"02(/L"$B+1RB+..@`````
-M2(/$"$B)Q^O89F9FD&9F9I!(@^P(2(M'*(LXZ`````!(@\0(2(G'Z[AF9F:0
-M9F9FD$B#[`A(BT<H@'@$`8LX=`5(@\0(P^@`````2(/$"$B)Q^N-9F9FD&9F
-MD&9FD&9FD$%528G]05154TB#[`A(BT<HBQ!F]\(`_W5$08G408'D_P```'XX
-M,>V[!````.L%D$F+12B+/!CH`````$B%P'01@'@0!'8+2(.X@`(```"0=!>#
-MQ0%(@\,$1#GE==)(@\0(6UU!7$%=PTB)Q^@/____Z]]F9F:09F:09F:09F:0
-M2(/L"$B+1RB+..@`````2(/$"$B)Q^GE_O__9F:09I!(@^P82(EL)!!(B5PD
-M"$B+1RB+6`2+..@`````@_L-2(G%=#2#^P%T&8/[!'04@_L'=`](BUPD"$B+
-M;"002(/$&,-(B>](BUPD"$B+;"002(/$&.F(_O__2(7`=-9(BX"``@``2(7`
-M=,I(BW@(2(7_=`SH:?[__TB+A8`"``!(BW@02(7_=;[KJF9F9I!F9I!(@^P8
-M3(ED)!!(B5PD"$B+1RB+6`2+..@`````B=])B<3H`````$R)YTB)P^@?_O__
-M2(G?3(MD)!!(BUPD"$B#Q!CI"?[__V9FD&9FD&9FD$B#[`A(BT<HBSCH````
-M`$B#Q`A(B<?IY?W__V9FD&:02(/L"$B+1RB+..@`````2(/$"$B)Q^G%_?__
-M9F:09I!32(M'*(LXZ`````!(A<!(B<-T,$B+@(`"``!(A<!T)$B+>`A(A?]T
-M#.B2_?__2(N#@`(``$B+>!!(A?]T$EOI?/W__TB)WUOI<_W__V9FD%O#9F9F
-MD&9F9I!F9I!F9I!54TB#[`A(BV\H2(/%!(!]#0!T(#';B=B#PP&+?(5\Z```
-M``!(B<?H-/W__P^V10TYV'?B2(/$"%M=PV9FD&:055-(@^P(2(MO*$B#Q02`
-M?0$`="`QVXG8@\,!BWR%<.@`````2(G'Z/3\__\/MD4!.=AWXDB#Q`A;7<-F
-M9I!FD%532(/L"$B+;RB`?0T`="`QVXG8@\,!BWR%?.@`````2(G'Z+C\__\/
-MMD4-.=AWXDB#Q`A;7<-F9I!F9I!F9I!54TB#[`A(BV\H@'T!`'0@,=N)V(/#
-M`8M\A7#H`````$B)Q^AX_/__#[9%`3G8=^)(@\0(6UW#9F:09F:09F:055-(
-M@^P(2(MO*(!]`0!T(#';B=B#PP&+?(5HZ`````!(B<?H./S__P^V10$YV'?B
-M2(/$"%M=PV9FD&9FD&9FD%532(/L"$B+;RB+?0"%_W0=,=N#PP&)V(M\A0#H
-M`````$B)Q^CW^___.5T`=^5(@\0(6UW#9F9FD&9F9I!F9I!52(G]2,?&````
-M`%-(@^P(2(M_*.@'K?__A<!U.4B+11!(BU@82(/`&$@YPW0H9I#V0_`!2(V[
-M</S__W0)@+N`_/__`7072(M%$$B+&TB#P!A(.=AUVDB#Q`A;7</H?OO__^OB
-M9F9FD&9F9I!F9F:005=!5D%505152(G]4TB![)@```!,BV\03(MW*$F+71A-
-MC6483#GC="I,C;PD@````/9#\`%(C;MP_/__=`V`NX#\__\!#X2V````2(L;
-M3#GC==Y!#[9&((@%`````$F+71!(A=MU$>M>9F9FD&9FD$B+&TB%VW1/2(M#
-M"$B+>Q!(B>;_4#CV1"01$'3C28V=.`$``$R)[TB)WN@`````0<>%.`$```"'
-MDP-)QX5(`0```````$B)WDV)K5`!``!,B>_H`````$B+?1!(C758QT50````
-M`$C'15@`````2(EM8$C'16@`````Z`````!(@<28````6UU!7$%=05Y!7\/H
-M`````,:$)(`````(00^V1B!,B?Z(A"2(````2(N#V/S__TB+N_#\____D,``
-M``#I%?___V9F9I!F9I!F9I!(@^PH2(E<)`A(B6PD$$B)_4R);"0@3(ED)!A)
-MB?6+=S1(BS_H`````$B%P$B)PP^$:0(``$4QY,:`L`````-!@7T80O\``$B)
-M:%!!#Y3$187D#X6X````28M5*#'`@'H*]`^4P(7`#X6X````187D#X1*`0``
-M#[9"$CP!#X0!`@``/`(/A,<!```/MD(/B(.;````#[=""&:)@Y0````/MT(*
-M9HF#E@````^W0@QFB8.8````#[9"#HB#F@````^W0@1FB8.0````#[="!F:)
-M@Y(````/MT(09HF#G````$R):UA(QX/(`````````$B)WTB+;"002(M<)`A,
-MBV0D&$R+;"0@2(/$*.D`````D$F+52@QP(!Z#_0/E,"%P`^$2/___TB+?0!(
-M@<>0````Z`````!(A<!(B<4/A)X!``!%A>0/A>8```!)BW4H2(/&$$B)[[H`
-M`@``Z`````"`B[$````$2(FKH````$F-=5C&@YL```#T9L>#G`````$`28M]
-M$$B):UA(QX/(`````````$''15``````2<=%6`````!-B6U@2<=%:`````#H
-M`````.DU____9F:09F:0#[9"##P!#X2<````/`)FD'1K#[9""HB#FP````^V
-M0@9FB8.4````#[9"!V:)@Y8````/MD((9HF#F`````^V0@F(@YH````/MD($
-M9HF#D`````^V0@5FB8.2````#[9""V:)@YP```#IL_[__V9FD$F+=2A(@\84
-MZ17___^`B[$````$2(U"$$B)@Z````#K@8"+L0````1(C4(42(F#H````.DB
-M_O__@(NQ`````DF+13!(@\`02(F#H````.E/____@(NQ`````DF+13!(@\`4
-M2(F#H````.GL_?__28M]$$F-=5A!QT50_?___TG'15@`````38EM8$G'16@`
-M````2(M<)`A(BVPD$$R+9"083(ML)"!(@\0HZ0````!)BWT028UU6$''15#_
-M____2<=%6`````!-B6U@2<=%:`````#H`````$B)WTB+;"002(M<)`A,BV0D
-M&$R+;"0@2(/$*.D`````9F9FD&9F9I!32(M'*$B)^XLXZ`````!(B=Y(B<=;
-MZ;7\__]F9I!FD%-(BT<H2(G[BSCH`````$B)WDB)QUOIE?S__V9FD&:02(/L
-M*$B)7"0(2(EL)!!,B6PD($R)9"0828G]3(MG*$&+/"3H`````(MP-$B+.$B)
-MQ>@`````2(7`2(G##X3*````3(EH6$B):%#&@+`````"00^V1"0$/`$/A)$`
-M```\`@^$F0```$$/ME0D!TB-NY@```!)C70D".@`````00^V1"0'B(.0````
-M08M$)!B)@Y0```!!#[9%((/H"(3`B(.1````=`])BT4P2(/`"$B)@Z@```!(
-MQX/``````````$C'@\@`````````2(G?2(ML)!!(BUPD"$R+9"083(ML)"!(
-M@\0HZ0````!F9F:0@(NQ`````NEK____9F9FD("+L0````3I6____TF+?1!)
-MC7580<=%4/W___])QT58`````$V);6!)QT5H`````$B+7"0(2(ML)!!,BV0D
-M&$R+;"0@2(/$*.D`````9F:055-(B?M(@^Q82(M'*$B+;S!(B>*+<`2+..@2
-MJ?__A<!T+\=#4/____](BWL02(US6$C'0U@`````2(E;8$C'0V@`````Z```
-M``!(@\186UW#2(L$)$B)10!(BT0D"$B)10CKQ69F9I!F9F:09F9FD$%4@#T`
-M`````4F)_%53QT=0`````$B+;RA(BU\P#X8.`0``2,?&`````$B)[^@.IO__
-MA<`/A(8```!(Q\8`````2(GOZ/>E__^%P`^%OP```$B+10!(B0-(BT4(2(E#
-M"$B+11!(B4,02(M%&,9#1`#&0T$`QD-``DB)0Q@/MD5%B$-%#[8%`````(A#
-M(&9FD$G'1"18`````$V)9"1@28UT)%A)QT0D:`````!)BWPD$%M=05SI````
-M`&9FD&9FD$B+10!(B0-(BT4(2(E#"$B+11!(B4,02(M%&,9#1`#&0T$`QD-`
-M`4B)0Q@/MD5%B$-%BP4`````!9`!``"-4`>%P`](PL'X`XA#(.N#9F:02,?&
-M`````$B)[^@AI?__A<!T9D''1"10_____^E?____2,?&`````$B)[^@`I?__
-MA<`/A=O^__](BT4`2(D#2(M%"$B)0PA(BT402(E#$$B+11C&0T0`QD-!`,9#
-M0`)(B4,8#[9%18A#10^V!0````"(0R#I!____TB+10!(B0-(BT4(2(E#"$B+
-M11!(B4,02(M%&,9#1`#&0T$`QD-``4B)0Q@/MD5%B$-%#[8%`````(A#(.G&
-M_O__9F:09F:005=)B?=!5D%505152(G]4TB!["@"``"(5"0'#[9&#\9$)!`!
-MA,!X#\9$)!``@'\0!@^$;`(``$B-1"0@9F9FD$B-E"0@`@``Q@``2(/``4@Y
-MT'7L00^V1PL/MI5@`@``B$5(00^V1PZ(145!#[9/#K@!````T^!FB45&B="#
-MR`2(A6`"``!!]D</`P^$F@$``(G02,>%:`(```````"#R`6(A6`"``!(BT4(
-M@'@+``^%E@$``$F+1Q`/ME5$2<?&_____TB)A7`"``!)BT<8A=)(B85X`@``
-M?EA%,>3K$0^V541!C40D`4F#Q`$YPGY"2HM<Y6!(BT,H2(EK&$DYQDP/1_"`
-M>Q`$==6`?"0'`$B+0SA(B40D"'5D@'PD$`!U9`^V541!C40D`4F#Q`$YPG^^
-M@'T0!P^$.@$``$B+30B`>0D`#X7Q````#[9!"BG"2&/"3`^O\$R)=2A!#[9'
-M#X/@','X`HB%@0,``$B!Q"@"``!;74%<05U!7D%?PX!\)!``='%(BT-(2(M\
-M)`A(C4PD($&X`0```+H!````2(MP".@`````A<`/A3#___^`O"0>`@``J@^$
-M#@$``#'`@'PD(%(/A.<```"%P`^$#?___TB+0TA(BWPD"$B-3"0@13'`N@$`
-M``!(BW`(Z`````#IZ?[__T4Q[4B+0TA,B>Y(BWPD"$B-3"0@13'`N@$```!)
-M@\4!2`-P".@`````28/]`@^$MO[__^O.2,>%:`(``/_____I>O[__P^W14;W
-MV$B822'&Z?_^__^#R@>`?1`*B)5@`@``#X57_O__#[9-1+@!````@^D!2-/@
-M2(E%4.D__O__@'U$``^$V_[__S')2(M$S6"-40%(@\$!2(M`*$@!12@/MD5$
-M.=!_Y.FX_O__T>B#X`&(1"00Z8;]__^`?"0A10^%#O___\9$)"!%QD0D(5+I
-M!____X"\)!\"``!5#X7D_O__L`'&A"0>`@``5<:$)!\"``"JZ<_^__]!53'V
-M051)B?Q54TB![(@```!(BT<H2(MO,(LXZ*^A__](A<!(B<,/A%(!```QP)#&
-M!"@`2(/``4B#^%AU\DF)Y4B)X$B-E"2`````Q@``2(/``4@YT'7L2(M#"$B+
-M>Q!(B>;_4#@/MD0D%DF-53Q(C4T$B$4##[9$)!2(10`/MD0D%8A%`4B+1"0\
-M2(E%!$B+0@A(B4$(2(M"$$B)01!(BT(82(E!&(M"($F-51B)02!(BT0D&$B-
-M32A(B44H2(M""$B)00A(BT(02(E!$$B+0AA(B4$8BT(@B4$@#[8$)(A%4`^V
-M1"0!B$51#[9$)`*(15(/MD0D`XA%4TB+0QB)14R`>V@`=7$/MD0D%XA%`DB+
-M&TB%VW48ZRMF9I!F9I`/MD0D%P!%`DB+&TB%VW052(M#"$B+>Q!(B>;_4#B`
-M?"03`'3;28M\)!!)C70D6$G'1"18`````$V)9"1@2<=$)&@`````Z`````!(
-M@<2(````6UU!7$%=PX!-`P3KB4''1"10_____^N[9F:09F:0055)B?TQ]D%4
-M55-(@>R(````2(M'*$B+;S"+..@?H/__2(7`2(G##X07`0``,<"0Q@0H`$B#
-MP`%(@_A,=?))B>1(B>!(C90D@````,8``$B#P`%(.=!U[$B+0PA(BWL02(GF
-M_U`X#[9$)!9)C50D/$B-302(10,/MD0D%(A%``^V1"05B$4!28M$)#Q(B44$
-M2(M""$B)00A(BT(02(E!$$B+0AA(B4$8BT(@28U4)!B)02!)BT0D&$B-32A(
-MB44H2(M""$B)00A(BT(02(E!$$B+0AA(B4$8BT(@B4$@#[9$)!>(10)(BQM(
-MA=MU$NLE#[9$)!<`10)(BQM(A=MT%4B+0PA(BWL02(GF_U`X@'PD$P!TVTF+
-M?1!)C7582<=%6`````!-B6U@2<=%:`````#H`````$B!Q(@```!;74%<05W#
-M0<=%4/_____KQV:02(/L&$R)9"0(2(D<)$F)_$R);"002(M?"$B+5Q"+0S!,
-MBRN)0C"`HV$"``#SQT,P_____X"B80(``/.+<C!)BWT(Z`````"+<S1,B>_H
-M`````$B)6%#&@+`````$2(G'3(E@6$C'@,@`````````2(L<)$R+9"0(3(ML
-M)!!(@\08Z0````!F9F:09F:09F:04TB+1RA(B?N+..@`````2(G'Z`````!(
-MQT-8`````$B)6V!(C7-82,=#:`````!(BWL06^D`````9F9FD&9FD%-(BW\(
-M2(L?Z`````!(BX/@`0``2,=`6`````!(B4!@2(UP6$C'0&@`````2(MX$%OI
-M`````&9F9I!F9I!F9I!3@W]0_4B+7T`/A/4```#V@V$"```(QH-[`P```'1I
-MBT=0@_C]#X3;`0``A<`/A>`!``!(BX.``@``2(N0H`````^W@*@```"!XO__
-M#P!(.<(/@XD```!(QX/H`@```````$B)F_`"``!(QX/@`@```````$B+`TB-
-ML^`"``!;2(MX".D`````#[:+8`(``/;!$`^$B````(M'4(/X_0^$0@$``(7`
-M#X5#`0``2(M3"`^V0T0/ME(**=!(F$@/KX-H`@``2#M#*`^#T0$``/:#80(`
-M``@/A5C___]F9I!FD/:#8`(``%`/A8D```!(QX/H`@```````$B)F_`"``#I
-M</___P^V@WL#```\`@^/_/[__X/``8B#>P,``.O/9I#VP2!U;/;!0`^$M@``
-M`/;!`0^$CP$``$2+1U!%A<!FD`^%0@$``$B+4P@/MD-$#[92"BG02)A(#Z^#
-M:`(``$@[0R@/@GC___](B=^^"0```%OIZL/__TB+@V@"```E__\_`$B#^'\/
-MAV'____IQO[__T2+3U"X"P```$6%R74IA,FP"G@C2(M3"`^V0T0/ME(**=!(
-MF$@/KX-H`@``2#M#*')WN`P```"#X5](B=Z)QXB+8`(``.@`````]H-@`@``
-M"'5O6\.`/0``````=7*#X>](B=Z_"````(B+8`(``%OI`````(`]```````/
-MA9H```!(BX.``@``@*-A`@``]TB)WK\4````2(M`$("@80(``/=;Z0````!(
-MBX,H`P``@#@`#X26_O__@^'?B(M@`@``2(G?O@$```!;Z?_"___'1U``````
-M2(G>OQP```#H``````^W@W0#``!(`8-H`@``Z23^__^#X;](B=Z_#P```(B+
-M8`(``%OI`````$B)W[X#````6^FSPO__QT=0`````$B)WK\<````Z`````#I
-M"/[__X/AOTB)WK\.````B(M@`@``6^D`````9F:02(V&:`,``/:&80(```A(
-MB;X(`P``QX88`P```````$C'AC`#````````2(F&(`,``$B-AGH#``!(B;8X
-M`P``2,>&0`,```````!(B88H`P``BX;H`P``B89H`P``=#?'AA`#```J_P``
-MQX84`P``!````(N&W`(``#'2@\`!@_AE#TS0B9;<`@``2('&^`(``.D`````
-M#[:.8`(``/;!<`^$J@```(G(@^"@/*`/A)\```!,BT8(#[9&1$$/ME`**=!(
-MF$@/KX9H`@``2#M&*`^#?````/;!$+@C_P``=0^#X2"`^0$9P/?0!27_``")
-MAA`#``!(BY8@`P``2(N&:`(``$B)0@1!@'@)`'1:#[=&1DB+EB`#``!FB4(,
-M]H9@`@``(,>&%`,```X````/A#____](BX8H`P``Q@``QX88`P```0```.DF
-M____9F:0\\-(C;[X`@``QX9(`P```````.FX^___2(M6*$@KEF@"``"Y@```
-M`$B+AB`#``!(@?J`````2`]'T6:)4`SKC4B+1T!(QX#H`@```````$B)@/`"
-M``!(C;#@`@``2(L`2(MX".D`````9F9FD&9FD$B#[!A(B6PD$$B)7"0(2(G]
-M2(M?&$B%VT@/1-\/MH-A`@``J`1T?J@(#X63````2(N3@`(``$B%T@^$@P``
-M`$B+0@A(A<`/A'8```!(@WH0`'1O@(AA`@``"$B-L^`"``!(BT(0@(AA`@``
-M"$B+`TC'@^@"````````2(F;\`(``$B+>`CH`````$B)WDB+;"002(M<)`B_
-M$@```$B#Q!CI``````^VEV`"``#VPA!U$4B%VW0$J`AU"/;"8&9FD'0/2(M<
-M)`A(BVPD$$B#Q!C#2(M%`(/B]TC'A>@"````````@\H02(FM\`(``$B-M>`"
-M``"(E6`"``!(BW@(Z`````!(B>Y(BUPD"$B+;"00OP0```!(@\08Z0````!F
-MD$%5051)B?Q54TB#[`A(BT<HBU@$BSCH`````(/[#DB)Q78]0<=$)%#^____
-M2<=$)%@`````38ED)&!)C70D6$G'1"1H`````$F+?"002(/$"%M=05Q!7>D`
-M````9F9FD(G8_R3%`````&9F9I!F9I!(B<5(BT482(7`=?2`?1`%#X3N!0``
-M@*5@`@``OTB)[K\.````Z`````!$BU4P1872#XA.!@``2(M-&+H!````Z=@#
-M``!(BT482(7`=`WV@&$"```,#X58____9O>%8`(``'`,#X5)____]H6``P``
-M`0^$//___X!]$`4/A1H&``"`?40`#X1C!@``13'M9I#K%`^V141!C54!28/%
-M`3G0#XY(!@``2HM<[6!(A=MTXH![$`1VW/:#8`(``!!UTTB+>UCH`````$B+
-M4P@/ME(*.=`/C=O^__\/MH-@`@``2,>#Z`(```````!(C;/@`@``2(F;\`(`
-M`(/@]X/($(B#8`(``$B+`TB+>`CH`````$B)WK\$````Z`````#I</___X!]
-M$`4/A(D$``"`I6`"``#G2(GNOP4```#H`````$B+31BZ`0```.G/`@``]H5@
-M`@``$`^$6/[___:%@`,```$/A$O^__^`I6`"``#E2(M%6$B)[DC'A6@"``#_
-M____OP8```!(B450Z`````!(BTT8@*5@`@``_DB%R714@'E$`'1.,?9(BT3Q
-M8$B%P'0O]H"``P```70F@'@0!'8@#[:08`(```^V@6`"``"#X@&#X/X)T*@!
-MB(%@`@``=0\/MD%$C58!2(/&`3G0?[A(BTT82(-]6`$9TH/"`ND;`@``2(M%
-M&$B%P'0-]H!A`@``#`^%F_W__V;WA6`"``!P#`^%C/W___:%@`,```$/A'_]
-M__^`?1`%#X78!```@'U$``^$=/W__T4Q[69FD&:0ZQ0/MD5$08U5`4F#Q0$Y
-MP@^-5OW__TJ+7.U@2(7;=.*`>Q`$=MSV@V`"```@==-(BWU02`M]6.@`````
-M2(M5"`^V4@HYT`^-%_W__TB+`X"+8`(``"!(C;/@`@``2,>#:`(```````!(
-MQX/H`@```````$B)F_`"``!(BW@(Z`````!(B=Z_"0```.@`````Z6W___^`
-MI6`"``#?2(GNOPH```#H`````.F^_/__@*5@`@``W^FR_/__]H6``P```0^$
-MG/S__TB#?5@`#X61_/__#[>%8`(``&8E<0QF@^@!#X5\_/__@'T0!0^%/`0`
-M`(!]1`!T-44Q[4J+7.U@2(7;=!B`>Q`$=A(/MH-@`@``@^!!+`$/A%L$```/
-MMD5$08U5`4F#Q0$YT'_.@*5@`@``]^DT_/__@*5@`@``M$C'A6@"``#_____
-M2(GN2,=%4`````"_$````.@`````2(M=&$B%VP^$E0(```^V0T2%P`^.C`(`
-M`(/H`3'V,=)(C4@!2(M$TV!(A<!T(_:`@`,```%T&H!X$`1V%/:`8`(```&X
-M`0````]%\&9FD&:02(/"`4@YRG7*A?8/A$,"``!(BTL82(G=N@$```"#^@,/
-ME<"$P`^$/@$``&9FD&:02(7)#X0P`0``2(G-2(M)&.D<`0``@*5@`@``WTB)
-M[K\+````Z`````#I7OO__V;WA6`"``!P"$B+A8`"```/A3_[__](A<`/A#;[
-M__^`N*L`````#X4I^___2(M0"$B+0!#V@H`#```!#X04^___]H"``P```0^$
-M!_O__X"B80(``.](C;7@`@``@*!A`@``[X"*80(```B`B&$"```(2(M%`$C'
-MA>@"````````2(FM\`(``$B+>`CH`````$B)[K\2````Z`````#IO/K__P^W
-MA6`"``!(BXV``@``9B5P"&8]``@/A9?Z__](A<D/A([Z__](BT$(2(M1$$B)
-M[K\3````@*!A`@``]X"B80(``/?H`````$B+31BZ`0```.G'_O__2(M-&+H#
-M````,<"$P`^%Q_[__X"-8`(```2#^@(/A.\```!(BX6``@``2(7`#X3L````
-M2(MX"$B+6!!(A?]T!>@`````2(7;#X08^O__2(G?Z`````!F9F:0Z0?Z__\Q
-MVX!]1`!U&V9FD.ER^O__#[9%1(U3`4B#PP$YT`^.7_K__TB+=-U@2(7V=..`
-M?A`$=MWVAF`"```0=-2`IF`"``#GOP4```#H`````.O!@'U$``^$'/K__S';
-MZQ,/MD5$C5,!2(/#`3G0#XX%^O__2(MTW6!(A?9TXX!^$`1VW?:&8`(``$!T
-MU("F8`(``+^_#@```.@`````Z\%(B>N`HV`"``#^2(G?Z`````#IJ?W__TB)
-M[^@`````Z4?Y__](B>_H`````&9FD.DW^?__2(GOZ`````!(BTT8N@$```#I
-M@OW__TB+?5CH`````$B+50@/ME(*.=`/C?_X__](BT4`@(U@`@``$$B-M>`"
-M``!(QX7H`@```````$B)K?`"``!(BW@(Z`````!(B>Z_!````.@`````@*5@
-M`@``]TB#?5@`#X0W^?__Z`````!(BTT8N@$```")13SI!_W__TB+?5!("WU8
-MZ`````!(BU4(#[92"CG0#XV`^/__2(M%`("-8`(``"!(C;7@`@``2,>%:`(`
-M``````!(QX7H`@```````$B)K?`"``!(BW@(Z`````!(B>Z_"0```.@`````
-MZ3_X__](BT4`@(U@`@``0$B-M>`"``!(QX5H`@```````$C'A>@"````````
-M2(FM\`(``$B+>`CH`````$B)[K\-````Z`````#IM?O__P^V@V`"``!(QX-H
-M`@```````$B-L^`"``!(QX/H`@```````$B)F_`"``"#R$"#X/>(@V`"``!(
-MBP-(BW@(Z`````!(B=Z_#0```.@`````Z5#[__]F9F:054B)_5-(@^P(]H>`
-M`P```74C#[:'80(``(/@!#P!&=N!XP#X__^!PP$(``")V$B#Q`A;7<,/MI=@
-M`@``]L("#X0S`0``2(M_6+L"````B=B`S!#VP@$/1=B)V(/(!/;"$`]%V(G8
-M@,P!]L(@#T78B=B`S`*#XD`/1=A(A?\/A2("```/MI6``P``B=A$#[951(/(
-M$/;"!$4/MLH/1=B)V(/(0(/B`@^VE6$"```/1=B)V`R`]H5@`@``"`]%V(G8
-M@,P(]L($#T78B=B`S`2#X@@/1=A%A<D/CK8```!!C4'_,?9,C4`!ZV!(BWI8
-M2(GX2/?02(5"4'0#@\L"B=B`S!#VP0$/1=B)V(/(!/;!$`]%V(G8@,P!]L$@
-M#T78B=B`S`+VP4`/1=B)V(/("$B%_P]%V(G8#("#X0@/1=AF9I!(@\8!3#G&
-M=$I(BU3U8$B%TG3M]H*``P```73D@'H0!';>#[:*8`(``/;!`@^$=____TB+
-M>ECK@4B+?U@QVTB)^$CWT$B%15`/A,#^___IMO[___;#`G01]L<09F:09I`/
-MA.H```"#X_U%A<D/CA(!``!(BU5@2(72#X1M_O__]H*``P```0^$8/[__S'_
-M@'H0!$$/ML)$C4#_#X:>````#[9R1(7V?FA(BT)@2(7`#X0W_O__]H"``P``
-M`0^$*O[__TB+0$A(@W@(``^%&_[__S')ZRU(BT)H2(7`#X0*_O__]H"``P``
-M`0^$_?W__TB+0$A(@\((2(-X"``/A>K]__^#P0$YSG7,9F9FD&9FD$PYQW1O
-M2(M4_6A(A=(/A,G]__](@\<!]H*``P```0^$N/W__X!Z$`0/AV+___](BT)(
-M2(-X"`!TQ^F>_?__9I")V"4((```@_@(#X4)____Z0'____H`````$B+50B#
-MRPB)V8#-(`^V4@HYT`],V>F__?__@<L```!`Z5W]__^0059!54%428G\55-(
-MBT<H2(M?$$2+*$2)[^@`````2(MK&$B#PQA)B<9(.=UU"^M.2(MM`$@YW71%
-M2(.]B/S__P!(C;UP_/__=>9%A>UU!O9%\`)U5TDY_G1F]H>``P```G3-@*>`
-M`P``_8!_$`%T1N@`````2(MM`$@YW76[2<=$)%@`````38ED)&!)C70D6$G'
-M1"1H`````$F+?"006UU!7$%=05[I`````(!E\/V`?Q`!=;KH`````.EP____
-M]H>``P```@^%8____X"/@`,```+KE&9F9I!F9I!F9I!(@^QH2(E<)$A(B6PD
-M4$B)^TR)9"183(EL)&!(BV\HBWT`A?]U2DB+>Q#HL9C__\=#4/S___](BWL0
-M2(US6$C'0U@`````2(E;8$C'0V@`````Z`````!(BUPD2$B+;"103(MD)%A,
-MBVPD8$B#Q&C#Z`````!)B<2+101,C6T$J`%U;:@"#X6]````J`0/A1T!``"H
-M"`^%?`$``*@09F:0#X7:`0``J$`/A3,"``"H(`^%;P(``$'V1"1D$&9F9I`/
-MA'#___])BT0D:$F+O"2`````2(GF_U!X#[9$)`Y,B>=!B$0D8N@`````Z4;_
-M___&1"0P`$$/MD4$2(UT)#"(1"0X28M$)&A)B[PD@````/^0P````(7`B4-0
-M=2!!#[9$)&2#R(!!B$0D9$$/ME4$@\@008A$)&1!B%0D8XM%!*@"#X1#____
-MQD0D,`1!#[9%!4B-="0PQD0D.0"(1"0X28M$)&A)B[PD@````/^0P````(7`
-MB4-0=2E!#[94)&6#RA!!B%0D94&`?04`#Y7`08!,)&00@^+?P>`%"<)!B%0D
-M94&+10"H!`^$Y/[__Y#&1"0P!4$/MD4&2(UT)##&1"0Y`(A$)#A)BT0D:$F+
-MO"2`````_Y#`````A<")0U!U*4$/ME0D98/*0$&(5"1E08!]!@`/E<!!@$PD
-M9!"#XG_!X`<)PD&(5"1E08M%`*@(#X2$_O__QD0D,`-!#[9%!TB-="0PB$0D
-M.$F+1"1H28N\)(````#_D,````"%P(E#4'4I00^V5"1E@\H$08A4)&5!@'T'
-M``^5P$&`3"1D$(/B]\'@`PG"08A4)&5!BT4`J!`/A"W^__]F9F:09F:0QD0D
-M,`)!#[9%"$B-="0PB$0D.$F+1"1H28N\)(````#_D,````"%P(E#4'4H00^V
-M5"1E@\H!08A4)&5!@'T(``^5P$&`3"1D$(/B_0'`"<)!B%0D94&+10"H0`^$
-MS?W__T$/MG4*,<!(Q\<`````Z`````#'0U``````08!]"@!!#[9$)&8/E<)!
-M@$PD9!"#X/X)T$&(1"1F08M%`*@@#X21_?__QD0D,`=!#[9%"4B-="0PB$0D
-M.$F+1"1H28N\)(````#_D,````")0U!!]D0D9!`/A-S\___I9_W__Y!(@^PX
-M2(E<)!A(B6PD($B)^TR)9"0H3(EL)#!(BV\HBWT`A?]U2DB+>Q#H497__\=#
+M74%<05U!7D%?PTB+0PA(BX`8`0``2(7`=+A(BWL03(GZB>[_T(7`=:E!#[9'
+M`CS_=`=$`>A!B$<"0<=$)%``````ZXYFD$%7,?9!5D%5051)B?Q54TB![(@`
+M``!(BT<H3(M_,(LXBV@$Z`BX__](A<!(B<-!QT0D4/____]T0T4Q[69F9I!(
+MBT,(2(N`"`$``$B%P'0/2(M[$/_0.<5\6BG%00'%2(L;2(7;=!5(BT,(2(M[
+M$$B)YO]0.(!\)!,`=,1)BWPD$$F-="182<=$)%@`````38ED)&!)QT0D:```
+M``#H`````$B!Q(@```!;74%<05U!7D%?PTB+0PA(BX`0`0``2(7`=+A(BWL0
+M3(GZB>[_T(7`=:E!#[9'`CS_=`=$`>A!B$<"0<=$)%``````ZXYFD$%5,?9!
+M5%5(B?U32('LB````$B+1RB+..@CM___,=)(A<!(B<-T0D4QY&9FD&9FD$B+
+M0PA(BX`(`0``2(7`=`E(BWL0_]!!`<1(BQM(A=MT%4B+0PA(BWL02(GF_U`X
+M@'PD$P!TRD2)XDB+13!(BWT02(UU6$C'15@`````2(EM8$C'16@`````B1#H
+M`````$B!Q(@```!;74%<05W#9I!32(M'*$B)^TB+5S"+<`2+..BZN/__A<!T
+M!\=#4/____](QT-8`````$B)6V!(C7-82,=#:`````!(BWL06^D`````9F9F
+MD&9FD&9FD&9FD%5(B?TQ]E-(@>R(````2(M'*$B+7S"+..@SMO__2(7`2(G"
+M='\QP,8$&`!(@\`!2(/X1'7R2(G@2(V,)(````#&``!(@\`!2#G(=>Q(BT((
+M2(MZ$$B)YO]0.`^V1"1QB`,/MD0D<HA#`0^V1"1SB$,"#[9$)'2(0P-(BWT0
+M2(UU6$C'15@`````2(EM8$C'16@`````Z`````!(@<2(````6UW#QT50____
+M_^O,9F:02(/L&$B)7"0(3(ED)!!(B?M,BV<PZ%:W__](BWL02(US6$C'0U@`
+M````08D$)$B)6V!(QT-H`````$B+7"0(3(MD)!!(@\08Z0````!F9I!52,?&
+M`````%-(B?M(@^P(2(MO*$B)[^CDM/__A<!U,0^V12"(!0````!(QT-8````
+M`$B)6V!(C7-82,=#:`````!(BWL02(/$"%M=Z0````!(Q\8`````2(GOZ*"T
+M__^%P'43#[9%((T$Q7#^__^)!0````#KLTC'Q@````!(B>_H>K3__X7`=$I(
+MQ\8`````2(GOZ&>T__^%P'5&2(M[$$C'AR`"````````2(F?*`(``$C'AS`"
+M````````2(/$"%M=2(VW(`(``$B#QTCI``````^V12"(!0````#I1____TC'
+MQ@````!(B>_H#K3__X7`=1%(BWL02,>'(`(```````#KI<=#4/_____I%___
+M_V9F9I!F9I!F9I!F9I!(BT<P2,='6`````!(C7=82(E_8$C'1V@`````2(M_
+M$,<````!`ND`````9F:09I!!5D%505152(G]4TB#[$!(BT4H2(M_$,9$)#`'
+M@'@@`4R-9Q@9P(/``HA$)#A(BU\83#GC="5,C70D,&9FD&:0]D/P`70)@+N`
+M_/__`70]2(L;3#GC=>E(BWT02(UU6,=%4`````!(QT58`````$B);6!(QT5H
+M`````.@`````2(/$0%M=05Q!74%>PTB+@^#\__](B[OX_/__2(GF_U!X#[9$
+M)!,Z1"0X=*1(BX/@_/__2(N[^/S__TR)]O^0P````.N+9F9FD&9F9I!F9F:0
+M2(/L*$B)'"1,B60D$$B)^TB);"0(3(EL)!A,B70D($B+;UA,BS=(BT4H1(LH
+M1(GOZ`````"`N[(````!28G$=!@/MH.S````@\`!/`*(@[,````/AI<```!(
+MBW-X28V^\````.@`````2(G?Z`````"+11@]*?\``'1E/3G_``!T7DV%Y'0/
+M28L$)$PY\&:0#X3`````2(M]$$B-=5C'15#^____2,=%6`````!(B6U@2,=%
+M:`````!(BQPD2(ML)`A,BV0D$$R+;"083(MT)"!(@\0HZ0````!F9I!F9I!(
+MBT4P1(DHZYEF9F:09F:02(M#>,:#L@````!(B=](QT`0`````$B+0WA(C5`8
+M2,=`*`````!(QT`P`````$C'0#@`````QT!``````$B)4!A(B5`@2(L<)$B+
+M;"0(3(MD)!!,BVPD&$R+="0@2(/$*.D`````2(VP(`(``$B->$A(QX`@`@``
+M`````$B)J"@"``!(QX`P`@```````$B+'"1(BVPD"$R+9"003(ML)!A,BW0D
+M($B#Q"CI`````)!(BS=(@<;H`0``Z0````"02(/L"$B+1RB+..@`````2(/$
+M"$B)Q^O89F9FD&9F9I!(@^P(2(M'*(LXZ`````!(@\0(2(G'Z[AF9F:09F9F
+MD$B#[`A(BT<H@'@$`8LX=`5(@\0(P^@`````2(/$"$B)Q^N-9F9FD&9FD&9F
+MD&9FD$%528G]05154TB#[`A(BT<HBQ!F]\(`_W5$08G408'D_P```'XX,>V[
+M!````.L%D$F+12B+/!CH`````$B%P'01@'@0!'8+2(.X@`(```"0=!>#Q0%(
+M@\,$1#GE==)(@\0(6UU!7$%=PTB)Q^@/____Z]]F9F:09F:09F:09F:02(/L
+M"$B+1RB+..@`````2(/$"$B)Q^GE_O__9F:09I!(@^P82(EL)!!(B5PD"$B+
+M1RB+6`2+..@`````@_L-2(G%=#2#^P%T&8/[!'04@_L'=`](BUPD"$B+;"00
+M2(/$&,-(B>](BUPD"$B+;"002(/$&.F(_O__2(7`=-9(BX"``@``2(7`=,I(
+MBW@(2(7_=`SH:?[__TB+A8`"``!(BW@02(7_=;[KJF9F9I!F9I!(@^P83(ED
+M)!!(B5PD"$B+1RB+6`2+..@`````B=])B<3H`````$R)YTB)P^@?_O__2(G?
+M3(MD)!!(BUPD"$B#Q!CI"?[__V9FD&9FD&9FD$B#[`A(BT<HBSCH`````$B#
+MQ`A(B<?IY?W__V9FD&:02(/L"$B+1RB+..@`````2(/$"$B)Q^G%_?__9F:0
+M9I!32(M'*(LXZ`````!(A<!(B<-T,$B+@(`"``!(A<!T)$B+>`A(A?]T#.B2
+M_?__2(N#@`(``$B+>!!(A?]T$EOI?/W__TB)WUOI<_W__V9FD%O#9F9FD&9F
+M9I!F9I!F9I!54TB#[`A(BV\H2(/%!(!]#0!T(#';B=B#PP&+?(5\Z`````!(
+MB<?H-/W__P^V10TYV'?B2(/$"%M=PV9FD&:055-(@^P(2(MO*$B#Q02`?0$`
+M="`QVXG8@\,!BWR%<.@`````2(G'Z/3\__\/MD4!.=AWXDB#Q`A;7<-F9I!F
+MD%532(/L"$B+;RB`?0T`="`QVXG8@\,!BWR%?.@`````2(G'Z+C\__\/MD4-
+M.=AWXDB#Q`A;7<-F9I!F9I!F9I!54TB#[`A(BV\H@'T!`'0@,=N)V(/#`8M\
+MA7#H`````$B)Q^AX_/__#[9%`3G8=^)(@\0(6UW#9F:09F:09F:055-(@^P(
+M2(MO*(!]`0!T(#';B=B#PP&+?(5HZ`````!(B<?H./S__P^V10$YV'?B2(/$
+M"%M=PV9FD&9FD&9FD%532(/L"$B+;RB+?0"%_W0=,=N#PP&)V(M\A0#H````
+M`$B)Q^CW^___.5T`=^5(@\0(6UW#9F9FD&9F9I!F9I!52(G]2,?&`````%-(
+M@^P(2(M_*.@'K?__A<!U.4B+11!(BU@82(/`&$@YPW0H9I#V0_`!2(V[</S_
+M_W0)@+N`_/__`7072(M%$$B+&TB#P!A(.=AUVDB#Q`A;7</H?OO__^OB9F9F
+MD&9F9I!F9F:005=!5D%505152(G]4TB![)@```!,BV\03(MW*$F+71A-C648
+M3#GC="I,C;PD@````/9#\`%(C;MP_/__=`V`NX#\__\!#X2V````2(L;3#GC
+M==Y!#[9&((@%`````$F+71!(A=MU$>M>9F9FD&9FD$B+&TB%VW1/2(M#"$B+
+M>Q!(B>;_4#CV1"01$'3C28V=.`$``$R)[TB)WN@`````0<>%.`$```"'DP-)
+MQX5(`0```````$B)WDV)K5`!``!,B>_H`````$B+?1!(C758QT50`````$C'
+M15@`````2(EM8$C'16@`````Z`````!(@<28````6UU!7$%=05Y!7\/H````
+M`,:$)(`````(00^V1B!,B?Z(A"2(````2(N#X/S__TB+N_C\____D,````#I
+M%?___V9F9I!F9I!F9I!(@^PH2(E<)`A,B60D&$F)]$R);"0@2(EL)!!)B?V+
+M=S1(BS_H`````$B%P$B)PP^$;`(``#'MQH"P`````T&!?"080O\``$R):%!`
+M#Y3%A>T/A;P```!)BU0D*#'`@'H*]`^4P(7`#X6\````A>T/A$\!```/MD(2
+M/`$/A`0"```\`@^$R0$```^V0@^(@YL````/MT((9HF#E`````^W0@IFB8.6
+M````#[="#&:)@Y@````/MD(.B(.:````#[="!&:)@Y`````/MT(&9HF#D@``
+M``^W0A!FB8.<````3(EC6$C'@\@`````````0<9%9@%(B=](BVPD$$B+7"0(
+M3(MD)!A,BVPD($B#Q"CI`````$F+5"0H,<"`>@_T#Y3`A<`/A$3___])BWT`
+M2(''D````.@`````2(7`28G%#X2C`0``A>T/A>,```!)BW0D*$B#QA!,B>^Z
+M``(``.@`````@(NQ````!$R)JZ````!)C70D6,:#FP```/1FQX.<`````0!)
+MBWPD$$R):UA(QX/(`````````$''1"10`````$G'1"18`````$V)9"1@2<=$
+M)&@`````Z`````#I+____P^V0@P\`0^$F0```#P"=&H/MD(*B(.;````#[9"
+M!F:)@Y0````/MD('9HF#E@````^V0@AFB8.8````#[9""8B#F@````^V0@1F
+MB8.0````#[9"!6:)@Y(````/MD(+9HF#G````.FP_O__D$F+="0H2(/&%.D8
+M____@(NQ````!$B-0A!(B8.@````ZX*`B[$````$2(U"%$B)@Z````#I(/[_
+M_X"+L0````))BT0D,$B#P!!(B8.@````Z4____^`B[$````"28M$)#!(@\`4
+M2(F#H````.GH_?__28M\)!!)C70D6$''1"10_?___TG'1"18`````$V)9"1@
+M2<=$)&@`````2(M<)`A(BVPD$$R+9"083(ML)"!(@\0HZ0````!)BWPD$$F-
+M="180<=$)%#_____2<=$)%@`````38ED)&!)QT0D:`````#H`````$B)WTB+
+M;"002(M<)`A,BV0D&$R+;"0@2(/$*.D`````9F:09F:09F:04TB+1RA(B?N+
+M..@`````2(G>2(G'6^FE_/__9F:09I!32(M'*$B)^XLXZ`````!(B=Y(B<=;
+MZ87\__]F9I!FD$B#["A(B5PD"$B);"003(EL)"!,B60D&$F)_4R+9RA!BSPD
+MZ`````"+<#1(BSA(B<7H`````$B%P$B)PP^$R@```$R):%A(B6A0QH"P````
+M`D$/MD0D!#P!#X21````/`(/A)D```!!#[94)`=(C;N8````28UT)`CH````
+M`$$/MD0D!XB#D````$&+1"08B8.4````00^V12"#Z`B$P(B#D0```'0/28M%
+M,$B#P`A(B8.H````2,>#P`````````!(QX/(`````````$B)WTB+;"002(M<
+M)`A,BV0D&$R+;"0@2(/$*.D`````9F9FD("+L0````+I:____V9F9I"`B[$`
+M```$Z5O___])BWT028UU6$''15#]____2<=%6`````!-B6U@2<=%:`````!(
+MBUPD"$B+;"003(MD)!A,BVPD($B#Q"CI`````&9FD%532(G[2(/L6$B+1RA(
+MBV\P2(GBBW`$BSCH`JG__X7`="_'0U#_____2(M[$$B-<UA(QT-8`````$B)
+M6V!(QT-H`````.@`````2(/$6%M=PTB+!"1(B44`2(M$)`A(B44(Z\5F9F:0
+M9F9FD&9F9I!!5(`]``````%)B?Q54\='4`````!(BV\H2(M?,`^&#@$``$C'
+MQ@````!(B>_H_J7__X7`#X2&````2,?&`````$B)[^CGI?__A<`/A;\```!(
+MBT4`2(D#2(M%"$B)0PA(BT402(E#$$B+11C&0T0`QD-!`,9#0`)(B4,8#[9%
+M18A#10^V!0````"(0R!F9I!)QT0D6`````!-B60D8$F-="182<=$)&@`````
+M28M\)!!;74%<Z0````!F9I!F9I!(BT4`2(D#2(M%"$B)0PA(BT402(E#$$B+
+M11C&0T0`QD-!`,9#0`%(B4,8#[9%18A#18L%``````60`0``C5`'A<`/2,+!
+M^`.(0R#K@V9FD$C'Q@````!(B>_H$:7__X7`=&9!QT0D4/_____I7____TC'
+MQ@````!(B>_H\*3__X7`#X7;_O__2(M%`$B)`TB+10A(B4,(2(M%$$B)0Q!(
+MBT48QD-$`,9#00#&0T`"2(E#&`^V146(0T4/M@4`````B$,@Z0?___](BT4`
+M2(D#2(M%"$B)0PA(BT402(E#$$B+11C&0T0`QD-!`,9#0`%(B4,8#[9%18A#
+M10^V!0````"(0R#IQO[__V9FD&9FD$%7059!54F)]4%454B)_5-(@>PH`@``
+MB%0D!P^V1@_&1"00`83`>`_&1"00`(!_$`8/A)X"``!(C40D(&9F9I!(C90D
+M(`(``,8``$B#P`%(.=!U[$$/MD4+B$5(08!]#0!T*S';ZQ!!#[9%#8U3`4B#
+MPP$YT'X708M\G7SH`````(%X8``0``!UW<9%2`-!#[9%#@^VE6`"``"(145!
+M#[9-#K@!````T^!FB45&B="#R`2(A6`"``!!]D4/`P^$F@$``(G02,>%:`(`
+M``````"#R`6(A6`"``!(BT4(@'@+``^%E@$``$F+11`/ME5$2<?'_____TB)
+MA7`"``!)BT48A=)(B85X`@``?EA%,>3K$0^V541!C40D`4F#Q`$YPGY"2HM<
+MY6!(BT,H2(EK&$DYQTP/1_B`>Q`$==6`?"0'`$B+0SA(B40D"'5D@'PD$`!U
+M9`^V541!C40D`4F#Q`$YPG^^@'T0!P^$.@$``$B+30B`>0D`#X7Q````#[9!
+M"BG"2&/"3`^O^$R)?2A!#[9%#X/@','X`HB%@0,``$B!Q"@"``!;74%<05U!
+M7D%?PX!\)!``='%(BT-(2(M\)`A(C4PD($&X`0```+H!````2(MP".@`````
+MA<`/A3#___^`O"0>`@``J@^$#@$``#'`@'PD(%(/A.<```"%P`^$#?___TB+
+M0TA(BWPD"$B-3"0@13'`N@$```!(BW`(Z`````#IZ?[__T4Q]DB+0TA,B?9(
+MBWPD"$B-3"0@13'`N@$```!)@\8!2`-P".@`````28/^`@^$MO[__^O.2,>%
+M:`(``/_____I>O[__P^W14;WV$B822''Z?_^__^#R@>`?1`*B)5@`@``#X57
+M_O__#[9-1+@!````@^D!2-/@2(E%4.D__O__@'U$``^$V_[__S')2(M$S6"-
+M40%(@\$!2(M`*$@!12@/MD5$.=!_Y.FX_O__T>B#X`&(1"00Z53]__^`?"0A
+M10^%#O___\9$)"!%QD0D(5+I!____X"\)!\"``!5#X7D_O__L`'&A"0>`@``
+M5<:$)!\"``"JZ<_^__]F9F:09F9FD&9FD&9FD$%5,?9!5$F)_%532('LB```
+M`$B+1RA(BV\PBSCH7Z'__TB%P$B)PP^$4@$``#'`D,8$*`!(@\`!2(/X6'7R
+M28GE2(G@2(V4)(````#&``!(@\`!2#G0=>Q(BT,(2(M[$$B)YO]0.`^V1"06
+M28U5/$B-302(10,/MD0D%(A%``^V1"05B$4!2(M$)#Q(B44$2(M""$B)00A(
+MBT(02(E!$$B+0AA(B4$8BT(@28U5&(E!($B+1"082(U-*$B)12A(BT((2(E!
+M"$B+0A!(B4$02(M"&$B)01B+0B")02`/M@0DB$50#[9$)`&(15$/MD0D`HA%
+M4@^V1"0#B$532(M#&(E%3(![:`!U<0^V1"07B$4"2(L;2(7;=1CK*V9FD&9F
+MD`^V1"07`$4"2(L;2(7;=!5(BT,(2(M[$$B)YO]0.(!\)!,`=-M)BWPD$$F-
+M="182<=$)%@`````38ED)&!)QT0D:`````#H`````$B!Q(@```!;74%<05W#
+M@$T#!.N)0<=$)%#_____Z[MF9I!F9I!!54F)_3'V05154TB![(@```!(BT<H
+M2(MO,(LXZ,^?__](A<!(B<,/A!<!```QP)#&!"@`2(/``4B#^$QU\DF)Y$B)
+MX$B-E"2`````Q@``2(/``4@YT'7L2(M#"$B+>Q!(B>;_4#@/MD0D%DF-5"0\
+M2(U-!(A%`P^V1"04B$4`#[9$)!6(10%)BT0D/$B)101(BT((2(E!"$B+0A!(
+MB4$02(M"&$B)01B+0B!)C50D&(E!($F+1"082(U-*$B)12A(BT((2(E!"$B+
+M0A!(B4$02(M"&$B)01B+0B")02`/MD0D%XA%`DB+&TB%VW42ZR4/MD0D%P!%
+M`DB+&TB%VW052(M#"$B+>Q!(B>;_4#B`?"03`'3;28M]$$F-=5A)QT58````
+M`$V);6!)QT5H`````.@`````2('$B````%M=05Q!7<-!QT50_____^O'9I!(
+M@^P83(ED)`A(B1PD28G\3(EL)!!(BU\(2(M7$(M#,$R+*XE",("C80(``//'
+M0S#_____@*)A`@``\XMR,$F+?0CH`````(MS-$R)[^@`````2(E84,:`L```
+M``1(B<=,B6!82,>`R`````````!(BQPD3(MD)`A,BVPD$$B#Q!CI`````&9F
+M9I!F9I!F9I!32(M'*$B)^XLXZ`````!(B<?H`````$C'0U@`````2(E;8$B-
+M<UA(QT-H`````$B+>Q!;Z0````!F9F:09F:04TB+?PA(BQ_H`````$B+@^`!
+M``!(QT!8`````$B)0&!(C7!82,=`:`````!(BW@06^D`````9F9FD&9FD&9F
+MD%.#?U#]2(M?0`^$]0```/:#80(```C&@WL#````=&F+1U"#^/T/A-L!``"%
+MP`^%X`$``$B+@X`"``!(BY"@````#[>`J````('B__\/`$@YP@^#B0```$C'
+M@^@"````````2(F;\`(``$C'@^`"````````2(L#2(VSX`(``%M(BW@(Z0``
+M```/MHM@`@``]L$0#X2(````BT=0@_C]#X1"`0``A<`/A4,!``!(BU,(#[9#
+M1`^V4@HIT$B82`^O@V@"``!(.T,H#X/1`0``]H-A`@``"`^%6/___V9FD&:0
+M]H-@`@``4`^%B0```$C'@^@"````````2(F;\`(``.EP____#[:#>P,``#P"
+M#X_\_O__@\`!B(-[`P``Z\]FD/;!('5L]L%`#X2V````]L$!#X2/`0``1(M'
+M4$6%P&:0#X5"`0``2(M3"`^V0T0/ME(**=!(F$@/KX-H`@``2#M#*`^">/__
+M_TB)W[X)````6^F:P___2(N#:`(``"7__S\`2(/X?P^'8?___^G&_O__1(M/
+M4+@+````187)=2F$R;`*>"-(BU,(#[9#1`^V4@HIT$B82`^O@V@"``!(.T,H
+M<G>X#````(/A7TB)WHG'B(M@`@``Z`````#V@V`"```(=6];PX`]``````!U
+M<H/A[TB)WK\(````B(M@`@``6^D`````@#T```````^%F@```$B+@X`"``"`
+MHV$"``#W2(G>OQ0```!(BT`0@*!A`@``]UOI`````$B+@R@#``"`.``/A);^
+M__^#X=^(BV`"``!(B=^^`0```%OIK\+__\='4`````!(B=Z_'````.@`````
+M#[>#=`,``$@!@V@"``#I)/[__X/AOTB)WK\/````B(M@`@``6^D`````2(G?
+MO@,```!;Z6/"___'1U``````2(G>OQP```#H`````.D(_O__@^&_2(G>OPX`
+M``"(BV`"``!;Z0````!F9I!(C89H`P``]H9A`@``"$B)O@@#``#'AA@#````
+M````2,>&,`,```````!(B88@`P``2(V&>@,``$B)MC@#``!(QX9``P``````
+M`$B)AB@#``"+AN@#``")AF@#``!T-\>&$`,``"K_``#'AA0#```$````BX;<
+M`@``,=*#P`&#^&4/3-")EMP"``!(@<;X`@``Z0`````/MHY@`@``]L%P#X2J
+M````B<B#X*`\H`^$GP```$R+1@@/MD9$00^V4`HIT$B82`^OAF@"``!(.T8H
+M#X-\````]L$0N"/_``!U#X/A((#Y`1G`]]`%)?\``(F&$`,``$B+EB`#``!(
+MBX9H`@``2(E"!$&`>`D`=%H/MT9&2(N6(`,``&:)0@SVAF`"```@QX84`P``
+M#@````^$/____TB+AB@#``#&``#'AA@#```!````Z2;___]F9I#SPTB-OO@"
+M``#'AD@#````````Z;C[__](BU8H2"N6:`(``+F`````2(N&(`,``$B!^H``
+M``!(#T?19HE0#.N-2(M'0$C'@.@"````````2(F`\`(``$B-L.`"``!(BP!(
+MBW@(Z0````!F9F:09F:02(/L&$B);"002(E<)`A(B?U(BU\82(7;2`]$WP^V
+M@V$"``"H!'1^J`@/A9,```!(BY.``@``2(72#X2#````2(M""$B%P`^$=@``
+M`$B#>A``=&^`B&$"```(2(VSX`(``$B+0A"`B&$"```(2(L#2,>#Z`(`````
+M``!(B9OP`@``2(MX".@`````2(G>2(ML)!!(BUPD"+\2````2(/$&.D`````
+M#[:78`(``/;"$'412(7;=`2H"'4(]L)@9F:0=`](BUPD"$B+;"002(/$&,-(
+MBT4`@^+W2,>%Z`(```````"#RA!(B:WP`@``2(VUX`(``(B58`(``$B+>`CH
+M`````$B)[DB+7"0(2(ML)!"_!````$B#Q!CI`````&:0055!5$F)_%532(/L
+M"$B+1RB+6`2+..@`````@_L.2(G%=CU!QT0D4/[___])QT0D6`````!-B60D
+M8$F-="182<=$)&@`````28M\)!!(@\0(6UU!7$%=Z0````!F9F:0B=C_),4`
+M````9F9FD&9FD$B)Q4B+11A(A<!U](!]$`4/A.X%``"`I6`"``"_2(GNOPX`
+M``#H`````$2+53!%A=(/B$X&``!(BTT8N@$```#IV`,``$B+11A(A<!T#?:`
+M80(```P/A5C___]F]X5@`@``<`P/A4G____VA8`#```!#X0\____@'T0!0^%
+M&@8``(!]1``/A&,&``!%,>UFD.L4#[9%1$&-50%)@\4!.=`/CD@&``!*BUSM
+M8$B%VW3B@'L0!';<]H-@`@``$'732(M[6.@`````2(M3"`^V4@HYT`^-V_[_
+M_P^V@V`"``!(QX/H`@```````$B-L^`"``!(B9OP`@``@^#W@\@0B(-@`@``
+M2(L#2(MX".@`````2(G>OP0```#H`````.EP____@'T0!0^$B00``("E8`(`
+M`.=(B>Z_!0```.@`````2(M-&+H!````Z<\"``#VA6`"```0#X18_O__]H6`
+M`P```0^$2_[__X"E8`(``.5(BT582(GN2,>%:`(``/____^_!@```$B)15#H
+M`````$B+31B`I6`"``#^2(7)=%2`>40`=$XQ]DB+1/%@2(7`="_V@(`#```!
+M=":`>!`$=B`/MI!@`@``#[:!8`(``(/B`8/@_@G0J`&(@6`"``!U#P^V042-
+M5@%(@\8!.=!_N$B+31A(@WU8`1G2@\("Z1L"``!(BT482(7`=`WV@&$"```,
+M#X6;_?__9O>%8`(``'`,#X6,_?__]H6``P```0^$?_W__X!]$`4/A=@$``"`
+M?40`#X1T_?__13'M9F:09I#K%`^V141!C54!28/%`3G"#XU6_?__2HM<[6!(
+MA=MTXH![$`1VW/:#8`(``"!UTTB+?5!("WU8Z`````!(BU4(#[92"CG0#XT7
+M_?__2(L#@(M@`@``($B-L^`"``!(QX-H`@```````$C'@^@"````````2(F;
+M\`(``$B+>`CH`````$B)WK\)````Z`````#I;?___X"E8`(``-](B>Z_"@``
+M`.@`````Z;[\__^`I6`"``#?Z;+\___VA8`#```!#X2<_/__2(-]6``/A9'\
+M__\/MX5@`@``9B5Q#&:#Z`$/A7S\__^`?1`%#X4\!```@'U$`'0U13'M2HM<
+M[6!(A=MT&(![$`1V$@^V@V`"``"#X$$L`0^$6P0```^V141!C54!28/%`3G0
+M?\Z`I6`"``#WZ33\__^`I6`"``"T2,>%:`(``/____](B>Y(QT50`````+\0
+M````Z`````!(BUT82(7;#X25`@``#[9#1(7`#XZ,`@``@^@!,?8QTDB-2`%(
+MBT338$B%P'0C]H"``P```70:@'@0!'84]H!@`@```;@!````#T7P9F:09I!(
+M@\(!2#G*=<J%]@^$0P(``$B+2QA(B=VZ`0```(/Z`P^5P(3`#X0^`0``9F:0
+M9I!(A<D/A#`!``!(B<U(BTD8Z1P!``"`I6`"``#?2(GNOPL```#H`````.E>
+M^___9O>%8`(``'`(2(N%@`(```^%/_O__TB%P`^$-OO__X"XJP`````/A2G[
+M__](BU`(2(M`$/:"@`,```$/A!3[___V@(`#```!#X0'^___@*)A`@``[TB-
+MM>`"``"`H&$"``#O@(IA`@``"("(80(```A(BT4`2,>%Z`(```````!(B:WP
+M`@``2(MX".@`````2(GNOQ(```#H`````.F\^O__#[>%8`(``$B+C8`"``!F
+M)7`(9CT`"`^%E_K__TB%R0^$COK__TB+00A(BU$02(GNOQ,```"`H&$"``#W
+M@*)A`@``]^@`````2(M-&+H!````Z<?^__](BTT8N@,````QP(3`#X7'_O__
+M@(U@`@``!(/Z`@^$[P```$B+A8`"``!(A<`/A.P```!(BW@(2(M8$$B%_W0%
+MZ`````!(A=L/A!CZ__](B=_H`````&9F9I#I!_K__S';@'U$`'4;9F:0Z7+Z
+M__\/MD5$C5,!2(/#`3G0#XY?^O__2(MTW6!(A?9TXX!^$`1VW?:&8`(``!!T
+MU("F8`(``.>_!0```.@`````Z\&`?40`#X0<^O__,=OK$P^V142-4P%(@\,!
+M.=`/C@7Z__](BW3=8$B%]G3C@'X0!';=]H9@`@``0'34@*9@`@``O[\.````
+MZ`````#KP4B)ZX"C8`(``/Y(B=_H`````.FI_?__2(GOZ`````#I1_G__TB)
+M[^@`````9F:0Z3?Y__](B>_H`````$B+31BZ`0```.F"_?__2(M]6.@`````
+M2(M5"`^V4@HYT`^-__C__TB+10"`C6`"```02(VUX`(``$C'A>@"````````
+M2(FM\`(``$B+>`CH`````$B)[K\$````Z`````"`I6`"``#W2(-]6``/A#?Y
+M___H`````$B+31BZ`0```(E%/.D'_?__2(M]4$@+?5CH`````$B+50@/ME(*
+M.=`/C8#X__](BT4`@(U@`@``($B-M>`"``!(QX5H`@```````$C'A>@"````
+M````2(FM\`(``$B+>`CH`````$B)[K\)````Z`````#I/_C__TB+10"`C6`"
+M``!`2(VUX`(``$C'A6@"````````2,>%Z`(```````!(B:WP`@``2(MX".@`
+M````2(GNOPT```#H`````.FU^___#[:#8`(``$C'@V@"````````2(VSX`(`
+M`$C'@^@"````````2(F;\`(``(/(0(/@]XB#8`(``$B+`TB+>`CH`````$B)
+MWK\-````Z`````#I4/O__V9F9I!52(G]4TB#[`CVAX`#```!=2,/MH=A`@``
+M@^`$/`$9VX'C`/C__X'#`0@``(G82(/$"%M=PP^VEV`"``#VP@(/A#,!``!(
+MBW]8NP(```")V(#,$/;"`0]%V(G8@\@$]L(0#T78B=B`S`'VPB`/1=B)V(#,
+M`H/B0`]%V$B%_P^%(@(```^VE8`#``")V$0/ME5$@\@0]L($10^VR@]%V(G8
+M@\A`@^("#[:580(```]%V(G8#(#VA6`"```(#T78B=B`S`CVP@0/1=B)V(#,
+M!(/B"`]%V$6%R0^.M@```$&-0?\Q]DR-0`'K8$B+>EA(B?A(]]!(A4)0=`.#
+MRP*)V(#,$/;!`0]%V(G8@\@$]L$0#T78B=B`S`'VP2`/1=B)V(#,`O;!0`]%
+MV(G8@\@(2(7_#T78B=@,@(/A"`]%V&9FD$B#Q@%,.<9T2DB+5/5@2(72=.WV
+M@H`#```!=.2`>A`$=MX/MHI@`@``]L$"#X1W____2(MZ6.N!2(M_6#';2(GX
+M2/?02(5%4`^$P/[__^FV_O__]L,"=!'VQQ!F9I!FD`^$Z@```(/C_46%R0^.
+M$@$``$B+56!(A=(/A&W^___V@H`#```!#X1@_O__,?^`>A`$00^VPD2-0/\/
+MAIX````/MG)$A?9^:$B+0F!(A<`/A#?^___V@(`#```!#X0J_O__2(M`2$B#
+M>`@`#X4;_O__,<GK+4B+0FA(A<`/A`K^___V@(`#```!#X3]_?__2(M`2$B#
+MP@A(@W@(``^%ZOW__X/!`3G.=<QF9F:09F:03#G'=&](BU3]:$B%T@^$R?W_
+M_TB#QP'V@H`#```!#X2X_?__@'H0!`^'8O___TB+0DA(@W@(`'3'Z9[]__]F
+MD(G8)0@@``"#^`@/A0G____I`?___^@`````2(M5"(/+"(G9@,T@#[92"CG0
+M#TS9Z;_]__^!RP```$#I7?W__Y!!5D%5051)B?Q54TB+1RA(BU\01(LH1(GO
+MZ`````!(BVL82(/#&$F)QD@YW74+ZTY(BVT`2#G==$5(@[V(_/__`$B-O7#\
+M__]UYD6%[74&]D7P`G5723G^=&;VAX`#```"=,V`IX`#``#]@'\0`71&Z```
+M``!(BVT`2#G==;M)QT0D6`````!-B60D8$F-="182<=$)&@`````28M\)!!;
+M74%<05U!7ND`````@&7P_8!_$`%UNN@`````Z7#____VAX`#```"#X5C____
+M@(^``P```NN49F9FD&9FD&9FD$B#[&A(B5PD2$B);"102(G[3(ED)%A,B6PD
+M8$B+;RB+?0"%_W5*2(M[$.AAF/__QT-0_/___TB+>Q!(C7-82,=#6`````!(
+MB5M@2,=#:`````#H`````$B+7"1(2(ML)%!,BV0D6$R+;"1@2(/$:,/H````
+M`$F)Q(M%!$R-;02H`0^%*0$``*@"#X5Y`0``J`0/A=D!``"H"`^%.`(``*@0
+M=6VH0'0IQT-0`````$&`?0H`00^V1"1J#Y7"08!,)&@0@^#^"=!!B$0D:D&+
+M10"H(`^%G@```$'V1"1H$`^$4O___TF+1"1P28N\)(@```!(B>;_4'@/MD0D
+M$DR)YT&(1"1FZ`````#I*/___V:0QD0D,`)!#[9%"$B-="0PB$0D.$F+1"1P
+M28N\)(@```#_D,````"%P(E#4'4H00^V5"1I@\H!08A4)&E!@'T(``^5P$&`
+M3"1H$(/B_0'`"<)!B%0D:4&+10"H0`^$7____^DQ____QD0D,`=!#[9%"4B-
+M="0PB$0D.$F+1"1P28N\)(@```#_D,````")0U!!]D0D:!`/A(O^___I-/__
+M_\9$)#``00^V101(C70D,(A$)#A)BT0D<$F+O"2(````_Y#`````A<")0U!U
+M($$/MD0D:(/(@$&(1"1H00^V502#R!!!B$0D:$&(5"1GBT4$J`(/A(?^___&
+M1"0P!$$/MD4%2(UT)##&1"0Y`(A$)#A)BT0D<$F+O"2(````_Y#`````A<")
+M0U!U*4$/ME0D:8/*$$&(5"1I08!]!0`/E<!!@$PD:!"#XM_!X`4)PD&(5"1I
+M08M%`*@$#X0H_O__D,9$)#`%00^V109(C70D,,9$)#D`B$0D.$F+1"1P28N\
+M)(@```#_D,````"%P(E#4'4I00^V5"1I@\I`08A4)&E!@'T&``^5P$&`3"1H
+M$(/B?\'@!PG"08A4)&E!BT4`J`@/A,C]___&1"0P`T$/MD4'2(UT)#"(1"0X
+M28M$)'!)B[PDB````/^0P````(7`B4-0=2E!#[94)&F#R@1!B%0D:4&`?0<`
+M#Y7`08!,)&@0@^+WP>`#"<)!B%0D:4&+10"H$`^$:OW__^G2_?__9I!(@^PX
+M2(E<)!A(B6PD($B)^TR)9"0H3(EL)#!(BV\HBWT`A?]U2DB+>Q#H(97__\=#
M4/S___](BWL02(US6$C'0U@`````2(E;8$C'0V@`````Z`````!(BUPD&$B+
-M;"0@3(MD)"A,BVPD,$B#Q#C#Z`````#V100!3(UM!$F)Q'420?9$)&00=*Q,
-MB>?H`````.NBQ@0D`$$/MD4$2(GFB$0D"$F+1"1H28N\)(````#_D,````"%
-MP(E#4'7$00^V1"1D@\B`08A$)&1!#[95!(/($$&(1"1D08A4)&/KHE-(BT<H
-M2(G[BSCH``````^V2&2!>Q@,_P``2(G&B<A`#Y3'P.@"0`^VUX/@`3G0=!J-
-M!+T`````@^'[2(GW"<&#R1"(3F3H`````$C'0U@`````2(E;8$B-<UA(QT-H
+M;"0@3(MD)"A,BVPD,$B#Q#C#Z`````#V100!3(UM!$F)Q'420?9$)&@0=*Q,
+MB>?H`````.NBQ@0D`$$/MD4$2(GFB$0D"$F+1"1P28N\)(@```#_D,````"%
+MP(E#4'7$00^V1"1H@\B`08A$)&A!#[95!(/($$&(1"1H08A4)&?KHE-(BT<H
+M2(G[BSCH``````^V2&B!>Q@,_P``2(G&B<A`#Y3'P.@"0`^VUX/@`3G0=!J-
+M!+T`````@^'[2(GW"<&#R1"(3FCH`````$C'0U@`````2(E;8$B-<UA(QT-H
M`````$B+>Q!;Z0````!F9I!!5T%608G6055!5$F)_%532('L&`(``$"(="0/
M@']$``^$F0```$6-?O]`#[;&13'MB40D".M808/_`0^&GP```(![4`!(BVLX
-M=0>`?"0/`'0-]H6``P```0^%G````$B)W^@`````]D5D$'03]H6``P```0^%
+M=0>`?"0/`'0-]H6``P```0^%G````$B)W^@`````]D5H$'03]H6``P```0^%
MY@```&9FD&9FD$&-10%)@\4!03A$)$1V,$N+7.Q@2(7;=.</MD,0/`1VEHMT
M)`A$B?)(B=_H4/___T&-10%)@\4!03A$)$1WT$R)Y^@`````2('$&`(``%M=
M05Q!74%>05_#9F9FD&9FD#P$2(G=#X2@````08/^`G6/2(GOZ`````#KA4B+
@@ -6749,7 +5405,7 @@ M]H.``P```0^$-_[__TB#NX`"````#X4I_O__9O>#8`(``%`"#X4:_O__2(M-
M=$@Y2R@/APS^__^`90_\@'L0!P^$_0$``(!]#`</A`P"``#'1"1L`````$B+
M?"081(G^Z`````!(A<!)B<</A-/]__^`?"0P!P^$!@,```^V30TQVX3)=1[I
MW@$``&9FD`^V30V-4P%(@\,!#[;!.=`/CL4!``"+?)U\B5PD:.@`````BTPD
-M;#'228G$A<EU&$B#?"00`'002(M\)!!(B<;HRX?__TB)PDR)]DR)Y^@`````
+M;#'228G$A<EU&$B#?"00`'002(M\)!!(B<;HFX?__TB)PDR)]DR)Y^@`````
M2(7`28E$WV!UHXMT)&B%]GX;3(G[,>U(BWM@@\4!2(/#".@`````.VPD:'7J
M3(G_Z`````"X_____^DI_?__0;\'````QD0D,`?&1"1``.F`_?__@'T.!P^%
M!?W__T&_"@```,9$)#`*QD0D0`#I8?W__T&_"0```,9$)#`)QD0D0`#I3/W_
@@ -6762,19 +5418,19 @@ M3@8``$B+7"00@'M$`0^$]/W__\=$)&P!````Z>_]__]!B$]$BTPD+$&`_0%!
MB4\X08E/0`^&[P4``$4/MO4/MEPD0$2(;"1[08U&_T2(="1Z13'D2(/``8E<
M)'Q(B40D"(MT)'Q(BWPD&.@`````2(7`2(G##X0O!0``,=)%A?9^'F9FD$&-
M!!1(F$F+1,=@2(E$TV!(@\(!2#M4)`AUY4&+1SA$B&M$2(GN2(G?B4,X,<!(
-M@WPD$``/E,")PHE$)"CH_MG__T2)XD2)X$4!],'Z'T'W_DB828E<QV!!#[9'
+M@WPD$``/E,")PHE$)"CHWMG__T2)XD2)X$4!],'Z'T'W_DB828E<QV!!#[9'
M1`^V5"1[`E0D>CI$)'L/AML```"(5"1[Z6/___\QVX!]#0!U'.G^^___2`%%
M=`^V10V-4P%(@\,!.=`/CCL"``"+?)U\Z`````!(BT!`2(7`==?IPOK__TR+
M970/ME4-387D#Y7`A=)^!T4Q]H3`=23'1"1H`````(3`=`HY5"1H#X0Z_?__
M#[94)&A!B%=$Z:[^__]"BWRU?$2)="1HZ`````!(B<=(BT!`23G$2(G#20]&
MW#'22(G>Z`````!(A<!+B43W8`^$]/S__T&-1@%)*=R)1"1H#[95#0^5P$F#
MQ@$[5"1H?I"$P'2:ZZ8/ML!!]O4\/T&(1T1W)@^VP#')C5`!B<:-!`Z#P@%(
-M@\$!2)A)QT3'8`````"-0O\\/W;DBU0D*$B)[DR)_^BRV/__00^V5T2%TGXU
+M@\$!2)A)QT3'8`````"-0O\\/W;DBU0D*$B)[DR)_^B2V/__00^V5T2%TGXU
M,?9(BUPD6$F+3/=@#[9#"BG"28M'*$ACTDB)TS'22/?S00^V5T1(B4$HC48!
M2(/&`3G"?\U(@WPD$``/A"<%``!(BU0D$$R)_HM"0$B)UT&)1T#H`````(3`
M#X7O````2(M,)!!!#[:'@`,``$F+7R@/MI&``P``@^#[@^($"=!!B(>``P``
M#[:1@`,``(/@_8/B`@G008B'@`,```^V04A(.5DH08A'2'<]28M'"(!X"@!U
-M#DF+1V!(BT`(@'@*`'0E2(M\)!#H#.W__T&)Q$&!Y`(0``!U?$B+1"0028M7
+M#DF+1V!(BT`(@'@*`'0E2(M\)!#H+.W__T&)Q$&!Y`(0``!U?$B+1"0028M7
M*$@Y4"AR;4B+3"00@+F!`P```@^$``4``$B+7"002(M4)!B+0S!(B=%(@\$X
M08E',$B+0CA(.<AU$>E)`@``2(L`2#G(#X0]`@``2(U0Z$B+7"002#E:4'7E
M3(EZ4.O?2(M$)%@/MD@)Z:?Y__]!O`$```!(BWPD&$B!Q]````#H`````$B)
@@ -6793,7 +5449,7 @@ M`3G0?[)!@*=@`@``O^EW____2(M\)!`Q]C'2Z,+R__](BT0D&$&+=S!(BW@(
MZ`````#IRO[__T2)XD2)X#'MP?H?3(G[0??^A<!!B<5^'$B+>V`Q]KH!````
M@\4!2(/#".A\\O__1#GM=>1!#[9'1$$YQ`^-V?C__T2)XTACPX/#`4F+?,=@
MZ`````!!#[9'1#G8?^?IN/C__T6%Y+@"````=`>`>R@`#Y7`B(.J````Z;']
-M__\QTDB#?"00`$B)[DR)_P^4PNB&U/__Z0W\__](BUPD6`^V2PGIP/;__TB+
+M__\QTDB#?"00`$B)[DR)_P^4PNAFU/__Z0W\__](BUPD6`^V2PGIP/;__TB+
M7"00@'M$``^$H_G__X!]#0`/A)GY__](BT-@13'D2(7`=3[I?_7__TB+3"00
M08U4)`$/MD%$.=`/CK,!```/MD4-.=`/CI$!``!(BU0D$$J+1.)H28/$`4B%
MP`^$1O7__TB+6#A"BWRE?.@`````2#G#=;1(BU0D$`^V0D0Z10T/AR'U__\/
@@ -6802,16 +5458,16 @@ M`3G"#XY)`0``2(M<)!!*BT3C:$F#Q`%(A<`/A-/T__](BU@X0HM\I7SH````
M`$@YPW3`Z;OT__]F9I!FD$F+!T&`CV`"``!`28VWX`(``$G'A^@"````````
M38F_\`(``$B+>`CH`````$R)_K\-````Z`````#I>/W__TR)_^@`````]D4/
M`0^%<OW__TR)_^@`````Z=G\__\QP$6%Y`^%1_S__TB+5"002(M"*.DY_/__
-M2(M\)!!(Q\(`````2(G>Z.6A__\QP.DI]/__28L'08"/8`(``!!)C;?@`@``
+M2(M\)!!(Q\(`````2(G>Z+6A__\QP.DI]/__28L'08"/8`(``!!)C;?@`@``
M2<>'Z`(```````!-B;_P`@``2(MX".@`````3(G^OP0```#H`````.GF_/__
-M2,?"`````$R)_DB)S^B-H?__,<#IT?/__TB+7"00#[9#$#P'#X3$]___Z<[W
+M2,?"`````$R)_DB)S^A=H?__,<#IT?/__TB+7"00#[9#$#P'#X3$]___Z<[W
M__\/MD$0Z^U(BTPD$$B+02B0Z9O[__](BT5T2(M,)!!)B<5,*VDH='U(8\)(
MBWS!6$R+?SA)BW<X2(7V=1'I!`$``$B+-DB%]@^$^````$B#?A@`=>U(BU=(
M2(M*$$B)R$@#0@A(.48(==A(BT802(M?*$DYQ4B)7"1P#X.4````2HT$*4B)
-M0A!(B4<H3(G_3`%N"$PI;A!!@$]D$.@`````2(M%=$B+5"002(E"*$B+11!(
+M0A!(B4<H3(G_3`%N"$PI;A!!@$]H$.@`````2(M%=$B+5"002(E"*$B+11!(
MB==(B8)P`@``2(M%&$B)@G@"``#H`````$B+3"002(L!BW$P2(MX".@`````
M#[9%#TB+7"00@^`<P?@"@+N!`P```HG"#X1K`0``2(M,)!"+@>@#``"(D8$#
-M``#IJ/+__TDIQ4B-!`%(B4(02(E'*$R)_^@`````08!/9!!,B?_H`````$V%
+M``#IJ/+__TDIQ4B-!`%(B4(02(E'*$R)_^@`````08!/:!!,B?_H`````$V%
M[7422(M%=.E?____2,=$)'``````2(M$)!`/ME4-387M1`^V<$0/E<!!.=9\
M-X3`=`5!.=9T:$B+7"001(AS1$B+173I(O___TB+3"0008/&`4TIY4B)2!@/
MME4-#Y7`1#GR?LF$P'3.26/>BWR=?.@`````2(G'2(M`0$DYQ4F)Q$T/1N4Q
@@ -6819,7 +5475,7 @@ MTDR)YN@`````2(M4)!!(A<!(B43:8'6J2(-\)'``=#M(BTPD$`^V041(BWS!
M6.@`````2(M$)!!(BW0D<#'23(G_#[981.@`````2(M4)!"#ZP%(8]M(B43:
M8$B+3"00#[9!1$0Y\`^-B?'__S'M08G$2(M$)!!!C1PL2(/%`4ACVTB+?-A@
MZ`````!(BU0D$$&-!"Q$.?!(QT3:8`````!\S^E.\?__/`(/A(W^__^(@X$#
-M``!(BT0D($C'P@````!(B=](B[#@`0``Z-^>__\QP.DC\?__9F9FD&9F9I!5
+M``!(BT0D($C'P@````!(B=](B[#@`0``Z*^>__\QP.DC\?__9F9FD&9F9I!5
M4TB)^TB#[`A(BV\HBWT`Z`````!(BWL02(U5!$B)QNB+\/__A<")PG0U@_C_
M=#=(BT,P2,=#6`````!(C7-82(E;8$C'0V@`````2(M[$(D02(/$"%M=Z0``
M``!F9I!(@\0(6UW#B4-0Z\1F9F:054B)_5-(@>RH````2(M_$$B+=2A(C40D
@@ -6835,656 +5491,596 @@ M``"+0S!)C4PD.$&)13!)BT0D.$@YR'40ZR1F9I!F9I!(BP!(.<AT%DB-4.A(
M.5I0=>Y(BP!,B6I02#G(=>HQTDB)WS'VZ#;K__]!BW4P28M\)`CH`````$R)
M[^@`````2(M5,$&+A>@#``!(C7582,=%6`````!(B6U@2,=%:`````!(BWT0
MB0)(@\0(6UU!7$%=Z0````!F9F:09F9FD$%5N/____]!5$F)_%5(B?532('L
-MR````(!_$`%(BU]X=`Y(@<3(````6UU!7$%=PTB+1VA,C:PD@````$B+OX``
-M``!,B>[_4'A(BT,(2(GF2(M[$/]0.$B-C"2T````2(V4)+@```!(C;0DO```
-M`$B)W^A9<O__#[:$)(T```"(10+VA"2*`````@^%>@$```^VA"2X`````H0D
-MC````(A%`8N$)+P```"(10!!@'PD9``/B5\!``!!#[9$)&.(10,/MH0DDP``
-M`(A%!0^VE"2(````#[9%!@^VM"2)````P.H&B=&#X/S0ZH/A`0'2"<@/MHPD
-MB0````G0C12U`````(/@\X/B"(/A`<'A`@G(B?$)T(/A$(GR@^#/@^(@"<B)
-M\0G0@^%`B?*#X#^#XH`)R`G0B$4&#[9%!P^VE"2/````@^#\@^(#"=!`]L8$
-MB$4'#X3/````QD4$`DR)[DR)Y^B9=/__2(NT))@```")10A(A?9T(TB-?0Q(
-MC5U"NI8```#H`````+XH````2(G?Z`````#&0R<`0?9$)&1!=1A)BT0D2$B)
-MA:(```!)BT0D0$B)A:H```!)BTPD.$B%R70V,?;K"$B+"4B%R70J2(M!&$B%
-MP'0<2(M`&$B%P'03BX#H`P``2&/6@\8!B825N@```(/^!W[.2('$R````#'`
-M6UU!7$%=PP^VA"2T````Z8'^__\/MH0DD@```(A%`^F:_O__@^8(0(#^`1G`
-M@^#^@\`#B$4$Z1[___]FD$B#[#A,B60D&$R);"0@28G]2(E<)`A(B6PD$$R)
-M="0H3(E\)#!(BT<H2(M?,(LHB>_H`````$F)Q(L#@^@%=!.)PDB)V,9`!0!(
-M@\`!2(/J`77RA>UT:DV%Y'1E28M$)"BZ_____TB)0Q!)BT0D&$B%P'0&BY#H
-M`P``B5,808M4)#"X_____X72#TG"B$,/28L$)$B+>`CH`````(A##D$/MH0D
-M@0,``(A##4$/MD0D$#P$=E?&0PP!08!\)$1`=F5!QT50_____TF+?1!)C758
-M2<=%6`````!-B6U@2<=%:`````!(BUPD"$B+;"003(MD)!A,BVPD($R+="0H
-M3(M\)#!(@\0XZ0`````L`76Q2(US+,9##`),B>?HH/S__X7`=9WKHTF+1"10
-M3(GG2(F#O````.@6=?__B8.P````28N$)'`"``!(B4,L28N$)'@"``!(B4,T
-M00^V?"00Z/UQ__^(@Y````!!#[9$)$5,B>>(@Y$```!!#[9$)$B(@[0```!)
-MBX0D:`(``$B)@YP```#HJ-[__TR)YXF#E````.@`````QH.2`````(F#F```
-M`$&`?"1$``^$2@$``$4Q]D4Q_TN+;/1@2(7M#X3U````@+N3``````^$^0``
-M`(!]$`0/A`@!``"+A>@#``!"B82SQ`````^VDY(```!!@\<!28/&`8/"`8B3
-MD@```$$/MD0D1$0Y^`^/D0````^VTH/Z/W\62&/"@\(!@_H_QX2#Q````/__
-M__]^ZDF+A"2``@``2(7`#X1[_O__2(M0"+G_____2(72=`:+BN@#``")BZ0`
-M``!(BU`0N?____](A=)T!HN*Z`,``(F+J````$B#>`@`#X0\_O__2(-X$``/
-MA#'^__],B>?H`````(F#K````.D>_O__9F:09I!!@_\_#X]E____2XML]&!(
-MA>T/A0O___]"QX2SQ`````````#I'____P^V?1#H?G#__XB#DP```(!]$`0/
-MA?C^__](BT4XBX#H`P``0HF$L\0```#I[_[__S'2Z1?___](@>SH````N/__
-M__](B9PDR````$R)I"38````2(GS2(FL)-````!,B:PDX````$F)_(!_$`%(
-MBV]X="A(BYPDR````$B+K"30````3(ND)-@```!,BZPDX````$B!Q.@```##
-M2(M':$R-K"2`````2(N_@````$R)[O]0>$B+10A(B>9(BWT0_U`X2(V,)+0`
-M``!(C90DN````$B-M"2\````2(GOZ-5L__\/MH0DC0```(A#`O:$)(H````"
-M#X42`0``#[:$)+@````"A"2,````B$,!BX0DO````(@#08!\)&0`#XD,`0``
-M00^V1"1CB$,##[:4)(@````/MD,&#[:T)(D```#`Z@:#X/R)T=#J@^$!`=()
-MR`^VC"2)````"="-%+4`````@^#S@^((@^$!P>$""<B)\0G0@^$0B?*#X,^#
-MXB`)R(GQ"="#X4")\H/@/X/B@`G("="(0P8/MD,'#[:4)(\```"#X/R#X@,)
-MT$#VQ@2(0P</MH0DDP```(A#!71<QD,$`DR)[DR)Y^@:;___2(NT))@```")
-M0P@QP$B%]@^$D/[__TB->PRZE@```$B#PT+H`````+XH````2(G?Z``````Q
-MP,9#)P#I9O[__P^VA"2T````Z>G^__^#Y@A`@/X!&<"#X/Z#P`.(0P3KE`^V
-MA"22````B$,#Z>W^__]F9I!F9I!F9I!!54F)_4%455-(@^P(3(MG*$&+/"2%
-M_W1(,>WK$69FD$B)W^@`````03DL)'8S@\4!B>A!BSR$Z`````"`>!`!2(G#
-M=4?V0&0"=-5(B<?H`````$B)W^@`````03DL)'?-2<=%6`````!-B6U@28UU
-M6$G'16@`````28M]$$B#Q`A;74%<05WI`````$''15#^____Z\MF9F:09F:0
-M9F:02(/L&$B)^$B)7"0(3(ED)!!(B<9(BU\03(MG"$B+.TB!Q]````#H````
-M`$R)YS'2,?;HJ>+__X"+8`(```1(B=],BV0D$$B+7"0(2(/$&.D`````9F9F
-MD&9F9I!F9F:04TB+1PA(B?E(BS@/MX&8````BY=8`@0`2,>'B`($``````!(
-MC;=H`@0`P>`)2,>'<`($``````!(B8]X`@0`2,>'@`($``````"-1`+_B=,Q
-MTO?SB8=H`@0`6^D`````4TB+1RB+..@`````2(N8@`(``(![*`!T3DB+>PA,
-MBXN@````2(M7*$DYT0^$;P$``$DYT0^']@````^$Q@$```^WBZ@````/M_%,
-M.<X/AHT!``!$#[:#J@```$2)R4$/M_%)*?'K0TB+>PA,BXN@````2(MW*$DY
-M\0^$^````$0/MH.J````183`#X70````#[>+J````(GR9D0IR@^WP4F-!`%(
-M.<8/0LI%A,!FQX.:``````!,B8N0````9HF+F````'0/08#X`W0)2(G?6^G+
-M_O__#[>#F````$B-<TA(QT-8`````$@#@Y````!,B4M(2,=#<`````!(B5MX
-M2,>#@`````````#'@X@````!````2(E#4$B-0V!(B4-@2(E#:.@`````A<!T
-MGUO#D`^WBZ@````/M_%(C00R3#G(#X*9````1`^V@ZH```!$B<EF*=$/M_'I
-M!?___V9FD$&`^`,/A";___](BT,02(MP*.D9____1`^V@ZH```!!@/@#=&A%
-MA,!UX$&X`0```,:#J@````'KT69F9I!F9I!$#[:#J@```$&`^`)T/T&`^`%T
-M0@^WBZ@````QTDR)R`^W\4CW]F:%T@^$D_[__P^W\HG1Z8G^__]F9F:09F:0
-M1`^V@ZH```#I=?[__TB)WUOI:LC__\:#J@````!(BU<HZ2O^__]$#[:#J@``
-M`.ND2(/L6`^WP4R)9"0X28G$2(E<)"A(B6PD,$R)="1(20'43(EL)$!,B7PD
-M4(G]2(ET)!!FB4PD#DF)UDB)1"083#MF4$R)PTV+>!!V2D''0%#^____2(US
-M6$C'0U@`````2(E;8$C'0V@`````3(G_2(M<)"A(BVPD,$R+9"0X3(ML)$!,
-MBW0D2$R+?"102(/$6.D`````2(M4)!!,B?^+<C3H`````$B%P$F)Q0^$HP$`
-M`,:`L@````!F@WPD#@%(B5A82,>`R`````````!(QX#```````````^$L`$`
-M`(']&?\``'0[=R6!_0O_``"0#X38````QT-0_O___TR)[^@`````3(M[$.E&
-M____@?TC_P``#X2T````@?TD_P``==1(BU0D$/9"9@(/A30!``!!QH6P````
-M`T'&A9L````D00^VA;$```"#X/N#R`)!B(6Q````08"]L`````,/A$X!``!!
-M#[:%D````#P0#X34`0``/`H/A(T"``!(BT0D$$F)15!)@W](``^$\@(``$F+
-M3T!)C54828U'.$F)5T!)B44828E-($B)$4B+7"0H2(ML)#!,BV0D.$R+;"1`
-M3(MT)$A,BWPD4$B#Q%C#9H-\)`X!#X<<____2(M$)!!(BV@X2(7M=!](BT4(
-M23G&<@U(`T4023G$#X;#`@``2(MM`$B%[77A2(M$)!#V0&8"#X26`@``2<'L
-M($'&A;`````"387D#X2X`P``0<:%F````(I!QH60````$$$/MH6Q````@\@$
-M@^#]08B%L0```.D!____3(M[$,=#4/W____I[_W__TG!["!!QH6P`````DV%
-MY`^$N0```$'&A9@```"(0<:%D````!#ILO[__TB+5"000;@!````3(GQB>Y(
-MQ\<`````,<#H`````.DM_O__3(GQ00^VUDR)\TC!Z1!)P>X82<>%H```````
-M``")R&:!X?\`0<:%F@```$`PP&9!QX60```````)T$2)\DG![@AF08F%E```
-M`##2#[;'"=!F08F%E@```$2)\##`"<%F08F-F`````^W1"0.9D&)A9(```!F
-M08F%G````.E)_O__0<:%F````"A!QH60````"NGY_?__0<:%D0`````/MT0D
-M#D6(M:$```!!QH6B`````$'&A:,`````P>`)08F%E````$R)\$C!Z#A!B(6:
-M````3(GP2,'H,$&(A9L```!,B?!(P>@H08B%G````$R)\$C!Z"!!B(6=````
-M3(GP2,'H&$&(A9X```!,B?!(P>@008B%GP```$R)\$C!Z`A!B(6@````#[=$
-M)`YFP>@(08B%I`````^V5"0.0<:%I@````!!QH6G`````$&(E:4```#I<_W_
-M_T'&A9$`````#[=$)`Y%B+6=````0<:%G@````#!X`E!B864````3(GP2,'H
-M&$&(A9H```!,B?!(P>@008B%FP```$R)\$C!Z`A!B(6<````#[=$)`YFP>@(
-M08B%GP````^V7"0.0<:%H0````!!B)V@````Z?K\__],B>](BUPD*$B+;"0P
-M3(MD)#A,BVPD0$R+="1(3(M\)%!(@\18Z0````!!QH6P`````T'&A9L````T
-MZ7K]__](BU482(722(E4)"`/A#3]__],BT(8387`#X0G_?__28MX6$R)!"3H
-M`````$R+!"1)BU`(.$(*#X8)_?__28V_\````$B+;0A!QH6P`````4R)!"3H
-M`````$B%P$B)P4R+!"0/A*\!``!,B?)(QT`0`````$C'03``````2"GJ2,=!
-M*`````!(QT$X`````$B)$$B+1"08QT%``0```$F)37A-B4502`'02(E!"$B-
-M01A(B4$82(E!($F+0`B`>`D`='1!QH6:`````4$/MDA%2-/J28F5D````$$/
-MMDA$A,D/A-W[__](BUPD($D[6&"X`0```'0?,=*#P@$XR@^$P/O__P^VPDB+
-M7"0@23M<P&!UYHU"`4&(A9L```#IHOO__T'&A9@````J0<:%D`````KI0_S_
-M_TF-AU`"!`!!B[=8`@0`0<:%F@````%)B960````28F%H`````^W1"0.9D&)
-MA9@```!!#[9X1$"$_W0V2(M4)"!).U!@N`$````/A*4````QTNL6#[;*2(M<
-M)"!(8\%).US`8`^$A````(/"`4`X^G7B#[=$)`XQTDG'AX@"!```````2<>'
-M<`($``````!-B:]X`@0`3(G_2<>'@`($``````#!X`F-1`;_]_9)C;=H`@0`
-M08F':`($`$B+7"0H2(ML)#!,BV0D.$R+;"1`3(MT)$A,BWPD4$B#Q%CI````
-M`,=#4/W____I&/K__[@!````T^!!B(6;````Z7'___]F9F:09F9FD$B#[%A(
-MA?9(B5PD*$B);"0P3(G#3(E\)%!,B60D.$B)]4R);"1`3(ET)$A!B<]-BV`0
-MB7PD%$B)5"0(18NT)%@"!`!T"?:&80(```1T24B-<UC'0U#^____2,=#6```
-M``!(B5M@2,=#:`````!,B>=(BUPD*$B+;"0P3(MD)#A,BVPD0$R+="1(3(M\
-M)%!(@\18Z0````!(BT8(#[9("H3)=*M!#[?'2`-$)`A(B40D&`^V5D0/ML$I
-MPDB+1BA(8])(B=$QTDCW\4@Y1"08#X=Z____28V$)/````!(B<=(B40D(.@`
-M````2(7`28G%#X1L`@``BW4T3(GGZ`````!(A<!)B<`/A$@"``!(BT0D&$B+
-M3"0(2<=%$`````!)QT4P`````$G'12@`````2<=%.`````!)B44(28U%&$F)
-M30!!QT5``0```$V):'A)B44828E%($'&@+`````!BP4`````28E86(7`?@P[
-MA=P"```/G\`/ML!!B4!H2(M%"(!X"0`/A,@```"+3"04@>D+_P``@_D:#X?L
-M`0``N`$```!(T^"I`(``!`^%*`(``*D`0``"#X40`@``J0$```$/A,,!``!!
-MQH":`````0^V345)QX#``````````$C3;"0(28EH4$B+3"0(0<:`L@````!)
-MQX#(`````````$F)B)````!)@WPD2``/A-0!``!)BTPD0$F-4!A)C40D.$F)
-M5"1`28E`&$F)2"!(B1%(BUPD*$B+;"0P3(MD)#A,BVPD0$R+="1(3(M\)%!(
-M@\18PT$/M\<QTHM,)!3!X`E!C40&_X'I"_\``$'W]H/Y&HG&#X<1`0``N`$`
-M``!(T^"I`(``!`^%,P$``*D`0``"#X49`0``J0$```$/A.@```!!QH":````
-M`4F-A"10`@0`28EH4$G'@,``````````2<>`R`````````!,B>=)B8"@````
-M2(M$)`AF18FXF````$'&@+(`````28F`D````$&)M"1H`@0`28VT)&@"!`!)
-MQX0DB`($``````!)QX0D<`($``````!-B80D>`($`$G'A"2``@0``````$B+
-M7"0H2(ML)#!,BV0D.$R+;"1`3(MT)$A,BWPD4$B#Q%CI`````$B+?"0@3(GN
-MZ`````!(BWL02(US6,=#4/W___](QT-8`````$B)6V!(QT-H`````.GG_/__
-M2(M\)"!,B>Y,B00DZ`````!,BP0D3(G'Z`````!,BV,0Z9_\__\!]D'&@)H`
-M```"Z>O^__]!QH":`````^G>_O__0<:`F@````+I]OW__T'&@)H````#Z>G]
-M__](BUPD*$B+;"0P3(G'3(MD)#A,BVPD0$R+="1(3(M\)%!(@\18Z0````"0
-M2(/L&$B)'"1,B60D"$B)^TR);"002(M'*(LX1`^W8`Q,BV@$Z`````"+>QA)
-MB=A$B>%,B>I(BQPD3(MD)`A,BVPD$$B)QDB#Q!CIH?O__Y!(@^P82(D<)$B)
-M;"0(2(G[3(ED)!!(BT<HBSA,BV`$#[=H#.@`````@'@0`4B)QG0CBWL8#[?-
-M28G83(GB2(L<)$B+;"0(3(MD)!!(@\08Z4S[__^+>Q@/M\U)B=A,B>)(BQPD
-M2(ML)`A,BV0D$$B#Q!CI*?3__V9FD&9FD&9FD$B#[!A(B1PD2(EL)`A(B?M,
-MB60D$$B+1RB+.$R+8`0/MV@,Z`````"`>!`!2(G&=".+>Q@/M\U)B=A,B>)(
-MBQPD2(ML)`A,BV0D$$B#Q!CIS/K__XM[&`^WS4F)V$R)XDB+'"1(BVPD"$R+
-M9"002(/$&.FI\___9F:09F:09F:02(/L&$B)'"1,B60D"$B)^TR);"002(M'
-M*(LX1`^V8`A$BV@$Z`````"+>QA)B=A$B>%,B>I(BQPD3(MD)`A,BVPD$$B)
-MQDB#Q!CI4?K__Y!(@^P82(D<)$B);"0(2(G[3(ED)!!(BT<HBSA$BV`$#[9H
-M".@`````@'@0`4B)QG0DBWL80`^VS42)XDF)V$B+;"0(2(L<)$R+9"002(/$
-M&.G[^?__BWL80`^VS42)XDF)V$B+;"0(2(L<)$R+9"002(/$&.G7\O__9F9F
-MD&9FD$B#[!A(B1PD2(EL)`A(B?M,B60D$$B+1RB+.$2+8`0/MF@(Z`````"`
-M>!`!2(G&="2+>QA`#[;-1(GB28G82(ML)`A(BQPD3(MD)!!(@\08Z7OY__^+
-M>QA`#[;-1(GB28G82(ML)`A(BQPD3(MD)!!(@\08Z5?R__]F9F:09F:0055!
-MB?5!5%5(B?U32(/L"(7VB;5<`@0`=#%(B?M%,>1$B>!(B>]!@\0!2,'@!$B-
-MM`58`@``Z`````!(B8-0`@``2(/#$$4Y['752(L%`````,>%8`($`!(```!(
-MA<!T&HM0$#F58`($`'8&B95@`@0`2(M`"$B%P'7F2(/$"%M=05Q!7<-F9F:0
-M9F:09F:055-(B?M(@^P(1(N'7`($`$6%P'0L,>V)Z$B)WX/%`4C!X`1(`=A(
-MBY!8`@``2(NP4`(``.@`````.:M<`@0`=];'@UP"!```````2(G?2(/$"%M=
-MZ0````!F9F:09F:055-(B?M(@^P(@+^P`````TB+;U@/A(P````/MH.R````
-M/!`/A)$````\!70C=Q,L`0^$D0```,=%4/____]FD.L5/`L/A8<```!F9I!F
-M9I#'15#]____2(MS>$B%]G0/2(L[2(''\````.@`````2(L[Z"G___](B=_H
-M`````$C'15@`````2(EM8$B-=5A(QT5H`````$B+?1!(@\0(6UWI`````/:'
-MFP````$/A&?____&A[(````02(M%,,8``<:#L@````''15``````ZX8\#0^$
-M=____\=%4/_____I<O___V9F9I!F9F:09F:054B)_5-(@^P(2(M?6(M#&#TD
-M_P``=&D]&?\``'1B@+VR````$'9RQT-0_____V:02(M]`$B+=7A(@<?P````
-MZ`````!(BWT`Z&/^__](B>_H`````$C'0U@`````2(E;8$B-<UA(QT-H````
-M`$B+>Q!(@\0(6UWI`````&9F9I"`O;(````,=$Q(BT,PQ@``@+VR````$'>.
-M2`^^C;(```"X`0```$C3X*D@*0$`=12H`@^$;____\=#4`````#I;/___\=#
-M4/W___]F9I!FD.E;____2(M#,+\1````Q@`!2(MU4.@`````QH6R`````>O%
-M9F9FD&9FD&9FD&9FD$B#[!A(B5PD"$B);"002(G[@W\<!TB+1RB+*'8&@W\@
-M`W<=QT-0_O___TB+7"0(2(ML)!!(@\08PV9F9I!F9I")[^@`````2(7`=->)
-M[^@`````2(L02#M3$'0)QT-0_/___^O%2(-X&`!UMX!X$`1VL8MP,(/^_W2P
-M2(MZ".@`````A<!TH\=#4/____]FD.N89F9FD&9F9I!F9I!F9I!(@^P82(D<
-M)$R)9"002(G[2(EL)`A$BX^$`P``28GT187)=0I(@[_@`P```'05,<!(BQPD
-M2(ML)`A,BV0D$$B#Q!C#BW<P@_[_=!!(BP=(BW@(Z`````"%P'73@'L0!'8_
-M9O>#8`(``'`(=<*`>T0`="<Q[4B+?.M@2(7_=`Q,B>;H>O___X3`=*0/MD-$
-MC54!2(/%`3G0?]NX`0```.N0=!-,B>9(B=_H@V3__P^VP.E[____2(M[.$R)
-MYNAO9/__#[;`Z6?___]F9F:09F:02(/L"(!_$`1V%C'`2(._@`(```!T"DB#
-MQ`C#9F:09I#H"____TB#Q`@/ML##9F:0059!54%455-(BT\H2(G[2(M7,(L!
-MQP(`````08G&08G%08'F``$``$&!Y?\```!T?T4QY+T$````ZS-F9I!FD$B#
-M>!@`=5XQ]H!X$`5(B<=(#T/PZ'?___^$P'1(08/$`4B#Q01%.>QT1DB+2RB+
-M/"GH`````$6%]G7%2(-X&`!U(V;W@&`"``!P"'48BW`P@_[_=,A(BP!(BW@(
-MZ`````"%P'2X2(M3,$&-1"0!B0)(QT-8`````$B)6V!(C7-82,=#:`````!(
-MBWL06UU!7$%=05[I`````&9F9I!F9I!!5S'2059!54%428G\55-(@^P(2(M/
-M*(L!]L3_08G%#Y3"08'E_P```(E4)`1(BU<P00^5QT6$_T0/MG0D!,<"````
-M`'1K,>U%A/9T-F9FD(GHB>N+?($$Z``````Q]H!X$`5(B<=(#T/PZ('^__^$
-MP`^$N@```(U#`4B#Q0%!.<5W=46$_W0I,=MF9I!F9I!)BT0D*(G:2(/#`8M\
-MD`3H`````$B)Q^@`````03G==]]$BU0D!$6%TG5,0<=$)%``````2<=$)%@`
-M````38ED)&!)C70D6$G'1"1H`````$F+?"002(/$"%M=05Q!74%>05_I````
-M`$6$]G2&28M,)"CI2?___T6$_W2X28M$)"B+>`3H`````$B#Q`A(B<<Q]EM=
-M05Q!74%>05_IOWS__TF+5"0PC4,!0<=$)%#_____B0+I>____V9F9I!F9I!(
-M@^Q(2(E<)#!(B6PD.$B)^TR)9"1`2(MO6$R+9U"!?1A"_P``#X2E````#[:'
-MFP```$B+53"(0@H/MX>4````B$(&#[>'E@```(A"!P^WAY@```"(0@@/MH>:
-M````B$()#[>'D````(A"!`^WAY(```"(0@4/MX><````B$(+@+NR`````0^$
-MJP```,=%4/____](B=_H`````$B+?1!(C7582,=%6`````!(B6U@2,=%:```
-M``#H`````$B+7"0P2(ML)#A,BV0D0$B#Q$C##[:'FP```$B+53"(0@\/MX>4
-M````9HE""`^WAY8```!FB4(*#[>'F````&:)0@P/MH>:````B$(.#[>'D```
-M`&:)0@0/MX>2````9HE"!@^WAYP```!FB4(0@+NR`````0^%5?___XM%&,=%
-M4``````]0O\``'15/1C_```/A4#___](BT4H@'@*\@^%,O___TF+1"1H2(GF
-M28N\)(````#_4'A(BU0D&$B!P@`!```/M@*H!`^$"/___X/@^TR)YX@"Z```
-M``#I]O[__TB+12B`>`_R#X7H_O__9F:09I#KKV9F9I!F9F:09F:09F:0058Q
-MP$%505154TB)^V9FD,8$&`!(@\`!2(/X+'7RQP,L````Z,=2__^(0P1(BP4`
-M````2(,X``^40P5(BST`````Z`````#!X`P]____`0^&CP```,9#!@7&0P<+
-M#[9#"T&\!0```$4Q[44Q]L9#"`#&0PD!QD,*#X/@_H/("(A#"^LA1(GHQD0K
-M'$"#R"!!@_P%1`]$Z$&#Q@%!@\0!08/\#70N1(GGZ`````!(A<!TZ42)YT$/
-MMN[H\E/__T&#_`:(1"L,=;Q!@\U`QD0K'`+KQ$&`_6!T&%M=05Q!74%>,<##
-MQD,&!\9#!P?I;/___TB+!0````"#N*0"!``#=MA!#[;&QD0##!+&1`,<0#'`
-M6UU!7$%=05[#9F:09F:04TB)^TB+?S#HT_[__X7`=`?'0U#_____2,=#6```
-M``!(B5M@2(US6$C'0V@`````2(M[$%OI`````&9FD&9FD$%6055)B?U!5%53
-M2(/$@$R+9Q!,B>?HI5S__T6+G"2@`@0`187;#X61````28ML)!!!QX0DH`($
-M``$```!(A>T/A*T```!(BT4(2(M]$$B)YO]0.`^V1"0000&$)*`"!`"`?"00
-M`'0U,=MF9I!F9I!(B>E(Q\(`````B=Y(B>_H`````(3`=0E!@ZPDH`($``$/
-MMD0D$(/#`3G8?]-(BVT`2(7M=:!!BX0DH`($`(/H`87`08F$)*`"!`!T0DF+
-M?1!)C7580<=%4/S___])QT58`````$V);6!)QT5H`````.@`````2(/L@%M=
-M05Q!74%>PT''A"2@`@0``````$F-M"0X`@``28U\)$A)QX0D.`(```````!-
-MB:0D0`(``$G'A"1(`@```````.@`````ZXIF9F:09F:09F:09F:0Z0````!F
-M9F:09F9FD&9FD$B#["A,B60D&$R);"0@28G\2(E<)`A(B6PD$$F)]4B+;QB#
-MK:`"!``!A=(/B+0```#H`````$B%P$B)PP^$L0```(`]``````!U-4B)WK\"
-M````Z`````"+G:`"!`"%VW0^2(M<)`A(BVPD$$R+9"083(ML)"!(@\0HPV9F
-MD&:0#[9`9*@"=<.H`0^%@P```/9#9`1UM8!+9"3KKV9F9I!(C;4X`@``2(U]
-M2$C'A3@"````````2(FM0`(``$C'A4@"````````2(M<)`A(BVPD$$R+9"08
-M3(ML)"!(@\0HZ0````!(C7\@Z`````#I9?___TF+1"0(3(GO_Y"`````28U\
-M)"!,B>[H`````.E%____2(G?Z`````!F9I!FD.EK____9F9FD&9F9I!F9I!(
-M@^P82(D<)$R);"002(G[3(ED)`A(BT<H1(M@!(LXZ`````!$B>=)B<7H````
-M`$R)[TB)QN@`````@_@!2(M[$$B-<U@9P$C'0U@`````2(E;8/?02,=#:```
-M``")0U!(BQPD3(MD)`A,BVPD$$B#Q!CI`````&9FD&9FD&9FD$%4@#T`````
-M`%5(B?U3='%(BU\83(UG&$PYXW4+ZS.02(L;3#GC="J`NX#\__\!2(V[</S_
-M_W7H]D/P`73B#[8U`````.@`````2(L;3#GC==;'A3@!````AY,#2,>%2`$`
-M``````!(C;4X`0``2(FM4`$``$B)[UM=05SI`````%M=05S#9F9FD&9FD&9F
-MD$%505152(G]4TB![,@```!,BV\02(MW*$B-1"0,28GD2(GGQ@<`2(/'`4@Y
-MQW7TNK````!!QP0D?`$``.@`````2(M=,#'V3(GB3(GOZ.['__^#^/^)`W4#
-MB4502(M]$$B-=5A(QT58`````$B);6!(QT5H`````.@`````2('$R````%M=
-M05Q!7<-F9I!FD%4QP$B)_5-(@^P(2(M?,)#&!!@`2(/``4@]@````'7P2(G?
-MZ%CZ__^%P'0NQT50_____TC'15@`````2(EM8$B-=5A(QT5H`````$B+?1!(
-M@\0(6UWI`````,<#@````,=#/``@```QT@^V1!H,@^`/@^@#/`)W!<9$&BP&
-M2(/"`4B#^A!UXNNJ9F9FD&9FD$%7059!54F)_4%455-(@^P(2(M'*$B+7S"+
-M*#'`9F:0Q@08`$B#P`%(/?H```!U\(GOZ`````!)B<0QP&9F9I#&!!@`2(/`
-M`4@]^@```'7PA>UT9DV%Y'1A28M$)"BZ_____TB)0P1)BT0D&$B%P'0&BY#H
-M`P``B5,,08M4)#"X_____X72#TG"B$,#28L$)$B+>`CH`````(A#`D$/MH0D
-M@0,``(A#`4$/MD0D$#P$=S\L`0^$LP$``$''15#_____2<=%6`````!-B6U@
-M28UU6$G'16@`````28M]$$B#Q`A;74%<05U!7D%?Z0````#&`P%)BT0D4$R)
-MYV:)@^@```#HB%#__XF#Y````$F+A"1P`@``2(E#($F+A"1X`@``2(E#*$$/
-MMGPD$.AO3?__B(.$````00^V1"1%3(GGB(.%````28N$)&@"``!(B8/0````
-MZ":Z__],B>>)@X@```#H`````,:#A@````")@\P```!!@'PD1``/A&@!``!%
-M,?9%,?]+BVST8$B%[0^$$P$``("[AP`````/A!<!``"`?1`$#X0F`0``BX7H
-M`P``0HF$LXP````/MI.&````08/'`4F#Q@&#P@&(DX8```!!#[9$)$1$.?@/
-MCZ\````/MM*#^@]_%DACPH/"`8/Z#\>$@XP```#_____?NI)BX0D@`(``$B%
-MP`^$LO[__TB+4`BY_____TB%TG0&BXKH`P``B8O8````2(M0$+G_____2(72
-M=`:+BN@#``")B]P```!(@W@(``^$<_[__TB#>!``#X1H_O__3(GGZ`````")
-M@^````#I5?[__TB-<R#&`P),B>?HA-;__X7`#X4V_O__Z3G^__]F9F:09F:0
-M08/_#P^/1____TN+;/1@2(7M#X7M_O__0L>$LXP`````````Z0'___\/MGT0
-MZ-Y+__^(@X<```"`?1`$#X7:_O__2(M%.(N`Z`,``$*)A+.,````Z='^__\Q
-MTNGY_O__059!54F)_4%455-(BT<H2(M?,(LH,<#&!!@`2(/``4@]V````'7P
-MB>_H`````$F)Q#'`Q@08`$B#P`%(/=@```!U\(7M=#A-A>1T,TF+1"0HNO__
-M__](B4,$28M$)!A(A<!T!HN0Z`,``(E3#$$/MD0D$#P$=SDL`0^$"@$``$''
-M15#_____2<=%6`````!-B6U@28UU6$G'16@`````28M]$%M=05Q!74%>Z0``
-M``#&`P%)BX0D<`(``$B)0Q!)BX0D>`(``$B)0QA!#[9\)!#HVDK__XA#=$$/
-MMD0D14R)YXA#=4F+A"1H`@``2(F#P````.B7M___3(GGB4-XZ`````#&0W8`
-MB8.\````08!\)$0`#X2T````13'VZS2`?1`$=%`/ME-VBX7H`P``B423?`^V
-M0W:#P`$\#XA#=G=D00^V1"1$08U6`4F#Q@$YT'Y22XML]&!(A>UTY(![=P!U
-MO`^V?1#H1$K__XA#=X!]$`1UL$B+53@/MD-VBY+H`P``B52#?.NJ2(US$,8#
-M`DR)Y^C(V?__A<`/A=_^___IXO[__P^V4W:#^@]F9F:0#X_1_O__2&/"@\(!
-M@_H/QT2#?/____]^[>FY_O__,=+KY&9F9I!F9F:09F:09F:0059!54F)_4%4
-M55-(BT<H2(M?,(LH,<#&!!@`2(/``4@]K@```'7PB>_H`````$F)Q#'`Q@08
-M`$B#P`%(/:X```!U\(7M=#=-A>1T,DF+1"0HNO____^)0P1)BT0D&$B%P'0&
-MBY#H`P``B5,(00^V1"00/`1W.2P!#X0)`0``0<=%4/____])QT58`````$V)
-M;6!)C7582<=%:`````!)BWT06UU!7$%=05[I`````,8#`4F+A"1P`@``2(E#
-M#$F+A"1X`@``2(E#%$$/MGPD$.C[2/__B$-P00^V1"1%3(GGB$-Q28N$)&@"
-M``")@YP```#HN;7__TR)YXE#=.@`````QD-R`(F#F````$&`?"1$``^$L```
-M`$4Q]NLT@'T0!'10#[93<HN%Z`,``(E$DW@/MD-R@\`!/`>(0W)W9$$/MD0D
-M1$&-5@%)@\8!.=!^4DN+;/1@2(7M=.2`>W,`=;P/MGT0Z&9(__^(0W.`?1`$
-M=;!(BU4X#[9#<HN2Z`,``(E4@WCKJDB-<PS&`P),B>?HZM?__X7`#X7@_O__
-MZ>/^__\/ME-R@_H'#X_6_O__2&/"@\(!@_H'QT2#>/____]^[>F^_O__,=+K
-MY&9F9I!!54F)_4%455-(@^Q(2(M?*(L[A?]U=$B++0````#&1"0P!DB%[70W
-M3(UD)#!(BUT02(7;="!(BT,0,?],B>9(B40D.$B+0PC_D,````!(BQM(A=MU
-MX$B+;0!(A>UUSDF+?1!)C7582<=%6`````!-B6U@2<=%:`````#H`````$B#
-MQ$A;74%<05W#Z`````!(B<4/MD,$3(UC!(3`=3N`?1`!#X0B`0``0<=%4/[_
-M___V1600=*A(BT5H2(N]@````$B)YO]0>`^V1"0.2(GOB$5BZ`````#KA2P!
-M=`U!QT50_O___^ET____@'T0!)!VMT$/MD0D`3P!=$=F9F:0#X/*`0``08-]
-M'!AF9I!FD'672(V5<`(``#'`Q@00`$B#P`%(@_@0=?))BT0D!$B)`DF+1"0,
-M2(E""("-8`(```3K;D&#?1Q(#X5;____2(V-C`(``#'`Q@0(`$B#P`%(@_@$
-M=?))BT0D!$F-5"0$2(D!2(M""$B)00A(BT(02(E!$$B+0AA(B4$82(M"($B)
-M02!(BT(H2(E!*$B+0C!(B4$P2(M".$B)03B`C6`"```$]H5@`@``!`^$H?[_
-M_TB)[^@`````Z93^__]!@'PD`04/A]+^__]!#[9$)`%F9I#_),4`````08-]
-M'`EF9F:0#X6S_O__QD0D,`E!#[9$)`1(C70D,(A$)#A(BT5H2(N]@````/^0
-MP````$&)15#IC?[__T&#?1P)#X5Z_O__QD0D,`5!#[9$)`3&1"0Y`(A$)#A(
-MBT5H2(UT)#!(B[V`````_Y#`````08E%4(!-9!#I2_[__T&#?1P)#X4X_O__
-MQD0D,`1!#[9$)`3&1"0Y`(A$)#CKO$&#?1P)#X47_O__QD0D,`-!#[9$)`2(
-M1"0XZZ!!@WT<"0^%^_W__\9$)#`"Z^)!@WT<"0^%Z?W__X!-9(#&1"0P`.O,
-M9F:09I`\`G0-0<=%4/[____IT/[__T&#?1P)#[:U@0,```^%MOW__P^V0PA(
-MC7L(0#C&=$"`?1`$B(6!`P``=C2`?40`="XQR4B+5,U@2(72=!.`>A`$=@T/
-MMH6!`P``B(*!`P``#[9%1(U1`4B#P0$YT'_40(#^`G0,@(U@`@``!.E?_O__
-M@#\"=.](Q\(`````3(GN2(GOZ#=K___I$OW__V:005152(G]4TB+7RB+.TR-
-M8P3H`````$B)QHM#!*@!=#I(C99P`@``,<!F9F:09F:0Q@00`$B#P`%(@_@0
-M=?))BT0D!$B)`DF+1"0,2(E""(".8`(```1!BP0DJ`)T8TB-CHP"```QP,8$
-M"`!(@\`!2(/X0'7R28M$)!1)C50D%$B)`4B+0@A(B4$(2(M"$$B)01!(BT(8
-M2(E!&$B+0B!(B4$@2(M"*$B)02A(BT(P2(E!,$B+0CA(B4$X@(Y@`@``!/:&
-M8`(```1T"$B)]^@`````2,=%6`````!(B6U@2(UU6$C'16@`````2(M]$%M=
-M05SI`````&9FD&9FD&9FD$%505154TB)^TB![,@```!,BV<H2(GE08L\).@`
-M````28G%2(U$)`Q(B>=F9I!FD,8'`$B#QP%(.<=U]$F-="0$NK````#'10!\
-M`0``Z`````!(BWL02(GJ3(GNZ*^[__^%P(G"="R#^/]T-4B+0S!(BWL02(US
-M6$C'0U@`````2(E;8$C'0V@`````B1#H`````$B!Q,@```!;74%<05W#B4-0
-MZ\9F9F:09F:09F:005152(G]4TB+1PA(BQB+LV@"!`!(B=],BZ/@`0``Z)WE
-M__](BU4(2(M%$(MP-#ER-`]#<C1(BSKH`````$B%P$F)P`^$I`$``(L5````
-M`(72?A!(BT4(.Y#<`@``#Y_`#[;008E0:$'&@+(`````#[:%J@```(3`#X7H
-M````2(U%2$F)0'!(BT4(08"(L0````*+BU@"!`!)B4!0#[>%F@````^WE9@`
-M```IPHG(BXM@`@0`P>@)@^D!#Z_!.<(/1]"X``$``&:!^@`!#T;"9D&)@)@`
-M``"`?2@`#X3R````0?:`L0````0/A.0````/MX68````00^WD)@```!(`X60
-M````2"G0#[>5F@```$@IT$F)@)````!!@(BQ````"$V)8%A(@WM(`$G'@,@`
-M````````2<>`P``````````/A`0!``!(BTM`28U0&$B-0SA(B5-`28E`&$F)
-M2"!(B1%;74%<PSP##X00____2(M%$$&`B+$````$28E`4(N#7`($`(7`#X3*
-M````BXM8`@0`,?9(BY-0`@0`B?!(P>`$A<E(BQ00=!J)R&9FD&:0Q@(`2(/"
-M`4B#Z`%U\XN+6`($`(/&`3FS7`($`'?&Z<G^__\/MX6:````2`.%D````$F)
-M@)````#I+/___P^VA:H```"$P'5,2(M]"$B-=4CH`````$B+10A(BSCH/^3_
-M_T''1"10_____TG'1"18`````$F-="1838ED)&!)QT0D:`````!;74F+?"00
-M05SI`````#P#=;WKKEM=05Q,B<?I`````(N+6`($`.D[_O__9F9FD&9F9I!F
-M9F:09F:02(/L*$B);"002(G]2(E<)`A,B60D&$R);"0@#[:%L@```$B+5U!,
-MBV=82(L_2(N:@`(``#P!=$@\`@^$5P$``$B-<S#&A;(`````2(/'2$C'0S``
-M````2(EK.$C'0T``````2(M<)`A(BVPD$$R+9"083(ML)"!(@\0HZ0`````/
-MMX.:````9@.%F````$@[4PAFB8.:````#X3G`@``#[>#F@```&8[@Y@````/
-M@XT!```/MH6Q````2,=%>`````!(QT5P`````(/@_8/(!(B%L0```$B+4Q!(
-MB550QH6R``````^W@YH````/MY.8````BX]@`@0`@^D!*<*+AU@"!`#!Z`D/
-MK\$YP@]'T+@``0``9H'Z``$/1L)FB868````@'LH`'0-]H6Q````!`^%;@(`
-M``^W@YH```!(`X.0````2(F%D````/:%L0````(/A/T!``!(@W](``^$\@$`
-M`$B+3T!(C5482(U'.$B)5T!(B4482(E-($B)$4B+7"0(2(ML)!!,BV0D&$R+
-M;"0@2(/$*,-(BT,(QH.K`````8"@@`,``/Y(BT,0@*"``P``_DB+0PB`H&$"
-M``#W2(M#$("@80(``/=(BT,(2(LXZ`KB__\/MH.J````A,`/A/L````\`P^$
-M\P```$B)[^@`````0<=$)%#_____28M\)!!)C70D6$G'1"18`````$V)9"1@
-M2<=$)&@`````2(M<)`A(BVPD$$R+9"083(ML)"!(@\0HZ0````!F9F:02(N:
-M@`(``(![*`!(BTL(2(M3$$0/MJNJ````#X21````#[>#F````$B+DZ````!(
-M*<)!@/T!2(F3H`````^$<P$``$&`_0(/A'\!``!(@[N@``````^%CP```$B+
-M.>@]X?__183M#X0X`0``08#]`P^$+@$``$B)[^@`````2(G?2(ML)!!(BUPD
-M"$R+9"083(ML)"!(@\0HZ1*;__]FD$B+>PA(C7-(Z`````#I^_[__P^W@Y@`
-M``!(`X.@````183M2(F#H````'5I2#M!*'4'QH.J`````4B+0BA(.8.@````
-M#X1Q____2(LYZ*[@__]%A.T/A)<```!!@/T#D`^$C````$B)[^@`````9I#I
-MJ?[__TB)[TB+7"0(2(ML)!!,BV0D&$R+;"0@2(/$*.D`````08#]`W6>2#M!
-M*'68Z17___]F.X.8````9F:0#X)(_?__9L>#F@``````Z?O\__\/MX.8````
-M#[>3F@```$@#@Y````!(*=`/MY68````2"G02(F%D````.EY_?__2(M["$B-
-M<TCH`````.EB____2(M["$B-<TCH`````.G`_O__2#M1*`^%C?[__\:#J@``
-M``#I@?[__T@[42@/A7?^___I@/[__V9FD&:0]H>Q`````DB+!\:'L@````!T
-M(TB#>$@`=!Q(BTA`2(U7&$B)4$!(@\`X2(E'&$B)3R!(B1'#Z0````!F9I!F
-MD%-(B?M(BS^+MV@"!`#HWM[__TB+`TB#>$@`=!U(BTA`2(U3&$B)4$!(@\`X
-M2(E#&$B)2R!(B1%;PTB)WUOI`````&9F9I!F9F:09F:09F:02(/L.$B)7"0(
-M2(EL)!!,B60D&$R);"0@3(ET)"A,B7PD,$B+7UA,BW=@3(LK38NEX`$``$F+
-M1"0H1(LXZ`````"`>Q`$#X:=````2(NK@`(``$B%[0^$[0```$B+?0A(A?]T
-M#+H"````,?;HD+#__TB+?1!(A?]T#+H"````,?;H>[#__TB+11A(BU4@28V]
-MT````$B)[DB)4`A(B0+H`````$&-7@%$.?MT5$F+1"0HB=J+?)`$Z`````")
-MWDB+;"002(M<)`A,BV0D&$R+;"0@2(G'3(MT)"A,BWPD,$B#Q#CI"&'__TB)
-MWT&-7@'H`````$0Y^W6S9F9FD&9FD$F+?"0028UT)%A)QT0D6`````!-B60D
-M8$G'1"1H`````$B+7"0(2(ML)!!,BV0D&$R+;"0@3(MT)"A,BWPD,$B#Q#CI
-M`````+H"````,?9(B=_HJ:___^E'____9F9FD$B#["A,B60D$$B)7"0(28G\
-M3(EL)!A,B70D($R+=PA(BU\028L&2(G>3(GW3(NHX`$``.A(1?__2,>#@`(`
-M``````!)QX:``@```````$$/MI:``P``#[:#@`,``$F-=5B#X@2#X/L)T(B#
-M@`,``$$/MI:``P``@^#]@^(""="(@X`#``!!#[9&2(A#2$F+?1!)QT58````
-M`$V);6!)QT5H`````.@`````2(G>OQ4```#H`````$F+5"0828M$)"!)C70D
-M,$F+/DG'1"0P`````$V)9"0X2<=$)$``````2(E""$B)$$B+7"0(3(MD)!!,
-MBVPD&$R+="0@2(/$*.D`````D)"0D)"0D)"0D)"02(N'V`,``$B%P'0?2(M6
-M"$@Y$',-2(L.2#E("`^'JP```$B+0!!(A<!UY4B+EZ`#``!,C8>@`P``3#G"
-M=#IFD$B-0NB`N+``````=2-(BXB0````#[>`F````$@!R$@Y!G,-2#M."')D
-M9F9FD&9FD$B+$DDYT'7(2(N/L`,``$B!Q[`#``!(.?EU%^M&9F:0@/J`=!Q(
-MBPE(.?EF9I!FD'0Q2(U!Z`^VD+````"$TG7?2(N0D`````^W@)@```!(`=!(
-M.09SSD@[5@ASR+@!````PS'`PV9F9I!F9I!F9I!(@^P02(D<)$B);"0(2(G[
-M2(GUZ`C___^%P'4B2(N#V`,``$B)11!(B:O8`P``,<!(BQPD2(ML)`A(@\00
-MPTB#?2@`N/____]TYDB+@^`#``!(C9/@`P``2(7`=`U(C5`02(M`$$B%P'7S
-MN/____](B2KKO&9F9I!F9F:09F9FD$B+A]@#``!(C9?8`P``2#GP=`U(C5`0
-M2(M`$$@Y\'7S2(M.&$B+1A!,C4X83(N'T`,``$DYR4B)`DC'1A``````=!U(
-MBU8@28L`3(E!"$F)"$B)4`A(B0),B4X@3(E.&$B+!\=`:`$```##9F:09I!(
-M@S\`=`U(BT<(2(EP$$B)=PC#2(EW"$B)-\-F9I!FD$B#QUCI`````&9F9I!F
-M9I!32(N'@````$B)^TB%P'042,>'@`````````!(B[>(````_]!(BX/(````
-M2(L[2(US*$B)6S!(QT,X`````$B)0RA(@\=86^D`````9F9FD$B#[!A(B5PD
-M"$B)^TB);"002(MO4.@`````2(MS>$B+4QA(C4L82(M#((.MB`,```&#K80#
-M```!2(7V2(E""$B)$$B)2R!(B4L8=!9(B>](BUPD"$B+;"002(/$&.D`````
-M2(M<)`A(BVPD$$B#Q!C#9F9FD&9F9I!F9F:09F:0055!5%532(GSB=9(@^P(
-M3(M'6$R+IY````!$#[>OF````$F+B+@```!)BZB0````2(7)#X2H````00^V
-M@+$````/M]*#X`$/ML`YT`^$CP```$2+`42)YRGOP><)1#G'1(G`<PWII@``
-M`&9FD&9FD(G02(/!$(G"`Q$YUW/R1(L!*<=!#[?UB?I(`U$(02GXP>8)1(D#
-M1#G&2(E3"$B-4Q!V)4B+01@K,\=#!`````!(B=-(B4((BT$02(/!$(D"2(/"
-M$#GP<MN),\=#!`$```!(@\0(6UU!7$%=N`$```##28N`P````$B%P'06B?),
-MB<=(B=[_T(7`=`A(B=GI3____TB#Q`@QP%M=05Q!7<,QP.EJ____9F:09F:0
-M9F:0055!5%532(G[2(/L"("_L`````!(BV]0#X42`@``#[>'F````$R+IY``
-M``!*C0P@2(N%V`,``$B%P'0V#[:7L0```(/B0(32=`>+<$"%]G052#E#<'0/
-M2#L(=@I,.V`(#X+R`@``2(M`$$B%P&9FD'742(-[<``/A*$"``"`?1`$#X:I
-M`0``3(NM@`(``$V%[0^$/0(``$&`O:L`````#X4O`@``]H.Q````"`^%(@(`
-M`$B!N\@`````````#X01`@``23MM"`^%!P(``$&`?2@`#X3H`@``28N%H```
-M`$DYQ`^#(P$``$@YP0^&XP$``$B+>PB#1P@!Z`````!(B<=(BP-(B0=(BT,(
-M2(E'"(M#:(E':$F+10A,B:>0````2(E'4+Z`____28N%H````$B)7UC&A[(`
-M````2,>'P`````````!(QX?(`````````$C'A[@`````````9D0IX&:)AY@`
-M```/MH>Q````#[:3L0```(/@/R'6B=&#X4`)\+XP````"<@AUHG1@^#'@^$(
-M"?`)R(G1@^("@^$$@^#Y"<@)T`^VD[$```"#X/Z#X@$)T(B'L0```$B+4W"X
-M`0```$B%TD@/1<)(C5,82(E'<$F+10A(BXBX`P``2(F0N`,``$@%L`,``$B)
-M0QA(B4L@2(D1QH.P````@$B#Q`A;74%<05WI`````$F+11"#K80#```!2(E#
-M4$B)Q8.`A`,```&`>!`$#X>F````9I!(BY6@`P``2(V-H`,``$@YRG4L2(L#
-M2(E+&,=`:`$```!(C4,82(E!"$B)A:`#``!(B4L@2(/$"%M=05Q!7<.#>V@`
-M=3=(B[6H`P``2(U^Z(M':(7`#X@5`0``2(U#&$B)2QA(B86H`P``2(D&2(ES
-M($B#Q`A;74%<05W##X[,````2(U#&$B)4QA(B4((2(F%H`,``$B)2R!(@\0(
-M6UU!7$%=P_:#L0````0/A$_____VA6$"```@#X1"____@*5A`@``W^@`````
-M@(U@`@``!(E%/$B+`\>`E`($``$```!(BT582`E%4.D2____]H.Q````0`^%
-M4OW__TB+A>`#``!(A<!U%NE!_?__9F9FD$B+0!!(A<`/A##]__](.PAV[DP[
-M8`ASZ$B+2"!(C5,82(E0($B#P!A(B4,82(E+($B)$4B#Q`A;74%<05W#2(N5
-MJ`,``$B-0QA(B4L82(F%J`,``$B)`DB)4R#IQ/[__X-':`%(BU8(2(U#&$B)
-M<QA(B48(2(D"2(E3(.FD_O__28N%H````$@YP0^&._[__TDYQ`^#^_[__TB+
-M>PB#1P@!Z`````!(B<=(BP-(B0=(BT,(2(E'"(M#:(E':$F+11#I$_W__V9F
-M9I!F9I!F9I!32(M'4$B)^TB+=WB#@(0#```!2(7V="E(B7XP2(M_4$C'1B@`
-M````2,=&.`````#H`````(7`=1=(BT-X2(E#<$B)WUOI`````&9FD&9FD%O#
-M9F9FD&9F9I!F9I!F9I!52(GY4TB#[`B`N;(````!2(M?6$B+?U!$#[>)F```
-M``^WLY@```!(BZ^``@``=$$/MH&R````2(M["$B)SL:#L`````"(@[(```#H
-M`````$B+0PA(B=^#:`@!2(M%"(.`B`,```%(@\0(6UWI`````$B+@Y````!(
-M.8&0````=:^+04!,BT%(A<!T$HG"3(G`Q@``2(/``4B#Z@%U\TB+10A(.?AT
-M,DB)05!(BX6@````9D0ISF:)L9@```#&@;(`````2(G/2(F!D````$B#Q`A;
-M7>D`````2(M%$.O(D$%72(U'&$R-?UA!5D%528G]05154TB#[!A(B40D"$B-
-M1SA(B00D0<=%:`````#K&TB+0A!(A=))B458="U(QT(0`````$B+>@C_$DF+
-M55A).U5@==M(A=))QT5@`````$G'15@`````==--BW483#MT)`@/A&4"``#'
-M1"04`````$BX(````/____])A4;P28VN</S__TF-7A!T",=$)!0!````3(VE
-ML`,``&9FD&:02(N-H`,``$@YV0^$D@```$B+$4B+00A(B<](@^\82(E""$B)
-M$$B)20A(B0ET=`^VE8`#``#VP@$/A&(!``!$BY6(`P``1872=`^+A<0#```[
-M1V@/CZL!``"#XA@/A:(!``"+1VA,B6<8@X6(`P```8F%Q`,``$B+A;@#``!(
-MB8VX`P``2(D(2(E'($B+10C_4"A(BXV@`P``2#G9#X5N____3(VER`,``&9F
-M9I!F9I!(BXW(`P``3#GA=&1(BQ%(BT$(2(G+2(/K&$B)0@A(B1!(B4D(2(D)
-M=$9(BW-X2(7V="E(B5XP2(M[4$C'1B@`````2,=&.`````#H`````(7`=:Q(
-MBT-X2(E#<$B)W^@`````2(N-R`,``$PYX76<2(.]X`,```!,C:7@`P``="E)
-MBQPD2(7;="!(B=Y(B>_HR_3__X7`#X2$````3(UC$$F+'"1(A=MUX$V+-DP[
-M="0(#X5I_O__1(M,)!1%A<D/A+@```!)@WU8``^%]?W__T&+?6B%_P^%Z?W_
-M_TB#Q!A;74%<05U!7D%?PV9F9I#&A[(````"2(N%N`,``(.%B`,```%(B8VX
-M`P``3(EG&$B)1R!(B0CH`````.DO_O__2(M#$$B-<RA,B?])B00D2(N%V`,`
-M`$B)0Q!(B9W8`P``Z`````!!QT5H`0```.DM____2(N%H`,``$B-5QA,C:7(
-M`P``2(E0"$B)1QA(B5\@2(F5H`,``.F"_O__18N%E`($`$6%P'0=ZVU(BT(0
-M28E%2$B%TG112,="$`````!(BWH(_Q))BU5(23M54'7;2<=%4`````!)QT5(
-M`````.O12(L12(M!"$B)STB#[QA(B4((2(D02(E)"$B)"0^$X?[__^@`````
-M28M-.$@[#"1US^G-_O__0<>%E`($``````!,B>_H`````.N99I!32(L?2(-[
-M2`!T)$B+2T!(C5<82(U#.$B)4T!(B4<82(E/($B)$4B)WUOI`````.@`````
-MZ_"0D)"0D)"0D)"0,=)(A?]T#$B-1_^#P@%((<=U](G0PV9F9I!F9I!F9I!!
-M54G'Q?[___]!5%532(G[2(M[4$B+:QA(A?]U#?:#8`(```(/A9H```!%,>1(
-M"WM8Z`````!(BU,(1`'@#[92"CG0?D>`HX`#``#^]H.``P```70P2(7M="L/
-MMG5$0(3V=")(.5U@3(GH=$PQTNL-#[;*2&/!2#E<Q6!T,8/"`4`X\G7K6UU!
-M7$%=PTB+0U"`BX`#```!2(7`=+!(B<)(,U-8=3>`HV`"``#]ZYY(Q\#^____
-M2-/`2"%%6$B)Z^E,____2(M#"(!X"P$/A5C___]$#[9@"NE1____2(70D`^$
-M9O___X"+8`(```+I6O___V9F9I!F9F:09F:09F:02(MW&$0/MD9$183`="<Q
-MR3'22#E^8'45ZR!F9I!F9I`/MLI(8\%(.7S&8'0-@\(!1#C"=>NY_P```(G(
-MPV9FD$R+1CA-A<!T3TF+0!A(A<!T/DB+0!A(A<!T-4@Y^'1`#[901(72?NHQ
-M]DB+3/!@2(7)=`N`>1`$=@5(.?ET(4B#Q@$Y\G_C2(M`&$B%P'7+38L`387`
-M=;$QP,-F9I!FD+@!````PV9F9I!F9I!F9I!!5$F)U%5(B?532(G[2(/L$(!_
-M$`0/AH\```#'1"0,`````,=$)`@!````#[9/1(7)?B=(BW]@,=)(B=A(A?]T
-M$NF%````2(MX:$B#P`A(A?]U>(/"`3G*=>Q(BU,(@'H)`'0D#[9#1`^V4@HI
-MT`^O1"0(B40D"`^W0T8[1"0,#T9$)`R)1"0,2(7M=`>+1"0,B44`387D=`B+
-M1"0(08D$)$B#Q!!;74%<PTB%]G0&QP8`````387D=.=!QP0D`0```$B#Q!!;
-M74%<PTB-5"0(2(UT)`SH`````$B+4PB`>@D`=*3I>____V9F9I!F9I!32(G[
-M2(/L$$B+?PA(C50D"$B-="0,Z`````!(BWL02(UT)`1(B>+H`````(M4)`@[
-M%"2+1"0,#Y=#*#E$)`0/0T0D!`^OPKJ`````9H7`#T709HF3J````$B#Q!!;
-MPY!!5$F)]%53#[9'$$B)^SI&$'0-N`$```!;74%<PV9FD`^W1T1F.T9$=>F`
-M?T0`#X28````2(M_8$B+=F!(A?]TTC'M2(7V=,N`?Q`$=CB`?A`$=K_H````
-M`(3`=;8/ME-$C44!.<)^9$B+?.MH28MT[&A(@\4!2(7_=)A(A?9TDX!_$`1W
-MR(!^$`1WATB+1CA(.4<X#X5Y____2(M72$B+1DA(BT@(2#E*"`^%8____TB+
-M2!!(.4H0#X=5____]H-@`@```W26Z4?___\QP&:0Z4/___]F9F:09F9FD&9F
-MD%-(BU\(2(M'$$B%VW0R2(7`=&[V@X`#```!=3F`H(`#``#^QT,P_____X"C
-M@`,``/[&AZL````!6\-F9I!F9I!(A<!T[("@@`,``/[&AZL````!6\/V@(`#
-M```!=+[&AZL`````@(MA`@``!("(80(```3H`````$B)WUOI`````("C@`,`
-M`/[&AZL````!6\-F9F:09F9FD&9F9I!F9I!!5TF)]T%6055!5%5(B?U32(/L
-M&`^V5T2%T@^.C0$``$4Q[>F&````2(7`28EL)!AT"$C'0!@`````3HED[6`/
-MMI5@`@``2,>%:`(```````")T(/("J@@B(5@`@``=`F#RHJ(E6`"```/MDPD
-M%+@!````2-/@2`E%4$CWT$@A15A-A?\/A#L!``"`C6`"```$387_#X43`0``
-M#[951$&-10%)@\4!.<(/CO\```!$B6PD%$J+1.U@2(7`=`GV@(`#```!==1-
-MA?]-B?P/A5;___](BT4(#[9`"BG"2(M%*$ACTDB)T3'22/?Q2(D$)$B+10!(
-MBU@82(/`&$@YPW2:13'D2,=$)`C_____ZQ)FD$B+10!(BQM(@\`82#G8=%#V
-M0_`!3(VS</S__W3C@+N`_/__`77:]H/4_/__!'313(GV2(GOZ';[__^$P'7"
-M2(N#L/S__T@Y!"1WM4@[1"0(<ZY-B?1(B40D".ND9F9FD$V%Y`^$(?____:%
-M80(```)T:TF+1"0X2(7`=!=F9F:02(-X&``/A?_^__](BP!(A<!U[4J+1.U@
-MZ7O^___VA6`"```(=2%(@\086UU!7$%=05Y!7\-,B>:_!P```.@`````Z;/^
-M__](@\082(GO6UU!7$%=05Y!7^D`````2(LT)#'23(GGZ`````!(A<!)B<0/
-MA)/^__]*BT3M8.D7_O__9F9FD&9F9I!F9F:09F:0059!54%454B)_5-(@>P`
-M`@``@'\0!'8'@*=@`@``^_:%@`,```%T6H!]$`1V9(!]1`!T3C';2(M,W6!(
-MA<ET,P^VE8`#```/MH&``P``@^("@^#]"="(@8`#``!(BWS=8(!_$`1V!P^V
-M14B(1TCH``````^V142-4P%(@\,!.=!_M$B!Q``"``!;74%<05U!7L-,BW4X
-M0?:&@`,```$/A.$"``!,BVT813'D387M=`U-BV48387D#X0"`P``2(GC2(G@
-M2(V4)``"``#&``!(@\`!2#G0=>Q-A>3'`_06>%H/A,("``!!BT0D.(E#!$&+
-M1"1`B8/&````]H6``P```G0$@$L6`4V%Y`^$IP(``$F#_0$9P(/``HA#&$F+
-MC"2``@``2(7)=#F+`0^V4Q:)0PA(BX&@````@^+]2(E##`^V02B#X`$!P`G"
-MB%,63#EA$`^$=@(```^V@:H```"(0Q1!#[9$)$A-A>U,B>](#T3]B(/%````
-M00^VA"2!`P``B$,728M$)"A(B4,900^V1"00B$,A00^V1"1$B$,BZ+WX__^(
-M0R-!#[9$)$4/ME,EB$,D00^VA"1@`@``@^+[@^`!P>`""<*(4R5!]H0D8`(`
-M``)T!H/*`8A3)4F+1"1028V4)(P"``!(C4M=2(F#K0```$F+1"109HE#)TF+
-MA"1H`@``2(E#*4&+1"0\B8.]````28N$)'`"``!(B4-)28N$)'@"``!(B4-1
-M08N$)(@"``")0UE)BX0DS`(``$B)@YT```!)BX0DU`(``$B)@Z4```!)BX0D
-MC`(``$B)0UU(BT((2(E!"$B+0A!(B4$02(M"&$B)01A(BT(@2(E!($B+0BA(
-MB4$H2(M",$B)03!(BT(X2(E!.$V%[71]28M%*$B)[TB)0S%!#[9%$(A#.4$/
-MMD5$B$,ZZ*/W__^(0SM!#[9%10^V4SV(0SQ!#[:%8`(``(/B^X/@`<'@`@G"
-MB%,]0?:%8`(```)T!H/*`8A3/4F+15!(B8.U````28M%4&:)0S])BX5H`@``
-M2(E#04&+13R)@\$```!(B=_H`````+X``@``2(GGZ`````#WV$4QP$B)X8A#
-M%4B+=4"Z`0```$B+?3CH`````$F+1E!(BWTX13'`2(GAN@$```!(B<9(`W5`
-M2"T```(`2"4``/[_2('N``@``$@IQN@`````3(MU.$'V1F00#X3R_/__3(GW
-MZ`````!(@<0``@``6UU!7$%=05[#,<#'0P0`````Z3W]___&0Q@`Z=G^__],
-MB>A%,>U)B<3I\/S__X/*!(A3%NE__?__9F9FD&9F9I!52(UO&%-(@^P(2(M?
-M&$@YZW4*ZT=(BQM(.>MT/X"[@/S__P1(C8-P_/__=NCV@]#^__\$=-](BW@8
-M2(7_=`V02(GX2(MX&$B%_W7T2(G'Z`````!(BQM(.>MUP4B#Q`A;7<-F9F:0
-M9F:09F:09F:005154TB)^TB+?QA(A?]U].@`````3(NC@`(``(E#.$V%Y'0Q
-M28ML)`A(.=UT3N@`````2(7M08D$)'099F9FD.@`````B44X.T,X=/-(B>_H
-M`````$B)W^@`````2(M#"$B+0&!(A<!T#4B)WTF)PUM=05Q!_^-;74%<PTF+
-M;"00ZZMF9F:09F:09F:09F:0055!5%5(B?U32(/L"`^V1Q"#Z`4\!0^'U```
-M``^VP/\DQ0`````/MT=&2/?82"&':`(``/:'@`,```$/A;0!``!(BU582(72
-M=0=(@WU0`'1/@'T0"@^$N@$``("E8`(``/Y(A=)T.8"-80(``"!(@WU8`'0K
-M]H6``P```71R2(M5&$B%TG0)]H*``P```70=,?9(B>_H`````&9FD&9FD/:%
-M@`,```%T1TB+51CVA6$"```$=3[VA6`"```#=#5(BTU02(7)#X5G`0``2(72
-M=`GV@H`#```!=".`C6`"```(2(GOZ`````!F9F:09F:02(M5&$B%T@^$V0``
-M`$B#Q`A;74%<05W#13'M13'D@']$`'43Z]H/ME5$08U$)`%)@\0!.<)^3DJ+
-M7.5@2(7;=.6`>Q`$=M](B=_H`````/:#8`(```1T!X"-8`(```0/MH-@`@``
-M#[951(/@`SP"N`$```!$#T3H08U$)`%)@\0!.<)_LD6%[0^$<O___X"E8`(`
-M`/XQVX72?QCI8/___P^V142-4P%(@\,!.=`/CDW___](BWS=8$B%_W3C@'\0
-M!';=]H=@`@```734#[:'8`(``(/@OH/(`HB'8`(``.@`````Z[KVA6`"```$
-M#X0:____2(/$"$B)[UM=05Q!7>D`````2(M76$B)T$CWT$B%1U`/A#S^__^`
-MCV`"```"Z3#^__\/MDU$N`$```"#Z0%(T^!(.450#X4M_O__Z2_^__](BT58
-M2/?02(7!#X2Q_O__Z83^__]F9F:09F9FD$B#[!A(B5PD"$B);"002(G[2(GU
-MZ%?S__^$P'5#]H-A`@```DB+0PA(BW,H#[9+1`^V4`IT,3'`]H-@`@``!'4/
-M2(M<)`A(BVPD$$B#Q!C#2(G?Z``````QP.OE9F9FD+C_____Z]H/ML$/MM(I
-MT$ACT$B)\$B)US'22/?W,=)(B>](B<;H`````$B%P'312(G&2(G?Z`````#K
-MFF9F9I!!5$&)U$N-!&152(TLQE-(B?,/MG4AZ`````!(A<!(B<</A"@!``"`
-MH(`#``#^#[9#%XB'@0,``(M#!(E'.(N#Q@```(7`B4=`=0:+0P2)1T`/MH/%
-M````2(UU$(A'2`^V5A4/MH=@`@``P.H"@^(!@^#^"="(AV`"``!(BT4I2(F'
-M:`(``$*+A*.]````B4<\#[9-)+@!````T^"(3T5FB4=&2(M&"4B)1R@/MDTB
-M2,?`_____X#Y/XA/1`^&E0```$B)1UA(BT-)2(U374B-CXP"``!(B8=P`@``
-M2(M#44B)AW@"``"+0UF)AX@"``!(BX.=````2(F'S`(``$B+@Z4```!(B8?4
-M`@``2(M#74B)AXP"``!(BT((2(E!"$B+0A!(B4$02(M"&$B)01A(BT(@2(E!
-M($B+0BA(B4$H2(M",$B)03!(BT(X2(E!.%M=05Q(B?C#N`$```!(T^!(@^@!
-MZ5K___]F9F:09F9FD$B![#@"``!!N`$```"Z`0```$B)G"0(`@``3(FD)!@"
-M``!(B>%,B;0D*`(``$B)K"00`@``28G\3(FL)"`"``!,B;PD,`(``$F)YDB+
-M;SA,BS](BT502(G&2`-W0$@M```"`$@E``#^_TB)[TB![@`(``!(*<;H````
-M`(7`B<,/A,L```!)BW0D0$F+?"0X0;@!````2(GAN@$```#H`````(/X_T&)
-MQ7163(GWZ`````!!@3[T%GA:#X3$````N/____](BYPD"`(``$B+K"00`@``
-M3(ND)!@"``!,BZPD(`(``$R+M"0H`@``3(N\)#`"``!(@<0X`@``PV9F9I"%
-MVW6[2(M%4$F+?"0X0;@!````2(GAN@$```!(B<9)`W0D0$@M```"`$@E``#^
-M_TB![@`(``!(*<;H`````(7`#X1D____Z73___]F9I!FD$B)Y^@`````@3PD
-M]!9X6I!T"KO^____Z1G___^^``(``$B)Y^@`````A,`/A`3____KW[X``@``
-M2(GG9F:09I#H`````(3`#X4B____187M#X5`!```A=L/A9<%``!!@'XA!`^&
-M!O___T&`?B)`9I`/A_G^__]!@'XZ0&9FD&:0#X?I_O__28M?&$F-5QA%#[=N
-M)TT+KJT```!(.=-T)H"[@/S__P1(C:MP_/__=@Y(@[N(_/__``^$"`0``$B+
-M&T@YTW7:,=),B?9,B?_H;OS__TB%P$B)Q0^$D?[__P^VE6`"```/MDU$B="#
-MXOW0Z$$*1B6#X`$!P`G"@/D_2,?`_____XB58`(``$B+55!W#+@!````2-/@
-M2(/H`4PAZ$@)T`^VE6`"``!(B45000^V1B6#X@'`Z`*#X`$XPG0C#[:58`(`
-M`$B+10B#XOZ(E6`"``"`>`H`=`F#R@*(E6`"``!!BU8(A=)T94B+C8`"``"`
-MC6$"```$2(7)#X3I`@``@'DH``^$R0(``$F+1@Q(.8&@````=A)(B8&@````
-M00^V1A2(@:H```!!]D86!`^$D`0``$B+41!(A=(/A',$``!(BT$(2#G"#X14
-M!```BT4\03N&O0````^$6`(``("-8`(```)(QX5H`@````````^VE8`#``")
-MT(/B_=#H00I&%H/@`0'`"<*(E8`#``!!@'X8`4$/MD8C#X:;`0``1`^VZ$J+
-M7.U@2(7;#X3;`0``#[:3@`,```^V2T1(BWM0B="#XOW0Z$$*1A:#X`$!P`G"
-MB).``P``#[:38`(``(G0@^+]T.A!"D8]@^`!`<`)PH#Y/XB38`(``$C'PO__
-M__]-BX:U````00^W=C]W#+@!````2-/@2(T4$`^WQDP)P$@APD@)^DB)4U!!
-M#[9&/0^VDV`"``#`Z`*#X@&#X`$XPG0C#[:38`(``$B+0PB#XOZ(DV`"``"`
-M>`H`=`F#R@*(DV`"``!!#[9..TACP4B#?,-@``^%<OS__TR)9,-@BT,\03N&
-MP0```$F)7"08#X2%````@(M@`@```DC'@V@"````````2,?`_O___TB)WTC3
-MP$@A0UCH``````^V@V`"``"H$'4-J"!T%(/(@(B#8`(``$C'@V@"````````
-M]H6``P```71*2(N%@`(``$B%P'0^2(M0"$B%TG0U2(MX$$B%_W0L2#G52`]%
-M^N@`````,<#IV/O__TF+1D%(.8-H`@``=H!(B8-H`@``Z73___\QP.FX^___
-M#[;(28EL)!A(B>](8\%,B63%8$C'P/[___](T\!((458Z``````/MH5@`@``
-MJ!!U$:@@#X1M____@\B`B(5@`@``2,>%:`(```````#I5/___[H!````3(GV
-M3(G_Z"+Y__](A<!(B<,/A$7[__](B6@82HE$[6#I^_W__TF+1BE(.85H`@``
-M#X:I_?__2(F%:`(``.F=_?__28M&#$@Y@:`````/@T7]___I+OW__TF+1RA)
-MC5\H2#G8#X33````.U#H2(U(Z`^$M@```$B+`$@YV'7KZ;D```!,B??H````
-M`$F+="1`28M\)#A%,<!(B>&Z`0```.@`````3(GWZ`````#IF?O__XN#J/S_
-M_T$[1@0/A>C[___V0_`!#X7O````08!^&`$/AO3[__]!#[9&(TB+7,5@2(7;
-M#X3A^___]H.``P```0^$U/O__TB+>U!!#[=&/TD+OK4```!("<?H`````$B+
-M4P@/ME(*.=`/CJS[__](B>_H`````.F&^___2(7)2(F-@`(```^%,_S__TF-
-MO]````#H`````$B%P$B)P4B)A8`"```/A`'Z__\QP,8$"`!(@\`!2#VP````
-M=?!)BT<P2(U1&$B)61A)B5<P2(D02(E!($&+1@B)`4F+1@Q(B8&@````00^V
-M1A2(@:H```!!]D86`@^$Q/O__TB+A8`"``#&0"@!Z;3[__],B>]("[O`_/__
-MZ`````!(BY-X_/__#[92"CG0#X]"____Z>K^__],B??H`````$B+15!(B<9)
-M`W0D0$@M```"`$@E``#^_TB![@`(``!(*<;I?_[__[C_____2,=!"`````#I
-M/OG__TB+00A(B>I(B6D0Z8'[__](BT$(2(7`=`E(BU$0Z6_[__](BU$02(GH
-M2(EI".E?^___9F9FD&9F9I!52(G]4TB#[`A(BU\8#[9#1(3`#[;0#X0;`@``
-M,<E(.7M@=1/I#@(``&9F9I!F9I!(.6S+8'0+2(/!`4@YT6:0=>ZX`0```$C3
-MX$@)0UA(B=_H`````/:#@`,```$/A;T```!(BT,82(7`#X26`0``2(M`"$B)
-MW_]0,#'V@'M$`'1;2(M4\V!(A=)T1/:"@`,```%T.X!Z$`1V-0^VBF`"``")
-MR(/@CT@YZHB"8`(```^$7P$``/:"8`(```%T$8/ACH/)`HB*8`(``&9FD&:0
-M#[9#1$B#Q@%(.?!WI4B+@X`"``!(A<`/A`X!``!(BU`(2(72#X0!`0``2(MX
-M$$B%_P^$]````$@YTT@/1?J`IX`#``#^2(/$"%M=Z0`````/MH-@`@``@^"_
-MJ""(@V`"``!T%(/(@$C'@V@"````````B(-@`@``#[:38`(``(G0@^#^B(-@
-M`@``2(M#6$CWT$B%0U!U"8/B[(B38`(``$B+<QA(A?8/A(4```"`IF`"``#^
-M@'Y$`'1X,>TQR6:02(M4SF!(A=)T-O:"@`,```%T+8!Z$`1V)_:"8`(```%T
-M'@^V@F`"``"]`0```(/@K(/(`HB"8`(``&9FD&9FD`^V1D1(@\$!2#G(=[-(
-M@[N``@```'1>]H-@`@``!'4SA>UU.8"+80(``"!(@\0(6UW#,>WKUTB)W^@`
-M````9I#I9?[__X/AC(B*8`(``.FM_O__2(G?Z`````#KQTB)W^@`````Z[VX
-M`0```&9F9I#I!?[__TB+0QA(A<!F9F:0=`I(@[B``@```'6+BU,PA=)X#S'V
-M2(G?Z`````#I=?___TB%P`^$;/___XM`,(7`>>'I8/___Y"0D)"0D)"0D$B+
-M!0````!(A<!T,S')9I"`>`P!2(L`@]G_2(7`=?&%R70<BQ4`````C8+_#P``
-MA=(/2-#!^@R)T,'Z'_?YPXL%`````(V0_P\``(7`#TC"P?@,PV9F9I!F9F:0
-M9F9FD//#9F9FD&9F9I!F9I!F9I!(BX>(`0``2(E&&$B)MX@!``##9F9FD&9F
-MD&9FD&9FD#'`PV9F9I!F9I!F9I!F9I!!5$F)_%53BX=P`0``QX>X`0``````
-M`$F+K"20`0``2(7M=$,Y10!W:$DYK"28`0``#X2.````2(M%($F)A"20`0``
-M2,=%(`````!(BWT0_U4(28NL))`!``!!BX0D<`$``$B%[76]/7\!``!W'DF+
-MG"2(`0``2(7;=!$Q]DB+._]3"$B+6QA(A=MU[UM=05S#28N<)(@!``!(A=MT
-M[F:02(L[BW4`_U,(2(M;&$B%VW7N08N$)'`!```[10`/@U3____KQTG'A"28
-M`0```````$G'A"20`0```````.EA____9F9FD&9F9I!F9I!F9I!52(G]4TB#
-M[`A(BY^(`0``2(7;=!1(BSN^______]3"$B+6QA(A=MU[#'`2(-]6``/E<!(
-M@\0(6UW#9F:09F:04XN'N`$``$B)^X7`=`);PTB)NZ@!``!(QX>@`0``````
-M`$B-MZ`!``!(QX>P`0```````$B-?UCH`````,>#N`$```$```!;PV9F9I!F
-M9I!(@^P(2(._D`$```!T(DB+AY@!``!(B7`@2(FWF`$``.@`````N`$```!(
-M@\0(PY"+AW`!```[!G,02(FWF`$``$B)MY`!``#KUDB+?A#_5@@QP.O59F9F
-MD&9F9I!F9I!(@<=H`0``Z0````!F9F:02('':`$``.D`````D)"0D`^V1Q2)
-MP@I7%8/@^X/B!`G0#[97%8G!@^#^@^$!@^(!"<H)T(A'%`^V1R2)P@I7)8/@
-M^X/B!`G0#[97)8G!@^#^@^$!@^(!"<H)T(A'),.0#[9')8G""E<F@^#[@^($
-M"=`/ME<FB<&#X/Z#X0&#X@$)R@G0B$<E#[9'/8G""E<^@^#[@^($"=`/ME<^
-MB<&#X/Z#X0&#X@$)R@G0B$<]PP``````EC`'=RQA#NZZ40F9&<1M!X_T:G`U
-MI6/IHY5DGC*(VPZDN-QY'NG5X(C9TI<K3+8)O7RQ?@<MN.>1';^09!"W'?(@
-ML&I(<;GSWD&^A'W4VAKKY-UM4;74],>%TX-6F&P3P*AK9'KY8OWLR66*3UP!
-M%-EL!F-C/0_Z]0T(C<@@;CM>$&E,Y$%@U7)Q9Z+1Y`,\1]0$2_V%#=)KM0JE
-M^JBU-6R8LD+6R;O;0/F\K.-LV#)U7-]%SPW6W%D]T:NL,-DF.@#>48!1U\@6
-M8="_M?2T(2/$LU:9E;K/#Z6]N)ZX`B@(B`5?LMD,QB3I"[&'?&\O$4QH6*L=
-M8<$]+6:VD$'<=@9QVP&\(-*8*A#5[XF%L7$?M;8&I>2_GS/4N.BBR0=X-/D`
-M#XZH"988F`[ANPUJ?RT];0B7;&21`5QCYO11:VMB86P<V#!EA4X`8O+ME09L
-M>Z4!&\'T"()7Q`_UQMFP95#IMQ+JN+Z+?(BY_-\=W6))+=H5\WS3C&5,U/M8
-M8;)-SE&U.G0`O*/B,+O40:7?2M>5V#UMQ-&D^_36TVKI:4/\V6XT1HAGK="X
-M8-IS+01$Y1T#,U],"JK)?`W=/'$%4*I!`B<0$`N^AB`,R26U:%>SA6\@"=1F
-MN9_D8<X.^=Y>F,G9*2*8T+"TJ-?'%SVS68$-M"X[7+VWK6RZP""#N.VVL[^:
-M#.*V`YK2L70Y1]7JKW?2G14FVP2#%MQS$@MCXX0[9)0^:FT-J%IJ>@O/#N2=
-M_PF3)ZX`"K&>!WU$DP_PTJ,(AVCR`1[^P@9I75=B]\MG98!Q-FP9YP9K;G8;
-MU/[@*].)6GK:$,Q*W6=OW[GY^>^^CD.^MQ?5CK!@Z*/6UGZ3T:'$PM@X4O+?
-M3_%GN]%G5[RFW0:U/TLVLDC:*PW83!L*K_9*`S9@>@1!P^]@WU7?9ZCOCFXQ
-M>;YI1HRS8<L:@V:\H-)O)3;B:%*5=PS,`T<+N[D6`B(O)@55OCNZQ2@+O;*2
-M6K0K!&JS7*?_U\(QS]"UBY[9+!VNWENPPF2;)O)C[)RC:G4*DVT"J08)G#\V
-M#NN%9P=R$U<`!8)*OY44>KCBKBNQ>S@;M@R;CM*2#;[5Y;?OW'PAW]L+U-+3
-MAD+BU/'XL]UH;H/:'\T6OH%;)KGVX7>P;W='MQCF6@B(<&H/_\H[!F9<"P$1
-M_YYECVFN8OC3_VMA1<]L%GCB"J#NT@W75(,$3L*S`SEA)F>G]Q9@T$U':4G;
-M=VX^2FK1KMQ:UMEF"]]`\#O8-U.NO*G%GKO>?\^R1^G_M3`<\KV]BL*ZRC"3
-MLU.FH[0D!3;0NI,&U\TI5]Y4OV?9(RYZ9K.X2F'$`AMH790K;RHWO@NTH8X,
-MPQO?!5J-[P(M````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
+MR````(!_$`%(BY^`````=`Y(@<3(````6UU!7$%=PTB+1W!,C:PD@````$B+
+MOX@```!,B>[_4'A(BT,(2(GF2(M[$/]0.$B-C"2T````2(V4)+@```!(C;0D
+MO````$B)W^@F<O__#[:$))$```"(10+VA"2.`````@^%A`$```^VA"2X````
+M`H0DD````(A%`8N$)+P```"(10!!@'PD:``/B6D!``!!#[9$)&>(10,/MH0D
+MEP```(A%!0^VE"2,````#[9%!@^VM"2-````P.H&B=&#X/S0ZH/A`0'2"<@/
+MMHPDC0````G0C12U`````(/@\X/B"(/A`<'A`@G(B?$)T(/A$(GR@^#/@^(@
+M"<B)\0G0@^%`B?*#X#^#XH`)R`G0B$4&#[9%!P^VE"23````@^#\@^(#"=!`
+M]L8$B$4'#X39````QD4$`DR)[DR)Y^AF=/__2(NT)*````")10A(A?9T(TB-
+M?0Q(C5U"NI8```#H`````+XH````2(G?Z`````#&0R<`BX0DB````(E%?D'V
+M1"1H074828M$)$A(B86B````28M$)$!(B86J````28M,)#A(A<ET-C'VZPA(
+MBPE(A<ET*DB+01A(A<!T'$B+0!A(A<!T$XN`Z`,``$ACUH/&`8F$E;H```"#
+M_@=^SDB!Q,@````QP%M=05Q!7<,/MH0DM````.EW_O__#[:$))8```"(10/I
+MD/[__X/F"$"`_@$9P(/@_H/``XA%!.D4____9F:09I!(@^PX3(ED)!A,B6PD
+M($F)_4B)7"0(2(EL)!!,B70D*$R)?"0P2(M'*$B+7S"+*(GOZ`````!)B<2+
+M`X/H!703B<)(B=C&0`4`2(/``4B#Z@%U\H7M=&I-A>1T94F+1"0HNO____](
+MB4,028M$)!A(A<!T!HN0Z`,``(E3&$&+5"0PN/____^%T@])PHA##TF+!"1(
+MBW@(Z`````"(0PY!#[:$)($#``"(0PU!#[9$)!`\!'97QD,,`4&`?"1$0'9E
+M0<=%4/____])BWT028UU6$G'15@`````38EM8$G'16@`````2(M<)`A(BVPD
+M$$R+9"083(ML)"!,BW0D*$R+?"0P2(/$..D`````+`%UL4B-<RS&0PP"3(GG
+MZ)#\__^%P'6=ZZ-)BT0D4$R)YTB)@[P```#HUG3__XF#L````$F+A"1P`@``
+M2(E#+$F+A"1X`@``2(E#-$$/MGPD$.B]<?__B(.0````00^V1"1%3(GGB(.1
+M````00^V1"1(B(.T````28N$)&@"``!(B8.<````Z+C>__],B>>)@Y0```#H
+M`````,:#D@````")@Y@```!!@'PD1``/A$H!``!%,?9%,?]+BVST8$B%[0^$
+M]0```("[DP`````/A/D```"`?1`$#X0(`0``BX7H`P``0HF$L\0````/MI.2
+M````08/'`4F#Q@&#P@&(DY(```!!#[9$)$1$.?@/CY$````/MM*#^C]_%DAC
+MPH/"`8/Z/\>$@\0```#_____?NI)BX0D@`(``$B%P`^$>_[__TB+4`BY____
+M_TB%TG0&BXKH`P``B8ND````2(M0$+G_____2(72=`:+BN@#``")BZ@```!(
+M@W@(``^$//[__TB#>!``#X0Q_O__3(GGZ`````")@ZP```#I'O[__V9FD&:0
+M08/_/P^/9?___TN+;/1@2(7M#X4+____0L>$L\0`````````Z1____\/MGT0
+MZ#YP__^(@Y,```"`?1`$#X7X_O__2(M%.(N`Z`,``$*)A+/$````Z>_^__\Q
+MTND7____2('LZ````+C_____2(F<),@```!,B:0DV````$B)\TB)K"30````
+M3(FL).````!)B?R`?Q`!2(NO@````'0H2(N<),@```!(BZPDT````$R+I"38
+M````3(NL).````!(@<3H````PTB+1W!,C:PD@````$B+OX@```!,B>[_4'A(
+MBT4(2(GF2(M]$/]0.$B-C"2T````2(V4)+@```!(C;0DO````$B)[^B2;/__
+M#[:$))$```"(0P+VA"2.`````@^%&0$```^VA"2X`````H0DD````(A#`8N$
+M)+P```"(`T&`?"1H``^)%@$``$$/MD0D9XA#`P^VE"2,````#[9#!@^VM"2-
+M````P.H&@^#\B='0ZH/A`0'2"<@/MHPDC0````G0C12U`````(/@\X/B"(/A
+M`<'A`@G(B?$)T(/A$(GR@^#/@^(@"<B)\0G0@^%`B?*#X#^#XH`)R`G0B$,&
+M#[9#!P^VE"23````@^#\@^(#"=!`]L8$B$,'#[:$))<```"(0P5T9L9#!`),
+MB>Y,B>?HUV[__TB+M"2@````B4,(,<!(A?8/A)#^__](C7L,NI8```!(@\-"
+MZ`````"^*````$B)W^@`````,<#&0R<`Z6;^__]F9F:09F:0#[:$)+0```#I
+MXO[__V9FD(/F"$"`_@$9P(/@_H/``XA#!.N*#[:$))8```"(0P/IX_[__V9F
+M9I!F9F:09F9FD$%528G]05154TB#[`A,BV<H08L\)(7_=$@Q[>L19F:02(G?
+MZ`````!!.2PD=C.#Q0&)Z$&+/(3H`````(!X$`%(B<-U1_9`:`)TU4B)Q^@`
+M````2(G?Z`````!!.2PD=\U)QT58`````$V);6!)C7582<=%:`````!)BWT0
+M2(/$"%M=05Q!7>D`````0<=%4/[____KRV9F9I!F9I!F9I!(@^P82(GX2(E<
+M)`A,B60D$$B)QDB+7Q!,BV<(2(L[2(''T````.@`````3(GG,=(Q]NB)XO__
+M@(M@`@``!$B)WTR+9"002(M<)`A(@\08Z0````!F9F:09F9FD&9F9I!32(M'
+M"$B)^4B+.`^W@9@```"+EU@"!`!(QX>(`@0``````$B-MV@"!`#!X`E(QX=P
+M`@0``````$B)CW@"!`!(QX>``@0``````(U$`O^)TS'2]_.)AV@"!`!;Z0``
+M``!32(M'*(LXZ`````!(BYB``@``@'LH`'1.2(M["$R+BZ````!(BU<H23G1
+M#X1O`0``23G1#X?V````#X3&`0``#[>+J`````^W\4PYS@^&C0$``$0/MH.J
+M````1(G)00^W\4DI\>M#2(M["$R+BZ````!(BW<H23GQ#X3X````1`^V@ZH`
+M``!%A,`/A=`````/MXNH````B?)F1"G*#[?!28T$`4@YQ@]"RD6$P&;'@YH`
+M`````$R)BY````!FB8N8````=`]!@/@#=`E(B=];Z<O^__\/MX.8````2(US
+M2$C'0U@`````2`.#D````$R)2TA(QT-P`````$B)6WA(QX.``````````,>#
+MB`````$```!(B4-02(U#8$B)0V!(B4-HZ`````"%P'2?6\.0#[>+J`````^W
+M\4B-!#),.<@/@ID```!$#[:#J@```$2)R68IT0^W\>D%____9F:008#X`P^$
+M)O___TB+0Q!(BW`HZ1G___]$#[:#J@```$&`^`-T:$6$P'7@0;@!````QH.J
+M`````>O19F9FD&9FD$0/MH.J````08#X`G0_08#X`71"#[>+J````#'23(G(
+M#[?Q2/?V9H72#X23_O__#[?RB='IB?[__V9F9I!F9I!$#[:#J@```.EU_O__
+M2(G?6^EJR/__QH.J`````$B+5RCI*_[__T0/MH.J````ZZ1(@^Q8#[?!3(ED
+M)#A)B<1(B5PD*$B);"0P3(ET)$A)`=1,B6PD0$R)?"10B?U(B70D$&:)3"0.
+M28G62(E$)!A,.V903(G#38MX$'9*0<=`4/[___](C7-82,=#6`````!(B5M@
+M2,=#:`````!,B?](BUPD*$B+;"0P3(MD)#A,BVPD0$R+="1(3(M\)%!(@\18
+MZ0````!(BU0D$$R)_XMR-.@`````2(7`28G%#X2C`0``QH"R`````&:#?"0.
+M`4B)6%A(QX#(`````````$C'@,``````````#X2P`0``@?T9_P``=#MW)8']
+M"_\``)`/A-@```#'0U#^____3(GOZ`````!,BWL0Z4;___^!_2/_```/A+0`
+M``"!_23_``!UU$B+5"00]D)J`@^%-`$``$'&A;`````#0<:%FP```"1!#[:%
+ML0```(/@^X/(`D&(A;$```!!@+VP`````P^$3@$``$$/MH60````/!`/A-0!
+M```\"@^$C0(``$B+1"0028E%4$F#?T@`#X3R`@``28M/0$F-51A)C4<X28E7
+M0$F)11A)B4T@2(D12(M<)"A(BVPD,$R+9"0X3(ML)$!,BW0D2$R+?"102(/$
+M6,-F@WPD#@$/AQS___](BT0D$$B+:#A(A>UT'TB+10A).<9R#4@#11!).<0/
+MAL,"``!(BVT`2(7M=>%(BT0D$/9`:@(/A)8"``!)P>P@0<:%L`````)-A>0/
+MA+@#``!!QH68````BD'&A9`````000^VA;$```"#R`2#X/U!B(6Q````Z0'_
+M__],BWL0QT-0_?___^GO_?__2<'L($'&A;`````"387D#X2Y````0<:%F```
+M`(A!QH60````$.FR_O__2(M4)!!!N`$```!,B?&)[DC'QP`````QP.@`````
+MZ2W^__],B?%!#[;63(GS2,'I$$G![AA)QX6@`````````(G(9H'A_P!!QH6:
+M````0##`9D''A9````````G01(GR2<'N"&9!B864````,-(/ML<)T&9!B866
+M````1(GP,,`)P69!B8V8````#[=$)`YF08F%D@```&9!B86<````Z4G^__]!
+MQH68````*$'&A9`````*Z?G]__]!QH61``````^W1"0.18BUH0```$'&A:(`
+M````0<:%HP````#!X`E!B864````3(GP2,'H.$&(A9H```!,B?!(P>@P08B%
+MFP```$R)\$C!Z"A!B(6<````3(GP2,'H($&(A9T```!,B?!(P>@808B%G@``
+M`$R)\$C!Z!!!B(6?````3(GP2,'H"$&(A:`````/MT0D#F;!Z`A!B(6D````
+M#[94)`Y!QH6F`````$'&A:<`````08B5I0```.ES_?__0<:%D0`````/MT0D
+M#D6(M9T```!!QH6>`````,'@"4&)A90```!,B?!(P>@808B%F@```$R)\$C!
+MZ!!!B(6;````3(GP2,'H"$&(A9P````/MT0D#F;!Z`A!B(6?````#[9<)`Y!
+MQH6A`````$&(G:````#I^OS__TR)[TB+7"0H2(ML)#!,BV0D.$R+;"1`3(MT
+M)$A,BWPD4$B#Q%CI`````$'&A;`````#0<:%FP```#3I>OW__TB+51A(A=)(
+MB50D(`^$-/W__TR+0AA-A<`/A"?]__])BWA83(D$).@`````3(L$)$F+4`@X
+M0@H/A@G]__])C;_P````2(MM"$'&A;`````!3(D$).@`````2(7`2(G!3(L$
+M)`^$KP$``$R)\DC'0!``````2,=!,`````!(*>I(QT$H`````$C'03@`````
+M2(D02(M$)!C'04`!````28E->$V)15!(`=!(B4$(2(U!&$B)01A(B4$@28M`
+M"(!X"0!T=$'&A9H````!00^V2$5(T^I)B960````00^V2$2$R0^$W?O__TB+
+M7"0@23M88+@!````=!\QTH/"`3C*#X3`^___#[;"2(M<)"!).US`8'7FC4(!
+M08B%FP```.FB^___0<:%F````"I!QH60````"NE#_/__28V'4`($`$&+MU@"
+M!`!!QH6:`````4F)E9````!)B86@````#[=$)`YF08F%F````$$/MGA$0(3_
+M=#9(BU0D($D[4&"X`0````^$I0```#'2ZQ8/MLI(BUPD($ACP4D[7,!@#X2$
+M````@\(!0#CZ=>(/MT0D#C'22<>'B`($``````!)QX=P`@0``````$V)KW@"
+M!`!,B?])QX>``@0``````,'@"8U$!O_W]DF-MV@"!`!!B8=H`@0`2(M<)"A(
+MBVPD,$R+9"0X3(ML)$!,BW0D2$R+?"102(/$6.D`````QT-0_?___^D8^O__
+MN`$```#3X$&(A9L```#I<?___V9F9I!F9F:02(/L6$B%]DB)7"0H2(EL)#!,
+MB<-,B7PD4$R)9"0X2(GU3(EL)$!,B70D2$&)STV+8!")?"042(E4)`A%B[0D
+M6`($`'0)]H9A`@``!'1)2(US6,=#4/[___](QT-8`````$B)6V!(QT-H````
+M`$R)YTB+7"0H2(ML)#!,BV0D.$R+;"1`3(MT)$A,BWPD4$B#Q%CI`````$B+
+M1@@/MD@*A,ETJT$/M\=(`T0D"$B)1"08#[961`^VP2G"2(M&*$ACTDB)T3'2
+M2/?Q2#E$)!@/AWK___])C80D\````$B)QTB)1"0@Z`````!(A<!)B<4/A&P"
+M``"+=31,B>?H`````$B%P$F)P`^$2`(``$B+1"082(M,)`A)QT40`````$G'
+M13``````2<=%*`````!)QT4X`````$F)10A)C44828E-`$''14`!````38EH
+M>$F)11A)B44@0<:`L`````&+!0````!)B5A8A<!^##N%W`(```^?P`^VP$&)
+M0&A(BT4(@'@)``^$R````(M,)!2!Z0O_``"#^1H/A^P!``"X`0```$C3X*D`
+M@``$#X4H`@``J0!```(/A1`"``"I`0```0^$PP$``$'&@)H````!#[9-14G'
+M@,``````````2--L)`A)B6A02(M,)`A!QH"R`````$G'@,@`````````28F(
+MD````$F#?"1(``^$U`$``$F+3"1`28U0&$F-1"0X28E4)$!)B4`828E(($B)
+M$4B+7"0H2(ML)#!,BV0D.$R+;"1`3(MT)$A,BWPD4$B#Q%C#00^WQS'2BTPD
+M%,'@"4&-1`;_@>D+_P``0??V@_D:B<8/AQ$!``"X`0```$C3X*D`@``$#X4S
+M`0``J0!```(/A1D!``"I`0```0^$Z````$'&@)H````!28V$)%`"!`!)B6A0
+M2<>`P`````````!)QX#(`````````$R)YTF)@*````!(BT0D"&9%B;B8````
+M0<:`L@````!)B8"0````08FT)&@"!`!)C;0D:`($`$G'A"2(`@0``````$G'
+MA"1P`@0``````$V)A"1X`@0`2<>$)(`"!```````2(M<)"A(BVPD,$R+9"0X
+M3(ML)$!,BW0D2$R+?"102(/$6.D`````2(M\)"!,B>[H`````$B+>Q!(C7-8
+MQT-0_?___TC'0U@`````2(E;8$C'0V@`````Z>?\__](BWPD($R)[DR)!"3H
+M`````$R+!"1,B<?H`````$R+8Q#IG_S__P'V0<:`F@````+IZ_[__T'&@)H`
+M```#Z=[^__]!QH":`````NGV_?__0<:`F@````/IZ?W__TB+7"0H2(ML)#!,
+MB<=,BV0D.$R+;"1`3(MT)$A,BWPD4$B#Q%CI`````)!(@^P82(D<)$R)9"0(
+M2(G[3(EL)!!(BT<HBSA$#[=@#$R+:`3H`````(M[&$F)V$2)X4R)ZDB+'"1,
+MBV0D"$R+;"002(G&2(/$&.FA^___D$B#[!A(B1PD2(EL)`A(B?M,B60D$$B+
+M1RB+.$R+8`0/MV@,Z`````"`>!`!2(G&=".+>Q@/M\U)B=A,B>)(BQPD2(ML
+M)`A,BV0D$$B#Q!CI3/O__XM[&`^WS4F)V$R)XDB+'"1(BVPD"$R+9"002(/$
+M&.DI]/__9F:09F:09F:02(/L&$B)'"1(B6PD"$B)^TR)9"002(M'*(LX3(M@
+M!`^W:`SH`````(!X$`%(B<9T(XM[&`^WS4F)V$R)XDB+'"1(BVPD"$R+9"00
+M2(/$&.G,^O__BWL8#[?-28G83(GB2(L<)$B+;"0(3(MD)!!(@\08Z:GS__]F
+M9I!F9I!F9I!(@^P82(D<)$R)9"0(2(G[3(EL)!!(BT<HBSA$#[9@"$2+:`3H
+M`````(M[&$F)V$2)X4R)ZDB+'"1,BV0D"$R+;"002(G&2(/$&.E1^O__D$B#
+M[!A(B1PD2(EL)`A(B?M,B60D$$B+1RB+.$2+8`0/MF@(Z`````"`>!`!2(G&
+M="2+>QA`#[;-1(GB28G82(ML)`A(BQPD3(MD)!!(@\08Z?OY__^+>QA`#[;-
+M1(GB28G82(ML)`A(BQPD3(MD)!!(@\08Z=?R__]F9F:09F:02(/L&$B)'"1(
+MB6PD"$B)^TR)9"002(M'*(LX1(M@!`^V:`CH`````(!X$`%(B<9T)(M[&$`/
+MMLU$B>))B=A(BVPD"$B+'"1,BV0D$$B#Q!CI>_G__XM[&$`/MLU$B>))B=A(
+MBVPD"$B+'"1,BV0D$$B#Q!CI5_+__V9F9I!F9I!!54&)]4%454B)_5-(@^P(
+MA?:)M5P"!`!T,4B)^T4QY$2)X$B)[T&#Q`%(P>`$2(VT!5@"``#H`````$B)
+M@U`"``!(@\,013GL==5(BP4`````QX5@`@0`$@```$B%P'0:BU`0.95@`@0`
+M=@:)E6`"!`!(BT`(2(7`=>9(@\0(6UU!7$%=PV9F9I!F9I!F9I!54TB)^TB#
+M[`A$BX=<`@0`187`="PQ[8GH2(G?@\4!2,'@!$@!V$B+D%@"``!(B[!0`@``
+MZ``````YJUP"!`!WUL>#7`($``````!(B=](@\0(6UWI`````&9F9I!F9I!5
+M4TB)^TB#[`B`O[`````#2(MO6`^$C`````^V@[(````\$`^$D0```#P%="-W
+M$RP!#X21````QT50_____V:0ZQ4\"P^%AP```&9FD&9FD,=%4/W___](BW-X
+M2(7V=`](BSM(@<?P````Z`````!(BSOH*?___TB)W^@`````2,=%6`````!(
+MB6U@2(UU6$C'16@`````2(M]$$B#Q`A;7>D`````]H>;`````0^$9____\:'
+ML@```!!(BT4PQ@`!QH.R`````<=%4`````#KACP-#X1W____QT50_____^ER
+M____9F9FD&9F9I!F9I!52(G]4TB#[`A(BU]8BT,8/23_``!T:3T9_P``=&*`
+MO;(````0=G+'0U#_____9I!(BWT`2(MU>$B!Q_````#H`````$B+?0#H8_[_
+M_TB)[^@`````2,=#6`````!(B5M@2(US6$C'0V@`````2(M[$$B#Q`A;7>D`
+M````9F9FD("]L@````QT3$B+0S#&``"`O;(````0=XY(#[Z-L@```+@!````
+M2-/@J2`I`0!U%*@"#X1O____QT-0`````.EL____QT-0_?___V9FD&:0Z5O_
+M__](BT,POQ$```#&``%(BW50Z`````#&A;(````!Z\5F9F:09F:09F:09F:0
+M2(/L&$B)7"0(2(EL)!!(B?N#?QP'2(M'*(LH=@:#?R`#=QW'0U#^____2(M<
+M)`A(BVPD$$B#Q!C#9F9FD&9FD(GOZ`````!(A<!TUXGOZ`````!(BQ!(.U,0
+M=`G'0U#\____Z\5(@W@8`'6W@'@0!':QBW`P@_[_=+!(BWH(Z`````"%P'2C
+MQT-0_____V:0ZYAF9F:09F9FD&9FD&9FD$B#[!A(B1PD3(ED)!!(B?M(B6PD
+M"$2+CX0#``!)B?1%A<EU"DB#O^`#````=!4QP$B+'"1(BVPD"$R+9"002(/$
+M&,.+=S"#_O]T$$B+!TB+>`CH`````(7`==.`>Q`$=C]F]X-@`@``<`AUPH![
+M1`!T)S'M2(M\ZV!(A?]T#$R)YNAZ____A,!TI`^V0T2-50%(@\4!.=!_V[@!
+M````ZY!T$TR)YDB)W^@S9/__#[;`Z7O___](BWLX3(GFZ!]D__\/ML#I9___
+M_V9F9I!F9I!(@^P(@'\0!'86,<!(@[^``@```'0*2(/$",-F9I!FD.@+____
+M2(/$"`^VP,-F9I!!5D%505154TB+3RA(B?M(BU<PBP''`@````!!B<9!B<5!
+M@>8``0``08'E_P```'1_13'DO00```#K,V9FD&:02(-X&`!U7C'V@'@0!4B)
+MQT@/0_#H=____X3`=$A!@\0!2(/%!$4Y['1&2(M+*(L\*>@`````187V=<5(
+M@W@8`'4C9O>`8`(``'`(=1B+<#"#_O]TR$B+`$B+>`CH`````(7`=+A(BU,P
+M08U$)`&)`DC'0U@`````2(E;8$B-<UA(QT-H`````$B+>Q!;74%<05U!7ND`
+M````9F9FD&9FD$%7,=)!5D%5051)B?Q54TB#[`A(BT\HBP'VQ/]!B<4/E,)!
+M@>7_````B50D!$B+5S!!#Y7'183_1`^V="0$QP(`````=&LQ[46$]G0V9F:0
+MB>B)ZXM\@03H`````#'V@'@0!4B)QT@/0_#H@?[__X3`#X2Z````C4,!2(/%
+M`4$YQ7=U183_="DQVV9FD&9FD$F+1"0HB=I(@\,!BWR0!.@`````2(G'Z```
+M``!!.=UWWT2+5"0$1872=4Q!QT0D4`````!)QT0D6`````!-B60D8$F-="18
+M2<=$)&@`````28M\)!!(@\0(6UU!7$%=05Y!7^D`````183V=(9)BTPD*.E)
+M____183_=+A)BT0D*(MX!.@`````2(/$"$B)QS'V6UU!7$%=05Y!7^EO?/__
+M28M4)#"-0P%!QT0D4/____^)`NE[____9F9FD&9FD$%455-(B?M(@^Q@3(MG
+M4$B+;UA(C70D,$F+1"1P28N\)(@```#_4'@/MD0D0D&(1"1F@7T80O\```^$
+MH0````^V@YL```!(BU4PB$(*#[>#E````(A"!@^W@Y8```"(0@</MX.8````
+MB$((#[:#F@```(A""0^W@Y````"(0@0/MX.2````B$(%#[>#G````(A""X"[
+ML@````$/A*<```#'15#_____2(G?Z`````!(BWT02(UU6$C'15@`````2(EM
+M8$C'16@`````Z`````!(@\1@6UU!7,-F9F:09F:0#[:#FP```$B+53"(0@\/
+MMX.4````9HE""`^W@Y8```!FB4(*#[>#F````&:)0@P/MH.:````B$(.#[>#
+MD````&:)0@0/MX.2````9HE"!@^W@YP```!FB4(0@+NR`````0^%6?___XM%
+M&,=%4``````]0O\``'15/1C_```/A43___](BT4H@'@*\@^%-O___TF+1"1P
+M2(GF28N\)(@```#_4'A(BU0D($B!P@`!```/M@*H!`^$#/___X/@^TR)YX@"
+MZ`````#I^O[__TB+12B`>`_R#X7L_O__9F:09I#KKV9F9I!F9F:09F:09F:0
+M058QP$%505154TB)^V9FD,8$&`!(@\`!2(/X+'7RQP,L````Z&=2__^(0P1(
+MBP4`````2(,X``^40P5(BST`````Z`````#!X`P]____`0^&CP```,9#!@7&
+M0P<+#[9#"T&\!0```$4Q[44Q]L9#"`#&0PD!QD,*#X/@_H/("(A#"^LA1(GH
+MQD0K'$"#R"!!@_P%1`]$Z$&#Q@%!@\0!08/\#70N1(GGZ`````!(A<!TZ42)
+MYT$/MN[HDE/__T&#_`:(1"L,=;Q!@\U`QD0K'`+KQ$&`_6!T&%M=05Q!74%>
+M,<##QD,&!\9#!P?I;/___TB+!0````"#N*0"!``#=MA!#[;&QD0##!+&1`,<
+M0#'`6UU!7$%=05[#9F:09F:04TB)^TB+?S#HT_[__X7`=`?'0U#_____2,=#
+M6`````!(B5M@2(US6$C'0V@`````2(M[$%OI`````&9FD&9FD$%6055)B?U!
+M5%532(/$@$R+9Q!,B>?H15S__T6+G"2@`@0`187;#X61````28ML)!!!QX0D
+MH`($``$```!(A>T/A*T```!(BT4(2(M]$$B)YO]0.`^V1"0000&$)*`"!`"`
+M?"00`'0U,=MF9I!F9I!(B>E(Q\(`````B=Y(B>_H`````(3`=0E!@ZPDH`($
+M``$/MD0D$(/#`3G8?]-(BVT`2(7M=:!!BX0DH`($`(/H`87`08F$)*`"!`!T
+M0DF+?1!)C7580<=%4/S___])QT58`````$V);6!)QT5H`````.@`````2(/L
+M@%M=05Q!74%>PT''A"2@`@0``````$F-M"0X`@``28U\)$A)QX0D.`(`````
+M``!-B:0D0`(``$G'A"1(`@```````.@`````ZXIF9F:09F:09F:09F:0Z0``
+M``!F9F:09F9FD&9FD$B#["A,B60D&$R);"0@28G\2(E<)`A(B6PD$$F)]4B+
+M;QB#K:`"!``!A=(/B+0```#H`````$B%P$B)PP^$L0```(`]``````!U-4B)
+MWK\"````Z`````"+G:`"!`"%VW0^2(M<)`A(BVPD$$R+9"083(ML)"!(@\0H
+MPV9FD&:0#[9`:*@"=<.H`0^%@P```/9#:`1UM8!+:"3KKV9F9I!(C;4X`@``
+M2(U]2$C'A3@"````````2(FM0`(``$C'A4@"````````2(M<)`A(BVPD$$R+
+M9"083(ML)"!(@\0HZ0````!(C7\@Z`````#I9?___TF+1"0(3(GO_Y"`````
+M28U\)"!,B>[H`````.E%____2(G?Z`````!F9I!FD.EK____9F9FD&9F9I!F
+M9I!(@^P82(D<)$R);"002(G[3(ED)`A(BT<H1(M@!(LXZ`````!$B>=)B<7H
+M`````$R)[TB)QN@`````@_@!2(M[$$B-<U@9P$C'0U@`````2(E;8/?02,=#
+M:`````")0U!(BQPD3(MD)`A,BVPD$$B#Q!CI`````&9FD&9FD&9FD$%4@#T`
+M`````%5(B?U3='%(BU\83(UG&$PYXW4+ZS.02(L;3#GC="J`NX#\__\!2(V[
+M</S__W7H]D/P`73B#[8U`````.@`````2(L;3#GC==;'A3@!````AY,#2,>%
+M2`$```````!(C;4X`0``2(FM4`$``$B)[UM=05SI`````%M=05S#9F9FD&9F
+MD&9FD$%505152(G]4TB![,@```!,BV\02(MW*$B-1"0,28GD2(GGQ@<`2(/'
+M`4@YQW7TNK````!!QP0D?`$``.@`````2(M=,#'V3(GB3(GOZ+['__^#^/^)
+M`W4#B4502(M]$$B-=5A(QT58`````$B);6!(QT5H`````.@`````2('$R```
+M`%M=05Q!7<-F9I!FD%4QP$B)_5-(@^P(2(M?,)#&!!@`2(/``4@]@````'7P
+M2(G?Z%CZ__^%P'0NQT50_____TC'15@`````2(EM8$B-=5A(QT5H`````$B+
+M?1!(@\0(6UWI`````(-+1!#'`X`````QTL=#/``@```/MD0:#(/@#X/H`SP"
+M=P7&1!HL!DB#P@%(@_H0=>+KIF9FD$%7059!54F)_4%455-(@^P(2(M'*$B+
+M7S"+*#'`9F:0Q@08`$B#P`%(/?H```!U\(GOZ`````!)B<0QP&9F9I#&!!@`
+M2(/``4@]^@```'7PA>UT9DV%Y'1A28M$)"BZ_____TB)0P1)BT0D&$B%P'0&
+MBY#H`P``B5,,08M4)#"X_____X72#TG"B$,#28L$)$B+>`CH`````(A#`D$/
+MMH0D@0,``(A#`4$/MD0D$#P$=S\L`0^$LP$``$''15#_____2<=%6`````!-
+MB6U@28UU6$G'16@`````28M]$$B#Q`A;74%<05U!7D%?Z0````#&`P%)BT0D
+M4$R)YV:)@^@```#H*%#__XF#Y````$F+A"1P`@``2(E#($F+A"1X`@``2(E#
+M*$$/MGPD$.@/3?__B(.$````00^V1"1%3(GGB(.%````28N$)&@"``!(B8/0
+M````Z!:Z__],B>>)@X@```#H`````,:#A@````")@\P```!!@'PD1``/A&@!
+M``!%,?9%,?]+BVST8$B%[0^$$P$``("[AP`````/A!<!``"`?1`$#X0F`0``
+MBX7H`P``0HF$LXP````/MI.&````08/'`4F#Q@&#P@&(DX8```!!#[9$)$1$
+M.?@/CZ\````/MM*#^@]_%DACPH/"`8/Z#\>$@XP```#_____?NI)BX0D@`(`
+M`$B%P`^$LO[__TB+4`BY_____TB%TG0&BXKH`P``B8O8````2(M0$+G_____
+M2(72=`:+BN@#``")B]P```!(@W@(``^$<_[__TB#>!``#X1H_O__3(GGZ```
+M``")@^````#I5?[__TB-<R#&`P),B>?H5-;__X7`#X4V_O__Z3G^__]F9F:0
+M9F:008/_#P^/1____TN+;/1@2(7M#X7M_O__0L>$LXP`````````Z0'___\/
+MMGT0Z'Y+__^(@X<```"`?1`$#X7:_O__2(M%.(N`Z`,``$*)A+.,````Z='^
+M__\QTNGY_O__059!54F)_4%455-(BT<H2(M?,(LH,<#&!!@`2(/``4@]V```
+M`'7PB>_H`````$F)Q#'`Q@08`$B#P`%(/=@```!U\(7M=#A-A>1T,TF+1"0H
+MNO____](B4,$28M$)!A(A<!T!HN0Z`,``(E3#$$/MD0D$#P$=SDL`0^$"@$`
+M`$''15#_____2<=%6`````!-B6U@28UU6$G'16@`````28M]$%M=05Q!74%>
+MZ0````#&`P%)BX0D<`(``$B)0Q!)BX0D>`(``$B)0QA!#[9\)!#H>DK__XA#
+M=$$/MD0D14R)YXA#=4F+A"1H`@``2(F#P````.B'M___3(GGB4-XZ`````#&
+M0W8`B8.\````08!\)$0`#X2T````13'VZS2`?1`$=%`/ME-VBX7H`P``B423
+M?`^V0W:#P`$\#XA#=G=D00^V1"1$08U6`4F#Q@$YT'Y22XML]&!(A>UTY(![
+M=P!UO`^V?1#HY$G__XA#=X!]$`1UL$B+53@/MD-VBY+H`P``B52#?.NJ2(US
+M$,8#`DR)Y^BHV?__A<`/A=_^___IXO[__P^V4W:#^@]F9F:0#X_1_O__2&/"
+M@\(!@_H/QT2#?/____]^[>FY_O__,=+KY&9F9I!F9F:09F:09F:0059!54F)
+M_4%455-(BT<H2(M?,(LH,<#&!!@`2(/``4@]K@```'7PB>_H`````$F)Q#'`
+MQ@08`$B#P`%(/:X```!U\(7M=#=-A>1T,DF+1"0HNO____^)0P1)BT0D&$B%
+MP'0&BY#H`P``B5,(00^V1"00/`1W.2P!#X0)`0``0<=%4/____])QT58````
+M`$V);6!)C7582<=%:`````!)BWT06UU!7$%=05[I`````,8#`4F+A"1P`@``
+M2(E##$F+A"1X`@``2(E#%$$/MGPD$.B;2/__B$-P00^V1"1%3(GGB$-Q28N$
+M)&@"``")@YP```#HJ;7__TR)YXE#=.@`````QD-R`(F#F````$&`?"1$``^$
+ML````$4Q]NLT@'T0!'10#[93<HN%Z`,``(E$DW@/MD-R@\`!/`>(0W)W9$$/
+MMD0D1$&-5@%)@\8!.=!^4DN+;/1@2(7M=.2`>W,`=;P/MGT0Z`9(__^(0W.`
+M?1`$=;!(BU4X#[9#<HN2Z`,``(E4@WCKJDB-<PS&`P),B>?HRM?__X7`#X7@
+M_O__Z>/^__\/ME-R@_H'#X_6_O__2&/"@\(!@_H'QT2#>/____]^[>F^_O__
+M,=+KY&9F9I!!54F)_4%455-(@^Q(2(M?*(L[A?]U=$B++0````#&1"0P!DB%
+M[70W3(UD)#!(BUT02(7;="!(BT,0,?],B>9(B40D.$B+0PC_D,````!(BQM(
+MA=MUX$B+;0!(A>UUSDF+?1!)C7582<=%6`````!-B6U@2<=%:`````#H````
+M`$B#Q$A;74%<05W#Z`````!(B<4/MD,$3(UC!(3`=3N`?1`!#X0B`0``0<=%
+M4/[____V16@0=*A(BT5P2(N]B````$B)YO]0>`^V1"022(GOB$5FZ`````#K
+MA2P!=`U!QT50_O___^ET____@'T0!)!VMT$/MD0D`3P!=$=F9F:0#X/*`0``
+M08-]'!AF9I!FD'672(V5<`(``#'`Q@00`$B#P`%(@_@0=?))BT0D!$B)`DF+
+M1"0,2(E""("-8`(```3K;D&#?1Q(#X5;____2(V-C`(``#'`Q@0(`$B#P`%(
+M@_@$=?))BT0D!$F-5"0$2(D!2(M""$B)00A(BT(02(E!$$B+0AA(B4$82(M"
+M($B)02!(BT(H2(E!*$B+0C!(B4$P2(M".$B)03B`C6`"```$]H5@`@``!`^$
+MH?[__TB)[^@`````Z93^__]!@'PD`04/A]+^__]!#[9$)`%F9I#_),4`````
+M08-]'`EF9F:0#X6S_O__QD0D,`E!#[9$)`1(C70D,(A$)#A(BT5P2(N]B```
+M`/^0P````$&)15#IC?[__T&#?1P)#X5Z_O__QD0D,`5!#[9$)`3&1"0Y`(A$
+M)#A(BT5P2(UT)#!(B[V(````_Y#`````08E%4(!-:!#I2_[__T&#?1P)#X4X
+M_O__QD0D,`1!#[9$)`3&1"0Y`(A$)#CKO$&#?1P)#X47_O__QD0D,`-!#[9$
+M)`2(1"0XZZ!!@WT<"0^%^_W__\9$)#`"Z^)!@WT<"0^%Z?W__X!-:(#&1"0P
+M`.O,9F:09I`\`G0-0<=%4/[____IT/[__T&#?1P)#[:U@0,```^%MOW__P^V
+M0PA(C7L(0#C&=$"`?1`$B(6!`P``=C2`?40`="XQR4B+5,U@2(72=!.`>A`$
+M=@T/MH6!`P``B(*!`P``#[9%1(U1`4B#P0$YT'_40(#^`G0,@(U@`@``!.E?
+M_O__@#\"=.](Q\(`````3(GN2(GOZ-=J___I$OW__V:005152(G]4TB+7RB+
+M.TR-8P3H`````$B)QHM#!*@!=#I(C99P`@``,<!F9F:09F:0Q@00`$B#P`%(
+M@_@0=?))BT0D!$B)`DF+1"0,2(E""(".8`(```1!BP0DJ`)T8TB-CHP"```Q
+MP,8$"`!(@\`!2(/X0'7R28M$)!1)C50D%$B)`4B+0@A(B4$(2(M"$$B)01!(
+MBT(82(E!&$B+0B!(B4$@2(M"*$B)02A(BT(P2(E!,$B+0CA(B4$X@(Y@`@``
+M!/:&8`(```1T"$B)]^@`````2,=%6`````!(B6U@2(UU6$C'16@`````2(M]
+M$%M=05SI`````&9FD&9FD&9FD$%505154TB)^TB![,@```!,BV<H2(GE08L\
+M).@`````28G%2(U$)`Q(B>=F9I!FD,8'`$B#QP%(.<=U]$F-="0$NK````#'
+M10!\`0``Z`````!(BWL02(GJ3(GNZ'^[__^%P(G"="R#^/]T-4B+0S!(BWL0
+M2(US6$C'0U@`````2(E;8$C'0V@`````B1#H`````$B!Q,@```!;74%<05W#
+MB4-0Z\9F9F:09F:09F:005152(G]4TB+1PA(BQB+LV@"!`!(B=],BZ/@`0``
+MZ(WE__](BU4(2(M%$(MP-#ER-`]#<C1(BSKH`````$B%P$F)P`^$I`$``(L5
+M`````(72?A!(BT4(.Y#<`@``#Y_`#[;008E0:$'&@+(`````#[:%J@```(3`
+M#X7H````2(U%2$F)0'!(BT4(08"(L0````*+BU@"!`!)B4!0#[>%F@````^W
+ME9@````IPHG(BXM@`@0`P>@)@^D!#Z_!.<(/1]"X``$``&:!^@`!#T;"9D&)
+M@)@```"`?2@`#X3R````0?:`L0````0/A.0````/MX68````00^WD)@```!(
+M`X60````2"G0#[>5F@```$@IT$F)@)````!!@(BQ````"$V)8%A(@WM(`$G'
+M@,@`````````2<>`P``````````/A`0!``!(BTM`28U0&$B-0SA(B5-`28E`
+M&$F)2"!(B1%;74%<PSP##X00____2(M%$$&`B+$````$28E`4(N#7`($`(7`
+M#X3*````BXM8`@0`,?9(BY-0`@0`B?!(P>`$A<E(BQ00=!J)R&9FD&:0Q@(`
+M2(/"`4B#Z`%U\XN+6`($`(/&`3FS7`($`'?&Z<G^__\/MX6:````2`.%D```
+M`$F)@)````#I+/___P^VA:H```"$P'5,2(M]"$B-=4CH`````$B+10A(BSCH
+M+^3__T''1"10_____TG'1"18`````$F-="1838ED)&!)QT0D:`````!;74F+
+M?"0005SI`````#P#=;WKKEM=05Q,B<?I`````(N+6`($`.D[_O__9F9FD&9F
+M9I!F9F:09F:02(/L*$B);"002(G]2(E<)`A,B60D&$R);"0@#[:%L@```$B+
+M5U!,BV=82(L_2(N:@`(``#P!=$@\`@^$5P$``$B-<S#&A;(`````2(/'2$C'
+M0S``````2(EK.$C'0T``````2(M<)`A(BVPD$$R+9"083(ML)"!(@\0HZ0``
+M```/MX.:````9@.%F````$@[4PAFB8.:````#X3G`@``#[>#F@```&8[@Y@`
+M```/@XT!```/MH6Q````2,=%>`````!(QT5P`````(/@_8/(!(B%L0```$B+
+M4Q!(B550QH6R``````^W@YH````/MY.8````BX]@`@0`@^D!*<*+AU@"!`#!
+MZ`D/K\$YP@]'T+@``0``9H'Z``$/1L)FB868````@'LH`'0-]H6Q````!`^%
+M;@(```^W@YH```!(`X.0````2(F%D````/:%L0````(/A/T!``!(@W](``^$
+M\@$``$B+3T!(C5482(U'.$B)5T!(B4482(E-($B)$4B+7"0(2(ML)!!,BV0D
+M&$R+;"0@2(/$*,-(BT,(QH.K`````8"@@`,``/Y(BT,0@*"``P``_DB+0PB`
+MH&$"``#W2(M#$("@80(``/=(BT,(2(LXZ/KA__\/MH.J````A,`/A/L````\
+M`P^$\P```$B)[^@`````0<=$)%#_____28M\)!!)C70D6$G'1"18`````$V)
+M9"1@2<=$)&@`````2(M<)`A(BVPD$$R+9"083(ML)"!(@\0HZ0````!F9F:0
+M2(N:@`(``(![*`!(BTL(2(M3$$0/MJNJ````#X21````#[>#F````$B+DZ``
+M``!(*<)!@/T!2(F3H`````^$<P$``$&`_0(/A'\!``!(@[N@``````^%CP``
+M`$B+.>@MX?__183M#X0X`0``08#]`P^$+@$``$B)[^@`````2(G?2(ML)!!(
+MBUPD"$R+9"083(ML)"!(@\0HZ0*;__]FD$B+>PA(C7-(Z`````#I^_[__P^W
+M@Y@```!(`X.@````183M2(F#H````'5I2#M!*'4'QH.J`````4B+0BA(.8.@
+M````#X1Q____2(LYZ)[@__]%A.T/A)<```!!@/T#D`^$C````$B)[^@`````
+M9I#IJ?[__TB)[TB+7"0(2(ML)!!,BV0D&$R+;"0@2(/$*.D`````08#]`W6>
+M2#M!*'68Z17___]F.X.8````9F:0#X)(_?__9L>#F@``````Z?O\__\/MX.8
+M````#[>3F@```$@#@Y````!(*=`/MY68````2"G02(F%D````.EY_?__2(M[
+M"$B-<TCH`````.EB____2(M["$B-<TCH`````.G`_O__2#M1*`^%C?[__\:#
+MJ@````#I@?[__T@[42@/A7?^___I@/[__V9FD&:0]H>Q`````DB+!\:'L@``
+M``!T(TB#>$@`=!Q(BTA`2(U7&$B)4$!(@\`X2(E'&$B)3R!(B1'#Z0````!F
+M9I!FD%-(B?M(BS^+MV@"!`#HSM[__TB+`TB#>$@`=!U(BTA`2(U3&$B)4$!(
+M@\`X2(E#&$B)2R!(B1%;PTB)WUOI`````&9F9I!F9F:09F:09F:02(/L.$B)
+M7"0(2(EL)!!,B60D&$R);"0@3(ET)"A,B7PD,$B+7UA,BW=@3(LK38NEX`$`
+M`$F+1"0H1(LXZ`````"`>Q`$#X:=````2(NK@`(``$B%[0^$[0```$B+?0A(
+MA?]T#+H"````,?;H8+#__TB+?1!(A?]T#+H"````,?;H2[#__TB+11A(BU4@
+M28V]T````$B)[DB)4`A(B0+H`````$&-7@%$.?MT5$F+1"0HB=J+?)`$Z```
+M``")WDB+;"002(M<)`A,BV0D&$R+;"0@2(G'3(MT)"A,BWPD,$B#Q#CIJ&#_
+M_TB)WT&-7@'H`````$0Y^W6S9F9FD&9FD$F+?"0028UT)%A)QT0D6`````!-
+MB60D8$G'1"1H`````$B+7"0(2(ML)!!,BV0D&$R+;"0@3(MT)"A,BWPD,$B#
+MQ#CI`````+H"````,?9(B=_H>:___^E'____9F9FD$B#["A,B60D$$B)7"0(
+M28G\3(EL)!A,B70D($R+=PA(BU\028L&2(G>3(GW3(NHX`$``.CH1/__2,>#
+M@`(```````!)QX:``@```````$$/MI:``P``#[:#@`,``$F-=5B#X@2#X/L)
+MT(B#@`,``$$/MI:``P``@^#]@^(""="(@X`#``!!#[9&2(A#2$F+?1!)QT58
+M`````$V);6!)QT5H`````.@`````2(G>OQ4```#H`````$F+5"0828M$)"!)
+MC70D,$F+/DG'1"0P`````$V)9"0X2<=$)$``````2(E""$B)$$B+7"0(3(MD
+M)!!,BVPD&$R+="0@2(/$*.D`````D)"0D)"0D)"0D)"02(N'V`,``$B%P'0?
+M2(M6"$@Y$',-2(L.2#E("`^'JP```$B+0!!(A<!UY4B+EZ`#``!,C8>@`P``
+M3#G"=#IFD$B-0NB`N+``````=2-(BXB0````#[>`F````$@!R$@Y!G,-2#M.
+M"')D9F9FD&9FD$B+$DDYT'7(2(N/L`,``$B!Q[`#``!(.?EU%^M&9F:0@/J`
+M=!Q(BPE(.?EF9I!FD'0Q2(U!Z`^VD+````"$TG7?2(N0D`````^W@)@```!(
+M`=!(.09SSD@[5@ASR+@!````PS'`PV9F9I!F9I!F9I!(@^P02(D<)$B);"0(
+M2(G[2(GUZ`C___^%P'4B2(N#V`,``$B)11!(B:O8`P``,<!(BQPD2(ML)`A(
+M@\00PTB#?2@`N/____]TYDB+@^`#``!(C9/@`P``2(7`=`U(C5`02(M`$$B%
+MP'7SN/____](B2KKO&9F9I!F9F:09F9FD$B+A]@#``!(C9?8`P``2#GP=`U(
+MC5`02(M`$$@Y\'7S2(M.&$B+1A!,C4X83(N'T`,``$DYR4B)`DC'1A``````
+M=!U(BU8@28L`3(E!"$F)"$B)4`A(B0),B4X@3(E.&$B+!\=`:`$```##9F:0
+M9I!(@S\`=`U(BT<(2(EP$$B)=PC#2(EW"$B)-\-F9I!FD$B#QUCI`````&9F
+M9I!F9I!32(N'@````$B)^TB%P'042,>'@`````````!(B[>(````_]!(BX/(
+M````2(L[2(US*$B)6S!(QT,X`````$B)0RA(@\=86^D`````9F9FD$B#[!A(
+MB5PD"$B)^TB);"002(MO4.@`````2(MS>$B+4QA(C4L82(M#((.MB`,```&#
+MK80#```!2(7V2(E""$B)$$B)2R!(B4L8=!9(B>](BUPD"$B+;"002(/$&.D`
+M````2(M<)`A(BVPD$$B#Q!C#9F9FD&9F9I!F9F:09F:0055!5%532(GSB=9(
+M@^P(3(M'6$R+IY````!$#[>OF````$F+B+@```!)BZB0````2(7)#X2H````
+M00^V@+$````/M]*#X`$/ML`YT`^$CP```$2+`42)YRGOP><)1#G'1(G`<PWI
+MI@```&9FD&9FD(G02(/!$(G"`Q$YUW/R1(L!*<=!#[?UB?I(`U$(02GXP>8)
+M1(D#1#G&2(E3"$B-4Q!V)4B+01@K,\=#!`````!(B=-(B4((BT$02(/!$(D"
+M2(/"$#GP<MN),\=#!`$```!(@\0(6UU!7$%=N`$```##28N`P````$B%P'06
+MB?),B<=(B=[_T(7`=`A(B=GI3____TB#Q`@QP%M=05Q!7<,QP.EJ____9F:0
+M9F:09F:0055!5%532(G[2(/L"("_L`````!(BV]0#X42`@``#[>'F````$R+
+MIY````!*C0P@2(N%V`,``$B%P'0V#[:7L0```(/B0(32=`>+<$"%]G052#E#
+M<'0/2#L(=@I,.V`(#X+R`@``2(M`$$B%P&9FD'742(-[<``/A*$"``"`?1`$
+M#X:I`0``3(NM@`(``$V%[0^$/0(``$&`O:L`````#X4O`@``]H.Q````"`^%
+M(@(``$B!N\@`````````#X01`@``23MM"`^%!P(``$&`?2@`#X3H`@``28N%
+MH````$DYQ`^#(P$``$@YP0^&XP$``$B+>PB#1P@!Z`````!(B<=(BP-(B0=(
+MBT,(2(E'"(M#:(E':$F+10A,B:>0````2(E'4+Z`____28N%H````$B)7UC&
+MA[(`````2,>'P`````````!(QX?(`````````$C'A[@`````````9D0IX&:)
+MAY@````/MH>Q````#[:3L0```(/@/R'6B=&#X4`)\+XP````"<@AUHG1@^#'
+M@^$("?`)R(G1@^("@^$$@^#Y"<@)T`^VD[$```"#X/Z#X@$)T(B'L0```$B+
+M4W"X`0```$B%TD@/1<)(C5,82(E'<$F+10A(BXBX`P``2(F0N`,``$@%L`,`
+M`$B)0QA(B4L@2(D1QH.P````@$B#Q`A;74%<05WI`````$F+11"#K80#```!
+M2(E#4$B)Q8.`A`,```&`>!`$#X>F````9I!(BY6@`P``2(V-H`,``$@YRG4L
+M2(L#2(E+&,=`:`$```!(C4,82(E!"$B)A:`#``!(B4L@2(/$"%M=05Q!7<.#
+M>V@`=3=(B[6H`P``2(U^Z(M':(7`#X@5`0``2(U#&$B)2QA(B86H`P``2(D&
+M2(ES($B#Q`A;74%<05W##X[,````2(U#&$B)4QA(B4((2(F%H`,``$B)2R!(
+M@\0(6UU!7$%=P_:#L0````0/A$_____VA6$"```@#X1"____@*5A`@``W^@`
+M````@(U@`@``!(E%/$B+`\>`E`($``$```!(BT582`E%4.D2____]H.Q````
+M0`^%4OW__TB+A>`#``!(A<!U%NE!_?__9F9FD$B+0!!(A<`/A##]__](.PAV
+M[DP[8`ASZ$B+2"!(C5,82(E0($B#P!A(B4,82(E+($B)$4B#Q`A;74%<05W#
+M2(N5J`,``$B-0QA(B4L82(F%J`,``$B)`DB)4R#IQ/[__X-':`%(BU8(2(U#
+M&$B)<QA(B48(2(D"2(E3(.FD_O__28N%H````$@YP0^&._[__TDYQ`^#^_[_
+M_TB+>PB#1P@!Z`````!(B<=(BP-(B0=(BT,(2(E'"(M#:(E':$F+11#I$_W_
+M_V9F9I!F9I!F9I!32(M'4$B)^TB+=WB#@(0#```!2(7V="E(B7XP2(M_4$C'
+M1B@`````2,=&.`````#H`````(7`=1=(BT-X2(E#<$B)WUOI`````&9FD&9F
+MD%O#9F9FD&9F9I!F9I!F9I!52(GY4TB#[`B`N;(````!2(M?6$B+?U!$#[>)
+MF`````^WLY@```!(BZ^``@``=$$/MH&R````2(M["$B)SL:#L`````"(@[(`
+M``#H`````$B+0PA(B=^#:`@!2(M%"(.`B`,```%(@\0(6UWI`````$B+@Y``
+M``!(.8&0````=:^+04!,BT%(A<!T$HG"3(G`Q@``2(/``4B#Z@%U\TB+10A(
+M.?AT,DB)05!(BX6@````9D0ISF:)L9@```#&@;(`````2(G/2(F!D````$B#
+MQ`A;7>D`````2(M%$.O(D$%72(U'&$R-?UA!5D%528G]05154TB#[!A(B40D
+M"$B-1SA(B00D0<=%:`````#K&TB+0A!(A=))B458="U(QT(0`````$B+>@C_
+M$DF+55A).U5@==M(A=))QT5@`````$G'15@`````==--BW483#MT)`@/A&4"
+M``#'1"04`````$BX(````/____])A4;P28VN</S__TF-7A!T",=$)!0!````
+M3(VEL`,``&9FD&:02(N-H`,``$@YV0^$D@```$B+$4B+00A(B<](@^\82(E"
+M"$B)$$B)20A(B0ET=`^VE8`#``#VP@$/A&(!``!$BY6(`P``1872=`^+A<0#
+M```[1V@/CZL!``"#XA@/A:(!``"+1VA,B6<8@X6(`P```8F%Q`,``$B+A;@#
+M``!(B8VX`P``2(D(2(E'($B+10C_4"A(BXV@`P``2#G9#X5N____3(VER`,`
+M`&9F9I!F9I!(BXW(`P``3#GA=&1(BQ%(BT$(2(G+2(/K&$B)0@A(B1!(B4D(
+M2(D)=$9(BW-X2(7V="E(B5XP2(M[4$C'1B@`````2,=&.`````#H`````(7`
+M=:Q(BT-X2(E#<$B)W^@`````2(N-R`,``$PYX76<2(.]X`,```!,C:7@`P``
+M="E)BQPD2(7;="!(B=Y(B>_HR_3__X7`#X2$````3(UC$$F+'"1(A=MUX$V+
+M-DP[="0(#X5I_O__1(M,)!1%A<D/A+@```!)@WU8``^%]?W__T&+?6B%_P^%
+MZ?W__TB#Q!A;74%<05U!7D%?PV9F9I#&A[(````"2(N%N`,``(.%B`,```%(
+MB8VX`P``3(EG&$B)1R!(B0CH`````.DO_O__2(M#$$B-<RA,B?])B00D2(N%
+MV`,``$B)0Q!(B9W8`P``Z`````!!QT5H`0```.DM____2(N%H`,``$B-5QA,
+MC:7(`P``2(E0"$B)1QA(B5\@2(F5H`,``.F"_O__18N%E`($`$6%P'0=ZVU(
+MBT(028E%2$B%TG112,="$`````!(BWH(_Q))BU5(23M54'7;2<=%4`````!)
+MQT5(`````.O12(L12(M!"$B)STB#[QA(B4((2(D02(E)"$B)"0^$X?[__^@`
+M````28M-.$@[#"1US^G-_O__0<>%E`($``````!,B>_H`````.N99I!32(L?
+M2(-[2`!T)$B+2T!(C5<82(U#.$B)4T!(B4<82(E/($B)$4B)WUOI`````.@`
+M````Z_"0D)"0D)"0D)"0,=)(A?]T#$B-1_^#P@%((<=U](G0PV9F9I!F9I!F
+M9I!!54G'Q?[___]!5%532(G[2(M[4$B+:QA(A?]U#?:#8`(```(/A9H```!%
+M,>1("WM8Z`````!(BU,(1`'@#[92"CG0?D>`HX`#``#^]H.``P```70P2(7M
+M="L/MG5$0(3V=")(.5U@3(GH=$PQTNL-#[;*2&/!2#E<Q6!T,8/"`4`X\G7K
+M6UU!7$%=PTB+0U"`BX`#```!2(7`=+!(B<)(,U-8=3>`HV`"``#]ZYY(Q\#^
+M____2-/`2"%%6$B)Z^E,____2(M#"(!X"P$/A5C___]$#[9@"NE1____2(70
+MD`^$9O___X"+8`(```+I6O___V9F9I!F9F:09F:09F:02(MW&$0/MD9$183`
+M="<QR3'22#E^8'45ZR!F9I!F9I`/MLI(8\%(.7S&8'0-@\(!1#C"=>NY_P``
+M`(G(PV9FD$R+1CA-A<!T3TF+0!A(A<!T/DB+0!A(A<!T-4@Y^'1`#[901(72
+M?NHQ]DB+3/!@2(7)=`N`>1`$=@5(.?ET(4B#Q@$Y\G_C2(M`&$B%P'7+38L`
+M387`=;$QP,-F9I!FD+@!````PV9F9I!F9I!F9I!!5$F)U%5(B?532(G[2(/L
+M$(!_$`0/AH\```#'1"0,`````,=$)`@!````#[9/1(7)?B=(BW]@,=)(B=A(
+MA?]T$NF%````2(MX:$B#P`A(A?]U>(/"`3G*=>Q(BU,(@'H)`'0D#[9#1`^V
+M4@HIT`^O1"0(B40D"`^W0T8[1"0,#T9$)`R)1"0,2(7M=`>+1"0,B44`387D
+M=`B+1"0(08D$)$B#Q!!;74%<PTB%]G0&QP8`````387D=.=!QP0D`0```$B#
+MQ!!;74%<PTB-5"0(2(UT)`SH`````$B+4PB`>@D`=*3I>____V9F9I!F9I!3
+M2(G[2(/L$$B+?PA(C50D"$B-="0,Z`````!(BWL02(UT)`1(B>+H`````(M4
+M)`@[%"2+1"0,#Y=#*#E$)`0/0T0D!`^OPKJ`````9H7`#T709HF3J````$B#
+MQ!!;PY!!5$F)]%53#[9'$$B)^SI&$'0-N`$```!;74%<PV9FD`^W1T1F.T9$
+M=>F`?T0`#X28````2(M_8$B+=F!(A?]TTC'M2(7V=,N`?Q`$=CB`?A`$=K_H
+M`````(3`=;8/ME-$C44!.<)^9$B+?.MH28MT[&A(@\4!2(7_=)A(A?9TDX!_
+M$`1WR(!^$`1WATB+1CA(.4<X#X5Y____2(M72$B+1DA(BT@(2#E*"`^%8___
+M_TB+2!!(.4H0#X=5____]H-@`@```W26Z4?___\QP&:0Z4/___]F9F:09F9F
+MD&9FD%-(BU\(2(M'$$B%VW0R2(7`=&[V@X`#```!=3F`H(`#``#^QT,P____
+M_X"C@`,``/[&AZL````!6\-F9I!F9I!(A<!T[("@@`,``/[&AZL````!6\/V
+M@(`#```!=+[&AZL`````@(MA`@``!("(80(```3H`````$B)WUOI`````("C
+M@`,``/[&AZL````!6\-F9F:09F9FD&9F9I!F9I!!5TF)]T%6055!5%5(B?U3
+M2(/L&`^V5T2%T@^.C0$``$4Q[>F&````2(7`28EL)!AT"$C'0!@`````3HED
+M[6`/MI5@`@``2,>%:`(```````")T(/("J@@B(5@`@``=`F#RHJ(E6`"```/
+MMDPD%+@!````2-/@2`E%4$CWT$@A15A-A?\/A#L!``"`C6`"```$387_#X43
+M`0``#[951$&-10%)@\4!.<(/CO\```!$B6PD%$J+1.U@2(7`=`GV@(`#```!
+M==1-A?]-B?P/A5;___](BT4(#[9`"BG"2(M%*$ACTDB)T3'22/?Q2(D$)$B+
+M10!(BU@82(/`&$@YPW2:13'D2,=$)`C_____ZQ)FD$B+10!(BQM(@\`82#G8
+M=%#V0_`!3(VS</S__W3C@+N`_/__`77:]H/8_/__!'313(GV2(GOZ';[__^$
+MP'7"2(N#L/S__T@Y!"1WM4@[1"0(<ZY-B?1(B40D".ND9F9FD$V%Y`^$(?__
+M__:%80(```)T:TF+1"0X2(7`=!=F9F:02(-X&``/A?_^__](BP!(A<!U[4J+
+M1.U@Z7O^___VA6`"```(=2%(@\086UU!7$%=05Y!7\-,B>:_!P```.@`````
+MZ;/^__](@\082(GO6UU!7$%=05Y!7^D`````2(LT)#'23(GGZ`````!(A<!)
+MB<0/A)/^__]*BT3M8.D7_O__9F9FD&9F9I!F9F:09F:0059!54%454B)_5-(
+M@>P``@``@'\0!'8'@*=@`@``^_:%@`,```%T6H!]$`1V9(!]1`!T3C';2(M,
+MW6!(A<ET,P^VE8`#```/MH&``P``@^("@^#]"="(@8`#``!(BWS=8(!_$`1V
+M!P^V14B(1TCH``````^V142-4P%(@\,!.=!_M$B!Q``"``!;74%<05U!7L-,
+MBW4X0?:&@`,```$/A.$"``!,BVT813'D387M=`U-BV48387D#X0"`P``2(GC
+M2(G@2(V4)``"``#&``!(@\`!2#G0=>Q-A>3'`_06>%H/A,("``!!BT0D.(E#
+M!$&+1"1`B8/&````]H6``P```G0$@$L6`4V%Y`^$IP(``$F#_0$9P(/``HA#
+M&$F+C"2``@``2(7)=#F+`0^V4Q:)0PA(BX&@````@^+]2(E##`^V02B#X`$!
+MP`G"B%,63#EA$`^$=@(```^V@:H```"(0Q1!#[9$)$A-A>U,B>](#T3]B(/%
+M````00^VA"2!`P``B$,728M$)"A(B4,900^V1"00B$,A00^V1"1$B$,BZ+WX
+M__^(0R-!#[9$)$4/ME,EB$,D00^VA"1@`@``@^+[@^`!P>`""<*(4R5!]H0D
+M8`(```)T!H/*`8A3)4F+1"1028V4)(P"``!(C4M=2(F#K0```$F+1"109HE#
+M)TF+A"1H`@``2(E#*4&+1"0\B8.]````28N$)'`"``!(B4-)28N$)'@"``!(
+MB4-108N$)(@"``")0UE)BX0DS`(``$B)@YT```!)BX0DU`(``$B)@Z4```!)
+MBX0DC`(``$B)0UU(BT((2(E!"$B+0A!(B4$02(M"&$B)01A(BT(@2(E!($B+
+M0BA(B4$H2(M",$B)03!(BT(X2(E!.$V%[71]28M%*$B)[TB)0S%!#[9%$(A#
+M.4$/MD5$B$,ZZ*/W__^(0SM!#[9%10^V4SV(0SQ!#[:%8`(``(/B^X/@`<'@
+M`@G"B%,]0?:%8`(```)T!H/*`8A3/4F+15!(B8.U````28M%4&:)0S])BX5H
+M`@``2(E#04&+13R)@\$```!(B=_H`````+X``@``2(GGZ`````#WV$4QP$B)
+MX8A#%4B+=4"Z`0```$B+?3CH`````$F+1E!(BWTX13'`2(GAN@$```!(B<9(
+M`W5`2"T```(`2"4``/[_2('N``@``$@IQN@`````3(MU.$'V1F@0#X3R_/__
+M3(GWZ`````!(@<0``@``6UU!7$%=05[#,<#'0P0`````Z3W]___&0Q@`Z=G^
+M__],B>A%,>U)B<3I\/S__X/*!(A3%NE__?__9F9FD&9F9I!52(UO&%-(@^P(
+M2(M?&$@YZW4*ZT=(BQM(.>MT/X"[@/S__P1(C8-P_/__=NCV@]#^__\$=-](
+MBW@82(7_=`V02(GX2(MX&$B%_W7T2(G'Z`````!(BQM(.>MUP4B#Q`A;7<-F
+M9F:09F:09F:09F:005154TB)^TB+?QA(A?]U].@`````3(NC@`(``(E#.$V%
+MY'0Q28ML)`A(.=UT3N@`````2(7M08D$)'099F9FD.@`````B44X.T,X=/-(
+MB>_H`````$B)W^@`````2(M#"$B+0&!(A<!T#4B)WTF)PUM=05Q!_^-;74%<
+MPTF+;"00ZZMF9F:09F:09F:09F:0055!5%5(B?U32(/L"`^V1Q"#Z`4\!0^'
+MU`````^VP/\DQ0`````/MT=&2/?82"&':`(``/:'@`,```$/A;0!``!(BU58
+M2(72=0=(@WU0`'1/@'T0"@^$N@$``("E8`(``/Y(A=)T.8"-80(``"!(@WU8
+M`'0K]H6``P```71R2(M5&$B%TG0)]H*``P```70=,?9(B>_H`````&9FD&9F
+MD/:%@`,```%T1TB+51CVA6$"```$=3[VA6`"```#=#5(BTU02(7)#X5G`0``
+M2(72=`GV@H`#```!=".`C6`"```(2(GOZ`````!F9F:09F:02(M5&$B%T@^$
+MV0```$B#Q`A;74%<05W#13'M13'D@']$`'43Z]H/ME5$08U$)`%)@\0!.<)^
+M3DJ+7.5@2(7;=.6`>Q`$=M](B=_H`````/:#8`(```1T!X"-8`(```0/MH-@
+M`@``#[951(/@`SP"N`$```!$#T3H08U$)`%)@\0!.<)_LD6%[0^$<O___X"E
+M8`(``/XQVX72?QCI8/___P^V142-4P%(@\,!.=`/CDW___](BWS=8$B%_W3C
+M@'\0!';=]H=@`@```734#[:'8`(``(/@OH/(`HB'8`(``.@`````Z[KVA6`"
+M```$#X0:____2(/$"$B)[UM=05Q!7>D`````2(M76$B)T$CWT$B%1U`/A#S^
+M__^`CV`"```"Z3#^__\/MDU$N`$```"#Z0%(T^!(.450#X4M_O__Z2_^__](
+MBT582/?02(7!#X2Q_O__Z83^__]F9F:09F9FD$B#[!A(B5PD"$B);"002(G[
+M2(GUZ%?S__^$P'5#]H-A`@```DB+0PA(BW,H#[9+1`^V4`IT,3'`]H-@`@``
+M!'4/2(M<)`A(BVPD$$B#Q!C#2(G?Z``````QP.OE9F9FD+C_____Z]H/ML$/
+MMM(IT$ACT$B)\$B)US'22/?W,=)(B>](B<;H`````$B%P'312(G&2(G?Z```
+M``#KFF9F9I!!5$&)U$N-!&152(TLQE-(B?,/MG4AZ`````!(A<!(B<</A"@!
+M``"`H(`#``#^#[9#%XB'@0,``(M#!(E'.(N#Q@```(7`B4=`=0:+0P2)1T`/
+MMH/%````2(UU$(A'2`^V5A4/MH=@`@``P.H"@^(!@^#^"="(AV`"``!(BT4I
+M2(F':`(``$*+A*.]````B4<\#[9-)+@!````T^"(3T5FB4=&2(M&"4B)1R@/
+MMDTB2,?`_____X#Y/XA/1`^&E0```$B)1UA(BT-)2(U374B-CXP"``!(B8=P
+M`@``2(M#44B)AW@"``"+0UF)AX@"``!(BX.=````2(F'S`(``$B+@Z4```!(
+MB8?4`@``2(M#74B)AXP"``!(BT((2(E!"$B+0A!(B4$02(M"&$B)01A(BT(@
+M2(E!($B+0BA(B4$H2(M",$B)03!(BT(X2(E!.%M=05Q(B?C#N`$```!(T^!(
+M@^@!Z5K___]F9F:09F9FD$B![#@"``!!N`$```"Z`0```$B)G"0(`@``3(FD
+M)!@"``!(B>%,B;0D*`(``$B)K"00`@``28G\3(FL)"`"``!,B;PD,`(``$F)
+MYDB+;SA,BS](BT502(G&2`-W0$@M```"`$@E``#^_TB)[TB![@`(``!(*<;H
+M`````(7`B<,/A,L```!)BW0D0$F+?"0X0;@!````2(GAN@$```#H`````(/X
+M_T&)Q7163(GWZ`````!!@3[T%GA:#X3$````N/____](BYPD"`(``$B+K"00
+M`@``3(ND)!@"``!,BZPD(`(``$R+M"0H`@``3(N\)#`"``!(@<0X`@``PV9F
+M9I"%VW6[2(M%4$F+?"0X0;@!````2(GAN@$```!(B<9)`W0D0$@M```"`$@E
+M``#^_TB![@`(``!(*<;H`````(7`#X1D____Z73___]F9I!FD$B)Y^@`````
+M@3PD]!9X6I!T"KO^____Z1G___^^``(``$B)Y^@`````A,`/A`3____KW[X`
+M`@``2(GG9F:09I#H`````(3`#X4B____187M#X5`!```A=L/A9<%``!!@'XA
+M!`^&!O___T&`?B)`9I`/A_G^__]!@'XZ0&9FD&:0#X?I_O__28M?&$F-5QA%
+M#[=N)TT+KJT```!(.=-T)H"[@/S__P1(C:MP_/__=@Y(@[N(_/__``^$"`0`
+M`$B+&T@YTW7:,=),B?9,B?_H;OS__TB%P$B)Q0^$D?[__P^VE6`"```/MDU$
+MB="#XOW0Z$$*1B6#X`$!P`G"@/D_2,?`_____XB58`(``$B+55!W#+@!````
+M2-/@2(/H`4PAZ$@)T`^VE6`"``!(B45000^V1B6#X@'`Z`*#X`$XPG0C#[:5
+M8`(``$B+10B#XOZ(E6`"``"`>`H`=`F#R@*(E6`"``!!BU8(A=)T94B+C8`"
+M``"`C6$"```$2(7)#X3I`@``@'DH``^$R0(``$F+1@Q(.8&@````=A)(B8&@
+M````00^V1A2(@:H```!!]D86!`^$D`0``$B+41!(A=(/A',$``!(BT$(2#G"
+M#X14!```BT4\03N&O0````^$6`(``("-8`(```)(QX5H`@````````^VE8`#
+M``")T(/B_=#H00I&%H/@`0'`"<*(E8`#``!!@'X8`4$/MD8C#X:;`0``1`^V
+MZ$J+7.U@2(7;#X3;`0``#[:3@`,```^V2T1(BWM0B="#XOW0Z$$*1A:#X`$!
+MP`G"B).``P``#[:38`(``(G0@^+]T.A!"D8]@^`!`<`)PH#Y/XB38`(``$C'
+MPO____]-BX:U````00^W=C]W#+@!````2-/@2(T4$`^WQDP)P$@APD@)^DB)
+M4U!!#[9&/0^VDV`"``#`Z`*#X@&#X`$XPG0C#[:38`(``$B+0PB#XOZ(DV`"
+M``"`>`H`=`F#R@*(DV`"``!!#[9..TACP4B#?,-@``^%<OS__TR)9,-@BT,\
+M03N&P0```$F)7"08#X2%````@(M@`@```DC'@V@"````````2,?`_O___TB)
+MWTC3P$@A0UCH``````^V@V`"``"H$'4-J"!T%(/(@(B#8`(``$C'@V@"````
+M````]H6``P```71*2(N%@`(``$B%P'0^2(M0"$B%TG0U2(MX$$B%_W0L2#G5
+M2`]%^N@`````,<#IV/O__TF+1D%(.8-H`@``=H!(B8-H`@``Z73___\QP.FX
+M^___#[;(28EL)!A(B>](8\%,B63%8$C'P/[___](T\!((458Z``````/MH5@
+M`@``J!!U$:@@#X1M____@\B`B(5@`@``2,>%:`(```````#I5/___[H!````
+M3(GV3(G_Z"+Y__](A<!(B<,/A$7[__](B6@82HE$[6#I^_W__TF+1BE(.85H
+M`@``#X:I_?__2(F%:`(``.F=_?__28M&#$@Y@:`````/@T7]___I+OW__TF+
+M1RA)C5\H2#G8#X33````.U#H2(U(Z`^$M@```$B+`$@YV'7KZ;D```!,B??H
+M`````$F+="1`28M\)#A%,<!(B>&Z`0```.@`````3(GWZ`````#IF?O__XN#
+MJ/S__T$[1@0/A>C[___V0_`!#X7O````08!^&`$/AO3[__]!#[9&(TB+7,5@
+M2(7;#X3A^___]H.``P```0^$U/O__TB+>U!!#[=&/TD+OK4```!("<?H````
+M`$B+4P@/ME(*.=`/CJS[__](B>_H`````.F&^___2(7)2(F-@`(```^%,_S_
+M_TF-O]````#H`````$B%P$B)P4B)A8`"```/A`'Z__\QP,8$"`!(@\`!2#VP
+M````=?!)BT<P2(U1&$B)61A)B5<P2(D02(E!($&+1@B)`4F+1@Q(B8&@````
+M00^V1A2(@:H```!!]D86`@^$Q/O__TB+A8`"``#&0"@!Z;3[__],B>]("[O`
+M_/__Z`````!(BY-X_/__#[92"CG0#X]"____Z>K^__],B??H`````$B+15!(
+MB<9)`W0D0$@M```"`$@E``#^_TB![@`(``!(*<;I?_[__[C_____2,=!"```
+M``#I/OG__TB+00A(B>I(B6D0Z8'[__](BT$(2(7`=`E(BU$0Z6_[__](BU$0
+M2(GH2(EI".E?^___9F9FD&9F9I!52(G]4TB#[`A(BU\8#[9#1(3`#[;0#X0;
+M`@``,<E(.7M@=1/I#@(``&9F9I!F9I!(.6S+8'0+2(/!`4@YT6:0=>ZX`0``
+M`$C3X$@)0UA(B=_H`````/:#@`,```$/A;T```!(BT,82(7`#X26`0``2(M`
+M"$B)W_]0,#'V@'M$`'1;2(M4\V!(A=)T1/:"@`,```%T.X!Z$`1V-0^VBF`"
+M``")R(/@CT@YZHB"8`(```^$7P$``/:"8`(```%T$8/ACH/)`HB*8`(``&9F
+MD&:0#[9#1$B#Q@%(.?!WI4B+@X`"``!(A<`/A`X!``!(BU`(2(72#X0!`0``
+M2(MX$$B%_P^$]````$@YTT@/1?J`IX`#``#^2(/$"%M=Z0`````/MH-@`@``
+M@^"_J""(@V`"``!T%(/(@$C'@V@"````````B(-@`@``#[:38`(``(G0@^#^
+MB(-@`@``2(M#6$CWT$B%0U!U"8/B[(B38`(``$B+<QA(A?8/A(4```"`IF`"
+M``#^@'Y$`'1X,>TQR6:02(M4SF!(A=)T-O:"@`,```%T+8!Z$`1V)_:"8`(`
+M``%T'@^V@F`"``"]`0```(/@K(/(`HB"8`(``&9FD&9FD`^V1D1(@\$!2#G(
+M=[-(@[N``@```'1>]H-@`@``!'4SA>UU.8"+80(``"!(@\0(6UW#,>WKUTB)
+MW^@`````9I#I9?[__X/AC(B*8`(``.FM_O__2(G?Z`````#KQTB)W^@`````
+MZ[VX`0```&9F9I#I!?[__TB+0QA(A<!F9F:0=`I(@[B``@```'6+BU,PA=)X
+M#S'V2(G?Z`````#I=?___TB%P`^$;/___XM`,(7`>>'I8/___Y"0D)"0D)"0
+MD$B+!0````!(A<!T,S')9I"`>`P!2(L`@]G_2(7`=?&%R70<BQ4`````C8+_
+M#P``A=(/2-#!^@R)T,'Z'_?YPXL%`````(V0_P\``(7`#TC"P?@,PV9F9I!F
+M9F:09F9FD//#9F9FD&9F9I!F9I!F9I!(BX>(`0``2(E&&$B)MX@!``##9F9F
+MD&9FD&9FD&9FD#'`PV9F9I!F9I!F9I!F9I!!5$F)_%53BX=P`0``QX>X`0``
+M`````$F+K"20`0``2(7M=$,Y10!W:$DYK"28`0``#X2.````2(M%($F)A"20
+M`0``2,=%(`````!(BWT0_U4(28NL))`!``!!BX0D<`$``$B%[76]/7\!``!W
+M'DF+G"2(`0``2(7;=!$Q]DB+._]3"$B+6QA(A=MU[UM=05S#28N<)(@!``!(
+MA=MT[F:02(L[BW4`_U,(2(M;&$B%VW7N08N$)'`!```[10`/@U3____KQTG'
+MA"28`0```````$G'A"20`0```````.EA____9F9FD&9F9I!F9I!F9I!52(G]
+M4TB#[`A(BY^(`0``2(7;=!1(BSN^______]3"$B+6QA(A=MU[#'`2(-]6``/
+ME<!(@\0(6UW#9F:09F:04XN'N`$``$B)^X7`=`);PTB)NZ@!``!(QX>@`0``
+M`````$B-MZ`!``!(QX>P`0```````$B-?UCH`````,>#N`$```$```!;PV9F
+M9I!F9I!(@^P(2(._D`$```!T(DB+AY@!``!(B7`@2(FWF`$``.@`````N`$`
+M``!(@\0(PY"+AW`!```[!G,02(FWF`$``$B)MY`!``#KUDB+?A#_5@@QP.O5
+M9F9FD&9F9I!F9I!(@<=H`0``Z0````!F9F:02('':`$``.D`````D)"0D`^V
+M1Q2)P@I7%8/@^X/B!`G0#[97%8G!@^#^@^$!@^(!"<H)T(A'%`^V1R2)P@I7
+M)8/@^X/B!`G0#[97)8G!@^#^@^$!@^(!"<H)T(A'),.0#[9')8G""E<F@^#[
+M@^($"=`/ME<FB<&#X/Z#X0&#X@$)R@G0B$<E#[9'/8G""E<^@^#[@^($"=`/
+MME<^B<&#X/Z#X0&#X@$)R@G0B$<]PP``````````````````````<C<U,%]#
+M;VUP;&5T95)E<75E<W1!;F13;&]T````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
-M```@```$1````"`!``1$```"`0```CH```(!`0`".@``!`$```L````$`0$`
-M"P````@!```&6@$`"`$!``9:`0`0`0```Q0!`!`!`0`#%`$`(`$```8H```@
-M`0$`!B@``$`!```#$0``0`$!``<G``"``0``"T<#`(`!`0`+1P,`````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
@@ -7496,6 +6092,30 @@ M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
+M`````````%)O8VME="`W-3`@4T%402!#;VYT<F]L;&5R```!````````````
+M``````````````````"6,`=W+&$.[KI1"9D9Q&T'C_1J<#6E8^FCE62>,HC;
+M#J2XW'D>Z=7@B-G2ERM,M@F]?+%^!RVXYY$=OY!D$+<=\B"P:DAQN?/>0;Z$
+M?=3:&NODW6U1M=3TQX73@U:8;!/`J&MD>OEB_>S)98I/7`$4V6P&8V,]#_KU
+M#0B-R"!N.UX0:4SD06#5<G%GHM'D`SQ'U`1+_84-TFNU"J7ZJ+4U;)BR0M;)
+MN]M`^;RLXVS8,G5<WT7/#=;<63W1JZPPV28Z`-Y1@%'7R!9AT+^U]+0A(\2S
+M5IF5NL\/I;VXGK@"*`B(!5^RV0S&).D+L8=\;R\13&A8JQUAP3TM9K:00=QV
+M!G';`;P@TI@J$-7OB86Q<1^UM@:EY+^?,]2XZ*+)!W@T^0`/CJ@)EAB8#N&[
+M#6I_+3UM")=L9)$!7&/F]%%K:V)A;!S8,&6%3@!B\NV5!FQ[I0$;P?0(@E?$
+M#_7&V;!E4.FW$NJXOHM\B+G\WQW=8DDMVA7S?-.,94S4^UAALDW.4;4Z=`"\
+MH^(PN]1!I=]*UY78/6W$T:3[]-;3:NEI0_S9;C1&B&>MT+A@VG,M!$3E'0,S
+M7TP*JLE\#=T\<050JD$")Q`0"[Z&(`S));5H5[.%;R`)U&:YG^1AS@[YWEZ8
+MR=DI(IC0L+2HU\<7/;-9@0VT+CM<O;>M;+K`((.X[;:SOYH,XK8#FM*Q=#E'
+MU>JO=]*=%2;;!(,6W',2"V/CA#MDE#YJ;0VH6FIZ"\\.Y)W_"9,GK@`*L9X'
+M?423#_#2HPB':/(!'O["!FE=5V+WRV=E@'$V;!GG!FMN=AO4_N`KTXE:>MH0
+MS$K=9V_?N?GY[[Z.0[ZW%]6.L&#HH];6?I/1H<3"V#A2\M]/\6>[T6=7O*;=
+M!K4_2S:R2-HK#=A,&PJO]DH#-F!Z!$'#[V#?5=]GJ.^.;C%YOFE&C+-ARQJ#
+M9KR@TF\E-N)H4I5W#,P#1PN[N18"(B\F!56^.[K%*`N]LI):M"L$:K-<I__7
+MPC'/T+6+GMDL':[>6[#"9)LF\F/LG*-J=0J3;0*I!@F</S8.ZX5G!W(35P`%
+M@DJ_E11ZN.*N*[%[.!NV#)N.TI(-OM7EM^_<?"'?VPO4TM.&0N+4\?BSW6AN
+M@]H?S1:^@5LFN?;A=[!O=T>W&.9:"(AP:@__RCL&9EP+`1'_GF6/::YB^-/_
+M:V%%SVP6>.(*H.[2#==4@P1.PK,#.6$F9Z?W%F#034=I2=MW;CY*:M&NW%K6
+MV68+WT#P.]@W4ZZ\J<6>N]Y_S[)'Z?^U,!SRO;V*PKK*,).S4Z:CM"0%-M"Z
+MDP;7S2E7WE2_9]DC+GIFL[A*8<0"&VA=E"MO*C>^"[2AC@S#&]\%6HWO`BT`
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
@@ -7526,31 +6146,6 @@ M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
-M`````````````````````````````````````````````````%)O8VME="`W
-M-3`@4T%402!#;VYT<F]L;&5R```!`````````)8P!W<L80[NNE$)F1G$;0>/
-M]&IP-:5CZ:.59)XRB-L.I+C<>1[IU>"(V=*7*TRV";U\L7X'+;CGD1V_D&00
-MMQWR(+!J2'&Y\]Y!OH1]U-H:Z^3=;5&UU/3'A=.#5IAL$\"H:V1Z^6+][,EE
-MBD]<`139;`9C8ST/^O4-"(W((&X[7A!I3.1!8-5R<6>BT>0#/$?4!$O]A0W2
-M:[4*I?JHM35LF+)"ULF[VT#YO*SC;-@R=5S?1<\-UMQ9/=&KK##9)CH`WE&`
-M4=?(%F'0O[7TM"$CQ+-6F96ZSP^EO;B>N`(H"(@%7[+9#,8DZ0NQAWQO+Q%,
-M:%BK'6'!/2UFMI!!W'8&<=L!O"#2F"H0U>^)A;%Q'[6V!J7DOY\SU+CHHLD'
-M>#3Y``^.J`F6&)@.X;L-:G\M/6T(EVQDD0%<8^;T46MK8F%L'-@P985.`&+R
-M[94&;'NE`1O!]`B"5\0/]<;9L&50Z;<2ZKB^BWR(N?S?'=UB22W:%?-\TXQE
-M3-3[6&&R3<Y1M3IT`+RCXC"[U$&EWTK7E=@];<31I/OTUM-JZ6E#_-EN-$:(
-M9ZW0N&#:<RT$1.4=`S-?3`JJR7P-W3QQ!5"J00(G$!`+OH8@#,DEM6A7LX5O
-M(`G49KF?Y&'.#OG>7IC)V2DBF-"PM*C7QQ<]LUF!#;0N.UR]MZULNL`@@[CM
-MMK._F@SBM@.:TK%T.4?5ZJ]WTIT5)ML$@Q;<<Q(+8^.$.V24/FIM#:A::GH+
-MSP[DG?\)DR>N``JQG@=]1),/\-*C"(=H\@$>_L(&:5U78O?+9V6`<39L&><&
-M:VYV&]3^X"O3B5IZVA#,2MUG;]^Y^?GOOHY#OK<7U8ZP8.BCUM9^D]&AQ,+8
-M.%+RWT_Q9[O19U>\IMT&M3]+-K)(VBL-V$P;"J_V2@,V8'H$0</O8-]5WV>H
-M[XYN,7F^:4:,LV'+&H-FO*#2;R4VXFA2E7<,S`-'"[NY%@(B+R8%5;X[NL4H
-M"[VRDEJT*P1JLURG_]?",<_0M8N>V2P=KMY;L,)DFR;R8^R<HVIU"I-M`JD&
-M"9P_-@[KA6<'<A-7``6"2K^5%'JXXJXKL7LX&[8,FX[2D@V^U>6W[]Q\(=_;
-M"]32TX9"XM3Q^+/=:&Z#VA_-%KZ!6R:Y]N%WL&]W1[<8YEH(B'!J#__*.P9F
-M7`L!$?^>98]IKF+XT_]K847/;!9XX@J@[M(-UU2#!$["LP,Y829GI_<68-!-
-M1VE)VW=N/DIJT:[<6M;99@O?0/`[V#=3KKRIQ9Z[WG_/LD?I_[4P'/*]O8K"
-MNLHPD[-3IJ.T)`4VT+J3!M?-*5?>5+]GV2,N>F:SN$IAQ`(;:%V4*V\J-[X+
-MM*&.#,,;WP5:C>\"+0``````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
@@ -7560,6 +6155,10 @@ M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````````````"````1$````
+M(`$`!$0```(!```".@```@$!``(Z```$`0``"P````0!`0`+````"`$```9:
+M`0`(`0$`!EH!`!`!```#%`$`$`$!``,4`0`@`0``!B@``"`!`0`&*```0`$`
+M``,1``!``0$`!R<``(`!```+1P,`@`$!``M'`P``````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
@@ -7590,9 +6189,6 @@ M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
-M````````(```!$0````@`0`$1````@$```(Z```"`0$``CH```0!```+````
-M!`$!``L````(`0``!EH!``@!`0`&6@$`$`$```,4`0`0`0$``Q0!`"`!```&
-M*```(`$!``8H``!``0```Q$``$`!`0`')P``@`$```M'`P"``0$`"T<#````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
@@ -7606,6 +6202,8 @@ M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
+M`$1A=&%#96YT97(@-S(X,"!3051!($-O;G1R;VQL97(``0`````````;````
+M`0``````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
@@ -7617,5706 +6215,4770 @@ M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````1&%T84-E;G1E<B`W,C@P(%-!5$$@0V]N=')O;&QE
-M<@`!`````````!L````!````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M`````````````````````````````$U67U)E<75E<W0@)7`Z($-D8ELE,G@L
+M``````````!;("`@("`@("!=($-D8B!;)3)X+"4R>"PE,G@L)3)X+"`E,G@L
M)3)X+"4R>"PE,G@L("4R>"PE,G@L)3)X+"4R>"P@)3)X+"4R>"PE,G@L)3)X
-M+"`E,G@L)3)X+"4R>"PE,GA=+@!;)3`R>#HE,#)X("4P,F1=(&1I<VL@<F5M
-M;W9E9"X``$5R<F]R(&EN(&ES<W5I;F<@8V]M;6%N9"P@97)R(&EN9F\@,'@E
-M;&Q8`````````%1A<VL@9FEL92!E<G)O<BP@4W1A='5S4F5G/3!X)7@L($5R
-M<E)E9STP>"5X+"!,0D%;,"TS73TP>"5X+$Q"05LT+3==/3!X)7@N````````
-M4F5C96EV960@3E5,(%)E<2!S;&]T3F\H)7@O)7@I($5.5%)9("@E,#AX*2P@
-M97)R;W(@,'@E;&Q8`````````&`M($9)4RA3;&]T.B4P,G@I.B`E,#AX("4P
-M.'@@)3`X>"`E,#AX``!#340@2&5A9&5R.B`E,#AX("4P.'@@)3`X>"`E,#AX
-M("X@)3`X>"`E,#AX("4P.'@@)3`X>"`N("4P.'@@)3`X>"`E,#AX("4P.'@@
-M+B`E,#AX("4P.'@`6R4P,G@Z)3`R>"`E,#)D("4P,F1=(%!-(')E<75E<W0H
-M)7@I('1I;65O=70N````5&EM96]U="!(,D0@1DE3*%-L;W0Z)3`R>"DZ("4P
-M.'@@)3`X>"`E,#AX("4P.'@`6R4P,G@Z)3`R>"`E,#)D72!89F5R("5X($5R
-M<F]R(&EN9F]R;6%T:6]N(#!X)6QL6`````````!;)3`R>#HE,#)X("4P,F0@
-M)3`R9"`E,#)D72!89F5R("5X($5R<F]R(&EN9F]R;6%T:6]N(#!X)6QL6```
-M````6R4P,G@Z)3`R>"`E,#)X("4P,GA=(%!-(%AF97(@)7@@17)R;W(@:6YF
-M;W)M871I;VX@,'@E;&Q8`````````%)U;FYI;F<@2#)$($9)4RA3;&]T.B4P
-M,G@I.B`E,#AX("4P.'@@)3`X>"`E,#AX`"!31R!I=&5M("4P,G@Z(&%D9'(@
-M)6QL>"!S:7IE("5X(%-'2"!A9&1R("5L;'@@<VEZ92`E>```1F%I;&5D('1O
-M(&5N86)L92]D:7-A8FQE('-P:6X@=7`N`````````%LE,#)X.B4P,G@@)3`R
-M9%T@1&5V:6-E(')E<75E<W0H)7@I('1I;65O=70N`````%LE,#)X.B4P,G@@
-M)3`R9"`E,#)D("4P,F1=($1E=FEC92!R97%U97-T*"5X*2!T:6UE;W5T+@``
-M6R4P,G@Z)3`R>"`E,#)D72!D:7-K(')E;6]V960@*"5X*2X``````$%T=$1E
-M=E-!4T%D9');)7A=("!;56YI=$ED("5X72!S87,@861D<B`E,#)X+24P,G@M
-M)3`R>"TE,#)X+24P,G@M)3`R>"TE,#)X+24P,G@`<V%M92!S87,@861D<B`E
-M,#)X+24P,G@M)3`R>"TE,#)X+24P,G@M)3`R>"TE,#)X+24P,G@```!$979I
-M8V4@)7@@:6X@<W1A;F1B>2!M;V1E+"!S=&%R="!T;R!P;W=E<B!I="!U<"X`
-M`````````%-T87)T('1O('!O=V5R('5P(&1E=FEC92`E>"XN+@``4&]R="!R
-M97-E="AP:&%S92`E>"!P;7`@)7@I(&YO="!C;VUP;&5T92!S=6-C97-S+"!I
-M9VYO<F4@=&AE('!O<G0@*"5X(&1E=FEC92`E>"D``````````%LE,#)X.B4P
-M,G@@)3`R9%T@9&ES:R!R96UO=F5D("@E>"DN``````!$979I8V4@*%!A=&@@
-M)3`R>"!\(%1A<F=E="`E,#)X('P@125X+U,E,#)X*2!S<&EN('5P(&UO9&4@
-M;F]T('-U<'!O<G0```!;)3`R>#HE,#)X("4P,F1=('-E="!D:7-K('-P:6X@
-M=7`@;6]D92`E>"X```````!;)3`R>#HE,#)X("4P,F1=(&1I<VL@<')O8F5D
-M("AS<&EN=7`@;6]D93H@)60I+@!-5E]297%U97-T("5P.B!#9&);)3)X+"4R
-M>"PE,G@L)3)X+"`E,G@L)3)X+"4R>"PE,G@L("4R>"PE,G@L)3)X+"4R>"P@
-M)3)X+"4R>"PE,G@L)3)X72X`17)R;W(@:6X@:7-S=6EN9R!C;VUM86YD+"!E
-M<G(@:6YF;R`P>"5L;%@`````````5&%S:R!F:6QE(&5R<F]R+"!3=&%T=7-2
-M96<],'@E>"P@17)R4F5G/3!X)7@L($Q"05LP+3-=/3!X)7@L3$)!6S0M-UT]
-M,'@E>"X```````!296-E:79E9"!.54P@4F5Q('-L;W1.;R@E>"\E>"D@14Y4
-M4ED@*"4P.'@I+"!E<G)O<B`P>"5L;%@`````````8"T@1DE3*%-L;W0Z)3`R
-M>"DZ("4P.'@@)3`X>"`E,#AX("4P.'@``$--1"!(96%D97(Z("4P.'@@)3`X
-M>"`E,#AX("4P.'@@+B`E,#AX("4P.'@@)3`X>"`E,#AX("X@)3`X>"`E,#AX
-M("4P.'@@)3`X>"`N("4P.'@@)3`X>`!;)3`R>#HE,#)X("4P,F0@)3`R9%T@
-M4$T@<F5Q=65S="@E>"D@=&EM96]U="X```!4:6UE;W5T($@R1"!&25,H4VQO
-M=#HE,#)X*3H@)3`X>"`E,#AX("4P.'@@)3`X>`!;)3`R>#HE,#)X("4P,F0@
-M)3`R9"`E,#)D72!89F5R("5X($5R<F]R(&EN9F]R;6%T:6]N(#!X)6QL6```
-M````6R4P,G@Z)3`R>"`E,#)X("4P,GA=(%!-(%AF97(@)7@@17)R;W(@:6YF
-M;W)M871I;VX@,'@E;&Q8`````````%)U;FYI;F<@2#)$($9)4RA3;&]T.B4P
-M,G@I.B`E,#AX("4P.'@@)3`X>"`E,#AX`"!31R!I=&5M("4P,G@Z(&%D9'(@
-M)6QL>"!S:7IE("5X(%-'2"!A9&1R("5L;'@@<VEZ92`E>```1F%I;&5D('1O
-M(&5N86)L92]D:7-A8FQE('-P:6X@=7`N`````````%LE,#)X.B4P,G@@)3`R
-M9"`E,#)D("4P,F1=($1E=FEC92!R97%U97-T*"5X*2!T:6UE;W5T+@``071T
-M1&5V4T%3061D<ELE>%T@(%M5;FET260@)7A=('-A<R!A9&1R("4P,G@M)3`R
-M>"TE,#)X+24P,G@M)3`R>"TE,#)X+24P,G@M)3`R>`!S86UE('-A<R!A9&1R
-M("4P,G@M)3`R>"TE,#)X+24P,G@M)3`R>"TE,#)X+24P,G@M)3`R>````$1E
-M=FEC92`E>"!I;B!S=&%N9&)Y(&UO9&4L('-T87)T('1O('!O=V5R(&ET('5P
-M+@``````````4W1A<G0@=&\@<&]W97(@=7`@9&5V:6-E("5X+BXN``!0;W)T
-M(')E<V5T*'!H87-E("5X('!M<"`E>"D@;F]T(&-O;7!L971E('-U8V-E<W,L
-M(&EG;F]R92!T:&4@<&]R="`H)7@@9&5V:6-E("5X*0``````````1&5V:6-E
-M("A0871H("4P,G@@?"!487)G970@)3`R>"!\($4E>"]3)3`R>"D@<W!I;B!U
-M<"!M;V1E(&YO="!S=7!P;W)T````4V5T(&1E=FEC92`H4&%T:"`E,#)X('P@
-M5&%R9V5T("4P,G@@?"!%)7@O4R4P,G@I('-P:6X@=7`@;6]D92`E>```````
-M````071T86-H960@9&5V:6-E(&EN9&5X("4P,G@@*%!A=&@@)3`R>"!\(%1A
-M<F=E="`E,#)X('P@125X+U,E,#)X*2`@)7@E>"5X)7@E>"5X)7@E>```````
-M`$)A8VMU<"!S=&%M<"`E>"!S=6T@)7@@8F%C:V5D("5D``````````!-87-T
-M97(@<W1A;7`@)7@@<W5M("5X(&)A8VME9"`E9```````````5W)I=&4@87)R
-M87D@;65T82!D871A('1O(&UA<W1E<B`P>"5L;%@M/C!X)6QL6```5W)I=&4@
-M87)R87D@;65T82!D871A('1O(&)A8VMU<"`P>"5L;%@M/C!X)6QL6```6R5D
-M("5D72!D979I8V4@97)A<V4@=6YI="!S=6-C97-S9G5L;'DN`%LE9"`E9%T@
-M9&5V:6-E(&5R87-E('5N:70@9F%I;&5D(&]R(&%B;W)T960N`````'-E="!!
-M1$E&7U-%5%]"040@8F%D7W-E8W1O<B`E9```9&]?9&ES:U]C=&Q?8VUD.B!C
-M=&P@8V]D92`E>"!V9#TE<"P@3$)!(#!X)6QL6"!N4V5C=&]R(#!X)7@`4F5T
-M<GEI;F<@9F%I;&5D+"!D:7-K(&1O=VX_/S\`=V]R:W)O=6YD(&ER<5-T871U
-M<R`](#!X)7@`4F5Q("5P("5X("5X`$1E=FEC92`E>"\E>"!R96UO=F5D+@!/
+M72X`````4&AY("5X('-I9VYA='5R92!F<F]M(%-)1TY!5%5212!&25,@8G5S
+M>0``````````4&AY("5D('-I9VYA='5R92!F<F]M('5N87-S;V-I871E9"!&
+M25,@8G5S>0``````6R4P,G@Z)3`R>"`E,#)D72!D:7-K(')E;6]V960N``!;
+M)3`R9#HE,#)D(%`E9%T@07-Y;B!.;W1I9FEC871I;VX@4F5C96EV960`````
+M``!%<G)O<B!I;B!I<W-U:6YG(&-O;6UA;F0L(&5R<B!I;F9O(#!X)6QL6```
+M``````!;)3`R>#HE,#)X("4P,F1=(%)E<75E<W0@9F%I;&5D+B!%<G)O<B!I
+M;F9O<FUA=&EO;B`P>"5L;%@`````````6R4P,G@Z)3`R>"!-)61=(%!-(%)E
+M<75E<W0@9F%I;&5D+B!%<G)O<B!I;F9O<FUA=&EO;B`P>"5L;%@``````%L@
+M("`@("`@(%T@2#)$($9)4SH@)3`X>"`E,#AX("4P.'@@)3`X>`!;("`@("`@
+M("!=($0R2"!&25,Z("4P.'@@)3`X>"`E,#AX("4P.'@@*%-T871U<R`E>"!%
+M<G)O<B`E>"D`````4F5C96EV960@3E5,(%)E<2!S;&]T3F\H)7@O)7@I($5.
+M5%)9("@E,#AX*2P@97)R;W(@,'@E;&Q8`````````&`M($9)4RA3;&]T.B4P
+M,G@I.B`E,#AX("4P.'@@)3`X>"`E,#AX``!;)3`R>#HE,#)X("4P,F1=($1E
+M=FEC92!R97%U97-T*"5X*2!T:6UE;W5T+@````!;("`@("`@("!=($@R1"!&
+M25,H4VQO=#HE,#)X*3H@)3`X>"`E,#AX("4P.'@@)3`X>````````%)E<2`H
+M)7@I('=A:70@9F]R(&-O;7!L971E9"!D;VYE+@````````!;)3`R>#HE,#)X
+M($TE9%T@4$T@<F5Q=65S="@E>"D@=&EM96]U="X`4F5G:7-T97(@4V5T("4P
+M.'@@)3`X>"!)4E$@4U1!5"`E>````````%LE,#)X.B4P,G@@)3`R9%T@9&ES
+M:R!R96UO=F5D("@E>"DN``````!);G9A;&ED('-I9VYA='5R92`P>"5X+"!T
+M<F5A="!A<R!!5$$@<W1A='5S("5X``!;)3`R>#HE,#)X("4P,F1=($1I<VL@
+M:6X@<W1A;F1B>2!M;V1E+"!S=&%R="!T;R!P;W=E<B!I="!U<"X`````6R4P
+M,G@Z)3`R>"`E,#)D72!$:7-K('!O=V5R960@=7`N`````````%LE,#)X.B4P
+M,G@@)3`R9%T@1&5V:6-E('-T871E("5X(&9A:6QE9"`H)7@I(')E=')I960@
+M)7@`6R4P,G@Z)3`R>"`E,#)D72!);G9A;&ED(&ED96YT:69Y(&1A=&$L(')E
+M=')I97,H)60I+@````!;)3`R>#HE,#)X("4P,F1=(%-T87)T(%-O9G0@4F5S
+M970@9F]R("5X+R5X``````!;)3`R>#HE,#)X(%`E9%T@4VEG;F%T=7)E('1I
+M;65O=70@9F]R("5X+R5X``````!;)3`R9#HE,#)D($TE9%T@4$T@4F5Q=65S
+M="!O9B!S=&%T92`E>"!F;W(@)7@O)7@@9F%I;&5D`%!O<G0@<F5S970@*'!H
+M87-E("5X('!M<"`E>"D@;F]T(&-O;7!L971E('-U8V-E<W,L(&EG;F]R92!T
+M:&4@<&]R="`H)7@@9&5V:6-E("5X*0````````!;)3`R>#HE,#)X("4P,F1=
+M(%)E<V5T(%!H87-E("5X(&9A:6QE9"!F;W(@)7@O)7@``````````')E860@
+M97)R;W(@8F5F;W(@=W)I=&4@9&%T82!B86-K``````````!;)3`R>#HE,#)X
+M("4P,F1=('-P:6X@=7`@;6]D92!N;W0@<W5P<&]R="X```````!;)3`R>#HE
+M,#)X("4P,F1=('-E="!D:7-K('-P:6X@=7`@;6]D92`E>"X```````!;)3`R
+M>#HE,#)X("4P,F1=(&1I<VL@<')O8F5D("AS<&EN=7`@;6]D93H@)60I+@!-
+M5E]297%U97-T("5P.B!#9&);)3)X+"4R>"PE,G@L)3)X+"`E,G@L)3)X+"4R
+M>"PE,G@L("4R>"PE,G@L)3)X+"4R>"P@)3)X+"4R>"PE,G@L)3)X72X`17)R
+M;W(@:6X@:7-S=6EN9R!C;VUM86YD+"!E<G(@:6YF;R`P>"5L;%@`````````
+M5&%S:R!F:6QE(&5R<F]R+"!3=&%T=7-296<],'@E>"P@17)R4F5G/3!X)7@L
+M($Q"05LP+3-=/3!X)7@L3$)!6S0M-UT],'@E>"X```````!296-E:79E9"!.
+M54P@4F5Q('-L;W1.;R@E>"\E>"D@14Y44ED@*"4P.'@I+"!E<G)O<B`P>"5L
+M;%@`````````8"T@1DE3*%-L;W0Z)3`R>"DZ("4P.'@@)3`X>"`E,#AX("4P
+M.'@``$--1"!(96%D97(Z("4P.'@@)3`X>"`E,#AX("4P.'@@+B`E,#AX("4P
+M.'@@)3`X>"`E,#AX("X@)3`X>"`E,#AX("4P.'@@)3`X>"`N("4P.'@@)3`X
+M>`!;)3`R>#HE,#)X("4P,F0@)3`R9%T@4$T@<F5Q=65S="@E>"D@=&EM96]U
+M="X```!4:6UE;W5T($@R1"!&25,H4VQO=#HE,#)X*3H@)3`X>"`E,#AX("4P
+M.'@@)3`X>`!;)3`R>#HE,#)X("4P,F0@)3`R9"`E,#)D72!89F5R("5X($5R
+M<F]R(&EN9F]R;6%T:6]N(#!X)6QL6```````6R4P,G@Z)3`R>"`E,#)X("4P
+M,GA=(%!-(%AF97(@)7@@17)R;W(@:6YF;W)M871I;VX@,'@E;&Q8````````
+M`%)U;FYI;F<@2#)$($9)4RA3;&]T.B4P,G@I.B`E,#AX("4P.'@@)3`X>"`E
+M,#AX`"!31R!I=&5M("4P,G@Z(&%D9'(@)6QL>"!S:7IE("5X(%-'2"!A9&1R
+M("5L;'@@<VEZ92`E>```1F%I;&5D('1O(&5N86)L92]D:7-A8FQE('-P:6X@
+M=7`N`````````%LE,#)X.B4P,G@@)3`R9"`E,#)D("4P,F1=($1E=FEC92!R
+M97%U97-T*"5X*2!T:6UE;W5T+@``4F5Q("@E>"D@=V%I="!F;W(@8V]M<&QE
+M=&5D(&1O;F4N`````````$%T=$1E=E-!4T%D9');)7A=("!;56YI=$ED("5X
+M72!S87,@861D<B`E,#)X+24P,G@M)3`R>"TE,#)X+24P,G@M)3`R>"TE,#)X
+M+24P,G@`<V%M92!S87,@861D<B`E,#)X+24P,G@M)3`R>"TE,#)X+24P,G@M
+M)3`R>"TE,#)X+24P,G@```!$979I8V4@)7@@:6X@<W1A;F1B>2!M;V1E+"!S
+M=&%R="!T;R!P;W=E<B!I="!U<"X``````````%-T87)T('1O('!O=V5R('5P
+M(&1E=FEC92`E>"XN+@``4&]R="!R97-E="AP:&%S92`E>"!P;7`@)7@I(&YO
+M="!C;VUP;&5T92!S=6-C97-S+"!I9VYO<F4@=&AE('!O<G0@*"5X(&1E=FEC
+M92`E>"D``````````$1E=FEC92`H4&%T:"`E,#)X('P@5&%R9V5T("4P,G@@
+M?"!%)7@O4R4P,G@I('-P:6X@=7`@;6]D92!N;W0@<W5P<&]R=````%-E="!D
+M979I8V4@*%!A=&@@)3`R>"!\(%1A<F=E="`E,#)X('P@125X+U,E,#)X*2!S
+M<&EN('5P(&UO9&4@)7@``````````$%T=&%C:&5D(&1E=FEC92!I;F1E>"`E
+M,#)X("A0871H("4P,G@@?"!487)G970@)3`R>"!\($4E>"]3)3`R>"D@("5X
+M)7@E>"5X)7@E>"5X)7@```````!"86-K=7`@<W1A;7`@)7@@<W5M("5X(&)A
+M8VME9"`E9```````````36%S=&5R('-T86UP("5X('-U;2`E>"!B86-K960@
+M)60``````````%=R:71E(&%R<F%Y(&UE=&$@9&%T82!T;R!M87-T97(@,'@E
+M;&Q8+3XP>"5L;%@``%=R:71E(&%R<F%Y(&UE=&$@9&%T82!T;R!B86-K=7`@
+M,'@E;&Q8+3XP>"5L;%@``%LE9"`E9%T@9&5V:6-E(&5R87-E('5N:70@<W5C
+M8V5S<V9U;&QY+@!;)60@)61=(&1E=FEC92!E<F%S92!U;FET(&9A:6QE9"!O
+M<B!A8F]R=&5D+@````!D;U]D:7-K7V-T;%]C;60Z(&-T;"!C;V1E("5X('9D
+M/25P+"!,0D$@,'@E;&Q8(&Y396-T;W(@,'@E>`!;)3`R9#HE,#)D(%`E9%T@
+M1U-#4B!C:&%N9V5D`%%U975E(&9U;&P@)7@@)7@`4F5Q("5P("5X("5X`"5S
+M(')E<2`E<"!S;&]T:60@,'@E>`!;)3`R>#HE,#)X("4P,F1=(&1I<VL@9F%I
+M;&5D+@!$979I8V4@)7@O)7@@<F5M;W9E9"X`1F%I;&5D('1O('9E<FEF>2!C
+M;VYT<F]L;&5R`&]D:6X@<F5A9"!W<FET92!E>&-E961S("5X`&]D:6X`1&5V
+M:6-E("5X+R5X(')E;6]V960N`%)E=')Y:6YG(&9A:6QE9"P@9&ES:R!D;W=N
+M/S\_`'=O<FMR;W5N9"!I<G%3=&%T=7,@/2`P>"5X`%)E<2`E<"`E>"`E>`!/
M=F5R<F%L;"!31R!I=&5M("5X('-I>F4@)7@`4VQO="!B=7-Y+"!S;&]T("5X
M*"5X*0!$=6UP('-L;W0@:6YF;SH@)7@@)7@@)7@@)7@`0VQE86X@=7`@<VQO
M="`E>`!$,D@@1DE3.B`E,#AX("4P.'@@)3`X>"`E,#AX`"4P,G@@)3`T>#HE
-M,#1X.B4P-'@`4F5Q("@E>"D@=V%I="!F;W(@8V]M<&QE=&5D+@!$979I8V4@
-M)7@O)7@@<F5M;W9E9"X`1&5V:6-E("5X+R5X(')E;6]V960N`$1E=FEC92`E
-M>"!P;W=E<F5D('5P+@!S=&%R="!315,@9&5V:6-E("5P`$9O=6YD(%-%4R!$
-M979I8V4@)7@`1F%I;&5D('1O('9E<FEF>2!C;VYT<F]L;&5R`&]D:6X@<F5A
-M9"!W<FET92!E>&-E961S("5X`&]D:6X`1&5V:6-E("5X+R5X(')E;6]V960N
-M`%)E=')Y:6YG(&9A:6QE9"P@9&ES:R!D;W=N/S\_`'=O<FMR;W5N9"!I<G%3
-M=&%T=7,@/2`P>"5X`%)E<2`E<"`E>"`E>`!/=F5R<F%L;"!31R!I=&5M("5X
-M('-I>F4@)7@`4VQO="!B=7-Y+"!S;&]T("5X*"5X*0!$=6UP('-L;W0@:6YF
-M;SH@)7@@)7@@)7@@)7@`0VQE86X@=7`@<VQO="`E>`!$,D@@1DE3.B`E,#AX
-M("4P.'@@)3`X>"`E,#AX`"4P,G@@)3`T>#HE,#1X.B4P-'@`4F5Q("@E>"D@
-M=V%I="!F;W(@8V]M<&QE=&5D+@!$979I8V4@)7@O)7@@<F5M;W9E9"X`1&5V
-M:6-E("5X+R5X(')E;6]V960N`$1E=FEC92`E>"!P;W=E<F5D('5P+@!S=&%R
-M="!315,@9&5V:6-E("5P`$9O=6YD(%-%4R!$979I8V4@)7@`1F%I;&5D('1O
-M('9E<FEF>2!C;VYT<F]L;&5R`&]D:6X@<F5A9"!W<FET92!E>&-E961S("5X
-M`&]D:6X`<F%W("5P(&)A9%]S96-T;W(@)7@`5W)I=&4@8F%C:W5P960@;65T
-M82!D871A`$9A:6QE9"!T;R!S<&EN9&]W;B!D979I8V5S`$9A:6QE9"!T;R!F
-M;'5S:"!T87)G971S`$%U=&\@4F5B=6EL9`!296)U:6QD(%!R:6]R:71Y`$-O
-M;G1I;G5E(%)E8G5I;&1I;F<@;VX@17)R;W(`4W!I;F1O=VX@261L92!$:7-K
-M("AM:6YU=&5S*0!3=&%G9V5R960@<W!I;G5P```````````````&!`4!`P)2
-M8A4`````````!@0%`0,"V&"?-CD\``````8$!0$#`B!@D%!2```````&!`4!
-M`P+88)````````````$"`Q`$!08'$0@)"@L2#`T.#Q,4%187)!@9&ALE'!T>
-M'R8@(2(C)P``````````````````````````````````````````````````
-M```A````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M`````````````````````````````````````````````````Q%0!P``````
-M`@`````````````!```````````````&!`4!`P)28A4`````````!@0%`0,"
-MV&"?-CD\``````8$!0$#`B!@D%!2```````&!`4!`P+88)``````````````
-M`````````````````"$`````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M```#$8!R```````"``````````````$```````````````$!_P(`````````
-M```````````````````````````````````````!`````````"``````````
-M4````"@`````````````````````````````````````````````````````
-M````````````````````````````````````````````````````````````
-M````````````````````_P``````````````````````````````````````
-M``$``````````?\````````````````````````````````````````!````
-M``````+_`````````````````````````````````````````0`````````#
-M_P````````````````````````````````````````$`````````-?\`````
-M```````````````````````````````````!``````````3_````````````
-M`````````````````````````````0`````````%_P``````````````````
-M``````````````````````$`````````!O\`````````````````````````
-M``````````````````````````?_````````````````````````````````
-M```````````````````*_P``````````````````````````````````````
-M``$`````````"_\`````````````````````````````````````````````
-M``````S_```````````````````````````````````````````````````-
-M_P``````````````````````````````````````````````````#O\`````
-M``````````````````````````````````````````````__````````````
-M```````````````````````````````````````0_P``````````````````
-M````````````````````````````````$?\`````````````````````````
-M`````````````````````````!+_````````````````````````````````
-M```````````````````3_P``````````````````````````````````````
-M``$`````````-/\````````````````````````````````````````!````
-M`````!C_``````````````````````````````````````````````````!"
-M_P``````````````````````````````````````````````````&?\`````
-M`````````````````````````````````````````````!K_````````````
-M```````````````````````````````````````=_P``````````````````
-M````````````````````````````````'O\`````````````````````````
-M```````````````!`````````!__````````````````````````````````
-M```````````````````@_P``````````````````````````````````````
-M````````````(?\````````````````````````````````````````!````
-M`````"+_```````````````````````````````````````````````````C
-M_P``````````````````````````````````````````````````)/\`````
-M`````````````````````````````````````````````"7_````````````
-M```````````````````````````````````````I_P``````````````````
-M````````````````````````````````*O\`````````````````````````
-M`````````````````````````"O_````````````````````````````````
-M```````````````````L_P``````````````````````````````````````
-M``$`````````+?\`````````````````````````````````````````````
-M`````"[_`````````````````````````````````````````0`````````O
-M_P````````````````````````````````````````$`````````2?\`````
-M```````````````````````````````````!`````````#?_````````````
-M`````````````````````````````0`````````X_P``````````````````
-M````````````````````````````````.?\`````````````````````````
-M`````````````````````````#K_````````````````````````````````
-M`````````0`````````[_P``````````````````````````````````````
-M``$`````````//\````````````````````````````````````````!````
-M`````#W_`````````````````````````````````````````0`````````^
-M_P````````````````````````````````````````$`````````0_\`````
-M```````````````````````````````````!`````````$3_````````````
-M`````````````````````````````0````````!&_P``````````````````
-M``````````````````````$`````````1_\`````````````````````````
-M```````````````!`````````#+_````````````````````````````````
-M`````````0`````````S_P``````````````````````````````````````
-M````````````9/\````````````````````````````````````````!````
-M`````##_`````````````````````````````````````````0````````!F
-M_P````````````````````````````````````````$`````````9_\`````
-M```````````````````````````````````!`````````$7_````````````
-M``````````````````````````````````````!(_P``````````````````
-M````````````````````````````````_____P``````````````````````
-M`````````````````````````!0``````````0`!>!`,!PB0`0```````!0`
-M```<```````````````L`````````!0````T```````````````"````````
-M`#P```!,``````````````!N`@```````$(.$$(.&$(.($(.*$$.,$$..$0.
-M4(,'A@:,!8T$C@./`@`````````4``````````$``7@0#`<(D`$````````4
-M````'```````````````-@`````````4````-```````````````-@``````
-M```4````3```````````````1@`````````4````9```````````````1@``
-M```````4````?```````````````#``````````4``````````$``7@0#`<(
-MD`$````````4````'```````````````(@`````````4````-```````````
-M````1P`````````4````3```````````````$``````````4````9```````
-M````````7``````````4````?```````````````#0`````````4````E```
-M````````````)P`````````4````K```````````````,``````````4````
-MQ```````````````,0`````````4````W```````````````,P`````````4
-M````]```````````````W`$````````4````#`$`````````````/@``````
-M```<````)`$`````````````C@````````!$#G```````!P```!$`0``````
-M```````Y`````````$0.$```````%````&0!`````````````"@`````````
-M%````'P!`````````````"$`````````%````)0!`````````````"``````
-M````%``````````!``%X$`P'")`!````````%````!P``````````````&,`
+M,#1X.B4P-'@`1&5V:6-E("5X+R5X(')E;6]V960N`$1E=FEC92`E>"\E>"!R
+M96UO=F5D+@!$979I8V4@)7@@<&]W97)E9"!U<"X`<W1A<G0@4T53(&1E=FEC
+M92`E<`!&;W5N9"!315,@1&5V:6-E("5X`$9A:6QE9"!T;R!V97)I9GD@8V]N
+M=')O;&QE<@!O9&EN(')E860@=W)I=&4@97AC965D<R`E>`!O9&EN`&-A;&P@
+M;&1M7V]N7W1I;65R(&%F=&5R(#%M<P!R87<@)7`@8F%D7W-E8W1O<B`E>`!7
+M<FET92!B86-K=7!E9"!M971A(&1A=&$`1F%I;&5D('1O('-P:6YD;W=N(&1E
+M=FEC97,`1F%I;&5D('1O(&9L=7-H('1A<F=E=',`075T;R!296)U:6QD`%)E
+M8G5I;&0@4')I;W)I='D`0V]N=&EN=64@4F5B=6EL9&EN9R!O;B!%<G)O<@!3
+M<&EN9&]W;B!)9&QE($1I<VL@*&UI;G5T97,I`%-T86=G97)E9"!S<&EN=7``
+M````````````````````````!@0%`0,"4F(5``````````8$!0$#`MA@GS8Y
+M/``````&!`4!`P(@8)!04@``````!@0%`0,"V&"0```````````!`@,0!`4&
+M!Q$("0H+$@P-#@\3%!46%R08&1H;)1P='A\F("$B(R<`````````````````
+M````````````````````````````````````(0``````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````,14`<```````(``````````````0``````````
+M````!@0%`0,"4F(5``````````8$!0$#`MA@GS8Y/``````&!`4!`P(@8)!0
+M4@``````!@0%`0,"V&"0```````````````````````````````A````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````Q&`<@```````@``````````
+M```!```````````````!`?\"````````````````````````````````````
+M`````````````0`````````@`````````%`````H````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````````````````/\`````
+M```````````````````````````````````!``````````'_````````````
+M`````````````````````````````0`````````"_P``````````````````
+M``````````````````````$``````````_\`````````````````````````
+M```````````````!`````````#7_````````````````````````````````
+M`````````0`````````$_P``````````````````````````````````````
+M``$`````````!?\````````````````````````````````````````!````
+M``````;_```````````````````````````````````````````````````'
+M_P``````````````````````````````````````````````````"O\`````
+M```````````````````````````````````!``````````O_````````````
+M```````````````````````````````````````,_P``````````````````
+M````````````````````````````````#?\`````````````````````````
+M``````````````````````````[_````````````````````````````````
+M```````````````````/_P``````````````````````````````````````
+M````````````$/\`````````````````````````````````````````````
+M`````!'_```````````````````````````````````````````````````2
+M_P``````````````````````````````````````````````````$_\`````
+M```````````````````````````````````!`````````#3_````````````
+M`````````````````````````````0`````````8_P``````````````````
+M````````````````````````````````0O\`````````````````````````
+M`````````````````````````!G_````````````````````````````````
+M```````````````````:_P``````````````````````````````````````
+M````````````'?\`````````````````````````````````````````````
+M`````![_`````````````````````````````````````````0`````````?
+M_P``````````````````````````````````````````````````(/\`````
+M`````````````````````````````````````````````"'_````````````
+M`````````````````````````````0`````````B_P``````````````````
+M````````````````````````````````(_\`````````````````````````
+M`````````````````````````"3_````````````````````````````````
+M```````````````````E_P``````````````````````````````````````
+M````````````*?\`````````````````````````````````````````````
+M`````"K_```````````````````````````````````````````````````K
+M_P``````````````````````````````````````````````````+/\`````
+M```````````````````````````````````!`````````"W_````````````
+M```````````````````````````````````````N_P``````````````````
+M``````````````````````$`````````+_\`````````````````````````
+M```````````````!`````````$G_````````````````````````````````
+M`````````0`````````W_P``````````````````````````````````````
+M``$`````````./\`````````````````````````````````````````````
+M`````#G_```````````````````````````````````````````````````Z
+M_P````````````````````````````````````````$`````````._\`````
+M```````````````````````````````````!`````````#S_````````````
+M`````````````````````````````0`````````]_P``````````````````
+M``````````````````````$`````````/O\`````````````````````````
+M```````````````!`````````$/_````````````````````````````````
+M`````````0````````!$_P``````````````````````````````````````
+M``$`````````1O\````````````````````````````````````````!````
+M`````$?_`````````````````````````````````````````0`````````R
+M_P````````````````````````````````````````$`````````,_\`````
+M`````````````````````````````````````````````&3_````````````
+M`````````````````````````````0`````````P_P``````````````````
+M``````````````````````$`````````9O\`````````````````````````
+M```````````````!`````````&?_````````````````````````````````
+M`````````0````````!%_P``````````````````````````````````````
+M````````````2/\`````````````````````````````````````````````
+M`````/____\````````````````````````````````````````````````4
+M``````````$``7@0#`<(D`$````````4````'```````````````-@``````
+M```4````-```````````````-@`````````4````3```````````````1@``
+M```````4````9```````````````1@`````````4````?```````````````
+M#``````````4``````````$``7@0#`<(D`$````````4````'```````````
+M````(@`````````4````-```````````````1P`````````4````3```````
+M````````$``````````4````9```````````````7``````````4````?```
+M````````````#0`````````4````E```````````````)P`````````4````
+MK```````````````,``````````4````Q```````````````,0`````````4
+M````W```````````````)P`````````4````]```````````````W`$`````
+M```<````#`$`````````````AP````````!$#F```````!P````L`0``````
+M```````Y`````````$0.$```````%````$P!`````````````"@`````````
+M%````&0!`````````````"$`````````%````'P!`````````````"``````
+M````%``````````!``%X$`P'")`!````````%````!P``````````````$<`
M````````%````#0``````````````%(`````````%````$P`````````````
M`%(`````````%````&0``````````````'D`````````)````'P`````````
M`````%`!````````1`XP5(T"C`.&!(,%`````!P```"D```````````````_
M`````````$0.($J,`H,#/````,0``````````````&T"````````0@X00@X8
M0@X@0@XH00XP00XX1`Z0`8,'A@:,!8T$C@./`@```````"0````$`0``````
M``````!*`0```````$$.$$$.&$0.((,#A@(````4``````````$``7@0#`<(
-MD`$````````4````'```````````````30`````````4````-```````````
-M````@@`````````4````3```````````````=0`````````4````9```````
-M````````<0`````````4````?```````````````&0`````````<````E```
-M````````````10````````!$#A```````!P```"T```````````````A````
-M`````$0.$```````'````-0``````````````%\`````````1`X0```````\
-M````]```````````````&`(```````!"#A!"#AA"#B!"#BA!#C!!#CA$#D"#
-M!X8&C`6-!(X#CP(`````````'````#0!`````````````.T`````````1`X0
-M```````D````5`$`````````````$P$```````!$#C!4C0*,`X8$@P4`````
-M)````'P!`````````````!@!````````0@X000X800X@@P2&`XP"`"0```"D
-M`0`````````````#!@```````$0.0%Z/`HX#C02,!88&@P<<````S`$`````
-M````````$0````````!$#A```````#P```#L`0````````````!5"P``````
-M`$(.$$(.&$(.($(.*$$.,$$..$0.D`&#!X8&C`6-!(X#CP(````````L````
-M+`(`````````````$`(```````!"#A!"#AA!#B!!#BA$#C"#!88$C`.-`@`D
-M````7`(`````````````70,```````!$#E!>CP*.`XT$C`6&!H,'/````(0"
-M`````````````.\#````````0@X00@X80@X@0@XH00XP00XX1`Y@@P>&!HP%
-MC02.`X\"`````````"0```#$`@````````````##"0```````$0.8%Z/`HX#
-MC02,!88&@P<\````[`(`````````````BPD```````!"#A!"#AA"#B!"#BA!
-M#C!!#CA'#N`!@P>&!HP%C02.`X\"````````)````"P#`````````````.H`
-M````````1`XP5(T"C`.&!(,%`````#P```!4`P````````````#`"0``````
-M`$(.$$(.&$(.($(.*$$.,$$..$0.8(,'A@:,!8T$C@./`@`````````\````
-ME`,`````````````T@D```````!"#A!"#AA"#B!"#BA!#C!!#CA$#J`!@P>&
-M!HP%C02.`X\"````````)````-0#`````````````+L`````````0@X000X8
-M00X@@P2&`XP"`#0```#\`P````````````"^`````````$(.$$(.&$(.($$.
-M*$$.,(,&A@6,!(T#C@(`````````-````#0$`````````````%\#````````
-M0@X00@X80@X@00XH00XP@P:&!8P$C0..`@`````````<````;`0`````````
-M````R`````````!$#A```````#P```",!`````````````"?`P```````$(.
-M$$(.&$(.($(.*$$.,$$..$0.0(,'A@:,!8T$C@./`@`````````D````S`0`
-M````````````R0,```````!$#C!4C0*,`X8$@P4`````/````/0$````````
-M`````/@#````````0@X00@X80@X@0@XH00XP00XX1`Z@`8,'A@:,!8T$C@./
-M`@```````#P````T!0````````````!Q!@```````$(.$$(.&$(.($(.*$$.
-M,$$..$0.8(,'A@:,!8T$C@./`@`````````<````=`4`````````````@0``
-M``````!$#A```````!P```"4!0`````````````.`````````$0.$```````
-M'````+0%``````````````L$````````00X01`YP@P(D````U`4`````````
-M````!@$```````!$#D!>CP*.`XT$C`6&!H,'/````/P%`````````````$,!
+MD`$````````4````'```````````````\0`````````4````-```````````
+M````30`````````4````3```````````````@@`````````4````9```````
+M````````=0`````````4````?```````````````<0`````````4````E```
+M````````````2P`````````4````K````````````````@`````````D````
+MQ```````````````%0,```````!$#C!4C0*,`X8$@P4`````/````.P`````
+M`````````/$!````````0@X00@X80@X@0@XH00XP00XX1`Y`@P>&!HP%C02.
+M`X\"`````````#P````L`0````````````"!"````````$(.$$(.&$(.($(.
+M*$$.,$$..$0.8(,'A@:,!8T$C@./`@`````````D````;`$`````````````
+M;0````````!"#A!!#AA!#B"#!(8#C`(`/````)0!`````````````-0!````
+M````0@X00@X80@X@0@XH00XP00XX1`Y`@P>&!HP%C02.`X\"`````````"0`
+M``#4`0````````````!N`0```````$0.,%2-`HP#A@2#!0`````\````_`$`
+M````````````3`0```````!"#A!"#AA"#B!"#BA!#C!!#CA$#I`!@P>&!HP%
+MC02.`X\"````````)````#P"`````````````%8!````````0@X000X800X@
+M@P2&`XP"`"0```!D`@````````````"K`@```````$0.0%Z/`HX#C02,!88&
+M@P<\````C`(`````````````&@$```````!"#A!"#AA"#B!"#BA!#C!!#CA$
+M#D"#!X8&C`6-!(X#CP(`````````)````,P"`````````````',%````````
+M1`YP7H\"C@.-!(P%A@:#!SP```#T`@````````````"]!````````$(.$$(.
+M&$(.($(.*$$.,$$..$0.4(,'A@:,!8T$C@./`@`````````D````-`,`````
+M````````[`````````!!#A!!#AA$#B"#`X8"````/````%P#````````````
+M`!@%````````0@X00@X80@X@0@XH00XP00XX1`YP@P>&!HP%C02.`X\"````
+M`````"0```"<`P````````````"X`````````$(.$$$.&$$.((,$A@.,`@`T
+M````Q`,`````````````P@````````!"#A!"#AA"#B!!#BA!#C"#!H8%C`2-
+M`XX"`````````#0```#\`P````````````!)`@```````$(.$$(.&$(.($$.
+M*$$.,(,&A@6,!(T#C@(`````````'````#0$`````````````,X`````````
+M1`X0```````<````5`0`````````````/@,```````!!#A!$#G"#`AP```!T
+M!``````````````M`````````$0.$```````/````)0$`````````````$(!
M````````0@X00@X80@X@0@XH00XP00XX1`Y0@P>&!HP%C02.`X\"````````
-M`#P````\!@````````````","P```````$(.$$(.&$(.($(.*$$.,$$..$0.
-ML`&#!X8&C`6-!(X#CP(````````L````?`8`````````````=P(```````!"
-M#A!"#AA!#B!!#BA$#C"#!88$C`.-`@`\````K`8`````````````$04`````
-M``!"#A!"#AA"#B!"#BA!#C!!#CA$#K`!@P>&!HP%C02.`X\"````````%```
-M```````!``%X$`P'")`!````````%````!P``````````````&\`````````
-M%````#0``````````````$(`````````%````$P``````````````%P`````
-M````%````&0``````````````%\`````````%````'P``````````````-X`
-M````````-````)0``````````````#,!````````0@X00@X80@X@00XH00XP
-M1`Y`@P:&!8P$C0..`@`````<````S```````````````1`````````!!#A"#
-M`@```#P```#L``````````````"+`````````$(.$$(.&$(.($(.*$$.,$$.
-M.$0.0(,'A@:,!8T$C@./`@`````````D````+`$`````````````9P$`````
-M``!$#E!>CP*.`XT$C`6&!H,')````%0!`````````````%P!````````1`Y0
-M7H\"C@.-!(P%A@:#!R0```!\`0````````````!%`0```````$0.0%Z/`HX#
-MC02,!88&@P<<````I`$`````````````<@````````!$#C!*A@*#`R0```#$
-M`0`````````````/`0```````$0.0%Z/`HX#C02,!88&@P<\````[`$`````
-M````````GP$```````!"#A!"#AA"#B!"#BA!#C!!#CA$#E"#!X8&C`6-!(X#
-MCP(`````````/````"P"`````````````$\!````````0@X00@X80@X@0@XH
-M00XP00XX1`Y`@P>&!HP%C02.`X\"`````````"0```!L`@`````````````)
-M`0```````$0.,%B.`HT#C`2&!8,&```D````E`(`````````````@P$`````
-M``!$#B!.C`*&`X,$````````)````+P"`````````````/\`````````1`XP
-M5(T"C`.&!(,%`````#P```#D`@````````````"@`````````$(.$$(.&$(.
-M($(.*$$.,$$..$0.0(,'A@:,!8T$C@./`@`````````\````)`,`````````
-M````+`$```````!"#A!"#AA"#B!"#BA!#C!!#CA$#E"#!X8&C`6-!(X#CP(`
-M````````/````&0#`````````````&\$````````0@X00@X80@X@0@XH00XP
-M00XX1`Y@@P>&!HP%C02.`X\"`````````!0``````````0`!>!`,!PB0`0``
-M`````!0````<``````````````!6`````````!0````T``````````````!*
-M`````````!0``````````0`!>!`,!PB0`0```````!0````<````````````
-M```<`0```````"0````T```````````````=`0```````$$.$$$.&(,#A@(`
-M```````4````7```````````````AP`````````4````=```````````````
-M)0`````````4````C````````````````@`````````4````I```````````
-M````2P`````````4````O```````````````*@`````````4````U```````
-M````````-``````````4````[```````````````*@`````````4````!`$`
-M````````````,0`````````4````'`$`````````````*@`````````4````
-M-`$`````````````*@`````````4````3`$`````````````(``````````4
-M````9`$`````````````*@`````````4````?`$`````````````*@``````
-M```4````E`$`````````````80`````````4````K`$`````````````]@``
-M```````4````Q`$`````````````T0`````````4````W`$`````````````
-M20`````````L````]`$`````````````^@````````!"#A!"#AA!#B!!#BB#
-M!88$C`.-`@`````<````)`(`````````````+@````````!$#A```````!P`
-M``!$`@`````````````F`````````$0.$```````'````&0"````````````
-M`$8`````````1`X0```````<````A`(`````````````)@````````!$#A``
-M`````!P```"D`@`````````````J`````````$0.$```````/````,0"````
-M`````````(@!````````0@X00@X80@X@0@XH00XP00XX1`Y`@P>&!HP%C02.
-M`X\"`````````!P````$`P`````````````L`````````$0.$```````%```
-M`"0#`````````````",`````````%````#P#`````````````"<`````````
-M)````%0#`````````````.8`````````0@X000X800X@@P2&`XP"`!P```!\
-M`P`````````````^`````````$0.($J&`H,#'````)P#`````````````#X`
-M````````1`X@2H8"@P,D````O`,`````````````20,```````!!#A!!#AA$
-M#B"#`X8"````)````.0#`````````````%D!````````00X000X81`X@@P.&
-M`@```!P````,!`````````````!4`````````$0.($J&`H,#)````"P$````
-M`````````*\`````````1`X@3HP"A@.#!````````"0```!4!```````````
-M``"&`````````$0.($Z,`H8#@P0````````D````?`0`````````````\```
-M``````!$#D!>CP*.`XT$C`6&!H,')````*0$`````````````*@`````````
-M1`XP5(T"C`.&!(,%`````"0```#,!`````````````!^`0```````$$.$$$.
-M&$0.((,#A@(````D````]`0`````````````;0$```````!$#C!8C@*-`XP$
-MA@6#!@``)````!P%`````````````*D`````````1`X@3HP"A@.#!```````
-M`"0```!$!0`````````````-`0```````$0.,%2-`HP#A@2#!0`````D````
-M;`4`````````````*@$```````!$#D!>CP*.`XT$C`6&!H,')````)0%````
-M`````````!,!````````1`XP6(X"C0.,!(8%@P8``"0```"\!0``````````
-M```$`0```````$0.,%B.`HT#C`2&!8,&```D````Y`4`````````````5@$`
-M``````!$#D!>CP*.`XT$C`6&!H,'/`````P&`````````````*,#````````
-M0@X00@X80@X@0@XH00XP00XX1`Y`@P>&!HP%C02.`X\"`````````"0```!,
-M!@````````````#\`````````$0.0%Z/`HX#C02,!88&@P<D````=`8`````
-M````````Z@````````!$#D!>CP*.`XT$C`6&!H,')````)P&````````````
-M`,D`````````1`XP6(X"C0.,!(8%@P8``"0```#$!@````````````"Z````
-M`````$0.,%2-`HP#A@2#!0`````D````[`8`````````````#`$```````!!
-M#A!!#AA$#B"#`X8"````)````!0'`````````````'T!````````1`X@3HP"
-MA@.#!````````!P````\!P`````````````7`````````$$.$(,"````)```
-M`%P'`````````````"H!````````1`X@3HP"A@.#!````````"0```"$!P``
-M``````````!G`````````$$.$$$.&$0.((,#A@(````<````K`<`````````
-M````.@````````!!#A"#`@```!P```#,!P`````````````@`````````$$.
-M$(,"````'````.P'`````````````"8`````````00X0@P(````D````#`@`
-M````````````\@````````!$#C!4C0*,`X8$@P4`````)````#0(````````
-M`````.H!````````1`XP5(T"C`.&!(,%`````"0```!<"`````````````"&
-M`````````$$.$$$.&$0.((,#A@(````D````A`@`````````````A0$`````
-M``!!#A!!#AA$#B"#`X8"````/````*P(`````````````&<#````````0@X0
-M0@X80@X@0@XH00XP00XX1`Y@@P>&!HP%C02.`X\"`````````"P```#L"```
-M``````````#A`0```````$(.$$(.&$$.($$.*$0.,(,%A@2,`XT"`#P````<
-M"0````````````")`@```````$(.$$(.&$(.($(.*$$.,$$..$0.0(,'A@:,
-M!8T$C@./`@`````````D````7`D`````````````)`$```````!$#C!4C0*,
-M`X8$@P4`````)````(0)`````````````#0!````````00X000X81`X@@P.&
-M`@```"0```"L"0````````````!+`````````$(.$$$.&$0.((,#C`(````<
-M````U`D`````````````)@````````!$#A```````!0``````````0`!>!`,
-M!PB0`0```````!0````<```````````````5`````````!0````T````````
-M```````:`````````!0```!,```````````````C`````````!0```!D````
-M``````````!!`````````!0```!\``````````````!=`````````!0```"4
-M``````````````"0`0```````"P```"L``````````````#+`````````$(.
-M$$(.&$$.($$.*(,%A@2,`XT"`````"P```#<``````````````!N````````
-M`$(.$$(.&$$.($$.*$0.,(,%A@2,`XT"`!P````,`0`````````````I````
-M`````$$.$(,"````'````"P!`````````````(4`````````1`X0```````L
-M````3`$`````````````1P$```````!"#A!"#AA!#B!!#BA$#C"#!88$C`.-
-M`@`<````?`$`````````````'P$```````!$#A```````!P```"<`0``````
-M``````"``````````$0.$```````'````+P!`````````````(``````````
-M1`X0```````\````W`$`````````````%0D```````!"#A!"#AA"#B!"#BA!
-M#C!!#CA$#G"#!X8&C`6-!(X#CP(`````````)````!P"`````````````(,!
-M````````1`X@3HP"A@.#!````````!0```!$`@````````````"=````````
-M`!0```!<`@````````````#X`````````"P```!T`@````````````#``0``
-M`````$(.$$(.&$$.($$.*$0.,(,%A@2,`XT"`!0``````````0`!>!`,!PB0
-M`0```````!0````<``````````````!_`````````!0````T````````````
-M``!B`````````!0```!,``````````````!B`````````!0```!D````````
-M``````!I`````````!0```!\```````````````'`````````!0```"4````
-M```````````S`````````!0```"L``````````````!1`````````!0```#$
-M```````````````?`````````!0```#<```````````````N`````````!P`
-M``#T``````````````"3`````````$0.$```````)````!0!````````````
-M``$!````````1`XP5(T"C`.&!(,%`````#P````\`0````````````#1`0``
-M`````$(.$$(.&$(.($(.*$$.,$$..$0.4(,'A@:,!8T$C@./`@`````````L
-M````?`$`````````````7P````````!"#A!"#AA!#B!!#BA$#C"#!88$C`.-
-M`@`D````K`$`````````````[@````````!$#D!>CP*.`XT$C`6&!H,')```
-M`-0!`````````````,X`````````1`XP6(X"C0.,!(8%@P8``!P```#\`0``
-M```````````;`0```````$$.$(,"````)````!P"`````````````*<`````
-M````1`XP5(T"C`.&!(,%`````"0```!$`@`````````````J`0```````$$.
-M$$$.&$0.((,#A@(````D````;`(`````````````PP````````!$#C!8C@*-
-M`XP$A@6#!@``)````)0"`````````````/$`````````1`XP5(T"C`.&!(,%
-M`````#P```"\`@````````````#A`````````$(.$$(.&$(.($(.*$$.,$$.
-M.$0.<(,'A@:,!8T$C@./`@`````````\````_`(`````````````X0``````
-M``!"#A!"#AA"#B!"#BA!#C!!#CA$#G"#!X8&C`6-!(X#CP(`````````/```
-M`#P#`````````````)\"````````0@X00@X80@X@0@XH00XP00XX1`YP@P>&
-M!HP%C02.`X\"`````````#0```!\`P````````````#=`@```````$(.$$(.
-M&$(.($$.*$$.,(,&A@6,!(T#C@(`````````)````+0#`````````````*<`
-M````````1`XP6(X"C0.,!(8%@P8``#P```#<`P`````````````^`P``````
-M`$(.$$(.&$(.($(.*$$.,$$..$0.<(,'A@:,!8T$C@./`@`````````\````
-M'`0`````````````60<```````!"#A!"#AA"#B!"#BA!#C!!#CA$#J`!@P>&
-M!HP%C02.`X\"````````/````%P$`````````````/4`````````0@X00@X8
-M0@X@0@XH00XP00XX1`Y`@P>&!HP%C02.`X\"`````````#0```"<!```````
-M``````#M`P```````$(.$$(.&$(.($$.*$$.,$0.8(,&A@6,!(T#C@(`````
-M/````-0$`````````````"H(````````0@X00@X80@X@0@XH00XP00XX1`Y@
-M@P>&!HP%C02.`X\"`````````"0````4!0````````````"H`````````$$.
-M$$$.&$0.((,#A@(````D````/`4`````````````:08```````!$#C!8C@*-
-M`XP$A@6#!@``)````&0%`````````````$,"````````1`X@3HP"A@.#!```
-M`````!P```",!0`````````````4`````````$0.$```````)````*P%````
-M`````````*4)````````1`Y`7H\"C@.-!(P%A@:#!R0```#4!0``````````
-M``#X`P```````$0.,%2-`HP#A@2#!0`````D````_`4`````````````)P,`
-M``````!$#C!8C@*-`XP$A@6#!@``/````"0&`````````````+P"````````
-M0@X00@X80@X@0@XH00XP00XX1`Y@@P>&!HP%C02.`X\"`````````#P```!D
-M!@````````````#O`@```````$(.$$(.&$(.($(.*$$.,$$..$<.@`6#!X8&
-MC`6-!(X#CP(````````\````I`8`````````````OP(```````!"#A!"#AA"
-M#B!"#BA!#C!!#CA'#N`$@P>&!HP%C02.`X\"````````/````.0&````````
-M`````.H#````````0@X00@X80@X@0@XH00XP00XX1PZ`!8,'A@:,!8T$C@./
-M`@```````#P````D!P````````````#L`P```````$(.$$(.&$(.($(.*$$.
-M,$$..$<.\`2#!X8&C`6-!(X#CP(````````\````9`<`````````````&`$`
-M``````!"#A!"#AA"#B!"#BA!#C!!#CA$#E"#!X8&C`6-!(X#CP(`````````
-M+````*0'``````````````$"````````0@X00@X800X@00XH1`XP@P6&!(P#
-MC0(`)````-0'`````````````#L"````````1`XP5(T"C`.&!(,%`````#P`
-M``#\!P````````````"O`````````$(.$$(.&$(.($(.*$$.,$$..$0.0(,'
-MA@:,!8T$C@./`@`````````D````/`@`````````````@PP```````!$#D!>
-MCP*.`XT$C`6&!H,')````&0(`````````````",)````````1`Y`7H\"C@.-
+M`#P```#4!`````````````#<`@```````$(.$$(.&$(.($(.*$$.,$$..$0.
+M4(,'A@:,!8T$C@./`@`````````\````%`4`````````````=P@```````!"
+M#A!"#AA"#B!"#BA!#C!!#CA$#J`!@P>&!HP%C02.`X\"````````/````%0%
+M`````````````)\"````````0@X00@X80@X@0@XH00XP00XX1`Y`@P>&!HP%
+MC02.`X\"`````````!0``````````0`!>!`,!PB0`0```````!0````<````
+M```````````5`````````!0``````````0`!>!`,!PB0`0```````!P````<
+M```````````````H`0```````$$.$(,"````%````#P```````````````(`
+M````````%````%0``````````````)<`````````%````&P`````````````
+M`"H`````````%````(0``````````````"X`````````%````)P`````````
+M`````"H`````````%````+0``````````````"H`````````%````,P`````
+M`````````"H`````````'````.0```````````````X!````````00X0@P(`
+M```<````!`$`````````````(P$```````!!#A"#`@```!P````D`0``````
+M```````N`````````$0.$```````'````$0!`````````````$P`````````
+M1`X0```````<````9`$`````````````+`````````!$#A```````!P```"$
+M`0`````````````^`````````$0.($J&`H,#'````*0!`````````````#X`
+M````````1`X@2H8"@P,D````Q`$`````````````AP$```````!!#A!!#AA$
+M#B"#`X8"````'````.P!`````````````%\`````````1`X@2H8"@P,D````
+M#`(`````````````_`````````!!#A!!#AA$#B"#`X8"````)````#0"````
+M`````````!@!````````1`X@3HP"A@.#!````````!P```!<`@``````````
+M```7`````````$$.$(,"````)````'P"`````````````/@`````````1`X@
+M3HP"A@.#!````````"0```"D`@````````````!C`````````$$.$$$.&$0.
+M((,#A@(````<````S`(`````````````(`````````!!#A"#`@```!P```#L
+M`@`````````````@`````````$$.$(,"````)`````P#`````````````,4`
+M````````1`X@3HP"A@.#!````````"0````T`P````````````#*`0``````
+M`$0.,%2-`HP#A@2#!0`````<````7`,`````````````@P````````!$#B!*
+MA@*#`SP```!\`P`````````````;`@```````$(.$$(.&$(.($(.*$$.,$$.
+M.$0.0(,'A@:,!8T$C@./`@`````````D````O`,`````````````8P$`````
+M``!!#A!!#AA$#B"#`X8"````/````.0#`````````````&`"````````0@X0
+M0@X80@X@0@XH00XP00XX1`Y`@P>&!HP%C02.`X\"`````````!P````D!```
+M```````````\`````````$$.$(,"````'````$0$`````````````"8`````
+M````1`X0```````<````9`0`````````````)@````````!$#A```````"0`
+M``"$!`````````````!+`````````$(.$$$.&$0.((,#C`(````4````````
+M``$``7@0#`<(D`$````````4````'```````````````?P`````````4````
+M-```````````````:0`````````4````3```````````````40`````````4
+M````9```````````````+@`````````D````?```````````````GP``````
+M``!$#B!.C0*,`X,$````````)````*0``````````````.D`````````1`XP
+M5(T"C`.&!(,%`````"0```#,``````````````#L`````````$0.0%Z/`HX#
+MC02,!88&@P<D````]```````````````N0````````!$#C!8C@*-`XP$A@6#
+M!@``)````!P!`````````````!<!````````1`XP5(T"C`.&!(,%`````"P`
+M``!$`0````````````!?`````````$(.$$(.&$$.($$.*$0.,(,%A@2,`XT"
+M`!P```!T`0````````````"/`````````$0.$```````-````)0!````````
+M`````$("````````0@X00@X80@X@00XH00XP@P:&!8P$C0..`@`````````\
+M````S`$`````````````X0````````!"#A!"#AA"#B!"#BA!#C!!#CA$#G"#
+M!X8&C`6-!(X#CP(`````````/`````P"`````````````.$`````````0@X0
+M0@X80@X@0@XH00XP00XX1`YP@P>&!HP%C02.`X\"`````````#0```!,`@``
+M``````````!%`@```````$(.$$(.&$(.($$.*$$.,$0.4(,&A@6,!(T#C@(`
+M````/````(0"`````````````.D!````````0@X00@X80@X@0@XH00XP00XX
+M1`Y0@P>&!HP%C02.`X\"`````````#P```#$`@````````````!L`P``````
+M`$(.$$(.&$(.($(.*$$.,$$..$0.@`&#!X8&C`6-!(X#CP(````````\````
+M!`,`````````````WP8```````!"#A!"#AA"#B!"#BA!#C!!#CA$#J`!@P>&
+M!HP%C02.`X\"````````/````$0#`````````````/4`````````0@X00@X8
+M0@X@0@XH00XP00XX1`Y`@P>&!HP%C02.`X\"`````````#P```"$`P``````
+M``````!:!P```````$(.$$(.&$(.($(.*$$.,$$..$0.8(,'A@:,!8T$C@./
+M`@`````````D````Q`,`````````````"@@```````!$#D!>CP*.`XT$C`6&
+M!H,')````.P#`````````````.T#````````1`XP3XP"A@.#!````````"0`
+M```4!``````````````8!0```````$0.($Z,`H8#@P0````````D````/`0`
+M````````````Z0````````!$#B!.C`*&`X,$````````-````&0$````````
+M`````$@#````````0@X00@X80@X@00XH00XP1`Y`@P:&!8P$C0..`@`````<
+M````G`0`````````````%`````````!$#A```````!P```"\!```````````
+M```8`````````$0.$```````'````-P$`````````````!@`````````1`X0
+M```````D````_`0`````````````I0````````!!#A!!#AA$#B"#`X8"````
+M+````"0%`````````````/\!````````0@X00@X800X@00XH1`XP@P6&!(P#
+MC0(`)````%0%`````````````/\!````````1`XP5(T"C`.&!(,%`````#0`
+M``!\!0````````````#M!0```````$(.$$(.&$(.($$.*$$.,$0.0(,&A@6,
+M!(T#C@(`````%``````````!``%X$`P'")`!````````%````!P`````````
+M`````#``````````%````#0``````````````"4`````````)````$P`````
+M`````````'8`````````00X000X8@P.&`@```````!P```!T````````````
+M``!+`````````$0.&$F,`H,#'````)0``````````````!H`````````00X0
+M@P(````4````M```````````````0``````````D````S```````````````
+ME0````````!!#A!!#AB#`X8"````````'````/0``````````````"<`````
+M````00X0@P(````<````%`$`````````````/P````````!$#A```````"0`
+M```T`0````````````"'`````````$0.,%2-`HP#A@2#!0`````D````7`$`
+M````````````3P````````!"#A!!#AA!#B"#!(8#C`(`)````(0!````````
+M`````'X`````````1`XP5(T"C`.&!(,%`````"0```"L`0````````````#)
+M`````````$0.,%2-`HP#A@2#!0`````\````U`$`````````````$`(`````
+M``!"#A!"#AA"#B!"#BA!#C!!#CA$#D"#!X8&C`6-!(X#CP(`````````'```
+M`!0"`````````````%(`````````1`X@2HP"@P,<````-`(`````````````
+M4@````````!$#B!*C`*#`S0```!4`@````````````"J`````````$(.$$(.
+M&$(.($$.*$$.,(,&A@6,!(T#C@(`````````'````(P"`````````````%(`
+M````````1`X@2HP"@P,<````K`(`````````````-P````````!$#A``````
+M`!P```#,`@`````````````_`````````$0.$```````/````.P"````````
+M`````-X"````````0@X00@X80@X@0@XH00XP00XX1`Y0@P>&!HP%C02.`X\"
+M`````````!P````L`P````````````!3`````````$0.$```````'````$P#
+M`````````````$L`````````1`X0```````<````;`,`````````````4@``
+M``````!$#B!*C`*#`Q0``````````0`!>!`,!PB0`0```````!0````<````
+M```````````8`````````!0````T```````````````2`````````!P```!,
+M``````````````!.`@```````$$.$(,"````%````&P``````````````!X`
+M````````%````(0``````````````"``````````)````)P`````````````
+M`.,`````````00X000X8@P.&`@```````!0``````````0`!>!`,!PB0`0``
+M`````!0````<```````````````Q`0```````!0````T```````````````<
+M`````````!0```!,```````````````=`````````!0```!D````````````
+M```K`````````!0```!\```````````````G`````````"0```"4````````
+M``````#N`````````$0.*%.-`HP#A@2#!0`````4````O```````````````
+M0``````````D````U```````````````F@````````!$#BA3C0*,`X8$@P4`
+M````%````/P``````````````%P`````````%````!0!`````````````!<`
+M````````'````"P!`````````````-(#````````1`X0```````<````3`$`
+M````````````50$```````!!#A!$#C"#`AP```!L`0````````````#A````
+M`````$0.$```````%``````````!``%X$`P'")`!````````%````!P`````
+M`````````$0`````````%````#0``````````````!0`````````)````$P`
+M`````````````&4`````````0@X000X800X@@P2&`XP"`"0```!T````````
+M```````)`P```````$$.$$$.&$0.,(,#A@(````D````G```````````````
+MI@````````!$#C!/C`*&`X,$````````)````,0``````````````'<`````
+M````00X000X81`XP@P.&`@```#P```#L``````````````#$`````````$(.
+M$$(.&$(.($(.*$$.,$$..$0.4(,'A@:,!8T$C@./`@`````````<````+`$`
+M````````````?0````````!!#A!$#B"#`AP```!,`0````````````"T````
+M`````$0.,$J&`H,#)````&P!`````````````'D#````````1`Y@7H\"C@.-
M!(P%A@:#!Q0``````````0`!>!`,!PB0`0```````!0````<````````````
-M```P`````````!0````T```````````````E`````````"0```!,````````
-M``````!V`````````$$.$$$.&(,#A@(````````<````=```````````````
-M2P````````!$#AA)C`*#`QP```"4```````````````:`````````$$.$(,"
-M````%````+0``````````````$(`````````)````,P``````````````)4`
-M````````00X000X8@P.&`@```````"0```#T``````````````"%`0``````
-M`$(.$$$.&$$.((,$A@.,`@`<````'`$`````````````-P````````!$#A``
-M`````!P````\`0`````````````Y`````````$$.$(,"````'````%P!````
-M`````````#\`````````1`X0```````D````?`$`````````````AP``````
-M``!$#C!4C0*,`X8$@P4`````)````*0!`````````````$\`````````0@X0
-M00X800X@@P2&`XP"`"0```#,`0````````````!^`````````$0.,%2-`HP#
-MA@2#!0`````D````]`$`````````````R0````````!$#C!4C0*,`X8$@P4`
-M````/````!P"`````````````!`"````````0@X00@X80@X@0@XH00XP00XX
-M1`Y`@P>&!HP%C02.`X\"`````````!P```!<`@````````````!2````````
-M`$0.($J,`H,#'````'P"`````````````%(`````````1`X@2HP"@P,T````
-MG`(`````````````J@````````!"#A!"#AA"#B!!#BA!#C"#!H8%C`2-`XX"
-M`````````!P```#4`@````````````!2`````````$0.($J,`H,#'````/0"
-M`````````````#<`````````1`X0```````<````%`,`````````````/P``
-M``````!$#A```````#P````T`P````````````#U!````````$(.$$(.&$(.
-M($(.*$$.,$$..$0.@`&#!X8&C`6-!(X#CP(````````<````=`,`````````
-M````4P````````!$#A```````!P```"4`P````````````!+`````````$0.
-M$```````'````+0#`````````````%(`````````1`X@2HP"@P,4````````
-M``$``7@0#`<(D`$````````4````'```````````````&``````````4````
-M-```````````````$@`````````<````3```````````````3@(```````!!
-M#A"#`@```!0```!L```````````````>`````````!0```"$````````````
-M```@`````````"0```"<``````````````#C`````````$$.$$$.&(,#A@(`
-M```````\````Q```````````````+P$```````!"#A!"#AA"#B!"#BA!#C!!
-M#CA$#D"#!X8&C`6-!(X#CP(`````````)`````0!`````````````.,`````
-M````1`Y`7H\"C@.-!(P%A@:#!S0````L`0`````````````B`0```````$(.
-M$$(.&$(.($$.*$$.,(,&A@6,!(T#C@(`````````)````&0!````````````
-M`*L`````````1`XP5(T"C`.&!(,%`````!0``````````0`!>!`,!PB0`0``
-M`````!0````<```````````````[`0```````!0````T```````````````%
-M`````````!0```!,```````````````&`````````!0```!D````````````
-M```<`````````!0```!\```````````````=`````````!0```"4````````
-M```````K`````````!0```"L```````````````G`````````"0```#$````
-M```````````S`0```````$0.,%B.`HT#C`2&!8,&```4````[```````````
-M````0``````````D````!`$`````````````F@````````!$#BA3C0*,`X8$
-M@P4`````%````"P!`````````````%P`````````%````$0!````````````
-M`!<`````````'````%P!`````````````/$#````````1`X0```````<````
-M?`$`````````````50$```````!!#A!$#C"#`AP```"<`0````````````"G
-M`0```````$$.$(,"````%``````````!``%X$`P'")`!````````%````!P`
-M`````````````$0`````````%````#0``````````````!0`````````)```
-M`$P``````````````&4`````````0@X000X800X@@P2&`XP"`"0```!T````
-M```````````)`P```````$$.$$$.&$0.,(,#A@(````D````G```````````
-M````I@````````!$#C!/C`*&`X,$````````)````,0``````````````'<`
-M````````00X000X81`XP@P.&`@```#P```#L``````````````#$````````
-M`$(.$$(.&$(.($(.*$$.,$$..$0.4(,'A@:,!8T$C@./`@`````````<````
-M+`$`````````````?0````````!!#A!$#B"#`AP```!,`0````````````"T
-M`````````$0.,$J&`H,#)````&P!`````````````'D#````````1`Y@7H\"
-MC@.-!(P%A@:#!Q0``````````0`!>!`,!PB0`0```````!0````<````````
-M```````&`````````!0````T``````````````!&`````````!0```!,````
-M```````````&`````````!0```!D```````````````&`````````!0```!\
-M```````````````&`````````!0```"4``````````````!T`````````!0`
-M``"L``````````````"9`````````!0```#$```````````````"````````
-M`!0```#<```````````````(`````````!0```#T``````````````!0````
-M`````!0````,`0`````````````&`````````!0````D`0`````````````&
-M`````````!0````\`0`````````````R`````````!P```!4`0``````````
-M```\`````````$0.&$F,`H,#%````'0!`````````````!,`````````%```
-M`(P!`````````````%P`````````%````*0!`````````````%P`````````
-M'````+P!`````````````!H`````````1`X0```````D````W`$`````````
-M````U`````````!!#A!!#AA$#E"#`X8"````/`````0"`````````````#D&
-M````````0@X00@X80@X@0@XH00XP00XX1`Z@`8,'A@:,!8T$C@./`@``````
-M`!P```!$`@````````````!&`````````$0.($J,`H,#)````&0"````````
-M`````!$!````````00X000X81`X@@P.&`@```!P```",`@`````````````>
-M`````````$$.$(,"````'````*P"`````````````!X`````````00X0@P(`
-M```<````S`(`````````````$0````````!$#A```````"0```#L`@``````
-M``````"!`0```````$0.0%Z/`HX#C02,!88&@P<D````%`,`````````````
-MW`0```````!$#E!>CP*.`XT$C`6&!H,')````#P#`````````````#4$````
-M````1`YP7H\"C@.-!(P%A@:#!R0```!D`P````````````#(`````````$0.
-M($Z,`H8#@P0````````D````C`,`````````````DP$```````!$#C!8C@*-
-M`XP$A@6#!@``'````+0#`````````````-(`````````00X0@P(````D````
-MU`,`````````````C`````````!!#A!!#AA$#B"#`X8"````)````/P#````
-M`````````-P`````````00X000X81`X@@P.&`@```!P````D!```````````
-M```?`````````$$.$(,"````/````$0$`````````````/$"````````0@X0
-M0@X80@X@0@XH00XP00XX1`Y0@P>&!HP%C02.`X\"`````````"0```"$!```
-M``````````"C`````````$0.($Z,`H8#@P0````````D````K`0`````````
-M````H0,```````!$#E!>CP*.`XT$C`6&!H,')````-0$`````````````'D!
-M````````1`XP5(T"C`.&!(,%`````"0```#\!`````````````#8````````
-M`$0.($Z,`H8#@P0````````\````)`4`````````````Z04```````!"#A!"
-M#AA"#B!"#BA!#C!!#CA$#D"#!X8&C`6-!(X#CP(`````````'````&0%````
-M`````````)H`````````1`X@2H8"@P,L````A`4`````````````)@D`````
-M``!"#A!!#AA!#B!$#E"#!(8#C`(````````\````M`4`````````````>00`
-M``````!"#A!"#AA"#B!"#BA!#C!!#CA$#G"#!X8&C`6-!(X#CP(`````````
-M)````/0%`````````````$\"````````0@X000X800X@@P2&`XP"`#0````<
-M!@`````````````)!````````$(.$$(.&$(.($$.*$$.,(,&A@6,!(T#C@(`
-M````````+````%0&`````````````"`$````````0@X00@X800X@00XH@P6&
-M!(P#C0(`````)````(0&`````````````/4#````````0@X000X800X@@P2&
-M`XP"`"0```"L!@````````````!@`@```````$(.$$$.&$$.((,$A@.,`@`D
-M````U`8`````````````T@8```````!$#C!8C@*-`XP$A@6#!@``)````/P&
-M`````````````'X"````````00X000X81`X@@P.&`@```#P````D!P``````
-M```````\`P```````$(.$$(.&$(.($(.*$$.,$$..$0.0(,'A@:,!8T$C@./
-M`@`````````4``````````$``7@0#`<(D`$````````4````'```````````
-M````+``````````4````-````````````````@`````````\````3```````
-M````````;@(```````!"#A!"#AA"#B!"#BA!#C!!#CA$#E"#!X8&C`6-!(X#
-MCP(`````````%``````````!``%X$`P'")`!````````%````!P`````````
-M`````#8`````````%````#0``````````````#8`````````%````$P`````
-M`````````$8`````````%````&0``````````````$8`````````%````'P`
-M``````````````P`````````%``````````!``%X$`P'")`!````````%```
-M`!P``````````````"(`````````%````#0``````````````$<`````````
-M%````$P``````````````!``````````%````&0``````````````%P`````
-M````%````'P```````````````T`````````%````)0``````````````"<`
-M````````%````*P``````````````#``````````%````,0`````````````
-M`#$`````````%````-P``````````````#,`````````%````/0`````````
-M`````-P!````````%`````P!`````````````#X`````````'````"0!````
-M`````````(X`````````1`YP```````<````1`$`````````````.0``````
-M``!$#A```````!0```!D`0`````````````H`````````!0```!\`0``````
-M```````A`````````!0```"4`0`````````````@`````````!0`````````
-M`0`!>!`,!PB0`0```````!0````<``````````````!C`````````!0````T
-M``````````````!2`````````!0```!,``````````````!2`````````!0`
-M``!D``````````````!Y`````````"0```!\``````````````!0`0``````
-M`$0.,%2-`HP#A@2#!0`````<````I```````````````/P````````!$#B!*
-MC`*#`SP```#$``````````````!M`@```````$(.$$(.&$(.($(.*$$.,$$.
-M.$0.D`&#!X8&C`6-!(X#CP(````````D````!`$`````````````2@$`````
-M``!!#A!!#AA$#B"#`X8"````%``````````!``%X$`P'")`!````````%```
-M`!P``````````````$T`````````%````#0``````````````((`````````
-M%````$P``````````````'4`````````%````&0``````````````'$`````
-M````%````'P``````````````!D`````````'````)0``````````````$4`
-M````````1`X0```````<````M```````````````(0````````!$#A``````
-M`!P```#4``````````````!?`````````$0.$```````/````/0`````````
-M``````,"````````0@X00@X80@X@0@XH00XP00XX1`Y`@P>&!HP%C02.`X\"
-M`````````!P````T`0````````````#M`````````$0.$```````)````%0!
-M`````````````!,!````````1`XP5(T"C`.&!(,%`````"0```!\`0``````
-M```````8`0```````$(.$$$.&$$.((,$A@.,`@`D````I`$`````````````
-M`P8```````!$#D!>CP*.`XT$C`6&!H,''````,P!`````````````!$`````
-M````1`X0```````\````[`$`````````````50L```````!"#A!"#AA"#B!"
-M#BA!#C!!#CA$#I`!@P>&!HP%C02.`X\"````````+````"P"````````````
-M`!`"````````0@X00@X800X@00XH1`XP@P6&!(P#C0(`)````%P"````````
-M`````%T#````````1`Y07H\"C@.-!(P%A@:#!SP```"$`@````````````#O
-M`P```````$(.$$(.&$(.($(.*$$.,$$..$0.8(,'A@:,!8T$C@./`@``````
-M```D````Q`(`````````````PPD```````!$#F!>CP*.`XT$C`6&!H,'/```
-M`.P"`````````````(L)````````0@X00@X80@X@0@XH00XP00XX1P[@`8,'
-MA@:,!8T$C@./`@```````"0````L`P````````````#J`````````$0.,%2-
-M`HP#A@2#!0`````\````5`,`````````````P`D```````!"#A!"#AA"#B!"
-M#BA!#C!!#CA$#F"#!X8&C`6-!(X#CP(`````````/````)0#````````````
-M`+0)````````0@X00@X80@X@0@XH00XP00XX1`Z@`8,'A@:,!8T$C@./`@``
-M`````"0```#4`P````````````"[`````````$(.$$$.&$$.((,$A@.,`@`T
-M````_`,`````````````O@````````!"#A!"#AA"#B!!#BA!#C"#!H8%C`2-
-M`XX"`````````#0````T!`````````````!?`P```````$(.$$(.&$(.($$.
-M*$$.,(,&A@6,!(T#C@(`````````'````&P$`````````````,@`````````
-M1`X0```````\````C`0`````````````GP,```````!"#A!"#AA"#B!"#BA!
-M#C!!#CA$#D"#!X8&C`6-!(X#CP(`````````)````,P$`````````````,D#
-M````````1`XP5(T"C`.&!(,%`````#P```#T!`````````````#X`P``````
-M`$(.$$(.&$(.($(.*$$.,$$..$0.H`&#!X8&C`6-!(X#CP(````````\````
-M-`4`````````````,08```````!"#A!"#AA"#B!"#BA!#C!!#CA$#F"#!X8&
-MC`6-!(X#CP(`````````'````'0%`````````````($`````````1`X0````
-M```<````E`4`````````````#@````````!$#A```````!P```"T!0``````
-M```````+!````````$$.$$0.<(,")````-0%``````````````8!````````
-M1`Y`7H\"C@.-!(P%A@:#!SP```#\!0````````````!#`0```````$(.$$(.
-M&$(.($(.*$$.,$$..$0.4(,'A@:,!8T$C@./`@`````````\````/`8`````
-M````````D`L```````!"#A!"#AA"#B!"#BA!#C!!#CA$#K`!@P>&!HP%C02.
-M`X\"````````+````'P&`````````````'<"````````0@X00@X800X@00XH
-M1`XP@P6&!(P#C0(`/````*P&`````````````,$$````````0@X00@X80@X@
-M0@XH00XP00XX1`ZP`8,'A@:,!8T$C@./`@```````!0``````````0`!>!`,
-M!PB0`0```````!0````<``````````````!O`````````!0````T````````
-M``````!"`````````!0```!,``````````````!<`````````!0```!D````
-M``````````!?`````````!0```!\``````````````#>`````````#0```"4
-M```````````````S`0```````$(.$$(.&$(.($$.*$$.,$0.0(,&A@6,!(T#
-MC@(`````'````,P``````````````$0`````````00X0@P(````\````[```
-M````````````BP````````!"#A!"#AA"#B!"#BA!#C!!#CA$#D"#!X8&C`6-
-M!(X#CP(`````````)````"P!`````````````&<!````````1`Y07H\"C@.-
-M!(P%A@:#!R0```!4`0````````````!<`0```````$0.4%Z/`HX#C02,!88&
-M@P<D````?`$`````````````10$```````!$#D!>CP*.`XT$C`6&!H,''```
-M`*0!`````````````'(`````````1`XP2H8"@P,D````Q`$`````````````
-M#P$```````!$#D!>CP*.`XT$C`6&!H,'/````.P!`````````````)\!````
-M````0@X00@X80@X@0@XH00XP00XX1`Y0@P>&!HP%C02.`X\"`````````#P`
-M```L`@````````````!/`0```````$(.$$(.&$(.($(.*$$.,$$..$0.0(,'
-MA@:,!8T$C@./`@`````````D````;`(`````````````"0$```````!$#C!8
-MC@*-`XP$A@6#!@``)````)0"`````````````(,!````````1`X@3HP"A@.#
-M!````````"0```"\`@````````````#_`````````$0.,%2-`HP#A@2#!0``
-M```\````Y`(`````````````H`````````!"#A!"#AA"#B!"#BA!#C!!#CA$
-M#D"#!X8&C`6-!(X#CP(`````````/````"0#`````````````"P!````````
-M0@X00@X80@X@0@XH00XP00XX1`Y0@P>&!HP%C02.`X\"`````````#P```!D
-M`P````````````!O!````````$(.$$(.&$(.($(.*$$.,$$..$0.8(,'A@:,
-M!8T$C@./`@`````````4``````````$``7@0#`<(D`$````````4````'```
-M````````````5@`````````4````-```````````````2@`````````4````
-M``````$``7@0#`<(D`$````````4````'```````````````'`$````````D
-M````-```````````````'0$```````!!#A!!#AB#`X8"````````%````%P`
-M`````````````(<`````````%````'0``````````````"4`````````%```
-M`(P```````````````(`````````%````*0``````````````$L`````````
-M%````+P``````````````"H`````````%````-0``````````````#0`````
-M````%````.P``````````````"H`````````%`````0!`````````````#$`
-M````````%````!P!`````````````"H`````````%````#0!````````````
-M`"H`````````%````$P!`````````````"``````````%````&0!````````
-M`````"H`````````%````'P!`````````````"H`````````%````)0!````
-M`````````&$`````````%````*P!`````````````/8`````````%````,0!
-M`````````````-$`````````%````-P!`````````````$D`````````+```
-M`/0!`````````````/H`````````0@X00@X800X@00XH@P6&!(P#C0(`````
-M'````"0"`````````````"X`````````1`X0```````<````1`(`````````
-M````)@````````!$#A```````!P```!D`@````````````!&`````````$0.
-M$```````'````(0"`````````````"8`````````1`X0```````<````I`(`
-M````````````*@````````!$#A```````#P```#$`@````````````"(`0``
-M`````$(.$$(.&$(.($(.*$$.,$$..$0.0(,'A@:,!8T$C@./`@`````````<
-M````!`,`````````````+`````````!$#A```````!0````D`P``````````
-M```C`````````!0````\`P`````````````G`````````"0```!4`P``````
-M``````#F`````````$(.$$$.&$$.((,$A@.,`@`<````?`,`````````````
-M/@````````!$#B!*A@*#`QP```"<`P`````````````^`````````$0.($J&
-M`H,#)````+P#`````````````$D#````````00X000X81`X@@P.&`@```"0`
-M``#D`P````````````!9`0```````$$.$$$.&$0.((,#A@(````<````#`0`
-M````````````5`````````!$#B!*A@*#`R0````L!`````````````"O````
-M`````$0.($Z,`H8#@P0````````D````5`0`````````````A@````````!$
-M#B!.C`*&`X,$````````)````'P$`````````````/``````````1`Y`7H\"
-MC@.-!(P%A@:#!R0```"D!`````````````"H`````````$0.,%2-`HP#A@2#
-M!0`````D````S`0`````````````?@$```````!!#A!!#AA$#B"#`X8"````
-M)````/0$`````````````&T!````````1`XP6(X"C0.,!(8%@P8``"0````<
-M!0````````````"I`````````$0.($Z,`H8#@P0````````D````1`4`````
-M````````#0$```````!$#C!4C0*,`X8$@P4`````)````&P%````````````
-M`"H!````````1`Y`7H\"C@.-!(P%A@:#!R0```"4!0`````````````3`0``
-M`````$0.,%B.`HT#C`2&!8,&```D````O`4`````````````!`$```````!$
-M#C!8C@*-`XP$A@6#!@``)````.0%`````````````%8!````````1`Y`7H\"
-MC@.-!(P%A@:#!SP````,!@````````````"C`P```````$(.$$(.&$(.($(.
-M*$$.,$$..$0.0(,'A@:,!8T$C@./`@`````````D````3`8`````````````
-M_`````````!$#D!>CP*.`XT$C`6&!H,')````'0&`````````````.H`````
-M````1`Y`7H\"C@.-!(P%A@:#!R0```"<!@````````````#)`````````$0.
-M,%B.`HT#C`2&!8,&```D````Q`8`````````````N@````````!$#C!4C0*,
-M`X8$@P4`````)````.P&``````````````P!````````00X000X81`X@@P.&
-M`@```"0````4!P````````````!]`0```````$0.($Z,`H8#@P0````````<
-M````/`<`````````````%P````````!!#A"#`@```"0```!<!P``````````
-M```J`0```````$0.($Z,`H8#@P0````````D````A`<`````````````9P``
-M``````!!#A!!#AA$#B"#`X8"````'````*P'`````````````#H`````````
-M00X0@P(````<````S`<`````````````(`````````!!#A"#`@```!P```#L
-M!P`````````````F`````````$$.$(,"````)`````P(`````````````/(`
-M````````1`XP5(T"C`.&!(,%`````"0````T"`````````````#J`0``````
-M`$0.,%2-`HP#A@2#!0`````D````7`@`````````````A@````````!!#A!!
-M#AA$#B"#`X8"````)````(0(`````````````(4!````````00X000X81`X@
-M@P.&`@```#P```"L"`````````````!G`P```````$(.$$(.&$(.($(.*$$.
-M,$$..$0.8(,'A@:,!8T$C@./`@`````````L````[`@`````````````X0$`
-M``````!"#A!"#AA!#B!!#BA$#C"#!88$C`.-`@`\````'`D`````````````
-MCP(```````!"#A!"#AA"#B!"#BA!#C!!#CA$#D"#!X8&C`6-!(X#CP(`````
-M````)````%P)`````````````"0!````````1`XP5(T"C`.&!(,%`````"0`
-M``"$"0`````````````T`0```````$$.$$$.&$0.((,#A@(````D````K`D`
-M````````````2P````````!"#A!!#AA$#B"#`XP"````'````-0)````````
-M`````"8`````````1`X0```````4``````````$``7@0#`<(D`$````````4
-M````'```````````````%0`````````4````-```````````````&@``````
-M```4````3```````````````(P`````````4````9```````````````00``
-M```````4````?```````````````70`````````4````E```````````````
-MD`$````````L````K```````````````RP````````!"#A!"#AA!#B!!#BB#
-M!88$C`.-`@`````L````W```````````````;@````````!"#A!"#AA!#B!!
-M#BA$#C"#!88$C`.-`@`<````#`$`````````````*0````````!!#A"#`@``
-M`!P````L`0````````````"%`````````$0.$```````+````$P!````````
-M`````$<!````````0@X00@X800X@00XH1`XP@P6&!(P#C0(`'````'P!````
-M`````````!\!````````1`X0```````<````G`$`````````````@```````
-M``!$#A```````!P```"\`0````````````"``````````$0.$```````/```
-M`-P!`````````````!4)````````0@X00@X80@X@0@XH00XP00XX1`YP@P>&
-M!HP%C02.`X\"`````````"0````<`@````````````"#`0```````$0.($Z,
-M`H8#@P0````````4````1`(`````````````G0`````````4````7`(`````
-M````````^``````````L````=`(`````````````P`$```````!"#A!"#AA!
-M#B!!#BA$#C"#!88$C`.-`@`4``````````$``7@0#`<(D`$````````4````
-M'```````````````?P`````````4````-```````````````8@`````````4
-M````3```````````````8@`````````4````9```````````````:0``````
-M```4````?```````````````!P`````````4````E```````````````,P``
-M```````4````K```````````````40`````````4````Q```````````````
-M'P`````````4````W```````````````+@`````````<````]```````````
-M````DP````````!$#A```````"0````4`0`````````````!`0```````$0.
-M,%2-`HP#A@2#!0`````\````/`$`````````````T0$```````!"#A!"#AA"
-M#B!"#BA!#C!!#CA$#E"#!X8&C`6-!(X#CP(`````````+````'P!````````
-M`````%\`````````0@X00@X800X@00XH1`XP@P6&!(P#C0(`)````*P!````
-M`````````.X`````````1`Y`7H\"C@.-!(P%A@:#!R0```#4`0``````````
-M``#.`````````$0.,%B.`HT#C`2&!8,&```<````_`$`````````````&P$`
-M``````!!#A"#`@```"0````<`@````````````"G`````````$0.,%2-`HP#
-MA@2#!0`````D````1`(`````````````*@$```````!!#A!!#AA$#B"#`X8"
-M````)````&P"`````````````,,`````````1`XP6(X"C0.,!(8%@P8``"0`
-M``"4`@````````````#Q`````````$0.,%2-`HP#A@2#!0`````\````O`(`
-M````````````X0````````!"#A!"#AA"#B!"#BA!#C!!#CA$#G"#!X8&C`6-
-M!(X#CP(`````````/````/P"`````````````.$`````````0@X00@X80@X@
-M0@XH00XP00XX1`YP@P>&!HP%C02.`X\"`````````#P````\`P``````````
-M``"?`@```````$(.$$(.&$(.($(.*$$.,$$..$0.<(,'A@:,!8T$C@./`@``
-M```````T````?`,`````````````W0(```````!"#A!"#AA"#B!!#BA!#C"#
-M!H8%C`2-`XX"`````````"0```"T`P````````````"G`````````$0.,%B.
-M`HT#C`2&!8,&```\````W`,`````````````/@,```````!"#A!"#AA"#B!"
-M#BA!#C!!#CA$#G"#!X8&C`6-!(X#CP(`````````/````!P$````````````
-M`%D'````````0@X00@X80@X@0@XH00XP00XX1`Z@`8,'A@:,!8T$C@./`@``
-M`````#P```!<!`````````````#U`````````$(.$$(.&$(.($(.*$$.,$$.
-M.$0.0(,'A@:,!8T$C@./`@`````````T````G`0`````````````[0,`````
-M``!"#A!"#AA"#B!!#BA!#C!$#F"#!H8%C`2-`XX"`````#P```#4!```````
-M```````J"````````$(.$$(.&$(.($(.*$$.,$$..$0.8(,'A@:,!8T$C@./
-M`@`````````D````%`4`````````````J`````````!!#A!!#AA$#B"#`X8"
-M````)````#P%`````````````&D&````````1`XP6(X"C0.,!(8%@P8``"0`
-M``!D!0````````````!#`@```````$0.($Z,`H8#@P0````````<````C`4`
-M````````````%`````````!$#A```````"0```"L!0````````````"E"0``
-M`````$0.0%Z/`HX#C02,!88&@P<D````U`4`````````````^`,```````!$
-M#C!4C0*,`X8$@P4`````)````/P%`````````````"<#````````1`XP6(X"
-MC0.,!(8%@P8``#P````D!@````````````"R`@```````$(.$$(.&$(.($(.
-M*$$.,$$..$0.8(,'A@:,!8T$C@./`@`````````\````9`8`````````````
-M[P(```````!"#A!"#AA"#B!"#BA!#C!!#CA'#H`%@P>&!HP%C02.`X\"````
-M````/````*0&`````````````+\"````````0@X00@X80@X@0@XH00XP00XX
-M1P[@!(,'A@:,!8T$C@./`@```````#P```#D!@````````````#J`P``````
-M`$(.$$(.&$(.($(.*$$.,$$..$<.@`6#!X8&C`6-!(X#CP(````````\````
-M)`<`````````````[`,```````!"#A!"#AA"#B!"#BA!#C!!#CA'#O`$@P>&
-M!HP%C02.`X\"````````/````&0'`````````````!@!````````0@X00@X8
-M0@X@0@XH00XP00XX1`Y0@P>&!HP%C02.`X\"`````````"P```"D!P``````
-M```````!`@```````$(.$$(.&$$.($$.*$0.,(,%A@2,`XT"`"0```#4!P``
-M```````````[`@```````$0.,%2-`HP#A@2#!0`````\````_`<`````````
-M````KP````````!"#A!"#AA"#B!"#BA!#C!!#CA$#D"#!X8&C`6-!(X#CP(`
-M````````)````#P(`````````````',,````````1`Y`7H\"C@.-!(P%A@:#
-M!R0```!D"``````````````C"0```````$0.0%Z/`HX#C02,!88&@P<4````
-M``````$``7@0#`<(D`$````````4````'```````````````,``````````4
-M````-```````````````)0`````````D````3```````````````=@``````
-M``!!#A!!#AB#`X8"````````'````'0``````````````$L`````````1`X8
-M28P"@P,<````E```````````````&@````````!!#A"#`@```!0```"T````
-M``````````!"`````````"0```#,``````````````"5`````````$$.$$$.
-M&(,#A@(````````D````]```````````````A0$```````!"#A!!#AA!#B"#
-M!(8#C`(`'````!P!`````````````#<`````````1`X0```````<````/`$`
-M````````````)P````````!$#A```````!P```!<`0`````````````_````
-M`````$0.$```````)````'P!`````````````-4`````````1`XP6(X"C0.,
-M!(8%@P8``"0```"D`0````````````!/`````````$(.$$$.&$$.((,$A@.,
-M`@`D````S`$`````````````?@````````!$#C!4C0*,`X8$@P4`````)```
-M`/0!`````````````,D`````````1`XP5(T"C`.&!(,%`````#P````<`@``
-M```````````0`@```````$(.$$(.&$(.($(.*$$.,$$..$0.0(,'A@:,!8T$
-MC@./`@`````````<````7`(`````````````4@````````!$#B!*C`*#`QP`
-M``!\`@````````````!2`````````$0.($J,`H,#-````)P"````````````
-M`*H`````````0@X00@X80@X@00XH00XP@P:&!8P$C0..`@`````````<````
-MU`(`````````````4@````````!$#B!*C`*#`QP```#T`@`````````````W
-M`````````$0.$```````'````!0#`````````````#\`````````1`X0````
-M```\````-`,`````````````904```````!"#A!"#AA"#B!"#BA!#C!!#CA$
-M#I`!@P>&!HP%C02.`X\"````````'````'0#`````````````%,`````````
-M1`X0```````<````E`,`````````````2P````````!$#A```````!P```"T
-M`P````````````!2`````````$0.($J,`H,#%``````````!``%X$`P'")`!
-M````````%````!P``````````````!@`````````%````#0`````````````
-M`!(`````````'````$P``````````````.@`````````00X0@P(````4````
-M;```````````````(``````````4````A```````````````(@`````````<
-M````G```````````````@@````````!!#A"#`@```#P```"\````````````
-M```O`0```````$(.$$(.&$(.($(.*$$.,$$..$0.0(,'A@:,!8T$C@./`@``
-M```````D````_```````````````XP````````!$#D!>CP*.`XT$C`6&!H,'
-M-````"0!`````````````"(!````````0@X00@X80@X@00XH00XP@P:&!8P$
-MC0..`@`````````D````7`$`````````````JP````````!$#C!4C0*,`X8$
-M@P4`````%``````````!``%X$`P'")`!````````%````!P`````````````
-M`#L!````````%````#0```````````````4`````````%````$P`````````
-M``````8`````````%````&0``````````````!P`````````%````'P`````
-M`````````!T`````````%````)0``````````````"L`````````%````*P`
-M`````````````"<`````````)````,0``````````````#,!````````1`XP
-M6(X"C0.,!(8%@P8``!0```#L``````````````!``````````"0````$`0``
-M``````````":`````````$0.*%.-`HP#A@2#!0`````4````+`$`````````
-M````7``````````4````1`$`````````````%P`````````<````7`$`````
-M````````\0,```````!$#A```````!P```!\`0````````````!5`0``````
-M`$$.$$0.,(,"'````)P!`````````````*<!````````00X0@P(````4````
-M``````$``7@0#`<(D`$````````4````'```````````````1``````````4
-M````-```````````````%``````````D````3```````````````90``````
-M``!"#A!!#AA!#B"#!(8#C`(`)````'0```````````````D#````````00X0
-M00X81`XP@P.&`@```"0```"<``````````````"F`````````$0.,$^,`H8#
-M@P0````````D````Q```````````````=P````````!!#A!!#AA$#C"#`X8"
-M````/````.P``````````````,0`````````0@X00@X80@X@0@XH00XP00XX
-M1`Y0@P>&!HP%C02.`X\"`````````!P````L`0````````````!]````````
-M`$$.$$0.((,"'````$P!`````````````+0`````````1`XP2H8"@P,D````
-M;`$`````````````>0,```````!$#F!>CP*.`XT$C`6&!H,'%``````````!
-M``%X$`P'")`!````````%````!P```````````````8`````````%````#0`
-M`````````````$8`````````%````$P```````````````8`````````%```
-M`&0```````````````8`````````%````'P```````````````8`````````
-M%````)0``````````````'0`````````%````*P``````````````)D`````
-M````%````,0```````````````(`````````%````-P```````````````@`
-M````````%````/0``````````````%``````````%`````P!````````````
-M``8`````````%````"0!`````````````/0`````````%````#P!````````
-M`````#(`````````'````%0!`````````````#P`````````1`X828P"@P,4
-M````=`$`````````````$P`````````4````C`$`````````````7```````
-M```4````I`$`````````````7``````````<````O`$`````````````&@``
-M``````!$#A```````"0```#<`0````````````#4`````````$$.$$$.&$0.
-M4(,#A@(````\````!`(`````````````.08```````!"#A!"#AA"#B!"#BA!
-M#C!!#CA$#J`!@P>&!HP%C02.`X\"````````'````$0"`````````````'``
-M````````1`X@2HP"@P,<````9`(`````````````1@````````!$#B!*C`*#
-M`QP```"$`@`````````````>`````````$$.$(,"````'````*0"````````
-M`````!X`````````00X0@P(````<````Q`(`````````````$0````````!$
-M#A```````"0```#D`@````````````"!`0```````$0.0%Z/`HX#C02,!88&
-M@P<D````#`,`````````````W`0```````!$#E!>CP*.`XT$C`6&!H,')```
-M`#0#`````````````#4$````````1`YP7H\"C@.-!(P%A@:#!R0```!<`P``
-M``````````#(`````````$0.($Z,`H8#@P0````````D````A`,`````````
-M````DP$```````!$#C!8C@*-`XP$A@6#!@``'````*P#`````````````-(`
-M````````00X0@P(````D````S`,`````````````C`````````!!#A!!#AA$
-M#B"#`X8"````)````/0#`````````````-P`````````00X000X81`X@@P.&
-M`@```!P````<!``````````````?`````````$$.$(,"````/````#P$````
-M`````````/$"````````0@X00@X80@X@0@XH00XP00XX1`Y0@P>&!HP%C02.
-M`X\"`````````"0```!\!`````````````"C`````````$0.($Z,`H8#@P0`
-M```````D````I`0`````````````F@,```````!$#E!>CP*.`XT$C`6&!H,'
-M)````,P$`````````````'D!````````1`XP5(T"C`.&!(,%`````"0```#T
-M!``````````````Q`0```````$0.8$^,`H8#@P0````````\````'`4`````
-M````````Z04```````!"#A!"#AA"#B!"#BA!#C!!#CA$#D"#!X8&C`6-!(X#
-MCP(`````````'````%P%`````````````)H`````````1`X@2H8"@P,L````
-M?`4`````````````)@D```````!"#A!!#AA!#B!$#E"#!(8#C`(````````\
-M````K`4`````````````>00```````!"#A!"#AA"#B!"#BA!#C!!#CA$#G"#
-M!X8&C`6-!(X#CP(`````````)````.P%`````````````$4"````````0@X0
-M00X800X@@P2&`XP"`#0````4!@`````````````)!````````$(.$$(.&$(.
-M($$.*$$.,(,&A@6,!(T#C@(`````````+````$P&`````````````"`$````
-M````0@X00@X800X@00XH@P6&!(P#C0(`````)````'P&`````````````/4#
-M````````0@X000X800X@@P2&`XP"`"0```"D!@````````````!@`@``````
-M`$(.$$$.&$$.((,$A@.,`@`D````S`8`````````````T@8```````!$#C!8
-MC@*-`XP$A@6#!@``)````/0&`````````````(X"````````00X000X81`X@
-M@P.&`@```#P````<!P`````````````\`P```````$(.$$(.&$(.($(.*$$.
-M,$$..$0.0(,'A@:,!8T$C@./`@`````````4``````````$``7@0#`<(D`$`
-M```````4````'```````````````$P`````````4````-```````````````
-M#``````````4````3```````````````*0`````````4````9```````````
-M````#``````````D````?```````````````=P````````!!#A"#`DH.D`(`
-M````````)````*0``````````````,@`````````0@X000X8A@.,`D0.((,$
-M`!0```#,```````````````L`````````"0```#D``````````````!+````
-M`````$(.$$$.&(8#C`)##B"#!``4````#`$`````````````.P`````````4
-M````)`$`````````````*P`````````4````/`$`````````````/0``````
-M```<````5`$`````````````*`````````!!#A"#`@```!0```!T`0``````
-M```````+`````````!0```",`0`````````````0`````````!0```"D`0``
-M```````````E`````````!0```"\`0`````````````^`````````!0```#4
-M`0````````````!?`````````"0```#L`0````````````"#`````````$(.
-M$(P"1`X8A@-&#B"#!``D````%`(`````````````50````````!"#A",`D8.
-M&$$.((,$A@,`-````#P"`````````````-D`````````0@X00@X80@X@00XH
-MA@6,!(T#C@)$#C"#!@`````````D````=`(`````````````PP````````!!
-M#A"&`D0.&(,#1PX@````)````)P"`````````````'<`````````00X0A@)$
-M#AA$#B"#`P```"0```#$`@````````````!7`````````$$.$(8"1`X81`X@
-M@P,````D````[`(`````````````V0````````!"#A",`D0.&$$.((,$A@,`
-M+````!0#`````````````/D`````````0@X0C0)%#AA!#B"&!(P#1`XH1`XP
-M@P4`'````$0#`````````````%4`````````00X0@P(````D````9`,`````
-M````````5P````````!$#B!)A@.#!$>,`@``````%````(P#````````````
-M`!``````````%````*0#`````````````!$`````````%````+P#````````
-M`````!4`````````-````-0#`````````````&\"````````0@X00@X8C0..
-M`D4.((P$10XH00XP@P:&!0`````````\````#`0`````````````5@$`````
-M``!"#A!"#AA"#B!"#BA!#C!!#CB#!X8&C`6-!(X#CP)*#L`!````````+```
-M`$P$`````````````/,`````````0@X0C0)%#AB,`T0.((8$1`XH1`XP@P4`
-M)````'P$`````````````)8`````````1`X@2HP"A@-'@P0``````"P```"D
-M!`````````````"8`````````$(.$$(.&$$.((8$C`.-`D0.*$0.,(,%`#P`
-M``#4!`````````````!:`0```````$(.$(\"10X8C@-%#B"-!$4.*$$.,(8&
-MC`5$#CA$#D"#!P`````````T````%`4`````````````QP$```````!"#A!"
-M#AB-`XX"10X@C`1$#BA!#C!$#K`!@P:&!0```"0```!,!0````````````"S
-M`````````$(.$(P"1`X8A@-(#B"#!``D````=`4`````````````@`$`````
-M``!$#C!1C`2&!5..`HT#@P8`)````)P%`````````````/H`````````0@X0
-M2`X8A@.,`D<.((,$`!0``````````0`!>!`,!PB0`0```````!0````<````
-M```````````^`````````!0````T```````````````2`````````!0```!,
-M```````````````K`````````!0```!D```````````````X`````````!0`
-M``!\```````````````\`````````!0```"4```````````````Q````````
-M`!0```"L``````````````!E`````````!0```#$``````````````"R````
-M`````!0```#<```````````````,`````````"0```#T``````````````!(
-M`````````$$.$(8"1`X81`X@@P,````<````'`$`````````````=P``````
-M``!!#A"#`@```!P````\`0````````````"[`````````$$.$(,"````'```
-M`%P!`````````````%L`````````1`X@2H8"@P,D````?`$`````````````
-MK@````````!"#A",`D0.&$$.((,$A@,`%````*0!``````````````4`````
-M````'````+P!`````````````$X`````````1`X@2H8"@P,D````W`$`````
-M````````:@````````!!#A!!#AA$#B"#`X8"````'`````0"````````````
-M`'@`````````1`X@2H8"@P,4````)`(`````````````-P`````````<````
-M/`(`````````````2P````````!!#A"#`@```"0```!<`@````````````!@
-M`````````$$.$(8"1`X8@P-.#B`````L````A`(`````````````.@,`````
-M``!$#D!*A@:#!TR/`HX#38T$C`4````````D````M`(`````````````9```
-M``````!"#A!(#AB&`XP"1`X@@P0`)````-P"`````````````.$`````````
-M00X000X8@P.&`D<.(````!P````$`P````````````!``````````$0.($J,
-M`H,#)````"0#`````````````/D!````````1`Y@38P$A@55C@*#!HT#`!P`
-M``!,`P````````````!(`````````$0.($V,`H,#)````&P#````````````
-M`(\!````````1PZ@!%>&`H,#`````````"0```"4`P````````````!:`@``
-M`````$$.$$4.&(,#A@)*#J`$```<````O`,`````````````5@````````!!
-M#A"#`@```"P```#<`P````````````"W"@```````$<.T`97C`6&!F>/`HX#
-MC02#!P```````#P````,!`````````````#O`0```````$(.$(\"2@X80@X@
-MC02.`T4.*$$.,$$..$0.L`&#!X8&C`4````````<````3`0`````````````
-M2@````````!!#A"#`@```"0```!L!`````````````#R`````````$0.($R,
-M`H8#1X,$```````L````E`0`````````````90$```````!"#A!"#AB,`XT"
-M1`X@00XH1`XP@P6&!``L````Q`0`````````````A0$```````!"#A"-`D<.
-M&(P#1`X@00XH1`XP@P6&!``<````]`0`````````````CP````````!!#A"#
-M`@```"0````4!0````````````!F`````````$$.$(8"1`X81`X@@P,````T
-M````/`4`````````````10(```````!"#A!(#AA"#B!!#BA!#C"#!H8%C`2-
-M`XX"`````````"0```!T!0````````````"6`````````$(.$(P"2PX800X@
-M@P2&`P`D````G`4`````````````/@$```````!$#B!)@P2&`TB,`@``````
-M)````,0%`````````````/0`````````1`X@288#@P1(C`(``````"0```#L
-M!0````````````!X`0```````$0.,$J,!(8%48,&C@*-`P`4``````````$`
-M`7@0#`<(D`$````````4````'```````````````50`````````4````-```
-M````````````'@`````````4````3```````````````0@`````````\````
-M9```````````````M`````````!"#A"/`D4.&(X#10X@0@XH00XP00XX1P[0
-M`8,'A@:,!8T$````````/````*0```````````````@!````````0@X00@X8
-MC@./`D4.($(.*(P%C01$#C"&!D0..$<.X`&#!P```````"P```#D````````
-M``````!<`````````$(.$$(.&$$.((8$C`.-`D,.*$<.L`&#!3P````4`0``
-M``````````!7`0```````$(.$$(.&$(.($(.*$$.,(8&C`6-!(X#CP)$#CA'
-M#I`"@P<````````4````5`$`````````````4P`````````4````;`$`````
-M````````F@`````````4````A`$`````````````V@`````````4````G`$`
-M`````````````P$````````4````M`$`````````````20`````````4````
-MS`$`````````````>0`````````\````Y`$`````````````CP0```````!"
-M#A"/`D4.&(X#10X@C01%#BA!#C!!#CA$#D"#!X8&C`4`````````%````"0"
-M``````````````(`````````%````#P"`````````````(4`````````'```
-M`%0"`````````````'(`````````1`Y````````D````=`(`````````````
-M.@````````!!#A!!#AA$#C"#`X8"````%````)P"`````````````-@`````
-M````)````+0"`````````````($`````````0@X0C`)$#AB&`T0.((,$`"P`
-M``#<`@````````````!K`````````$(.$(T"10X8C`-$#B!!#BB#!88$````
-M`!0````,`P````````````!S`````````!0````D`P`````````````6````
-M`````!0````\`P`````````````;`````````!0```!4`P`````````````:
-M`````````!0```!L`P`````````````6`````````!0```"$`P``````````
-M```5`````````!0```"<`P`````````````5`````````!0```"T`P``````
-M```````5`````````!0```#,`P`````````````5`````````!0```#D`P``
-M```````````5`````````!0```#\`P`````````````5`````````!0````4
-M!``````````````8`````````!0````L!``````````````8`````````!0`
-M``!$!``````````````8`````````!0```!<!``````````````8````````
-M`!0```!T!``````````````5`````````!0```",!``````````````H````
-M`````!0```"D!``````````````H`````````!P```"\!``````````````Q
-M`````````$$.$(,"````'````-P$`````````````#$`````````00X0@P(`
-M```<````_`0`````````````,0````````!!#A"#`@```!P````<!0``````
-M``````!D`````````$$.$(,"````'````#P%`````````````&(`````````
-M1`X828,#A@(D````7`4`````````````A0````````!$#B!)@P2&`TB,`@``
-M````)````(0%`````````````,T`````````1`XP28,&A@52C@*-`XP$`"0`
-M``"L!0````````````"B`````````$0.*$F&!(,%38T"C`,````4````U`4`
-M````````````%0`````````4````[`4`````````````.P`````````D````
-M!`8`````````````H@````````!$#BA)A@2#!4V-`HP#````)````"P&````
-M`````````+4`````````1`XH288$@P5-C0*,`P```"0```!4!@``````````
-M``#'`````````$0.*$F&!(,%38T"C`,````D````?`8`````````````VP``
-M``````!$#BA)A@2#!4V-`HP#````%````*0&`````````````!@`````````
-M'````+P&`````````````&4`````````1`X8288"@P,<````W`8`````````
-M````90````````!$#AA)A@*#`QP```#\!@````````````!E`````````$0.
-M&$F&`H,#'````!P'`````````````%T`````````1`X8288"@P,<````/`<`
-M````````````70````````!$#AA)A@*#`QP```!<!P````````````!=````
-M`````$0.&$F&`H,#'````'P'`````````````(8`````````1`X8288"@P,<
-M````G`<`````````````90````````!$#AA)A@*#`QP```"\!P``````````
-M``!E`````````$0.&$F&`H,#)````-P'`````````````+H`````````1`X@
-M288#@P1(C`(``````!P````$"`````````````!E`````````$0.&$F&`H,#
-M'````"0(`````````````&H`````````1`X8288"@P,<````1`@`````````
-M````9P````````!$#AA)A@*#`QP```!D"`````````````!I`````````$0.
-M&$F&`H,#%````(0(`````````````!P`````````%````)P(````````````
-M`!@`````````%````+0(`````````````!8`````````'````,P(````````
-M`````+(`````````1`X8288"@P,<````[`@`````````````L@````````!$
-M#AA)A@*#`QP````,"0````````````!=`````````$0.&$F&`H,#)````"P)
-M`````````````+``````````1`XP28,&A@52C@*-`XP$`"0```!4"0``````
-M``````"P`````````$0.,$F#!H8%4HX"C0.,!``<````?`D`````````````
-M5@````````!$#AA)A@*#`Q0```"<"0`````````````H`````````!P```"T
-M"0````````````!9`````````$$.$(,"````'````-0)`````````````*8`
-M````````1`X83H8"@P,4````]`D`````````````/@`````````<````#`H`
-M````````````LP````````!$#AA)A@*#`QP````L"@````````````"2````
-M`````$0.&$F&`H,#)````$P*``````````````X!````````0@X0C`)*#AB&
-M`T<.((,$`!0```!T"@````````````!N`````````!P```","@``````````
-M``!:`````````$$.$(,"````%````*P*``````````````<`````````'```
-M`,0*`````````````/,`````````1`Y````````4````Y`H`````````````
-M"``````````4````_`H`````````````00`````````<````%`L`````````
-M````<`````````!$#B!*C`*#`R0````T"P````````````#*`````````$0.
-M,$F,!(,&38X"C0-(A@4D````7`L`````````````JP````````!$#B!)A@.#
-M!$B,`@``````+````(0+`````````````!D!````````1`Y`18\"3(P%6H,'
-MC@.-!(8&````````+````+0+``````````````@!````````1`Y`18\"3(P%
-M6H,'C@.-!(8&````````'````.0+`````````````"<`````````10X0@P(`
-M```4````!`P`````````````?0`````````4````'`P`````````````,0``
-M```````4````-`P`````````````,0`````````4````3`P`````````````
-M,0`````````4````9`P`````````````,0`````````4````?`P`````````
-M````,0`````````4````E`P`````````````,0`````````4````K`P`````
-M````````,0`````````4````Q`P`````````````,0`````````4````W`P`
-M````````````,0`````````4````]`P`````````````,0`````````4````
-M#`T`````````````,0`````````4````)`T`````````````,0`````````4
-M````/`T`````````````,0`````````4````5`T`````````````,0``````
-M```4````;`T`````````````,0`````````4````A`T`````````````,0``
-M```````4````G`T`````````````,0`````````4````M`T`````````````
-M,0`````````4````S`T`````````````,0`````````4````Y`T`````````
-M````,0`````````4````_`T`````````````)``````````4````%`X`````
-M````````*``````````<````+`X`````````````J`````````!!#A"#`@``
-M`!0```!,#@`````````````X`````````"0```!D#@````````````#+````
-M`````$0.($Z,`H8#@P0````````<````C`X`````````````10````````!$
-M#B!*@P.,`BP```"L#@`````````````$`0```````$(.$(P"1`X800X@1P[@
-M`8,$A@,``````!P```#<#@````````````!-`````````$0.($J&`H,#+```
-M`/P.`````````````)P!````````1`Y`2H8&@P=7CP*.`XT$C`4`````````
-M/````"P/`````````````(8!````````0@X00@X8C@./`D4.($(.*$$.,$$.
-M.$0.0(,'A@:,!8T$`````````#0```!L#P````````````#9`````````$(.
-M$$(.&$(.((P$C0..`D0.*$$.,(,&A@4`````````'````*0/````````````
-M`(P`````````00X0@P(````L````Q`\`````````````&@(```````!'#M`!
-M4(,'A@9CCP*.`XT$C`4````````4````]`\`````````````+P`````````\
-M````#!``````````````T`````````!"#A!%#AA"#B"-!(X#CP)%#BA!#C!!
-M#CA'#N`!@P>&!HP%````````%````$P0`````````````*D`````````)```
-M`&00`````````````,``````````1`XP3(8$@P5-C0*,`P```"0```",$```
-M``````````!Y`````````$$.$$,.&(,#A@)*#J`!```D````M!``````````
-M````N`````````!$#C!*C`.&!$V-`H,%````)````-P0`````````````*P`
-M````````1`XP2HX#C`51CP*-!(,&`!P````$$0````````````"6````````
-M`$$.$(,"````)````"01`````````````.8`````````00X000X8@P.&`@``
-M`````#P```!,$0````````````#8`````````$(.$$0.&$(.($(.*(P%C02.
-M`X\"1`XP00XX1P[``8,'A@8````````\````C!$`````````````\P``````
-M``!"#A!$#AA"#B!"#BB,!8T$C@./`D0.,$$..$<.P`&#!X8&````````/```
-M`,P1`````````````.X`````````0@X01`X80@X@0@XHC`6-!(X#CP)$#C!!
-M#CA'#L`!@P>&!@```````#P````,$@````````````#N`````````$(.$$0.
-M&$(.($(.*(P%C02.`X\"1`XP00XX1P[``8,'A@8````````\````3!(`````
-M````````[@````````!"#A!$#AA"#B!"#BB,!8T$C@./`D0.,$$..$<.P`&#
-M!X8&````````+````(P2`````````````)X`````````0@X01`X800X@A@2,
-M`XT"1`XH1PZP`8,%'````+P2`````````````$,`````````00X0@P(````D
-M````W!(`````````````K0````````!!#A"&`D8.&$<.H`&#`P``'`````03
-M`````````````$T`````````1`X@2HP"@P,D````)!,`````````````$P$`
-M``````!!#A!(#AB#`X8"1PX@````%````$P3`````````````"L`````````
-M-````&03`````````````,0`````````0@X00@X80@X@00XHA@6,!(T#C@)$
-M#C!$#G"#!@`````D````G!,`````````````GP$```````!$#C!)C`2#!E*.
-M`HT#A@4`%````,03``````````````\`````````'````-P3````````````
-M`!@`````````1`X0```````<````_!,`````````````&`````````!$#A``
-M`````!P````<%``````````````C`````````$0.$```````+````#P4````
-M`````````',`````````0@X0C0)%#AA!#B!!#BA$#C"#!88$C`,`'````&P4
-M`````````````!L`````````1`X0```````<````C!0`````````````B0``
-M``````!$#B!*@P.&`AP```"L%`````````````!'`````````$0.($J#`XP"
-M'````,P4`````````````!L`````````1`X0```````<````[!0`````````
-M````&P````````!$#A```````!P````,%0````````````!2`````````$$.
-M$(,"````)````"P5`````````````#L`````````00X000X81`X@@P.&`@``
-M`"0```!4%0`````````````[`````````$$.$$$.&$0.((,#A@(````D````
-M?!4`````````````-P````````!!#A!!#AA$#B"#`X8"````)````*05````
-M`````````#<`````````00X000X81`X@@P.&`@```"0```#,%0``````````
-M```W`````````$$.$$$.&$0.((,#A@(````D````]!4`````````````-0``
-M``````!!#A!!#AA$#B"#`X8"````)````!P6`````````````&0`````````
-M00X0A@)+#AA$#B"#`P```#P```!$%@`````````````V`0```````$(.$$(.
-M&$(.($(.*$$.,(8&C`6-!(X#CP)$#CA'#M`!@P<````````D````A!8`````
-M````````*`,```````!$#C!*A@2#!4V,`XT"````'````*P6````````````
-M`!L`````````00X0@P(````<````S!8`````````````&P````````!!#A"#
-M`@```"0```#L%@````````````!-`0```````$0.,%2,`XT"A@2#!0`````D
-M````%!<`````````````9`````````!!#A!!#AB#`X8"1PYP````)````#P7
-M`````````````,H!````````0@X0C`)+#AA!#B"#!(8#`#P```!D%P``````
-M``````#P`@```````$(.$(\"10X80@X@0@XH00XPA@:,!8T$C@-$#CA'#N`$
-M@P<````````L````I!<`````````````B@$```````!"#A!$#AB,`XT"1`X@
-M00XH1PZP`8,%A@0L````U!<`````````````3@$```````!"#A"-`D<.&$$.
-M($$.*$<.L`&#!88$C`,D````!!@`````````````A@````````!$#B!)@P2,
-M`TB-`@``````'````"P8`````````````#D`````````00X0@P(````<````
-M3!@`````````````-@````````!!#A"#`@```!P```!L&`````````````#=
-M`@```````$$.$(,"````%````(P8`````````````)`!````````%````*08
-M`````````````"D`````````'````+P8`````````````!X!````````1`X@
-M2H,#A@(L````W!@`````````````C`@```````!"#A!"#AB,`XT"1`X@00XH
-M1`XP@P6&!``D````#!D`````````````SP(```````!!#A"&`D0.&$0.((,#
-M````-````#09`````````````-8`````````0@X00@X80@X@C`2-`XX"1`XH
-M00XP@P:&!0`````````D````;!D`````````````7P,```````!$#G!*A@2#
-M!4V-`HP#````)````)09`````````````.``````````1`Y`2H8$@P5-C0*,
-M`P```!P```"\&0````````````!M`````````$$.$(,"````/````-P9````
-M`````````*\!````````0@X00@X8C@./`D4.($(.*(P%C01$#C!!#CA'#M`$
-M@P>&!@```````"0````<&@````````````"%`0```````$0.,$J&!(,%38T"
-MC`,````\````1!H`````````````2`\```````!"#A!"#AA"#B!"#BA!#C"&
-M!HP%C02.`X\"1`XX1P[``8,'````````)````(0:`````````````&P`````
-M````00X000X8@P.&`D<.(````"0```"L&@`````````````-`0```````$$.
-M$(8"1`X81P[``8,#```D````U!H`````````````30````````!!#A"&`D8.
-M&$0.((,#````+````/P:`````````````+@`````````0@X00@X800X@00XH
-M1`XP@P6&!(P#C0(`+````"P;`````````````#X"````````0@X01PX8C`.-
-M`D0.((8$1`XH1P[P`8,%+````%P;`````````````!`#````````1`Y`2HT$
-MC`57CP*.`X8&@P<`````````)````(P;``````````````<"````````1P[P
-M`56,`X,%4XT"A@0``"P```"T&P````````````"6`````````$(.$(T"10X8
-M00X@00XH1`XP@P6&!(P#`!P```#D&P````````````!4`````````$0.($V,
-M`H,#'`````0<`````````````&``````````00X0@P(````<````)!P`````
-M````````$`(```````!!#A"#`@```"P```!$'`````````````#X!@``````
-M`$0.8$B,!5^/`HT$C@.&!H,'`````````"P```!T'``````````````/!```
-M`````$0.8$V&!H,'6HX#C02,!8\"`````````"0```"D'`````````````!/
-M`````````$0.($F,`X,$2(T"```````D````S!P`````````````=P``````
-M``!$#B!)A@.#!$B,`@``````)````/0<`````````````'<`````````1`X@
-M288#@P1(C`(``````"0````<'0````````````!/`````````$0.($F,`X,$
-M2(T"```````D````1!T`````````````>0````````!$#B!)A@.#!$B,`@``
-M````)````&P=`````````````'D`````````1`X@288#@P1(C`(``````"P`
-M``"4'0````````````"&`````````$(.$(T"10X800X@A@2,`T0.*$0.,(,%
-M`"0```#$'0````````````!9`````````$$.$$$.&(,#A@)'#B`````D````
-M[!T`````````````Y0````````!!#A!!#AB#`X8"1PX@````)````!0>````
-M`````````/,`````````00X0A@)$#AA$#B"#`P```!P````\'@``````````
-M``"2`````````$0.($J&`H,#)````%P>`````````````,D`````````1`X@
-M28P"@P1(A@,``````!P```"$'@`````````````M`````````$0.$```````
-M-````*0>`````````````-D`````````0@X00@X80@X@00XH00XP@P:&!8P$
-MC0..`@`````````\````W!X`````````````20$```````!"#A!$#AA"#B!"
-M#BB,!8T$C@./`D0.,$$..$0.0(,'A@8`````````)````!P?````````````
-M`+(!````````1`Y02H8#@P1(C`(``````#0```!$'P`````````````:`0``
-M`````$(.$$0.&$(.($$.*$$.,(,&A@6,!(T#C@(`````````'````'P?````
-M`````````#H`````````00X0@P(````T````G!\`````````````,P$`````
-M``!"#A!"#AB-`XX"10X@00XH00XP1`ZP`8,&A@6,!````!0```#4'P``````
-M```````%`````````"0```#L'P`````````````E`0```````$0.,$J-`HP#
-M388$@P4````D````%"``````````````=P````````!$#B!)C0*#!$B,`P``
-M````)````#P@`````````````(8`````````0@X02`X8A@.,`D0.((,$`"P`
-M``!D(`````````````"+`````````$(.$$(.&$$.((8$C`.-`D0.*$<.\`&#
-M!20```"4(`````````````")`````````$$.$(8"1@X81`X@@P,````\````
-MO"``````````````\`(```````!"#A!"#AA"#B"-!(X#CP)%#BA!#C!!#CA$
-M#D"#!X8&C`4`````````-````/P@`````````````-(!````````0@X00@X8
-MC0..`D4.($$.*$$.,(,&A@6,!``````````T````-"$`````````````S`$`
-M``````!"#A!"#AB-`XX"10X@00XH00XP@P:&!8P$`````````"P```!L(0``
-M``````````!N`P```````$(.$(T"10X800X@00XH1`YP@P6&!(P#`"0```"<
-M(0````````````#W`````````$(.$$$.&(8#C`)$#B"#!``L````Q"$`````
-M````````I@````````!"#A!"#AA!#B!!#BB#!88$C`.-`DH.\`$D````]"$`
-M````````````80(```````!"#A!!#AB&`XP"1`X@@P0`)````!PB````````
-M`````!L$````````1`XP188$4HT"C`.#!0```!0```!$(@`````````````[
-M`````````!P```!<(@````````````!"`````````$$.$(,"````)````'PB
-M`````````````%P!````````1`Y`7H\"C@.-!(P%A@:#!R0```"D(@``````
-M```````$`0```````$0.,$J#!8P$38X"C0,````4``````````$``7@0#`<(
-MD`$````````4````'```````````````U@`````````<````-```````````
-M````=`````````!$#AA)A@*#`Q0```!4``````````````!K`````````!0`
-M``!L```````````````;`````````!0```"$```````````````)````````
-M`!P```"<``````````````!,`````````$$.$(,"````)````+P`````````
-M`````'$`````````1`X@18,#2(8"`````````"P```#D```````````````7
-M`0```````$(.$$(.&$$.($$.*(,%A@2,`XT"20XP`"P````4`0``````````
-M```&!````````$(.$$(.&$$.($$.*(,%A@2,`XT"1PXP`!P```!$`0``````
-M``````!2`````````$$.$(,"````)````&0!`````````````-\`````````
-M00X01`X81`X@@P.&`@```#P```",`0````````````!N`P```````$(.$(\"
-M2@X80@X@C02.`T4.*$$.,$$..$0.4(,'A@:,!0`````````<````S`$`````
-M````````-@````````!!#A"#`@```!0``````````0`!>!`,!PB0`0``````
-M`!0````<```````````````6`````````"P````T``````````````#R````
-M`````$(.$(T"20X800X@00XH@P6&!(P#`````!0```!D```````````````]
-M`````````!0```!\``````````````!F`````````"P```"4````````````
-M``#I`````````$(.$(P"1`X8A@-$#B"#!$<.,````````!P```#$````````
-M``````!?`````````$$.$(,"1PX@)````.0``````````````-4`````````
-M0@X0C`)$#AA!#B"#!(8#`!P````,`0````````````"1`````````$$.$(,"
-M````/````"P!`````````````!$"````````0@X0CP)%#AA"#B!"#BA!#C"&
-M!HP%C02.`T0..$0.4(,'`````````#0```!L`0````````````#8`P``````
-M`$(.$$(.&$(.($$.*(8%C`2-`XX"1`XP1PZP!(,&````)````*0!````````
-M`````&,`````````00X0A@)%#AA$#B"#`P```"0```#,`0````````````"#
-M`````````$(.$$$.&$$.((,$A@.,`@`L````]`$`````````````2`(`````
-M``!"#A!"#AA!#B"&!(P#C0)$#BA$#C"#!0`<````)`(`````````````G```
-M``````!$#B!*A@*#`R0```!$`@````````````!H`0```````$(.$(P"2`X8
-MA@-%#B"#!``L````;`(`````````````N`<```````!'#L`$;H8&C@.,!8,'
-M4X\"C00````````D````G`(`````````````AP(```````!!#A"&`D0.&$0.
-M((,#````%``````````!``%X$`P'")`!````````%````!P`````````````
-M`%0`````````%````#0```````````````(`````````%````$P`````````
-M`````!,`````````%````&0```````````````,`````````)````'P`````
-M`````````.(`````````0@X0C`)$#AA!#B"#!(8#`"0```"D````````````
-M```Z`````````$$.$(8"1`X81`X@@P,````<````S```````````````20``
-M``````!!#A"#`@```!P```#L``````````````!5`````````$0.$```````
-M%`````P!``````````````P`````````%````"0!``````````````P`````
-M````%``````````!``%X$`P'")`!````````%````!P``````````````$\`
-M````````%````#0``````````````$\``````````$=#0SH@*$=.52D@-"XR
-M+C(@,C`P-S`X,S$@<')E<F5L96%S92!;1G)E94)31%T``$=#0SH@*$=.52D@
-M-"XR+C(@,C`P-S`X,S$@<')E<F5L96%S92!;1G)E94)31%T``$=#0SH@*$=.
-M52D@-"XR+C(@,C`P-S`X,S$@<')E<F5L96%S92!;1G)E94)31%T``$=#0SH@
-M*$=.52D@-"XR+C(@,C`P-S`X,S$@<')E<F5L96%S92!;1G)E94)31%T``$=#
-M0SH@*$=.52D@-"XR+C(@,C`P-S`X,S$@<')E<F5L96%S92!;1G)E94)31%T`
-M`$=#0SH@*$=.52D@-"XR+C(@,C`P-S`X,S$@<')E<F5L96%S92!;1G)E94)3
-M1%T``$=#0SH@*$=.52D@-"XR+C(@,C`P-S`X,S$@<')E<F5L96%S92!;1G)E
-M94)31%T``$=#0SH@*$=.52D@-"XR+C(@,C`P-S`X,S$@<')E<F5L96%S92!;
-M1G)E94)31%T``$=#0SH@*$=.52D@-"XR+C(@,C`P-S`X,S$@<')E<F5L96%S
-M92!;1G)E94)31%T``$=#0SH@*$=.52D@-"XR+C(@,C`P-S`X,S$@<')E<F5L
-M96%S92!;1G)E94)31%T``$=#0SH@*$=.52D@-"XR+C(@,C`P-S`X,S$@<')E
-M<F5L96%S92!;1G)E94)31%T``$=#0SH@*$=.52D@-"XR+C(@,C`P-S`X,S$@
-M<')E<F5L96%S92!;1G)E94)31%T``$=#0SH@*$=.52D@-"XR+C(@,C`P-S`X
-M,S$@<')E<F5L96%S92!;1G)E94)31%T``$=#0SH@*$=.52D@-"XR+C(@,C`P
-M-S`X,S$@<')E<F5L96%S92!;1G)E94)31%T``$=#0SH@*$=.52D@-"XR+C(@
-M,C`P-S`X,S$@<')E<F5L96%S92!;1G)E94)31%T``$=#0SH@*$=.52D@-"XR
-M+C(@,C`P-S`X,S$@<')E<F5L96%S92!;1G)E94)31%T``$=#0SH@*$=.52D@
-M-"XR+C(@,C`P-S`X,S$@<')E<F5L96%S92!;1G)E94)31%T``$=#0SH@*$=.
-M52D@-"XR+C(@,C`P-S`X,S$@<')E<F5L96%S92!;1G)E94)31%T``$=#0SH@
-M*$=.52D@-"XR+C(@,C`P-S`X,S$@<')E<F5L96%S92!;1G)E94)31%T``$=#
-M0SH@*$=.52D@-"XR+C(@,C`P-S`X,S$@<')E<F5L96%S92!;1G)E94)31%T`
-M`$=#0SH@*$=.52D@-"XR+C(@,C`P-S`X,S$@<')E<F5L96%S92!;1G)E94)3
-M1%T``$=#0SH@*$=.52D@-"XR+C(@,C`P-S`X,S$@<')E<F5L96%S92!;1G)E
-M94)31%T``$=#0SH@*$=.52D@-"XR+C(@,C`P-S`X,S$@<')E<F5L96%S92!;
-M1G)E94)31%T``$=#0SH@*$=.52D@-"XR+C(@,C`P-S`X,S$@<')E<F5L96%S
-M92!;1G)E94)31%T``$=#0SH@*$=.52D@-"XR+C(@,C`P-S`X,S$@<')E<F5L
-M96%S92!;1G)E94)31%T``$=#0SH@*$=.52D@-"XR+C(@,C`P-S`X,S$@<')E
-M<F5L96%S92!;1G)E94)31%T``$=#0SH@*$=.52D@-"XR+C(@,C`P-S`X,S$@
-M<')E<F5L96%S92!;1G)E94)31%T``$=#0SH@*$=.52D@-"XR+C(@,C`P-S`X
-M,S$@<')E<F5L96%S92!;1G)E94)31%T``$=#0SH@*$=.52D@-"XR+C(@,C`P
-M-S`X,S$@<')E<F5L96%S92!;1G)E94)31%T``$=#0SH@*$=.52D@-"XR+C(@
-M,C`P-S`X,S$@<')E<F5L96%S92!;1G)E94)31%T``$=#0SH@*$=.52D@-"XR
-M+C(@,C`P-S`X,S$@<')E<F5L96%S92!;1G)E94)31%T``$=#0SH@*$=.52D@
-M-"XR+C(@,C`P-S`X,S$@<')E<F5L96%S92!;1G)E94)31%T``$=#0SH@*$=.
-M52D@-"XR+C(@,C`P-S`X,S$@<')E<F5L96%S92!;1G)E94)31%T``$=#0SH@
-M*$=.52D@-"XR+C(@,C`P-S`X,S$@<')E<F5L96%S92!;1G)E94)31%T``$=#
-M0SH@*$=.52D@-"XR+C(@,C`P-S`X,S$@<')E<F5L96%S92!;1G)E94)31%T`
-M`$=#0SH@*$=.52D@-"XR+C(@,C`P-S`X,S$@<')E<F5L96%S92!;1G)E94)3
-M1%T``$=#0SH@*$=.52D@-"XR+C(@,C`P-S`X,S$@<')E<F5L96%S92!;1G)E
-M94)31%T``$=#0SH@*$=.52D@-"XR+C(@,C`P-S`X,S$@<')E<F5L96%S92!;
-M1G)E94)31%T``$=#0SH@*$=.52D@-"XR+C(@,C`P-S`X,S$@<')E<F5L96%S
-M92!;1G)E94)31%T``"YS>6UT86(`+G-T<G1A8@`N<VAS=')T86(`+G)E;&$N
-M=&5X=``N<F5L82YR;V1A=&$`+G)O9&%T82YS='(Q+C@`+G)O9&%T82YS='(Q
-M+C$`+G)E;&$N9&%T80`N<F5L82YE:%]F<F%M90`N8G-S`"YC;VUM96YT````
-M````````````````````````````````````````````````````````````
-M````````````````````````````````(`````$````&````````````````
-M````0``````````?&`4`````````````````$````````````````````!L`
-M```$`````````````````````````-B+!@``````N,0!```````.`````0``
-M``@`````````&``````````K`````0````(```````````````````!@&`4`
-M`````'`H```````````````````@````````````````````)@````0`````
-M````````````````````D%`(````````70````````X````#````"```````
-M```8`````````#,````!````,@```````````````````-!`!0``````O`P`
-M``````````````````@``````````0````````!"`````0```#(`````````
-M``````````",304``````"H$```````````````````!``````````$`````
-M````5@````$````#````````````````````P%$%``````#0#0``````````
-M````````(````````````````````%$````$````````````````````````
-M`)"M"```````6!0````````.````!P````@`````````&`````````!A````
-M`0````(```````````````````"07P4``````%"<```````````````````(
-M````````````````````7`````0`````````````````````````Z,$(````
-M``!(8P````````X````)````"``````````8`````````&L````(`````P``
-M`````````````````.#[!0``````8`4``````````````````"``````````
-M``````````!P`````0````````````````````````#@^P4``````%`'````
-M```````````````!````````````````````$0````,`````````````````
-M````````,`,&``````!Y`````````````````````0``````````````````
-M``$````"`````````````````````````+`'!@``````0$0````````/````
-M=P(```@`````````&``````````)`````P````````````````````````#P
-M2P8``````.<_```````````````````!````````````````````````````
-M``````````````````````````````,``0``````````````````````````
-M``,``@````````````````````````````,``P``````````````````````
-M``````,`!`````````````````````````````,`!0``````````````````
-M``````````,`!@````````````````````````````,`!P``````````````
-M``````````````,`"`````````````````````````````,`"0``````````
-M``````````````````,`"@````````````````````````````,`"P``````
-M``````````````````````,`#`````````````````````````````,`#0``
-M``````````````````````````,`#@````````````````````````````,`
-M#P```````````````````````0````(``0!@_P```````*<`````````%0``
-M``(``0"P`@```````#8`````````(P````(``0#P!`$``````)\"````````
-M-@````(``0"0$0```````'$`````````1`````(``0!@&`````````,&````
-M````9`````(``0`00`$``````.\"````````>P````(``0"0]P````````<`
-M````````B@````(``0``\P```````/@`````````HP````(``0``>@$`````
-M`$L`````````KP````(``0!`A`$``````"<`````````RP````(``0!`_@``
-M`````!L!````````VP````(``0!``````````&X"````````]@````(``0"0
-M=P````````8!````````$`$```(``0"P"````````"@`````````)@$```(`
-M`0!0>@$``````%(`````````-P$```(``0"PGP```````&\$````````5`$`
-M``(``0`PYP```````(``````````;0$```(``0#@!P```````(X`````````
-M@0$```(``0#@"````````"$`````````H0$```(``0#0;0$``````#\`````
-M````L0$```(``0"0'@```````%4+````````S`$```(``0#`D@$``````'<`
-M````````V0$```(``0`0!0```````#``````````]P$```(``0#P@P$`````
-M`!T`````````$@(```(``0#0>@$``````!(`````````*P(```(``0!`J0``
-M`````"H`````````1@(```(``0`P`P```````$8`````````5@(```(``0``
-MCP$```````D#````````:`(```(``0#0J````````#$`````````@P(```(`
-M`0`@_````````%\`````````DP(```(``0"0T@```````(8`````````KP(`
-M``(``0#0I````````!P!````````S`(```(``0"@D0```````&<!````````
-M[0(```(``0"0^````````),``````````P,```(``0`0D0```````(L`````
-M````'@,```(``0!`F@````````D!````````1@,```(``0#PA0$``````)H`
-M````````9@,```(``0"@T````````.H!````````>0,```(``0!`E@``````
-M``\!````````FP,```(``0#PA@$``````!<`````````O@,```(``0!PE```
-M`````$4!````````W@,```(``0!P?@$``````"\!````````^@,```(``0"@
-MSP```````/(`````````$`0```(``0"0PP```````*,#````````*`0```$`
-M`P#@$@```````!L`````````,P0```(``0`0``$``````"H!````````0@0`
-M``(``0!P<P````````X`````````7@0```(``0#`10$``````.H#````````
-M=00```(``0`PL````````"P`````````B00```(``0#`<P$``````%(`````
-M````F@0```(``0"P1@```````.H`````````O`0```(``0"P>@$``````!@`
-M````````U`0```(``0"`XP```````"D`````````]`0```(``0"PWP``````
-M`!H`````````#04```(``0"@=`$``````/4$````````'04```(``0!@=`$`
-M`````#\`````````+P4```(``0`04P$``````*\`````````1`4```(``0#0
-MW0```````#0!````````704```(``0"`A0```````'<"````````?04```(`
-M`0!@?0$``````"``````````B@4```(``0#@<@```````($`````````J`4`
-M``(``0#0`P````````P`````````N04```(``0#@!````````"<`````````
-MS04```(``0`@TP```````(4!````````W@4```(``0!@:@$``````$L`````
-M````[04```(``0`P"0```````&,``````````08```(``0``B````````!$%
-M````````%@8```(``0#@C0```````%P`````````*P8```(``0#@"@``````
-M`%`!````````/P8```(``0!`R````````.H`````````8P8```(``0``````
-M`````"P`````````@08```(``0"P$@```````%\`````````F`8```(``0`0
-MV@```````(D"````````J@8```(``0`0XP```````&X`````````N08```(`
-M`0!`X@```````,L`````````U`8```(``0!0<@$``````%(`````````Y`8`
-M``$`"P!@`````````(``````````Z@8```(``0`@I````````%8`````````
-M!P<```(``0#P>0```````(P+````````(@<```(``0`0BP$``````%4!````
-M````4`<```(``0#`!0```````-P!````````;0<```(``0#`Q`$``````)H`
-M````````?0<```(``0`@=`$``````#<`````````D`<```(``0"@J```````
-M`"H`````````JP<```(``0!@+P```````.\#````````RP<```(``0#`N`$`
-M`````*$#````````Y@<```(``0"`G@```````"P!````````"P@```(``0"@
-M"0```````%(`````````'@@```(``0#@`P```````"(`````````,0@```(`
-M`0"0J0```````"H`````````1@@```(``0!`K````````$D`````````5P@`
-M``(``0`0O0```````*D`````````>0@```(``0"PYP```````!4)````````
-MB@@```(``0``+````````%T#````````H@@```(``0!@;````````'$&````
-M````P`@```(``0!PK@```````"H`````````W`@```(``0!0,P```````,,)
-M````````_`@```(``0#PL0```````#X`````````$0D```(``0#`3@$`````
-M``$"````````)@D```(``0#`7````````%\#````````/0D```(``0!`C@``
-M`````%\`````````6@D```(``0`0`@$``````/$`````````=0D```(``0!0
-MSP```````"``````````C`D```(``0"PL0```````#X`````````I`D```(`
-M`0"0K0```````"X`````````O0D```(``0!0;0$``````#<`````````S0D`
-M``(``0"@!P```````#X`````````V0D```(``0!@WP```````"8`````````
-M\PD```(``0!PN0```````*@`````````#@H```(``0#0RP```````'T!````
-M````)0H```(``0"0A@$``````%P`````````2`H```(``0!`?0$``````!X`
-M````````7`H```(``0"`!0```````#,`````````<`H```(``0!PJ0``````
-M`"``````````B@H```(``0#0WP```````",`````````H@H```(``0`0J0``
-M`````"H`````````NPH```(``0!`%P```````!@!````````V@H```(``0#@
-M#@```````$H!````````YPH```(``0`0$P```````!@"````````!`L```(`
-M`0"`_````````.X`````````&@L```(``0#0@P$``````!P`````````-PL`
-M``(``0!``0$``````,,`````````3`L```(``0#@M@```````%0`````````
-M:`L```(``0`0SP```````#H`````````@`L```(``0#`:P$``````(4!````
-M````D0L```(``0"`N````````/``````````K0L```(``0"PA0$``````$``
-M````````TPL```(``0`0$@```````!D`````````[@L```(``0#PMP``````
-M`(8`````````$PP```(``0`PL@```````$D#````````*`P```(``0#`O0``
-M``````T!````````20P```(``0!`K@```````"8`````````90P```(``0!@
-M#@$``````%D'````````>PP```(``0"@30$``````!@!````````D@P```(`
-M`0#@F0$``````)D`````````I`P```(``0#`K0```````"8`````````N@P`
-M``(``0!0FP```````(,!````````T0P```(``0!0/0$``````+P"````````
-MXPP```(``0#P*0```````!`"````````_PP```(``0`PJ````````"H`````
-M````#PT```(``0!`]@```````&(`````````+0T```(``0!`6P```````+L`
-M````````2@T```(``0"@C@```````-X`````````:@T```(``0!P@@$`````
-M`#L!````````>PT```(``0"0L````````"<`````````E`T```(``0#@(@$`
-M`````*@`````````J`T```(``0`0WP```````$L`````````OPT```(``0!P
-M#````````&T"````````T0T```(``0`P$````````$T`````````Z`T```(`
-M`0`0IP$``````-P$`````````PX```(``0#`E0```````'(`````````%PX`
-M``(``0!PS0```````"H!````````*@X```(``0`0!````````$<`````````
-M.0X```(``0`@/0```````(L)````````40X```(``0"0C0```````$(`````
-M````>PX```(``0!PA`$``````#,!````````G@X```(``0"0@`$``````"(!
-M````````N0X```(``0"@NP```````&T!````````W`X```(``0!P!```````
-M`%P`````````\`X```(``0`@C0```````&\`````````%@\```(``0!@JP``
-M`````-$`````````,`\```(``0``*@$``````$,"````````3P\```(``0`0
-M;@$``````(<`````````80\```(``0"P20$``````.P#````````=@\```(`
-M`0!08`$``````",)````````DP\```(``0``0P$``````+\"````````K`\`
-M``(``0!@Q0$``````"8)````````NP\```(``0!P+`$``````*4)````````
-MV`\```(``0"@W````````"0!````````\`\```(``0!@J````````#0`````
-M````!!````(``0!0X````````%T`````````(1````(``0``X````````$$`
-M````````-1````(``0`0IP```````(<`````````1!````(``0"0K```````
-M`/H`````````5A````(``0"@?P$``````.,`````````<1````(``0!PSP``
-M`````"8`````````A1````(``0"0WP```````!4`````````FQ````(``0`0
-M$0```````'4`````````O1````(``0``]````````,`!````````TA````(`
-M`0#P>@$``````$X"````````Z!````(``0``7````````+X`````````!1$`
-M``(``0"`?0$``````.,`````````'!$```(``0"0;0$``````#D`````````
-M+1$```(``0!P"````````#D`````````01$```(``0`@P0````````0!````
-M````:1$```(``0"@L@$``````-(`````````?A$```(``0"`I````````$H`
-M````````GQ$```$`"P!``````````!P`````````L!$```(``0`@.@$`````
-M`"<#````````S!$```(``0#P`@```````#8`````````WQ$```(``0"@IP``
-M`````"4`````````]Q$```(``0#PF````````$\!````````'!(```(``0`P
-M$@```````$4`````````/!(```(``0#`@P$```````8`````````5!(```(`
-M`0`@]P```````&D`````````8!(```(``0"0(P$``````&D&````````>1(`
-M``(``0!@\@```````)T`````````CQ(```(``0`0DP```````%P!````````
-ML!(```(``0!P_0```````,X`````````Q1(```(``0#`4P$``````(,,````
-M````X1(```(``0!0E0$``````'D#````````^!(```(``0!0+`$``````!0`
-M````````$A,```(``0!`^@```````-$!````````+!,```(``0"``P``````
-M`$8`````````0!,```(``0"09````````,D#````````5Q,```(``0"@]P``
-M`````#,`````````91,```(``0#`J0```````"H`````````?1,```(``0`P
-M^0````````$!````````D1,```(``0#PI0```````!T!````````K!,```(`
-M`0"PX````````)`!````````PQ,```(``0!`MP```````*\`````````WQ,`
-M``(``0"0!P$``````-T"````````_1,```(``0#0O@$``````.D%````````
-M%!0```(``0"@>0$``````%,`````````(10```(``0#0:@$``````$(`````
-M````+A0```(``0"`CP```````#,!````````4A0```(``0!`Y````````$<!
-M````````;10```(``0"0E`$``````+0`````````A10```(``0!@L```````
-M`",`````````H10```(``0!`^````````!\`````````L!0```(``0!@!```
-M`````!``````````PA0```(``0#P8````````)\#````````W10```(``0"`
-M$@```````"$`````````\Q0```(``0`0A`$``````"L`````````#A4```(`
-M`0"0Y0```````!\!````````(A4```(``0`0`P$``````.$`````````-A4`
-M``(``0#@G````````/\`````````4Q4```(``0!@F0$``````'0`````````
-M814```(``0!PC`$``````*<!````````>!4```(``0`0"0```````"``````
-M````BA4```(``0"@S@```````&<`````````G!4```(``0"@F@$``````%``
-M````````K14```(``0``P````````!,!````````UQ4```(``0!@"@``````
-M`'D`````````]!4```(``0#`]0```````'\`````````$18```(``0!@40``
-M`````-()````````*!8```(``0`0AP$``````/$#````````/A8```(``0`@
-MV````````.$!````````3A8```(``0!`!0```````#$`````````918```(`
-M`0`0N`$``````*,`````````@18```(``0#0!`````````T`````````F!8`
-M``$`!P!``````````"@`````````I18```(``0!P'@```````!$`````````
-MPQ8```(``0``!`$``````.$`````````UQ8```(``0"P<@$``````%(`````
-M````YQ8```$`"P````````````0`````````^18```(``0"PY@```````(``
-M````````(A<```(``0"`$````````((`````````01<```(``0!0S0``````
-M`!<`````````41<```(``0#@IP```````$L`````````:A<```(``0"@>```
-M`````$,!````````@Q<```(``0!@:````````/@#````````FQ<```(``0"P
-MU````````&<#````````N1<```(``0`@"P$``````#X#````````TQ<```(`
-M`0`P%0```````.T`````````Z1<```(``0!@J@```````/8``````````!@`
-M``(``0"@1P```````,`)````````%A@```(``0``"@```````%(`````````
-M*A@```(``0#PJ0```````&$`````````/1@```(``0"`LP$``````(P`````
-M````51@```(``0"PXP```````(4`````````<!@```(``0#`D````````$0`
-M````````EQ@```(``0``R@```````+H`````````OA@```(``0#PK0``````
-M`$8`````````V1@```(``0#0O@```````"H!````````_!@```(``0"`<P``
-M``````L$````````'1D```(``0#@G0```````*``````````/!D```(``0!P
-M"@$``````*<`````````4!D```(``0#`@0$``````*L`````````:QD```(`
-M`0#04`$``````#L"````````AQD```(``0`P#````````#\`````````F1D`
-M``(``0"P&@$``````"H(````````M!D```(``0#`L````````.8`````````
-MQAD```(``0#`%@$``````.T#````````V1D```(``0!0EP```````)\!````
-M`````AH```(``0!`QP```````/P`````````*1H```(``0`@:P$``````)4`
-M````````0QH```(``0`0G`$``````%P`````````6QH```(``0"P@P$`````
-M``4`````````<QH```(``0"P]@```````&(`````````D1H```(``0#`R@``
-M``````P!````````IAH```(``0#0IP````````(`````````NQH```(``0`P
-MR0```````,D`````````W1H```(``0`PP@```````%8!`````````0````(`
-M`0`P[P(``````*<`````````-@````(``0`@`@(``````'$``````````!L`
-M``(``0``]0$``````%P`````````>P````(``0!@YP(```````<`````````
-M%AL```(``0`0F0(``````"H`````````,QL```(``0!@LP(``````*,#````
-M````RP````(``0`0[@(``````!L!````````31L```(``0#`7`(``````#$&
-M````````;1L```(``0"0A0(``````'(`````````@QL```(``0`04`,`````
-M`",)````````HAL```(``0"`U@(``````(``````````S1L```(``0"0H`(`
-M`````.8`````````)@$```(``0#`:@,``````%(`````````X1L```(``0#P
-MDP(``````%8``````````!P```(``0`P<0,``````#L!````````$QP```(`
-M`0#`BP,``````%P`````````+1P```(``0"00P,``````',,````````2QP`
-M``(``0#`6`(``````/@#````````91P```(``0"`T`(``````)`!````````
-MH0$```(``0"`70,``````#\`````````S`$```(``0"`@0,``````'<`````
-M````?AP```(``0`0A`,``````'D#````````EQP```(``0!`F0(``````"``
-M````````LQP```(``0!P/0,``````!@!````````S!P```(``0`0]`$`````
-M`$8`````````XAP```(``0"08P(```````X``````````!T```(``0"@]0$`
-M`````#``````````(!T```(``0`0G`(``````$D`````````,QT```(``0#@
-M0@,``````*\`````````2AT```(``0!`G@(``````"H`````````:!T```(`
-M`0!P^0$``````"$`````````BAT```(``0`PF`(``````#0`````````H!T`
-M``(``0#`?0,```````D#````````@P(```(``0#PZP(``````%\`````````
-MM!T```(``0#0=0,``````/$#````````S!T```(``0#`F0(``````&$`````
-M````X1T```(``0``_0$``````&T"````````S`(```(``0!P@0(``````&<!
-M````````[0(```(``0!@Z`(``````),`````````]1T```(``0!`^@(`````
-M`*<``````````P,```(``0#@@`(``````(L`````````"QX```(``0!`:P,`
-M`````!(`````````'@,```(``0`0B@(```````D!````````)AX```(``0`P
-M-P(``````.H`````````2AX```(``0"0^@$``````%(`````````8!X```(`
-M`0"0/@,```````$"````````*`0```$``P`@)@```````"``````````,P0`
-M``(``0#@[P(``````"H!````````=QX```(``0!POP(``````/(`````````
-MCQX```(``0"`Q`(``````&<#````````KQX```(``0`0A@(```````\!````
-M````TQX```(``0"@0`,``````#L"````````\1X```(``0`0U`(``````$<!
-M````````B00```(``0#`8P,``````%(`````````#A\```(``0#`E0(`````
-M`!T!````````*Q\```(``0#@"`(```````,&````````31\```(``0#`IP(`
-M`````(8`````````?04```(``0!P;`,``````"(`````````=!\```(``0#@
-MO@(``````#H`````````CA\```(``0`PH`(``````",`````````K!\```(`
-M`0"0@`(``````$0`````````U1\```(``0"@`@(``````!D`````````\A\`
-M``(``0!`^0$``````"@`````````U`8```(``0!08@,``````%(`````````
-MY`8```$`"P!@`0```````(``````````"B````(``0"0N@(```````P!````
-M````(2````(``0"P?0(``````%P`````````."````(``0"0!@,``````.T#
-M````````32````(``0`0]@$``````#,`````````;0<```(``0`0M`,`````
-M`)H`````````8R````(``0`P<P,``````#,!````````B"````(``0#`B`(`
-M`````$\!````````KR````(``0``L@(``````%8!````````U"````(``0!@
-M3`(``````+X`````````\R````(``0`PFP(``````-$`````````#R$```(`
-M`0!``P(``````%\`````````*"$```(``0#`^0$``````&,`````````/B$`
-M``(``0#PP@(``````(4!````````42$```(``0"0\`$``````"P`````````
-M<2$```(``0"P9P(```````8!````````O0D```(``0`070,``````#<`````
-M````C2$```(``0#P?`(``````&\`````````M2$```(``0#```(``````$T`
-M````````SB$```(``0"P=`,``````)H`````````V0D```(``0`PSP(`````
-M`"8`````````\"$```(``0#@'P(``````.\#````````$B(```(``0`P;0,`
-M`````"\!````````,"(```(``0#0(P(``````,,)````````4B(```(``0#0
-MKP(``````!,!````````?B(```(``0!0C@(``````"P!````````I2(```(`
-M`0#``@(``````$4`````````QR(```(``0#`IP,``````)H#````````2`H`
-M``(``0!0;`,``````"``````````Y"(```(``0!P&@(``````!`"````````
-M`B,```(``0`0`0(``````((`````````H@H```(``0#@F`(``````"H`````
-M````(R,```(``0!@;@,``````.,`````````0",```(``0#0X@(``````/@`
-M````````6R,```(``0#P^@(``````#X#````````V@H```(``0!P_P$`````
-M`$H!````````=R,```(``0"@+0(``````(L)````````D2,```(``0!@SP(`
-M`````!4`````````J2,```(``0#0<@,``````"L`````````QB,```(``0!0
-ME`(``````$H`````````Z2,```(``0`@6@,``````$L`````````^B,```(`
-M`0#`H0(``````#X`````````$20```(``0`0:@,``````%,`````````@`L`
-M``(``0"`6P,``````(4!````````("0```(``0`@T`(``````%T`````````
-M/R0```(``0#0N0(``````+H`````````:"0```(``0#@6@,``````)4`````
-M````A"0```(``0`@K@,``````.D%````````G20```(``0#@R0(``````(\"
-M````````L20```(``0!PJP(``````&T!````````UB0```(``0"@;`,`````
-M`((`````````[R0```(``0"`Y@(``````&(`````````#R4```(``0!@F0(`
-M`````"H`````````)B4```(``0"@^0$``````"``````````.B4```(``0!0
-M[`(``````.X`````````4B4```(``0!@9`,``````#\`````````9B4```(`
-M`0!@]`$```````P`````````>24```(``0"`.0,``````.P#````````D"4`
-M``(``0!`\P$``````#8`````````D@P```(``0"@B`,``````)D`````````
-MN@P```(``0`@BP(``````(,!````````H"4```(``0#0&0,``````$,"````
-M````T0P```(``0`@+0,``````+("````````P24```(``0`@AP(``````)\!
-M````````["4```(``0``H`(``````"P``````````B8```(``0!P]0$`````
-M`"<`````````&"8```(``0`0\0(``````,,`````````+R8```(``0#`:`(`
-M`````$,!````````2B8```(``0#`]`(``````)\"````````7R8```(``0!P
-MP`(``````.H!````````="8```(``0#PL`(```````0!````````GB8```(`
-M`0"@NP(``````'T!````````MR8```(``0"0G0(``````"8`````````SR8`
-M``(``0`0?@(``````%\`````````40X```(``0!@?0(``````$(`````````
-M[B8```(``0#@00(``````+0)````````!R<```(``0`P_@(``````%D'````
-M````'R<```(``0"`UP(``````!4)````````,B<```(``0"0<@,``````!P`
-M````````42<```(``0``^0$``````#D`````````9R<```(``0!`'`,`````
-M`*4)````````AB<```(``0"@K@(``````"H!````````JR<```(``0!@]P(`
-M`````-T"````````3P\```(``0#`70,``````-4`````````RR<```(``0!@
-MG`(``````/H`````````WR<```(``0#@E@(``````(<`````````K`\```(`
-M`0"PM`,``````"8)````````\"<```(``0"`"@,``````"H(````````#2@`
-M``(``0`0T@(``````,L`````````*B@```(``0#P]`$``````!``````````
-M/B@```(``0"@S0(``````#0!````````V`\```(``0!PS`(``````"0!````
-M````62@```(``0"P!0(``````.T`````````<2@```(``0!@H`(``````"<`
-M````````C"@```(``0!P^`$``````(X`````````HB@```(``0!P]`$`````
-M`"(`````````MR@```(``0``<P,``````"<`````````U2@```(``0!0=0,`
-M`````%P`````````^B@```(``0!@:P,``````.@`````````'!$```(``0!0
-M70,``````"<`````````$BD```(``0#0SP(``````$$`````````*"D```(`
-M`0!P?@(``````-X`````````2BD```(``0`0:@(``````)`+````````9RD`
-M``(``0!@$P,``````&D&````````@BD```(``0!PO@(``````&<`````````
-MEBD```(``0#P#@(``````!$`````````:1$```(``0"@H0,``````-(`````
-M````MBD```(``0"@8P(```````L$````````V2D```(``0"0F0(``````"H`
-M````````\RD```(``0"`\P$``````#8`````````""H```(``0#0>0,`````
-M`%4!````````."H```(``0`@OP(``````"``````````42H```(``0"@EP(`
-M``````(`````````5!(```(``0#PY@(``````&D`````````:"H```(``0`@
-M.`(``````,`)````````CQ(```(``0#@@@(``````%P!````````@"H```(`
-M`0!@U0(``````!\!````````EBH```(``0#0XP(``````,`!````````K2H`
-M``(``0"@`P(```````,"````````L!(```(``0!`[0(``````,X`````````
-MS"H```(``0``8P(``````($`````````^!(```(``0`@'`,``````!0`````
-M````["H```(``0`PX@(``````)T`````````!"L```(``0"@=0(``````'<"
-M````````)BL```(``0"0Y0(``````'\`````````12L```(``0#0,@,`````
-M`+\"````````8"L```(``0"P=0,``````!<`````````5Q,```(``0!PYP(`
-M`````#,`````````A2L```(``0"@`0(``````'4`````````J2L```(``0#P
-M^@$``````'D`````````PQ,```(``0`0IP(``````*\`````````R"L```(`
-M`0"PC0(``````*``````````Z2L```(``0`0Y@(``````&(`````````"2P`
-M``(``0!P^P$``````%`!````````'RP```(``0"`H0(``````#X`````````
-M.2P```(``0`0N`(``````.H`````````7RP```(``0"@]`$``````$<`````
-M````(10```(``0"06@,``````$(`````````<"P```(``0!@G0(``````"X`
-M````````BRP```(``0!P<@,```````4`````````I2P```(``0#@+P,`````
-M`.\"````````OBP```(``0#P5`(``````,D#````````;10```(``0!0@P,`
-M`````+0`````````URP```(``0!P:@,``````$L`````````Y2P```(``0"`
-M<`,``````*L`````````H10```(``0`0Z`(``````!\``````````BT```(`
-M`0!@]0$```````T`````````&RT```(``0!0;P,``````"(!````````."T`
-M``(``0!PEP(``````"4`````````4BT```(``0#`G0(``````$8`````````
-M;RT```(``0`0Z@(``````-$!````````BRT```(``0`P^@$``````%(`````
-M````H"T```(``0`PF@(``````/8`````````W10```(``0`0`P(``````"$`
-M````````N2T```(``0"@9`,``````&4%````````RRT```(``0"`TP(`````
-M`(4`````````Z"T```(``0"PI@(``````%0`````````!BX```(``0"0-0,`
-M`````.H#````````'RX```(``0!`A`(``````$4!````````(A4```(``0#@
-M\@(``````.$`````````-A4```(``0"PC`(``````/\`````````4Q4```(`
-M`0`@B`,``````'0`````````02X```(``0``H@(``````$D#````````6"X`
-M``(``0!`J0(``````*@`````````=2X```(``0#@\0(``````/$`````````
-MDBX```(``0"@2P(``````+L`````````L2X```(``0`0#P(``````%4+````
-M````G!4```(``0!@B0,``````%``````````SBX```(``0``F`(``````"H`
-M````````X"X```(``0#0\`$``````&X"````````_2X```(``0!@P@(`````
-M`(8`````````&R\```(``0!0TP(``````"D`````````/2\```(``0"PEP(`
-M`````$L`````````6"\```(``0`@9`,``````#<`````````;2\```(``0"@
-MSP(``````",`````````/A8```(``0#PQP(``````.$!````````AR\```(`
-M`0#P*0,``````"<#````````918```(``0`0IP,``````*,`````````I2\`
-M``(``0#@T@(``````&X`````````MB\```(``0``UP(``````(``````````
-MT2\```(``0"`SP(``````!H`````````["\```(``0#`_`$``````#\`````
-M````PQ8```(``0#0\P(``````.$``````````#````(``0`P^`$``````#X`
-M````````#C````(``0!P=`,``````$``````````UQ8```(``0"P8@,`````
-M`%(`````````YQ8```$`"P```0````````0`````````01<```(``0`@O0(`
-M`````!<`````````-C````(``0#0]0$``````#$`````````3S````(``0!0
-M40(``````)\#````````;#````(``0!0?P(``````#,!````````DC````(`
-M`0"@E`(``````!P!````````L3````(``0!0]@$``````-P!````````T#``
-M``(``0#@K`(``````*D`````````]#````(``0#@S@(``````$L`````````
-M#3$```(``0`@:P,``````!@`````````)S$```(``0`0MP(``````/P`````
-M````4#$```(``0`@30(``````%\#````````:3$```(``0`@>`(``````,$$
-M````````@#$```$`"P!``0```````!P`````````DS$```(``0!0J`(`````
-M`/``````````L3$```(``0"`<@,```````8`````````/1@```(``0"`H@,`
-M`````(P`````````RS$```(``0!PF`(``````"H`````````Z#$```(``0"`
-MCP(``````&\$````````!S(```(``0"`'`(``````%T#````````(3(```(`
-M`0!`O0(``````"H!````````-C(```(``0``Z0(```````$!````````3#(`
-M``(``0"0K0(```````T!````````;S(```(``0"P<@,``````!T`````````
-MC#(```(``0!`OP(``````"8`````````HC(```(``0"P$@,``````*@`````
-M````N#(```(``0`0E@,``````-P$````````U3(```(``0``N0(``````,D`
-M````````^3(```(``0#`\P$``````$8`````````"S,```(``0#`!P(`````
-M`!@!````````+#,```(``0`P>P,``````*<!````````13,```(``0"@F`(`
-M`````#$`````````8C,```(``0`0G@(``````"8`````````@#,```(``0"`
-M%P4``````$\`````````CC,```(``0!P^P,``````*X`````````GC,```(`
-M`0#@"00``````+<*````````N#,```(``0"0"@4``````+@'````````R#,`
-M``(``0`P'@0``````)8`````````V#,```$`"P`0`@````````@`````````
-MZ#,```(``0!P^0,```````P`````````_3,```(``0#@%P0``````&4!````
-M````$C0```(``0`P!04``````&,`````````*C0```$`!P"!`P````````$`
-M````````.C0```(``0!0+P0``````(4`````````2C0```(``0"P_00`````
-M`-4`````````6S0```(``0"0_@0``````)$`````````;S0```(``0`P!@4`
-M`````$@"````````A30```(``0#P)P0``````-H`````````FS0```$`"P`8
-M`@````````0`````````J30```(``0!0_00``````%\`````````P30```(`
-M`0"@U@0``````(8`````````T#0```(``0#03`0``````$$`````````XC0`
-M``(``0"`\`,``````%H!````````]30```(``0#0*`0```````,!````````
-M#34```(``0#@X0,``````$L`````````(34```(``0!0&00``````(4!````
-M````-34```(``0"0%@0``````$H`````````0S4```(``0!`^`,``````&4`
-M````````6#4```(``0``_@,``````&``````````:34```(``0``^`,`````
-M`#$`````````@#4```$`"P`@`@````````$`````````E#4```(``0!P&P0`
-M`````&8`````````KS4```(``0"@%`0``````.\!````````PS4```(``0#@
-M&@0``````(\`````````TS4```(``0`PXP,``````"4`````````W#4```(`
-M`0!@X`,``````'<`````````^#4```(``0"`"`4``````)P`````````#C8`
-M``(``0`@!P0``````%H"````````(38```(``0"0^@0``````!8`````````
-M*C8```(``0#0%P4``````$\`````````.#8```(``0"0!00``````(\!````
-M````5#8```(``0#`2P0``````/,`````````7S8```(``0`P4`0```````@!
-M````````=38```(``0`@B@0``````!X!````````AS8```(``0`03P0`````
-M`!D!````````H#8```(``0"@[P0``````$P`````````L38```(``0"0(@0`
-M`````%4`````````O#8```(``0"0\00```````8$````````S38```(``0#0
-M^0,``````'<`````````XC8```(``0!@_`0``````.D`````````\38```(`
-M`0!@Z`,``````/D`````````!#<``!(``0#PWP,``````!,`````````*S<`
-M`!$`"P`D`@````````$`````````0#<``!``````````````````````````
-M5S<``!(``0!P%P4```````P`````````;C<``!``````````````````````
-M````@3<``!(``0#@X@,``````"@`````````DS<``!(``0!P%@4``````#H`
-M````````HC<``!(``0#@\0,``````,<!````````N3<``!(``0"@Y@,`````
-M`'<`````````T#<``!``````````````````````````Z#<``!(``0``%P4`
-M`````%4``````````3@``!(``0!0X`,```````P`````````&#@``!(``0#@
-M[P,``````)@`````````+S@``!``````````````````````````2C@``!(`
-M`0"0Y`,``````%4`````````63@``!``````````````````````````8#@`
-M`!(``0#PY`,``````-D`````````<S@``!(``0!PX@,``````"L`````````
-MBC@``!(``0!0Z@,``````!4`````````GC@``!(``0!P]`,``````(`!````
-M````M#@``!(``0`P_P0``````!$"````````T3@``!$`"P`<`@````````0`
-M````````Z#@``!(``0!0`04``````-@#`````````CD``!``````````````
-M````````````%SD``!(``0!@Z0,``````%4`````````+3D``!(``0"`_`,`
-M`````&H`````````2#D``!(``0#`3`0```````@`````````8CD``!``````
-M````````````````````=#D``!(``0"P%@4``````$D`````````B3D``!$`
-M"P```@````````@`````````F3D``!(``0"0[P0```````D`````````LCD`
-M`!(``0``Y`,``````(,`````````QSD``!$`"P`E`@````````$`````````
-MWSD``!(``0!PG`$``````!H`````````^CD``!(``0``[P0``````&L`````
-M````$3H``!``````````````````````````*#H``!(``0`@YP,``````%<`
-M````````.SH``!$`"P`(`@````````@`````````2CH``!(``0#0Y0,`````
-M`,,`````````8CH``!(``0"`YP,``````-D`````````<SH``!(``0"P2P0`
-M``````<`````````BSH``!``````````````````````````HCH``!(``0!`
-M400``````"<`````````LCH``!$`"P`C`@````````$`````````SCH``!``
-M````````````````````````X3H``!``````````````````````````]#H`
-M`!$`!P"#`P````````$`````````"#L``!(``0`@Z@,``````!``````````
-M+3L``!(``0#@]@0``````&X#````````.SL``!(``0`@C`,``````!H`````
-M````6#L``!(``0`PZ@,``````!$`````````=#L``!``````````````````
-M````````C#L``!(``0"@]00``````%(`````````H3L``!``````````````
-M````````````MSL``!(``0"@!04``````(,`````````TCL``!(``0!0^@0`
-M`````#8`````````YCL``!``````````````````````````]CL``!``````
-M````````````````````#3P``!(``0!@%P4```````P`````````)#P``!``
-M````````````````````````-SP``!(``0`@XP,``````!``````````4SP`
-M`!(``0#@X`,``````,@`````````;CP``!$`!P"``P````````$`````````
-M@3P``!(``0`0X`,```````P`````````F3P``!$`"P`A`@````````$`````
-M````M#P``!(``0!0$@4``````(<"````````U#P``!(``0!P%04```````,`
-M````````[CP``!(``0!``P0``````/D!````````!3T``!(``0"P\P,`````
-M`+,`````````&ST``!(``0!@XP,``````#X`````````-#T``!``````````
-M````````````````2ST``!(``0`@X`,``````"D`````````8ST``!``````
-M````````````````````=ST``!(``0"@X@,``````#T`````````C3T``!(`
-M`0!0%04``````!,`````````JST``!(``0!`[@,``````/,`````````RST`
-M`!``````````````````````````WST``!``````````````````````````
-M_#T``!(``0`0XP,```````L`````````%CX``!``````````````````````
-M````*3X``!(``0"`[@0``````'0`````````0#X``!``````````````````
-M````````6SX``!(``0!`%04```````(`````````;CX``!(``0#P[P0`````
-M`'$`````````@SX``!(``0"P^`,``````+(`````````FSX``!(``0#@%`4`
-M`````%0`````````N3X``!(``0"PX0,``````"P`````````YSX``!$`!P""
-M`P````````$``````````S\``!(``0#P]0,``````/H`````````&C\``!(`
-M`0!P[P0``````!L`````````+S\``!(``0#`Z0,``````%<`````````3C\`
-M`!``````````````````````````93\``!(``0#@[`,``````%8!````````
-M@C\``!(``0"@XP,``````%\`````````ES\``!(``0"P^@0``````/(`````
-M````M#\``!$`"P`B`@````````$`````````SS\``!(``0#@+P0``````'(`
-M`````````%!-7TES<W5E4F5A9$9A:6Q,960`<C<U,%]486=?26YI=`!R-S4P
-M7U5P9&%T95!H>4EN9F\`<V%S7VAA<VA?861D<@!R-S4P7U9E<FEF>4-O;6UA
-M;F1"969O<F5396YD:6YG`'(W-3!?0VAE8VM$979I8V5#:&%N9V4`36%K94%T
-M=$1E=DEN9F\`<C<U,%]$25-#7T-A;F-E;$1I<V-O=F5R`'(W-3!?0F5E<$]N
-M`'(W-3!?4T-325]!5$%?1FEL;$1A=&%&:65L9`!035]7<FET95)E9U-Y;F,`
-M<C<U,%]30U-)7TUA:V5#86-H94-O;6UA;F0`<C<U,%]#3U)%7TES<W5E4TU0
-M4F5Q=65S=`!R-S4P7TU67UIE<F]-=E)E<75E<W0`:3)C05]W<FET95]B>71E
-M<P!R-S4P7U-%4U]);G1E<FYA;%)E<4-A;&QB86-K`'(W-3!?27-S=65?4F5P
-M;W)T1V5N97)A;`!R-S4P7TU67T1U;7!297%U97-T`'(W-3!?359?26YI=&EA
-M;&EZ951A<F=E=$E$5&%B;&4`<V5T7W!M7V9A:6Q?;&5D`'(W-3!?4')E<&%R
-M94%N9%-E;F1#;VUM86YD`$]D:6Y34$E?4F1P=`!R-S4P7TU67TUA<%1O4W!E
-M8VEF:6-487)G971)1`!R-S4P7U-#4TE?051!7T9I;&Q,0D%#9&(Q,`!R-S4P
-M7U-'4$E/7U=R:71E4F5G:7-T97(`<C<U,%]&<F5E4T%405-C<F%T8VA4;U!O
-M;VP`<C<U,%]486=?1V5T3VYE`'(W-3!?3V1I;E-025]);FET`'(W-3!?1G)E
-M94EN=&5R;F%L4F5Q5&]0;V]L`'=A=&EN9U]C86QL8F%C:P!R-S4P7T-O;7!L
-M971E4F5Q=65S=$%N9%-L;W0`<C<U,%]#;W)E7T=E=%-U<'!O<G1E9$-O=6YT
-M<P!$979I8V5?36%K95!R:79A=&5396YD4V5S4F5Q=65S=`!035]3971&86EL
-M3&5D0V%L;&)A8VL`07-S:6=N16QE;65N1&5S8W)I<'1O<DYA;64`1&5V:6-E
-M7TUA:V5397-%;&5M96YT4W1A='5S4F5Q=65S=%1I;65R`'(W-3!?4T-325]!
-M5$%?5F5R:69Y5')A;G-L871I;VX`<C<U,%]?7W)E;F5W7W1I;65R`'(W-3!?
-M1&5V:6-E7TUA:V5397-28W9$:6%G4F5Q=65S=`!R-S4P7U-#4TE?051!7U-T
-M87)T4W1O<%1R86YS;&%T:6]N`'(W-3!?1&5V:6-E7U=R:71E4V5S0V]N=')O
-M;$1I86<`<C<U,%]31U!)3U]335!297%U97-T7U=R:71E`'(W-3!?1G)E941E
-M=FEC951O4&]O;`!R-S4P7U!O<G1?06)O<G1297%U97-T<P!P<F]D=6-T7VED
-M`%!-7U)E861296=3>6YC`'(W-3!?0V]R95]-;V1U;&5396YD4F5Q=65S=`!R
-M-S4P7T-H96-K5&%R9V5T0VAA;F=E`'(W-3!?1G)E95!O<G14;U!O;VP`:3)C
-M0E]W<FET95]B>71E<P!R-S4P7T-O<F5?26YT97)R=7!T4V5R=FEC95)O=71I
-M;F4`<C<U,%]31U!)3U]296%D4F5G:7-T97(`<C<U,%]$25-#7T=E=$YE9V]T
-M:6%T961,:6YK4F%T90!R-S4P7T-A;&-U;&%T95)O=71E26YD97@`<C<U,%]O
-M9&EN7VEO8W1L`'(W-3!?<V5T7V9A:6Q?;&5D`'(W-3!?4U107T1E=FEC95)E
-M<V5T`'(W-3!?1V5T17AP86YD97)&<F]M4&]O;`!R-S4P7U-!5$%?4$U?2&%N
-M9&QE1&5V:6-E56YP;'5G`%1E<W1?4&EN7U-E=`!R-S4P7T-O<F5?26YT97)N
-M86Q396YD4F5Q=65S=`!R-S4P7U1A9U])<T5M<'1Y`'(W-3!?359?36%P5&%R
-M9V5T240`<C<U,%]?7V%D9%]T:6UE<@!R-S4P7VDR8U]R97-E=`!R-S4P7VUV
-M7V1I<V%B;&5?:&)A`'(W-3!?0V]R95]297%4:6UE;W5T`'(W-3!?1FEN9$%S
-M8VEI3G5M8F5R`'(W-3!?;79?<V5T7U-!4T%D9'(`<C<U,%]%>'!A;F1E<E]3
-M35!297%U97-T7U!H>4-O;G1R;VP`<C<U,%]30U-)7TUA:V5-;V1E4&%G94-A
-M8VAI;F<`<C<U,%]#;W)E7U)E<V5T0VUD4VQO=`!R-S4P7U)E;6]V941E=FEC
-M90!R-S4P7T9I;F149W1.;P!R-S4P7U-T;W)E7T-O;F9I9U)O=71E26YF;P!I
-M,F-!7W)E861?8GET97,`86EN9F\`<C<U,%]#;W)E7TUA:V5$979I8V5297-E
-M=%)E<0!R-S4P7T-O<F5?36]D=6QE26YI=&EA;&EZ90!R-S4P7U-#4TE?051!
-M7U)E861#87!A8VET>51R86YS;&%T:6]N0V%L;&)A8VL`<C<U,%]-5E]3971,
-M0D%A;F1396-T;W)#;W5N=`!O9&EN7V-O<F5?=&EM97(`<C<U,%]S971?9F%I
-M;%]L961S`'(W-3!?1G)E94-O<F5#;VYT97AT5&]0;V]L`'(W-3!?8V]R95]H
-M86YD;&5?=&%S:V9I;&5?97)R;W(`<C<U,%]O9&EN7W-E=%]S<&EN7W5P7VUO
-M9&4`<C<U,%]0;W-T36%K95-E<T5L96UE;G13=&%T=7-297%U97-T`'(W-3!?
-M;79?96YA8FQE7WAM=`!R-S4P7TQI<W1?1V5T1FER<W0`<C<U,%]&<F5E4T53
-M4T)4;U!O;VP`<C<U,%]'9710341E=FEC90!R-S4P7T1E=FEC95]-86ME36]D
-M95-E;&5C=%)E<75E<W0`<C<U,%]$:7-C;W9E<GE330!R-S4P7U-!5$%?17)R
-M;W)(86YD;&EN9P!R-S4P7U-!5$%?4&]R=$AA;F1L94EN=&5R<G5P=`!R-S4P
-M7T=E=$-O<F5#;VYT97AT1G)O;5!O;VP`<C<U,%]305-?2&%N9&QE0V]M<&QE
-M=&5D0V]M;6%N9`!R-S4P7T9R965296=I<W1E<E-E=`!R-S4P7U-!5$%?4&]R
-M=$1E=&5C=`!R-S4P7U!O<G1?2&%N9&QE4&QU9VEN`'(W-3!?07-S:6=N16QE
-M;65N=%-L;W1.=6UB97(`<C<U,%]$979I8V5?27-S=653;V9T4F5S970`<C<U
-M,%]?7U!-7V-A;F-E;%]T:6UE<@!R-S4P7U!-7T9R965296=I<W1E<E-E=`!R
-M-S4P7T=E=%-'0G5F9F5R1G)O;5!O;VP`<V5T7V5M7V9A:6Q?;&5D`'(W-3!?
-M359?0U)#`$=E=%-!5$$V-$M38W)A=&-H1G)O;5!O;VP`<C<U,%]2=6YT:6UE
-M27-S=653;V9T4F5S970`<C<U,%]'971$979I8V5&<F]M4&]O;`!R-S4P7U-#
-M4TE?051!7U-Y;F-#86-H951R86YS;&%T:6]N`%1E<W1?4&EN7TEN:71I86QI
-M>F4`<C<U,%]-5E]'971-87!P961)1`!R-S4P7T9R965335!38W)A=&-H5&]0
-M;V]L`'(W-3!?1FEN9$9R965335!#;VYT97AT`$9R9653051!-C1+4V-R871C
-M:%1O4&]O;`!R-S4P7U-!5$%?4')E<&%R94-O;6UA;F1(96%D97(`;79?<&AY
-M7W)E<V5T`'(W-3!?4T%405](86YD;&5$979I8V55;G!L=6<`<C<U,%]035])
-M<W-U95=R:71E4F5G`'(W-3!?4T-325]!5$%?0VAE8VM#;VYD:71I;VX`<C<U
-M,%]035])<W-U95)E861296<`<C<U,%]'971);G1E<FYA;%)E<49R;VU0;V]L
-M`'(W-3!?1G)E945X<&%N9&5R5&]0;V]L`'-E=%]E;5]F86EL7VQE9',`<C<U
-M,%]2=6YT:6UE27-S=65296%D3&]G17AT`'(W-3!?4T-325]!5$%?4F5A9$-A
-M<&%C:71Y5')A;G-L871I;VX`<C<U,%]D=6UP7W5N87-S;V-I871E9%]F:7,`
-M<C<U,%]$979I8V5?36%K95-T87)T4W1O<%5N:71297%U97-T`'(W-3!?0V]M
-M<&QE=&5297%U97-T`'(W-3!?1&5V:6-E7TUA:V5-;V1E4V5N<V5297%U97-T
+M```&`````````!0````T``````````````!&`````````!0```!,````````
+M```````&`````````!0```!D```````````````&`````````!0```!\````
+M```````````&`````````!0```"4```````````````"`````````!0```"L
+M```````````````/`````````!0```#$```````````````:`````````"0`
+M``#<``````````````"(`````````$$.$$$.&(,#A@(````````4````!`$`
+M````````````!@`````````4````'`$`````````````!@`````````4````
+M-`$`````````````!@`````````4````3`$`````````````!@`````````4
+M````9`$`````````````!@`````````4````?`$`````````````!@``````
+M```4````E`$`````````````$P`````````4````K`$`````````````5```
+M```````4````Q`$`````````````5``````````<````W`$`````````````
+M&@````````!$#A```````"0```#\`0````````````#4`````````$$.$$$.
+M&$0.4(,#A@(````D````)`(`````````````Q00```````!!#A!!#AA$#H`!
+M@P.&`@``'````$P"`````````````'``````````1`X@2HP"@P,<````;`(`
+M````````````&P````````!$#A```````!P```",`@`````````````>````
+M`````$$.$(,"````'````*P"`````````````!X`````````00X0@P(````<
+M````S`(`````````````(`````````!$#A```````"0```#L`@``````````
+M``!\`0```````$0.0%Z/`HX#C02,!88&@P<D````%`,`````````````?`$`
+M``````!$#C!8C@*-`XP$A@6#!@``)````#P#`````````````,T`````````
+M1`X@3HP"A@.#!````````#0```!D`P`````````````,`@```````$(.$$(.
+M&$(.($$.*$$.,(,&A@6,!(T#C@(`````````+````)P#`````````````-P"
+M````````1`Z``5Z/`HX#C02,!88&@P<`````````)````,P#````````````
+M`$T!````````1`XP6(X"C0.,!(8%@P8``"0```#T`P````````````#L````
+M`````$$.$$$.&$0.((,#A@(````<````'`0`````````````'P````````!!
+M#A"#`@```#P````\!`````````````#Q`@```````$(.$$(.&$(.($(.*$$.
+M,$$..$0.4(,'A@:,!8T$C@./`@`````````D````?`0`````````````<P``
+M``````!$#B!.C`*&`X,$````````)````*0$`````````````(\#````````
+M1`Y`7H\"C@.-!(P%A@:#!QP```#,!`````````````"5`````````$0.$```
+M````)````.P$`````````````-@`````````1`X@3HP"A@.#!````````"0`
+M```4!0````````````#5`@```````$(.$$$.&$$.((,$A@.,`@`<````/`4`
+M````````````F@````````!$#B!*A@*#`SP```!<!0````````````!Y!```
+M`````$(.$$(.&$(.($(.*$$.,$$..$0.<(,'A@:,!8T$C@./`@`````````4
+M````G`4`````````````\@$````````D````M`4`````````````?08`````
+M``!$#C!8C@*-`XP$A@6#!@``)````-P%`````````````'X"````````00X0
+M00X81`X@@P.&`@```#P````$!@````````````".`@```````$(.$$(.&$(.
+M($(.*$$.,$$..$0.0(,'A@:,!8T$C@./`@`````````4``````````$``7@0
+M#`<(D`$````````4````'```````````````+``````````4````-```````
+M`````````@`````````\````3```````````````;@(```````!"#A!"#AA"
+M#B!"#BA!#C!!#CA$#E"#!X8&C`6-!(X#CP(`````````%``````````!``%X
+M$`P'")`!````````%````!P``````````````#8`````````%````#0`````
+M`````````#8`````````%````$P``````````````$8`````````%````&0`
+M`````````````$8`````````%````'P```````````````P`````````%```
+M```````!``%X$`P'")`!````````%````!P``````````````"(`````````
+M%````#0``````````````$<`````````%````$P``````````````!``````
+M````%````&0``````````````%P`````````%````'P```````````````T`
+M````````%````)0``````````````"<`````````%````*P`````````````
+M`#``````````%````,0``````````````#$`````````%````-P`````````
+M`````#,`````````%````/0``````````````-P!````````%`````P!````
+M`````````#X`````````'````"0!`````````````(X`````````1`YP````
+M```<````1`$`````````````.0````````!$#A```````!0```!D`0``````
+M```````H`````````!0```!\`0`````````````A`````````!0```"4`0``
+M```````````@`````````!0``````````0`!>!`,!PB0`0```````!0````<
+M``````````````!'`````````!0````T``````````````!2`````````!0`
+M``!,``````````````!2`````````!0```!D``````````````!Y````````
+M`"0```!\``````````````!0`0```````$0.,%2-`HP#A@2#!0`````<````
+MI```````````````/P````````!$#B!*C`*#`SP```#$``````````````!M
+M`@```````$(.$$(.&$(.($(.*$$.,$$..$0.D`&#!X8&C`6-!(X#CP(`````
+M```D````!`$`````````````2@$```````!!#A!!#AA$#B"#`X8"````%```
+M```````!``%X$`P'")`!````````%````!P``````````````$T`````````
+M%````#0``````````````((`````````%````$P``````````````'4`````
+M````%````&0``````````````'$`````````%````'P``````````````!D`
+M````````'````)0``````````````$4`````````1`X0```````<````M```
+M````````````(0````````!$#A```````!P```#4``````````````!?````
+M`````$0.$```````/````/0```````````````,"````````0@X00@X80@X@
+M0@XH00XP00XX1`Y`@P>&!HP%C02.`X\"`````````!P````T`0``````````
+M``#M`````````$0.$```````)````%0!`````````````!,!````````1`XP
+M5(T"C`.&!(,%`````"0```!\`0`````````````8`0```````$(.$$$.&$$.
+M((,$A@.,`@`D````I`$``````````````P8```````!$#D!>CP*.`XT$C`6&
+M!H,''````,P!`````````````!$`````````1`X0```````\````[`$`````
+M````````50L```````!"#A!"#AA"#B!"#BA!#C!!#CA$#I`!@P>&!HP%C02.
+M`X\"````````+````"P"`````````````!`"````````0@X00@X800X@00XH
+M1`XP@P6&!(P#C0(`)````%P"`````````````%T#````````1`Y07H\"C@.-
+M!(P%A@:#!SP```"$`@````````````#O`P```````$(.$$(.&$(.($(.*$$.
+M,$$..$0.8(,'A@:,!8T$C@./`@`````````D````Q`(`````````````PPD`
+M``````!$#F!>CP*.`XT$C`6&!H,'/````.P"`````````````"4)````````
+M0@X00@X80@X@0@XH00XP00XX1P[@`8,'A@:,!8T$C@./`@```````"0````L
+M`P````````````#X`````````$$.$$$.&$0.((,#A@(````\````5`,`````
+M````````P@D```````!"#A!"#AA"#B!"#BA!#C!!#CA$#F"#!X8&C`6-!(X#
+MCP(`````````/````)0#`````````````+0)````````0@X00@X80@X@0@XH
+M00XP00XX1`Z@`8,'A@:,!8T$C@./`@```````"0```#4`P````````````"[
+M`````````$(.$$$.&$$.((,$A@.,`@`T````_`,`````````````O@``````
+M``!"#A!"#AA"#B!!#BA!#C"#!H8%C`2-`XX"`````````#0````T!```````
+M``````!?`P```````$(.$$(.&$(.($$.*$$.,(,&A@6,!(T#C@(`````````
+M'````&P$`````````````,@`````````1`X0```````\````C`0`````````
+M````GP,```````!"#A!"#AA"#B!"#BA!#C!!#CA$#D"#!X8&C`6-!(X#CP(`
+M````````)````,P$`````````````,D#````````1`XP5(T"C`.&!(,%````
+M`#P```#T!`````````````#X`P```````$(.$$(.&$(.($(.*$$.,$$..$0.
+MH`&#!X8&C`6-!(X#CP(````````\````-`4`````````````,08```````!"
+M#A!"#AA"#B!"#BA!#C!!#CA$#F"#!X8&C`6-!(X#CP(`````````'````'0%
+M`````````````($`````````1`X0```````<````E`4`````````````#@``
+M``````!$#A```````!P```"T!0`````````````+!````````$$.$$0.<(,"
+M)````-0%``````````````8!````````1`Y`7H\"C@.-!(P%A@:#!SP```#\
+M!0````````````!#`0```````$(.$$(.&$(.($(.*$$.,$$..$0.4(,'A@:,
+M!8T$C@./`@`````````\````/`8`````````````D`L```````!"#A!"#AA"
+M#B!"#BA!#C!!#CA$#K`!@P>&!HP%C02.`X\"````````+````'P&````````
+M`````'<"````````0@X00@X800X@00XH1`XP@P6&!(P#C0(`/````*P&````
+M`````````,$$````````0@X00@X80@X@0@XH00XP00XX1`ZP`8,'A@:,!8T$
+MC@./`@```````!0``````````0`!>!`,!PB0`0```````!0````<````````
+M``````!O`````````!0````T``````````````!"`````````!0```!,````
+M``````````!<`````````!0```!D``````````````!?`````````!0```!\
+M``````````````#>`````````#0```"4```````````````S`0```````$(.
+M$$(.&$(.($$.*$$.,$0.0(,&A@6,!(T#C@(`````'````,P`````````````
+M`$0`````````00X0@P(````\````[```````````````BP````````!"#A!"
+M#AA"#B!"#BA!#C!!#CA$#D"#!X8&C`6-!(X#CP(`````````)````"P!````
+M`````````&<!````````1`Y07H\"C@.-!(P%A@:#!R0```!4`0``````````
+M``!<`0```````$0.4%Z/`HX#C02,!88&@P<D````?`$`````````````10$`
+M``````!$#D!>CP*.`XT$C`6&!H,''````*0!`````````````'(`````````
+M1`XP2H8"@P,D````Q`$`````````````#P$```````!$#D!>CP*.`XT$C`6&
+M!H,'/````.P!`````````````)\!````````0@X00@X80@X@0@XH00XP00XX
+M1`Y0@P>&!HP%C02.`X\"`````````#P````L`@````````````!/`0``````
+M`$(.$$(.&$(.($(.*$$.,$$..$0.0(,'A@:,!8T$C@./`@`````````D````
+M;`(`````````````"0$```````!$#C!8C@*-`XP$A@6#!@``)````)0"````
+M`````````(,!````````1`X@3HP"A@.#!````````"0```"\`@``````````
+M``#_`````````$0.,%2-`HP#A@2#!0`````\````Y`(`````````````H```
+M``````!"#A!"#AA"#B!"#BA!#C!!#CA$#D"#!X8&C`6-!(X#CP(`````````
+M/````"0#`````````````"P!````````0@X00@X80@X@0@XH00XP00XX1`Y0
+M@P>&!HP%C02.`X\"`````````#P```!D`P````````````!O!````````$(.
+M$$(.&$(.($(.*$$.,$$..$0.8(,'A@:,!8T$C@./`@`````````4````````
+M``$``7@0#`<(D`$````````4````'```````````````5@`````````4````
+M-```````````````%0`````````4``````````$``7@0#`<(D`$````````4
+M````'```````````````'`$````````D````-```````````````'0$`````
+M``!!#A!!#AB#`X8"````````%````%P``````````````(<`````````%```
+M`'0``````````````"4`````````%````(P```````````````(`````````
+M%````*0``````````````$L`````````%````+P``````````````"H`````
+M````%````-0``````````````#0`````````%````.P``````````````"H`
+M````````%`````0!`````````````#$`````````%````!P!````````````
+M`"H`````````%````#0!`````````````"H`````````%````$P!````````
+M`````"``````````%````&0!`````````````"H`````````%````'P!````
+M`````````"H`````````%````)0!`````````````&$`````````%````*P!
+M`````````````/8`````````%````,0!`````````````-$`````````%```
+M`-P!`````````````$D`````````+````/0!`````````````/H`````````
+M0@X00@X800X@00XH@P6&!(P#C0(`````'````"0"`````````````"X`````
+M````1`X0```````<````1`(`````````````)@````````!$#A```````!P`
+M``!D`@````````````!&`````````$0.$```````'````(0"````````````
+M`"8`````````1`X0```````<````I`(`````````````*@````````!$#A``
+M`````#P```#$`@````````````"(`0```````$(.$$(.&$(.($(.*$$.,$$.
+M.$0.0(,'A@:,!8T$C@./`@`````````<````!`,`````````````+```````
+M``!$#A```````!0````D`P`````````````C`````````!0````\`P``````
+M```````G`````````"0```!4`P````````````#F`````````$(.$$$.&$$.
+M((,$A@.,`@`<````?`,`````````````/@````````!$#B!*A@*#`QP```"<
+M`P`````````````^`````````$0.($J&`H,#)````+P#`````````````$D#
+M````````00X000X81`X@@P.&`@```"0```#D`P````````````!9`0``````
+M`$$.$$$.&$0.((,#A@(````<````#`0`````````````5`````````!$#B!*
+MA@*#`R0````L!`````````````"O`````````$0.($Z,`H8#@P0````````D
+M````5`0`````````````A@````````!$#B!.C`*&`X,$````````)````'P$
+M`````````````/``````````1`Y`7H\"C@.-!(P%A@:#!R0```"D!```````
+M``````"H`````````$0.,%2-`HP#A@2#!0`````D````S`0`````````````
+M?@$```````!!#A!!#AA$#B"#`X8"````)````/0$`````````````&T!````
+M````1`XP6(X"C0.,!(8%@P8``"0````<!0````````````"I`````````$0.
+M($Z,`H8#@P0````````D````1`4`````````````#0$```````!$#C!4C0*,
+M`X8$@P4`````)````&P%`````````````"H!````````1`Y`7H\"C@.-!(P%
+MA@:#!R0```"4!0`````````````3`0```````$0.,%B.`HT#C`2&!8,&```D
+M````O`4`````````````!`$```````!$#C!8C@*-`XP$A@6#!@``)````.0%
+M`````````````%8!````````1`Y`7H\"C@.-!(P%A@:#!SP````,!@``````
+M``````"C`P```````$(.$$(.&$(.($(.*$$.,$$..$0.0(,'A@:,!8T$C@./
+M`@`````````D````3`8`````````````_`````````!$#D!>CP*.`XT$C`6&
+M!H,')````'0&`````````````.H`````````1`Y`7H\"C@.-!(P%A@:#!R0`
+M``"<!@````````````#)`````````$0.,%B.`HT#C`2&!8,&```D````Q`8`
+M````````````N@````````!$#C!4C0*,`X8$@P4`````)````.P&````````
+M``````P!````````00X000X81`X@@P.&`@```"0````4!P````````````!]
+M`0```````$0.($Z,`H8#@P0````````<````/`<`````````````%P``````
+M``!!#A"#`@```"0```!<!P`````````````J`0```````$0.($Z,`H8#@P0`
+M```````D````A`<`````````````9P````````!!#A!!#AA$#B"#`X8"````
+M'````*P'`````````````#H`````````00X0@P(````<````S`<`````````
+M````(`````````!!#A"#`@```!P```#L!P`````````````F`````````$$.
+M$(,"````)`````P(`````````````/(`````````1`XP5(T"C`.&!(,%````
+M`"0````T"`````````````#J`0```````$0.,%2-`HP#A@2#!0`````D````
+M7`@`````````````A@````````!!#A!!#AA$#B"#`X8"````)````(0(````
+M`````````(4!````````00X000X81`X@@P.&`@```#P```"L"```````````
+M``!G`P```````$(.$$(.&$(.($(.*$$.,$$..$0.8(,'A@:,!8T$C@./`@``
+M```````L````[`@`````````````X0$```````!"#A!"#AA!#B!!#BA$#C"#
+M!88$C`.-`@`\````'`D`````````````CP(```````!"#A!"#AA"#B!"#BA!
+M#C!!#CA$#D"#!X8&C`6-!(X#CP(`````````)````%P)`````````````"0!
+M````````1`XP5(T"C`.&!(,%`````"0```"$"0`````````````T`0``````
+M`$$.$$$.&$0.((,#A@(````D````K`D`````````````2P````````!"#A!!
+M#AA$#B"#`XP"````'````-0)`````````````"8`````````1`X0```````4
+M``````````$``7@0#`<(D`$````````4````'```````````````%0``````
+M```4````-```````````````&@`````````4````3```````````````(P``
+M```````4````9```````````````00`````````4````?```````````````
+M70`````````4````E```````````````D`$````````L````K```````````
+M````RP````````!"#A!"#AA!#B!!#BB#!88$C`.-`@`````L````W```````
+M````````;@````````!"#A!"#AA!#B!!#BA$#C"#!88$C`.-`@`<````#`$`
+M````````````*0````````!!#A"#`@```!P````L`0````````````"%````
+M`````$0.$```````+````$P!`````````````$<!````````0@X00@X800X@
+M00XH1`XP@P6&!(P#C0(`'````'P!`````````````!\!````````1`X0````
+M```<````G`$`````````````@`````````!$#A```````!P```"\`0``````
+M``````"``````````$0.$```````/````-P!`````````````!4)````````
+M0@X00@X80@X@0@XH00XP00XX1`YP@P>&!HP%C02.`X\"`````````"0````<
+M`@````````````"#`0```````$0.($Z,`H8#@P0````````4````1`(`````
+M````````G0`````````4````7`(`````````````^``````````L````=`(`
+M````````````P`$```````!"#A!"#AA!#B!!#BA$#C"#!88$C`.-`@`4````
+M``````$``7@0#`<(D`$````````4````'```````````````?P`````````4
+M````-```````````````8@`````````4````3```````````````8@``````
+M```4````9```````````````:0`````````4````?```````````````!P``
+M```````4````E```````````````,P`````````4````K```````````````
+M40`````````4````Q```````````````'P`````````4````W```````````
+M````+@`````````<````]```````````````DP````````!$#A```````"0`
+M```4`0`````````````!`0```````$0.,%2-`HP#A@2#!0`````\````/`$`
+M````````````T0$```````!"#A!"#AA"#B!"#BA!#C!!#CA$#E"#!X8&C`6-
+M!(X#CP(`````````+````'P!`````````````%\`````````0@X00@X800X@
+M00XH1`XP@P6&!(P#C0(`)````*P!`````````````.X`````````1`Y`7H\"
+MC@.-!(P%A@:#!R0```#4`0````````````#.`````````$0.,%B.`HT#C`2&
+M!8,&```<````_`$`````````````&P$```````!!#A"#`@```"0````<`@``
+M``````````"G`````````$0.,%2-`HP#A@2#!0`````D````1`(`````````
+M````*@$```````!!#A!!#AA$#B"#`X8"````)````&P"`````````````,,`
+M````````1`XP6(X"C0.,!(8%@P8``"0```"4`@````````````#Q````````
+M`$0.,%2-`HP#A@2#!0`````\````O`(`````````````X0````````!"#A!"
+M#AA"#B!"#BA!#C!!#CA$#G"#!X8&C`6-!(X#CP(`````````/````/P"````
+M`````````.$`````````0@X00@X80@X@0@XH00XP00XX1`YP@P>&!HP%C02.
+M`X\"`````````#P````\`P````````````"?`@```````$(.$$(.&$(.($(.
+M*$$.,$$..$0.<(,'A@:,!8T$C@./`@`````````T````?`,`````````````
+MW0(```````!"#A!"#AA"#B!!#BA!#C"#!H8%C`2-`XX"`````````"0```"T
+M`P````````````"G`````````$0.,%B.`HT#C`2&!8,&```\````W`,`````
+M````````/@,```````!"#A!"#AA"#B!"#BA!#C!!#CA$#G"#!X8&C`6-!(X#
+MCP(`````````/````!P$`````````````%D'````````0@X00@X80@X@0@XH
+M00XP00XX1`Z@`8,'A@:,!8T$C@./`@```````#P```!<!`````````````#U
+M`````````$(.$$(.&$(.($(.*$$.,$$..$0.0(,'A@:,!8T$C@./`@``````
+M```T````G`0`````````````[0,```````!"#A!"#AA"#B!!#BA!#C!$#F"#
+M!H8%C`2-`XX"`````#P```#4!``````````````J"````````$(.$$(.&$(.
+M($(.*$$.,$$..$0.8(,'A@:,!8T$C@./`@`````````D````%`4`````````
+M````J`````````!!#A!!#AA$#B"#`X8"````)````#P%`````````````&D&
+M````````1`XP6(X"C0.,!(8%@P8``"0```!D!0````````````!#`@``````
+M`$0.($Z,`H8#@P0````````<````C`4`````````````%`````````!$#A``
+M`````"0```"L!0````````````"E"0```````$0.0%Z/`HX#C02,!88&@P<D
+M````U`4`````````````^`,```````!$#C!4C0*,`X8$@P4`````)````/P%
+M`````````````"<#````````1`XP6(X"C0.,!(8%@P8``#P````D!@``````
+M``````"R`@```````$(.$$(.&$(.($(.*$$.,$$..$0.8(,'A@:,!8T$C@./
+M`@`````````\````9`8`````````````[P(```````!"#A!"#AA"#B!"#BA!
+M#C!!#CA'#H`%@P>&!HP%C02.`X\"````````/````*0&`````````````+\"
+M````````0@X00@X80@X@0@XH00XP00XX1P[@!(,'A@:,!8T$C@./`@``````
+M`#P```#D!@````````````#J`P```````$(.$$(.&$(.($(.*$$.,$$..$<.
+M@`6#!X8&C`6-!(X#CP(````````\````)`<`````````````[`,```````!"
+M#A!"#AA"#B!"#BA!#C!!#CA'#O`$@P>&!HP%C02.`X\"````````/````&0'
+M`````````````!@!````````0@X00@X80@X@0@XH00XP00XX1`Y0@P>&!HP%
+MC02.`X\"`````````"P```"D!P`````````````!`@```````$(.$$(.&$$.
+M($$.*$0.,(,%A@2,`XT"`"0```#4!P`````````````[`@```````$0.,%2-
+M`HP#A@2#!0`````\````_`<`````````````KP````````!"#A!"#AA"#B!"
+M#BA!#C!!#CA$#D"#!X8&C`6-!(X#CP(`````````)````#P(````````````
+M`',,````````1`Y`7H\"C@.-!(P%A@:#!R0```!D"``````````````C"0``
+M`````$0.0%Z/`HX#C02,!88&@P<4``````````$``7@0#`<(D`$````````4
+M````'```````````````,``````````4````-```````````````)0``````
+M```D````3```````````````=@````````!!#A!!#AB#`X8"````````'```
+M`'0``````````````$L`````````1`X828P"@P,<````E```````````````
+M&@````````!!#A"#`@```!0```"T``````````````!"`````````"0```#,
+M``````````````"5`````````$$.$$$.&(,#A@(````````D````]```````
+M````````A0$```````!"#A!!#AA!#B"#!(8#C`(`'````!P!````````````
+M`#<`````````1`X0```````<````/`$`````````````)P````````!$#A``
+M`````!P```!<`0`````````````_`````````$0.$```````)````'P!````
+M`````````-4`````````1`XP6(X"C0.,!(8%@P8``"0```"D`0``````````
+M``!/`````````$(.$$$.&$$.((,$A@.,`@`D````S`$`````````````?@``
+M``````!$#C!4C0*,`X8$@P4`````)````/0!`````````````,D`````````
+M1`XP5(T"C`.&!(,%`````#P````<`@`````````````W`@```````$(.$$(.
+M&$(.($(.*$$.,$$..$0.0(,'A@:,!8T$C@./`@`````````<````7`(`````
+M````````4@````````!$#B!*C`*#`QP```!\`@````````````!2````````
+M`$0.($J,`H,#-````)P"`````````````*H`````````0@X00@X80@X@00XH
+M00XP@P:&!8P$C0..`@`````````<````U`(`````````````4@````````!$
+M#B!*C`*#`QP```#T`@`````````````W`````````$0.$```````'````!0#
+M`````````````#\`````````1`X0```````\````-`,`````````````904`
+M``````!"#A!"#AA"#B!"#BA!#C!!#CA$#I`!@P>&!HP%C02.`X\"````````
+M'````'0#`````````````%,`````````1`X0```````<````E`,`````````
+M````2P````````!$#A```````!P```"T`P````````````!2`````````$0.
+M($J,`H,#%``````````!``%X$`P'")`!````````%````!P`````````````
+M`!@`````````%````#0``````````````!(`````````'````$P`````````
+M`````.@`````````00X0@P(````4````;```````````````(``````````4
+M````A```````````````(@`````````<````G```````````````@@``````
+M``!!#A"#`@```#P```"\```````````````O`0```````$(.$$(.&$(.($(.
+M*$$.,$$..$0.0(,'A@:,!8T$C@./`@`````````D````_```````````````
+MXP````````!$#D!>CP*.`XT$C`6&!H,'-````"0!`````````````"(!````
+M````0@X00@X80@X@00XH00XP@P:&!8P$C0..`@`````````D````7`$`````
+M````````JP````````!$#C!4C0*,`X8$@P4`````%``````````!``%X$`P'
+M")`!````````%````!P``````````````#L!````````%````#0`````````
+M``````4`````````%````$P```````````````8`````````%````&0`````
+M`````````!P`````````%````'P``````````````!T`````````%````)0`
+M`````````````"L`````````%````*P``````````````"<`````````)```
+M`,0``````````````#,!````````1`XP6(X"C0.,!(8%@P8``!0```#L````
+M``````````!``````````"0````$`0````````````":`````````$0.*%.-
+M`HP#A@2#!0`````4````+`$`````````````7``````````4````1`$`````
+M````````%P`````````<````7`$`````````````\0,```````!$#A``````
+M`!P```!\`0````````````!5`0```````$$.$$0.,(,"'````)P!````````
+M`````*<!````````00X0@P(````4``````````$``7@0#`<(D`$````````4
+M````'```````````````1``````````4````-```````````````%```````
+M```D````3```````````````90````````!"#A!!#AA!#B"#!(8#C`(`)```
+M`'0```````````````D#````````00X000X81`XP@P.&`@```"0```"<````
+M``````````"F`````````$0.,$^,`H8#@P0````````D````Q```````````
+M````=P````````!!#A!!#AA$#C"#`X8"````/````.P``````````````,0`
+M````````0@X00@X80@X@0@XH00XP00XX1`Y0@P>&!HP%C02.`X\"````````
+M`!P````L`0````````````!]`````````$$.$$0.((,"'````$P!````````
+M`````+0`````````1`XP2H8"@P,D````;`$`````````````>0,```````!$
+M#F!>CP*.`XT$C`6&!H,'%``````````!``%X$`P'")`!````````%````!P`
+M``````````````8`````````%````#0``````````````$8`````````%```
+M`$P```````````````8`````````%````&0```````````````8`````````
+M%````'P```````````````8`````````%````)0``````````````'0`````
+M````%````*P``````````````)D`````````%````,0```````````````(`
+M````````%````-P```````````````@`````````%````/0`````````````
+M`%``````````%`````P!``````````````8`````````%````"0!````````
+M`````/0`````````%````#P!`````````````#(`````````'````%0!````
+M`````````#P`````````1`X828P"@P,4````=`$`````````````$P``````
+M```4````C`$`````````````7``````````4````I`$`````````````7```
+M```````<````O`$`````````````&@````````!$#A```````"0```#<`0``
+M``````````#4`````````$$.$$$.&$0.4(,#A@(````\````!`(`````````
+M````.08```````!"#A!"#AA"#B!"#BA!#C!!#CA$#J`!@P>&!HP%C02.`X\"
+M````````'````$0"`````````````'``````````1`X@2HP"@P,<````9`(`
+M````````````&P````````!$#A```````!P```"$`@`````````````>````
+M`````$$.$(,"````'````*0"`````````````!X`````````00X0@P(````<
+M````Q`(`````````````(`````````!$#A```````"0```#D`@``````````
+M``"!`0```````$0.0%Z/`HX#C02,!88&@P<D````#`,`````````````W`0`
+M``````!$#E!>CP*.`XT$C`6&!H,')````#0#`````````````#4$````````
+M1`YP7H\"C@.-!(P%A@:#!R0```!<`P````````````#(`````````$0.($Z,
+M`H8#@P0````````D````A`,`````````````DP$```````!$#C!8C@*-`XP$
+MA@6#!@``'````*P#`````````````-(`````````00X0@P(````D````S`,`
+M````````````C`````````!!#A!!#AA$#B"#`X8"````)````/0#````````
+M`````.P`````````00X000X81`X@@P.&`@```!P````<!``````````````?
+M`````````$$.$(,"````/````#P$`````````````/$"````````0@X00@X8
+M0@X@0@XH00XP00XX1`Y0@P>&!HP%C02.`X\"`````````"0```!\!```````
+M``````"C`````````$0.($Z,`H8#@P0````````D````I`0`````````````
+MF@,```````!$#E!>CP*.`XT$C`6&!H,')````,P$`````````````'D!````
+M````1`XP5(T"C`.&!(,%`````"0```#T!``````````````Q`0```````$0.
+M8$^,`H8#@P0````````\````'`4`````````````Z04```````!"#A!"#AA"
+M#B!"#BA!#C!!#CA$#D"#!X8&C`6-!(X#CP(`````````'````%P%````````
+M`````)H`````````1`X@2H8"@P,L````?`4`````````````)@D```````!"
+M#A!!#AA!#B!$#E"#!(8#C`(````````\````K`4`````````````>00`````
+M``!"#A!"#AA"#B!"#BA!#C!!#CA$#G"#!X8&C`6-!(X#CP(`````````)```
+M`.P%`````````````%0"````````0@X000X800X@@P2&`XP"`#0````4!@``
+M```````````)!````````$(.$$(.&$(.($$.*$$.,(,&A@6,!(T#C@(`````
+M````+````$P&`````````````"`$````````0@X00@X800X@00XH@P6&!(P#
+MC0(`````)````'P&`````````````/4#````````0@X000X800X@@P2&`XP"
+M`"0```"D!@````````````!@`@```````$(.$$$.&$$.((,$A@.,`@`D````
+MS`8`````````````T@8```````!$#C!8C@*-`XP$A@6#!@``)````/0&````
+M`````````(X"````````00X000X81`X@@P.&`@```#P````<!P``````````
+M```\`P```````$(.$$(.&$(.($(.*$$.,$$..$0.0(,'A@:,!8T$C@./`@``
+M```````4``````````$``7@0#`<(D`$````````4````'```````````````
+M$P`````````4````-```````````````#``````````4````3```````````
+M````*0`````````4````9```````````````#``````````D````?```````
+M````````=P````````!!#A"#`DH.D`(`````````)````*0`````````````
+M`,@`````````0@X000X8A@.,`D0.((,$`!0```#,```````````````L````
+M`````"0```#D``````````````!+`````````$(.$$$.&(8#C`)##B"#!``<
+M````#`$`````````````>0````````!!#A"#`D<.0!0````L`0``````````
+M```K`````````!0```!$`0`````````````]`````````!P```!<`0``````
+M```````H`````````$$.$(,"````%````'P!``````````````L`````````
+M%````)0!`````````````!``````````%````*P!`````````````"4`````
+M````%````,0!`````````````#X`````````%````-P!`````````````%\`
+M````````)````/0!`````````````(,`````````0@X0C`)$#AB&`T8.((,$
+M`"0````<`@````````````!5`````````$(.$(P"1@X800X@@P2&`P`T````
+M1`(`````````````V0````````!"#A!"#AA"#B!!#BB&!8P$C0..`D0.,(,&
+M`````````"0```!\`@````````````##`````````$$.$(8"1`X8@P-'#B``
+M```<````I`(`````````````AP````````!!#A"#`@```"0```#$`@``````
+M``````!7`````````$$.$(8"1`X81`X@@P,````D````[`(`````````````
+MV0````````!"#A",`D0.&$$.((,$A@,`+````!0#`````````````/D`````
+M````0@X0C0)%#AA!#B"&!(P#1`XH1`XP@P4`'````$0#`````````````%4`
+M````````00X0@P(````D````9`,`````````````5P````````!$#B!)A@.#
+M!$>,`@``````%````(P#`````````````!``````````%````*0#````````
+M`````!$`````````%````+P#`````````````!4`````````-````-0#````
+M`````````&\"````````0@X00@X8C0..`D4.((P$10XH00XP@P:&!0``````
+M```\````#`0`````````````5@$```````!"#A!"#AA"#B!"#BA!#C!!#CB#
+M!X8&C`6-!(X#CP)*#L`!````````+````$P$`````````````/,`````````
+M0@X0C0)%#AB,`T0.((8$1`XH1`XP@P4`)````'P$`````````````)8`````
+M````1`X@2HP"A@-'@P0``````"P```"D!`````````````"8`````````$(.
+M$$(.&$$.((8$C`.-`D0.*$0.,(,%`#P```#4!`````````````!:`0``````
+M`$(.$(\"10X8C@-%#B"-!$4.*$$.,(8&C`5$#CA$#D"#!P`````````T````
+M%`4`````````````QP$```````!"#A!"#AB-`XX"10X@C`1$#BA!#C!$#K`!
+M@P:&!0```"0```!,!0````````````"S`````````$(.$(P"1`X8A@-(#B"#
+M!``D````=`4`````````````@`$```````!$#C!1C`2&!5..`HT#@P8`)```
+M`)P%`````````````/H`````````0@X02`X8A@.,`D<.((,$`!0`````````
+M`0`!>!`,!PB0`0```````!0````<```````````````^`````````!0````T
+M```````````````2`````````!0```!,```````````````K`````````!0`
+M``!D```````````````X`````````!0```!\```````````````\````````
+M`!0```"4```````````````Q`````````!0```"L``````````````!E````
+M`````!0```#$``````````````"R`````````!0```#<```````````````,
+M`````````"0```#T``````````````!(`````````$$.$(8"1`X81`X@@P,`
+M```<````'`$`````````````=P````````!!#A"#`@```!P````\`0``````
+M``````"[`````````$$.$(,"````'````%P!`````````````%L`````````
+M1`X@2H8"@P,D````?`$`````````````K@````````!"#A",`D0.&$$.((,$
+MA@,`%````*0!``````````````4`````````'````+P!`````````````$X`
+M````````1`X@2H8"@P,D````W`$`````````````:@````````!!#A!!#AA$
+M#B"#`X8"````'`````0"`````````````'@`````````1`X@2H8"@P,4````
+M)`(`````````````-P`````````<````/`(`````````````2P````````!!
+M#A"#`@```"0```!<`@````````````!@`````````$$.$(8"1`X8@P-.#B``
+M```L````A`(`````````````.@,```````!$#D!*A@:#!TR/`HX#38T$C`4`
+M```````D````M`(`````````````9P````````!"#A!(#AB&`XP"1`X@@P0`
+M)````-P"`````````````.$`````````00X000X8@P.&`D<.(````!P````$
+M`P````````````!``````````$0.($J,`H,#)````"0#`````````````/P!
+M````````1`Y@38P$A@55C@*#!HT#`!P```!,`P````````````!(````````
+M`$0.($V,`H,#)````&P#`````````````(\!````````1PZ@!%>&`H,#````
+M`````"0```"4`P````````````!:`@```````$$.$$4.&(,#A@)*#J`$```<
+M````O`,`````````````5@````````!!#A"#`@```"P```#<`P``````````
+M``"W"@```````$<.T`97C`6&!F>/`HX#C02#!P```````#P````,!```````
+M``````#_`0```````$(.$(\"2@X80@X@C02.`T4.*$$.,$$..$0.L`&#!X8&
+MC`4````````<````3`0`````````````2@````````!!#A"#`@```"0```!L
+M!`````````````#R`````````$0.($R,`H8#1X,$```````L````E`0`````
+M````````90$```````!"#A!"#AB,`XT"1`X@00XH1`XP@P6&!``L````Q`0`
+M````````````A0$```````!"#A"-`D<.&(P#1`X@00XH1`XP@P6&!``<````
+M]`0`````````````CP````````!!#A"#`@```"0````4!0````````````!F
+M`````````$$.$(8"1`X81`X@@P,````T````/`4`````````````10(`````
+M``!"#A!(#AA"#B!!#BA!#C"#!H8%C`2-`XX"`````````"0```!T!0``````
+M``````"6`````````$(.$(P"2PX800X@@P2&`P`D````G`4`````````````
+M/@$```````!$#B!)@P2&`TB,`@``````)````,0%`````````````/0`````
+M````1`X@288#@P1(C`(``````"0```#L!0````````````!X`0```````$0.
+M,$J,!(8%48,&C@*-`P`4``````````$``7@0#`<(D`$````````4````'```
+M````````````50`````````4````-```````````````'@`````````4````
+M3```````````````0@`````````\````9```````````````M`````````!"
+M#A"/`D4.&(X#10X@0@XH00XP00XX1P[0`8,'A@:,!8T$````````/````*0`
+M``````````````@!````````0@X00@X8C@./`D4.($(.*(P%C01$#C"&!D0.
+M.$<.X`&#!P```````"P```#D``````````````!<`````````$(.$$(.&$$.
+M((8$C`.-`D,.*$<.L`&#!3P````4`0````````````!7`0```````$(.$$(.
+M&$(.($(.*$$.,(8&C`6-!(X#CP)$#CA'#I`"@P<````````4````5`$`````
+M````````4P`````````4````;`$`````````````F@`````````4````A`$`
+M````````````V@`````````4````G`$``````````````P$````````4````
+MM`$`````````````20`````````4````S`$`````````````>0`````````\
+M````Y`$`````````````CP0```````!"#A"/`D4.&(X#10X@C01%#BA!#C!!
+M#CA$#D"#!X8&C`4`````````%````"0"``````````````(`````````%```
+M`#P"`````````````(4`````````'````%0"`````````````'(`````````
+M1`Y````````D````=`(`````````````.@````````!!#A!!#AA$#C"#`X8"
+M````%````)P"`````````````-L`````````)````+0"`````````````($`
+M````````0@X0C`)$#AB&`T0.((,$`"P```#<`@````````````!K````````
+M`$(.$(T"10X8C`-$#B!!#BB#!88$`````!0````,`P````````````!S````
+M`````!0````D`P`````````````6`````````!0````\`P`````````````;
+M`````````!0```!4`P`````````````:`````````!0```!L`P``````````
+M```6`````````!0```"$`P`````````````5`````````!0```"<`P``````
+M```````5`````````!0```"T`P`````````````5`````````!0```#,`P``
+M```````````5`````````!0```#D`P`````````````5`````````!0```#\
+M`P`````````````5`````````!0````4!``````````````8`````````!0`
+M```L!``````````````8`````````!0```!$!``````````````8````````
+M`!0```!<!``````````````8`````````!0```!T!``````````````5````
+M`````!0```",!``````````````H`````````!0```"D!``````````````H
+M`````````!P```"\!``````````````Q`````````$$.$(,"````'````-P$
+M`````````````#$`````````00X0@P(````<````_`0`````````````,0``
+M``````!!#A"#`@```!P````<!0````````````!D`````````$$.$(,"````
+M'````#P%`````````````&(`````````1`X828,#A@(D````7`4`````````
+M````A0````````!$#B!)@P2&`TB,`@``````)````(0%`````````````,T`
+M````````1`XP28,&A@52C@*-`XP$`"0```"L!0````````````"B````````
+M`$0.*$F&!(,%38T"C`,````4````U`4`````````````%0`````````4````
+M[`4`````````````.P`````````D````!`8`````````````H@````````!$
+M#BA)A@2#!4V-`HP#````)````"P&`````````````+4`````````1`XH288$
+M@P5-C0*,`P```"0```!4!@````````````#'`````````$0.*$F&!(,%38T"
+MC`,````D````?`8`````````````VP````````!$#BA)A@2#!4V-`HP#````
+M%````*0&`````````````!@`````````'````+P&`````````````&4`````
+M````1`X8288"@P,<````W`8`````````````90````````!$#AA)A@*#`QP`
+M``#\!@````````````!E`````````$0.&$F&`H,#'````!P'````````````
+M`%T`````````1`X8288"@P,<````/`<`````````````70````````!$#AA)
+MA@*#`QP```!<!P````````````!=`````````$0.&$F&`H,#'````'P'````
+M`````````(8`````````1`X8288"@P,<````G`<`````````````90``````
+M``!$#AA)A@*#`QP```"\!P````````````!E`````````$0.&$F&`H,#)```
+M`-P'`````````````+H`````````1`X@288#@P1(C`(``````!P````$"```
+M``````````!E`````````$0.&$F&`H,#'````"0(`````````````&H`````
+M````1`X8288"@P,<````1`@`````````````9P````````!$#AA)A@*#`QP`
+M``!D"`````````````!I`````````$0.&$F&`H,#%````(0(````````````
+M`!P`````````%````)P(`````````````!@`````````%````+0(````````
+M`````!8`````````'````,P(`````````````+(`````````1`X8288"@P,<
+M````[`@`````````````L@````````!$#AA)A@*#`QP````,"0``````````
+M``!=`````````$0.&$F&`H,#)````"P)`````````````+``````````1`XP
+M28,&A@52C@*-`XP$`"0```!4"0````````````"P`````````$0.,$F#!H8%
+M4HX"C0.,!``<````?`D`````````````5@````````!$#AA)A@*#`Q0```"<
+M"0`````````````H`````````!P```"T"0````````````!9`````````$$.
+M$(,"````'````-0)`````````````*8`````````1`X83H8"@P,4````]`D`
+M````````````/@`````````<````#`H`````````````LP````````!$#AA)
+MA@*#`QP````L"@````````````"2`````````$0.&$F&`H,#)````$P*````
+M``````````X!````````0@X0C`)*#AB&`T<.((,$`!0```!T"@``````````
+M``!N`````````!P```","@````````````!:`````````$$.$(,"````%```
+M`*P*``````````````<`````````'````,0*`````````````/,`````````
+M1`Y````````4````Y`H`````````````"``````````4````_`H`````````
+M````00`````````<````%`L`````````````<`````````!$#B!*C`*#`R0`
+M```T"P````````````#*`````````$0.,$F,!(,&38X"C0-(A@4D````7`L`
+M````````````JP````````!$#B!)A@.#!$B,`@``````+````(0+````````
+M`````!D!````````1`Y`18\"3(P%6H,'C@.-!(8&````````+````+0+````
+M``````````@!````````1`Y`18\"3(P%6H,'C@.-!(8&````````'````.0+
+M`````````````"<`````````10X0@P(````4````!`P`````````````?0``
+M```````4````'`P`````````````,0`````````4````-`P`````````````
+M,0`````````4````3`P`````````````,0`````````4````9`P`````````
+M````,0`````````4````?`P`````````````,0`````````4````E`P`````
+M````````,0`````````4````K`P`````````````,0`````````4````Q`P`
+M````````````,0`````````4````W`P`````````````,0`````````4````
+M]`P`````````````,0`````````4````#`T`````````````,0`````````4
+M````)`T`````````````,0`````````4````/`T`````````````,0``````
+M```4````5`T`````````````,0`````````4````;`T`````````````,0``
+M```````4````A`T`````````````,0`````````4````G`T`````````````
+M,0`````````4````M`T`````````````,0`````````4````S`T`````````
+M````,0`````````4````Y`T`````````````,0`````````4````_`T`````
+M````````)``````````4````%`X`````````````*``````````<````+`X`
+M````````````J`````````!!#A"#`@```!0```!,#@`````````````X````
+M`````"0```!D#@````````````#+`````````$0.($Z,`H8#@P0````````<
+M````C`X`````````````10````````!$#B!*@P.,`BP```"L#@``````````
+M```$`0```````$(.$(P"1`X800X@1P[@`8,$A@,``````!P```#<#@``````
+M``````!-`````````$0.($J&`H,#+````/P.`````````````)P!````````
+M1`Y`2H8&@P=7CP*.`XT$C`4`````````/````"P/`````````````(8!````
+M````0@X00@X8C@./`D4.($(.*$$.,$$..$0.0(,'A@:,!8T$`````````#0`
+M``!L#P````````````#9`````````$(.$$(.&$(.((P$C0..`D0.*$$.,(,&
+MA@4`````````'````*0/`````````````(P`````````00X0@P(````L````
+MQ`\`````````````&@(```````!'#M`!4(,'A@9CCP*.`XT$C`4````````4
+M````]`\`````````````+P`````````\````#!``````````````T```````
+M``!"#A!%#AA"#B"-!(X#CP)%#BA!#C!!#CA'#N`!@P>&!HP%````````%```
+M`$P0`````````````*D`````````)````&00`````````````,``````````
+M1`XP3(8$@P5-C0*,`P```"0```",$`````````````!Y`````````$$.$$,.
+M&(,#A@)*#J`!```D````M!``````````````N`````````!$#C!*C`.&!$V-
+M`H,%````)````-P0`````````````*P`````````1`XP2HX#C`51CP*-!(,&
+M`!P````$$0````````````"6`````````$$.$(,"````)````"01````````
+M`````.8`````````00X000X8@P.&`@```````#P```!,$0````````````#8
+M`````````$(.$$0.&$(.($(.*(P%C02.`X\"1`XP00XX1P[``8,'A@8`````
+M```\````C!$`````````````\P````````!"#A!$#AA"#B!"#BB,!8T$C@./
+M`D0.,$$..$<.P`&#!X8&````````/````,P1`````````````.X`````````
+M0@X01`X80@X@0@XHC`6-!(X#CP)$#C!!#CA'#L`!@P>&!@```````#P````,
+M$@````````````#N`````````$(.$$0.&$(.($(.*(P%C02.`X\"1`XP00XX
+M1P[``8,'A@8````````\````3!(`````````````[@````````!"#A!$#AA"
+M#B!"#BB,!8T$C@./`D0.,$$..$<.P`&#!X8&````````+````(P2````````
+M`````)X`````````0@X01`X800X@A@2,`XT"1`XH1PZP`8,%'````+P2````
+M`````````$,`````````00X0@P(````D````W!(`````````````K0``````
+M``!!#A"&`D8.&$<.H`&#`P``'`````03`````````````$T`````````1`X@
+M2HP"@P,D````)!,`````````````$P$```````!!#A!(#AB#`X8"1PX@````
+M%````$P3`````````````"L`````````-````&03`````````````,0`````
+M````0@X00@X80@X@00XHA@6,!(T#C@)$#C!$#G"#!@`````D````G!,`````
+M````````GP$```````!$#C!)C`2#!E*.`HT#A@4`%````,03````````````
+M``\`````````'````-P3`````````````!@`````````1`X0```````<````
+M_!,`````````````&`````````!$#A```````!P````<%``````````````C
+M`````````$0.$```````+````#P4`````````````',`````````0@X0C0)%
+M#AA!#B!!#BA$#C"#!88$C`,`'````&P4`````````````!L`````````1`X0
+M```````<````C!0`````````````B0````````!$#B!*@P.&`AP```"L%```
+M``````````!'`````````$0.($J#`XP"'````,P4`````````````!L`````
+M````1`X0```````<````[!0`````````````&P````````!$#A```````!P`
+M```,%0````````````!2`````````$$.$(,"````)````"P5````````````
+M`#L`````````00X000X81`X@@P.&`@```"0```!4%0`````````````[````
+M`````$$.$$$.&$0.((,#A@(````D````?!4`````````````-P````````!!
+M#A!!#AA$#B"#`X8"````)````*05`````````````#<`````````00X000X8
+M1`X@@P.&`@```"0```#,%0`````````````W`````````$$.$$$.&$0.((,#
+MA@(````D````]!4`````````````-0````````!!#A!!#AA$#B"#`X8"````
+M)````!P6`````````````&0`````````00X0A@)+#AA$#B"#`P```#P```!$
+M%@`````````````V`0```````$(.$$(.&$(.($(.*$$.,(8&C`6-!(X#CP)$
+M#CA'#M`!@P<````````D````A!8`````````````-P,```````!$#C!*C`.#
+M!4V&!(T"````'````*P6`````````````!L`````````00X0@P(````<````
+MS!8`````````````&P````````!!#A"#`@```"0```#L%@````````````!-
+M`0```````$0.,%2,`XT"A@2#!0`````D````%!<`````````````9```````
+M``!!#A!!#AB#`X8"1PYP````)````#P7`````````````,H!````````0@X0
+MC`)+#AA!#B"#!(8#`#P```!D%P`````````````B`P```````$(.$$(.&$(.
+M((T$C@./`D4.*$$.,(8&C`5$#CA'#N`$@P<````````L````I!<`````````
+M````B@$```````!"#A!$#AB,`XT"1`X@00XH1PZP`8,%A@0L````U!<`````
+M````````3@$```````!"#A"-`D<.&$$.($$.*$<.L`&#!88$C`,D````!!@`
+M````````````A@````````!$#B!)@P2,`TB-`@``````'````"P8````````
+M`````#D`````````00X0@P(````<````3!@`````````````-@````````!!
+M#A"#`@```!P```!L&`````````````#=`@```````$$.$(,"````%````(P8
+M`````````````)`!````````%````*08`````````````"D`````````'```
+M`+P8`````````````!X!````````1`X@2H,#A@(L````W!@`````````````
+MC`@```````!"#A!"#AB,`XT"1`X@00XH1`XP@P6&!``D````#!D`````````
+M````SP(```````!!#A"&`D0.&$0.((,#````-````#09`````````````-8`
+M````````0@X00@X80@X@C`2-`XX"1`XH00XP@P:&!0`````````D````;!D`
+M````````````/@,```````!$#G!*A@2#!4V-`HP#````)````)09````````
+M`````.``````````1`Y`2H8$@P5-C0*,`P```!P```"\&0````````````!M
+M`````````$$.$(,"````/````-P9`````````````*\!````````0@X00@X8
+MC@./`D4.($(.*(P%C01$#C!!#CA'#M`$@P>&!@```````"0````<&@``````
+M``````"%`0```````$0.,$J&!(,%38T"C`,````\````1!H`````````````
+M2`\```````!"#A!"#AA"#B!"#BA!#C"&!HP%C02.`X\"1`XX1P[``8,'````
+M````)````(0:`````````````&P`````````00X000X8@P.&`D<.(````"0`
+M``"L&@`````````````-`0```````$$.$(8"1`X81P[``8,#```D````U!H`
+M````````````30````````!!#A"&`D8.&$0.((,#````+````/P:````````
+M`````+@`````````0@X00@X800X@00XH1`XP@P6&!(P#C0(`+````"P;````
+M`````````$L"````````0@X01PX8C`.-`D0.((8$1`XH1P[P`8,%+````%P;
+M`````````````!`#````````1`Y`2HT$C`57CP*.`X8&@P<`````````)```
+M`(P;`````````````!0"````````1P[P`56,`X,%4XT"A@0``"P```"T&P``
+M``````````"6`````````$(.$(T"10X800X@00XH1`XP@P6&!(P#`!P```#D
+M&P````````````!4`````````$0.($V,`H,#'`````0<`````````````&``
+M````````00X0@P(````<````)!P`````````````$`(```````!!#A"#`@``
+M`"P```!$'`````````````#X!@```````$0.8$B,!5^/`HT$C@.&!H,'````
+M`````"P```!T'``````````````/!````````$0.8$V&!H,'6HX#C02,!8\"
+M`````````"0```"D'`````````````!/`````````$0.($F,`X,$2(T"````
+M```D````S!P`````````````=P````````!$#B!)A@.#!$B,`@``````)```
+M`/0<`````````````'<`````````1`X@288#@P1(C`(``````"0````<'0``
+M``````````!/`````````$0.($F,`X,$2(T"```````D````1!T`````````
+M````>0````````!$#B!)A@.#!$B,`@``````)````&P=`````````````'D`
+M````````1`X@288#@P1(C`(``````"P```"4'0````````````"&````````
+M`$(.$(T"10X800X@A@2,`T0.*$0.,(,%`"0```#$'0````````````!9````
+M`````$$.$$$.&(,#A@)'#B`````D````[!T`````````````Y0````````!!
+M#A!!#AB#`X8"1PX@````)````!0>`````````````/,`````````00X0A@)$
+M#AA$#B"#`P```!P````\'@````````````"2`````````$0.($J&`H,#)```
+M`%P>`````````````,D`````````1`X@28P"@P1(A@,``````!P```"$'@``
+M```````````M`````````$0.$```````-````*0>`````````````-D`````
+M````0@X00@X80@X@00XH00XP@P:&!8P$C0..`@`````````\````W!X`````
+M````````20$```````!"#A!$#AA"#B!"#BB,!8T$C@./`D0.,$$..$0.0(,'
+MA@8`````````+````!P?`````````````,(!````````0@X000X800X@@P2&
+M`XP"1PZ``0``````-````$P?`````````````!H!````````0@X01`X80@X@
+M00XH00XP@P:&!8P$C0..`@`````````<````A!\`````````````.@``````
+M``!!#A"#`@```#0```"D'P`````````````S`0```````$(.$$(.&(T#C@)%
+M#B!!#BA!#C!$#K`!@P:&!8P$````%````-P?``````````````4`````````
+M)````/0?`````````````"4!````````1`XP2HT"C`--A@2#!0```"0````<
+M(`````````````!W`````````$0.($F-`H,$2(P#```````D````1"``````
+M````````A@````````!"#A!(#AB&`XP"1`X@@P0`+````&P@````````````
+M`(L`````````0@X00@X800X@A@2,`XT"1`XH1P[P`8,%)````)P@````````
+M`````(T`````````00X0A@)&#AA$#B"#`P```#P```#$(`````````````#P
+M`@```````$(.$$(.&$(.((T$C@./`D4.*$$.,$$..$0.0(,'A@:,!0``````
+M```T````!"$`````````````T@$```````!"#A!"#AB-`XX"10X@00XH00XP
+M@P:&!8P$`````````#0````\(0````````````#,`0```````$(.$$(.&(T#
+MC@)%#B!!#BA!#C"#!H8%C`0`````````+````'0A`````````````&X#````
+M````0@X0C0)%#AA!#B!!#BA$#G"#!88$C`,`)````*0A`````````````/<`
+M````````0@X000X8A@.,`D0.((,$`"P```#,(0````````````"F````````
+M`$(.$$(.&$$.($$.*(,%A@2,`XT"2@[P`20```#\(0````````````!A`@``
+M`````$(.$$$.&(8#C`)$#B"#!``D````)"(`````````````&P0```````!$
+M#C!%A@12C0*,`X,%````%````$PB`````````````#L`````````'````&0B
+M`````````````$(`````````00X0@P(````D````A"(`````````````7`$`
+M``````!$#D!>CP*.`XT$C`6&!H,')````*PB``````````````0!````````
+M1`XP2H,%C`1-C@*-`P```!0``````````0`!>!`,!PB0`0```````!0````<
+M``````````````#6`````````!P````T``````````````!T`````````$0.
+M&$F&`H,#%````%0``````````````&L`````````%````&P`````````````
+M`!L`````````%````(0```````````````D`````````'````)P`````````
+M`````$P`````````00X0@P(````D````O```````````````<0````````!$
+M#B!%@P-(A@(`````````+````.0``````````````!<!````````0@X00@X8
+M00X@00XH@P6&!(P#C0))#C``+````!0!``````````````8$````````0@X0
+M0@X800X@00XH@P6&!(P#C0)'#C``'````$0!`````````````%(`````````
+M00X0@P(````D````9`$`````````````WP````````!!#A!$#AA$#B"#`X8"
+M````/````(P!`````````````&X#````````0@X0CP)*#AA"#B"-!(X#10XH
+M00XP00XX1`Y0@P>&!HP%`````````!P```#,`0`````````````V````````
+M`$$.$(,"````%``````````!``%X$`P'")`!````````%````!P`````````
+M`````!8`````````+````#0``````````````/(`````````0@X0C0))#AA!
+M#B!!#BB#!88$C`,`````%````&0``````````````#T`````````%````'P`
+M`````````````&8`````````+````)0``````````````.D`````````0@X0
+MC`)$#AB&`T0.((,$1PXP````````'````,0``````````````%\`````````
+M00X0@P)'#B`D````Y```````````````U0````````!"#A",`D0.&$$.((,$
+MA@,`'`````P!`````````````)$`````````00X0@P(````\````+`$`````
+M````````$0(```````!"#A"/`D4.&$(.($(.*$$.,(8&C`6-!(X#1`XX1`Y0
+M@P<`````````-````&P!`````````````-@#````````0@X00@X80@X@00XH
+MA@6,!(T#C@)$#C!'#K`$@P8````D````I`$`````````````8P````````!!
+M#A"&`D4.&$0.((,#````)````,P!`````````````(,`````````0@X000X8
+M00X@@P2&`XP"`"P```#T`0````````````!(`@```````$(.$$(.&$$.((8$
+MC`.-`D0.*$0.,(,%`!P````D`@````````````"<`````````$0.($J&`H,#
+M)````$0"`````````````&@!````````0@X0C`)(#AB&`T4.((,$`"P```!L
+M`@````````````"X!P```````$<.P`1NA@:.`XP%@P=3CP*-!````````"0`
+M``"<`@````````````"'`@```````$$.$(8"1`X81`X@@P,````4````````
+M``$``7@0#`<(D`$````````4````'```````````````5``````````4````
+M-````````````````@`````````4````3```````````````$P`````````4
+M````9````````````````P`````````D````?```````````````X@``````
+M``!"#A",`D0.&$$.((,$A@,`)````*0``````````````#H`````````00X0
+MA@)$#AA$#B"#`P```!P```#,``````````````!)`````````$$.$(,"````
+M'````.P``````````````%4`````````1`X0```````4````#`$`````````
+M````#``````````4````)`$`````````````#``````````4``````````$`
+M`7@0#`<(D`$````````4````'```````````````3P`````````4````-```
+M````````````3P````````````````````!'0T,Z("A'3E4I(#0N,BXQ(#(P
+M,#<P.#,Q('!A=&-H960@6T9R965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P
+M,#<P.#,Q('!A=&-H960@6T9R965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P
+M,#<P.#,Q('!A=&-H960@6T9R965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P
+M,#<P.#,Q('!A=&-H960@6T9R965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P
+M,#<P.#,Q('!A=&-H960@6T9R965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P
+M,#<P.#,Q('!A=&-H960@6T9R965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P
+M,#<P.#,Q('!A=&-H960@6T9R965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P
+M,#<P.#,Q('!A=&-H960@6T9R965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P
+M,#<P.#,Q('!A=&-H960@6T9R965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P
+M,#<P.#,Q('!A=&-H960@6T9R965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P
+M,#<P.#,Q('!A=&-H960@6T9R965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P
+M,#<P.#,Q('!A=&-H960@6T9R965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P
+M,#<P.#,Q('!A=&-H960@6T9R965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P
+M,#<P.#,Q('!A=&-H960@6T9R965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P
+M,#<P.#,Q('!A=&-H960@6T9R965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P
+M,#<P.#,Q('!A=&-H960@6T9R965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P
+M,#<P.#,Q('!A=&-H960@6T9R965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P
+M,#<P.#,Q('!A=&-H960@6T9R965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P
+M,#<P.#,Q('!A=&-H960@6T9R965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P
+M,#<P.#,Q('!A=&-H960@6T9R965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P
+M,#<P.#,Q('!A=&-H960@6T9R965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P
+M,#<P.#,Q('!A=&-H960@6T9R965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P
+M,#<P.#,Q('!A=&-H960@6T9R965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P
+M,#<P.#,Q('!A=&-H960@6T9R965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P
+M,#<P.#,Q('!A=&-H960@6T9R965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P
+M,#<P.#,Q('!A=&-H960@6T9R965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P
+M,#<P.#,Q('!A=&-H960@6T9R965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P
+M,#<P.#,Q('!A=&-H960@6T9R965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P
+M,#<P.#,Q('!A=&-H960@6T9R965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P
+M,#<P.#,Q('!A=&-H960@6T9R965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P
+M,#<P.#,Q('!A=&-H960@6T9R965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P
+M,#<P.#,Q('!A=&-H960@6T9R965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P
+M,#<P.#,Q('!A=&-H960@6T9R965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P
+M,#<P.#,Q('!A=&-H960@6T9R965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P
+M,#<P.#,Q('!A=&-H960@6T9R965"4T1=```N<WEM=&%B`"YS=')T86(`+G-H
+M<W1R=&%B`"YR96QA+G1E>'0`+G)E;&$N<F]D871A`"YR;V1A=&$N<W1R,2XX
+M`"YR;V1A=&$N<W1R,2XQ`"YR96QA+F1A=&$`+G)E;&$N96A?9G)A;64`+F)S
+M<P`N8V]M;65N=```````````````````````````````````````````````
+M````````````````````````````````````````(`````$````&````````
+M````````````0``````````/+`0`````````````````$```````````````
+M`````!L````$`````````````````````````!!G!0``````Z'P!```````.
+M`````0````@`````````&``````````K`````0````(`````````````````
+M``!@+`0``````%`8```````````````````@````````````````````)@``
+M``0`````````````````````````^.,&``````"H.0````````X````#````
+M"``````````8`````````#,````!````,@```````````````````+!$!```
+M````1`T```````````````````@``````````0````````!"`````0```#(`
+M``````````````````#T400``````#H#```````````````````!````````
+M``$`````````5@````$````#````````````````````0%4$``````#0#0``
+M````````````````(````````````````````%$````$````````````````
+M`````````*`=!P``````6!0````````.````!P````@`````````&```````
+M``!A`````0````(````````````````````08P0``````(B)````````````
+M```````(````````````````````7`````0`````````````````````````
+M^#$'```````@6`````````X````)````"``````````8`````````&L````(
+M`````P```````````````````*#L!```````0`4``````````````````"``
+M``````````````````!P`````0````````````````````````"@[`0`````
+M`"<&```````````````````!````````````````````$0````,`````````
+M````````````````Q_($``````!Y`````````````````````0``````````
+M``````````$````"`````````````````````````$#W!```````P#D`````
+M```/````!0(```@`````````&``````````)`````P``````````````````
+M````````,04```````XV```````````````````!````````````````````
+M``````````````````````````````````````,``0``````````````````
+M``````````,``@````````````````````````````,``P``````````````
+M``````````````,`!`````````````````````````````,`!0``````````
+M``````````````````,`!@````````````````````````````,`!P``````
+M``````````````````````,`"`````````````````````````````,`"0``
+M``````````````````````````,`"@````````````````````````````,`
+M"P````````````````````````````,`#```````````````````````````
+M``,`#0````````````````````````````,`#@``````````````````````
+M``````,`#P```````````````````````0````(``0```````````#8`````
+M````#P````(``0!0=````````$4"````````(@````(``0!P#P```````'$`
+M````````,`````(``0!0(````````&X!````````4`````(``0`0N```````
+M`$L`````````7`````(``0`PO@```````"<`````````>`````(``0!@G```
+M`````.D`````````B`````(``0!0$````````!4#````````G`````(``0"P
+M!0```````"@`````````L@````(``0!@N````````%(`````````PP````(`
+M`0#@!````````(<`````````UP````(``0#@!0```````"$`````````]P``
+M``(``0``K@```````#\`````````!P$```(``0!0;0```````+D`````````
+M(`$```(``0#`(0```````$P$````````.P$```(``0"`RP```````'<`````
+M````2`$```(``0!@`@```````#``````````9@$```(``0#@O0```````!T`
+M````````@0$```(``0#@N````````!(`````````F@$```(``0"050``````
+M`"H`````````M0$```(``0"``````````$8`````````Q0$```(``0#`QP``
+M``````D#````````UP$```(``0!@:````````#P`````````\@$```(``0`P
+M;P```````%\``````````@(```(``0#@80```````(,`````````'@(```(`
+M`0`@4P```````"@!````````.P(```(``0"0;P```````(\`````````40(`
+M``(``0"0OP```````)H`````````<0(```(``0`08````````,H!````````
+MA`(```(``0"0P````````!<`````````IP(```(``0!`7P```````,4`````
+M````O0(```(``0!P8@```````!L"````````U0(```$``P"P`@```````!L`
+M````````X`(```(``0"`0P```````"T`````````_`(```(``0"P6```````
+M`"P`````````$`,```(``0#PLP```````%(`````````(0,```(``0"`-0``
+M`````.P`````````0P,```(``0#`N````````!@`````````6P,```(``0#0
+MM````````-X"````````:P,```(``0"0M````````#\`````````?0,```(`
+M`0!PNP```````"``````````B@,```(``0`@`0````````P`````````FP,`
+M``(``0`P`@```````"<`````````KP,```(``0"09````````&,!````````
+MP`,```(``0"`K````````$L`````````SP,```(``0`P!@```````$<`````
+M````XP,```(``0``10```````-P"````````^`,```(``0#`!P```````%`!
+M````````#`0```(``0#P#P```````$L`````````(P0```(``0``9@``````
+M`&`"````````-00```(``0"`L@```````%(`````````100```$`"P!`````
+M`````(``````````2P0```(``0#@1P```````'<(````````9@0```(``0"0
+MQ````````%4!````````E`0```(``0```P```````-P!````````L00```(`
+M`0"`\0```````)H`````````P00```(``0!0M````````#<`````````U`0`
+M``(``0`@*@```````!H!````````]`0```(``0"0Z0```````(\#````````
+M#P4```(``0#@H````````!@`````````)04```(``0"`!@```````%(`````
+M````.`4```(``0`P`0```````"(`````````2P4```(``0!P)P```````*L"
+M````````8P4```(``0!`*P```````',%````````@04```(``0`@60``````
+M`#X`````````E@4```(``0"PH0```````/\!````````JP4```(``0`@/0``
+M`````$D"````````P@4```(``0!P:P```````.D`````````W04```(``0``
+M7P```````"``````````]`4```(``0#@6````````#X`````````#`8```(`
+M`0`P6````````"X`````````)08```(``0#0:````````"8`````````/P8`
+M``(``0!07````````!@!````````5@8```(``0!@6````````$P`````````
+M:08```(``0`PP````````%P`````````C`8```(``0!0NP```````!X`````
+M````H`8```(``0#0`@```````"<`````````M`8```(``0!@50```````"H`
+M````````S08```(``0`0#0```````/$`````````[`8```(``0#`"P``````
+M`$H!````````^08```(``0!P$P```````/$!````````%@<```(``0#`O0``
+M`````!P`````````,P<```(``0#P6@```````%\`````````3P<```(``0!0
+MOP```````$``````````=0<```(``0!`$`````````(`````````D`<```(`
+M`0!@60```````(<!````````I0<```(``0"@:````````"8`````````P0<`
+M``(``0``?````````-\&````````UP<```(``0`0)@```````%8!````````
+M\P<```(``0``50```````"H``````````P@```(``0"0.P```````+@`````
+M````(`@```(``0"`O````````#$!````````,0@```(``0``H0```````*4`
+M````````10@```(``0``:0```````$L`````````7`@```(``0!0"0``````
+M`&T"````````;@@```(``0`0#@```````$T`````````A0@```(``0!PW```
+M`````'P!````````H`@```(``0"070```````/@`````````LP@```(``0!@
+M`0```````$<`````````P@@```(``0#`,````````+T$````````V@@```(`
+M`0"PI0```````.T%````````[P@```(``0!@O@```````.X`````````$@D`
+M``(``0#``0```````%P`````````)@D```(``0#P50````````X!````````
+M0`D```(``0!`K@```````(<`````````4@D```(``0!`BP````````H(````
+M````;PD```(``0`P50```````"X`````````@PD```(``0`@7P```````"``
+M````````EPD```(``0#P#@```````'4`````````N0D```(``0``N0``````
+M`$X"````````SPD```(``0!0/````````,(`````````[`D```(``0"0NP``
+M`````.,``````````PH```(``0#0K0```````"<`````````%`H```(``0!P
+M!0```````#D`````````*`H```(``0!`T@```````!H`````````/0H```(`
+M`0``4P```````!4`````````7@H```(``0!``````````#8`````````<0H`
+M``(``0#0:0```````&D`````````?0H```(``0#0:@```````)\`````````
+MD@H```(``0`0S@```````'D#````````J0H```(``0"@H````````!0`````
+M````PPH```(``0"@=@```````.D!````````W0H```(``0#0`````````$8`
+M````````\0H```(``0#`50```````"H`````````"0L```(``0`0;@``````
+M`!<!````````'0L```(``0!@;````````.P`````````-0L```(``0`@<```
+M`````$("````````4PL```(``0"@[@```````-4"````````:@L```(``0"P
+MMP```````%,`````````=PL```(``0#PK````````$``````````A`L```(`
+M`0!0S0```````+0`````````G`L```(``0#`H````````!@`````````KPL`
+M``(``0"P`0```````!``````````P0L```(``0!P'@```````-0!````````
+MW`L```(``0``'@```````&T`````````\@L```(``0``O@```````"L`````
+M````#0P```(``0!P<@```````.$`````````(0P```(``0#PQ0```````.$`
+M````````.`P```(``0`0!@```````"``````````2@P```(``0"07@``````
+M`&,`````````7`P```(``0!`!P```````'D`````````>0P```(``0!0:0``
+M`````'\`````````E@P```(``0!P-@```````!@%````````K0P```(``0"P
+MP````````-(#````````PPP```(``0"0`@```````#$`````````V@P```(`
+M`0`0Z0```````',`````````]@P```(``0`@`@````````T`````````#0T`
+M``$`!P!``````````"@`````````&@T```(``0!@<P```````.$`````````
+M+@T```(``0#@L@```````%(`````````/@T```$`"P````````````0`````
+M````4`T```(``0!`EP```````!@%````````80T```(``0!@#@```````((`
+M````````@`T```(``0!P70```````!<`````````D`T```(``0"P0P``````
+M`$(!````````J0T```(``0!@4````````)\"````````P0T```(``0"0>```
+M`````&P#````````VPT```(``0``5P```````",!````````\@T```(``0!P
+M%0```````($(````````"`X```(``0#@!@```````%(`````````'`X```(`
+M`0!@T@```````(@`````````-`X```(``0!`0````````#X#````````50X`
+M``(``0"PHP```````/\!````````<0X```(``0`0"0```````#\`````````
+M@PX```(``0#@@P```````%H'````````G@X```(``0`PK0```````)4`````
+M````N`X```(``0#0TP```````%0`````````T`X```(``0!06P```````/P`
+M````````Y0X```(``0!05`````````(`````````^@X```(``0!0G0``````
+M`$@#````````$P\```(``0!``@(``````*<`````````(@````(``0"@%0$`
+M`````'$`````````)P\```(``0"@"`$``````%P`````````/0\```(``0!P
+M^@$```````<`````````3`\```(``0`@K`$``````"H`````````:0\```(`
+M`0!PQ@$``````*,#````````@P\```(``0`@`0(``````!L!````````DP\`
+M``(``0``<`$``````#$&````````LP\```(``0#0F`$``````'(`````````
+MR0\```(``0`@8P(``````",)````````Z`\```(``0"0Z0$``````(``````
+M````$Q````(``0"@LP$``````.8`````````L@````(``0``?@(``````%(`
+M````````)Q````(``0`PIP$``````%8`````````1A````(``0!PA`(`````
+M`#L!````````61````(``0``GP(``````%P`````````<Q````(``0"@5@(`
+M`````',,````````D1````(``0``;`$``````/@#````````JQ````(``0"0
+MXP$``````)`!````````]P````(``0"0<`(``````#\`````````.P$```(`
+M`0#`E`(``````'<`````````Q!````(``0!0EP(``````'D#````````W1``
+M``(``0!0K`$``````"``````````^1````(``0"`4`(``````!@!````````
+M$A$```(``0"P!P$``````$8`````````*!$```(``0#0=@$```````X`````
+M````1A$```(``0!`"0$``````#``````````9A$```(``0`@KP$``````$D`
+M````````>1$```(``0#P50(``````*\`````````D!$```(``0!0L0$`````
+M`"H`````````KA$```(``0`0#0$``````"$`````````T!$```(``0!`JP$`
+M`````#0`````````YA$```(``0``D0(```````D#````````\@$```(``0``
+M_P$``````%\`````````^A$```(``0`0B0(``````/$#````````$A(```(`
+M`0#0K`$``````&$`````````)Q(```(``0"`$`$``````&T"````````.Q(`
+M``(``0"PE`$``````&<!````````.P(```(``0!P^P$``````),`````````
+M7!(```(``0!0#0(``````*<`````````<A(```(``0`@E`$``````(L`````
+M````C1(```(``0"`?@(``````!(`````````J!(```(``0!0G0$```````D!
+M````````T!(```(``0!02@$``````/@`````````]!(```(``0`0#@$`````
+M`%(`````````"A,```(``0"@40(```````$"````````U0(```$``P``%@``
+M`````"``````````(1,```(``0#P`@(``````"H!````````,!,```(``0"`
+MT@$``````/(`````````2!,```(``0"0UP$``````&<#````````:!,```(`
+M`0!0F0$```````\!````````C!,```(``0"P4P(``````#L"````````JA,`
+M``(``0`@YP$``````$<!````````$`,```(``0``=P(``````%(`````````
+MQQ,```(``0#0J`$``````!T!````````Y!,```(``0!@'`$```````,&````
+M````!A0```(``0#0N@$``````(8`````````?0,```(``0"P?P(``````"(`
+M````````+10```(``0#PT0$``````#H`````````1Q0```(``0!`LP$`````
+M`",`````````910```(``0#0DP$``````$0`````````CA0```(``0`@%@$`
+M`````!D`````````JQ0```(``0#@#`$``````"@`````````-00```(``0"0
+M=0(``````%(`````````100```$`"P!``0```````(``````````PQ0```(`
+M`0"@S0$```````P!````````VA0```(``0#PD`$``````%P`````````\10`
+M``(``0"@&0(``````.T#````````!A4```(``0"P"0$``````#,`````````
+ML00```(``0`PQP(``````)H`````````'!4```(``0!PA@(``````#,!````
+M````014```(``0``G`$``````$\!````````:!4```(``0`0Q0$``````%8!
+M````````C14```(``0"@7P$``````+X`````````K!4```(``0!`K@$`````
+M`-$`````````R!4```(``0#`%@$``````%\`````````X14```(``0!@#0$`
+M`````$<`````````]Q4```(``0``U@$``````(4!````````"A8```(``0`P
+M!`$``````"P`````````*A8```(``0#P>@$```````8!````````1A8```(`
+M`0`@<`(``````#<`````````5A8```(``0`PD`$``````&\`````````?A8`
+M``(``0!`%`$``````$T`````````EQ8```(``0#PAP(``````)H`````````
+M)08```(``0!`X@$``````"8`````````N18```(``0!@,P$``````.\#````
+M````VQ8```(``0!P@`(``````"\!````````^18```(``0!0-P$``````,,)
+M````````&Q<```(``0#@P@$``````!,!````````1Q<```(``0"0H0$`````
+M`"P!````````;A<```(``0!`%@$``````$4`````````D!<```(``0#@N@(`
+M`````)H#````````C`8```(``0"0?P(``````"``````````K1<```(``0#P
+M+0$``````!`"````````RQ<```(``0"0%`$``````((`````````M`8```(`
+M`0#PJP$``````"H`````````[!<```(``0"@@0(``````.,`````````"1@`
+M``(``0#@]0$``````/@`````````)!@```(``0``#@(``````#X#````````
+M[`8```(``0#P$@$``````$H!````````0!@```(``0`@00$``````"4)````
+M````6A@```(``0!PX@$``````!4`````````<A@```(``0`0A@(``````"L`
+M````````CQ@```(``0"0IP$``````!4`````````LA@```(``0`P;0(`````
+M`$L`````````PQ@```(``0#0M`$``````#X`````````VA@```(``0!0?0(`
+M`````%,`````````Z1@```(``0"0;@(``````(4!````````^A@```(``0`P
+MXP$``````%T`````````&1D```(``0#@S`$``````+H`````````0AD```(`
+M`0#P;0(``````)4`````````7AD```(``0!`P0(``````.D%````````=QD`
+M``(``0#PW`$``````(\"````````BQD```(``0"`O@$``````&T!````````
+ML!D```(``0#@?P(``````((`````````R1D```(``0"0^0$``````&(`````
+M````Z1D```(``0!PK`$``````"H``````````!H```(``0!`#0$``````"``
+M````````%!H```(``0!@_P$``````.X`````````+!H```(``0"@=P(`````
+M`#\`````````0!H```(``0``"`$```````P`````````4QH```(``0"03`(`
+M`````.P#````````:AH```(``0#@!@$``````#8`````````>AH```(``0#@
+MFP(``````)D`````````C!H```(``0!@G@$``````(,!````````HQH```(`
+M`0#@+`(``````$,"````````Q!H```(``0`P0`(``````+("````````UAH`
+M``(``0!@F@$``````)\!`````````1L```(``0`0LP$``````"P`````````
+M%QL```(``0`0"0$``````"<`````````+1L```(``0`@!`(``````,,`````
+M````1!L```(``0``?`$``````$,!````````7QL```(``0#0!P(``````)\"
+M````````=!L```(``0"`TP$``````.H!````````B1L```(``0``Q`$`````
+M``0!````````LQL```(``0"PS@$``````'T!````````S!L```(``0"@L`$`
+M`````"8`````````Y!L```(``0!0D0$``````%\``````````QP```(``0"@
+MD`$``````$(`````````+1P```(``0`@50$``````+0)````````1AP```(`
+M`0!`$0(``````%D'````````7AP```(``0"0Z@$``````!4)````````<1P`
+M``(``0#0A0(``````!P`````````D!P```(``0"@#`$``````#D`````````
+MIAP```(``0!0+P(``````*4)````````Q1P```(``0"PP0$``````"H!````
+M````ZAP```(``0!P"@(``````-T"````````0`D```(``0#0<`(``````-4`
+M````````"AT```(``0!PKP$``````/H`````````'AT```(``0#PJ0$`````
+M`(<`````````+QT```(``0#0QP(``````"8)````````/AT```(``0"0'0(`
+M`````"H(````````6QT```(``0`@Y0$``````,L`````````>!T```(``0"0
+M"`$``````!``````````C!T```(``0"PX`$``````#0!````````IQT```(`
+M`0"`WP$``````"0!````````OQT```(``0`P&0$``````.T`````````UQT`
+M``(``0!PLP$``````"<`````````\AT```(``0`0#`$``````(X`````````
+M"!X```(``0`0"`$``````"(`````````'1X```(``0!`A@(``````"<`````
+M````.QX```(``0"0B`(``````%P`````````8!X```(``0"@?@(``````.@`
+M`````````PH```(``0!@<`(``````"<`````````>!X```(``0#@X@$`````
+M`$$`````````CAX```(``0"PD0$``````-X`````````L!X```(``0!0?0$`
+M`````)`+````````S1X```(``0!P)@(``````&D&````````Z!X```(``0"`
+MT0$``````&<`````````_!X```(``0!P(@$``````!$`````````*`H```(`
+M`0"PM`(``````-(`````````'!\```(``0#@=@$```````L$````````/Q\`
+M``(``0"@K`$``````"H`````````61\```(``0`@!P$``````#8`````````
+M;A\```(``0`0C0(``````%4!````````GA\```(``0`PT@$``````"``````
+M````MQ\```(``0"PJ@$```````(`````````<0H```(``0``^@$``````&D`
+M````````SA\```(``0!02P$``````,()````````YA\```(``0`@E@$`````
+M`%P!````````!R````(``0!PZ`$``````!\!````````'2````(``0#@]@$`
+M`````,`!````````-"````(``0`@%P$```````,"````````?0H```(``0!0
+M``(``````,X`````````4R````(``0!`=@$``````($`````````J0H```(`
+M`0`P+P(``````!0`````````<R````(``0!`]0$``````)T`````````BR``
+M``(``0#@B`$``````'<"````````K2````(``0"@^`$``````'\`````````
+MS"````(``0#@10(``````+\"````````YR````(``0#PB`(``````!<`````
+M````#"$```(``0"`^@$``````#,`````````&B$```(``0`@%0$``````'4`
+M````````/B$```(``0!P#@$``````'D`````````72$```(``0`@N@$`````
+M`*\`````````>2$```(``0#PH`$``````*``````````FB$```(``0`@^0$`
+M`````&(`````````NB$```(``0#P#@$``````%`!````````T"$```(``0"0
+MM`$``````#X`````````ZB$```(``0`@RP$``````.H`````````$"(```(`
+M`0!`"`$``````$<`````````=PL```(``0"@;0(``````$(`````````(2(`
+M``(``0!PL`$``````"X`````````/"(```(``0"PA0(```````4`````````
+M5B(```(``0#P0@(``````.\"````````;R(```(``0`P:`$``````,D#````
+M````A`L```(``0"0E@(``````+0`````````B"(```(``0"P?0(``````$L`
+M````````EB(```(``0#`@P(``````*L`````````LR(```(``0`@^P$`````
+M`!\`````````PB(```(``0``"0$```````T`````````VR(```(``0"0@@(`
+M`````"(!````````^"(```(``0"`J@$``````"4`````````$B,```(``0#0
+ML`$``````$8`````````+R,```(``0`@_0$``````-$!````````2R,```(`
+M`0"P#0$``````%(`````````8",```(``0!`K0$``````/8`````````W`L`
+M``(``0"0%@$``````"$`````````>2,```(``0#@=P(``````&4%````````
+MBR,```(``0"0Y@$``````(4`````````J",```(``0#`N0$``````%0`````
+M````QB,```(``0"@2`(``````.H#````````WR,```(``0"`EP$``````$4!
+M````````#0P```(``0#P!0(``````.$``````````20```(``0#PGP$`````
+M`/\`````````'B0```(``0!@FP(``````'0`````````+"0```(``0`0M0$`
+M`````$D#````````0R0```(``0!0O`$``````*@`````````8"0```(``0#P
+M!`(``````/$`````````?20```(``0#@7@$``````+L`````````G"0```(`
+M`0"0(@$``````%4+````````N20```(``0"@G`(``````%``````````RB0`
+M``(``0`0JP$``````"H`````````W"0```(``0!P!`$``````&X"````````
+M^20```(``0!PU0$``````(8`````````%R4```(``0!@Y@$``````"D`````
+M````.24```(``0#`J@$``````$L`````````5"4```(``0!@=P(``````#<`
+M````````:24```(``0"PX@$``````",`````````@R4```(``0``VP$`````
+M`.$!````````DR4```(``0``/0(``````"<#````````V@P```(``0`PN@(`
+M`````*,`````````L24```(``0#PY0$``````&X`````````PB4```(``0`0
+MZ@$``````(``````````W24```(``0"0X@$``````!H`````````^"4```(`
+M`0!`$`$``````#\`````````&@T```(``0#@!@(``````.$`````````#"8`
+M``(``0#0"P$``````#X`````````&B8```(``0"PAP(``````$``````````
+M+@T```(``0#P=0(``````%(`````````/@T```$`"P#@``````````0`````
+M````@`T```(``0`PT`$``````!<`````````0B8```(``0!P"0$``````#$`
+M````````6R8```(``0"09`$``````)\#````````>"8```(``0"0D@$`````
+M`#,!````````GB8```(``0"PIP$``````!P!````````O28```(``0#P"0$`
+M`````-P!````````W"8```(``0#POP$``````*D``````````"<```(``0#P
+MX0$``````$L`````````&2<```(``0!@?@(``````!@`````````,R<```(`
+M`0`@R@$``````/P`````````7"<```(``0!@8`$``````%\#````````=2<`
+M``(``0!@BP$``````,$$````````C"<```$`"P`@`0```````!P`````````
+MGR<```(``0!@NP$``````/``````````O2<```(``0#`A0(```````8`````
+M````'`X```(``0"0M0(``````(P`````````UR<```(``0"`JP$``````"H`
+M````````]"<```(``0#`H@$``````&\$````````$R@```(``0``,`$`````
+M`%T#````````+2@```(``0!0T`$``````"H!````````0B@```(``0`0_`$`
+M``````$!````````6"@```(``0"@P`$```````T!````````>R@```(``0#P
+MA0(``````!T`````````F"@```(``0!0T@$``````"8`````````KB@```(`
+M`0#`)0(``````*@`````````Q"@```(``0`@J0(``````-P$````````X2@`
+M``(``0`0S`$``````,D`````````!2D```(``0!@!P$``````$8`````````
+M%RD```(``0!`&P$``````!@!````````."D```(``0!PC@(``````*<!````
+M````42D```(``0"PJP$``````#$`````````;BD```(``0`@L0$``````"8`
+M````````C"D```(``0!P*P0``````$\`````````FBD```(``0#P#@,`````
+M`*X`````````JBD```(``0!@'0,``````+<*````````Q"D```(``0"`'@0`
+M`````+@'````````U"D```(``0#`,0,``````)8`````````Y"D```$`"P#P
+M`0````````@`````````]"D```(``0#P#`,```````P`````````"2H```(`
+M`0!P*P,``````&4!````````'BH```(``0`@&00``````&,`````````-BH`
+M``$`!P"!`P````````$`````````1BH```(``0#@0@,``````(4`````````
+M5BH```(``0"@$00``````-4`````````9RH```(``0"`$@0``````)$`````
+M````>RH```(``0`@&@0``````$@"````````D2H```(``0"`.P,``````-H`
+M````````IRH```$`"P#X`0````````0`````````M2H```(``0!`$00`````
+M`%\`````````S2H```(``0"0Z@,``````(8`````````W"H```(``0!@8`,`
+M`````$$`````````[BH```(``0``!`,``````%H!`````````2L```(``0!@
+M/`,```````,!````````&2L```(``0`0]0(``````$L`````````+2L```(`
+M`0#@+`,``````(4!````````02L```(``0`@*@,``````$H`````````3RL`
+M``(``0#`"P,``````&4`````````9"L```(``0"`$0,``````&``````````
+M=2L```(``0"`"P,``````#$`````````C"L```$`"P```@````````$`````
+M````H"L```(``0``+P,``````&8`````````NRL```(``0`@*`,``````/\!
+M````````SRL```(``0!P+@,``````(\`````````WRL```(``0"@]@(`````
+M`"4`````````Z"L```(``0"0\P(``````'<`````````!"P```(``0!P'`0`
+M`````)P`````````&BP```(``0"@&@,``````%H"````````+2P```(``0"`
+M#@0``````!8`````````-BP```(``0#`*P0``````$\`````````1"P```(`
+M`0`0&0,``````(\!````````8"P```(``0!07P,``````/,`````````:RP`
+M``(``0#`8P,```````@!````````@2P```(``0``G@,``````!X!````````
+MDRP```(``0"@8@,``````!D!````````K"P```(``0"0`P0``````$P`````
+M````O2P```(``0`@-@,``````%4`````````R"P```(``0"`!00```````8$
+M````````V2P```(``0!0#0,``````'<`````````[BP```(``0!0$`0`````
+M`.D`````````_2P```(``0#@^P(``````/D`````````$"T``!(``0`@\P(`
+M`````!,`````````-RT``!$`"P`$`@````````$`````````3"T``!``````
+M````````````````````8RT``!(``0!@*P0```````P`````````>BT``!``
+M````````````````````````C2T``!(``0!0]@(``````"@`````````GRT`
+M`!(``0!@*@0``````#H`````````KBT``!(``0!@!0,``````,<!````````
+MQ2T``!(``0`0^@(``````(<`````````W"T``!``````````````````````
+M````]"T``!(``0#P*@0``````%4`````````#2X``!(``0"`\P(```````P`
+M````````)"X``!(``0!@`P,``````)@`````````.RX``!``````````````
+M````````````5BX``!(``0``^`(``````%4`````````92X``!``````````
+M````````````````;"X``!(``0!@^`(``````-D`````````?RX``!(``0#@
+M]0(``````"L`````````EBX``!(``0#0_0(``````!4`````````JBX``!(`
+M`0#P!P,``````(`!````````P"X``!(``0`@$P0``````!$"````````W2X`
+M`!$`"P#\`0````````0`````````]"X``!(``0!`%00``````-@#````````
+M#B\``!``````````````````````````(R\``!(``0#@_`(``````%4`````
+M````.2\``!(``0``$`,``````&H`````````5"\``!(``0!08`,```````@`
+M````````;B\``!``````````````````````````@"\``!(``0"@*@0`````
+M`$D`````````E2\``!$`"P#@`0````````@`````````I2\``!(``0"``P0`
+M``````D`````````OB\``!(``0!P]P(``````(,`````````TR\``!$`"P`%
+M`@````````$`````````ZR\``!(``0`PU````````!H`````````!C```!(`
+M`0#P`@0``````&L`````````'3```!``````````````````````````-#``
+M`!(``0"@^@(``````%<`````````1S```!$`"P#H`0````````@`````````
+M5C```!(``0!`^0(``````,,`````````;C```!(``0``^P(``````-D`````
+M````?S```!(``0!`7P,```````<`````````ES```!``````````````````
+M````````KC```!(``0#09`,``````"<`````````OC```!$`"P`#`@``````
+M``$`````````VC```!``````````````````````````[3```!``````````
+M`````````````````#$``!$`!P"#`P````````$`````````%#$``!(``0"@
+M_0(``````!``````````.3$``!(``0#0"@0``````&X#````````1S$``!(`
+M`0!@GP(``````!H`````````9#$``!(``0"P_0(``````!$`````````@#$`
+M`!``````````````````````````F#$``!(``0"0"00``````%(`````````
+MK3$``!``````````````````````````PS$``!(``0"0&00``````(,`````
+M````WC$``!(``0!`#@0``````#8`````````\C$``!``````````````````
+M`````````C(``!``````````````````````````&3(``!(``0!0*P0`````
+M``P`````````,#(``!``````````````````````````0S(``!(``0"0]@(`
+M`````!``````````7S(``!(``0`0]`(``````,@`````````>C(``!$`!P"`
+M`P````````$`````````C3(``!(``0!`\P(```````P`````````I3(``!$`
+M"P`!`@````````$`````````P#(``!``````````````````````````RC(`
+M`!(``0!`)@0``````(<"````````ZC(``!(``0!@*00```````,`````````
+M!#,``!(``0#`%@,``````/P!````````&S,``!(``0`P!P,``````+,`````
+M````,3,``!(``0#0]@(``````#X`````````2C,``!``````````````````
+M````````83,``!(``0!0\P(``````"D`````````>3,``!``````````````
+M````````````C3,``!(``0`0]@(``````#T`````````HS,``!``````````
+M````````````````M#,``!(``0!`*00``````!,`````````TC,``!(``0#`
+M`0,``````/,`````````\C,``!``````````````````````````!C0``!``
+M````````````````````````(S0``!(``0"`]@(```````L`````````/30`
+M`!``````````````````````````4#0``!(``0!P`@0``````'0`````````
+M9S0``!``````````````````````````@C0``!(``0`P*00```````(`````
+M````E30``!(``0#@`P0``````'$`````````JC0``!(``0`P#`,``````+(`
+M````````PC0``!(``0#0*`0``````%0`````````X#0``!(``0#@]`(`````
+M`"P`````````#C4``!$`!P""`P````````$`````````*C4``!(``0!P"0,`
+M`````/H`````````034``!(``0!@`P0``````!L`````````5C4``!(``0!`
+M_0(``````%<`````````=34``!``````````````````````````C#4``!(`
+M`0!@``,``````%8!````````J34``!(``0`0]P(``````%\`````````OC4`
+M`!(``0"@#@0``````/(`````````VS4``!$`"P`"`@````````$`````````
+M]C4``!(``0!P0P,``````'(``````````'(W-3!?5&%G7TEN:70`<C<U,%]5
+M<&1A=&50:'E);F9O`'-A<U]H87-H7V%D9'(`<C<U,%]697)I9GE#;VUM86YD
+M0F5F;W)E4V5N9&EN9P!R-S4P7T)E97!/;@!R-S4P7U-#4TE?051!7T9I;&Q$
+M871A1FEE;&0`<&U?<VEG7W1I;65?;W5T`'-A=&%?<&]R=%]S=&]R95]S:6<`
+M<C<U,%]-5E]:97)O379297%U97-T`&DR8T%?=W)I=&5?8GET97,`<C<U,%]-
+M5E]$=6UP4F5Q=65S=`!R-S4P7TU67TEN:71I86QI>F5487)G971)1%1A8FQE
+M`'-E=%]P;5]F86EL7VQE9`!S871A7VUA:V5?<V]F=%]R97-E=%]R97$`<C<U
+M,%]0<F5P87)E06YD4V5N9$-O;6UA;F0`3V1I;E-025]29'!T`'(W-3!?359?
+M36%P5&]3<&5C:69I8U1A<F=E=$E$`'(W-3!?4T-325]!5$%?1FEL;$Q"04-D
+M8C$P`'(W-3!?4T=024]?5W)I=&5296=I<W1E<@!R-S4P7T9R9653051!4V-R
+M871C:%1O4&]O;`!R-S4P7U1A9U]'971/;F4`<C<U,%]/9&EN4U!)7TEN:70`
+M<C<U,%]&<F5E26YT97)N86Q297%4;U!O;VP`=V%T:6YG7V-A;&QB86-K`'(W
+M-3!?0V]M<&QE=&5297%U97-T06YD4VQO=`!R-S4P7T-O<F5?1V5T4W5P<&]R
+M=&5D0V]U;G1S`%!-7U-E=$9A:6Q,961#86QL8F%C:P!R-S4P7U-#4TE?051!
+M7U9E<FEF>51R86YS;&%T:6]N`'(W-3!?7U]R96YE=U]T:6UE<@!R-S4P7U-#
+M4TE?051!7U-T87)T4W1O<%1R86YS;&%T:6]N`'(W-3!?1G)E941E=FEC951O
+M4&]O;`!R-S4P7U!O<G1?06)O<G1297%U97-T<P!P<F]D=6-T7VED`'(W-3!?
+M0V]R95]-;V1U;&5396YD4F5Q=65S=`!R-S4P7T9R9650;W)T5&]0;V]L`&DR
+M8T)?=W)I=&5?8GET97,`<C<U,%]#;W)E7TEN=&5R<G5P=%-E<G9I8V52;W5T
+M:6YE`'(W-3!?4T=024]?4F5A9%)E9VES=&5R`'(W-3!?;V1I;E]I;V-T;`!R
+M-S4P7W-E=%]F86EL7VQE9`!497-T7U!I;E]3970`<C<U,%]486=?27-%;7!T
+M>0!R-S4P7TU67TUA<%1A<F=E=$E$`'(W-3!?7U]A9&1?=&EM97(`<C<U,%]I
+M,F-?<F5S970`<C<U,%]M=E]D:7-A8FQE7VAB80!R-S4P7T-O<F5?4F5Q5&EM
+M96]U=`!R-S4P7VUV7W-E=%]305-!9&1R`'(W-3!?0V]R95]297-E=$-M9%-L
+M;W0`<C<U,%]296UO=F5$979I8V4`:3)C05]R96%D7V)Y=&5S`&%I;F9O`'(W
+M-3!?0V]R95]-;V1U;&5);FET:6%L:7IE`'(W-3!?4T-325]!5$%?4F5A9$-A
+M<&%C:71Y5')A;G-L871I;VY#86QL8F%C:P!R-S4P7TU67U-E=$Q"06%N9%-E
+M8W1O<D-O=6YT`&]D:6Y?8V]R95]T:6UE<@!R-S4P7W-E=%]F86EL7VQE9',`
+M<C<U,%]C;W)E7VAA;F1L95]T87-K9FEL95]E<G)O<@!R-S4P7V]D:6Y?<V5T
+M7W-P:6Y?=7!?;6]D90!P;5]W86ET7V9O<E]S;V9T<F5S970`<C<U,%]M=E]E
+M;F%B;&5?>&UT`'(W-3!?3&ES=%]'971&:7)S=`!R-S4P7U-!5$%?17)R;W)(
+M86YD;&EN9P!R-S4P7U-!5$%?4&]R=$AA;F1L94EN=&5R<G5P=`!R-S4P7T9R
+M965296=I<W1E<E-E=`!R-S4P7U-!5$%?4&]R=$1E=&5C=`!R-S4P7U!O<G1?
+M2&%N9&QE4&QU9VEN`'(W-3!?1&5V:6-E7TES<W5E4V]F=%)E<V5T`'(W-3!?
+M7U]035]C86YC96Q?=&EM97(`<C<U,%]035]&<F5E4F5G:7-T97)3970`<C<U
+M,%]'97131T)U9F9E<D9R;VU0;V]L`$=E=%-!5$$V-$M38W)A=&-H1G)O;5!O
+M;VP`<C<U,%]'971$979I8V5&<F]M4&]O;`!&<F5E3VYE0V]M;6%N9%-L;W0`
+M<C<U,%]30U-)7T%405]3>6YC0V%C:&54<F%N<VQA=&EO;@!497-T7U!I;E])
+M;FET:6%L:7IE`'(W-3!?359?1V5T36%P<&5D240`1G)E95-!5$$V-$M38W)A
+M=&-H5&]0;V]L`'(W-3!?4T%405]0<F5P87)E0V]M;6%N9$AE861E<@!M=E]P
+M:'E?<F5S970`<C<U,%]3051!7TAA;F1L941E=FEC955N<&QU9P!R-S4P7U-#
+M4TE?051!7T-H96-K0V]N9&ET:6]N`'(W-3!?1V5T26YT97)N86Q297%&<F]M
+M4&]O;`!R-S4P7U-#4TE?051!7U)E861#87!A8VET>51R86YS;&%T:6]N`'(W
+M-3!?9'5M<%]U;F%S<V]C:6%T961?9FES`'(W-3!?0V]M<&QE=&5297%U97-T
M`'(W-3!?1V5T4T%405-C<F%T8VA&<F]M4&]O;`!R-S4P7T-O<F5?36]D=6QE
-M4W1A<G0`<C<U,%]$:7-C;W9E<GE#86QL0F%C:P!G971?:61?9G)O;5]E;F-)
-M9`!R-S4P7T=E=%-%4U-"1G)O;5!O;VP`4T537U!R:79A=&5297%#86QL8F%C
-M:P!305-?4F5P;W)T3'5N4V-A;@!R-S4P7T-O<F5?2&%N9&QE5V%I=&EN9TQI
-M<W0`<C<U,%]0<F5%;7!T>5!-`'(W-3!?1V5T36EN3F5G;W1I871E9$QI;FM2
-M871E`'(W-3!?4T%405](86YD;&5$979I8V50;'5G:6X`<C<U,%]&:6QL16YC
-M;&]S=7)E16QE;65N=%-T871U<P!R-S4P7U-#4TE?5&]?1DE3`'(W-3!?0V]R
-M95-A=F5/<FEG:6YA;$-$0@!R-S4P7U-!5$%?4&]R=%)E<V5T`'(W-3!?1V5T
-M3VYE0V]M;6%N9%-L;W0`<C<U,%]M=E]R97-E=%]P:'D`<C<U,%]7<FET941%
-M3%9?45]%;G1R>0!R-S4P7V]D:6Y?<V5T7VED;&5?<W1A;F1B>0!R-S4P7U-%
-M4U]3971&86EL3&5D`'(W-3!?1V5T4$U&<F]M4&]O;`!R-S4P7TU67T5Q=6%L
-M<P!R-S4P7TAA;F1L94-O;6UA;F11=65U90!!<W-I9VY397-/=&AE<D5L96UE
-M;G1/=F5R86QL16QE;65N=$YU;6)E<@!R-S4P7U-#4TE?051!7U)E8617<FET
-M951R86YS;&%T:6]N`'(W-3!?4TU07U-'4$E/7U-E=%]&86EL;&5D`'(W-3!?
-M4G5N=&EM94ES<W5E4V]F=%)E<V5T0V%L;&)A8VL`<C<U,%]31U1A8FQE7T%P
-M<&5N9`!R-S4P7T%S<VEG;D1E=FEC94]V97)A;&Q%;&5M96YT3G5M8F5R`'(W
-M-3!?4$U?07-S:6=N4F5G:7-T97)3970`<C<U,%]3051!7U!-2&]T<&QU9U)E
-M<4-A;&QB86-K`'!O<G1?<V5T7V9A:6Q?;&5D`'(W-3!?57!D871E5&=T1&5V
-M36%P`'(W-3!?4T%37TEN=&5R;F%L4F5Q0V%L;&)A8VL`<C<U,%]5<&1A=&54
-M87)G971$979I8V5S`&]D:6Y?96U?86-C97-S`'(W-3!?4T%405]$979I8V53
-M=&%T94UA8VAI;F4`1&5V:6-E7U)E<&]R=$QU;E)E<75E<W0`<C<U,%]0<F5%
-M;7!T>41E=FEC90!R-S4P7T1)4T-?0VAE8VM$:7-C;W9E<E-T871E`'(W-3!?
-M1G)E95--4$-O;G1E>'0`<C<U,%]'971.0U%486<`<C<U,%]3051396YS941A
-M=&$`<C<U,%]31U!)3U]335!297%U97-T7U)E860`<C<U,%]?7V-A;F-E;%]T
-M:6UE<@!R-S4P7T1)4T-?1V5T4F5S;W5R8V4`<C<U,%]#;W)E7W!A<W-?=&AR
-M=5]F:6QL7W1A<VMF:6QE`'(W-3!?1$E30U]$;T1I<V-O=F5R`'(W-3!?4T=0
-M24]?26YI=&EA;&EZ90!R-S4P7U!O<G1?2&%N9&QE1&5V:6-E4&QU9VEN`'(W
-M-3!?4T=024]?4V5T7T9A:6QL960`<V5T7W!M7V9A:6Q?;&5D<P!R-S4P7TU6
-M7T-O<'E31U1A8FQE`'(W-3!?1&5V:6-E7TUA:V5296%D0V%P86-I='E487-K
-M4F5Q=65S=`!U<&1A=&5?9&5V:6-E7V-O;F9I9P!R-S4P7T-O<F5?36]D=6QE
-M16YA8FQE1&ES86)L94E240!R-S4P7VUO9&5086=E0G5F`'(W-3!?4T%37T1E
-M=FEC95-T871E36%C:&EN90!R-S4P7U1A9U]);FET7T9)1D\`<C<U,%]#;W)E
-M7T9I;&Q396YS941A=&$`<C<U,%]0;W-T36%K95-E<T-O;F9I9W5R871I;VY2
-M97%U97-T`'(W-3!?4T%405]035](86YD;&5$979I8V50;'5G:6X`<C<U,%]3
-M0U-)7T%405]5<'!E<E=O<F0`36%K941E=DEN9F\`<C<U,%]3051!7U!-4W1A
-M=&5-86-H:6YE`'(W-3!?1$E30U]3971297-O=7)C90!$979I8V5?36%K95!R
-M:79A=&5296-V4V5S4F5Q=65S=`!035])<W-U95=R:71E1F%I;$QE9`!R-S4P
-M7U-!5$%?4$U);FET4F5Q0V%L;&)A8VL`<C<U,%]O9&EN7V9L87-H7V%C8V5S
-M<P!3051!7U!-4W1A=&5-86-H:6YE4W!I;E5P`'(W-3!?4T%405]0;W)T1&5V
-M:6-E4F5A9'D`<C<U,%]486=?4F5L96%S94]N90!R-S4P7U-!4U]%<G)O<DAA
-M;F1L:6YG`&-H96-K7U-A<T%D9'(`<C<U,%]&<F5E4T="=69F97)4;U!O;VP`
-M<C<U,%]$971E8W10;W)T5'EP90!R-S4P7U!O<G1?27-297%U97-T4G5N;FEN
-M9P!R-S4P7T1)4T-?1V5T5&=T1&5V36%P`$1E=FEC95]497-T56YI=%)E861Y
-M4F5Q=65S=`!R-S4P7T1E=FEC95]087)S94ED96YT:69Y1&%T80!R-S4P7V1E
-M=FEC95]P<F]B95]D;VYE`'(W-3!?0F5E<$]F9@!G971?9FER<W1?<&T`<C<U
-M,%]5<&1A=&53=&%T=7-6<U-E<T-O;G1R;VQ"=69F97(`<C<U,%])<W-U95]#
-M;VYF:6=2;W5T94EN9F\`3V1I;E-025]396-T;W)5;G!R;W1E8W0`<C<U,%]#
-M;W)E4F5S=&]R94]R:6=I;F%L0T1"`'-C<VEL=6Y?=&]?:6YT`'(W-3!?4T=4
-M86)L95]);FET`'(W-3!?4T%405]035]%<G)O<DAA;F1L:6YG`%-!5$%?2&%N
-M9&QE4$U?2&]T4&QU9P!R-S4P7U-#4TE?051!7T9I;&Q,0D%#9&(Q-@!R-S4P
-M7TES<W5E7T1I<V-O=F5R`$=E=$%T=$ED96YT:69Y1G)A;64`4T535&EM97)?
-M26YT97)N86Q297%#86QL8F%C:P!G971?96YC7V-O=6YT`'(W-3!?0V%T96=O
-M<GE?0T1"7U1Y<&4`<C<U,%],:7-T7T=E=$QA<W0`<C<U,%]&<F5E4$U4;U!O
-M;VP`9V5T7VUI;E]P;5!A=&A)9`!R-S4P7T1E=FEC95]-86ME4F5A9$-A<&%C
-M:71Y,39487-K4F5Q=65S=`!R-S4P7VUV7V1I<V%B;&5?<F5G:7-T97)?<V5T
-M`'(W-3!?4T%405]0;W)T1&5V:6-E1&5T96-T960`<C<U,%]0;W)T7TAA;F1L
-M955N<&QU9P!R-S4P7T%405]#1$(R5&%S:T9I;&4`4F5M;W9E4T%31&5V:6-E
-M`'(W-3!?359?4F5M;W9E5&%R9V5T240`;V1I;E]S971?:&%R9%]D:7-K7VED
-M96YT:69Y`'(W-3!?4T=486)L95]!=F%I;&%B;&4`4&]R=$UA<%]2-S4P`'(W
-M-3!?4T%405]0<F5P87)E0V]M;6%N9%1A8FQE`$=E=$1E=DED96YT:69Y1G)A
-M;64`:3)C0E]R96%D7V)Y=&5S`'-A<U]A9&1R97-S7V-O=6YT`'(W-3!?27-S
-M=65?4F5P;W)T36%N=69A8W1U<F5R26YF;W)M871I;VX`<C<U,%]0<F5P87)E
-M1&5L:79E<GE1=65U945N=')Y`%5P9&%T94AI;5!A=&A)9`!R-S4P7T9I;F12
-M=6YN:6YG4F5Q0GE486<`<C<U,%]#;W)E7TUO9'5L95-H=71D;W=N`'(W-3!?
-M4$U?0V]R95]297%4:6UE;W5T`'(W-3!?17AP86YD97)?4TU04F5Q7T-A;&QB
-M86-K`'(W-3!?57!D871E5VED95!O<G10:'E-87``<C<U,%]305-?2&%N9&QE
-M0E)$0U-4`'(W-3!?07-S:6=N4F5G:7-T97)3970`<C<U,%]397)V:6-E26YT
-M97)R=7!T`'(W-3!?;79?9&ES86)L95]X;70`<C<U,%]335!297-P3&5N9W1H
-M`'5P9&%T95]D979I8V5?8V]N9FEG7W8R`'(W-3!?27-S=65?4F5P;W)T4F]U
-M=&5);F9O`'(W-3!?4&]S=$UA:V5397-%;F-L;W-U<F53=&%T=7-297%U97-T
-M`'(W-3!?17AP86YD97)?4TU04F5Q=65S=%]297!O<G1'96YE<F%L`'(W-3!?
-M1V5T4TU04V-R871C:$9R;VU0;V]L`'(W-3!?1&5V:6-E7TUA:V5);G%U:7)Y
-M5&%S:U)E<75E<W0`<C<U,%]#;W)E7TUO9'5L94=E=%)E<V]U<F-E475O=&$`
-M<C<U,%]!<W-I9VY$979I8V5%;&5M96YT3G5M8F5R`'(W-3!?4&]R=%]&:6YD
-M5&=T3F\`<C<U,%]31U!)3U]335!297%?0V%L;&)A8VL`<C<U,%]0;W)T7U-O
-M9G1297-E=$-A;&QB86-K`'(W-3!?;79?<F5S971?>&UT`'(W-3!?;79#:&%N
-M;F5L4W1A=&5-86-H:6YE`'(W-3!?4&]R=%]-;VYI=&]R`'(W-3!?4T%37U!O
-M<G1297-E=`!R-S4P7U!O<W1-86ME4V5S16QE;65N=$1E<V-R:7!T;W)297%U
-M97-T`'(W-3!?17AP86YD97)?4TU04F5Q=65S=%]297!O<G102%E3051!`'(W
-M-3!?23)#7TUO9'5L94EN:71I86QI>F4`<C<U,%]O9&EN7W)E;6]V95]D979I
-M8V4`<C<U,%]30U-)7T%405],;W=E<E=O<F0`<C<U,%]'971-87A.96=O=&EA
-M=&5D3&EN:U)A=&4`<C<U,%]'9710;W)T1G)O;5!O;VP`<C<U,%]-5E]$=6UP
-M4F5G:7-T97(`<C<U,%]%>'!A;F1E<E]335!297%U97-T7T1I<V-O=F5R`'(W
-M-3!?1&5V:6-E7TUA:V5297%U97-T5&%S:U)E<75E<W0`9&,W,C@P7U-'5&%B
-M;&5?07!P96YD`&1C-S(X,%]&<F5E4T%405-C<F%T8VA4;U!O;VP`9&,W,C@P
-M7U!O<G1?06)O<G1297%U97-T<P!D8S<R.#!?4T%405]0;W)T2&%N9&QE26YT
-M97)R=7!T`&1C-S(X,%]315-?4V5T1F%I;$QE9`!D8S<R.#!?4T%37TEN=&5R
-M;F%L4F5Q0V%L;&)A8VL`9&,W,C@P7TES<W5E7U)E<&]R=$UA;G5F86-T=7)E
-M<DEN9F]R;6%T:6]N`&1C-S(X,%]0;W)T7TUO;FET;W(`9&,W,C@P7T-O<F5?
-M36%K941E=FEC95)E<V5T4F5Q`&1C-S(X,%]30U-)7U1O7T9)4P!D8S<R.#!?
-M;V1I;E]R96UO=F5?9&5V:6-E`&1C-S(X,%]3051!7U!-26YI=%)E<4-A;&QB
-M86-K`&1C-S(X,%]035]#;W)E7U)E<51I;65O=70`9&,W,C@P7T1)4T-?1V5T
-M5&=T1&5V36%P`&1C-S(X,%]O9&EN7V9L87-H7V%C8V5S<P!D8S<R.#!?1G)E
-M95--4%-C<F%T8VA4;U!O;VP`9&,W,C@P7T1I<V-O=F5R>4-A;&Q"86-K`&1C
-M-S(X,%]486=?4F5L96%S94]N90!D8S<R.#!?0V]R95]-;V1U;&5396YD4F5Q
-M=65S=`!D8S<R.#!?359?36%P5&]3<&5C:69I8U1A<F=E=$E$`&1C-S(X,%]'
-M9710341E=FEC90!D8S<R.#!?4U107T1E=FEC95)E<V5T`&1C-S(X,%]'971#
-M;W)E0V]N=&5X=$9R;VU0;V]L`&1C-S(X,%]-5E]);FET:6%L:7IE5&%R9V5T
-M241486)L90!D8S<R.#!?4')E16UP='E$979I8V4`9&,W,C@P7T]D:6Y34$E?
-M26YI=`!D8S<R.#!?051!7T-$0C)487-K1FEL90!D8S<R.#!?4TU04F5S<$QE
-M;F=T:`!D8S<R.#!?;79?<F5S971?<&AY`&1C-S(X,%]0;W)T7T9I;F149W1.
-M;P!D8S<R.#!?4T=024]?5W)I=&5296=I<W1E<@!D8S<R.#!?0V]R95]);G1E
-M<G)U<'1397)V:6-E4F]U=&EN90!D8S<R.#!?;79?9&ES86)L95]X;70`9&,W
-M,C@P7U-!5$%?4&]R=$1E=&5C=`!D8S<R.#!?1G)E941E=FEC951O4&]O;`!D
-M8S<R.#!?17AP86YD97)?4TU04F5Q7T-A;&QB86-K`&1C-S(X,%]$979I8V5?
-M36%K95-E<U)C=D1I86=297%U97-T`&1C-S(X,%]0;W)T7U-O9G1297-E=$-A
-M;&QB86-K`&1C-S(X,%])<W-U95]#;VYF:6=2;W5T94EN9F\`9&,W,C@P7U!O
-M<G1?27-297%U97-T4G5N;FEN9P!D8S<R.#!?5F5R:69Y0V]M;6%N9$)E9F]R
-M95-E;F1I;F<`9&,W,C@P7T1E=FEC95]-86ME4W1A<G13=&]P56YI=%)E<75E
-M<W0`9&,W,C@P7T9R965%>'!A;F1E<E1O4&]O;`!D8S<R.#!?0V]R95)E<W1O
-M<F5/<FEG:6YA;$-$0@!D8S<R.#!?4&]S=$UA:V5397-%;F-L;W-U<F53=&%T
-M=7-297%U97-T`&1C-S(X,%]D=6UP7W5N87-S;V-I871E9%]F:7,`9&,W,C@P
-M7TU67UIE<F]-=E)E<75E<W0`9&,W,C@P7T=E=%!O<G1&<F]M4&]O;`!D8S<R
-M.#!?1FEN9$%S8VEI3G5M8F5R`&1C-S(X,%]305-?4&]R=%)E<V5T`&1C-S(X
-M,%]-5E]'971-87!P961)1`!D8S<R.#!?4T-325]!5$%?4F5A9%=R:71E5')A
-M;G-L871I;VX`9&,W,C@P7U!O<W1-86ME4V5S0V]N9FEG=7)A=&EO;E)E<75E
-M<W0`9&,W,C@P7T1E=FEC95]-86ME4F5Q=65S=%1A<VM297%U97-T`&1C-S(X
-M,%]0;W)T7TAA;F1L941E=FEC95!L=6=I;@!D8S<R.#!?4$U?07-S:6=N4F5G
-M:7-T97)3970`9&,W,C@P7T-O<F5?4F5S971#;613;&]T`&1C-S(X,%]M=E]D
-M:7-A8FQE7VAB80!D8S<R.#!?7U]A9&1?=&EM97(`9&,W,C@P7U-#4TE?36%K
-M94UO9&5086=E0V%C:&EN9P!D8S<R.#!?0T]215])<W-U95--4%)E<75E<W0`
-M9&,W,C@P7T%S<VEG;D1E=FEC94]V97)A;&Q%;&5M96YT3G5M8F5R`&1C-S(X
-M,%]7<FET941%3%9?45]%;G1R>0!D8S<R.#!?4T-325]!5$%?5F5R:69Y5')A
-M;G-L871I;VX`9&,W,C@P7V-O<F5?:&%N9&QE7W1A<VMF:6QE7V5R<F]R`&1C
-M-S(X,%]31U!)3U]335!297%U97-T7U=R:71E`&1C-S(X,%]305-?2&%N9&QE
-M0V]M<&QE=&5D0V]M;6%N9`!D8S<R.#!?1&5V:6-E7TUA:V5296%D0V%P86-I
-M='DQ-E1A<VM297%U97-T`&1C-S(X,%]0;W-T36%K95-E<T5L96UE;G13=&%T
-M=7-297%U97-T`&1C-S(X,%]3051!7U!-7TAA;F1L941E=FEC95!L=6=I;@!D
-M8S<R.#!?;V1I;E]S971?<W!I;E]U<%]M;V1E`&1C-S(X,%]#;W)E7TAA;F1L
-M95=A:71I;F=,:7-T`&1C-S(X,%]0<F5P87)E1&5L:79E<GE1=65U945N=')Y
-M`&1C-S(X,%]31U!)3U]335!297%U97-T7U)E860`9&,W,C@P7T1)4T-?0V%N
-M8V5L1&ES8V]V97(`9&,W,C@P7U5P9&%T95=I9&50;W)T4&AY36%P`&1C-S(X
-M,%](86YD;&5#;VUM86YD475E=64`9&,W,C@P7T1)4T-?1V5T4F5S;W5R8V4`
-M9&,W,C@P7U-#4TE?051!7T9I;&Q,0D%#9&(Q-@!D8S<R.#!?0V]R95]-;V1U
-M;&5%;F%B;&5$:7-A8FQE25)1`&1C-S(X,%]I,F-?<F5S970`9&,W,C@P7T9R
-M965296=I<W1E<E-E=`!D8S<R.#!?0F5E<$]F9@!D8S<R.#!?1$E30U]#:&5C
-M:T1I<V-O=F5R4W1A=&4`9&,W,C@P7T5X<&%N9&5R7U--4%)E<75E<W1?4F5P
-M;W)T1V5N97)A;`!D8S<R.#!?23)#7TUO9'5L94EN:71I86QI>F4`9&,W,C@P
-M7V1E=FEC95]P<F]B95]D;VYE`&1C-S(X,%]296UO=F5$979I8V4`9&,W,C@P
-M7U)U;G1I;65)<W-U95-O9G1297-E=$-A;&QB86-K`&1C-S(X,%]31U!)3U]3
-M971?1F%I;&QE9`!D8S<R.#!?1V5T36%X3F5G;W1I871E9$QI;FM2871E`&1C
-M-S(X,%]&<F5E4T534T)4;U!O;VP`9&,W,C@P7TQI<W1?1V5T3&%S=`!D8S<R
-M.#!?4$U?27-S=657<FET95)E9P!D8S<R.#!?<V5T7V9A:6Q?;&5D`&1C-S(X
-M,%]486=?27-%;7!T>0!D8S<R.#!?57!D871E5&=T1&5V36%P`&1C-S(X,%]4
-M86=?26YI=`!D8S<R.#!?4T%405]034AO='!L=6=297%#86QL8F%C:P!D8S<R
-M.#!?4&]S=$UA:V5397-%;&5M96YT1&5S8W)I<'1O<E)E<75E<W0`9&,W,C@P
-M7T9R9650;W)T5&]0;V]L`&1C-S(X,%]-5E]-87!487)G971)1`!D8S<R.#!?
-M4$U?27-S=65296%D4F5G`&1C-S(X,%]#;W)E7TUO9'5L95-H=71D;W=N`&1C
-M-S(X,%]5<&1A=&50:'E);F9O`&1C-S(X,%]?7W)E;F5W7W1I;65R`&1C-S(X
-M,%]$979I8V5?36%K95)E861#87!A8VET>51A<VM297%U97-T`&1C-S(X,%]'
-M971$979I8V5&<F]M4&]O;`!D8S<R.#!?1V5T4T534T)&<F]M4&]O;`!D8S<R
-M.#!?07-S:6=N16QE;65N=%-L;W1.=6UB97(`9&,W,C@P7U!O<G1?2&%N9&QE
-M56YP;'5G`&1C-S(X,%]#;W)E7TUO9'5L95-T87)T`&1C-S(X,%]$:7-C;W9E
-M<GE330!D8S<R.#!?4T-325]!5$%?0VAE8VM#;VYD:71I;VX`9&,W,C@P7TU6
-M7T-O<'E31U1A8FQE`&1C-S(X,%]3051!7T1E=FEC95-T871E36%C:&EN90!D
-M8S<R.#!?1&5V:6-E7TUA:V5);G%U:7)Y5&%S:U)E<75E<W0`9&,W,C@P7T1E
-M=FEC95]087)S94ED96YT:69Y1&%T80!D8S<R.#!?4T%44V5N<V5$871A`&1C
-M-S(X,%]'971.0U%486<`9&,W,C@P7VUV0VAA;FYE;%-T871E36%C:&EN90!D
-M8S<R.#!?4W1O<F5?0V]N9FEG4F]U=&5);F9O`&1C-S(X,%]31U1A8FQE7TEN
-M:70`9&,W,C@P7T=E=$5X<&%N9&5R1G)O;5!O;VP`9&,W,C@P7U-!4U](86YD
-M;&5"4D1#4U0`9&,W,C@P7T-O<F53879E3W)I9VEN86Q#1$(`9&,W,C@P7TU6
-M7T1U;7!297%U97-T`&1C-S(X,%],:7-T7T=E=$9I<G-T`&1C-S(X,%]30U-)
-M7T%405]&:6QL1&%T849I96QD`&1C-S(X,%]30U-)7T%405]3>6YC0V%C:&54
-M<F%N<VQA=&EO;@!D8S<R.#!?4T=024]?26YI=&EA;&EZ90!D8S<R.#!?1G)E
-M95--4$-O;G1E>'0`9&,W,C@P7T9I;&Q%;F-L;W-U<F5%;&5M96YT4W1A='5S
-M`&1C-S(X,%]#;W)E7TUO9'5L94EN:71I86QI>F4`9&,W,C@P7U-!5$%?4$U3
-M=&%T94UA8VAI;F4`9&,W,C@P7T9R9650351O4&]O;`!D8S<R.#!?4T%405]0
-M<F5P87)E0V]M;6%N9%1A8FQE`&1C-S(X,%]#;W)E7TUO9'5L94=E=%)E<V]U
-M<F-E475O=&$`9&,W,C@P7T9R96531T)U9F9E<E1O4&]O;`!D8S<R.#!?5&%G
-M7TEN:71?1DE&3P!D8S<R.#!?4T-325]!5$%?4F5A9$-A<&%C:71Y5')A;G-L
-M871I;VY#86QL8F%C:P!D8S<R.#!?7U]035]C86YC96Q?=&EM97(`9&,W,C@P
-M7TU67T1U;7!296=I<W1E<@!D8S<R.#!?4V5R=FEC94EN=&5R<G5P=`!D8S<R
-M.#!?27-S=65?1&ES8V]V97(`9&,W,C@P7T1)4T-?1&]$:7-C;W9E<@!D8S<R
-M.#!?4T%405](86YD;&5$979I8V55;G!L=6<`9&,W,C@P7T-O<F5?26YT97)N
-M86Q396YD4F5Q=65S=`!D8S<R.#!?1$E30U]3971297-O=7)C90!D8S<R.#!?
-M4T%405]035](86YD;&5$979I8V55;G!L=6<`9&,W,C@P7U-!5$%?4&]R=$1E
-M=FEC941E=&5C=&5D`&1C-S(X,%]5<&1A=&5487)G971$979I8V5S`&1C-S(X
-M,%]30U-)7T%405]3=&%R=%-T;W!4<F%N<VQA=&EO;@!D8S<R.#!?0V]R95]P
-M87-S7W1H<G5?9FEL;%]T87-K9FEL90!D8S<R.#!?;79?9&ES86)L95]R96=I
-M<W1E<E]S970`9&,W,C@P7T%S<VEG;D1E=FEC945L96UE;G1.=6UB97(`9&,W
-M,C@P7T=E=$UI;DYE9V]T:6%T961,:6YK4F%T90!D8S<R.#!?;79?<V5T7U-!
-M4T%D9'(`9&,W,C@P7U!-7T9R965296=I<W1E<E-E=`!D8S<R.#!?17AP86YD
-M97)?4TU04F5Q=65S=%]0:'E#;VYT<F]L`&1C-S(X,%]-5E]%<75A;',`9&,W
-M,C@P7T=E=%-'0G5F9F5R1G)O;5!O;VP`9&,W,C@P7U-#4TE?051!7TQO=V5R
-M5V]R9`!D8S<R.#!?0VAE8VM$979I8V5#:&%N9V4`9&,W,C@P7U-!4U]%<G)O
-M<DAA;F1L:6YG`&1C-S(X,%]"965P3VX`9&,W,C@P7U-'4$E/7U--4%)E<5]#
-M86QL8F%C:P!D8S<R.#!?4T=486)L95]!=F%I;&%B;&4`9&,W,C@P7U--4%]3
-M1U!)3U]3971?1F%I;&QE9`!D8S<R.#!?0V]R95]&:6QL4V5N<V5$871A`&1C
-M-S(X,%]'971335!38W)A=&-H1G)O;5!O;VP`9&,W,C@P7U-!5$%?4&]R=$1E
-M=FEC95)E861Y`&1C-S(X,%]M=E]E;F%B;&5?>&UT`&1C-S(X,%]!<W-I9VY2
-M96=I<W1E<E-E=`!D8S<R.#!?;V1I;E]I;V-T;`!D8S<R.#!?27-S=65?4F5P
-M;W)T4F]U=&5);F9O`&1C-S(X,%]'971);G1E<FYA;%)E<49R;VU0;V]L`&1C
-M-S(X,%]#:&5C:U1A<F=E=$-H86YG90!D8S<R.#!?1&5V:6-E7U=R:71E4V5S
-M0V]N=')O;$1I86<`9&,W,C@P7T-O;7!L971E4F5Q=65S=`!D8S<R.#!?4G5N
-M=&EM94ES<W5E4V]F=%)E<V5T`&1C-S(X,%]$979I8V5?27-S=653;V9T4F5S
-M970`9&,W,C@P7U-!5$%?2&%N9&QE1&5V:6-E4&QU9VEN`&1C-S(X,%]0<F5P
-M87)E06YD4V5N9$-O;6UA;F0`9&,W,C@P7U!R945M<'1Y4$T`9&,W,C@P7U-#
-M4TE?36%K94-A8VAE0V]M;6%N9`!D8S<R.#!?0V]M<&QE=&5297%U97-T06YD
-M4VQO=`!D8S<R.#!?1$E30U]'971.96=O=&EA=&5D3&EN:U)A=&4`9&,W,C@P
-M7T9I;F12=6YN:6YG4F5Q0GE486<`9&,W,C@P7W-E=%]F86EL7VQE9',`9&,W
-M,C@P7T9I;F1&<F5E4TU00V]N=&5X=`!D8S<R.#!?4T%37T1E=FEC95-T871E
-M36%C:&EN90!D8S<R.#!?1FEN9%1G=$YO`&1C-S(X,%])<W-U95]297!O<G1'
-M96YE<F%L`&1C-S(X,%]#86QC=6QA=&52;W5T94EN9&5X`&1C-S(X,%]M=E]R
-M97-E=%]X;70`9&,W,C@P7TU67T-20P!D8S<R.#!?4T-325]!5$%?4F5A9$-A
-M<&%C:71Y5')A;G-L871I;VX`9&,W,C@P7TU67U)E;6]V951A<F=E=$E$`&1C
-M-S(X,%]3051!7U!-7T5R<F]R2&%N9&QI;F<`9&,W,C@P7U5P9&%T95-T871U
-M<U9S4V5S0V]N=')O;$)U9F9E<@!D8S<R.#!?0V]R95]'9713=7!P;W)T961#
-M;W5N=',`9&,W,C@P7TU67U-E=$Q"06%N9%-E8W1O<D-O=6YT`&1C-S(X,%]$
-M979I8V5?36%K94UO9&5396QE8W1297%U97-T`&1C-S(X,%]'971/;F5#;VUM
-M86YD4VQO=`!D8S<R.#!?4T=024]?4F5A9%)E9VES=&5R`&1C-S(X,%]%>'!A
-M;F1E<E]335!297%U97-T7U)E<&]R=%!(65-!5$$`9&,W,C@P7U!O<G1?2&%N
-M9&QE4&QU9VEN`&1C-S(X,%]#;W)E7U)E<51I;65O=70`9&,W,C@P7VUO9&50
-M86=E0G5F`&1C-S(X,%]2=6YT:6UE27-S=65296%D3&]G17AT`&1C-S(X,%]3
-M0U-)7T%405]5<'!E<E=O<F0`9&,W,C@P7T9R965#;W)E0V]N=&5X=%1O4&]O
-M;`!D8S<R.#!?4T537TEN=&5R;F%L4F5Q0V%L;&)A8VL`9&,W,C@P7U-!5$%?
-M17)R;W)(86YD;&EN9P!D8S<R.#!?1V5T4$U&<F]M4&]O;`!D8S<R.#!?1&5T
-M96-T4&]R=%1Y<&4`9&,W,C@P7T1E=FEC95]-86ME36]D95-E;G-E4F5Q=65S
-M=`!D8S<R.#!?4T-325]!5$%?1FEL;$Q"04-D8C$P`&1C-S(X,%]?7V-A;F-E
-M;%]T:6UE<@!D8S<R.#!?4T%405]0;W)T4F5S970`9&,W,C@P7V]D:6Y?<V5T
-M7VED;&5?<W1A;F1B>0!D8S<R.#!?17AP86YD97)?4TU04F5Q=65S=%]$:7-C
-M;W9E<@!D8S<R.#!?5&%G7T=E=$]N90!D8S<R.#!?4T%405]0<F5P87)E0V]M
-M;6%N9$AE861E<@!D8S<R.#!?0V%T96=O<GE?0T1"7U1Y<&4`9&,W,C@P7T9R
-M965);G1E<FYA;%)E<51O4&]O;`!D8S<R.#!?1V5T4T%405-C<F%T8VA&<F]M
-M4&]O;`!3=V%P2'!T365T858S`&QD;5]S<&EN=7!?=F1E=@!R87=?8VAE8VM?
-M9&ES:U]D97-C<FEP=&]R`&QD;5]C:&5C:U]A<G)A>0!L9&U?<F5C:&5C:U]A
-M;&P`=F1E=E]C;&%S<U]L:7-T`')A=U]I9&QE7W1I;65R7W)E<V5T`&QD;5]D
-M96QE=&5?<&%R=&ET:6]N`&QD;5]S>6YC7V-H86YG961?87)R87ES`&=R96)U
-M:6QD;VYE<G)O<@!L9&U?<75E=65?979E;G0`=')A;G-F;W)M7VYE961E9`!L
-M9&U?8VAE8VM?=')A;G-F;W)M`&QD;5]F:7AU<%]A<G)A>5]S=&%T90!C86QC
-M7W)E8G5I;&1?<')O9W)E<W,`=F)U<U]E>'1?<VEZ90!S971?=')A;G-F;W)M
-M7W-T97!?:6YF;P!L9&U?:61L95]T:6UE<@!L9&U?9FEN9%]V9&5V7W)A=P!L
-M9&U?<F5P<F]B95]D979I8V4`8V%L8U]T<F%N<V9O<FU?<')O9W)E<W,`;&1M
-M7V9I;F1?=F1E=E]C;&%S<P!L9&U?86QL;V-?<&%R=&ET:6]N`&QD;5]I;FET
-M7V1I<VL`<F5F<F5S:%]R87=?9&5V7VEN9F\`7V1E;&5T95]R87=?<&%R=`!R
-M87=?<F5A9%]W<FET95]S96-T;W)S`&=I9&QE<W1A;F1B>71I;65O=70`<F%W
-M7V-H96-K7V%R<F%Y7V1E<V-R:7!T;W(`;&1M7V-R96%T95]V9&5V7W)A=P!U
-M;G!L=6=?<F%W7W9D978`0VAE8VM3=6T`8V]M<&%R95]S;&]T7W-E<5]B>5]P
-M8VEA9&1R`&QD;5]A9&1?9&ES:U]T;U]A<G)A>0!L9&U?<WEN8U]D:7-K7VEN
-M9F\`9V5T7V)I=',`4W=A<$AP=$UE=&%6-`!R87=?8V]N=F5R=%]S<&%R95]T
-M;U]L96=A8WD`9DYO=&EF>4=520!L9&U?9FQU<VA?86QL7W1A<F=E=',`;&1M
-M7W-T87)T7W)E8G5I;&0`;&1M7W-P:6YD;W=N7V%L;%]R87=D979S`%]?;&1M
-M7V9I;FES:%]C;60`241?5$]?5D1%5@!?7W9D979?<75E=65?8VUD`')A=U]I
-M9&QE7W1I;65R7V-H96-K`&=E=%]S=')I<%]I;F9O`&QD;5]R97-U;65?861A
-M<'1E<@!H<'1N<E]L9&U?<F5G:7-T97)?:&EM7U)?-E\U-5\W-5\T-E\V-`!H
-M<'1N<E]G1VQO8F%L3F-Q1FQA9P!H<'1N<E]O<U]R97%U97-T7W1I;65R`&AP
-M=&YR7V1M87!O;VQ?9V5T7W!A9V4`:'!T;G)?;W-?9V5T7W-T86UP`&AP=&YR
-M7VQD;5]S=7-P96YD`&AP=&YR7VQD;5]I9&QE`&AP=&YR7VQD;5]G971?;65M
-M7VEN9F\`:'!T;G)?;&1M7W)E;6]V95]T:6UE<@!H<'1N<E]P8VEC9F=?<F5A
-M9%]D=V]R9`!H<'1N<E]D;6%P;V]L7VUA:V5?;W)D97(`:'!T;G)?;&1M7V=E
-M=%]V8G5S7V5X=`!H<'1N<E]L9&U?<F5L96%S95]V9&5V`&AP=&YR7V9R965L
-M:7-T7W)E<V5R=F5?9&UA`&AP=&YR7VQD;5]I;G1R`&UE;6-P>0!H<'1N<E]L
-M9&U?;VY?=&EM97(`:'!T;G)?;&1M7V=E=%]C;61?<VEZ90!H<'1N<E]L9&U?
-M9G)E95]C;61S`&AP=&YR7VQD;5]C<F5A=&5?=F1E=@!H<'1N<E]L9&U?861D
-M7W-P87)E7W1O7V%R<F%Y`&AP=&YR7V=R96)U:6QD<')I;W)I='D`:'!T;G)?
-M;&1M7W-Y;F-?87)R87E?:6YF;P!H<'1N<E]O<U]M87!?<&-I7V)A<@!H<'1N
-M<E]?7VQD;5]A;&QO8U]C;60`:'!T;G)?:6YI=%]M;V1U;&5?=F1E=E]R87<`
-M:'!T;G)?;&1M7W-E=%]A=71O<F5B=6EL9`!H<'1N<E]?7V1U;6UY7W)E9P!H
-M<'1N<E]D;6%P;V]L7V%C=&EV90!H<'1N<E]V8G5S7VQI<W0`:'!T;G)?;&1M
-M7W%U975E7W9B=7-?9'!C`&AP=&YR7VQD;5]R97-E=%]V8G5S`&AP=&YR7V=3
-M1U!)3U!A<G13=7!P;W)T`&AP=&YR7VEN:71?;6]D=6QE7VAI;5]R-S4P`&AP
-M=&YR7VQD;5]R96QE87-E7VQO8VL`:'!T;G)?;W-?=6YM87!?<&-I7V)A<@!H
-M<'1N<E]L9&U?<VAU=&1O=VX`:'!T;G)?:&EM7VQI<W0`:'!T;G)?;&1M7W)E
-M<75E<W1?=&EM97(`:'!T;G)?;&1M7W)E<W5M90!H<'1N<E]L9&U?9V5T7V1E
-M=FEC95]I9`!H<'1N<E]O<U]S8VAE9'5L95]T87-K`&AP=&YR7VQD;5]I;V-T
-M;`!H<'1N<E]G4W!I;G5P3VYE1&5V16%C:%1I;64`:'!T;G)?9G)E96QI<W1?
-M<'5T`&AP=&YR7V]S7W-T86QL97AE8P!H<'1N<E]G7VQE9V%C>5]M;V1E`&AP
-M=&YR7VQD;5]A;&QO8U]C;61S7U)?-E\U-5\W-5\T-E\V-`!H<'1N<E]L9&U?
-M<G5N`&AP=&YR7VEN:71?;6]D=6QE7VAI;5]D8S<R.#``:'!T;G)?;&1M7V9R
-M965?8VUD<U]T;U]L:7-T`&AP=&YR7V]S7VUA>%]C86-H95]S:7IE`&AP=&YR
-M7W9D979?<75E=65?8VUD`&AP=&YR7V]S7V=E=%]V8G5S7W-E<0!H<'1N<E]L
-M9&U?<WEN8U]A<G)A>5]S=&%M<`!H<'1N<E]L9&U?<75E=65?8VUD`&AP=&YR
-M7V]S7W!R:6YT:P!H<'1N<E]F<F5E;&ES=%]R97-E<G9E`&AP=&YR7V1M87!O
-M;VQ?<'5T7W!A9V4`:'!T;G)?9G)E96QI<W1?9V5T`&AP=&YR7VQD;5]U;G)E
-M9VES=&5R7V1E=FEC90!H<'1N<E]L9&U?<F5G:7-T97)?861A<'1E<@!H<'1N
-M<E]G875T;W)E8G5I;&0`:'!T;G)?;&1M7V=E=%]V8G5S7W-I>F4`:'!T;G)?
-M9&5L87E?8F5T=V5E;E]S<&EN=7``:'!T;G)?;&1M7V=E;F5R:6-?;65M8F5R
+M4W1A<G0`<C<U,%]#;W)E7TAA;F1L95=A:71I;F=,:7-T`'(W-3!?4')E16UP
+M='E030!R-S4P7U-!5$%?2&%N9&QE1&5V:6-E4&QU9VEN`'(W-3!?4T-325]4
+M;U]&25,`<C<U,%]3051!7U!O<G1297-E=`!R-S4P7T=E=$]N94-O;6UA;F13
+M;&]T`'(W-3!?;79?<F5S971?<&AY`'(W-3!?5W)I=&5$14Q67U%?16YT<GD`
+M<C<U,%]O9&EN7W-E=%]I9&QE7W-T86YD8GD`<C<U,%]'9710349R;VU0;V]L
+M`'(W-3!?359?17%U86QS`'(W-3!?2&%N9&QE0V]M;6%N9%%U975E`'!M7VEN
+M:71?<F5Q7V-A;&QB86-K`'(W-3!?4T-325]!5$%?4F5A9%=R:71E5')A;G-L
+M871I;VX`<C<U,%]31U1A8FQE7T%P<&5N9`!R-S4P7U!-7T%S<VEG;E)E9VES
+M=&5R4V5T`'!O<G1?<V5T7V9A:6Q?;&5D`'(W-3!?4T%405]$979I8V53=&%T
+M94UA8VAI;F4`<C<U,%]0<F5%;7!T>41E=FEC90!R-S4P7U]?8V%N8V5L7W1I
+M;65R`'(W-3!?0V]R95]P87-S7W1H<G5?9FEL;%]T87-K9FEL90!R-S4P7U-'
+M4$E/7TEN:71I86QI>F4`<C<U,%]0;W)T7TAA;F1L941E=FEC95!L=6=I;@!R
+M-S4P7U-'4$E/7U-E=%]&86EL;&5D`'-E=%]P;5]F86EL7VQE9',`<C<U,%]-
+M5E]#;W!Y4T=486)L90!U<&1A=&5?9&5V:6-E7V-O;F9I9P!R-S4P7T-O<F5?
+M36]D=6QE16YA8FQE1&ES86)L94E240!R-S4P7U1A9U]);FET7T9)1D\`36%K
+M941E=DEN9F\`4$U?27-S=657<FET949A:6Q,960`<C<U,%]O9&EN7V9L87-H
+M7V%C8V5S<P!3051!7U!-4W1A=&5-86-H:6YE4W!I;E5P`'(W-3!?4T%405]0
+M;W)T1&5V:6-E4F5A9'D`<C<U,%]486=?4F5L96%S94]N90!R-S4P7T9R9653
+M1T)U9F9E<E1O4&]O;`!R-S4P7T1E=&5C=%!O<G14>7!E`'!M7VUA:V5?<&U?
+M<F5G:7-T97)?<F5Q`'(W-3!?1&5V:6-E7U!A<G-E261E;G1I9GE$871A`'(W
+M-3!?9&5V:6-E7W!R;V)E7V1O;F4`<C<U,%]"965P3V9F`&=E=%]F:7)S=%]P
+M;0!/9&EN4U!)7U-E8W1O<E5N<')O=&5C=`!P;5]W86ET7V9O<E]S<&EN=7``
+M<C<U,%]31U1A8FQE7TEN:70`<C<U,%]3051!7U!-7T5R<F]R2&%N9&QI;F<`
+M4T%405](86YD;&5035](;W10;'5G`'(W-3!?4T-325]!5$%?1FEL;$Q"04-D
+M8C$V`$=E=$%T=$ED96YT:69Y1G)A;64`<C<U,%]#871E9V]R>5]#1$)?5'EP
+M90!R-S4P7TQI<W1?1V5T3&%S=`!R-S4P7T9R9650351O4&]O;`!R-S4P7VUV
+M7V1I<V%B;&5?<F5G:7-T97)?<V5T`'(W-3!?4T%405]0;W)T1&5V:6-E1&5T
+M96-T960`<C<U,%]0;W)T7TAA;F1L955N<&QU9P!R-S4P7T%405]#1$(R5&%S
+M:T9I;&4`<C<U,%]-5E]296UO=F5487)G971)1`!O9&EN7W-E=%]H87)D7V1I
+M<VM?:61E;G1I9GD`<C<U,%]31U1A8FQE7T%V86EL86)L90!0;W)T36%P7U(W
+M-3``1V5T1&5V261E;G1I9GE&<F%M90!I,F-"7W)E861?8GET97,`<V%S7V%D
+M9')E<W-?8V]U;G0`<&U?<W1A=&5?;6%C:&EN90!R-S4P7U!R97!A<F5$96QI
+M=F5R>5%U975E16YT<GD`57!D871E2&EM4&%T:$ED`'(W-3!?0V]R95]-;V1U
+M;&53:'5T9&]W;@!R-S4P7U!-7T-O<F5?4F5Q5&EM96]U=`!R-S4P7U5P9&%T
+M95=I9&50;W)T4&AY36%P`'(W-3!?07-S:6=N4F5G:7-T97)3970`<C<U,%]3
+M97)V:6-E26YT97)R=7!T`'(W-3!?;79?9&ES86)L95]X;70`=7!D871E7V1E
+M=FEC95]C;VYF:6=?=C(`<C<U,%]#;W)E7TUO9'5L94=E=%)E<V]U<F-E475O
+M=&$`<C<U,%]0;W)T7U-O9G1297-E=$-A;&QB86-K`'(W-3!?;79?<F5S971?
+M>&UT`'(W-3!?;79#:&%N;F5L4W1A=&5-86-H:6YE`'(W-3!?23)#7TUO9'5L
+M94EN:71I86QI>F4`<C<U,%]O9&EN7W)E;6]V95]D979I8V4`<C<U,%]'9710
+M;W)T1G)O;5!O;VP`<C<U,%]-5E]$=6UP4F5G:7-T97(`<&U?:&]T7W!L=6=?
+M<F5Q7V-A;&QB86-K`%!-7TES<W5E4F5A9$9A:6Q,960`9&,W,C@P7U-'5&%B
+M;&5?07!P96YD`$UA:V5!='1$979);F9O`&1C-S(X,%]&<F5E4T%405-C<F%T
+M8VA4;U!O;VP`9&,W,C@P7U!O<G1?06)O<G1297%U97-T<P!035]7<FET95)E
+M9U-Y;F,`9&,W,C@P7U-!5$%?4&]R=$AA;F1L94EN=&5R<G5P=`!D8S<R.#!?
+M4T537U-E=$9A:6Q,960`9&,W,C@P7U-!4U]);G1E<FYA;%)E<4-A;&QB86-K
+M`&1C-S(X,%])<W-U95]297!O<G1-86YU9F%C='5R97));F9O<FUA=&EO;@!D
+M8S<R.#!?4&]R=%]-;VYI=&]R`&1C-S(X,%]#;W)E7TUA:V5$979I8V5297-E
+M=%)E<0!D8S<R.#!?4T-325]4;U]&25,`9&,W,C@P7V]D:6Y?<F5M;W9E7V1E
+M=FEC90!D8S<R.#!?4T%405]034EN:71297%#86QL8F%C:P!D8S<R.#!?4$U?
+M0V]R95]297%4:6UE;W5T`&1C-S(X,%]$25-#7T=E=%1G=$1E=DUA<`!D8S<R
+M.#!?;V1I;E]F;&%S:%]A8V-E<W,`9&,W,C@P7T9R965335!38W)A=&-H5&]0
+M;V]L`&1C-S(X,%]$:7-C;W9E<GE#86QL0F%C:P!D8S<R.#!?5&%G7U)E;&5A
+M<V5/;F4`9&,W,C@P7T-O<F5?36]D=6QE4V5N9%)E<75E<W0`9&,W,C@P7TU6
+M7TUA<%1O4W!E8VEF:6-487)G971)1`!D8S<R.#!?1V5T4$U$979I8V4`9&,W
+M,C@P7U-44%]$979I8V5297-E=`!D8S<R.#!?1V5T0V]R94-O;G1E>'1&<F]M
+M4&]O;`!D8S<R.#!?359?26YI=&EA;&EZ951A<F=E=$E$5&%B;&4`9&,W,C@P
+M7U!R945M<'1Y1&5V:6-E`&1C-S(X,%]/9&EN4U!)7TEN:70`9&,W,C@P7T%4
+M05]#1$(R5&%S:T9I;&4`9&,W,C@P7U--4%)E<W!,96YG=&@`9&,W,C@P7VUV
+M7W)E<V5T7W!H>0!$979I8V5?36%K95!R:79A=&5396YD4V5S4F5Q=65S=`!D
+M8S<R.#!?4&]R=%]&:6YD5&=T3F\`07-S:6=N16QE;65N1&5S8W)I<'1O<DYA
+M;64`9&,W,C@P7U-'4$E/7U=R:71E4F5G:7-T97(`1&5V:6-E7TUA:V5397-%
+M;&5M96YT4W1A='5S4F5Q=65S=%1I;65R`&1C-S(X,%]#;W)E7TEN=&5R<G5P
+M=%-E<G9I8V52;W5T:6YE`&1C-S(X,%]M=E]D:7-A8FQE7WAM=`!D8S<R.#!?
+M4T%405]0;W)T1&5T96-T`%!-7U)E861296=3>6YC`&1C-S(X,%]&<F5E1&5V
+M:6-E5&]0;V]L`&1C-S(X,%]%>'!A;F1E<E]335!297%?0V%L;&)A8VL`9&,W
+M,C@P7T1E=FEC95]-86ME4V5S4F-V1&EA9U)E<75E<W0`9&,W,C@P7U!O<G1?
+M4V]F=%)E<V5T0V%L;&)A8VL`9&,W,C@P7TES<W5E7T-O;F9I9U)O=71E26YF
+M;P!D8S<R.#!?4&]R=%])<U)E<75E<W12=6YN:6YG`&1C-S(X,%]697)I9GE#
+M;VUM86YD0F5F;W)E4V5N9&EN9P!D8S<R.#!?1&5V:6-E7TUA:V53=&%R=%-T
+M;W!5;FET4F5Q=65S=`!D8S<R.#!?1G)E945X<&%N9&5R5&]0;V]L`&1C-S(X
+M,%]#;W)E4F5S=&]R94]R:6=I;F%L0T1"`&1C-S(X,%]0;W-T36%K95-E<T5N
+M8VQO<W5R95-T871U<U)E<75E<W0`9&,W,C@P7V1U;7!?=6YA<W-O8VEA=&5D
+M7V9I<P!D8S<R.#!?359?6F5R;TUV4F5Q=65S=`!D8S<R.#!?1V5T4&]R=$9R
+M;VU0;V]L`&1C-S(X,%]&:6YD07-C:6E.=6UB97(`9&,W,C@P7U-!4U]0;W)T
+M4F5S970`9&,W,C@P7TU67T=E=$UA<'!E9$E$`&1C-S(X,%]30U-)7T%405]2
+M96%D5W)I=&54<F%N<VQA=&EO;@!D8S<R.#!?4&]S=$UA:V5397-#;VYF:6=U
+M<F%T:6]N4F5Q=65S=`!D8S<R.#!?1&5V:6-E7TUA:V5297%U97-T5&%S:U)E
+M<75E<W0`9&,W,C@P7U!O<G1?2&%N9&QE1&5V:6-E4&QU9VEN`&1C-S(X,%]0
+M35]!<W-I9VY296=I<W1E<E-E=`!D8S<R.#!?0V]R95]297-E=$-M9%-L;W0`
+M9&,W,C@P7VUV7V1I<V%B;&5?:&)A`&1C-S(X,%]?7V%D9%]T:6UE<@!D8S<R
+M.#!?4T-325]-86ME36]D95!A9V5#86-H:6YG`&1C-S(X,%]#3U)%7TES<W5E
+M4TU04F5Q=65S=`!S971?96U?9F%I;%]L960`9&,W,C@P7T%S<VEG;D1E=FEC
+M94]V97)A;&Q%;&5M96YT3G5M8F5R`&1C-S(X,%]7<FET941%3%9?45]%;G1R
+M>0!D8S<R.#!?4T-325]!5$%?5F5R:69Y5')A;G-L871I;VX`9&,W,C@P7V-O
+M<F5?:&%N9&QE7W1A<VMF:6QE7V5R<F]R`&1C-S(X,%]31U!)3U]335!297%U
+M97-T7U=R:71E`&1C-S(X,%]305-?2&%N9&QE0V]M<&QE=&5D0V]M;6%N9`!D
+M8S<R.#!?1&5V:6-E7TUA:V5296%D0V%P86-I='DQ-E1A<VM297%U97-T`&1C
+M-S(X,%]0;W-T36%K95-E<T5L96UE;G13=&%T=7-297%U97-T`&1C-S(X,%]3
+M051!7U!-7TAA;F1L941E=FEC95!L=6=I;@!D8S<R.#!?;V1I;E]S971?<W!I
+M;E]U<%]M;V1E`&1C-S(X,%]#;W)E7TAA;F1L95=A:71I;F=,:7-T`&1C-S(X
+M,%]0<F5P87)E1&5L:79E<GE1=65U945N=')Y`&1C-S(X,%]31U!)3U]335!2
+M97%U97-T7U)E860`9&,W,C@P7T1)4T-?0V%N8V5L1&ES8V]V97(`9&,W,C@P
+M7U5P9&%T95=I9&50;W)T4&AY36%P`&1C-S(X,%](86YD;&5#;VUM86YD475E
+M=64`9&,W,C@P7T1)4T-?1V5T4F5S;W5R8V4`9&,W,C@P7U-#4TE?051!7T9I
+M;&Q,0D%#9&(Q-@!D8S<R.#!?0V]R95]-;V1U;&5%;F%B;&5$:7-A8FQE25)1
+M`&1C-S(X,%]I,F-?<F5S970`9&,W,C@P7T9R965296=I<W1E<E-E=`!D8S<R
+M.#!?0F5E<$]F9@!S971?96U?9F%I;%]L961S`&1C-S(X,%]$25-#7T-H96-K
+M1&ES8V]V97)3=&%T90!D8S<R.#!?17AP86YD97)?4TU04F5Q=65S=%]297!O
+M<G1'96YE<F%L`&1C-S(X,%]),D-?36]D=6QE26YI=&EA;&EZ90!D8S<R.#!?
+M9&5V:6-E7W!R;V)E7V1O;F4`9&,W,C@P7U)E;6]V941E=FEC90!D8S<R.#!?
+M4G5N=&EM94ES<W5E4V]F=%)E<V5T0V%L;&)A8VL`9&,W,C@P7U-'4$E/7U-E
+M=%]&86EL;&5D`&1C-S(X,%]'971-87A.96=O=&EA=&5D3&EN:U)A=&4`9&,W
+M,C@P7T9R965315-30E1O4&]O;`!D8S<R.#!?3&ES=%]'971,87-T`&1C-S(X
+M,%]035])<W-U95=R:71E4F5G`&1C-S(X,%]S971?9F%I;%]L960`9&,W,C@P
+M7U1A9U])<T5M<'1Y`&1C-S(X,%]5<&1A=&549W1$979-87``9&,W,C@P7U1A
+M9U]);FET`&=E=%]I9%]F<F]M7V5N8TED`%-%4U]0<FEV871E4F5Q0V%L;&)A
+M8VL`9&,W,C@P7U-!5$%?4$U(;W1P;'5G4F5Q0V%L;&)A8VL`4T%37U)E<&]R
+M=$QU;E-C86X`9&,W,C@P7U!O<W1-86ME4V5S16QE;65N=$1E<V-R:7!T;W)2
+M97%U97-T`&1C-S(X,%]&<F5E4&]R=%1O4&]O;`!D8S<R.#!?359?36%P5&%R
+M9V5T240`9&,W,C@P7U!-7TES<W5E4F5A9%)E9P!D8S<R.#!?0V]R95]-;V1U
+M;&53:'5T9&]W;@!D8S<R.#!?57!D871E4&AY26YF;P!D8S<R.#!?7U]R96YE
+M=U]T:6UE<@!D8S<R.#!?1&5V:6-E7TUA:V5296%D0V%P86-I='E487-K4F5Q
+M=65S=`!D8S<R.#!?1V5T1&5V:6-E1G)O;5!O;VP`9&,W,C@P7T=E=%-%4U-"
+M1G)O;5!O;VP`9&,W,C@P7T%S<VEG;D5L96UE;G13;&]T3G5M8F5R`$%S<VEG
+M;E-E<T]T:&5R16QE;65N=$]V97)A;&Q%;&5M96YT3G5M8F5R`&1C-S(X,%]0
+M;W)T7TAA;F1L955N<&QU9P!D8S<R.#!?0V]R95]-;V1U;&53=&%R=`!D8S<R
+M.#!?1&ES8V]V97)Y4TT`9&,W,C@P7U-#4TE?051!7T-H96-K0V]N9&ET:6]N
+M`&1C-S(X,%]-5E]#;W!Y4T=486)L90!D8S<R.#!?4T%405]$979I8V53=&%T
+M94UA8VAI;F4`9&,W,C@P7T1E=FEC95]-86ME26YQ=6ER>51A<VM297%U97-T
+M`&1C-S(X,%]$979I8V5?4&%R<V5)9&5N=&EF>41A=&$`9&,W,C@P7U-!5%-E
+M;G-E1&%T80!D8S<R.#!?1V5T3D-15&%G`&]D:6Y?96U?86-C97-S`&1C-S(X
+M,%]M=D-H86YN96Q3=&%T94UA8VAI;F4`9&,W,C@P7U-T;W)E7T-O;F9I9U)O
+M=71E26YF;P!D8S<R.#!?4T=486)L95]);FET`&1C-S(X,%]'971%>'!A;F1E
+M<D9R;VU0;V]L`$1E=FEC95]297!O<G1,=6Y297%U97-T`&1C-S(X,%]305-?
+M2&%N9&QE0E)$0U-4`&1C-S(X,%]#;W)E4V%V94]R:6=I;F%L0T1"`&1C-S(X
+M,%]-5E]$=6UP4F5Q=65S=`!D8S<R.#!?3&ES=%]'971&:7)S=`!D8S<R.#!?
+M4T-325]!5$%?1FEL;$1A=&%&:65L9`!D8S<R.#!?4T-325]!5$%?4WEN8T-A
+M8VAE5')A;G-L871I;VX`9&,W,C@P7U-'4$E/7TEN:71I86QI>F4`9&,W,C@P
+M7T9R965335!#;VYT97AT`&1C-S(X,%]&:6QL16YC;&]S=7)E16QE;65N=%-T
+M871U<P!D8S<R.#!?0V]R95]-;V1U;&5);FET:6%L:7IE`&1C-S(X,%]3051!
+M7U!-4W1A=&5-86-H:6YE`&1C-S(X,%]&<F5E4$U4;U!O;VP`9&,W,C@P7U-!
+M5$%?4')E<&%R94-O;6UA;F1486)L90!D8S<R.#!?0V]R95]-;V1U;&5'9712
+M97-O=7)C95%U;W1A`&1C-S(X,%]&<F5E4T="=69F97)4;U!O;VP`9&,W,C@P
+M7U1A9U]);FET7T9)1D\`9&,W,C@P7U-#4TE?051!7U)E861#87!A8VET>51R
+M86YS;&%T:6]N0V%L;&)A8VL`9&,W,C@P7U]?4$U?8V%N8V5L7W1I;65R`&1C
+M-S(X,%]-5E]$=6UP4F5G:7-T97(`9&,W,C@P7U-E<G9I8V5);G1E<G)U<'0`
+M1&5V:6-E7TUA:V50<FEV871E4F5C=E-E<U)E<75E<W0`9&,W,C@P7TES<W5E
+M7T1I<V-O=F5R`&1C-S(X,%]$25-#7T1O1&ES8V]V97(`9&,W,C@P7U-!5$%?
+M2&%N9&QE1&5V:6-E56YP;'5G`&1C-S(X,%]#;W)E7TEN=&5R;F%L4V5N9%)E
+M<75E<W0`9&,W,C@P7T1)4T-?4V5T4F5S;W5R8V4`9&,W,C@P7U-!5$%?4$U?
+M2&%N9&QE1&5V:6-E56YP;'5G`&1C-S(X,%]3051!7U!O<G1$979I8V5$971E
+M8W1E9`!D8S<R.#!?57!D871E5&%R9V5T1&5V:6-E<P!D8S<R.#!?4T-325]!
+M5$%?4W1A<G13=&]P5')A;G-L871I;VX`8VAE8VM?4V%S061D<@!D8S<R.#!?
+M0V]R95]P87-S7W1H<G5?9FEL;%]T87-K9FEL90!D8S<R.#!?;79?9&ES86)L
+M95]R96=I<W1E<E]S970`1&5V:6-E7U1E<W15;FET4F5A9'E297%U97-T`&1C
+M-S(X,%]!<W-I9VY$979I8V5%;&5M96YT3G5M8F5R`&1C-S(X,%]'971-:6Y.
+M96=O=&EA=&5D3&EN:U)A=&4`9&,W,C@P7VUV7W-E=%]305-!9&1R`&1C-S(X
+M,%]035]&<F5E4F5G:7-T97)3970`9&,W,C@P7T5X<&%N9&5R7U--4%)E<75E
+M<W1?4&AY0V]N=')O;`!D8S<R.#!?359?17%U86QS`&1C-S(X,%]'97131T)U
+M9F9E<D9R;VU0;V]L`&1C-S(X,%]30U-)7T%405],;W=E<E=O<F0`9&,W,C@P
+M7T-H96-K1&5V:6-E0VAA;F=E`&1C-S(X,%]305-?17)R;W)(86YD;&EN9P!D
+M8S<R.#!?0F5E<$]N`&1C-S(X,%]31U!)3U]335!297%?0V%L;&)A8VL`<V-S
+M:6QU;E]T;U]I;G0`9&,W,C@P7U-'5&%B;&5?079A:6QA8FQE`&1C-S(X,%]3
+M35!?4T=024]?4V5T7T9A:6QL960`9&,W,C@P7T-O<F5?1FEL;%-E;G-E1&%T
+M80!D8S<R.#!?1V5T4TU04V-R871C:$9R;VU0;V]L`&1C-S(X,%]3051!7U!O
+M<G1$979I8V5296%D>0!D8S<R.#!?;79?96YA8FQE7WAM=`!D8S<R.#!?07-S
+M:6=N4F5G:7-T97)3970`9&,W,C@P7V]D:6Y?:6]C=&P`9&,W,C@P7TES<W5E
+M7U)E<&]R=%)O=71E26YF;P!D8S<R.#!?1V5T26YT97)N86Q297%&<F]M4&]O
+M;`!D8S<R.#!?0VAE8VM487)G971#:&%N9V4`9&,W,C@P7T1E=FEC95]7<FET
+M95-E<T-O;G1R;VQ$:6%G`%-%4U1I;65R7TEN=&5R;F%L4F5Q0V%L;&)A8VL`
+M9V5T7V5N8U]C;W5N=`!D8S<R.#!?0V]M<&QE=&5297%U97-T`&1C-S(X,%]2
+M=6YT:6UE27-S=653;V9T4F5S970`9&,W,C@P7T1E=FEC95])<W-U95-O9G12
+M97-E=`!D8S<R.#!?4T%405](86YD;&5$979I8V50;'5G:6X`9&,W,C@P7U!R
+M97!A<F5!;F1396YD0V]M;6%N9`!G971?;6EN7W!M4&%T:$ED`&1C-S(X,%]0
+M<F5%;7!T>5!-`&1C-S(X,%]30U-)7TUA:V5#86-H94-O;6UA;F0`9&,W,C@P
+M7T-O;7!L971E4F5Q=65S=$%N9%-L;W0`9&,W,C@P7T1)4T-?1V5T3F5G;W1I
+M871E9$QI;FM2871E`&1C-S(X,%]&:6YD4G5N;FEN9U)E<4)Y5&%G`&1C-S(X
+M,%]S971?9F%I;%]L961S`&1C-S(X,%]&:6YD1G)E95--4$-O;G1E>'0`4F5M
+M;W9E4T%31&5V:6-E`&1C-S(X,%]305-?1&5V:6-E4W1A=&5-86-H:6YE`&1C
+M-S(X,%]&:6YD5&=T3F\`9&,W,C@P7TES<W5E7U)E<&]R=$=E;F5R86P`9&,W
+M,C@P7T-A;&-U;&%T95)O=71E26YD97@`9&,W,C@P7VUV7W)E<V5T7WAM=`!D
+M8S<R.#!?359?0U)#`&1C-S(X,%]30U-)7T%405]296%D0V%P86-I='E4<F%N
+M<VQA=&EO;@!D8S<R.#!?359?4F5M;W9E5&%R9V5T240`9&,W,C@P7U-!5$%?
+M4$U?17)R;W)(86YD;&EN9P!D8S<R.#!?57!D871E4W1A='5S5G-397-#;VYT
+M<F]L0G5F9F5R`&1C-S(X,%]#;W)E7T=E=%-U<'!O<G1E9$-O=6YT<P!D8S<R
+M.#!?359?4V5T3$)!86YD4V5C=&]R0V]U;G0`9&,W,C@P7T1E=FEC95]-86ME
+M36]D95-E;&5C=%)E<75E<W0`9&,W,C@P7T=E=$]N94-O;6UA;F13;&]T`&1C
+M-S(X,%]31U!)3U]296%D4F5G:7-T97(`9&,W,C@P7T5X<&%N9&5R7U--4%)E
+M<75E<W1?4F5P;W)T4$A94T%400!D8S<R.#!?4&]R=%](86YD;&50;'5G:6X`
+M9&,W,C@P7T-O<F5?4F5Q5&EM96]U=`!D8S<R.#!?;6]D95!A9V5"=68`9&,W
+M,C@P7U)U;G1I;65)<W-U95)E861,;V=%>'0`9&,W,C@P7U-#4TE?051!7U5P
+M<&5R5V]R9`!D8S<R.#!?1G)E94-O<F5#;VYT97AT5&]0;V]L`&1C-S(X,%]3
+M15-?26YT97)N86Q297%#86QL8F%C:P!D8S<R.#!?4T%405]%<G)O<DAA;F1L
+M:6YG`&1C-S(X,%]'9710349R;VU0;V]L`&1C-S(X,%]$971E8W10;W)T5'EP
+M90!D8S<R.#!?1&5V:6-E7TUA:V5-;V1E4V5N<V5297%U97-T`&1C-S(X,%]3
+M0U-)7T%405]&:6QL3$)!0V1B,3``9&,W,C@P7U]?8V%N8V5L7W1I;65R`&1C
+M-S(X,%]3051!7U!O<G1297-E=`!D8S<R.#!?;V1I;E]S971?:61L95]S=&%N
+M9&)Y`&1C-S(X,%]%>'!A;F1E<E]335!297%U97-T7T1I<V-O=F5R`&1C-S(X
+M,%]486=?1V5T3VYE`&1C-S(X,%]3051!7U!R97!A<F5#;VUM86YD2&5A9&5R
+M`&1C-S(X,%]#871E9V]R>5]#1$)?5'EP90!D8S<R.#!?1G)E94EN=&5R;F%L
+M4F5Q5&]0;V]L`&1C-S(X,%]'9713051!4V-R871C:$9R;VU0;V]L`%-W87!(
+M<'1-971A5C,`;&1M7W-P:6YU<%]V9&5V`')A=U]C:&5C:U]D:7-K7V1E<V-R
+M:7!T;W(`;&1M7V-H96-K7V%R<F%Y`&QD;5]R96-H96-K7V%L;`!V9&5V7V-L
+M87-S7VQI<W0`<F%W7VED;&5?=&EM97)?<F5S970`;&1M7V1E;&5T95]P87)T
+M:71I;VX`;&1M7W-Y;F-?8VAA;F=E9%]A<G)A>7,`9W)E8G5I;&1O;F5R<F]R
+M`&QD;5]Q=65U95]E=F5N=`!T<F%N<V9O<FU?;F5E9&5D`&QD;5]C:&5C:U]T
+M<F%N<V9O<FT`;&1M7V9I>'5P7V%R<F%Y7W-T871E`&-A;&-?<F5B=6EL9%]P
+M<F]G<F5S<P!V8G5S7V5X=%]S:7IE`'-E=%]T<F%N<V9O<FU?<W1E<%]I;F9O
+M`&QD;5]I9&QE7W1I;65R`&QD;5]F:6YD7W9D979?<F%W`&QD;5]R97!R;V)E
+M7V1E=FEC90!C86QC7W1R86YS9F]R;5]P<F]G<F5S<P!L9&U?9FEN9%]V9&5V
+M7V-L87-S`&QD;5]A;&QO8U]P87)T:71I;VX`;&1M7VEN:71?9&ES:P!R969R
+M97-H7W)A=U]D979?:6YF;P!?9&5L971E7W)A=U]P87)T`')A=U]R96%D7W=R
+M:71E7W-E8W1O<G,`9VED;&5S=&%N9&)Y=&EM96]U=`!R87=?8VAE8VM?87)R
+M87E?9&5S8W)I<'1O<@!L9&U?8W)E871E7W9D979?<F%W`'5N<&QU9U]R87=?
+M=F1E=@!#:&5C:U-U;0!C;VUP87)E7W-L;W1?<V5Q7V)Y7W!C:6%D9'(`;&1M
+M7V%D9%]D:7-K7W1O7V%R<F%Y`&QD;5]S>6YC7V1I<VM?:6YF;P!G971?8FET
+M<P!3=V%P2'!T365T858T`')A=U]C;VYV97)T7W-P87)E7W1O7VQE9V%C>0!F
+M3F]T:69Y1U5)`&QD;5]F;'5S:%]A;&Q?=&%R9V5T<P!L9&U?<W1A<G1?<F5B
+M=6EL9`!L9&U?<W!I;F1O=VY?86QL7W)A=V1E=G,`7U]L9&U?9FEN:7-H7V-M
+M9`!)1%]43U]61$56`%]?=F1E=E]Q=65U95]C;60`<F%W7VED;&5?=&EM97)?
+M8VAE8VL`9V5T7W-T<FEP7VEN9F\`;&1M7W)E<W5M95]A9&%P=&5R`&AP=&YR
+M7VQD;5]R96=I<W1E<E]H:6U?4E\V7S4U7S<U7S0V7S8T`&AP=&YR7V=';&]B
+M86Q.8W%&;&%G`&AP=&YR7V]S7W)E<75E<W1?=&EM97(`:'!T;G)?9&UA<&]O
+M;%]G971?<&%G90!H<'1N<E]O<U]G971?<W1A;7``:'!T;G)?;&1M7W-U<W!E
+M;F0`:'!T;G)?;&1M7VED;&4`:'!T;G)?;&1M7V=E=%]M96U?:6YF;P!H<'1N
+M<E]L9&U?<F5M;W9E7W1I;65R`&AP=&YR7W!C:6-F9U]R96%D7V1W;W)D`&AP
+M=&YR7V1M87!O;VQ?;6%K95]O<F1E<@!H<'1N<E]L9&U?9V5T7W9B=7-?97AT
+M`&AP=&YR7VQD;5]R96QE87-E7W9D978`:'!T;G)?9G)E96QI<W1?<F5S97)V
+M95]D;6$`:'!T;G)?;&1M7VEN='(`;65M8W!Y`&AP=&YR7VQD;5]O;E]T:6UE
+M<@!H<'1N<E]L9&U?9V5T7V-M9%]S:7IE`&AP=&YR7VQD;5]F<F5E7V-M9',`
+M:'!T;G)?;&1M7V-R96%T95]V9&5V`&AP=&YR7VQD;5]A9&1?<W!A<F5?=&]?
+M87)R87D`:'!T;G)?9W)E8G5I;&1P<FEO<FET>0!H<'1N<E]L9&U?<WEN8U]A
+M<G)A>5]I;F9O`&AP=&YR7V]S7VUA<%]P8VE?8F%R`&AP=&YR7U]?;&1M7V%L
+M;&]C7V-M9`!H<'1N<E]I;FET7VUO9'5L95]V9&5V7W)A=P!H<'1N<E]L9&U?
+M<V5T7V%U=&]R96)U:6QD`&AP=&YR7U]?9'5M;7E?<F5G`&AP=&YR7V1M87!O
+M;VQ?86-T:79E`&AP=&YR7W9B=7-?;&ES=`!H<'1N<E]L9&U?<75E=65?=F)U
+M<U]D<&,`:'!T;G)?;&1M7W)E<V5T7W9B=7,`:'!T;G)?9U-'4$E/4&%R=%-U
+M<'!O<G0`:'!T;G)?:6YI=%]M;V1U;&5?:&EM7W(W-3``:'!T;G)?;&1M7W)E
+M;&5A<V5?;&]C:P!H<'1N<E]O<U]U;FUA<%]P8VE?8F%R`&AP=&YR7VQD;5]S
+M:'5T9&]W;@!H<'1N<E]H:6U?;&ES=`!H<'1N<E]L9&U?<F5Q=65S=%]T:6UE
+M<@!H<'1N<E]L9&U?<F5S=6UE`&AP=&YR7VQD;5]G971?9&5V:6-E7VED`&AP
+M=&YR7V]S7W-C:&5D=6QE7W1A<VL`:'!T;G)?;&1M7VEO8W1L`&AP=&YR7V=3
+M<&EN=7!/;F5$979%86-H5&EM90!H<'1N<E]F<F5E;&ES=%]P=70`:'!T;G)?
+M;W-?<W1A;&QE>&5C`&AP=&YR7V=?;&5G86-Y7VUO9&4`:'!T;G)?;&1M7V%L
+M;&]C7V-M9'-?4E\V7S4U7S<U7S0V7S8T`&AP=&YR7VQD;5]R=6X`:'!T;G)?
+M:6YI=%]M;V1U;&5?:&EM7V1C-S(X,`!H<'1N<E]L9&U?9G)E95]C;61S7W1O
+M7VQI<W0`:'!T;G)?;W-?;6%X7V-A8VAE7W-I>F4`:'!T;G)?=F1E=E]Q=65U
+M95]C;60`:'!T;G)?;W-?9V5T7W9B=7-?<V5Q`&AP=&YR7VQD;5]S>6YC7V%R
+M<F%Y7W-T86UP`&AP=&YR7VQD;5]Q=65U95]C;60`:'!T;G)?;W-?<')I;G1K
+M`&AP=&YR7V9R965L:7-T7W)E<V5R=F4`:'!T;G)?9&UA<&]O;%]P=71?<&%G
+M90!H<'1N<E]F<F5E;&ES=%]G970`:'!T;G)?;&1M7W5N<F5G:7-T97)?9&5V
+M:6-E`&AP=&YR7VQD;5]R96=I<W1E<E]A9&%P=&5R`&AP=&YR7V=A=71O<F5B
+M=6EL9`!H<'1N<E]L9&U?9V5T7W9B=7-?<VEZ90!H<'1N<E]D96QA>5]B971W
+M965N7W-P:6YU<`!H<'1N<E]M<VD`:'!T;G)?;&1M7V=E;F5R:6-?;65M8F5R
M7V9A:6QE9`!H<'1N<E]D;6%P;V]L7V=E=%]P86=E7V%T`&AP=&YR7VQD;5]E
M=F5N=%]N;W1I9GD`:'!T;G)?;&1M7V-R96%T95]V8G5S`&AP=&YR7VAI;5]H
M86YD;&5?=&]?=F)U<P!H<'1N<E]F<F5E;&ES=%]G971?9&UA`&AP=&YR7VQD
M;5]G971?;F5X=%]V8G5S`&AP=&YR7V]S7W!C:5]W<FET96P`:'!T;G)?;&1M
-M7V9I;F1?=&%R9V5T`&AP=&YR7V1M87!O;VQ?<F5G:7-T97)?8VQI96YT`&AP
-M=&YR7VQD;5]I;FET:6%L:7IE7W9B=7-?87-Y;F,`:'!T;G)?;W-?<75E<GE?
-M=&EM90!H<'1N<E]O<U]Q=65R>5]R96UO=F5?9&5V:6-E`&AP=&YR7VQD;5]R
-M96=I<W1E<E]D979I8V4`:'!T;G)?;W-?<&-I7W)E861L`&AP=&YR7VQD;5]A
-M8W%U:7)E7VQO8VL`:'!T;G)?;W-?<F5V86QI9&%T95]D979I8V4`:'!T;G)?
-M9&UA<&]O;%]I;FET`&AP=&YR7VQD;5]F:6YI<VA?8VUD`&AP=&YR7VQD;5]I
-M9&5?9FEX<W1R:6YG`&AP=&YR7V1M87!O;VQ?;6%X7V-L87-S7W!A9V5S`&AP
-M=&YR7VQD;5]R96=I<W1E<E]V9&5V7V-L87-S7U)?-E\U-5\W-5\T-E\V-`!H
-M<'1N<E]N=6U?9')I=F5S7W!E<E]S<&EN=7``:'!T;G)?;&1M7W)E;&5A<V5?
-M=F)U<P!H<'1N<E]L9&U?<75E=65?=&%S:P!H<'1N<E]L9&U?86QL;V-?8VUD
-M<U]F<F]M7VQI<W0`:'!T;G)?9G)E96QI<W1?<'5T7V1M80!H<'1N<E]L9&U?
-M=&EM97)?<')O8F5?9&5V:6-E`&AP=&YR7VQD;5]F:6YD7W-T86UP`&AP=&YR
-M7VQD;5]C:&5C:U]A<G)A>5]O;FQI;F4`:'!T;G)?9U!R;V)E26Y);FET:6%L
-M:7II;F<`:'!T;G)?;&]G7W-E8W1O<E]R97!A:7(``'D``````````@```(H`
-M``#\_________Y(``````````@```),```#\_________Z<``````````@``
-M`"P```#\_________S4!````````"P````$````P`````````$T!````````
-M`@```.P```#\_________V,!`````````@```*X```#\_________VX!````
-M`````@```#X```#\_________X8!`````````@```*0"``#\_________Y$!
-M`````````@```$(```#\_________[`!`````````@```"D```#\________
-M_[\!`````````@```%<```#\_________\H!`````````@```"P```#\____
-M_____^@!`````````@```"P```#\_________P,"`````````@```%8```#\
-M_________R`"`````````@```*````#\_________X("`````````@```.P`
-M``#\_________Y8"`````````@```*X```#\_________S@%`````````@``
-M`$X```#\_________[H'````````"P````,``````````````%L(````````
-M"P````4``````````````&4(`````````@```*\"``#\_________Z`(````
-M`````@```(8"``#\_________X`)`````````@```)("``#\_________ZT)
-M`````````@```)("``#\_________PT*`````````@```)("``#\________
-M_X\*`````````@```)("``#\_________\D*`````````@```)("``#\____
-M_____RX+`````````@```*0"``#\_________VD+`````````@```*0"``#\
-M_________[<+`````````@```*0"``#\__________(+`````````@```*0"
-M``#\_________T@,`````````@```!$!``#\_________U(,`````````@``
-M`*0"``#\_________UP,`````````@```&<```#\_________S<-````````
-M`@```)("``#\_________U0-`````````@```)("``#\_________V,-````
-M`````@```*0"``#\_________W\-`````````@```)("``#\_________YP-
-M`````````@```)("``#\_________\H-`````````@```)("``#\________
-M_]0-`````````@```)("``#\__________P-`````````@```*0"``#\____
-M_____PD.`````````@```)("``#\_________S$.`````````@```*0"``#\
-M_________SX.`````````@```)("``#\_________V\.`````````@```)("
-M``#\_________Z`.`````````@```)("``#\_________P4/`````````@``
-M`)("``#\_________R4/`````````@```)("``#\_________TP/````````
-M`@```)("``#\_________VP/`````````@```)("``#\_________YP/````
-M`````@```)("``#\_________Z8/`````````@```)("``#\_________](/
-M`````````@```*0"``#\_________^(/`````````@```)("``#\________
-M_PH0`````````@```*0"``#\_________QH0`````````@```)("``#\____
-M_____R02`````````@```)("``#\_________VP2`````````@```-,```#\
-M_________Y@2`````````@```-,```#\_________P83`````````@```"X`
-M``#\_________V03`````````@```'\"``#\_________W`3`````````@``
-M`/8```#\_________XD3`````````@```&@```#\_________R\4````````
-M`@```"X```#\_________UX4`````````@```!@```#\_________V\4````
-M`````@```+(```#\_________XP4````````"P````$!`````````````)L4
-M````````"P````4```!8`````````*44`````````@```*\"``#\________
-M_[H4`````````@```+H"``#\_________\\4`````````@```+H"``#\____
-M_____^<4`````````@```#H```#\_________P@5`````````@```)("``#\
-M__________P5````````"P```)4```````````````$6`````````@```,(`
-M``#\_________^T6`````````@```($```#\__________@6`````````@``
-M`"P```#\_________^X7`````````@```+P```#\_________V$;````````
-M`@```/0```#\_________]D;`````````@```.````#\_________QP<````
-M`````@```+P```#\_________[P<````````"P````,`````!````````-4<
-M`````````@```!L```#\_________P<=`````````@```!L```#\________
-M_S<=`````````@```!L```#\_________V,=`````````@```!L```#\____
-M_____YH=`````````@```$T```#\_________^8=`````````@````D!``#\
-M_________W@>`````````@```)\```#\_________[<>`````````@```!0`
-M``#\_________^$>`````````@```*0"``#\_________SLA`````````@``
-M`*(```#\_________THA`````````@```'@```#\_________P$B````````
-M`@```/P```#\_________WLB`````````@```,$```#\_________Y@B````
-M`````@```/P```#\_________[PC`````````@```(0```#\_________\\C
-M`````````@````(!``#\_________STD`````````@```(0```#\________
-M_VDD`````````@````(!``#\_________P(F`````````@```$0```#\____
-M_____^HF`````````@```(8"``#\_________P0G````````"P````,```!0
-M!````````)<G`````````@```!,```#\_________Z8G`````````@```!,`
-M``#\_________R,H`````````@```(0```#\_________T\H`````````@``
-M``(!``#\_________[XH`````````@````<!``#\__________(H````````
-M`@```+````#\_________PLI`````````@````<!``#\_________QHI````
-M`````@````\!``#\_________S,I`````````@````<!``#\_________X,I
-M`````````@```*0```#\_________Y@I````````"P````4```!X````````
-M`*(I`````````@```*\"``#\_________Q0J`````````@```&@```#\____
-M_____R8J`````````@```&\```#\_________\(J`````````@```)$```#\
-M_________S\K`````````@```)$```#\_________T\K`````````@```"0`
-M``#\_________WDK`````````@```)$```#\_________Y<K`````````@``
-M`-X```#\_________\0K`````````@```$\```#\_________X,L````````
-M`@```'$```#\_________Z8L`````````@```-X```#\_________\\L````
-M`````@```)H```#\__________8L`````````@```)$```#\__________XL
-M`````````@```)H```#\_________R,M`````````@```-X```#\________
-M_XDM`````````@```#L```#\_________]<M`````````@```%4```#\____
-M______LM`````````@```&@```#\_________S(N`````````@```+H"``#\
-M_________T8N`````````@```#L```#\_________V0N`````````@```$(`
-M``#\_________VXN`````````@```*0"``#\_________[TN`````````@``
-M`+<```#\_________\0N`````````@```.X```#\_________]HN````````
-M"P````8``````````````.0N`````````@```*\"``#\_________QLO````
-M`````@```#L```#\_________RXO`````````@```%@```#\_________S8O
-M`````````@```)H```#\_________\<O`````````@```)("``#\________
-M__,O`````````@```)("``#\_________RPP`````````@```)("``#\____
-M_____VHP````````"P````4```"H`````````'0P`````````@```*\"``#\
-M_________[`P`````````@```+T```#\_________P8Q`````````@```+T`
-M``#\_________QLQ`````````@```+\```#\_________R8Q`````````@``
-M`'$```#\_________]@Q`````````@```-L```#\__________\Q````````
-M`@```-X```#\_________S0R`````````@```&@```#\_________](R````
-M`````@```-L```#\__________0R`````````@```-X```#\_________S<S
-M`````````@```&T```#\_________V@T`````````@```)("``#\________
-M_X8T`````````@```)("``#\_________Z,T`````````@```)("``#\____
-M_____P@U`````````@```)("``#\_________R\U`````````@```)("``#\
-M_________YLU`````````@```-P```#\__________@U`````````@```)("
-M``#\_________QLV`````````@```)("``#\_________SXV`````````@``
-M`)("``#\_________T8V`````````@```&0```#\_________S<W````````
-M`@```!(!``#\_________UHW`````````@```(8"``#\_________T(X````
-M`````@```(8"``#\_________[`X`````````@```(8"``#\_________^0X
-M`````````@```)("``#\_________Q\Y`````````@```)("``#\________
-M_W,Y`````````@```)("``#\_________U$Z`````````@```(8"``#\____
-M_____Z4[`````````@```(8"``#\_________RT\`````````@```(8"``#\
-M_________T`\````````"P````,```"P"0```````-4\`````````@```*0"
-M``#\_________U,]`````````@```)("``#\_________W<]`````````@``
-M`)("``#\_________Y@]````````"P````8````>`````````*(]````````
-M`@```*\"``#\_________ZP]`````````@```!`!``#\_________\P]````
-M`````@```)("``#\_________PP^`````````@```)("``#\_________YT^
-M`````````@```)("``#\_________R(_`````````@```!`!``#\________
-M_S$_`````````@```!`!``#\_________WP_````````"P````4```#X````
-M`````(8_`````````@```*\"``#\_________^\_````````"P````8````Y
-M`````````/D_`````````@```*\"``#\_________PM``````````@```"$`
-M``#\_________S5`````````"P````4````X`0```````#]``````````@``
-M`*\"``#\_________[)`````````"P````4```!@`0```````+Q`````````
-M`@```*\"``#\_________UY!`````````@```-L```#\_________W=!````
-M`````@```-X```#\_________RI"`````````@```#4```#\_________XY#
-M`````````@```"$```#\_________YY#`````````@```"X```#\________
-M_^)#`````````@```'````#\_________TE$`````````@```-L```#\____
-M_____U1$`````````@```#4```#\_________VU$`````````@```-X```#\
-M_________\=$`````````@```&@```#\_________T!%`````````@```&X`
-M``#\_________W=%`````````@```&@```#\_________QM&`````````@``
-M`)("``#\_________TI&`````````@```&@```#\_________W]&````````
-M`@```"X```#\_________Y!&`````````@```)H```#\_________]E&````
-M`````@```)("``#\_________P)'`````````@```)("``#\_________S-'
-M`````````@```)("``#\_________TA'`````````@```*D```#\________
-M_[Q'`````````@```)("``#\_________T%(`````````@```)("``#\____
-M_____VQ(`````````@```)("``#\_________WY(`````````@```(\```#\
-M_________\%(`````````@```)("``#\_________^9(`````````@```)("
-M``#\_________V-)`````````@```)("``#\_________XQ)`````````@``
-M`)("``#\_________[A)`````````@```'\"``#\_________]E)````````
-M`@```/H```#\_________QE*`````````@```&@```#\_________T]*````
-M`````@```+H"``#\_________V-*`````````@```#L```#\_________X%*
-M`````````@```(4```#\_________XM*`````````@```*0"``#\________
-M_[M*````````"P````$````@8````````.E*`````````@```)T"``#\____
-M_____Q-+`````````@```)("``#\_________RA+`````````@```)("``#\
-M_________U!+`````````@```)("``#\_________V5+`````````@```)("
-M``#\_________Y9+`````````@```)("``#\_________\U+`````````@``
-M`)("``#\_________PM,`````````@```)("``#\_________S-,````````
-M`@```)("``#\_________VA,`````````@```)("``#\_________Y],````
-M`````@```)("``#\_________P9-`````````@```)("``#\_________RM-
-M`````````@```)("``#\_________U!-`````````@```)("``#\________
-M_W5-`````````@```)("``#\_________[1-`````````@```'\"``#\____
-M_____^Y-`````````@```+H"``#\_________P).`````````@```#L```#\
-M_________Q1.`````````@```$(```#\_________QY.`````````@```*0"
-M``#\_________TM.````````"P```.X``````````````&-.`````````@``
-M`)T"``#\_________XY.`````````@```)("``#\_________\!.````````
-M`@```)("``#\__________E.`````````@```)("``#\_________R5/````
-M`````@```)("``#\_________VI/`````````@```'\"``#\_________X1/
-M`````````@```&@```#\_________[1/`````````@```+H"``#\________
-M_])/````````"P````X!`````````````.1/`````````@```)T"``#\____
-M_____Q-0`````````@```)("``#\_________SE0`````````@```)("``#\
-M_________U=0`````````@```*0"``#\_________VQ0`````````@```)("
-M``#\_________Y)0`````````@```)("``#\_________[A0`````````@``
-M`)("``#\_________]90`````````@```*0"``#\_________^M0````````
-M`@```)("``#\_________Q!1`````````@```)("``#\_________]91````
-M`````@```)("``#\__________M1`````````@```*0"``#\_________RM2
-M`````````@```)("``#\_________U)2`````````@```*0"``#\________
-M_X52`````````@```)("``#\_________ZQ2`````````@```*0"``#\____
-M______)2`````````@```,4```#\_________PU3`````````@```(8```#\
-M_________QE3`````````@```!(```#\_________TM3`````````@```$``
-M``#\_________W]3`````````@```!<```#\_________ZQ3`````````@``
-M`!(```#\_________Y)4`````````@```*0"``#\_________[E4````````
-M`@```)("``#\_________]A4`````````@```*0"``#\__________M4````
-M`````@```)("``#\_________R=5`````````@```*0"``#\_________TY5
-M`````````@```)("``#\_________W)5`````````@```*0"``#\________
-M_Y95`````````@```)("``#\_________[=5`````````@```&@```#\____
-M_____S16`````````@```#L```#\_________V]6`````````@```#L```#\
-M_________WM6`````````@```!(```#\_________[U6`````````@```&@`
-M``#\_________^)6`````````@```&@```#\_________P-7`````````@``
-M`'\"``#\_________R17`````````@```$(```#\_________RY7````````
-M`@```*0"``#\_________^97`````````@```"X```#\_________PY8````
-M`````@```!@```#\_________Q]8`````````@```+(```#\_________S)8
-M````````"P````8```!&`````````#Q8`````````@```*\"``#\________
-M_U%8`````````@```+H"``#\_________V98`````````@```+H"``#\____
-M_____X-8`````````@```#H```#\_________Z)8`````````@```(L```#\
-M_________\U8````````"P````$!`````````````-58`````````@```&@`
-M``#\__________I8`````````@```$(```#\_________P19`````````@``
-M`*0"``#\_________SM9`````````@```!@```#\_________TQ9````````
-M`@```+(```#\_________WA9````````"P````4```!8`````````()9````
-M`````@```*\"``#\_________Y=9`````````@```+H"``#\_________ZQ9
-M`````````@```+H"``#\_________\19`````````@```#H```#\________
-M_]E9`````````@```$````#\_________UI:`````````@```)("``#\____
-M_____WQ:`````````@```*0"``#\_________Y]:`````````@```)("``#\
-M_________\):`````````@```)("``#\_________^1:`````````@```*0"
-M``#\_________PA;`````````@```)("``#\_________Y);`````````@``
-M`/H```#\_________YY;`````````@```'T```#\_________^5;````````
-M`@```'4```#\__________);`````````@```/L```#\_________RA<````
-M`````@```*0"``#\_________T-<`````````@```)("``#\_________V)<
-M`````````@```)("``#\_________X%<`````````@```!(```#\________
-M_XE<`````````@````T!``#\_________[%<`````````@```)T```#\____
-M_____SA=`````````@````X!``#\_________T5=`````````@```&@```#\
-M_________]!=`````````@```",!``#\_________P1>`````````@```+<`
-M``#\_________SU>`````````@```,P```#\_________U5>`````````@``
-M`+H"``#\_________VU>`````````@```+H"``#\_________YI>````````
-M`@```*0"``#\_________[5>`````````@```)("``#\_________])>````
-M`````@```)("``#\__________%>`````````@```!(```#\__________E>
-M`````````@````T!``#\_________S]?`````````@```,4```#\________
-M_X1?`````````@```&@```#\_________P-@`````````@```)T```#\____
-M_____Q)@`````````@```"$!``#\_________XM@`````````@```)("``#\
-M_________[I@`````````@```)("``#\_________])@`````````@```',`
-M``#\_________]]@`````````@```/L```#\_________TEA`````````@``
-M`'<```#\_________VQA`````````@```-X```#\_________Y1A````````
-M`@```)H```#\_________[AA`````````@```)$```#\_________\!A````
-M`````@```)H```#\_________PEB`````````@```-X```#\_________UIB
-M`````````@```#L```#\_________VEB`````````@```&@```#\________
-M_YAB`````````@```+H"``#\_________ZQB`````````@```#L```#\____
-M_____\1B`````````@```$(```#\_________\YB`````````@```*0"``#\
-M_________^YB`````````@```.X```#\_________QUC`````````@```-X`
-M``#\_________T]C`````````@```#L```#\_________V9C`````````@``
-M`&@```#\_________X)C`````````@```!@```#\_________Y-C````````
-M`@```+(```#\_________ZAC`````````@```+H"``#\_________[UC````
-M`````@```+H"``#\_________]!C`````````@```#H```#\_________^)C
-M`````````@```/8```#\__________MC`````````@```)("``#\________
-M_U5D`````````@```!(```#\_________V!D`````````@```$````#\____
-M______9D`````````@```)("``#\_________Q%E`````````@```"$```#\
-M_________R%E`````````@```"X```#\_________T1E`````````@```"$`
-M``#\_________TQE`````````@```"D!``#\_________V5E````````"P``
-M``,````0"@```````'QE`````````@```"L!``#\_________YAE````````
-M`@```"L!``#\_________[1E`````````@```#L```#\_________]=E````
-M`````@```%4```#\_________^YE`````````@```*,```#\_________Q%F
-M`````````@```#L```#\_________R]F`````````@```%4```#\________
-M_T9F`````````@```#L```#\_________UAF`````````@```*,```#\____
-M_____W-F`````````@```#L```#\_________XAF`````````@```#L```#\
-M_________[QF`````````@```$(```#\_________\9F`````````@```*0"
-M``#\_________SEG`````````@```*8```#\_________U-G`````````@``
-M`*P```#\_________VQG`````````@```!@```#\_________WUG````````
-M`@```+(```#\_________Y!G````````"P````8```!&`````````)IG````
-M`````@```*\"``#\_________[!G`````````@```+H"``#\_________\9G
-M`````````@```+H"``#\_________]EG`````````@```#H```#\________
-M_P1H`````````@```&@```#\_________SMH`````````@```!\!``#\____
-M_____Y%H`````````@```'8```#\_________[-H`````````@```&@```#\
-M_________P1I````````"P````4```"X`0````````YI`````````@```*\"
-M``#\_________S)I`````````@```"$```#\_________V)I````````"P``
-M``4```#H`0```````&QI`````````@```*\"``#\_________^AI````````
-M"P````4```!@`0```````/)I`````````@```*\"``#\_________R5J````
-M````"P````4```"X`0```````"]J`````````@```*\"``#\_________\1J
-M`````````@```*D```#\_________]-K`````````@```-L```#\________
-M_Q)L`````````@```.T```#\_________SML````````"P````4```"X`0``
-M`````$5L`````````@```*\"``#\_________W)M`````````@```(8"``#\
-M_________YEM`````````@```)("``#\_________]!M`````````@```)("
-M``#\_________QYN`````````@```)("``#\_________X=N````````"P``
-M``$!`````````````*%N````````"P````4````8`@```````*MN````````
-M`@```*\"``#\_________^QN````````"P````4```!0`@```````/9N````
-M`````@```*\"``#\_________REO````````"P````4```"0`@```````#-O
-M`````````@```*\"``#\_________TMO````````"P````4```#0`@``````
-M`%5O`````````@```*\"``#\_________WIO````````"P````8```!<````
-M`````(1O`````````@```*\"``#\_________\%O````````"P````4`````
-M`P```````,MO`````````@```*\"``#\__________]O````````"P````8`
-M``!X``````````EP`````````@```*\"``#\_________RQP````````"P``
-M``8```"/`````````#9P`````````@```*\"``#\_________T%P````````
-M"P````8```"K`````````$MP`````````@```*\"``#\_________YMP````
-M`````@````L!``#\_________^IP`````````@```)("``#\_________PYQ
-M`````````@```)("``#\_________S!Q`````````@```)("``#\________
-M_U1Q`````````@```)("``#\_________V-Q````````"P````8```"\````
-M`````&UQ`````````@```*\"``#\_________PAR`````````@```)("``#\
-M_________S-R````````"P````8```#9`````````#UR`````````@```*\"
-M``#\_________WYR````````"P````4````X`P```````(AR`````````@``
-M`*\"``#\_________YER`````````@```&0```#\_________[!R````````
-M`@```)("``#\_________UAS`````````@```)H```#\_________W5S````
-M`````@```$P```#\__________5S`````````@```"\```#\_________PET
-M`````````@```,````#\_________R]T`````````@```+`"``#\________
-M_U%T`````````@```+`"``#\_________W)T`````````@```+`"``#\____
-M_____Y!T`````````@```+`"``#\_________[9T`````````@```+`"``#\
-M_________^%T`````````@```+`"``#\__________MT`````````@```+`"
-M``#\_________Q5U`````````@```+`"``#\_________S-U`````````@``
-M`+`"``#\_________TUU`````````@```+`"``#\_________V]U````````
-M`@```+`"``#\_________Y%U`````````@```+`"``#\_________ZYU````
-M`````@```+`"``#\_________\MU`````````@```+`"``#\_________^AU
-M`````````@```+`"``#\_________P5V`````````@```+`"``#\________
-M_R%V`````````@```+`"``#\_________T-V`````````@```+`"``#\____
-M_____UQV`````````@```+`"``#\_________X!V`````````@```(0"``#\
-M_________Z!V`````````@```(0"``#\_________\=V`````````@```(0"
-M``#\_________^MV`````````@```(0"``#\_________P]W`````````@``
-M`(0"``#\_________S)W`````````@```(0"``#\_________U)W````````
-M`@```(0"``#\_________WQW`````````@```(0"``#\_________\=W````
-M`````@```&@```#\_________]=W`````````@```(H```#\_________U!X
-M````````"P````$````@%@```````%YX`````````@```.P```#\________
-M_VIX`````````@```#X```#\_________SEY`````````@```&@```#\____
-M_____VYY`````````@```+H"``#\_________X1Y`````````@```#L```#\
-M_________Y5Y`````````@```$(```#\_________Y]Y`````````@```*0"
-M``#\_________]!Y`````````@```%$```#\_________VE[`````````@``
-M`"\```#\_________^Q[`````````@```+("``#\_________RA\````````
-M`@```+("``#\_________V-\`````````@```+("``#\_________YI\````
-M`````@```+("``#\_________])\`````````@```+("``#\_________^5\
-M`````````@```+("``#\__________M\`````````@```+("``#\________
-M_V%]`````````@```+("``#\_________ZY]`````````@```+("``#\____
-M______Y]`````````@```+("``#\_________T%^`````````@```+("``#\
-M_________X]^`````````@```+("``#\_________^=^`````````@```+("
-M``#\_________RA_`````````@```+("``#\_________U%_`````````@``
-M`,T```#\_________UU_`````````@```+("``#\_________X9_````````
-M`@```!$```#\_________Y)_`````````@```+("``#\_________[M_````
-M`````@```!$```#\_________\=_`````````@```+("``#\__________!_
-M`````````@```!$```#\__________Q_`````````@```+("``#\________
-M_R6``````````@```!$```#\_________S&``````````@```+("``#\____
-M_____XV``````````@```-0```#\_________YJ#`````````@```+T"``#\
-M_________[2#`````````@```+T"``#\_________\Z#`````````@```+T"
-M``#\_________^B#`````````@```+T"``#\_________P*$`````````@``
-M`+T"``#\_________QR$`````````@```+T"``#\_________T2$````````
-M`@```&@```#\_________YF$`````````@```+T"``#\_________[J$````
-M`````@```&@```#\_________PN%`````````@```+T"``#\_________R^%
-M`````````@```&@```#\_________Z*%`````````@```&H```#\________
-M_P&&`````````@```)("``#\_________S2&`````````@```)("``#\____
-M_____TR&`````````@```/L```#\_________Y>&`````````@```#L```#\
-M_________ZB&`````````@```$(```#\_________[*&`````````@```*0"
-M``#\_________]J&`````````@```!@```#\_________^^&`````````@``
-M`+H"``#\_________P2'`````````@```+H"``#\_________QN'````````
-M`@```#H```#\_________RN'`````````@```)("``#\_________YJ'````
-M`````@```-,```#\_________\:'`````````@```+H"``#\_________S.(
-M`````````@```+\```#\_________V2(`````````@```&@```#\________
-M_[V(````````"P````$!`````````````,R(````````"P````4```!@`P``
-M`````-:(`````````@```*\"``#\_________QJ)````````"P````4```"0
-M`P```````"2)`````````@```*\"``#\_________U>)`````````@```"$`
-M``#\_________X>)````````"P````4```#H`0```````)&)`````````@``
-M`*\"``#\_________PV*````````"P````4```!@`0```````!>*````````
-M`@```*\"``#\_________SZ*````````"P````8```!<`````````$B*````
-M`````@```*\"``#\_________XJ*````````"P````4``````P```````)2*
-M`````````@```*\"``#\_________TB+````````"P````8```#M````````
-M`%*+`````````@```*\"``#\_________UJ+`````````@```*D```#\____
-M_____VZ,`````````@```-X```#\_________YB,`````````@```-L```#\
-M_________[B,`````````@```-P```#\__________Z,`````````@```&T`
-M``#\_________XR0`````````@```)X```#\__________&0`````````@``
-M`(8"``#\__________Z0`````````@```.<```#\_________W:1````````
-M`@```(8"``#\_________]Z1`````````@```(H```#\__________*1````
-M`````@```),```#\_________P62`````````@```"P```#\_________RB2
-M`````````@```(8"``#\_________WJ2````````"P```)@`````````````
-M`,22`````````@```.P```#\_________]62`````````@```*X```#\____
-M_____^"2`````````@```#X```#\_________T^3`````````@```(H```#\
-M_________V.3`````````@```),```#\_________W:3`````````@```"P`
-M``#\_________]J3````````"P```)@``````````````"F4`````````@``
-M`.P```#\_________SJ4`````````@```*X```#\_________T64````````
-M`@```#X```#\_________\B4`````````@```(H```#\_________]R4````
-M`````@```),```#\_________^^4`````````@```"P```#\_________PR5
-M`````````@```(8"``#\_________U"5````````"P```!\`````````````
-M`'25`````````@```.P```#\_________X.5`````````@```*X```#\____
-M_____XZ5`````````@```#X```#\__________&5`````````@```)X```#\
-M_________Q^6`````````@```#@```#\_________W.6`````````@```(H`
-M``#\_________X>6`````````@```),```#\_________YJ6`````````@``
-M`"P```#\_________^R6````````"P```!\```````````````V7````````
-M`@```.P```#\_________QV7`````````@```*X```#\_________RB7````
-M`````@```#X```#\_________]B7`````````@```%,```#\_________Q:8
-M`````````@```%,```#\_________U28`````````@```'0```#\________
-M_V*8`````````@```#(```#\_________Y&8`````````@```#8```#\____
-M_____ZJ8`````````@```#(```#\_________]B8`````````@```#(```#\
-M_________ZZ9`````````@```*\```#\__________&9`````````@```*H`
-M``#\_________RR:`````````@```#8```#\_________W.:`````````@``
-M`(H```#\_________X>:`````````@```),```#\_________YJ:````````
-M`@```"P```#\_________^V:````````"P```/(```````````````Z;````
-M`````@```.P```#\_________QV;`````````@```*X```#\_________RB;
-M`````````@```#X```#\_________R^<`````````@```"D```#\________
-M_SJ<`````````@```"P```#\_________VF<`````````@```(8"``#\____
-M_____Z^<`````````@```"D```#\_________[J<`````````@```"P```#\
-M_________V&=`````````@```!4!``#\_________W2=`````````@```"D`
-M``#\_________W^=`````````@```"P```#\_________YF=`````````@``
-M`'\"``#\_________ZZ=````````"P```#,``````````````,*=````````
-M`@```)T"``#\_________SZ>`````````@```*@```#\_________RV?````
-M`````@```!H!``#\_________V&?`````````@```!H!``#\_________YF?
-M`````````@```#8```#\_________P>A`````````@```&8```#\________
-M_QFA`````````@```,\```#\_________RZA`````````@```"(!``#\____
-M_____T"A`````````@```!4!``#\_________UJA`````````@```'\"``#\
-M_________V^A````````"P```#,``````````````(FA`````````@```)T"
-M``#\_________]6A`````````@```&@```#\_________T*B`````````@``
-M`",!``#\_________VBB`````````@```+<```#\_________XRB````````
-M`@```,P```#\__________2B`````````@```&@```#\_________R^C````
-M`````@```#8```#\_________UVC`````````@```!\!``#\_________XFC
-M`````````@```"D```#\_________YBC`````````@```"P```#\________
-M_]&C`````````@```#8```#\_________XFD`````````@```)("``#\____
-M______NH`````````@```&,```#\__________VI````````"P````,```!`
-M"@```````)>J`````````@```)("``#\_________\VJ`````````@```)("
-M``#\__________BJ`````````@```)("``#\_________S*K`````````@``
-M`)("``#\_________W>K`````````@```)("``#\_________ZVK````````
-M`@```)("``#\_________]BK`````````@```)("``#\_________PVL````
-M`````@```)("``#\_________\VL````````"P````,`````"P```````.FL
-M````````"P````,````%"P```````/FL````````"P````,````$"P``````
-M``JM````````"P````,`````"P```````!NM`````````@```,X```#\____
-M_____ZVM`````````@```&@```#\_________]VM`````````@```&@```#\
-M_________PVN`````````@```&@```#\_________UVN`````````@```&@`
-M``#\_________XVN`````````@```&@```#\_________PJO`````````@``
-M`&@```#\_________U.P`````````@```-L```#\_________Y"Q````````
-M`@```"$```#\_________].Q`````````@```/D```#\_________Q.R````
-M`````@```/D```#\_________P^S`````````@```"D```#\_________QVS
-M`````````@```(,```#\_________T>T`````````@```#X```#\________
-M_W"T`````````@```.H```#\_________WRT`````````@```&,```#\____
-M_____Y6T`````````@```-X```#\_________P*U`````````@```'<```#\
-M_________VZU`````````@```'$```#\_________TBV`````````@```"P`
-M``#\_________\.V`````````@```%<```#\_________\ZV`````````@``
-M`"P```#\_________P>W`````````@```&@```#\_________Q*W````````
-M`@```!T```#\_________QJW`````````@```&\```#\_________V"W````
-M`````@```(H```#\_________W"W`````````@```),```#\_________XJW
-M`````````@```"P```#\_________\VW````````"P```+0`````````````
-M`-BW`````````@```#X```#\_________Q.X`````````@```(H```#\____
-M_____U2X````````"P```+0``````````````%^X`````````@```#X```#\
-M_________Z^X`````````@```(H```#\_________\.X`````````@```),`
-M``#\_________]:X`````````@```"P```#\_________R&Y````````"P``
-M``$````@N@```````"ZY`````````@```.P```#\_________SZY````````
-M`@```*X```#\_________TFY`````````@```#X```#\_________Y2Y````
-M`````@```(H```#\_________]2Y````````"P```*T``````````````-^Y
-M`````````@```#X```#\_________^^Y`````````@```*0"``#\________
-M__NY`````````@```*0"``#\__________JZ`````````@```"D```#\____
-M_____PJ[`````````@```(,```#\_________Q6[`````````@```"P```#\
-M_________UB[`````````@```'P```#\_________WB[`````````@```"D`
-M``#\_________XB[`````````@```(,```#\_________Y.[`````````@``
-M`"P```#\_________Y*\`````````@```*0"``#\_________YV\````````
-M`@```"P```#\_________\^\`````````@```'P```#\_________]N\````
-M`````@```*0"``#\_________^:\`````````@```"P```#\_________S"]
-M`````````@```(H```#\_________W*]`````````@```!L```#\________
-M_X&]`````````@```"P```#\_________Y>]````````"P```+0`````````
-M`````**]`````````@```#X```#\_________^:]`````````@```(H```#\
-M_________P2^`````````@```),```#\_________QZ^`````````@```"P`
-M``#\_________X*^````````"P```+0``````````````).^`````````@``
-M`.P```#\_________Z6^`````````@```*X```#\_________["^````````
-M`@```#X```#\_________P._`````````@```(H```#\_________R2_````
-M`````@```),```#\_________T"_`````````@```"P```#\_________ZJ_
-M````````"P```+0``````````````+>_`````````@```.P```#\________
-M_\B_`````````@```*X```#\_________]._`````````@```#X```#\____
-M_____RK``````````@```(H```#\_________TC``````````@```),```#\
-M_________V3``````````@```"P```#\_________\+`````````"P```+0`
-M`````````````-;``````````@```.P```#\_________^?``````````@``
-M`*X```#\__________+``````````@```#X```#\_________TK!````````
-M`@```(H```#\_________VC!`````````@```),```#\_________X3!````
-M`````@```"P```#\_________]K!````````"P```+0``````````````.?!
-M`````````@```.P```#\__________C!`````````@```*X```#\________
-M_P/"`````````@```#X```#\_________W?"`````````@```(H```#\____
-M_____R7#````````"P````$```"`M0```````#/#`````````@```.P```#\
-M_________S[#`````````@```#X```#\_________Z'%`````````@```"L!
-M``#\_________[+%`````````@```%<```#\_________PS&`````````@``
-M`&@```#\_________^;&`````````@```)$```#\_________W7'````````
-M`@```(H```#\_________Y3'`````````@```!<!``#\_________Z?'````
-M`````@```"P```#\__________S'````````"P````P!``````````````K(
-M`````````@```.P```#\_________Q7(`````````@```#X```#\________
-M_W7(`````````@```(H```#\_________XG(`````````@```!<!``#\____
-M_____^#(````````"P````P!`````````````.[(`````````@```.P```#\
-M__________G(`````````@```#X```#\_________P/)`````````@```*0"
-M``#\_________US)`````````@```(H```#\_________VS)`````````@``
-M`!<!``#\_________[_)````````"P````P!`````````````,W)````````
-M`@```.P```#\_________]C)`````````@```#X```#\_________R7*````
-M`````@```(H```#\_________S7*`````````@```!<!``#\_________X3*
-M````````"P````P!`````````````)+*`````````@```.P```#\________
-M_YW*`````````@```#X```#\_________]3*`````````@```$T```#\____
-M_____^3*`````````@```"H```#\__________#+`````````@```$T```#\
-M_________P#,`````````@```"H```#\_________W#,`````````@```+D`
-M``#\_________P/-`````````@```)<```#\_________V'-`````````@``
-M`!,!``#\_________Y#-`````````@```$T```#\_________Z#-````````
-M`@```"H```#\_________P[.`````````@```)L```#\_________W+.````
-M`````@````@!``#\_________\C.`````````@```-L```#\_________^O.
-M`````````@```'<```#\__________S.`````````@````@!``#\________
-M_S//`````````@```-L```#\_________T3/`````````@````@!``#\____
-M_____V;/`````````@```'\"``#\_________XG/`````````@```'\"``#\
-M__________#/`````````@```&D```#\_________SK0`````````@```-L`
-M``#\_________U+0`````````@```'$```#\_________UW0`````````@``
-M`+\```#\_________QS1`````````@```&@```#\_________R_1````````
-M`@```'8```#\_________T[1````````"P````L!`````````````&71````
-M`````@```)T"``#\__________G1`````````@```&@```#\_________PS2
-M`````````@```+\```#\_________R?2````````"P```%(`````````````
-M`#[2`````````@```)T"``#\__________72`````````@```-L```#\____
-M_____P#3`````````@```#4```#\_________PO3`````````@```)$```#\
-M_________Z+3````````"P````L!`````````````+G3`````````@```)T"
-M``#\_________UK4````````"P```%(``````````````''4`````````@``
-M`)T"``#\_________R36`````````@```&@```#\_________W[6````````
-M`@```($```#\_________XW6`````````@```"P```#\_________\K6````
-M`````@```%4```#\__________K6`````````@```+<```#\_________Q;7
-M`````````@```$@```#\_________T?7`````````@```&@```#\________
-M_['7`````````@```",!``#\_________\?7`````````@```($```#\____
-M_____]37`````````@```"P```#\_________T38`````````@```#L```#\
-M_________W38`````````@```$(```#\_________W[8`````````@```*0"
-M``#\_________Z38`````````@```*8```#\_________[[8`````````@``
-M`*P```#\_________^W8`````````@```!@```#\__________[8````````
-M`@```+(```#\_________Q'9````````"P````8````*`0```````!O9````
-M`````@```*\"``#\_________S#9`````````@```+H"``#\_________T79
-M`````````@```+H"``#\_________XW9`````````@```#H```#\________
-M_[39`````````@```&@```#\__________+9`````````@```!\!``#\____
-M_____SC:`````````@```#L```#\_________V?:`````````@```$(```#\
-M_________W':`````````@```*0"``#\_________Y?:`````````@```*8`
-M``#\_________[':`````````@```*P```#\_________\S:`````````@``
-M`!@```#\_________]W:`````````@```+(```#\__________K:````````
-M"P````$!`````````````!/;````````"P````4```#(`P```````!W;````
-M`````@```*\"``#\_________S+;`````````@```+H"``#\_________[+;
-M`````````@```+H"``#\_________QS<`````````@```&@```#\________
-M_U'<`````````@```+H"``#\_________W'<`````````@```#H```#\____
-M_____\;<`````````@```(H```#\_________]K<`````````@```),```#\
-M__________3<`````````@```"P```#\_________WG=````````"P```+0`
-M`````````````(K=`````````@```.P```#\_________YS=`````````@``
-M`*X```#\_________Z?=`````````@```#X```#\_________^3=````````
-M`@```$T```#\__________3=`````````@```"H```#\_________^C>````
-M`````@````@!``#\_________RG?`````````@```"H```#\_________WW?
-M`````````@```&@```#\_________UKC`````````@```*@```#\________
-M_X7C`````````@```%D```#\_________POD````````"P````$```#0\```
-M`````"SD`````````@```!P```#\_________ROE````````"P````$```#0
-M\````````%_E`````````@```!P```#\_________USF````````"P````$`
-M``#0\````````(_F`````````@```!P```#\__________?F````````"P``
-M``$```#0\````````"?G`````````@```!P```#\_________W?G````````
-M"P````$```#0\````````*?G`````````@```!P```#\_________W7H````
-M`````@```"````#\_________^WH`````````@````8!``#\_________\7I
-M`````````@```/````#\_________V/J`````````@```&P```#\________
-M_]?J`````````@```*@```#\_________P?K`````````@```$4```#\____
-M_____R3K`````````@```%H```#\_________T7L`````````@```%D```#\
-M_________PON`````````@```+L```#\_________TWN`````````@```/``
-M``#\__________3N`````````@```&P```#\_________W7O`````````@``
-M`.@```#\_________PKP`````````@```&P```#\_________[+P````````
-M`@```&P```#\_________P3Q`````````@```%D```#\_________V[Q````
-M`````@```&P```#\_________ZKQ`````````@```&P```#\__________OQ
-M`````````@```&P```#\_________SOR`````````@```&P```#\________
-M_ZWU`````````@```&P```#\_________Q#V`````````@```)("``#\____
-M_____S3V`````````@```)("``#\_________Y'W`````````@```-(```#\
-M_________]_X`````````@```)("``#\__________[X`````````@```)("
-M``#\_________QKY`````````@```"P```#\_________WGY`````````@``
-M`*0"``#\_________XGY`````````@```)("``#\_________[+Y````````
-M`@```*0"``#\_________\+Y`````````@```)("``#\_________\_Z````
-M`````@```*0"``#\_________][Z`````````@```)("``#\__________#Z
-M`````````@```*0"``#\__________CZ`````````@```)("``#\________
-M_Q?[`````````@```*0"``#\_________Q_[`````````@```)("``#\____
-M_____TG[`````````@```*0"``#\_________UC[`````````@```)("``#\
-M_________VK[`````````@```*0"``#\_________W+[`````````@```)("
-M``#\_________Y'[`````````@```*0"``#\_________YG[`````````@``
-M`)("``#\_________][[`````````@```*0"``#\_________TS\````````
-M`@```*0"``#\_________V'\`````````@```$(```#\_________[[\````
-M`````@```(H```#\_________RW]````````"P```+$``````````````#3]
-M````````"P```-<``````````````$?]`````````@```#X```#\________
-M_Z7]`````````@```(H```#\_________Q7^````````"P```#$`````````
-M`````!W^`````````@```#X```#\_________[#^`````````@```)("``#\
-M_________][^`````````@```)("``#\_________R__`````````@```-8`
-M``#\_________SS_`````````@```"T```#\_________X__`````````@``
-M`(H```#\_________^+_````````"P```#$``````````````.K_````````
-M`@```#X```#\_________X0``0```````@```)("``#\_________[(``0``
-M`````@```)("``#\__________\``0```````@```!````#\_________PP!
-M`0```````@```"T```#\_________W8!`0```````@```(H```#\________
-M_\@!`0``````"P```+$``````````````,\!`0``````"P```-<`````````
-M`````.(!`0```````@```#X```#\_________S@"`0```````@```(H```#\
-M_________Z,"`0``````"P````$````@-@$``````+4"`0```````@```#X`
-M``#\_________^("`0``````"P```!T!`````````````'X#`0```````@``
-M`*0"``#\_________XL#`0```````@```)("``#\_________Z`#`0``````
-M`@```*0"``#\_________ZH#`0```````@```)("``#\_________VX$`0``
-M`````@```*0"``#\_________WL$`0```````@```)("``#\_________Y`$
-M`0```````@```*0"``#\_________YH$`0```````@```)("``#\________
-M_S8%`0```````@```-\```#\_________V@%`0```````@````,!``#\____
-M_____W`%`0```````@```-(```#\_________[8%`0```````@```)("``#\
-M_________]8%`0```````@```)("``#\__________(%`0```````@```)("
-M``#\_________Q\&`0```````@```)("``#\_________VT&`0```````@``
-M`/$```#\_________W4&`0```````@```!8```#\_________]L&`0``````
-M`@```*0"``#\_________^L&`0```````@```)("``#\_________Q`'`0``
-M`````@```*0"``#\_________R`'`0```````@```)("``#\_________RD*
-M`0```````@```'H```#\_________]P*`0```````@```*@```#\________
-M_T8,`0```````@```*@```#\_________VD,`0```````@```*@```#\____
-M_____^(,`0```````@```"@!``#\_________P,.`0```````@```*0"``#\
-M_________RX.`0```````@```*0"``#\_________^X.`0```````@```-@`
-M``#\_________P\/`0```````@```-T```#\_________R4/`0```````@``
-M``4!``#\_________S0/`0```````@````4!``#\_________[T/`0``````
-M`@```)("``#\_________^L/`0```````@```)("``#\_________Q\0`0``
-M`````@```*0"``#\_________S<0`0```````@```)("``#\_________X40
-M`0```````@```)("``#\_________^P0`0```````@```)("``#\________
-M_U\1`0```````@```)("``#\_________Q<2`0```````@```*0"``#\____
-M_____RH2`0```````@```)("``#\_________T<2`0```````@```%0```#\
-M_________U(2`0```````@```&<```#\_________V02`0```````@```*0"
-M``#\_________WX2`0```````@```*0"``#\_________Y@2`0```````@``
-M`*0"``#\_________[@2`0```````@```(4```#\_________\D2`0``````
-M`@```)("``#\_________Q<3`0```````@```*0"``#\_________RH3`0``
-M`````@```)("``#\_________T<3`0```````@```%0```#\_________U(3
-M`0```````@```&<```#\_________V03`0```````@```*0"``#\________
-M_WX3`0```````@```*0"``#\_________Y@3`0```````@```*0"``#\____
-M_____[@3`0```````@```(4```#\_________\D3`0```````@```)("``#\
-M_________^T3`0```````@```*0"``#\__________@3`0```````@```!(`
-M``#\_________Q84`0```````@````T!``#\_________R,4`0```````@``
-M`)("``#\_________SX4`0```````@```)("``#\_________U84`0``````
-M`@```)("``#\_________T`5`0```````@```)("``#\_________]L5`0``
-M`````@```(H```#\__________D5`0```````@```),```#\_________Q46
-M`0```````@```"P```#\_________WL6`0``````"P````$````@-@$`````
-M`(@6`0```````@```.P```#\_________Y<6`0```````@```*X```#\____
-M_____Z(6`0```````@```#X```#\_________[P7`0``````"P````4```#P
-M`P```````,87`0```````@```*\"``#\_________U48`0``````"P````4`
-M``!`!````````%\8`0```````@```*\"``#\_________V\8`0```````@``
-M`!\!``#\_________XH8`0```````@```$D```#\_________UL9`0``````
-M`@```)P```#\_________]89`0``````"P```)4``````````````.$9`0``
-M`````@```,(```#\__________D9`0```````@```'T```#\_________U,:
-M`0```````@```)P```#\_________V8:`0```````@```"<!``#\________
-M_Y8:`0```````@```,P```#\_________TP;`0```````@```"$!``#\____
-M_____U8;`0```````@```*$```#\_________QL<`0```````@```!\!``#\
-M_________Y(<`0```````@```&@```#\_________^@<`0```````@```",!
-M``#\_________PT=`0```````@```+<```#\_________QT=`0```````@``
-M`,P```#\_________[T=`0```````@```.0```#\_________VL>`0``````
-M`@```&@```#\_________^@>`0```````@```.0```#\_________X`?`0``
-M`````@```+H"``#\_________Y<?`0```````@```+H"``#\_________\H?
-M`0```````@```.0```#\_________S,@`0```````@```+H"``#\________
-M_XP@`0```````@```+H"``#\_________]$@`0```````@```#L```#\____
-M_____P0A`0```````@```$(```#\_________PXA`0```````@```*0"``#\
-M_________S0A`0```````@```*8```#\_________TXA`0```````@```*P`
-M``#\_________VDA`0```````@```!@```#\_________WHA`0```````@``
-M`+(```#\_________XTA`0``````"P````8````@`0```````)<A`0``````
-M`@```*\"``#\_________ZTA`0```````@```+H"``#\_________[XA`0``
-M````"P````8````@`0```````,@A`0```````@```*\"``#\_________]XA
-M`0```````@```+H"``#\_________RHB`0```````@```+H"``#\________
-M_W4B`0```````@```#H```#\_________Y$B`0```````@```+H"``#\____
-M_____^TB`0```````@```/H```#\_________QDC`0```````@```!\!``#\
-M_________S8C`0```````@```'T```#\_________WTC`0```````@```'4`
-M``#\_________\LC`0``````"P````,```"`"P```````#$D`0```````@``
-M`-,```#\_________TTD`0```````@```(D```#\_________VDD`0``````
-M`@```(D```#\_________X4D`0```````@```(D```#\_________Z$D`0``
-M`````@```(D```#\_________\(D`0```````@```(<```#\_________^0D
-M`0```````@```(<```#\_________Q$E`0```````@```(<```#\________
-M_S,E`0```````@```(<```#\_________STE`0```````@```*0"``#\____
-M_____VHE`0```````@```(<```#\_________XPE`0```````@```(<```#\
-M_________Y8E`0```````@```*0"``#\_________[(E`0```````@```(D`
-M``#\_________\XE`0```````@```(D```#\_________^HE`0```````@``
-M`(D```#\_________PPF`0```````@```(<```#\_________R@F`0``````
-M`@```(D```#\_________WTF`0```````@```*0"``#\__________HF`0``
-M`````@```)("``#\_________Q@G`0```````@```)("``#\_________RPG
-M`0```````@```*0"``#\_________T8G`0```````@```+<```#\________
-M_U4G`0```````@```*0"``#\_________VPG`0```````@```(D```#\____
-M_____W8G`0```````@```*0"``#\_________Y(G`0```````@```(D```#\
-M_________YPG`0```````@```*0"``#\_________\DG`0```````@```(<`
-M``#\_________],G`0```````@```*0"``#\_________^\G`0```````@``
-M`(D```#\__________DG`0```````@```*0"``#\_________P,H`0``````
-M`@```-````#\_________Q$H`0```````@```$H```#\_________S,H`0``
-M`````@```(<```#\_________U4H`0```````@```(<```#\_________W<H
-M`0```````@```(<```#\_________YDH`0```````@```(<```#\________
-M_[4H`0```````@```(D```#\_________\0H`0```````@```*0"``#\____
-M_____]LH`0```````@```(D```#\_________^4H`0```````@```*0"``#\
-M_________P<I`0```````@```(<```#\_________R,I`0```````@```(D`
-M``#\_________T0I`0```````@```(<```#\_________UDI`0```````@``
-M`*$```#\_________W(I`0```````@```(D```#\_________WPI`0``````
-M`@```*0"``#\_________Z8I`0```````@```(<```#\_________[`I`0``
-M`````@```*0"``#\_________\DI`0```````@```(D```#\_________],I
-M`0```````@```*0"``#\_________P\K`0```````@```"D```#\________
-M_QHK`0```````@```"P```#\_________X4K`0```````@```)("``#\____
-M_____ZPK`0```````@```)("``#\_________^TK`0```````@```)("``#\
-M_________Q8L`0```````@```"D```#\_________R$L`0```````@```"P`
-M``#\_________RPL`0```````@```-,```#\_________ULL`0```````@``
-M`-,```#\_________Z0M`0```````@```'4```#\_________ZXM`0``````
-M`@```*0"``#\_________\TM`0```````@```'4```#\_________]<M`0``
-M`````@```*0"``#\_________V4N`0```````@```)("``#\_________WPN
-M`0```````@```)("``#\_________[LN`0```````@```*0"``#\________
-M_]0N`0```````@```+<```#\_________^\N`0```````@```-H```#\____
-M_____P0O`0```````@```-H```#\_________Q(O`0```````@```*0"``#\
-M_________T`O`0```````@```)("``#\_________V8O`0```````@```)("
-M``#\_________WXO`0```````@```*0"``#\_________X\O`0``````"P``
-M``4```!X!````````)DO`0```````@```*\"``#\_________ZDO`0``````
-M`@```(H```#\__________@O`0``````"P````$````@-@$```````,P`0``
-M`````@```#X```#\_________Q0P`0``````"P````8````V`0```````!XP
-M`0```````@```*\"``#\_________RXP`0```````@```(H```#\________
-M_WTP`0``````"P````$````@-@$``````(@P`0```````@```#X```#\____
-M_____[,P`0```````@```(H```#\_________P8Q`0``````"P````$````@
-M-@$``````!0Q`0```````@```#X```#\_________RHQ`0```````@```(H`
-M``#\_________WTQ`0``````"P````$````@-@$``````(LQ`0```````@``
-M`#X```#\_________Z$Q`0```````@```(H```#\__________`Q`0``````
-M"P````$````@-@$``````/LQ`0```````@```#X```#\_________Q@R`0``
-M`````@```(H```#\_________V<R`0``````"P````$````@-@$``````'(R
-M`0```````@```#X```#\_________X@R`0```````@```(H```#\________
-M_^(R`0``````"P````$````@-@$``````.TR`0```````@```#X```#\____
-M_____R@S`0```````@```)P```#\_________T,S`0```````@```%@```#\
-M_________YLS`0```````@```-,```#\_________]<S`0```````@```-,`
-M``#\_________^DS`0```````@```&@```#\_________SDT`0```````@``
-M`",!``#\_________V$T`0```````@```+<```#\_________W8T`0``````
-M`@```,P```#\_________Z0T`0```````@```&@```#\_________P(U`0``
-M`````@```",!``#\_________RTU`0```````@```+<```#\_________T(U
-M`0```````@```,P```#\_________WLU`0```````@```&@```#\________
-M_ZDU`0```````@```#8```#\_________\<U`0```````@```!\!``#\____
-M_____T8W`0```````@```"D```#\_________U$W`0```````@```"P```#\
-M_________]<W`0```````@```*0"``#\_________QTX`0```````@```%4`
-M``#\_________S(X`0```````@```+<```#\_________XHX`0``````"P``
-M``4```"P!````````)0X`0```````@```*\"``#\_________Z8X`0``````
-M`@```.,```#\_________R4Y`0```````@```*0"``#\_________\,Y`0``
-M`````@```"D```#\_________\XY`0```````@```"P```#\_________^4Y
-M`0```````@```"D```#\__________`Y`0```````@```"P```#\________
-M__LY`0```````@```+<```#\_________^$Z`0```````@```!@!``#\____
-M______@Z`0```````@```!@!``#\_________P\[`0```````@```)````#\
-M_________R$[`0```````@```+@```#\_________S0[`0```````@```.(`
-M``#\_________U$[`0```````@```/@```#\_________V,[`0```````@``
-M`,@```#\_________W4[`0```````@```)(```#\_________XD[`0``````
-M`@```&L```#\_________[0[`0```````@```&@```#\_________Q(\`0``
-M`````@```",!``#\_________ST\`0```````@```+<```#\_________U(\
-M`0```````@```,P```#\_________Z<\`0```````@```#8```#\________
-M_[8\`0```````@```&@```#\_________^$\`0``````"P````8```!,`0``
-M`````.L\`0```````@```*\"``#\__________@\`0```````@```#8```#\
-M_________Q@]`0```````@```!\!``#\_________[0^`0```````@```.L`
-M``#\_________\@^`0``````"P````,```"H#````````"$_`0```````@``
-M`'T```#\_________YP_`0```````@```)P```#\_________[$_`0``````
-M`@```"<!``#\_________^L_`0```````@```,P```#\_________W1``0``
-M`````@```&@```#\_________Y5``0```````@```.$```#\_________]-`
-M`0```````@```*@```#\_________X1!`0```````@```+H"``#\________
-M_[Q!`0```````@```#L```#\_________]9!`0```````@```$(```#\____
-M_____^!!`0```````@```*0"``#\_________PM"`0```````@```*8```#\
-M_________RA"`0```````@```*P```#\_________TQ"`0```````@```!@`
-M``#\_________V!"`0```````@```+(```#\_________WM"`0```````@``
-M`+H"``#\_________Y9"`0```````@```+H"``#\_________\Y"`0``````
-M`@```#H```#\_________SU#`0```````@```.$```#\_________TM#`0``
-M`````@```!4```#\_________P%$`0```````@```*@```#\_________U!%
-M`0```````@```",!``#\_________V1%`0```````@```,P```#\________
-M_Y%%`0```````@```#8```#\_________YU%`0```````@```'T```#\____
-M_____TI&`0```````@```&@```#\_________VM&`0```````@```.$```#\
-M_________Y]&`0```````@```.$```#\_________\]&`0```````@```.$`
-M``#\_________^%&`0```````@```*@```#\_________Q]'`0```````@``
-M`!L!``#\_________VI(`0```````@```+4```#\_________XQ(`0``````
-M`@```&@```#\_________Z!(`0```````@```#L```#\_________[1(`0``
-M`````@```$(```#\_________[Y(`0```````@```*0"``#\_________^9(
-M`0```````@```!@```#\__________=(`0```````@```+(```#\________
-M_PQ)`0```````@```+H"``#\_________R%)`0```````@```+H"``#\____
-M_____TU)`0```````@```#H```#\_________VA)`0```````@```(L```#\
-M_________]A)`0```````@```#\```#\__________5)`0```````@```.$`
-M``#\_________SE*`0```````@```.$```#\_________VI*`0```````@``
-M`.$```#\_________WQ*`0```````@```!L!``#\_________XY*`0``````
-M`@```$D```#\_________[=*`0```````@```!L!``#\_________PM,`0``
-M`````@```'T```#\_________S--`0```````@```",!``#\_________T)-
-M`0```````@```,P```#\_________X9-`0```````@```!\!``#\________
-M_\5-`0```````@```.$```#\_________^Q-`0```````@```+H```#\____
-M_____U9.`0```````@```!<```#\_________VM.`0``````"P```)4`````
-M`````````'9.`0```````@```,(```#\_________YI.`0```````@```+,`
-M``#\_________Z5.`0```````@```!<```#\_________]].`0```````@``
-M`-H```#\_________^U.`0```````@```*0"``#\_________SU/`0``````
-M`@```#H```#\_________U1/`0```````@```*<```#\_________X=/`0``
-M`````@```-,```#\_________ZE/`0```````@```'\"``#\_________[5/
-M`0```````@```/8```#\_________\M/`0```````@```&@```#\________
-M_^U/`0```````@```!@```#\__________Y/`0```````@```+(```#\____
-M_____Q-0`0```````@```+H"``#\_________RA0`0```````@```+H"``#\
-M_________S]0`0```````@```#H```#\_________V!0`0```````@```&@`
-M``#\_________W%0`0```````@```'T```#\_________[)0`0```````@``
-M`+<```#\_________Z%1`0```````@```"D```#\_________ZQ1`0``````
-M`@```"P```#\_________PI2`0``````"P````4```#0!````````!12`0``
-M`````@```*\"``#\_________S12`0```````@```#H```#\_________S]2
-M`0```````@```"P```#\_________W92`0```````@```/L```#\________
-M_ZQ2`0```````@```*0"``#\_________[=2`0```````@```"P```#\____
-M_____\Q2`0```````@```'4```#\_________]A2`0```````@```*0"``#\
-M_________^-2`0```````@```"P```#\_________^Y2`0```````@```'(`
-M``#\_________T13`0```````@```&@```#\_________ZQ3`0```````@``
-M`+<```#\_________R15`0```````@```(<```#\_________X!5`0``````
-M`@```"D```#\_________XM5`0```````@```"P```#\_________Y]5`0``
-M`````@```-,```#\_________\95`0``````"P````,```"P#````````/]5
-M`0```````@```)("``#\_________U%6`0```````@```)("``#\________
-M_WQ6`0```````@```)("``#\_________\Q6`0```````@```)("``#\____
-M______-6`0```````@```)("``#\_________UM7`0```````@```)("``#\
-M_________Y=7`0```````@```"D```#\_________Z)7`0```````@```"P`
-M``#\_________[)7`0```````@```!\!``#\_________^U7`0```````@``
-M`"D```#\__________A7`0```````@```"P```#\_________PY8`0``````
-M"P```-D``````````````"58`0```````@```)T"``#\_________SY8`0``
-M`````@```*0"``#\_________VM8`0```````@```,,"``#\_________Y]8
-M`0```````@```)("``#\_________\58`0```````@```)("``#\________
-M_\I8`0```````@```,,"``#\_________T19`0```````@```&@```#\____
-M_____Z!9`0```````@```!@```#\_________\!9`0```````@```+(```#\
-M_________^A9`0```````@```+H"``#\_________Y-:`0``````"P````$!
-M`````````````*Y:`0``````"P````4````H!0```````+A:`0```````@``
-M`*\"``#\_________]%:`0```````@```+H"``#\__________=:`0``````
-M`@```#H```#\_________R1;`0```````@```)("``#\_________TI;`0``
-M`````@```)("``#\_________YI;`0```````@```&@```#\_________]9;
-M`0```````@```'T```#\_________P1<`0```````@```$(```#\________
-M_PY<`0```````@```*0"``#\_________TU<`0```````@```)("``#\____
-M_____W-<`0```````@```)("``#\_________VA=`0```````@```)("``#\
-M_________XM=`0```````@```)("``#\_________QM>`0```````@```(P`
-M``#\_________SA>`0```````@````@!``#\_________W=>`0```````@``
-M`)("``#\_________YI>`0```````@```)("``#\_________]%>`0``````
-M`@```)("``#\__________1>`0```````@```)("``#\_________TE?`0``
-M`````@```)("``#\_________V]?`0```````@```)("``#\_________ZQ?
-M`0```````@```)("``#\_________]1?`0```````@```"D```#\________
-M_]]?`0```````@```"P```#\_________^I?`0```````@```-,```#\____
-M_____P%@`0```````@```$(```#\_________PM@`0```````@```*0"``#\
-M_________W5A`0```````@```"D```#\_________X!A`0```````@```"P`
-M``#\_________\]A`0```````@```"D```#\_________]IA`0```````@``
-M`"P```#\__________%A`0```````@```,P```#\__________YB`0``````
-M`@```(8"``#\_________U=C`0``````"P````8```!@`0```````&%C`0``
-M`````@```*\"``#\_________W1C`0```````@```"D```#\_________W]C
-M`0```````@```"P```#\_________\9C`0```````@```&@```#\________
-M_U-D`0```````@```&@```#\_________[MD`0```````@```,P```#\____
-M_____X5E`0```````@```*0"``#\_________PAF`0```````@```*0"``#\
-M_________UYF`0```````@```*0"``#\_________W]F`0```````@```"D`
-M``#\_________XIF`0```````@```"P```#\_________YAF`0```````@``
-M`/T```#\_________UEG`0```````@```*0"``#\_________YYG`0``````
-M`@```*0"``#\_________[]G`0```````@```"D```#\_________\IG`0``
-M`````@```"P```#\_________]AG`0```````@```/T```#\_________PYH
-M`0```````@```*0"``#\_________V=H`0```````@```*0"``#\________
-M_\1H`0```````@```*0"``#\__________]H`0```````@```)D```#\____
-M_____R]I`0```````@```"D```#\_________SII`0```````@```"P```#\
-M_________T5I`0```````@```,P```#\_________ZAI`0```````@```)("
-M``#\_________T]L`0```````@```!H```#\_________V-L`0```````@``
-M`!H```#\_________W]L`0```````@```!H```#\_________P=M`0``````
-M`@```!H```#\_________QMM`0```````@```!H```#\_________SEM`0``
-M`````@```!H```#\_________WYM`0```````@```(P```#\_________[9M
-M`0```````@```-8```#\_________\-M`0```````@```"T```#\________
-M_P9N`0```````@```,8```#\_________TEN`0```````@```",```#\____
-M_____WIN`0```````@```,4```#\_________]9N`0```````@```*0"``#\
-M_________S5T`0```````@````L````<`````````$%T`0``````"P````L`
-M```@`````````$YT`0```````@```$$```#\_________Y9T`0```````@``
-M`&(```#\_________W)U`0```````@```)8```#\_________Y]U`0``````
-M`@```/,```#\_________ZYU`0```````@```)8```#\_________Y)V`0``
-M`````@```&@```#\_________]EV`0```````@```-4```#\__________9V
-M`0```````@```(8"``#\_________PUW`0```````@```#````#\________
-M_X5W`0```````@```$<```#\_________[QW`0```````@```,4```#\____
-M_____P)X`0```````@```+8```#\_________^%X`0```````@```*0"``#\
-M_________]-Y`0```````@````L````>`````````.!Y`0``````"P````L`
-M```@`````````.IY`0```````@```$$```#\_________RMZ`0```````@``
-M``L````>`````````#AZ`0``````"P````L````@`````````$)Z`0``````
-M`@```$$```#\_________\-Z`0```````@```)("``#\_________Q%[`0``
-M`````@```)("``#\_________RE[`0```````@```"@```#\_________SM[
-M`0```````@```"@```#\_________TU[`0```````@```"@```#\________
-M_U][`0```````@```"@```#\_________W%[`0```````@```"@```#\____
-M_____X-[`0```````@```"@```#\_________Y5[`0```````@```"@```#\
-M_________Z=[`0```````@```"@```#\_________[E[`0```````@```"@`
-M``#\_________\M[`0```````@```"@```#\_________]U[`0```````@``
-M`"@```#\_________^][`0```````@```"@```#\_________P%\`0``````
-M`@```"@```#\_________Q-\`0```````@```"@```#\_________R5\`0``
-M`````@```"@```#\_________S=\`0```````@```"@```#\_________TE\
-M`0```````@```"@```#\_________UM\`0```````@```"@```#\________
-M_VU\`0```````@```"@```#\_________W]\`0```````@```"@```#\____
-M_____Y%\`0```````@```"@```#\_________Z-\`0```````@```"@```#\
-M_________[5\`0```````@```"@```#\_________\=\`0```````@```"@`
-M``#\_________]E\`0```````@```"@```#\_________^M\`0```````@``
-M`"@```#\_________U-]`0```````@```)("``#\_________W-]`0``````
-M`@```)("``#\__________5]`0```````@```"@```#\_________PI^`0``
-M`````@```"@```#\_________Q]^`0```````@```"@```#\_________S1^
-M`0```````@```"@```#\_________TE^`0```````@```"@```#\________
-M_Y5^`0```````@```(H```#\_________ZE^`0```````@```!<!``#\____
-M_____SM_`0```````@```(8"``#\_________VA_`0```````@```(8"``#\
-M_________W-_`0``````"P```!P!`````````````(%_`0```````@```.P`
-M``#\_________XQ_`0```````@```#X```#\_________]E_`0```````@``
-M`(H```#\_________^E_`0```````@```!<!``#\_________T.``0``````
-M"P```!P!`````````````%&``0```````@```.P```#\_________UR``0``
-M`````@```#X```#\_________[B``0```````@```+X```#\_________\:`
-M`0```````@```$(```#\_________]"``0```````@```*0"``#\________
-M_P2!`0```````@```#D```#\_________Q2!`0```````@```$(```#\____
-M_____QZ!`0```````@```*0"``#\_________T.!`0```````@```+X```#\
-M_________U2!`0```````@```$(```#\_________UZ!`0```````@```*0"
-M``#\_________Z6!`0```````@```#D```#\_________SV"`0```````@``
-M`($```#\_________TB"`0```````@```"P```#\_________].$`0``````
-M`@```"<```#\__________&$`0```````@```.\```#\_________]:%`0``
-M`````@```(@```#\_________^N%`0``````"P```%\``````````````"N&
-M`0```````@```"<```#\_________SV&`0```````@```.\```#\________
-M_]2&`0```````@```(@```#\_________P&'`0```````@```(@```#\____
-M_____Z^'`0```````@```*L```#\_________\>'`0```````@```#0```#\
-M_________]^'`0```````@```'X```#\_________T>(`0``````"P````,`
-M``#8#0```````+2+`0```````@```!D```#\_________T*,`0```````@``
-M`!D```#\_________UN,`0```````@```(8"``#\_________RV-`0``````
-M`@```.````#\_________[2.`0```````@```)("``#\_________\B.`0``
-M`````@```)("``#\_________]:.`0```````@```*0"``#\_________Q^/
-M`0```````@````<````$`````````&J/`0```````@```)("``#\________
-M_YZ/`0``````"P````<``````````````,:/`0```````@````<````4````
-M`````!20`0```````@```)("``#\_________XF0`0```````@````<````D
-M`````````->0`0```````@```)("``#\_________PN1`0``````"P````<`
-M```@`````````"Z1`0```````@````<````T`````````'R1`0```````@``
-M`)("``#\_________^>1`0``````"P````<````0`````````/F1`0``````
-M"P````<````P`````````(^2`0```````@```)("``#\_________R*3`0``
-M`````@```)("``#\_________\&3`0```````@```)("``#\_________^"3
-M`0```````@```*0"``#\_________ZZ4`0```````@```"4```#\________
-M_V"7`0```````@```.D```#\_________^>8`0```````@````,```#X$@``
-M`````/.8`0``````"P````<```#``0```````'><`0``````"P````<```"`
-M`````````'R<`0```````@```'<"``#\__________J<`0```````@```$$`
-M``#\_________PB=`0```````@```*0"``#\_________QV=`0```````@``
-M``0!``#\_________T>=`0``````"P````8```!T`0```````%&=`0``````
-M`@```*\"``#\_________Z:=`0```````@```)H"``#\_________[J=`0``
-M`````@```)H"``#\_________\Z=`0```````@```)H"``#\_________T&>
-M`0```````@```"\```#\_________UN>`0```````@```*,"``#\________
-M_VZ>`0```````@```*,"``#\_________XB>`0```````@```*,"``#\____
-M_____YN>`0```````@```*,"``#\_________[6>`0```````@```*,"``#\
-M_________\B>`0```````@```*,"``#\_________^*>`0```````@```*,"
-M``#\__________6>`0```````@```*,"``#\_________R.?`0```````@``
-M`*,"``#\_________S.?`0```````@```*,"``#\_________UJ?`0``````
-M`@```*,"``#\_________VV?`0```````@```*,"``#\_________X>?`0``
-M`````@```*,"``#\_________YJ?`0```````@```*,"``#\_________[2?
-M`0```````@```*,"``#\_________\>?`0```````@```*,"``#\________
-M_^&?`0```````@```*,"``#\__________2?`0```````@```*,"``#\____
-M_____PZ@`0```````@```*,"``#\_________R&@`0```````@```*,"``#\
-M_________SN@`0```````@```*,"``#\_________TZ@`0```````@```*,"
-M``#\_________VB@`0```````@```*,"``#\_________WN@`0```````@``
-M`*,"``#\_________Y6@`0```````@```*,"``#\_________ZB@`0``````
-M`@```*,"``#\_________\*@`0```````@```*,"``#\_________]6@`0``
-M`````@```*,"``#\_________^^@`0```````@```*,"``#\_________P*A
-M`0```````@```*,"``#\_________QRA`0```````@```*,"``#\________
-M_R^A`0```````@```*,"``#\_________TFA`0```````@```*,"``#\____
-M_____URA`0```````@```*,"``#\_________W:A`0```````@```*,"``#\
-M_________XFA`0```````@```*,"``#\_________Z.A`0```````@```*,"
-M``#\_________[:A`0```````@```*,"``#\_________]BA`0```````@``
-M`-("``#\__________*A`0```````@```-("``#\_________Q2B`0``````
-M`@```-("``#\_________RZB`0```````@```-("``#\_________U"B`0``
-M`````@```-("``#\_________VJB`0```````@```-("``#\_________XRB
-M`0```````@```-("``#\_________Z:B`0```````@```-("``#\________
-M_\BB`0```````@```-("``#\_________^*B`0```````@```-("``#\____
-M_____P2C`0```````@```-("``#\_________QZC`0```````@```-("``#\
-M_________T"C`0```````@```-("``#\_________UJC`0```````@```-("
-M``#\_________WRC`0```````@```-("``#\_________Y:C`0```````@``
-M`-("``#\_________\VC`0```````@```,H```#\_________]ZC`0``````
-M`@```,H```#\_________PJD`0```````@```"L```#\_________Q*D`0``
-M`````@```)0```#\_________R&D`0```````@```)0```#\_________RFD
-M`0```````@```"0!``#\_________S.D`0```````@```*0"``#\________
-M_SND`0```````@```,,```#\_________TBD`0```````@```,H```#\____
-M_____U6D`0```````@```,H```#\_________Y^D`0```````@```-,```#\
-M__________:D`0```````@```-,```#\_________R6E`0```````@````H!
-M``#\_________SBE`0```````@````H!``#\_________T6E`0```````@``
-M``H!``#\_________UBE`0```````@````H!``#\_________V6E`0``````
-M`@```$(```#\_________\VE`0```````@```(H```#\_________R^F`0``
-M````"P````$```"0F@$``````#JF`0```````@```#X```#\_________W&F
-M`0```````@```#L```#\_________X.F`0```````@```*0"``#\________
-M_XNF`0```````@```$(```#\_________]&F`0```````@```"P```#\____
-M_____UJG`0```````@```(H```#\_________]NG`0``````"P````$```"0
-MF@$``````.:G`0```````@```#X```#\_________QVH`0```````@```#L`
-M``#\_________R^H`0```````@```*0"``#\_________S>H`0```````@``
-M`$(```#\_________W2H`0```````@```),```#\__________RH`0``````
-M"P````$```"0F@$```````FI`0```````@```.P```#\_________QZI`0``
-M`````@```*X```#\_________RFI`0```````@```#X```#\_________V"I
-M`0```````@```#L```#\_________W*I`0```````@```*0"``#\________
-M_WJI`0```````@```$(```#\_________ZJI`0```````@```"D```#\____
-M_____[^I`0```````@```"P```#\_________\>I`0```````@```(H```#\
-M_________]RI`0```````@```"D```#\_________^VJ`0``````"P````$`
-M``"0F@$``````/JJ`0```````@```.P```#\_________P^K`0```````@``
-M`*X```#\_________QJK`0```````@```#X```#\_________U&K`0``````
-M`@```#L```#\_________V.K`0```````@```*0"``#\_________VNK`0``
-M`````@```$(```#\_________Z6K`0```````@```"D```#\_________[RK
-M`0```````@```"P```#\_________UNL`0```````@```(H```#\________
-M_X&L`0``````"P````8```"0`0```````(NL`0```````@```*\"``#\____
-M_____Y>L`0```````@```),```#\_________["L`0```````@```"P```#\
-M_________^*L`0```````@```+H"``#\__________NL`0```````@```#L`
-M``#\_________TNM`0```````@```(8"``#\_________S.N`0```````@``
-M`&````#\_________XNN`0``````"P````$```"0F@$``````)JN`0``````
-M`@```.P```#\_________[6N`0```````@```*X```#\_________\NN`0``
-M`````@```#X```#\_________P>O`0```````@```#L```#\_________QFO
-M`0```````@```*0"``#\_________R.O`0```````@```$(```#\________
-M_V6O`0```````@```(8"``#\_________Y>O`0```````@```"D```#\____
-M_____ZRO`0```````@```(,```#\_________[NO`0```````@```"P```#\
-M_________]BO`0```````@```+H"``#\_________[BP`0```````@```"D`
-M``#\_________\BP`0```````@```(,```#\_________].P`0```````@``
-M`"P```#\_________ZRQ`0```````@```#L```#\_________^ZQ`0``````
-M`@```",!``#\_________S2R`0```````@```-,```#\_________TFR`0``
-M`````@```+<```#\_________VBR`0```````@```,P```#\_________[*R
-M`0```````@```.8```#\_________]FS`0```````@```,D```#\________
-M_P&T`0```````@```!,!``#\_________R&T`0```````@```+P"``#\____
-M_____UFT`0```````@```"L```#\_________V&T`0```````@```%X```#\
-M_________VFT`0```````@```%X```#\_________W&T`0```````@```)0`
-M``#\_________WVT`0```````@```)0```#\_________XFT`0```````@``
-M`"0!``#\_________Y.T`0```````@```*0"``#\_________YNT`0``````
-M`@```,,```#\_________["T`0``````"P```&$``````````````,>T`0``
-M`````@```)T"``#\_________]2T`0```````@```!\!``#\__________6T
-M`0```````@```!D!``#\_________P2U`0```````@```!D!``#\________
-M_RFU`0```````@````L```#?`````````#:U`0```````@````L```#<````
-M`````$&U`0```````@````,```#X$@```````%"U`0``````"P````<```#`
-M`0```````%>U`0``````"P```%P``````````````%ZU`0``````"P````<`
-M``#4`0```````&JU`0``````"P````<```#"`0```````+6U`0``````"P``
-M`%P````<`````````,VU`0``````"P```%P````<`````````.&U`0``````
-M"P```%P````<`````````.^U`0``````"P```%P````<`````````/FU`0``
-M````"P```%P````<`````````"^V`0``````"P```%P````<`````````$.V
-M`0``````"P```%P````<`````````%&V`0``````"P```%P````<````````
-M`&RV`0``````"P````<```#,`0```````+6V`0```````@````,```#X$@``
-M`````-.V`0``````"P````<```#,`0```````.&V`0``````"P````<```#0
-M`0```````!&W`0``````"P```%P``````````````"6W`0``````"P```%P`
-M```<`````````%"W`0``````"P```%P````,`````````':W`0``````"P``
-M`%P````=`````````(6W`0``````"P```%P````<`````````+ZW`0``````
-M`@```(`"``#\_________T:X`0```````@```*P```#\_________V*X`0``
-M`````@```*8```#\_________VJX`0```````@```.8```#\_________XBX
-M`0```````@```+(```#\_________YRX`0```````@```+(```#\________
-M_T&Y`0``````"P````4```!0!0```````$NY`0```````@```*\"``#\____
-M_____UVY`0```````@```(H```#\_________X:Y`0``````"P````$!````
-M`````````)NY`0``````"P````4```"8!0```````*6Y`0```````@```*\"
-M``#\_________^JY`0``````"P````$```"0F@$``````/6Y`0```````@``
-M`#X```#\_________RRZ`0```````@```#L```#\_________SZZ`0``````
-M`@```*0"``#\_________T:Z`0```````@```$(```#\_________XFZ`0``
-M`````@```(H```#\_________Z^Z`0```````@```),```#\_________\ZZ
-M`0```````@```"P```#\_________SV[`0``````"P````$```"0F@$`````
-M`$R[`0```````@```.P```#\_________UZ[`0```````@```*X```#\____
-M_____VF[`0```````@```#X```#\_________Z"[`0```````@```#L```#\
-M_________[*[`0```````@```*0"``#\_________[J[`0```````@```$(`
-M``#\_________^J[`0```````@```.,```#\_________P^\`0```````@``
-M`"D```#\_________QJ\`0```````@```"P```#\_________S&\`0``````
-M`@```"P```#\_________Y:\`0``````"P````,```#`#@```````,N\`0``
-M`````@```.4```#\_________P2]`0```````@```&4```#\_________SJ]
-M`0```````@```+H"``#\_________T^]`0```````@```#L```#\________
-M_V:]`0```````@```*0"``#\_________VZ]`0```````@```$(```#\____
-M_____Z>]`0```````@```+H"``#\_________[N]`0```````@```*4```#\
-M_________\>]`0```````@```/\```#\_________S.^`0``````"P````$!
-M`````````````$Z^`0``````"P````4```#(!0```````%B^`0```````@``
-M`*\"``#\_________XB^`0```````@```'\"``#\_________YV^`0``````
-M"P````$```#PO0$``````+&^`0```````@```)T"``#\_________T[!`0``
-M`````@```*P```#\_________W#!`0```````@```*8```#\_________YW!
-M`0```````@```&@```#\_________PC"`0```````@```&@```#\________
-M_V3"`0```````@```+H"``#\_________Z3"`0```````@```&@```#\____
-M_____Q##`0```````@```+H"``#\_________S;$`0```````@```.4```#\
-M_________XS$`0```````@```,D```#\_________Y[$`0```````@```+(`
-M``#\_________]G$`0```````@```$(```#\___________$`0```````@``
-M`!\!``#\_________Q_%`0```````@```'\"``#\_________S3%`0``````
-M"P```&$``````````````$?%`0```````@```)T"``#\_________ZG&`0``
-M`````@```.8```#\__________W&`0``````"P````,````0#P```````"7'
-M`0```````@```#T```#\_________X#'`0```````@```#T```#\________
-M_]O'`0```````@```#T```#\_________S;(`0```````@```#T```#\____
-M_____X?)`0``````"P````,````P$````````+C)`0```````@```#T```#\
-M_________QC*`0```````@```#T```#\_________W#*`0```````@```#T`
-M``#\_________\C*`0```````@```#T```#\_________R'+`0```````@``
-M`#T```#\_________WC+`0```````@```#T```#\_________]3+`0``````
-M`@```#T```#\_________S#,`0```````@```#T```#\_________XC,`0``
-M`````@```#T```#\_________^#,`0```````@```#T```#\_________S#-
-M`0```````@```(P```#\_________VK-`0```````@```(P```#\________
-M_Z3-`0```````@```(P```#\_________][-`0```````@```(P```#\____
-M_____Q7.`0```````@```(P```#\_________TS.`0```````@```(P```#\
-M_________^;.`0```````@````L```#<`````````/+.`0```````@````L`
-M``#<`````````-_0`0```````@```(X"``#\__________G0`0```````@``
-M`(X"``#\_________T/1`0```````@````,```#X$@```````%G1`0``````
-M"P````<```#``0```````&O1`0``````"P````<```#"`0```````'G1`0``
-M````"P````<```#0`0```````(+1`0``````"P````<```#0`0```````(G1
-M`0``````"P````<```#,`0```````*/1`0``````"P````<```#0`0``````
-M`-W1`0```````@```,8"``#\___________1`0```````@```+\"``#\____
-M_____RW2`0``````"P```%P``````````````$72`0``````"P```%P````<
-M`````````&S2`0``````"P```%P````,`````````(G2`0``````"P```%P`
-M```=`````````)/2`0``````"P```%P````=`````````)O2`0``````"P``
-M`%P````<`````````+C2`0``````"P```%P````=`````````,S2`0``````
-M"P```%P````<`````````#K4`0``````"P````$!`````````````$K4`0``
-M`````@```.8```#\_________[W5`0```````@```)8```#\_________^[5
-M`0```````@```/,```#\__________W5`0```````@```)8```#\________
-M_Z#9`0```````@```)8```#\_________\[9`0```````@```/,```#\____
-M_____]W9`0```````@```)8```#\_________[_=`0```````@```)8```#\
-M_________^W=`0```````@```/,```#\__________[=`0```````@```)8`
-M``#\_________[_A`0```````@```)8```#\_________^WA`0```````@``
-M`/,```#\__________[A`0```````@```)8```#\_________V3D`0``````
-M`@```(H```#\_________V#F`0```````@```(8"``#\_________RSH`0``
-M````"P````$````PL`$``````*OH`0```````@```&````#\_________[CH
-M`0```````@```.P```#\_________\OH`0```````@```*X```#\________
-M_^GH`0```````@```.P```#\__________OH`0```````@```),```#\____
-M_____RSI`0```````@```*X```#\_________T'I`0```````@```'L```#\
-M_________W+I`0```````@```*X```#\_________[?I`0```````@```(8"
-M``#\_________RKJ`0```````@```(8"``#\_________V[J`0```````@``
-M`#X```#\_________WOJ`0```````@```"P```#\_________PCM`0``````
-M`@```,8"``#\_________RKM`0```````@```,8"``#\_________X+N`0``
-M`````@```",!``#\_________]CN`0```````@```&@```#\_________S#O
-M`0```````@```+<```#\_________V'O`0```````@```-,```#\________
-M_Y_O`0```````@```(4```#\_________\KO`0```````@```,P```#\____
-M______3O`0```````@```&@```#\_________T[P`0```````@```.0```#\
-M_________PGQ`0```````@````@"``#\_________R+Q`0```````@```$8"
-M``#\_________S?Q`0```````@```$4"``#\_________\7Q`0``````"P``
-M``$```#`\`$``````-WQ`0```````@```,4!``#\__________/Q`0``````
-M`@```"X!``#\__________[Q`0```````@```$4!``#\_________Q;R`0``
-M`````@```*0"``#\_________R'R`0```````@```%<!``#\_________T#R
-M`0```````@```#`!``#\_________T_R`0```````@```'<!``#\________
-M_UKR`0```````@```$4"``#\_________WCR`0```````@```$4"``#\____
-M_____Y/R`0```````@```'H!``#\_________[#R`0```````@```,D!``#\
-M_________Q+S`0```````@```,4!``#\_________R;S`0```````@```"X!
-M``#\_________\CU`0```````@```*T!``#\_________TKX`0``````"P``
-M``,`````$P```````.OX`0``````"P````4```#X!0```````/7X`0``````
-M`@```*\"``#\_________S#Y`0```````@```(8"``#\_________Q#Z`0``
-M`````@```)("``#\_________SWZ`0```````@```)("``#\_________YWZ
-M`0```````@```)("``#\_________Q_[`0```````@```)("``#\________
-M_UG[`0```````@```)("``#\_________[[[`0```````@```*0"``#\____
-M______G[`0```````@```*0"``#\_________T?\`0```````@```*0"``#\
-M_________X+\`0```````@```*0"``#\_________]C\`0```````@```%@!
-M``#\_________^+\`0```````@```*0"``#\_________^S\`0```````@``
-M``,"``#\_________\?]`0```````@```)("``#\_________^3]`0``````
-M`@```)("``#\__________/]`0```````@```*0"``#\_________P_^`0``
-M`````@```)("``#\_________RS^`0```````@```)("``#\_________UK^
-M`0```````@```)("``#\_________V3^`0```````@```)("``#\________
-M_XS^`0```````@```*0"``#\_________YG^`0```````@```)("``#\____
-M_____\'^`0```````@```*0"``#\_________\[^`0```````@```)("``#\
-M___________^`0```````@```)("``#\_________S#_`0```````@```)("
-M``#\_________Y7_`0```````@```)("``#\_________[7_`0```````@``
-M`)("``#\_________]S_`0```````@```)("``#\__________S_`0``````
-M`@```)("``#\_________RP``@```````@```)("``#\_________S8``@``
-M`````@```)("``#\_________V(``@```````@```*0"``#\_________W(`
-M`@```````@```)("``#\_________YH``@```````@```*0"``#\________
-M_ZH``@```````@```)("``#\_________[0"`@```````@```)("``#\____
-M______P"`@```````@```-,!``#\_________R@#`@```````@```-,!``#\
-M_________Y8#`@```````@```!8"``#\__________0#`@```````@```'\"
-M``#\_________P`$`@```````@```-0!``#\_________QD$`@```````@``
-M`,L!``#\_________\$$`@```````@```!8"``#\__________`$`@``````
-M`@```/L!``#\_________P$%`@```````@```+\!``#\_________Q0%`@``
-M````"P````8```"P`0```````!X%`@```````@```*\"``#\_________S,%
-M`@```````@```+H"``#\_________T@%`@```````@```+H"``#\________
-M_V`%`@```````@```%P!``#\_________X(%`@```````@```)("``#\____
-M_____WP&`@``````"P```$,!`````````````($&`@```````@```.$!``#\
-M_________VT'`@```````@```$(!``#\_________W@'`@```````@```$4"
-M``#\_________VX(`@```````@```,$!``#\_________^$+`@```````@``
-M`$0"``#\_________UD,`@```````@```&(!``#\_________YP,`@``````
-M`@```,$!``#\_________SP-`@``````"P````,`````%P```````%4-`@``
-M`````@```!4"``#\_________X<-`@```````@```!4"``#\_________[<-
-M`@```````@```!4"``#\_________^,-`@```````@```!4"``#\________
-M_QH.`@```````@```*0!``#\_________V8.`@```````@```!@"``#\____
-M______@.`@```````@```#H!``#\_________S</`@```````@```&,!``#\
-M_________V$/`@```````@```*0"``#\_________[L1`@```````@```"X"
-M``#\_________\H1`@```````@```/8!``#\_________X$2`@```````@``
-M`$X!``#\__________L2`@```````@```.P!``#\_________Q@3`@``````
-M`@```$X!``#\_________SP4`@```````@```$,"``#\_________T\4`@``
-M`````@```-4!``#\_________[T4`@```````@```$,"``#\_________^D4
-M`@```````@```-4!``#\_________X(6`@```````@```!<"``#\________
-M_VH7`@```````@```(8"``#\_________X07`@``````"P````,```!0%P``
-M`````!<8`@```````@```"T!``#\_________R88`@```````@```"T!``#\
-M_________Z,8`@```````@```$,"``#\_________\\8`@```````@```-4!
-M``#\_________SX9`@```````@```(H!``#\_________W(9`@```````@``
-M`'8!``#\_________XL9`@```````@```(H!``#\_________YH9`@``````
-M`@````0"``#\_________[,9`@```````@```(H!``#\_________P,:`@``
-M`````@```'X!``#\_________Q@:`@``````"P````4```!0!@```````"(:
-M`@```````@```*\"``#\_________Y0:`@```````@```,L!``#\________
-M_Z8:`@```````@```$D!``#\_________T(;`@```````@````X"``#\____
-M_____[\;`@```````@````X"``#\_________\\;`@```````@```!("``#\
-M__________D;`@```````@````X"``#\_________Q<<`@```````@```-@!
-M``#\_________T0<`@```````@```'D!``#\_________P,=`@```````@``
-M`)4!``#\_________R8=`@```````@```-@!``#\_________T\=`@``````
-M`@```(D!``#\_________W8=`@```````@````X"``#\_________WX=`@``
-M`````@```(D!``#\_________Z,=`@```````@```-@!``#\_________PD>
-M`@```````@```#$!``#\_________U<>`@```````@```/,!``#\________
-M_WL>`@```````@```,L!``#\_________[(>`@```````@```+H"``#\____
-M_____\8>`@```````@```#$!``#\_________^0>`@```````@```%<!``#\
-M_________^X>`@```````@```*0"``#\_________ST?`@```````@```+P!
-M``#\_________T0?`@```````@````4"``#\_________UH?`@``````"P``
-M``8```#&`0```````&0?`@```````@```*\"``#\_________YL?`@``````
-M`@```#$!``#\_________ZX?`@```````@```)P!``#\_________[8?`@``
-M`````@```(D!``#\_________T<@`@```````@```)("``#\_________W,@
-M`@```````@```)("``#\_________ZP@`@```````@```)("``#\________
-M_^H@`@``````"P````4```"`!@```````/0@`@```````@```*\"``#\____
-M_____S`A`@```````@```,`!``#\_________X8A`@```````@```,`!``#\
-M_________YLA`@```````@```#X"``#\_________Z8A`@```````@```)4!
-M``#\_________U@B`@```````@```$0!``#\_________W\B`@```````@``
-M`-@!``#\_________[0B`@```````@```,L!``#\_________U(C`@``````
-M`@```$0!``#\_________W0C`@```````@```-@!``#\_________[<C`@``
-M`````@```#D"``#\_________^@D`@```````@```)("``#\_________P8E
-M`@```````@```)("``#\_________R,E`@```````@```)("``#\________
-M_X@E`@```````@```)("``#\_________Z\E`@```````@```)("``#\____
-M_____QLF`@```````@```/D!``#\_________W@F`@```````@```)("``#\
-M_________YLF`@```````@```)("``#\_________[XF`@```````@```)("
-M``#\_________\8F`@```````@```($!``#\_________[<G`@```````@``
-M`$\!``#\_________]HG`@```````@```(8"``#\_________\(H`@``````
-M`@```(8"``#\_________S`I`@```````@```(8"``#\_________V0I`@``
-M`````@```)("``#\_________Y\I`@```````@```)("``#\__________,I
-M`@```````@```)("``#\_________]$J`@```````@```(8"``#\________
-M_R4L`@```````@```(8"``#\_________ZTL`@```````@```(8"``#\____
-M_____\`L`@``````"P````,```"P'````````%4M`@```````@```*0"``#\
-M_________],M`@```````@```)("``#\__________<M`@```````@```)("
-M``#\_________Q@N`@``````"P````8```#D`0```````"(N`@```````@``
-M`*\"``#\_________RPN`@```````@```-X!``#\_________TPN`@``````
-M`@```)("``#\_________XPN`@```````@```)("``#\_________QTO`@``
-M`````@```)("``#\_________Z(O`@```````@```-X!``#\_________[$O
-M`@```````@```-X!``#\__________PO`@``````"P````4```#0!@``````
-M``8P`@```````@```*\"``#\_________V\P`@``````"P````8```#_`0``
-M`````'DP`@```````@```*\"``#\_________XLP`@```````@```,H!``#\
-M_________[4P`@``````"P````4````0!P```````+\P`@```````@```*\"
-M``#\_________S(Q`@``````"P````4````X!P```````#PQ`@```````@``
-M`*\"``#\_________]XQ`@```````@```$0!``#\__________<Q`@``````
-M`@```-@!``#\_________ZHR`@```````@```+$!``#\_________PXT`@``
-M`````@```,H!``#\_________QXT`@```````@```!8"``#\_________V(T
-M`@```````@```(,!``#\_________\DT`@```````@```$0!``#\________
-M_]0T`@```````@```+$!``#\_________^TT`@```````@```-@!``#\____
-M_____T<U`@```````@```,L!``#\_________\`U`@```````@```#,!``#\
-M__________<U`@```````@```,L!``#\_________YLV`@```````@```)("
-M``#\_________\HV`@```````@```,L!``#\__________\V`@```````@``
-M`!8"``#\_________Q`W`@```````@```(D!``#\_________UDW`@``````
-M`@```)("``#\_________X(W`@```````@```)("``#\_________[,W`@``
-M`````@```)("``#\_________\@W`@```````@```)`!``#\_________SPX
-M`@```````@```)("``#\_________\$X`@```````@```)("``#\________
-M_^PX`@```````@```)("``#\__________XX`@```````@```&D!``#\____
-M_____T$Y`@```````@```)("``#\_________V8Y`@```````@```)("``#\
-M_________^,Y`@```````@```)("``#\_________PPZ`@```````@```)("
-M``#\_________S@Z`@```````@```'\"``#\_________UDZ`@```````@``
-M`.@!``#\_________YDZ`@```````@```,L!``#\_________\\Z`@``````
-M`@```+H"``#\_________^,Z`@```````@```#$!``#\_________P$[`@``
-M`````@```(\!``#\_________PL[`@```````@```*0"``#\_________SL[
-M`@``````"P````$```"`4`(``````&D[`@```````@```)T"``#\________
-M_Y,[`@```````@```)("``#\_________Z@[`@```````@```)("``#\____
-M_____]`[`@```````@```)("``#\_________^4[`@```````@```)("``#\
-M_________Q8\`@```````@```)("``#\_________TT\`@```````@```)("
-M``#\_________XL\`@```````@```)("``#\_________[,\`@```````@``
-M`)("``#\_________^@\`@```````@```)("``#\_________Q\]`@``````
-M`@```)("``#\_________X8]`@```````@```)("``#\_________ZL]`@``
-M`````@```)("``#\_________]`]`@```````@```)("``#\__________4]
-M`@```````@```)("``#\_________S0^`@```````@```'\"``#\________
-M_VX^`@```````@```+H"``#\_________X(^`@```````@```#$!``#\____
-M_____Y0^`@```````@```%<!``#\_________YX^`@```````@```*0"``#\
-M_________\L^`@``````"P````4"`````````````.,^`@```````@```)T"
-M``#\_________PX_`@```````@```)("``#\_________T`_`@```````@``
-M`)("``#\_________WD_`@```````@```)("``#\_________Z4_`@``````
-M`@```)("``#\_________^8_`@```````@```'\"``#\_________P1``@``
-M`````@```,L!``#\_________S1``@```````@```+H"``#\_________U)`
-M`@``````"P```,@!`````````````&1``@```````@```)T"``#\________
-M_Y-``@```````@```)("``#\_________[E``@```````@```)("``#\____
-M_____]=``@```````@```*0"``#\_________^Q``@```````@```)("``#\
-M_________Q)!`@```````@```)("``#\_________SA!`@```````@```)("
-M``#\_________U9!`@```````@```*0"``#\_________VM!`@```````@``
-M`)("``#\_________Y!!`@```````@```)("``#\_________U9"`@``````
-M`@```)("``#\_________WM"`@```````@```*0"``#\_________ZM"`@``
-M`````@```)("``#\_________])"`@```````@```*0"``#\_________P5#
-M`@```````@```)("``#\_________RQ#`@```````@```*0"``#\________
-M_W)#`@```````@```)X!``#\_________XU#`@```````@```.(!``#\____
-M_____YE#`@```````@```+`!``#\_________\Y#`@```````@```*P!``#\
-M_________P)$`@```````@```(T!``#\_________R]$`@```````@```+`!
-M``#\_________QA%`@```````@```*0"``#\_________S]%`@```````@``
-M`)("``#\_________UY%`@```````@```*0"``#\_________X%%`@``````
-M`@```)("``#\_________ZU%`@```````@```*0"``#\_________]1%`@``
-M`````@```)("``#\__________A%`@```````@```*0"``#\_________QQ&
-M`@```````@```)("``#\_________SU&`@```````@```,L!``#\________
-M_[I&`@```````@```#$!``#\__________5&`@```````@```#$!``#\____
-M_____P%'`@```````@```+`!``#\_________T9'`@```````@```,L!``#\
-M_________VM'`@```````@```,L!``#\_________XQ'`@```````@```'\"
-M``#\_________ZM'`@```````@```%<!``#\_________[5'`@```````@``
-M`*0"``#\_________W)(`@```````@```!8"``#\_________Y1(`@``````
-M`@```/L!``#\_________Z5(`@```````@```+\!``#\_________[A(`@``
-M````"P````8```"P`0```````,)(`@```````@```*\"``#\_________]=(
-M`@```````@```+H"``#\_________^Q(`@```````@```+H"``#\________
-M_PE)`@```````@```%P!``#\_________RA)`@```````@```&8!``#\____
-M_____U1)`@```````@```,L!``#\_________WE)`@```````@```%<!``#\
-M_________X-)`@```````@```*0"``#\_________[9)`@```````@```/L!
-M``#\_________\=)`@```````@```+\!``#\_________]I)`@``````"P``
-M``8```"P`0```````.1)`@```````@```*\"``#\__________E)`@``````
-M`@```+H"``#\_________PY*`@```````@```+H"``#\_________R9*`@``
-M`````@```%P!``#\_________SM*`@```````@```*P!``#\_________[Q*
-M`@```````@```)("``#\_________]Y*`@```````@```*0"``#\________
-M_P%+`@```````@```)("``#\_________R1+`@```````@```)("``#\____
-M_____T9+`@```````@```*0"``#\_________VI+`@```````@```)("``#\
-M__________)+`@```````@```.@!``#\__________Y+`@```````@```+,!
-M``#\_________T5,`@```````@```!`"``#\_________U),`@```````@``
-M`+<!``#\_________XA,`@```````@```*0"``#\_________Z-,`@``````
-M`@```)("``#\_________\),`@```````@```)("``#\_________^%,`@``
-M`````@```+`!``#\_________^E,`@```````@```(X!``#\_________Q%-
-M`@```````@```!$"``#\_________YA-`@```````@```,@!``#\________
-M_Z5-`@```````@```,L!``#\_________S!.`@```````@```#`"``#\____
-M_____V1.`@```````@```+P!``#\_________YU.`@```````@```!P"``#\
-M_________[5.`@```````@```+H"``#\_________\U.`@```````@```+H"
-M``#\__________I.`@```````@```*0"``#\_________Q5/`@```````@``
-M`)("``#\_________S)/`@```````@```)("``#\_________U%/`@``````
-M`@```+`!``#\_________UE/`@```````@```(X!``#\_________Y]/`@``
-M`````@```)X!``#\_________^1/`@```````@```,L!``#\_________V-0
-M`@```````@```!$"``#\_________W)0`@```````@```&\!``#\________
-M_^M0`@```````@```)("``#\_________QI1`@```````@```)("``#\____
-M_____S)1`@```````@```#$"``#\_________S]1`@```````@```+<!``#\
-M_________ZE1`@```````@```/(!``#\_________\Q1`@```````@```-@!
-M``#\__________11`@```````@```(D!``#\_________QA2`@```````@``
-M``X"``#\_________R!2`@```````@```(D!``#\_________VE2`@``````
-M`@```-@!``#\_________[I2`@```````@```#$!``#\_________\E2`@``
-M`````@```,L!``#\__________A2`@```````@```+H"``#\_________PQ3
-M`@```````@```#$!``#\_________R13`@```````@```%<!``#\________
-M_RY3`@```````@```*0"``#\_________TY3`@```````@````4"``#\____
-M_____WU3`@```````@```-@!``#\_________Z]3`@```````@```#$!``#\
-M_________\93`@```````@```,L!``#\_________^)3`@```````@```/L!
-M``#\__________-3`@```````@```+\!``#\_________PA4`@```````@``
-M`+H"``#\_________QU4`@```````@```+H"``#\_________S!4`@``````
-M`@```%P!``#\_________T)4`@```````@```-0!``#\_________UM4`@``
-M`````@```)("``#\_________[54`@```````@```+`!``#\_________\!4
-M`@```````@```*P!``#\_________U95`@```````@```)("``#\________
-M_W%5`@```````@```,H!``#\_________X%5`@```````@```!8"``#\____
-M_____Z15`@```````@```,H!``#\_________ZQ5`@```````@```-P!``#\
-M_________\55`@``````"P````,````0'0```````-Q5`@```````@```'0!
-M``#\__________A5`@```````@```'0!``#\_________Q16`@```````@``
-M`#$!``#\_________S=6`@```````@```/,!``#\_________TY6`@``````
-M`@```%`!``#\_________W%6`@```````@```#$!``#\_________X]6`@``
-M`````@```/,!``#\_________Z96`@```````@```#$!``#\_________[A6
-M`@```````@```%`!``#\_________]-6`@```````@```#$!``#\________
-M_^A6`@```````@```#$!``#\_________QQ7`@```````@```%<!``#\____
-M_____R97`@```````@```*0"``#\_________YE7`@```````@```#0!``#\
-M_________[-7`@```````@```/\!``#\_________\Q7`@```````@```/L!
-M``#\_________]U7`@```````@```+\!``#\__________!7`@``````"P``
-M``8```"P`0```````/I7`@```````@```*\"``#\_________Q!8`@``````
-M`@```+H"``#\_________R98`@```````@```+H"``#\_________SE8`@``
-M`````@```%P!``#\_________V18`@```````@```,L!``#\_________YM8
-M`@```````@```,,!``#\__________%8`@```````@```-L!``#\________
-M_Q-9`@```````@```,L!``#\_________V19`@``````"P````4```"0!P``
-M`````&Y9`@```````@```*\"``#\_________Y)9`@```````@```,H!``#\
-M_________\)9`@``````"P````4```#`!P```````,Q9`@```````@```*\"
-M``#\_________TA:`@``````"P````4````X!P```````%):`@```````@``
-M`*\"``#\_________X5:`@``````"P````4```"0!P```````(]:`@``````
-M`@```*\"``#\_________R1;`@```````@```)`!``#\_________S-<`@``
-M`````@```$0!``#\_________W)<`@```````@```"D"``#\_________YM<
-M`@``````"P````4```"0!P```````*5<`@```````@```*\"``#\________
-M_])=`@```````@```(8"``#\__________E=`@```````@```)("``#\____
-M_____S!>`@```````@```)("``#\_________WY>`@```````@```)("``#\
-M_________P-?`@``````"P````4```#P!P````````U?`@```````@```*\"
-M``#\_________T!?`@``````"P````4````P"````````$I?`@```````@``
-M`*\"``#\_________V1?`@``````"P````4```!P"````````&Y?`@``````
-M`@```*\"``#\_________Y-?`@``````"P````8````,`@```````)U?`@``
-M`````@```*\"``#\_________]I?`@``````"P````4```"@"````````.1?
-M`@```````@```*\"``#\_________QE@`@``````"P````8````H`@``````
-M`"-@`@```````@```*\"``#\_________T9@`@``````"P````8````_`@``
-M`````%!@`@```````@```*\"``#\_________UM@`@``````"P````8```!;
-M`@```````&5@`@```````@```*\"``#\_________[=@`@```````@```#T!
-M``#\_________P9A`@```````@```)("``#\_________RIA`@```````@``
-M`)("``#\_________TQA`@```````@```)("``#\_________W!A`@``````
-M`@```)("``#\_________W]A`@``````"P````8```!L`@```````(EA`@``
-M`````@```*\"``#\_________R1B`@```````@```)("``#\_________T]B
-M`@``````"P````8```")`@```````%EB`@```````@```*\"``#\________
-M_YIB`@``````"P````4```#8"````````*1B`@```````@```*\"``#\____
-M_____[=B`@```````@```($!``#\_________]!B`@```````@```)("``#\
-M_________WAC`@```````@```(D!``#\_________Y5C`@```````@```.0!
-M``#\_________Q5D`@```````@```"L"``#\_________RED`@```````@``
-M`)$!``#\_________T]D`@```````@```+`"``#\_________W%D`@``````
-M`@```+`"``#\_________Y)D`@```````@```+`"``#\_________[!D`@``
-M`````@```+`"``#\_________]9D`@```````@```+`"``#\_________P%E
-M`@```````@```+`"``#\_________QME`@```````@```+`"``#\________
-M_S5E`@```````@```+`"``#\_________U-E`@```````@```+`"``#\____
-M_____VUE`@```````@```+`"``#\_________X]E`@```````@```+`"``#\
-M_________[%E`@```````@```+`"``#\_________\YE`@```````@```+`"
-M``#\_________^ME`@```````@```+`"``#\_________PAF`@```````@``
-M`+`"``#\_________R5F`@```````@```+`"``#\_________T%F`@``````
-M`@```+`"``#\_________V-F`@```````@```+`"``#\_________WQF`@``
-M`````@```+`"``#\_________Z!F`@```````@```(0"``#\_________\!F
-M`@```````@```(0"``#\_________^=F`@```````@```(0"``#\________
-M_PMG`@```````@```(0"``#\_________R]G`@```````@```(0"``#\____
-M_____U)G`@```````@```(0"``#\_________W)G`@```````@```(0"``#\
-M_________YQG`@```````@```(0"``#\_________^=G`@```````@```,L!
-M``#\__________=G`@```````@````@"``#\_________W!H`@``````"P``
-M``$```"@!@(``````'YH`@```````@```,4!``#\_________XIH`@``````
-M`@```$4!``#\_________UEI`@```````@```,L!``#\_________XYI`@``
-M`````@```+H"``#\_________Z1I`@```````@```#$!``#\_________[5I
-M`@```````@```%<!``#\_________[]I`@```````@```*0"``#\________
-M__!I`@```````@```'@!``#\_________XEK`@```````@```"L"``#\____
-M_____PQL`@```````@```+("``#\_________TAL`@```````@```+("``#\
-M_________X-L`@```````@```+("``#\_________[IL`@```````@```+("
-M``#\__________)L`@```````@```+("``#\_________P5M`@```````@``
-M`+("``#\_________QMM`@```````@```+("``#\_________X%M`@``````
-M`@```+("``#\_________\YM`@```````@```+("``#\_________QYN`@``
-M`````@```+("``#\_________V%N`@```````@```+("``#\_________Z]N
-M`@```````@```+("``#\_________P=O`@```````@```+("``#\________
-M_TAO`@```````@```+("``#\_________W%O`@```````@```-D!``#\____
-M_____WUO`@```````@```+("``#\_________Z9O`@```````@```*8!``#\
-M_________[)O`@```````@```+("``#\_________]MO`@```````@```*8!
-M``#\_________^=O`@```````@```+("``#\_________Q!P`@```````@``
-M`*8!``#\_________QQP`@```````@```+("``#\_________T5P`@``````
-M`@```*8!``#\_________U%P`@```````@```+("``#\_________ZUP`@``
-M`````@```.8!``#\_________[YS`@```````@```+T"``#\_________]AS
-M`@```````@```+T"``#\__________)S`@```````@```+T"``#\________
-M_PQT`@```````@```+T"``#\_________R9T`@```````@```+T"``#\____
-M_____T!T`@```````@```+T"``#\_________VAT`@```````@```,L!``#\
-M_________[UT`@```````@```+T"``#\_________]YT`@```````@```,L!
-M``#\_________R]U`@```````@```+T"``#\_________U-U`@```````@``
-M`,L!``#\_________\)U`@```````@```$<!``#\_________R%V`@``````
-M`@```)("``#\_________U1V`@```````@```)("``#\_________VQV`@``
-M`````@```+<!``#\_________[=V`@```````@```#$!``#\_________\AV
-M`@```````@```%<!``#\_________])V`@```````@```*0"``#\________
-M__IV`@```````@```/L!``#\_________P]W`@```````@```+H"``#\____
-M_____R1W`@```````@```+H"``#\_________SMW`@```````@```%P!``#\
-M_________TMW`@```````@```)("``#\_________[IW`@```````@```-,!
-M``#\_________^9W`@```````@```+H"``#\_________U-X`@```````@``
-M`#X"``#\_________X1X`@```````@```,L!``#\_________^IX`@``````
-M"P````4`````"0```````/1X`@```````@```*\"``#\_________R=Y`@``
-M`````@```,H!``#\_________U=Y`@``````"P````4```#`!P```````&%Y
-M`@```````@```*\"``#\_________]UY`@``````"P````4````X!P``````
-M`.=Y`@```````@```*\"``#\_________PYZ`@``````"P````8````,`@``
-M`````!AZ`@```````@```*\"``#\_________UIZ`@``````"P````4```"@
-M"````````&1Z`@```````@```*\"``#\_________QA[`@``````"P````8`
-M``"=`@```````")[`@```````@```*\"``#\_________RI[`@```````@``
-M`)`!``#\_________SY\`@```````@```-@!``#\_________VA\`@``````
-M`@```$0!``#\_________XA\`@```````@```/D!``#\_________\Y\`@``
-M`````@```#D"``#\_________UR``@```````@```-$!``#\_________\&`
-M`@```````@```(8"``#\_________\Z``@```````@```"H"``#\________
-M_T:!`@```````@```(8"``#\_________ZZ!`@```````@````@"``#\____
-M_____\*!`@```````@```$8"``#\_________]6!`@```````@```$4"``#\
-M__________B!`@```````@```(8"``#\_________TJ"`@``````"P```*@!
-M`````````````)2"`@```````@```,4!``#\_________Z6"`@```````@``
-M`"X!``#\_________[""`@```````@```$4!``#\_________Q^#`@``````
-M`@````@"``#\_________S.#`@```````@```$8"``#\_________T:#`@``
-M`````@```$4"``#\_________ZJ#`@``````"P```*@!`````````````/F#
-M`@```````@```,4!``#\_________PJ$`@```````@```"X!``#\________
-M_Q6$`@```````@```$4!``#\_________YB$`@```````@````@"``#\____
-M_____ZR$`@```````@```$8"``#\_________[^$`@```````@```$4"``#\
-M_________]R$`@```````@```(8"``#\_________R"%`@``````"P```#@"
-M`````````````$2%`@```````@```,4!``#\_________U.%`@```````@``
-M`"X!``#\_________UZ%`@```````@```$4!``#\_________\&%`@``````
-M`@```-$!``#\_________^^%`@```````@````H"``#\_________T.&`@``
-M`````@````@"``#\_________U>&`@```````@```$8"``#\_________VJ&
-M`@```````@```$4"``#\_________[R&`@``````"P```#@"````````````
-M`-V&`@```````@```,4!``#\_________^V&`@```````@```"X!``#\____
-M______B&`@```````@```$4!``#\_________ZB'`@```````@```&X!``#\
-M_________^:'`@```````@```&X!``#\_________R2(`@```````@```+4!
-M``#\_________S*(`@```````@```%0!``#\_________V&(`@```````@``
-M`%X!``#\_________WJ(`@```````@```%0!``#\_________ZB(`@``````
-M`@```%0!``#\_________WZ)`@```````@```'T!``#\_________\&)`@``
-M`````@```+8!``#\__________R)`@```````@```%X!``#\_________T.*
-M`@```````@````@"``#\_________U>*`@```````@```$8"``#\________
-M_VJ*`@```````@```$4"``#\_________[V*`@``````"P````P"````````
-M`````-Z*`@```````@```,4!``#\_________^V*`@```````@```"X!``#\
-M__________B*`@```````@```$4!``#\__________^+`@```````@```#`!
-M``#\_________PJ,`@```````@```$4"``#\_________SF,`@```````@``
-M`(8"``#\_________W^,`@```````@```#`!``#\_________XJ,`@``````
-M`@```$4"``#\_________S&-`@```````@```&@!``#\_________T2-`@``
-M`````@```#`!``#\_________T^-`@```````@```$4"``#\_________VF-
-M`@```````@```'\"``#\_________WZ-`@``````"P```%8!````````````
-M`)*-`@```````@```)T"``#\_________PZ.`@```````@```/0!``#\____
-M______V.`@```````@```.\!``#\_________S&/`@```````@```.\!``#\
-M_________VF/`@```````@```%X!``#\_________]>0`@```````@```(4!
-M``#\_________^F0`@```````@```',!``#\__________Z0`@```````@``
-M`*L!``#\_________Q"1`@```````@```&@!``#\_________RJ1`@``````
-M`@```'\"``#\_________S^1`@``````"P```%8!`````````````%F1`@``
-M`````@```)T"``#\_________Z61`@```````@```,L!``#\_________Q*2
-M`@```````@```#`"``#\_________SB2`@```````@```+P!``#\________
-M_UR2`@```````@```!P"``#\_________\22`@```````@```,L!``#\____
-M______^2`@```````@```%X!``#\_________RV3`@```````@```,,!``#\
-M_________UF3`@```````@```#`!``#\_________VB3`@```````@```$4"
-M``#\_________Z&3`@```````@```%X!``#\_________UF4`@```````@``
-M`)("``#\_________\N8`@```````@```#<"``#\_________\V9`@``````
-M"P````,```!`'0```````&>:`@```````@```)("``#\_________YV:`@``
-M`````@```)("``#\_________\B:`@```````@```)("``#\_________P*;
-M`@```````@```)("``#\_________T>;`@```````@```)("``#\________
-M_WV;`@```````@```)("``#\_________ZB;`@```````@```)("``#\____
-M_____]V;`@```````@```)("``#\_________YV<`@``````"P````,`````
-M'@```````+F<`@``````"P````,````%'@```````,F<`@``````"P````,`
-M```$'@```````-J<`@``````"P````,`````'@```````.N<`@```````@``
-M```"``#\_________WV=`@```````@```,L!``#\_________ZV=`@``````
-M`@```,L!``#\_________]V=`@```````@```,L!``#\_________RV>`@``
-M`````@```,L!``#\_________UV>`@```````@```,L!``#\_________]J>
-M`@```````@```,L!``#\_________R.@`@```````@```$0!``#\________
-M_V"A`@```````@```,H!``#\_________Z.A`@```````@```.T!``#\____
-M_____^.A`@```````@```.T!``#\_________]^B`@```````@```#`!``#\
-M_________^VB`@```````@```(L!``#\_________Q>D`@```````@```$4!
-M``#\_________T"D`@```````@```&<!``#\_________TRD`@```````@``
-M`#<"``#\_________V6D`@```````@```-@!``#\_________]*D`@``````
-M`@```/(!``#\_________SZE`@```````@```)4!``#\_________QBF`@``
-M`````@```$4"``#\_________Y.F`@```````@```'<!``#\_________YZF
-M`@```````@```$4"``#\_________]>F`@```````@```,L!``#\________
-M_^*F`@```````@```&H!``#\_________^JF`@```````@```$D!``#\____
-M_____S"G`@```````@````@"``#\_________T"G`@```````@```$8"``#\
-M_________UJG`@```````@```$4"``#\_________YVG`@``````"P```#4!
-M`````````````*BG`@```````@```$4!``#\_________^.G`@```````@``
-M``@"``#\_________R2H`@``````"P```#4!`````````````"^H`@``````
-M`@```$4!``#\_________W^H`@```````@````@"``#\_________Y.H`@``
-M`````@```$8"``#\_________Z:H`@```````@```$4"``#\__________&H
-M`@``````"P````$```#PJ0(``````/ZH`@```````@```,4!``#\________
-M_PZI`@```````@```"X!``#\_________QFI`@```````@```$4!``#\____
-M_____V2I`@```````@````@"``#\_________Z2I`@``````"P```)T!````
-M`````````*^I`@```````@```$4!``#\_________[^I`@```````@```*0"
-M``#\_________\NI`@```````@```*0"``#\_________\JJ`@```````@``
-M`#`!``#\_________]JJ`@```````@```(L!``#\_________^6J`@``````
-M`@```$4"``#\_________RBK`@```````@````\"``#\_________TBK`@``
-M`````@```#`!``#\_________UBK`@```````@```(L!``#\_________V.K
-M`@```````@```$4"``#\_________V*L`@```````@```*0"``#\________
-M_VVL`@```````@```$4"``#\_________Y^L`@```````@````\"``#\____
-M_____ZNL`@```````@```*0"``#\_________[:L`@```````@```$4"``#\
-M_________P"M`@```````@````@"``#\_________T*M`@```````@```!4"
-M``#\_________U&M`@```````@```$4"``#\_________V>M`@``````"P``
-M`#4!`````````````'*M`@```````@```$4!``#\_________[:M`@``````
-M`@````@"``#\_________]2M`@```````@```$8"``#\_________^ZM`@``
-M`````@```$4"``#\_________U*N`@``````"P```#4!`````````````&.N
-M`@```````@```,4!``#\_________W6N`@```````@```"X!``#\________
-M_X"N`@```````@```$4!``#\_________].N`@```````@````@"``#\____
-M______2N`@```````@```$8"``#\_________Q"O`@```````@```$4"``#\
-M_________WJO`@``````"P```#4!`````````````(>O`@```````@```,4!
-M``#\_________YBO`@```````@```"X!``#\_________Z.O`@```````@``
-M`$4!``#\__________JO`@```````@````@"``#\_________QBP`@``````
-M`@```$8"``#\_________S2P`@```````@```$4"``#\_________Y*P`@``
-M````"P```#4!`````````````*:P`@```````@```,4!``#\_________[>P
-M`@```````@```"X!``#\_________\*P`@```````@```$4!``#\________
-M_QJQ`@```````@````@"``#\_________SBQ`@```````@```$8"``#\____
-M_____U2Q`@```````@```$4"``#\_________ZJQ`@``````"P```#4!````
-M`````````+>Q`@```````@```,4!``#\_________\BQ`@```````@```"X!
-M``#\_________].Q`@```````@```$4!``#\_________T>R`@```````@``
-M``@"``#\__________6R`@``````"P````$```!0I0(```````.S`@``````
-M`@```,4!``#\_________PZS`@```````@```$4!``#\_________W&U`@``
-M`````@```'0!``#\_________X*U`@```````@```'<!``#\_________]RU
-M`@```````@```,L!``#\_________[:V`@```````@````X"``#\________
-M_T6W`@```````@````@"``#\_________V2W`@```````@````$"``#\____
-M_____W>W`@```````@```$4"``#\_________\RW`@``````"P```%T!````
-M`````````-JW`@```````@```,4!``#\_________^6W`@```````@```$4!
-M``#\_________T6X`@```````@````@"``#\_________UFX`@```````@``
-M``$"``#\_________["X`@``````"P```%T!`````````````+ZX`@``````
-M`@```,4!``#\_________\FX`@```````@```$4!``#\_________].X`@``
-M`````@```*0"``#\_________RRY`@```````@````@"``#\_________SRY
-M`@```````@````$"``#\_________X^Y`@``````"P```%T!````````````
-M`)VY`@```````@```,4!``#\_________ZBY`@```````@```$4!``#\____
-M______6Y`@```````@````@"``#\_________P6Z`@```````@````$"``#\
-M_________U2Z`@``````"P```%T!`````````````&*Z`@```````@```,4!
-M``#\_________VVZ`@```````@```$4!``#\_________Z2Z`@```````@``
-M`*0!``#\_________[2Z`@```````@```$("``#\_________\"[`@``````
-M`@```*0!``#\_________]"[`@```````@```$("``#\_________T"\`@``
-M`````@```$L!``#\_________].\`@```````@```+0!``#\_________S&]
-M`@```````@```#8"``#\_________V"]`@```````@```*0!``#\________
-M_W"]`@```````@```$("``#\_________]Z]`@```````@```!0"``#\____
-M_____T*^`@```````@```"<"``#\_________YB^`@```````@```$0!``#\
-M_________[N^`@```````@```/(!``#\_________\R^`@```````@```"<"
-M``#\_________P._`@```````@```$0!``#\_________Q2_`@```````@``
-M`"<"``#\_________S:_`@```````@```'\"``#\_________UF_`@``````
-M`@```'\"``#\_________\"_`@```````@```*`!``#\_________PK``@``
-M`````@```$0!``#\_________R+``@```````@```)4!``#\_________RW`
-M`@```````@```#X"``#\_________^S``@```````@```,L!``#\________
-M___``@```````@```-L!``#\_________Q[!`@``````"P```#T!````````
-M`````#7!`@```````@```)T"``#\_________\G!`@```````@```,L!``#\
-M_________]S!`@```````@```#X"``#\__________?!`@``````"P```#("
-M``````````````["`@```````@```)T"``#\_________\7"`@```````@``
-M`$0!``#\_________]#"`@```````@```+$!``#\_________]O"`@``````
-M`@````X"``#\_________W+#`@``````"P```#T!`````````````(G#`@``
-M`````@```)T"``#\_________RK$`@``````"P```#("`````````````$'$
-M`@```````@```)T"``#\__________3%`@```````@```,L!``#\________
-M_T[&`@```````@```$(!``#\_________UW&`@```````@```$4"``#\____
-M_____YK&`@```````@```/,!``#\_________\K&`@```````@```+P!``#\
-M_________^;&`@```````@```$@!``#\_________Q?'`@```````@```,L!
-M``#\_________X''`@```````@```#`"``#\_________Y?'`@```````@``
-M`$(!``#\_________Z3'`@```````@```$4"``#\_________Q3(`@``````
-M`@```#$!``#\_________T3(`@```````@```%<!``#\_________T[(`@``
-M`````@```*0"``#\_________W3(`@```````@```#0!``#\_________X[(
-M`@```````@```/\!``#\_________[W(`@```````@```/L!``#\________
-M_\[(`@```````@```+\!``#\_________^'(`@``````"P````8```"Z`@``
-M`````.O(`@```````@```*\"``#\_________P#)`@```````@```+H"``#\
-M_________Q7)`@```````@```+H"``#\_________UW)`@```````@```%P!
-M``#\_________X3)`@```````@```,L!``#\_________\+)`@```````@``
-M`,,!``#\_________PC*`@```````@```#$!``#\_________S?*`@``````
-M`@```%<!``#\_________T'*`@```````@```*0"``#\_________V?*`@``
-M`````@```#0!``#\_________X'*`@```````@```/\!``#\_________YS*
-M`@```````@```/L!``#\_________ZW*`@```````@```+\!``#\________
-M_\#*`@``````"P````8```"Z`@```````,K*`@```````@```*\"``#\____
-M_____]_*`@```````@```+H"``#\__________#*`@``````"P````8```"Z
-M`@```````/K*`@```````@```*\"``#\_________P_+`@```````@```+H"
-M``#\_________X_+`@```````@```+H"``#\__________G+`@```````@``
-M`,L!``#\_________R[,`@```````@```+H"``#\_________T?,`@``````
-M`@```%P!``#\_________Y;,`@```````@````@"``#\_________ZK,`@``
-M`````@```$8"``#\_________\3,`@```````@```$4"``#\_________TG-
-M`@``````"P```#4!`````````````%K-`@```````@```,4!``#\________
-M_VS-`@```````@```"X!``#\_________W?-`@```````@```$4!``#\____
-M_____[3-`@```````@```*0!``#\_________\3-`@```````@```$("``#\
-M_________[C.`@```````@```"<"``#\__________G.`@```````@```$("
-M``#\_________TW/`@```````@```,L!``#\_________RK3`@```````@``
-M`/0!``#\_________U73`@```````@```!X"``#\_________]O3`@``````
-M"P````$```"@X`(``````/S3`@```````@```'L!``#\__________O4`@``
-M````"P````$```"@X`(``````"_5`@```````@```'L!``#\_________RS6
-M`@``````"P````$```"@X`(``````%_6`@```````@```'L!``#\________
-M_\?6`@``````"P````$```"@X`(``````/?6`@```````@```'L!``#\____
-M_____T?7`@``````"P````$```"@X`(``````'?7`@```````@```'L!``#\
-M_________T78`@```````@```!\"``#\_________[W8`@```````@```#8!
-M``#\_________Y79`@```````@```.`!``#\_________S/:`@```````@``
-M`+D!``#\_________Z?:`@```````@```/0!``#\_________]?:`@``````
-M`@```"`"``#\__________3:`@```````@```,0!``#\_________Q7<`@``
-M`````@```!X"``#\_________]O=`@```````@```-`!``#\_________QW>
-M`@```````@```.`!``#\_________\3>`@```````@```+D!``#\________
-M_T7?`@```````@```&`!``#\_________]K?`@```````@```+D!``#\____
-M_____X+@`@```````@```+D!``#\_________]3@`@```````@```!X"``#\
-M_________S[A`@```````@```+D!``#\_________WKA`@```````@```+D!
-M``#\_________\OA`@```````@```+D!``#\_________POB`@```````@``
-M`+D!``#\_________WWE`@```````@```+D!``#\_________^#E`@``````
-M`@```)("``#\_________P3F`@```````@```)("``#\_________V'G`@``
-M`````@```-T!``#\_________Z_H`@```````@```)("``#\_________\[H
-M`@```````@```)("``#\_________^KH`@```````@```$4"``#\________
-M_TGI`@```````@```*0"``#\_________UGI`@```````@```)("``#\____
-M_____X+I`@```````@```*0"``#\_________Y+I`@```````@```)("``#\
-M_________Y_J`@```````@```*0"``#\_________Z[J`@```````@```)("
-M``#\_________\#J`@```````@```*0"``#\_________\CJ`@```````@``
-M`)("``#\_________^?J`@```````@```*0"``#\_________^_J`@``````
-M`@```)("``#\_________QGK`@```````@```*0"``#\_________RCK`@``
-M`````@```)("``#\_________SKK`@```````@```*0"``#\_________T+K
-M`@```````@```)("``#\_________V'K`@```````@```*0"``#\________
-M_VGK`@```````@```)("``#\_________Z[K`@```````@```*0"``#\____
-M_____QSL`@```````@```*0"``#\_________S'L`@```````@```%<!``#\
-M_________X[L`@```````@````@"``#\__________WL`@``````"P```*D!
-M``````````````3M`@``````"P```#P!`````````````!?M`@```````@``
-M`$4!``#\_________W7M`@```````@````@"``#\_________^7M`@``````
-M"P```%(!`````````````.WM`@```````@```$4!``#\_________X#N`@``
-M`````@```)("``#\_________Z[N`@```````@```)("``#\___________N
-M`@```````@```.,!``#\_________PSO`@```````@```$T!``#\________
-M_U_O`@```````@````@"``#\_________[+O`@``````"P```%(!````````
-M`````+KO`@```````@```$4!``#\_________U3P`@```````@```)("``#\
-M_________X+P`@```````@```)("``#\_________\_P`@```````@```"P!
-M``#\_________]SP`@```````@```$T!``#\_________T;Q`@```````@``
-M``@"``#\_________YCQ`@``````"P```*D!`````````````)_Q`@``````
-M"P```#P!`````````````++Q`@```````@```$4!``#\_________PCR`@``
-M`````@````@"``#\_________W/R`@``````"P````$```#P)0,``````(7R
-M`@```````@```$4!``#\_________[+R`@``````"P```%\!````````````
-M`$[S`@```````@```*0"``#\_________UOS`@```````@```)("``#\____
-M_____W#S`@```````@```*0"``#\_________WKS`@```````@```)("``#\
-M_________S[T`@```````@```*0"``#\_________TOT`@```````@```)("
-M``#\_________V#T`@```````@```*0"``#\_________VKT`@```````@``
-M`)("``#\_________P;U`@```````@```#L"``#\_________SCU`@``````
-M`@```"("``#\_________T#U`@```````@```-T!``#\_________X;U`@``
-M`````@```)("``#\_________Z;U`@```````@```)("``#\_________\+U
-M`@```````@```)("``#\_________^_U`@```````@```)("``#\________
-M_SWV`@```````@````L"``#\_________T7V`@```````@```"\!``#\____
-M_____ZOV`@```````@```*0"``#\_________[OV`@```````@```)("``#\
-M_________^#V`@```````@```*0"``#\__________#V`@```````@```)("
-M``#\__________GY`@```````@```","``#\_________ZSZ`@```````@``
-M`/0!``#\_________Q;\`@```````@```/0!``#\_________SG\`@``````
-M`@```/0!``#\_________[+\`@```````@```&T!``#\_________]/]`@``
-M`````@```*0"``#\__________[]`@```````@```*0"``#\_________[[^
-M`@```````@```$$!``#\_________]_^`@```````@```.L!``#\________
-M__7^`@```````@```"8"``#\_________P3_`@```````@```"8"``#\____
-M_____XW_`@```````@```)("``#\_________[O_`@```````@```)("``#\
-M_________^__`@```````@```*0"``#\_________P<``P```````@```)("
-M``#\_________U4``P```````@```)("``#\_________[P``P```````@``
-M`)("``#\_________R\!`P```````@```)("``#\_________^<!`P``````
-M`@```*0"``#\__________H!`P```````@```)("``#\_________Q<"`P``
-M`````@```/$!``#\_________R("`P```````@````,"``#\_________S0"
-M`P```````@```*0"``#\_________TX"`P```````@```*0"``#\________
-M_V@"`P```````@```*0"``#\_________X@"`P```````@```(\!``#\____
-M_____YD"`P```````@```)("``#\_________^<"`P```````@```*0"``#\
-M__________H"`P```````@```)("``#\_________Q<#`P```````@```/$!
-M``#\_________R(#`P```````@````,"``#\_________S0#`P```````@``
-M`*0"``#\_________TX#`P```````@```*0"``#\_________V@#`P``````
-M`@```*0"``#\_________X@#`P```````@```(\!``#\_________YD#`P``
-M`````@```)("``#\_________[T#`P```````@```*0"``#\_________\@#
-M`P```````@```+`!``#\_________^8#`P```````@```(X!``#\________
-M__,#`P```````@```)("``#\_________PX$`P```````@```)("``#\____
-M_____R8$`P```````@```)("``#\_________Q`%`P```````@```)("``#\
-M_________ZL%`P```````@````@"``#\_________\D%`P```````@```$8"
-M``#\_________^4%`P```````@```$4"``#\_________TL&`P``````"P``
-M``$```#P)0,``````%@&`P```````@```,4!``#\_________V<&`P``````
-M`@```"X!``#\_________W(&`P```````@```$4!``#\_________XP'`P``
-M````"P````4````X"0```````)8'`P```````@```*\"``#\_________R4(
-M`P``````"P````4```"("0```````"\(`P```````@```*\"``#\________
-M_S\(`P```````@```,,!``#\_________UH(`P```````@```,8!``#\____
-M_____RL)`P```````@```/`!``#\_________Z8)`P``````"P```$,!````
-M`````````+$)`P```````@```.$!``#\_________\D)`P```````@```+,!
-M``#\_________R,*`P```````@```/`!``#\_________S8*`P```````@``
-M`)\!``#\_________V8*`P```````@```!P"``#\_________QD+`P``````
-M`@```&\!``#\_________R,+`P```````@```#\"``#\_________^L+`P``
-M`````@```,,!``#\_________VP,`P```````@```,L!``#\_________\$,
-M`P```````@```#`"``#\_________^,,`P```````@```+P!``#\________
-M__,,`P```````@```!P"``#\_________YL-`P```````@```)L!``#\____
-M_____TH.`P```````@```,L!``#\_________\@.`P```````@```)L!``#\
-M_________V,/`P```````@```+H"``#\_________WD/`P```````@```+H"
-M``#\_________ZP/`P```````@```)L!``#\_________Q(0`P```````@``
-M`+H"``#\_________V`0`P```````@```+H"``#\_________YX0`P``````
-M`@```#$!``#\_________]00`P```````@```%<!``#\_________]X0`P``
-M`````@```*0"``#\_________P01`P```````@```#0!``#\_________QX1
-M`P```````@```/\!``#\_________SD1`P```````@```/L!``#\________
-M_TH1`P```````@```+\!``#\_________UT1`P``````"P````8```#0`@``
-M`````&<1`P```````@```*\"``#\_________WP1`P```````@```+H"``#\
-M_________Y$1`P``````"P````8```#0`@```````)L1`P```````@```*\"
-M``#\_________[`1`P```````@```+H"``#\__________X1`P```````@``
-M`+H"``#\_________TH2`P```````@```%P!``#\_________V42`P``````
-M`@```+H"``#\_________[T2`P```````@```.@!``#\_________^D2`P``
-M`````@```,,!``#\_________P83`P```````@```+,!``#\_________TT3
-M`P```````@```!`"``#\_________YL3`P``````"P````,```"`'@``````
-M``$4`P```````@```-,!``#\_________QT4`P```````@```*X!``#\____
-M_____SD4`P```````@```*X!``#\_________U44`P```````@```*X!``#\
-M_________W$4`P```````@```*X!``#\_________Y(4`P```````@```*(!
-M``#\_________[04`P```````@```*(!``#\_________^$4`P```````@``
-M`*(!``#\_________P,5`P```````@```*(!``#\_________PT5`P``````
-M`@```*0"``#\_________SH5`P```````@```*(!``#\_________UP5`P``
-M`````@```*(!``#\_________V85`P```````@```*0"``#\_________X(5
-M`P```````@```*X!``#\_________YX5`P```````@```*X!``#\________
-M_[H5`P```````@```*X!``#\_________]P5`P```````@```*(!``#\____
-M______@5`P```````@```*X!``#\_________TT6`P```````@```*0"``#\
-M_________\H6`P```````@```)("``#\_________^@6`P```````@```)("
-M``#\__________P6`P```````@```*0"``#\_________Q87`P```````@``
-M`+P!``#\_________R47`P```````@```*0"``#\_________SP7`P``````
-M`@```*X!``#\_________T87`P```````@```*0"``#\_________V(7`P``
-M`````@```*X!``#\_________VP7`P```````@```*0"``#\_________YD7
-M`P```````@```*(!``#\_________Z,7`P```````@```*0"``#\________
-M_[\7`P```````@```*X!``#\_________\D7`P```````@```*0"``#\____
-M_____],7`P```````@```(8!``#\_________^$7`P```````@```.<!``#\
-M_________P,8`P```````@```*(!``#\_________R48`P```````@```*(!
-M``#\_________T<8`P```````@```*(!``#\_________VD8`P```````@``
-M`*(!``#\_________X48`P```````@```*X!``#\_________Y08`P``````
-M`@```*0"``#\_________ZL8`P```````@```*X!``#\_________[48`P``
-M`````@```*0"``#\_________]<8`P```````@```*(!``#\__________,8
-M`P```````@```*X!``#\_________Q09`P```````@```*(!``#\________
-M_RD9`P```````@```#\"``#\_________T(9`P```````@```*X!``#\____
-M_____TP9`P```````@```*0"``#\_________W89`P```````@```*(!``#\
-M_________X`9`P```````@```*0"``#\_________YD9`P```````@```*X!
-M``#\_________Z,9`P```````@```*0"``#\_________]\:`P```````@``
-M`#`!``#\_________^H:`P```````@```$4"``#\_________U4;`P``````
-M`@```)("``#\_________WP;`P```````@```)("``#\_________[T;`P``
-M`````@```)("``#\_________^8;`P```````@```#`!``#\__________$;
-M`P```````@```$4"``#\__________P;`P```````@```-,!``#\________
-M_RL<`P```````@```-,!``#\_________W0=`P```````@```!`"``#\____
-M_____WX=`P```````@```*0"``#\_________YT=`P```````@```!`"``#\
-M_________Z<=`P```````@```*0"``#\_________S4>`P```````@```)("
-M``#\_________TP>`P```````@```)("``#\_________XL>`P```````@``
-M`*0"``#\_________Z0>`P```````@```+P!``#\_________[\>`P``````
-M`@````("``#\_________]0>`P```````@````("``#\_________^(>`P``
-M`````@```*0"``#\_________Q`?`P```````@```)("``#\_________S8?
-M`P```````@```)("``#\_________TX?`P```````@```*0"``#\________
-M_U\?`P``````"P````4```#`"0```````&D?`P```````@```*\"``#\____
-M_____WD?`P```````@````@"``#\_________\@?`P``````"P````$```#P
-M)0,``````-,?`P```````@```$4!``#\_________^0?`P``````"P````8`
-M``#F`@```````.X?`P```````@```*\"``#\__________X?`P```````@``
-M``@"``#\_________TT@`P``````"P````$```#P)0,``````%@@`P``````
-M`@```$4!``#\_________X,@`P```````@````@"``#\_________]8@`P``
-M````"P````$```#P)0,``````.0@`P```````@```$4!``#\__________H@
-M`P```````@````@"``#\_________TTA`P``````"P````$```#P)0,`````
-M`%LA`P```````@```$4!``#\_________W$A`P```````@````@"``#\____
-M_____\`A`P``````"P````$```#P)0,``````,LA`P```````@```$4!``#\
-M_________^@A`P```````@````@"``#\_________S<B`P``````"P````$`
-M``#P)0,``````$(B`P```````@```$4!``#\_________U@B`P```````@``
-M``@"``#\_________[(B`P``````"P````$```#P)0,``````+TB`P``````
-M`@```$4!``#\__________@B`P```````@```/`!``#\_________Q,C`P``
-M`````@```)P!``#\_________VLC`P```````@```-,!``#\_________Z<C
-M`P```````@```-,!``#\_________[DC`P```````@```,L!``#\________
-M_PDD`P```````@```#`"``#\_________S$D`P```````@```+P!``#\____
-M_____T8D`P```````@```!P"``#\_________W0D`P```````@```,L!``#\
-M_________](D`P```````@```#`"``#\__________TD`P```````@```+P!
-M``#\_________Q(E`P```````@```!P"``#\_________TLE`P```````@``
-M`,L!``#\_________WDE`P```````@```%X!``#\_________Y<E`P``````
-M`@```,,!``#\_________Q8G`P```````@```#`!``#\_________R$G`P``
-M`````@```$4"``#\_________Z<G`P```````@```*0"``#\_________^TG
-M`P```````@```/,!``#\_________P(H`P```````@```+P!``#\________
-M_UHH`P``````"P````4```#X"0```````&0H`P```````@```*\"``#\____
-M_____W8H`P```````@```+X!``#\__________4H`P```````@```*0"``#\
-M_________Y,I`P```````@```#`!``#\_________YXI`P```````@```$4"
-M``#\_________[4I`P```````@```#`!``#\_________\`I`P```````@``
-M`$4"``#\_________\LI`P```````@```+P!``#\_________[$J`P``````
-M`@```+T!``#\_________\@J`P```````@```+T!``#\_________]\J`P``
-M`````@```&0!``#\__________$J`P```````@```,<!``#\_________P0K
-M`P```````@```.X!``#\_________R$K`P```````@```(0!``#\________
-M_S,K`P```````@```+(!``#\_________T4K`P```````@```#P"``#\____
-M_____UDK`P```````@```"T"``#\_________X0K`P```````@```,L!``#\
-M_________^(K`P```````@```#`"``#\_________PTL`P```````@```+P!
-M``#\_________R(L`P```````@```!P"``#\_________W<L`P```````@``
-M`%X!``#\_________X8L`P```````@```,L!``#\_________[$L`P``````
-M"P````8```#\`@```````+LL`P```````@```*\"``#\_________\@L`P``
-M`````@```%X!``#\_________^@L`P```````@```,,!``#\_________X0N
-M`P```````@```/T!``#\_________Y(N`P``````"P````,```"H'P``````
-M`.@N`P```````@```+,!``#\_________UXO`P```````@```/`!``#\____
-M_____W,O`P```````@```)\!``#\_________[(O`P```````@```!P"``#\
-M_________T0P`P```````@```,L!``#\_________V4P`P```````@```#X!
-M``#\_________Z,P`P```````@```/0!``#\_________U0Q`P```````@``
-M`+H"``#\_________XPQ`P```````@```#$!``#\_________Z8Q`P``````
-M`@```%<!``#\_________[`Q`P```````@```*0"``#\_________]LQ`P``
-M`````@```#0!``#\__________@Q`P```````@```/\!``#\_________QPR
-M`P```````@```/L!``#\_________S`R`P```````@```+\!``#\________
-M_TLR`P```````@```+H"``#\_________V8R`P```````@```+H"``#\____
-M_____YXR`P```````@```%P!``#\_________PTS`P```````@```#X!``#\
-M_________QLS`P```````@```/@!``#\_________]$S`P```````@```/0!
-M``#\_________R`U`P```````@```#`"``#\_________S0U`P```````@``
-M`!P"``#\_________V$U`P```````@```%X!``#\_________VTU`P``````
-M`@```+,!``#\_________QHV`P```````@```,L!``#\_________SLV`P``
-M`````@```#X!``#\_________V\V`P```````@```#X!``#\_________Y\V
-M`P```````@```#X!``#\_________[$V`P```````@```/0!``#\________
-M_^\V`P```````@```%,!``#\_________SHX`P```````@```.D!``#\____
-M_____UPX`P```````@```,L!``#\_________W`X`P```````@```#$!``#\
-M_________X0X`P```````@```%<!``#\_________XXX`P```````@```*0"
-M``#\_________[8X`P```````@```/L!``#\_________\<X`P```````@``
-M`+\!``#\_________]PX`P```````@```+H"``#\__________$X`P``````
-M`@```+H"``#\_________QTY`P```````@```%P!``#\_________S@Y`P``
-M`````@```&8!``#\_________Z@Y`P```````@````D"``#\_________\4Y
-M`P```````@```#X!``#\_________PDZ`P```````@```#X!``#\________
-M_SHZ`P```````@```#X!``#\_________TPZ`P```````@```%,!``#\____
-M_____UXZ`P```````@```,8!``#\_________X<Z`P```````@```%,!``#\
-M_________]L[`P```````@```+,!``#\_________P,]`P```````@```#`"
-M``#\_________Q(]`P```````@```!P"``#\_________U8]`P```````@``
-M`,,!``#\_________Y4]`P```````@```#X!``#\_________[P]`P``````
-M`@```)@!``#\_________R8^`P```````@```(T!``#\_________SL^`P``
-M````"P```$,!`````````````$8^`P```````@```.$!``#\_________VH^
-M`P```````@```*4!``#\_________W4^`P```````@```(T!``#\________
-M_Z\^`P```````@````("``#\_________[T^`P```````@```*0"``#\____
-M_____PT_`P```````@```%P!``#\_________R0_`P```````@```#H"``#\
-M_________U<_`P```````@```-,!``#\_________WD_`P```````@```'\"
-M``#\_________X4_`P```````@```-0!``#\_________YL_`P```````@``
-M`,L!``#\_________[T_`P```````@```/L!``#\_________\X_`P``````
-M`@```+\!``#\_________^,_`P```````@```+H"``#\__________@_`P``
-M`````@```+H"``#\_________P]``P```````@```%P!``#\_________S!`
-M`P```````@```,L!``#\_________T%``P```````@```+,!``#\________
-M_X)``P```````@```+P!``#\_________W%!`P```````@```#`!``#\____
-M_____WQ!`P```````@```$4"``#\_________]I!`P``````"P````4````8
-M"@```````.1!`P```````@```*\"``#\_________P1"`P```````@```%P!
-M``#\_________P]"`P```````@```$4"``#\_________T9"`P```````@``
-M`+<!``#\_________WQ"`P```````@```*0"``#\_________X="`P``````
-M`@```$4"``#\_________YQ"`P```````@```!`"``#\_________ZA"`P``
-M`````@```*0"``#\_________[-"`P```````@```$4"``#\_________[Y"
-M`P```````@```%D!``#\_________Q1#`P```````@```,L!``#\________
-M_WQ#`P```````@```+P!``#\__________1$`P```````@```*(!``#\____
-M_____U!%`P```````@```#`!``#\_________UM%`P```````@```$4"``#\
-M_________V]%`P```````@```-,!``#\_________Y9%`P``````"P````,`
-M``"P'P```````,]%`P```````@```)("``#\_________R%&`P```````@``
-M`)("``#\_________TQ&`P```````@```)("``#\_________Z]&`P``````
-M`@```)("``#\_________]9&`P```````@```)("``#\_________SM'`P``
-M`````@```)("``#\_________W='`P```````@```#`!``#\_________X)'
-M`P```````@```$4"``#\_________Y)'`P```````@```,,!``#\________
-M_\U'`P```````@```#`!``#\_________]A'`P```````@```$4"``#\____
-M_____^Y'`P``````"P```.4!``````````````5(`P```````@```)T"``#\
-M_________QY(`P```````@```*0"``#\_________TM(`P```````@```,,"
-M``#\_________W](`P```````@```)("``#\_________Z5(`P```````@``
-M`)("``#\_________ZI(`P```````@```,,"``#\_________R1)`P``````
-M`@```,L!``#\_________X!)`P```````@```/L!``#\_________Z!)`P``
-M`````@```+\!``#\_________\A)`P```````@```+H"``#\_________VE*
-M`P``````"P````8```#0`@```````'-*`P```````@```*\"``#\________
-M_XQ*`P```````@```+H"``#\_________[)*`P```````@```%P!``#\____
-M_____]]*`P```````@```)("``#\_________P5+`P```````@```)("``#\
-M_________U5+`P```````@```,L!``#\_________Y)+`P```````@```+,!
-M``#\_________\1+`P```````@```%<!``#\_________\Y+`P```````@``
-M`*0"``#\_________PU,`P```````@```)("``#\_________S-,`P``````
-M`@```)("``#\_________RA-`P```````@```)("``#\_________TM-`P``
-M`````@```)("``#\_________]M-`P```````@```)<!``#\__________A-
-M`P```````@```"<"``#\_________S=.`P```````@```)("``#\________
-M_UI.`P```````@```)("``#\_________Y%.`P```````@```)("``#\____
-M_____[1.`P```````@```)("``#\_________PE/`P```````@```)("``#\
-M_________R]/`P```````@```)("``#\_________VQ/`P```````@```)("
-M``#\_________Y1/`P```````@```#`!``#\_________Y]/`P```````@``
-M`$4"``#\_________ZI/`P```````@```-,!``#\_________\%/`P``````
-M`@```%<!``#\_________\M/`P```````@```*0"``#\_________S51`P``
-M`````@```#`!``#\_________T!1`P```````@```$4"``#\_________X]1
-M`P```````@```#`!``#\_________YI1`P```````@```$4"``#\________
-M_[%1`P```````@```!P"``#\_________[Y2`P```````@```(8"``#\____
-M_____Q=3`P``````"P````8````0`P```````"%3`P```````@```*\"``#\
-M_________S13`P```````@```#`!``#\_________S]3`P```````@```$4"
-M``#\_________X93`P```````@```,L!``#\_________Q-4`P```````@``
-M`,L!``#\_________WM4`P```````@```!P"``#\_________T55`P``````
-M`@```*0"``#\_________\A5`P```````@```*0"``#\_________QY6`P``
-M`````@```*0"``#\_________S]6`P```````@```#`!``#\_________TI6
-M`P```````@```$4"``#\_________UA6`P```````@```!L"``#\________
-M_QE7`P```````@```*0"``#\_________UY7`P```````@```*0"``#\____
-M_____W]7`P```````@```#`!``#\_________XI7`P```````@```$4"``#\
-M_________YA7`P```````@```!L"``#\_________\Y7`P```````@```*0"
-M``#\_________R=8`P```````@```*0"``#\_________X18`P```````@``
-M`*0"``#\_________[]8`P```````@```*H!``#\_________^]8`P``````
-M`@```#`!``#\__________I8`P```````@```$4"``#\_________P59`P``
-M`````@```!P"``#\_________VA9`P```````@```)("``#\_________P]<
-M`P```````@```#(!``#\_________R-<`P```````@```#(!``#\________
-M_S]<`P```````@```#(!``#\_________\=<`P```````@```#(!``#\____
-M_____]M<`P```````@```#(!``#\__________E<`P```````@```#(!``#\
-M_________SY=`P```````@```)<!``#\_________VY=`P```````@```.,!
-M``#\_________[9=`P```````@```,\!``#\__________]=`P```````@``
-M`#\!``#\_________P=>`P```````@```(@!``#\_________Q9>`P``````
-M"P````,```#8(````````%]>`P```````@```&4!``#\_________W1>`P``
-M`````@```)X!``#\_________]9>`P```````@```*0"``#\_________S5D
-M`P```````@````L````<`0```````$%D`P``````"P````L````@`0``````
-M`$YD`P```````@```&$!``#\_________Y9D`P```````@```!D"``#\____
-M_____VYE`P```````@```*<!``#\_________YME`P```````@````T"``#\
-M_________ZIE`P```````@```*<!``#\_________XIF`P```````@```,L!
-M``#\_________]%F`P```````@```-\!``#\_________^YF`P```````@``
-M`(8"``#\_________P5G`P```````@```%$!``#\_________X-G`P``````
-M`@```*,!``#\_________[IG`P```````@```)X!``#\_________P)H`P``
-M`````@```,(!``#\_________S%I`P```````@```*0"``#\_________T-J
-M`P```````@````L````>`0```````%!J`P``````"P````L````@`0``````
-M`%IJ`P```````@```&$!``#\_________YMJ`P```````@````L````>`0``
-M`````*AJ`P``````"P````L````@`0```````+)J`P```````@```&$!``#\
-M_________S-K`P```````@```)("``#\_________X%K`P```````@```)("
-M``#\_________YEK`P```````@```%4!``#\_________ZMK`P```````@``
-M`%4!``#\_________[UK`P```````@```%4!``#\_________\]K`P``````
-M`@```%4!``#\_________^%K`P```````@```%4!``#\__________-K`P``
-M`````@```%4!``#\_________Q9L`P```````@```)("``#\_________V-L
-M`P```````@```)("``#\_________X-L`P```````@```)("``#\________
-M_PQM`P```````@```%4!``#\_________U5M`P```````@````@"``#\____
-M_____VEM`P```````@````$"``#\__________MM`P```````@```(8"``#\
-M_________RAN`P```````@```(8"``#\_________S-N`P``````"P```/P!
-M`````````````$%N`P```````@```,4!``#\_________TQN`P```````@``
-M`$4!``#\_________YEN`P```````@````@"``#\_________ZEN`P``````
-M`@````$"``#\_________P-O`P``````"P```/P!`````````````!%O`P``
-M`````@```,4!``#\_________QQO`P```````@```$4!``#\_________WAO
-M`P```````@```(P!``#\_________X9O`P```````@```%<!``#\________
-M_Y!O`P```````@```*0"``#\_________\1O`P```````@```((!``#\____
-M_____]1O`P```````@```%<!``#\_________]YO`P```````@```*0"``#\
-M_________P-P`P```````@```(P!``#\_________Q1P`P```````@```%<!
-M``#\_________QYP`P```````@```*0"``#\_________V5P`P```````@``
-M`((!``#\__________UP`P```````@```$(!``#\_________PAQ`P``````
-M`@```$4"``#\_________Y-S`P```````@```#T"``#\_________[%S`P``
-M`````@```)(!``#\_________Y9T`P```````@```+H!``#\_________ZMT
-M`P``````"P```-H!`````````````.MT`P```````@```#T"``#\________
-M__UT`P```````@```)(!``#\_________Y1U`P```````@```+H!``#\____
-M_____\%U`P```````@```+H!``#\_________V]V`P```````@```'(!``#\
-M_________X=V`P```````@```'\!``#\_________Y]V`P```````@```,T!
-M``#\_________P=W`P``````"P````,````8(0```````'1Z`P```````@``
-M`,P!``#\_________P)[`P```````@```,P!``#\_________QM[`P``````
-M`@```(8"``#\_________^U[`P```````@```&(!``#\_________W1]`P``
-M`````@```)("``#\_________XA]`P```````@```)("``#\_________Y9]
-M`P```````@```*0"``#\_________]]]`P```````@````<```#D`0``````
-M`"I^`P```````@```)("``#\_________UY^`P``````"P````<```#@`0``
-M`````(9^`P```````@````<```#T`0```````-1^`P```````@```)("``#\
-M_________TE_`P```````@````<````$`@```````)=_`P```````@```)("
-M``#\_________\M_`P``````"P````<``````@```````.Y_`P```````@``
-M``<````4`@```````#R``P```````@```)("``#\_________Z>``P``````
-M"P````<```#P`0```````+F``P``````"P````<````0`@```````$^!`P``
-M`````@```)("``#\_________^*!`P```````@```)("``#\_________X&"
-M`P```````@```)("``#\_________Z""`P```````@```*0"``#\________
-M_VZ#`P```````@```$`!``#\_________R"&`P```````@```/H!``#\____
-M_____Z>'`P```````@````,````\)@```````+.'`P``````"P````<```!@
-M`P```````">,`P``````"P````<````@`@```````"R,`P```````@```'<"
-M``#\_________ZJ,`P```````@```&$!``#\_________[B,`P```````@``
-M`*0"``#\_________\V,`P```````@```"4"``#\__________>,`P``````
-M"P````8````D`P````````&-`P```````@```*\"``#\_________U:-`P``
-M`````@```)H"``#\_________VJ-`P```````@```)H"``#\_________WZ-
-M`P```````@```)H"``#\__________&-`P```````@```"L"``#\________
-M_PN.`P```````@```*,"``#\_________QZ.`P```````@```*,"``#\____
-M_____SB.`P```````@```*,"``#\_________TN.`P```````@```*,"``#\
-M_________V6.`P```````@```*,"``#\_________WB.`P```````@```*,"
-M``#\_________Y*.`P```````@```*,"``#\_________Z6.`P```````@``
-M`*,"``#\_________]..`P```````@```*,"``#\_________^..`P``````
-M`@```*,"``#\_________PJ/`P```````@```*,"``#\_________QV/`P``
-M`````@```*,"``#\_________S>/`P```````@```*,"``#\_________TJ/
-M`P```````@```*,"``#\_________V2/`P```````@```*,"``#\________
-M_W>/`P```````@```*,"``#\_________Y&/`P```````@```*,"``#\____
-M_____Z2/`P```````@```*,"``#\_________[Z/`P```````@```*,"``#\
-M_________]&/`P```````@```*,"``#\_________^N/`P```````@```*,"
-M``#\__________Z/`P```````@```*,"``#\_________QB0`P```````@``
-M`*,"``#\_________RN0`P```````@```*,"``#\_________T60`P``````
-M`@```*,"``#\_________UB0`P```````@```*,"``#\_________W*0`P``
-M`````@```*,"``#\_________X60`P```````@```*,"``#\_________Y^0
-M`P```````@```*,"``#\_________[*0`P```````@```*,"``#\________
-M_\R0`P```````@```*,"``#\_________]^0`P```````@```*,"``#\____
-M______F0`P```````@```*,"``#\_________PR1`P```````@```*,"``#\
-M_________R:1`P```````@```*,"``#\_________SF1`P```````@```*,"
-M``#\_________U.1`P```````@```*,"``#\_________V:1`P```````@``
-M`*,"``#\_________XB1`P```````@```-("``#\_________Z*1`P``````
-M`@```-("``#\_________\21`P```````@```-("``#\_________]Z1`P``
-M`````@```-("``#\_________P"2`P```````@```-("``#\_________QJ2
-M`P```````@```-("``#\_________SR2`P```````@```-("``#\________
-M_U:2`P```````@```-("``#\_________WB2`P```````@```-("``#\____
-M_____Y*2`P```````@```-("``#\_________[22`P```````@```-("``#\
-M_________\Z2`P```````@```-("``#\__________"2`P```````@```-("
-M``#\_________PJ3`P```````@```-("``#\_________RR3`P```````@``
-M`-("``#\_________T:3`P```````@```-("``#\_________W*3`P``````
-M`@```$P!``#\_________WJ3`P```````@```+@!``#\_________XF3`P``
-M`````@```+@!``#\_________Y&3`P```````@```)H!``#\_________YN3
-M`P```````@```*0"``#\_________Z.3`P```````@```,X!``#\________
-M_["3`P```````@```),!``#\_________[V3`P```````@```),!``#\____
-M_____^V3`P```````@```),!``#\__________Z3`P```````@```),!``#\
-M_________R64`P```````@```*\!``#\_________SB4`P```````@```*\!
-M``#\_________T64`P```````@```*\!``#\_________UB4`P```````@``
-M`*\!``#\_________V64`P```````@```%<!``#\_________\V4`P``````
-M`@````@"``#\_________R^5`P``````"P````$```!0B0,``````#J5`P``
-M`````@```$4!``#\_________W&5`P```````@```#$!``#\_________X.5
-M`P```````@```*0"``#\_________XN5`P```````@```%<!``#\________
-M_]&5`P```````@```$4"``#\_________UJ6`P```````@````@"``#\____
-M_____]N6`P``````"P````$```!0B0,``````.:6`P```````@```$4!``#\
-M_________QV7`P```````@```#$!``#\_________R^7`P```````@```*0"
-M``#\_________S>7`P```````@```%<!``#\_________W27`P```````@``
-M`$8"``#\__________R7`P``````"P````$```!0B0,```````F8`P``````
-M`@```,4!``#\_________QZ8`P```````@```"X!``#\_________RF8`P``
-M`````@```$4!``#\_________V"8`P```````@```#$!``#\_________W*8
-M`P```````@```*0"``#\_________WJ8`P```````@```%<!``#\________
-M_ZJ8`P```````@```#`!``#\_________[^8`P```````@```$4"``#\____
-M_____\>8`P```````@````@"``#\_________]R8`P```````@```#`!``#\
-M_________^V9`P``````"P````$```!0B0,``````/J9`P```````@```,4!
-M``#\_________P^:`P```````@```"X!``#\_________QJ:`P```````@``
-M`$4!``#\_________U&:`P```````@```#$!``#\_________V.:`P``````
-M`@```*0"``#\_________VN:`P```````@```%<!``#\_________Z6:`P``
-M`````@```#`!``#\_________[R:`P```````@```$4"``#\_________UN;
-M`P```````@````@"``#\_________X&;`P``````"P````8```!``P``````
-M`(N;`P```````@```*\"``#\_________Y>;`P```````@```$8"``#\____
-M_____[";`P```````@```$4"``#\_________^*;`P```````@```+H"``#\
-M__________N;`P```````@```#$!``#\_________TN<`P```````@```(8"
-M``#\_________S.=`P```````@```"P"``#\_________XN=`P``````"P``
-M``$```!0B0,``````)J=`P```````@```,4!``#\_________[6=`P``````
-M`@```"X!``#\_________\N=`P```````@```$4!``#\_________P>>`P``
-M`````@```#$!``#\_________QF>`P```````@```*0"``#\_________R.>
-M`P```````@```%<!``#\_________V6>`P```````@```(8"``#\________
-M_Y>>`P```````@```#`!``#\_________ZR>`P```````@```(L!``#\____
-M_____[N>`P```````@```$4"``#\_________]B>`P```````@```+H"``#\
-M_________[B?`P```````@```#`!``#\_________\B?`P```````@```(L!
-M``#\_________].?`P```````@```$4"``#\_________ZR@`P```````@``
-M`#$!``#\_________^Z@`P```````@```#`"``#\_________S2A`P``````
-M`@```-,!``#\_________TFA`P```````@```+P!``#\_________VBA`P``
-M`````@```!P"``#\_________[*A`P```````@```/4!``#\_________]FB
-M`P```````@```-8!``#\_________P&C`P```````@```#8"``#\________
-M_R&C`P```````@```+P"``#\_________UFC`P```````@```$P!``#\____
-M_____V&C`P```````@```-(!``#\_________VFC`P```````@```-(!``#\
-M_________W&C`P```````@```+@!``#\_________WVC`P```````@```+@!
-M``#\_________XFC`P```````@```)H!``#\_________Y.C`P```````@``
-M`*0"``#\_________YNC`P```````@```,X!``#\_________["C`P``````
-M"P```'$!`````````````,>C`P```````@```)T"``#\_________]2C`P``
-M`````@```,,!``#\__________6C`P```````@```-<!``#\_________P2D
-M`P```````@```-<!``#\_________RFD`P```````@````L```#?`0``````
-M`#:D`P```````@````L```#<`0```````$&D`P```````@````,````\)@``
-M`````%"D`P``````"P````<```!@`P```````%>D`P``````"P```&P!````
-M`````````%ZD`P``````"P````<```!T`P```````&JD`P``````"P````<`
-M``!B`P```````+6D`P``````"P```&P!```<`````````,VD`P``````"P``
-M`&P!```<`````````.&D`P``````"P```&P!```<`````````.^D`P``````
-M"P```&P!```<`````````/FD`P``````"P```&P!```<`````````"^E`P``
-M````"P```&P!```<`````````$.E`P``````"P```&P!```<`````````%&E
-M`P``````"P```&P!```<`````````&RE`P``````"P````<```!L`P``````
-M`+6E`P```````@````,````\)@```````-.E`P``````"P````<```!L`P``
-M`````.&E`P``````"P````<```!P`P```````!&F`P``````"P```&P!````
-M`````````"6F`P``````"P```&P!```<`````````%"F`P``````"P```&P!
-M```,`````````':F`P``````"P```&P!```=`````````(6F`P``````"P``
-M`&P!```<`````````+ZF`P```````@```(`"``#\_________T:G`P``````
-M`@```/\!``#\_________V*G`P```````@```#0!``#\_________VJG`P``
-M`````@```/4!``#\_________XBG`P```````@```+\!``#\_________YRG
-M`P```````@```+\!``#\_________T&H`P``````"P````4```!P"@``````
-M`$NH`P```````@```*\"``#\_________UVH`P```````@````@"``#\____
-M_____Y&H`P``````"P````4```"X"@```````)NH`P```````@```*\"``#\
-M_________^"H`P``````"P````$```!0B0,``````.NH`P```````@```$4!
-M``#\_________R*I`P```````@```#$!``#\_________S2I`P```````@``
-M`*0"``#\_________SRI`P```````@```%<!``#\_________W^I`P``````
-M`@````@"``#\_________Z6I`P```````@```$8"``#\_________\2I`P``
-M`````@```$4"``#\_________R^J`P``````"P````$```!0B0,``````#ZJ
-M`P```````@```,4!``#\_________U"J`P```````@```"X!``#\________
-M_UNJ`P```````@```$4!``#\_________Y*J`P```````@```#$!``#\____
-M_____Z2J`P```````@```*0"``#\_________ZRJ`P```````@```%<!``#\
-M_________]RJ`P```````@```+X!``#\_________P&K`P```````@```#`!
-M``#\_________PRK`P```````@```$4"``#\_________R.K`P```````@``
-M`$4"``#\_________X:K`P``````"P````,`````(@```````+NK`P``````
-M`@```)8!``#\__________2K`P```````@```(<!``#\_________RJL`P``
-M`````@```+H"``#\_________S^L`P```````@```#$!``#\_________U:L
-M`P```````@```*0"``#\_________UZL`P```````@```%<!``#\________
-M_Y>L`P```````@```+H"``#\_________ZNL`P```````@```$`"``#\____
-M_____[>L`P```````@```!T"``#\_________Y*M`P``````"P````4`````
-M"P```````)RM`P```````@```*\"``#\_________]"M`P```````@```'\"
-M``#\_________^6M`P``````"P````$```#@K`,``````/FM`P```````@``
-M`)T"``#\_________YZP`P```````@```/\!``#\_________\"P`P``````
-M`@```#0!``#\_________^VP`P```````@```,L!``#\_________UBQ`P``
-M`````@```,L!``#\_________[2Q`P```````@```+H"``#\__________2Q
-M`P```````@```,L!``#\_________V"R`P```````@```+H"``#\________
-M_X:S`P```````@```)8!``#\_________]RS`P```````@```-8!``#\____
-M_____^ZS`P```````@```+\!``#\_________RFT`P```````@```%<!``#\
-M_________T^T`P```````@```,,!``#\_________V^T`P```````@```'\"
-M``#\_________X2T`P``````"P```'$!`````````````)>T`P```````@``
-M`)T"``#\__________FU`P```````@```/4!``#\_________TVV`P``````
-M"P````,```!0(@```````'6V`P```````@```%L!``#\_________]"V`P``
-M`````@```%L!``#\_________RNW`P```````@```%L!``#\_________X:W
-M`P```````@```%L!``#\_________]>X`P``````"P````,```!P(P``````
-M``BY`P```````@```%L!``#\_________VBY`P```````@```%L!``#\____
-M_____\"Y`P```````@```%L!``#\_________QBZ`P```````@```%L!``#\
-M_________W&Z`P```````@```%L!``#\_________\BZ`P```````@```%L!
-M``#\_________R2[`P```````@```%L!``#\_________X"[`P```````@``
-M`%L!``#\_________]B[`P```````@```%L!``#\_________S"\`P``````
-M`@```%L!``#\_________X"\`P```````@```)<!``#\_________[J\`P``
-M`````@```)<!``#\__________2\`P```````@```)<!``#\_________RZ]
-M`P```````@```)<!``#\_________V6]`P```````@```)<!``#\________
-M_YR]`P```````@```)<!``#\_________S:^`P```````@````L```#<`0``
-M`````$*^`P```````@````L```#<`0```````"_``P```````@```(X"``#\
-M_________TG``P```````@```(X"``#\_________Y/``P```````@````,`
-M```\)@```````*G``P``````"P````<```!@`P```````+O``P``````"P``
-M``<```!B`P```````,G``P``````"P````<```!P`P```````-+``P``````
-M"P````<```!P`P```````-G``P``````"P````<```!L`P```````//``P``
-M````"P````<```!P`P```````"W!`P```````@```,8"``#\_________T_!
-M`P```````@```+\"``#\_________WW!`P``````"P```&P!````````````
-M`)7!`P``````"P```&P!```<`````````+S!`P``````"P```&P!```,````
-M`````-G!`P``````"P```&P!```=`````````./!`P``````"P```&P!```=
-M`````````.O!`P``````"P```&P!```<``````````C"`P``````"P```&P!
-M```=`````````!S"`P``````"P```&P!```<`````````'_#`P```````@``
-M`/4!``#\_________PW%`P```````@```*<!``#\_________S[%`P``````
-M`@````T"``#\_________TW%`P```````@```*<!``#\__________#(`P``
-M`````@```*<!``#\_________Q[)`P```````@````T"``#\_________RW)
-M`P```````@```*<!``#\_________P_-`P```````@```*<!``#\________
-M_SW-`P```````@````T"``#\_________T[-`P```````@```*<!``#\____
-M_____P_1`P```````@```*<!``#\_________SW1`P```````@````T"``#\
-M_________T[1`P```````@```*<!``#\_________[33`P```````@````@"
-M``#\_________[#5`P```````@```(8"``#\_________WS7`P``````"P``
-M``$````PGP,``````/O7`P```````@```"P"``#\_________PC8`P``````
-M`@```,4!``#\_________QO8`P```````@```"X!``#\_________SG8`P``
-M`````@```,4!``#\_________TO8`P```````@```$8"``#\_________WS8
-M`P```````@```"X!``#\_________Y'8`P```````@```(`!``#\________
-M_\+8`P```````@```"X!``#\_________P?9`P```````@```(8"``#\____
-M_____WK9`P```````@```(8"``#\_________[[9`P```````@```$4!``#\
-M_________\O9`P```````@```$4"``#\_________VC<`P```````@```,8"
-M``#\_________XK<`P```````@```,8"``#\_________^+=`P```````@``
-M`#`"``#\_________SC>`P```````@```,L!``#\_________Y#>`P``````
-M`@```+P!``#\_________\'>`P```````@```-,!``#\___________>`P``
-M`````@```(\!``#\_________RK?`P```````@```!P"``#\_________U3?
-M`P```````@```,L!``#\_________Z[?`P```````@```)L!``#\________
-M__/?`P```````@```)P"``#\__________[?`P```````@```)P"``#\____
-M_____Q+@`P```````@```%8"``#\_________T/@`P```````@```)0"``#\
-M_________^K@`P```````@```)0"``#\_________S3A`P```````@```&<"
-M``#\_________[/A`P```````@```$P"``#\_________\#A`P```````@``
-M`$P"``#\_________\KA`P```````@```%8"``#\_________];A`P``````
-M`@```%8"``#\_________^GA`P```````@```$P"``#\_________W/B`P``
-M`````@```$P"``#\_________V/C`P```````@```)0"``#\_________PWD
-M`P```````@```*<"``#\_________U'D`P```````@```*<"``#\________
-M_]CD`P```````@```*<"``#\__________SD`P```````@```,,"``#\____
-M_____WGE`P```````@```*<"``#\_________\/E`P```````@```*<"``#\
-M_________]WE`P```````@```,,"``#\__________+F`P```````@```,,"
-M``#\_________POH`P```````@```&("``#[_________R;H`P```````@``
-M`'\"``#\_________S[H`P``````"P```%@"``````````````'I`P``````
-M`@```&("``#[_________Q;I`P```````@```'\"``#\_________RSI`P``
-M````"P```%@"`````````````#[I`P```````@```)T"``#\_________V7I
-M`P```````@```+("``#\_________^7I`P```````@```(\"``#\________
-M_[GJ`P```````@```+4"``#[__________;J`P```````@```%,"``#\____
-M_____T?L`P```````@```,`"``#\_________W+L`P```````@```&,"``#\
-M_________XCL`P```````@```*4"``#[_________Y?L`P```````@```&P"
-M``#\_________Z'L`P```````@```%0"``#\_________[3L`P```````@``
-M`%X"``#\_________QGM`P```````@````L```!L`@```````#KM`P``````
-M`@````L```!L`@```````$KM`P```````@````L```!L`@```````%KM`P``
-M`````@```,X"``#\_________WCM`P```````@```+("``#\_________X7M
-M`P```````@````L```!L`@```````)/M`P``````"P````$```!`[P,`````
-M`*CM`P```````@```*,"``#\_________[SM`P```````@````L```!H`@``
-M`````//M`P```````@```+<"``#\__________KM`P``````"P````L```!`
-M`@````````3N`P```````@````L```!(`@````````CN`P``````"P```-,"
-M``````````````_N`P```````@````L```!4`@```````!ON`P```````@``
-M``L````\`@```````"#N`P```````@```)T"``#\_________Y3N`P``````
-M`@```$P"``#\_________^+N`P```````@```-,"``#\_________Q;O`P``
-M`````@```*0"``#\_________Q[O`P```````@```(<"``#\_________VCO
-M`P```````@```&0"``#\_________[7O`P```````@```*,"``#\________
-M_]#O`P```````@```*,"``#\_________W+P`P```````@```'$"``#\____
-M_____W+Q`P```````@```(,"``#\_________W[Q`P```````@```+("``#\
-M_________\+Q`P```````@```*,"``#\_________]'Q`P```````@```$X"
-M``#\_________T+R`P```````@```+`"``#\_________UCR`P```````@``
-M`+`"``#\_________VCR`P```````@```$P"``#\_________ZKR`P``````
-M`@```+`"``#\_________\?R`P```````@```+`"``#\_________^'R`P``
-M`````@```+`"``#\__________[R`P```````@```+`"``#\_________Q[S
-M`P```````@```+`"``#\_________T?S`P```````@```(@"``#\________
-M_U[S`P```````@```+`"``#\_________V7S`P```````@```$P"``#\____
-M_____[GS`P```````@```)0"``#\_________\+S`P```````@```+8"``#\
-M_________^#S`P```````@```)0"``#[_________UWT`P```````@```)0"
-M``#\_________W;T`P```````@```*4"``#[_________Z/T`P```````@``
-M`%P"``#\_________[ST`P```````@```+("``#\_________]?T`P``````
-M`@````L```!P`@```````.?T`P```````@````L```!P`@```````.KU`P``
-M`````@```*,"``#\__________7U`P```````@```)0"``#\_________SCV
-M`P```````@```(,"``#\_________W?V`P```````@```*,"``#\________
-M_Y#V`P```````@```$P"``#\_________^'V`P```````@```)0"``#\____
-M_____ZOE`P```````@```'D"``#\_________[OE`P```````@```*<"``#\
-M_________X_F`P```````@```'D"``#\_________P7G`P```````@```'D"
-M``#\_________W/G`P```````@```'\"``#\_________U7H`P```````@``
-M`)T"``#\_________RSJ`P```````@```-$"``#\_________SWJ`P``````
-M`@```*,"``#\_________V'J`P```````@```*D"``#\_________P7O`P``
-M`````@```*<"``#\_________TOP`P```````@```*,"``#\_________Q/W
-M`P``````"P````$```#0'@0``````#;W`P```````@````<```"X`P``````
-M`.#W`P``````"P````$```!P_0,``````,+Y`P```````@```+,"``#\____
-M______[Y`P```````@```*8"``#\_________S'Z`P``````"P````$````@
-M_`,``````%WZ`P```````@```*8"``#\_________]GZ`P```````@````,`
-M``!$)@```````.;Z`P```````@````,```!()@```````#[[`P``````"P``
-M``$```#P_`,``````+;[`P```````@```$@"``#\_________P+\`P``````
-M"P````$````P_`,``````$;\`P```````@```(D"``#\_________XG\`P``
-M`````@```)P"``#\_________X_\`P```````@````<```"T`P```````*O\
-M`P```````@````<```"X`P```````,7\`P```````@````<```"X`P``````
-M`-'\`P``````"P````<```"@`P```````-?\`P```````@````<```"W`P``
-M`````-W\`P```````@```,T"``#\_________QS]`P```````@```(D"``#\
-M_________\;]`P```````@```*,"``#\_________]3]`P``````"P````$`
-M``"`^0,```````O^`P``````"P````<```"@`P```````!?^`P```````@``
-M`(("``#\_________S'_`P``````"P````<```"@`P```````#;_`P``````
-M`@```(("``#\_________S[_`P```````@```+("``#\_________RH`!```
-M````"P````<```"@`P```````"\`!````````@```(("``#\_________S<`
-M!````````@```+("``#\_________XL`!```````"P````<```"@`P``````
-M`)``!````````@```(("``#\_________Y@`!````````@```+("``#\____
-M_____\D`!```````"P````<```"@`P```````,X`!````````@```(("``#\
-M_________]8`!````````@```+("``#\_________PX!!```````"P````<`
-M``"@`P```````!,!!````````@```(("``#\_________QL!!````````@``
-M`+("``#\_________W$!!```````"P````<```"@`P```````(8!!```````
-M`@```(("``#\_________Y$!!````````@```*,"``#\_________Z4!!```
-M````"P````<```"@`P```````+(!!````````@```(("``#\_________\\!
-M!````````@```*,"``#\_________U$"!````````@```&T"``#\________
-M_VH"!````````@```+("``#\_________X`"!```````"P````$```"P_0,`
-M`````,,"!````````@```$@"``#\_________Q8#!```````"P````<```"@
-M`P```````!L#!````````@```(("``#\_________W(#!```````"P````,`
-M``!0)@```````+<#!````````@```-`"``#\__________`#!````````@``
-M`&T"``#\__________X#!````````@```+P"``#\_________R<$!```````
-M`@```+("``#\_________T($!```````"P````$```!`!00``````%8$!```
-M`````@```-`"``#\_________V,$!````````@```+P"``#\_________[0$
-M!```````"P````,```"0)@```````!4%!````````@```-`"``#\________
-M_V$%!````````@```*,"``#\_________WL%!```````"P````$```#@%@0`
-M`````)D%!````````@```*4"``#[__________$%!````````@```&$"``#\
-M_________Q@&!```````"P````<```"@`P```````!T&!````````@```(("
-M``#\_________R@&!````````@```*,"``#\_________U$&!````````@``
-M`&T"``#\_________V<&!````````@```&8"``#\_________Z<(!```````
-M`@```&8"``#\_________]0(!````````@```&$"``#\_________S4)!```
-M`````@```&8"``#\_________UL)!````````@```&$"``#\_________XH)
-M!```````"P````<```"@`P```````(\)!````````@```(("``#\________
-M_Y<)!````````@```+("``#\_________^D)!````````@```*4"``#[____
-M_____TH*!````````@```&$"``#\_________WT*!````````@```&$"``#\
-M_________\D*!````````@```&$"``#\_________^0*!````````@```&T"
-M``#\__________H*!````````@```&8"``#\_________TH+!````````@``
-M`*4"``#\_________Y@+!````````@```&$"``#\_________PH,!```````
-M"P````<```"@`P````````\,!````````@```(("``#\_________QH,!```
-M`````@```*,"``#\_________X<-!````````@```&8"``#\_________Y4-
-M!```````"P````4```!8"P```````)X-!````````@```*\"``#\________
-M_\P-!````````@```&8"``#\_________]D-!```````"P````4```"`"P``
-M`````.(-!````````@```*\"``#\_________Q\.!````````@```&$"``#\
-M_________T$.!````````@```&8"``#\_________V,.!````````@```&8"
-M``#\_________WX.!```````"P````8```!@`P```````*T.!````````@``
-M`*\"``#\_________]L/!````````@```&8"``#\_________PL0!```````
-M`@```&$"``#\_________R\0!````````@```&$"``#\_________UD0!```
-M`````@```%\"``#\_________YT0!````````@```&$"``#\_________\(0
-M!````````@```+4"``#[_________]X0!````````@```&8"``#\________
-M__D0!````````@```(H"``#\_________WX1!````````@```&$"``#\____
-M_____XD1!```````"P````4```"H"P```````*H1!````````@```*\"``#\
-M_________TL2!````````@```&8"``#\_________W02!````````@```&$"
-M``#\_________Y\2!````````@```&$"``#\_________[D2!```````"P``
-M``8```!U`P```````,`2!````````@```*\"``#\_________]T2!```````
-M`@```&8"``#\_________PL3!````````@```&$"``#\_________T(3!```
-M`````@```&$"``#\_________TT3!```````"P````4```#8"P```````&T3
-M!````````@```*\"``#\_________X\3!````````@```(8"``#\________
-M_\P3!````````@```&$"``#\_________]P3!````````@```&L"``#\____
-M_____P`4!````````@```&$"``#\_________S,4!````````@```&$"``#\
-M_________V`4!````````@```&$"``#\_________W<4!````````@```(,"
-M``#\_________XX4!````````@```&8"``#\_________\(4!````````@``
-M`(H"``#\_________TT5!````````@```&<"``#\_________RH6!```````
-M`@```,L"``#\_________UH6!````````@```$D"``#\_________Z,6!```
-M`````@```*4"``#[_________](6!````````@```&D"``#\__________T6
-M!````````@```&0"``#\_________Q<7!````````@```+4"``#[________
-M_X87!````````@```,4"``#\_________Y`7!````````@```%X"``#\____
-M_____[(7!```````"P```$L"`````````````,D7!````````@```-`"``#\
-M_________W,8!````````@```&`"``#\_________YD8!````````@```(,"
-M``#\_________PL9!````````@```&`"``#\_________R<9!````````@``
-M`&`"``#\_________QD:!````````@```(H"``#\_________XL:!```````
-M`@```(,"``#\_________\P:!````````@```%\"``#\_________T0;!```
-M`````@```$X"``#\_________U$;!````````@```+,"``#\_________Y`;
-M!````````@```$H"``#\_________[L;!````````@```$X"``#\________
-M__X;!````````@```*,"``#\_________T`<!````````@```&,"``#\____
-M_____V4<!````````@```%,"``#\_________U(=!````````@```+,"``#\
-M_________]P=!````````@```,4"``#\__________$=!````````@```&P"
-M``#\_________QD>!````````@```%0"``#\_________S\>!````````@``
-M`+("``#\_________V(>!```````"P````$```#@&P0``````)P>!```````
-M`@```$@"``#\__________H?!````````@```,H"``#\_________V8@!```
-M````"P````$````0(00``````'4A!````````@```,H"``#\_________V0B
-M!````````@```&T"``#\_________T/Z`P```````@```*L"``#\________
-M_PO\`P```````@```*L"``#\_________R'\`P```````@```(D"``#\____
-M_____WK\`P```````@```)4"``#\_________UC]`P```````@```-`"``#\
-M_________Z/]`P```````@```-`"``#\__________?]`P```````@```-`"
-M``#\_________US^`P```````@```*,"``#\_________P`"!````````@``
-M`*,"``#\_________SP#!````````@```+`"``#\_________X0%!```````
-M`@```%H"``#\_________]()!````````@```(,"``#\_________U,7!```
-M`````@```&T"``#\_________WX7!````````@```*,"``#\_________ZL8
-M!````````@```%\"``#\_________VL;!````````@```(,"``#\________
-M_](;!````````@```%\"``#\_________\@@!````````@```-`"``#\____
-M_____P`A!````````@```,H"``#\_________QPB!````````@```-`"``#\
-M_________Y,B!````````@```)0"``#\_________WHC!````````@```)0"
-M``#\_________STD!````````@```)0"``#\_________T(E!````````@``
-M`)0"``#\__________\F!```````"P````,```#0)@```````"0K!```````
-M`@```'("``#\_________S0L!````````@```'("``#\__________`L!```
-M````"P````,````0)P```````"(N!````````@```'("``#\_________XTN
-M!````````@```'("``#\_________S$O!````````@```'("``#\________
-M_U(O!````````@````L```"``@```````&\O!````````@````L```!\`@``
-M`````(`O!```````"P````L```"@`@```````)LO!```````"P````L```"@
-M`@```````,DO!````````@````L```"``@````````PP!````````@```%$"
-M``#\_________V,U!````````@```'("``#\_________Z,U!````````@``
-M`'("``#\_________^,U!````````@```'("``#\_________TDV!```````
-M`@```'("``#\_________[`V!````````@```'("``#\_________RXW!```
-M`````@```'("``#\_________[,W!````````@```*4"``#[_________],W
-M!````````@```'("``#\_________P`X!````````@```'("``#\________
-M_Z8X!````````@```'("``#\_________\HX!````````@```'("``#\____
-M_____[8Y!````````@```'("``#\_________]HY!````````@```'("``#\
-M_________W0Z!````````@```'("``#\_________YDZ!````````@```'("
-M``#\_________Q0[!````````@```'("``#\_________R$[!````````@``
-M`'("``#\_________U,[!````````@```'("``#\_________WD[!```````
-M`@```'("``#\_________^0[!````````@```'("``#\__________$[!```
-M`````@```'("``#\_________S,\!````````@```'("``#\_________UT\
-M!````````@```'("``#\_________[@\!````````@```'("``#\________
-M_\0\!````````@```'("``#\_________R@]!````````@```'("``#\____
-M_____S0]!````````@```'("``#\_________Y@]!````````@```'("``#\
-M_________Z0]!````````@```'("``#\_________P8^!````````@```'("
-M``#\_________Q(^!````````@```'("``#\_________V8^!````````@``
-M`'("``#\_________W(^!````````@```'("``#\_________\8^!```````
-M`@```'("``#\_________](^!````````@```'("``#\_________R8_!```
-M`````@```'("``#\_________S(_!````````@```'("``#\_________[8_
-M!````````@```'("``#\_________\(_!````````@```'("``#\________
-M_R9`!````````@```'("``#\_________S)`!````````@```'("``#\____
-M_____Y]`!````````@```'("``#\_________ZQ`!````````@```'("``#\
-M_________[A`!````````@```'("``#\_________\-`!````````@```'("
-M``#\_________U9!!````````@```'("``#\_________V)!!````````@``
-M`'("``#\_________\9!!````````@```'("``#\_________])!!```````
-M`@```'("``#\_________SI"!````````@```'("``#\_________T9"!```
-M`````@```'("``#\_________ZQ"!````````@```'("``#\_________[A"
-M!````````@```'("``#\_________\1#!````````@```'("``#\________
-M_]%#!````````@```'("``#\_________X1$!````````@```'("``#\____
-M_____Y%$!````````@```'("``#\__________9$!````````@```'("``#\
-M_________P)%!````````@```'("``#\_________X5%!````````@```'("
-M``#\_________ZI%!````````@```'("``#\_________S5&!````````@``
-M`'("``#\_________UI&!````````@```'("``#\_________\1&!```````
-M`@```'("``#\_________]!&!````````@```'("``#\_________^1'!```
-M`````@```'("``#\__________%'!````````@```'("``#\_________\)(
-M!````````@```'("``#\_________\](!````````@```'("``#\________
-M_Y!)!````````@```'("``#\_________YU)!````````@```'("``#\____
-M_____]1)!````````@````<````<!````````.M)!```````"P````<````@
-M!````````#%+!```````"P````$```!`+P0``````#-,!````````@```%$"
-M``#\_________\-,!````````@```+4"``#\_________SY-!````````@``
-M`*8"``#\_________VU-!```````"P````$```#P5@0``````+]-!```````
-M`@```*8"``#\_________\Y-!````````@```+("``#\_________X5.!```
-M`````@```*8"``#\_________]I.!```````"P````$```!`6`0``````.=.
-M!```````"P````$`````6`0``````.Q.!````````@```*L"``#\________
-M_T9/!````````@```+("``#\_________^I/!````````@```*,"``#\____
-M_____QQ0!```````"P````8```".`P```````"-0!````````@```*\"``#\
-M_________V90!````````@```+("``#\__________E0!````````@```*,"
-M``#\_________RM1!```````"P````8```"I`P```````#)1!````````@``
-M`*\"``#\_________]U1!```````"P````$```#PB00```````U2!```````
-M"P````$```!@7`0``````$U2!```````"P````$```#P700``````(U2!```
-M````"P````$```#PW@0``````,U2!```````"P````$````PSP0```````U3
-M!```````"P````$```"@E@0``````$U3!```````"P````$```"@TP0`````
-M`(U3!```````"P````$```#@F@0``````,U3!```````"P````$```"`EP0`
-M``````U4!```````"P````$```!@X@0``````$U4!```````"P````$```!`
-MBP0``````(U4!```````"P````$````@U@0``````,U4!```````"P````$`
-M``#`FP0```````U5!```````"P````$```#`FP0``````$U5!```````"P``
-M``$```#@G00``````(U5!```````"P````$```#`K@0``````,U5!```````
-M"P````$```!@XP0```````U6!```````"P````$```!`L`0``````$U6!```
-M````"P````$````PUP0``````(U6!```````"P````$````PKP0``````,U6
-M!```````"P````$```"PN`0``````/16!```````"P````$````PZP0`````
-M`"A7!```````"P````$```!0N00``````(!7!````````@```*,"``#\____
-M_____XM7!```````"P````$```"0L`0``````!-8!```````"P````$````0
-M600``````)Q8!````````@```(D"``#\_________ZM8!````````@```*8"
-M``#\_________]Q8!```````"P````$`````6`0``````#M9!````````@``
-M`*,"``#\_________^I9!```````"P````4````P#````````/%9!```````
-M`@```*\"``#\__________Y9!````````@```&T"``#\_________Q-:!```
-M`````@```*,"``#\_________QM:!````````@```(D"``#\_________TI:
-M!```````"P````4````(#````````%%:!````````@```*\"``#\________
-M_UY:!````````@```&T"``#\_________XI:!````````@```(D"``#\____
-M_____Y9:!```````"P````$```"0[`0``````"A;!````````@```*,"``#\
-M_________S!;!````````@```(D"``#\_________Z1;!```````"P````$`
-M``!`A00``````'U<!````````@```'("``#\_________TA=!````````@``
-M`&$"``#\_________U1=!```````"P````$```!02P0``````,Q=!```````
-M`@```&$"``#\_________P9>!````````@```'("``#\_________W]>!```
-M`````@```&$"``#\_________Z!>!```````"P````$```!02P0``````/->
-M!````````@```(D"``#\__________M>!```````"P````$```!02P0`````
-M`-]?!```````"P````$```"`800``````+U@!```````"P````$```!02P0`
-M`````,Y@!````````@```)4"``#\_________Y]A!```````"P````$```!0
-M2P0``````,YA!````````@```)0"``#\_________U9B!```````"P````$`
-M``!02P0``````&IB!````````@```)4"``#\_________X)B!````````@``
-M``L```!\`@```````(AB!````````@````L```"``@```````*5B!```````
-M"P````L```"@`@```````+!B!```````"P````L```"H`@```````+QB!```
-M````"P````L```"P`@```````,AB!```````"P````L```"X`@```````-1B
-M!```````"P````L```#``@```````-]B!```````"P````L```#(`@``````
-M`/IB!````````@````L```!\`@````````)C!```````"P````$```!02P0`
-M`````)IC!```````"P````$```!02P0``````$%D!```````"P````$```!0
-M2P0``````%)D!````````@```)4"``#\_________Y]D!````````@```'("
-M``#\__________MD!```````"P````$```!02P0``````&5E!````````@``
-M`'("``#\_________ZEE!```````"P````$```!02P0``````/AE!```````
-M`@```)0"``#\_________TAF!```````"P````$```!02P0``````)UF!```
-M`````@```)0"``#\_________QUG!```````"P````$```!02P0``````/AG
-M!```````"P````$```!02P0```````MH!````````@```)4"``#\________
-M_]MH!```````"P````$```!02P0``````.YH!````````@```)4"``#\____
-M_____]MI!```````"P````$```!02P0``````.YI!````````@```)4"``#\
-M_________\MJ!```````"P````$```!02P0``````-YJ!````````@```)4"
-M``#\_________[MK!```````"P````$```!02P0``````,YK!````````@``
-M`)4"``#\_________YEL!```````"P````$```!02P0``````*QL!```````
-M`@```)4"``#\_________^5L!```````"P````$```!02P0``````)5M!```
-M````"P````$```!02P0``````*9M!````````@```)4"``#\_________^9M
-M!```````"P````$```!02P0``````!1N!```````"P````8```#!`P``````
-M`#9N!````````@```+4"``#\_________SYN!```````"P````$```!02P0`
-M`````&1N!```````"P````8```#.`P```````(%N!````````@```(P"``#\
-M_________XIN!```````"P````8```#?`P```````)UN!```````"P````8`
-M``#\`P```````+AN!```````"P````$```!@=@0``````.IN!````````@``
-M`%`"``#\__________9N!```````"P````8````9!````````!%O!```````
-M"P````$```!@;P0``````#AO!```````"P````$```!02P0``````,IO!```
-M````"P````$```!02P0``````-MO!````````@```)4"``#\_________V%P
-M!````````@```'("``#\_________Y5P!````````@```*,"``#\________
-M_YUP!````````@```(D"``#\_________]EP!```````"P````$```!02P0`
-M`````)AQ!```````"P````$`````A00``````.MQ!````````@```'("``#\
-M_________PMR!````````@```'("``#\_________S9R!````````@```'("
-M``#\_________XAR!````````@```'("``#\_________]MR!````````@``
-M`'("``#\_________PAS!````````@```'("``#\_________YAS!```````
-M`@```'("``#\_________Z)S!````````@```'("``#\_________]MS!```
-M`````@```'("``#\__________MS!````````@```'("``#\_________QAT
-M!````````@```'("``#\_________Y!T!````````@```'("``#\________
-M_]!T!````````@```'("``#\_________PQU!````````@```'("``#\____
-M_____TQU!````````@```'("``#\_________XQU!````````@```'("``#\
-M_________\UU!````````@```'("``#\__________=U!```````"P````8`
-M``#\`P```````+IV!````````@```&("``#\__________MV!````````@``
-M`'\"``#\_________Q%W!```````"P```%@"`````````````"-W!```````
-M`@```)T"``#\_________SIW!```````"P````$```!02P0``````$MW!```
-M`````@```)4"``#\_________V)W!````````@```$T"``#\_________\5W
-M!````````@```*8"``#\_________XMX!```````"P````$```"`T`0`````
-M`-%X!````````@```+("``#\__________MX!````````@```(8"``#\____
-M_____S!Y!```````"P````$```!@600``````$!Y!```````"P````$```!0
-M2P0``````%%Y!````````@```)4"``#\_________U)Z!```````"P````$`
-M``!02P0``````)-Z!```````"P````$```!02P0``````*1Z!````````@``
-M`)4"``#\_________]MZ!````````@```'("``#\__________MZ!```````
-M`@```'("``#\_________S1[!````````@```'("``#\_________T)[!```
-M`````@```*8"``#\_________XI[!````````@```(8"``#\_________\U[
-M!```````"P````$````P2`0``````-A[!```````"P````$```#07@0`````
-M`#!\!```````"P````$```!02P0``````)5\!```````"P````$```!02P0`
-M`````*9\!````````@```)4"``#\_________]1\!````````@```*4"``#[
-M__________9\!```````"P````8```#.`P````````U]!```````"P````8`
-M``#?`P```````%9]!````````@```%`"``#\_________V5]!```````"P``
-M``$```!02P0``````,1]!````````@```(P"``#\_________^-]!```````
-M"P````8```#\`P````````1^!```````"P````8```#!`P```````$U^!```
-M`````@```+4"``#\_________XY^!````````@```&("``#\_________T.`
-M!````````@```&$"``#\_________XV`!````````@```&$"``#\________
-M_[N`!````````@```&$"``#\_________^2"!```````"P````$```!02P0`
-M`````/>"!````````@```)4"``#\_________T&$!```````"P````$```!0
-M2P0``````%*$!````````@```)4"``#\_________[.$!````````@```,@"
-M``#\_________[Z$!````````@```*8"``#\_________]N$!```````"P``
-M``$```!P6@0```````N%!````````@```'("``#\_________Q.%!```````
-M`@```*T"``#\_________QN%!```````"P````$```!02P0``````$F%!```
-M`````@```*T"``#\_________UB%!```````"P````$```!02P0``````-Z%
-M!```````"P````$```!P400``````'2&!```````"P````$```!@B`0`````
-M`%>'!````````@```&T"``#\_________VB'!````````@```%`"``#[____
-M_____XB'!````````@```%`"``#[__________&'!````````@```&T"``#\
-M_________SV(!````````@```&T"``#\_________Z:(!```````"P````$`
-M``"`A00``````/N)!```````"P````$```!@B`0``````):*!```````"P``
-M``$```!@B`0``````*:*!````````@```*`"``#\__________^*!```````
-M"P````$```!@B`0``````!^+!````````@```*`"``#\_________U>+!```
-M`````@```'("``#\_________W&+!```````"P````$```!02P0``````*6+
-M!```````"P````,```!0)P```````-:+!````````@```&T"``#\________
-M_W2,!````````@```&H"``#\_________Y:,!```````"P````$```!@B`0`
-M`````+R,!````````@```*`"``#\_________\F,!````````@```&T"``#\
-M_________^R,!````````@```&T"``#\_________SN-!````````@```&T"
-M``#\_________SB.!````````@```&H"``#\_________V^.!```````"P``
-M``$```!@B`0``````'^.!````````@```*`"``#\_________XR.!```````
-M`@```&T"``#\_________Z6.!````````@```&T"``#\_________UN/!```
-M`````@```&T"``#\_________P60!````````@```&T"``#\_________XJ0
-M!```````"P````$```!@B`0``````)J0!````````@```*`"``#\________
-M_Z>0!````````@```&T"``#\__________20!````````@```&T"``#\____
-M_____T>1!````````@```(T"``#\_________UB1!````````@```(T"``#\
-M_________ZZ1!````````@```&T"``#\__________N1!````````@```&T"
-M``#\_________P^2!````````@```,4"``#\_________QR2!````````@``
-M`*T"``#\_________RF2!````````@```(T"``#\_________SF2!```````
-M`@```,4"``#\_________U"2!````````@```&H"``#\_________WV2!```
-M````"P````$```!@B`0``````(V2!````````@```*`"``#\_________YJ2
-M!````````@```&T"``#\_________[&2!````````@```'L"``#\________
-M_\^2!````````@```&H"``#\_________P>3!```````"P````$```!@B`0`
-M`````!>3!````````@```*`"``#\_________R23!````````@```&T"``#\
-M_________U&3!```````"P````$```!@B`0``````&&3!````````@```*`"
-M``#\_________VZ3!````````@```&T"``#\_________Y>3!```````"P``
-M``$```!@B`0``````+:3!````````@```*`"``#\_________\.3!```````
-M`@```&T"``#\_________W:6!````````@```&H"``#\_________[J6!```
-M`````@```'("``#\_________Q&7!````````@```*T"``#\_________R.7
-M!```````"P````$```!02P0``````%>7!````````@```&D"``#\________
-M_\*7!```````"P````$```!02P0``````-.7!````````@```)4"``#\____
-M______&7!````````@```'("``#\_________V>8!````````@```&D"``#\
-M_________VN:!```````"P````4```!@#````````'":!````````@```*\"
-M``#\_________R*;!```````"P````$```!02P0``````#.;!````````@``
-M`)4"``#\_________U&;!````````@```'("``#\_________VZ;!```````
-M`@```&D"``#\_________\N;!````````@```'("``#\_________P><!```
-M`````@```&D"``#\_________P^<!```````"P````$```!02P0``````).<
-M!````````@```$X"``#\__________.<!````````@```(,"``#\________
-M_R6=!````````@```&4"``#\_________T>=!````````@```&$"``#\____
-M_____X>=!````````@```&$"``#\_________Y2=!````````@```&D"``#\
-M_________\.=!````````@```$X"``#\_________PJ>!````````@```'("
-M``#\_________U&>!```````"P````$```!02P0``````$6?!````````@``
-M`*,"``#\_________X^?!````````@```'L"``#\_________Q6@!```````
-M`@```'("``#\_________S.@!```````"P````,```#()P```````$N@!```
-M`````@```%P"``#\_________XB@!````````@```%P"``#\_________\:@
-M!````````@```'("``#\__________.A!````````@```(H"``#\________
-M_S^B!````````@```'("``#\_________V^B!````````@```%T"``#\____
-M_____Y:B!````````@```$X"``#\_________Z2B!````````@```(,"``#\
-M_________T:D!````````@```(H"``#\_________P*E!````````@```'("
-M``#\_________URE!````````@```'("``#\_________W>E!````````@``
-M`%T"``#\_________TNF!````````@```%("``#\_________UFG!```````
-M`@```+("``#\_________W.G!````````@```'L"``#\_________XJG!```
-M`````@```%<"``#\_________TNH!````````@```*T"``#\_________U.H
-M!````````@```(T"``#\_________Z:H!```````"P````$```!@B`0`````
-M`+:H!````````@```*`"``#\_________\.H!````````@```&T"``#\____
-M_____R*I!```````"P````$```!@B`0``````#*I!````````@```*`"``#\
-M_________S^I!````````@```&T"``#\_________WRI!````````@```,@"
-M``#\_________]:I!````````@```$X"``#\_________YJJ!````````@``
-M`'("``#\_________PVK!````````@```'("``#\_________SFK!```````
-M"P````$```!@B`0``````$FK!````````@```*`"``#\_________U:K!```
-M`````@```&T"``#\_________V.K!````````@```(T"``#\_________W6K
-M!````````@```,4"``#\_________Y^K!```````"P````$```#`6@0`````
-M`,NK!```````"P````$```!@B`0``````-NK!````````@```*`"``#\____
-M_____^BK!````````@```&T"``#\__________2K!```````"P````$```!0
-M5P0``````+RL!````````@```%\"``#\_________^>L!````````@```(T"
-M``#\__________NL!````````@```,@"``#\_________T:M!````````@``
-M`&`"``#\_________U.M!````````@```%\"``#\_________\JM!```````
-M`@```'("``#\_________^6M!````````@```%T"``#\_________P^N!```
-M`````@```$X"``#\_________R>N!````````@```%T"``#\_________VBN
-M!````````@```$X"``#\_________YZN!```````"P````$````P<`0`````
-M`-&N!````````@```'("``#\__________BN!```````"P````$```!02P0`
-M`````!ZP!```````"P````$```!02P0``````"^P!````````@```)4"``#\
-M_________VJP!```````"P````$```!02P0``````*ZP!````````@```(D"
-M``#\_________P2Q!````````@```,@"``#\_________PRQ!````````@``
-M`(T"``#\_________R.Q!```````"P````$```!02P0``````-6R!```````
-M`@```(8"``#\_________^*R!````````@```,L"``#\_________\*S!```
-M`````@```'("``#\_________RBT!````````@```*P"``#\_________V6T
-M!```````"P````$```!02P0``````#*U!````````@```%4"``#\________
-M_RRV!````````@```%L"``#\_________UJX!````````@```(8"``#\____
-M_____V>X!````````@```,L"``#\_________]2X!````````@```%X"``#\
-M_________^BX!````````@```'("``#\__________^X!````````@```+,"
-M``#\_________P>Y!````````@```%X"``#\_________Q6Y!```````"P``
-M``$```!02P0``````'>Y!````````@```*,"``#\_________^2Y!```````
-M"P````$````0Y`0``````!BZ!````````@```'("``#\_________P>[!```
-M````"P````$```"PN00``````#6[!````````@```,<"``#\_________WR\
-M!```````"P````$```!02P0``````,*\!````````@```*8"``#\________
-M_^J\!```````"P````$```#`R@0``````"&]!````````@```(D"``#\____
-M_____\*^!```````"P````4```"`#````````,F^!````````@```*\"``#\
-M_________PG!!````````@```&H"``#\_________S;!!````````@```+("
-M``#\_________Z+"!```````"P````$```#@Z@0``````'W#!```````"P``
-M``$```!02P0```````7$!````````@```+("``#\_________QS$!```````
-M`@```*8"``#\_________X#$!````````@```(P"``#\_________QK%!```
-M````"P````$```"PRP0``````.?%!```````"P````$```"PRP0``````#7&
-M!```````"P````$```#@Z@0``````'W&!````````@```*,"``#\________
-M_Y3&!```````"P````$```!02P0``````+;&!````````@```*,"``#\____
-M_____\+&!````````@```(D"``#\_________U7'!````````@```'("``#\
-M_________Z3'!````````@```'("``#\_________R3(!````````@```'("
-M``#\_________Z7(!````````@```'("``#\__________3(!````````@``
-M`'("``#\_________W3)!````````@```'("``#\_________P?*!```````
-M`@```'H"``#\_________Q[*!````````@```)P"``#\_________Y7*!```
-M`````@```+$"``#\_________RO+!````````@```*,"``#\_________SO+
-M!````````@```(D"``#\_________T/+!```````"P````$```!02P0`````
-M`/#+!````````@```*,"``#\_________P',!````````@```(D"``#\____
-M_____PG,!```````"P````$```!02P0``````);,!````````@```&T"``#\
-M__________/,!````````@```'("``#\___________,!````````@```'("
-M``#\_________R_-!````````@```,0"``#\_________Z/-!````````@``
-M`,0"``#\_________\+.!````````@```'("``#\_________^W.!```````
-M`@```,0"``#\_________P3/!```````"P````$```!02P0``````(G/!```
-M`````@```'("``#\_________]#/!````````@```'("``#\_________]C/
-M!````````@```+,"``#\__________G/!```````"P````$```!02P0`````
-M`$70!````````@```'("``#\_________Q?1!````````@```(D"``#\____
-M_____R?1!```````"P````$```!02P0``````#C1!````````@```)4"``#\
-M_________Q32!````````@```$D"``#\_________V_2!````````@```)0"
-M``#\_________W[2!````````@```)0"``#\_________X/2!````````@``
-M`,P"``#\_________^G2!````````@```%P"``#\_________S33!```````
-M`@```)0"``#\_________WS3!```````"P````$```!02P0``````!;4!```
-M````"P````$```#PU`0``````"#4!````````@```%H"``#\_________W'4
-M!```````"P````$```!02P0``````(+4!````````@```)4"``#\________
-M_[34!```````"P````$```#@U`0``````,W4!````````@```-`"``#\____
-M_____R+5!````````@```&0"``#\_________S35!````````@```+4"``#[
-M_________T35!````````@```&T"``#\_________Z+5!```````"P````$`
-M``#@U`0``````-K5!````````@```*,"``#\__________K5!````````@``
-M`*,"``#\_________P?6!````````@```%X"``#\_________T#6!```````
-M`@```'("``#\_________TO6!````````@```'("``#\_________U;6!```
-M`````@```&@"``#\_________VO6!```````"P````$```!02P0``````*36
-M!````````@```&("``#[_________^'6!````````@```&("``#\________
-M_^;6!````````@```'0"``#\_________P/7!```````"P```%@"````````
-M`````&W7!````````@```(8"``#\_________YC7!```````"P````$```!0
-M2P0``````*G7!````````@```)4"``#\__________?7!```````"P````$`
-M``!02P0``````(/8!````````@```'("``#\_________^78!````````@``
-M`*P"``#\_________Q;9!```````"P````$```!02P0``````+39!```````
-M`@```%4"``#\_________Z[:!````````@```%L"``#\_________VK;!```
-M`````@```'("``#\_________\O;!```````"P````$```!02P0``````$#<
-M!````````@```%4"``#\_________TK=!````````@```'("``#\________
-M_ZK=!```````"P````$```!02P0``````![>!````````@```%4"``#\____
-M_____PK?!````````@```)0"``#\_________UO?!```````"P````$```!0
-M2P0``````&S?!````````@```)4"``#\_________WS?!````````@```'("
-M``#\_________\3?!````````@```&D"``#\_________[+@!````````@``
-M`(T"``#\_________]/@!```````"P````,````0*````````$KB!```````
-M"P````$````P<`0``````'+B!````````@```'("``#\_________R[C!```
-M`````@```(T"``#\_________S;C!```````"P````$```!02P0``````'SC
-M!````````@```'("``#\_________Z[C!````````@```(8"``#\________
-M_]SC!```````"P````$```!02P0``````._C!````````@```)4"``#\____
-M_____TGD!````````@```*8"``#\_________UOD!````````@```(P"``#\
-M_________T'E!```````"P````$```"`Y@0``````$SE!```````"P````$`
-M``"@,`0``````!'F!````````@```)D"``#\_________R_F!```````"P``
-M``$```!02P0``````-/F!```````"P````$```"@Z@0``````''H!```````
-M`@```(D"``#\_________XWH!```````"P````$```!02P0``````#KI!```
-M`````@```(D"``#\_________VGI!````````@```)D"``#\_________\KI
-M!````````@```(D"``#\_________UOJ!````````@```)D"``#\________
-M_VWJ!````````@```)D"``#\_________VWK!````````@```(D"``#\____
-M_____\_K!````````@```*,"``#\_________^CK!````````@```'("``#\
-M_________R#L!````````@```&4"``#\_________S_L!```````"P````$`
-M``!02P0``````"7M!```````"P````$```!02P0``````#;M!````````@``
-M`)4"``#\_________T/M!````````@```&T"``#\_________U[M!```````
-M"P````$````@5P0``````(Q-!````````@```*L"``#\_________U9.!```
-M`````@```*L"``#\_________P=/!````````@```*<"``#\_________V-1
-M!````````@```*<"``#\_________^E1!````````@```*$"``#\________
-M_QU2!````````@```-`"``#\_________UU2!````````@```-`"``#\____
-M_____YU2!````````@```-`"``#\_________]U2!````````@```-`"``#\
-M_________QU3!````````@```-`"``#\_________UU3!````````@```-`"
-M``#\_________YU3!````````@```-`"``#\_________]U3!````````@``
-M`-`"``#\_________QU4!````````@```-`"``#\_________UU4!```````
-M`@```-`"``#\_________YU4!````````@```-`"``#\_________]U4!```
-M`````@```-`"``#\_________QU5!````````@```-`"``#\_________UU5
-M!````````@```-`"``#\_________YU5!````````@```-`"``#\________
-M_]U5!````````@```-`"``#\_________QU6!````````@```-`"``#\____
-M_____UU6!````````@```-`"``#\_________YU6!````````@```-`"``#\
-M_________]U6!````````@```-`"``#\_________Q!7!````````@```-`"
-M``#\_________T17!````````@```-`"``#\_________Z57!````````@``
-M`-`"``#\__________17!````````@```*L"``#\_________R]8!```````
-M`@```-`"``#\_________S18!````````@```(D"``#\__________Y8!```
-M`````@```*L"``#\_________U%9!````````@```(D"``#\_________[E:
-M!````````@```-`"``#\_________]=;!````````@```-`"``#\________
-M_UA<!````````@```*L"``#\_________WM=!````````@```)4"``#\____
-M_____\5>!````````@```)4"``#\_________Q5?!````````@```)4"``#\
-M_________ZMA!````````@```)4"``#\_________QMC!````````@```)4"
-M``#\_________\-C!````````@```)4"``#\_________R1E!````````@``
-M`)4"``#\_________]AE!````````@```)4"``#\_________V1F!```````
-M`@```)4"``#\_________SMG!````````@```)4"``#\__________]L!```
-M`````@```)4"``#\_________PEN!````````@```)4"``#\_________UUN
-M!````````@```)4"``#\_________^!N!````````@```-`"``#\________
-M_U=O!````````@```)4"``#\_________P9Q!````````@```)4"``#\____
-M_____X)Q!````````@```*L"``#\_________\MQ!````````@```-`"``#\
-M_________]MQ!````````@```$@"``#\_________ZMX!````````@```*L"
-M``#\_________WMZ!````````@```)4"``#\_________\1Z!````````@``
-M`(D"``#\__________A[!````````@```*L"``#\_________UE\!```````
-M`@```)4"``#\_________X9]!````````@```)4"``#\__________*$!```
-M`````@```*L"``#\_________S6%!````````@```)4"``#\_________W*%
-M!````````@```)4"``#\_________P2&!````````@```*`"``#\________
-M_X*'!````````@```&T"``#\_________[:'!````````@```&T"``#\____
-M_____QN(!````````@```&T"``#\_________UF(!````````@```&T"``#\
-M__________*(!````````@```*$"``#\_________Q6*!````````@```*`"
-M``#\_________\&*!````````@```&T"``#\_________SJ+!````````@``
-M`&T"``#\_________YB+!````````@```)4"``#\_________TB7!```````
-M`@```)4"``#\_________RF<!````````@```)4"``#\_________WJ>!```
-M`````@```)4"``#\_________QFO!````````@```)4"``#\_________XFP
-M!````````@```)4"``#\_________T2Q!````````@```)4"``#\________
-M_YBT!````````@```)4"``#\_________SBY!````````@```)4"``#\____
-M_____Z"Y!````````@```%0"``#\_________PRZ!````````@```($"``#\
-M_________[*\!````````@```)4"``#\_________\C`!````````@```*L"
-M``#\__________7"!````````@```($"``#\_________[/#!````````@``
-M`)4"``#\_________W#&!````````@```($"``#\_________RO'!```````
-M`@```*L"``#\_________[7*!````````@```),"``#\_________V++!```
-M`````@```)4"``#\_________RC,!````````@```)4"``#\_________R7/
-M!````````@```)4"``#\_________R30!````````@```)4"``#\________
-M_Y;3!````````@```)4"``#\_________^'4!````````@```$L"``#\____
-M_____]'5!````````@```-`"``#\_________Y/6!````````@```)4"``#\
-M_________QW7!````````@```)T"``#\_________Q;8!````````@```)4"
-M``#\_________SW9!````````@```)4"``#\_________^S;!````````@``
-M`)4"``#\_________\O=!````````@```)4"``#\_________U/C!```````
-M`@```)4"``#\_________U#F!````````@```)4"``#\_________V+F!```
-M`````@```*L"``#\__________SF!````````@```-`"``#\_________[CH
-M!````````@```)4"``#\__________'I!````````@```*L"``#\________
-M_]?J!````````@```*L"``#\_________Q[K!````````@```*L"``#\____
-M_____W3L!````````@```)4"``#\_________Y#M!````````@```)4"``#\
-M_________P;P!````````@```'$"``#\_________TGR!```````"P````$`
-M````]@0``````(KR!````````@```(\"``#\_________]+R!```````"P``
-M``$```!P\`0``````-WR!```````"P````$`````]@0``````(;T!```````
-M`@```'L"``#\_________W+U!````````@```(\"``#\_________\3U!```
-M````"P```',"`````````````-'U!````````@```,<"``#\_________TSV
-M!````````@```*,"``#\_________W_X!```````"P```',"````````````
-M`(SX!````````@```,<"``#\_________Z#X!````````@```',"``#\____
-M_____UCY!````````@```,H"``#\_________X/Y!````````@```-`"``#\
-M_________R;Z!````````@```*L"``#\_________TCZ!````````@```$\"
-M``#\_________X#Z!````````@```*L"``#\_________Y7O!````````@``
-M`-`"``#\_________^CO!````````@```-`"``#\_________T[P!```````
-M`@```)D"``#\_________Y?S!````````@```*L"``#\_________^;U!```
-M`````@```',"``#\_________VWV!````````@```,H"``#\_________]7V
-M!````````@```*L"``#\_________WOZ!````````@```*<"``#\________
-M_^+Z!````````@```&H"``#\_________S;]!````````@```'4"``#\____
-M_____V?]!````````@```'4"``#\_________WC]!````````@```'4"``#\
-M_________P7^!````````@```%("``#\_________P3_!````````@```%<"
-M``#\__________X`!0```````@```&T"``#\_________R<!!0```````@``
-M`%T"``#\_________[\!!0```````@```(T"``#\_________VX$!0``````
-M`@```&L"``#\_________WL$!0```````@```&8"``#\_________Y@$!0``
-M`````@```&$"``#\_________\T$!0```````@```&$"``#\_________^0$
-M!0```````@```&D"``#\_________X`%!0```````@```(T"``#\________
-M_[$%!0```````@```'L"``#\_________\\%!0```````@```'L"``#\____
-M_____^$%!0```````@```'L"``#\__________$%!0```````@```(T"``#\
-M__________D%!0```````@```(T"``#\_________U(&!0``````"P````,`
-M``!`*````````,8&!0```````@```(L"``#\_________Q4'!0```````@``
-M`&\"``#\_________VL'!0```````@```%0"``#\_________P`(!0``````
-M`@```(T"``#\_________]0(!0```````@```*T"``#\_________P8)!0``
-M`````@```%T"``#\_________Q8)!0```````@```(L"``#\_________S<)
-M!0```````@```(H"``#\_________P<+!0```````@```&$"``#\________
-M_RX+!0```````@```&$"``#\_________SX+!0```````@```&L"``#\____
-M_____\H+!0```````@```&$"``#\_________^0+!0```````@```&L"``#\
-M_________P4,!0```````@```&8"``#\_________R$,!0```````@```&8"
-M``#\_________QL/!0```````@```-4"``#\_________W$/!0```````@``
-M`-4"``#\_________[X/!0```````@```-4"``#\_________WH0!0``````
-M`@```&L"``#\_________Y00!0```````@```&$"``#\_________YP0!0``
-M`````@```&L"``#\__________X0!0```````@```&H"``#\_________Q81
-M!0```````@```*T"``#\_________S<1!0```````@```+("``#\________
-M_[D1!0```````@```&H"``#\_________]D1!0```````@```&L"``#\____
-M_____Z(2!0```````@```-4"``#\_________UH4!0```````@```+,"``#\
-M_________W<4!0```````@```*T"``#\_________X$4!0```````@```(T"
-M``#\_________[D4!0```````@```(L"``#\_________PW_!````````@``
-M`&\"``#\_________QD!!0```````@```&\"``#\_________R$(!0``````
-M`@```*T"``#\_________VP3!0```````@```+,"``#\_________^,4!0``
-M`````@```$P"``#\_________P45!0```````@```*H"``#\_________R$5
-M!0```````@```*H"``#\_________\X6!0``````"P````$```"`%04`````
-M`.D6!0```````@```-`"``#\_________R$7!0```````@```),"``#\____
-M_____V@7!0```````@```-("``#\_________W@7!0```````@```+T"``#\
-M_________P`$`````````0````$```#`'`````````@$`````````0````$`
-M``#R'````````!`$`````````0````$```!\'0```````!@$`````````0``
-M``$```!\'0```````"`$`````````0````$```!\'0```````"@$````````
-M`0````$```!\'0```````#`$`````````0````$````D'0```````#@$````
-M`````0````$```!0'0```````$`$`````````0````$```!\'0```````$@$
-M`````````0````$```"1'0```````%`$`````````0````$````S)P``````
-M`%@$`````````0````$````^)P```````&`$`````````0````$````^)P``
-M`````&@$`````````0````$````^)P```````'`$`````````0````$````^
-M)P```````'@$`````````0````$````^)P```````(`$`````````0````$`
-M```^)P```````(@$`````````0````$````^)P```````)`$`````````0``
-M``$````^)P```````)@$`````````0````$````^)P```````*`$````````
-M`0````$````^)P```````*@$`````````0````$````^)P```````+`$````
-M`````0````$````^)P```````+@$`````````0````$````^)P```````,`$
-M`````````0````$````^)P```````,@$`````````0````$````^)P``````
-M`-`$`````````0````$````^)P```````-@$`````````0````$````^)P``
-M`````.`$`````````0````$````^)P```````.@$`````````0````$````^
-M)P```````/`$`````````0````$````^)P```````/@$`````````0````$`
-M```^)P`````````%`````````0````$````^)P````````@%`````````0``
-M``$````^)P```````!`%`````````0````$````^)P```````!@%````````
-M`0````$````^)P```````"`%`````````0````$````^)P```````"@%````
-M`````0````$````^)P```````#`%`````````0````$````^)P```````#@%
-M`````````0````$````^)P```````$`%`````````0````$````^)P``````
-M`$@%`````````0````$````^)P```````%`%`````````0````$````^)P``
-M`````%@%`````````0````$````^)P```````&`%`````````0````$````^
-M)P```````&@%`````````0````$````^)P```````'`%`````````0````$`
-M```()P```````'@%`````````0````$````^)P```````(`%`````````0``
-M``$````()P```````(@%`````````0````$````^)P```````)`%````````
-M`0````$````^)P```````)@%`````````0````$````^)P```````*`%````
-M`````0````$````()P```````*@%`````````0````$````()P```````+`%
-M`````````0````$````^)P```````+@%`````````0````$````^)P``````
-M`,`%`````````0````$````^)P```````,@%`````````0````$````^)P``
-M`````-`%`````````0````$````^)P```````-@%`````````0````$````^
-M)P```````.`%`````````0````$````^)P```````.@%`````````0````$`
-M```^)P```````/`%`````````0````$````^)P```````/@%`````````0``
-M``$````^)P`````````&`````````0````$````^)P````````@&````````
-M`0````$````^)P```````!`&`````````0````$````^)P```````!@&````
-M`````0````$````^)P```````"`&`````````0````$````^)P```````"@&
-M`````````0````$````^)P```````#`&`````````0````$````^)P``````
-M`#@&`````````0````$````()P```````$`&`````````0````$````^)P``
-M`````$@&`````````0````$````^)P```````%`&`````````0````$````^
-M)P```````%@&`````````0````$````^)P```````&`&`````````0````$`
-M```^)P```````&@&`````````0````$````^)P```````'`&`````````0``
-M``$````^)P```````'@&`````````0````$````^)P```````(`&````````
-M`0````$````^)P```````(@&`````````0````$````^)P```````)`&````
-M`````0````$````^)P```````)@&`````````0````$````^)P```````*`&
-M`````````0````$````^)P```````*@&`````````0````$````^)P``````
-M`+`&`````````0````$````()P```````+@&`````````0````$````()P``
-M`````,`&`````````0````$````()P```````,@&`````````0````$````(
-M)P```````-`&`````````0````$````^)P```````-@&`````````0````$`
-M```^)P```````.`&`````````0````$````^)P```````.@&`````````0``
-M``$````^)P```````/`&`````````0````$````^)P```````/@&````````
-M`0````$````^)P`````````'`````````0````$````^)P````````@'````
-M`````0````$````^)P```````!`'`````````0````$````^)P```````!@'
-M`````````0````$````^)P```````"`'`````````0````$````^)P``````
-M`"@'`````````0````$````^)P```````#`'`````````0````$````^)P``
-M`````#@'`````````0````$````^)P```````$`'`````````0````$````^
-M)P```````$@'`````````0````$````^)P```````%`'`````````0````$`
-M```^)P```````%@'`````````0````$````^)P```````&`'`````````0``
-M``$````^)P```````&@'`````````0````$````^)P```````'`'````````
-M`0````$````^)P```````'@'`````````0````$````^)P```````(`'````
-M`````0````$````^)P```````(@'`````````0````$````^)P```````)`'
-M`````````0````$````^)P```````)@'`````````0````$````^)P``````
-M`*`'`````````0````$````^)P```````*@'`````````0````$````^)P``
-M`````+`'`````````0````$````^)P```````+@'`````````0````$````^
-M)P```````,`'`````````0````$````^)P```````,@'`````````0````$`
-M```^)P```````-`'`````````0````$````^)P```````-@'`````````0``
-M``$````^)P```````.`'`````````0````$````^)P```````.@'````````
-M`0````$````^)P```````/`'`````````0````$````^)P```````/@'````
-M`````0````$````^)P`````````(`````````0````$````^)P````````@(
-M`````````0````$````^)P```````!`(`````````0````$````^)P``````
-M`!@(`````````0````$````^)P```````"`(`````````0````$````^)P``
-M`````"@(`````````0````$````()P```````#`(`````````0````$````^
-M)P```````#@(`````````0````$````^)P```````$`(`````````0````$`
-M```^)P```````$@(`````````0````$````^)P```````%`(`````````0``
-M``$````^)P```````%@(`````````0````$````^)P```````&`(````````
-M`0````$````^)P```````&@(`````````0````$````^)P```````'`(````
-M`````0````$````()P```````'@(`````````0````$````^)P```````(`(
-M`````````0````$````()P```````(@(`````````0````$````^)P``````
-M`)`(`````````0````$````^)P```````)@(`````````0````$````^)P``
-M`````*`(`````````0````$````()P```````*@(`````````0````$````(
-M)P```````+`(`````````0````$````^)P```````+@(`````````0````$`
-M```^)P```````,`(`````````0````$````^)P```````,@(`````````0``
-M``$````()P```````-`(`````````0````$````^)P```````-@(````````
-M`0````$````^)P```````.`(`````````0````$````^)P```````.@(````
-M`````0````$````^)P```````/`(`````````0````$````^)P```````/@(
-M`````````0````$````^)P`````````)`````````0````$````^)P``````
-M``@)`````````0````$````^)P```````!`)`````````0````$````^)P``
-M`````!@)`````````0````$````^)P```````"`)`````````0````$````^
-M)P```````"@)`````````0````$````^)P```````#`)`````````0````$`
-M```^)P```````#@)`````````0````$````^)P```````$`)`````````0``
-M``$````^)P```````$@)`````````0````$````^)P```````%`)````````
-M`0````$````^)P```````%@)`````````0````$````^)P```````&`)````
-M`````0````$````^)P```````&@)`````````0````$````^)P```````'`)
-M`````````0````$````()P```````'@)`````````0````$````^)P``````
-M`(`)`````````0````$````()P```````(@)`````````0````$````^)P``
-M`````)`)`````````0````$````^)P```````)@)`````````0````$````^
-M)P```````*`)`````````0````$````()P```````*@)`````````0````$`
-M```()P```````+`)`````````0````$```"4/````````+@)`````````0``
-M``$```!$/````````,`)`````````0````$```!1/````````,@)````````
-M`0````$```!V/````````-`)`````````0````$```"4/````````-@)````
-M`````0````$```"*/````````.`)`````````0````$```"`/````````.@)
-M`````````0````$```"4/````````/`)`````````0````$```"4/```````
-M`/@)`````````0````$```"4/``````````*`````````0````$```"4/```
-M``````@*`````````0````$```"`/````````!`*`````````0````$```!I
-M90```````!@*`````````0````$```"%90```````"`*`````````0````$`
-M``"A90```````"@*`````````0````$```#W90```````#`*`````````0``
-M``$```!A9@```````$`*`````````0````$````WJ@```````$@*````````
-M`0````$````1J@```````%`*`````````0````$````7J@```````%@*````
-M`````0````$```!!J@```````&`*`````````0````$````'J@```````&@*
-M`````````0````$````'J@```````'`*`````````0````$````'J@``````
-M`'@*`````````0````$````'J@```````(`*`````````0````$````'J@``
-M`````(@*`````````0````$````'J@```````)`*`````````0````$````'
-MJ@```````)@*`````````0````$````'J@```````*`*`````````0````$`
-M```'J@```````*@*`````````0````$````'J@```````+`*`````````0``
-M``$````'J@```````+@*`````````0````$````'J@```````,`*````````
-M`0````$```!'J@```````,@*`````````0````$```!!J@```````-`*````
-M`````0````$````AJ@```````-@*`````````0````$````WJ@```````.`*
-M`````````0````$````GJ@```````.@*`````````0````$````QJ@``````
-M`/`*`````````0````$```!'J@```````/@*`````````0````$````!J@``
-M`````(`+`````````0````$```#/(P$``````(@+`````````0````$````Z
-M)`$``````)`+`````````0````$```!6)`$``````)@+`````````0````$`
-M``!R)`$``````*`+`````````0````$```".)`$``````*@+`````````0``
-M``$```"J)`$``````+`+`````````0````$```#+)`$``````+@+````````
-M`0````$```!&)0$``````,`+`````````0````$```!S)0$``````,@+````
-M`````0````$````5)@$``````-`+`````````0````$```#7)0$``````-@+
-M`````````0````$```#S)0$``````.`+`````````0````$````Q)@$`````
-M`.@+`````````0````$```!/)P$``````/`+`````````0````$```!_)P$`
-M`````/@+`````````0````$```"E)P$````````,`````````0````$```#<
-M)P$```````@,`````````0````$```"^*`$``````!`,`````````0````$`
-M```"*`$``````!@,`````````0````$````,*`$``````"`,`````````0``
-M``$```"?)0$``````"@,`````````0````$```"[)0$``````#`,````````
-M`0````$```#M)`$``````#@,`````````0````$````:)0$``````$`,````
-M`````0````$```#7)0$``````$@,`````````0````$````:*`$``````%`,
-M`````````0````$```#N*`$``````%@,`````````0````$````0*0$`````
-M`&`,`````````0````$````L*0$``````&@,`````````0````$```!-*0$`
-M`````'`,`````````0````$```!?*0$``````'@,`````````0````$```""
-M*0$``````(`,`````````0````$```"V*0$``````(@,`````````0````$`
-M```\*`$``````)`,`````````0````$```!>*`$``````)@,`````````0``
-M``$```"`*`$``````*`,`````````0````$```"B*`$``````+`,````````
-M`0````$```##7P$``````+@,`````````0````$```#@50$``````,`,````
-M`````0````$````R5@$``````,@,`````````0````$```"M5@$``````-`,
-M`````````0````$````\5P$``````-@,`````````0````$```!P5P$`````
-M`.`,`````````0````$```"[5P$``````.@,`````````0````$```!16`$`
-M`````/`,`````````0````$```!;6`$``````/@,`````````0````$````N
-M7`$````````-`````````0````$````%6P$```````@-`````````0````$`
-M``#*50$``````!`-`````````0````$```##7P$``````!@-`````````0``
-M``$```##7P$``````"`-`````````0````$```##7P$``````"@-````````
-M`0````$```##7P$``````#`-`````````0````$```##7P$``````#@-````
-M`````0````$````J7P$``````$`-`````````0````$```##7P$``````$@-
-M`````````0````$```##7P$``````%`-`````````0````$```!E6`$`````
-M`%@-`````````0````$```"`6`$``````&`-`````````0````$```#%5P$`
-M`````&@-`````````0````$```!'6`$``````'`-`````````0````$````%
-M6P$``````'@-`````````0````$````>70$``````(`-`````````0````$`
-M``"&7P$``````(@-`````````0````$```"-7P$``````)`-`````````0``
-M``$```"^7P$``````)@-`````````0````$```##7P$``````*`-````````
-M`0````$```!87@$``````*@-`````````0````$```"H7@$``````+`-````
-M`````0````$```"R7@$``````+@-`````````0````$````H70$``````,`-
-M`````````0````$````U70$``````,@-`````````0````$````_70$`````
-M`-`-`````````0````$```!)70$``````-@-`````````0````$```#PB@$`
-M`````.`-`````````0````$```!+B`$``````.@-`````````0````$```!<
-MB`$``````/`-`````````0````$```!MB`$``````/@-`````````0````$`
-M``!^B`$````````.`````````0````$```#*B`$```````@.`````````0``
-M``$```#IB`$``````!`.`````````0````$```#]B`$``````!@.````````
-M`0````$```!2B0$``````"`.`````````0````$```!NB0$``````"@.````
-M`````0````$```"*B0$``````#`.`````````0````$```"FB0$``````#@.
-M`````````0````$```#.B0$``````$`.`````````0````$```#BB0$`````
-M`$@.`````````0````$```#VB0$``````%`.`````````0````$```#PB@$`
-M`````%@.`````````0````$```#PB@$``````&`.`````````0````$````/
-MB@$``````&@.`````````0````$```![B@$``````'`.`````````0````$`
-M``#PB@$``````'@.`````````0````$```#PB@$``````(`.`````````0``
-M``$````WB@$``````(@.`````````0````$```#`B@$``````)`.````````
-M`0````$```"=B`$``````)@.`````````0````$```"QB`$``````*`.````
-M`````0````$```#PB@$``````*@.`````````0````$````1B0$``````+`.
-M`````````0````$````EB0$``````+@.`````````0````$````YB0$`````
-M`,`.`````````0````$```"@O`$``````,@.`````````0````$```"@O`$`
-M`````-`.`````````0````$```#9O`$``````-@.`````````0````$```#L
-MO`$``````.`.`````````0````$```"@O`$``````.@.`````````0````$`
-M```-O0$``````/`.`````````0````$```"JO`$``````/@.`````````0``
-M``$```#_O`$````````/`````````0````$```"VO0$```````@/````````
-M`0````$```#"O0$``````!`/`````````0````$````!QP$``````!@/````
-M`````0````$```!VR`$``````"`/`````````0````$```!VR`$``````"@/
-M`````````0````$```!VR`$``````#`/`````````0````$```!VR`$`````
-M`#@/`````````0````$```!VR`$``````$`/`````````0````$```!VR`$`
-M`````$@/`````````0````$```!VR`$``````%`/`````````0````$```!V
-MR`$``````%@/`````````0````$```!VR`$``````&`/`````````0````$`
-M``!VR`$``````&@/`````````0````$```!VR`$``````'`/`````````0``
-M``$```!VR`$``````'@/`````````0````$```!VR`$``````(`/````````
-M`0````$```!VR`$``````(@/`````````0````$```!VR`$``````)`/````
-M`````0````$```!VR`$``````)@/`````````0````$```!VR`$``````*`/
-M`````````0````$```!VR`$``````*@/`````````0````$```!VR`$`````
-M`+`/`````````0````$```!VR`$``````+@/`````````0````$```!VR`$`
-M`````,`/`````````0````$```!VR`$``````,@/`````````0````$```!V
-MR`$``````-`/`````````0````$```!VR`$``````-@/`````````0````$`
-M``!VR`$``````.`/`````````0````$```!VR`$``````.@/`````````0``
-M``$```!VR`$``````/`/`````````0````$```!VR`$``````/@/````````
-M`0````$```!VR`$````````0`````````0````$```!VR`$```````@0````
-M`````0````$```!VR`$``````!`0`````````0````$````5QP$``````!@0
-M`````````0````$```!PQP$``````"`0`````````0````$```#+QP$`````
-M`"@0`````````0````$````FR`$``````#`0`````````0````$```"+R0$`
-M`````#@0`````````0````$```!7S@$``````$`0`````````0````$```!7
-MS@$``````$@0`````````0````$```!7S@$``````%`0`````````0````$`
-M``!7S@$``````%@0`````````0````$```!7S@$``````&`0`````````0``
-M``$```!7S@$``````&@0`````````0````$```!7S@$``````'`0````````
-M`0````$```!7S@$``````'@0`````````0````$```!7S@$``````(`0````
-M`````0````$```!7S@$``````(@0`````````0````$```!7S@$``````)`0
-M`````````0````$```!7S@$``````)@0`````````0````$```!7S@$`````
-M`*`0`````````0````$```!7S@$``````*@0`````````0````$```!7S@$`
-M`````+`0`````````0````$```"=R0$``````+@0`````````0````$```"=
-MR0$``````,`0`````````0````$```"=R0$``````,@0`````````0````$`
-M``!7S@$``````-`0`````````0````$```!7S@$``````-@0`````````0``
-M``$```!7S@$``````.`0`````````0````$```!7S@$``````.@0````````
-M`0````$```!7S@$``````/`0`````````0````$```!7S@$``````/@0````
-M`````0````$```!7S@$````````1`````````0````$```!7S@$```````@1
-M`````````0````$```!7S@$``````!`1`````````0````$```!7S@$`````
-M`!@1`````````0````$```!7S@$``````"`1`````````0````$```!7S@$`
-M`````"@1`````````0````$```!7S@$``````#`1`````````0````$````#
-MR@$``````#@1`````````0````$```!;R@$``````$`1`````````0````$`
-M``"SR@$``````$@1`````````0````$````,RP$``````%`1`````````0``
-M``$```!7S@$``````%@1`````````0````$```!7S@$``````&`1````````
-M`0````$```!7S@$``````&@1`````````0````$```!7S@$``````'`1````
-M`````0````$```!7S@$``````'@1`````````0````$```!7S@$``````(`1
-M`````````0````$```!7S@$``````(@1`````````0````$```!7S@$`````
-M`)`1`````````0````$```!7S@$``````)@1`````````0````$```!7S@$`
-M`````*`1`````````0````$```!7S@$``````*@1`````````0````$```!7
-MS@$``````+`1`````````0````$```!DRP$``````+@1`````````0````$`
-M``"_RP$``````,`1`````````0````$````;S`$``````,@1`````````0``
-M``$```!SS`$``````-`1`````````0````$```!7S@$``````-@1````````
-M`0````$```!7S@$``````.`1`````````0````$```!7S@$``````.@1````
-M`````0````$```!7S@$``````/`1`````````0````$```!7S@$``````/@1
-M`````````0````$```!7S@$````````2`````````0````$```!7S@$`````
-M``@2`````````0````$```!7S@$``````!`2`````````0````$```!7S@$`
-M`````!@2`````````0````$```!7S@$``````"`2`````````0````$```!7
-MS@$``````"@2`````````0````$```!7S@$``````#`2`````````0````$`
-M``#+S`$``````#@2`````````0````$```!7S@$``````$`2`````````0``
-M``$```!7S@$``````$@2`````````0````$```!7S@$``````%`2````````
-M`0````$```!7S@$``````%@2`````````0````$```!7S@$``````&`2````
-M`````0````$```!7S@$``````&@2`````````0````$```!7S@$``````'`2
-M`````````0````$```!7S@$``````'@2`````````0````$```!7S@$`````
-M`(`2`````````0````$```!7S@$``````(@2`````````0````$```!7S@$`
-M`````)`2`````````0````$```!7S@$``````)@2`````````0````$```!7
-MS@$``````*`2`````````0````$```!7S@$``````*@2`````````0````$`
-M``!7S@$``````+`2`````````0````$````$S0$``````+@2`````````0``
-M``$````^S0$``````,`2`````````0````$```!XS0$``````,@2````````
-M`0````$```"RS0$``````-`2`````````0````$```#IS0$``````-@2````
-M`````0````$````@S@$````````7`````````0````$```!`#0(```````@7
-M`````````0````$```!R#0(``````!`7`````````0````$```#\#0(`````
-M`!@7`````````0````$```#\#0(``````"`7`````````0````$```#\#0(`
-M`````"@7`````````0````$```#\#0(``````#`7`````````0````$```"D
-M#0(``````#@7`````````0````$```#0#0(``````$`7`````````0````$`
-M``#\#0(``````$@7`````````0````$````1#@(``````%`7`````````0``
-M``$```"S%P(``````%@7`````````0````$```"^%P(``````&`7````````
-M`0````$```"^%P(``````&@7`````````0````$```"^%P(``````'`7````
-M`````0````$```"^%P(``````'@7`````````0````$```"^%P(``````(`7
-M`````````0````$```"^%P(``````(@7`````````0````$```"^%P(`````
-M`)`7`````````0````$```"^%P(``````)@7`````````0````$```"^%P(`
-M`````*`7`````````0````$```"^%P(``````*@7`````````0````$```"^
-M%P(``````+`7`````````0````$```"^%P(``````+@7`````````0````$`
-M``"^%P(``````,`7`````````0````$```"^%P(``````,@7`````````0``
-M``$```"^%P(``````-`7`````````0````$```"^%P(``````-@7````````
-M`0````$```"^%P(``````.`7`````````0````$```"^%P(``````.@7````
-M`````0````$```"^%P(``````/`7`````````0````$```"^%P(``````/@7
-M`````````0````$```"^%P(````````8`````````0````$```"^%P(`````
-M``@8`````````0````$```"^%P(``````!`8`````````0````$```"^%P(`
-M`````!@8`````````0````$```"^%P(``````"`8`````````0````$```"^
-M%P(``````"@8`````````0````$```"^%P(``````#`8`````````0````$`
-M``"^%P(``````#@8`````````0````$```"^%P(``````$`8`````````0``
-M``$```"^%P(``````$@8`````````0````$```"^%P(``````%`8````````
-M`0````$```"^%P(``````%@8`````````0````$```"^%P(``````&`8````
-M`````0````$```"^%P(``````&@8`````````0````$```"^%P(``````'`8
-M`````````0````$```"(%P(``````'@8`````````0````$```"^%P(`````
-M`(`8`````````0````$```"(%P(``````(@8`````````0````$```"^%P(`
-M`````)`8`````````0````$```"^%P(``````)@8`````````0````$```"^
-M%P(``````*`8`````````0````$```"(%P(``````*@8`````````0````$`
-M``"(%P(``````+`8`````````0````$```"^%P(``````+@8`````````0``
-M``$```"^%P(``````,`8`````````0````$```"^%P(``````,@8````````
-M`0````$```"^%P(``````-`8`````````0````$```"^%P(``````-@8````
-M`````0````$```"^%P(``````.`8`````````0````$```"^%P(``````.@8
-M`````````0````$```"^%P(``````/`8`````````0````$```"^%P(`````
-M`/@8`````````0````$```"^%P(````````9`````````0````$```"^%P(`
-M``````@9`````````0````$```"^%P(``````!`9`````````0````$```"^
-M%P(``````!@9`````````0````$```"^%P(``````"`9`````````0````$`
-M``"^%P(``````"@9`````````0````$```"^%P(``````#`9`````````0``
-M``$```"^%P(``````#@9`````````0````$```"(%P(``````$`9````````
-M`0````$```"^%P(``````$@9`````````0````$```"^%P(``````%`9````
-M`````0````$```"^%P(``````%@9`````````0````$```"^%P(``````&`9
-M`````````0````$```"^%P(``````&@9`````````0````$```"^%P(`````
-M`'`9`````````0````$```"^%P(``````'@9`````````0````$```"^%P(`
-M`````(`9`````````0````$```"^%P(``````(@9`````````0````$```"^
-M%P(``````)`9`````````0````$```"^%P(``````)@9`````````0````$`
-M``"^%P(``````*`9`````````0````$```"^%P(``````*@9`````````0``
-M``$```"^%P(``````+`9`````````0````$```"(%P(``````+@9````````
-M`0````$```"(%P(``````,`9`````````0````$```"(%P(``````,@9````
-M`````0````$```"(%P(``````-`9`````````0````$```"^%P(``````-@9
-M`````````0````$```"^%P(``````.`9`````````0````$```"^%P(`````
-M`.@9`````````0````$```"^%P(``````/`9`````````0````$```"^%P(`
-M`````/@9`````````0````$```"^%P(````````:`````````0````$```"^
-M%P(```````@:`````````0````$```"^%P(``````!`:`````````0````$`
-M``"^%P(``````!@:`````````0````$```"^%P(``````"`:`````````0``
-M``$```"^%P(``````"@:`````````0````$```"^%P(``````#`:````````
-M`0````$```"^%P(``````#@:`````````0````$```"^%P(``````$`:````
-M`````0````$```"^%P(``````$@:`````````0````$```"^%P(``````%`:
-M`````````0````$```"^%P(``````%@:`````````0````$```"^%P(`````
-M`&`:`````````0````$```"^%P(``````&@:`````````0````$```"^%P(`
-M`````'`:`````````0````$```"^%P(``````'@:`````````0````$```"^
-M%P(``````(`:`````````0````$```"^%P(``````(@:`````````0````$`
-M``"^%P(``````)`:`````````0````$```"^%P(``````)@:`````````0``
-M``$```"^%P(``````*`:`````````0````$```"^%P(``````*@:````````
-M`0````$```"^%P(``````+`:`````````0````$```"^%P(``````+@:````
-M`````0````$```"^%P(``````,`:`````````0````$```"^%P(``````,@:
-M`````````0````$```"^%P(``````-`:`````````0````$```"^%P(`````
-M`-@:`````````0````$```"^%P(``````.`:`````````0````$```"^%P(`
-M`````.@:`````````0````$```"^%P(``````/`:`````````0````$```"^
-M%P(``````/@:`````````0````$```"^%P(````````;`````````0````$`
-M``"^%P(```````@;`````````0````$```"^%P(``````!`;`````````0``
-M``$```"^%P(``````!@;`````````0````$```"^%P(``````"`;````````
-M`0````$```"^%P(``````"@;`````````0````$```"(%P(``````#`;````
-M`````0````$```"^%P(``````#@;`````````0````$```"^%P(``````$`;
-M`````````0````$```"^%P(``````$@;`````````0````$```"^%P(`````
-M`%`;`````````0````$```"^%P(``````%@;`````````0````$```"^%P(`
-M`````&`;`````````0````$```"^%P(``````&@;`````````0````$```"^
-M%P(``````'`;`````````0````$```"(%P(``````'@;`````````0````$`
-M``"^%P(``````(`;`````````0````$```"(%P(``````(@;`````````0``
-M``$```"^%P(``````)`;`````````0````$```"^%P(``````)@;````````
-M`0````$```"^%P(``````*`;`````````0````$```"(%P(``````*@;````
-M`````0````$```"(%P(``````+`;`````````0````$```"^%P(``````+@;
-M`````````0````$```"^%P(``````,`;`````````0````$```"^%P(`````
-M`,@;`````````0````$```"(%P(``````-`;`````````0````$```"^%P(`
-M`````-@;`````````0````$```"^%P(``````.`;`````````0````$```"^
-M%P(``````.@;`````````0````$```"^%P(``````/`;`````````0````$`
-M``"^%P(``````/@;`````````0````$```"^%P(````````<`````````0``
-M``$```"^%P(```````@<`````````0````$```"^%P(``````!`<````````
-M`0````$```"^%P(``````!@<`````````0````$```"^%P(``````"`<````
-M`````0````$```"^%P(``````"@<`````````0````$```"^%P(``````#`<
-M`````````0````$```"^%P(``````#@<`````````0````$```"^%P(`````
-M`$`<`````````0````$```"^%P(``````$@<`````````0````$```"^%P(`
-M`````%`<`````````0````$```"^%P(``````%@<`````````0````$```"^
-M%P(``````&`<`````````0````$```"^%P(``````&@<`````````0````$`
-M``"^%P(``````'`<`````````0````$```"(%P(``````'@<`````````0``
-M``$```"^%P(``````(`<`````````0````$```"(%P(``````(@<````````
-M`0````$```"^%P(``````)`<`````````0````$```"^%P(``````)@<````
-M`````0````$```"^%P(``````*`<`````````0````$```"(%P(``````*@<
-M`````````0````$```"(%P(``````+`<`````````0````$````4+0(`````
-M`+@<`````````0````$```#$+`(``````,`<`````````0````$```#1+`(`
-M`````,@<`````````0````$```#V+`(``````-`<`````````0````$````4
-M+0(``````-@<`````````0````$````*+0(``````.`<`````````0````$`
-M````+0(``````.@<`````````0````$````4+0(``````/`<`````````0``
-M``$````4+0(``````/@<`````````0````$````4+0(````````=````````
-M`0````$````4+0(```````@=`````````0````$`````+0(``````!`=````
-M`````0````$```#)50(``````!@=`````````0````$```#E50(``````"`=
-M`````````0````$````!5@(``````"@=`````````0````$```!75@(`````
-M`#`=`````````0````$```#!5@(``````$`=`````````0````$````'F@(`
-M`````$@=`````````0````$```#AF0(``````%`=`````````0````$```#G
-MF0(``````%@=`````````0````$````1F@(``````&`=`````````0````$`
-M``#7F0(``````&@=`````````0````$```#7F0(``````'`=`````````0``
-M``$```#7F0(``````'@=`````````0````$```#7F0(``````(`=````````
-M`0````$```#7F0(``````(@=`````````0````$```#7F0(``````)`=````
-M`````0````$```#7F0(``````)@=`````````0````$```#7F0(``````*`=
-M`````````0````$```#7F0(``````*@=`````````0````$```#7F0(`````
-M`+`=`````````0````$```#7F0(``````+@=`````````0````$```#7F0(`
-M`````,`=`````````0````$````7F@(``````,@=`````````0````$````1
-MF@(``````-`=`````````0````$```#QF0(``````-@=`````````0````$`
-M```'F@(``````.`=`````````0````$```#WF0(``````.@=`````````0``
-M``$````!F@(``````/`=`````````0````$````7F@(``````/@=````````
-M`0````$```#1F0(``````(`>`````````0````$```"?$P,``````(@>````
-M`````0````$````*%`,``````)`>`````````0````$````F%`,``````)@>
-M`````````0````$```!"%`,``````*`>`````````0````$```!>%`,`````
-M`*@>`````````0````$```!Z%`,``````+`>`````````0````$```";%`,`
-M`````+@>`````````0````$````6%0,``````,`>`````````0````$```!#
-M%0,``````,@>`````````0````$```#E%0,``````-`>`````````0````$`
-M``"G%0,``````-@>`````````0````$```##%0,``````.`>`````````0``
-M``$````!%@,``````.@>`````````0````$````?%P,``````/`>````````
-M`0````$```!/%P,``````/@>`````````0````$```!U%P,````````?````
-M`````0````$```"L%P,```````@?`````````0````$```".&`,``````!`?
-M`````````0````$```#2%P,``````!@?`````````0````$```#<%P,`````
-M`"`?`````````0````$```!O%0,``````"@?`````````0````$```"+%0,`
-M`````#`?`````````0````$```"]%`,``````#@?`````````0````$```#J
-M%`,``````$`?`````````0````$```"G%0,``````$@?`````````0````$`
-M``#J%P,``````%`?`````````0````$```"^&`,``````%@?`````````0``
-M``$```#@&`,``````&`?`````````0````$```#\&`,``````&@?````````
-M`0````$````=&0,``````'`?`````````0````$````O&0,``````'@?````
-M`````0````$```!2&0,``````(`?`````````0````$```"&&0,``````(@?
-M`````````0````$````,&`,``````)`?`````````0````$````N&`,`````
-M`)@?`````````0````$```!0&`,``````*`?`````````0````$```!R&`,`
-M`````+`?`````````0````$```"#3P,``````+@?`````````0````$```"P
-M10,``````,`?`````````0````$````"1@,``````,@?`````````0````$`
-M``"01@,``````-`?`````````0````$````<1P,``````-@?`````````0``
-M``$```!01P,``````.`?`````````0````$```";1P,``````.@?````````
-M`0````$````Q2`,``````/`?`````````0````$````[2`,``````/@?````
-M`````0````$```#N2P,````````@`````````0````$```#`2@,```````@@
-M`````````0````$```":10,``````!`@`````````0````$```"#3P,`````
-M`!@@`````````0````$```"#3P,``````"`@`````````0````$```"#3P,`
-M`````"@@`````````0````$```"#3P,``````#`@`````````0````$```"#
-M3P,``````#@@`````````0````$```#J3@,``````$`@`````````0````$`
-M``"#3P,``````$@@`````````0````$```"#3P,``````%`@`````````0``
-M``$```!%2`,``````%@@`````````0````$```!@2`,``````&`@````````
-M`0````$```"E1P,``````&@@`````````0````$````G2`,``````'`@````
-M`````0````$```#`2@,``````'@@`````````0````$```#>3`,``````(`@
-M`````````0````$```!&3P,``````(@@`````````0````$```!-3P,`````
-M`)`@`````````0````$```!^3P,``````)@@`````````0````$```"#3P,`
-M`````*`@`````````0````$````83@,``````*@@`````````0````$```!H
-M3@,``````+`@`````````0````$```!R3@,``````+@@`````````0````$`
-M``#H3`,``````,`@`````````0````$```#U3`,``````,@@`````````0``
-M``$```#_3`,``````-`@`````````0````$````)30,``````-@@````````
-M`0````$````B7@,``````.`@`````````0````$````J7@,``````.@@````
-M`````0````$````R7@,``````/`@`````````0````$````Z7@,``````/@@
-M`````````0````$```!"7@,````````A`````````0````$```!*7@,`````
-M``@A`````````0````$```!27@,``````!`A`````````0````$````:7@,`
-M`````!@A`````````0````$```"P>0,``````"`A`````````0````$````+
-M=P,``````"@A`````````0````$````<=P,``````#`A`````````0````$`
-M```M=P,``````#@A`````````0````$````^=P,``````$`A`````````0``
-M``$```"*=P,``````$@A`````````0````$```"I=P,``````%`A````````
-M`0````$```"]=P,``````%@A`````````0````$````2>`,``````&`A````
-M`````0````$````N>`,``````&@A`````````0````$```!*>`,``````'`A
-M`````````0````$```!F>`,``````'@A`````````0````$```".>`,`````
-M`(`A`````````0````$```"B>`,``````(@A`````````0````$```"V>`,`
-M`````)`A`````````0````$```"P>0,``````)@A`````````0````$```"P
-M>0,``````*`A`````````0````$```#/>`,``````*@A`````````0````$`
-M```[>0,``````+`A`````````0````$```"P>0,``````+@A`````````0``
-M``$```"P>0,``````,`A`````````0````$```#W>`,``````,@A````````
-M`0````$```"`>0,``````-`A`````````0````$```!==P,``````-@A````
-M`````0````$```!Q=P,``````.`A`````````0````$```"P>0,``````.@A
-M`````````0````$```#1=P,``````/`A`````````0````$```#E=P,`````
-M`/@A`````````0````$```#Y=P,````````B`````````0````$```"0JP,`
-M``````@B`````````0````$```"0JP,``````!`B`````````0````$```#)
-MJP,``````!@B`````````0````$```#<JP,``````"`B`````````0````$`
-M``"0JP,``````"@B`````````0````$```#]JP,``````#`B`````````0``
-M``$```":JP,``````#@B`````````0````$```#OJP,``````$`B````````
-M`0````$```"FK`,``````$@B`````````0````$```"RK`,``````%`B````
-M`````0````$```!1M@,``````%@B`````````0````$```#&MP,``````&`B
-M`````````0````$```#&MP,``````&@B`````````0````$```#&MP,`````
-M`'`B`````````0````$```#&MP,``````'@B`````````0````$```#&MP,`
-M`````(`B`````````0````$```#&MP,``````(@B`````````0````$```#&
-MMP,``````)`B`````````0````$```#&MP,``````)@B`````````0````$`
-M``#&MP,``````*`B`````````0````$```#&MP,``````*@B`````````0``
-M``$```#&MP,``````+`B`````````0````$```#&MP,``````+@B````````
-M`0````$```#&MP,``````,`B`````````0````$```#&MP,``````,@B````
-M`````0````$```#&MP,``````-`B`````````0````$```#&MP,``````-@B
-M`````````0````$```#&MP,``````.`B`````````0````$```#&MP,`````
-M`.@B`````````0````$```#&MP,``````/`B`````````0````$```#&MP,`
-M`````/@B`````````0````$```#&MP,````````C`````````0````$```#&
-MMP,```````@C`````````0````$```#&MP,``````!`C`````````0````$`
-M``#&MP,``````!@C`````````0````$```#&MP,``````"`C`````````0``
-M``$```#&MP,``````"@C`````````0````$```#&MP,``````#`C````````
-M`0````$```#&MP,``````#@C`````````0````$```#&MP,``````$`C````
-M`````0````$```#&MP,``````$@C`````````0````$```#&MP,``````%`C
-M`````````0````$```!EM@,``````%@C`````````0````$```#`M@,`````
-M`&`C`````````0````$````;MP,``````&@C`````````0````$```!VMP,`
-M`````'`C`````````0````$```#;N`,``````'@C`````````0````$```"G
-MO0,``````(`C`````````0````$```"GO0,``````(@C`````````0````$`
-M``"GO0,``````)`C`````````0````$```"GO0,``````)@C`````````0``
-M``$```"GO0,``````*`C`````````0````$```"GO0,``````*@C````````
-M`0````$```"GO0,``````+`C`````````0````$```"GO0,``````+@C````
-M`````0````$```"GO0,``````,`C`````````0````$```"GO0,``````,@C
-M`````````0````$```"GO0,``````-`C`````````0````$```"GO0,`````
-M`-@C`````````0````$```"GO0,``````.`C`````````0````$```"GO0,`
-M`````.@C`````````0````$```"GO0,``````/`C`````````0````$```#M
-MN`,``````/@C`````````0````$```#MN`,````````D`````````0````$`
-M``#MN`,```````@D`````````0````$```"GO0,``````!`D`````````0``
-M``$```"GO0,``````!@D`````````0````$```"GO0,``````"`D````````
-M`0````$```"GO0,``````"@D`````````0````$```"GO0,``````#`D````
-M`````0````$```"GO0,``````#@D`````````0````$```"GO0,``````$`D
-M`````````0````$```"GO0,``````$@D`````````0````$```"GO0,`````
-M`%`D`````````0````$```"GO0,``````%@D`````````0````$```"GO0,`
-M`````&`D`````````0````$```"GO0,``````&@D`````````0````$```"G
-MO0,``````'`D`````````0````$```!3N0,``````'@D`````````0````$`
-M``"KN0,``````(`D`````````0````$````#N@,``````(@D`````````0``
-M``$```!<N@,``````)`D`````````0````$```"GO0,``````)@D````````
-M`0````$```"GO0,``````*`D`````````0````$```"GO0,``````*@D````
-M`````0````$```"GO0,``````+`D`````````0````$```"GO0,``````+@D
-M`````````0````$```"GO0,``````,`D`````````0````$```"GO0,`````
-M`,@D`````````0````$```"GO0,``````-`D`````````0````$```"GO0,`
-M`````-@D`````````0````$```"GO0,``````.`D`````````0````$```"G
-MO0,``````.@D`````````0````$```"GO0,``````/`D`````````0````$`
-M``"TN@,``````/@D`````````0````$````/NP,````````E`````````0``
-M``$```!KNP,```````@E`````````0````$```##NP,``````!`E````````
-M`0````$```"GO0,``````!@E`````````0````$```"GO0,``````"`E````
-M`````0````$```"GO0,``````"@E`````````0````$```"GO0,``````#`E
-M`````````0````$```"GO0,``````#@E`````````0````$```"GO0,`````
-M`$`E`````````0````$```"GO0,``````$@E`````````0````$```"GO0,`
-M`````%`E`````````0````$```"GO0,``````%@E`````````0````$```"G
-MO0,``````&`E`````````0````$```"GO0,``````&@E`````````0````$`
-M``"GO0,``````'`E`````````0````$````;O`,``````'@E`````````0``
-M``$```"GO0,``````(`E`````````0````$```"GO0,``````(@E````````
-M`0````$```"GO0,``````)`E`````````0````$```"GO0,``````)@E````
-M`````0````$```"GO0,``````*`E`````````0````$```"GO0,``````*@E
-M`````````0````$```"GO0,``````+`E`````````0````$```"GO0,`````
-M`+@E`````````0````$```"GO0,``````,`E`````````0````$```"GO0,`
-M`````,@E`````````0````$```"GO0,``````-`E`````````0````$```"G
-MO0,``````-@E`````````0````$```"GO0,``````.`E`````````0````$`
-M``"GO0,``````.@E`````````0````$```"GO0,``````/`E`````````0``
-M``$```!4O`,``````/@E`````````0````$```".O`,````````F````````
-M`0````$```#(O`,```````@F`````````0````$````"O0,``````!`F````
-M`````0````$````YO0,``````!@F`````````0````$```!PO0,``````%`F
-M`````````0````$```#``P0``````%@F`````````0````$```!?!`0`````
-M`&`F`````````0````$```#Z`P0``````&@F`````````0````$```#>`P0`
-M`````'`F`````````0````$```!?!`0``````'@F`````````0````$```!?
-M!`0``````(`F`````````0````$```!?!`0``````(@F`````````0````$`
-M``!?!`0``````)`F`````````0````$```#``P0``````)@F`````````0``
-M``$````J!00``````*`F`````````0````$```#``P0``````*@F````````
-M`0````$```#``P0``````+`F`````````0````$```!V`P0``````+@F````
-M`````0````$````>!00``````,`F`````````0````$```#L!`0``````,@F
-M`````````0````$```"X!`0``````-`F`````````0````$````#)P0`````
-M`-@F`````````0````$````3)P0``````.`F`````````0````$````;)P0`
-M`````.@F`````````0````$````C)P0``````/`F`````````0````$````K
-M)P0``````/@F`````````0````$````S)P0````````G`````````0````$`
-M```[)P0```````@G`````````0````$````+)P0``````!`G`````````0``
-M``$```"[*P0``````!@G`````````0````$```"3+00``````"`G````````
-M`0````$```#T+`0``````"@G`````````0````$```!J+00``````#`G````
-M`````0````$```!!+00``````#@G`````````0````$```!J+00``````$`G
-M`````````0````$```"[*P0``````$@G`````````0````$```"^*P0`````
-M`%`G`````````0````$```!CBP0``````%@G`````````0````$```#UBP0`
-M`````&`G`````````0````$```#2C`0``````&@G`````````0````$```#^
-MC`0``````'`G`````````0````$```"RC00``````'@G`````````0````$`
-M``"5C@0``````(`G`````````0````$```"NC@0``````(@G`````````0``
-M``$```"ZC@0``````)`G`````````0````$```"SBP0``````)@G````````
-M`0````$````XCP0``````*`G`````````0````$```#UCP0``````*@G````
-M`````0````$```!CBP0``````+`G`````````0````$````&D00``````+@G
-M`````````0````$````.D`0``````,`G`````````0````$```"PD`0`````
-M`,@G`````````0````$```#6GP0``````-`G`````````0````$```!'HP0`
-M`````-@G`````````0````$````0HP0``````.`G`````````0````$```#[
-MH@0``````.@G`````````0````$```#FH@0``````/`G`````````0````$`
-M``#'H@0``````/@G`````````0````$```#6GP0````````H`````````0``
-M``$```"RH@0```````@H`````````0````$````WH`0``````!`H````````
-M`0````$```"EX00``````!@H`````````0````$```"3X00``````"`H````
-M`````0````$```!WX00``````"@H`````````0````$```!6X00``````#`H
-M`````````0````$````4X00``````#@H`````````0````$```#7X`0`````
-M`$`H`````````0````$````X!P4``````$@H`````````0````$```!Q!@4`
-M`````%`H`````````0````$````X!P4``````%@H`````````0````$```!6
-M!@4``````&`H`````````0````$```!6!@4``````&@H`````````0````$`
-M``!6!@4``````(```````````0````8```"K`0```````)@``````````0``
-M``$```#@F`$``````*```````````0````$````0M0$``````*@`````````
-M`0````$````PF0$``````+```````````0````$```"0S@$``````+@`````
-M`````0````$```#0Z@$``````,```````````0````$```#PM`$``````,@`
-M`````````0````$```#0F`$``````-```````````0````$```"`F@$`````
-M`-@``````````0````$````0M`$``````.```````````0````$```!`F0$`
-M`````.@``````````0````$```!0[0$``````/```````````0````$```#P
-MF@$``````/@``````````0````$````0TP$````````!`````````0```"4!
-M``````````````@!`````````0````$`````L0$``````!`!`````````0``
-M``$```!0F0$``````!@!`````````0````$```#PXP$``````"`!````````
-M`0````$```#PJP$``````"@!`````````0````$```!@I0$``````#`!````
-M`````0````$```"PHP$``````#@!`````````0````$```"0FP$``````$`!
-M`````````0````$```!PO`$``````$@!`````````0````$```"PFP$`````
-M`%`!`````````0````$```!`I0$``````%@!`````````0````$````@I0$`
-M`````&`!`````````0````$`````I`$``````&@!`````````0````$```!P
-MG0$``````'`!`````````0````$```"0G`$``````'@!`````````0```$8`
-M`````````````(@!`````````0````$`````FP$``````)`!`````````0``
-M``$```"0X0$``````)@!`````````0````$```"0W0$``````*`!````````
-M`0````$```!PV0$``````*@!`````````0````$```!@U0$``````+`!````
-M`````0```-@``````````````"`"`````````0````8```!;`P```````#@"
-M`````````0````$```"@AP,``````$`"`````````0````$````0I`,`````
-M`$@"`````````0````$```#PAP,``````%`"`````````0````$```#@O0,`
-M`````%@"`````````0````$````@V@,``````&`"`````````0````$```#P
-MHP,``````&@"`````````0````$```"0AP,``````'`"`````````0````$`
-M``!`B0,``````'@"`````````0````$````0HP,``````(`"`````````0``
-M``$`````B`,``````(@"`````````0````$```"PW`,``````)`"````````
-M`0````$```"PB0,``````)@"`````````0````$```!@P@,``````*`"````
-M`````0```#L!`````````````*@"`````````0````$`````H`,``````+`"
-M`````````0````$````0B`,``````+@"`````````0````$```!`TP,`````
-M`,`"`````````0````$```#PF@,``````,@"`````````0````$```!@E`,`
-M`````-`"`````````0````$```#0DP,``````-@"`````````0````$```!`
-MBP,``````.`"`````````0````$```!@JP,``````.@"`````````0````$`
-M``!@BP,``````/`"`````````0````$```!`E`,``````/@"`````````0``
-M``$````@E`,````````#`````````0````$```!@DP,```````@#````````
-M`0````$````@C0,``````!`#`````````0````$```!`C`,``````!@#````
-M`````0````8"`````````````"@#`````````0````$```#`B0,``````#`#
-M`````````0````$```#@T`,``````#@#`````````0````$```#@S`,`````
-M`$`#`````````0````$```#`R`,``````$@#`````````0````$```"PQ`,`
-M`````%`#`````````0```$$!`````````````,`#`````````0````$`````
-M`P0``````,@#`````````0````$````0(`0``````-`#`````````0````$`
-M```0`@0``````.@#`````````0````$```#P]@,``````/`#`````````0``
-M``$```"@`00``````/@#`````````0````$```#`]P,``````"@$````````
-M`0````$`````,P0``````#@$`````````0````$````P;P0``````%`$````
-M`````0````$```!@,P0``````&`$`````````0````$```#`;00``````'@$
-M`````````0````$```"`,P0``````(@$`````````0````$````@@P0`````
-M`*`$`````````0````$```#@,P0``````+`$`````````0````$```!@?`0`
-M`````,@$`````````0````$`````-`0``````-@$`````````0````$```#`
-M;`0``````/`$`````````0````$```#@-`0````````%`````````0````$`
-M``"`9@0``````!@%`````````0````$```!`-00``````"@%`````````0``
-M``$````@W00``````$`%`````````0````$```!`.`0``````$@%````````
-M`0````$```!P=00``````%`%`````````0````$```!P5@0``````&@%````
-M`````0````$```"PS`0``````'`%`````````0````$````0=`0``````'@%
-M`````````0````$````P500``````)`%`````````0````$```!P/`0`````
-M`*`%`````````0````$```"`8@0``````+@%`````````0````$```"0/`0`
-M`````,@%`````````0````$```!0R00``````.`%`````````0````$```"0
-M/P0``````.@%`````````0````$```#P<P0``````/`%`````````0````$`
-M``#P5`0```````@&`````````0````$`````0`0``````!`&`````````0``
-M``$```#0<P0``````!@&`````````0````$```"P5`0``````#`&````````
-M`0````$```!P0`0``````#@&`````````0````$```"`<P0``````$`&````
-M`````0````$```!P5`0``````%@&`````````0````$````P000``````&`&
-M`````````0````$```#P<@0``````&@&`````````0````$````P5`0`````
-M`(`&`````````0````$```"@000``````(@&`````````0````$```#0<@0`
-M`````)`&`````````0````$```#P4P0``````*@&`````````0````$```"`
-M0@0``````+@&`````````0````$```!P4P0``````-`&`````````0````$`
-M``#P0@0``````.`&`````````0````$````P4P0``````/@&`````````0``
-M``$````00P0```````@'`````````0````$```!@TP0``````"`'````````
-M`0````$````P0P0``````#`'`````````0````$```#`UP0``````$@'````
-M`````0````$```!00P0``````%@'`````````0````$```#P>@0``````'`'
-M`````````0````$````01`0``````(`'`````````0````$```#0>@0`````
-M`)@'`````````0````$`````/00``````*@'`````````0````$```#0R`0`
-M`````,`'`````````0````$```!P/00``````-`'`````````0````$```"`
-MR`0``````.@'`````````0````$```#01`0``````/@'`````````0````$`
-M``#P4@0``````!`(`````````0````$````P100``````"`(`````````0``
-M``$```!0S@0``````#@(`````````0````$```#@100``````$`(````````
-M`0````$```!0<@0``````$@(`````````0````$```"P4@0``````&`(````
-M`````0````$```!0.00``````&@(`````````0````$````P=00``````'`(
-M`````````0````$````P5@0``````(@(`````````0````$```"`-00`````
-M`)@(`````````0````$```!`VP0``````+`(`````````0````$````00@0`
-M`````,`(`````````0````$```"P4P0``````-@(`````````0````$```#@
-M/00``````.@(`````````0````$`````R`0````````)`````````0````$`
-M``!`/@0``````!`)`````````0````$```"`QP0``````"@)`````````0``
-M``$```"@/@0``````#@)`````````0````$````PQP0``````%`)````````
-M`0````$```#`.@0``````%@)`````````0````$```"P=`0``````&`)````
-M`````0````$```"P500``````'@)`````````0````$`````/P0``````(@)
-M`````````0````$````0N@0``````*`)`````````0````$```"01@0`````
-M`*@)`````````0````$````@<@0``````+`)`````````0````$```!P4@0`
-M`````,@)`````````0````$```!P-@0``````-@)`````````0````$````P
-M900``````/`)`````````0````$```!P-P0``````/@)`````````0````$`
-M``"P=00````````*`````````0````$```"P5@0``````!@*`````````0``
-M``$```#`-00``````"@*`````````0````$```!0V`0``````$`*````````
-M`0````$```"@,P0``````%`*`````````0````$```"0@00``````&@*````
-M`````0````$```#`,P0``````'@*`````````0````$````0;00``````)`*
-M`````````0````$`````-@0``````*`*`````````0````$```"0LP0`````
-M`+@*`````````0````$`````.@0``````,`*`````````0````$```#P=`0`
-M`````,@*`````````0````$```#P500``````.`*`````````0````$```"0
-M.P0``````.@*`````````0````$```!P=`0``````/`*`````````0````$`
-M``!P500```````@+`````````0````$```#@-@0``````!@+`````````0``
-M``$```!P9`0``````#`+`````````0````$```"`1P0``````$`+````````
-M`0````$````0>P0``````%@+`````````0````$````0-00``````&@+````
-M`````0````$```#@900``````(`+`````````0````$````@-`0``````)`+
-M`````````0````$````@;`0``````*@+`````````0````$```!`-`0`````
-M`+@+`````````0````$````P:P0``````-`+`````````0````$```!@-`0`
-M`````.`+`````````0````$```!`:@0``````/@+`````````0````$```"`
-M-`0```````@,`````````0````$```!0:00``````"`,`````````0````$`
-M``"@-`0``````#`,`````````0````$```!0:`0``````$@,`````````0``
-M``$```#`-`0``````%@,`````````0````$```!P9P0``````'`,````````
-M`0````$````@,P0``````(`,`````````0````$```#0?`0``````)@,````
-M`````0````$```!`,P0``````*`,`````````0````$```#P=00``````*@,
-M`````````0````$````0;@0``````,`,`````````0````$```#P1@0`````
-M`-`,`````````0````$```"P800``````.@,`````````0````$````@1P0`
-M`````/@,`````````0````$```!@7P0``````!`-`````````0````$````0
-M.00``````"`-`````````0````$````P8P0``````#@-`````````0````$`
-M``#P.`0``````$@-`````````0````$```#P8P0``````&`-`````````0``
-M``$```!P2`0``````&@-`````````0````$`````<@0``````'`-````````
-M`0````$````P4@0``````(@-`````````0````$````P200``````)`-````
-M`````0````$```#@<00``````)@-`````````0````$```#P400``````"``
-M`````````0````$``````````````#@``````````0````$````P````````
-M`%```````````0````$```!``````````*@``````````0````$```"P`@``
-M`````,```````````0````$```#P`@```````-@``````````0````$````P
-M`P```````/```````````0````$```"``P````````@!`````````0````$`
-M``#0`P```````#@!`````````0````$```#@`P```````%`!`````````0``
-M``$````0!````````&@!`````````0````$```!@!````````(`!````````
-M`0````$```!P!````````)@!`````````0````$```#0!````````+`!````
-M`````0````$```#@!````````,@!`````````0````$````0!0```````.`!
-M`````````0````$```!`!0```````/@!`````````0````$```"`!0``````
-M`!`"`````````0````$```#`!0```````"@"`````````0````$```"@!P``
-M`````$`"`````````0````$```#@!P```````&`"`````````0````$```!P
-M"````````(`"`````````0````$```"P"````````)@"`````````0````$`
-M``#@"````````+`"`````````0````$````0"0```````.`"`````````0``
-M``$````P"0```````/@"`````````0````$```"@"0```````!`#````````
-M`0````$`````"@```````"@#`````````0````$```!@"@```````$`#````
-M`````0````$```#@"@```````&@#`````````0````$````P#````````(@#
-M`````````0````$```!P#````````,@#`````````0````$```#@#@``````
-M``@$`````````0````$````P$````````"`$`````````0````$```"`$```
-M`````#@$`````````0````$````0$0```````%`$`````````0````$```"0
-M$0```````&@$`````````0````$````0$@```````(`$`````````0````$`
-M```P$@```````*`$`````````0````$```"`$@```````,`$`````````0``
-M``$```"P$@```````.`$`````````0````$````0$P```````"`%````````
-M`0````$````P%0```````$`%`````````0````$````@%@```````&@%````
-M`````0````$```!`%P```````)`%`````````0````$```!@&````````+@%
-M`````````0````$```!P'@```````-@%`````````0````$```"0'@``````
-M`!@&`````````0````$```#P*0```````$@&`````````0````$`````+```
-M`````'`&`````````0````$```!@+P```````+`&`````````0````$```!0
-M,P```````-@&`````````0````$````@/0```````!@'`````````0````$`
-M``"P1@```````$`'`````````0````$```"@1P```````(`'`````````0``
-M``$```!@40```````,`'`````````0````$```!`6P```````.@'````````
-M`0````$`````7````````"`(`````````0````$```#`7````````%@(````
-M`````0````$````@8````````'@(`````````0````$```#P8````````+@(
-M`````````0````$```"09````````.`(`````````0````$```!@:```````
-M`"`)`````````0````$```!@;````````&`)`````````0````$```#@<@``
-M`````(`)`````````0````$```!P<P```````*`)`````````0````$```"`
-M<P```````,`)`````````0````$```"0=P```````.@)`````````0````$`
-M``"@>````````"@*`````````0````$```#P>0```````&@*`````````0``
-M``$```"`A0```````)@*`````````0````$`````B````````/`*````````
-M`0````$````@C0````````@+`````````0````$```"0C0```````"`+````
-M`````0````$```#@C0```````#@+`````````0````$```!`C@```````%`+
-M`````````0````$```"@C@```````&@+`````````0````$```"`CP``````
-M`*`+`````````0````$```#`D````````,`+`````````0````$````0D0``
-M```````,`````````0````$```"@D0```````"@,`````````0````$````0
-MDP```````%`,`````````0````$```!PE````````'@,`````````0````$`
-M``#`E0```````)@,`````````0````$```!`E@```````,`,`````````0``
-M``$```!0EP`````````-`````````0````$```#PF````````$`-````````
-M`0````$```!`F@```````&@-`````````0````$```!0FP```````)`-````
-M`````0````$```#@G````````+@-`````````0````$```#@G0```````/@-
-M`````````0````$```"`G@```````#@.`````````0````$```"PGP``````
-M`)`.`````````0````$````@I````````*@.`````````0````$```"`I```
-M`````-@.`````````0````$```#0I````````/`.`````````0````$```#P
-MI0```````!@/`````````0````$````0IP```````#`/`````````0````$`
-M``"@IP```````$@/`````````0````$```#0IP```````&`/`````````0``
-M``$```#@IP```````'@/`````````0````$````PJ````````)`/````````
-M`0````$```!@J````````*@/`````````0````$```"@J````````,`/````
-M`````0````$```#0J````````-@/`````````0````$````0J0```````/`/
-M`````````0````$```!`J0````````@0`````````0````$```!PJ0``````
-M`"`0`````````0````$```"0J0```````#@0`````````0````$```#`J0``
-M`````%`0`````````0````$```#PJ0```````&@0`````````0````$```!@
-MJ@```````(`0`````````0````$```!@JP```````)@0`````````0````$`
-M``!`K````````+`0`````````0````$```"0K````````.`0`````````0``
-M``$```"0K0`````````1`````````0````$```#`K0```````"`1````````
-M`0````$```#PK0```````$`1`````````0````$```!`K@```````&`1````
-M`````0````$```!PK@```````(`1`````````0````$```"@K@```````,`1
-M`````````0````$````PL````````.`1`````````0````$```!@L```````
-M`/@1`````````0````$```"0L````````!`2`````````0````$```#`L```
-M`````#@2`````````0````$```"PL0```````%@2`````````0````$```#P
-ML0```````'@2`````````0````$````PL@```````*`2`````````0````$`
-M``"`M0```````,@2`````````0````$```#@M@```````.@2`````````0``
-M``$```!`MP```````!`3`````````0````$```#PMP```````#@3````````
-M`0````$```"`N````````&`3`````````0````$```!PN0```````(@3````
-M`````0````$````@N@```````+`3`````````0````$```"@NP```````-@3
-M`````````0````$````0O0`````````4`````````0````$```#`O0``````
-M`"@4`````````0````$```#0O@```````%`4`````````0````$`````P```
-M`````'@4`````````0````$````@P0```````*`4`````````0````$````P
-MP@```````,@4`````````0````$```"0PP````````@5`````````0````$`
-M``!`QP```````#`5`````````0````$```!`R````````%@5`````````0``
-M``$````PR0```````(`5`````````0````$`````R@```````*@5````````
-M`0````$```#`R@```````-`5`````````0````$```#0RP```````/@5````
-M`````0````$```!0S0```````!@6`````````0````$```!PS0```````$`6
-M`````````0````$```"@S@```````&@6`````````0````$````0SP``````
-M`(@6`````````0````$```!0SP```````*@6`````````0````$```!PSP``
-M`````,@6`````````0````$```"@SP```````/`6`````````0````$```"@
-MT````````!@7`````````0````$```"0T@```````$`7`````````0````$`
-M```@TP```````&@7`````````0````$```"PU````````*@7`````````0``
-M``$````@V````````-@7`````````0````$````0V@```````!@8````````
-M`0````$```"@W````````$`8`````````0````$```#0W0```````&@8````
-M`````0````$````0WP```````)`8`````````0````$```!@WP```````,@8
-M`````````0````$```"0WP```````.`8`````````0````$```"PWP``````
-M`/@8`````````0````$```#0WP```````!`9`````````0````$`````X```
-M`````"@9`````````0````$```!0X````````$`9`````````0````$```"P
-MX````````%@9`````````0````$```!`X@```````(@9`````````0````$`
-M```0XP```````+@9`````````0````$```"`XP```````-@9`````````0``
-M``$```"PXP```````/@9`````````0````$```!`Y````````"@:````````
-M`0````$```"0Y0```````$@:`````````0````$```"PY@```````&@:````
-M`````0````$````PYP```````(@:`````````0````$```"PYP```````,@:
-M`````````0````$```#0\````````/`:`````````0````$```!@\@``````
-M``@;`````````0````$`````\P```````"`;`````````0````$`````]```
-M`````&@;`````````0````$```#`]0```````(`;`````````0````$```!`
-M]@```````)@;`````````0````$```"P]@```````+`;`````````0````$`
-M```@]P```````,@;`````````0````$```"0]P```````.`;`````````0``
-M``$```"@]P```````/@;`````````0````$```#@]P```````!`<````````
-M`0````$```!`^````````"@<`````````0````$```!@^````````$`<````
-M`````0````$```"0^````````&`<`````````0````$````P^0```````(@<
-M`````````0````$```!`^@```````,@<`````````0````$````@_```````
-M`/@<`````````0````$```"`_````````"`=`````````0````$```!P_0``
-M`````$@=`````````0````$```!`_@```````&@=`````````0````$```!@
-M_P```````)`=`````````0````$````0``$``````+@=`````````0````$`
-M``!``0$``````.`=`````````0````$````0`@$```````@>`````````0``
-M``$````0`P$``````$@>`````````0````$`````!`$``````(@>````````
-M`0````$```#P!`$``````,@>`````````0````$```"0!P$````````?````
-M`````0````$```!P"@$``````"@?`````````0````$````@"P$``````&@?
-M`````````0````$```!@#@$``````*@?`````````0````$```#`%0$`````
-M`.@?`````````0````$```#`%@$``````"`@`````````0````$```"P&@$`
-M`````&`@`````````0````$```#@(@$``````(@@`````````0````$```"0
-M(P$``````+`@`````````0````$`````*@$``````-@@`````````0````$`
-M``!0+`$``````/@@`````````0````$```!P+`$``````"`A`````````0``
-M``$````@-@$``````$@A`````````0````$````@.@$``````'`A````````
-M`0````$```!0/0$``````+`A`````````0````$````00`$``````/`A````
-M`````0````$`````0P$``````#`B`````````0````$```#`10$``````'`B
-M`````````0````$```"P20$``````+`B`````````0````$```"@30$`````
-M`/`B`````````0````$```#`3@$``````"`C`````````0````$```#04`$`
-M`````$@C`````````0````$````04P$``````(@C`````````0````$```#`
-M4P$``````+`C`````````0````$```!08`$``````/`C`````````0````$`
-M``"`:0$```````@D`````````0````$```"P:0$``````"`D`````````0``
-M``$```#@:0$``````$@D`````````0````$```!@:@$``````&@D````````
-M`0````$```"P:@$``````(@D`````````0````$```#0:@$``````*`D````
-M`````0````$````@:P$``````,@D`````````0````$```#`:P$``````/`D
-M`````````0````$```!0;0$``````!`E`````````0````$```"0;0$`````
-M`#`E`````````0````$```#0;0$``````%`E`````````0````$````0;@$`
-M`````'@E`````````0````$```"@;@$``````*`E`````````0````$```#P
-M;@$``````,@E`````````0````$```!P;P$``````/`E`````````0````$`
-M``!`<`$``````#`F`````````0````$```!0<@$``````%`F`````````0``
-M``$```"P<@$``````'`F`````````0````$````0<P$``````*@F````````
-M`0````$```#`<P$``````,@F`````````0````$````@=`$``````.@F````
-M`````0````$```!@=`$```````@G`````````0````$```"@=`$``````$@G
-M`````````0````$```"@>0$``````&@G`````````0````$`````>@$`````
-M`(@G`````````0````$```!0>@$``````,`G`````````0````$```"P>@$`
-M`````-@G`````````0````$```#0>@$``````/`G`````````0````$```#P
-M>@$``````!`H`````````0````$```!`?0$``````"@H`````````0````$`
-M``!@?0$``````$`H`````````0````$```"`?0$``````&@H`````````0``
-M``$```!P?@$``````*@H`````````0````$```"@?P$``````-`H````````
-M`0````$```"0@`$```````@I`````````0````$```#`@0$``````$@I````
-M`````0````$```!P@@$``````&`I`````````0````$```"P@P$``````'@I
-M`````````0````$```#`@P$``````)`I`````````0````$```#0@P$`````
-M`*@I`````````0````$```#P@P$``````,`I`````````0````$````0A`$`
-M`````-@I`````````0````$```!`A`$``````/`I`````````0````$```!P
-MA`$``````!@J`````````0````$```"PA0$``````#`J`````````0````$`
-M``#PA0$``````%@J`````````0````$```"0A@$``````'`J`````````0``
-M``$```#PA@$``````(@J`````````0````$````0AP$``````*@J````````
-M`0````$````0BP$``````,@J`````````0````$```!PC`$````````K````
-M`````0````$````@C@$``````!@K`````````0````$```!PC@$``````#`K
-M`````````0````$```"0C@$``````%@K`````````0````$`````CP$`````
-M`(`K`````````0````$````0D@$``````*@K`````````0````$```#`D@$`
-M`````-`K`````````0````$```!`DP$``````!`L`````````0````$````0
-ME`$``````#`L`````````0````$```"0E`$``````%`L`````````0````$`
-M``!0E0$``````)`L`````````0````$```#0F`$``````*@L`````````0``
-M``$```#@F`$``````,`L`````````0````$````PF0$``````-@L````````
-M`0````$```!`F0$``````/`L`````````0````$```!0F0$```````@M````
-M`````0````$```!@F0$``````"`M`````````0````$```#@F0$``````#@M
-M`````````0````$```"`F@$``````%`M`````````0````$```"0F@$`````
-M`&@M`````````0````$```"@F@$``````(`M`````````0````$```#PF@$`
-M`````)@M`````````0````$`````FP$``````+`M`````````0````$````0
-MFP$``````,@M`````````0````$```!0FP$``````.@M`````````0````$`
-M``"0FP$````````N`````````0````$```"PFP$``````!@N`````````0``
-M``$````0G`$``````#`N`````````0````$```!PG`$``````%`N````````
-M`0````$```"0G`$``````'@N`````````0````$```!PG0$``````+@N````
-M`````0````$```"PHP$``````-@N`````````0````$`````I`$````````O
-M`````````0````$````@I0$``````"`O`````````0````$```!`I0$`````
-M`$`O`````````0````$```!@I0$``````&`O`````````0````$```"`I0$`
-M`````(@O`````````0````$````0IP$``````+`O`````````0````$```#P
-MJP$``````-@O`````````0````$````PL`$````````P`````````0````$`
-M````L0$``````"@P`````````0````$```"@L@$``````$@P`````````0``
-M``$```"`LP$``````'`P`````````0````$````0M`$``````)@P````````
-M`0````$```#PM`$``````+@P`````````0````$````0M0$``````/@P````
-M`````0````$````0N`$``````"`Q`````````0````$```#`N`$``````$@Q
-M`````````0````$```!PO`$``````'`Q`````````0````$```#PO0$`````
-M`)@Q`````````0````$```#0O@$``````-@Q`````````0````$```#`Q`$`
-M`````/@Q`````````0````$```!@Q0$``````"@R`````````0````$```"0
-MS@$``````&@R`````````0````$````0TP$``````)`R`````````0````$`
-M``!@U0$``````,@R`````````0````$```!PV0$``````/@R`````````0``
-M``$```"0W0$``````"`S`````````0````$```"0X0$``````$@S````````
-M`0````$```#PXP$``````'`S`````````0````$```#0Z@$``````)@S````
-M`````0````$```!0[0$``````/`S`````````0````$```"0\`$```````@T
-M`````````0````$```#`\`$``````"`T`````````0````$```#0\`$`````
-M`'@T`````````0````$```!`\P$``````)`T`````````0````$```"`\P$`
-M`````*@T`````````0````$```#`\P$``````,`T`````````0````$````0
-M]`$``````-@T`````````0````$```!@]`$```````@U`````````0````$`
-M``!P]`$``````"`U`````````0````$```"@]`$``````#@U`````````0``
-M``$```#P]`$``````%`U`````````0````$`````]0$``````&@U````````
-M`0````$```!@]0$``````(`U`````````0````$```!P]0$``````)@U````
-M`````0````$```"@]0$``````+`U`````````0````$```#0]0$``````,@U
-M`````````0````$````0]@$``````.`U`````````0````$```!0]@$`````
-M`/@U`````````0````$````P^`$``````!`V`````````0````$```!P^`$`
-M`````#`V`````````0````$`````^0$``````%`V`````````0````$```!`
-M^0$``````&@V`````````0````$```!P^0$``````(`V`````````0````$`
-M``"@^0$``````+`V`````````0````$```#`^0$``````,@V`````````0``
-M``$````P^@$``````.`V`````````0````$```"0^@$``````/@V````````
-M`0````$```#P^@$``````!`W`````````0````$```!P^P$``````#@W````
-M`````0````$```#`_`$``````%@W`````````0````$`````_0$``````)@W
-M`````````0````$```!P_P$``````-@W`````````0````$```#```(`````
-M`/`W`````````0````$````0`0(```````@X`````````0````$```"@`0(`
-M`````"`X`````````0````$````@`@(``````#@X`````````0````$```"@
-M`@(``````%`X`````````0````$```#``@(``````'`X`````````0````$`
-M```0`P(``````)`X`````````0````$```!``P(``````+`X`````````0``
-M``$```"@`P(``````/`X`````````0````$```"P!0(``````!`Y````````
-M`0````$```"@!@(``````#@Y`````````0````$```#`!P(``````&`Y````
-M`````0````$```#@"`(``````(@Y`````````0````$```#P#@(``````*@Y
-M`````````0````$````0#P(``````.@Y`````````0````$```!P&@(`````
-M`!@Z`````````0````$```"`'`(``````$`Z`````````0````$```#@'P(`
-M`````(`Z`````````0````$```#0(P(``````*@Z`````````0````$```"@
-M+0(``````.@Z`````````0````$````P-P(``````!`[`````````0````$`
-M```@.`(``````%`[`````````0````$```#@00(``````)`[`````````0``
-M``$```"@2P(``````+@[`````````0````$```!@3`(``````/`[````````
-M`0````$````@30(``````"@\`````````0````$```"`4`(``````$@\````
-M`````0````$```!040(``````(@\`````````0````$```#P5`(``````+`\
-M`````````0````$```#`6`(``````/`\`````````0````$```#`7`(`````
-M`#`]`````````0````$`````8P(``````%`]`````````0````$```"08P(`
-M`````'`]`````````0````$```"@8P(``````)`]`````````0````$```"P
-M9P(``````+@]`````````0````$```#`:`(``````/@]`````````0````$`
-M```0:@(``````#@^`````````0````$```"@=0(``````&@^`````````0``
-M``$````@>`(``````,`^`````````0````$```#P?`(``````-@^````````
-M`0````$```!@?0(``````/`^`````````0````$```"P?0(```````@_````
-M`````0````$````0?@(``````"`_`````````0````$```!P?@(``````#@_
-M`````````0````$```!0?P(``````'`_`````````0````$```"0@`(`````
-M`)`_`````````0````$```#@@`(``````-`_`````````0````$```!P@0(`
-M`````/@_`````````0````$```#@@@(``````"!``````````0````$```!`
-MA`(``````$A``````````0````$```"0A0(``````&A``````````0````$`
-M```0A@(``````)!``````````0````$````@AP(``````-!``````````0``
-M``$```#`B`(``````!!!`````````0````$````0B@(``````#A!````````
-M`0````$````@BP(``````&!!`````````0````$```"PC`(``````(A!````
-M`````0````$```"PC0(``````,A!`````````0````$```!0C@(```````A"
-M`````````0````$```"`CP(``````&!"`````````0````$```#PDP(`````
-M`'A"`````````0````$```!0E`(``````*A"`````````0````$```"@E`(`
-M`````,!"`````````0````$```#`E0(``````.A"`````````0````$```#@
-ME@(```````!#`````````0````$```!PEP(``````!A#`````````0````$`
-M``"@EP(``````#!#`````````0````$```"PEP(``````$A#`````````0``
-M``$`````F`(``````&!#`````````0````$````PF`(``````'A#````````
-M`0````$```!PF`(``````)!#`````````0````$```"@F`(``````*A#````
-M`````0````$```#@F`(``````,!#`````````0````$````0F0(``````-A#
-M`````````0````$```!`F0(``````/!#`````````0````$```!@F0(`````
-M``A$`````````0````$```"0F0(``````"!$`````````0````$```#`F0(`
-M`````#A$`````````0````$````PF@(``````%!$`````````0````$````P
-MFP(``````&A$`````````0````$````0G`(``````(!$`````````0````$`
-M``!@G`(``````+!$`````````0````$```!@G0(``````-!$`````````0``
-M``$```"0G0(``````/!$`````````0````$```#`G0(``````!!%````````
-M`0````$````0G@(``````#!%`````````0````$```!`G@(``````%!%````
-M`````0````$```!PG@(``````)!%`````````0````$`````H`(``````+!%
-M`````````0````$````PH`(``````,A%`````````0````$```!@H`(`````
-M`.!%`````````0````$```"0H`(```````A&`````````0````$```"`H0(`
-M`````"A&`````````0````$```#`H0(``````$A&`````````0````$`````
-MH@(``````'!&`````````0````$```!0I0(``````)A&`````````0````$`
-M``"PI@(``````+A&`````````0````$````0IP(``````.!&`````````0``
-M``$```#`IP(```````A'`````````0````$```!0J`(``````#!'````````
-M`0````$```!`J0(``````%A'`````````0````$```#PJ0(``````(!'````
-M`````0````$```!PJP(``````*A'`````````0````$```#@K`(``````-!'
-M`````````0````$```"0K0(``````/A'`````````0````$```"@K@(`````
-M`"!(`````````0````$```#0KP(``````$A(`````````0````$```#PL`(`
-M`````'!(`````````0````$`````L@(``````)A(`````````0````$```!@
-MLP(``````-A(`````````0````$````0MP(```````!)`````````0````$`
-M```0N`(``````"A)`````````0````$`````N0(``````%!)`````````0``
-M``$```#0N0(``````'A)`````````0````$```"0N@(``````*!)````````
-M`0````$```"@NP(``````,A)`````````0````$````@O0(``````.A)````
-M`````0````$```!`O0(``````!!*`````````0````$```!PO@(``````#A*
-M`````````0````$```#@O@(``````%A*`````````0````$````@OP(`````
-M`'A*`````````0````$```!`OP(``````)A*`````````0````$```!POP(`
-M`````,!*`````````0````$```!PP`(``````.A*`````````0````$```!@
-MP@(``````!!+`````````0````$```#PP@(``````#A+`````````0````$`
-M``"`Q`(``````'A+`````````0````$```#PQP(``````*A+`````````0``
-M``$```#@R0(``````.A+`````````0````$```!PS`(``````!!,````````
-M`0````$```"@S0(``````#A,`````````0````$```#@S@(``````&!,````
-M`````0````$````PSP(``````)A,`````````0````$```!@SP(``````+!,
-M`````````0````$```"`SP(``````,A,`````````0````$```"@SP(`````
-M`.!,`````````0````$```#0SP(``````/A,`````````0````$````@T`(`
-M`````!!-`````````0````$```"`T`(``````"A-`````````0````$````0
-MT@(``````%A-`````````0````$```#@T@(``````(A-`````````0````$`
-M``!0TP(``````*A-`````````0````$```"`TP(``````,A-`````````0``
-M``$````0U`(``````/A-`````````0````$```!@U0(``````!A.````````
-M`0````$```"`U@(``````#A.`````````0````$`````UP(``````%A.````
-M`````0````$```"`UP(``````)A.`````````0````$```"@X`(``````,!.
-M`````````0````$````PX@(``````-A.`````````0````$```#0X@(`````
-M`/!.`````````0````$```#0XP(``````#A/`````````0````$```"0Y0(`
-M`````%!/`````````0````$````0Y@(``````&A/`````````0````$```"`
-MY@(``````(!/`````````0````$```#PY@(``````)A/`````````0````$`
-M``!@YP(``````+!/`````````0````$```!PYP(``````,A/`````````0``
-M``$```"PYP(``````.!/`````````0````$````0Z`(``````/A/````````
-M`0````$````PZ`(``````!!0`````````0````$```!@Z`(``````#!0````
-M`````0````$`````Z0(``````%A0`````````0````$````0Z@(``````)A0
-M`````````0````$```#PZP(``````,A0`````````0````$```!0[`(`````
-M`/!0`````````0````$```!`[0(``````!A1`````````0````$````0[@(`
-M`````#A1`````````0````$````P[P(``````&!1`````````0````$```#@
-M[P(``````(A1`````````0````$````0\0(``````+!1`````````0````$`
-M``#@\0(``````-A1`````````0````$```#@\@(``````!A2`````````0``
-M``$```#0\P(``````%A2`````````0````$```#`]`(``````)A2````````
-M`0````$```!@]P(``````-!2`````````0````$```!`^@(``````/A2````
-M`````0````$```#P^@(``````#A3`````````0````$````P_@(``````'A3
-M`````````0````$```"0!0,``````+A3`````````0````$```"0!@,`````
-M`/!3`````````0````$```"`"@,``````#!4`````````0````$```"P$@,`
-M`````%A4`````````0````$```!@$P,``````(!4`````````0````$```#0
-M&0,``````*A4`````````0````$````@'`,``````,A4`````````0````$`
-M``!`'`,``````/!4`````````0````$```#P)0,``````!A5`````````0``
-M``$```#P*0,``````$!5`````````0````$````@+0,``````(!5````````
-M`0````$```#@+P,``````,!5`````````0````$```#0,@,```````!6````
-M`````0````$```"0-0,``````$!6`````````0````$```"`.0,``````(!6
-M`````````0````$```!P/0,``````,!6`````````0````$```"0/@,`````
-M`/!6`````````0````$```"@0`,``````!A7`````````0````$```#@0@,`
-M`````%A7`````````0````$```"00P,``````(!7`````````0````$````0
-M4`,``````,!7`````````0````$```!`60,``````-A7`````````0````$`
-M``!P60,``````/!7`````````0````$```"@60,``````!A8`````````0``
-M``$````@6@,``````#A8`````````0````$```!P6@,``````%A8````````
-M`0````$```"06@,``````'!8`````````0````$```#@6@,``````)A8````
-M`````0````$```"`6P,``````,!8`````````0````$````070,``````.!8
-M`````````0````$```!070,```````!9`````````0````$```"`70,`````
-M`"!9`````````0````$```#`70,``````$A9`````````0````$```"@7@,`
-M`````'!9`````````0````$```#P7@,``````)A9`````````0````$```!P
-M7P,``````,!9`````````0````$```!`8`,```````!:`````````0````$`
-M``!08@,``````"!:`````````0````$```"P8@,``````$!:`````````0``
-M``$````08P,``````'A:`````````0````$```#`8P,``````)A:````````
-M`0````$````@9`,``````+A:`````````0````$```!@9`,``````-A:````
-M`````0````$```"@9`,``````!A;`````````0````$````0:@,``````#A;
-M`````````0````$```!P:@,``````%A;`````````0````$```#`:@,`````
-M`)!;`````````0````$````@:P,``````*A;`````````0````$```!`:P,`
-M`````,!;`````````0````$```!@:P,``````.!;`````````0````$```!0
-M;`,``````/A;`````````0````$```!P;`,``````!!<`````````0````$`
-M``"@;`,``````#!<`````````0````$````P;0,``````'!<`````````0``
-M``$```!@;@,``````)A<`````````0````$```!0;P,``````-!<````````
-M`0````$```"`<`,``````!!=`````````0````$````P<0,``````"A=````
-M`````0````$```!P<@,``````$!=`````````0````$```"`<@,``````%A=
-M`````````0````$```"0<@,``````'!=`````````0````$```"P<@,`````
-M`(A=`````````0````$```#0<@,``````*!=`````````0````$`````<P,`
-M`````+A=`````````0````$````P<P,``````.!=`````````0````$```!P
-M=`,``````/A=`````````0````$```"P=`,``````"!>`````````0````$`
-M``!0=0,``````#A>`````````0````$```"P=0,``````%!>`````````0``
-M``$```#0=0,``````'!>`````````0````$```#0>0,``````)!>````````
-M`0````$````P>P,``````,A>`````````0````$```#@?`,``````.!>````
-M`````0````$````P?0,``````/A>`````````0````$```!0?0,``````"!?
-M`````````0````$```#`?0,``````$A?`````````0````$```#0@`,`````
-M`'!?`````````0````$```"`@0,``````)A?`````````0````$`````@@,`
-M`````-A?`````````0````$```#0@@,``````/A?`````````0````$```!0
-M@P,``````!A@`````````0````$````0A`,``````%A@`````````0````$`
-M``"0AP,``````'!@`````````0````$```"@AP,``````(A@`````````0``
-M``$```#PAP,``````*!@`````````0````$`````B`,``````+A@````````
-M`0````$````0B`,``````-!@`````````0````$````@B`,``````.A@````
-M`````0````$```"@B`,```````!A`````````0````$```!`B0,``````!AA
-M`````````0````$```!0B0,``````#!A`````````0````$```!@B0,`````
-M`$AA`````````0````$```"PB0,``````&!A`````````0````$```#`B0,`
-M`````'AA`````````0````$```#`B@,``````)!A`````````0````$`````
-MBP,``````+!A`````````0````$```!`BP,``````,AA`````````0````$`
-M``!@BP,``````.!A`````````0````$```#`BP,``````/AA`````````0``
-M``$````@C`,``````!AB`````````0````$```!`C`,``````$!B````````
-M`0````$````@C0,``````(!B`````````0````$```!@DP,``````*!B````
-M`````0````$```#0DP,``````,!B`````````0````$````@E`,``````.!B
-M`````````0````$```!`E`,```````!C`````````0````$```!@E`,`````
-M`"!C`````````0````$```"`E`,``````$AC`````````0````$````0E@,`
-M`````'!C`````````0````$```#PF@,``````)AC`````````0````$````P
-MGP,``````,!C`````````0````$`````H`,``````.AC`````````0````$`
-M``"@H0,```````AD`````````0````$```"`H@,``````#!D`````````0``
-M``$````0HP,``````%AD`````````0````$```#PHP,``````'AD````````
-M`0````$````0I`,``````+AD`````````0````$````0IP,``````.!D````
-M`````0````$```#`IP,```````AE`````````0````$```!@JP,``````#!E
-M`````````0````$```#@K`,``````%AE`````````0````$````@K@,`````
-M`)AE`````````0````$````0M`,``````+AE`````````0````$```"PM`,`
-M`````.AE`````````0````$```#@O0,``````"AF`````````0````$```!@
-MP@,``````%!F`````````0````$```"PQ`,``````(AF`````````0````$`
-M``#`R`,``````+AF`````````0````$```#@S`,``````.!F`````````0``
-M``$```#@T`,```````AG`````````0````$```!`TP,``````#!G````````
-M`0````$````@V@,``````%AG`````````0````$```"PW`,``````+!G````
-M`````0````$```#PWP,``````,AG`````````0````$````0X`,``````.!G
-M`````````0````$````@X`,``````/AG`````````0````$```!0X`,`````
-M`!!H`````````0````$```!@X`,``````#AH`````````0````$```#@X`,`
-M`````&!H`````````0````$```"PX0,``````'AH`````````0````$```#@
-MX0,``````*!H`````````0````$````PX@,``````+AH`````````0````$`
-M``!PX@,``````-!H`````````0````$```"@X@,``````.AH`````````0``
-M``$```#@X@,```````AI`````````0````$````0XP,``````"!I````````
-M`0````$````@XP,``````#AI`````````0````$````PXP,``````%!I````
-M`````0````$```!@XP,``````&AI`````````0````$```"@XP,``````(!I
-M`````````0````$`````Y`,``````*AI`````````0````$```"0Y`,`````
-M`-!I`````````0````$```#PY`,```````AJ`````````0````$```#0Y0,`
-M`````#!J`````````0````$```"@Y@,``````%AJ`````````0````$````@
-MYP,``````(!J`````````0````$```"`YP,``````*AJ`````````0````$`
-M``!@Z`,``````-AJ`````````0````$```!@Z0,``````/AJ`````````0``
-M``$```#`Z0,``````"!K`````````0````$````@Z@,``````#AK````````
-M`0````$````PZ@,``````%!K`````````0````$```!0Z@,``````&AK````
-M`````0````$```!PZ@,``````*!K`````````0````$```#@[`,``````.!K
-M`````````0````$```!`[@,``````!!L`````````0````$```!`[P,`````
-M`#AL`````````0````$```#@[P,``````&AL`````````0````$```"`\`,`
-M`````*AL`````````0````$```#@\0,``````.!L`````````0````$```"P
-M\P,```````AM`````````0````$```!P]`,``````#!M`````````0````$`
-M``#P]0,``````'!M`````````0````$```#P]@,``````(AM`````````0``
-M``$````P]P,``````*!M`````````0````$```!0]P,``````+AM````````
-M`0````$```"`]P,``````-!M`````````0````$```#`]P,``````.AM````
-M`````0````$`````^`,```````!N`````````0````$```!`^`,``````!AN
-M`````````0````$```"P^`,``````#!N`````````0````$```!P^0,`````
-M`$AN`````````0````$```"`^0,``````'!N`````````0````$```#0^0,`
-M`````)!N`````````0````$```!0^@,``````+!N`````````0````$````0
-M^P,``````-!N`````````0````$```!P^P,``````/AN`````````0````$`
-M```@_`,``````!!O`````````0````$````P_`,``````#!O`````````0``
-M``$```"`_`,``````%AO`````````0````$```#P_`,``````'AO````````
-M`0````$```!P_0,``````)!O`````````0````$```"P_0,``````+!O````
-M`````0````$`````_@,``````-AO`````````0````$```!@_@,```````AP
-M`````````0````$```"@`00``````#!P`````````0````$````0`@0`````
-M`%AP`````````0````$``````P0``````'AP`````````0````$```!``P0`
-M`````*!P`````````0````$```!`!00``````,!P`````````0````$```"0
-M!00``````.AP`````````0````$````@!P0``````!!Q`````````0````$`
-M``"`"00``````#!Q`````````0````$```#@"00``````&!Q`````````0``
-M``$```"@%`0``````*!Q`````````0````$```"0%@0``````,!Q````````
-M`0````$```#@%@0``````.AQ`````````0````$```#@%P0``````!AR````
-M`````0````$```!0&00``````$AR`````````0````$```#@&@0``````&AR
-M`````````0````$```!P&P0``````)!R`````````0````$```#@&P0`````
-M`,AR`````````0````$````P'@0``````/!R`````````0````$```#0'@0`
-M`````!AS`````````0````$````0(`0``````$!S`````````0````$````0
-M(00``````(!S`````````0````$```"0(@0``````)AS`````````0````$`
-M``#P(@0``````+!S`````````0````$````0(P0``````,AS`````````0``
-M``$```!@(P0```````AT`````````0````$````@)`0``````$AT````````
-M`0````$````P)00``````'AT`````````0````$```"0)00``````+AT````
-M`````0````$```#P)@0``````-!T`````````0````$```!0)P0``````.AT
-M`````````0````$```#P)P0```````!U`````````0````$```#0*`0`````
-M`!AU`````````0````$```#@*00``````#!U`````````0````$````P*@0`
-M`````$AU`````````0````$```"P*@0``````(AU`````````0````$```!`
-M+P0``````*!U`````````0````$```!0+P0``````+AU`````````0````$`
-M``#@+P0``````-AU`````````0````$```!@,`0```````!V`````````0``
-M``$```"@,`0``````!AV`````````0````$```"`,00``````$!V````````
-M`0````$````0,@0``````'!V`````````0````$```"`,@0``````(AV````
-M`````0````$`````,P0``````*!V`````````0````$````@,P0``````+AV
-M`````````0````$```!`,P0``````-!V`````````0````$```!@,P0`````
-M`.AV`````````0````$```"`,P0```````!W`````````0````$```"@,P0`
-M`````!AW`````````0````$```#`,P0``````#!W`````````0````$```#@
-M,P0``````$AW`````````0````$`````-`0``````&!W`````````0````$`
-M```@-`0``````'AW`````````0````$```!`-`0``````)!W`````````0``
-M``$```!@-`0``````*AW`````````0````$```"`-`0``````,!W````````
-M`0````$```"@-`0``````-AW`````````0````$```#`-`0``````/!W````
-M`````0````$```#@-`0```````AX`````````0````$````0-00``````"!X
-M`````````0````$```!`-00``````$!X`````````0````$```"`-00`````
-M`&!X`````````0````$```#`-00``````(!X`````````0````$`````-@0`
-M`````*!X`````````0````$```!P-@0``````,!X`````````0````$```#@
-M-@0``````.AX`````````0````$```!P-P0``````!!Y`````````0````$`
-M``!`.`0``````#AY`````````0````$```#P.`0``````%!Y`````````0``
-M``$````0.00``````&AY`````````0````$```!0.00``````)!Y````````
-M`0````$`````.@0``````+AY`````````0````$```#`.@0``````.!Y````
-M`````0````$```"0.P0```````AZ`````````0````$```!P/`0``````"!Z
-M`````````0````$```"0/`0``````$!Z`````````0````$`````/00`````
-M`&!Z`````````0````$```!P/00``````(!Z`````````0````$```#@/00`
-M`````*!Z`````````0````$```!`/@0``````,!Z`````````0````$```"@
-M/@0``````.!Z`````````0````$`````/P0```````![`````````0````$`
-M``"0/P0``````"![`````````0````$`````0`0``````$![`````````0``
-M``$```!P0`0``````&A[`````````0````$````P000``````(A[````````
-M`0````$```"@000``````*A[`````````0````$````00@0``````,A[````
-M`````0````$```"`0@0``````.A[`````````0````$```#P0@0```````!\
-M`````````0````$````00P0``````!A\`````````0````$````P0P0`````
-M`#!\`````````0````$```!00P0``````%!\`````````0````$````01`0`
-M`````'!\`````````0````$```#01`0``````)!\`````````0````$````P
-M100``````+A\`````````0````$```#@100``````.!\`````````0````$`
-M``"01@0```````!]`````````0````$```#P1@0``````!A]`````````0``
-M``$````@1P0``````#A]`````````0````$```"`1P0``````%A]````````
-M`0````$````P2`0``````'!]`````````0````$```!P2`0``````)!]````
-M`````0````$````P200``````+!]`````````0````$```#0200``````-A]
-M`````````0````$```#@2@0``````/!]`````````0````$```!02P0`````
-M`!!^`````````0````$```"P2P0``````"A^`````````0````$```#`2P0`
-M`````$A^`````````0````$```#`3`0``````&!^`````````0````$```#0
-M3`0``````'A^`````````0````$````@300``````)A^`````````0````$`
-M``"0300``````,!^`````````0````$```!@3@0``````.A^`````````0``
-M``$````03P0``````!A_`````````0````$````P4`0``````$A_````````
-M`0````$```!`400``````&A_`````````0````$```!P400``````(!_````
-M`````0````$```#P400``````)A_`````````0````$````P4@0``````+!_
-M`````````0````$```!P4@0``````,A_`````````0````$```"P4@0`````
-M`.!_`````````0````$```#P4@0``````/A_`````````0````$````P4P0`
-M`````!"``````````0````$```!P4P0``````"B``````````0````$```"P
-M4P0``````$"``````````0````$```#P4P0``````%B``````````0````$`
-M```P5`0``````'"``````````0````$```!P5`0``````(B``````````0``
-M``$```"P5`0``````*"``````````0````$```#P5`0``````+B`````````
-M`0````$````P500``````-"``````````0````$```!P500``````.B`````
-M`````0````$```"P500```````"!`````````0````$```#P500``````!B!
-M`````````0````$````P5@0``````#"!`````````0````$```!P5@0`````
-M`$B!`````````0````$```"P5@0``````&"!`````````0````$```#P5@0`
-M`````'B!`````````0````$````@5P0``````)"!`````````0````$```!0
-M5P0``````+"!`````````0````$`````6`0``````,B!`````````0````$`
-M``!`6`0``````/"!`````````0````$````0600``````!""`````````0``
-M``$```!@600``````$""`````````0````$```!P6@0``````&""````````
-M`0````$```#`6@0``````)""`````````0````$```!@7`0``````-""````
-M`````0````$```#P700```````B#`````````0````$```#07@0``````"B#
-M`````````0````$```!@7P0``````%B#`````````0````$```"`800`````
-M`'"#`````````0````$```"P800``````+"#`````````0````$```"`8@0`
-M`````,B#`````````0````$````P8P0``````/"#`````````0````$```#P
-M8P0``````!B$`````````0````$```!P9`0``````$"$`````````0````$`
-M```P900``````&B$`````````0````$```#@900``````(B$`````````0``
-M``$```"`9@0``````+"$`````````0````$```!P9P0``````/"$````````
-M`0````$```!0:`0``````#"%`````````0````$```!0:00``````'"%````
-M`````0````$```!`:@0``````+"%`````````0````$````P:P0``````/"%
-M`````````0````$````@;`0``````""&`````````0````$```#`;`0`````
-M`$"&`````````0````$````0;00``````&B&`````````0````$```#`;00`
-M`````(B&`````````0````$````0;@0``````+"&`````````0````$````P
-M;P0``````,B&`````````0````$```!@;P0```````"'`````````0````$`
-M```P<`0``````"B'`````````0````$```#0<00``````$"'`````````0``
-M``$```#@<00``````&"'`````````0````$`````<@0``````("'````````
-M`0````$````@<@0``````*"'`````````0````$```!0<@0``````-"'````
-M`````0````$```#0<@0``````/"'`````````0````$```#P<@0``````!"(
-M`````````0````$```"`<P0``````#"(`````````0````$```#0<P0`````
-M`%"(`````````0````$```#P<P0``````'"(`````````0````$````0=`0`
-M`````)"(`````````0````$```!P=`0``````+B(`````````0````$```"P
-M=`0``````."(`````````0````$```#P=`0```````B)`````````0````$`
-M```P=00``````#")`````````0````$```!P=00``````%B)`````````0``
-M``$```"P=00``````(")`````````0````$```#P=00``````*B)````````
-M`0````$```!@=@0``````.B)`````````0````$```"@=P0``````!"*````
-M`````0````$```#0>@0``````#"*`````````0````$```#P>@0``````%"*
-M`````````0````$````0>P0``````'B*`````````0````$```!@?`0`````
-M`*"*`````````0````$```#0?`0``````,B*`````````0````$```"@?@0`
-M``````B+`````````0````$```"0@00``````#B+`````````0````$````@
-M@P0``````&B+`````````0````$```!PA`0``````)"+`````````0````$`
-M````A00``````+"+`````````0````$```!`A00``````-"+`````````0``
-M``$```"`A00``````/"+`````````0````$```!@B`0```````B,````````
-M`0````$```#PB00``````"",`````````0````$````@B@0``````$",````
-M`````0````$```!`BP0``````'",`````````0````$```#0DP0``````)B,
-M`````````0````$```"@E@0``````-",`````````0````$```"`EP0`````
-M`/B,`````````0````$```#@F@0``````""-`````````0````$```#`FP0`
-M`````$"-`````````0````$````PG`0``````("-`````````0````$```#@
-MG00``````*B-`````````0````$```!PGP0``````.B-`````````0````$`
-M``#`K@0``````!".`````````0````$````PKP0``````#B.`````````0``
-M``$```!`L`0``````&".`````````0````$```"0L`0``````)".````````
-M`0````$```!0L00``````,".`````````0````$```"0LP0``````/".````
-M`````0````$```"@M@0``````!B/`````````0````$```"PN`0``````$B/
-M`````````0````$```!0N00``````&B/`````````0````$```"PN00`````
-M`(B/`````````0````$````0N@0``````*B/`````````0````$````@O`0`
-M`````-B/`````````0````$````@PP0```````B0`````````0````$````P
-MQP0``````#"0`````````0````$```"`QP0``````%B0`````````0````$`
-M````R`0``````("0`````````0````$```"`R`0``````*B0`````````0``
-M``$```#0R`0``````-"0`````````0````$```!0R00``````/B0````````
-M`0````$```#0R00``````"B1`````````0````$```!@R@0``````%"1````
-M`````0````$```#`R@0``````'B1`````````0````$```"PRP0``````*"1
-M`````````0````$```"PS`0``````,"1`````````0````$```!0S00`````
-M`.B1`````````0````$````@S@0```````B2`````````0````$```!0S@0`
-M`````$"2`````````0````$````PSP0``````("2`````````0````$```"`
-MT`0``````*B2`````````0````$```!`T@0``````."2`````````0````$`
-M``!@TP0```````"3`````````0````$```"@TP0``````#B3`````````0``
-M``$```#@U`0``````%"3`````````0````$```#PU`0``````'B3````````
-M`0````$````@U@0``````*"3`````````0````$```"@U@0``````,B3````
-M`````0````$````PUP0``````/B3`````````0````$```#`UP0``````""4
-M`````````0````$```!0V`0``````&"4`````````0````$```!`VP0`````
-M`)B4`````````0````$````@W00``````-"4`````````0````$```#PW@0`
-M``````"5`````````0````$```!@X@0``````"B5`````````0````$```!@
-MXP0``````%B5`````````0````$````0Y`0``````("5`````````0````$`
-M``"`Y@0``````*B5`````````0````$```"@Z@0``````,"5`````````0``
-M``$```#@Z@0``````."5`````````0````$````PZP0```````B6````````
-M`0````$```"0[`0``````$B6`````````0````$```"@[00``````&"6````
-M`````0````$```"`[@0``````("6`````````0````$`````[P0``````)B6
-M`````````0````$```!P[P0``````+"6`````````0````$```"0[P0`````
-M`,B6`````````0````$```"@[P0``````.B6`````````0````$```#P[P0`
-M`````!"7`````````0````$```!P\`0``````$"7`````````0````$```"0
-M\00``````'"7`````````0````$```"@]00``````)"7`````````0````$`
-M````]@0``````+B7`````````0````$```#@]@0``````/B7`````````0``
-M``$```!0^@0``````#"8`````````0````$```"0^@0``````$B8````````
-M`0````$```"P^@0``````'B8`````````0````$```"P^P0``````)"8````
-M`````0````$```#P^P0``````*B8`````````0````$```!@_`0``````-B8
-M`````````0````$```!0_00``````/B8`````````0````$```"P_00`````
-M`""9`````````0````$```"0_@0``````$"9`````````0````$````P_P0`
-M`````("9`````````0````$```!0`04``````+B9`````````0````$````P
-M!04``````."9`````````0````$```"@!04```````B:`````````0````$`
-M```P!@4``````#B:`````````0````$```"`"`4``````%B:`````````0``
-M``$````@"04``````(":`````````0````$```"0"@4``````+":````````
-M`0````$```!0$@4``````/":`````````0````$```#@%`4```````B;````
-M`````0````$```!`%04``````"";`````````0````$```!0%04``````#B;
-M`````````0````$```!P%04``````%";`````````0````$```"`%04`````
-M`'B;`````````0````$```!P%@4``````*";`````````0````$```"P%@4`
-M`````,";`````````0````$`````%P4``````.";`````````0````$```!@
-M%P4``````/B;`````````0````$```!P%P4``````"B<`````````0````$`
-B``"`%P4``````$"<`````````0````$```#0%P4`````````
+M7V9I;F1?=&%R9V5T`&AP=&YR7V1E8G5G7V9L86<`:'!T;G)?9&UA<&]O;%]R
+M96=I<W1E<E]C;&EE;G0`:'!T;G)?;&1M7VEN:71I86QI>F5?=F)U<U]A<WEN
+M8P!H<'1N<E]O<U]Q=65R>5]T:6UE`&AP=&YR7V]S7W%U97)Y7W)E;6]V95]D
+M979I8V4`:'!T;G)?;&1M7W)E9VES=&5R7V1E=FEC90!H<'1N<E]O<U]P8VE?
+M<F5A9&P`:'!T;G)?;&1M7V%C<75I<F5?;&]C:P!H<'1N<E]O<U]R979A;&ED
+M871E7V1E=FEC90!H<'1N<E]D;6%P;V]L7VEN:70`:'!T;G)?;&1M7V9I;FES
+M:%]C;60`:'!T;G)?;&1M7VED95]F:7AS=')I;F<`:'!T;G)?9&UA<&]O;%]M
+M87A?8VQA<W-?<&%G97,`:'!T;G)?;&1M7W)E9VES=&5R7W9D979?8VQA<W-?
+M4E\V7S4U7S<U7S0V7S8T`&AP=&YR7VYU;5]D<FEV97-?<&5R7W-P:6YU<`!H
+M<'1N<E]L9&U?<F5L96%S95]V8G5S`&AP=&YR7VQD;5]Q=65U95]T87-K`&AP
+M=&YR7VQD;5]A;&QO8U]C;61S7V9R;VU?;&ES=`!H<'1N<E]F<F5E;&ES=%]P
+M=71?9&UA`&AP=&YR7VQD;5]T:6UE<E]P<F]B95]D979I8V4`:'!T;G)?;&1M
+M7V9I;F1?<W1A;7``:'!T;G)?;&1M7V-H96-K7V%R<F%Y7V]N;&EN90!H<'1N
+M<E]G4')O8F5);DEN:71I86QI>FEN9P!H<'1N<E]L;V=?<V5C=&]R7W)E<&%I
+M<@```(@"`````````@```#H```#\_________U0%````````"P````4`````
+M`````````%X%`````````@```#T"``#\_________Z`%`````````@```!0"
+M``#\_________V0&`````````@```"`"``#\_________XT&`````````@``
+M`"`"``#\_________^T&`````````@```"`"``#\_________V\'````````
+M`@```"`"``#\_________ZD'`````````@```"`"``#\_________PX(````
+M`````@```#("``#\_________TD(`````````@```#("``#\_________Y<(
+M`````````@```#("``#\_________]((`````````@```#("``#\________
+M_R@)`````````@```*\```#\_________S()`````````@```#("``#\____
+M_____SP)`````````@```$P```#\_________Q<*`````````@```"`"``#\
+M_________S0*`````````@```"`"``#\_________T,*`````````@```#("
+M``#\_________U\*`````````@```"`"``#\_________WP*`````````@``
+M`"`"``#\_________ZH*`````````@```"`"``#\_________[0*````````
+M`@```"`"``#\_________]P*`````````@```#("``#\_________^D*````
+M`````@```"`"``#\_________Q$+`````````@```#("``#\_________QX+
+M`````````@```"`"``#\_________T\+`````````@```"`"``#\________
+M_X`+`````````@```"`"``#\_________^4+`````````@```"`"``#\____
+M_____P4,`````````@```"`"``#\_________RP,`````````@```"`"``#\
+M_________TP,`````````@```"`"``#\_________WP,`````````@```"`"
+M``#\_________X8,`````````@```"`"``#\_________[(,`````````@``
+M`#("``#\_________\(,`````````@```"`"``#\_________^H,````````
+M`@```#("``#\__________H,`````````@```"`"``#\_________\40````
+M`````@```#("``#\_________]H0`````````@```"`"``#\_________P81
+M`````````@```#("``#\_________QL1`````````@```"`"``#\________
+M_S81````````"P````4```!8`````````$`1`````````@```#T"``#\____
+M_____X$1`````````@```#("``#\_________Y<1`````````@```"`"``#\
+M_________]01`````````@```#("``#\_________^D1`````````@```"`"
+M``#\_________R<2`````````@```#("``#\_________ST2`````````@``
+M`"`"``#\_________WH2`````````@```#("``#\_________X\2````````
+M`@```"`"``#\_________]T2`````````@```"`"``#\__________(2````
+M````"P````4```"(`````````/P2`````````@```#T"``#\_________PP3
+M`````````@```"`"``#\_________SL3`````````@```"`"``#\________
+M_\03`````````@````T"``#\_________]`3`````````@```)L```#\____
+M_____^L3`````````@```$T```#\_________U,4`````````@```$````#\
+M_________UX4`````````@```"@```#\_________XP4`````````@```!0`
+M``#\_________YX4`````````@```'@```#\_________[P4````````"P``
+M`*,``````````````,L4````````"P````4```"X`````````-44````````
+M`@```#T"``#\_________^L4`````````@```$D"``#\_________P$5````
+M`````@```$D"``#\_________QH5`````````@```"X```#\_________T`5
+M`````````@```"`"``#\_________XP5`````````@```"`"``#\________
+M_P\6`````````@```"`"``#\_________SP6`````````@```"`"``#\____
+M_____U86`````````@```!<```#\_________Z$6`````````@```"`"``#\
+M_________\86`````````@```"`"``#\_________UT7`````````@```"`"
+M``#\_________X(7`````````@```"`"``#\_________Z\7`````````@``
+M``T"``#\_________]$7`````````@```)T```#\_________Q88````````
+M`@```$T```#\_________TT8`````````@```$D"``#\_________V$8````
+M`````@```"\```#\_________W\8`````````@```%\```#\_________XD8
+M`````````@```#("``#\_________[L8````````"P````$```!P/P``````
+M`.X8`````````@```"L"``#\_________Q49`````````@```"`"``#\____
+M_____RH9`````````@```"`"``#\_________U(9`````````@```"`"``#\
+M_________V<9`````````@```"`"``#\_________Y@9`````````@```"`"
+M``#\_________\\9`````````@```"`"``#\_________Q,:`````````@``
+M`"`"``#\_________SP:`````````@```"`"``#\_________V(:````````
+M"P````4```#8`````````&P:`````````@```#T"``#\_________Y,:````
+M`````@```"`"``#\_________\H:`````````@```"`"``#\_________S0;
+M`````````@```"`"``#\_________UD;`````````@```"`"``#\________
+M_WX;`````````@```"`"``#\_________Z,;`````````@```"`"``#\____
+M______<;`````````@```$D"``#\_________R`<`````````@````T"``#\
+M_________S@<````````"P```)8``````````````$P<`````````@```"L"
+M``#\_________V8<````````"P````8``````````````'`<`````````@``
+M`#T"``#\_________Y\<`````````@```"`"``#\_________\4<````````
+M`@```"`"``#\_________^,<`````````@```#("``#\__________@<````
+M`````@```"`"``#\_________R$=`````````@```"`"``#\_________T<=
+M`````````@```"`"``#\_________V4=`````````@```#("``#\________
+M_WH=`````````@```"`"``#\_________YT=`````````@```"`"``#\____
+M_____\P=`````````@```!<```#\_________S`>`````````@```"\```#\
+M_________T\>`````````@```"\```#\_________V0>`````````@```*<`
+M``#\_________SL?`````````@```"\```#\_________U4?`````````@``
+M`"\```#\_________V(?`````````@```$T```#\_________Y,?````````
+M`@```$D"``#\_________Z<?`````````@```"\```#\_________\`?````
+M`````@```)8```#\_________Q<@`````````@```"\```#\_________S$@
+M`````````@```"\```#\_________R4A````````"P````8````=````````
+M`"\A`````````@```#T"``#\_________TDA`````````@```)D```#\____
+M_____XDA`````````@```#D```#\_________^<A`````````@```!,```#\
+M_________SLC`````````@```&T```#\_________^@C`````````@```)\`
+M``#\_________T$D`````````@```'P```#\_________UPD`````````@``
+M`)\```#\_________Q<E`````````@```%X```#\_________RHE````````
+M`@```&L```#\_________WXE`````````@```'<```#\_________YDE````
+M`````@```*@```#\_________Y\E`````````@```%`"``#[_________Z\E
+M`````````@```*T```#\_________\8E`````````@```*@```#\________
+M_],E`````````@```&\```#\_________^,E````````"P````4````(`0``
+M`````.TE`````````@```#T"``#\_________R<F`````````@```$T```#\
+M_________W(F`````````@```&4```#\_________\HF`````````@```&4`
+M``#\_________]<F`````````@```!X```#\__________LF`````````@``
+M`&4```#\_________RLG`````````@```#L```#\_________T4H````````
+M`@```"\```#\_________[4H`````````@```$T```#\_________^8H````
+M`````@```$D"``#\_________QLI`````````@```"\```#\_________R8I
+M`````````@```'D```#\_________ULI`````````@````T"``#\________
+M_W@I````````"P```)8``````````````)<I`````````@```"L"``#\____
+M_____]8I`````````@```"\```#\_________^DI`````````@```$$```#\
+M__________0I`````````@```&@```#\_________VPJ`````````@```'L`
+M``#\_________W<J`````````@```%````#\_________X0J`````````@``
+M`$````#\_________Y$J`````````@```%D```#\_________\<J````````
+M`@```$T```#\_________]8J`````````@```$````#\_________^(J````
+M`````@```%D```#\_________R(K`````````@```$X```#\_________R,L
+M`````````@```%`"``#[_________X`L`````````@```!0"``#\________
+M_Z0L`````````@```"`"``#\_________]TL`````````@```"`"``#\____
+M_____RTM`````````@```"`"``#\_________ULM`````````@```"`"``#\
+M_________]XM````````"P```*,``````````````/8M````````"P````4`
+M```X`0`````````N`````````@```#T"``#\_________RDN````````"P``
+M`*,``````````````$$N````````"P````4````X`0```````$LN````````
+M`@```#T"``#\_________WLN````````"P````4```!X`0```````(4N````
+M`````@```#T"``#\_________Y\N````````"P````4```"X`0```````*DN
+M`````````@```#T"``#\_________\,N`````````@```$````#\________
+M__8N`````````@```"`"``#\_________R(O`````````@```"`"``#\____
+M_____SPO`````````@```"`"``#\_________U<O`````````@```"`"``#\
+M_________W(O````````"P````4```#@`0```````'PO`````````@```#T"
+M``#\_________R<P`````````@```$D```#\_________T8P`````````@``
+M`"`"``#\_________W`P`````````@```"`"``#\_________^DP````````
+M`@```"`"``#\_________PDQ`````````@```"`"``#\_________RXQ````
+M`````@```*X```#\_________YLQ`````````@```"`"``#\_________R<R
+M`````````@```*X```#\_________S8R`````````@```*X```#\________
+M_X4R````````"P````4````@`@```````(\R`````````@```#T"``#\____
+M_____]XR````````"P````8````N`````````.@R`````````@```#T"``#\
+M__________HR`````````@```!H```#\_________QXS````````"P````4`
+M``!@`@```````"@S`````````@```#T"``#\_________]LS`````````@``
+M`!H```#\_________^8S`````````@```"@```#\_________S@T````````
+M`@```$\```#\_________VPT`````````@```$T```#\_________R4U````
+M`````@```$T```#\_________U(U`````````@```"@```#\_________V,U
+M`````````@```&@```#\_________Y4U`````````@```"`"``#\________
+M_\$U`````````@```"`"``#\_________]TU`````````@```"`"``#\____
+M______LU`````````@```"`"``#\_________Q<V`````````@```"`"``#\
+M_________RTV`````````@```(,```#\_________SPV`````````@```',`
+M``#\_________T@V`````````@```',```#\_________UDV`````````@``
+M`(,```#\_________^DV`````````@```"`"``#\_________PTW````````
+M`@```#("``#\_________SXW`````````@```"`"``#\_________V8W````
+M`````@```#("``#\_________YHW`````````@```"`"``#\_________\(W
+M`````````@```#("``#\_________PDX`````````@```'\```#\________
+M_R8X`````````@```&````#\_________S$X`````````@```!$```#\____
+M_____VDX`````````@```#(```#\_________[<X`````````@```"\```#\
+M_________\(X`````````@```!$```#\_________QHY`````````@```$T`
+M``#\_________S@Y`````````@```#0```#\_________T(Y`````````@``
+M`#("``#\_________WXY`````````@```!0```#\_________Y`Y````````
+M`@```'@```#\_________ZXY````````"P```*,``````````````+\Y````
+M````"P````4```"X`````````,DY`````````@```#T"``#\_________]\Y
+M`````````@```$D"``#\__________4Y`````````@```$D"``#\________
+M_PTZ`````````@```"X```#\_________R8Z`````````@```#(```#\____
+M_____[`Z`````````@```"`"``#\_________](Z`````````@```#("``#\
+M__________4Z`````````@```"`"``#\_________Q@[`````````@```"`"
+M``#\_________SH[`````````@```#("``#\_________UX[`````````@``
+M`"`"``#\_________^([`````````@```)T```#\_________^X[````````
+M`@```%@```#\_________S(\`````````@```%,```#\_________S\\````
+M`````@```)X```#\_________W@\`````````@```#("``#\_________Y,\
+M`````````@```"`"``#\_________[(\`````````@```"`"``#\________
+M_]$\`````````@```!$```#\_________]D\`````````@```*P```#\____
+M_____P4]`````````@```&H```#\_________X<]`````````@```$T```#\
+M_________Q8^`````````@```'D```#\_________RT^`````````@```$D"
+M``#\_________T0^`````````@```$D"``#\_________W8^`````````@``
+M`#("``#\_________Y$^`````````@```"`"``#\_________[$^````````
+M`@```"`"``#\_________]`^`````````@```!$```#\_________]@^````
+M`````@```*P```#\_________R`_`````````@```'\```#\_________UH_
+M`````````@```&H```#\_________^$_`````````@```"`"``#\________
+M_Q!``````````@```"`"``#\_________RA``````````@```%(```#\____
+M_____S5``````````@```)X```#\_________[5``````````@```"D```#\
+M_________]M``````````@```#X"``#\__________E``````````@```#X"
+M``#\_________Q=!`````````@```#X"``#\_________SU!`````````@``
+M`#X"``#\_________VA!`````````@```#X"``#\_________X)!````````
+M`@```#X"``#\_________Z!!`````````@```#X"``#\_________[I!````
+M`````@```#X"``#\_________]Q!`````````@```#X"``#\__________E!
+M`````````@```#X"``#\_________Q9"`````````@```#X"``#\________
+M_S-"`````````@```#X"``#\_________T]"`````````@```#X"``#\____
+M_____W-"`````````@```!("``#\_________Y-"`````````@```!("``#\
+M_________[I"`````````@```!("``#\_________]Y"`````````@```!("
+M``#\_________P)#`````````@```!("``#\_________R5#`````````@``
+M`!("``#\_________T5#`````````@```!("``#\_________V]#````````
+M`@```!("``#\_________Z1#`````````@```&@```#\_________U)$````
+M`````@```$T```#\_________X=$`````````@```$D"``#\_________YU$
+M`````````@```"\```#\_________ZM$`````````@```#0```#\________
+M_[5$`````````@```#("``#\_________]]$`````````@```#T```#\____
+M_____R]%`````````@```'L```#\_________T=%`````````@```$T```#\
+M_________X]%````````"P```*,``````````````)Y%````````"P````4`
+M``"(`@```````*A%`````````@```#T"``#\_________]U%````````"P``
+M`*,``````````````.Q%````````"P````4```"(`@```````/9%````````
+M`@```#T"``#\_________R)&`````````@```!H```#\_________T%&````
+M````"P````4```"X`@```````$M&`````````@```#T"``#\_________]Y&
+M`````````@```',```#\_________^I&````````"P````4```#P`@``````
+M`/1&`````````@```#T"``#\_________VU'`````````@```$````#\____
+M_____WE'`````````@```%D```#\_________\E'`````````@```$X```#\
+M_________R5)`````````@```"D```#\_________Z!)`````````@```$`"
+M``#\_________]Q)`````````@```$`"``#\_________Q-*`````````@``
+M`$`"``#\_________TM*`````````@```$`"``#\_________UY*````````
+M`@```$`"``#\_________W1*`````````@```$`"``#\_________]I*````
+M`````@```$`"``#\_________R5+`````````@```$`"``#\_________VA+
+M`````````@```$`"``#\_________[%+`````````@```$`"``#\________
+M_]I+`````````@```(0```#\_________^9+`````````@```$`"``#\____
+M_____P],`````````@```!````#\_________QM,`````````@```$`"``#\
+M_________T1,`````````@```!````#\_________U!,`````````@```$`"
+M``#\_________WE,`````````@```!````#\_________WQ.`````````@``
+M`$P"``#\_________Y9.`````````@```$P"``#\_________[!.````````
+M`@```$P"``#\_________\I.`````````@```$P"``#\_________^1.````
+M`````@```$P"``#\__________Y.`````````@```$P"``#\_________R1/
+M`````````@```$T```#\_________W1/`````````@```$P"``#\________
+M_Y5/`````````@```$T```#\_________^9/`````````@```$P"``#\____
+M_____PI0`````````@```$T```#\_________XU0`````````@```%0```#\
+M_________Z-0`````````@```$T```#\_________^90````````"P````4`
+M```8`P```````/!0`````````@```#T"``#\_________Q-1`````````@``
+M`!H```#\_________S)1````````"P````4```"X`@```````#Q1````````
+M`@```#T"``#\_________W%1````````"P````4````8`P```````'M1````
+M`````@```#T"``#\_________P-2`````````@```',```#\_________P]2
+M````````"P````4```#P`@```````!E2`````````@```#T"``#\________
+M_W=2`````````@```$````#\_________X-2`````````@```%D```#\____
+M_____[M2`````````@```)4```#\_________^)2````````"P````4````8
+M`P```````.Q2`````````@```#T"``#\_________PM6`````````@```"`"
+M``#\_________SY6`````````@```"`"``#\_________W56`````````@``
+M`"`"``#\_________ZI6`````````@```"`"``#\_________]]6````````
+M`@```"`"``#\_________^I6````````"P````4```!``P```````/16````
+M`````@```#T"``#\_________S=7`````````@```"`"``#\_________VI7
+M`````````@```"`"``#\_________YM7`````````@```"`"``#\________
+M_]!7`````````@```"`"``#\_________P18`````````@```"`"``#\____
+M_____P]8````````"P````4```!``P```````!E8`````````@```#T"``#\
+M_________TU8`````````@```$T```#\_________Z-8`````````@```(H`
+M``#\_________]-8`````````@```(H```#\_________P-9`````````@``
+M`)P```#\_________T-9`````````@```)P```#\_________Y!9````````
+M`@```",```#\_________YM9`````````@```%T```#\_________Y1:````
+M`````@```%4```#\_________]E:`````````@```%````#\_________Q=;
+M`````````@```$T```#\_________R);`````````@```!@```#\________
+M_RY;`````````@```%8```#\_________V1;`````````@```#D```#\____
+M_____W1;`````````@```"0```#\_________W!<`````````@```#D```#\
+M_________X!<`````````@```"0```#\__________%<`````````@```'H`
+M``#\_________X%=`````````@```+````#\_________[!=`````````@``
+M`#D```#\_________\!=`````````@```"0```#\_________Q!>````````
+M`@```&D```#\_________UQ>`````````@```*D```#\_________[A>````
+M`````@```(H```#\_________]=>`````````@```%4```#\_________^A>
+M`````````@```*D```#\_________Q9?`````````@````T"``#\________
+M_S9?`````````@````T"``#\_________Z!?`````````@```(H```#\____
+M_____\M?`````````@```%````#\_________]9?`````````@```'L```#\
+M_________XA@`````````@```$T```#\_________YM@`````````@```%0`
+M``#\_________[I@````````"P```*L``````````````-%@`````````@``
+M`"L"``#\_________TIA`````````@```$T```#\_________UUA````````
+M`@```'L```#\_________WAA````````"P```#X``````````````(]A````
+M`````@```"L"``#\_________QEB````````"P````,``````````````"!B
+M````````"P````8````[`````````"IB`````````@```#T"``#\________
+M_S1B`````````@```%D```#\_________T5B`````````@```"P```#\____
+M_____U!B`````````@```&4```#\_________SEC`````````@```$````#\
+M_________T1C`````````@```"@```#\_________Z1C`````````@```$T`
+M``#\_________TAD`````````@```&4```#\_________PYE````````"P``
+M`*L``````````````"5E`````````@```"L"``#\_________[)E````````
+M"P```#X``````````````,EE`````````@```"L"``#\_________RAF````
+M`````@```"\```#\_________S9F`````````@```#0```#\_________T!F
+M`````````@```#("``#\_________V%F`````````@```!0```#\________
+M_W)F`````````@```'@```#\_________X]F````````"P```*,`````````
+M`````*5F````````"P````4```!H`P```````*]F`````````@```#T"``#\
+M_________\1F`````````@```$D"``#\_________T1G`````````@```$D"
+M``#\_________WAG````````"P```*,``````````````(EG````````"P``
+M``8```!1`````````)-G`````````@```#T"``#\_________^IG````````
+M`@```$T```#\_________Q]H`````````@```$D"``#\_________SAH````
+M`````@```"X```#\_________X]H`````````@```(L```#\_________[UH
+M`````````@```$T```#\_________^UH`````````@```$T```#\________
+M_QEI`````````@```"0```#\_________Z!I`````````@```"`"``#\____
+M_____\1I`````````@```"`"``#\__________5J`````````@```&(```#\
+M_________U!K````````"P```"H``````````````%AK`````````@```#$`
+M``#\_________YAK`````````@```&(```#\_________P!L````````"P``
+M``$```!0DP```````!)L`````````@```#$```#\_________SIL````````
+M"P```+(``````````````*-L`````````@```&(```#\_________R5M````
+M`````@```#$```#\_________W]M`````````@```&(```#\_________^AM
+M`````````@```#$```#\_________UEN`````````@```#("``#\________
+M_VMN`````````@```"`"``#\_________Y-N`````````@```#("``#\____
+M_____Z5N`````````@```"`"``#\_________UQO`````````@```#("``#\
+M_________W%O`````````@```#0```#\_________]MO`````````@```"`"
+M``#\__________IO`````````@```"`"``#\_________Q9P`````````@``
+M`"8```#\_________]YR`````````@```#("``#\_________^MR````````
+M`@```"`"``#\_________P!S`````````@```#("``#\_________PIS````
+M`````@```"`"``#\_________\YS`````````@```#("``#\_________]MS
+M`````````@```"`"``#\__________!S`````````@```#("``#\________
+M__IS`````````@```"`"``#\_________Y=T`````````@```(P```#\____
+M_____\!T`````````@```*0```#\_________\AT`````````@```(4```#\
+M_________P]U`````````@```"`"``#\_________R]U`````````@```"`"
+M``#\_________TMU`````````@```"`"``#\_________WUU`````````@``
+M`"`"``#\_________^!U`````````@```#("``#\__________!U````````
+M`@```"`"``#\_________Q5V`````````@```#("``#\_________R5V````
+M`````@```"`"``#\_________R]W`````````@```#("``#\_________SYW
+M`````````@```"`"``#\_________U!W`````````@```#("``#\________
+M_UAW`````````@```"`"``#\_________W=W`````````@```#("``#\____
+M_____W]W`````````@```"`"``#\_________ZEW`````````@```#("``#\
+M_________[AW`````````@```"`"``#\_________\IW`````````@```#("
+M``#\_________])W`````````@```"`"``#\__________%W`````````@``
+M`#("``#\__________EW`````````@```"`"``#\_________SYX````````
+M`@```#("``#\_________VIX````````"P````4```"0`P```````'1X````
+M`````@```#T"``#\_________\EY`````````@```'(```#\_________^1Y
+M`````````@```'(```#\_________UYZ`````````@```+<```#\________
+M_Z![`````````@```#("``#\_________\M[`````````@```#("``#\____
+M_____UY\`````````@```*8```#\_________VU\`````````@```*8```#\
+M__________-\`````````@```"`"``#\_________R%]`````````@```"`"
+M``#\_________U)]`````````@```#("``#\_________VI]`````````@``
+M`"`"``#\_________[A]`````````@```"`"``#\_________Q]^````````
+M`@```"`"``#\_________Y)^`````````@```"`"``#\_________T5_````
+M`````@```#("``#\_________UA_`````````@```"`"``#\_________W1_
+M`````````@```#\```#\_________WY_`````````@```$P```#\________
+M_Y!_`````````@```#("``#\_________ZI_`````````@```#("``#\____
+M_____\1_`````````@```#("``#\_________^-_`````````@```%\```#\
+M__________1_`````````@```"`"``#\_________SR``````````@```#("
+M``#\_________T^``````````@```"`"``#\_________VN``````````@``
+M`#\```#\_________W6``````````@```$P```#\_________X>`````````
+M`@```#("``#\_________Z&``````````@```#("``#\_________[N`````
+M`````@```#("``#\_________]J``````````@```%\```#\_________^N`
+M`````````@```"`"``#\_________P^!`````````@```#("``#\________
+M_QF!`````````@```!$```#\_________SB!`````````@```*P```#\____
+M_____T6!`````````@```"`"``#\_________V"!`````````@```"`"``#\
+M_________WB!`````````@```"`"``#\_________VB"`````````@```"`"
+M``#\__________N"`````````@```&(```#\_________QF#`````````@``
+M`&8```#\_________S6#`````````@```"8```#\_________YN#````````
+M"P````$```!0DP```````*B#`````````@```)0```#\_________[>#````
+M`````@```'8```#\_________\*#`````````@```#$```#\_________WJ$
+M`````````@```&P```#\_________TN%`````````@```+0```#\________
+M_[Z%`````````@```$T```#\_________WV&`````````@```(\```#\____
+M_____RV'`````````@```$T```#\_________ZJ'`````````@```(\```#\
+M_________TB(`````````@```$D"``#\_________U^(`````````@```$D"
+M``#\_________Y&(`````````@```(\```#\_________P&)`````````@``
+M`$D"``#\_________U")`````````@```$D"``#\_________Y&)````````
+M`@```"\```#\_________Z2)`````````@```#0```#\_________ZZ)````
+M`````@```#("``#\_________\^)`````````@```!0```#\_________^")
+M`````````@```'@```#\__________.)````````"P````8```!O````````
+M`/V)`````````@```#T"``#\_________Q.*`````````@```$D"``#\____
+M_____R2*````````"P````8```!O`````````"Z*`````````@```#T"``#\
+M_________T2*`````````@```$D"``#\_________Y"*`````````@```$D"
+M``#\_________]B*`````````@```"X```#\__________2*`````````@``
+M`$D"``#\_________W.,`````````@```%,```#\_________WV,````````
+M`@```#("``#\_________YF,`````````@```%,```#\_________Z.,````
+M`````@```#("``#\_________S:-`````````@```"`"``#\_________TV-
+M`````````@```"`"``#\_________XR-`````````@```#("``#\________
+M_Z6-`````````@```'D```#\_________\*-`````````@```(D```#\____
+M_____]>-`````````@```(D```#\_________^6-`````````@```#("``#\
+M_________Q2.`````````@```"`"``#\_________SN.`````````@```"`"
+M``#\_________W6.````````"P```*,``````````````(2.````````"P``
+M``4```#``P```````(Z.`````````@```#T"``#\_________YZ.````````
+M`@```&(```#\__________2.````````"P````$```!0DP```````/^.````
+M`````@```#$```#\_________RN/````````"P```*,``````````````#J/
+M````````"P````4`````!````````$2/`````````@```#T"``#\________
+M_U2/`````````@```&(```#\_________Z./````````"P````$```!0DP``
+M`````*Z/`````````@```#$```#\_________]:/`````````@```&(```#\
+M_________RR0````````"P````$```!0DP```````#>0`````````@```#$`
+M``#\_________TV0`````````@```&(```#\_________Z.0````````"P``
+M``$```!0DP```````*Z0`````````@```#$```#\_________\20````````
+M`@```&(```#\_________Q.1````````"P````$```!0DP```````!Z1````
+M`````@```#$```#\_________SB1`````````@```&(```#\_________X>1
+M````````"P````$```!0DP```````)*1`````````@```#$```#\________
+M_ZB1`````````@```&(```#\_________P*2````````"P````$```!0DP``
+M``````V2`````````@```#$```#\_________SF2`````````@```$$```#\
+M_________VR2`````````@```*<```#\_________X22`````````@```$T`
+M``#\_________]:2`````````@```'D```#\__________^2`````````@``
+M`+0```#\_________Z*4````````"P```*,``````````````,&4````````
+M"P````4````H!````````,N4`````````@```#T"``#\_________PF5````
+M`````@```#("``#\_________VR5`````````@```(X```#\__________25
+M````````"P```*,```````````````R6````````"P````4```!@!```````
+M`!:6`````````@```#T"``#\_________SV6`````````@```#("``#\____
+M_____P>7`````````@```'D```#\_________QJ7`````````@```",```#\
+M_________R67`````````@```"8```#\_________VF7````````"P```'0`
+M`````````````'"7````````"P```+D``````````````(F7````````"P``
+M``,````@`````````+Z7````````"P```'0``````````````-N7````````
+M`@```(T```#\_________^R7````````"P```'0```````````````F8````
+M`````@```(T```#\_________QJ8````````"P```'0``````````````#>8
+M`````````@```(T```#\_________TB8````````"P```'0`````````````
+M`&68`````````@```(T```#\_________W:8````````"P```'0`````````
+M`````)*8`````````@```(T```#\_________Z.8````````"P```'0`````
+M`````````,"8`````````@```(T```#\_________]&8````````"P```'0`
+M`````````````.Z8`````````@```(T```#\__________^8````````"P``
+M`'0``````````````!R9`````````@```(T```#\_________T:9````````
+M`@```(T```#\_________V*9````````"P```'0``````````````'^9````
+M`````@```(T```#\_________["9````````"P```*,``````````````,.9
+M````````"P````4```"8!````````,V9`````````@```#T"``#\________
+M_^29````````"P```'0``````````````/.9`````````@```!T```#\____
+M_____PV:````````"P```'0``````````````!R:`````````@```!T```#\
+M_________U2:`````````@````T"``#\_________VF:````````"P```!8`
+M`````````````'V:`````````@```"L"``#\_________R&;`````````@``
+M`*<```#\_________S*;````````"P```+D``````````````$^;````````
+M`@```(T```#\_________V";````````"P```+D``````````````'V;````
+M`````@```(T```#\_________XZ;````````"P```+D``````````````*N;
+M`````````@```(T```#\_________]F;`````````@```'D```#\________
+M_P6<`````````@```*<```#\_________S.<`````````@```+0```#\____
+M_____[:<````````"P```*,``````````````,F<````````"P````4```#(
+M!````````-.<`````````@```#T"``#\_________^.<`````````@```*<`
+M``#\_________PF=`````````@````T"``#\_________QZ=````````"P``
+M`!8``````````````#*=`````````@```"L"``#\_________U*>````````
+M"P````4```#X!````````%R>`````````@```#T"``#\_________X2>````
+M`````@```$$```#\_________Y^>`````````@```",```#\_________ZJ>
+M`````````@```"8```#\_________\V>`````````@```+0```#\________
+M__6>`````````@```"`"``#\_________QB?`````````@```"`"``#\____
+M_____SN?`````````@```"`"``#\_________UZ?`````````@```"`"``#\
+M_________W&@`````````@```$$```#\_________WR@`````````@```"8`
+M``#\_________X>@`````````@```*<```#\_________ZN@`````````@``
+M`*<```#\_________\^@`````````@```*<```#\_________^^@````````
+M`@```*<```#\_________PVA`````````@```)T```#\_________SFA````
+M`````@```+0```#\_________U:A`````````@```%@```#\_________YJA
+M`````````@```%,```#\_________\^A`````````@```(D```#\________
+M_]VA`````````@```#("``#\_________RVB`````````@```"X```#\____
+M_____T2B`````````@```'$```#\_________W2B`````````@```*<```#\
+M_________Y:B`````````@````T"``#\_________Z*B`````````@```)L`
+M``#\_________[BB`````````@```$T```#\_________]JB`````````@``
+M`!0```#\_________^NB`````````@```'@```#\_________P&C````````
+M`@```$D"``#\_________Q:C`````````@```$D"``#\_________RVC````
+M`````@```"X```#\_________TZC`````````@```$T```#\_________U^C
+M`````````@```%@```#\_________Z"C`````````@```'D```#\________
+M_S^D`````````@```"8```#\_________Z"D````````"P````4````P!0``
+M`````*JD`````````@```#T"``#\_________\JD`````````@```"X```#\
+M_________]6D`````````@```"8```#\_________Q.E`````````@```)X`
+M``#\_________U"E`````````@```#("``#\_________UNE`````````@``
+M`"8```#\_________W"E`````````@```%,```#\_________WRE````````
+M`@```#("``#\_________X>E`````````@```"8```#\_________Y*E````
+M`````@```%$```#\_________["F`````````@```",```#\_________[NF
+M`````````@```"8```#\__________FF````````"P```*,`````````````
+M``^G````````"P````4```"(!0```````!FG`````````@```#T"``#\____
+M_____R>G`````````@```$$```#\_________S:G`````````@```*<```#\
+M_________VVG````````"P````4```#X!````````'>G`````````@```#T"
+M``#\_________YJG`````````@```$$```#\_________\6G`````````@``
+M`+0```#\_________PBH`````````@```"`"``#\_________RNH````````
+M`@```"`"``#\_________TZH`````````@```"`"``#\_________W&H````
+M`````@```"`"``#\_________X>H````````"P````,```#X`````````#:I
+M`````````@```",```#\_________T&I`````````@```"8```#\________
+M_U:I````````"P```(@``````````````&ZI`````````@```"L"``#\____
+M_____XNI`````````@````T"``#\_________Y:I`````````@```"8```#\
+M_________ZNI````````"P```),``````````````+^I`````````@```"L"
+M``#\_________S>J`````````@```#("``#\_________XZJ`````````@``
+M`%@```#\_________ZFJ`````````@```",```#\_________[2J````````
+M`@```"8```#\_________Q&K`````````@````T"``#\_________R:K````
+M````"P```$L``````````````#JK`````````@```"L"``#\_________TVK
+M`````````@```",```#\_________UBK`````````@```"8```#\________
+M_W&K`````````@```",```#\_________WRK`````````@```"8```#\____
+M_____X>K`````````@```*<```#\_________\BK`````````@```"`"``#\
+M_________^2M`````````@```(8```#\__________&M`````````@```"<`
+M``#\_________S:N`````````@```(````#\_________WFN`````````@``
+M`!P```#\_________ZJN`````````@```'\```#\_________P:O````````
+M`@```#("``#\_________V6T`````````@````L````<`````````'&T````
+M````"P````L````@`````````'ZT`````````@```#,```#\_________\:T
+M`````````@```$@```#\_________[.U`````````@```#<```#\________
+M_^JU`````````@```'\```#\__________BV`````````@```#("``#\____
+M_____^.W`````````@````L````>`````````/"W````````"P````L````@
+M`````````/JW`````````@```#,```#\_________SNX`````````@````L`
+M```>`````````$BX````````"P````L````@`````````%*X`````````@``
+M`#,```#\_________].X`````````@```"`"``#\_________R&Y````````
+M`@```"`"``#\_________SFY`````````@```"(```#\_________TNY````
+M`````@```"(```#\_________UVY`````````@```"(```#\_________V^Y
+M`````````@```"(```#\_________X&Y`````````@```"(```#\________
+M_Y.Y`````````@```"(```#\_________Z6Y`````````@```"(```#\____
+M_____[>Y`````````@```"(```#\_________\FY`````````@```"(```#\
+M_________]NY`````````@```"(```#\_________^VY`````````@```"(`
+M``#\__________^Y`````````@```"(```#\_________Q&Z`````````@``
+M`"(```#\_________R.Z`````````@```"(```#\_________S6Z````````
+M`@```"(```#\_________T>Z`````````@```"(```#\_________UFZ````
+M`````@```"(```#\_________VNZ`````````@```"(```#\_________WVZ
+M`````````@```"(```#\_________X^Z`````````@```"(```#\________
+M_Z&Z`````````@```"(```#\_________[.Z`````````@```"(```#\____
+M_____\6Z`````````@```"(```#\_________]>Z`````````@```"(```#\
+M_________^FZ`````````@```"(```#\__________NZ`````````@```"(`
+M``#\_________V.[`````````@```"`"``#\_________X.[`````````@``
+M`"`"``#\_________P6\`````````@```"(```#\_________QJ\````````
+M`@```"(```#\_________R^\`````````@```"(```#\_________T2\````
+M`````@```"(```#\_________UF\`````````@```"(```#\_________[F^
+M`````````@```"$```#\_________]&^`````````@```)<```#\________
+M_W:_`````````@```&$```#\_________XN_````````"P```$4`````````
+M`````,N_`````````@```"$```#\_________]V_`````````@```)<```#\
+M_________W3``````````@```&$```#\_________Z'``````````@```&$`
+M``#\_________T_!`````````@```'4```#\_________V?!`````````@``
+M`"L```#\_________W_!`````````@```%H```#\_________^?!````````
+M"P````,```!P`0```````#3%`````````@```!4```#\_________\+%````
+M`````@```!4```#\_________]O%`````````@```!0"``#\_________[3&
+M`````````@```!H```#\_________W3'`````````@```"`"``#\________
+M_XC'`````````@```"`"``#\_________Y;'`````````@```#("``#\____
+M_____]_'`````````@````<````$`````````"K(`````````@```"`"``#\
+M_________U[(````````"P````<``````````````(;(`````````@````<`
+M```4`````````-3(`````````@```"`"``#\_________TG)`````````@``
+M``<````D`````````)?)`````````@```"`"``#\_________\O)````````
+M"P````<````@`````````.[)`````````@````<````T`````````#S*````
+M`````@```"`"``#\_________Z?*````````"P````<````0`````````+G*
+M````````"P````<````P`````````$_+`````````@```"`"``#\________
+M_^++`````````@```"`"``#\_________X',`````````@```"`"``#\____
+M_____Z#,`````````@```#("``#\_________V[-`````````@```!\```#\
+M_________R#0`````````@```)(```#\_________Z?1`````````@````,`
+M``#(`@```````+/1````````"P````<```#``0```````+;2`````````@``
+M`((```#\_________^'2`````````@```+````#\_________S?4````````
+M"P````<```"``````````#S4`````````@````4"``#\_________[K4````
+M`````@```#,```#\_________\C4`````````@```#("``#\_________]W4
+M`````````@```*4```#\_________P?5````````"P````8```"%````````
+M`!'5`````````@```#T"``#\_________U[5`````````@```"@"``#\____
+M_____W#5`````````@```"@"``#\_________X+5`````````@```"@"``#\
+M__________/5`````````@```"D```#\_________PO6`````````@```#$"
+M``#\_________Q[6`````````@```#$"``#\_________S;6`````````@``
+M`#$"``#\_________TG6`````````@```#$"``#\_________V'6````````
+M`@```#$"``#\_________W36`````````@```#$"``#\_________XS6````
+M`````@```#$"``#\_________Y_6`````````@```#$"``#\_________[?6
+M`````````@```#$"``#\_________\K6`````````@```#$"``#\________
+M_^+6`````````@```#$"``#\__________76`````````@```#$"``#\____
+M_____PW7`````````@```#$"``#\_________R#7`````````@```#$"``#\
+M_________SC7`````````@```#$"``#\_________TO7`````````@```#$"
+M``#\_________V/7`````````@```#$"``#\_________W;7`````````@``
+M`#$"``#\_________X[7`````````@```#$"``#\_________Z'7````````
+M`@```#$"``#\_________[G7`````````@```#$"``#\_________\S7````
+M`````@```#$"``#\_________^37`````````@```#$"``#\__________?7
+M`````````@```#$"``#\_________P_8`````````@```#$"``#\________
+M_R+8`````````@```#$"``#\_________T'8`````````@```&("``#\____
+M_____UO8`````````@```&("``#\_________WK8`````````@```&("``#\
+M_________Y38`````````@```&("``#\_________[/8`````````@```&("
+M``#\_________\W8`````````@```&("``#\_________^S8`````````@``
+M`&("``#\_________P;9`````````@```&("``#\_________R79````````
+M`@```&("``#\_________S_9`````````@```&("``#\_________U[9````
+M`````@```&("``#\_________WC9`````````@```&("``#\_________Y?9
+M`````````@```&("``#\_________['9`````````@```&("``#\________
+M_]#9`````````@```&("``#\_________^K9`````````@```&("``#\____
+M_____Q+:`````````@```"4```#\_________QK:`````````@```&<```#\
+M_________RG:`````````@```&<```#\_________S':`````````@```+4`
+M``#\_________SO:`````````@```#("``#\_________T/:`````````@``
+M`'T```#\_________U#:`````````@```(,```#\_________UW:````````
+M`@```(,```#\_________WW:`````````@```(,```#\_________Y7:````
+M`````@```*H```#\_________ZC:`````````@```*H```#\_________[7:
+M`````````@```*H```#\_________\C:`````````@```*H```#\________
+M_]7:`````````@```#0```#\_________][:`````````@```$8"``#[____
+M_____SW;`````````@```&(```#\_________YK;````````"P````$````P
+MT@```````*7;`````````@```#$```#\_________]S;`````````@```"\`
+M``#\_________^[;`````````@```#("``#\__________;;`````````@``
+M`#0```#\_________SS<`````````@```"8```#\_________[/<````````
+M`@```&(```#\_________R[=````````"P````$````PT@```````#G=````
+M`````@```#$```#\_________W#=`````````@```"\```#\_________X+=
+M`````````@```#("``#\_________XK=`````````@```#0```#\________
+M_\+=`````````@```"8```#\_________W_>`````````@```",```#\____
+M_____XW>`````````@```%T```#\_________YC>`````````@```"8```#\
+M_________[_?`````````@```$8```#\_________P?@````````"P````$`
+M```PT@```````!3@`````````@```)0```#\_________R?@`````````@``
+M`'8```#\_________SG@`````````@```#$```#\_________VG@````````
+M`@```"\```#\_________W[@`````````@```#("``#\_________X;@````
+M`````@```#0```#\_________SGA`````````@```&(```#\_________UGA
+M````````"P````8```"A`````````&/A`````````@```#T"``#\________
+M_W7A`````````@```&8```#\_________XWA`````````@```"8```#\____
+M_____\GA`````````@```$D"``#\_________^#A`````````@```"\```#\
+M_________V/B````````"P````4```#`!0```````&WB`````````@```#T"
+M``#\_________Z/B`````````@```!0"``#\__________'B`````````@``
+M`!0"``#\_________R?C`````````@```",```#\_________SOC````````
+M`@```%T```#\_________U7C`````````@```"8```#\_________W'C````
+M`````@```$D"``#\_________VCD`````````@```"\```#\_________[KD
+M`````````@```*<```#\_________\_D`````````@```'D```#\________
+M_Q'E`````````@```$L"``#\_________TGE`````````@```"4```#\____
+M_____U'E`````````@```$0```#\_________UGE`````````@```$0```#\
+M_________V;E`````````@```(,```#\_________V[E`````````@```&<`
+M``#\_________WKE`````````@```&<```#\_________X;E`````````@``
+M`+4```#\_________Y#E`````````@```#("``#\_________YCE````````
+M`@```'T```#\_________ZWE````````"P```$<``````````````,3E````
+M`````@```"L"``#\_________]'E`````````@```+0```#\__________7E
+M`````````@```+$```#\_________P3F`````````@```+$```#\________
+M_RGF`````````@````L```"_`````````#;F`````````@````L```"\````
+M`````$'F`````````@````,```#(`@```````%#F````````"P````<```#`
+M`0```````%?F````````"P```$,``````````````%[F````````"P````<`
+M``#4`0```````&KF````````"P````<```#"`0```````+7F````````"P``
+M`$,````<`````````,WF````````"P```$,````<`````````.'F````````
+M"P```$,````<`````````._F````````"P```$,````<`````````/GF````
+M````"P```$,````<`````````"_G````````"P```$,````<`````````$/G
+M````````"P```$,````<`````````%'G````````"P```$,````<````````
+M`&SG````````"P````<```#,`0```````+7G`````````@````,```#(`@``
+M`````-/G````````"P````<```#,`0```````.'G````````"P````<```#0
+M`0```````!'H````````"P```$,``````````````"7H````````"P```$,`
+M```<`````````%#H````````"P```$,````,`````````';H````````"P``
+M`$,````=`````````(7H````````"P```$,````<`````````+[H````````
+M`@````X"``#\_________S;I`````````@```)$```#\_________U3I````
+M`````@```'@```#\_________VSI`````````@```'@```#\_________P[J
+M````````"P```*,``````````````"/J````````"P````4```#H!0``````
+M`"WJ`````````@```#T"``#\_________S_J`````````@```&(```#\____
+M_____VCJ````````"P```*,``````````````'WJ````````"P````4````8
+M!@```````(?J`````````@```#T"``#\_________\?J````````"P````$`
+M```PT@```````-+J`````````@```#$```#\_________PGK`````````@``
+M`"\```#\_________QOK`````````@```#("``#\_________R/K````````
+M`@```#0```#\_________T#K`````````@```"8```#\_________VSK````
+M`````@```&(```#\_________X[K`````````@```&8```#\_________ZGK
+M`````````@```"8```#\_________POL````````"P````$````PT@``````
+M`!CL`````````@```)0```#\_________RCL`````````@```'8```#\____
+M_____S/L`````````@```#$```#\_________VKL`````````@```"\```#\
+M_________WSL`````````@```#("``#\_________X3L`````````@```#0`
+M``#\_________[+L`````````@```(X```#\_________]/L`````````@``
+M`",```#\_________][L`````````@```"8```#\_________R_M````````
+M"P````,```!@`@```````%OM`````````@```)````#\_________XOM````
+M`````@```$H```#\_________Y?M`````````@```'````#\_________Z?M
+M`````````@```*$```#\_________P/N````````"P```*,`````````````
+M`![N````````"P````4```!(!@```````"CN`````````@```#T"``#\____
+M_____UCN`````````@````T"``#\_________VWN````````"P````$```#`
+M[0```````('N`````````@```"L"``#\_________P7Q`````````@```)``
+M``#\_________U/Q`````````@```((```#\_________V3Q`````````@``
+M`'@```#\_________YGQ`````````@```#0```#\_________[_Q````````
+M`@```+0```#\_________]_Q`````````@````T"``#\__________3Q````
+M````"P```$<```````````````?R`````````@```"L"``#\_________W;R
+M`````````@````L```"\`````````(+R`````````@````L```"\````````
+M`&_T`````````@```!P"``#\_________XGT`````````@```!P"``#\____
+M_____]/T`````````@````,```#(`@```````.GT````````"P````<```#`
+M`0```````/OT````````"P````<```#"`0````````GU````````"P````<`
+M``#0`0```````!+U````````"P````<```#0`0```````!GU````````"P``
+M``<```#,`0```````#/U````````"P````<```#0`0```````&WU````````
+M`@```%8"``#\_________X_U`````````@```$X"``#\_________[WU````
+M````"P```$,``````````````-7U````````"P```$,````<`````````/SU
+M````````"P```$,````,`````````!GV````````"P```$,````=````````
+M`"/V````````"P```$,````=`````````"OV````````"P```$,````<````
+M`````$CV````````"P```$,````=`````````%SV````````"P```$,````<
+M`````````*SW````````"P```*,``````````````!3Y`````````@```&(`
+M``#\_________ZO\````````"P````$```#PW0````````S]`````````@``
+M`$8```#\_________QG]`````````@```)0```#\_________RS]````````
+M`@```'8```#\_________TK]`````````@```)0```#\_________U[]````
+M`````@```&8```#\_________Y']`````````@```'8```#\_________Z+]
+M`````````@```%<```#\_________]7]`````````@```'8```#\________
+M_Q;^`````````@```!0"``#\_________XG^`````````@```!0"``#\____
+M_____\?^`````````@```#$```#\_________]?^`````````@```"8```#\
+M_________U@!`0```````@```%8"``#\_________WH!`0```````@```%8"
+M``#\__________`"`0```````@```$T```#\_________T@#`0```````@``
+M`'D```#\_________V\#`0```````@```*<```#\_________YD#`0``````
+M`@```$T```#\__________<#`0```````@```(\```#\_________ZD$`0``
+M`````@```)8!``#\_________\($`0```````@```-0!``#\_________]<$
+M`0```````@```-,!``#\_________V4%`0``````"P````$```!@!`$`````
+M`'T%`0```````@```%,!``#\_________Y,%`0```````@```+P```#\____
+M_____YX%`0```````@```-,```#\_________[8%`0```````@```#("``#\
+M_________\$%`0```````@```.4```#\_________^`%`0```````@```+X`
+M``#\_________^\%`0```````@````4!``#\__________H%`0```````@``
+M`-,!``#\_________Q@&`0```````@```-,!``#\_________S,&`0``````
+M`@````@!``#\_________U`&`0```````@```%<!``#\_________[(&`0``
+M`````@```%,!``#\_________\8&`0```````@```+P```#\_________V@)
+M`0```````@```#L!``#\_________^H+`0``````"P````,```#@`@``````
+M`(L,`0``````"P````4```!X!@```````)4,`0```````@```#T"``#\____
+M_____]`,`0```````@```!0"``#\_________Y0-`0```````@```"`"``#\
+M_________[T-`0```````@```"`"``#\_________QT.`0```````@```"`"
+M``#\_________Y\.`0```````@```"`"``#\_________]D.`0```````@``
+M`"`"``#\_________SX/`0```````@```#("``#\_________WD/`0``````
+M`@```#("``#\_________\</`0```````@```#("``#\_________P(0`0``
+M`````@```#("``#\_________U@0`0```````@```.8```#\_________V(0
+M`0```````@```#("``#\_________VP0`0```````@```)$!``#\________
+M_T<1`0```````@```"`"``#\_________V01`0```````@```"`"``#\____
+M_____W,1`0```````@```#("``#\_________X\1`0```````@```"`"``#\
+M_________ZP1`0```````@```"`"``#\_________]H1`0```````@```"`"
+M``#\_________^01`0```````@```"`"``#\_________PP2`0```````@``
+M`#("``#\_________QD2`0```````@```"`"``#\_________T$2`0``````
+M`@```#("``#\_________TX2`0```````@```"`"``#\_________W\2`0``
+M`````@```"`"``#\_________[`2`0```````@```"`"``#\_________Q43
+M`0```````@```"`"``#\_________S43`0```````@```"`"``#\________
+M_UP3`0```````@```"`"``#\_________WP3`0```````@```"`"``#\____
+M_____ZP3`0```````@```"`"``#\_________[83`0```````@```"`"``#\
+M_________^(3`0```````@```#("``#\__________(3`0```````@```"`"
+M``#\_________QH4`0```````@```#("``#\_________RH4`0```````@``
+M`"`"``#\_________S06`0```````@```"`"``#\_________WP6`0``````
+M`@```&$!``#\_________Z@6`0```````@```&$!``#\_________Q87`0``
+M`````@```*0!``#\_________W07`0```````@````T"``#\_________X`7
+M`0```````@```&(!``#\_________YD7`0```````@```%D!``#\________
+M_T$8`0```````@```*0!``#\_________W`8`0```````@```(D!``#\____
+M_____X$8`0```````@```$T!``#\_________Y08`0``````"P````8```#!
+M`````````)X8`0```````@```#T"``#\_________[,8`0```````@```$D"
+M``#\_________\@8`0```````@```$D"``#\_________^`8`0```````@``
+M`.H```#\_________P(9`0```````@```"`"``#\__________P9`0``````
+M"P```-$```````````````$:`0```````@```&\!``#\_________^T:`0``
+M`````@```-````#\__________@:`0```````@```-,!``#\_________^X;
+M`0```````@```$\!``#\_________V$?`0```````@```-(!``#\________
+M_]D?`0```````@```/````#\_________QP@`0```````@```$\!``#\____
+M_____[P@`0``````"P````,```#@!@```````-4@`0```````@```*,!``#\
+M_________P<A`0```````@```*,!``#\_________S<A`0```````@```*,!
+M``#\_________V,A`0```````@```*,!``#\_________YHA`0```````@``
+M`#(!``#\_________^8A`0```````@```*8!``#\_________W@B`0``````
+M`@```,@```#\_________[<B`0```````@```/$```#\_________^$B`0``
+M`````@```#("``#\_________SLE`0```````@```+P!``#\_________THE
+M`0```````@```(0!``#\_________P$F`0```````@```-P```#\________
+M_WLF`0```````@```'H!``#\_________Y@F`0```````@```-P```#\____
+M_____[PG`0```````@```-$!``#\_________\\G`0```````@```&,!``#\
+M_________STH`0```````@```-$!``#\_________VDH`0```````@```&,!
+M``#\_________P(J`0```````@```*4!``#\_________^HJ`0```````@``
+M`!0"``#\_________P0K`0``````"P````,````P!P```````)<K`0``````
+M`@```+L```#\_________Z8K`0```````@```+L```#\_________R,L`0``
+M`````@```-$!``#\_________T\L`0```````@```&,!``#\_________[XL
+M`0```````@```!@!``#\__________(L`0```````@````0!``#\________
+M_PLM`0```````@```!@!``#\_________QHM`0```````@```)(!``#\____
+M_____S,M`0```````@```!@!``#\_________X,M`0```````@````P!``#\
+M_________Y@M`0``````"P````4```#0!@```````*(M`0```````@```#T"
+M``#\_________Q0N`0```````@```%D!``#\_________R8N`0```````@``
+M`-<```#\_________\(N`0```````@```)P!``#\_________S\O`0``````
+M`@```)P!``#\_________T\O`0```````@```*`!``#\_________WDO`0``
+M`````@```)P!``#\_________Y<O`0```````@```&8!``#\_________\0O
+M`0```````@````<!``#\_________X,P`0```````@```",!``#\________
+M_Z8P`0```````@```&8!``#\_________\\P`0```````@```!<!``#\____
+M______8P`0```````@```)P!``#\__________XP`0```````@```!<!``#\
+M_________R,Q`0```````@```&8!``#\_________XDQ`0```````@```+\`
+M``#\_________]<Q`0```````@```($!``#\__________LQ`0```````@``
+M`%D!``#\_________S(R`0```````@```$D"``#\_________T8R`0``````
+M`@```+\```#\_________V0R`0```````@```.4```#\_________VXR`0``
+M`````@```#("``#\_________[TR`0```````@```$H!``#\_________\0R
+M`0```````@```),!``#\_________]HR`0``````"P````8```#7````````
+M`.0R`0```````@```#T"``#\_________QLS`0```````@```+\```#\____
+M_____RXS`0```````@```"H!``#\_________S8S`0```````@```!<!``#\
+M_________\<S`0```````@```"`"``#\__________,S`0```````@```"`"
+M``#\_________RPT`0```````@```"`"``#\_________VHT`0``````"P``
+M``4`````!P```````'0T`0```````@```#T"``#\_________[`T`0``````
+M`@```$X!``#\_________P8U`0```````@```$X!``#\_________QLU`0``
+M`````@```,P!``#\_________R8U`0```````@```",!``#\_________]@U
+M`0```````@```-(```#\__________\U`0```````@```&8!``#\________
+M_S0V`0```````@```%D!``#\_________](V`0```````@```-(```#\____
+M______0V`0```````@```&8!``#\_________S<W`0```````@```,<!``#\
+M_________V@X`0```````@```"`"``#\_________X8X`0```````@```"`"
+M``#\_________Z,X`0```````@```"`"``#\_________P@Y`0```````@``
+M`"`"``#\_________R\Y`0```````@```"`"``#\_________YLY`0``````
+M`@```(<!``#\__________@Y`0```````@```"`"``#\_________QLZ`0``
+M`````@```"`"``#\_________SXZ`0```````@```"`"``#\_________T8Z
+M`0```````@````\!``#\_________S<[`0```````@```-T```#\________
+M_UH[`0```````@```!0"``#\_________T(\`0```````@```!0"``#\____
+M_____[`\`0```````@```!0"``#\_________^0\`0```````@```"`"``#\
+M_________Q\]`0```````@```"`"``#\_________W,]`0```````@```"`"
+M``#\_________U$^`0```````@```!0"``#\_________Z4_`0```````@``
+M`!0"``#\_________RU``0```````@```!0"``#\_________T!``0``````
+M"P````,```"0#````````-5``0```````@```#("``#\_________U-!`0``
+M`````@```"`"``#\_________W=!`0```````@```"`"``#\_________YQ!
+M`0``````"P````8```#U`````````*9!`0```````@```#T"``#\________
+M_[!!`0```````@```&P!``#\_________S="`0```````@```"`"``#\____
+M_____\)"`0```````@```&P!``#\_________]%"`0```````@```&P!``#\
+M_________QQ#`0``````"P````4```!0!P```````"9#`0```````@```#T"
+M``#\_________X]#`0``````"P````8````0`0```````)E#`0```````@``
+M`#T"``#\_________ZM#`0```````@```%@!``#\_________]5#`0``````
+M"P````4```"0!P```````-]#`0```````@```#T"``#\_________U)$`0``
+M````"P````4```"X!P```````%Q$`0```````@```#T"``#\__________Y$
+M`0```````@```-(```#\_________Q=%`0```````@```&8!``#\________
+M_\I%`0```````@```#\!``#\_________RY'`0```````@```%@!``#\____
+M_____SY'`0```````@```*0!``#\_________X)'`0```````@```!$!``#\
+M_________^E'`0```````@```-(```#\__________1'`0```````@```#\!
+M``#\_________PU(`0```````@```&8!``#\_________V=(`0```````@``
+M`%D!``#\_________^!(`0```````@```,$```#\_________Q=)`0``````
+M`@```%D!``#\_________^1)`0```````@```%D!``#\_________QE*`0``
+M`````@```*0!``#\_________RI*`0```````@```!<!``#\_________V5*
+M`0```````@```"`"``#\_________Y%*`0```````@```"`"``#\________
+M_ZU*`0```````@```"`"``#\_________\M*`0```````@```"`"``#\____
+M_____^=*`0```````@```"`"``#\__________U*`0```````@```"$!``#\
+M_________PQ+`0```````@```!X!``#\_________QA+`0```````@```!X!
+M``#\_________RE+`0```````@```"$!``#\_________VQ+`0```````@``
+M`"`"``#\__________%+`0```````@```"`"``#\_________QQ,`0``````
+M`@```"`"``#\_________RY,`0```````@```/<```#\_________W%,`0``
+M`````@```"`"``#\_________Y9,`0```````@```"`"``#\_________Q--
+M`0```````@```"`"``#\_________SQ-`0```````@```"`"``#\________
+M_VA-`0```````@````T"``#\_________XE-`0```````@```'8!``#\____
+M_____\E-`0```````@```%D!``#\__________]-`0```````@```$D"``#\
+M_________Q-.`0```````@```+\```#\_________S%.`0```````@```!T!
+M``#\_________SM.`0```````@```#("``#\_________VM.`0``````"P``
+M``$```#`8P$``````)E.`0```````@```"L"``#\_________\-.`0``````
+M`@```"`"``#\_________]A.`0```````@```"`"``#\_________P!/`0``
+M`````@```"`"``#\_________Q5/`0```````@```"`"``#\_________T9/
+M`0```````@```"`"``#\_________WU/`0```````@```"`"``#\________
+M_[M/`0```````@```"`"``#\_________^-/`0```````@```"`"``#\____
+M_____QA0`0```````@```"`"``#\_________T]0`0```````@```"`"``#\
+M_________[90`0```````@```"`"``#\_________]M0`0```````@```"`"
+M``#\_________P!1`0```````@```"`"``#\_________R51`0```````@``
+M`"`"``#\_________V11`0```````@````T"``#\_________YY1`0``````
+M`@```$D"``#\_________[)1`0```````@```+\```#\_________\11`0``
+M`````@```.4```#\_________\Y1`0```````@```#("``#\__________M1
+M`0``````"P```),!`````````````!-2`0```````@```"L"``#\________
+M_SY2`0```````@```"`"``#\_________W!2`0```````@```"`"``#\____
+M_____ZE2`0```````@```"`"``#\_________]52`0```````@```"`"``#\
+M_________Q93`0```````@````T"``#\_________S13`0```````@```%D!
+M``#\_________V13`0```````@```$D"``#\_________X)3`0``````"P``
+M`%8!`````````````)13`0```````@```"L"``#\_________\-3`0``````
+M`@```"`"``#\_________^E3`0```````@```"`"``#\_________P=4`0``
+M`````@```#("``#\_________QQ4`0```````@```"`"``#\_________T)4
+M`0```````@```"`"``#\_________VA4`0```````@```"`"``#\________
+M_X94`0```````@```#("``#\_________YM4`0```````@```"`"``#\____
+M_____\!4`0```````@```"`"``#\_________Y95`0```````@```"`"``#\
+M_________[M5`0```````@```#("``#\_________^M5`0```````@```"`"
+M``#\_________Q)6`0```````@```#("``#\_________T56`0```````@``
+M`"`"``#\_________VQ6`0```````@```#("``#\_________[)6`0``````
+M`@```"P!``#\_________\U6`0```````@```'`!``#\_________]E6`0``
+M`````@```#X!``#\_________PY7`0```````@```#H!``#\_________T)7
+M`0```````@```!L!``#\_________V]7`0```````@```#X!``#\________
+M_UA8`0```````@```#("``#\_________W]8`0```````@```"`"``#\____
+M_____YY8`0```````@```#("``#\_________\%8`0```````@```"`"``#\
+M_________^U8`0```````@```#("``#\_________Q19`0```````@```"`"
+M``#\_________SA9`0```````@```#("``#\_________UQ9`0```````@``
+M`"`"``#\_________WU9`0```````@```%D!``#\__________I9`0``````
+M`@```+\```#\_________S5:`0```````@```+\```#\_________T%:`0``
+M`````@```#X!``#\_________X9:`0```````@```%D!``#\_________ZM:
+M`0```````@```%D!``#\_________\Q:`0```````@````T"``#\________
+M_^M:`0```````@```.4```#\__________5:`0```````@```#("``#\____
+M_____[);`0```````@```*0!``#\_________]1;`0```````@```(D!``#\
+M_________^5;`0```````@```$T!``#\__________A;`0``````"P````8`
+M``#!``````````)<`0```````@```#T"``#\_________Q=<`0```````@``
+M`$D"``#\_________RQ<`0```````@```$D"``#\_________TE<`0``````
+M`@```.H```#\_________VA<`0```````@```/0```#\_________Y1<`0``
+M`````@```%D!``#\_________[E<`0```````@```.4```#\_________\-<
+M`0```````@```#("``#\__________9<`0```````@```(D!``#\________
+M_P==`0```````@```$T!``#\_________QI=`0``````"P````8```#!````
+M`````"1=`0```````@```#T"``#\_________SE=`0```````@```$D"``#\
+M_________TY=`0```````@```$D"``#\_________V9=`0```````@```.H`
+M``#\_________WM=`0```````@```#H!``#\__________Q=`0```````@``
+M`"`"``#\_________QY>`0```````@```#("``#\_________T%>`0``````
+M`@```"`"``#\_________V1>`0```````@```"`"``#\_________X9>`0``
+M`````@```#("``#\_________ZI>`0```````@```"`"``#\_________S)?
+M`0```````@```'8!``#\_________SY?`0```````@```$$!``#\________
+M_X5?`0```````@```)X!``#\_________Y)?`0```````@```$4!``#\____
+M_____\A?`0```````@```#("``#\_________^-?`0```````@```"`"``#\
+M_________P)@`0```````@```"`"``#\_________R%@`0```````@```#X!
+M``#\_________RE@`0```````@```!P!``#\_________U%@`0```````@``
+M`)\!``#\_________]A@`0```````@```%8!``#\_________^5@`0``````
+M`@```%D!``#\_________W!A`0```````@```+X!``#\_________Z1A`0``
+M`````@```$H!``#\_________]UA`0```````@```*H!``#\__________5A
+M`0```````@```$D"``#\_________PUB`0```````@```$D"``#\________
+M_SIB`0```````@```#("``#\_________U5B`0```````@```"`"``#\____
+M_____W)B`0```````@```"`"``#\_________Y%B`0```````@```#X!``#\
+M_________YEB`0```````@```!P!``#\_________]]B`0```````@```"P!
+M``#\_________R1C`0```````@```%D!``#\_________Z-C`0```````@``
+M`)\!``#\_________[)C`0```````@```/T```#\_________RMD`0``````
+M`@```"`"``#\_________UID`0```````@```"`"``#\_________W)D`0``
+M`````@```+\!``#\_________W]D`0```````@```$4!``#\_________^ED
+M`0```````@```(`!``#\_________PQE`0```````@```&8!``#\________
+M_S1E`0```````@```!<!``#\_________UAE`0```````@```)P!``#\____
+M_____V!E`0```````@```!<!``#\_________ZEE`0```````@```&8!``#\
+M__________IE`0```````@```+\```#\_________PEF`0```````@```%D!
+M``#\_________SAF`0```````@```$D"``#\_________TQF`0```````@``
+M`+\```#\_________V1F`0```````@```.4```#\_________VYF`0``````
+M`@```#("``#\_________XYF`0```````@```),!``#\_________[UF`0``
+M`````@```&8!``#\_________^]F`0```````@```+\```#\_________P9G
+M`0```````@```%D!``#\_________R)G`0```````@```(D!``#\________
+M_S-G`0```````@```$T!``#\_________TAG`0```````@```$D"``#\____
+M_____UUG`0```````@```$D"``#\_________W!G`0```````@```.H```#\
+M_________X)G`0```````@```&(!``#\_________YMG`0```````@```"`"
+M``#\__________5G`0```````@```#X!``#\_________P!H`0```````@``
+M`#H!``#\_________Y9H`0```````@```"`"``#\_________[%H`0``````
+M`@```%@!``#\_________\%H`0```````@```*0!``#\_________^1H`0``
+M`````@```%@!``#\_________^QH`0```````@```&H!``#\_________P5I
+M`0``````"P````,```#P#````````!QI`0```````@````(!``#\________
+M_SAI`0```````@````(!``#\_________U1I`0```````@```+\```#\____
+M_____W=I`0```````@```($!``#\_________XYI`0```````@```-X```#\
+M_________[%I`0```````@```+\```#\_________\]I`0```````@```($!
+M``#\_________^9I`0```````@```+\```#\__________AI`0```````@``
+M`-X```#\_________Q-J`0```````@```+\```#\_________RAJ`0``````
+M`@```+\```#\_________UQJ`0```````@```.4```#\_________V9J`0``
+M`````@```#("``#\_________]EJ`0```````@```,(```#\__________-J
+M`0```````@```(T!``#\_________PQK`0```````@```(D!``#\________
+M_QUK`0```````@```$T!``#\_________S!K`0``````"P````8```#!````
+M`````#IK`0```````@```#T"``#\_________U!K`0```````@```$D"``#\
+M_________V9K`0```````@```$D"``#\_________WEK`0```````@```.H`
+M``#\_________Z1K`0```````@```%D!``#\_________]MK`0```````@``
+M`%$!``#\_________S%L`0```````@```&D!``#\_________U-L`0``````
+M`@```%D!``#\_________Z1L`0``````"P````4````0"````````*YL`0``
+M`````@```#T"``#\_________])L`0```````@```%@!``#\_________P)M
+M`0``````"P````4```!`"`````````QM`0```````@```#T"``#\________
+M_XAM`0``````"P````4```"X!P```````))M`0```````@```#T"``#\____
+M_____\5M`0``````"P````4````0"````````,]M`0```````@```#T"``#\
+M_________V1N`0```````@```!X!``#\_________W-O`0```````@```-(`
+M``#\_________[)O`0```````@```+<!``#\_________]MO`0``````"P``
+M``4````0"````````.5O`0```````@```#T"``#\_________Q)Q`0``````
+M`@```!0"``#\_________SEQ`0```````@```"`"``#\_________W!Q`0``
+M`````@```"`"``#\_________[YQ`0```````@```"`"``#\_________T-R
+M`0``````"P````4```!P"````````$UR`0```````@```#T"``#\________
+M_X!R`0``````"P````4```"P"````````(IR`0```````@```#T"``#\____
+M_____Z1R`0``````"P````4```#P"````````*YR`0```````@```#T"``#\
+M_________]-R`0``````"P````8````=`0```````-UR`0```````@```#T"
+M``#\_________QIS`0``````"P````4````@"0```````"1S`0```````@``
+M`#T"``#\_________UES`0``````"P````8````Y`0```````&-S`0``````
+M`@```#T"``#\_________X9S`0``````"P````8```!0`0```````)!S`0``
+M`````@```#T"``#\_________YMS`0``````"P````8```!L`0```````*5S
+M`0```````@```#T"``#\__________=S`0```````@```,L```#\________
+M_T9T`0```````@```"`"``#\_________VIT`0```````@```"`"``#\____
+M_____XQT`0```````@```"`"``#\_________[!T`0```````@```"`"``#\
+M_________[]T`0``````"P````8```!]`0```````,ET`0```````@```#T"
+M``#\_________V1U`0```````@```"`"``#\_________X]U`0``````"P``
+M``8```":`0```````)EU`0```````@```#T"``#\_________]IU`0``````
+M"P````4```!8"0```````.1U`0```````@```#T"``#\__________=U`0``
+M`````@````\!``#\_________Q!V`0```````@```"`"``#\_________[AV
+M`0```````@```!<!``#\_________]5V`0```````@```'(!``#\________
+M_U5W`0```````@```+D!``#\_________VEW`0```````@```!\!``#\____
+M_____X]W`0```````@```#X"``#\_________[%W`0```````@```#X"``#\
+M_________])W`0```````@```#X"``#\__________!W`0```````@```#X"
+M``#\_________Q9X`0```````@```#X"``#\_________T%X`0```````@``
+M`#X"``#\_________UMX`0```````@```#X"``#\_________W5X`0``````
+M`@```#X"``#\_________Y-X`0```````@```#X"``#\_________ZUX`0``
+M`````@```#X"``#\_________\]X`0```````@```#X"``#\__________%X
+M`0```````@```#X"``#\_________PYY`0```````@```#X"``#\________
+M_RMY`0```````@```#X"``#\_________TAY`0```````@```#X"``#\____
+M_____V5Y`0```````@```#X"``#\_________X%Y`0```````@```#X"``#\
+M_________Z-Y`0```````@```#X"``#\_________[QY`0```````@```#X"
+M``#\_________^!Y`0```````@```!("``#\_________P!Z`0```````@``
+M`!("``#\_________R=Z`0```````@```!("``#\_________TMZ`0``````
+M`@```!("``#\_________V]Z`0```````@```!("``#\_________Y)Z`0``
+M`````@```!("``#\_________[)Z`0```````@```!("``#\_________]QZ
+M`0```````@```!("``#\_________R=[`0```````@```%D!``#\________
+M_S=[`0```````@```)8!``#\_________[![`0``````"P````$````@&@$`
+M`````+Y[`0```````@```%,!``#\_________\I[`0```````@```-,```#\
+M_________YE\`0```````@```%D!``#\_________\Y\`0```````@```$D"
+M``#\_________^1\`0```````@```+\```#\__________5\`0```````@``
+M`.4```#\__________]\`0```````@```#("``#\_________S!]`0``````
+M`@````8!``#\_________\E^`0```````@```+D!``#\_________TQ_`0``
+M`````@```$`"``#\_________XA_`0```````@```$`"``#\_________\-_
+M`0```````@```$`"``#\__________I_`0```````@```$`"``#\________
+M_S*``0```````@```$`"``#\_________T6``0```````@```$`"``#\____
+M_____UN``0```````@```$`"``#\_________\&``0```````@```$`"``#\
+M_________PZ!`0```````@```$`"``#\_________UZ!`0```````@```$`"
+M``#\_________Z&!`0```````@```$`"``#\_________^^!`0```````@``
+M`$`"``#\_________T>"`0```````@```$`"``#\_________XB"`0``````
+M`@```$`"``#\_________[&"`0```````@```&<!``#\_________[V"`0``
+M`````@```$`"``#\_________^:"`0```````@```#0!``#\__________*"
+M`0```````@```$`"``#\_________QN#`0```````@```#0!``#\________
+M_R>#`0```````@```$`"``#\_________U"#`0```````@```#0!``#\____
+M_____UR#`0```````@```$`"``#\_________X6#`0```````@```#0!``#\
+M_________Y&#`0```````@```$`"``#\_________^V#`0```````@```'0!
+M``#\__________Z&`0```````@```$P"``#\_________QB'`0```````@``
+M`$P"``#\_________S*'`0```````@```$P"``#\_________TR'`0``````
+M`@```$P"``#\_________V:'`0```````@```$P"``#\_________X"'`0``
+M`````@```$P"``#\_________ZB'`0```````@```%D!``#\__________V'
+M`0```````@```$P"``#\_________QZ(`0```````@```%D!``#\________
+M_V^(`0```````@```$P"``#\_________Y.(`0```````@```%D!``#\____
+M_____P*)`0```````@```-4```#\_________V&)`0```````@```"`"``#\
+M_________Y2)`0```````@```"`"``#\_________ZR)`0```````@```$4!
+M``#\__________>)`0```````@```+\```#\_________PB*`0```````@``
+M`.4```#\_________Q**`0```````@```#("``#\_________SJ*`0``````
+M`@```(D!``#\_________T^*`0```````@```$D"``#\_________V2*`0``
+M`````@```$D"``#\_________WN*`0```````@```.H```#\_________XN*
+M`0```````@```"`"``#\__________J*`0```````@```&$!``#\________
+M_R:+`0```````@```$D"``#\_________Y.+`0```````@```,P!``#\____
+M_____\2+`0```````@```%D!``#\_________RJ,`0``````"P````4```"`
+M"0```````#2,`0```````@```#T"``#\_________V>,`0```````@```%@!
+M``#\_________Y>,`0``````"P````4```!`"````````*&,`0```````@``
+M`#T"``#\_________QV-`0``````"P````4```"X!P```````">-`0``````
+M`@```#T"``#\_________TZ-`0``````"P````8````=`0```````%B-`0``
+M`````@```#T"``#\_________YJ-`0``````"P````4````@"0```````*2-
+M`0```````@```#T"``#\_________U".`0```````@```!X!``#\________
+M_V".`0``````"P````4```"X"0```````&J.`0```````@```#T"``#\____
+M_____WZ/`0```````@```&8!``#\_________ZB/`0```````@```-(```#\
+M_________\B/`0```````@```(<!``#\_________PZ0`0```````@```,<!
+M``#\_________YR3`0```````@```%\!``#\_________P&4`0```````@``
+M`!0"``#\_________PZ4`0```````@```+@!``#\_________X:4`0``````
+M`@```!0"``#\_________^Z4`0```````@```)8!``#\_________P*5`0``
+M`````@```-0!``#\_________Q65`0```````@```-,!``#\_________SB5
+M`0```````@```!0"``#\_________XJ5`0``````"P```#8!````````````
+M`-25`0```````@```%,!``#\_________^65`0```````@```+P```#\____
+M______"5`0```````@```-,```#\_________U^6`0```````@```)8!``#\
+M_________W.6`0```````@```-0!``#\_________X:6`0```````@```-,!
+M``#\_________^J6`0``````"P```#8!`````````````#F7`0```````@``
+M`%,!``#\_________TJ7`0```````@```+P```#\_________U67`0``````
+M`@```-,```#\_________]B7`0```````@```)8!``#\_________^R7`0``
+M`````@```-0!``#\__________^7`0```````@```-,!``#\_________QR8
+M`0```````@```!0"``#\_________V"8`0``````"P```,8!````````````
+M`(28`0```````@```%,!``#\_________Y.8`0```````@```+P```#\____
+M_____YZ8`0```````@```-,```#\_________P&9`0```````@```%\!``#\
+M_________R^9`0```````@```)@!``#\_________X.9`0```````@```)8!
+M``#\_________Y>9`0```````@```-0!``#\_________ZJ9`0```````@``
+M`-,!``#\__________R9`0``````"P```,8!`````````````!V:`0``````
+M`@```%,!``#\_________RV:`0```````@```+P```#\_________SB:`0``
+M`````@```-,```#\_________^B:`0```````@```/P```#\_________R:;
+M`0```````@```/P```#\_________V2;`0```````@```$,!``#\________
+M_W*;`0```````@```.(```#\_________Z&;`0```````@```.P```#\____
+M_____[J;`0```````@```.(```#\_________^B;`0```````@```.(```#\
+M_________[Z<`0```````@````L!``#\_________P&=`0```````@```$0!
+M``#\_________SR=`0```````@```.P```#\_________X.=`0```````@``
+M`)8!``#\_________Y>=`0```````@```-0!``#\_________ZJ=`0``````
+M`@```-,!``#\__________V=`0``````"P```)H!`````````````!Z>`0``
+M`````@```%,!``#\_________RV>`0```````@```+P```#\_________SB>
+M`0```````@```-,```#\_________S^?`0```````@```+X```#\________
+M_TJ?`0```````@```-,!``#\_________WF?`0```````@```!0"``#\____
+M_____[^?`0```````@```+X```#\_________\J?`0```````@```-,!``#\
+M_________W&@`0```````@```/8```#\_________X2@`0```````@```+X`
+M``#\_________X^@`0```````@```-,!``#\_________ZF@`0```````@``
+M``T"``#\_________[Z@`0``````"P```.0``````````````-*@`0``````
+M`@```"L"``#\_________TZA`0```````@```((!``#\_________SVB`0``
+M`````@```'T!``#\_________W&B`0```````@```'T!``#\_________ZFB
+M`0```````@```.P```#\_________Q>D`0```````@```!,!``#\________
+M_RFD`0```````@````$!``#\_________SZD`0```````@```#D!``#\____
+M_____U"D`0```````@```/8```#\_________VJD`0```````@````T"``#\
+M_________W^D`0``````"P```.0``````````````)FD`0```````@```"L"
+M``#\_________^6D`0```````@```%D!``#\_________U*E`0```````@``
+M`+X!``#\_________WBE`0```````@```$H!``#\_________YRE`0``````
+M`@```*H!``#\_________P2F`0```````@```%D!``#\_________S^F`0``
+M`````@```.P```#\_________VVF`0```````@```%$!``#\_________YFF
+M`0```````@```+X```#\_________ZBF`0```````@```-,!``#\________
+M_^&F`0```````@```.P```#\_________]NK`0```````@```,4!``#\____
+M_____]VL`0``````"P````,````@#0```````'>M`0```````@```"`"``#\
+M_________ZVM`0```````@```"`"``#\_________]BM`0```````@```"`"
+M``#\_________Q*N`0```````@```"`"``#\_________U>N`0```````@``
+M`"`"``#\_________XVN`0```````@```"`"``#\_________[BN`0``````
+M`@```"`"``#\_________^VN`0```````@```"`"``#\_________ZVO`0``
+M````"P````,```#@#0```````,FO`0``````"P````,```#E#0```````-FO
+M`0``````"P````,```#D#0```````.JO`0``````"P````,```#@#0``````
+M`/NO`0```````@```(X!``#\_________XVP`0```````@```%D!``#\____
+M_____[VP`0```````@```%D!``#\_________^VP`0```````@```%D!``#\
+M_________SVQ`0```````@```%D!``#\_________VVQ`0```````@```%D!
+M``#\_________^JQ`0```````@```%D!``#\_________S.S`0```````@``
+M`-(```#\_________W"T`0```````@```%@!``#\_________[.T`0``````
+M`@```'L!``#\__________.T`0```````@```'L!``#\_________^^U`0``
+M`````@```+X```#\__________VU`0```````@```!D!``#\_________R>W
+M`0```````@```-,```#\_________U"W`0```````@```/4```#\________
+M_URW`0```````@```,4!``#\_________W6W`0```````@```&8!``#\____
+M_____^*W`0```````@```(`!``#\_________TZX`0```````@```",!``#\
+M_________RBY`0```````@```-,!``#\_________Z.Y`0```````@````4!
+M``#\_________ZZY`0```````@```-,!``#\_________^>Y`0```````@``
+M`%D!``#\__________*Y`0```````@```/@```#\__________JY`0``````
+M`@```-<```#\_________T"Z`0```````@```)8!``#\_________U"Z`0``
+M`````@```-0!``#\_________VJZ`0```````@```-,!``#\_________ZVZ
+M`0``````"P```,,``````````````+BZ`0```````@```-,```#\________
+M__.Z`0```````@```)8!``#\_________S2[`0``````"P```,,`````````
+M`````#^[`0```````@```-,```#\_________X^[`0```````@```)8!``#\
+M_________Z.[`0```````@```-0!``#\_________[:[`0```````@```-,!
+M``#\_________P&\`0``````"P````$`````O0$```````Z\`0```````@``
+M`%,!``#\_________QZ\`0```````@```+P```#\_________RF\`0``````
+M`@```-,```#\_________W2\`0```````@```)8!``#\_________[2\`0``
+M````"P```"L!`````````````+^\`0```````@```-,```#\_________\^\
+M`0```````@```#("``#\_________]N\`0```````@```#("``#\________
+M_]J]`0```````@```+X```#\_________^J]`0```````@```!D!``#\____
+M______6]`0```````@```-,!``#\_________SB^`0```````@```)T!``#\
+M_________UB^`0```````@```+X```#\_________VB^`0```````@```!D!
+M``#\_________W.^`0```````@```-,!``#\_________W*_`0```````@``
+M`#("``#\_________WV_`0```````@```-,!``#\_________Z^_`0``````
+M`@```)T!``#\_________[N_`0```````@```#("``#\_________\:_`0``
+M`````@```-,!``#\_________Q#``0```````@```)8!``#\_________U+`
+M`0```````@```*,!``#\_________V'``0```````@```-,!``#\________
+M_W?``0``````"P```,,``````````````(+``0```````@```-,```#\____
+M_____\;``0```````@```)8!``#\_________^3``0```````@```-0!``#\
+M__________[``0```````@```-,!``#\_________V+!`0``````"P```,,`
+M`````````````'/!`0```````@```%,!``#\_________X7!`0```````@``
+M`+P```#\_________Y#!`0```````@```-,```#\_________^/!`0``````
+M`@```)8!``#\_________P3"`0```````@```-0!``#\_________R#"`0``
+M`````@```-,!``#\_________XK"`0``````"P```,,``````````````)?"
+M`0```````@```%,!``#\_________ZC"`0```````@```+P```#\________
+M_[/"`0```````@```-,```#\_________PK#`0```````@```)8!``#\____
+M_____RC#`0```````@```-0!``#\_________T3#`0```````@```-,!``#\
+M_________Z+#`0``````"P```,,``````````````+;#`0```````@```%,!
+M``#\_________\?#`0```````@```+P```#\_________]+#`0```````@``
+M`-,```#\_________RK$`0```````@```)8!``#\_________TC$`0``````
+M`@```-0!``#\_________V3$`0```````@```-,!``#\_________[K$`0``
+M````"P```,,``````````````,?$`0```````@```%,!``#\_________]C$
+M`0```````@```+P```#\_________^/$`0```````@```-,```#\________
+M_U?%`0```````@```)8!``#\_________P7&`0``````"P````$```!@N`$`
+M`````!/&`0```````@```%,!``#\_________Q[&`0```````@```-,```#\
+M_________X'(`0```````@````(!``#\_________Y+(`0```````@````4!
+M``#\_________^S(`0```````@```%D!``#\_________\;)`0```````@``
+M`)P!``#\_________U7*`0```````@```)8!``#\_________W3*`0``````
+M`@```(\!``#\_________X?*`0```````@```-,!``#\_________]S*`0``
+M````"P```.L``````````````.K*`0```````@```%,!``#\__________7*
+M`0```````@```-,```#\_________U7+`0```````@```)8!``#\________
+M_VG+`0```````@```(\!``#\_________\#+`0``````"P```.L`````````
+M`````,[+`0```````@```%,!``#\_________]G+`0```````@```-,```#\
+M_________^/+`0```````@```#("``#\_________SS,`0```````@```)8!
+M``#\_________TS,`0```````@```(\!``#\_________Y_,`0``````"P``
+M`.L``````````````*W,`0```````@```%,!``#\_________[C,`0``````
+M`@```-,```#\_________P7-`0```````@```)8!``#\_________Q7-`0``
+M`````@```(\!``#\_________V3-`0``````"P```.L``````````````'+-
+M`0```````@```%,!``#\_________WW-`0```````@```-,```#\________
+M_[3-`0```````@```#(!``#\_________\3-`0```````@```-`!``#\____
+M_____]#.`0```````@```#(!``#\_________^#.`0```````@```-`!``#\
+M_________U#/`0```````@```-D```#\_________^//`0```````@```$(!
+M``#\_________T'0`0```````@```,0!``#\_________W#0`0```````@``
+M`#(!``#\_________X#0`0```````@```-`!``#\_________^[0`0``````
+M`@```*(!``#\_________U+1`0```````@```+4!``#\_________ZC1`0``
+M`````@```-(```#\_________\O1`0```````@```(`!``#\_________]S1
+M`0```````@```+4!``#\_________Q/2`0```````@```-(```#\________
+M_R32`0```````@```+4!``#\_________T;2`0```````@````T"``#\____
+M_____VG2`0```````@````T"``#\_________]#2`0```````@```"X!``#\
+M_________QK3`0```````@```-(```#\_________S+3`0```````@```",!
+M``#\_________SW3`0```````@```,P!``#\__________S3`0```````@``
+M`%D!``#\_________P_4`0```````@```&D!``#\_________R[4`0``````
+M"P```,L``````````````$74`0```````@```"L"``#\_________]G4`0``
+M`````@```%D!``#\_________^S4`0```````@```,P!``#\_________P?5
+M`0``````"P```,`!`````````````![5`0```````@```"L"``#\________
+M_]75`0```````@```-(```#\_________^#5`0```````@```#\!``#\____
+M_____^O5`0```````@```)P!``#\_________X+6`0``````"P```,L`````
+M`````````)G6`0```````@```"L"``#\_________SK7`0``````"P```,`!
+M`````````````%'7`0```````@```"L"``#\_________P39`0```````@``
+M`%D!``#\_________U[9`0```````@```-````#\_________VW9`0``````
+M`@```-,!``#\_________ZK9`0```````@```($!``#\_________]K9`0``
+M`````@```$H!``#\__________;9`0```````@```-8```#\_________R?:
+M`0```````@```%D!``#\_________Y':`0```````@```+X!``#\________
+M_Z?:`0```````@```-````#\_________[3:`0```````@```-,!``#\____
+M_____R3;`0```````@```+\```#\_________U3;`0```````@```.4```#\
+M_________U[;`0```````@```#("``#\_________X3;`0```````@```,(`
+M``#\_________Y[;`0```````@```(T!``#\_________\W;`0```````@``
+M`(D!``#\_________][;`0```````@```$T!``#\__________';`0``````
+M"P````8```"N`0```````/O;`0```````@```#T"``#\_________Q#<`0``
+M`````@```$D"``#\_________R7<`0```````@```$D"``#\_________VW<
+M`0```````@```.H```#\_________Y3<`0```````@```%D!``#\________
+M_]+<`0```````@```%$!``#\_________QC=`0```````@```+\```#\____
+M_____T?=`0```````@```.4```#\_________U'=`0```````@```#("``#\
+M_________W?=`0```````@```,(```#\_________Y'=`0```````@```(T!
+M``#\_________ZS=`0```````@```(D!``#\_________[W=`0```````@``
+M`$T!``#\_________]#=`0``````"P````8```"N`0```````-K=`0``````
+M`@```#T"``#\_________^_=`0```````@```$D"``#\_________P#>`0``
+M````"P````8```"N`0````````K>`0```````@```#T"``#\_________Q_>
+M`0```````@```$D"``#\_________Y_>`0```````@```$D"``#\________
+M_PG?`0```````@```%D!``#\_________S[?`0```````@```$D"``#\____
+M_____U??`0```````@```.H```#\_________Z;?`0```````@```)8!``#\
+M_________[K?`0```````@```-0!``#\_________]3?`0```````@```-,!
+M``#\_________UG@`0``````"P```,,``````````````&K@`0```````@``
+M`%,!``#\_________WS@`0```````@```+P```#\_________X?@`0``````
+M`@```-,```#\_________\3@`0```````@```#(!``#\_________]3@`0``
+M`````@```-`!``#\_________\CA`0```````@```+4!``#\_________PGB
+M`0```````@```-`!``#\_________UWB`0```````@```%D!``#\________
+M_SKF`0```````@```((!``#\_________V7F`0```````@```*P!``#\____
+M_____^OF`0``````"P````$```"P\P$```````SG`0```````@````D!``#\
+M_________POH`0``````"P````$```"P\P$``````#_H`0```````@````D!
+M``#\_________SSI`0``````"P````$```"P\P$``````&_I`0```````@``
+M``D!``#\_________]?I`0``````"P````$```"P\P$```````?J`0``````
+M`@````D!``#\_________U?J`0``````"P````$```"P\P$``````(?J`0``
+M`````@````D!``#\_________U7K`0```````@```*T!``#\_________\WK
+M`0```````@```,0```#\_________Z7L`0```````@```&X!``#\________
+M_T/M`0```````@```$<!``#\_________[?M`0```````@```((!``#\____
+M_____^?M`0```````@```*X!``#\_________P3N`0```````@```%(!``#\
+M_________R7O`0```````@```*P!``#\_________^OP`0```````@```%X!
+M``#\_________RWQ`0```````@```&X!``#\_________]3Q`0```````@``
+M`$<!``#\_________U7R`0```````@```.X```#\_________^KR`0``````
+M`@```$<!``#\_________Y+S`0```````@```$<!``#\_________^3S`0``
+M`````@```*P!``#\_________T[T`0```````@```$<!``#\_________XKT
+M`0```````@```$<!``#\_________]OT`0```````@```$<!``#\________
+M_QOU`0```````@```$<!``#\_________XWX`0```````@```$<!``#\____
+M______#X`0```````@```"`"``#\_________Q3Y`0```````@```"`"``#\
+M_________W'Z`0```````@```&L!``#\_________[_[`0```````@```"`"
+M``#\_________][[`0```````@```"`"``#\__________K[`0```````@``
+M`-,!``#\_________UG\`0```````@```#("``#\_________VG\`0``````
+M`@```"`"``#\_________Y+\`0```````@```#("``#\_________Z+\`0``
+M`````@```"`"``#\_________Z_]`0```````@```#("``#\_________[[]
+M`0```````@```"`"``#\_________]#]`0```````@```#("``#\________
+M_]C]`0```````@```"`"``#\__________?]`0```````@```#("``#\____
+M_______]`0```````@```"`"``#\_________RG^`0```````@```#("``#\
+M_________SC^`0```````@```"`"``#\_________TK^`0```````@```#("
+M``#\_________U+^`0```````@```"`"``#\_________W'^`0```````@``
+M`#("``#\_________WG^`0```````@```"`"``#\_________[[^`0``````
+M`@```#("``#\_________RS_`0```````@```#("``#\_________T'_`0``
+M`````@```.4```#\_________Y[_`0```````@```)8!``#\_________PT`
+M`@``````"P```#<!`````````````!0``@``````"P```,H`````````````
+M`"<``@```````@```-,```#\_________X4``@```````@```)8!``#\____
+M______4``@``````"P```.```````````````/T``@```````@```-,```#\
+M_________Y`!`@```````@```"`"``#\_________[X!`@```````@```"`"
+M``#\_________P\"`@```````@```'$!``#\_________QP"`@```````@``
+M`-L```#\_________V\"`@```````@```)8!``#\_________\("`@``````
+M"P```.```````````````,H"`@```````@```-,```#\_________V0#`@``
+M`````@```"`"``#\_________Y(#`@```````@```"`"``#\_________]\#
+M`@```````@```+H```#\_________^P#`@```````@```-L```#\________
+M_U8$`@```````@```)8!``#\_________Z@$`@``````"P```#<!````````
+M`````*\$`@``````"P```,H``````````````,($`@```````@```-,```#\
+M_________Q@%`@```````@```)8!``#\_________X,%`@``````"P````$`
+M````.0(``````)4%`@```````@```-,```#\_________\(%`@``````"P``
+M`.T``````````````%X&`@```````@```#("``#\_________VL&`@``````
+M`@```"`"``#\_________X`&`@```````@```#("``#\_________XH&`@``
+M`````@```"`"``#\_________TX'`@```````@```#("``#\_________UL'
+M`@```````@```"`"``#\_________W`'`@```````@```#("``#\________
+M_WH'`@```````@```"`"``#\_________Q8(`@```````@```,D!``#\____
+M_____T@(`@```````@```+`!``#\_________U`(`@```````@```&L!``#\
+M_________Y8(`@```````@```"`"``#\_________[8(`@```````@```"`"
+M``#\_________]((`@```````@```"`"``#\__________\(`@```````@``
+M`"`"``#\_________TT)`@```````@```)D!``#\_________U4)`@``````
+M`@```+T```#\_________[L)`@```````@```#("``#\_________\L)`@``
+M`````@```"`"``#\__________`)`@```````@```#("``#\_________P`*
+M`@```````@```"`"``#\_________PD-`@```````@```+$!``#\________
+M_[P-`@```````@```((!``#\_________R8/`@```````@```((!``#\____
+M_____TD/`@```````@```((!``#\_________\(/`@```````@```/L```#\
+M_________^,0`@```````@```#("``#\_________PX1`@```````@```#("
+M``#\_________\X1`@```````@```,\```#\_________^\1`@```````@``
+M`'D!``#\_________P42`@```````@```+0!``#\_________Q02`@``````
+M`@```+0!``#\_________YT2`@```````@```"`"``#\_________\L2`@``
+M`````@```"`"``#\__________\2`@```````@```#("``#\_________Q<3
+M`@```````@```"`"``#\_________V43`@```````@```"`"``#\________
+M_\P3`@```````@```"`"``#\_________S\4`@```````@```"`"``#\____
+M______<4`@```````@```#("``#\_________PH5`@```````@```"`"``#\
+M_________R<5`@```````@```'\!``#\_________S(5`@```````@```)$!
+M``#\_________T05`@```````@```#("``#\_________UX5`@```````@``
+M`#("``#\_________W@5`@```````@```#("``#\_________Y@5`@``````
+M`@```!T!``#\_________ZD5`@```````@```"`"``#\__________<5`@``
+M`````@```#("``#\_________PH6`@```````@```"`"``#\_________R<6
+M`@```````@```'\!``#\_________S(6`@```````@```)$!``#\________
+M_T06`@```````@```#("``#\_________UX6`@```````@```#("``#\____
+M_____W@6`@```````@```#("``#\_________Y@6`@```````@```!T!``#\
+M_________ZD6`@```````@```"`"``#\_________\T6`@```````@```#("
+M``#\_________]@6`@```````@```#X!``#\__________86`@```````@``
+M`!P!``#\_________P,7`@```````@```"`"``#\_________QX7`@``````
+M`@```"`"``#\_________S87`@```````@```"`"``#\_________R`8`@``
+M`````@```"`"``#\_________[L8`@```````@```)8!``#\_________]D8
+M`@```````@```-0!``#\__________48`@```````@```-,!``#\________
+M_UL9`@``````"P````$`````.0(``````&@9`@```````@```%,!``#\____
+M_____W<9`@```````@```+P```#\_________X(9`@```````@```-,```#\
+M_________YP:`@``````"P````4```#@"0```````*8:`@```````@```#T"
+M``#\_________S4;`@``````"P````4````P"@```````#\;`@```````@``
+M`#T"``#\_________T\;`@```````@```%$!``#\_________VH;`@``````
+M`@```%0!``#\_________SL<`@```````@```'X!``#\_________[8<`@``
+M````"P```-$``````````````,$<`@```````@```&\!``#\_________]D<
+M`@```````@```$$!``#\_________S,=`@```````@```'X!``#\________
+M_T8=`@```````@```"T!``#\_________W8=`@```````@```*H!``#\____
+M_____RD>`@```````@```/T```#\_________S,>`@```````@```,T!``#\
+M__________L>`@```````@```%$!``#\_________WP?`@```````@```%D!
+M``#\_________]$?`@```````@```+X!``#\__________,?`@```````@``
+M`$H!``#\_________P,@`@```````@```*H!``#\_________ZL@`@``````
+M`@```"D!``#\_________UHA`@```````@```%D!``#\_________]@A`@``
+M`````@```"D!``#\_________W,B`@```````@```$D"``#\_________XDB
+M`@```````@```$D"``#\_________[PB`@```````@```"D!``#\________
+M_R(C`@```````@```$D"``#\_________W`C`@```````@```$D"``#\____
+M_____ZXC`@```````@```+\```#\_________^0C`@```````@```.4```#\
+M_________^XC`@```````@```#("``#\_________Q0D`@```````@```,(`
+M``#\_________RXD`@```````@```(T!``#\_________TDD`@```````@``
+M`(D!``#\_________UHD`@```````@```$T!``#\_________VTD`@``````
+M"P````8```#$`0```````'<D`@```````@```#T"``#\_________XPD`@``
+M`````@```$D"``#\_________Z$D`@``````"P````8```#$`0```````*LD
+M`@```````@```#T"``#\_________\`D`@```````@```$D"``#\________
+M_PXE`@```````@```$D"``#\_________UHE`@```````@```.H```#\____
+M_____W4E`@```````@```$D"``#\_________\TE`@```````@```'8!``#\
+M__________DE`@```````@```%$!``#\_________Q8F`@```````@```$$!
+M``#\_________UTF`@```````@```)X!``#\_________ZLF`@``````"P``
+M``,```!@#@```````!$G`@```````@```&$!``#\_________RTG`@``````
+M`@```#P!``#\_________TDG`@```````@```#P!``#\_________V4G`@``
+M`````@```#P!``#\_________X$G`@```````@```#P!``#\_________Z(G
+M`@```````@```#`!``#\_________\0G`@```````@```#`!``#\________
+M__$G`@```````@```#`!``#\_________Q,H`@```````@```#`!``#\____
+M_____QTH`@```````@```#("``#\_________THH`@```````@```#`!``#\
+M_________VPH`@```````@```#`!``#\_________W8H`@```````@```#("
+M``#\_________Y(H`@```````@```#P!``#\_________ZXH`@```````@``
+M`#P!``#\_________\HH`@```````@```#P!``#\_________^PH`@``````
+M`@```#`!``#\_________P@I`@```````@```#P!``#\_________UTI`@``
+M`````@```#("``#\_________]HI`@```````@```"`"``#\__________@I
+M`@```````@```"`"``#\_________PPJ`@```````@```#("``#\________
+M_R8J`@```````@```$H!``#\_________S4J`@```````@```#("``#\____
+M_____TPJ`@```````@```#P!``#\_________U8J`@```````@```#("``#\
+M_________W(J`@```````@```#P!``#\_________WPJ`@```````@```#("
+M``#\_________ZDJ`@```````@```#`!``#\_________[,J`@```````@``
+M`#("``#\_________\\J`@```````@```#P!``#\_________]DJ`@``````
+M`@```#("``#\_________^,J`@```````@```!0!``#\__________$J`@``
+M`````@```'4!``#\_________Q,K`@```````@```#`!``#\_________S4K
+M`@```````@```#`!``#\_________U<K`@```````@```#`!``#\________
+M_WDK`@```````@```#`!``#\_________Y4K`@```````@```#P!``#\____
+M_____Z0K`@```````@```#("``#\_________[LK`@```````@```#P!``#\
+M_________\4K`@```````@```#("``#\_________^<K`@```````@```#`!
+M``#\_________P,L`@```````@```#P!``#\_________R0L`@```````@``
+M`#`!``#\_________SDL`@```````@```,T!``#\_________U(L`@``````
+M`@```#P!``#\_________UPL`@```````@```#("``#\_________X8L`@``
+M`````@```#`!``#\_________Y`L`@```````@```#("``#\_________ZDL
+M`@```````@```#P!``#\_________[,L`@```````@```#("``#\________
+M_^\M`@```````@```+X```#\__________HM`@```````@```-,!``#\____
+M_____V4N`@```````@```"`"``#\_________XPN`@```````@```"`"``#\
+M_________\TN`@```````@```"`"``#\__________8N`@```````@```+X`
+M``#\_________P$O`@```````@```-,!``#\_________PPO`@```````@``
+M`&$!``#\_________SLO`@```````@```&$!``#\_________X0P`@``````
+M`@```)X!``#\_________XXP`@```````@```#("``#\_________ZTP`@``
+M`````@```)X!``#\_________[<P`@```````@```#("``#\_________T4Q
+M`@```````@```"`"``#\_________UPQ`@```````@```"`"``#\________
+M_YLQ`@```````@```#("``#\_________[0Q`@```````@```$H!``#\____
+M_____\\Q`@```````@```)`!``#\_________^0Q`@```````@```)`!``#\
+M__________(Q`@```````@```#("``#\_________R`R`@```````@```"`"
+M``#\_________T8R`@```````@```"`"``#\_________UXR`@```````@``
+M`#("``#\_________V\R`@``````"P````4```!H"@```````'DR`@``````
+M`@```#T"``#\_________XDR`@```````@```)8!``#\_________]\R`@``
+M````"P````$`````.0(``````.HR`@```````@```-,```#\__________LR
+M`@``````"P````8```#:`0````````4S`@```````@```#T"``#\________
+M_Q4S`@```````@```)8!``#\_________V0S`@``````"P````$`````.0(`
+M`````&\S`@```````@```-,```#\_________YHS`@```````@```)8!``#\
+M_________^TS`@``````"P````$`````.0(``````/LS`@```````@```-,`
+M``#\_________Q$T`@```````@```)8!``#\_________V0T`@``````"P``
+M``$`````.0(``````'(T`@```````@```-,```#\_________X@T`@``````
+M`@```)8!``#\_________]<T`@``````"P````$`````.0(``````.(T`@``
+M`````@```-,```#\__________@T`@```````@```)8!``#\_________T<U
+M`@``````"P````$`````.0(``````%(U`@```````@```-,```#\________
+M_V@U`@```````@```)8!``#\_________\(U`@``````"P````$`````.0(`
+M`````,TU`@```````@```-,```#\_________P@V`@```````@```'X!``#\
+M_________R,V`@```````@```"H!``#\_________WLV`@```````@```&$!
+M``#\_________[<V`@```````@```&$!``#\_________\DV`@```````@``
+M`%D!``#\_________QDW`@```````@```+X!``#\_________T$W`@``````
+M`@```$H!``#\_________U8W`@```````@```*H!``#\_________X0W`@``
+M`````@```%D!``#\_________^(W`@```````@```+X!``#\_________PTX
+M`@```````@```$H!``#\_________R(X`@```````@```*H!``#\________
+M_ULX`@```````@```%D!``#\_________XDX`@```````@```.P```#\____
+M_____Z<X`@```````@```%$!``#\_________R8Z`@```````@```+X```#\
+M_________S$Z`@```````@```-,!``#\_________[<Z`@```````@```#("
+M``#\__________TZ`@```````@```($!``#\_________Q([`@```````@``
+M`$H!``#\_________VH[`@``````"P````4```"@"@```````'0[`@``````
+M`@```#T"``#\_________X8[`@```````@```$P!``#\_________P4\`@``
+M`````@```#("``#\_________Z,\`@```````@```+X```#\_________ZX\
+M`@```````@```-,!``#\_________\4\`@```````@```+X```#\________
+M_]`\`@```````@```-,!``#\_________]L\`@```````@```$H!``#\____
+M_____\$]`@```````@```$L!``#\_________]@]`@```````@```$L!``#\
+M_________^\]`@```````@```/(```#\_________P$^`@```````@```%4!
+M``#\_________Q0^`@```````@```'P!``#\_________S$^`@```````@``
+M`!(!``#\_________T,^`@```````@```$`!``#\_________U4^`@``````
+M`@```,H!``#\_________VD^`@```````@```+L!``#\_________Y0^`@``
+M`````@```%D!``#\__________(^`@```````@```+X!``#\_________QT_
+M`@```````@```$H!``#\_________S(_`@```````@```*H!``#\________
+M_X<_`@```````@```.P```#\_________Y8_`@```````@```%D!``#\____
+M_____\$_`@``````"P````8```#P`0```````,L_`@```````@```#T"``#\
+M_________]@_`@```````@```.P```#\__________@_`@```````@```%$!
+M``#\_________Y1!`@```````@```(L!``#\_________Z)!`@``````"P``
+M``,```"(#P```````/A!`@```````@```$$!``#\_________VY"`@``````
+M`@```'X!``#\_________X-"`@```````@```"T!``#\_________\)"`@``
+M`````@```*H!``#\_________U1#`@```````@```%D!``#\_________W5#
+M`@```````@```,P```#\_________[-#`@```````@```((!``#\________
+M_V1$`@```````@```$D"``#\_________YQ$`@```````@```+\```#\____
+M_____[9$`@```````@```.4```#\_________\!$`@```````@```#("``#\
+M_________^M$`@```````@```,(```#\_________PA%`@```````@```(T!
+M``#\_________RQ%`@```````@```(D!``#\_________T!%`@```````@``
+M`$T!``#\_________UM%`@```````@```$D"``#\_________W9%`@``````
+M`@```$D"``#\_________ZY%`@```````@```.H```#\_________QU&`@``
+M`````@```,P```#\_________RM&`@```````@```(8!``#\_________^%&
+M`@```````@```((!``#\_________S!(`@```````@```+X!``#\________
+M_T1(`@```````@```*H!``#\_________W%(`@```````@```.P```#\____
+M_____WU(`@```````@```$$!``#\_________RI)`@```````@```%D!``#\
+M_________TM)`@```````@```,P```#\_________W])`@```````@```,P`
+M``#\_________Z])`@```````@```,P```#\_________\%)`@```````@``
+M`((!``#\__________])`@```````@```.$```#\_________TI+`@``````
+M`@```'<!``#\_________VQ+`@```````@```%D!``#\_________X!+`@``
+M`````@```+\```#\_________Y1+`@```````@```.4```#\_________YY+
+M`@```````@```#("``#\_________\9+`@```````@```(D!``#\________
+M_]=+`@```````@```$T!``#\_________^Q+`@```````@```$D"``#\____
+M_____P%,`@```````@```$D"``#\_________RU,`@```````@```.H```#\
+M_________TA,`@```````@```/0```#\_________[A,`@```````@```)<!
+M``#\_________]5,`@```````@```,P```#\_________QE-`@```````@``
+M`,P```#\_________TI-`@```````@```,P```#\_________UQ-`@``````
+M`@```.$```#\_________VY-`@```````@```%0!``#\_________Y=-`@``
+M`````@```.$```#\_________^M.`@```````@```$$!``#\_________Q-0
+M`@```````@```+X!``#\_________R)0`@```````@```*H!``#\________
+M_V90`@```````@```%$!``#\_________Z50`@```````@```,P```#\____
+M_____\Q0`@```````@```"8!``#\_________S91`@```````@```!L!``#\
+M_________TM1`@``````"P```-$``````````````%91`@```````@```&\!
+M``#\_________WI1`@```````@```#,!``#\_________X51`@```````@``
+M`!L!``#\_________[]1`@```````@```)`!``#\_________\U1`@``````
+M`@```#("``#\_________QU2`@```````@```.H```#\_________S12`@``
+M`````@```,@!``#\_________V=2`@```````@```&$!``#\_________XE2
+M`@```````@````T"``#\_________Y52`@```````@```&(!``#\________
+M_ZM2`@```````@```%D!``#\_________\U2`@```````@```(D!``#\____
+M_____]Y2`@```````@```$T!``#\__________-2`@```````@```$D"``#\
+M_________PA3`@```````@```$D"``#\_________Q]3`@```````@```.H`
+M``#\_________T!3`@```````@```%D!``#\_________U%3`@```````@``
+M`$$!``#\_________Y)3`@```````@```$H!``#\_________X%4`@``````
+M`@```+X```#\_________XQ4`@```````@```-,!``#\_________^I4`@``
+M````"P````4```#`"@```````/14`@```````@```#T"``#\_________Q15
+M`@```````@```.H```#\_________Q]5`@```````@```-,!``#\________
+M_U95`@```````@```$4!``#\_________XQ5`@```````@```#("``#\____
+M_____Y=5`@```````@```-,!``#\_________ZQ5`@```````@```)X!``#\
+M_________[A5`@```````@```#("``#\_________\-5`@```````@```-,!
+M``#\_________\Y5`@```````@```.<```#\_________R16`@```````@``
+M`%D!``#\_________XQ6`@```````@```$H!``#\_________P18`@``````
+M`@```#`!``#\_________V!8`@```````@```+X```#\_________VM8`@``
+M`````@```-,!``#\_________W]8`@```````@```&$!``#\_________Z98
+M`@``````"P````,```"0#P```````-]8`@```````@```"`"``#\________
+M_S%9`@```````@```"`"``#\_________UQ9`@```````@```"`"``#\____
+M_____[]9`@```````@```"`"``#\_________^99`@```````@```"`"``#\
+M_________TM:`@```````@```"`"``#\_________X=:`@```````@```+X`
+M``#\_________Y):`@```````@```-,!``#\_________Z):`@```````@``
+M`%$!``#\_________]U:`@```````@```+X```#\_________^A:`@``````
+M`@```-,!``#\__________Y:`@``````"P```',!`````````````!5;`@``
+M`````@```"L"``#\_________RY;`@```````@```#("``#\_________UM;
+M`@```````@```%,"``#\_________X];`@```````@```"`"``#\________
+M_[5;`@```````@```"`"``#\_________[I;`@```````@```%,"``#\____
+M_____S1<`@```````@```%D!``#\_________Y!<`@```````@```(D!``#\
+M_________[!<`@```````@```$T!``#\_________]A<`@```````@```$D"
+M``#\_________WE=`@``````"P````8```#$`0```````(-=`@```````@``
+M`#T"``#\_________YQ=`@```````@```$D"``#\_________\)=`@``````
+M`@```.H```#\_________^]=`@```````@```"`"``#\_________Q5>`@``
+M`````@```"`"``#\_________V5>`@```````@```%D!``#\_________Z)>
+M`@```````@```$$!``#\_________]1>`@```````@```.4```#\________
+M_]Y>`@```````@```#("``#\_________QU?`@```````@```"`"``#\____
+M_____T-?`@```````@```"`"``#\_________SA@`@```````@```"`"``#\
+M_________UM@`@```````@```"`"``#\_________^M@`@```````@```"4!
+M``#\_________PAA`@```````@```+4!``#\_________T=A`@```````@``
+M`"`"``#\_________VIA`@```````@```"`"``#\_________Z%A`@``````
+M`@```"`"``#\_________\1A`@```````@```"`"``#\_________QEB`@``
+M`````@```"`"``#\_________S]B`@```````@```"`"``#\_________WQB
+M`@```````@```"`"``#\_________Z1B`@```````@```+X```#\________
+M_Z]B`@```````@```-,!``#\_________[IB`@```````@```&$!``#\____
+M_____]%B`@```````@```.4```#\_________]MB`@```````@```#("``#\
+M_________T5D`@```````@```+X```#\_________U!D`@```````@```-,!
+M``#\_________Y]D`@```````@```+X```#\_________ZID`@```````@``
+M`-,!``#\_________\%D`@```````@```*H!``#\_________\YE`@``````
+M`@```!0"``#\_________R=F`@``````"P````8````$`@```````#%F`@``
+M`````@```#T"``#\_________T1F`@```````@```+X```#\_________T]F
+M`@```````@```-,!``#\_________Y9F`@```````@```%D!``#\________
+M_R-G`@```````@```%D!``#\_________XMG`@```````@```*H!``#\____
+M_____U5H`@```````@```#("``#\_________]AH`@```````@```#("``#\
+M_________RYI`@```````@```#("``#\_________T]I`@```````@```+X`
+M``#\_________UII`@```````@```-,!``#\_________VAI`@```````@``
+M`*D!``#\_________REJ`@```````@```#("``#\_________VYJ`@``````
+M`@```#("``#\_________X]J`@```````@```+X```#\_________YIJ`@``
+M`````@```-,!``#\_________ZAJ`@```````@```*D!``#\_________]YJ
+M`@```````@```#("``#\_________S=K`@```````@```#("``#\________
+M_Y1K`@```````@```#("``#\_________\]K`@```````@```#@!``#\____
+M______]K`@```````@```+X```#\_________PIL`@```````@```-,!``#\
+M_________Q5L`@```````@```*H!``#\_________WAL`@```````@```"`"
+M``#\_________Q]O`@```````@```,````#\_________S-O`@```````@``
+M`,````#\_________T]O`@```````@```,````#\_________]=O`@``````
+M`@```,````#\_________^MO`@```````@```,````#\_________PEP`@``
+M`````@```,````#\_________TYP`@```````@```"4!``#\_________WYP
+M`@```````@```'$!``#\_________\9P`@```````@```%T!``#\________
+M_P]Q`@```````@```,T```#\_________Q=Q`@```````@```!8!``#\____
+M_____R9Q`@``````"P````,```"X$````````&]Q`@```````@```/,```#\
+M_________X1Q`@```````@```"P!``#\_________^9Q`@```````@```#("
+M``#\_________W5W`@```````@````L```#\`````````(%W`@``````"P``
+M``L``````0```````(YW`@```````@```.\```#\_________]9W`@``````
+M`@```*<!``#\_________ZYX`@```````@```#4!``#\_________]MX`@``
+M`````@```)L!``#\_________^IX`@```````@```#4!``#\_________\IY
+M`@```````@```%D!``#\_________Q%Z`@```````@```&T!``#\________
+M_RYZ`@```````@```!0"``#\_________T5Z`@```````@```-\```#\____
+M_____\-Z`@```````@```#$!``#\__________IZ`@```````@```"P!``#\
+M_________T)[`@```````@```%`!``#\_________W%\`@```````@```#("
+M``#\_________X-]`@```````@````L```#^`````````)!]`@``````"P``
+M``L``````0```````)I]`@```````@```.\```#\_________]M]`@``````
+M`@````L```#^`````````.A]`@``````"P````L``````0```````/)]`@``
+M`````@```.\```#\_________W-^`@```````@```"`"``#\_________\%^
+M`@```````@```"`"``#\_________]E^`@```````@```.,```#\________
+M_^M^`@```````@```.,```#\__________U^`@```````@```.,```#\____
+M_____P]_`@```````@```.,```#\_________R%_`@```````@```.,```#\
+M_________S-_`@```````@```.,```#\_________U9_`@```````@```"`"
+M``#\_________Z-_`@```````@```"`"``#\_________\-_`@```````@``
+M`"`"``#\_________TR``@```````@```.,```#\_________Y6``@``````
+M`@```)8!``#\_________ZF``@```````@```(\!``#\_________SN!`@``
+M`````@```!0"``#\_________VB!`@```````@```!0"``#\_________W.!
+M`@``````"P```(H!`````````````(&!`@```````@```%,!``#\________
+M_XR!`@```````@```-,```#\_________]F!`@```````@```)8!``#\____
+M_____^F!`@```````@```(\!``#\_________T."`@``````"P```(H!````
+M`````````%&"`@```````@```%,!``#\_________UR"`@```````@```-,`
+M``#\_________[B"`@```````@```!H!``#\_________\:"`@```````@``
+M`.4```#\_________]""`@```````@```#("``#\_________P2#`@``````
+M`@```!`!``#\_________Q2#`@```````@```.4```#\_________QZ#`@``
+M`````@```#("``#\_________T.#`@```````@```!H!``#\_________U2#
+M`@```````@```.4```#\_________UZ#`@```````@```#("``#\________
+M_Z6#`@```````@```!`!``#\_________SV$`@```````@```-````#\____
+M_____TB$`@```````@```-,!``#\_________].&`@```````@```,L!``#\
+M__________&&`@```````@```"`!``#\_________]:'`@```````@```$@!
+M``#\_________^N'`@``````"P```&@!`````````````"N(`@```````@``
+M`,L!``#\_________SV(`@```````@```"`!``#\_________]2(`@``````
+M`@```$@!``#\_________P&)`@```````@```$@!``#\_________Z^)`@``
+M`````@`````!``#\_________\>)`@```````@````T!``#\_________]^)
+M`@```````@```%L!``#\_________T>*`@``````"P````,```#X$```````
+M`+2-`@```````@```%H!``#\_________T*.`@```````@```%H!``#\____
+M_____UN.`@```````@```!0"``#\_________RV/`@```````@```/````#\
+M_________[20`@```````@```"`"``#\_________\B0`@```````@```"`"
+M``#\_________]:0`@```````@```#("``#\_________Q^1`@```````@``
+M``<```#D`0```````&J1`@```````@```"`"``#\_________YZ1`@``````
+M"P````<```#@`0```````,:1`@```````@````<```#T`0```````!22`@``
+M`````@```"`"``#\_________XF2`@```````@````<````$`@```````->2
+M`@```````@```"`"``#\_________PN3`@``````"P````<``````@``````
+M`"Z3`@```````@````<````4`@```````'R3`@```````@```"`"``#\____
+M_____^>3`@``````"P````<```#P`0```````/F3`@``````"P````<````0
+M`@```````(^4`@```````@```"`"``#\_________R*5`@```````@```"`"
+M``#\_________\&5`@```````@```"`"``#\_________^"5`@```````@``
+M`#("``#\_________ZZ6`@```````@```,X```#\_________V"9`@``````
+M`@```(@!``#\_________^>:`@```````@````,````<%@```````/.:`@``
+M````"P````<```!@`P```````&>?`@``````"P````<````@`@```````&R?
+M`@```````@````4"``#\_________^J?`@```````@```.\```#\________
+M__B?`@```````@```#("``#\_________PV@`@```````@```+,!``#\____
+M_____S>@`@``````"P````8````8`@```````$&@`@```````@```#T"``#\
+M_________Y:@`@```````@```"@"``#\_________ZJ@`@```````@```"@"
+M``#\_________[Z@`@```````@```"@"``#\_________S&A`@```````@``
+M`+D!``#\_________TNA`@```````@```#$"``#\_________UZA`@``````
+M`@```#$"``#\_________WBA`@```````@```#$"``#\_________XNA`@``
+M`````@```#$"``#\_________Z6A`@```````@```#$"``#\_________[BA
+M`@```````@```#$"``#\_________]*A`@```````@```#$"``#\________
+M_^6A`@```````@```#$"``#\_________Q.B`@```````@```#$"``#\____
+M_____R.B`@```````@```#$"``#\_________TJB`@```````@```#$"``#\
+M_________UVB`@```````@```#$"``#\_________W>B`@```````@```#$"
+M``#\_________XJB`@```````@```#$"``#\_________Z2B`@```````@``
+M`#$"``#\_________[>B`@```````@```#$"``#\_________]&B`@``````
+M`@```#$"``#\_________^2B`@```````@```#$"``#\__________ZB`@``
+M`````@```#$"``#\_________Q&C`@```````@```#$"``#\_________RNC
+M`@```````@```#$"``#\_________SZC`@```````@```#$"``#\________
+M_UBC`@```````@```#$"``#\_________VNC`@```````@```#$"``#\____
+M_____X6C`@```````@```#$"``#\_________YBC`@```````@```#$"``#\
+M_________[*C`@```````@```#$"``#\_________\6C`@```````@```#$"
+M``#\_________]^C`@```````@```#$"``#\__________*C`@```````@``
+M`#$"``#\_________PRD`@```````@```#$"``#\_________Q^D`@``````
+M`@```#$"``#\_________SFD`@```````@```#$"``#\_________TRD`@``
+M`````@```#$"``#\_________V:D`@```````@```#$"``#\_________WFD
+M`@```````@```#$"``#\_________Y.D`@```````@```#$"``#\________
+M_Z:D`@```````@```#$"``#\_________\BD`@```````@```&("``#\____
+M_____^*D`@```````@```&("``#\_________P2E`@```````@```&("``#\
+M_________QZE`@```````@```&("``#\_________T"E`@```````@```&("
+M``#\_________UJE`@```````@```&("``#\_________WRE`@```````@``
+M`&("``#\_________Y:E`@```````@```&("``#\_________[BE`@``````
+M`@```&("``#\_________]*E`@```````@```&("``#\__________2E`@``
+M`````@```&("``#\_________PZF`@```````@```&("``#\_________S"F
+M`@```````@```&("``#\_________TJF`@```````@```&("``#\________
+M_VRF`@```````@```&("``#\_________X:F`@```````@```&("``#\____
+M_____[*F`@```````@```-H```#\_________[JF`@```````@```$8!``#\
+M_________\FF`@```````@```$8!``#\_________]&F`@```````@```"@!
+M``#\_________]NF`@```````@```#("``#\_________^.F`@```````@``
+M`%P!``#\__________"F`@```````@```"$!``#\__________VF`@``````
+M`@```"$!``#\_________QVG`@```````@```"$!``#\_________S6G`@``
+M`````@```#T!``#\_________TBG`@```````@```#T!``#\_________U6G
+M`@```````@```#T!``#\_________VBG`@```````@```#T!``#\________
+M_W6G`@```````@```.4```#\_________WZG`@```````@```$8"``#[____
+M_____]VG`@```````@```)8!``#\_________S^H`@``````"P````$```"0
+MG`(``````$JH`@```````@```-,```#\_________X&H`@```````@```+\`
+M``#\_________Y.H`@```````@```#("``#\_________YNH`@```````@``
+M`.4```#\_________^&H`@```````@```-,!``#\_________VJI`@``````
+M`@```)8!``#\_________^NI`@``````"P````$```"0G`(``````/:I`@``
+M`````@```-,```#\_________RVJ`@```````@```+\```#\_________S^J
+M`@```````@```#("``#\_________T>J`@```````@```.4```#\________
+M_X2J`@```````@```-0!``#\_________PRK`@``````"P````$```"0G`(`
+M`````!FK`@```````@```%,!``#\_________RZK`@```````@```+P```#\
+M_________SFK`@```````@```-,```#\_________W"K`@```````@```+\`
+M``#\_________X*K`@```````@```#("``#\_________XJK`@```````@``
+M`.4```#\_________[JK`@```````@```+X```#\_________\^K`@``````
+M`@```-,!``#\_________]>K`@```````@```)8!``#\_________^RK`@``
+M`````@```+X```#\__________VL`@``````"P````$```"0G`(```````JM
+M`@```````@```%,!``#\_________Q^M`@```````@```+P```#\________
+M_RJM`@```````@```-,```#\_________V&M`@```````@```+\```#\____
+M_____W.M`@```````@```#("``#\_________WNM`@```````@```.4```#\
+M_________[6M`@```````@```+X```#\_________\RM`@```````@```-,!
+M``#\_________VNN`@```````@```)8!``#\_________Y&N`@``````"P``
+M``8````T`@```````)NN`@```````@```#T"``#\_________Z>N`@``````
+M`@```-0!``#\_________\"N`@```````@```-,!``#\__________*N`@``
+M`````@```$D"``#\_________PNO`@```````@```+\```#\_________UNO
+M`@```````@```!0"``#\_________T.P`@```````@```+H!``#\________
+M_YNP`@``````"P````$```"0G`(``````*JP`@```````@```%,!``#\____
+M_____\6P`@```````@```+P```#\_________]NP`@```````@```-,```#\
+M_________Q>Q`@```````@```+\```#\_________RFQ`@```````@```#("
+M``#\_________S.Q`@```````@```.4```#\_________W6Q`@```````@``
+M`!0"``#\_________Z>Q`@```````@```+X```#\_________[RQ`@``````
+M`@```!D!``#\_________\NQ`@```````@```-,!``#\_________^BQ`@``
+M`````@```$D"``#\_________\BR`@```````@```+X```#\_________]BR
+M`@```````@```!D!``#\_________^.R`@```````@```-,!``#\________
+M_[RS`@```````@```+\```#\__________ZS`@```````@```+X!``#\____
+M_____T2T`@```````@```&$!``#\_________UFT`@```````@```$H!``#\
+M_________WBT`@```````@```*H!``#\_________\*T`@```````@```(,!
+M``#\_________^FU`@```````@```&0!``#\_________Q&V`@```````@``
+M`,0!``#\_________S&V`@```````@```$L"``#\_________VFV`@``````
+M`@```-H```#\_________W&V`@```````@```&`!``#\_________WFV`@``
+M`````@```&`!``#\_________X:V`@```````@```"$!``#\_________XZV
+M`@```````@```$8!``#\_________YJV`@```````@```$8!``#\________
+M_Z:V`@```````@```"@!``#\_________["V`@```````@```#("``#\____
+M_____[BV`@```````@```%P!``#\_________\VV`@``````"P```/\`````
+M`````````.2V`@```````@```"L"``#\__________&V`@```````@```%$!
+M``#\_________Q6W`@```````@```&4!``#\_________R2W`@```````@``
+M`&4!``#\_________TFW`@```````@````L```"_`0```````%:W`@``````
+M`@````L```"\`0```````&&W`@```````@````,````<%@```````'"W`@``
+M````"P````<```!@`P```````'>W`@``````"P```/H``````````````'ZW
+M`@``````"P````<```!T`P```````(JW`@``````"P````<```!B`P``````
+M`-6W`@``````"P```/H````<`````````.VW`@``````"P```/H````<````
+M``````&X`@``````"P```/H````<``````````^X`@``````"P```/H````<
+M`````````!FX`@``````"P```/H````<`````````$^X`@``````"P```/H`
+M```<`````````&.X`@``````"P```/H````<`````````'&X`@``````"P``
+M`/H````<`````````(RX`@``````"P````<```!L`P```````-6X`@``````
+M`@````,````<%@```````/.X`@``````"P````<```!L`P````````&Y`@``
+M````"P````<```!P`P```````#&Y`@``````"P```/H``````````````$6Y
+M`@``````"P```/H````<`````````'"Y`@``````"P```/H````,````````
+M`):Y`@``````"P```/H````=`````````*6Y`@``````"P```/H````<````
+M`````-ZY`@```````@````X"``#\_________V:Z`@```````@```(T!``#\
+M_________X*Z`@```````@```,(```#\_________XJZ`@```````@```(,!
+M``#\_________ZBZ`@```````@```$T!``#\_________[RZ`@```````@``
+M`$T!``#\_________V&[`@``````"P````4````8"P```````&N[`@``````
+M`@```#T"``#\_________WV[`@```````@```)8!``#\_________[&[`@``
+M````"P````4```!@"P```````+N[`@```````@```#T"``#\_________P"\
+M`@``````"P````$```"0G`(```````N\`@```````@```-,```#\________
+M_T*\`@```````@```+\```#\_________U2\`@```````@```#("``#\____
+M_____UR\`@```````@```.4```#\_________Y^\`@```````@```)8!``#\
+M_________\6\`@```````@```-0!``#\_________^2\`@```````@```-,!
+M``#\_________T^]`@``````"P````$```"0G`(``````%Z]`@```````@``
+M`%,!``#\_________W"]`@```````@```+P```#\_________WN]`@``````
+M`@```-,```#\_________[*]`@```````@```+\```#\_________\2]`@``
+M`````@```#("``#\_________\R]`@```````@```.4```#\__________R]
+M`@```````@```$P!``#\_________R&^`@```````@```+X```#\________
+M_RR^`@```````@```-,!``#\_________T.^`@```````@```-,!``#\____
+M_____Z:^`@``````"P````,```#@$0```````-N^`@```````@```"0!``#\
+M_________Q2_`@```````@```!4!``#\_________TJ_`@```````@```$D"
+M``#\_________U^_`@```````@```+\```#\_________W:_`@```````@``
+M`#("``#\_________WZ_`@```````@```.4```#\_________[>_`@``````
+M`@```$D"``#\_________\N_`@```````@```,X!``#\_________]>_`@``
+M`````@```*L!``#\_________[+``@``````"P````4```"H"P```````+S`
+M`@```````@```#T"``#\__________#``@```````@````T"``#\________
+M_P7!`@``````"P````$`````P`(``````!G!`@```````@```"L"``#\____
+M_____[[#`@```````@```(T!``#\_________^##`@```````@```,(```#\
+M_________PW$`@```````@```%D!``#\_________WC$`@```````@```%D!
+M``#\_________]3$`@```````@```$D"``#\_________Q3%`@```````@``
+M`%D!``#\_________X#%`@```````@```$D"``#\_________Z;&`@``````
+M`@```"0!``#\__________S&`@```````@```&0!``#\_________P['`@``
+M`````@```$T!``#\_________TG'`@```````@```.4```#\_________V_'
+M`@```````@```%$!``#\_________X_'`@```````@````T"``#\________
+M_Z3'`@``````"P```/\``````````````+?'`@```````@```"L"``#\____
+M_____QG)`@```````@```(,!``#\_________VW)`@``````"P````,````P
+M$@```````)7)`@```````@```.D```#\__________#)`@```````@```.D`
+M``#\_________TO*`@```````@```.D```#\_________Z;*`@```````@``
+M`.D```#\__________?+`@``````"P````,```!0$P```````"C,`@``````
+M`@```.D```#\_________XC,`@```````@```.D```#\_________^#,`@``
+M`````@```.D```#\_________SC-`@```````@```.D```#\_________Y'-
+M`@```````@```.D```#\_________^C-`@```````@```.D```#\________
+M_T3.`@```````@```.D```#\_________Z#.`@```````@```.D```#\____
+M______C.`@```````@```.D```#\_________U#/`@```````@```.D```#\
+M_________Z#/`@```````@```"4!``#\_________]K/`@```````@```"4!
+M``#\_________Q30`@```````@```"4!``#\_________T[0`@```````@``
+M`"4!``#\_________X70`@```````@```"4!``#\_________[S0`@``````
+M`@```"4!``#\_________U;1`@```````@````L```"\`0```````&+1`@``
+M`````@````L```"\`0```````$_3`@```````@```!P"``#\_________VG3
+M`@```````@```!P"``#\_________[/3`@```````@````,````<%@``````
+M`,G3`@``````"P````<```!@`P```````-O3`@``````"P````<```!B`P``
+M`````.G3`@``````"P````<```!P`P```````/+3`@``````"P````<```!P
+M`P```````/G3`@``````"P````<```!L`P```````!/4`@``````"P````<`
+M``!P`P```````$W4`@```````@```%8"``#\_________V_4`@```````@``
+M`$X"``#\_________YW4`@``````"P```/H``````````````+74`@``````
+M"P```/H````<`````````-S4`@``````"P```/H````,`````````/G4`@``
+M````"P```/H````=``````````/5`@``````"P```/H````=``````````O5
+M`@``````"P```/H````<`````````"C5`@``````"P```/H````=````````
+M`#S5`@``````"P```/H````<`````````*[6`@```````@```(,!``#\____
+M_____SW8`@```````@```#4!``#\_________V[8`@```````@```)L!``#\
+M_________WW8`@```````@```#4!``#\_________R#<`@```````@```#4!
+M``#\_________T[<`@```````@```)L!``#\_________UW<`@```````@``
+M`#4!``#\_________S_@`@```````@```#4!``#\_________VW@`@``````
+M`@```)L!``#\_________W[@`@```````@```#4!``#\_________S_D`@``
+M`````@```#4!``#\_________VWD`@```````@```)L!``#\_________W[D
+M`@```````@```#4!``#\_________^3F`@```````@```)8!``#\________
+M_^#H`@```````@```!0"``#\_________ZSJ`@``````"P````$```!`L@(`
+M`````"OK`@```````@```+H!``#\_________SCK`@```````@```%,!``#\
+M_________TOK`@```````@```+P```#\_________VGK`@```````@```%,!
+M``#\_________WOK`@```````@```-0!``#\_________ZSK`@```````@``
+M`+P```#\_________\'K`@```````@````X!``#\__________+K`@``````
+M`@```+P```#\_________S?L`@```````@```!0"``#\_________ZKL`@``
+M`````@```!0"``#\_________^[L`@```````@```-,```#\__________OL
+M`@```````@```-,!``#\_________YCO`@```````@```%8"``#\________
+M_[KO`@```````@```%8"``#\_________Q+Q`@```````@```+X!``#\____
+M_____VCQ`@```````@```%D!``#\_________\#Q`@```````@```$H!``#\
+M__________'Q`@```````@```&$!``#\_________R_R`@```````@```!T!
+M``#\_________UKR`@```````@```*H!``#\_________X3R`@```````@``
+M`%D!``#\_________][R`@```````@```"D!``#\_________R/S`@``````
+M`@```"H"``#\_________R[S`@```````@```"H"``#\_________T+S`@``
+M`````@```.0!``#\_________W/S`@```````@```"("``#\_________QKT
+M`@```````@```"("``#\_________V3T`@```````@```/4!``#\________
+M_^/T`@```````@```-H!``#\__________#T`@```````@```-H!``#\____
+M______KT`@```````@```.0!``#\_________P;U`@```````@```.0!``#\
+M_________QGU`@```````@```-H!``#\_________VKU`@```````@```#,"
+M``#[_________^/U`@```````@```-H!``#\_________]/V`@```````@``
+M`"("``#\_________WWW`@```````@```#4"``#\_________\'W`@``````
+M`@```#4"``#\_________TCX`@```````@```#4"``#\_________VSX`@``
+M`````@```%,"``#\_________^GX`@```````@```#4"``#\_________S/Y
+M`@```````@```#4"``#\_________TWY`@```````@```%,"``#\________
+M_UKZ`@```````@```%,"``#\_________X7Z`@``````"P````8```!4`@``
+M`````(SZ`@```````@```#T"``#\_________XO[`@```````@```/`!``#[
+M_________Z;[`@```````@````T"``#\_________[[[`@``````"P```.8!
+M`````````````('\`@```````@```/`!``#[_________Y;\`@```````@``
+M``T"``#\_________ZS\`@``````"P```.8!`````````````+[\`@``````
+M`@```"L"``#\_________^7\`@```````@```$`"``#\_________V7]`@``
+M`````@```!T"``#\_________SG^`@```````@```$,"``#[_________W;^
+M`@```````@```.$!``#\_________\?_`@```````@```$\"``#\________
+M__+_`@```````@```/$!``#\_________P@``P```````@```#,"``#[____
+M_____Q<``P```````@```/H!``#\_________R$``P```````@```.(!``#\
+M_________S0``P```````@```.P!``#\_________YD``P```````@````L`
+M``!,`@```````+H``P```````@````L```!,`@```````,H``P```````@``
+M``L```!,`@```````-H``P```````@```%X"``#\__________@``P``````
+M`@```$`"``#\_________P4!`P```````@````L```!,`@```````!,!`P``
+M````"P````$```#``@,``````"@!`P```````@```#$"``#\_________SP!
+M`P```````@````L```!(`@```````',!`P```````@```$4"``#\________
+M_WH!`P``````"P````L````@`@```````(0!`P```````@````L````H`@``
+M`````(@!`P``````"P```&,"`````````````(\!`P```````@````L````T
+M`@```````)L!`P```````@````L````<`@```````*`!`P```````@```"L"
+M``#\_________Q0"`P```````@```-H!``#\_________V("`P```````@``
+M`&,"``#\_________Y8"`P```````@```#("``#\_________YX"`P``````
+M`@```!4"``#\_________^@"`P```````@```/(!``#\_________S4#`P``
+M`````@```#$"``#\_________U`#`P```````@```#$"``#\__________(#
+M`P```````@```/\!``#\__________($`P```````@```!$"``#\________
+M__X$`P```````@```$`"``#\_________T(%`P```````@```#$"``#\____
+M_____U$%`P```````@```-P!``#\_________\(%`P```````@```#X"``#\
+M_________]@%`P```````@```#X"``#\_________^@%`P```````@```-H!
+M``#\_________RH&`P```````@```#X"``#\_________T<&`P```````@``
+M`#X"``#\_________V$&`P```````@```#X"``#\_________WX&`P``````
+M`@```#X"``#\_________YX&`P```````@```#X"``#\_________\<&`P``
+M`````@```!8"``#\_________]X&`P```````@```#X"``#\_________^4&
+M`P```````@```-H!``#\_________SD'`P```````@```"("``#\________
+M_T('`P```````@```$0"``#\_________V`'`P```````@```"("``#[____
+M_____]T'`P```````@```"("``#\__________8'`P```````@```#,"``#[
+M_________R,(`P```````@```.H!``#\_________SP(`P```````@```$`"
+M``#\_________U<(`P```````@````L```!0`@```````&<(`P```````@``
+M``L```!0`@```````&H)`P```````@```#$"``#\_________W4)`P``````
+M`@```"("``#\_________[@)`P```````@```!$"``#\__________<)`P``
+M`````@```#$"``#\_________Q`*`P```````@```-H!``#\_________V$*
+M`P```````@```"("``#\_________QOY`@```````@````<"``#\________
+M_ROY`@```````@```#4"``#\___________Y`@```````@````<"``#\____
+M_____W7Z`@```````@````<"``#\__________/Z`@```````@````T"``#\
+M_________]7[`@```````@```"L"``#\_________ZS]`@```````@```&$"
+M``#\_________[W]`@```````@```#$"``#\_________^']`@```````@``
+M`#<"``#\_________X4"`P```````@```#4"``#\_________\L#`P``````
+M`@```#$"``#\_________Y,*`P``````"P````$```!@,@,``````+8*`P``
+M`````@````<```"X`P```````&`+`P``````"P````$```#P$`,``````$(-
+M`P```````@```$$"``#\_________WX-`P```````@```#0"``#\________
+M_[$-`P``````"P````$```"@#P,``````-T-`P```````@```#0"``#\____
+M_____UD.`P```````@````,````D%@```````&8.`P```````@````,````H
+M%@```````+X.`P``````"P````$```!P$`,``````#8/`P```````@```-8!
+M``#\_________X(/`P``````"P````$```"P#P,``````,8/`P```````@``
+M`!<"``#\_________PD0`P```````@```"H"``#\_________P\0`P``````
+M`@````<```"T`P```````"L0`P```````@````<```"X`P```````$40`P``
+M`````@````<```"X`P```````%$0`P``````"P````<```"@`P```````%<0
+M`P```````@````<```"W`P```````%T0`P```````@```%T"``#\________
+M_YP0`P```````@```!<"``#\_________T81`P```````@```#$"``#\____
+M_____U01`P``````"P````$`````#0,``````(L1`P``````"P````<```"@
+M`P```````)<1`P```````@```!`"``#\_________[$2`P``````"P````<`
+M``"@`P```````+82`P```````@```!`"``#\_________[X2`P```````@``
+M`$`"``#\_________ZH3`P``````"P````<```"@`P```````*\3`P``````
+M`@```!`"``#\_________[<3`P```````@```$`"``#\_________PL4`P``
+M````"P````<```"@`P```````!`4`P```````@```!`"``#\_________Q@4
+M`P```````@```$`"``#\_________TD4`P``````"P````<```"@`P``````
+M`$X4`P```````@```!`"``#\_________U84`P```````@```$`"``#\____
+M_____XX4`P``````"P````<```"@`P```````),4`P```````@```!`"``#\
+M_________YL4`P```````@```$`"``#\__________$4`P``````"P````<`
+M``"@`P````````85`P```````@```!`"``#\_________Q$5`P```````@``
+M`#$"``#\_________R45`P``````"P````<```"@`P```````#(5`P``````
+M`@```!`"``#\_________T\5`P```````@```#$"``#\_________]$5`P``
+M`````@```/L!``#\_________^H5`P```````@```$`"``#\_________P`6
+M`P``````"P````$````P$0,``````$,6`P```````@```-8!``#\________
+M_Y86`P``````"P````<```"@`P```````)L6`P```````@```!`"``#\____
+M______(6`P``````"P````,````P%@```````#<7`P```````@```&`"``#\
+M_________W`7`P```````@```/L!``#\_________WX7`P```````@```$L"
+M``#\_________Z<7`P```````@```$`"``#\_________\(7`P``````"P``
+M``$```#`&`,``````-87`P```````@```&`"``#\_________^,7`P``````
+M`@```$L"``#\_________S08`P``````"P````,```!P%@```````)@8`P``
+M`````@```&`"``#\_________^$8`P```````@```#$"``#\__________L8
+M`P``````"P````$```!P*@,``````!D9`P```````@```#,"``#[________
+M_W$9`P```````@```.\!``#\_________Y@9`P``````"P````<```"@`P``
+M`````)T9`P```````@```!`"``#\_________Z@9`P```````@```#$"``#\
+M_________]$9`P```````@```/L!``#\_________^<9`P```````@```/0!
+M``#\_________R<<`P```````@```/0!``#\_________U0<`P```````@``
+M`.\!``#\_________[4<`P```````@```/0!``#\_________]L<`P``````
+M`@```.\!``#\_________PH=`P``````"P````<```"@`P````````\=`P``
+M`````@```!`"``#\_________Q<=`P```````@```$`"``#\_________VD=
+M`P```````@```#,"``#[_________\H=`P```````@```.\!``#\________
+M__T=`P```````@```.\!``#\_________TD>`P```````@```.\!``#\____
+M_____V0>`P```````@```/L!``#\_________WH>`P```````@```/0!``#\
+M_________\H>`P```````@```#,"``#\_________Q@?`P```````@```.\!
+M``#\_________XH?`P``````"P````<```"@`P```````(\?`P```````@``
+M`!`"``#\_________YH?`P```````@```#$"``#\_________P<A`P``````
+M`@```/0!``#\_________Q4A`P``````"P````4`````#````````!XA`P``
+M`````@```#T"``#\_________TPA`P```````@```/0!``#\_________UDA
+M`P``````"P````4````H#````````&(A`P```````@```#T"``#\________
+M_Y\A`P```````@```.\!``#\_________\$A`P```````@```/0!``#\____
+M_____^,A`P```````@```/0!``#\__________XA`P``````"P````8```!P
+M`@```````"TB`P```````@```#T"``#\_________ULC`P```````@```/0!
+M``#\_________XLC`P```````@```.\!``#\_________Z\C`P```````@``
+M`.\!``#\_________]DC`P```````@```.T!``#\_________QTD`P``````
+M`@```.\!``#\_________T(D`P```````@```$,"``#[_________UXD`P``
+M`````@```/0!``#\_________WDD`P```````@```!@"``#\__________XD
+M`P```````@```.\!``#\_________PDE`P``````"P````4```!0#```````
+M`"HE`P```````@```#T"``#\_________\LE`P```````@```/0!``#\____
+M______0E`P```````@```.\!``#\_________Q\F`P```````@```.\!``#\
+M_________SDF`P``````"P````8```"%`@```````$`F`P```````@```#T"
+M``#\_________UTF`P```````@```/0!``#\_________XLF`P```````@``
+M`.\!``#\_________\(F`P```````@```.\!``#\_________\TF`P``````
+M"P````4```"`#````````.TF`P```````@```#T"``#\_________P\G`P``
+M`````@```!0"``#\_________TPG`P```````@```.\!``#\_________UPG
+M`P```````@```/D!``#\_________X`G`P```````@```.\!``#\________
+M_[,G`P```````@```.\!``#\_________^`G`P```````@```.\!``#\____
+M______<G`P```````@```!$"``#\_________PXH`P```````@```/0!``#\
+M_________T(H`P```````@```!@"``#\_________\TH`P```````@```/4!
+M``#\_________[0I`P```````@```%L"``#\_________^0I`P```````@``
+M`-<!``#\_________S,J`P```````@```#,"``#[_________V(J`P``````
+M`@```/<!``#\_________XTJ`P```````@```/(!``#\_________Z<J`P``
+M`````@```$,"``#[_________Q8K`P```````@```%4"``#\_________R`K
+M`P```````@```.P!``#\_________T(K`P``````"P```-D!````````````
+M`%DK`P```````@```&`"``#\_________P,L`P```````@```.X!``#\____
+M_____RDL`P```````@```!$"``#\_________YLL`P```````@```.X!``#\
+M_________[<L`P```````@```.X!``#\_________ZDM`P```````@```!@"
+M``#\_________QLN`P```````@```!$"``#\_________UPN`P```````@``
+M`.T!``#\_________]0N`P```````@```-P!``#\_________^$N`P``````
+M`@```$$"``#\_________R`O`P```````@```-@!``#\_________TLO`P``
+M`````@```-P!``#\_________XXO`P```````@```#$"``#\_________]`O
+M`P```````@```/$!``#\__________4O`P```````@```.$!``#\________
+M_^(P`P```````@```$$"``#\_________VPQ`P```````@```%4"``#\____
+M_____X$Q`P```````@```/H!``#\_________ZDQ`P```````@```.(!``#\
+M_________\\Q`P```````@```$`"``#\__________(Q`P``````"P````$`
+M``!P+P,``````"PR`P```````@```-8!``#\_________XHS`P```````@``
+M`%H"``#\__________8S`P``````"P````$```"@-`,```````4U`P``````
+M`@```%H"``#\__________0U`P```````@```/L!``#\_________\,-`P``
+M`````@```#D"``#\_________XL/`P```````@```#D"``#\_________Z$/
+M`P```````@```!<"``#\__________H/`P```````@```","``#\________
+M_]@0`P```````@```&`"``#\_________R,1`P```````@```&`"``#\____
+M_____W<1`P```````@```&`"``#\_________]P1`P```````@```#$"``#\
+M_________X,5`P```````@```#$"``#\_________[P6`P```````@```#X"
+M``#\_________P09`P```````@```.@!``#\_________U(=`P```````@``
+M`!$"``#\_________^,J`P```````@```/L!``#\_________PXK`P``````
+M`@```#$"``#\_________SLL`P```````@```.T!``#\__________LN`P``
+M`````@```!$"``#\_________V(O`P```````@```.T!``#\_________U@T
+M`P```````@```&`"``#\_________Y`T`P```````@```%H"``#\________
+M_ZPU`P```````@```&`"``#\_________R,V`P```````@```"("``#\____
+M_____PHW`P```````@```"("``#\_________\TW`P```````@```"("``#\
+M_________](X`P```````@```"("``#\_________X\Z`P``````"P````,`
+M``"P%@```````+0^`P```````@`````"``#\_________\0_`P```````@``
+M```"``#\_________X!``P``````"P````,```#P%@```````+)!`P``````
+M`@`````"``#\_________QU"`P```````@`````"``#\_________\%"`P``
+M`````@`````"``#\_________^)"`P```````@````L```!@`@```````/]"
+M`P```````@````L```!<`@```````!!#`P``````"P````L```"``@``````
+M`"M#`P``````"P````L```"``@```````%E#`P```````@````L```!@`@``
+M`````)Q#`P```````@```-\!``#\__________-(`P```````@`````"``#\
+M_________S-)`P```````@`````"``#\_________W-)`P```````@`````"
+M``#\_________]E)`P```````@`````"``#\_________T!*`P```````@``
+M```"``#\_________[Y*`P```````@`````"``#\_________T-+`P``````
+M`@```#,"``#[_________V-+`P```````@`````"``#\_________Y!+`P``
+M`````@`````"``#\_________S9,`P```````@`````"``#\_________UI,
+M`P```````@`````"``#\_________T9-`P```````@`````"``#\________
+M_VI-`P```````@`````"``#\_________P1.`P```````@`````"``#\____
+M_____RE.`P```````@`````"``#\_________Z1.`P```````@`````"``#\
+M_________[%.`P```````@`````"``#\_________^-.`P```````@`````"
+M``#\_________PE/`P```````@`````"``#\_________W1/`P```````@``
+M```"``#\_________X%/`P```````@`````"``#\_________\-/`P``````
+M`@`````"``#\_________^U/`P```````@`````"``#\_________TA0`P``
+M`````@`````"``#\_________U10`P```````@`````"``#\_________[A0
+M`P```````@`````"``#\_________\10`P```````@`````"``#\________
+M_RA1`P```````@`````"``#\_________S11`P```````@`````"``#\____
+M_____Y91`P```````@`````"``#\_________Z)1`P```````@`````"``#\
+M__________91`P```````@`````"``#\_________P)2`P```````@`````"
+M``#\_________U92`P```````@`````"``#\_________V)2`P```````@``
+M```"``#\_________[92`P```````@`````"``#\_________\)2`P``````
+M`@`````"``#\_________T93`P```````@`````"``#\_________U)3`P``
+M`````@`````"``#\_________[93`P```````@`````"``#\_________\)3
+M`P```````@`````"``#\_________R]4`P```````@`````"``#\________
+M_SQ4`P```````@`````"``#\_________TA4`P```````@`````"``#\____
+M_____U-4`P```````@`````"``#\_________^94`P```````@`````"``#\
+M__________)4`P```````@`````"``#\_________U95`P```````@`````"
+M``#\_________V)5`P```````@`````"``#\_________\I5`P```````@``
+M```"``#\_________]95`P```````@`````"``#\_________SQ6`P``````
+M`@`````"``#\_________TA6`P```````@`````"``#\_________U17`P``
+M`````@`````"``#\_________V%7`P```````@`````"``#\_________Q18
+M`P```````@`````"``#\_________R%8`P```````@`````"``#\________
+M_X98`P```````@`````"``#\_________Y)8`P```````@`````"``#\____
+M_____Q59`P```````@`````"``#\_________SI9`P```````@`````"``#\
+M_________\59`P```````@`````"``#\_________^I9`P```````@`````"
+M``#\_________U1:`P```````@`````"``#\_________V!:`P```````@``
+M```"``#\_________W1;`P```````@`````"``#\_________X%;`P``````
+M`@`````"``#\_________U)<`P```````@`````"``#\_________U]<`P``
+M`````@`````"``#\_________R!=`P```````@`````"``#\_________RU=
+M`P```````@`````"``#\_________V1=`P```````@````<````<!```````
+M`'M=`P``````"P````<````@!````````,%>`P``````"P````$```#00@,`
+M`````,-?`P```````@```-\!``#\_________U-@`P```````@```$,"``#\
+M_________\Y@`P```````@```#0"``#\__________U@`P``````"P````$`
+M``"`:@,``````$]A`P```````@```#0"``#\_________UYA`P```````@``
+M`$`"``#\_________Q5B`P```````@```#0"``#\_________VIB`P``````
+M"P````$```#0:P,``````'=B`P``````"P````$```"0:P,``````'QB`P``
+M`````@```#D"``#\_________]9B`P```````@```$`"``#\_________WIC
+M`P```````@```#$"``#\_________ZQC`P``````"P````8```">`@``````
+M`+-C`P```````@```#T"``#\__________9C`P```````@```$`"``#\____
+M_____XED`P```````@```#$"``#\_________[MD`P``````"P````8```"Y
+M`@```````,)D`P```````@```#T"``#\_________VUE`P``````"P````$`
+M``#0G0,``````)UE`P``````"P````$```#P;P,``````-UE`P``````"P``
+M``$```"`<0,``````!UF`P``````"P````$```#@\@,``````%UF`P``````
+M"P````$````0XP,``````)UF`P``````"P````$```"`J@,``````-UF`P``
+M````"P````$```"0YP,``````!UG`P``````"P````$```"@K@,``````%UG
+M`P``````"P````$```!@JP,``````)UG`P``````"P````$```!0]@,`````
+M`-UG`P``````"P````$````@GP,``````!UH`P``````"P````$````0Z@,`
+M`````%UH`P``````"P````$```"`KP,``````)UH`P``````"P````$```"`
+MKP,``````-UH`P``````"P````$```"@L0,``````!UI`P``````"P````$`
+M``"`P@,``````%UI`P``````"P````$```!0]P,``````)UI`P``````"P``
+M``$`````Q`,``````-UI`P``````"P````$````@ZP,``````!UJ`P``````
+M"P````$```#PP@,``````%UJ`P``````"P````$```"0S`,``````(1J`P``
+M````"P````$````@_P,``````+AJ`P``````"P````$````PS0,``````!!K
+M`P```````@```#$"``#\_________QMK`P``````"P````$```!0Q`,`````
+M`*-K`P``````"P````$```"@;`,``````"QL`P```````@```!<"``#\____
+M_____SML`P```````@```#0"``#\_________VQL`P``````"P````$```"0
+M:P,``````,ML`P```````@```#$"``#\_________WUM`P``````"P````4`
+M``#8#````````(1M`P```````@```#T"``#\_________Y%M`P```````@``
+M`/L!``#\_________Z9M`P```````@```#$"``#\_________ZYM`P``````
+M`@```!<"``#\_________]IM`P``````"P````4```"P#````````.%M`P``
+M`````@```#T"``#\_________^YM`P```````@```/L!``#\_________QIN
+M`P```````@```!<"``#\_________R9N`P``````"P````$```"```0`````
+M`+AN`P```````@```#$"``#\_________\!N`P```````@```!<"``#\____
+M_____S1O`P``````"P````$````@F0,```````UP`P```````@`````"``#\
+M_________]AP`P```````@```.\!``#\_________^1P`P``````"P````$`
+M``#@7@,``````%QQ`P```````@```.\!``#\_________Y9Q`P```````@``
+M```"``#\_________P]R`P```````@```.\!``#\_________S!R`P``````
+M"P````$```#@7@,``````(-R`P```````@```!<"``#\_________XMR`P``
+M````"P````$```#@7@,``````&]S`P``````"P````$````0=0,``````$UT
+M`P``````"P````$```#@7@,``````%YT`P```````@```","``#\________
+M_R]U`P``````"P````$```#@7@,``````%YU`P```````@```"("``#\____
+M_____^9U`P``````"P````$```#@7@,``````/IU`P```````@```","``#\
+M_________Q)V`P```````@````L```!<`@```````!AV`P```````@````L`
+M``!@`@```````#5V`P``````"P````L```"``@```````$!V`P``````"P``
+M``L```"(`@```````$QV`P``````"P````L```"0`@```````%AV`P``````
+M"P````L```"8`@```````&1V`P``````"P````L```"@`@```````&]V`P``
+M````"P````L```"H`@```````(IV`P```````@````L```!<`@```````))V
+M`P``````"P````$```#@7@,``````"IW`P``````"P````$```#@7@,`````
+M`-%W`P``````"P````$```#@7@,``````.)W`P```````@```","``#\____
+M_____R]X`P```````@`````"``#\_________XMX`P``````"P````$```#@
+M7@,``````/5X`P```````@`````"``#\_________SEY`P``````"P````$`
+M``#@7@,``````(AY`P```````@```"("``#\_________]AY`P``````"P``
+M``$```#@7@,``````"UZ`P```````@```"("``#\_________ZUZ`P``````
+M"P````$```#@7@,``````(A[`P``````"P````$```#@7@,``````)M[`P``
+M`````@```","``#\_________VM\`P``````"P````$```#@7@,``````'Y\
+M`P```````@```","``#\_________VM]`P``````"P````$```#@7@,`````
+M`'Y]`P```````@```","``#\_________UM^`P``````"P````$```#@7@,`
+M`````&Y^`P```````@```","``#\_________TM_`P``````"P````$```#@
+M7@,``````%Y_`P```````@```","``#\_________RF``P``````"P````$`
+M``#@7@,``````#R``P```````@```","``#\_________W6``P``````"P``
+M``$```#@7@,``````"6!`P``````"P````$```#@7@,``````#:!`P``````
+M`@```","``#\_________W:!`P``````"P````$```#@7@,``````*2!`P``
+M````"P````8```#1`@```````,:!`P```````@```$,"``#\_________\Z!
+M`P``````"P````$```#@7@,``````/2!`P``````"P````8```#>`@``````
+M`!&"`P```````@```!H"``#\_________QJ"`P``````"P````8```#O`@``
+M`````"V"`P``````"P````8````,`P```````$B"`P``````"P````$```#P
+MB0,``````'J"`P```````@```-X!``#\_________X:"`P``````"P````8`
+M```I`P```````*&"`P``````"P````$```#P@@,``````,B"`P``````"P``
+M``$```#@7@,``````%J#`P``````"P````$```#@7@,``````&N#`P``````
+M`@```","``#\__________&#`P```````@`````"``#\_________R6$`P``
+M`````@```#$"``#\_________RV$`P```````@```!<"``#\_________VF$
+M`P``````"P````$```#@7@,``````"B%`P``````"P````$```#@F`,`````
+M`'N%`P```````@`````"``#\_________YN%`P```````@`````"``#\____
+M_____\:%`P```````@`````"``#\_________QB&`P```````@`````"``#\
+M_________VN&`P```````@`````"``#\_________YB&`P```````@`````"
+M``#\_________RB'`P```````@`````"``#\_________S*'`P```````@``
+M```"``#\_________VN'`P```````@`````"``#\_________XN'`P``````
+M`@`````"``#\_________ZB'`P```````@`````"``#\_________R"(`P``
+M`````@`````"``#\_________V"(`P```````@`````"``#\_________YR(
+M`P```````@`````"``#\_________]R(`P```````@`````"``#\________
+M_QR)`P```````@`````"``#\_________UV)`P```````@`````"``#\____
+M_____X>)`P``````"P````8````,`P```````$J*`P```````@```/`!``#\
+M_________XN*`P```````@````T"``#\_________Z&*`P``````"P```.8!
+M`````````````+.*`P```````@```"L"``#\_________\J*`P``````"P``
+M``$```#@7@,``````-N*`P```````@```","``#\__________**`P``````
+M`@```-L!``#\_________U6+`P```````@```#0"``#\_________QJ,`P``
+M````"P````$```!@Y`,``````&6,`P```````@```$`"``#\_________X^,
+M`P```````@```!0"``#\_________\:,`P``````"P````$```#P;`,`````
+M`-B,`P``````"P````$```#@7@,``````.N,`P```````@```","``#\____
+M_____^F-`P``````"P````$```#@7@,``````#".`P``````"P````$```#@
+M7@,``````$..`P```````@```","``#\_________WN.`P```````@`````"
+M``#\_________YN.`P```````@`````"``#\_________]2.`P```````@``
+M```"``#\_________^*.`P```````@```#0"``#\_________RJ/`P``````
+M`@```!0"``#\_________VV/`P``````"P````$```#`6P,``````'B/`P``
+M````"P````$```!@<@,``````-"/`P``````"P````$```#@7@,``````#60
+M`P``````"P````$```#@7@,``````$:0`P```````@```","``#\________
+M_W20`P```````@```#,"``#[_________Y:0`P``````"P````8```#>`@``
+M`````*V0`P``````"P````8```#O`@```````/:0`P```````@```-X!``#\
+M_________P61`P``````"P````$```#@7@,``````&21`P```````@```!H"
+M``#\_________X.1`P``````"P````8````,`P```````*21`P``````"P``
+M``8```#1`@```````.V1`P```````@```$,"``#\_________RZ2`P``````
+M`@```/`!``#\_________[V2`P```````@`````"``#\_________Q64`P``
+M`````@```.\!``#\_________U^4`P```````@```.\!``#\_________XV4
+M`P```````@```.\!``#\_________\26`P``````"P````$```#@7@,`````
+M`->6`P```````@```","``#\_________R&8`P``````"P````$```#@7@,`
+M`````#*8`P```````@```","``#\_________Y.8`P```````@```%@"``#\
+M_________YZ8`P```````@```#0"``#\_________[N8`P``````"P````$`
+M````;@,``````.N8`P```````@`````"``#\__________.8`P```````@``
+M`#L"``#\__________N8`P``````"P````$```#@7@,``````"F9`P``````
+M`@```#L"``#\_________SB9`P``````"P````$```#@7@,``````+Z9`P``
+M````"P````$`````90,``````%2:`P``````"P````$```!`G`,``````#>;
+M`P```````@```/L!``#\_________TB;`P```````@```-X!``#[________
+M_VB;`P```````@```-X!``#[_________]&;`P```````@```/L!``#\____
+M_____QV<`P```````@```/L!``#\_________X:<`P``````"P````$```!@
+MF0,``````-N=`P``````"P````$```!`G`,``````':>`P``````"P````$`
+M``!`G`,``````(:>`P```````@```"X"``#\_________]^>`P``````"P``
+M``$```!`G`,``````/^>`P```````@```"X"``#\_________S>?`P``````
+M`@`````"``#\_________U&?`P``````"P````$```#@7@,``````(6?`P``
+M````"P````,````P%P```````+:?`P```````@```/L!``#\_________U2@
+M`P```````@```/@!``#\_________W:@`P``````"P````$```!`G`,`````
+M`)R@`P```````@```"X"``#\_________ZF@`P```````@```/L!``#\____
+M_____\R@`P```````@```/L!``#\_________QNA`P```````@```/L!``#\
+M_________QBB`P```````@```/@!``#\_________T^B`P``````"P````$`
+M``!`G`,``````%^B`P```````@```"X"``#\_________VRB`P```````@``
+M`/L!``#\_________X6B`P```````@```/L!``#\_________SNC`P``````
+M`@```/L!``#\_________^6C`P```````@```/L!``#\_________VJD`P``
+M````"P````$```!`G`,``````'JD`P```````@```"X"``#\_________X>D
+M`P```````@```/L!``#\_________]2D`P```````@```/L!``#\________
+M_R>E`P```````@```!L"``#\_________SBE`P```````@```!L"``#\____
+M_____XZE`P```````@```/L!``#\_________]NE`P```````@```/L!``#\
+M_________^^E`P```````@```%4"``#\__________RE`P```````@```#L"
+M``#\_________PFF`P```````@```!L"``#\_________QFF`P```````@``
+M`%4"``#\_________S"F`P```````@```/@!``#\_________UVF`P``````
+M"P````$```!`G`,``````&VF`P```````@```"X"``#\_________WJF`P``
+M`````@```/L!``#\_________Y&F`P```````@````D"``#\_________Z^F
+M`P```````@```/@!``#\_________^>F`P``````"P````$```!`G`,`````
+M`/>F`P```````@```"X"``#\_________P2G`P```````@```/L!``#\____
+M_____S&G`P``````"P````$```!`G`,``````$&G`P```````@```"X"``#\
+M_________TZG`P```````@```/L!``#\_________W>G`P``````"P````$`
+M``!`G`,``````):G`P```````@```"X"``#\_________Z.G`P```````@``
+M`/L!``#\_________U:J`P```````@```/@!``#\_________YJJ`P``````
+M`@`````"``#\__________&J`P```````@```#L"``#\_________P.K`P``
+M````"P````$```#@7@,``````#>K`P```````@```/<!``#\_________Z*K
+M`P``````"P````$```#@7@,``````+.K`P```````@```","``#\________
+M_]&K`P```````@`````"``#\_________V6L`P```````@```/<!``#\____
+M_____^*N`P``````"P````$```#@7@,``````/.N`P```````@```","``#\
+M_________Q&O`P```````@`````"``#\_________RZO`P```````@```/<!
+M``#\_________XNO`P```````@`````"``#\_________\>O`P```````@``
+M`/<!``#\_________\^O`P``````"P````$```#@7@,``````%.P`P``````
+M`@```-P!``#\_________[.P`P```````@```!$"``#\_________^6P`P``
+M`````@```/,!``#\_________P>Q`P```````@```.\!``#\_________T>Q
+M`P```````@```.\!``#\_________U2Q`P```````@```/<!``#\________
+M_X.Q`P```````@```-P!``#\_________\JQ`P```````@`````"``#\____
+M_____Q&R`P``````"P````$```#@7@,```````6S`P```````@```#$"``#\
+M_________T^S`P```````@````D"``#\_________]6S`P```````@`````"
+M``#\__________.S`P``````"P````,```"H%P````````NT`P```````@``
+M`.H!``#\_________TBT`P```````@```.H!``#\_________X:T`P``````
+M`@`````"``#\_________[.U`P```````@```!@"``#\__________^U`P``
+M`````@`````"``#\_________R^V`P```````@```.L!``#\_________U:V
+M`P```````@```-P!``#\_________V2V`P```````@```!$"``#\________
+M_P:X`P```````@```!@"``#\_________\*X`P```````@`````"``#\____
+M_____QRY`P```````@`````"``#\_________S>Y`P```````@```.L!``#\
+M_________PNZ`P```````@```.`!``#\_________QF[`P```````@```$`"
+M``#\_________S.[`P```````@````D"``#\_________TJ[`P```````@``
+M`.4!``#\_________PN\`P```````@```#L"``#\_________Q.\`P``````
+M`@```!L"``#\_________V:\`P``````"P````$```!`G`,``````':\`P``
+M`````@```"X"``#\_________X.\`P```````@```/L!``#\_________^*\
+M`P``````"P````$```!`G`,``````/*\`P```````@```"X"``#\________
+M__^\`P```````@```/L!``#\_________SR]`P```````@```%@"``#\____
+M_____Y:]`P```````@```-P!``#\_________UJ^`P```````@`````"``#\
+M_________\V^`P```````@`````"``#\__________F^`P``````"P````$`
+M``!`G`,```````F_`P```````@```"X"``#\_________Q:_`P```````@``
+M`/L!``#\_________R._`P```````@```!L"``#\_________S6_`P``````
+M`@```%4"``#\_________U^_`P``````"P````$```!0;@,``````(N_`P``
+M````"P````$```!`G`,``````)N_`P```````@```"X"``#\_________ZB_
+M`P```````@```/L!``#\_________[2_`P``````"P````$```#@:@,`````
+M`'S``P```````@```.T!``#\_________Z?``P```````@```!L"``#\____
+M_____[O``P```````@```%@"``#\_________P;!`P```````@```.X!``#\
+M_________Q/!`P```````@```.T!``#\_________XK!`P```````@`````"
+M``#\_________Z7!`P```````@```.L!``#\_________\_!`P```````@``
+M`-P!``#\_________^?!`P```````@```.L!``#\_________RC"`P``````
+M`@```-P!``#\_________U["`P``````"P````$```#`@P,``````)'"`P``
+M`````@`````"``#\_________[C"`P``````"P````$```#@7@,``````-[#
+M`P``````"P````$```#@7@,``````._#`P```````@```","``#\________
+M_RK$`P``````"P````$```#@7@,``````&[$`P```````@```!<"``#\____
+M_____\3$`P```````@```%@"``#\_________\S$`P```````@```!L"``#\
+M_________^/$`P``````"P````$```#@7@,``````)C&`P```````@```!0"
+M``#\_________Z7&`P```````@```%L"``#\_________Y+'`P```````@``
+M```"``#\__________C'`P```````@```#H"``#\_________S7(`P``````
+M"P````$```#@7@,```````+)`P```````@```.,!``#\__________S)`P``
+M`````@```.D!``#\_________RW,`P```````@```!0"``#\_________SK,
+M`P```````@```%L"``#\_________[3,`P```````@```.P!``#\________
+M_\C,`P```````@`````"``#\_________]_,`P```````@```$$"``#\____
+M_____^?,`P```````@```.P!``#\__________7,`P``````"P````$```#@
+M7@,``````%?-`P```````@```#$"``#\_________\3-`P``````"P````$`
+M````^`,``````/C-`P```````@`````"``#\_________^?.`P``````"P``
+M``$```"0S0,``````!7/`P```````@```%<"``#\_________US0`P``````
+M"P````$```#@7@,``````*+0`P```````@```#0"``#\_________\K0`P``
+M````"P````$```"@W@,```````'1`P```````@```!<"``#\_________Z+2
+M`P``````"P````4````(#0```````*G2`P```````@```#T"``#\________
+M_^G4`P```````@```/@!``#\_________Q;5`P```````@```$`"``#\____
+M_____X+6`P``````"P````$```#0_@,``````%W7`P``````"P````$```#@
+M7@,``````.77`P```````@```$`"``#\__________S7`P```````@```#0"
+M``#\_________V#8`P```````@```!H"``#\__________K8`P``````"P``
+M``$```"0WP,``````,?9`P``````"P````$```"0WP,``````!7:`P``````
+M"P````$```#0_@,``````%W:`P```````@```#$"``#\_________W3:`P``
+M````"P````$```#@7@,``````);:`P```````@```#$"``#\_________Z+:
+M`P```````@```!<"``#\_________S7;`P```````@`````"``#\________
+M_X3;`P```````@`````"``#\_________P3<`P```````@`````"``#\____
+M_____X7<`P```````@`````"``#\_________]3<`P```````@`````"``#\
+M_________U3=`P```````@`````"``#\_________^?=`P```````@````@"
+M``#\__________[=`P```````@```"H"``#\_________W7>`P```````@``
+M`#\"``#\_________PO?`P```````@```#$"``#\_________QO?`P``````
+M`@```!<"``#\_________R/?`P``````"P````$```#@7@,``````-#?`P``
+M`````@```#$"``#\_________^'?`P```````@```!<"``#\_________^G?
+M`P``````"P````$```#@7@,``````';@`P```````@```/L!``#\________
+M_]/@`P```````@`````"``#\_________]_@`P```````@`````"``#\____
+M_____P_A`P```````@```%0"``#\_________X/A`P```````@```%0"``#\
+M_________Z+B`P```````@`````"``#\_________\WB`P```````@```%0"
+M``#\_________^3B`P``````"P````$```#@7@,``````&GC`P```````@``
+M```"``#\_________[#C`P```````@`````"``#\_________[CC`P``````
+M`@```$$"``#\_________]GC`P``````"P````$```#@7@,``````"7D`P``
+M`````@`````"``#\_________POE`P```````@```!<"``#\_________QOE
+M`P``````"P````$```#@7@,``````"SE`P```````@```","``#\________
+M_P3F`P```````@```-<!``#\_________U_F`P```````@```"("``#\____
+M_____V[F`P```````@```"("``#\_________W/F`P```````@```%P"``#\
+M_________]GF`P```````@```.H!``#\_________R3G`P```````@```"("
+M``#\_________VSG`P``````"P````$```#@7@,```````;H`P``````"P``
+M``$```#@Z`,``````!#H`P```````@```.@!``#\_________V'H`P``````
+M"P````$```#@7@,``````'+H`P```````@```","``#\_________Z3H`P``
+M````"P````$```#0Z`,``````+WH`P```````@```&`"``#\_________Q+I
+M`P```````@```/(!``#\_________R3I`P```````@```$,"``#[________
+M_S3I`P```````@```/L!``#\_________Y+I`P``````"P````$```#0Z`,`
+M`````,KI`P```````@```#$"``#\_________^KI`P```````@```#$"``#\
+M__________?I`P```````@```.P!``#\_________S#J`P```````@`````"
+M``#\_________SOJ`P```````@`````"``#\_________T;J`P```````@``
+M`/8!``#\_________UOJ`P``````"P````$```#@7@,``````)3J`P``````
+M`@```/`!``#[_________]'J`P```````@```/`!``#\_________];J`P``
+M`````@````("``#\__________/J`P``````"P```.8!`````````````%WK
+M`P```````@```!0"``#\_________XCK`P``````"P````$```#@7@,`````
+M`)GK`P```````@```","``#\_________^?K`P``````"P````$```#@7@,`
+M`````'/L`P```````@`````"``#\_________]7L`P```````@```#H"``#\
+M_________P;M`P``````"P````$```#@7@,``````*3M`P```````@```.,!
+M``#\_________Y[N`P```````@```.D!``#\_________UKO`P```````@``
+M```"``#\_________[OO`P``````"P````$```#@7@,``````##P`P``````
+M`@```.,!``#\_________SKQ`P```````@`````"``#\_________YKQ`P``
+M````"P````$```#@7@,```````[R`P```````@```.,!``#\__________KR
+M`P```````@```"("``#\_________TOS`P``````"P````$```#@7@,`````
+M`%SS`P```````@```","``#\_________VSS`P```````@`````"``#\____
+M_____[3S`P```````@```/<!``#\_________Z+T`P```````@```!L"``#\
+M_________\/T`P``````"P````,```#P%P```````#KV`P``````"P````$`
+M``#`@P,``````&+V`P```````@`````"``#\_________Q[W`P```````@``
+M`!L"``#\_________R;W`P``````"P````$```#@7@,``````&SW`P``````
+M`@`````"``#\_________Y[W`P```````@```!0"``#\_________\SW`P``
+M````"P````$```#@7@,``````-_W`P```````@```","``#\_________SGX
+M`P```````@```#0"``#\_________TOX`P```````@```!H"``#\________
+M_S'Y`P``````"P````$```!P^@,``````#SY`P``````"P````$````P1`,`
+M``````'Z`P```````@```"<"``#\_________Q_Z`P``````"P````$```#@
+M7@,``````,/Z`P``````"P````$```"0_@,``````&'\`P```````@```!<"
+M``#\_________WW\`P``````"P````$```#@7@,``````"K]`P```````@``
+M`!<"``#\_________UG]`P```````@```"<"``#\_________[K]`P``````
+M`@```!<"``#\_________TO^`P```````@```"<"``#\_________UW^`P``
+M`````@```"<"``#\_________UW_`P```````@```!<"``#\_________[__
+M`P```````@```#$"``#\_________]C_`P```````@`````"``#\________
+M_Q``!````````@```/,!``#\_________R\`!```````"P````$```#@7@,`
+M`````!4!!```````"P````$```#@7@,``````"8!!````````@```","``#\
+M_________S,!!````````@```/L!``#\_________TX!!```````"P````$`
+M``"P:@,``````!QA`P```````@```#D"``#\_________^9A`P```````@``
+M`#D"``#\_________Y=B`P```````@```#4"``#\__________-D`P``````
+M`@```#4"``#\_________WEE`P```````@```"\"``#\_________ZUE`P``
+M`````@```&`"``#\_________^UE`P```````@```&`"``#\_________RUF
+M`P```````@```&`"``#\_________VUF`P```````@```&`"``#\________
+M_ZUF`P```````@```&`"``#\_________^UF`P```````@```&`"``#\____
+M_____RUG`P```````@```&`"``#\_________VUG`P```````@```&`"``#\
+M_________ZUG`P```````@```&`"``#\_________^UG`P```````@```&`"
+M``#\_________RUH`P```````@```&`"``#\_________VUH`P```````@``
+M`&`"``#\_________ZUH`P```````@```&`"``#\_________^UH`P``````
+M`@```&`"``#\_________RUI`P```````@```&`"``#\_________VUI`P``
+M`````@```&`"``#\_________ZUI`P```````@```&`"``#\_________^UI
+M`P```````@```&`"``#\_________RUJ`P```````@```&`"``#\________
+M_VUJ`P```````@```&`"``#\_________Z!J`P```````@```&`"``#\____
+M_____]1J`P```````@```&`"``#\_________S5K`P```````@```&`"``#\
+M_________X1K`P```````@```#D"``#\_________[]K`P```````@```&`"
+M``#\_________\1K`P```````@```!<"``#\_________XYL`P```````@``
+M`#D"``#\_________^%L`P```````@```!<"``#\_________TEN`P``````
+M`@```&`"``#\_________V=O`P```````@```&`"``#\_________^AO`P``
+M`````@```#D"``#\_________PMQ`P```````@```","``#\_________U5R
+M`P```````@```","``#\_________Z5R`P```````@```","``#\________
+M_SMU`P```````@```","``#\_________ZMV`P```````@```","``#\____
+M_____U-W`P```````@```","``#\_________[1X`P```````@```","``#\
+M_________VAY`P```````@```","``#\__________1Y`P```````@```","
+M``#\_________\MZ`P```````@```","``#\_________X^``P```````@``
+M`","``#\_________YF!`P```````@```","``#\_________^V!`P``````
+M`@```","``#\_________W""`P```````@```&`"``#\_________^>"`P``
+M`````@```","``#\_________Y:$`P```````@```","``#\_________Q*%
+M`P```````@```#D"``#\_________UN%`P```````@```&`"``#\________
+M_VN%`P```````@```-8!``#\_________S^,`P```````@```#D"``#\____
+M_____Q2.`P```````@```","``#\_________V..`P```````@```!<"``#\
+M_________YB/`P```````@```#D"``#\__________F/`P```````@```","
+M``#\_________R:1`P```````@```","``#\_________]*8`P```````@``
+M`#D"``#\_________Q69`P```````@```","``#\_________U*9`P``````
+M`@```","``#\_________^29`P```````@```"X"``#\_________V*;`P``
+M`````@```/L!``#\_________Y:;`P```````@```/L!``#\__________N;
+M`P```````@```/L!``#\_________SF<`P```````@```/L!``#\________
+M_]*<`P```````@```"\"``#\__________6=`P```````@```"X"``#\____
+M_____Z&>`P```````@```/L!``#\_________QJ?`P```````@```/L!``#\
+M_________WB?`P```````@```","``#\_________RBK`P```````@```","
+M``#\_________^FO`P```````@```","``#\_________SJR`P```````@``
+M`","``#\_________]G"`P```````@```","``#\_________TG$`P``````
+M`@```","``#\_________P3%`P```````@```","``#\_________VC(`P``
+M`````@```","``#\_________QC-`P```````@```","``#\_________X#-
+M`P```````@```.(!``#\_________^S-`P```````@````\"``#\________
+M_Y+0`P```````@```","``#\_________ZC4`P```````@```#D"``#\____
+M_____]76`P```````@````\"``#\_________Y/7`P```````@```","``#\
+M_________U#:`P```````@````\"``#\_________PO;`P```````@```#D"
+M``#\_________Y7>`P```````@```"$"``#\_________T+?`P```````@``
+M`","``#\_________PC@`P```````@```","``#\_________P7C`P``````
+M`@```","``#\_________P3D`P```````@```","``#\_________X;G`P``
+M`````@```","``#\_________]'H`P```````@```-D!``#\_________\'I
+M`P```````@```&`"``#\_________X/J`P```````@```","``#\________
+M_PWK`P```````@```"L"``#\_________P;L`P```````@```","``#\____
+M_____RWM`P```````@```","``#\_________]SO`P```````@```","``#\
+M_________[OQ`P```````@```","``#\_________T/W`P```````@```","
+M``#\_________T#Z`P```````@```","``#\_________U+Z`P```````@``
+M`#D"``#\_________^SZ`P```````@```&`"``#\_________ZC\`P``````
+M`@```","``#\_________^']`P```````@```#D"``#\_________\?^`P``
+M`````@```#D"``#\_________P[_`P```````@```#D"``#\_________V0`
+M!````````@```","``#\_________X`!!````````@```","``#\________
+M__8#!````````@```/\!``#\_________SD&!```````"P````$```#P"00`
+M`````'H&!````````@```!T"``#\_________\(&!```````"P````$```!@
+M!`0``````,T&!```````"P````$```#P"00``````'8(!````````@````D"
+M``#\_________V()!````````@```!T"``#\_________[0)!```````"P``
+M``$"`````````````,$)!````````@```%<"``#\_________SP*!```````
+M`@```#$"``#\_________V\,!```````"P````$"`````````````'P,!```
+M`````@```%<"``#\_________Y`,!````````@````$"``#\_________T@-
+M!````````@```%H"``#\_________W,-!````````@```&`"``#\________
+M_Q8.!````````@```#D"``#\_________S@.!````````@```-T!``#\____
+M_____W`.!````````@```#D"``#\_________X4#!````````@```&`"``#\
+M_________]@#!````````@```&`"``#\_________SX$!````````@```"<"
+M``#\_________X<'!````````@```#D"``#\_________]8)!````````@``
+M``$"``#\_________UT*!````````@```%H"``#\_________\4*!```````
+M`@```#D"``#\_________VL.!````````@```#4"``#\_________](.!```
+M`````@```/@!``#\_________R81!````````@````,"``#\_________U<1
+M!````````@````,"``#\_________V@1!````````@````,"``#\________
+M__41!````````@```.`!``#\__________02!````````@```.4!``#\____
+M_____^X4!````````@```/L!``#\_________Q<5!````````@```.L!``#\
+M_________Z\5!````````@```!L"``#\_________UX8!````````@```/D!
+M``#\_________VL8!````````@```/0!``#\_________X@8!````````@``
+M`.\!``#\_________[T8!````````@```.\!``#\_________]08!```````
+M`@```/<!``#\_________W`9!````````@```!L"``#\_________Z$9!```
+M`````@````D"``#\_________[\9!````````@````D"``#\_________]$9
+M!````````@````D"``#\_________^$9!````````@```!L"``#\________
+M_^D9!````````@```!L"``#\_________T(:!```````"P````,````@&```
+M`````+8:!````````@```!D"``#\_________P4;!````````@```/T!``#\
+M_________UL;!````````@```.(!``#\__________`;!````````@```!L"
+M``#\_________\0<!````````@```#L"``#\__________8<!````````@``
+M`.L!``#\_________P8=!````````@```!D"``#\_________R<=!```````
+M`@```!@"``#\__________<>!````````@```.\!``#\_________QX?!```
+M`````@```.\!``#\_________RX?!````````@```/D!``#\_________[H?
+M!````````@```.\!``#\_________]0?!````````@```/D!``#\________
+M__4?!````````@```/0!``#\_________Q$@!````````@```/0!``#\____
+M_____PLC!````````@```&4"``#\_________V$C!````````@```&4"``#\
+M_________ZXC!````````@```&4"``#\_________VHD!````````@```/D!
+M``#\_________X0D!````````@```.\!``#\_________XPD!````````@``
+M`/D!``#\_________^XD!````````@```/@!``#\_________P8E!```````
+M`@```#L"``#\_________R<E!````````@```$`"``#\_________ZDE!```
+M`````@```/@!``#\_________\DE!````````@```/D!``#\_________Y(F
+M!````````@```&4"``#\_________THH!````````@```$$"``#\________
+M_V<H!````````@```#L"``#\_________W$H!````````@```!L"``#\____
+M_____ZDH!````````@```!D"``#\__________T2!````````@```/T!``#\
+M_________PD5!````````@```/T!``#\_________Q$<!````````@```#L"
+M``#\_________UPG!````````@```$$"``#\_________],H!````````@``
+M`-H!``#\__________4H!````````@```#@"``#\_________Q$I!```````
+M`@```#@"``#\_________[XJ!```````"P````$```!P*00``````-DJ!```
+M`````@```&`"``#\_________Q$K!````````@```"$"``#\_________U@K
+M!````````@```&("``#\_________V@K!````````@```$P"``#\________
+M_R```````````0````$```"SEP```````"@``````````0````$```"WEP``
+M`````#```````````0````$```#IEP```````#@``````````0````$````7
+MF````````$```````````0````$```!%F````````$@``````````0````$`
+M``!SF````````%```````````0````$```"@F````````%@``````````0``
+M``$```#.F````````&```````````0````$```#\F````````&@`````````
+M`0````$```#.F````````'```````````0````$```#\F````````'@`````
+M`````0````$````JF0```````(```````````0````$```!4F0```````(@`
+M`````````0````$```"-F0```````)```````````0````$````!F@``````
+M`)@``````````0````$````JF@```````*```````````0````$```"+F@``
+M`````*@``````````0````$````OFP```````+```````````0````$```!=
+MFP```````+@``````````0````$```"+FP```````,```````````0````$`
+M``!`G````````,@``````````0````$```!`G````````-```````````0``
+M``$```!`G````````-@``````````0````$```!`G````````.``````````
+M`0````$```!`G````````.@``````````0````$```"-EP```````/``````
+M`````0````$````0G````````/@``````````0````$```"0JP`````````!
+M`````````0````$```"+J`````````@!`````````0````$```"BJ```````
+M`!`!`````````0````$```#"J````````!@!`````````0````$```#UJ```
+M`````"`!`````````0````$````&J0```````"@!`````````0````$````/
+MJ0```````#`!`````````0````$````8J0```````#@!`````````0````$`
+M``#(J0```````$`!`````````0````$```#LJ0```````$@!`````````0``
+M``$```#UJ0```````%`!`````````0````$```#^J0```````%@!````````
+M`0````$```!@J@```````&`!`````````0````$````!JP```````&@!````
+M`````0````$```!>JP```````'`!`````````0````$```!QQ````````'@!
+M`````````0````$```#KP0```````(`!`````````0````$```#\P0``````
+M`(@!`````````0````$````-P@```````)`!`````````0````$````>P@``
+M`````)@!`````````0````$```!JP@```````*`!`````````0````$```")
+MP@```````*@!`````````0````$```"=P@```````+`!`````````0````$`
+M``#RP@```````+@!`````````0````$````.PP```````,`!`````````0``
+M``$````JPP```````,@!`````````0````$```!&PP```````-`!````````
+M`0````$```!NPP```````-@!`````````0````$```""PP```````.`!````
+M`````0````$```!QQ````````.@!`````````0````$```!QQ````````/`!
+M`````````0````$```!QQ````````/@!`````````0````$```"6PP``````
+M```"`````````0````$```#_PP````````@"`````````0````$```!QQ```
+M`````!`"`````````0````$```!QQ````````!@"`````````0````$```"^
+MPP```````"`"`````````0````$```!$Q````````"@"`````````0````$`
+M```]P@```````#`"`````````0````$```!1P@```````#@"`````````0``
+M``$```!QQ````````$`"`````````0````$```"QP@```````$@"````````
+M`0````$```#%P@```````%`"`````````0````$```#9P@```````&`"````
+M`````0````$````S[0```````&@"`````````0````$````S[0```````'`"
+M`````````0````$```!F[0```````'@"`````````0````$```!V[0``````
+M`(`"`````````0````$````S[0```````(@"`````````0````$````S[0``
+M`````)`"`````````0````$````Z[0```````)@"`````````0````$```"&
+M[0```````*`"`````````0````$```"2[0```````*@"`````````0````$`
+M``"B[0```````.`&`````````0````$```#`(`$``````.@&`````````0``
+M``$```#R(`$``````/`&`````````0````$```!\(0$``````/@&````````
+M`0````$```!\(0$````````'`````````0````$```!\(0$```````@'````
+M`````0````$```!\(0$``````!`'`````````0````$````D(0$``````!@'
+M`````````0````$```!0(0$``````"`'`````````0````$```!\(0$`````
+M`"@'`````````0````$```"1(0$``````#`'`````````0````$````S*P$`
+M`````#@'`````````0````$````^*P$``````$`'`````````0````$````^
+M*P$``````$@'`````````0````$````^*P$``````%`'`````````0````$`
+M```^*P$``````%@'`````````0````$````^*P$``````&`'`````````0``
+M``$````^*P$``````&@'`````````0````$````^*P$``````'`'````````
+M`0````$````^*P$``````'@'`````````0````$````^*P$``````(`'````
+M`````0````$````^*P$``````(@'`````````0````$````^*P$``````)`'
+M`````````0````$````^*P$``````)@'`````````0````$````^*P$`````
+M`*`'`````````0````$````^*P$``````*@'`````````0````$````^*P$`
+M`````+`'`````````0````$````^*P$``````+@'`````````0````$````^
+M*P$``````,`'`````````0````$````^*P$``````,@'`````````0````$`
+M```^*P$``````-`'`````````0````$````^*P$``````-@'`````````0``
+M``$````^*P$``````.`'`````````0````$````^*P$``````.@'````````
+M`0````$````^*P$``````/`'`````````0````$````^*P$``````/@'````
+M`````0````$````^*P$````````(`````````0````$````^*P$```````@(
+M`````````0````$````^*P$``````!`(`````````0````$````^*P$`````
+M`!@(`````````0````$````^*P$``````"`(`````````0````$````^*P$`
+M`````"@(`````````0````$````^*P$``````#`(`````````0````$````^
+M*P$``````#@(`````````0````$````^*P$``````$`(`````````0````$`
+M```^*P$``````$@(`````````0````$````^*P$``````%`(`````````0``
+M``$````(*P$``````%@(`````````0````$````^*P$``````&`(````````
+M`0````$````(*P$``````&@(`````````0````$````^*P$``````'`(````
+M`````0````$````^*P$``````'@(`````````0````$````^*P$``````(`(
+M`````````0````$````(*P$``````(@(`````````0````$````(*P$`````
+M`)`(`````````0````$````^*P$``````)@(`````````0````$````^*P$`
+M`````*`(`````````0````$````^*P$``````*@(`````````0````$````^
+M*P$``````+`(`````````0````$````^*P$``````+@(`````````0````$`
+M```^*P$``````,`(`````````0````$````^*P$``````,@(`````````0``
+M``$````^*P$``````-`(`````````0````$````^*P$``````-@(````````
+M`0````$````^*P$``````.`(`````````0````$````^*P$``````.@(````
+M`````0````$````^*P$``````/`(`````````0````$````^*P$``````/@(
+M`````````0````$````^*P$````````)`````````0````$````^*P$`````
+M``@)`````````0````$````^*P$``````!`)`````````0````$````^*P$`
+M`````!@)`````````0````$````(*P$``````"`)`````````0````$````^
+M*P$``````"@)`````````0````$````^*P$``````#`)`````````0````$`
+M```^*P$``````#@)`````````0````$````^*P$``````$`)`````````0``
+M``$````^*P$``````$@)`````````0````$````^*P$``````%`)````````
+M`0````$````^*P$``````%@)`````````0````$````^*P$``````&`)````
+M`````0````$````^*P$``````&@)`````````0````$````^*P$``````'`)
+M`````````0````$````^*P$``````'@)`````````0````$````^*P$`````
+M`(`)`````````0````$````^*P$``````(@)`````````0````$````^*P$`
+M`````)`)`````````0````$````(*P$``````)@)`````````0````$````(
+M*P$``````*`)`````````0````$````(*P$``````*@)`````````0````$`
+M```(*P$``````+`)`````````0````$````^*P$``````+@)`````````0``
+M``$````^*P$``````,`)`````````0````$````^*P$``````,@)````````
+M`0````$````^*P$``````-`)`````````0````$````^*P$``````-@)````
+M`````0````$````^*P$``````.`)`````````0````$````^*P$``````.@)
+M`````````0````$````^*P$``````/`)`````````0````$````^*P$`````
+M`/@)`````````0````$````^*P$````````*`````````0````$````^*P$`
+M``````@*`````````0````$````^*P$``````!`*`````````0````$````^
+M*P$``````!@*`````````0````$````^*P$``````"`*`````````0````$`
+M```^*P$``````"@*`````````0````$````^*P$``````#`*`````````0``
+M``$````^*P$``````#@*`````````0````$````^*P$``````$`*````````
+M`0````$````^*P$``````$@*`````````0````$````^*P$``````%`*````
+M`````0````$````^*P$``````%@*`````````0````$````^*P$``````&`*
+M`````````0````$````^*P$``````&@*`````````0````$````^*P$`````
+M`'`*`````````0````$````^*P$``````'@*`````````0````$````^*P$`
+M`````(`*`````````0````$````^*P$``````(@*`````````0````$````^
+M*P$``````)`*`````````0````$````^*P$``````)@*`````````0````$`
+M```^*P$``````*`*`````````0````$````^*P$``````*@*`````````0``
+M``$````^*P$``````+`*`````````0````$````^*P$``````+@*````````
+M`0````$````^*P$``````,`*`````````0````$````^*P$``````,@*````
+M`````0````$````^*P$``````-`*`````````0````$````^*P$``````-@*
+M`````````0````$````^*P$``````.`*`````````0````$````^*P$`````
+M`.@*`````````0````$````^*P$``````/`*`````````0````$````^*P$`
+M`````/@*`````````0````$````^*P$````````+`````````0````$````^
+M*P$```````@+`````````0````$````(*P$``````!`+`````````0````$`
+M```^*P$``````!@+`````````0````$````^*P$``````"`+`````````0``
+M``$````^*P$``````"@+`````````0````$````^*P$``````#`+````````
+M`0````$````^*P$``````#@+`````````0````$````^*P$``````$`+````
+M`````0````$````^*P$``````$@+`````````0````$````^*P$``````%`+
+M`````````0````$````(*P$``````%@+`````````0````$````^*P$`````
+M`&`+`````````0````$````(*P$``````&@+`````````0````$````^*P$`
+M`````'`+`````````0````$````^*P$``````'@+`````````0````$````^
+M*P$``````(`+`````````0````$````(*P$``````(@+`````````0````$`
+M```(*P$``````)`+`````````0````$````^*P$``````)@+`````````0``
+M``$````^*P$``````*`+`````````0````$````^*P$``````*@+````````
+M`0````$````(*P$``````+`+`````````0````$````^*P$``````+@+````
+M`````0````$````^*P$``````,`+`````````0````$````^*P$``````,@+
+M`````````0````$````^*P$``````-`+`````````0````$````^*P$`````
+M`-@+`````````0````$````^*P$``````.`+`````````0````$````^*P$`
+M`````.@+`````````0````$````^*P$``````/`+`````````0````$````^
+M*P$``````/@+`````````0````$````^*P$````````,`````````0````$`
+M```^*P$```````@,`````````0````$````^*P$``````!`,`````````0``
+M``$````^*P$``````!@,`````````0````$````^*P$``````"`,````````
+M`0````$````^*P$``````"@,`````````0````$````^*P$``````#`,````
+M`````0````$````^*P$``````#@,`````````0````$````^*P$``````$`,
+M`````````0````$````^*P$``````$@,`````````0````$````^*P$`````
+M`%`,`````````0````$````(*P$``````%@,`````````0````$````^*P$`
+M`````&`,`````````0````$````(*P$``````&@,`````````0````$````^
+M*P$``````'`,`````````0````$````^*P$``````'@,`````````0````$`
+M```^*P$``````(`,`````````0````$````(*P$``````(@,`````````0``
+M``$````(*P$``````)`,`````````0````$```"40`$``````)@,````````
+M`0````$```!$0`$``````*`,`````````0````$```!10`$``````*@,````
+M`````0````$```!V0`$``````+`,`````````0````$```"40`$``````+@,
+M`````````0````$```"*0`$``````,`,`````````0````$```"`0`$`````
+M`,@,`````````0````$```"40`$``````-`,`````````0````$```"40`$`
+M`````-@,`````````0````$```"40`$``````.`,`````````0````$```"4
+M0`$``````.@,`````````0````$```"`0`$``````/`,`````````0````$`
+M```):0$``````/@,`````````0````$````E:0$````````-`````````0``
+M``$```!!:0$```````@-`````````0````$```"7:0$``````!`-````````
+M`0````$````!:@$``````"`-`````````0````$````7K0$``````"@-````
+M`````0````$```#QK`$``````#`-`````````0````$```#WK`$``````#@-
+M`````````0````$````AK0$``````$`-`````````0````$```#GK`$`````
+M`$@-`````````0````$```#GK`$``````%`-`````````0````$```#GK`$`
+M`````%@-`````````0````$```#GK`$``````&`-`````````0````$```#G
+MK`$``````&@-`````````0````$```#GK`$``````'`-`````````0````$`
+M``#GK`$``````'@-`````````0````$```#GK`$``````(`-`````````0``
+M``$```#GK`$``````(@-`````````0````$```#GK`$``````)`-````````
+M`0````$```#GK`$``````)@-`````````0````$```#GK`$``````*`-````
+M`````0````$````GK0$``````*@-`````````0````$````AK0$``````+`-
+M`````````0````$````!K0$``````+@-`````````0````$````7K0$`````
+M`,`-`````````0````$````'K0$``````,@-`````````0````$````1K0$`
+M`````-`-`````````0````$````GK0$``````-@-`````````0````$```#A
+MK`$``````&`.`````````0````$```"O)@(``````&@.`````````0````$`
+M```:)P(``````'`.`````````0````$````V)P(``````'@.`````````0``
+M``$```!2)P(``````(`.`````````0````$```!N)P(``````(@.````````
+M`0````$```"*)P(``````)`.`````````0````$```"K)P(``````)@.````
+M`````0````$````F*`(``````*`.`````````0````$```!3*`(``````*@.
+M`````````0````$```#U*`(``````+`.`````````0````$```"W*`(`````
+M`+@.`````````0````$```#3*`(``````,`.`````````0````$````1*0(`
+M`````,@.`````````0````$````O*@(``````-`.`````````0````$```!?
+M*@(``````-@.`````````0````$```"%*@(``````.`.`````````0````$`
+M``"\*@(``````.@.`````````0````$```">*P(``````/`.`````````0``
+M``$```#B*@(``````/@.`````````0````$```#L*@(````````/````````
+M`0````$```!_*`(```````@/`````````0````$```";*`(``````!`/````
+M`````0````$```#-)P(``````!@/`````````0````$```#Z)P(``````"`/
+M`````````0````$```"W*`(``````"@/`````````0````$```#Z*@(`````
+M`#`/`````````0````$```#.*P(``````#@/`````````0````$```#P*P(`
+M`````$`/`````````0````$````,+`(``````$@/`````````0````$````M
+M+`(``````%`/`````````0````$````_+`(``````%@/`````````0````$`
+M``!B+`(``````&`/`````````0````$```"6+`(``````&@/`````````0``
+M``$````<*P(``````'`/`````````0````$````^*P(``````'@/````````
+M`0````$```!@*P(``````(`/`````````0````$```""*P(``````)`/````
+M`````0````$```"38@(``````)@/`````````0````$```#`6`(``````*`/
+M`````````0````$````260(``````*@/`````````0````$```"@60(`````
+M`+`/`````````0````$````L6@(``````+@/`````````0````$```!@6@(`
+M`````,`/`````````0````$```"K6@(``````,@/`````````0````$```!!
+M6P(``````-`/`````````0````$```!+6P(``````-@/`````````0````$`
+M``#^7@(``````.`/`````````0````$```#070(``````.@/`````````0``
+M``$```"J6`(``````/`/`````````0````$```"38@(``````/@/````````
+M`0````$```"38@(````````0`````````0````$```"38@(```````@0````
+M`````0````$```"38@(``````!`0`````````0````$```"38@(``````!@0
+M`````````0````$```#Z80(``````"`0`````````0````$```"38@(`````
+M`"@0`````````0````$```"38@(``````#`0`````````0````$```!56P(`
+M`````#@0`````````0````$```!P6P(``````$`0`````````0````$```"U
+M6@(``````$@0`````````0````$````W6P(``````%`0`````````0````$`
+M``#070(``````%@0`````````0````$```#N7P(``````&`0`````````0``
+M``$```!68@(``````&@0`````````0````$```!=8@(``````'`0````````
+M`0````$```".8@(``````'@0`````````0````$```"38@(``````(`0````
+M`````0````$````H80(``````(@0`````````0````$```!X80(``````)`0
+M`````````0````$```""80(``````)@0`````````0````$```#X7P(`````
+M`*`0`````````0````$````%8`(``````*@0`````````0````$````/8`(`
+M`````+`0`````````0````$````98`(``````+@0`````````0````$````R
+M<0(``````,`0`````````0````$````Z<0(``````,@0`````````0````$`
+M``!"<0(``````-`0`````````0````$```!*<0(``````-@0`````````0``
+M``$```!2<0(``````.`0`````````0````$```!:<0(``````.@0````````
+M`0````$```!B<0(``````/`0`````````0````$````J<0(``````/@0````
+M`````0````$```#PC`(````````1`````````0````$```!+B@(```````@1
+M`````````0````$```!<B@(``````!`1`````````0````$```!MB@(`````
+M`!@1`````````0````$```!^B@(``````"`1`````````0````$```#*B@(`
+M`````"@1`````````0````$```#IB@(``````#`1`````````0````$```#]
+MB@(``````#@1`````````0````$```!2BP(``````$`1`````````0````$`
+M``!NBP(``````$@1`````````0````$```"*BP(``````%`1`````````0``
+M``$```"FBP(``````%@1`````````0````$```#.BP(``````&`1````````
+M`0````$```#BBP(``````&@1`````````0````$```#VBP(``````'`1````
+M`````0````$```#PC`(``````'@1`````````0````$```#PC`(``````(`1
+M`````````0````$````/C`(``````(@1`````````0````$```![C`(`````
+M`)`1`````````0````$```#PC`(``````)@1`````````0````$```#PC`(`
+M`````*`1`````````0````$````WC`(``````*@1`````````0````$```#`
+MC`(``````+`1`````````0````$```"=B@(``````+@1`````````0````$`
+M``"QB@(``````,`1`````````0````$```#PC`(``````,@1`````````0``
+M``$````1BP(``````-`1`````````0````$````EBP(``````-@1````````
+M`0````$````YBP(``````.`1`````````0````$```"PO@(``````.@1````
+M`````0````$```"PO@(``````/`1`````````0````$```#IO@(``````/@1
+M`````````0````$```#\O@(````````2`````````0````$```"PO@(`````
+M``@2`````````0````$````=OP(``````!`2`````````0````$```"ZO@(`
+M`````!@2`````````0````$````/OP(``````"`2`````````0````$```#&
+MOP(``````"@2`````````0````$```#2OP(``````#`2`````````0````$`
+M``!QR0(``````#@2`````````0````$```#FR@(``````$`2`````````0``
+M``$```#FR@(``````$@2`````````0````$```#FR@(``````%`2````````
+M`0````$```#FR@(``````%@2`````````0````$```#FR@(``````&`2````
+M`````0````$```#FR@(``````&@2`````````0````$```#FR@(``````'`2
+M`````````0````$```#FR@(``````'@2`````````0````$```#FR@(`````
+M`(`2`````````0````$```#FR@(``````(@2`````````0````$```#FR@(`
+M`````)`2`````````0````$```#FR@(``````)@2`````````0````$```#F
+MR@(``````*`2`````````0````$```#FR@(``````*@2`````````0````$`
+M``#FR@(``````+`2`````````0````$```#FR@(``````+@2`````````0``
+M``$```#FR@(``````,`2`````````0````$```#FR@(``````,@2````````
+M`0````$```#FR@(``````-`2`````````0````$```#FR@(``````-@2````
+M`````0````$```#FR@(``````.`2`````````0````$```#FR@(``````.@2
+M`````````0````$```#FR@(``````/`2`````````0````$```#FR@(`````
+M`/@2`````````0````$```#FR@(````````3`````````0````$```#FR@(`
+M``````@3`````````0````$```#FR@(``````!`3`````````0````$```#F
+MR@(``````!@3`````````0````$```#FR@(``````"`3`````````0````$`
+M``#FR@(``````"@3`````````0````$```#FR@(``````#`3`````````0``
+M``$```"%R0(``````#@3`````````0````$```#@R0(``````$`3````````
+M`0````$````[R@(``````$@3`````````0````$```"6R@(``````%`3````
+M`````0````$```#[RP(``````%@3`````````0````$```#'T`(``````&`3
+M`````````0````$```#'T`(``````&@3`````````0````$```#'T`(`````
+M`'`3`````````0````$```#'T`(``````'@3`````````0````$```#'T`(`
+M`````(`3`````````0````$```#'T`(``````(@3`````````0````$```#'
+MT`(``````)`3`````````0````$```#'T`(``````)@3`````````0````$`
+M``#'T`(``````*`3`````````0````$```#'T`(``````*@3`````````0``
+M``$```#'T`(``````+`3`````````0````$```#'T`(``````+@3````````
+M`0````$```#'T`(``````,`3`````````0````$```#'T`(``````,@3````
+M`````0````$```#'T`(``````-`3`````````0````$````-S`(``````-@3
+M`````````0````$````-S`(``````.`3`````````0````$````-S`(`````
+M`.@3`````````0````$```#'T`(``````/`3`````````0````$```#'T`(`
+M`````/@3`````````0````$```#'T`(````````4`````````0````$```#'
+MT`(```````@4`````````0````$```#'T`(``````!`4`````````0````$`
+M``#'T`(``````!@4`````````0````$```#'T`(``````"`4`````````0``
+M``$```#'T`(``````"@4`````````0````$```#'T`(``````#`4````````
+M`0````$```#'T`(``````#@4`````````0````$```#'T`(``````$`4````
+M`````0````$```#'T`(``````$@4`````````0````$```#'T`(``````%`4
+M`````````0````$```!SS`(``````%@4`````````0````$```#+S`(`````
+M`&`4`````````0````$````CS0(``````&@4`````````0````$```!\S0(`
+M`````'`4`````````0````$```#'T`(``````'@4`````````0````$```#'
+MT`(``````(`4`````````0````$```#'T`(``````(@4`````````0````$`
+M``#'T`(``````)`4`````````0````$```#'T`(``````)@4`````````0``
+M``$```#'T`(``````*`4`````````0````$```#'T`(``````*@4````````
+M`0````$```#'T`(``````+`4`````````0````$```#'T`(``````+@4````
+M`````0````$```#'T`(``````,`4`````````0````$```#'T`(``````,@4
+M`````````0````$```#'T`(``````-`4`````````0````$```#4S0(`````
+M`-@4`````````0````$````OS@(``````.`4`````````0````$```"+S@(`
+M`````.@4`````````0````$```#CS@(``````/`4`````````0````$```#'
+MT`(``````/@4`````````0````$```#'T`(````````5`````````0````$`
+M``#'T`(```````@5`````````0````$```#'T`(``````!`5`````````0``
+M``$```#'T`(``````!@5`````````0````$```#'T`(``````"`5````````
+M`0````$```#'T`(``````"@5`````````0````$```#'T`(``````#`5````
+M`````0````$```#'T`(``````#@5`````````0````$```#'T`(``````$`5
+M`````````0````$```#'T`(``````$@5`````````0````$```#'T`(`````
+M`%`5`````````0````$````[SP(``````%@5`````````0````$```#'T`(`
+M`````&`5`````````0````$```#'T`(``````&@5`````````0````$```#'
+MT`(``````'`5`````````0````$```#'T`(``````'@5`````````0````$`
+M``#'T`(``````(`5`````````0````$```#'T`(``````(@5`````````0``
+M``$```#'T`(``````)`5`````````0````$```#'T`(``````)@5````````
+M`0````$```#'T`(``````*`5`````````0````$```#'T`(``````*@5````
+M`````0````$```#'T`(``````+`5`````````0````$```#'T`(``````+@5
+M`````````0````$```#'T`(``````,`5`````````0````$```#'T`(`````
+M`,@5`````````0````$```#'T`(``````-`5`````````0````$```!TSP(`
+M`````-@5`````````0````$```"NSP(``````.`5`````````0````$```#H
+MSP(``````.@5`````````0````$````BT`(``````/`5`````````0````$`
+M``!9T`(``````/@5`````````0````$```"0T`(``````#`6`````````0``
+M``$```!`%P,``````#@6`````````0````$```#?%P,``````$`6````````
+M`0````$```!Z%P,``````$@6`````````0````$```!>%P,``````%`6````
+M`````0````$```#?%P,``````%@6`````````0````$```#?%P,``````&`6
+M`````````0````$```#?%P,``````&@6`````````0````$```#?%P,`````
+M`'`6`````````0````$```!`%P,``````'@6`````````0````$```"M&`,`
+M`````(`6`````````0````$```!`%P,``````(@6`````````0````$```!`
+M%P,``````)`6`````````0````$```#V%@,``````)@6`````````0````$`
+M``"A&`,``````*`6`````````0````$```!O&`,``````*@6`````````0``
+M``$````X&`,``````+`6`````````0````$```"3.@,``````+@6````````
+M`0````$```"C.@,``````,`6`````````0````$```"K.@,``````,@6````
+M`````0````$```"S.@,``````-`6`````````0````$```"[.@,``````-@6
+M`````````0````$```##.@,``````.`6`````````0````$```#+.@,`````
+M`.@6`````````0````$```";.@,``````/`6`````````0````$```!+/P,`
+M`````/@6`````````0````$````C00,````````7`````````0````$```"$
+M0`,```````@7`````````0````$```#Z0`,``````!`7`````````0````$`
+M``#10`,``````!@7`````````0````$```#Z0`,``````"`7`````````0``
+M``$```!+/P,``````"@7`````````0````$```!./P,``````#`7````````
+M`0````$```!#GP,``````#@7`````````0````$```#5GP,``````$`7````
+M`````0````$```"RH`,``````$@7`````````0````$```#>H`,``````%`7
+M`````````0````$```"2H0,``````%@7`````````0````$```!UH@,`````
+M`&`7`````````0````$```".H@,``````&@7`````````0````$```":H@,`
+M`````'`7`````````0````$```"3GP,``````'@7`````````0````$````8
+MHP,``````(`7`````````0````$```#5HP,``````(@7`````````0````$`
+M``!#GP,``````)`7`````````0````$```#FI`,``````)@7`````````0``
+M``$```#NHP,``````*`7`````````0````$```"0I`,``````*@7````````
+M`0````$```"6LP,``````+`7`````````0````$````'MP,``````+@7````
+M`````0````$```#0M@,``````,`7`````````0````$```"[M@,``````,@7
+M`````````0````$```"FM@,``````-`7`````````0````$```"'M@,`````
+M`-@7`````````0````$```"6LP,``````.`7`````````0````$```!RM@,`
+M`````.@7`````````0````$```#WLP,``````/`7`````````0````$```"5
+M]0,``````/@7`````````0````$```"#]0,````````8`````````0````$`
+M``!G]0,```````@8`````````0````$```!&]0,``````!`8`````````0``
+M``$````$]0,``````!@8`````````0````$```#']`,``````"`8````````
+M`0````$````H&P0``````"@8`````````0````$```!A&@0``````#`8````
+M`````0````$````H&P0``````#@8`````````0````$```!&&@0``````$`8
+M`````````0````$```!&&@0``````$@8`````````0````$```!&&@0`````
+M`(```````````0````8```"\`````````)@``````````0````$```"@T0``
+M`````*```````````0````$````0Y@```````*@``````````0````$```#P
+MT0```````+```````````0````$````@\@```````+@``````````0````$`
+M```@_P```````,```````````0````$```#PY0```````,@``````````0``
+M``$```"0T0```````-```````````0````$````@T@```````-@`````````
+M`0````$`````Y0```````.```````````0````$`````T@```````.@`````
+M`````0````$```"@`0$``````/```````````0````$```#PT@```````/@`
+M`````````0````$```"@]@`````````!`````````0```+8`````````````
+M``@!`````````0````$```"PXP```````!`!`````````0````$````0T@``
+M`````!@!`````````0````$```"@^````````"`!`````````0````$```#0
+MX````````"@!`````````0````$```#0V@```````#`!`````````0````$`
+M``!PV@```````#@!`````````0````$```!0TP```````$`!`````````0``
+M``$````@[0```````$@!`````````0````$```!PTP```````%`!````````
+M`0````$```"PV@```````%@!`````````0````$```"0V@```````&`!````
+M`````0````$`````V@```````&@!`````````0````$````PU0```````'`!
+M`````````0````$```!0U````````'@!`````````0```#8`````````````
+M`(@!`````````0````$`````TP```````)`!`````````0````$````0TP``
+M`````)@!`````````0````$````@TP```````*`!`````````0````$````P
+MTP```````*@!`````````0````$```!`TP```````+`!`````````0```(<`
+M`````````````"`"`````````0````8```!/`@```````#@"`````````0``
+M``$```#@F@(``````$`"`````````0````$````PMP(``````$@"````````
+M`0````$````PFP(``````%`"`````````0````$`````T0(``````%@"````
+M`````0````$```!0[0(``````&`"`````````0````$````0MP(``````&@"
+M`````````0````$```#0F@(``````'`"`````````0````$```"`G`(`````
+M`'@"`````````0````$````@M@(``````(`"`````````0````$```!`FP(`
+M`````(@"`````````0````$```#@[P(``````)`"`````````0````$```#P
+MG`(``````)@"`````````0````$```"`U0(``````*`"`````````0```,D`
+M`````````````*@"`````````0````$````0LP(``````+`"`````````0``
+M``$```!0FP(``````+@"`````````0````$```!PY@(``````,`"````````
+M`0````$`````K@(``````,@"`````````0````$```!PIP(``````-`"````
+M`````0````$````0IP(``````-@"`````````0````$```"`G@(``````.`"
+M`````````0````$```"`O@(``````.@"`````````0````$```"@G@(`````
+M`/`"`````````0````$```!0IP(``````/@"`````````0````$````PIP(`
+M```````#`````````0````$```"@I@(```````@#`````````0````$```!@
+MH`(``````!`#`````````0````$```"`GP(``````!@#`````````0```)0!
+M`````````````"@#`````````0````$`````G0(``````#`#`````````0``
+M``$````0Y`(``````#@#`````````0````$````0X`(``````$`#````````
+M`0````$```#PVP(``````$@#`````````0````$```#@UP(``````%`#````
+M`````0```,\``````````````,`#`````````0````$```"`%@,``````,@#
+M`````````0````$```"@,P,``````-`#`````````0````$```"0%0,`````
+M`.@#`````````0````$```!P"@,``````/`#`````````0````$````@%0,`
+M`````/@#`````````0````$```!`"P,``````"@$`````````0````$```"0
+M1@,``````#@$`````````0````$```#`@@,``````%`$`````````0````$`
+M``#P1@,``````&`$`````````0````$```!0@0,``````'@$`````````0``
+M``$````01P,``````(@$`````````0````$`````EP,``````*`$````````
+M`0````$```!P1P,``````+`$`````````0````$`````D`,``````,@$````
+M`````0````$```"01P,``````-@$`````````0````$```!0@`,``````/`$
+M`````````0````$```!P2`,````````%`````````0````$````0>@,`````
+M`!@%`````````0````$```#02`,``````"@%`````````0````$````0\0,`
+M`````$`%`````````0````$```#02P,``````$@%`````````0````$`````
+MB0,``````%`%`````````0````$`````:@,``````&@%`````````0````$`
+M``"0X`,``````'`%`````````0````$```"@AP,``````'@%`````````0``
+M``$```#`:`,``````)`%`````````0````$`````4`,``````*`%````````
+M`0````$````0=@,``````+@%`````````0````$````@4`,``````,@%````
+M`````0````$````PW0,``````.`%`````````0````$````@4P,``````.@%
+M`````````0````$```"`AP,``````/`%`````````0````$```"`:`,`````
+M``@&`````````0````$```"04P,``````!`&`````````0````$```!@AP,`
+M`````!@&`````````0````$```!`:`,``````#`&`````````0````$`````
+M5`,``````#@&`````````0````$````0AP,``````$`&`````````0````$`
+M````:`,``````%@&`````````0````$```#`5`,``````&`&`````````0``
+M``$```"`A@,``````&@&`````````0````$```#`9P,``````(`&````````
+M`0````$````P50,``````(@&`````````0````$```!@A@,``````)`&````
+M`````0````$```"`9P,``````*@&`````````0````$````05@,``````+@&
+M`````````0````$`````9P,``````-`&`````````0````$```"`5@,`````
+M`.`&`````````0````$```#`9@,``````/@&`````````0````$```"@5@,`
+M``````@'`````````0````$```!0YP,``````"`'`````````0````$```#`
+M5@,``````#`'`````````0````$```"PZP,``````$@'`````````0````$`
+M``#@5@,``````%@'`````````0````$```"0C@,``````'`'`````````0``
+M``$```"@5P,``````(`'`````````0````$```!PC@,``````)@'````````
+M`0````$```"04`,``````*@'`````````0````$```"PW`,``````,`'````
+M`````0````$`````40,``````-`'`````````0````$```!@W`,``````.@'
+M`````````0````$```!@6`,``````/@'`````````0````$```"`9@,`````
+M`!`(`````````0````$```#`6`,``````"`(`````````0````$````PX@,`
+M`````#@(`````````0````$```!P60,``````$`(`````````0````$```#@
+MA0,``````$@(`````````0````$```!`9@,``````&`(`````````0````$`
+M``#@3`,``````&@(`````````0````$```#`B`,``````'`(`````````0``
+M``$```#`:0,``````(@(`````````0````$````020,``````)@(````````
+M`0````$````P[P,``````+`(`````````0````$```"@50,``````,`(````
+M`````0````$```!`9P,``````-@(`````````0````$```!P40,``````.@(
+M`````````0````$```#@VP,````````)`````````0````$```#040,`````
+M`!`)`````````0````$```!@VP,``````"@)`````````0````$````P4@,`
+M`````#@)`````````0````$````0VP,``````%`)`````````0````$```!0
+M3@,``````%@)`````````0````$```!`B`,``````&`)`````````0````$`
+M``!`:0,``````'@)`````````0````$```"04@,``````(@)`````````0``
+M``$```#PS0,``````*`)`````````0````$````@6@,``````*@)````````
+M`0````$```"PA0,``````+`)`````````0````$`````9@,``````,@)````
+M`````0````$`````2@,``````-@)`````````0````$```#`>`,``````/`)
+M`````````0````$`````2P,``````/@)`````````0````$```!`B0,`````
+M```*`````````0````$```!`:@,``````!@*`````````0````$```!020,`
+M`````"@*`````````0````$```!`[`,``````$`*`````````0````$````P
+M1P,``````%`*`````````0````$```!PE0,``````&@*`````````0````$`
+M``!01P,``````'@*`````````0````$```"@@`,``````)`*`````````0``
+M``$```"020,``````*`*`````````0````$```!@QP,``````+@*````````
+M`0````$```"030,``````,`*`````````0````$```"`B`,``````,@*````
+M`````0````$```"`:0,``````.`*`````````0````$````@3P,``````.@*
+M`````````0````$`````B`,``````/`*`````````0````$`````:0,`````
+M``@+`````````0````$```!P2@,``````!@+`````````0````$`````>`,`
+M`````#`+`````````0````$````06P,``````$`+`````````0````$```"P
+MC@,``````%@+`````````0````$```"@2`,``````&@+`````````0````$`
+M``!P>0,``````(`+`````````0````$```"P1P,``````)`+`````````0``
+M``$```"P?P,``````*@+`````````0````$```#01P,``````+@+````````
+M`0````$```#`?@,``````-`+`````````0````$```#P1P,``````.`+````
+M`````0````$```#0?0,``````/@+`````````0````$````02`,```````@,
+M`````````0````$```#@?`,``````"`,`````````0````$````P2`,`````
+M`#`,`````````0````$```#@>P,``````$@,`````````0````$```!02`,`
+M`````%@,`````````0````$`````>P,``````'`,`````````0````$```"P
+M1@,``````(`,`````````0````$```!PD`,``````)@,`````````0````$`
+M``#01@,``````*`,`````````0````$```"`B0,``````*@,`````````0``
+M``$```"@@0,``````,`,`````````0````$```"`6@,``````-`,````````
+M`0````$```!`=0,``````.@,`````````0````$```"P6@,``````/@,````
+M`````0````$```#P<@,``````!`-`````````0````$```"@3`,``````"`-
+M`````````0````$```#`=@,``````#@-`````````0````$```"`3`,`````
+M`$@-`````````0````$```"`=P,``````&`-`````````0````$`````7`,`
+M`````&@-`````````0````$```"0A0,``````'`-`````````0````$```#`
+M90,``````(@-`````````0````$```#`7`,``````)`-`````````0````$`
+M``!PA0,``````)@-`````````0````$```"`90,``````"```````````0``
+M``$``````````````#@``````````0````$```!``````````%``````````
+M`0````$```"``````````&@``````````0````$```#0`````````(``````
+M`````0````$````@`0```````+```````````0````$````P`0```````,@`
+M`````````0````$```!@`0```````.```````````0````$```"P`0``````
+M`/@``````````0````$```#``0```````!`!`````````0````$````@`@``
+M`````"@!`````````0````$````P`@```````$`!`````````0````$```!@
+M`@```````%@!`````````0````$```"0`@```````'`!`````````0````$`
+M``#0`@```````(@!`````````0````$``````P```````*`!`````````0``
+M``$```#@!````````,`!`````````0````$```!P!0```````.`!````````
+M`0````$```"P!0```````/@!`````````0````$```#@!0```````!`"````
+M`````0````$````0!@```````$`"`````````0````$````P!@```````%@"
+M`````````0````$```"`!@```````'`"`````````0````$```#@!@``````
+M`(@"`````````0````$```!`!P```````*`"`````````0````$```#`!P``
+M`````,@"`````````0````$````0"0```````.@"`````````0````$```!0
+M"0```````"@#`````````0````$```#`"P```````&@#`````````0````$`
+M```0#0```````(`#`````````0````$````0#@```````)@#`````````0``
+M``$```!@#@```````+`#`````````0````$```#P#@```````,@#````````
+M`0````$```!P#P```````.`#`````````0````$```#P#P```````/@#````
+M`````0````$```!`$````````!`$`````````0````$```!0$````````#@$
+M`````````0````$```!P$P```````'@$`````````0````$```!P%0``````
+M`+@$`````````0````$`````'@```````.`$`````````0````$```!P'@``
+M`````"`%`````````0````$```!0(````````$@%`````````0````$```#`
+M(0```````(@%`````````0````$````0)@```````+`%`````````0````$`
+M``!P)P```````-@%`````````0````$````@*@```````!@&`````````0``
+M``$```!`*P```````$`&`````````0````$```#`,````````(`&````````
+M`0````$```"`-0```````*@&`````````0````$```!P-@```````.@&````
+M`````0````$```"0.P```````!`'`````````0````$```!0/````````$@'
+M`````````0````$````@/0```````(`'`````````0````$```!P/P``````
+M`*`'`````````0````$```!`0````````,`'`````````0````$```"`0P``
+M`````.`'`````````0````$```"P0P```````"`(`````````0````$`````
+M10```````&`(`````````0````$```#@1P```````*`(`````````0````$`
+M``!@4````````/@(`````````0````$`````4P```````"@)`````````0``
+M``$````@4P```````$@)`````````0````$```!05````````&`)````````
+M`0````$```!@5````````'@)`````````0````$`````50```````)`)````
+M`````0````$````P50```````*@)`````````0````$```!@50```````,`)
+M`````````0````$```"050```````-@)`````````0````$```#`50``````
+M`/`)`````````0````$```#P50```````!`*`````````0````$`````5P``
+M`````#`*`````````0````$````P6````````%`*`````````0````$```!@
+M6````````'`*`````````0````$```"P6````````)`*`````````0````$`
+M``#@6````````+`*`````````0````$````@60```````-`*`````````0``
+M``$```!@60```````/@*`````````0````$```#P6@```````!@+````````
+M`0````$```!06P```````$`+`````````0````$```!07````````&@+````
+M`````0````$```!P70```````(@+`````````0````$```"070```````+`+
+M`````````0````$```"07@```````-@+`````````0````$`````7P``````
+M`/@+`````````0````$````@7P```````!@,`````````0````$```!`7P``
+M`````$`,`````````0````$````08````````&@,`````````0````$```#@
+M80```````(@,`````````0````$```!P8@```````,@,`````````0````$`
+M``"09````````/`,`````````0````$`````9@```````#`-`````````0``
+M``$```!@:````````%`-`````````0````$```"@:````````'`-````````
+M`0````$```#0:````````)`-`````````0````$`````:0```````-`-````
+M`````0````$```!0:0```````.@-`````````0````$```#0:0`````````.
+M`````````0````$```!`:@```````!@.`````````0````$```"@:@``````
+M`#`.`````````0````$```#0:@```````%@.`````````0````$```!P:P``
+M`````(`.`````````0````$```!@;````````*@.`````````0````$```!0
+M;0```````-`.`````````0````$````0;@```````/@.`````````0````$`
+M```P;P```````"@/`````````0````$```"0;P```````$@/`````````0``
+M``$````@<````````(`/`````````0````$```!P<@```````,`/````````
+M`0````$```!@<P`````````0`````````0````$```!0=````````#@0````
+M`````0````$```"@=@```````'@0`````````0````$```"0>````````+@0
+M`````````0````$`````?````````/@0`````````0````$```#@@@``````
+M`#@1`````````0````$```#@@P```````'@1`````````0````$```!`BP``
+M`````*`1`````````0````$```!0DP```````,@1`````````0````$```!`
+MEP```````/`1`````````0````$```!@G````````!@2`````````0````$`
+M``!0G0```````%`2`````````0````$```"@H````````'`2`````````0``
+M``$```#`H````````)`2`````````0````$```#@H````````+`2````````
+M`0````$`````H0```````-@2`````````0````$```"PH0````````@3````
+M`````0````$```"PHP```````#`3`````````0````$```"PI0```````(`3
+M`````````0````$```"@JP```````)@3`````````0````$```#0JP``````
+M`+`3`````````0````$`````K````````-@3`````````0````$```"`K```
+M`````/@3`````````0````$```#0K````````!@4`````````0````$```#P
+MK````````#`4`````````0````$````PK0```````%@4`````````0````$`
+M``#0K0```````'@4`````````0````$`````K@```````)@4`````````0``
+M``$```!`K@```````,`4`````````0````$```#0K@```````.@4````````
+M`0````$````@KP```````!`5`````````0````$```"@KP```````#@5````
+M`````0````$```!PL````````'@5`````````0````$```"`L@```````)@5
+M`````````0````$```#@L@```````+@5`````````0````$```!`LP``````
+M`/`5`````````0````$```#PLP```````!`6`````````0````$```!0M```
+M`````#`6`````````0````$```"0M````````%`6`````````0````$```#0
+MM````````)`6`````````0````$```"PMP```````+`6`````````0````$`
+M```0N````````-`6`````````0````$```!@N`````````@7`````````0``
+M``$```#`N````````"`7`````````0````$```#@N````````#@7````````
+M`0````$`````N0```````%@7`````````0````$```!0NP```````'`7````
+M`````0````$```!PNP```````(@7`````````0````$```"0NP```````,@7
+M`````````0````$```"`O````````.`7`````````0````$```#`O0``````
+M`/@7`````````0````$```#@O0```````!`8`````````0````$`````O@``
+M`````"@8`````````0````$````PO@```````$`8`````````0````$```!@
+MO@```````&@8`````````0````$```!0OP```````(`8`````````0````$`
+M``"0OP```````*@8`````````0````$````PP````````,`8`````````0``
+M``$```"0P````````-@8`````````0````$```"PP````````/@8````````
+M`0````$```"0Q````````!@9`````````0````$```#PQ0```````%`9````
+M`````0````$```#@Q@```````&@9`````````0````$````PQP```````(`9
+M`````````0````$```!0QP```````*@9`````````0````$```#`QP``````
+M`-`9`````````0````$```#0R@```````/@9`````````0````$```"`RP``
+M`````"`:`````````0````$`````S````````&`:`````````0````$```#0
+MS````````(`:`````````0````$```!0S0```````*`:`````````0````$`
+M```0S@```````.`:`````````0````$```"0T0```````/@:`````````0``
+M``$```"@T0```````!`;`````````0````$```#PT0```````"@;````````
+M`0````$`````T@```````$`;`````````0````$````0T@```````%@;````
+M`````0````$````@T@```````'`;`````````0````$````PT@```````(@;
+M`````````0````$```!`T@```````*`;`````````0````$```!@T@``````
+M`,@;`````````0````$```#PT@```````.`;`````````0````$`````TP``
+M`````/@;`````````0````$````0TP```````!`<`````````0````$````@
+MTP```````"@<`````````0````$````PTP```````$`<`````````0````$`
+M``!`TP```````%@<`````````0````$```!0TP```````'`<`````````0``
+M``$```!PTP```````(@<`````````0````$```#0TP```````*`<````````
+M`0````$````PU````````,`<`````````0````$```!0U````````.@<````
+M`````0````$````PU0```````!`=`````````0````$`````V@```````#`=
+M`````````0````$```!PV@```````%`=`````````0````$```"0V@``````
+M`'`=`````````0````$```"PV@```````)`=`````````0````$```#0V@``
+M`````+`=`````````0````$```#PV@```````-@=`````````0````$```!P
+MW``````````>`````````0````$```#PW0```````"@>`````````0````$`
+M``#`W@```````&`>`````````0````$```#0X````````)`>`````````0``
+M``$```"PXP```````+@>`````````0````$`````Y0```````.`>````````
+M`0````$```#PY0`````````?`````````0````$````0Y@```````$`?````
+M`````0````$````0Z0```````&@?`````````0````$```"0Z0```````)`?
+M`````````0````$````@[0```````+`?`````````0````$```#`[0``````
+M`-@?`````````0````$```"@[@`````````@`````````0````$```"`\0``
+M`````"`@`````````0````$````@\@```````&`@`````````0````$```"@
+M]@```````'@@`````````0````$```"@^````````*`@`````````0````$`
+M```@_P```````,@@`````````0````$```"@`0$``````"`A`````````0``
+M``$````P!`$``````#@A`````````0````$```!@!`$``````%`A````````
+M`0````$```!P!`$``````*@A`````````0````$```#@!@$``````,`A````
+M`````0````$````@!P$``````-@A`````````0````$```!@!P$``````/`A
+M`````````0````$```"P!P$```````@B`````````0````$`````"`$`````
+M`#@B`````````0````$````0"`$``````%`B`````````0````$```!`"`$`
+M`````&@B`````````0````$```"0"`$``````(`B`````````0````$```"@
+M"`$``````)@B`````````0````$`````"0$``````+`B`````````0````$`
+M```0"0$``````,@B`````````0````$```!`"0$``````.`B`````````0``
+M``$```!P"0$``````/@B`````````0````$```"P"0$``````!`C````````
+M`0````$```#P"0$``````"@C`````````0````$```#0"P$``````$`C````
+M`````0````$````0#`$``````&`C`````````0````$```"@#`$``````(`C
+M`````````0````$```#@#`$``````)@C`````````0````$````0#0$`````
+M`+`C`````````0````$```!`#0$``````.`C`````````0````$```!@#0$`
+M`````/@C`````````0````$```"P#0$``````!`D`````````0````$````0
+M#@$``````"@D`````````0````$```!P#@$``````$`D`````````0````$`
+M``#P#@$``````&@D`````````0````$```!`$`$``````(@D`````````0``
+M``$```"`$`$``````,@D`````````0````$```#P$@$```````@E````````
+M`0````$```!`%`$``````"`E`````````0````$```"0%`$``````#@E````
+M`````0````$````@%0$``````%`E`````````0````$```"@%0$``````&@E
+M`````````0````$````@%@$``````(`E`````````0````$```!`%@$`````
+M`*`E`````````0````$```"0%@$``````,`E`````````0````$```#`%@$`
+M`````.`E`````````0````$````@%P$``````"`F`````````0````$````P
+M&0$``````$`F`````````0````$````@&@$``````&@F`````````0````$`
+M``!`&P$``````)`F`````````0````$```!@'`$``````+@F`````````0``
+M``$```!P(@$``````-@F`````````0````$```"0(@$``````!@G````````
+M`0````$```#P+0$``````$@G`````````0````$`````,`$``````'`G````
+M`````0````$```!@,P$``````+`G`````````0````$```!0-P$``````-@G
+M`````````0````$````@00$``````!@H`````````0````$```!02@$`````
+M`$`H`````````0````$```!02P$``````(`H`````````0````$````@50$`
+M`````,`H`````````0````$```#@7@$``````.@H`````````0````$```"@
+M7P$``````"`I`````````0````$```!@8`$``````%@I`````````0````$`
+M``#`8P$``````'@I`````````0````$```"09`$``````+@I`````````0``
+M``$````P:`$``````.`I`````````0````$`````;`$``````"`J````````
+M`0````$`````<`$``````&`J`````````0````$```!`=@$``````(`J````
+M`````0````$```#0=@$``````*`J`````````0````$```#@=@$``````,`J
+M`````````0````$```#P>@$``````.@J`````````0````$`````?`$`````
+M`"@K`````````0````$```!0?0$``````&@K`````````0````$```#@B`$`
+M`````)@K`````````0````$```!@BP$``````/`K`````````0````$````P
+MD`$```````@L`````````0````$```"@D`$``````"`L`````````0````$`
+M``#PD`$``````#@L`````````0````$```!0D0$``````%`L`````````0``
+M``$```"PD0$``````&@L`````````0````$```"0D@$``````*`L````````
+M`0````$```#0DP$``````,`L`````````0````$````@E`$````````M````
+M`````0````$```"PE`$``````"@M`````````0````$````@E@$``````%`M
+M`````````0````$```"`EP$``````'@M`````````0````$```#0F`$`````
+M`)@M`````````0````$```!0F0$``````,`M`````````0````$```!@F@$`
+M```````N`````````0````$`````G`$``````$`N`````````0````$```!0
+MG0$``````&@N`````````0````$```!@G@$``````)`N`````````0````$`
+M``#PGP$``````+@N`````````0````$```#PH`$``````/@N`````````0``
+M``$```"0H0$``````#@O`````````0````$```#`H@$``````)`O````````
+M`0````$````PIP$``````*@O`````````0````$```"0IP$``````-@O````
+M`````0````$```"PIP$``````/`O`````````0````$```#0J`$``````!@P
+M`````````0````$```#PJ0$``````#`P`````````0````$```"`J@$`````
+M`$@P`````````0````$```"PJ@$``````&`P`````````0````$```#`J@$`
+M`````'@P`````````0````$````0JP$``````)`P`````````0````$```!`
+MJP$``````*@P`````````0````$```"`JP$``````,`P`````````0````$`
+M``"PJP$``````-@P`````````0````$```#PJP$``````/`P`````````0``
+M``$````@K`$```````@Q`````````0````$```!0K`$``````"`Q````````
+M`0````$```!PK`$``````#@Q`````````0````$```"@K`$``````%`Q````
+M`````0````$```#0K`$``````&@Q`````````0````$```!`K0$``````(`Q
+M`````````0````$```!`K@$``````)@Q`````````0````$````@KP$`````
+M`+`Q`````````0````$```!PKP$``````.`Q`````````0````$```!PL`$`
+M```````R`````````0````$```"@L`$``````"`R`````````0````$```#0
+ML`$``````$`R`````````0````$````@L0$``````&`R`````````0````$`
+M``!0L0$``````(`R`````````0````$```"`L0$``````,`R`````````0``
+M``$````0LP$``````.`R`````````0````$```!`LP$``````/@R````````
+M`0````$```!PLP$``````!`S`````````0````$```"@LP$``````#@S````
+M`````0````$```"0M`$``````%@S`````````0````$```#0M`$``````'@S
+M`````````0````$````0M0$``````*`S`````````0````$```!@N`$`````
+M`,@S`````````0````$```#`N0$``````.@S`````````0````$````@N@$`
+M`````!`T`````````0````$```#0N@$``````#@T`````````0````$```!@
+MNP$``````&`T`````````0````$```!0O`$``````(@T`````````0````$`
+M````O0$``````+`T`````````0````$```"`O@$``````-@T`````````0``
+M``$```#POP$````````U`````````0````$```"@P`$``````"@U````````
+M`0````$```"PP0$``````%`U`````````0````$```#@P@$``````'@U````
+M`````0````$`````Q`$``````*`U`````````0````$````0Q0$``````,@U
+M`````````0````$```!PQ@$```````@V`````````0````$````@R@$`````
+M`#`V`````````0````$````@RP$``````%@V`````````0````$````0S`$`
+M`````(`V`````````0````$```#@S`$``````*@V`````````0````$```"@
+MS0$``````-`V`````````0````$```"PS@$``````/@V`````````0````$`
+M```PT`$``````!@W`````````0````$```!0T`$``````$`W`````````0``
+M``$```"`T0$``````&@W`````````0````$```#PT0$``````(@W````````
+M`0````$````PT@$``````*@W`````````0````$```!0T@$``````,@W````
+M`````0````$```"`T@$``````/`W`````````0````$```"`TP$``````!@X
+M`````````0````$```!PU0$``````$`X`````````0````$`````U@$`````
+M`&@X`````````0````$```"0UP$``````*@X`````````0````$`````VP$`
+M`````-@X`````````0````$```#PW`$``````!@Y`````````0````$```"`
+MWP$``````$`Y`````````0````$```"PX`$``````&@Y`````````0````$`
+M``#PX0$``````)`Y`````````0````$```!`X@$``````,@Y`````````0``
+M``$```!PX@$``````.`Y`````````0````$```"0X@$``````/@Y````````
+M`0````$```"PX@$``````!`Z`````````0````$```#@X@$``````"@Z````
+M`````0````$````PXP$``````$`Z`````````0````$```"0XP$``````%@Z
+M`````````0````$````@Y0$``````(@Z`````````0````$```#PY0$`````
+M`+@Z`````````0````$```!@Y@$``````-@Z`````````0````$```"0Y@$`
+M`````/@Z`````````0````$````@YP$``````"@[`````````0````$```!P
+MZ`$``````$@[`````````0````$```"0Z0$``````&@[`````````0````$`
+M```0Z@$``````(@[`````````0````$```"0Z@$``````,@[`````````0``
+M``$```"P\P$``````/`[`````````0````$```!`]0$```````@\````````
+M`0````$```#@]0$``````"`\`````````0````$```#@]@$``````&@\````
+M`````0````$```"@^`$``````(`\`````````0````$````@^0$``````)@\
+M`````````0````$```"0^0$``````+`\`````````0````$`````^@$`````
+M`,@\`````````0````$```!P^@$``````.`\`````````0````$```"`^@$`
+M`````/@\`````````0````$```#`^@$``````!`]`````````0````$````@
+M^P$``````"@]`````````0````$```!`^P$``````$`]`````````0````$`
+M``!P^P$``````&`]`````````0````$````0_`$``````(@]`````````0``
+M``$````@_0$``````,@]`````````0````$`````_P$``````/@]````````
+M`0````$```!@_P$``````"`^`````````0````$```!0``(``````$@^````
+M`````0````$````@`0(``````&@^`````````0````$```!``@(``````)`^
+M`````````0````$```#P`@(``````+@^`````````0````$````@!`(`````
+M`.`^`````````0````$```#P!`(```````@_`````````0````$```#P!0(`
+M`````$@_`````````0````$```#@!@(``````(@_`````````0````$```#0
+M!P(``````,@_`````````0````$```!P"@(```````!``````````0````$`
+M``!0#0(``````"A``````````0````$`````#@(``````&A``````````0``
+M``$```!`$0(``````*A``````````0````$```"@&`(``````.A`````````
+M`0````$```"@&0(``````"!!`````````0````$```"0'0(``````&!!````
+M`````0````$```#`)0(``````(A!`````````0````$```!P)@(``````+!!
+M`````````0````$```#@+`(``````-A!`````````0````$````P+P(`````
+M`/A!`````````0````$```!0+P(``````"!"`````````0````$`````.0(`
+M`````$A"`````````0````$`````/0(``````'!"`````````0````$````P
+M0`(``````+!"`````````0````$```#P0@(``````/!"`````````0````$`
+M``#@10(``````#!#`````````0````$```"@2`(``````'!#`````````0``
+M``$```"03`(``````+!#`````````0````$```"`4`(``````/!#````````
+M`0````$```"@40(``````"!$`````````0````$```"P4P(``````$A$````
+M`````0````$```#P50(``````(A$`````````0````$```"@5@(``````+!$
+M`````````0````$````@8P(``````/!$`````````0````$```!0;`(`````
+M``A%`````````0````$```"`;`(``````"!%`````````0````$```"P;`(`
+M`````$A%`````````0````$````P;0(``````&A%`````````0````$```"`
+M;0(``````(A%`````````0````$```"@;0(``````*!%`````````0````$`
+M``#P;0(``````,A%`````````0````$```"0;@(``````/!%`````````0``
+M``$````@<`(``````!!&`````````0````$```!@<`(``````#!&````````
+M`0````$```"0<`(``````%!&`````````0````$```#0<`(``````'A&````
+M`````0````$```"P<0(``````*!&`````````0````$`````<@(``````,A&
+M`````````0````$```"`<@(``````/!&`````````0````$```!0<P(`````
+M`#!'`````````0````$```"0=0(``````%!'`````````0````$```#P=0(`
+M`````'!'`````````0````$```!0=@(``````*A'`````````0````$`````
+M=P(``````,A'`````````0````$```!@=P(``````.A'`````````0````$`
+M``"@=P(```````A(`````````0````$```#@=P(``````$A(`````````0``
+M``$```!0?0(``````&A(`````````0````$```"P?0(``````(A(````````
+M`0````$`````?@(``````,!(`````````0````$```!@?@(``````-A(````
+M`````0````$```"`?@(``````/!(`````````0````$```"@?@(``````!!)
+M`````````0````$```"0?P(``````"A)`````````0````$```"P?P(`````
+M`$!)`````````0````$```#@?P(``````&!)`````````0````$```!P@`(`
+M`````*!)`````````0````$```"@@0(``````,A)`````````0````$```"0
+M@@(```````!*`````````0````$```#`@P(``````$!*`````````0````$`
+M``!PA`(``````%A*`````````0````$```"PA0(``````'!*`````````0``
+M``$```#`A0(``````(A*`````````0````$```#0A0(``````*!*````````
+M`0````$```#PA0(``````+A*`````````0````$````0A@(``````-!*````
+M`````0````$```!`A@(``````.A*`````````0````$```!PA@(``````!!+
+M`````````0````$```"PAP(``````"A+`````````0````$```#PAP(`````
+M`%!+`````````0````$```"0B`(``````&A+`````````0````$```#PB`(`
+M`````(!+`````````0````$````0B0(``````*!+`````````0````$````0
+MC0(``````,!+`````````0````$```!PC@(``````/A+`````````0````$`
+M```@D`(``````!!,`````````0````$```!PD`(``````"A,`````````0``
+M``$```"0D`(``````%!,`````````0````$`````D0(``````'A,````````
+M`0````$````0E`(``````*!,`````````0````$```#`E`(``````,A,````
+M`````0````$```!`E0(```````A-`````````0````$````0E@(``````"A-
+M`````````0````$```"0E@(``````$A-`````````0````$```!0EP(`````
+M`(A-`````````0````$```#0F@(``````*!-`````````0````$```#@F@(`
+M`````+A-`````````0````$````PFP(``````-!-`````````0````$```!`
+MFP(``````.A-`````````0````$```!0FP(```````!.`````````0````$`
+M``!@FP(``````!A.`````````0````$```#@FP(``````#!.`````````0``
+M``$```"`G`(``````$A.`````````0````$```"0G`(``````&!.````````
+M`0````$```"@G`(``````'A.`````````0````$```#PG`(``````)!.````
+M`````0````$`````G0(``````*A.`````````0````$`````G@(``````,!.
+M`````````0````$```!`G@(``````.!.`````````0````$```"`G@(`````
+M`/A.`````````0````$```"@G@(``````!!/`````````0````$`````GP(`
+M`````"A/`````````0````$```!@GP(``````$A/`````````0````$```"`
+MGP(``````'!/`````````0````$```!@H`(``````+!/`````````0````$`
+M``"@I@(``````-!/`````````0````$````0IP(``````/!/`````````0``
+M``$````PIP(``````!!0`````````0````$```!0IP(``````#!0````````
+M`0````$```!PIP(``````%!0`````````0````$```"0IP(``````'A0````
+M`````0````$````@J0(``````*!0`````````0````$`````K@(``````,A0
+M`````````0````$```!`L@(``````/!0`````````0````$````0LP(`````
+M`!A1`````````0````$```"PM`(``````#A1`````````0````$```"0M0(`
+M`````&!1`````````0````$````@M@(``````(A1`````````0````$````0
+MMP(``````*A1`````````0````$````PMP(``````.A1`````````0````$`
+M```PN@(``````!!2`````````0````$```#@N@(``````#A2`````````0``
+M``$```"`O@(``````&!2`````````0````$`````P`(``````(A2````````
+M`0````$```!`P0(``````,A2`````````0````$````PQP(``````.A2````
+M`````0````$```#0QP(``````!A3`````````0````$`````T0(``````%A3
+M`````````0````$```"`U0(``````(!3`````````0````$```#@UP(`````
+M`+A3`````````0````$```#PVP(``````.A3`````````0````$````0X`(`
+M`````!!4`````````0````$````0Y`(``````#A4`````````0````$```!P
+MY@(``````&!4`````````0````$```!0[0(``````(A4`````````0````$`
+M``#@[P(``````.!4`````````0````$````@\P(``````/A4`````````0``
+M``$```!`\P(``````!!5`````````0````$```!0\P(``````"A5````````
+M`0````$```"`\P(``````$!5`````````0````$```"0\P(``````&A5````
+M`````0````$````0]`(``````)!5`````````0````$```#@]`(``````*A5
+M`````````0````$````0]0(``````-!5`````````0````$```!@]0(`````
+M`/!5`````````0````$```#@]0(```````A6`````````0````$````0]@(`
+M`````"!6`````````0````$```!0]@(``````$!6`````````0````$```"`
+M]@(``````%A6`````````0````$```"0]@(``````'!6`````````0````$`
+M``"@]@(``````(A6`````````0````$```#0]@(``````*!6`````````0``
+M``$````0]P(``````+A6`````````0````$```!P]P(``````.!6````````
+M`0````$`````^`(```````A7`````````0````$```!@^`(``````$!7````
+M`````0````$```!`^0(``````&A7`````````0````$````0^@(``````(A7
+M`````````0````$```"@^@(``````+!7`````````0````$`````^P(`````
+M`-A7`````````0````$```#@^P(```````A8`````````0````$```#@_`(`
+M`````"A8`````````0````$```!`_0(``````%!8`````````0````$```"@
+M_0(``````&A8`````````0````$```"P_0(``````(!8`````````0````$`
+M``#0_0(``````)A8`````````0````$```#P_0(``````-!8`````````0``
+M``$```!@``,``````!!9`````````0````$```#``0,``````$!9````````
+M`0````$```#``@,``````&A9`````````0````$```!@`P,``````)A9````
+M`````0````$`````!`,``````-A9`````````0````$```!@!0,``````!!:
+M`````````0````$````P!P,``````#A:`````````0````$```#P!P,`````
+M`&!:`````````0````$```!P"0,``````*!:`````````0````$```!P"@,`
+M`````+A:`````````0````$```"P"@,``````-!:`````````0````$```#0
+M"@,``````.A:`````````0````$`````"P,```````!;`````````0````$`
+M``!`"P,``````!A;`````````0````$```"`"P,``````#!;`````````0``
+M``$```#`"P,``````$A;`````````0````$````P#`,``````&!;````````
+M`0````$```#P#`,``````'A;`````````0````$`````#0,``````*!;````
+M`````0````$```!0#0,``````,!;`````````0````$```#0#0,``````.!;
+M`````````0````$```"0#@,```````!<`````````0````$```#P#@,`````
+M`"A<`````````0````$```"@#P,``````$!<`````````0````$```"P#P,`
+M`````&!<`````````0````$`````$`,``````(A<`````````0````$```!P
+M$`,``````*A<`````````0````$```#P$`,``````,!<`````````0````$`
+M```P$0,``````.!<`````````0````$```"`$0,```````A=`````````0``
+M``$```#@$0,``````#A=`````````0````$````@%0,``````&!=````````
+M`0````$```"0%0,``````(A=`````````0````$```"`%@,``````*A=````
+M`````0````$```#`%@,``````-!=`````````0````$```#`&`,``````/!=
+M`````````0````$````0&0,``````!A>`````````0````$```"@&@,`````
+M`$!>`````````0````$`````'0,``````&!>`````````0````$```!@'0,`
+M`````)!>`````````0````$````@*`,``````-!>`````````0````$````@
+M*@,``````/!>`````````0````$```!P*@,``````!A?`````````0````$`
+M``!P*P,``````$A?`````````0````$```#@+`,``````'A?`````````0``
+M``$```!P+@,``````)A?`````````0````$`````+P,``````,!?````````
+M`0````$```!P+P,``````/A?`````````0````$```#`,0,``````"!@````
+M`````0````$```!@,@,``````$A@`````````0````$```"@,P,``````'!@
+M`````````0````$```"@-`,``````+!@`````````0````$````@-@,`````
+M`,A@`````````0````$```"`-@,``````.!@`````````0````$```"@-@,`
+M`````/A@`````````0````$```#P-@,``````#AA`````````0````$```"P
+M-P,``````'AA`````````0````$```#`.`,``````*AA`````````0````$`
+M```@.0,``````.AA`````````0````$```"`.@,```````!B`````````0``
+M``$```#@.@,``````!AB`````````0````$```"`.P,``````#!B````````
+M`0````$```!@/`,``````$AB`````````0````$```!P/0,``````&!B````
+M`````0````$```#`/0,``````'AB`````````0````$```!`/@,``````+AB
+M`````````0````$```#00@,``````-!B`````````0````$```#@0@,`````
+M`.AB`````````0````$```!P0P,```````AC`````````0````$```#P0P,`
+M`````#!C`````````0````$````P1`,``````$AC`````````0````$````0
+M10,``````'!C`````````0````$```"@10,``````*!C`````````0````$`
+M```01@,``````+AC`````````0````$```"01@,``````-!C`````````0``
+M``$```"P1@,``````.AC`````````0````$```#01@,```````!D````````
+M`0````$```#P1@,``````!AD`````````0````$````01P,``````#!D````
+M`````0````$````P1P,``````$AD`````````0````$```!01P,``````&!D
+M`````````0````$```!P1P,``````'AD`````````0````$```"01P,`````
+M`)!D`````````0````$```"P1P,``````*AD`````````0````$```#01P,`
+M`````,!D`````````0````$```#P1P,``````-AD`````````0````$````0
+M2`,``````/!D`````````0````$````P2`,```````AE`````````0````$`
+M``!02`,``````"!E`````````0````$```!P2`,``````#AE`````````0``
+M``$```"@2`,``````%!E`````````0````$```#02`,``````'!E````````
+M`0````$````020,``````)!E`````````0````$```!020,``````+!E````
+M`````0````$```"020,``````-!E`````````0````$`````2@,``````/!E
+M`````````0````$```!P2@,``````!AF`````````0````$`````2P,`````
+M`$!F`````````0````$```#02P,``````&AF`````````0````$```"`3`,`
+M`````(!F`````````0````$```"@3`,``````)AF`````````0````$```#@
+M3`,``````,!F`````````0````$```"030,``````.AF`````````0````$`
+M``!03@,``````!!G`````````0````$````@3P,``````#AG`````````0``
+M``$`````4`,``````%!G`````````0````$````@4`,``````'!G````````
+M`0````$```"04`,``````)!G`````````0````$`````40,``````+!G````
+M`````0````$```!P40,``````-!G`````````0````$```#040,``````/!G
+M`````````0````$````P4@,``````!!H`````````0````$```"04@,`````
+M`#!H`````````0````$````@4P,``````%!H`````````0````$```"04P,`
+M`````'!H`````````0````$`````5`,``````)AH`````````0````$```#`
+M5`,``````+AH`````````0````$````P50,``````-AH`````````0````$`
+M``"@50,``````/AH`````````0````$````05@,``````!AI`````````0``
+M``$```"`5@,``````#!I`````````0````$```"@5@,``````$AI````````
+M`0````$```#`5@,``````&!I`````````0````$```#@5@,``````(!I````
+M`````0````$```"@5P,``````*!I`````````0````$```!@6`,``````,!I
+M`````````0````$```#`6`,``````.AI`````````0````$```!P60,`````
+M`!!J`````````0````$````@6@,``````#!J`````````0````$```"`6@,`
+M`````$AJ`````````0````$```"P6@,``````&AJ`````````0````$````0
+M6P,``````(AJ`````````0````$```#`6P,``````*!J`````````0````$`
+M````7`,``````,!J`````````0````$```#`7`,``````.!J`````````0``
+M``$```!@70,```````AK`````````0````$```!P7@,``````"!K````````
+M`0````$```#@7@,``````$!K`````````0````$```!`7P,``````%AK````
+M`````0````$```!07P,``````'AK`````````0````$```!08`,``````)!K
+M`````````0````$```!@8`,``````*AK`````````0````$```"P8`,`````
+M`,AK`````````0````$````@80,``````/!K`````````0````$```#P80,`
+M`````!AL`````````0````$```"@8@,``````$AL`````````0````$```#`
+M8P,``````'AL`````````0````$```#09`,``````)AL`````````0````$`
+M````90,``````+!L`````````0````$```"`90,``````,AL`````````0``
+M``$```#`90,``````.!L`````````0````$`````9@,``````/AL````````
+M`0````$```!`9@,``````!!M`````````0````$```"`9@,``````"AM````
+M`````0````$```#`9@,``````$!M`````````0````$`````9P,``````%AM
+M`````````0````$```!`9P,``````'!M`````````0````$```"`9P,`````
+M`(AM`````````0````$```#`9P,``````*!M`````````0````$`````:`,`
+M`````+AM`````````0````$```!`:`,``````-!M`````````0````$```"`
+M:`,``````.AM`````````0````$```#`:`,```````!N`````````0````$`
+M````:0,``````!AN`````````0````$```!`:0,``````#!N`````````0``
+M``$```"`:0,``````$AN`````````0````$```#`:0,``````&!N````````
+M`0````$`````:@,``````'AN`````````0````$```!`:@,``````)!N````
+M`````0````$```"`:@,``````*AN`````````0````$```"P:@,``````,!N
+M`````````0````$```#@:@,``````.!N`````````0````$```"0:P,`````
+M`/AN`````````0````$```#0:P,``````"!O`````````0````$```"@;`,`
+M`````$!O`````````0````$```#P;`,``````'!O`````````0````$`````
+M;@,``````)!O`````````0````$```!0;@,``````,!O`````````0````$`
+M``#P;P,```````!P`````````0````$```"`<0,``````#AP`````````0``
+M``$```!@<@,``````%AP`````````0````$```#P<@,``````(AP````````
+M`0````$````0=0,``````*!P`````````0````$```!`=0,``````.!P````
+M`````0````$````0=@,``````/AP`````````0````$```#`=@,``````"!Q
+M`````````0````$```"`=P,``````$AQ`````````0````$`````>`,`````
+M`'!Q`````````0````$```#`>`,``````)AQ`````````0````$```!P>0,`
+M`````+AQ`````````0````$````0>@,``````.!Q`````````0````$`````
+M>P,``````"!R`````````0````$```#@>P,``````&!R`````````0````$`
+M``#@?`,``````*!R`````````0````$```#0?0,``````.!R`````````0``
+M``$```#`?@,``````"!S`````````0````$```"P?P,``````%!S````````
+M`0````$```!0@`,``````'!S`````````0````$```"@@`,``````)AS````
+M`````0````$```!0@0,``````+AS`````````0````$```"@@0,``````.!S
+M`````````0````$```#`@@,``````/AS`````````0````$```#P@@,`````
+M`#!T`````````0````$```#`@P,``````%AT`````````0````$```!@A0,`
+M`````'!T`````````0````$```!PA0,``````)!T`````````0````$```"0
+MA0,``````+!T`````````0````$```"PA0,``````-!T`````````0````$`
+M``#@A0,```````!U`````````0````$```!@A@,``````"!U`````````0``
+M``$```"`A@,``````$!U`````````0````$````0AP,``````&!U````````
+M`0````$```!@AP,``````(!U`````````0````$```"`AP,``````*!U````
+M`````0````$```"@AP,``````,!U`````````0````$`````B`,``````.AU
+M`````````0````$```!`B`,``````!!V`````````0````$```"`B`,`````
+M`#AV`````````0````$```#`B`,``````&!V`````````0````$`````B0,`
+M`````(AV`````````0````$```!`B0,``````+!V`````````0````$```"`
+MB0,``````-AV`````````0````$```#PB0,``````!AW`````````0````$`
+M```PBP,``````$!W`````````0````$```!PC@,``````&!W`````````0``
+M``$```"0C@,``````(!W`````````0````$```"PC@,``````*AW````````
+M`0````$`````D`,``````-!W`````````0````$```!PD`,``````/AW````
+M`````0````$```!`D@,``````#AX`````````0````$```!PE0,``````&AX
+M`````````0````$`````EP,``````)AX`````````0````$```!0F`,`````
+M`,!X`````````0````$```#@F`,``````.!X`````````0````$````@F0,`
+M``````!Y`````````0````$```!@F0,``````"!Y`````````0````$```!`
+MG`,``````#AY`````````0````$```#0G0,``````%!Y`````````0````$`
+M````G@,``````'!Y`````````0````$````@GP,``````*!Y`````````0``
+M``$```"PIP,``````,AY`````````0````$```"`J@,```````!Z````````
+M`0````$```!@JP,``````"AZ`````````0````$```"@K@,``````%!Z````
+M`````0````$```"`KP,``````'!Z`````````0````$```#PKP,``````+!Z
+M`````````0````$```"@L0,``````-AZ`````````0````$````PLP,`````
+M`!A[`````````0````$```"`P@,``````$![`````````0````$```#PP@,`
+M`````&A[`````````0````$`````Q`,``````)![`````````0````$```!0
+MQ`,``````,![`````````0````$````0Q0,``````/![`````````0````$`
+M``!@QP,``````"!\`````````0````$```!PR@,``````$A\`````````0``
+M``$```"0S`,``````'A\`````````0````$````PS0,``````)A\````````
+M`0````$```"0S0,``````+A\`````````0````$```#PS0,``````-A\````
+M`````0````$`````T`,```````A]`````````0````$`````UP,``````#A]
+M`````````0````$````0VP,``````&!]`````````0````$```!@VP,`````
+M`(A]`````````0````$```#@VP,``````+!]`````````0````$```!@W`,`
+M`````-A]`````````0````$```"PW`,```````!^`````````0````$````P
+MW0,``````"A^`````````0````$```"PW0,``````%A^`````````0````$`
+M``!`W@,``````(!^`````````0````$```"@W@,``````*A^`````````0``
+M``$```"0WP,``````-!^`````````0````$```"0X`,``````/!^````````
+M`0````$````PX0,``````!A_`````````0````$`````X@,``````#A_````
+M`````0````$````PX@,``````'!_`````````0````$````0XP,``````+!_
+M`````````0````$```!@Y`,``````.!_`````````0````$````PY@,`````
+M`!B``````````0````$```!0YP,``````#B``````````0````$```"0YP,`
+M`````'"``````````0````$```#0Z`,``````(B``````````0````$```#@
+MZ`,``````+"``````````0````$````0Z@,``````-B``````````0````$`
+M``"0Z@,```````"!`````````0````$````@ZP,``````#"!`````````0``
+M``$```"PZP,``````%B!`````````0````$```!`[`,``````)B!````````
+M`0````$````P[P,``````-"!`````````0````$````0\0,```````B"````
+M`````0````$```#@\@,``````#B"`````````0````$```!0]@,``````&""
+M`````````0````$```!0]P,``````)""`````````0````$`````^`,`````
+M`+B"`````````0````$```!P^@,``````.""`````````0````$```"0_@,`
+M`````/B"`````````0````$```#0_@,``````!B#`````````0````$````@
+M_P,``````$"#`````````0````$```"```0``````("#`````````0````$`
+M``"0`00``````)B#`````````0````$```!P`@0``````+B#`````````0``
+M``$```#P`@0``````-"#`````````0````$```!@`P0``````.B#````````
+M`0````$```"``P0```````"$`````````0````$```"0`P0``````""$````
+M`````0````$```#@`P0``````$B$`````````0````$```!@!`0``````'B$
+M`````````0````$```"`!00``````*B$`````````0````$```"0"00`````
+M`,B$`````````0````$```#P"00``````/"$`````````0````$```#0"@0`
+M`````#"%`````````0````$```!`#@0``````&B%`````````0````$```"`
+M#@0``````("%`````````0````$```"@#@0``````+"%`````````0````$`
+M``"@#P0``````,B%`````````0````$```#@#P0``````."%`````````0``
+M``$```!0$`0``````!"&`````````0````$```!`$00``````#"&````````
+M`0````$```"@$00``````%B&`````````0````$```"`$@0``````'B&````
+M`````0````$````@$P0``````+B&`````````0````$```!`%00``````/"&
+M`````````0````$````@&00``````!B'`````````0````$```"0&00`````
+M`$"'`````````0````$````@&@0``````'"'`````````0````$```!P'`0`
+M`````)"'`````````0````$````0'00``````+B'`````````0````$```"`
+M'@0``````.B'`````````0````$```!`)@0``````"B(`````````0````$`
+M``#0*`0``````$"(`````````0````$````P*00``````%B(`````````0``
+M``$```!`*00``````'"(`````````0````$```!@*00``````(B(````````
+M`0````$```!P*00``````+"(`````````0````$```!@*@0``````-B(````
+M`````0````$```"@*@0``````/B(`````````0````$```#P*@0``````!B)
+M`````````0````$```!0*P0``````#")`````````0````$```!@*P0`````
+M`&")`````````0````$```!P*P0``````'B)`````````0````$```#`*P0`
+$````````
`
end
diff --git a/sys/dev/hptnr/him.h b/sys/dev/hptnr/him.h
index 455818d..9805740 100644
--- a/sys/dev/hptnr/him.h
+++ b/sys/dev/hptnr/him.h
@@ -197,7 +197,8 @@ IDENTIFY_DATA, *PIDENTIFY_DATA;
typedef struct _HIM_DEVICE_CONFIG
{
HPT_U64 capacity;
-
+ HPT_U32 logical_sector_size;
+
DEVICE_FLAGS flags;
HPT_U8 path_id;
diff --git a/sys/dev/hptnr/hptintf.h b/sys/dev/hptnr/hptintf.h
index 82dce3c..fa3b36e 100644
--- a/sys/dev/hptnr/hptintf.h
+++ b/sys/dev/hptnr/hptintf.h
@@ -371,6 +371,7 @@ typedef HPT_U32 DEVICEID;
#define HPT_CAP_DUMP_METADATA 0x1
#define HPT_CAP_DISK_CHECKING 0x2
+#define HPT_CAP_REPORT_SECTOR_SIZE 0x10
typedef struct _DRIVER_CAPABILITIES {
HPT_U32 dwSize;
diff --git a/sys/dev/hptnr/hptnr_config.c b/sys/dev/hptnr/hptnr_config.c
index fe70f93..228ade1 100644
--- a/sys/dev/hptnr/hptnr_config.c
+++ b/sys/dev/hptnr/hptnr_config.c
@@ -46,7 +46,7 @@ int init_config(void)
const char driver_name[] = "hptnr";
const char driver_name_long[] = "R750/DC7280 controller driver";
-const char driver_ver[] = "v1.0.1";
+const char driver_ver[] = "v1.1.1";
int osm_max_targets = 0xff;
diff --git a/sys/dev/hptnr/hptnr_config.h b/sys/dev/hptnr/hptnr_config.h
index f59d6d2..2c91cd0 100644
--- a/sys/dev/hptnr/hptnr_config.h
+++ b/sys/dev/hptnr/hptnr_config.h
@@ -34,6 +34,7 @@
#define TARGETNAME hptnr
#define __dummy_reg hptnr___dummy_reg
#define __ldm_alloc_cmd hptnr___ldm_alloc_cmd
+#define debug_flag hptnr_debug_flag
#define delay_between_spinup hptnr_delay_between_spinup
#define dmapool_active hptnr_dmapool_active
#define dmapool_get_page hptnr_dmapool_get_page
@@ -114,6 +115,7 @@
#define ldm_timer_probe_device hptnr_ldm_timer_probe_device
#define ldm_unregister_device hptnr_ldm_unregister_device
#define log_sector_repair hptnr_log_sector_repair
+#define msi hptnr_msi
#define num_drives_per_spinup hptnr_num_drives_per_spinup
#define os_get_stamp hptnr_os_get_stamp
#define os_get_vbus_seq hptnr_os_get_vbus_seq
diff --git a/sys/dev/hptnr/hptnr_osm_bsd.c b/sys/dev/hptnr/hptnr_osm_bsd.c
index fe352d1..1a436df 100644
--- a/sys/dev/hptnr/hptnr_osm_bsd.c
+++ b/sys/dev/hptnr/hptnr_osm_bsd.c
@@ -30,7 +30,8 @@
#include <dev/hptnr/hptnr_config.h>
#include <dev/hptnr/os_bsd.h>
#include <dev/hptnr/hptintf.h>
-
+int msi = 0;
+int debug_flag = 0;
static HIM *hpt_match(device_t dev)
{
PCI_ID pci_id;
@@ -431,10 +432,61 @@ static void os_cmddone(PCOMMAND pCmd)
{
POS_CMDEXT ext = (POS_CMDEXT)pCmd->priv;
union ccb *ccb = ext->ccb;
+ HPT_U8 *cdb;
+
+ if (ccb->ccb_h.flags & CAM_CDB_POINTER)
+ cdb = ccb->csio.cdb_io.cdb_ptr;
+ else
+ cdb = ccb->csio.cdb_io.cdb_bytes;
KdPrint(("os_cmddone(%p, %d)", pCmd, pCmd->Result));
callout_stop(&ext->timeout);
+ switch(cdb[0]) {
+ case 0x85: /*ATA_16*/
+ case 0xA1: /*ATA_12*/
+ {
+ PassthroughCmd *passthru = &pCmd->uCmd.Passthrough;
+ HPT_U8 *sense_buffer = (HPT_U8 *)&ccb->csio.sense_data;
+ memset(&ccb->csio.sense_data, 0,sizeof(ccb->csio.sense_data));
+
+ sense_buffer[0] = 0x72; /* Response Code */
+ sense_buffer[7] = 14; /* Additional Sense Length */
+
+ sense_buffer[8] = 0x9; /* ATA Return Descriptor */
+ sense_buffer[9] = 0xc; /* Additional Descriptor Length */
+ sense_buffer[11] = (HPT_U8)passthru->bFeaturesReg; /* Error */
+ sense_buffer[13] = (HPT_U8)passthru->bSectorCountReg; /* Sector Count (7:0) */
+ sense_buffer[15] = (HPT_U8)passthru->bLbaLowReg; /* LBA Low (7:0) */
+ sense_buffer[17] = (HPT_U8)passthru->bLbaMidReg; /* LBA Mid (7:0) */
+ sense_buffer[19] = (HPT_U8)passthru->bLbaHighReg; /* LBA High (7:0) */
+
+ if ((cdb[0] == 0x85) && (cdb[1] & 0x1))
+ {
+ sense_buffer[10] = 1;
+ sense_buffer[12] = (HPT_U8)(passthru->bSectorCountReg >> 8); /* Sector Count (15:8) */
+ sense_buffer[14] = (HPT_U8)(passthru->bLbaLowReg >> 8); /* LBA Low (15:8) */
+ sense_buffer[16] = (HPT_U8)(passthru->bLbaMidReg >> 8); /* LBA Mid (15:8) */
+ sense_buffer[18] = (HPT_U8)(passthru->bLbaHighReg >> 8); /* LBA High (15:8) */
+ }
+
+ sense_buffer[20] = (HPT_U8)passthru->bDriveHeadReg; /* Device */
+ sense_buffer[21] = (HPT_U8)passthru->bCommandReg; /* Status */
+ KdPrint(("sts 0x%x err 0x%x low 0x%x mid 0x%x hig 0x%x dh 0x%x sc 0x%x",
+ passthru->bCommandReg,
+ passthru->bFeaturesReg,
+ passthru->bLbaLowReg,
+ passthru->bLbaMidReg,
+ passthru->bLbaHighReg,
+ passthru->bDriveHeadReg,
+ passthru->bSectorCountReg));
+ KdPrint(("result:0x%x,bFeaturesReg:0x%04x,bSectorCountReg:0x%04x,LBA:0x%04x%04x%04x ",
+ pCmd->Result,passthru->bFeaturesReg,passthru->bSectorCountReg,
+ passthru->bLbaHighReg,passthru->bLbaMidReg,passthru->bLbaLowReg));
+ }
+ default:
+ break;
+ }
switch(pCmd->Result) {
case RETURN_SUCCESS:
@@ -561,47 +613,303 @@ static void hpt_scsi_io(PVBUS_EXT vbus_ext, union ccb *ccb)
ccb->ccb_h.status = CAM_REQ_CMP;
break;
- case INQUIRY:
+ case 0x85: /*ATA_16*/
+ case 0xA1: /*ATA_12*/
+ {
+ int error;
+ HPT_U8 prot;
+ PassthroughCmd *passthru;
+
+ if (mIsArray(vd->type)) {
+ ccb->ccb_h.status = CAM_PATH_INVALID;
+ break;
+ }
+
+ HPT_ASSERT(vd->type == VD_RAW && vd->u.raw.legacy_disk);
+
+ prot = (cdb[1] & 0x1e) >> 1;
+
+
+ if (prot < 3 || prot > 5)
{
- PINQUIRYDATA inquiryData;
- memset(ccb->csio.data_ptr, 0, ccb->csio.dxfer_len);
- inquiryData = (PINQUIRYDATA)ccb->csio.data_ptr;
+ ccb->ccb_h.status = CAM_REQ_INVALID;
+ break;
+ }
- inquiryData->AdditionalLength = 31;
- inquiryData->CommandQueue = 1;
- memcpy(&inquiryData->VendorId, "HPT ", 8);
- memcpy(&inquiryData->ProductId, "DISK 0_0 ", 16);
-
- if (vd->target_id / 10) {
- inquiryData->ProductId[7] = (vd->target_id % 100) / 10 + '0';
- inquiryData->ProductId[8] = (vd->target_id % 100) % 10 + '0';
+ pCmd = ldm_alloc_cmds(vbus, vd->cmds_per_request);
+ if (!pCmd) {
+ HPT_ASSERT(0);
+ ccb->ccb_h.status = CAM_BUSY;
+ break;
+ }
+
+ passthru = &pCmd->uCmd.Passthrough;
+ if (cdb[0] == 0x85/*ATA_16*/) {
+ if (cdb[1] & 0x1) {
+ passthru->bFeaturesReg =
+ ((HPT_U16)cdb[3] << 8)
+ | cdb[4];
+ passthru->bSectorCountReg =
+ ((HPT_U16)cdb[5] << 8) |
+ cdb[6];
+ passthru->bLbaLowReg =
+ ((HPT_U16)cdb[7] << 8) |
+ cdb[8];
+ passthru->bLbaMidReg =
+ ((HPT_U16)cdb[9] << 8) |
+ cdb[10];
+ passthru->bLbaHighReg =
+ ((HPT_U16)cdb[11] << 8) |
+ cdb[12];
+ } else {
+ passthru->bFeaturesReg = cdb[4];
+ passthru->bSectorCountReg = cdb[6];
+ passthru->bLbaLowReg = cdb[8];
+ passthru->bLbaMidReg = cdb[10];
+ passthru->bLbaHighReg = cdb[12];
}
- else
- inquiryData->ProductId[7] = (vd->target_id % 100) % 10 + '0';
-
- memcpy(&inquiryData->ProductRevisionLevel, "4.00", 4);
-
- ccb->ccb_h.status = CAM_REQ_CMP;
+ passthru->bDriveHeadReg = cdb[13];
+ passthru->bCommandReg = cdb[14];
+
+ } else { /*ATA_12*/
+
+ passthru->bFeaturesReg = cdb[3];
+ passthru->bSectorCountReg = cdb[4];
+ passthru->bLbaLowReg = cdb[5];
+ passthru->bLbaMidReg = cdb[6];
+ passthru->bLbaHighReg = cdb[7];
+ passthru->bDriveHeadReg = cdb[8];
+ passthru->bCommandReg = cdb[9];
+ }
+
+ if (cdb[1] & 0xe0) {
+
+
+ if (!(passthru->bCommandReg == ATA_CMD_READ_MULTI ||
+ passthru->bCommandReg == ATA_CMD_READ_MULTI_EXT ||
+ passthru->bCommandReg == ATA_CMD_WRITE_MULTI ||
+ passthru->bCommandReg == ATA_CMD_WRITE_MULTI_EXT ||
+ passthru->bCommandReg == ATA_CMD_WRITE_MULTI_FUA_EXT)
+ ) {
+ goto error;
+ }
+ }
+
+
+ if (passthru->bFeaturesReg == ATA_SET_FEATURES_XFER &&
+ passthru->bCommandReg == ATA_CMD_SET_FEATURES) {
+ goto error;
+ }
+
+
+ passthru->nSectors = ccb->csio.dxfer_len/ATA_SECTOR_SIZE;
+ switch (prot) {
+ default: /*None data*/
+ break;
+ case 4: /*PIO data in, T_DIR=1 match check*/
+ if ((cdb[2] & 3) &&
+ (cdb[2] & 0x8) == 0)
+ {
+ OsPrint(("PIO data in, T_DIR=1 match check"));
+ goto error;
+ }
+ pCmd->flags.data_in = 1;
+ break;
+ case 5: /*PIO data out, T_DIR=0 match check*/
+ if ((cdb[2] & 3) &&
+ (cdb[2] & 0x8))
+ {
+ OsPrint(("PIO data out, T_DIR=0 match check"));
+ goto error;
+ }
+
+ pCmd->flags.data_out = 1;
+ break;
+ }
+ pCmd->type = CMD_TYPE_PASSTHROUGH;
+ pCmd->priv = ext = cmdext_get(vbus_ext);
+ HPT_ASSERT(ext);
+ ext->ccb = ccb;
+ pCmd->target = vd;
+ pCmd->done = os_cmddone;
+ pCmd->buildsgl = os_buildsgl;
+ pCmd->psg = ext->psg;
+
+ if(!ccb->csio.dxfer_len)
+ {
+ ldm_queue_cmd(pCmd);
+ return;
}
+ pCmd->flags.physical_sg = 1;
+ error = bus_dmamap_load_ccb(vbus_ext->io_dmat,
+ ext->dma_map, ccb,
+ hpt_io_dmamap_callback, pCmd,
+ BUS_DMA_WAITOK
+ );
+ KdPrint(("bus_dmamap_load return %d", error));
+ if (error && error!=EINPROGRESS) {
+ os_printk("bus_dmamap_load error %d", error);
+ cmdext_put(ext);
+ ldm_free_cmds(pCmd);
+ ccb->ccb_h.status = CAM_REQ_CMP_ERR;
+ xpt_done(ccb);
+ }
+ return;
+error:
+ ldm_free_cmds(pCmd);
+ ccb->ccb_h.status = CAM_PATH_INVALID;
break;
+ }
+
+ case INQUIRY:
+ {
+ PINQUIRYDATA inquiryData;
+ HIM_DEVICE_CONFIG devconf;
+ HPT_U8 *rbuf;
+
+ memset(ccb->csio.data_ptr, 0, ccb->csio.dxfer_len);
+ inquiryData = (PINQUIRYDATA)ccb->csio.data_ptr;
+
+ if (cdb[1] & 1) {
+ rbuf = (HPT_U8 *)inquiryData;
+ switch(cdb[2]) {
+ case 0:
+ rbuf[0] = 0;
+ rbuf[1] = 0;
+ rbuf[2] = 0;
+ rbuf[3] = 3;
+ rbuf[4] = 0;
+ rbuf[5] = 0x80;
+ rbuf[6] = 0x83;
+ ccb->ccb_h.status = CAM_REQ_CMP;
+ break;
+ case 0x80: {
+ rbuf[0] = 0;
+ rbuf[1] = 0x80;
+ rbuf[2] = 0;
+ if (vd->type == VD_RAW) {
+ rbuf[3] = 20;
+ vd->u.raw.him->get_device_config(vd->u.raw.phy_dev,&devconf);
+ memcpy(&rbuf[4], devconf.pIdentifyData->SerialNumber, 20);
+ ldm_ide_fixstring(&rbuf[4], 20);
+ } else {
+ rbuf[3] = 1;
+ rbuf[4] = 0x20;
+ }
+ ccb->ccb_h.status = CAM_REQ_CMP;
+ break;
+ }
+ case 0x83:
+ rbuf[0] = 0;
+ rbuf[1] = 0x83;
+ rbuf[2] = 0;
+ rbuf[3] = 12;
+ rbuf[4] = 1;
+ rbuf[5] = 2;
+ rbuf[6] = 0;
+ rbuf[7] = 8;
+ rbuf[8] = 0;
+ rbuf[9] = 0x19;
+ rbuf[10] = 0x3C;
+ rbuf[11] = 0;
+ rbuf[12] = 0;
+ rbuf[13] = 0;
+ rbuf[14] = 0;
+ rbuf[15] = 0;
+ ccb->ccb_h.status = CAM_REQ_CMP;
+ break;
+ default:
+ ccb->ccb_h.status = CAM_REQ_INVALID;
+ break;
+ }
+
+ break;
+ }
+ else if (cdb[2]) {
+ ccb->ccb_h.status = CAM_REQ_INVALID;
+ break;
+ }
+
+ inquiryData->DeviceType = 0; /*DIRECT_ACCESS_DEVICE*/
+ inquiryData->Versions = 5; /*SPC-3*/
+ inquiryData->ResponseDataFormat = 2;
+ inquiryData->AdditionalLength = 0x5b;
+ inquiryData->CommandQueue = 1;
+
+ if (ccb->csio.dxfer_len > 63) {
+ rbuf = (HPT_U8 *)inquiryData;
+ rbuf[58] = 0x60;
+ rbuf[59] = 0x3;
+
+ rbuf[64] = 0x3;
+ rbuf[66] = 0x3;
+ rbuf[67] = 0x20;
+
+ }
+
+ if (vd->type == VD_RAW) {
+ vd->u.raw.him->get_device_config(vd->u.raw.phy_dev,&devconf);
+ if ((devconf.pIdentifyData->GeneralConfiguration & 0x80))
+ inquiryData->RemovableMedia = 1;
+
+
+ memcpy(&inquiryData->VendorId, "ATA ", 8);
+ memcpy(&inquiryData->ProductId, devconf.pIdentifyData->ModelNumber, 16);
+ ldm_ide_fixstring((HPT_U8 *)&inquiryData->ProductId, 16);
+ memcpy(&inquiryData->ProductRevisionLevel, devconf.pIdentifyData->FirmwareRevision, 4);
+ ldm_ide_fixstring((HPT_U8 *)&inquiryData->ProductRevisionLevel, 4);
+ if (inquiryData->ProductRevisionLevel[0] == 0 || inquiryData->ProductRevisionLevel[0] == ' ')
+ memcpy(&inquiryData->ProductRevisionLevel, "n/a ", 4);
+ } else {
+ memcpy(&inquiryData->VendorId, "HPT ", 8);
+ snprintf((char *)&inquiryData->ProductId, 16, "DISK_%d_%d ",
+ os_get_vbus_seq(vbus_ext), vd->target_id);
+ inquiryData->ProductId[15] = ' ';
+ memcpy(&inquiryData->ProductRevisionLevel, "4.00", 4);
+ }
+
+ ccb->ccb_h.status = CAM_REQ_CMP;
+ break;
+ }
case READ_CAPACITY:
{
HPT_U8 *rbuf = ccb->csio.data_ptr;
HPT_U32 cap;
+ HPT_U8 sector_size_shift = 0;
+ HPT_U64 new_cap;
+ HPT_U32 sector_size = 0;
+
+ if (mIsArray(vd->type))
+ sector_size_shift = vd->u.array.sector_size_shift;
+ else{
+ if(vd->type == VD_RAW){
+ sector_size = vd->u.raw.logical_sector_size;
+ }
+
+ switch (sector_size) {
+ case 0x1000:
+ KdPrint(("set 4k setctor size in READ_CAPACITY"));
+ sector_size_shift = 3;
+ break;
+ default:
+ break;
+ }
+ }
+ new_cap = vd->capacity >> sector_size_shift;
- if (vd->capacity>0xfffffffful)
- cap = 0xfffffffful;
+ if (new_cap > 0xfffffffful)
+ cap = 0xffffffff;
else
- cap = vd->capacity - 1;
-
+ cap = new_cap - 1;
+
rbuf[0] = (HPT_U8)(cap>>24);
rbuf[1] = (HPT_U8)(cap>>16);
rbuf[2] = (HPT_U8)(cap>>8);
rbuf[3] = (HPT_U8)cap;
rbuf[4] = 0;
rbuf[5] = 0;
- rbuf[6] = 2;
+ rbuf[6] = 2 << sector_size_shift;
rbuf[7] = 0;
ccb->ccb_h.status = CAM_REQ_CMP;
@@ -611,8 +919,28 @@ static void hpt_scsi_io(PVBUS_EXT vbus_ext, union ccb *ccb)
case SERVICE_ACTION_IN:
{
HPT_U8 *rbuf = ccb->csio.data_ptr;
- HPT_U64 cap = vd->capacity - 1;
+ HPT_U64 cap = 0;
+ HPT_U8 sector_size_shift = 0;
+ HPT_U32 sector_size = 0;
+
+ if(mIsArray(vd->type))
+ sector_size_shift = vd->u.array.sector_size_shift;
+ else{
+ if(vd->type == VD_RAW){
+ sector_size = vd->u.raw.logical_sector_size;
+ }
+ switch (sector_size) {
+ case 0x1000:
+ KdPrint(("set 4k setctor size in SERVICE_ACTION_IN"));
+ sector_size_shift = 3;
+ break;
+ default:
+ break;
+ }
+ }
+ cap = (vd->capacity >> sector_size_shift) - 1;
+
rbuf[0] = (HPT_U8)(cap>>56);
rbuf[1] = (HPT_U8)(cap>>48);
rbuf[2] = (HPT_U8)(cap>>40);
@@ -623,7 +951,7 @@ static void hpt_scsi_io(PVBUS_EXT vbus_ext, union ccb *ccb)
rbuf[7] = (HPT_U8)cap;
rbuf[8] = 0;
rbuf[9] = 0;
- rbuf[10] = 2;
+ rbuf[10] = 2 << sector_size_shift;
rbuf[11] = 0;
ccb->ccb_h.status = CAM_REQ_CMP;
@@ -641,6 +969,8 @@ static void hpt_scsi_io(PVBUS_EXT vbus_ext, union ccb *ccb)
case 0x8f: /* VERIFY_16 */
{
int error;
+ HPT_U8 sector_size_shift = 0;
+ HPT_U32 sector_size = 0;
pCmd = ldm_alloc_cmds(vbus, vd->cmds_per_request);
if(!pCmd){
KdPrint(("Failed to allocate command!"));
@@ -678,6 +1008,27 @@ static void hpt_scsi_io(PVBUS_EXT vbus_ext, union ccb *ccb)
pCmd->uCmd.Ide.nSectors = (HPT_U16) cdb[8] | ((HPT_U16)cdb[7]<<8);
break;
}
+
+ if(mIsArray(vd->type)) {
+ sector_size_shift = vd->u.array.sector_size_shift;
+ }
+ else{
+ if(vd->type == VD_RAW){
+ sector_size = vd->u.raw.logical_sector_size;
+ }
+
+ switch (sector_size) {
+ case 0x1000:
+ KdPrint(("<8>resize sector size from 4k to 512"));
+ sector_size_shift = 3;
+ break;
+ default:
+ break;
+ }
+ }
+ pCmd->uCmd.Ide.Lba <<= sector_size_shift;
+ pCmd->uCmd.Ide.nSectors <<= sector_size_shift;
+
switch (cdb[0]) {
case READ_6:
@@ -716,7 +1067,7 @@ static void hpt_scsi_io(PVBUS_EXT vbus_ext, union ccb *ccb)
}
default:
- ccb->ccb_h.status = CAM_REQ_INVALID;
+ ccb->ccb_h.status = CAM_SEL_TIMEOUT;
break;
}
diff --git a/sys/dev/hptnr/i386-elf.hptnr_lib.o.uu b/sys/dev/hptnr/i386-elf.hptnr_lib.o.uu
index 30acda8..c547f65 100644
--- a/sys/dev/hptnr/i386-elf.hptnr_lib.o.uu
+++ b/sys/dev/hptnr/i386-elf.hptnr_lib.o.uu
@@ -1,2931 +1,1555 @@
begin 644 hptnr_lib.o
-M?T5,1@$!`0D```````````$``P`!```````````````X;@4``````#0`````
-M`"@`#@`+`````````````````(M$)`0/ME0D#,8`",9``1*`?"0(`'0)@$@"
-M!.L'C78`@&`"^X32=`B`8`S?ZP:)]H!(#""X%````,.-M@````#SPXVT)@``
-M``"-O"<`````55=64X/L+(ML)$"+?"1(#[9$)$R(1"0;#[94)%"(5"0:BU0D
-M1(M"&(E$)"C'0A@`````@WPD*``/A5T!``")+"3H_/___XG&N`````"%]@^$
-M_0$``(DL).C\____B40D*(7`=1:)="0$B2PDZ/S___^X`````.G7`0``QD8D
-M&L9&)0C&1B8(QD8G`,9&*/_&1BD`QD85JXM4)$0/MT(<9HE&$(EN&,=&(/\`
-M``#'1F0(````BT0D*(M`"(E&-`7_````B48XQD8<)(M$)"B)1E#'1FQ`````
-MQD84@(U>/,=$)`0`````B1PDZ/S____'1"0,_P```(M$)"B+4!"+0`R)1"0$
-MB50D"(D<).C\____B70D!(DL).C\____N\C____K&\<$).@#``#H_/___X/K
-M`8DL).C\____A-MT#`^V1A0\@'3=A,!T/8U$)"B)1"0$B2PDZ/S___\/MT8>
-MB40D!(M4)$2+0BR)!"3H_/___XET)`2)+"3H_/___[@`````Z<H```#'1E``
-M````B70D!(DL).C\____BT0D*(M8"`^V1"0:B40D"`^V1"0;B40D!(U#!(D$
-M).C\____B<;&`P#&0P$`QD,"`,9#`P")?"0$B2PDZ/S___^-5R2X`````,8$
-M$`"#P`&#^!!U](U>!,9')!7&1R41B%\HQD<I`(UW/`^VVXE?(,='9`````"+
-M5"0HBT((B4<TB5=0QT0D!`````")-"3H_/___XE<)`R+1"0HBU`0BT`,B40D
-M!(E4)`B)-"3H_/___[@!````@\0L6UY?7<.0D)"0D)!3BUPD"(M$)`R)PF:)
-M0P3&0PH`9L=#"```9H7`=!J#Z@&Y`````(L#9HD4"(/!`H/J`6:#^O]U[EO#
-MC;8`````5E.+7"0,BT0D$(G&9HE#!,9#"@%FQT,(``!FA<!T(KH`````N0``
-M``"-M"8`````BP-FB10(@\(!@\$"9CGR=>];7L.-M@````"-OP````!3BUPD
-M"(!["@%U*@^W0P@/M\B+$P^W%$J#P`%FB4,(9CM#!G(&9L=#"```9H-K!`$/
-MM\+K%(L3#[=#!(/H`6:)0P0/M\`/MP1"6\.0C70F`(/L"(D<)(ET)`2+7"0,
-MBTPD$(G.@'L*`74F#[=3!`^W0P@!P@^W0P:)QHG0P?H?]_Z+`V:)#%!F@T,$
-M`>L6B?8/MT,$#[?(BQ-FB31*@\`!9HE#!(L<)(MT)`2#Q`C#D(M$)`1F@W@$
-M``^4P`^VP,.+1"0$BP@YR'4'N0````#K"HL1BT$$B4($B1")R,.)]E=64XM4
-M)!"+3"04#[9\)!B)^(3`=#8/M@*)T[X`````.@%T%.L?#[93`0^V00&#PP&#
-MP0$XPG4-@\8!B?*)^#C"=>/K![@`````ZP6X`0```%M>7\.-="8`C;PG````
-M`(M$)`3&0`$`BU0D"(A0`L=`!`````##B?:-O"<`````55=64XM,)!2+?"08
-MBVPD'(MT)"`/ME$!#[;"C01`P>`"B<,#60B#P@&(40$!<02X`````,8$&`"#
-MP`&#^`QU](D[B6L$B?"(0PB)\@^VQHA#"<'J$(/B/P^V0PJ#X,`)T(A#"EM>
-M7UW#C;0F`````(M4)`0/MD(!.@(/DL`/ML##ZPV0D)"0D)"0D)"0D)"04P^W
-M3"0,#[9<)!"+5"0(N`````"`>@+_=0AFB0J(6@+K#(/``8/"!&8]@`!UY@^W
-MP%O#C;8`````C;PG`````(/L'(E<)`R)="00B7PD%(EL)!B+;"0@BTPD*(M<
-M)"P/MT0D)(U4A0"`>@+_=0AFB0J(6@+K&0^VPXE$)`@/M\&)1"0$B2PDZ/S_
-M__\/M\"+7"0,BW0D$(M\)!2+;"08@\0<PXVV`````(V\)P````!3#[=<)`P/
-MMDPD$(M4)`BX`````#A*`G479CD:=1+&0@+_9L<"___K$XVT)@````"#P`&#
-MP@1F/8``==@/M\!;P^L-D)"0D)"0D)"0D)"0D%93BUPD#`^W="00#[9,)!2Z
-M`````(G0.$R3`G4&9CDTDW0.@\`!@\(!@?J`````=>1F/8``=06X@`$```^W
-MP%M>PXVT)@````"-O"<`````@^P0B1PDB70D!(E\)`B);"0,BVPD%`^V120\
-M"'1(/"AT1#RH#X06`0``/(B-="8`#X1:`0``/`IT+#PJC70F`'0D/*H/A/8`
-M```\BHUT)@`/A#H!```\+W0,/(^-="8`#X7H`0``/"\/A)4````\+W<B/`IT
-M9#P*=PH\"(UT)@!U1.M6/"AT>SPJC;8`````=33K;SR/#X3T````/(^)]G<5
-M/(@/A.8````\BHUT)@!U%.G9````/*B-M"8`````='X\JG1ZO@````"_````
-M`+@`````Z68!```/MD4FP>`(#[95)PG0#[95)8/B'\'B$`G0B<:_``````^V
-M12CI/0$```^V52;!XA@/MD4GP>`0"<(/MD4I"<(/MD4HP>`("<*)UK\`````
-M#[9%*\'@"`^V52P)T.D%`0``D(UT)@`/ME4FP>(8#[9%)\'@$`G"#[9%*0G"
-M#[9%*,'@"`G"B=:_``````^V52K!XA@/MD4KP>`0"<(/MD4M"<(/MD4LP>`(
-M"=#IM@```(VV``````^V12:)PK@`````P>(8#[9-)XG+N0````#!XQ`)R`G:
-M#[9-+;L`````"<@)V@^V32B)R[D`````P>,("<@)V@^V32F)R[D`````"<@)
-MV@^V32J[``````^DRQC!X1@)R`G:#[9-*[L`````#Z3+$,'A$`G("=H/MDTL
-MNP`````/I,L(P>$(B<8)SHG7"=\/ME4NP>(8#[9%+\'@$`G"#[9%,0G"#[9%
-M,,'@"`G0C78`B758B7U<B45@9H--$@&+'"2+="0$BWPD"(ML)`R#Q!##ZPV0
-MD)"0D)"0D)"0D)"05E.+="0,#[=$)!"Z_____V:%P'0MNO____^Y`````(/H
-M`0^WP(U8`0^V!#$QT`^VP,'J"#,4A0````"#P0$YV77FB=!;7L.)]HV\)P``
-M``"#[$R+1"10#[90,XE4)$0/ME`RB50D0`^V4#&)5"0\#[90,(E4)#@/ME`O
-MB50D-`^V4"Z)5"0P#[90+8E4)"P/ME`LB50D*`^V4"N)5"0D#[90*HE4)"`/
-MME`IB50D'`^V4"B)5"08#[90)XE4)!0/ME`FB50D$`^V4"6)5"0,#[90)(E4
-M)`B)1"0$QP0D`````.C\____@\1,PY"-="8`4X/L&(M4)""+3"0D#[9!`8A"
-M`0^V00*(0@*+002)0@2+6@@/MD(!C01`P>`"BU$(B40D"(E4)`2)'"3H_/__
-M_X/$&%O#C70F`(V\)P````!3BU0D"(M:1`^V2CRX`````,8$$`"#P`&#^'!U
-M](E:1(A*/%O#C70F`(V\)P````"+5"0$N`````"-M"8`````Q@00_X/``3T`
-M`@``=?+SPXM$)`2Y`````#L`=`V+2`2+$8M!!(E"!(D0B<C#D)"04XM,)`B+
-M&8N#!`$``(G"@>)^__[_B9,$`0``)7[_\O^+402)`HM1!(E"#(M1!(E"$(M1
-M!(E"%(M1!(E"&(M1!(E"!(L!BX!4`0``HP`````E_@#__XL1B8)4`0``6\.0
-M4XM<)`@/MDPD#(L#BY`$`0``B14`````#[=#)&8]@&1T#F8]@)%T"&8]@)1U
-M$XGV#[;)@\$(N`$```#3X`G"ZP\/MLF#P0RX`0```-/@"<*+`XF0!`$``%O#
-MC;8`````4XM<)`@/MDPD#(L#BY`$`0``B14`````#[=#)&8]@&1T#F8]@)%T
-M"&8]@)1U$XGV#[;)@\$(N/[____3P"'"ZP\/MLF#P0RX_O___]/`(<*+`XF0
-M!`$``%O#C;8`````@^P(B1PDB70D!(MT)`P/MDPD$(#Y_W1N@/D?=S.+GA@!
-M``"Z`0```-/BB=#WT"'8B888`0``BX98`0``HP`````AT'1!B898`0``ZSF-
-M=@"+GAP!```/ML&#Z""Z`0```(G!T^*)T/?0(=B)AAP!``"+AF`!``"C````
-M`"'0=`:)AF`!``"+'"2+="0$@\0(P^L-D)"0D)"0D)"0D)"0D(/L'(E<)`R)
-M="00B7PD%(EL)!B+;"0H#[94)"2+1"0@BSB`^@-V?`^VVL'C`XVT'P`"``#'
-M!@P!``#'!"00)P``Z/S___^-G!\$`@``#[95`\'B&`^V10+!X!`)P@^V10`)
-MP@^V10'!X`@)PHD3QP80`0``QP0D$"<``.C\____#[95!\'B&`^V10;!X!`)
-MP@^V100)P@^V107!X`@)PHD3ZWH/MMK!XP.-M#L``@``QP8,`0``QP0D$"<`
-M`.C\____C9P[!`(```^V50/!XA@/MD4"P>`0"<(/MD4`"<(/MD4!P>`("<*)
-M$\<&$`$``,<$)!`G``#H_/___P^V50?!XA@/MD4&P>`0"<(/MD4$"<(/MD4%
-MP>`("<*)$XM<)`R+="00BWPD%(ML)!B#Q!S#ZPV0D)"0D)"0D)"0D)"0@^P<
-MB5PD%(ET)!B+="0@#[9<)"2)7"0$B30DZ/S____'!"00)P``Z/S___^)7"0$
-MB30DZ/S___^+7"04BW0D&(/$',.-M@````"-OP````!55U93@^P,BVPD(`^V
-M5"0D#[9$)"B(1"0+BT4`@'TF``^$0@$``(V8A`$``(VXT`$``+X`````#[;2
-MB50D!(GVBT0D!(GQT_BH`0^$`P$``(/^`W8.BP.C`````(/@_HD#ZPR+`Z,`
-M````@^#^B0/'!"00)P``Z/S___^`?"0+`'0^@_X#=@Z+!Z,`````@\@"B0?K
-M#(L'HP````"#R`*)!XGZ@_X#=@F+`J,`````ZP>+`J,`````J`)T9.OEB?:#
-M_@-V+,>#K`````````#'!"00)P``Z/S___^+@[````"C`````(/(`8F#L```
-M`.LTQX/,`````````,<$)!`G``#H_/___XN#T````*,`````@\@!B8/0````
-MZR.-=@"#_@-V&\=#_`$```"+`Z,`````@\@!B0/K&8VV`````,=#_`$```"+
-M`Z,`````@\@!B0.#Q@&#PPB#QP0/MD4F.?`/A]C^__^#Q`Q;7E]=PU93@^P$
-MBTPD%`^V7"08BT0D$(LP@_D#=A>-E,Z``0``BP*C`````(/@_HD"ZQ6)]HV4
-MSH`!``"+`J,`````@^#^B0*$VW19@_D#=A6-E([0`0``BP*C`````(/(`HD"
-MZQ.-E([0`0``BP*C`````(/(`HD"C82.T`$``)"-="8`@_D#=@N+$(D5````
-M`.L)D(L0B14`````]L("='/KX9"#^0-V-8T<S0````"-A#,P`@``QP``````
-MQP0D$"<``.C\____C9PS-`(``(L#HP````"#R`&)`^LVC1S-`````(V$,U`"
-M``#'``````#'!"00)P``Z/S___^-G#-4`@``BP.C`````(/(`8D#C78`@\0$
-M6U[#D)"0D)"0D)"0D%.+3"0(BQD/MX&("P``@\`!9HF!B`L``&8[@8P+``!R
-M"6;'@8@+``````^W@8@+``#!X`(#@8`*``"+5"0,BQ*)$`^W@8@+``")@RP!
-M``!;P^L-D)"0D)"0D)"0D)"0D%93BTPD&`^W5"00#[9T)!2+7"0,N`````"-
-MM"8`````Q@0(`(/``8/X!'7T9H'B_P\/MP%F)0#P"=!FB0$/ME,)P>(,BP$E
-M_P_P_PG0B0$/MD,&@^`"@_@!&=*#X@*#P@'!X@4/MD$#@^`?"="#R!"#X/>(
-M00/V0P8!=!:)\H/B?\'B!`^W00)F)0_X"=!FB4$"6U[#C70F`(V\)P````"+
-M3"0$BU0D"+@`````C78`Q@00`(/``8/X#77T#[9!)8@"#[9!)HA"`0^V02>(
-M0@(/MD$HB$(##[9!*8A"!`^V02J(0@4/MD$KB$(&]D%F!'0C#[9!+(A""`^V
-M02V(0@D/MD$NB$(*#[9!+XA""P^V03"(0@RX`0```,.0C70F`%575E.+;"04
-MBWPD&+H`````O@$```#K4`'2B=C3^*@!=!#WP@````%U%H'R=R?;`.L.]\(`
-M```!=`:!\G<GVP"#Z0&#^?]UT(/&`8/^"748B=#!Z!"(10")T,'H"(A%`8A5
-M`EM>7UW##[9</O^Y!P```.NDC;8`````C;\`````BT0D!(N`.`H``(L0BU`$
-MBU`(BT`,HP````##D(UT)@!75E.#[!"+?"0@BW0D)(M&5`^V7RN$VW0F#[90
-M";D`````]L(!=!'K%HVT)@````")T-/XJ`%U!X/!`3C9=?'&1B8,B70D!(D\
-M).C\____@\006UY?PXUV`(V\)P````"#[`R+1"00BQ!FQT`R`0#&0"8=B40D
-M!(D4).C\____@\0,PXVV`````(V\)P````!64X/L%(M$)""+,`^W1"0DP>`"
-M`X;$!0``BQB%VW1$BQ8/MT,>9L'H!0^WP(T$A0`#``")@G`!``"+%@^W2QZ#
-MX1^X`0```-/@B8)T`0``QT0D"`````")7"0$B30DZ/S___^#Q!1;7L.-M"8`
-M````55=64X/L'(ML)#"`?2L`="NY`````(M$)#3V0`D!=!#K&HM4)#0/MD()
-MT_BH`74,@\$!#[9%*V8YR'?FBU0D-(M"*(7`="6#P%B+512)1"0$B10DZ/S_
-M__^+5"0TBT(HB40D!(DL).C\____BT0D-(/`.(M4)#0Y0C@/A(\!``")1"08
-MBT0D&(D$).C\____B<:#>"``#X1.`0``@'A/``^$F0```&:#?5``#X2.````
-MOP````"-!+T``````X7$!0``BQB%VW1G#[=#$&8[1AQU768]A0!W5P^WP("\
-M*+`$``#_=$J+50`/MT,>9L'H!0^WP(T$A0`#``")@G`!``"+50`/MTL>@^$?
-MN`$```#3X(F"=`$``,9#%"''1"0(`````(E<)`2)+"3H_/___X/'`0^W15`Y
-M^`^/=____XM&(,=`8`````#V1B@$=2&)+"3H_/___XM&(,=$)`@!````B40D
-M!(DL).C\____B?:+5B`/MH*8````#[92`HT$@`^VA`(`````#[95(@^V32&)
-M1"0,B50D"(E,)`3'!"18````Z/S___^+1B"+E3P%``")1"0(B50D!,<$)`$`
-M``#H_/___XM&((N5/`4``(E$)`B)5"0$QP0D!@```.C\____QT8@`````(M4
-M)#2`:@H!B70D!(DL).C\____BU0D&(M$)#0Y4#@/A77^__^+1"0TQT`H````
-M`(M%`(N(6`$``(D-`````(7)=`F+10")B%@!``"#Q!Q;7E]=PXGV5U93@^P@
-MBW0D,(L^#[9?*X3;=#"-AY`+``"Y`````#GP=1CK'P^VP8G"P>(&C82"D`L`
-M`(T$!SGP=`Z#P0$XV77CZP6Y``````^VT8G0P>`&C020BXP'F`L``(7)#X1_
-M````]D$&`G1YC80'D`L``#E!&'5M#[9!-(3`=`B#P`&(033K78M1+(/J((U9
-M+(U"(#G8=$V#>@P`=3KK"8UV`(-Z#`!U+\9!-`''1"00``````^V@HL```")
-M1"0,B50D"(E,)`2+A_@)``")!"3H_/___^L-BU(@@^H@C4(@.=AUOH/$(%M>
-M7\.-M"8`````@^P<B5PD#(ET)!")?"04B6PD&(M<)""+?"0DBT=,BV@<#[=7
-M$&:!^H4`=W0/M\(/MH0#L`0``#S_=&5F@_I_=Q\/ML"+DW`%``!IP"@!``"+
-M1!`L#[9`!.M+C;8`````9H'Z@0!W&0^VP(N3J`4``&G`%`T``(M$$`@/MD`$
-MZR4/ML"+DXP%``!IP+````"+1!!4#[9`!.L,C;0F`````+C_````#[:T&#8%
-M``"+1U"%P'0,B40D!(D<).C\____B7PD!(D<).C\____B6PD!(GR#[;":\!<
-MC80#0`$``(D$)/^5G````(M<)`R+="00BWPD%(ML)!B#Q!S#C70F`(/L'(E<
-M)`R)="00B7PD%(EL)!B+="0DBUPD*`^W;"0L9H%^).$!=1`/MD8F@^@1OP``
-M```\`78NBT0D((L0B[IP!0``#[=&$+G8)@$`9CV%`'<1#[?`#[:$`K`$``!I
-MR"@!```!S\9#!`6`8P7^@"/?N`````!F@7XDX0%U$@^V1B:#Z`$\`0^6P`^V
-MP(UV`,'@!P^V$X/B?PG"B!,/MD9F@^`!P>`&@^*_"<*($_9&9@%T#HD\).C\
-M____9HE#".L$9HEK"`^W0PB(1A5F@7XDX0%U*P^V5B:-0O\\`7<0#[96)X/B
-M#^LIC;0F`````(U"[[H/````/`%V%HUT)@"Z`````(-_-`!T!P^V5TV#X@\/
-MM@.#X/`)T(@#BUPD#(MT)!"+?"04BVPD&(/$',.#[#R)7"0LB70D,(E\)#2)
-M;"0XBUPD1`^V0R0\"'01/"AT#3RH=`D\B'4+D(UT)@"#2V0*ZQX\"G06/"J-
-M="8`=`X\JG0*/(IU"HVV`````(-+9`(/MWLD9H'_X0%U&0^V0R:#Z!$\`7<.
-M@TMD"+@`````Z7T%``"+0R0E____`(E$)"`]X0$0``^%Y`````^W4Q!F@?J%
-M``^',@4```^WPHMT)$`/MHP&L`0``+C_____@/G_=&EF@_I_=QT/ML&+="1`
-MBY9P!0``:<`H`0``BT00+`^V0`3K1F:!^H$`=QT/ML&+="1`BY:H!0``:<`4
-M#0``BT00"`^V0`3K(@^VP8MT)$"+EHP%``!IP+````"+1!!4#[9`!(VT)@``
-M```/ML"+5"1`#[:$`C8%``!KP%R-M`)``0``BY*H!0``#[;!:<`4#0``QT0D
-M)`````#V1`(U$`^%2@(``,9#%`2+5"1(QP(`````N`$```#I@@0```^W4Q"Y
-M_P```+C_____9H'ZA0!W?@^WPHMT)$`/MHP&L`0``+C_____@/G_=&)F@_I_
-M=QT/ML&+="1`BY9P!0``:<`H`0``BT00+`^V0`3K/V:!^H$`=QT/ML&+="1`
-MBY:H!0``:<`4#0``BT00"`^V0`3K&P^VP8MT)$"+EHP%``!IP+````"+1!!4
-M#[9`!`^VR0^VP(E$)"B+5"1`#[:L$#8%``!KQ5R-M`)``0``#[?!:<`H`0``
-M`X)P!0``B40D)&:!_^$!=0L/MD,F@^@!/`%V*6:!^?\`=`J+3"0D]D$G!'48
-MQD,4!HMT)$C'!@````"X`0```.F$`P``BU0D)`^V0B2)PH/B!8/Z!74ABTPD
-M0`^V02PZ039R%(MT)$C'!@$```"X`0```.E1`P``@WPD)``/A/8```"#^@4/
-MA>T```")7"0$BT0D)(D$).C\____A,!U&,9#%`2+5"1(QP(`````N`$```#I
-M$0,``(M,)"2`>4\?=A2+="1(QP8!````N`$```#I\P(``/9#9@%T$VO%7(M4
-M)$#VA`)(`0```707ZV!KQ5R+3"1`]H0!2`$```$/A!@"``"+="0HB70D!(M$
-M)$")!"3H_/___X3`=!2+5"1(QP(!````N`$```#IF0(``/9#9@$/A.(!``!K
-MQ5R+3"1`]H0!2`$```$/A,T!``"+="0DB30DZ/S___]F@_@?#X:W`0``BT0D
-M2,<``0```+@!````Z5`"``#V1@8"=#6!?"0@X0$0``^$CP$``(M4)"0/MD)/
-M.D).<BB+3"1(QP$!````N`$```#I&P(``(VV`````(%\)"#A`1``#X1:`0``
-MBW0D)`^W1CJ`>R3A#X5(`0``@'LE`0^%/@$``-'HB<*#X@$/MD,F@^@&/`D/
-MAQ`!```/ML#_)(4`!```QT0D$`$```#'1"0,`0```(E<)`B+1"0DB40D!(M4
-M)$")%"3H_/___X3`#X7N````BTPD2,<!`@```+@!````Z8<!``#'1"00`0``
-M`,=$)`P`````B5PD"(MT)"2)="0$BT0D0(D$).C\____A,`/A:H```"+5"1(
-MQP("````N`$```#I0P$``,=$)!`!````#[;"B40D#(E<)`B+3"0DB4PD!(MT
-M)$")-"3H_/___X3`=6N+1"1(QP`"````N`$```#I!`$``,=$)!``````#[;"
-MB40D#(E<)`B+5"0DB50D!(M,)$")#"3H_/___X3`=2R+="1(QP8"````N`$`
-M``#IQ0```,9#%`2+1"1(QP``````N`$```#IK0```(M$)$`%-`D``(D$).C\
-M____A,!T%(M4)$C'`@$```"X`0```.F$````@'LDX750@'LE`75*@'LF#W5$
-M@'LI`74^#[9#*,'@"`^V4R<!T`^WP(E$)`2+3"1`B0PDZ/S___\[0TAU!(7`
-M=17&0Q0$BW0D2,<&`````+@!````ZRZX`````.LGB?:+5"1`#[:"-08``&O`
-M7(VT`D`!``"+DJ@%``"X[`8-`.E3^___BUPD+(MT)#"+?"0TBVPD.(/$/,.-
-MM"8`````@^P<BT0D+(E$)`R+1"0HB40D"(M$)"2)1"0$BT0D((L`B00DZ/S_
-M__^#Q!S#C78`55=64X/L3(M$)&"+F%P*``"+5"1D9L="'O\/C40D,(E$)`B)
-M5"0$BTPD8(D,).C\____A,!T"8M,)##I3`P``(MT)&2+1B0E____`#WA`1``
-M#X7=````QP0DB!,``.C\____#[=6$&:!^H4`#X?Q"P``#[?"BWPD8`^VC`>P
-M!```N/____^`^?]T8F:#^G]W'0^VP8MT)&"+EG`%``!IP"@!``"+1!`L#[9`
-M!.L_9H'Z@0!W'0^VP8M\)&"+EZ@%``!IP!0-``"+1!`(#[9`!.L;#[;!BW0D
-M8(N6C`4``&G`L````(M$$%0/MD`$#[;`BWPD8`^VA`<V!0``:\!<C80'0`$`
-M`(E$)!R+EZ@%```/ML%IP!0-```!PHE4)"3'1"0@`````,=$)"@`````Z7(!
-M``"+1"1D#[=0$+G_````9H'ZA0!W#P^WPHMT)&`/MHP&L`0``(M\)&0/MW<D
-M9H'^X0%U#P^V1R:#Z!$\`0^&N````&:!^H4`=W,/M\*+?"1@#[:$![`$```\
-M_W1@9H/Z?W<9#[;`BY=P!0``:<`H`0``BT00+`^V0`3K1F:!^H$`=QT/ML"+
-M?"1@BY>H!0``:<`4#0``BT00"`^V0`3K(@^VP(M\)&"+EXP%``!IP+````"+
-M1!!4#[9`!.L%N/____\/ML"+5"1@#[:$`C8%``!KP%R-A`)``0``B40D'`^W
-MP6G`*`$```."<`4``(E$)"!F@?[A`75(ZS`/M\%IP+````"+3"1@`X&,!0``
-MB40D*(MP5(ET)!S'1"0@`````,=$)"0`````ZTF+?"1D#[97)HU"[SP!=BJ-
-M0O\\`78C9H'Y_P!T"HM$)"#V0"<$=1*+5"1DQD(4!KD`````Z?8)``#'1"0D
-M`````,=$)"@`````C40D2(E$)`2+3"1@B0PDZ/S___]FB40D&HMT)&1FB48>
-MBWPD8(D\).C\____B<6Y`@```(7`#X2J"0``BT0D9(EH5`^W5"0:B50D%&G"
-ML`0``(T\&(U'((M,)&`K@5P*``")PL'Z'P.!8`H``!.19`H``(M,)$B)02"+
-M3"1(B5$DBT4,BU40BTPD2(E!*(M,)$B)42R+1"1(#[=T)!IFB7`(N`````"-
-M=@#&!#@`@\`!/;`$``!U\HM$)&1F@7@DX0%U9HG"#[9`)H/H$3P!=UF-1"0W
-MB40D#(M$)$@/MD`(B40D"(E4)`2+3"0@B0PDZ/S___^-AR`$``"+7"1@*X-<
-M"@``B<+!^A\#@V`*```3DV0*``"+3"1(B4$0BTPD2(E1%.E&`0``D(M$)!P/
-MME`&]L(!=2N+3"1DBT$D)?___P`]X0$0``^$M@```(M<)"`/MD,D@^`%@_@%
-M#X6B````BW0D9/9&9B!T$HU$)#>)1"0$B30DZ/S____K*(U$)#>)1"0,BT0D
-M2`^V0`B)1"0(BT0D9(E$)`2+5"0@B10DZ/S___^-AR`$``"+3"1@*X%<"@``
-MB<+!^A^)RP.!8`H``!.19`H``(M,)$B)01"+3"1(B5$4B?@K@UP*``")PL'Z
-M'XMT)&`#AF`*```3EF0*``"+3"1(B4$8BTPD2(E1'.MK]L("=&:)^(M4)&`K
-M@EP*``")PL'Z'XM,)&`#@6`*```3D60*``"+3"1(B4$8BTPD2(E1'(V'(`0`
-M`(M<)&`K@UP*``")PL'Z'P.#8`H``!.39`H``(M,)$B)01"+3"1(B5$4BT0D
-M2(!(`0*+1"1D#[90/8M$)$AFB5`"BU0D9(!Z/0!T/+X`````NP````"+30B+
-M1"1DBU!$BP0:B009BT0:!(E$&02+1!H(B409"(/&`8/##(M4)&0/MD(].?!W
-MSHM,)&2+42"+1"1(B5`,9H%Y).$!=5$/MD$F@^@1/`%W1@^W1"0:B40D#(M$
-M)$B)1"0(B4PD!(M<)!R)'"3H_/___XU$)#>)1"0,B7PD"(MT)&2)="0$B1PD
-MZ/S___^`8PC^Z0P%``"+5"0<#[9"!J@"#X2"!```BT0D2,9`!OZ+1"1(@&`'
-M_H-\)"``#X33````BTPD(`^V422)T(/@!H/X!@^%O0```/;"`0^$M`````^W
-M1"0:B40D#(M$)$B)1"0(BUPD9(E<)`2+="0<B30DZ/S____V0V8!=`^+1"1(
-M#[=`",'@`XA$)#B-1"0WB40D#(E\)`B+1"1DB40D!(M4)!R)%"3H_/___XM,
-M)&3V068!=`J+7"0<@$L(`>L(BW0D'(!F"/[&!Z&+5"0@#[:"M@```(/@#P^V
-M5P&#XO`)PHA7`8M,)"`/MT$<@\`!9L'`"&:)1P*)RX'#H````.F``P``D(M<
-M)&1F@7LDX0$/A3D"```/MD,F/`]T$KL`````/!`/A5H#``#IM@```(MT)&0/
-MME8HP>((#[9&)P'"BT0D2,9`!`V+1"1(@&`%_H!,)$<(BUPD2`^V1A6+="1@
-M#[:.U@```-/@9@E#"(M,)$@/MD$!@^`?@\@@B$$!BTPD9(M!*HF'.`0``(M!
-M+HF'/`0``&;!P@AFB9=$!```#[9!*8B'0@0``,8'D8M<)"`/MT,<@\`!9L'`
-M"&:)1P(/MI.V````@^(/#[9'`8/@\`G0B$<!BUPD(('#H````.F?`@``BU0D
-M2(MT)&0/MD85BUPD8`^VB]8```#3X&8)0@C&!X%FQT<"__^+="0D#[:6BP``
-M`(/B#P^V1P&#X/`)T(A'`8M$)&2#>#0`=0[&0!0AN0````#IA`0``(M4)&3V
-M0B<!="Z+6CB%VW0GB5PD!(M,)&"+@?@)``")!"3H_/___X/@#P^V5P&#XO`)
-MPHA7`>L$BUPD)(MT)&2+5C0/MD(!OA`````\@'1\/(!W'#P5=Q(\$'-D@^@"
-M/`%W0I"-="8`ZT\\%W<WZU<\A8VV`````'0D/(5W#CR!=#X\@HUT)@!U&^L@
-M/)!R%;XH````/)*0=C(\DW4'OHP```#K)[X$````ZR`/MD($C32%"````.L3
-MO@@```#K#+X,````ZP6^'````(GRP>H"BT0D2(A0!(M,)$AFP>H(@^(!#[9!
-M!8/@_@G0B$$%C9<@!```BTPD9(M!-(ET)`B)1"0$B10DZ/S____I-@$``(M<
-M)&0/MD,D@^@$/*MW00^VP/\DA2@$``"+="1D#[9&+,'@"`^V5BV-#!"#^0UW
-M%K@!````T^"IV#X``'0(BT0D2(!(`02+1"1(@$@!`>L(BT0D2(!@`?N+1"1(
-MQD`$#8M$)$B`8`7^BU0D2(M,)&0/MD$5BUPD8`^VB]8```#3X&8)0@B+1"1(
-M@&`!'\:'(`0```:+7"0@@<.@````B5PD!(V'(00``(D$).C\____B5PD!(V'
-M)00``(D$).C\____C8]$!```BU0D9(/")(MT)&2+1B2)AT0$``"+0@2)002+
-M0@B)00B+0@R)00R+5"0@BX*H````B8<X!```BX*L````B8<\!```Q@>1BTPD
-M(`^VD;8```"#X@\/MD<!@^#P"="(1P$/MT$<@\`!9L'`"&:)1P*%VP^$AP``
-M`(L#B4<$BT,$B4<(ZWJH`71V#[=$)!J)1"0,BT0D2(E$)`B+7"1DB5PD!(MT
-M)!R)-"3H_/____9#9@%T#XM$)$@/MT`(P>`#B$0D.(U$)#>)1"0,B7PD"(M$
-M)&2)1"0$BU0D'(D4).C\____BTPD9/9!9@%T"HM<)!R`2P@!ZPB+="0<@&8(
-M_HM4)&"+@L0%``"+7"1DBTPD%(D<B`^W5"0:9L'J!0^WT@^W7"0:B=F#X1^X
-M`0```-/@BW0D8`F$EL@%``"+5"1DBT(D)?___P`]X0$0`'4TC40D1(E$)`S'
-M1"0(`````(E<)`2+3"0<B0PDZ/S___\/MD0D1X/@'X/(0(A$)$?IP0```(MT
-M)&1F@7XDX0%U10^V1B:#Z!$\`7<ZBT0D*(E$)`2+5"1@B10DZ/S___^-1"1$
-MB40D#(M,)"@/MD$TB40D"(E<)`2+7"0<B1PDZ/S____K<(MT)"")="0$BT0D
-M8(D$).C\____C40D1(E$)`P/MD9"B40D"(E<)`2+5"0<B10DZ/S___\/ME8D
-MB="#X`:#^`9U+O;"`70I#[9$)$>#X!^#R&"(1"1'#[960H/B?\'B!`^W1"1&
-M9B4/^`G09HE$)$:-1"1$B40D!(M,)&")#"3H_/___XM'((M7)+D#````B=,)
-MPW1$B40D!(E4)`C'!"1X````Z/S___^Y`P```.LIBW0D8`^VAC4&``!KP%R-
-MA`9``0``B40D'(N6J`4``+CL!@T`Z8WT__^)R(/$3%M>7UW#C78`C;PG````
-M`%575E.#[!R+="0PQT0D%`````"-OMP```#IH@$``(GVB3PDZ/S___^)PX-X
-M3`!U,(DT).C\____B4-,A<!U(8V6W````(N&W````(E8!(D#B5,$B9[<````
-MZ8@!``")]HM#)"7___\`/>$!$``/A-,````/MT,09CV```^$Q0````^VT&:)
-M4Q!F@_I_=A-F@7LDX0%U(@^V0R:#Z!$\`7<79H'ZA0!W$`^WP@^VC`:P!```
-M@/G_=1C&0Q0&B5PD!(DT).C\____Z?,```"-=@`/MVLD9H']X0%U%0^V0R:(
-M1"0;@^@1/`$/A^````#K%0^VP6G`*`$```.&<`4``(E$)!3K#`^V1"0;@^@!
-M/`%V-6:!^H``="YF@?WA`74+#[9#)H/H$3P!=AR+1"04]D`G!'42QD,4!HE<
-M)`2)-"3H_/___^MZB5PD!(DT).C\____@_@"=PN#^`%S)HUT)@#K$(/X`W59
-MB?:-O"<`````ZT&)7"0$B30DZ/S___^)]NL^@WM4`'0/C4-4B40D!(DT).C\
-M____C9;<````BX;<````B5@$B0.)4P2)GMP```#K,XE<)`2)-"3H_/___Y`Y
-MOMP````/A53^___K&`^VP6G`*`$```.&<`4``(E$)!3I'____X/$'%M>7UW#
-MB?:#[#R)7"0LB70D,(E\)#2);"0XBWPD0(MW+(LN#[9&"*@0=`S&A[0````&
-MZ:("```/MI>T````@/H!#X2#````@/H!<AN`^@0/A*H```"`^@8/A>$"``#I
-M=@(``(UT)@#&A[0````!B7PD!(DL).C\____BT0D1,9`%(&`3@@(@WA4`'03
-MBT0D1(/`5(E$)`2)+"3H_/___XN%W````(M4)$2)4`2)`HV%W````(E"!(F5
-MW````(DL).C\____Z74"``"#X/>(1@B`A[<````!QH>T`````(M,)$3&010"
-MB4PD!(DL).C\____B2PDZ/S____I0`(``,:'MP````"+1"1$@WA4`'0/@\!4
-MB40D!(DL).C\____BT\@A<D/A*\!``"+402-0@&)002#^B@/AYT!``"+A=P`
-M``"+5"1$B5`$B0*-A=P```")0@2)E=P```"`?R;_=":+1S2%P'0&@'@F`'09
-MB7PD",=$)`0"````B30DZ/S____IN0$```^V1@B#X/>#R!"(1@B+5S"%TG4-
-M@'X*`'4PZ0(!``")]L=$)!``````QT0D#`(````/MD=-B40D"(E4)`2)-"3H
-M_/___^EO`0``QT0D(`````#&1"0G`(U..(E,)!R+1"0<B00DZ/S___^)1"0H
-MBT8\BU0D*(E6/(M,)!R)"HE"!(D0BT(@A<!T(HE$)`B+A3P%``")1"0$QP0D
-M!0```.C\____BT0D*(!(*`*+5"0HB50D",=$)`0&````B30DZ/S___^+3"0H
-M@'E/`'1`BUPD((/#`8%\)"!_EI@`=RN)]HDL).C\____QP0D`0```.C\____
-MBT0D*(!X3P!T"X/#`8'[@9:8`'77B5PD((!$)"<!#[94)"<X5@H/ASW___^+
-M1S2%P'4;QD<F`V;'AY0``````(E\)`2)+"3H_/___^MVB00DZ/S___^-M@``
-M``#K9@^V7R;'!"0`````Z/S___^`9@COBX7<````BTPD1(E(!(D!C87<````
-MB4$$B8W<````B7PD",=$)`0&````B30DZ/S___^`^_]U$XE\)`B)="0$B2PD
-MZ/S___^-=@")+"3H_/___XM<)"R+="0PBWPD-(ML)#B#Q#S#C70F`%575E.#
-M[&R+M"2`````BY9P!0``N-@F`0"+C"2$````9H%Y$(4`=QF+G"2$````#[=#
-M$`^VA#"P!```:<`H`0``C3P"BY8X"@``@<)`"```#[9'0L'@"`'"BPJ)#0``
-M``")R,'H$(A$)$"+EC@*``"!PD`(```/MD="P>`(`<*+0@2C`````(A$)%B)
-MPL'J"(A4)%G!Z!"(1"1:BY8X"@``@<)`"```#[9'0L'@"`'"BT((HP````"(
-M1"1;B<+!Z@B(5"1<P>@0B$0D7<9$)%X`QD0D7P")S<'M&`^V7"1`BT0D7(E$
-M)!"+1"18B40D#(EL)`B)7"0$QP0DI````.C\____B=B#\`&)PH/B`70@@'PD
-M0`!T&8N4)(0```#&0A0`N`````#IM`(``(UT)@"+C"2$````@'D4@74SC40D
-M6(E$)`R);"0(B5PD!(D,).C\____BYPDA````,9#%`*X`````.EV`@``C;8`
-M````BXPDA````(M!)"7___\`/>$!#@!U#L9!%"&X`````.E,`@``BX0DA```
-M`/9`9@%U,X32=2^`?R;_="F-1"18B40D#(EL)`B)7"0$BY0DA````(D4).C\
-M____N`````#I#`(``(E\)`2)-"3H_/___XE\)`2)-"3H_/___XL6BXPDA```
-M``^W01YFP>@%#[?`C02%``,``(F"<`$``(L&BYPDA`````^W2QZ#X1^Z`0``
-M`(G5T^6)J'0!```/MT,>P>`"`X;$!0``QP``````#[=+'HG(9L'H!0^WP(/A
-M'XG3T^.)V??1(8R&R`4``(NL)(0````/MTT>B<AFP>@%#[?`@^$?T^+WTB%4
-MAE2+50"+102)0@2)$`^W11Z-EC0)``")1"0$B10DZ/S___^`;T\!QD44@8-]
-M5`!T$8GH@\!4B40D!(DT).C\____C4<0.4<0#X3L````B40D+(V6-`D``(E4
-M)#R+3"0LB0PDZ/S___^)PXL6#[=`'F;!Z`4/M\"-!(4``P``B8)P`0``#[=+
-M'H/A'[H!````B=73Y8L&B:AT`0``#[=#'L'@`@.&Q`4``,<```````^W2QZ)
-MR&;!Z`4/M\"#X1^)U=/EB>GWT2&,AL@%```/MTL>B<AFP>@%#[?`@^$?T^+W
-MTB%4AE0/MT,>B40D!(M$)#R)!"3H_/___X!O3P&#>U0`=`^-0U2)1"0$B30D
-MZ/S___^-EMP```"+AMP```")6`2)`XE3!(F>W````(M4)"PY5Q`/A2+___^+
-MC"2$````@6%D___^_\:'M`````2)3"0$B3PDZ/S___^X`0```)"-="8`@\1L
-M6UY?7<.0C;0F`````%575E.#[$P/MVPD9(M4)&B)5"0PBT0D;(E$)#2+?"1@
-MBS>+AEP*``")1"04"U0D-`^$BP(```^WU6G"L`0``(M<)!2-#!CV02$"=!6-
-M!)4``````X;$!0``BP#&0!0"ZQ.-!)4``````X;$!0``BP#&0!0AP>("B50D
-M+(G0`X;$!0``BQ"+0B0E____`#WA`1``#X2*`0``#[="$&8]A0!W#P^WP`^V
-MA`:P!```//]U%8M$)"P#AL0%``"+`,9`%`;I+@@```^VP&G`*`$```.&<`4`
-M`(E$)!B`?"0S`'E=#[90)(G0@^`&@_@&=1_VP@%T&HL&BY!8`0``B14`````
-MA=)T"(L&B9!8`0``BP:+@%`!``"C`````(/(`HL6B8)0`0``BP:+@`0!``"C
-M`````(#,_XL6B8($`0``9O=!(`((#X3A````@'XK``^$UP```,9$)!\`NP``
-M``"-=@")V@^VRP^V1PG3^*@!=$>`^P-V'(L&!=`!``"-!(B+`*,`````P>@4
-M@^`!ZQJ-=@"+!@70`0``C02(BP"C`````,'H%(/@`83`=`NX`0```-/@"$0D
-M'X/#`8U"`3A&*W>?@'PD'P!T8@^V1"0?.$<)=5B)Z&;!Z`4/M\")Z8/A'[H!
-M````T^*%5(94=3V+5"08@+JT`````G<'QH*T`````XM$)"P#AL0%``"+`(E$
-M)`2+3"08B0PDZ/S____IT@8``,=$)!@`````]D0D,P$/A+\&``"+1"0L`X;$
-M!0``BPC&010ABT$D)?___P`]X0$.``^$G`8``(N6.`H``('"0`@``(M<)!@/
-MMD-"P>`(`<*+`J,`````BY8X"@``@<)$"```#[9#0L'@"`'"BP*C`````(N6
-M.`H``('"2`@```^V0T+!X`@!PHL"HP````")3"0$B30DZ/S____I,P8```^W
-M_8TLO0````"+AL0%```!Z(L09H%Z).$!#X4'`0``#[9:)H#[$`^'!@8``+@!
-M````B=G3X*G`,```#X73````J0```0!U4?;$@`^$X@4``&G'L`0``(M<)!2-
-M#!@/MD$SB$(4B>@#AL0%``"+`/9`$P0/A+H%``"`>!0`#X2P!0``BU`XA=(/
-MA*4%```/MD$SB`+IF@4``&G'L`0``(M4)!2-/!")Z`.&Q`4``(L0#[9'*HA"
-M%(GH`X;$!0``BP"#>#0`#X1H!0``#[:'(00``(D$).C\____B>H#EL0%``"+
-M$HM2((G#.=!V`HG3C5<HB>@#AL0%``"+`(M`-(E<)`B)5"0$B00DZ/S____I
-M'P4``(GH`X;$!0``BP#&0!0`Z0P%``")Z`.&Q`4``(L`B40D((M(2(E,)"2X
-M_____XM<)"!F@7L0A0!W%HGH`X;$!0``BP`/MT`0#[:$,+`$```/ML!IP"@!
-M``"+GG`%```!P\:#M``````/ME,DB="#X`:#^`8/A70!``#VP@$/A&L!``"+
-M?"0@QD<4`/9'9B`/A(L$``"#?"0D``^$@`0``(M$)"3V0&4"#X2L````BU<@
-MA=(/A*$```"+2%B%R708BT<TB50D"(E$)`2)#"3H_/___^F"````BU0D((-Z
-M-`!T>(M,)"2#>6@`=0:#>6P`=&B+?"0@BV\TBU0D)(M":(7`=`B)Q_9"90%T
-M+8M,)"2+06R+ECP&``#'1"0(`0```(E4)`2)#"3_T+\`````A<!T!HN^/`8`
-M`(M'"(L7B50D"(EL)`2)!"3H_/___P,OBT<$@\<0A<!TWXN6.`H``('"0`@`
-M``^V0T+!X`@!PHL"HP````")PL'J$(M\)"2(5U/!Z!AFB4=(BY8X"@``@<)$
-M"```#[9#0L'@"`'"BQ*)%0`````/ML)FB4=,#[;&9HE'3HG0P>@0#[;`9HE'
-M4,'J&(A74HN6.`H``('"3`@```^V0T+!X`@!PHL"HP`````/ML!FB4=*Z3(#
-M``!IQ[`$``"+5"04C3P0#[9',X3`#X7,````B>@#AL0%``"+`,9`%`"+3"0@
-M]D%F$`^$_0(``(-\)"0`#X3R`@``#[9',XM<)"2(0TKV0V4"#X3=`@``@WD@
-M``^$TP(``(-[:`!U#X-[;`"0C70F``^$O@(``(M$)""+>#2+5"0DBT)HA<!T
-M"(G#]D)E`70PBTPD)(M!;(N6/`8``,=$)`@!````B50D!(D,)/_0NP````"%
-MP'0)BYX\!@``C78`BT,(BQ.)5"0(B7PD!(D$).C\____`SN+0P2#PQ"%P`^%
-M3P(``.O9/`(/A0D"```/MD]`BT<XB40D1`^V5"1'#[9$)$3!X!@)P@^V1"1%
-MP>`0"<(/MD0D1L'@"(G3"<.#X7^`^7%V-L9$)"D`@_L!=@L/MD=!@^`/B$0D
-M*<9$)"H`@_L"=@@/ME="B%0D*H/[`W9<#[9/0XA,)"OK5\9$)"D`@_L"=@L/
-MMD="@^`/B$0D*<9$)"H`QD0D*P"#^P=V,P^V1T>#P`@YPW8"B</&1"0J`(/[
-M#'8(#[973(A4)"J#^PUV"@^V3TV(3"0KZP7&1"0K`(GH`X;$!0``BP"`>!P`
-M=$.%VW0_QD`4((GH`X;$!0``BP`/MD`<.-AS`P^VV(GH`X;$!0``BP"+4#B%
-MTG0CC4=`B5PD"(E$)`2)%"3H_/___^L.B>@#AL0%``"+`,9`%"*`?"0I!'4.
-MB>@#AL0%``"+`,9`%`*+1"0@.7`8#X3]````@WPD)``/A/(```#V0&80=$8/
-MMD<SBU0D)(A"2O9"90)T-8M,)"`/ME$<B=@XTW8"B="$P'0ABUPD)(M+8(7)
-M=!8/ML"-5T")1"0(B50D!(D,).C\____@'PD*0MW60^V1"0I_R2%V`8``(M\
-M)"3&1V8!Z88```"`?"0J!'41@'PD*P)U"HM$)"3&0&81ZVZ+5"0DQD)F`NMD
-MBTPD),9!9A#K6HM<)"3&0V8+ZU"+?"0DQD=F!NM&BT0D),9`9@WK/#PH=1H/
-MMD-/@^@!B$-.B>@#AL0%``"+`,9`%('K'CP(=0S'!"00)P``Z/S___^)Z`.&
-MQ`4``(L`QD`4(8/$3%M>7UW#C70F`%575E.![)P```"+K"2P````#[>%B@L`
-M`&:)1"1^BT4`BX!``0``HP````!F)?\/9HF%B@L``&8[1"1^=6Z+10"+B%`!
-M``")#0````"+10")B%`!``"X`````/?!`/__``^$.@D``(E,)`3'!"0>````
-MZ/S___^+E"2P````B10DZ/S___^X`0```.D1"0``D(M%`(N`0`$``*,`````
-M9B7_#V:)A8H+``#K%8V-Y````(E,)%2-G30)``")7"10D(N%I`H``(L`HP``
-M```/MXV*"P``)?\/```/M]$YT'6P9H'Y_P\/A14(``#I(@@``(NU7`H``&:#
-M1"1^`0^W?"1^9CN]C@L``!G`(<=FB7PD?HN5I`H``(/"!`^WQXL4@HG7P>\0
-M]\<(````#X2O````BT4`BY!0`0``B14`````BT4`B9!0`0``]\(`__\`=&&`
-M?2L`=%OVQ@%U,KX`````]\(```$`=#WK(Y"-="8`#[?&C4@(NP$```")W]/G
-MA?IU$(U($-/CA=IU!^L8O@`````/M\9KP%R-G`5``0``A=MU(NL,@\8!#[9%
-M*V8Y\'>^BX0DL````(D$).C\____Z3H'``"+E"2P````B10DZ/S___^(0POI
-M(P<``(UV`(G19H'A_P]FB4PD3@^WV8E<)$1IP[`$``"+3`8@BUP&)(F,)(``
-M``")G"2$````BW0D1,'F`HN%Q`4```'PBP")1"1XA<`/A<0!``")3"00B5PD
-M%(E4)`R+7"1$B5PD"(E<)`3'!"3P````Z/S___]F@WU0``^$I08``,:$)(L`
-M````#[:\)(L```"-!+T`````B40D6`.%Q`4``(L0A=(/A$@!``!I][`$```#
-MM5P*``"+G10*```/MD(5B40D#(E\)`B)5"0$QP0D.0```.C\____BT0D6`.%
-MQ`4``(L`B00DZ/S___^+ABP$``"+EB@$``"+CB0$``"+MB`$``")1"04B50D
-M$(E,)`R)="0(B7PD!,<$)"P!``#H_/___XGXP>`&`<.+4S2)5"1(BU,PBTLL
-MBW,HBWLDBT,@B40D7(M#'(E$)&"+0QB)1"1DBT,4B40D:(M#$(E$)&R+0PR)
-MA"24````BT,(B80DD````(M#!(F$)(P```"+&XM$)$B)1"0XB50D-(E,)#")
-M="0LB7PD*(M4)%R)5"0DBTPD8(E,)""+?"1DB7PD'(M$)&B)1"08BU0D;(E4
-M)!2+C"24````B4PD$(N\))````")?"0,BX0DC````(E$)`B)7"0$QP0D5`$`
-M`.C\____@(0DBP````$/MH0DBP```&8[15`/@Q@%``#I=O[__XUV`/?'(```
-M``^$AP$``(M4)'B`>A2!#X57`0``QD(4(0^W0A[!X`(#A<0%``#'```````/
-MMTH>B<AFP>@%#[?`@^$?N@$```")T]/CB=GWT2&,A<@%``"+?"1X#[=/'HG(
-M9L'H!0^WP(/A']/B]](A5(54#[=''HE$)`2+1"10B00DZ/S___^#?U0`=!&)
-M^(/`5(E$)`2)+"3H_/___XM,)'@/MU$09H'ZA0`/A\(````/M\(/MH0%L`0`
-M`#S_#X2O````9H/Z?W<;#[;`:<`H`0```X5P!0``BT`L@'@$_P^5P.M7BUPD
-M>`^W0Q!F/8$`=R,/M\`/MH0HL`0``&G`%`T```.%J`4``(M`"(!X!/\/E<#K
-M)HM\)'@/MT<0#[:$*+`$``!IP+`````#A8P%``"+0%2`>`3_#Y7`A,!T,XM$
-M)'B)1"0$B2PDZ/S___^-E=P```"+A=P```"+3"1XB4@$B0&)402)C=P```#I
-MGP,``(M<)%2+4P2+1"1X@\`(B4,$BWPD>(E?"(E0!(D"Z7T#```/MT0D3F;!
-MZ`4/M\")1"1P#[=<)$Z)V8/A'[@!````T^")1"1TBU0D<(5$E50/A4H#``")
-M\`.%Q`4``(L`#[=0$&:!^H4`#X>?````#[?"#[:$!;`$```\_P^$C````&:#
-M^G]W&`^VP&G`*`$```.%<`4``(M`+`^V0`3K78GP`X7$!0``BP`/MT`09CV!
-M`'<@#[?`#[:$*+`$``!IP!0-```#A:@%``"+0`@/MD`$ZRF)\`.%Q`4``(L`
-M#[=`$`^VA"BP!```:<"P`````X6,!0``BT!4#[9`!#S_=`T/ML"`O`4V!0``
-M_W4[BUPD=(M,)'"%7(U4#X6``@``BWPD>,9'%`:)/"3H_/___\=$)`@`````
-MB7PD!(DL).C\____Z5<"```/MH0%-@4``&O`7(V$!4`!``"+E"2$````"Y0D
-M@````'0>]\<"````=1;'A"2``````````,>$)(0`````````]D`&`@^$60$`
-M`(N4)(````"+C"2$````B50D"(E,)`R)7"0$B00DZ/S___^+7"1TBTPD<(5<
-MC50/A=D!``"+?"1X@'\4@0^%BP````^W1Q[!X`(#A<0%``#'```````/MT\>
-MB<IFP>H%#[?2@^$?N/[____3P"&$E<@%```/MT<>B40D!(M$)%")!"3H_/__
-M_XE\)`2)+"3H_/___X-_5`!T$8GX@\!4B40D!(DL).C\____C97<````BX7<
-M````BTPD>(E(!(D!B5$$B8W<````Z4`!``"+A>0````[1"14=$^[`````(/#
-M`8L`.40D5'7UA-MT.[X`````BWPD5(D\).C\____C4CXBU<$B4<$B3B)4`2)
-M`CM,)'AU!;X!````@.L!==2)\(3`#X7E````BTPD5(M1!(M$)'B#P`B)002+
-M7"1XB4L(B5`$B0*+1"1TBWPD<`F$O90```#IM````(N4)(````"+C"2$````
-MB50D"(E,)`R)7"0$B00DZ/S___^+A>0````[1"14=$^[`````(/#`8L`.40D
-M5'7UA-MT.[X`````BTPD5(D,).C\____C4CXBWPD5(M7!(E'!(DXB5`$B0([
-M3"1X=06^`0```(#K`770B?"$P'4WBU0D>(!Z%(%T+8M,)%2+402+1"1X@\`(
-MB4$$BUPD>(E+"(E0!(D"BT0D=(M\)'`)A+V4````D`^W5"1^9CF5B@L```^%
-MWO?__V:!O8H+``#_#W0ABX6D"@``BP"C`````"7_#P``#[>5B@L``#G0#X6"
-M]___C87D````.87D````=$>)QHDT).C\____@^@(#[=('HG+9L'K!0^WVX/A
-M'[K^____T\(AE)V4````QT0D"`````")1"0$B2PDZ/S___\YM>0```!UNXDL
-M).C\____N`$```"!Q)P```!;7E]=PY"-="8`@^P<B5PD#(ET)!")?"04B6PD
-M&(M$)""+F#P%``"+0P2+*(DM`````/?%````D'1HBT,$B2CK88'#P`P``(L#
-MBY!0`0``B14`````BP.)D%`!``"%TG0W]\(````0=!F+`\>`4`$``````!"+
-M`XN`4`$``*,`````BP/'@%`!```!````B1PDZ/S___\!QX/&`8/^`G6AZPR^
-M`````+\`````ZYF)^(3`#Y7`A>T/E<()T`^VP(M<)`R+="00BWPD%(ML)!B#
-MQ!S#C;0F`````%575E.#["R+="1`BP:+@%`!``")1"04HP````"+!HM4)!2)
-MD%`!``#W1"04`/__``^$L`<``(!^*P`/A*8'``#&1"0K``^V;"0KC4T(N`$`
-M``")PM/BA50D%'4/C4T0T^"%1"04#X1H!P``@'PD*P-V'HL&!8`!``"-!.B+
-M`*,`````P>@3@^`!ZQR0C70F`(L&!8`!``"-!.B+`*,`````P>@3@^`!A,!T
-M&XDT).C\____B>C!X`:-!*B!C`:X"P`````(`(L6@'PD*P-V%8V$ZH`!``"+
-M`*,`````)0```0#K$XV$ZH`!``"+`*,`````)0```0"%P'0K@'PD*P-V$HV$
-MZH`!``#'`````0#I_`8``(V$ZH`!``#'`````0#IZ@8``(!^.0$/A=8%``"`
-M?"0K`W89BP8%@`$``(T$Z(L`HP````"#X`'K%XUV`(L&!8`!``"-!.B+`*,`
-M````@^`!A,`/A&0!``")Z,'@!HT<J(V$'KP+``"+5A2)1"0$B10DZ/S___^+
-MA!Z8"P``A<!T'8M0*(72=!;V0C("=1")!"3H_/___X3`#X4>`0``B>C!X`:-
-M!*B+A`:8"P``A<`/A(<```")1"0D@'@*``^$I0```,9$)",`B<>#QSB)/"3H
-M_/___XG#BT<$B5\$B3N)0P2)&/9#*`)U/8M3((72=!Z+ACP%``")5"0(B40D
-M!,<$)`4```#H_/___X!+*`*)7"0(QT0D!`8```"+1"0DB00DZ/S___^`1"0C
-M`0^V5"0CBT0D)#A0"G8NZY$/MD0D*\=$)`@!````B40D!(DT).C\____QP0D
-MH(8!`.C\____N@`M,0'K!;I`2TP`B>C!X`:-'*B-##.)D;P+``#'@<0+``#`
-M7P``#[9$)"N)PL'B!HV$@I`+``"-!`:)@<@+``"-A!Z\"P``BU84B40D!(D4
-M).C\____C70F`(!\)"L#=B^-%.T`````BP8%@`$```'0BP"C`````(L&!8`!
-M```!PHL"HP````#!Z`>#X`'K+8T4[0````"+!@6``0```="+`*,`````BP8%
-M@`$```'"BP*C`````,'H!X/@`83`=%N`?"0K`W8JC0SM`````(L&!80!```!
-MR(L`HP````"+%H'"A`$```'1#0```0")`>LQC0SM`````(L&!80!```!R(L`
-MHP````"+%H'"A`$```'1#0```0")`>L@@'PD*P-V&8L&!8`!``"-!.B+`*,`
-M````P>@2@^`!ZQ>+!@6``0``C03HBP"C`````,'H$H/@`83`#X3?`0``@'PD
-M*P-V*HT,[0````"+!@6``0```<B+`*,`````#0``!`"+%H'"@`$```'1B0'K
-M*(T,[0````"+!@6``0```<B+`*,`````#0``!`"+%H'"@`$```'1B0&)Z,'@
-M!HT$J(N$!I@+``"%P'0-B<6#>"@`=7_I9@$``(!\)"L#D'8YC13M`````(L&
-M!8`!```!T(L(B0T`````BP8%@`$``(T$`HD(BP8%@`$```'"BP*C`````.E;
-M`P``C13M`````(L&!8`!```!T(L(B0T`````BP8%@`$``(T$`HD(BP8%@`$`
-M``'"BP*C`````.DB`P``BT`H#[=(,@^WT?;&`0^%V0```(G']L("#X3.````
-MB<B#X/UFB4<RC4=PBU84B40D!(D4).C\____QD0D*P"`?Q\`#X1]````QD0D
-M*P`/MD0D*XM<ASR%VW1<BU,@A=)T'HN&/`4``(E4)`B)1"0$QP0D!0```.C\
-M____@$LH`HE<)`C'1"0$!@```(DL).C\____@'M/`'0=C78`B30DZ/S____'
-M!"0!````Z/S___^`>T\`=>:`1"0K`0^V5"0K.%<?=XC'1W!`2TP`QT=X````
-M`(E_?(U'<(M6%(E$)`2)%"3H_/___XUT)@"`?"0K`W8>BP8%@`$```^V5"0K
-MC130BP*C`````,'H"(/@`>L<BP8%@`$```^V5"0KC130BP*C`````,'H"(/@
-M`83`#X0-`0``@'PD*P-V'HL&!8`!```/ME0D*XT4T(L"HP````"#\`&#X`'K
-M'(L&!8`!```/ME0D*XT4T(L"HP````"#\`&#X`&$P`^$Q`````^V1"0KB<+!
-MX@:-A(*0"P``C00&B40D'(G"BT`(A<`/A)\```")1"08B="#P"R+5A2)1"0$
-MB10DZ/S___^+1"08@'@*`'14O0````")QX/'.(D\).C\____B<.+1P2)7P2)
-M.XE#!(D8BU,@A=)T'HN&/`4``(E4)`B)1"0$QP0D!0```.C\____@$LH`H/%
-M`8GJBT0D&#A0"G>VBU0D',="+("$'@#'0C0`````B5(XB="#P"R+5A2)1"0$
-MB10DZ/S___^`?"0K`W9D#[9<)"O!XP.+!@6``0```=B+$(D5`````(L&!8`!
-M``"-!`.)$(L&!8`!``"-!`.+`*,`````BP8%,`(``(T$`\<``````,<$)!`G
-M``#H_/___XL&!30"```!PXL#HP````#K8@^V7"0KP>,#BP8%@`$```'8BQ")
-M%0````"+!@6``0``C00#B1"+!@6``0``C00#BP"C`````(L&!5`"``"-!`/'
-M``````#'!"00)P``Z/S___^+!@54`@```<.+`Z,`````@$0D*P$/MD0D*SA&
-M*P^'7_C__XL&BX!0`0``B40D%*,`````BP:+5"04B9!0`0``]\(`__\`=!WI
-M&/C__XGHP>`&C02H@8P&N`L``````0#I_OC__[@`````@\0L6UY?7<.-="8`
-MC;PG`````%575E.#[%R+;"1P#[9$)'2(1"0S#[;0B50D-(G0P>`&C020`>B+
-MB)@+``")3"0\#[:XE@L``(M%`(!\)#,#=@S'@'`!``#$`0``ZPK'@'`!``"H
-M`0``B40D6`5T`0``B40D.(M<)%B+@W0!``"C`````(M,)#2#X0.[!P```-/C
-MB=X)QHM$)%B)L'0!``#'!"3H`P``Z/S____WTR'SBU0D6(F:=`$``(!\)#,#
-M=E"+3"0TBUPD6(V4B]`!``"+`J,`````@\@(B0*)R\'C`XM4)%B-A!H``@``
-MQP`X````QP0D$"<``.C\____BTPD6(V$&00"``#'``````#K4(M<)#2+1"18
-MC928T`$``(L"HP````"#R`B)`HM<)#3!XP.+5"18C80:``(``,<`.````,<$
-M)!`G``#H_/___XM,)%B-A!D$`@``QP``````@WPD/``/A(`(``"`?2L`=#*[
-M``````^VRXM4)#P/MD()T_BH`704QT0D"`$```")3"0$B2PDZ/S___^#PP$X
-M72MWTXM,)#SV008!=&V)3"0$B2PDZ/S___^+7"0TB5PD!(DL).C\____B=C!
-MX`:-!)B-%"B+@K0+``"I```0`'0+)?__[_^)@K0+``"+1"0\B40D!(DL).C\
-M____BT0D-,'@!HM4)#2-!)#'A`68"P```````.G1!P``BTPD/(!Y-`!T&HN%
-M^`D``(E,)`2)!"3H_/___XM<)#R`:S0!N/[___\/MDPD--/`B?L@PXA<)$,/
-MA)("``"+1"0TB40D!(DL).C\____BT0D-,'@!HM4)#2-!)"-%"B+@K0+``"I
-M```0`'0+)?__[_^)@K0+```/MDPD0XM<)#R(2PF`?2L`#X2N`0``QT0D3```
-M```/ML&)1"0@BU0D6('"``(``(E4)!P/MDPD3(A,)%,/MOF+1"0@B?G3^*@!
-M#X0^`0``C1R]`````(E<)"R)^,'@!@'8#[94)$.(E`66"P``@'PD4P,/AHT`
-M``"-'/T`````BT0D'`'8QP`X````QP0D$"<``.C\____BTPD6(V$&00"``"+
-M7"0@B1C'@7`!``#$`0``BU0D.(L"HP````")^8/A`[L'````T^.)W@G&B3+'
-M!"3H`P``Z/S____WTR'SBTPD.(D9BUPD6(M$)"R-E`/0`0``BP*C`````(/(
-M"(D"Z8@```"-'/T`````BT0D'`'8QP`X````QP0D$"<``.C\____BU0D6(V$
-M&@0"``"+3"0@B0C'@G`!``"H`0``BUPD.(L#HP````")^8/A`[L'````T^.)
-MW@G&BT0D.(DPQP0DZ`,``.C\____]],AWHM4)#B),HM,)%B-E+G0`0``BP*C
-M`````(/("(D"@T0D3`$/MD0D4X/``3A%*W8EZ8_^__^)'"3H_/___XUPX(M3
-M!(E#!(D8B5`$B0*#?@P`=!?K#+X`````BUPD/(/#+(M$)#PY6"QURX7V=#C&
-M1C(`@'TK`'0NN0````"Z`````(M<)#P/MD,)T_BH`70.#[;"B$P&0(!&,@&#
-MP@&#P0$X32MWW,=$)`@`````QT0D!($```"+1"0\B00DZ/S___^+1"0TP>`&
-MBU0D-(T$D,>$!9@+````````@'TK``^%YP,``.D!!0``QT0D"`````#'1"0$
-M!@```(M,)#R)#"3H_/___XM<)#2)7"0$B2PDZ/S___^)V,'@!HT$F(T4*(N"
-MM`L``*D``!``=`LE___O_XF"M`L``(M$)#R#P"R+5"0\.4(L#X0>`@``B40D
-M%(M,)!2)#"3H_/___XU8X(E<)$2-4`@Y4`@/A-(!``"#PRB)7"08BT0D&(D$
-M).C\____C5CX@'LE#74:C9#\````BT,LBP"+0!2)5"0$B00DZ/S___^+$XM#
-M!(E"!(D0@'M/`'0:B2PDZ/S____'!"0!````Z/S___^`>T\`=>:+0R"%P`^$
-M.@$``,=`8`````"`>T\`#X2D````9H-]4``/A)D```"_`````)"-="8`C02]
-M``````.%Q`4``(LPA?9T;0^W1A!F.T,<=6-F/84`=UT/M\"`O"BP!```_W10
-MBU4`#[=&'F;!Z`4/M\"-!(4``P``B8)P`0``BU4`#[=.'H/A'[@!````T^")
-M@G0!``#&1A0AQT0D"`````")="0$B2PDZ/S___^-M@````"#QP$/MT50.?@/
-MCW'____V0R@$=1^)+"3H_/___XM#(,=$)`@!````B40D!(DL).C\____BT,@
-M#[90`@^V0`&)5"0(B40D!,<$)$8```#H_/___XM#((N5/`4``(E$)`B)5"0$
-MQP0D`0```.C\____BT,@BY4\!0``B40D"(E4)`3'!"0&````Z/S____'0R``
-M````BU0D/(!J"@&+3"1$@&DP`8E<)`2)+"3H_/___XM$)!B+7"1$.4,H#X4U
-M_O__BU0D/(!J'`&+3"1$B4PD!(DL).C\____BT0D%(M<)#PY0RP/A>;]__^+
-M1"0\@\`XBU0D/#E".`^$'P$``+X`````B<>)/"3H_/___XG#@'A/`'0VC48!
-M@?Y_EI@`=@2)QNLGB<:)+"3H_/___\<$)`$```#H_/___X![3P!T"X/&`8'^
-M@9:8`'7;BT,@A<`/A*8```#'0&``````]D,H!'4?B2PDZ/S___^+0R#'1"0(
-M`0```(E$)`2)+"3H_/___XM3(`^V@I@````/ME("C02`#[:$`@`````/ME4B
-M#[9-(8E$)`R)5"0(B4PD!,<$)%@```#H_/___XM#((N5/`4``(E$)`B)5"0$
-MQP0D`0```.C\____BT,@BY4\!0``B40D"(E4)`3'!"0&````Z/S____'0R``
-M````BTPD/(!I"@&)7"0$B2PDZ/S___^+7"0\.7LX#X7H_O__BT0D/(E$)`2)
-M+"3H_/___XM$)#3!X`:+5"0TC020QX0%F`L```````#I#_S__\=$)$@`````
-M#[9,)$.)3"0HBUPD6('#T`$``(E<)"0/MGPD2(GX#[;`B40D5(M$)"@/MDPD
-M5-/XJ`%U#(G[.%PD,P^%Q@```(GX/`-V8XM4)%C'@G`!``#$`0``BTPD.(L!
-MHP````"+3"14@^$#C0Q)NP<```#3XXG>"<:+1"0XB3#'!"3H`P``Z/S____W
-MTR'SBU0D.(D:BTPD5(M<)"2-%(N+`J,`````@\@(B0+K78M$)%C'@'`!``"H
-M`0``BU0D.(L"HP````"+3"14@^$#C0Q)NP<```#3XXG>"<:),L<$).@#``#H
-M_/____?3(=Z+3"0XB3&+7"14BT0D)(T4F(L"HP````"#R`B)`H-$)$@!C4<!
-M.$4K#X<`____@\1<6UY?7<.-M"8`````C;PG`````%575E.#[!R+?"0PBW0D
-M-`^V;RN)Z(3`="P/ME8)NP````#VP@%T$^L<C;0F`````(G0B=G3^*@!=1"#
-MPP&)Z#C#=>WK!;L`````]D8(`G4(C48X.48X=6J)-"3H_/___X3`=$^)/"3H
-M_/___XG!A<!T4(M6/(E&/(U&.(D!B5$$B0J`1@H!B7$LQD$D!<9!)0#&04T/
-MQT0D#`$```#'1"0(`0```(E,)`2)-"3H_/___^L/#[;#B40D!(D\).C\____
-M@\0<6UY?7<.-M@````!55U93@^P,BVPD(`^V?"0DB?@/ML")1"0(B<;!Y@*[
-M`````,<$)!`G``#H_/___XGZ@/H#=AJ+10`%T`$```'PBP"C`````,'H%(/@
-M`>L9D(M%``70`0``C00&BP"C`````,'H%(/@`83`=0J#PP%F@?LL`76MBT0D
-M"(E$)`2)+"3H_/___XDL).C\____BT0D",'@!HM4)`B-!)`!Z/:`E0L```%T
-M$HN`F`L``(E$)`2)+"3H_/___X/$#%M>7UW#ZPV0D)"0D)"0D)"0D)"055=6
-M4X/L'`^V1"0TB$0D&HM\)#`/MO")\,'@!HT$L(NL!Y@+``"%[0^$J@$``+C^
-M____B?'3P(1%"0^%F`$``(U%+#E%+'4-@'T*`'4HB?;I`P,```^V1"0:B<+!
-MX@:-A(*0"P``C00'B00DZ/S____IX@(``,9$)!L`C74XB?:)-"3H_/___XG#
-MBT8$B5X$B3.)0P2)&(![)0`/A1\!```/MT,<@[R'L`(```!U$8-[(``/A.@`
-M``"-M"8`````#[=#'(N$A[`"``"#>'``#X2M````QH.T``````^V4R2)T(/@
-M!H/X!G4V]L(!=#'&0R8%QD,G!`^V0TV+4S"+2RR)7"0,B40D"(E4)`2)#"3H
-M_/___^FF````C;8`````#[93)(G0@^`&@_@$=2+VP@%T'<9#)@/&0R<$B5PD
-M!(D\).C\____ZW>-M"8`````#[93)(G0@^`&@_@&=6+VP@%U7<9#)P;&0R8%
-M9L>#E```````B5PD!(D\).C\____ZSZ+0R"+ESP%``")1"0(B50D!,<$)`0`
-M``#H_/___^L?#[=#'(N7/`4``(E$)`B)5"0$QP0D`@```.C\____D(!$)!L!
-M#[9$)!LX10H/AH4!``#IJ/[__XTLM0````"[`````,<$)!`G``#H_/___X!\
-M)!H#=AF+!P70`0```>B+`*,`````P>@4@^`!ZQ>0BP<%T`$```'HBP"C````
-M`,'H%(/@`83`=0J#PP%F@?LL`76PB70D!(D\).C\____B3PDZ/S___^)\,'@
-M!HT$L(NT!Y@+``"%]@^$^0```(!_*P!T-+L`````C;8`````#[;+#[9&"=/X
-MJ`%T%,=$)`@`````B4PD!(D\).C\____@\,!.%\K=]</MD0D&HG"P>(&C82"
-MD`L``(T$!XE&&(U&+#E&+'4JC48X.48X=2+K<HD<).C\____C6C@BU,$B4,$
-MB1B)4`2)`H-]#`!T%>L.O0````"-7BR-M@`````Y7BQUS87M=%_&13(`@'\K
-M`'15N@````"[`````(UV``^V1@F)T=/XJ`%T#@^VPXA4!4"`13(!@\,!@\(!
-M.%<K=B;KW/9&!@%T#HET)`2)/"3H_/___^L0QT0D!`````")-"3H_/___X/$
-M'%M>7UW#55=64X/L#(M\)""+'XMO*`^V<RN)\(3`=%:-@Y`+``"Y`````#GX
-M=1WK19"-="8`#[;!B<+!X@:-A(*0"P``C00#.?AT"8/!`8GP.,%UX8#Y`W8A
-MBP,%T`$```^VT8T4D(L"HP````#!Z!2#X`'K'[D`````BP,%T`$```^VT8T4
-MD(L"HP````#!Z!2#X`&$P'05#[;!B6PD"(E$)`2)'"3H_/___^L/#[;!B40D
-M!(D<).C\____@\0,6UY?7<.055=64X/L'(M<)#2+1"0PB40D%(MX5(LW]D<(
-M$'0$QD`U!HM4)!0/MD(U/`%T=3P!<AD\!`^$E@```#P&C70F``^%.@,``.FG
-M`0``BTPD%,9!-0&)3"0$B30DZ/S____&0Q2!@$\("(-[5`!T#XU#5(E$)`2)
-M-"3H_/___XV6W````(N&W````(E8!(D#B5,$B9[<````B30DZ/S____IW0(`
-M`(!G"/>+1"04@$`V`<9`-0#&0Q0"B5PD!(DT).C\____B30DZ/S____IL`(`
-M``^V1PB#X/>#R!"(1PB+3"04BY&8````C4(!B8&8````@_H"#X?Y````@WM4
-M`'0/C4-4B40D!(DT).C\____C9;<````BX;<````B5@$B0.)4P2)GMP```"+
-M1"04@'@F`'4+@'\*`'4BZ:0```#'1"0(`````,=$)`0"````B3PDZ/S____I
-M)@(``,9$)!L`C6\XB2PDZ/S___^)PXM%!(E=!(DKB4,$B1B+4R"%TG0>BX8\
-M!0``B50D"(E$)`3'!"0%````Z/S___^`2R@"B5PD",=$)`0&````B3PDZ/S_
-M__^`>T\`=!J)-"3H_/___\<$)`$```#H_/___X![3P!UYH!$)!L!#[94)!LX
-M5PIW@8M,)!2)#"3H_/___^F.`0``@&<(]XM$)!3'@)@`````````@WM4`'0/
-MC4-4B40D!(DT).C\____C9;<````BX;<````B5@$B0.)4P2)GMP```#'1"0(
-M`````,=$)`0&````B3PDZ/S___^-1S@Y1S@/A)8```")Q8VT)@````")+"3H
-M_/___XG#BT`@A<!T9\=`8`````")-"3H_/___XM#(,=$)`@!````B40D!(DT
-M).C\____BT,@BY8\!0``B40D"(E4)`3'!"0!````Z/S___^+0R"+ECP%``")
-M1"0(B50D!,<$)`8```#H_/___\=#(`````")7"0$B30DZ/S___\Y;S@/A7/_
-M__^+5"04B50D!(DT).C\____QT<H`````(L&BY!8`0``B14`````A=)T"(L&
-MB9!8`0``]D<&`71<@'XK`'0AN0````#V1PD!=`SK%`^V1PG3^*@!=0^#P0$X
-M3BMW[NL%N0`````/MMF)7"0$B30DZ/S___^)?"0$B30DZ/S___^)V,'@!HT<
-MF,>$'I@+````````B?:#Q!Q;7E]=PY"-M"8`````@^PLB5PD'(ET)"")?"0D
-MB6PD*(M\)#2+="0PBT8LB40D&(LH#[=/'HG(9L'H!0^WV(/A'[@!````T^"%
-M1)U4#X7O`P``BU4`C02=``,``(F"<`$``(M%`(N0=`$``(D5`````,9'%"&+
-M1R0E____`#WA`0\`=2&)/"3H_/___\=$)`@`````B7PD!(DL).C\____Z9P#
-M```/MT\>@^$?N`$```#3X(7"=!:)/"3H_/___XDL).C\____C;8`````#[:&
-MM````#P$#X=E`P``#[;`_R2%"`<``,:&M`````''1"0(`0```(E\)`2+5"08
-MB10DZ/S____I-P,``,:&M`````+'1"0("````(E\)`2+1"08B00DZ/S____I
-M$P,``,:&M`````.)="0(QT0D!"$```"+5"08B10DZ/S___^+5C"%TG0M#[9&
-M3<=$)!``````QT0D#`$```")1"0(B50D!(M$)!B)!"3H_/___^G``@``BU0D
-M&`^V0@G'1"0(`````(E$)`2)+"3H_/___^F?`@``QH:T````!(-^,`!T2(ET
-M)`C'1"0$(0```(M$)!B)!"3H_/___P^V1DV+5C#'1"00`````,=$)`P"````
-MB40D"(E4)`2+5"08B10DZ/S____I2@(``,=$)`@`````QT0D!"$```"+1"08
-MB00DZ/S___^+5"08#[9""<=$)`@!````B40D!(DL).C\____Z0T"``"`?B;_
-M=!V)="0(QT0D!`8```"+1"08B00DZ/S____IZ@$``(ET)`C'1"0$!@```(M4
-M)!B)%"3H_/___XM.((7)=!*+402-0@&)002#^@4/AKD!``#&1B<!QD8F`(!^
-M3P!T(8VT)@````")+"3H_/___\<$)`$```#H_/___X!^3P!UYH-^,`")]G04
-MBU8(BT8,B4($B1"+1C"`:#`!ZQ.+5C2%TG0,#[9&3<=$@CP`````BQ:+1@2)
-M0@2)$(M$)!B`:`H!BY;D````A=)T&P^VAMD```#'1"0(`0```(E$)`2)%"3H
-M_/___XM6,(72=!@/MD9-QT0D"`$```")1"0$B10DZ/S___^+1B"%P`^$A@``
-M`,=`8`````")+"3H_/___XM&(,=$)`@!````B40D!(DL).C\____BT8@#[90
-M`@^V0`&)5"0(B40D!,<$)$8```#H_/___XM&((N5/`4``(E$)`B)5"0$QP0D
-M`0```.C\____BT8@BY4\!0``B40D"(E4)`3'!"0&````Z/S____'1B``````
-MB70D!(DL).C\____BU0D&(!Z!?]T7KX`````@'H*`'0XO@````"+7"08@\,X
-MC78`B1PDZ/S___^+4P2)0P2)&(E0!(D"@'@F_W4.@\8!B?"+5"08.$(*=]>)
-M\(M4)!@X0@IW$,9"!?^)5"0$B2PDZ/S___^+7"0<BW0D((M\)"2+;"0H@\0L
-MPY"-M"8`````55=64X'LC````(N\)*````"+1U2)1"1XBRB+A:0*``"+`(E$
-M)'R)?"0$B2PDZ/S___^`?S8!=@3&1S4$C5\4.5\4#X2X`0``B1PDZ/S___^)
-M1"1TBT<4BU0D=(E0!(D"B5H$B5<4A=(/A)P#```/MW(>BTPD>(M!&`^V0`0/
-MME4I#[9-(@^V72&)="04B40D$(E4)`R)3"0(B5PD!,<$)*P!``#H_/___XM$
-M)'0/MT`>B40D6&GPL`0```.U7`H``(N=%`H``(M4)'2)%"3H_/___XN.+`0`
-M`(E,)$B+EB@$``"+CB0$``"+MB`$``"+1"1T#[=`'HE$)`2+1"1(B40D%(E4
-M)!")3"0,B70D",<$)-P!``#H_/___XM4)%C!X@8!TXM+-(E,)$B+4S"+2RR+
-M<RB+0R2)1"1<BT,@B40D8(M#'(E$)&2+0QB)1"1HBT,4B40D;(M#$(E$)'"+
-M0PR)A"2(````BT,(B80DA````(M#!(F$)(````"+&XM$)$B)1"0XB50D-(E,
-M)#")="0LBU0D7(E4)"B+3"1@B4PD)(M$)&2)1"0@BU0D:(E4)!R+3"1LB4PD
-M&(M$)'")1"04BY0DB````(E4)!"+C"2$````B4PD#(N$)(````")1"0(B5PD
-M!,<$)%0!``#H_/___V:#?5``=4;IY0$``)"+5"1XBT(8#[9`!`^V52D/MDTB
-M#[9=(<=$)!3___\`B40D$(E4)`R)3"0(B5PD!,<$)*P!``#H_/___^D%`@``
-MO@````"-C30)``")3"10C87<````B40D3(VT)@`````/M\;!X`(#A<0%``"+
-M&(7;#X1A`0``#[=#$&8Y1R0/A5,!```/MY6*"P``.50D?'1%@\(!#[>%C@L`
-M`#G"&<`APHN%I`H``(/`!(L$D*D```@`=1QF)?\/9CGP=1,Y7"1T=1.)+"3H
-M_/___^EU`0``.U0D?'6[#[=#$&8]A0")]@^'\0````^WP("\!;`$``#_#X3@
-M````BU0D>(!Z-``/A=(```#V0@8!#X3(````BU4`#[=#'F;!Z`4/M\"-!(4`
-M`P``B8)P`0``#[=+'H/A'[H!````B=#3X(G!BT4`B8AT`0``#[=#'L'@`@.%
-MQ`4``,<```````^W2QZ)R&;!Z`4/M\")1"1(@^$?B=#3X(G!]]&+1"1((8R%
-MR`4```^W2QZ)R&;!Z`4/M\"#X1_3XO?2(52%5#E<)'1T(HL#BU,$B5`$B0*+
-MA=P```")6`2)`XM4)$R)4P2)G=P````/MT,>B40D!(M,)%")#"3H_/___X!O
-M*0&#Q@%F.750#X=\_O__BT0D>/9`!@%T5XM,)'2+$8M!!(E"!(D0B4PD!(D\
-M).C\____ZSN+5"1XBT(8#[9`!`^V52D/MDTB#[9=(<=$)!3___\`B40D$(E4
-M)`R)3"0(B5PD!,<$)*P!``#H_/___X'$C````%M>7UW#55=64X/L;(N,)(``
-M``"+E"2(````B50D8(N$)(P```")1"1DBP&)1"0X#[>$)(0```#!X`*+7"0X
-M`X/$!0``BSAF@7\DX0%U-P^V1R:#Z!$\`7<LBW$HB70D0,=$)#P`````"U0D
-M9'5OBT0D0,9`-0#'1"0\`````.M=D(UT)@"+7"0XBY-P!0``N-@F`0!F@7\0
-MA0!W%@^W1Q"+="0X#[:$!K`$``!IP"@!```!PHE4)#S'1"1``````(M$)&`+
-M1"1D=1.+1"0\QH"T`````,=$)$``````@'\4@74$@&$(]XM$)&`+1"1D#X7@
-M````QD<4`/9'9B`/A`H&``"+1TB%P`^$_P4``(G#]D!E`G0ABTA8A<ET&HM7
-M-(72=!.+1R")1"0(B50D!(D,).C\____BTPD.(N1.`H``('"0`@``(MT)#P/
-MMD9"P>`(`<*+`J,`````B<+!ZA"(4U/!Z!AFB4-(BY$X"@``@<)$"```#[9&
-M0L'@"`'"BQ*)%0`````/ML)FB4-,#[;&9HE#3HG0P>@0#[;`9HE#4,'J&(A3
-M4HN1.`H``('"3`@```^V1D+!X`@!PHL"HP`````/ML!FB4-*Z3X%``"-M@``
-M```/MT<>:<"P!```BU0D.`."7`H``(E$)$2)Q8'%(`0``(!_%(!U"L9'%"&-
-MM@````"#?"0\``^$T0```(M<)#R+4R"%TG1>BW<@B70D5`^V@I@````/ME("
-MC02`#[:,`@````"+1"0X#[98(@^V<"&+1"1@BU0D9(E$)!2)5"08BU0D5(E4
-M)!")3"0,B5PD"(ET)`3'!"0,`@``Z/S____IS````(M?((E<)%B+="0\#[9V
-M38ET)#"+01@/MD@$BT0D.`^V6"D/MG`B#[90(8E4)`2+1"1@BU0D9(E$)!R)
-M5"0@BT0D6(E$)!B+5"0PB50D%(E,)!")7"0,B70D",<$)$`"``#H_/___^MD
-M@WPD0`!T78M?((E<)%R+01@/MD@$BW0D.`^V7BD/MG8BBT0D.`^V0"&)1"0$
-MBT0D8(M4)&2)1"08B50D'(M4)%R)5"04B4PD$(E<)`R)="0(QP0D?`(``.C\
-M____C;0F`````(M%#(M5"(M-!(M=``^W=QZ)1"04B50D$(E,)`R)7"0(B70D
-M!,<$)+@"``#H_/___XM,)$3V02(!#X3"````C5\\B5PD2(MW5(ET)%"+0P0/
-MME,!B40D"(E4)`3'!"1<````Z/S___^`?SP`#X0_`0``QD0D3P`/MG0D3XT$
-M=L'@`HM4)$B+2@@!P8G#BU0D4`-:"(M#"(E$)#2+`XM3!(E$)"B)5"0LBVD(
-MBUD$BPF+5"0TB50D'(M$)"B+5"0LB40D%(E4)!B);"00B4PD"(E<)`R)="0$
-MQP0DZ`(``.C\____@$0D3P$/ME0D3XM,)$@X$0^&MP```.EX____B?:+7"1$
-M@'LG``^)H@````^W5QZ)T&;!Z`4/M\`/M]*)1"0(B50D!,<$)'@```#H_/__
-M_XMT)#B+AM0%``"+EM`%``"+CLP%``"+GL@%``")1"00B50D#(E,)`B)7"0$
-MQP0DCP```.C\____#[=''HE$)`3'!"2K````Z/S___^+%@^W1QYFP>@%#[?`
-MC02%``,``(F"<`$``(L6#[=/'H/A'[@!````T^")@G0!``")]F:!?R3A`74<
-M#[9')H/H$3P!=Q&+1"1`B00DZ/S____I]`$```^V5"1C]L(!#X3``0``BT<D
-M)?___P`]X0$.``^$K0$``(M,)#B+D3@*``"!PD`(``"+7"0\#[9#0L'@"`'"
-MBS*)-0````"+D3@*``"!PD0(```/MD-"P>`(`<*+*HDM`````(N1.`H``('"
-M2`@```^V0T+!X`@!PHL:B1T`````BY$X"@``@<),"```BTPD/`^V04+!X`@!
-MPHL"HP````")1"00B5PD#(EL)`B)="0$QP0DO````.C\____]D=F(`^$S0``
-M`(M/2,9!9A#&1Q0@B?#!Z!"(05.)\,'H&&:)04B)WL'F"(GH#[;0C0069HE!
-M3(G>9H'F`/^)Z`^VU(T$%F:)04Z)VL'J$,'B"(GHP>@0#[;``<)FB5%0BUPD
-M.(N3.`H``('"3`@``(MT)#P/MD9"P>`(`<*+`J,`````#[;`9HE!2@^W44P/
-MMUE.#[=)4`^WP(E4)!")7"0,B4PD"(E$)`3'!"39````Z/S___^+1"0XBY`X
-M"@``@<)`"```#[9&0L'@"`'"QP(`````ZV%F@7\DX0%U(0^V1R:#Z!H\`7<6
-MQP0D(`,``.C\____QD<4(>L\C70F`(E\)`2+5"0XB10DZ/S____K)H32>2*+
-M3"0XBP&+B%@!``")#0````"%R70,BUPD.(L#B8A8`0``@\1L6UY?7<-3@^P(
-MBUPD%(M,)!`/MD,D.4L8=4$\"'16/"AT4CRHD'1-/(AT23P*=$4\*HUT)@!T
-M/3RJ=#D\BG0UBX'<````B5@$B0.-@=P```")0P2)F=P```#K&8N1X````(F9
-MX````(V!W````(D#B5,$B1J)#"3H_/___X/$"%O#C70F`(/L#(M$)!2)1"0$
-MBT0D$(D$).C\____@\0,PY"-="8`4X/L6(M<)&"-1"1*B40D-(U$)$R)1"0P
-MC40D1(E$)"R-1"1&B40D*(U$)%")1"0DC40D4HE$)""-1"13B40D'(U$)$Z)
-M1"08C40D5(E$)!2-1"1(B40D$(U$)%6)1"0,C40D5HE$)`B-1"17B40D!`^W
-M0R2)!"3H_/___P^V1"17B40D"`^V1"16B40D!(U$)$")!"3H_/___\=$)`P!
-M````#[9$)%=IP"@!``")1"0(BT,0B40D!(V#6`4``(D$).C\____QT0D#`$`
-M```/MD0D56G`L````(E$)`B+0Q")1"0$C8-T!0``B00DZ/S____'1"0,`0``
-M``^V1"16:<`4#0``B40D"(M#$(E$)`2-@Y`%``")!"3H_/___\=$)`P!````
-M#[=$)%#!X`*)1"0(BT,0B40D!(V#K`4``(D$).C\____QT0D#`$````/MT0D
-M2&O`<(E$)`B+0Q")1"0$C8-8!@``B00DZ/S____'1"0,`0````^V1"14#[=4
-M)$@/K\*-!$#!X`*)1"0(BT,0B40D!(V#"`8``(D$).C\____QT0D#`$```#'
-M1"0(``(``(M#$(E$)`2-@R0&``")!"3H_/___P^V1"17B40D#,=$)`@`"```
-MBT,0B40D!(V#``<``(D$).C\____QT0D#`$````/MD0D4XT$@,'@`HE$)`B+
-M0Q")1"0$C8.0!@``B00DZ/S____'1"0,`0```,=$)`B@````BT,0B40D!(V#
-MK`8``(D$).C\____QT0D#`$````/MD0D4FG`F````(E$)`B+0Q")1"0$C8/(
-M!@``B00DZ/S____'1"0,`0````^W1"1.C01`P>`#B40D"(M#$(E$)`2-@^0&
-M``")!"3H_/___\=$)`P!````#[=$)%`!P(E$)`B+0Q")1"0$C8,8"0``B00D
-MZ/S____'1"0,`0````^V1"17`<")1"0(BT,0B40D!(V#0`D``(D$).C\____
-MQT0D#`$````/MD0D50'`B40D"(M#$(E$)`2-@V@)``")!"3H_/___\=$)`P!
-M````#[9$)%8!P(E$)`B+0Q")1"0$C8.0"0``B00DZ/S____'1"0,`0````^V
-M0R8!P(E$)`B+0Q")1"0$C8.X"0``B00DZ/S____'1"0,`0````^W1"1&P>`%
-MB40D"(M#$(E$)`2-@W0&``")!"3H_/___\=$)`P!````BT0D0(E$)`B+0Q")
-M1"0$C8/@"0``B00DZ/S____'1"00`0```,=$)`Q`````#[=$)%#!X`:)1"0(
-MBT,0B40D!(V#_`D``(D$).C\____QT0D$`$```#'1"0,``$``,=$)`@`&0``
-MBT,0B40D!(V#(`H``(D$).C\____QT0D$`$```#'1"0,@`````^W1"10:<"P
-M!```B40D"(M#$(E$)`2-@T0*``")!"3H_/___\=$)!`!````QT0D#`0````/
-MMT0D3,'@`HE$)`B+0Q")1"0$C8-H"@``B00DZ/S____'1"00`0```,=$)`P$
-M````#[=$)$K!X`*)1"0(BT,0B40D!(V#C`H``(D$).C\____QT0D$`$```#'
-M1"0,"`````^V1"13P>`+B40D"(M#$(E$)`2-@[`*``")!"3H_/___\=$)!`!
-M````QT0D#`@```#'1"0(```(`(M#$(E$)`2-@]0*``")!"3H_/___\=$)!`!
-M````QT0D#`@````/MT0D3FG`C`$``(E$)`B+0Q")1"0$@</X"@``B1PDZ/S_
-M__^X`````(/$6%O#C78`@^PLB5PD'(ET)"")?"0DB6PD*(ML)#"+10")1"04
-MC5TLB1PDZ/S___^)QHU0X(E4)!B+1"04B00DZ/S___^)QXM%,(EU,(M4)!B)
-M6B")0B2),+@!````A?\/A(````#&1R3AQD<E`<9')A"`3R<!BU0D-(N"G```
-M`(E'2(M'3(E0'(G0!9````")1SC&1Q7,BU0D&`^V0C-FB4<0BT4`B4<8QT<@
-MD````(M$)#2)1S3'1VS0%@``QT0D!`````"-1SR)!"3H_/___XE\)`2+5"04
-MB10DZ/S___^X`````(M<)!R+="0@BWPD)(ML)"B#Q"S#C;8`````C;PG````
-M`%575E.#[!R+="0PQT0D&`````"+5"08#[:$,C8%```\_P^$S`````^VT&O"
-M7(V,!D`!``")3"04@+P&2@$````/A*T```"_`````(E$)!"-K`9X`0``C80&
-M0`$``(E$)`R)+"3H_/___XG#BT0D$`'PBY!\`0``B9A\`0``B2N)4P2)&HM#
-M((7`=!Z)1"0(BX8\!0``B40D!,<$)`4```#H_/___X!+*`*)7"0(QT0D!`(`
-M``"+1"04B00DZ/S___^`>T\`=!J)-"3H_/___\<$)`$```#H_/___X![3P!U
-MYH/'`8GZBTPD##A1"@^';O___X-$)!@!@WPD&`0/A1#___^)-"3H_/___X/$
-M'%M>7UW#C;8`````C;PG`````%575E.#['R+A"20````QD`Y`,9`.`#&0#<`
-MQH"Q#````(G"@<*0"P``N`````")]L8$$`"#P`$]$`$``'7RBX0DD`````7<
-M````BY0DD````(F"W````(F"X````(G0!>0```")@N0```")@N@```"!PNP`
-M``")5"1$BXPDD````(F1[````(F1\````(G/@<?T````B;GT````B;GX````
-M@<'\````B4PD3(N<))````")B_P```")BP`!``"!PP0!``")7"10B[0DD```
-M`(F>!`$``(F>"`$``(GU@<44`0``B:X4`0``B:X8`0``@<8<`0``B70D2(N$
-M))````")L!P!``")L"`!```%#`$``(E$)%2+E"20````B8(,`0``B8(0`0``
-MC40D=HE$)#2-1"1XB40D,(U$)&B)1"0LC40D;HE$)"B-1"1ZB40D)(U$)'")
-M1"0@C40D<8E$)!R-1"1LB40D&(U$)'.)1"04C40D:HE$)!"-1"1RB40D#(U$
-M)'2)1"0(C40D=8E$)`0/MT(DB00DZ/S___\/MD0D=8N,))````"(02X/MD0D
-M=(A!+P^V1"1RB('9````#[=$)'IFB4%0#[=$)'AFB8&,"P``#[=$)':#Z`%F
-MB8&."P``#[=$)&IFB4$Z#[=!)&8]@)%T"F8]@)0/A:T*``"+G"20````QD,U
-M!,9#*P3&0S9`QD,T`,:#U@````G&0RP`B=@%6`4``(D$).C\____B<*)@W`%
-M```/MD0D=6G`*`$``(7`=`O&`@"#P@&#Z`%U]8N$))`````%=`4``(D$).C\
-M____B<*+M"20````B8:,!0``#[9$)')IP+````"%P'0+Q@(`@\(!@^@!=?6+
-MA"20````!9`%``")!"3H_/___XG"BX0DD````(F0J`4```^V1"1T:<`4#0``
-MA<!T"\8"`(/"`8/H`77UBX0DD`````6L!0``B00DZ/S___^)PHN,))````")
-M@<0%```/MT0D>L'@`H7`=`O&`@"#P@&#Z`%U]8N$))`````%)`8``(D$).C\
-M____BYPDD````(F#/`8``(G8!0@&``")!"3H_/___XG#B[0DD````(F&(`8`
-M`(GP!5@&``")!"3H_/___XG"B89P!@``9H-\)&H`=$:Y`````(E:1`^V1"1S
-MB$(\B[0DD````(N&\````(F6\````(MT)$2),HE"!(D0#[9$)'.-!$"-'(.#
-MPG"#P0%F.4PD:G>_BX0DD`````5T!@``B00DZ/S___^)PHN$))````")D(P&
-M``!F@WPD;@!T,+D`````QD((`(N<))````"+@_@```")D_@```").HE"!(D0
-M@\(@@\$!9CE,)&YWU8N$))`````%D`8``(D$).C\____B<*+M"20````B8:H
-M!@``@'PD<0!T,[D`````BYPDD````(N#``$``(F3``$``(MT)$R),HE"!(D0
-M@\(4@\$!#[9$)'%F.<AWTHN$))`````%K`8``(D$).C\____B<*+A"20````
-MB9#$!@``C8J@````BYPDD````(N#"`$``(F3"`$``(MT)%"),HE"!(D0@\(4
-M.<IUVXG8!<@&``")!"3H_/___XG"B8/@!@``@'PD<`!T,KD`````BYPDD```
-M`(N#&`$``(F3&`$``(DJB4($B1"!PI@```"#P0$/MD0D<&8YR'?3BX0DD```
-M``7D!@``B00DZ/S___^)PHNT))````")AOP&``!F@WPD;`!T,+D`````BZPD
-MD````(N%$`$``(F5$`$``(M<)%2)&HE"!(D0@\(8@\$!9CE,)&QWU8!\)'4`
-M=$^[`````(NT))````"!Q@`'``")-"3H_/___P^WTXNL))````")A)48!P``
-MBY4@`0``B84@`0``BTPD2(D(B5`$B0*#PP$/MD0D=68YV'?#BX0DD`````48
-M"0``B00DZ/S___^+G"20````B8,P"0``B8,T"0``#[=$)'IFB8,Z"0``#[?`
-MB40D!(G8!30)``")!"3H_/___XG8!4`)``")!"3H_/___XF#6`D``(F#7`D`
-M``^V1"1U9HF#8@D```^WP(E$)`2)V`5<"0``B00DZ/S___^)V`5H"0``B00D
-MZ/S___^)@X`)``")@X0)```/MD0D<F:)@XH)```/M\")1"0$B=@%A`D``(D$
-M).C\____B=@%D`D``(D$).C\____B8.H"0``B8.L"0``#[9$)'1FB8.R"0``
-M#[?`B40D!(G8!:P)``")!"3H_/___XG8!;@)``")!"3H_/___XF#T`D``(F#
-MU`D```^V0R9FB8/:"0``#[9#)HE$)`2)V`74"0``B00DZ/S___^)V`7@"0``
-MB00DZ/S___^)PHF#^`D```^V1"1T:<!T!```B<&!P71%``!T#XG0B<K&``"#
-MP`&#Z@%U]8NT))````"+AO@)``")"(N6^`D```^V1"1TB$($#[9$)'2)1"0(
-MB4PD!(N&^`D``(D$).C\____OP````"`?B8`#X20````O@`````/M\YKR5R+
-MK"20````C;P-0`$``(T4*8GPB$<$QD<%`(FJ0`$``,9'"@#&@G0!````QH)<
-M`0```,>"F`$```````"-A`U@`0``B8)@`0``B8)D`0``@\`,B8)L`0``B8)P
-M`0``C80->`$``(F">`$``(F"?`$``,9'!@*#Q@$/MD4F9CGP#X=U____BY0D
-MD````,9"-`#&@C8%``#_QH(W!0``_\:".`4``/_&@CD%``#_@'PD=0`/A(,`
-M``"[``````^WRVG1*`$``(NT))````"+AG`%``#&1!`G`8N&<`4``,9$`B8`
-MBX9P!0``QD0"3/^+AG`%``#&1`)"_XN&<`4``&;'A`*4``````#'A(ZP`@``
-M`````(G1`XYP!0``C4$0B4$0`Y9P!0``C4(0B4(4@\,!#[9$)'5F.=AW@HNL
-M))````!FQX74``````"X`````(VV`````(N4))````#&A!"P!```_X/``3V&
-M````=>>`?"1T``^$K0```+L`````#[?#:<`4#0``BXPDD````(N1J`4``,9$
-M`C``BY&H!0``QD00,0"+D:@%``#'1!`,`````(G!B[0DD`````..J`4``(U1
-M$(E1$(G!`XZH!0``C5$0B5$4B<$#CJ@%``"-41B)41B)P0..J`4``(U1&(E1
-M'(N6J`4``(E\$`B)P0..J`4``(U1*(E1*`.&J`4``(U0*(E0+(/#`0^V1"1T
-M9CG8#X=8____BZPDD````,:%UP```("`?"1R`'1]NP`````/M]-ITK````"+
-MC"20````BX&,!0``9L=$$#($`(N!C`4``,9$`B8`BX&,!0``QD0"*/^+@8P%
-M``#&1`(T_XG1B[0DD`````..C`4``(U!%(E!%(G1`XZ,!0``C4$4B4$8BX:,
-M!0``B7P"5(/#`0^V1"1R9CG8=XB+K"20````QH78````@HGH!1@*``")1"0$
-MC4#DB00DZ/S___^)A10*``")Z`4\"@``B40D!(U`Y(D$).C\____B84X"@``
-MB>@%8`H``(E$)`2-0.2)!"3H_/___XF%7`H``(GH!80*``")1"0$C4#DB00D
-MZ/S___^)A8`*``")Z`6H"@``B40D!(U`Y(D$).C\____B86D"@``B>@%S`H`
-M`(E$)`2-0.2)!"3H_/___XG!B87("@``BYPDD````(N#S`H``(N3T`H``(!\
-M)'$`=%J)PXG6OP````")S2G%BT0D3(D$).C\____C50=`(E0"(E8#(EP$(N,
-M))````"+D0`!``")@0`!``"+3"1,B0B)4`2)`H'#``@``(/6`(/'`0^V1"1Q
-M9CGX=[.+A"20````!?`*``")1"0$BX0DD`````74"@``B00DZ/S___^)1"18
-MBYPDD````(F#[`H``(NL))````"+G?`*``"+M?0*``"_`````+T`````BT0D
-M4(D$).C\____BU0D6`'ZB5`(B5@,B7`0BXPDD````(N1"`$``(F!"`$``(M,
-M)%")"(E0!(D"@<,```$`@]8`@<<```$`@]4`B?@U```(``GH=:J+A"20````
-M!10+``")1"0$BX0DD`````7X"@``B00DZ/S___^)P8N<))````")@Q`+``"+
-MM"20````BX84"P``BY88"P``9H-\)&P`=%>)PXG6OP````")S2G%BT0D5(D$
-M).C\____C50=`(E0"(E8#(EP$(N,))````"+D1`!``")@1`!``"+3"14B0B)
-M4`2)`H'#C`$``(/6`(/'`68Y?"1L=[:#Q'Q;7E]=PXVV`````(V_`````%57
-M5E.#[`R+;"0@BWPD)(M?5`^V1RN)1"0(B6PD!(D<).C\____B<9F@T\R$(!]
-M*P!T2;D`````]D,)`70,ZSP/MD,)T_BH`74,@\$!#[9%*V8YR'?J9H/Y`W8E
-MBT4`!=`!```/M]&-%)"+`J,`````P>@4@_`!@^`!ZR.Y`````(M%``70`0``
-M#[?1C120BP*C`````,'H%(/P`8/@`83`=!0/ML&)1"0$B2PDZ/S____IA@$`
-M`(U#.#E#.`^$$0$``(7V#X0)`0``#[9&3<=$ASP`````BQ:+1@2)0@2)$(ET
-M)`C'1"0$!@```(D<).C\____@'Y/`'0?D(UT)@")+"3H_/___\<$)`$```#H
-M_/___X!^3P!UYHM&((7`=%;'0&``````]D8H!'4(B2PDZ/S___^+1B"+E3P%
-M``")1"0(B50D!,<$)`$```#H_/___XM&((N5/`4``(E$)`B)5"0$QP0D!@``
-M`.C\____QT8@`````(!K"@&)="0$B2PDZ/S___^+10"+D%@!``")%0````"%
-MTG0)BT4`B9!8`0``QD<F`&:#9S+O@'\?`'0BN@`````/M\*+1(<\A<!T!H!X
-M)O]U=8/"`0^V1Q]F.=!WXX!_,@!X#;X`````@'\?`'40ZTR)?"0$B2PDZ/S_
-M___K2`^WQHM<ASR%VW0G]D,H`G0ABT,@BY4\!0``B40D"(E4)`3'!"0&````
-MZ/S___^`8RC]@\8!#[9''V8Y\'?"9L=',@(`@&<M_8/$#%M>7UW#C70F`(V\
-M)P````!55U93@>R<````BX0DL````(E$)'2+4"R)5"1\BSJ+AZ0*``"+`(F$
-M)(````"+3"1TB4PD!(D\).C\____BVPD=("]MP````%V!\:%M`````2+1"1T
-M@\`0QT0D>`````"+5"1T.4(0="J+7"1T@\,0B1PDZ/S___^)1"1XBTPD=(M!
-M$(ML)'B):`2)10")702):1"+1"1T@W@@`'17N____P"#?"1X`'0(BU0D>`^W
-M6AZ+3"1TBU$@#[:"F`````^V4@*-!(`/MH0"``````^V5R(/MD\AB5PD$(E$
-M)`R)5"0(B4PD!,<$)$0#``#H_/___^M7O?___P"#?"1X`'0(BT0D>`^W:!Z+
-M5"1T#[9R38M,)'R+01@/MD`$#[97*0^V3R(/ME\AB6PD&(ET)!2)1"00B50D
-M#(E,)`B)7"0$QP0D=`,``.C\____@WPD>``/A&($``"+;"1X#[=M'HEL)%1I
-M];`$```#MUP*``"+GQ0*``"+1"1XB00DZ/S___^+EBP$``")5"1`BY8H!```
-MBXXD!```B[8@!```BT0D>`^W:!Z+1"1`B40D%(E4)!")3"0,B70D"(EL)`3'
-M!"3<`0``Z/S___^+1"14P>`&`<.+4S2)5"1`BU,PBTLLBW,HBVLDB6PD6(M#
-M((E$)%R+:QR);"1@BT,8B40D9(MK%(EL)&B+0Q")1"1LBVL,BT,(B80DE```
-M`(M#!(F$))````"+&XM$)$")1"0XB50D-(E,)#")="0LBU0D6(E4)"B+3"1<
-MB4PD)(M$)&")1"0@BU0D9(E4)!R+3"1HB4PD&(M$)&R)1"04B6PD$(N4))0`
-M``")5"0,BXPDD````(E,)`B)7"0$QP0D5`$``.C\____BVPD>(/%/(FL)(0`
-M``"+1"1XBT!4B80DC````(M%!`^V50&)1"0(B50D!,<$)%P```#H_/___X!]
-M`0`/A*,```#&A"2+`````)"-="8`#[:T)(L```"-!';!X`*+E"2$````BTH(
-M`<&)PXNL)(P````#70B+0PB)1"1PBP.+4P2)1"1`B50D1(MI"(M9!(L)BU0D
-M<(E4)!R+1"1`BU0D1(E$)!2)5"08B6PD$(E,)`B)7"0,B70D!,<$).@"``#H
-M_/___X"$)(L````!#[:4)(L```"+C"2$````.%$!#X=J____9H-_4``/A`("
-M``"^`````(VO-`D``(V'W````(E$)%`/M\;!X`(#A\0%``"+&(7;#X3*`0``
-M#[=#$(M4)'1F.4(<#X6X`0``#[>7B@L``#F4)(````!T8HGV@\(!#[>'C@L`
-M`#G"&<`APHN'I`H``(/`!(L$D*D```@`=31F)?\/9CGP=2LY7"1X=2Z+3"1X
-M#[=!'HE$)`3'!"3M````Z/S___^)/"3H_/___^F1`0``.Y0D@````'6@BT0D
-M?(!X-``/A3@!```/MT,09CV%``^'*@$```^WP("\![`$``#_#X09`0``@[PD
-ML``````/A/$```"+5"1T#[9")(/@!8/X!0^%W0```(L7#[=#'F;!Z`4/M\"-
-M!(4``P``B8)P`0``#[=+'H/A'[H!````B=#3X(G!BP>)B'0!```/MT,>P>`"
-M`X?$!0``QP``````#[=+'HG(9L'H!0^WP(E$)$R#X1^)T-/@B<'WT8M$)$PA
-MC(?(!0``#[=+'HG(9L'H!0^WP(/A']/B]](A5(=4.UPD>'0WBQ.+0P2)0@2)
-M$(-[5`!T#XU#5(E$)`2)/"3H_/___XN'W````(E8!(D#BU0D4(E3!(F?W```
-M``^W0QZ)1"0$B2PDZ/S___^+3"1T@&E/`>L:BT0D?/9`!@)T$(E<)`2+5"1T
-MB10DZ/S___^#Q@%F.7=0#X<3_O__@[PDL`````!T*XM,)'0/MD$D@^`%@_@%
-M=1N+;"1XBU4`BT4$B4($B1");"0$B0PDZ/S___^!Q)P```!;7E]=PY"0D)"0
-MD)"0D)"0D)!55U93@^P,BWPD(`^V="0D#[9$)"R(1"0+BT<LBPBZ``````^V
-M7"0H`?.(7"0#B?8/MH0*L`0``#S_=$8/ML!IP"@!``")1"0$`X%P!0``B?,X
-MF-H```!U*3FXY````'4A#[9<)`.(F-D```"+@7`%```/MEPD"XML)`2(G`78
-M````@\(!@?J`````=:.#Q`Q;7E]=PXUT)@"-O"<`````@^P(B1PDB70D!(MT
-M)!@/MEPD$`^V5"04BT0D#(M(,`^V@9`````\3W<I#[;`C02``=J(E,&5````
-M#[:!D````(T$@(GRB)3!E````("!D`````&+'"2+="0$@\0(PXGV5U93BWPD
-M$`^W1"04N_____]FA<!T0;O_____N0````"#Z`$/M_`/MA0YC4+0/`EW%X#[
-M_P^4P(/H`2'##[;#C02`C5Q"T.L%@/O_=0J#P0&-1@$YP77/#[;#6UY?PXGV
-M55=64XML)!0/MG0D&`^V?"0<BT4LBPBZ`````(UT)@`/MH0*L`0``#S_="L/
-MML!IP"@!```#@7`%```YJ.0```!U%(GS.)C9````=0J)^HB0VP```.L+@\(!
-M@?J`````=;Y;7E]=PXGVC;PG`````%575E.#[`2+="08#[9\)!P/MD0D)(A$
-M)`.+1BR+&(MN,+D`````#[:$&;`$```\_W1&#[;`:<`H`0``B<(#DW`%```Y
-MLN0```!U+8GX.(+9````=2.`?"0#`'0.BX+@````BU0D((D"ZQF+3"0@BP&)
-M@N````#K"X/!`8'Y@````'6CB>JY`````(VV``````^V@I0````\`78Y/!=T
-M-8GX.(*5````=2N`?"0#`'02C02)BX3%F````(M4)"")`NL=C12)BTPD((L!
-MB835F````.L+@\$!@\(H@_E0=;&#Q`1;7E]=PXGVC;PG`````%575E.#["`/
-MMFPD.(M$)#2+L.@````/MD8"P>`(#[96`XT\$`^WQX/`!#T`"```#X_M````
-MB>J$TG1.BTPD-`^VD=P```")TX/CX`^V1@&#X`^)T8/A$`G8"<B)TX/C"(/@
-M\XG1@^$$"=@)R(/B`H/@_(M<)#0/MHO<````@^$!"=`)R(A&`>M,#[96`8G3
-M@^/@BTPD-`^V@=P```"#X`^)T8/A$`G8"<B)TX/C"(/@\XG1@^$$"=@)R(/B
-M`H/@_`^V3@&#X0$)T`G(BUPD-(B#W````(U6"`^WQXU\!@0YUW8_B50D'+L`
-M````B>@/MO"-;"0<B70D#(EL)`@/ML.)1"0$BU0D-(D4).C\____BT0D'(/`
-M!(E$)!R#PP$Y^'+3@\0@6UY?7<.-M@````!3@^P8BTPD)(M9-`^V0P+!X`@/
-MME,#`=`/M\"-4`0/MT$@.<)_+HM,)""+@>@```")5"0(B5PD!(D$).C\____
-MQT0D!`````"+1"0@B00DZ/S___^#Q!A;PXVT)@````!55U93@^P<#[9\)#B+
-M1"0PBU@PB5PD&+X`````BVPD-(/%!`^V@Y0````\`79"/!=T/HGX.(.5````
-M=32-!+:+3"08C93!G````(M,)#0/MD$#/"!V!;@@````#[;`B40D"(EL)`2)
-M%"3H_/___XGV@\8!@\,H@_Y0=:B#Q!Q;7E]=PXVV`````(V\)P````"#["R)
-M7"0<B70D((E\)"2);"0HBUPD,`^V1"0TB$0D%XM#+(LHB2PDZ/S___^)QH7`
-M#X0'`0``B2PDZ/S___^)QX7`=1&)="0$B2PDZ/S____IZ````(U6/(E4)!B+
-M4`B+@^@```"+3"0\B4PD"(E$)`2)%"3H_/___\9&:`K&1A6L#[=#'&:)1A"+
-M1"1`B49(B6X8BU0D/(E6((-.9!*+1PB)1C2)?E"-@[@```")1CC&1AP@QT9L
-M`````,9&)#O&1B4"#[9,)!>(3B:+1"0XP>@0B$8GBU0D.`^VQHA&*(A6*0^V
-M1B*(1BH/MD8AB$8K#[9,)#R(3BS&1BT`QT0D!`````"+1"08B00DZ/S___^+
-M1B")1"0,BT<,BU<0B40D!(E4)`B+5"08B10DZ/S___^)="0$B2PDZ/S___^+
-M7"0<BW0D((M\)"2+;"0H@\0LPXVT)@````"-O"<`````@^PLB5PD'(ET)"")
-M?"0DB6PD*(M<)#`/MD0D-(A$)!>+0RR+*(DL).C\____B<:%P`^$[0```(DL
-M).C\____B<>%P'41B70D!(DL).C\____Z<X```"-5CR)5"08QD9H"L9&%:P/
-MMT,<9HE&$(M$)$")1DB);AC'1F0(````B7Y0BT<(B48TBU0D/(E6((V#N```
-M`(E&.,9&'"#'1FP`````QD8D/,9&)0(/MD0D%XA&)HM$)#C!Z!"(1B>+5"0X
-M#[;&B$8HB%8I#[9&(HA&*@^V1B&(1BL/MD0D/(A&+,9&+0#'1"0$`````(M4
-M)!B)%"3H_/___XM&((E$)`R+1PR+5Q")1"0$B50D"(M$)!B)!"3H_/___XET
-M)`2)+"3H_/___XM<)!R+="0@BWPD)(ML)"B#Q"S#D(VT)@````"#["R)7"0<
-MB70D((E\)"2);"0HBVPD,(M%+(L`B40D%(N5Z`````^V0@+!X`@/ME(#`=`/
-MM\"-6`2!^P`(```/C^\```"+1"04B00DZ/S___^)QH7`#X39````BT0D%(D$
-M).C\____B<>%P'45B70D!(M$)!2)!"3H_/___^FR````C48\B40D&(M7"(N%
-MZ````(E<)`B)1"0$B10DZ/S____&1A6L#[=%'&:)1A"+1"04B488B5X@@TYD
-M$HM'"(E&-(E^4(V%N````(E&.,9&'"#'1FP`````QD8D'<9&)1#&1B8"#[9&
-M(8A&)XA>*,=$)`0`````BT0D&(D$).C\____BT8@B40D#(M'#(M7$(E$)`2)
-M5"0(BT0D&(D$).C\____B70D!(M$)!2)!"3H_/___XM<)!R+="0@BWPD)(ML
-M)"B#Q"S#D(VT)@````"#["R)7"0DB70D*(M<)#`/ME0D-`^V="0XQT0D(```
-M``"`>R<!=$K'1"0,`0```(U$)"")1"0(#[;"B40D!(D<).C\____BT0D((7`
-M=".`"(")\(3`=`J+1"0@@$@#(.L(BT0D((!@`]^)'"3H_/___XM<)"2+="0H
-M@\0LPXUV`(/L+(E<)!R)="0@B7PD)(EL)"B+7"0P#[9$)#2(1"07BT,LBRB)
-M+"3H_/___XG&A<`/A+D```")+"3H_/___XG'A<!U$8ET)`2)+"3H_/___^F:
-M````C48\B40D&,9&%:P/MT,<9HE&$(EN&,=&9`@```")?E"+1PB)1C3'1B``
-M"```C8.X````B48XQD8<(,=&;`````#&1B0<QD8E`0^V1"07B$8FQD8G",9&
-M*`#'1"0$`````(M$)!B)!"3H_/___XM&((E$)`R+1PR+5Q")1"0$B50D"(M$
-M)!B)!"3H_/___XET)`2)+"3H_/___XM<)!R+="0@BWPD)(ML)"B#Q"S#C;8`
-M````C;\`````55=64X/L'(M,)#2+630/MD,"P>`(#[93`P'0#[?PC58$#[=!
-M(#G"#X^#`0``C7L(C6PS!(E\)!#&1"07`,=$)!@`````.>\/@_4```"-=@`/
-MMD0D&(A$)!8/MD<"P>`(#[97`P'09HE$)!0/M_")="0$BT0D$(/`!(D$).C\
-M____//]U:XM$)!"-5#`$B=,YU0^&^@```,9$)!?_C70F``^V0@+!X`@/ME(#
-MC300#[?&B40D!(U#!(D$).C\____//]U$8!\)!?_#X6.````D.F#````.$0D
-M%W8$B$0D%P^WQHU4`P2)TSG5=G'KLHGV*D0D%P^VP(E$)`@/MEPD%HE<)`2+
-M5"0PB10DZ/S___^)7"0(B7PD!(M$)#")!"3H_/___P^W1"04BU0D$(U\`@2)
-M?"00@T0D&`$Y_0^'#O___\=$)`0"````BT0D,(D$).C\____ZUC&1"07``^V
-M1"06B40D"(E\)`2+5"0PB10DZ/S___\/MT0D%(M4)!"-?`($B7PD$(-$)!@!
-MZ;_^__\/MD0D%HE$)`B)?"0$BT0D,(D$).C\____ZY:-="8`@\0<6UY?7<.0
-MC;0F`````%575E.#[!R+3"0TBUDT#[9#`L'@"`^V4P,!T`^WP(/`!`^W42`Y
-MT`^/'@$``(US"`^V6P&Y`````+H`````B?8"3@(/MD8#C70&!(/"`3C3<^Z$
-MR0^$TP```,9$)!L`OP````"-0?\/ML"#P`&)1"04#[94O@$`5"0;#[8$OCP!
-M=`0\%W5*#[9<)!LHTSA<)!L/AHD```"-1P$/MNB-=@`/M@2^B40D#(EL)`@/
-MML.)1"0$BT0D,(D$).C\____@\,!.EPD&W18Z]:-M@````"+3"0PBT$P@+B1
-M`````71`#[9<)!LHTSA<)!MV,XU'`0^VZ`^V!+Z)1"0,B6PD"`^VPXE$)`2+
-M1"0PB00DZ/S___^#PP$Z7"0;==B0C70F`(/'`3M\)!0/A43___^+5"0PBT(P
-MQH"1`````<=$)`0'````B10DZ/S___^#Q!Q;7E]=PXVV`````(V\)P````"#
-M["R)7"0<B70D((E\)"2);"0HBUPD,(7;#X3,````BT,LBRB)+"3H_/___XG&
-MA<`/A+4```")+"3H_/___XG'A<!U$8ET)`2)+"3H_/___^F6````C48\B40D
-M&,9&%:P/MT,<9HE&$(EN&,=&9`@```")?E"+1PB)1C3'1B``"```C8.X````
-MB48XQD8<(,=&;`````#&1B0<QD8E`<9&)@+&1B<(QD8H`,=$)`0`````BT0D
-M&(D$).C\____BT8@B40D#(M'#(M7$(E$)`2)5"0(BT0D&(D$).C\____B70D
-M!(DL).C\____BUPD'(MT)""+?"0DBVPD*(/$+,.0@^P<B5PD$(ET)!2)?"08
-MBWPD)(MT)""+7T@/MU<09H'ZA0`/AX<````/M\(/MHP&L`0``(#Y_W1W9H/Z
-M?W<9#[;!BY9P!0``:<`H`0``BT00+`^V0`3K.&:!^H$`=QD/ML&+EJ@%``!I
-MP!0-``"+1!`(#[9`!.L8#[;!BY:,!0``:<"P````BT005`^V0`20//]T'`^V
-MP("\!C8%``#_=`^`^?]T"@^V1Q0\!G4RB?:#?U``=`^-1U")1"0$B30DZ/S_
-M__^)?"0$B30DZ/S____'0RS_____B1PD_U,HZW&$P'4Z]D=D"'09BTL<BU<T
-MBT<@B40D"(E4)`2)#"3H_/___\=#+`````"+4R"%TG0%BT,4B0*)'"3_4RCK
-M$L=#+/____^)'"3_4RB0C70F`(-_4`!T#XU'4(E$)`2)-"3H_/___XE\)`2)
-M-"3H_/___XM<)!"+="04BWPD&(/$',/K#9"0D)"0D)"0D)"0D)"#[!R)7"0,
-MB70D$(E\)!2);"08BUPD)(M\)"`/MFL4#[=#$&8]A0!W&8N7<`4```^WP`^V
-MA`>P!```:<`H`0``ZPN+EW`%``"XV"8!`(TT`HGHA,!U(6;'AI0``````(![
-M)!QU$H![)@)U#(E<)`2)-"3H_/___X-[4`!T#XU#4(E$)`2)/"3H_/___XE<
-M)`2)/"3H_/___XGH/`9T/HV>!`$``(E<)`2+1Q2)!"3H_/___\>&!`$``("$
-M'@#'A@P!````````B;80`0``B5PD!(M'%(D$).C\____BUPD#(MT)!"+?"04
-MBVPD&(/$',-55U93@^P<#[9$)#B(1"0;BU0D,(M"+(LPOP````"+;"0T@\4,
-M#[:$-[`$```\_W11#[;`:=@H`0``QT0D"`@```");"0$B=@#AG`%```%H```
-M`(D$).C\____A,!T(XN&<`4```^V5"0;B)0#V@```(N&<`4``(M4)#")E`/D
-M````@\<!@?^`````=9B#Q!Q;7E]=PXUT)@"-O"<`````55=64X/L'(M,)#2+
-M<30/MD8"P>`(#[96`P'0#[?XC5<$#[=!(#G"#X_U````C5X(C70^!(ET)!2)
-MW3G>#X;,````QT0D&`````"-M@`````/MDPD&`^V$X32#XB5````B="#X`\\
-M!@^%B````/9#`\!T"O9#!<`/A7@```#VPA!T-8![!`!T;8UU"+\`````#[9#
-M`XE$)`B)="0$BT0D,(D$).C\____@\8<@\<!B?@X0P1V0.O9@'L"`'0XC74$
-MOP`````/MLF)3"00C70F`(M$)!")1"0(B70D!(M$)#")!"3H_/___X/&'(/'
-M`8GX.$,"=]L/MD,!C5P%`HG=@T0D&`$[7"04#X)"____QT0D!`$```"+1"0P
-MB00DZ/S___^#Q!Q;7E]=PXVV`````%575E.#["R+1"1`B40D((M4)$0/ME(4
-MB%0D*XM,)$0/MU$09H'ZA0`/A[D#```/M\*+7"0@#[:,`[`$``"X_P```(#Y
-M_W1B9H/Z?W<=#[;!BUPD((N3<`4``&G`*`$``(M$$"P/MD`$ZS]F@?J!`'<=
-M#[;!BUPD((N3J`4``&G`%`T``(M$$`@/MD`$ZQL/ML&+7"0@BY.,!0``:<"P
-M````BT005`^V0`2+5"0@#[:$`C8%``")1"0<:\!<C80"0`$``(E$)"2+DG`%
-M```/ML%IP"@!``"--`*`?"0K``^%D@(``&;'AI0``````(M$)$2`>"0<#X5[
-M`@``#[9`)CP"=%H\`G<+/`$/A6<"``"0ZR$\!W0R/`H/A5@"``"+3"1$B4PD
-M!(DT).C\____Z4,"``"+7"1$B5PD!(DT).C\____Z2X"``"+1"1$B40D!(DT
-M).C\____Z1D"``"+5"1$B50D!(DT).C\____C9X$`0``B5PD!(M&+(L`BT`4
-MB00DZ/S____'A@0!``"`A!X`QX8,`0```````(FV$`$``(E<)`2+1BR+`(M`
-M%(D$).C\____QD8F_VM$)!Q<BTPD(("\`4H!````#X1Z`0``OP````")PXVL
-M`7@!``")]HDL).C\____B<:+5"0@C003BY!\`0``B;!\`0``B2Z)5@2),H!^
-M)O\/A*(```"`?B4`#X6?````B?.`OK4`````#X1/`0``#[9.)`^VT8G0@^`&
-M@_@&=2GVP@%T)(ET)`P/MD9-B40D"(M&,(E$)`2+3"0DB0PDZ/S____I%0$`
-M`(/X!'4A]L$!C;0F`````'05B5PD!(M<)"")'"3H_/___^GO````@_@&#X7F
-M````]L$!#X7=````B5PD!(M$)"")!"3H_/___^G(````B?;&AK4`````@\<!
-MBTPD((V4&4`!```/MD(*B?DXR`^'#?___SC!=7.$P'1OOP````!K7"0<7(M$
-M)""-K!AX`0``B2PDZ/S___^)QHM4)""-!!.+D'P!``")L'P!``")+HE6!(DR
-M@'XF_W0>#[9&)3PB=`0\#742QT0D!`H```")-"3H_/___^L^@\<!B?F+1"0@
-M.(P82@$``'>F:T0D'%R+5"0@QH0"10$``/^+3"0DB4PD!(D4).C\____@'PD
-M*P`/A:(```"+7"1$@WM0`'05B=B#P%")1"0$BT0D((D$).C\____BU0D1(E4
-M)`2+3"0@B0PDZ/S___^`?"0K`'1H#[>&E````(/``6:)AI0```!F@_@*=@YF
-MQX:4``````#IX/W__\=$)`0*````B30DZ/S____K,8M<)"`/MILU!@``B5PD
-M'&O#7(M4)""-A`)``0``B40D)(N2<`4``+C8)@$`Z;[\__^#Q"Q;7E]=PX/L
-M"(D<)(ET)`2+7"0,BW0D$(M4)!2+3"0<A=MT1(7V=$"%TG0\@WPD&`!T-6:!
-M^84`=RX/M\&`O`.P!```_W0AQD(DX<9")0'&0B839HE*$(ER&(M$)!B)0FRX
-M`0```.L%N`````"+'"2+="0$@\0(PXVT)@````"-O"<`````BTPD!(M!!(M`
-M!*,`````@'PD"`!T"HG"@<H```P`ZPB)PH'B___S_XM!!(D0BT$$B5`,BT$$
-MB5`0BT$$B5`4BT$$B5`8BT$$B5`$PY"0D)!64XM<)!"+3"0PBW0D.`^W1"0,
-M9CTB)W=)9CT@)W-Y9CU`(71S9CU`(7<99CT@(9!T9F8](B%T8&8]4`>-="8`
-M=6#K5&8]1"%T3F8]1"&)]G)09BT0)V:#^`%W1HUT)@#K-F8]@B=T,&8]@B>-
-M="8`=Q)F/20G="!F/8`GC70F`'4@ZQ1F/8"1=`YF/8"4B?9T!F8]@')U"L8#
-M%(M$)!3&``*+1"08Q@`$#[83BT0D+(@09L<!@`!FQP8``(M$)"#&`""+1"0D
-M9L<```$/MA.+1"0HB!`/M@-F`P%F`P:+5"0T9HD"BU0D'&:)`@^W$8M$)#QF
-MB1`/MQ&#P@N+1"1`9HD06U[#C78`C;PG`````%575E.#[`2+?"08#[9$)!R(
-M1"0##[=O4&:%[0^$W@```(N/Q`4``+X`````C70F`(L!A<`/A+8````/MU`0
-MN_\```"X_____V:!^H4`=W0/M\(/MIP'L`0``+C_____@/O_=%QF@_I_=QD/
-MML.+EW`%``!IP"@!``"+1!`L#[9`!.L]9H'Z@0!W&0^VPXN7J`4``&G`%`T`
-M`(M$$`@/MD`$ZQT/ML.+EXP%``!IP+````"+1!!4#[9`!(VV``````^VVXN7
-M<`4``#I$)`-U(0^WPVG`*`$```^V1!`D@^`%@_@%=0NP`>L;C;0F`````(/&
-M`8/!!&8Y[@^%,?___[@`````@\0$6UY?7<.-="8`55=64X/L"(M4)!R+0BR+
-M*(N%%`H``(E$)`0/MWU0N0````"^`````.M)C;8`````#[?9BX7$!0``BQ28
-MA=)T,(M")"7___\`/>$!$`!T(8M$)!P/MT`<9CM"$'43B=C!X`:+5"0$9CET
-M$`AT"XUV`(/!`68Y^7*X9CGY=!"#Q@%F@_X?=P>Y`````.OF#[?&@\0(6UY?
-M7<.0C;0F`````%.+5"0(BTPD#(M<)!"+0CB%P'06Q@!PBT(XB$@"BT(XQD`'
-M`(M".(A8#%O#C70F`//#C;0F`````(V\)P````"#[!")'"2)="0$B7PD"(EL
-M)`R+3"04#[=\)!B)^H'B_P$``(N!Q`4``(LTD(7V=#`/MIG6````#[9&%8G9
-MT^`/M^@/M]>X__\``-/@(<(YU0^5P`^VP(/H`2'&D(UT)@")\(L<)(MT)`2+
-M?"0(BVPD#(/$$,.-="8`C;PG`````(M4)`2X`````(VT)@````#&!!``@\`!
-M/;````!U\L9"*/_&0C3_C4(4B4(4B4(8PXM4)`2X`````(VT)@````#&!!``
-M@\`!/2@!``!U\L9"3/_&0D+_QD).'XU"$(E"$(E"%,.-M@````"-OP````!3
-MBT0D"(M<)`R+$XN(^````(F0^`````7T````B0*)2@2)$<<#`````%O#D(UT
-M)@!3@^P(BUPD$(M,)!2+D_````")B_````"-@^P```")`8E1!(D*@WE,`'0/
-MC4%,B40D!(D<).C\____@\0(6\.04XM$)`B+7"0,BQ.+B`@!``")D`@!```%
-M!`$``(D"B4H$B1''`P````!;PY"-="8`4XM$)`B+7"0,BQ.+B``!``")D``!
-M```%_````(D"B4H$B1''`P````!;PY"-="8`BT0D!(M4)`B+B!@!``")D!@!
-M```%%`$``(D"B4H$B1'#ZPV0D)"0D)"0D)"0D)"04XM$)`B+7"0,BQ.+B"`!
-M``")D"`!```%'`$``(D"B4H$B1''`P````!;PY"-="8`4XM$)`B+7"0,BQ.+
-MB!`!``")D!`!```%#`$``(D"B4H$B1''`P````!;PY"-="8`#[9$)`0\%W<7
-M#[;`_R2%(`<``+@T````PXVT)@````"X!````,.X/````)"-="8`P[@4````
-MP[A`````C70F`,.X'````,.X&````(UT)@##N"@```##N"````"-="8`P[A,
-M````PXGVC;PG`````%575E.+;"04BWPD&`^V5R2)T(/@!H/X!G4)]L(!#X3*
-M````@']"_P^%P````(M%`(NP&`$``(DU`````+D`````N`$```")P]/CA=YU
-M,HA/0HM5`(G8"?")@A@!``"+10"+@%@!``"C`````(G:(<)T=XM%`(F06`$`
-M`.MLC78`@\$!@_D@=;F+10"+L!P!``")-0````"Q`(VT)@````")RK@!````
-MB</3XX7>=3*-0B"(1T*+50")V`GPB8(<`0``BT4`BX!@`0``HP````")VB'"
-M=!.+10")D&`!``#K"(/!`8/Y('6W@$4L`5M>7UW#C;0F`````(V\)P````!7
-M5E.+?"00BU0D%(!Z-/\/A;<```"+!XNP&`$``(DU`````+D`````N`$```")
-MP]/CA=YU+(A*-(L7B=@)\(F"&`$``(L'BX!8`0``HP````")VB'"='&+!XF0
-M6`$``.MG@\$!@_D@=;^+!XNP'`$``(DU`````+$`C;0F`````+@!````B</3
-MXX7>=3.(2C2+%XG8"?")@AP!``"+!XN`8`$``*,`````B=HAPG09BP>)D&`!
-M``#K#XVT)@````"#P0&#^2!UN(!'+`%;7E_#4P^V7"00BT0D"(M(*(7)=#&Z
-M`````(M$D3R%P'0%.%A-=`^#P@&#^@5T%Y"-="8`Z^1F@7DDA0!W"(7`C70F
-M`'4%N`````!;PXVT)@````!55U93@^P,BVPD(`^V1"0DP>`(#[94)"B--!"`
-M?1P`#X3)````@WTX``^$OP```/9%9`D/E,")Q[D`````C78`B<L/MQ3-@`<`
-M`(GP(=!F.<(/A8L````/MA3-A0<``(#Z`W0%@/H'=0N)^#@$S80'``!U;L9%
-M%"`/M@3=A@<``(E$)`@/ML*)1"0$B2PDZ/S___^+53@/M@3=AP<``(A"#8-\
-M)"P`="N+1"0LBQB+<`2+33B)<0.+13B`"(#V168$=!"%]G0,BT4XB5@(BT4X
-M@"!_BU4X#[9%'(/H!XA"!^L,@\$!@_D0#X52____@\0,6UY?7<.-=@"-O"<`
-M````@^P,BT0D$(V0#`$``+D`````.9`,`0``=!&)%"3H_/___XG!QT`4````
-M`(G(@\0,P^L-D)"0D)"0D)"0D)"0D(/L#(M$)!"-D!P!``"Y`````#F0'`$`
-M`'0*B10DZ/S___^)P8G(@\0,PXVV`````(/L#(M$)!"-D!0!``"Y`````#F0
-M%`$``'0DB10DZ/S___^)P8G"N`````"0C70F`,8$$`"#P`$]F````'7RB<B#
-MQ`S#C;8`````C;\`````@^P,BT0D$(V0_````+D`````.9#\````=`J)%"3H
-M_/___XG!B<B#Q`S#C;8`````@^P,BT0D$(V0]````+D`````.9#T````=`Z)
-M%"3H_/___XG!QD`(`(G(@\0,PXGV55=64X/L'(E$)!")U<=$)!0`````QT0D
-M&`````"-=@"+5"08BTPD$`^VA`HP!0``//\/A"@!```/MM`/MT0D&&:#Z(!F
-M/8$`#X=\````#[?":<`4#0``B<,#F:@%``"`>S``=%6^`````(U[*(UV`(D\
-M).C\____C4CXBU,LB4,LB7D(B5$,B0*+020E`/__`#T``/\`=1CV02<$=!*+
-M02"%P'0+B>J(4`&-M@````"#Q@&)\3A+,'>VB>B(@Y(```"#Q0'IE@````^W
-MPFG`L````(G#BU0D$`.:C`4``(!['P!T0[D`````C;8`````#[;!BU2#/(72
-M="6+0B0E`/__`#T``/\`=1;V0B<$=!"+0B"%P'0)B>J(4`&-="8`@\$!.$L?
-M=\B)Z8B+I````("[I0````-U'H-$)!0!BT0D%(/``X/X!G86@\4!QT0D%```
-M``#K"8/%`8VV`````(-$)!@!@WPD&`8/A;#^__^+5"00BX(\!0``.=!U#`7`
-M#```B>KH=O[__X/$'%M>7UW#C;0F`````(V\)P````"#[`R+5"00BT0D%`^V
-M2`0/MH01-@4``,:$$38%``#_#[?`B40D!('"U`D``(D4).C\____@\0,PY"-
-MM"8`````@^P(B1PDB70D!(MT)!"+7DR%VW0DC4XDC5,,BT,,B48DBT($B4$$
-MBT((B4$(BT(,B4$,BT,<B48TBQPDBW0D!(/$",.-M@````"-OP````"#[`B)
-M'"2)="0$BW0D$(M>3(7;="B-2PR-5B2+1B2)0PR+0@2)002+0@B)00B+0@R)
-M00R+1C2)0QS&0P@!BQPDBW0D!(/$",.0C;0F`````%=64X/L$(M\)""+'V:#
-M>U``#X2[````O@````"-="8`#[?6BX/$!0``BPR0A<D/A)$````/MU$09H'Z
-MA0!W<0^WP@^VA`.P!```//]T8F:#^G]W'`^VP(N3<`4``&G`*`$``(M$$"P/
-MME`$ZTB-=@!F@?J!`'<9#[;`BY.H!0``:<`4#0``BT00"`^V4`3K)0^VP(N3
-MC`4``&G`L````(M$$%0/ME`$ZPR-M"8`````NO\````/MD<$.<)U"(D,).C\
-M____@\8!9CES4`^'3O___X/$$%M>7\.-M"8`````@^P<B5PD%(ET)!B+7"0@
-MBW0D)`^V1C0\_W09#[;`B40D!(L#B00DZ/S____&1C3_@&LL`8M<)!2+="08
-M@\0<PX/L'(E<)!2)="08BUPD((MT)"0/MD9"//]T&0^VP(E$)`2+`XD$).C\
-M____QD9"_X!K+`&+7"04BW0D&(/$',-75E.#[!"+="0@BUPD)#ES&`^$SP``
-M`(![%``/A98````/MD,D/!5T"#Q5#X6&````BT-,A<!T?XG"@'@(`75W9H%X
-M#.$!=6^+OG`%```/MT,0N=@F`0!F/84`=Q$/M\`/MH0&L`0``&G(*`$``(T$
-M#P^V4@Z`^@=T'X#Z!W<'@/H&=3/K'(#Z#(VT)@````!T((#Z#74@ZQ!F@V`Z
-M_8GVZQ5F@T@Z`NL.9H-@.O>)]NL%9H-(.@B#>U``="F!>R``"```=Q&-0U")
-M1"0$B30DZ/S____K#XU#4(E$)`2)-"3H_/___V:!>R3A`0^%!@$```^W0Q!F
-M/84`=WH/M\`/MH0&L`0``#S_=&N+EG`%``"`>Q0`=5\/ML!IP"@!``"-!`(/
-MME,F@/H'=!V`^@=W!X#Z!G4QZQJ`^@R0C70F`'0@@/H-=2#K$&:#8#K]B?;K
-M%6:#2#H"ZPYF@V`Z]XGVZP5F@T@Z"&:!>R3A`8UV``^%@@```(![)@MU?`^W
-M2Q`/MD8NC7C_B<KK')"-="8`@\(!9H'ZA0!W#0^WPH"\,+`$``#_=0D/M\(Y
-M^'SBZT1F/?\`=1GK/(/!`6:!^84`=PT/M\&`O#"P!```_W4,#[?!.<=_XKC_
-M````9HE#$,9#%(")7"0$B30DZ/S____I'`$``,9#%``Y<QAT*(M#3(7`="&`
-M>`@!=0R)7"0$B30DZ/S___^-0TR)1"0$B30DZ/S___^#>U0`=`^-0U2)1"0$
-MB30DZ/S___^)7"0$BT,8B00D_U-L#[=3)&:!^N$!=54/MD,F@^@1/`%W2@^W
-M0Q!F/84`#X>E````#[?`#[:$!K`$```\_P^$D@````^VP&G`L`````.&C`4`
-M`(!X*0!U?8!X-/]T=XE$)`2)-"3H_/___^MI#[=#$&8]A0!W7P^WP`^VC`:P
-M!```B[YP!0``BT,D)?___P`]X0$0`'0_@?G_````=#=F@?KA`740#[9#)H/H
-M$3P!=B60C70F`&G!*`$``(T$!X!X3P!U$8E$)`2)-"3H_/___Y"-="8`@\00
-M6UY?PXGVC;PG`````(/L'(E<)!")="04B7PD&(MT)""+7"0D#[=3$&:!^H4`
-M#X>*````#[?"#[:,!K`$``"`^?]T>F:#^G]W&0^VP8N6<`4``&G`*`$``(M$
-M$"P/MD`$ZSMF@?J!`'<9#[;!BY:H!0``:<`4#0``BT00"`^V0`3K&P^VP8N6
-MC`4``&G`L````(M$$%0/MD`$C70F`&8]_P!T&@^WP`^VO`8V!0``B?@\_W0)
-M#[;!9CW_`'40B5PD!(DT).C\____ZWZ)]@^V4R</MD,H#[9+*8#Y`70%@/D(
-M=5J+2TC!X`@/MM(!T"7_`0``BY;$!0``.0R"=3\/MTD>B<IFP>H%#[?2@^$?
-MN/[____3P"%$EE2+0T@/MT`>B40D!(GZ#[;":\!<C80&0`$``(D$).C\____
-MB?:)7"0$B30DZ/S___^+7"00BW0D%(M\)!B#Q!S#C70F`(/L#(E<)`2)="0(
-MBUPD$(V#[````+X`````.8/L````=!V)!"3H_/___XG&B00DZ/S___^)'"3H
-M_/___XE&3(GPBUPD!(MT)`B#Q`S#C78`@^P<B5PD$(ET)!2)?"08BWPD((M'
-M+(LPB30DZ/S___^)PX7`=&N)-"3H_/___XG"A<!U',:'M0````&)7"0$B30D
-MZ/S____K2(VT)@````#&0R0`#[=''&:)0Q#&0V@/B7,8QT,@`````,=#-```
-M``"+0@B)0SC&0QPDB5-0QT-L`````(E<)`2)-"3H_/___XM<)!"+="04BWPD
-M&(/$',/K#9"0D)"0D)"0D)"0D)"#[!R)7"00B70D%(E\)!B+?"0@BW0D)(M'
-M+(L8B1PDZ/S___^)PH7`=#W&0"0;QD`E`8GPB$(H#[=''&:)0A#&0F@/B5H8
-MQT(@`````,="-`````#'0FP`````B50D!(D<).C\____BUPD$(MT)!2+?"08
-M@\0<PXGVC;PG`````(/L+(E<)!R)="0@B7PD)(EL)"B+7"0TBT0D,(LHB2PD
-MZ/S___^)QH7`#X2B````B2PDZ/S___^)QX7`=1.)="0$B2PDZ/S____I@P``
-M`(GVC58\B50D&,9&).'&1B4!QD8F#@^W0QQFB4809H-C./>+5"0PBP*)1AC'
-M1B``"```BT<(B48TB7Y0QT9LH+T``,=$)`0`````BT0D&(D$).C\____BT8@
-MB40D#(M'#(M7$(E$)`2)5"0(BU0D&(D4).C\____B70D!(DL).C\____BUPD
-M'(MT)""+?"0DBVPD*(/$+,.-="8`C;PG`````(/L'(E<)!")="04B7PD&(MT
-M)"B+1"0@BQB)'"3H_/___XG"A<!T9<9`).'&0"4!B?"(0B;&0B</BTPD)`^W
-M01QFB4(0B5H8QT(@`````,="-`````#'0FP`````B50D!(D<).C\____B?`\
-M`742QP0D!0```.C\____ZQ"-="8`QP0D4,,``.C\____BUPD$(MT)!2+?"08
-M@\0<PXUT)@"#[!R)7"00B70D%(E\)!B+="0@BUPD)`^W4Q!F@?J%``^'BP``
-M``^WP@^VC`:P!```@/G_='MF@_I_=QD/ML&+EG`%``!IP"@!``"+1!`L#[9`
-M!.L[9H'Z@0!W&0^VP8N6J`4``&G`%`T``(M$$`@/MD`$ZQL/ML&+EHP%``!I
-MP+````"+1!!4#[9`!(UT)@`\_W0=#[;`#[:4!C8%``"`^O]T#8#Y_W0(#[9#
-M%#P&=3^#>U``="N!>R``"```B?9W$8U#4(E$)`2)-"3H_/___^L/C4-0B40D
-M!(DT).C\____B5PD!(DT).C\____ZW*+OG`%``"$P'0MQT0D"`$````/ML%I
-MP"@!``"-!`>)1"0$#[;":\!<C80&0`$``(D$).C\____@WM0`'0I@7L@``@`
-M`'<1C4-0B40D!(DT).C\____ZP^-0U")1"0$B30DZ/S___^)7"0$B30DZ/S_
-M__^+7"00BW0D%(M\)!B#Q!S#C;0F`````(V\)P````"#["R)7"0<B70D((E\
-M)"2);"0HBUPD,(ML)#0/MU409H'ZA0`/APX!```/M\(/MHP#L`0``(#Y_P^$
-M^@```&:#^G]W'`^VP8N3<`4``&G`*`$``(M$$"P/MD`$ZSJ-=@!F@?J!`'<9
-M#[;!BY.H!0``:<`4#0``BT00"`^V0`3K%P^VP8N3C`4``&G`L````(M$$%0/
-MMD`$//\/A)D````/MOD/ML`/MK0#-@4``(GP//\/A($```!F@?__`'1Z@'T4
-M!G1TBY-P!0``B50D&(!])@%U3,<$)`H```#H_/___XEL)`2)'"3H_/___\=$
-M)`@"````#[?':<`H`0```T0D&(E$)`2)\@^VPFO`7(V$`T`!``")!"3H_/__
-M_^L:B?;'!"3T`0``Z/S___^);"0$B1PDZ/S___^+7"0<BW0D((M\)"2+;"0H
-M@\0LPXUT)@"#["R)7"0@B70D)(E\)"B+?"0PBT<LBS")-"3H_/___XG#A<!U
-M"L:'M0````'K9)#&0"05QD`5JP^W1QQFB4,0B7,8QT0D$`$```#'1"0,`0``
-M`(E<)`B)?"0$B30DZ/S___^$P'49B5PD!(DT).C\____QH>U`````>L7C70F
-M`,=#;`````")7"0$B30DZ/S___^+7"0@BW0D)(M\)"B#Q"S#C;8`````C;PG
-M`````(/L+(E<)!R)="0@B7PD)(EL)"B+7"0PBT,LBRB)+"3H_/___XG&A<!U
-M#,:#M0````'IN````(DL).C\____B<>%P'4<QH.U`````8ET)`2)+"3H_/__
-M_^F2````C70F`,9&)!K&1B4(QD8F",9&)P#&1BC_QD8I`,9&%:L/MT,<9HE&
-M$(EN&,=&(/\```#'1F0(````BT<(B48T!?\```")1CC&1APDB7Y0QT9L````
-M`(U>/,=$)`0`````B1PDZ/S____'1"0,_P```(M'#(M7$(E$)`2)5"0(B1PD
-MZ/S___^)="0$B2PDZ/S___^+7"0<BW0D((M\)"2+;"0H@\0LPXVT)@````"-
-MO"<`````@^PLB5PD'(ET)"")?"0DB6PD*(ML)#`/MD0D-(A$)!>+12R+.(D\
-M).C\____B<.%P'4-QH6U`````>FZ````D(D\).C\____B<:%P'48QH6U````
-M`8E<)`2)/"3H_/___^F3````C4,\B40D&,9#)!*`?"07`'0.QD,E`<9#)H#&
-M0RA`ZP3&0R@DQD,5JP^W11QFB4,0B7L8QT,@8````,=#9`@```"+1@B)0S2)
-M<U#'0VP`````QT0D!`````"+1"08B00DZ/S____'1"0,8````(M&#(M6$(E$
-M)`2)5"0(BT0D&(D$).C\____B5PD!(D\).C\____BUPD'(MT)""+?"0DBVPD
-M*(/$+,.-=@"#["R)7"0<B70D((E\)"2);"0HBUPD,(M#+(LHB2PDZ/S___^)
-MQH7`=0S&@[4````!Z;H```")+"3H_/___XG'A<!U',:#M0````&)="0$B2PD
-MZ/S____IE````(UT)@"-1CR)1"08QD8DGL9&)1#&1C$@QD85JP^W0QQFB480
-MB6X8QT8@(````,=&9`@```"+1PB)1C2)?E"#P"")1CC&1APDQT9L`````,9&
-M:`_'1"0$`````(M$)!B)!"3H_/___\=$)`P@````BT<,BU<0B40D!(E4)`B+
-M1"08B00DZ/S___^)="0$B2PDZ/S___^+7"0<BW0D((M\)"2+;"0H@\0LPXVV
-M`````(V_`````(/L+(E<)!R)="0@B7PD)(EL)"B+7"0PBT,LBRB)+"3H_/__
-M_XG&A<!U#,:#M0````'IK@```(DL).C\____B<>%P'4<QH.U`````8ET)`2)
-M+"3H_/___^F(````C70F`(U&/(E$)!C&1B0EQD85JP^W0QQFB480B6X8QT8@
-M"````,=&9`@```"+1PB)1C2#P`B)1CC&1APDB7Y0QT9L`````,=$)`0`````
-MBT0D&(D$).C\____QT0D#`@```"+1PR+5Q")1"0$B50D"(M$)!B)!"3H_/__
-M_XET)`2)+"3H_/___XM<)!R+="0@BWPD)(ML)"B#Q"S#D(VT)@````"#["R)
-M7"0<B70D((E\)"2);"0HBT0D.(E$)!2+5"0PBSJ+CW`%``")3"08BU0D-`^W
-M0A`/MJP'L`0``(D\).C\____B<.+3"0T#[=Q'HGQ@^$?N`$```#3X(G!B?!F
-MP>@%#[?`A4R'5`^%R0```(7;#X3!````B>D/MM%ITB@!```#5"08BTPD-`^V
-M014/MH_6````T^`)\,9#).'&0R4!QD,F#XA#)V;!Z`B(0R@/MD0D%(A#*8N"
-MJ````(E#*HN"K````(E#+HM,)#2)2TC&0Q6J#[="'&:)0Q"+5"0PBP*)0QC'
-M0R``````QT,T`````,=#;$"Y``#'1"0$`````(U#/(D$).C\____B5PD!(D\
-M).C\____BT0D-`^W2!Z)R&;!Z`4/M\"#X1^Z`0```-/B"52'5(M<)!R+="0@
-MBWPD)(ML)"B#Q"S#D(UT)@!55U93@^P<#[9$)#2(1"0;BU0D,(L:9H-[4``/
-MA/X!``"]``````^WU8N#Q`4``(L,D(7)#X38`0``BWDD@>?___\`@?_A`1``
-M#X61````@WPD.``/A;@!```/MU$09H'ZA0!W9P^WP@^VA`.P!```//]T6&:#
-M^G]W&0^VP(N3<`4``&G`*`$``(M$$"P/ME`$ZSYF@?J!`'<9#[;`BY.H!0``
-M:<`4#0``BT00"`^V4`3K'@^VP(N3C`4``&G`L````(M$$%0/ME`$ZP6Z____
-M_[X`````Z:4```"0C70F``^W41!F@?J%``^'AP````^WP@^VM`.P!```B?`\
-M_W1V9H/Z?W<9#[;`BY-P!0``:<`H`0``BT00+`^V4`3K06:!^H$`=QN)\@^V
-MPHN3J`4``&G`%`T``(M$$`@/ME`$ZQ^)\@^VPHN3C`4``&G`L````(M$$%0/
-MME`$C;8`````@>;_````:<8H`0``B<8#LW`%``#K"KK_____O@````"+1"0P
-M.%`$#X6%````@WPD.`!T#HM4)#@/MT(<9CM!$'5P@'PD&P9T3H'_X0$0`'1&
-M#[96)(G0@^`&@_@&=3CVP@%U,X"^M`````!U*H'_X0$/`'0]#[9$)!N(013'
-M1"0(`0```(E,)`2+5"0PB10DZ/S____K&P^V1"0;B$$4#[?%B40D!(M4)#")
-M%"3H_/___X/%`68Y:U`/AP?^__^`?"0;@0^$-0$``(N#W````(VSW````#G&
-M#X0A`0``N@````"#P@&+`#G&=?=FA=(/A`H!``"->O^)-"3H_/___XG!@WPD
-M.`!T)XM4)#@/MT(<9CM!$'09BX/@````B8O@````B3&)002)".FY````D`^W
-M41!F@?J%`'=G#[?"#[:$`[`$```\_W189H/Z?W<9#[;`BY-P!0``:<`H`0``
-MBT00+`^V0`3K/F:!^H$`=QD/ML"+DZ@%``!IP!0-``"+1!`(#[9`!.L>#[;`
-MBY.,!0``:<"P````BT005`^V0`3K!;C_____BU0D,#I"!'4EBT$D)?___P`]
-MX0$/`'06#[9$)!N(012)3"0$B1PDZ/S____K$XN#X````(F+X````(DQB4$$
-MB0B-1_]FA?]T#SNSW````'0'B<?I^?[__X/$'%M>7UW#B?:-O"<`````@^P<
-MB5PD#(ET)!")?"04B6PD&(ML)"`/MGPD*(MU`(DT).C\____B<.%P'43BT0D
-M+,:`M0````'ID````(UV`(DT).C\____B<*%P'49B5PD!(DT).C\____BU0D
-M+,:"M0````'K9L9#).'&0R4!QD,F$(GYB$L5BTPD)`^V03-FB4,0BT4`B4,8
-MQT,@D````(U""(E#-(E34,9``1+&0@A`B?J(4`G'0VP`````QT0D!`````"-
-M0SR)!"3H_/___XE<)`2)-"3H_/___XM<)`R+="00BWPD%(ML)!B#Q!S#ZPV0
-MD)"0D)"0D)"0D)"0@^P<B5PD#(ET)!")?"04B6PD&(ML)""+?"0HBT0D+(E$
-M)`B+=0")-"3H_/___XG#A<`/A(@```")-"3H_/___XG"A<!T>L9#).'&0R4!
-MQD,F$(GYB$L5BTPD)`^V03-FB4,0BT4`B4,8QT,@D````(U""(E#-(E34,9`
-M`9'&0@A`B?J(4`D/MDPD"(A("L=#;`````#'1"0$`````(U#/(D$).C\____
-MB5PD!(DT).C\____QP0DH(8!`.C\____BUPD#(MT)!"+?"04BVPD&(/$',.-
-MM@````"-OP````"#[!R)7"0,B70D$(E\)!2);"08BWPD((ML)"B+-XDT).C\
-M____B<.%P'1RB30DZ/S___^)PH7`=&3&0R3AQD,E`<9#)A#&0Q6[BTPD)`^V
-M03-FB4,0BP>)0QC'0R"0````C4((B4,TB5-0QD`!$,9""$")ZHA0"<=#;```
-M``#'1"0$`````(U#/(D$).C\____B5PD!(DT).C\____BUPD#(MT)!"+?"04
-MBVPD&(/$',/K#9"0D)"0D)"0D)"0D)"#[!R)7"00B70D%(E\)!B+?"0@BS>)
-M-"3H_/___XG#A<!T;8DT).C\____B<*%P'1?QD,DX<9#)0'&0R80QD,5NXM,
-M)"0/MD$S9HE#$(L'B4,8QT,@D````(U""(E#-(E34,9``0#&0@A`QT-L````
-M`,=$)`0`````C4,\B00DZ/S___^)7"0$B30DZ/S___^+7"00BW0D%(M\)!B#
-MQ!S#@^P<B5PD$(ET)!2)?"08BW0D((V>U`D``(D<).C\____A,`/A;<```")
-M'"3H_/___XG!N`````")PX"\,#8%``#_=0PX1C1S$HA&-.L-B?:#PP&#P`&#
-M^`1UW8#[!`^$?`````^VPXB,!C8%```/M_EKQUR-E`9``0``N`````#&!!``
-M@\`!@_A<=?0/M\EKR5R-E`Y@`0``C00QB9!@`0``B9!D`0``@\(,B9!L`0``
-MB9!P`0``C90.>`$``(F0>`$``(F0?`$``(B81`$``&O'7(V$!D`!``#K"8UT
-M)@"X`````(M<)!"+="04BWPD&(/$',.-="8`C;PG`````(/L'(E<)!")="04
-MB7PD&(MT)""-GEP)``")'"3H_/___X3`#X47`0``B1PDZ/S___^)PK@`````
-MB<.`O#"P!```_W4<#[;`9CF&U````',=9HF&U````.L4C;0F`````(/#`8/`
-M`3V`````=<N`^X`/A,H````/ML.(E`:P!```#[?":?@H`0``B?@#AG`%``")
-M!"3H_/___XN6<`4```^VPV:)1!<<BX9P!0``QD0')@"+AG`%``#&1`<]_XN&
-M<`4``,9$!SS_BX9P!0``QD0'/O^+AG`%``#&1`=`_XN&<`4``,9$!S__BX9P
-M!0``QD0'0?^+AG`%``#&A`>V`````(N&<`4``,:$!]L```#_B30DZ/S___^+
-MEG`%``")A!?H````@'XY`74+BX9P!0``@$P'*`&)^`.&<`4``.L%N`````"+
-M7"00BW0D%(M\)!B#Q!S#C70F`(V\)P````!3@^P(BUPD$(M4)!2)V.B-XO__
-MBX,\!0``B00DZ/S___^#Q`A;PXUV`(V\)P````"#[!R)7"00B70D%(E\)!B+
-M="0@C9Z$"0``B1PDZ/S___^$P`^%W0```(D<).C\____B<*)\+N"____C;8`
-M````@+@R!0``_W47.)[8````<R"(GM@```#K&(VT)@````"#PP&#P`&`^X8/
-MA)<```#KSX#[A@^$C`````^VPXB4!K`$```/M\)I^+````")^`.&C`4``(D$
-M).C\____BY:,!0``#[;#9HE$%R2`?CD!=0V+AHP%``!FQT0',/__BX:,!0``
-MQD0')@"+AHP%``!FQT0',@``BX:,!0``9L>$!Y```````,=$)`0`````BX8\
-M!0``B00DZ/S___^)^`.&C`4``.L%N`````"+7"00BW0D%(M\)!B#Q!S#D(UT
-M)@!64X/L%(MT)""+1"0D#[=`)`^VG#"P!```QH0PL`0``/\/M]N)7"0$C8:$
-M"0``B00DZ/S___]IV[````")V`.&C`4``(!X-/]T#(E$)`2)-"3H_/___\=$
-M)`0`````BX8\!0``B00DZ/S___^#Q!1;7L.-M"8`````C;PG`````%.#[`B+
-M7"00BT0D%`^V4#,/MH0:L`0``,:$&K`$``#_#[?`B40D!(V#K`D``(D$).C\
-M____QT0D!`````"+@SP%``")!"3H_/___X/$"%O#4X/L"(M<)!2`>RC_=!J-
-M0UB)1"0$BU0D$(M"%(D$).C\____QD,H_X/$"%O#C78`4X/L"(M<)!2`>TS_
-M=!V-@^P```")1"0$BU0D$(M"%(D$).C\____QD-,_X/$"%O#@^P<B5PD#(ET
-M)!")?"04B6PD&(M<)""+;"0D#[=%'`^VO`.P!```#[?':?`H`0``B?`#@W`%
-M```%Z````(E$)`2)'"3H_/___P^W51R+A).P`@``A<!T&(-X<`!U$L>$D[`"
-M````````C;0F``````^W11S&A`.P!```_P^WQXE$)`2-@UP)``")!"3H_/__
-M_XGP`X-P!0``@'A"_W0,B40D!(D<).C\____B6PD!(D<).C\____BX-P!0``
-MQD0&)@"+@W`%``#&1`8G`8M<)`R+="00BWPD%(ML)!B#Q!S#ZPV0D)"0D)"0
-MD)"0D)"0@^P<B5PD#(ET)!")?"04B6PD&(ML)""+="0D9H%^).$!#X6Y````
-M#[9&)H/H$3P!#X>J````#[=&$&8]A0`/AU0!```/M\`/MH0%L`0``(N5C`4`
-M`#S_#X0[`0``#[;`:<"P````C1P"@&LI`8U[%(D\).C\____B<(Y\'5"B5PD
-M!(DL).C\____.WL4#X0%`0``QT-8`!)Z`,=#8`````")6V2-0UB)1"0$BT44
-MB00DZ/S____&0R@`Z=D```"0BT,4B5`$B0*)>@2)4Q2+%HM&!(E"!(D0Z;L`
-M``"-=@`/MT809CV%``^'J@````^WP`^VE`6P!```BXUP!0``BT8D)?___P`]
-MX0$0``^$A@```('Z_P```'1^:<(H`0``C1P!@&M/`8U[$(D\).C\____B<(Y
-M\'5(B5PD!(DL).C\____.WL0=$_'@^P`````$GH`QX/T`````````(F;^```
-M`(V#[````(E$)`2+112)!"3H_/___\9#3`#K&HGVBT,0B5`$B0*)>@2)4Q"+
-M%HM&!(E"!(D0BUPD#(MT)!"+?"04BVPD&(/$',.-="8`@^P<B5PD#(ET)!")
-M?"04B6PD&(M\)""+;"0D#[=5'HG09L'H!0^WV`^W\HGQ@^$?N/[____3P(G!
-M(42?5&:!^O\/=$F-!+4``````X?$!0``@S@`=#?'```````AC)_(!0``B70D
-M!(V'-`D``(D$).C\____B6PD!(D\).C\____B6PD!(D\).C\____BUPD#(MT
-M)!"+?"04BVPD&(/$',/K#9"0D)"0D)"0D)"0D)"#[!R)7"00B70D%(E\)!B+
-M?"0@BW0D)&:!?B3A`0^%D@````^V1B:#Z!$\`0^'@P````^W1A"Z_P```&8]
-MA0!W"P^WP`^VE`>P!```:<*P````B<,#GXP%``"`>RC_=3P/ME9HN`@```"$
-MTG0#C002#[;`:<!`0@\`B4-8QT-@`````(E;9(U#6(E$)`2+1Q2)!"3H_/__
-M_\9#*`"+4QB)<QB-0Q2)!HE6!(DR@$,I`>F?````#[=&$+G_````9CV%`'<+
-M#[?`#[:,![`$``"+EW`%``"+1B0E____`#WA`1``='!IP2@!``"-'`*`>TS_
-M=4T/ME9HN`@```"$TG0#C002#[;`:<!`0@\`B8/L````QX/T`````````(F;
-M^````(V#[````(E$)`2+1Q2)!"3H_/___\9#3`"0C70F`(M3%(ES%(U#$(D&
-MB58$B3*`0T\!BUPD$(MT)!2+?"08@\0<PXVV`````(V_`````%575E.#["R+
-M1"1$#[=0$&:!^H4`#X<?`P``#[?"BUPD0`^VC`.P!```N/____^`^?]T8F:#
-M^G]W'0^VP8M<)$"+DW`%``!IP"@!``"+1!`L#[9`!.L_9H'Z@0!W'0^VP8M<
-M)$"+DZ@%``!IP!0-``"+1!`(#[9`!.L;#[;!BUPD0(N3C`4``&G`L````(M$
-M$%0/MD`$#[;`BU0D0`^VK`(V!0``:\5<C80"0`$``(E$)""+DJ@%```/ML%I
-MP!0-```!PHE4)!R+1"1$BU`T#[9"`3P2="<\D0^%*@(``&O%7+D`````BU0D
-M0("\`DH!````#X3:`0``Z7$!``!KQ5P#1"1`BXA``0``B4PD*`^V6@F(7"0F
-M#[92&HA4)">[`````("X2@$```!T9K\`````:_5<BT0D0(VL,'@!``"0B2PD
-MZ/S___^)PXM4)$"-!!:+D'P!``")F'P!``")*XE3!(D:BTPD'#E+,'43#[9#
-M38M4)$0Z0A5T&(VV`````(/'`8GYBT0D0#B,,$H!``!WKHM4)$2+0E"%P'00
-MB40D!(M,)"B)#"3H_/___XM$)$2)1"0$BU0D*(D4).C\____#[:#E@```(U0
-M`8B3E@```#P#=SB`?"0G`'4QQT0D$`````#'1"0,`@```(M,)$0/MD$5B40D
-M"(M#,(E$)`2+7"0@B1PDZ/S____K-HU"`8B#E@```(#Z`G8H@'PD)P!U(<9#
-M)P+&0R;_@&,H_HE<)`2+1"0HB00DZ/S____I'P$```^V1"0GB40D#`^V1"0F
-MB40D"(M4)!R)5"0$BTPD((D,).C\____Z?0```"^`````&O=7(M$)$"-O!AX
-M`0``B3PDZ/S___^)P8M4)$"-!!.+D'P!``")B'P!``").8E1!(D*BT0D'#E!
-M,'42#[9!38M4)$0Z0A5T%Y"-="8`@\8!B?"+5"1`.(0:2@$``'>O#[91)(G0
-M@^`&@_@&=2CVP@%T(XE,)`R+7"1$#[9#%8E$)`B+03")1"0$BT0D((D$).C\
-M____BU0D1(M"4(7`=!")1"0$BTPD0(D,).C\____BUPD1(E<)`2+1"1`B00D
-MZ/S____K*8M4)$`/MJHU!@``:\5<C80"0`$``(E$)""+DJ@%``"X[`8-`.E?
-M_?__@\0L6UY?7<.-M@````!55U93@^P,BVPD((M\)"2+7"0HQD,G`<9#)@")
-M7"0(QT0D!`8```")/"3H_/___X-[,`!T$HM3"(M##(E"!(D0BT,P@&@P`8![
-M3P!T'8UV`(DL).C\____QP0D`0```.C\____@'M/`'7FBY/D````A=)T&\=$
-M)`@!````#[:#V0```(E$)`2)%"3H_/___XM3,(72=!C'1"0(`0````^V0TV)
-M1"0$B10DZ/S___^+<R"%]@^$H````(-^<``/A8@```"#?G0`#X5^````]D,H
-M!'4?B2PDZ/S____'1"0(`0```(M#((E$)`2)+"3H_/___XM3(`^V0@*)1"0(
-M#[9"`8E$)`3'!"0*`0``Z/S___^+0R")1"0(BX4\!0``B40D!,<$)`$```#H
-M_/___XM#((E$)`B+A3P%``")1"0$QP0D!@```.C\____QT,@`````,=&8```
-M``"+4S2%TG0,#[9#3<=$@CP`````BQ.+0P2)0@2)$(!O"@&)7"0$B2PDZ/S_
-M__^`?P7_=$Z`?PH`=#B[`````(UW.(VV`````(DT).C\____BU<\B4<\B3")
-M4`2)`H!X)O]U"H/#`3A?"G8'Z]LX7PIW$,9'!?^)?"0$B2PDZ/S___^#Q`Q;
-M7E]=PXVT)@````"-O"<`````55=64X/L'(M\)#C&1R<!QD<F`(E\)`C'1"0$
-M!@```(M$)#2)!"3H_/___X-_,`!T$HM7"(M'#(E"!(D0BT<P@&@P`8!_3P!T
-M)8VT)@````"+5"0PB10DZ/S____'!"0!````Z/S___^`?T\`=>*+E^0```"%
-MTG0;QT0D"`$````/MH?9````B40D!(D4).C\____BU<PA=)T&,=$)`@!````
-M#[9'38E$)`2)%"3H_/___XM?((7;#X0H`0``]D<H!'4GBTPD,(D,).C\____
-MQT0D"`$```"+1R")1"0$BT0D,(D$).C\____BU<@#[9'3XE$)!`/MH*8````
-M#[92`HT$@`^VA`(`````B40D#(M4)#`/MD(BB40D"`^V0B&)1"0$QP0DK`,`
-M`.C\____BT<@B40D"(M,)#"+@3P%``")1"0$QP0D`0```.C\____BU-PA=(/
-MA$L!```/MT<<BTPD,,>$@;`"````````QT-P`````,=$)`C_____B5PD!(M#
-M>(D$)/_2Z1@!```/MT<<BTPD,,>$@;`"````````QT-T`````(M#>(D$)/_2
-M]D<H`G0ABT<@B40D"(M4)#"+@CP%``")1"0$QP0D!@```.C\____QT<@````
-M`,=#8`````"+5S2%TG0,#[9'3<=$@CP`````BQ>+1P2)0@2)$(M,)#0/ME$*
-M@^H!B%$*BT<TA<!T!V:#>#("=7"$TG1LO@````"+;"0T@\4XB?:)+"3H_/__
-M_XG#BU0D-(M"/(E:/(DKB4,$B1B%VW0Q]D,H`G0KBT,@B40D"(M,)#"+@3P%
-M``")1"0$QP0D!@```.C\____@&,H_8VV`````(/&`8GPBU0D-#A""G>BB7PD
-M!(M,)#")#"3H_/___X/$'%M>7UW#BU-TA=(/A=W^___I^O[__XUV`(V\)P``
-M``"#["R)7"0<B70D((E\)"2);"0HBUPD,(M#+(LHB2PDZ/S___^)QH7`#X3,
-M````B2PDZ/S___^)QX7`=1C&@[4````!B70D!(DL).C\____Z:8```#&1B2@
-MC58EN`````#&!!``@\`!@_@%=?3&1BH`QD8K`,9&+`#&1BV(QD8N`,9&+P#&
-M1A6K#[=#'&:)1A");AC'1F0(````QT8@B````(M'"(E&-`6(````B48XQD8<
-M)(E^4,=&;`````"-7CS'1"0$`````(D<).C\____QT0D#(@```"+1PR+5Q")
-M1"0$B50D"(D<).C\____B70D!(DL).C\____BUPD'(MT)""+?"0DBVPD*(/$
-M+,.)]E93@^P4BW0D((V>K`D``(D<).C\____A,`/A?$```")'"3H_/___XG"
-MN8#___^`OC`%``#_=!*`OC$%``#_#X7,````N8'___\XCM<```!S!HB.UP``
-M`(#Y@@^$L`````^VP8B4!K`$```/M\)IV!0-``")V@.6J`4``+@`````Q@00
-M`(/``3T4#0``=?*)V@.6J`4``(U"$(E"$(G:`Y:H!0``C4(0B4(4B=H#EJ@%
-M``"-0AB)0AB)V@.6J`4``(U"&(E"'(G:`Y:H!0``C4(HB4(HB=H#EJ@%``"-
-M0BB)0BR+AJ@%``"(3`,SQT0D!`````"+ACP%``")!"3H_/___XG8`X:H!0``
-MZPF-="8`N`````"#Q!1;7L.0C70F`%.#[`B+1"00BY@4"@``!30)``")!"3H
-M_/___XG!#[?`P>`&C108BT0D%(D0N`````#&!!``@\`!@_A`=?0/M\&#Q`A;
-MPXUT)@"-O"<`````@^P,BT0D$(V0!`$``+D`````.9`$`0``=`J)%"3H_/__
-M_XG!B<B#Q`S#D)"0D)"0#[9$)`AIP'0$```%=$4``(M4)`2)`L.)]HV\)P``
-M``"+5"0(#[9,)`P/MT1*<(/``6:)1$IP#[92`@'0#[?`PXM4)`2X`0```(VT
-M)@````"`NCLR```!=!*#P`&!PJ0```"#^"!UZ6:X___SPXUV`%93BW0D#`^V
-M3"00#[9<)!2)\K@!````.(HX,@``=1@XFCDR``!U$&G`I````,:$!I<Q```!
-MZPZ#P`&!PJ0```"#^"!UTEM>PY"-M"8`````55=64X/L"(M\)"`/MD0D)(A$
-M)`>+;"0<BU0D*,8"_@^V702(7"0#A-MT5XGJN0````"^`````+@`````C70F
-M`#FZY$<``'4HB?,Z7"0'=19IP'0$```/MH0%V$4``(M4)"B(`NL<@\8!C;0F
-M`````(/!`8/``8'"=`0``#I,)`-UOH/$"%M>7UW#C;8`````55=64X/L'(ML
-M)#0/MEPD/(M\)#"`?"0X`708#[9W!+L`````B?"$P`^$(P$``.GX````QD0D
-M&P"#?"1```^$TP```(M4)$")5"04#[97!,9$)!L`A-)T*XGXQD0D&P"Y````
-M`#FHY$<``'4'.-ET$X/!`8!$)!L!!70$```X5"0;=>$/MFPD&VG==`0``(V$
-M'W1%``#'1"0(9````(E$)`2+1"04B00DZ/S___^`O!]T10```'1?O@````")
-MW8V4'W!%``")5"00C;0F`````(GR#[;"P>`$BU0D%(U<`F"-2P2-A"C@1P``
-MC00'C5`(BT`(B4,$BT($B4$$BT((B4$(BT(,B4$,@\8!B?"+5"00.$($=[H/
-MMD0D&VG`=`0```^VA`=T10``ZRF)^KD`````NP`````YJN1'```/E,`!PX/!
-M`8'"=`0``(GP.,%UY@^VPX/$'%M>7UW#C70F`%575E.#[`0/MD0D)(A$)`,/
-MMUPD*&:)'"2+?"08O@````")]6G6.`P``(M$)!PY1#H4=7"-3!<4N`````"-
-M=@")PP^V41R$TG0&@/KP=4B0:<4X#```C11;C130C0PZBUPD'(E9'(M$)"")
-M02"-01`/MQPD9HE8%@^V7"0#B%@4B<*+7"0LBP.)0AB+0P2)0AS&03#_ZPV#
-MP`&#P1@]@@```'6<@\8!@_X$#X5R____@\0$6UY?7<.0C;0F`````%575E.#
-M[`R+;"0DBW0D((!^!`!T2;\`````C;8`````B?@/MMAIPW0$``"`O`;810``
-M_70?QT0D"`@```");"0$C80&T$4``(D$).C\____A,!U#X/'`8GX.$8$=\*[
-M_P```(G8@\0,6UY?7<.-=@!3@^P(BUPD$(M$)!2)1"0$B1PDZ/S___^Z"0``
-M`#S_=!$/ML!IP'0$```/MI0#>D4``(G0@\0(6\.-M"8`````55=64X/L#(M\
-M)""+;"0H#[9T)"P/MUPD,(GYC9?T,```N`````#&!!``@\`!/9````!U\L:!
-M]3```!/&@?0P``!`#[;'B('Z,```B)G[,```B?"(@?TP``#'@9`Q``!0\P``
-MB;F,,0``BT5<B8&$,0``BT5@B8&(,0``C8'T,```B40D!(M$)"2)!"3H_/__
-M_X/$#%M>7UW#C;0F`````%575E.#[$P/MD0D;(A$)#\/MU0D<&:)5"0@BU0D
-M8(G7N`$```")Q8G&@+H[,@```0^%W````&G`I`````'XC9"0,0``QD('`(FX
-MC#$```^V2@9IP:0```"-E`?T,```N`````#&!!``@\`!/9````!U\FG9I```
-M`(T,.XV1\#```,9"!9#&0@1`#[=$)"`/ML2)1"0<B$(*#[9$)""(@?LP```/
-MMDPD/XA*#8M,)'2+`8E"%(M!!(E"&&G6I````(T$.L>`D#$``%#S``"+3"1@
-MB8B,,0``C907@#$``(M,)&B+05R)0@2+06")0@B)Z@^VPFG`I````(V$!_0P
-M``")1"0$BTPD9(D,).C\____ZQ2#P`&!PJ0```"#^"`/A0'___^P`8/$3%M>
-M7UW#B?955U93@^P,#[9L)"@/MGPD+(M,)"")SK@!````C70F`(G"@+D[,@``
-M`0^%P@```&G`I````(V$!I`Q``")Z8A(!(G[B%@%QD`'``^V6`9IPZ0```"-
-MC`;T,```N`````#&!`@`@\`!/9````!U\FG#I````(V$!O`P``#&0`40QD`$
-M0(GYB$@-:=*D````#[:,%I8Q``!IR:0```"-!#''@)`Q``!0\P``BUPD((F8
-MC#$``(V<%H`Q``")Z@^VPFG`=`0``(V4!L!%``"+0A")0P2+0A2)0PB-A`[T
-M,```B40D!(M,)"2)#"3H_/___^L4@\`!@<&D````@_@@#X4=____L`&#Q`Q;
-M7E]=PXUV`%93@^P4BW0D(`^V1"0HB?/&AI<Q````C8[T,```N@````#&!`H`
-M@\(!@?J0````=?'&@_4P```!QH/T,```0,>#D#$``%#S``")LXPQ```/ML!I
-MP'0$``"-E`/`10``BT(0B8.$,0``BT(4B8.(,0``C8/T,```B40D!(M$)"2)
-M!"3H_/___X/$%%M>PXUV`%93@^P4BW0D(`^V1"0HB?/&AI<Q````C8[T,```
-MN@````#&!`H`@\(!@?J0````=?'&@_4P````QH/T,```0,>#D#$``%#S``")
-MLXPQ```/ML!IP'0$``"-E`/`10``BT(0B8.$,0``BT(4B8.(,0``C8/T,```
-MB40D!(M$)"2)!"3H_/___X/$%%M>PXUV`%575E.#[$P/MGPD:`^V5"1L#[9$
-M)'"(1"0GBVPD8(GY#[;)B4PD*&G!=`0``("\!=A%``#]#X0Y"0``@/H0#X2Y
-M`@``@/H0=QR$TI"-="8`#X2A````@/H!#X45"0``D.D+`0``@/KB=!N`^O^-
-M=@!T*8#ZD`^%^0@``)"-="8`Z38'``"Y`````(!]!`")]@^%.@@``.E="```
-M:40D*'0$``#&A`7810``_X"]ES$```%U+8M<)"B)7"0(BW0D9(ET)`2+?"1@
-MB3PDZ/S___^%P`^%G`@``(!%!@'IDP@``(M$)"C&1`4'`8M4)&2)5(4,Z7T(
-M``"`O9<Q```!=5J-C?0P``!I1"0H=`0```'H#[91"8B0=D4```7010``#[91
-M"H/B`8A0"<9`"`"+3"0HB4PD"(M<)&2)7"0$BW0D8(DT).C\____A<`/A2,(
-M``"`108!Z1H(``"+?"0HQD0]!P&+1"1DB42]#.D$"```:70D*'0$``"-/"X/
-MMH4F,0``B(?&10``#[>%)#$``&:)A#7$10``C90UL$4``(N%'#$``(E"!(N%
-M(#$``(E""(V4-8!%``"+A0`Q``")0@2+A00Q``")0@B-G#6010``C4L$C94(
-M,0``BX4(,0``B4,$BT($B4$$BT((B4$(BT(,B4$,BX48,0``B80UK$4``,:'
-MV$4```&`?08?#X1B!P``NP````!I1"0H=`0```'HC;!P10``C;C`10``ZU20
-M#[;#B40D#(M4)"B)5"0(BTPD9(E,)`2+1"1@B00DZ/S___^%P'01:40D*'0$
-M``"(G`7'10``ZR"#PP&`108!.%X&#Y3`@^@!(=B(1P>`?08?=`4Z7@9RJ,:%
-MES$```$/MDT$A,D/A-D&``"Z`````(!]!P%T#.M$#[;0@'P5!P%U/\9$%0?_
-MQT0D%`````#'1"00`````,=$)`S_````B50D"(M$E0R)1"0$BU0D8(D4).C\
-M____Z8@&``"X`````(/``3C(=;#I=P8``(M,)'2)3"0P@\$8B4PD+(U,)$"+
-M7"0PBT,8B40D0(MT)"R+1@2)1"1$:40D*'0$``"--"B-EM!%``#&0@@0]D,,
-M<`^$90,``(N&W$4``(7`#X2(````#[9:"L=$)`@(````B4PD!(/`7(D$).C\
-M____A,!U:8M$)##V0`\/=%^+AMQ%``"%P'15B<:`?F4`=$T/MMN)7"0(B70D
-M!(DL).C\____BU0D+(E4)!0/M\")1"00B5PD#(ET)`B+3"1DB4PD!(M<)&")
-M'"3H_/___P^V7F:+1FB%P'0$B<;KK8MT)#`/MD8/J`T/A/T```!I5"0H=`0`
-M``^VC!5T10``@/D?#X?D````J`AT$@^VP<'@!`'0QH0%Z$<```;K&`^VP<'@
-M!&E4)"AT!````=#&A`7H1P``!P^V\8GRP>($:5PD*'0$```!VHV,%>!'``#&
-M00D`BWPD,`^V1P^(00N+1"1`B4$0BT0D1(E!%`^V1PF(00H/MD<-@^`/#[:4
-M'7I%```XT'8"B=")PH/B#P^V00R#X/`)T(A!#(GPP>`$:50D*'0$```!T(V,
-M!>!'``"+7"0P#[9#*8/@#P^VE!5Z10``.-!V`HG0P>`$#[91#(/B#PG"B%$,
-M:40D*'0$``"`A`5T10```>G"`0``J`(/A+H!``"-1"1`B40D!(DL).C\____
-MB<(\_P^%7P$```^V302$R70X#[:%V$4``#S_="VZ`````#S]=1OK(@^VPFG`
-M=`0```^VA`7810``//]T$CS]=`Z#P@$XRG7@ZP6Z``````^VPFG`=`0``(V,
-M!71%``"X`````,8$"`"#P`&#^&1U]`^VTHE4)#1ITG0$``"-'"J)^0^VP6G`
-M=`0``(V$!71%``")@]Q%``"-C!7`10``:70D*'0$``"-E#7`10``BT(0B4$(
-MBT(4B4$,BWPD9(F[Y$<```'NBX;@10``B8/@10``QH/810``_XV#<$4```^V
-M2`N+?"0P#[97"8B4"WQ%``"`0`L!#[:.>D4```^V5PV#X@\XRG8"B<J(4`II
-M5"0T=`0``(V,%<!%``"+1"1`B4$0BT0D1(E!%`'JBTPD,`^V00^(@G=%```/
-MMEPD)XB:VD4```^V104Z101U!,9%!0"`104!BW0D-,9$-0<!BWPD9(E\M0SK
-M06E$)"AT!```#[;2:<IT!```C90-=$4``#F4!=Q%``!T((T<*8V#<$4```^V
-M2`N+="0P#[96"8B4"WQ%``"`0`L!BWPD,`^V1PF)1"0(BT0D*(E$)`2)+"3H
-M_/___VE$)"AT!```@+P%QT4````/A)P```"`?08?=7#IC0(``,:&V$4``!`/
-MMD,'B40D#(M4)"B)5"0(BTPD9(E,)`2+1"1@B00DZ/S___^%P`^%6@(``(!%
-M!@$/MDL'#[;!@\`!#[:6=D4``#G0=0W&0P<`Z3@"``"-="8`C4$!B$,'@'T&
-M'P^$)`(``.L1:40D*'0$``"--"B-GL!%```/MD,'.H9V10``#X)T____Z?P!
-M``"`?08`#X7R`0``QT0D%`````#'1"00`````,=$)`R0````BU0D*(E4)`B+
-M3"1DB4PD!(M<)&")'"3H_/___^FY`0``OP````!IQS@,``"+="1D.70H%'5V
-MC5P%,+X`````B40D((UV`(`[_W53@'T&'P^$A0$``(T$=HM4)""-1,(0C40%
-M&(E$)!0/MT/VB40D$`^V0_2)1"0,BT/PB40D"(M,)&2)3"0$BT0D8(D$).C\
-M____A<!U!X!%!@'&`_"#Q@&#PQB!_H(```!UFH/'`8/_!`^%;O___X!]!@`/
-MA1@!```/MDT$A,D/A-@```"Z`````(!]!P%T#.M$#[;0@'P5!P%U0<9$%0?_
-MQT0D%`````#'1"00`````,=$)`S_````B50D"(M$E0R)1"0$BU0D8(D4).C\
-M____Z;L```"X`````(GV@\`!.,AUKNMWC;0F``````^VP6G`=`0``(V4!=!%
-M```/MD((//UT"#S_=`3&0@C^@\$!.$T$=]AI1"0H=`0``(N<!>!%``"_````
-M`(UT)@"`?"\8`749QD0O&`"+1"\4B40D!(M,)&")#"3_TXUV`(''.`P``('_
-MX#```'0VZ]#'1"04`````,=$)!``````QT0D#.(```"+7"0HB5PD"(MT)&2)
-M="0$BWPD8(D\).C\____@\1,6UY?7<.-="8`@^PLB5PD((ET)"2)?"0HBW0D
-M-(N>F````(![!@`/A(0!``"-AI````")1"0$B1PDZ/S___^)P3S_#X1H`0``
-MB?</MD8!/`%T;#P!<A@\$`^$K````#R0#X5*`0``C78`Z?H```"`NY<Q````
-MC70F``^%,0$``,:#ES$```&`:P8!QT0D%`````#'1"00`````,=$)`P`````
-M#[;!B40D"(M$)#")1"0$B1PDZ/S____I\@```("[ES$````/A>4```#&@Y<Q
-M```!@&L&`<=$)!0`````QT0D$`````#'1"0,`0````^VP8E$)`B+1"0PB40D
-M!(D<).C\____Z:8```"Z`````#J,&C@R``!U$0^VA!HY,@``.D<)=!*-="8`
-M@<*D````@?K<$P``==B`:P8!B7PD%`^V1PF)1"00QT0D#!`````/ML&)1"0(
-MBT0D,(E$)`2)'"3H_/___^M(#[:&H@```&G`I````,:$`Y<Q```!@&L&`<=$
-M)!0`````QT0D$`````#'1"0,D`````^VP8E$)`B+1"0PB40D!(D<).C\____
-MBUPD((MT)"2+?"0H@\0LPXGVC;PG`````%93BU0D$`^V="04BUPD#(72=`^)
-MV8G0Q@$`@\$!@^@!=?6)$X'J=$4``,'J`KA9MOER]^+!Z@>(4P2)\#C0<P.(
-M0P2`>P0`="6Z`````(GV#[;"QD0#!_]IP'0$``#&A`/810``_8/"`3A3!'?B
-MQD,&`,9#!0")V+H`````C78`QH"7,0```8B0EC$``(/"`06D````@_H@=>9;
-M7L.-=@!75E.+?"04BTPD$(!Y!``/A($```"[``````^V\VG&=`0``#F\`>1'
-M``!U8K@`````.)P(.#(``'4(QH0(.S(```$%I````#W<$P``=>-IQG0$``#'
-MA`'D1P```````(V4`71%``"X`````)"-="8`Q@00`(/``8/X9'7T:<9T!```
-MQH0!V$4``/V`:04!@\,!.%D$=X2)R[X`````.7L4=2W'0Q0`````QD,8`&G&
-M.`P``(U$`12Z`````(UT)@#&0!P`@\(!@\`8@/J"=?&#Q@&!PS@,``"#_@1U
-MP%M>7\/K#9"0D)"0D)"0D)"0D)!55U93@^P<#[9$)#R(1"0:BUPD,`^V0P4Z
-M0P1U!,9#!0`/ME,%B%0D&XG=B=BY`````(G.B<^+4!0[5"0T=4IIP3@,``#&
-M1`,8`0^V4P3&1"0;`(32=%O&1"0;`(M\)#0YO>1'``!U#@^VA=A%``"#P`,\
-M`78\@$0D&P&!Q70$```X5"0;="OKTX72=15IQS@,```!V(M4)#2)4!3&0!@!
-MZQ"#Q@&#P0$%.`P``(/Y!'6`B?(/ML)IP#@,``"-1`,<N@````#&!`(`@\(!
-M@?H"#```=?$/MG0D&XM\)#2)?+,,:<9T!```C90#=$4``+@`````Q@00`(/`
-M`8/X9'7T:<9T!```C90#Y$4``+@`````Q@00`(/``3T``@``=?)ISG0$``"-
-M%!F+1"0TB8+D1P``BT0D0(F"X$4``,:"V$4``/_'@MQ%````````C8P+P$4`
-M`(M\)#B+!XE!$(M'!(E!%`^V1"0:B()Z10``QT0D%`````#'1"00`````,=$
-M)`S_````B70D"(M4)#2)5"0$BWPD,(D\).C\____@$,%`8/$'%M>7UW#D)"0
-MD)!64XM4)`R+`HLP#[98*X3;=#</ME()N0````#VP@%T"NLGB=#3^*@!=0>#
-MP0$XV77Q@/D#=A@/ML&-A(;0`0``BP"C`````.L6N0`````/ML&-A(;0`0``
-MBP"C`````,'H%(/@`5M>PY"-M"8`````55=64X/L!(M$)!B+$`^V>BN]"@``
-M`(GYA,ET20^V<`F[`````+T*````N0````"0B?#3^*@!=!X/MH*V"P``@^`#
-M@\`(B$0D`XGH.D0D`W8%#[9L)`.#PP&#P0&#PD2)^#C#=<N)Z@^VPH/$!%M>
-M7UW#C;0F`````(V\)P````!55U93@^P$BT0D&(L0#[9Z*[T(````B?F$R71)
-M#[9P";L`````O0@```"Y`````)")\-/XJ`%T'@^V@K8+``"#X`.#P`B(1"0#
-MB>@Z1"0#<P4/MFPD`X/#`8/!`8/"1(GX.,-URXGJ#[;"@\0$6UY?7<.-M"8`
-M````C;PG`````%.+7"0(#[8#P.@$B<*#X@</MDL"]L$$=`.`S@(/MD,#J`1T
-M!H'*```"`/;!"'0#@,X(J`AT!H'*```(`/;!`G0#@,X$J`)T!H'*```$``^V
-M0Q3!X!@)T%O#C;0F`````(/L!(M$)`B)!"3H_/___X/$!,.-M@````"-O"<`
-M````BTPD!(N!4`4``"7___\`N@`````]4`&3`'45#[:!4P4``,#H!#P,#Y3`
-M#[;0C78`B=##C;8`````C;PG`````%.)PX72?D`/M@B$R70%@/D@=2VX````
-M`.L6C;8`````#[8,&(3)=`B`^2!U$XUV`(/``3G0=>GK#HVT)@````"X````
-M`.L%N`$```!;C78`P^L-D)"0D)"0D)"0D)"0D%.+7"0(#[9#`P^V4P+!X@@)
-MT,'@$`^V2P$/MA/!X@@)T0G(6\.-="8`C;PG`````%=64XG&B=.)SX7)=!ZY
-M``````^V%@^V1@&(`XA3`8/#`H/&`H/!`3GY=>=;7E_#D(/L'(E<)!")="04
-MB7PD&(MT)""+?"0D#[='$+K_````9CV%`'<+#[?`#[:4!K`$```/M])ITK``
-M```#EHP%``"+GC@*```/MD(TP>`(C80#3`@``(L(B0T`````@>'_````#[9"
-M-,'@"(V<`T0(``"+`Z,`````P>`("<B)@J````!FQX*<``````")?"0$B30D
-MZ/S___^+7"00BW0D%(M\)!B#Q!S#B?:-O"<`````@^P<B5PD#(ET)!")?"04
-MB6PD&(ML)"`/MGPD)(MU`(GX/`-V,`^VV,'C`XV$'C`"``#'``P```#'!"00
-M)P``Z/S___^-A!XT`@``BS")-0````#K,(GX#[;8P>,#C80S4`(``,<`#```
-M`,<$)!`G``#H_/___XV<,U0"``"+,XDU`````(GX#[;(B<C!X`:-!(B-E`60
-M"P``#[9:!8/C_(A:!8GP)0``/P`]```0`'4/B=B#R`*(0@7K&9"-="8`B<C!
-MX`:-%(B)V(/(`8B$%94+``"+7"0,BW0D$(M\)!2+;"08@\0<PY"-M"8`````
-M55=64X/L'(M$)#2+5"0PBQ*)5"08BQ+&0"4`QD`D!<9`)P:+3"0PB4@LN0``
-M``"]`````(V"``(``(E$)!2!P@0"``")5"00ZQ>-M@````"+5"0P#[9""=/X
-MJ`%U#(/!`8M$)!@Z2"MRYH#Y`W9Q#[;9P>,#BWPD%`'?QP<L````QP0D$"<`
-M`.C\____`UPD$(LSB34`````QP<D````QP0D$"<``.C\____BP.C`````,'@
-M"('F_P````G&QP<@````QP0D$"<``.C\____BQN)'0````#K;XVT)@`````/
-MMMG!XP.+?"04`=_'!RP```#'!"00)P``Z/S___\#7"00BS.)-0````#'!R0`
-M``#'!"00)P``Z/S___^+`Z,`````P>`(@>;_````"<;'!R````#'!"00)P``
-MZ/S___^+&XD=`````('^`0%IEG47BU0D,(!*"`:)V,'H$#Q0#Y3`#[;`ZT:!
-M_@$!``!U$8G8P>@0/%`/E,`/ML#K+XGVQP0DB!,``.C\____@\4!B>F`^01W
-M"KD`````Z<'^__^)V,'H$#Q0#Y3`#[;`@\0<6UY?7<.-="8`C;PG`````%57
-M5E.#[`R+="0@BVPD)(M&5(LX9H.^G`````!T,HGKQP0DZ`,``.C\____A>UT
-M!8/[`78;B3PDZ/S___]F@[Z<`````'0)@^L"Z]2-="8`@\0,6UY?7<.0C;0F
-M`````(/L'(E<)`R)="00B7PD%(EL)!B+7"0L#[9L)"0/MWPD*`^V1"0PB$0D
-M"XM4)""+0E2+,(DT).C\____B<+&0"3AQD`E`<9`)A*X#P```(GIA,EU"(M,
-M)"`/MD$KB$(GB?B(0BB)^0^VQ8A"*0^VQXA"*HG8P>@0B$(KB=C!Z!B(0BR(
-M6BV+3"0@#[=!)&:)0A")<AC'0B``````QT(T`````+@`````@'PD"P!U!;@`
-M````B4)LB50D!(DT).C\____BUPD#(MT)!"+?"04BVPD&(/$',.-=@"-O"<`
-M````@^P<B5PD#(ET)!")?"04B6PD&(M<)"P/MFPD)`^W?"0HBU0D((M"5(LP
-MB30DZ/S___^)PL9`).'&0"4!QD`F$K@/````B>F$R74(BTPD(`^V02N(0B>)
-M^(A"*(GY#[;%B$(I#[;'B$(JB=C!Z!"(0BN)V,'H&(A"+(A:+8M,)"`/MT$D
-M9HE"$(ER&,="(`````#'0C0`````QT)L`````(E4)`2)-"3H_/___XM<)`R+
-M="00BWPD%(ML)!B#Q!S#55=64X/L'(M\)#`/MD0D-(A$)!L/MVPD.(7_#X3N
-M````BS>%]@^$Y`````^V7BN%VWY#BT=4#[90";D`````]L(!=`KK,(G0T_BH
-M`74'@\$!.=EU\8/Y`WXABP8%T`$``(T$B(L`HP````#!Z!2#\`&#X`'K'[D`
-M````BP8%T`$``(T$B(L`HP````#!Z!2#\`&#X`&$P'5V@+^L`````'4&@'\F
-M`'5G#[=')("\!K`$``#_=%G&1R8E9L>'G`````$`#[?%#[94)!O'1"00`0``
-M`(M,)#R)3"0,B40D"(E4)`2)/"3H_/___\=$)`0%````B3PDZ/S____&1R8`
-M9H._G``````/E,`/ML#K!;@`````@\0<6UY?7<.-="8`@^P<B5PD#(ET)!")
-M?"04B6PD&(M\)"`/MFPD)`^W7"0HBT=4BS")-"3H_/___XG"QD`DX<9`)0'&
-M0"81N`\```")Z83)=00/MD<KB$(GB%HH#[;'B$(I#[=')&:)0A")<AC'0B``
-M````QT(T`````,=";`````")5"0$B30DZ/S___^+7"0,BW0D$(M\)!2+;"08
-M@\0<PXGVC;PG`````%575E.#[!R+?"0P#[9$)#2(1"0;#[=L)#B%_P^$\P``
-M`(LWA?8/A.D````/MEXKA=M^0XM'5`^V4`FY`````/;"`70*ZS")T-/XJ`%U
-M!X/!`3G+=?&#^0-^(8L&!=`!``"-!(B+`*,`````P>@4@_`!@^`!ZQ^Y````
-M`(L&!=`!``"-!(B+`*,`````P>@4@_`!@^`!A,!U>X"_K`````!U!H!_)@!U
-M;`^W1R2`O`:P!```_W1>QD<F)6;'AYP````!``^WQ0^V5"0;QT0D#`$```")
-M1"0(B50D!(D\).C\____QT0D!`4```")/"3H_/___\9')@!F@[^<`````'43
-MBX>@````BU0D/(D"N`$```#K!;@`````@\0<6UY?7</K#9"0D)"0D)"0D)"0
-MD)"#[!R)7"0,B70D$(E\)!2);"08BWPD(`^V;"0D#[=<)"@/MD0D+(A$)`N+
-M1U2+,(DT).C\____B<+&0"3AQD`E`<9`)A&X#P```(GIA,EU!`^V1RN(0B>(
-M6B@/ML>(0BD/MT<D9HE"$(ER&,="(`````#'0C0`````N`````"`?"0+`'4%
-MN`````")0FR)5"0$B30DZ/S___^+7"0,BW0D$(M\)!2+;"08@\0<PXUV`(/L
-M'(E<)`R)="00B7PD%(EL)!B+;"0D#[9T)"@/MGPD+(M$)""+&(D<).C\____
-MB<*%P'40QH6U`````<9%)@/I?P```,9`).'&0"4!B?`\`1G`]]"#P`*(0B:)
-M^(3`=3^#?30`=`0/MD5-B$(G#[=%'&:)0A")6AC'0B``````QT(T`````+@@
-M.`$`B4)LB50D!(D<).C\____ZR>-=@#&0B</#[=%'&:)0A")6AC'0B``````
-MQT(T`````+@`````Z\B+7"0,BW0D$(M\)!2+;"08@\0<PY"-M"8`````55=6
-M4X/L+(ML)$B+1"1`BQ"+1"1$P>`#C;P0``(``(VT$`0"``"['`$``)"-="8`
-M@WPD1`-V&8D?QP0D$"<``.C\____BP:C`````.L7B?:)'\<$)!`G``#H_/__
-M_XL&HP````")A!ST_O__@\,$@?LX`0``=;F+1"00B44`BT0D%(E%!(M$)!B)
-M10B+1"0<B44,BT0D((E%$(M$)"2)112+1"0HB448@\0L6UY?7<-55U93@^PL
-MBVPD2(M$)$"+$(M$)$3!X`.-O!```@``C;00!`(``+L``0``D(UT)@"#?"1$
-M`W89B1_'!"00)P``Z/S___^+!J,`````ZQ>)]HD?QP0D$"<``.C\____BP:C
-M`````(F$'!#___^#PP2!^QP!``!UN8M$)!")10"+1"04B44$BT0D&(E%"(M$
-M)!R)10R+1"0@B440BT0D)(E%%(M$)"B)11B#Q"Q;7E]=PU575E.#[#R+3"14
-MB$PD$XM$)%"+`(E$)!@/MOF)^,'@!HT$N`-$)%"-D)`+``"(2@2+3"10B8B0
-M"P``QD(&`(E\)`2)#"3H_/___XUT)!R)\(GRQ@``@\`!B=.-;"0\.>AU\`^V
-M1"03B40D%(E4)`B)1"0$BU0D4(D4).C\____B1PDZ/S___^)1"0,C0R]````
-M`(GZP>(&C101BT0D4(T<`HM$)`R)@YP+``"+1"10C900H`L``(M$)"B)`HM$
-M)"R)0@2`?"03`W8IBU0D&(V$"M`!``"+`*,`````B8.T"P``C83Z@`$``(L0
-MB14`````ZS^-%+T`````BTPD&(V$$=`!``"+"(D-`````(GXP>`&`<*+1"10
-MB8P0M`L``(M4)!B-A/J``0``BQ")%0````")^,'@!HT$N`-$)%")D+@+``#V
-M@+8+```0#X0^`0``]H"5"P```G1=D(UT)@#&!@"#Q@$Y[G7VC5PD'(E<)`B+
-M3"04B4PD!(M$)%")!"3H_/___XD<).C\____B?K!X@:-%+J+3"10B801J`L`
-M`(V4$:`+``"+1"0HB4(,BT0D+(E"$.L7B?C!X`:-!+B+5"10QX0"J`L```$`
-M`@"`?"03`W8YC1S]`````(M,)!B-A`LP`@``QP`8````QP0D$"<``.C\____
-MBT0D&(V<`S0"``"+$XD5`````.LWC1S]`````(M4)!B-A!-0`@``QP`8````
-MQP0D$"<``.C\____BTPD&(V<"U0"``"+$XD5`````(GXP>`&C02XBTPD4/>$
-M`;0+``````,`=0B!XO___]_K!H'*````((!\)!,#=@^+3"08C83Y-`(``(D0
-MZPV+3"08C83Y5`(``(D0@\0\6UY?7<.0C;0F`````%575E.#[`R+?"0@BVPD
-M)(EL)`@/MT4`9H7`>0LE`!\``,'X"(A')8U'4(U-%(M5%(E74(M1!(E0!(M1
-M"(E0"(M1#(E0#(M1$(E0$(VWC````(M5+HF7C````(M5,HE6!(U?9(U--HM5
-M-HE79(M1!(E3!(M1"(E3"(M1#(E3#(M1$(E3$(M1%(E3%(M1&(E3&(M1'(E3
-M'(M1((E3((M1)(E3)+D*````B<+H0O'__[D$````B?*)\.@T\?__N10```")
-MVHG8Z";Q__]FQT<X``!FQT<Z``"+1"0(9H.XL@$```$/E,+!X@,/MD<H@^#W
-M"="(1RCVA:<````$=`9FQT<X`0#VA:0````!="1F@T\X`O:%J@````%T!6:#
-M3SH!]H6H`````70(9H%/.``!B?;VA:0````@=!=F@T\X!/:%J@```"!T"6:#
-M3SH"C70F`/:%I````$!T%V:!3SB``/:%J@```$!T"&:#3SH(C78`QD=.`O:%
-MF0````%T,P^W1SBH`70,@\@(9HE'.&:#3SH0#[:%E@```(/@'X/``8A'3CP@
-M=0O&1TX?C;0F`````/:%F`````AT!F:!3S@``O:%F`````1T!6:#3S@@]H68
-M`````G0%9H-/.!#VA:@````@=`[VA:X````@=`5F@T\X0/9'.`%T&(N%R```
-M`(N5S````(E'1(E72.L1C70F`(M5>(E71,='2`````"#1T3_@U=(__9%:@)T
-M&0^WA8````"H#W0.9H/X`AG`@\`$B$<\ZP3&1SP"QD<]_P^W57X/M\*H!'0)
-MQD<]`NL9C78`J`)T!L9'/0'K#/;"`8UV`'0$QD<]`,9'/O_V16H$=!VY````
-M``^WA;````#3^*@!=`.(3SZ#P0&#^0=UZ,=$)`0``@``B2PDZ/S___^)AY@`
-M``"+1"0(]H"F````('0@#[>`K````(/@((/X`1G`@\`"B(<D`0``ZPV-M@``
-M``#&AR0!````N`$```"#Q`Q;7E]=PXVV`````(V_`````(/L'(E<)`R)="00
-MB7PD%(EL)!B+;"0@BWT`NX#____K!8#[A7=*#[;##[:T![`$``")\#S_=#D/
-MML!IP!0-```#AZ@%```Y:`AU)<=$)`@(````BU0D)(E4)`2)!"3H_/___X3`
-M=`F)\.L2D(UT)@"#PP&`^X%VJ;C_____#[;`BUPD#(MT)!"+?"04BVPD&(/$
-M',.-M@````"-OP````!55U93@^P\BU0D4(L"@'HK``^$\P(``,=$)#@`````
-MC8@``@``B4PD&`4$`@``B40D%`^V1"0XB$0D-P^VZ(GHP>`&C02HBU0D4(T<
-M$/:#M@L``!`/A)8"``"-DY`+``"X`0```(GIT^`(0@:+FY@+``")7"0P]D(%
-M`@^$(`$```^V7"0W@\,!BW0D4#A>*P^&"P$``(T$K0````")1"0@B>K!X@:)
-M5"0<C;0F``````^V\XGPP>`&C12PBTPD4(T\"O:'M@L``!`/A,$```"+1"0@
-M`T0D'`'!B4PD+/>!J`L`````#@`/A*,```"+3"10C901H`L``(E4)"B#P@R-
-MA`&@"P``B40D)(/`#,=$)`@(````B50D!(D$).C\____A,!T:\=$)`@(````
-MBT0D*(E$)`2+5"0DB10DZ/S___^$P'1+N`$```")\=/@BU0D+('"D`L```I"
-M!HA"!HB'E@L``(-\)#``=0R+OY@+``")?"0PZQF)\,'@!HT$L(M4)#"+="10
-MB90&F`L``(GV@\,!BTPD4#A9*P^'$/___X-\)#``#X6W````BW0D4(DT).C\
-M____B40D,(7`#X1'`0``B>C!X`:-#*@!\8M$)#")@9@+```/MD0D-XG"P>(&
-MC82"D`L```'PBU0D,(E"&`^V@94+``"(0@;&0@4`B3+&0@H`QD(T`,9"'``/
-MME0D-X/"`3A6*W9?B>C!X`:-!*B-G`:0"P``C;0F``````^VR@^V0P;3^*@!
-M=!>)R,'@!HT$B(MT)#"+3"10B;0!F`L``(/"`8M$)%`X4"MV&>O.B>C!X`:-
-M!*B+3"0PBU0D4(F,`I@+``")Z,'@!HT$J(MT)%"-E`:0"P``#[9"!HM,)#"(
-M00D/MG(&@'PD-P-V)XT<[0````"+1"08`=C'`#@```#'!"00)P``Z/S___\#
-M7"04B3/K)XT<[0````"+1"08`=C'`#@```#'!"00)P``Z/S___\#7"04B3.)
-M]H-$)#@!#[9$)#>#P`&+="10.$8K#X<H_?__@\0\6UY?7<.-M"8`````C;PG
-M`````%575E.#[$R+="1@BQ[&1"1`4,9$)$$%QD0D0@3&1"1#,,9$)$01QD0D
-M1:O&1"1&`,9$)$<`QX,`0`$`$R```(L&QX`$0`$`__\``(L&QX`$0`$`````
-M`#NV/`4```^%Y````(V^P`P``(VN4`4``,=$)!`!````QT0D#`@```");"0(
-MQT0D!````@")-"3H_/___XN&2`4```^VEE,%``"#Z@2-!(*(AE,%``")-"3H
-M_/___X3`=1&+1"1`B890!0``BT0D1(E%!*$``````(93!0``@\`!HP`````/
-MMH90!0``B(=0!0``#[:&404``(B'404```^VAE(%``"(AU(%```/MH93!0``
-M@\`"B(=3!0``#[:&5`4``(B'5`4```^VAE4%``"(AU4%```/MH96!0``B(=6
-M!0``#[:&5P4``(B'5P4``(G?C8,``0``B40D*(N#``$``*,`````#[?0B50D
-M2*@@=`LEW_\``(E$)$CK%HG0@\@@B40D2(M4)"B)`HL"HP````"+!L>`!`$`
-M``````"+!L>`&`$```````"+!L>`'`$```````#'!"20T`,`Z/S____'AW`!
-M```8`0``BX=T`0``HP````"`Y/V`S`2)1"1(QX=P`0``&`$``(M$)$B)AW0!
-M``#'AW`!```H`0``QX=T`0``?W\``,>'<`$``"0!``"+AW0!``"C`````&:X
-M```-_S\``(E$)$C'AW`!```D`0``BT0D2(F'=`$``,>'<`$``#P!``#'AW0!
-M`````'H`QX=P`0``I`$``,>'=`$``'V_[__'AW`!``"X`0``BX=T`0``HP``
-M```E__\```T``/H`B40D2,>'<`$``+@!``"+1"1(B8=T`0``QX><````_P``
-M`,>'D`(``$0!``#'AY0"```&$``(QX>0`@``M`$``,>'E`(``%]P``#'AY`"
-M```P````BX>4`@``HP`````PY(#,,XE$)$B)AY0"``"`?BL`#X1Z`@``QT0D
-M+`````"-AU`"``")1"08C9=4`@``B50D%`^V1"0LB$0D,SP##X81`0``#[;H
-MC13M`````(E4)"2-A!<P`@``B40D(,<`"````,<$)!`G``#H_/___XM4)"2-
-MG!<T`@``BP.C`````(E$)$@-``"``(D#C890!0``B40D"(EL)`2)-"3H_/__
-M_XEL)`2)-"3H_/___XM$)"#'`$0!``#'!"00)P``Z/S____'`P80``B+5"0@
-MQP*T`0``QP0D$"<``.C\____QP-?<```BT0D(,<`"````,<$)!`G``#H_/__
-M_\=$)$C_5(``QP/_5```QT0D"`$```");"0$B30DZ/S___^+1"0DC90'@`$`
-M`(L"HP`````E___^_XD"QT0D2`4!R`"+5"0DC807A`$``,<`!0'(`.D.`0``
-M#[9L)#.-!.T`````B40D.(M4)!@!PHE4)!S'`@@```#'!"00)P``Z/S___^+
-M7"0X`UPD%(L#HP````")1"1(#0``@`")`XV&4`4``(E$)`B);"0$B30DZ/S_
-M__^);"0$B30DZ/S___^+1"0<QP!$`0``QP0D$"<``.C\____QP,&$``(BU0D
-M',<"M`$``,<$)!`G``#H_/___\<#7W```(M$)!S'``@```#'!"00)P``Z/S_
-M___'1"1(_U2``,<#_U0``,=$)`@!````B6PD!(DT).C\____BT0D.(V4.(`!
-M``"+`J,`````)?___O^)`L=$)$@%`<@`BU0D.(V4.H0!``")5"0TQP(%`<@`
-MQP0DH(8!`.C\____B6PD!(DT).C\____@T0D+`$/MD0D,X/``3A&*P^'HOW_
-M_XDT).C\____BX<$`0``HP````"#R`*)1"1(B8<$`0``BU0D*(L"HP`````E
-M\/___0T-```"B40D2(D"BP*C`````(N&&`H``(F'"`$``(N&'`H``(F'#`$`
-M`(N&/`H``(F'$`$``(N&0`H``(F'%`$``,>'(`$````````/MX:,"P``)?\/
-M```-```!`(F'(`$``(N&A`H``(F')`$``(N&B`H``(F'*`$``(N&I`H``,<`
-M_P\``,>'-`$````````/MX:."P``)?\/```-```!`(F'-`$``(N&J`H``(F'
-M.`$``(N&K`H``(F'/`$``,>'2`$```````#'1"1(``$``,>'3`$````!``"+
-MAP0!``"C`````(/(68F'!`$``,=$)$C[_P`,QX=4`0``^_\`#,>'7`$``/__
-M``"X`````,>$AL@%````````QT2&5`````"#P`&#^!!UY6;'AH@+``#_#V;'
-MAHH+``#_#\9&.`&P`8/$3%M>7UW#C70F`%575E.#[!R)1"04B=>+*(DL).C\
-M____B<.%P'4,QH>U`````>G`````B2PDZ/S___^)QH7`=1C&A[4````!B5PD
-M!(DL).C\____Z9H```"-0SR)1"08QD,DX<9#)0'&0R8##[=''&:)0Q#&0V@/
-MBU0D%(L"B4,8QT,@``(``(M6"(E3-+@`````C;0F`````,8$$`"#P`$]``(`
-M`'7RB7-0QT-L(#@!`,=$)`0`````BT0D&(D$).C\____BT,@B40D#(M&#(M6
-M$(E$)`2)5"0(BU0D&(D4).C\____B5PD!(DL).C\____@\0<6UY?7</K#9"0
-MD)"0D)"0D)"0D)!55U93@^Q,BT0D8(LH#[9`"83`#X17!```#[;8QT0D.```
-M``#VPP%U&;H`````B?:#P@$/MLJ)3"0XB=C3^*@!=.Z+1"0XP>`&BW0D.(T$
-ML(T4*(N"J`L``*D```(`=!`-```$`"7___W_B8*H"P``BT0D.,'@!HM\)#B-
-M!+B+A`6H"P``J0``!``/A`8#``"+A3P%``")1"1(.>AU"HV5P`P``(E4)$B+
-M1"0XP>`&BTPD.(T$B`'H#[:0LPL``(E4)"@/MI"R"P``B50D)`^VD+$+``")
-M5"0@#[:0L`L``(E4)!P/MI"O"P``B50D&`^VD*X+``")5"04#[:0K0L``(E4
-M)!`/MH"L"P``B40D#`^V12F)1"0(B4PD!,<$)-`#``#H_/___\=$)#P`````
-MBW0D.,'F`HET)$2+?"0XP><&B7PD0(M4)#R+3"1(#[:$"C`%```\_P^$H@``
-M``^VP&G`%`T``(G#`YFH!0``BW0D1(M\)$"-A#Z@"P``C7P%#+@(````_(G>
-MB<'SI@^7P@^2P#C"=6@/MD,'B40D(`^V0P:)1"0<#[9#!8E$)!@/MD,$B40D
-M%`^V0P.)1"00#[9#`HE$)`P/MD,!B40D"`^V`XE$)`3'!"0@!```Z/S___^+
-M?"1@QD<%_XE\)`2)+"3H_/___^ET`@``C70F`(-$)#P!@WPD/`(/A3;___^)
-M+"3H_/___XG#A<`/A$X"``"+1"0XP>`&BU0D.(T$D/:$!:D+```$=`2`2S4"
-MBT0D.,'@!HM,)#B-!(CVA`6J"P``!'0$@$LU$(M$)#C!X`:+="0XC02P]H0%
-MJ0L```AT!(!+-02+1"0XP>`&BWPD.(T$N/:$!:H+```(=`2`2S4@BT0D.,'@
-M!HM4)#B-!)#VA`6I"P```G0$@$LU`8M$)#C!X`:+3"0XC02(]H0%J@L```)T
-M!(!+-0C&0S``B=^+1"0XP>`&BW0D.(V$L*`+``"-1`4`BU`,B1.+0!")0P2+
-M1"1@B4,(B00DZ/S___^(@XL```"+5"1@@$(<`8!]*P!T,+D`````N@````")
-M]HMT)&`/MD8)T_BH`70.#[;"B$P#0(!#,@&#P@&#P0$X32MWW(M$)&"+2#"-
-M4R")4#"+1"1@@\`LB4,@B4LDB1&+5"1@@$(T`<=$)!``````#[:#BP```(E$
-M)`R)?"0(B50D!(N%^`D``(D$).C\____Z=H```"I```(``^$SP```(DL).C\
-M____B<.%P`^$O0```,9`)P;&0"8%9L>`E```````QD`D!L9`)0#'0$0```4`
-MQT!(`````(V(H````(M$)#C!X`:+="0XC82PH`L``(U$!0"+4`R)DZ````"+
-M0!")002+@Z````")@Y@```"+002)@YP```"+?"1@B7LLB3PDZ/S___^(@[8`
-M``!F@TLX$(D\).C\____/`EV!F:!2S@``HM$)&#&0`H!BU`\B5@\BT0D8(/`
-M.(D#B5,$B1J)7"0$B2PDZ/S___^)]H/$3%M>7UW#D(VT)@````!55U93@^PL
-MBWPD0(M<)$2%VW05#[9#!83`=`T\_P^%A`<``.D;`0``N@````"-=@`/MH0Z
-M-@4``#S_=`T/ML!KP%R-G`=``0``@\(!@_H$==^^``````^VA#XV!0``//]T
-M-@^VP&O`7(V<!T`!``#VA`=&`0```G07QT0D!`````")'"3H_/___^L-D(UT
-M)@")'"3H_/___X/&`8/^!(GV=;0/MD<F9CF'V`D```^%]`8``(7;=7>`?SD`
-M#X7F!@``QD<Y`8N$G[`"``"%P'10BU!PA=)T*,=`<`````#'A)^P`@``````
-M`,=$)`C_____B40D!(M`>(D$)/_2ZR&+4'2%TG0:QT!T`````,>$G[`"````
-M````BT!XB00D_]*#PP&#^Q0/A'L&``#KE\9#!?^)7"0$B3PDZ/S____I9`8`
-M`+H`````#[:$.C8%```\_P^$[P````^VR&O!7(V<!T`!``")7"0D@'L%_P^$
-MU````(!["@`/A"H&``"^`````&O97(VL'W@!``")+"3H_/___XG!C00[BY!\
-M`0``B8A\`0``B2F)402)"H!Y)O]T?H"YM0`````/A.@%```/MEDD#[;3B="#
-MX`:#^`9U*?;"`71'B4PD#`^V04V)1"0(BT$PB40D!(M$)"2)!"3H_/___^FN
-M!0``@_@$#X6E!0``]L,!#X2<!0``B4PD!(D\).C\____Z8L%``")3"0$B3PD
-MZ/S____I>@4``(UV`(/&`8GR.)0?2@$```^&904``.E%____@\(!@_H$#X7U
-M_O__QT0D'`````"`?SD`D`^%D@```+L`````D(UT)@"+E)^P`@``#[:$.[`$
-M``"%TG1DBTIPA<ET78-Z8`!U5SS_="T/MO!IQB@!```#AW`%``#V0"<$=!B`
-M>"4`=1*)="0(B50D!(D\).C\____ZR;'A)^P`@```````,="<`````#'1"0(
-M_____XE4)`2+0GB)!"3_T8/#`8/[%'6!QD<Y`>FO!```BTPD'`^VA#DV!0``
-M//\/A(L$```/MM!KPER-G`=``0``B5PD*("\!TH!````#X1L!```QD0D(P")
-MQ8V$!W@!``")1"00C78`BU0D$(D4).C\____B<.-1#T`BY!\`0``B9A\`0``
-MBTPD$(D+B5,$B1J`>R;_#X4-!```#[=#'(E$)!0/MI0XL`0``&:)5"0:B[2'
-ML`(``/9#*`1T:X7V=&>#?G``=&&#?F``=5N`8RC[]D,G!(UV`'05#[?"B40D
-M"(ET)`2)/"3H_/___^LYBU9PBTPD%,>$C[`"````````QT9P`````,=#(```
-M``#'1"0(_____XET)`2+1GB)!"3_TI"-="8`]D,G!`^$:@$``,:#M`````"`
-MI"](`0``Y_9#*`$/A/X```"`8RC^BT,@A<!T6(![)0!U,_9#)P1T+0^V1RF-
-M!("+5"04C02"B40D"(N'/`4``(E$)`3'!"0'````Z/S____IW0```(E$)`B+
-MASP%``")1"0$QP0D`0```.C\____Z;X```"%]G1ABU9PA=*0=%F`>R4`=2#V
-M0R<$=!H/MT0D&HE$)`B)="0$B3PDZ/S____IC````(M,)!3'A(^P`@``````
-M`,=&<`````#'0R``````QT0D"/____^)="0$BT9XB00D_]+K68![)0!U4_9#
-M)P1T30^V1RF-!("+5"04C02"B40D"(N'/`4``(E$)`3'!"0"````Z/S____K
-M(XM#((7`=!R+4'2%THUV`'02QT!T`````(M#((M`>(D$)/_2]D,H`@^$,@(`
-M`(M#((E$)`B+ASP%``")1"0$QP0D!@```.C\____@&,H_>GC`0``BT,@A<`/
-MA-@!``"#>'0`#X3.`0``QD,G`<9#)@")7"0(QT0D!`8```"+3"0HB0PDZ/S_
-M__^#>S``=!*+4PB+0PR)0@2)$(M#,(!H,`&`>T\`=!J)/"3H_/___\<$)`$`
-M``#H_/___X![3P!UYHN3Y````(72=!O'1"0(`0````^V@]D```")1"0$B10D
-MZ/S___^+4S"%TG08QT0D"`$````/MD--B40D!(D4).C\____BW,@A?8/A/8`
-M``#V0R@$=5V)/"3H_/___\=$)`@!````BT,@B40D!(D\).C\____BU,@#[9"
-M`HE$)`@/MD(!B40D!,<$)"`!``#H_/___XM#((E$)`B+ASP%``")1"0$QP0D
-M`0```.C\____ZSD/MD8"B40D"`^V1@&)1"0$QP0D(`$``.C\____BT,@B40D
-M"(N'/`4``(E$)`3'!"0!````Z/S___^+5G2%TG0>#[=#',>$A[`"````````
-MQT9T`````(M&>(D$)/_2]D,H`G0ABT,@B40D"(N'/`4``(E$)`3'!"0&````
-MZ/S___^`8RC]QT,@`````,=&8`````"+4S2%TG0,#[9#3<=$@CP`````BQ.+
-M0P2)0@2)$("L+TH!```!B5PD!(D\).C\____]D,H`G0CBT,@B40D"(N'/`4`
-M`(E$)`3'!"0&````Z/S___^`8RC]B?:`1"0C`0^V7"0C.)PO2@$```^'J?O_
-M_X-$)!P!@WPD'`0/A5'[__^X`0```(/$+%M>7UW#C;8`````C;\`````5U93
-M@^P0BW0D((L^B30DZ/S___^$P'08#[9?*X3;=#$/ME8)N0````#VP@%T'.LA
-MQD8%_XET)`2)/"3H_/___^M<B=#3^*@!=0>#P0$XV77QB3PDZ/S___^)P87`
-M=#^+5CR)1CR-1CB)`8E1!(D*@$8*`8EQ+,9!)`7&024`QD%-#\=$)`P!````
-MQT0D"`$```")3"0$B30DZ/S___^#Q!!;7E_#C70F`(V\)P````"#["R)7"0<
-MB70D((E\)"2);"0HBW0D-(M>5`^V1B8\)`^':@<```^VP/\DA0`(```/MT8R
-M#[?0]L($=`QFQT8R`0#&1B8!ZT-F@_@@=0QFQT8R"`#&1B81ZS&$TGD5]D8M
-M`W0/)'^#R`AFB48RQD8F#>L8]L((=`;&1B8'ZPWVQ@)T",9&*P#&1B8>B70D
-M!(M$)#")!"3H_/___^GP!@``QT0D#`$```#'1"0(`@```,=$)`0!````B30D
-MZ/S____IRP8``,=$)`P!````QT0D"`````#'1"0$`0```(DT).C\____Z:8&
-M``#'1"0,`0```,=$)`@!````QT0D!`$```")-"3H_/___^F!!@``QT0D#`$`
-M``#'1"0(8````,=$)`0!````B30DZ/S____I7`8```^V1BS'1"00`0```(E$
-M)`S'1"0(8````,=$)`0!````B30DZ/S____I+P8``,=$)!`!````QT0D#```
-M`03'1"0((0```,=$)`0!````B30DZ/S____I`@8``(M#&(%@*/__]__'1"00
-M`0```,=$)`P!````QT0D"`(```#'1"0$`````(DT).C\____Z<L%``#'1"00
-M`0```,=$)`P`````QT0D"`(```#'1"0$`````(DT).C\____QP0D$"<``.C\
-M____Z9(%``"+0QB!8"C___?_QT0D$`$```#'1"0,`0```,=$)`@"````QT0D
-M!`````")-"3H_/___^E;!0``QT0D$`$```#'1"0,`````,=$)`@"````QT0D
-M!`````")-"3H_/___\<$)!`G``#H_/___^DB!0``QT0D#`$```#'1"0(`@``
-M`,=$)`0`````B30DZ/S____I_00``,=$)`P!````QT0D"`````#'1"0$````
-M`(DT).C\____Z=@$``#'1"0,`0```,=$)`@!````QT0D!`````")-"3H_/__
-M_^FS!```QT0D$`$```#'1"0,_____\=$)`@!````QT0D!`````")-"3H_/__
-M_^F&!```QT0D#`$```#'1"0(`````,=$)`0`````B30DZ/S____I800```^V
-M1BN+?(8\B5\LB7<T#[9&*XA'3<9')@/&1R4`@$\D!8!#"@&+4SR-0SB)>SR)
-M!XE7!(DZQP0D@!H&`.C\____BU0D,(!Z*P!T*;X`````]D,)`70.ZQP/MD,)
-MB?'3^*@!=16#Q@&)\(M4)#`X0BMWYNL%O@````"+4QB+0BBI```(`'0*)?__
-M]_^)0BCK9(GQ#[;!C2S%`````+NX"P``B?`\`W8<BU0D,(L"!8`!```!Z(L`
-MHP````#!Z!.#X`'K'(M,)#"+`06``0``C40%`(L`HP````#!Z!.#X`&$P'41
-MQP0DZ`,``.C\____@^L!=:UFQX>4``````")?"0$BT0D,(D$).C\____Z4\#
-M``#'!"1`#0,`Z/S____'1"0,`````,=$)`@@````QT0D!`$```")-"3H_/__
-M_\<$)!`G``#H_/___^D2`P``QT0D#`````#'1"0(`0```,=$)`0`````B30D
-MZ/S____'!"00)P``Z/S____IX0(``(M#&(%@*/__]__'1"00`````,=$)`S_
-M____QT0D"`$```#'1"0$`````(DT).C\____QP0D$"<``.C\____Z9X"``#'
-M1"0,`````,=$)`@`````QT0D!`````")-"3H_/___\<$)!`G``#H_/___^EM
-M`@``B70D!(M4)#")%"3H_/___^E8`@``B70D!(M,)#")#"3H_/___^E#`@``
-MQT0D$`$```#'1"0,\````,=$)`B;````QT0D!`$```")-"3H_/___^D6`@``
-MQT0D$`$```#'1"0,H-9:*\=$)`C@`P``QT0D!`$```")-"3H_/___^GI`0``
-MQT0D$`$```#'1"0,`.`#`,=$)`BD`P``QT0D!`$```")-"3H_/___^F\`0``
-MQT0D$`$```#'1"0,Y*@&`<=$)`C$`P``QT0D!`$```")-"3H_/___^F/`0``
-MQT0D#`$```#'1"0(2`,``,=$)`0!````B30DZ/S____I:@$``,<$)$`-`P#H
-M_/___\=$)`P!````QT0D""````#'1"0$`0```(DT).C\____QP0D$"<``.C\
-M____Z2T!``#'1"00`0```,=$)`P`````QT0D""$```#'1"0$`0```(DT).C\
-M____Z0`!``#'1"0,`0```,=$)`A@````QT0D!`$```")-"3H_/___^G;````
-M#[9&+,=$)!`!````B40D#,=$)`A@````QT0D!`$```")-"3H_/___^FN````
-MQD,%`(M&5(D$).C\____Z9H```#'1"0,`0```,=$)`@!````QT0D!`````")
-M-"3H_/___\<$)!`G``#H_/___^MLBT,8@6`H___W_\=$)!`!````QT0D#/__
-M___'1"0(`0```,=$)`0`````B30DZ/S____'!"00)P``Z/S____K+,=$)`P!
-M````QT0D"`$```#'1"0$`````(DT).C\____QP0D$"<``.C\____N`$```"+
-M7"0<BW0D((M\)"2+;"0H@\0LPXVT)@````"#[!R)7"00B70D%(E\)!B+7"0@
-MBWPD)`^W5Q!F@?J%`'=^#[?"#[:$&+`$```\_W1O9H/Z?W<9#[;`:<`H`0``
-M`X-P!0``BT`L#[9(!.M6D`^W1Q!F/8$`=R`/M\`/MH08L`0``&G`%`T```.#
-MJ`4``(M`"`^V2`3K*P^W1Q`/MH08L`0``&G`L`````.#C`4``(M`5`^V2`3K
-M"I"-="8`N?____^X_____V:!?Q"%`'<,#[='$`^VA!BP!```B[.,!0``#[;1
-M@/G_=!2`O!HV!0``_W0*//]T!H!_%`9U)H-_4`!T#XU'4(E$)`2)'"3H_/__
-M_XE\)`2)'"3H_/___^GJ````#[;`:<"P`````<8/MD8F/!IT=CP:=PH\$0^%
-MFP```.L;/!N-M"8`````=&,\'`^%A@```(VV`````.MZBY,X"@``@<),"```
-M#[9&-,'@"`'"BPJ)#0`````/MLF+DS@*``"!PD0(```/MD8TP>`(`<*+`J,`
-M````P>`("<&)CI0```#&1B8:ZS'&1B8;ZRN+@S@*```%3`@```^V5C3!X@@!
-MT(L`HP````"#X/>(1BS&1B8<ZP3&1B8=@W]0`'0/C4=0B40D!(D<).C\____
-MB7PD!(D<).C\____B70D!(D<).C\____C78`BUPD$(MT)!2+?"08@\0<PX/L
-M#(M$)!")1"0$BP")!"3H_/___X/$#,.-M"8`````@^PLB5PD'(ET)"")?"0D
-MB6PD*(M<)#2+<RP/MU,<N`````"+3"0P@+P*L`0``/\/A#L)```/MD,F/`D/
-MA"\%```\"7=+/`4/A)@````\!9!W'CP##X2V````/`2-="8`#X7N"```Z>0`
-M``"0C70F`#P'#X2-!```/`>-M@`````/AQ`$``#IF0(``)"-="8`/!8/A'P#
-M```\%HVV`````'<C/!0/A)@%```\%(UT)@`/A^8"```\"@^%E@@``(GVZ1`%
-M```\&@^$-P(``#S_D`^$<`4``#P7#X5V"```B?;I0@,``(M$)#`/MF@KB>J$
-MT@^$H0````^V5@F_`````/;"`0^$@@```.F*````B?:+1AB!8"C___[_BT,L
-MQT0D#`````#'1"0(`0```(E<)`2)!"3H_/___\<$)`4```#H_/___[@!````
-MZ2$(``#'1"0,`````,=$)`@`````B5PD!(DT).C\____QP0D4,,``.C\____
-MN`$```#I[P<``(G0B?G3^*@!=1*#QP&)^(GI.,AUZ^L%OP`````/ME,DB="#
-MX`:#^`9U"?;"`0^%U0```(M6&(M"**D```$`=`TE___^_XE"*.F[````B?H/
-MML+!X`.)1"08O1`G``"0BTPD,(L1B?@\`W89BTPD&(V$$8`!``"+`*,`````
-M)0```0#K%XM,)!B-A!&``0``BP"C`````"4```$`A<!T,HGX/`-V%HM,)!B-
-MA!&``0``QP````$`Z1\'``"+3"08C801@`$``,<````!`.D)!P``QP0DZ`,`
-M`.C\____@^T!#X5Y____QD,G`L9#)O^)7"0$BT0D,(D$).C\____N`$```#I
-MYP8``/9&!@%T-HE<)`2)-"3H_/___X3`=2:]^@```(E<)`2)-"3H_/___X3`
-M=1''!"3H`P``Z/S___^#[0%UWXGZ@/H#=AR+3"0PBP$%@`$```^VTHT4T(L"
-MHP````")`NL<BU0D,(L"!8`!``")^0^VT8T4T(L"HP````")`HM#+(G:Z#+E
-M___'!"0@3@``Z/S___^X`0```.E,!@``B50D!,<$)%@$``#H_/___XMS+(L^
-MB3PDZ/S___^)P87`=1'&@[4````!N`$```#I&`8``,9`).'&0"4!QD`F%P^W
-M0QQFB4$0BP:)01C'02``````QT$T`````,=!;"`X`0")3"0$B3PDZ/S___^X
-M`0```.G4!0``B50D!,<$)#8!``#H_/___XMS+(L^B3PDZ/S___^)P87`=1'&
-M@[4````!N`$```#IH`4``,9`).'&0"4!QD`F&`^W0QQFB4$0BP:)01C'02``
-M````QT$T`````,=!;"`X`0")3"0$B3PDZ/S___^X`0```.E<!0``B=J)\.@C
-MY/__N`$```#I204``(L^B3PDZ/S___^)P@^V2SR%P'41QH.U`````;@!````
-MZ20%``#&0"3AQD`E`<9`)@6(2"</MT,<9HE"$(L&B4(8QT(@`````,="-```
-M``#'0FP@.`$`B$L_B50D!(D\).C\____N`$```#IV@0``(L^B3PDZ/S___^)
-MP@^V2SZ%P'41QH.U`````;@!````Z;4$``#&0"3AQD`E`<9`)@2(2"</MT,<
-M9HE"$(L&B4(8QT(@`````,="-`````#'0FP@.`$`B$M!B50D!(D\).C\____
-MN`$```#I:P0``(L^B3PDZ/S___^)P87`=1'&@[4````!N`$```#I2@0``,9`
-M).'&0"4!QD`F!@^W0QQFB4$0BP:)01C'02``````QT$T`````,=!;"`X`0")
-M3"0$B3PDZ/S___^X`0```.D&!```C;8`````BSZ)/"3H_/___XG!A<!U$<:#
-MM0````&X`0```.G?`P``QD`DX<9`)0'&0"8,#[=#'&:)01"+!HE!&,=!(```
-M``#'030`````QT%L(#@!`(E,)`2)/"3H_/___[@!````Z9L#``"+/HD\).C\
-M____B<&%P'41QH.U`````;@!````Z7H#``#&0"3AQD`E`<9`)A;&0"@!#[=#
-M'&:)01#&06@/BP:)01C'02``````QT$T`````,=!;"`X`0")3"0$B3PDZ/S_
-M__^X`0```.DN`P``QD,F_V;'@Y0```````^V4R2)T(/@!H/X!G4%]L(!=1Z#
-M>S0`=1B)-"20C70F`.C\____B(.V````D(UT)@"`>R<"=1J+0RR)7"0(B40D
-M!(M$)#")!"3H_/___XUV`/9&"`)U&KL`````C7XX@'X*``^%8`$``.E\`@``
-MC78`BU8H#[9:*@^VRP^V0A^#Z`$YP7TVC4,!B$(J@$(K`<9")@`/MT(R@^#^
-M@\@(9HE",HE4)`2+5"0PB10DZ/S___^X`0```.EE`@``.<%T%KL`````C7XX
-M@'X*`'4TC78`Z2\"``#&0B8`#[=",H/@]H#,`F:)0C*)5"0$BTPD,(D,).C\
-M____N`$```#I'P(``(D\).C\____B<&+1CR)3CR).8E!!(D(@'DF_P^$C@``
-M`("YM0`````/A-4!```/MEDD#[;3B="#X`:#^`9U*O;"`711#[9!38M1,(E,
-M)`R)1"0(B50D!(DT).C\____N`$```#IM@$``(/X!`^%D0$``/;#`0^$B`$`
-M`(E,)`2+1"0PB00DZ/S___^X`0```.F*`0``B4PD!(M4)#")%"3H_/___[@!
-M````Z7`!``#&@;4`````@\,!.%X*#X9!`0``Z3G___^)/"3H_/___XG!BT8\
-MB4X\B3F)002)"(!Y)O\/A)\```"`>24`#X6.````@+FU``````^$!`$```^V
-M620/MM.)T(/@!H/X!G4J]L(!=%$/MD%-BU$PB4PD#(E$)`B)5"0$B30DZ/S_
-M__^X`0```.GE````@_@$#X7`````]L,!#X2W````B4PD!(M,)#")#"3H_/__
-M_[@!````Z;D```")3"0$BT0D,(D$).C\____N`$```#IGP```,:!M0````"#
-MPP$/MD8*.-@/AS'___\XPW5.A,!T2KL`````C7XXB3PDZ/S___^)PHM&/(E6
-M/(DZB4($B1`/MD(E/")T!#P-=1?'1"0$"@```(D4).C\____N`$```#K/X/#
-M`3A>"G>^QD8%_XET)`2+5"0PB10DZ/S___^X`0```.L<N`$```#K%87MC78`
-M#X0!^?__Z1[Y__^0C70F`(M<)!R+="0@BWPD)(ML)"B#Q"S#C;8`````C;\`
-M````@^PLB5PD'(ET)"")?"0DB6PD*(M\)#"+;"0T#[=5$&:!^H4`#X>^````
-M#[?"#[:,![`$``"`^?\/A*H```!F@_I_=QP/ML&+EW`%``!IP"@!``"+1!`L
-M#[9`!.LZC78`9H'Z@0!W&0^VP8N7J`4``&G`%`T``(M$$`@/MD`$ZQ</ML&+
-MEXP%``!IP+````"+1!!4#[9`!#S_=$T/ML`/MIP'-@4``(#[_W05@/G_=!`/
-MME44@/H&=5>-M"8`````@/O_=".`^?]T'@^VP6G`*`$``(G&`[=P!0``QD8G
-M`L9&)O_I6`(``(-]4`!T#XU%4(E$)`2)/"3H_/___XEL)`2)/"3H_/___^E?
-M`@``B?8/ML%IP"@!``")Q@.W<`4``(M--(32#X2T````#[9%)CP&#X3-````
-M/`P/A,4````/MY:4````C4(!9HF&E````&:#^@EV%X!^)@9T$<9&)P+&1B;_
-M@&8H_NG2`0``QP0DZ`,``.C\____#[96)(G0@^`&@_@&=3[VP@%T.<=$)!``
-M````QT0D#`(````/MD9-B40D"(M&,(E$)`0/ML-KP%R-A`=``0``B00DZ/S_
-M___IIP$``,9&)@.)="0$B3PDZ/S____ID@$``)"-="8`#[9%)CP!=0W&1B8$
-MC70F`.E+`0``/`)U#,9&)@6-=@#I.P$``#P##X6]````B<B`?B8%=2MF@7D$
-MR#=U(P^W1AR)1"0$QP0DC`0``.C\____QD8F!ND&`0``C;8`````B40D!(DT
-M).C\____C49DNB@```#H!\#__X3`=3B-1E"Z%````.CVO___A,!U)XV&C```
-M`+H(````Z.*___^$P'43BT9$"T9(=`O&1B87B?;IJP```&:#OI0````==A'&
-M1B<"QD8F_X!F*/[ID````,<$).@#``#H_/___\9&)AIF@X:4`````>MV/!=U
-M!L9&)A7K;#P8=0K&1B86C70F`.M>/`1U!L9&)@?K5#P%B?9U!L9&)@CK2#P&
-M=0;&1B8)ZSX\#'4&QD8F"NLT/!:)]G4&QD8F%.LH/`YU)(-]4`!T#XU%4(E$
-M)`2)/"3H_/___XEL)`2)/"3H_/___^LND(-]4`!T#XU%4(E$)`2)/"3H_/__
-M_XEL)`2)/"3H_/___XET)`2)/"3H_/___XM<)!R+="0@BWPD)(ML)"B#Q"S#
-MZPV0D)"0D)"0D)"0D)"0@^PLB5PD'(ET)"")?"0DB6PD*(ML)#2+=2P/MT4<
-MN@````"+3"0P@+P!L`0``/\/A.L"```/MD4F/!0/A-0````\%'<[/`T/A`0!
-M```\#9!W$#P%#X6[`@``C;8`````ZU,\#@^$^P```#P/C70F``^%GP(``.G\
-M````D(UT)@`\&P^$GP```#P;C;8`````=Q`\&'0Y/!D/A7<"``")]NM'/!QT
-M73S_#X5G`@``B?;IQ@```,=$)`0`````B2PDZ/S___^Z`0```.E1`@``QT0D
-M!`$```")+"3H_/___[H!````Z3<"``#'1"0$`0```(DL).C\____N@$```#I
-M'0(``(DL).C\____N@$```#I"P(``(DL).C\____N@$```#I^0$``/9%.01T
-M$HDL).C\____N@$```#IX0$``(DL).C\____N@$```#ISP$``(DL).C\____
-MN@$```")]NF[`0``B2PDZ/S___^Z`0```.FI`0``QD4F_X!^"@`/A.D```"[
-M`````(U^.(UV`(D\).C\____B<*+1CR)5CR).HE"!(D0@'HF_P^$GP```(!Z
-M)0`/A9P```"`NK4`````#X1-`0``#[9:)`^VRXG(@^`&@_@&=2KVP0%T4HE4
-M)`P/MD)-B40D"(M",(E$)`2)-"3H_/___[H!````Z1T!``"#^`0/A0D!``#V
-MPP&0#X3_````B50D!(M$)#")!"3H_/___[H!````Z?````")5"0$BTPD,(D,
-M).C\____N@$```#IU@```(VV`````,:"M0````"#PP$/MD8*.-@/ARK___\X
-MPP^%C`````^V124\(G04/`UT$+\`````C6XX@'X*`'4<ZW#'1"0$"@```(DL
-M).C\____N@$```#I?````(DL).C\____B<.+1CR)7CR)*XE#!(D8#[9#)3PB
-M=`0\#74IB5PD!,<$)$P!``#H_/___\=$)`0*````B1PDZ/S___^Z`0```.LR
-MB?:#QP&)^#A&"G>JQD8%_XET)`2+3"0PB0PDZ/S___^Z`0```.L+N@$```"-
-MM@````")T(M<)!R+="0@BWPD)(ML)"B#Q"S#C78`C;PG`````%575E.#["R+
-M7"1$#[=3$+G_____N/____]F@?J%`'=[#[?"BW0D0`^VC`:P!```N/____^`
-M^?]T8F:#^G]W'0^VP8M\)$"+EW`%``!IP"@!``"+1!`L#[9`!.L_9H'Z@0!W
-M'0^VP8MT)$"+EJ@%``!IP!0-``"+1!`(#[9`!.L;#[;!BWPD0(N7C`4``&G`
-ML````(M$$%0/MD`$#[;`BU0D0`^VM`(V!0``:\9<C80"0`$``(E$)"0/ML%I
-MP"@!```#@G`%``")1"0HBTLT#[81P>(8#[9!`<'@$`G"#[9!`PG"#[9!`L'@
-M"`G"C5D(B=#!Z`.#^!!V!;@0````C03!B40D'#G##X>0`0``QT0D(`````!K
-M]ER)="08`W0D0(ET)!2)'"3H_/___XG%C7,$OY0(``"Y!````/SSI@^7P@^2
-MP#C"#X5$`0``@_T0#X<[`0``@T0D(`&#?"0@`74JBTPD*,>!'`$```$```")
-MJ2`!``"+`XF!J````(M#!(F!K````.D%`0``BW0D0(DT).C\____B<:%P`^$
-M_````,9`)P;&0"8%9L>`E```````QD`D!L9`)0#'0$0```4`QT!(`````,>`
-M'`$```$```")J"`!``"+5"0H@<*@````BWPD*(N'H````(F&H````(M"!(F&
-MI````(N'H````(F&F````(M"!(F&G````(L#B8:H````BT,$B8:L````BT0D
-M)(E&+(D$).C\____B(:V````9H-..!"+5"0DB10DZ/S___\\"78&9H%..``"
-MBTPD%("!2@$```&+D7P!``")L7P!``"+?"1`BTPD&(V$#W@!``")!HE6!(DR
-MB70D!(D\).C\____C;8`````@\,(.UPD'`^&A_[__X/$+%M>7UW#C70F`(V\
-M)P````!55U93@>PL`@``#[:$)$@"``"+E"1``@``BU((B50D'(L*B4PD((N4
-M)$`"```/ME(PB%0D)XN,)$`"``"#P2B)3"0HBY0D0`(``#E**`^$JP(``(!\
-M)"<`#X2@`@``#[;`B40D%(M,)"B)#"3H_/___XUX^(U$)"R)1"00BU0D%(E4
-M)`S'1"0(`0```(M,)!R)3"0$BX0D1`(``(D$).C\____@'PD+``/A/X```"]
-M`````(V7H````(E4)!B-=@")Z0^V\<=$)`@(````BT0D&(E$)`2)\\'C!(V$
-M')@```")!"3H_/___X3`#X2?````C90<C`````^V0@B#X`^(A[8````/MT\X
-M9H'AW_V)R(/($&:)1S@/MD((P.@$/`EU"8G(@\@P9HE'.(GPP>`$#[:$!)0`
-M``#`Z`0\"G4&9H%/.``"BTPD*(M1!(U'"(E!!(E/"(E7#(D"]D<H`G1`@&<H
-M_8M'((7`=#6)1"0(BU0D((N"/`4``(E$)`3'!"0&````Z/S____K%9"-="8`
-M@\4!B>DX3"0L=A'I(/___XGH.$0D+`^'-P$``(E\)`C'1"0$!@```(M4)!R)
-M%"3H_/___X!_3P!T)(VV`````(M,)"")#"3H_/___\<$)`$```#H_/___X!_
-M3P!UXHN7Y````(72=!O'1"0(`0````^VA]D```")1"0$B10DZ/S___^+5S"%
-MTG08QT0D"`$````/MD=-B40D!(D4).C\____BT<@A<!T?<=`8`````#V1R@$
-M=2>+1"0@B00DZ/S____'1"0(`0```(M'((E$)`2+5"0@B10DZ/S___^+1R")
-M1"0(BTPD((N!/`4``(E$)`3'!"0&````Z/S___^+1R")1"0(BU0D((N"/`4`
-M`(E$)`3'!"0!````Z/S____'1R``````BQ>+1P2)0@2)$(M,)!R`:0H!BX0D
-M0`(``(!H,`&)?"0$BU0D((D4).C\____BT0D*(N,)$`"```Y02AT"X!L)"<!
-M#X5G_?__@<0L`@``6UY?7<.-M"8`````55=64X'L+`(``(N\)$0"``"+A"1`
-M`@``BP")1"0D#[:T)$P"``"-7"0LB5PD$(ET)`S'1"0(`0```(N4)$`"``")
-M5"0$B3PDZ/S___^)="0(B7PD!(NT)$@"``")-"3H_/___XMN*(/M"(GS@\,H
-MC44(.=AT*P^V124\#704/")U,.L.#[9%)3P-=`8\(HGV=2#&128%QD4G!,9$
-M)"H!ZP7&1"0J`(!\)"P`=17I(`(``(MM"(/M"(U%"#G8=<60Z]_&1"0K`(N$
-M)$`"``"#P#B)1"0@BY0D2`(``(MR*(/N"(U&"#G##X0#`@``#[9$)"O!X`2-
-MO`28````C70F`,=$)`@(````B7PD!(V&H````(D$).C\____A,`/A9P!``"+
-M=@B#[@B-1@@YV`^$O0$``.O+B[0D0`(``(!&"@'&028%QH&T`````,9!)P1F
-MQX&4``````#&@98`````QT%$```%`,=!2``````/MG0D*XGPP>`$C90$C```
-M``^V0@2(020/MD(%B$$EBX0D0`(``(E!+`^V0@B#X`^(@;8````/MWDX9H'G
-MW_V)^(/($&:)03@/MD((P.@$/`EU"8GX@\@P9HE!.(GPP>`$#[:$!)0```#`
-MZ`0\"G4&9H%).``"BY0D2`(``(E1,(GRP>($#[:$%)(```"(04V-E!2,````
-MBT(,B8&@````BU(0B9&D````B8&8````B9&<````B[0D2`(``(!&,`&+E"1`
-M`@``BT(\B4H\BW0D((DQB4$$B0B+A"1(`@``BU`LC4$(B[0D2`(``(E&+(E9
-M"(E1#(D"#[91)(G0@^`&QD0D*@"#^`9U1_;"`70MB4PD#`^V04V)1"0(BX0D
-M2`(``(E$)`2+E"1``@``B10DZ/S____&1"0J`.L5B4PD!(MT)"2)-"3H_/__
-M_\9$)"H`@$0D*P$/MD0D*SA$)"P/AP/^__^`?"0J`'0MQT0D!`H```")+"3H
-M_/___^L;D(UT)@"+5"0DB10DZ/S___^)P87`#X4O_O__@<0L`@``6UY?7</K
-M#9"0D)"0D)"0D)"0D)!55U93@>PL`@``BX0D0`(``(LP#[90'(A4)":#P"R)
-M1"0HBXPD0`(``#E!+`^$T`,``(32#X3(`P``BT0D*(D$).C\____C6C@QT0D
-M$`````#'1"0,`````,=$)`@`````BY0D0`(``(E4)`2+C"1$`@``B0PDZ/S_
-M__^(1"0GA,`/A&L#``"_`````+L`````B5PD(,=$)!``````B5PD#,=$)`@!
-M````BX0D0`(``(E$)`2+E"1$`@``B10DZ/S___\/ML#!X`2#P&0]``(```^'
-MZ0$``(U,)"R)3"00B5PD#,=$)`@!````BX0D0`(``(E$)`2+E"1$`@``B10D
-MZ/S____'1"0("````(EL)`2-C"2(````B0PDZ/S___^$P`^$F`$``(M$)"B+
-M4`2-12"+3"0HB4$$B4T@B54DB0(/MD0D+HA%,8V$)(````")1"0$BX0D0`(`
-M`(D$).C\____//]T$@^VP&G`%`T```.&J`4``(E%#(GZA-)T50^V1"0OT>B#
-MX`'!X`0/ME4U@^+O"<*(534/MD0D+\'H`X/@`<'@!8/BWPG"B%4U#[9$)"_!
-MZ`*#X`'!X`.#XO<)PHA5-0^V1"0RB(6+````Z;\````/MD0D+HA%,8N,)$`"
-M``")30@/MD0D,HB%BP````^W1"0PB44X#[=$)'QFB86(````#[9$)'Z(A8H`
-M``"-37B-5"0L@\)`BT0D;(E%>(M"!(E!!(M""(E!"(M"#(E!#(U-2(U4)"R#
-MPA"+1"0\B45(BT($B4$$BT((B4$(BT(,B4$,C4U8C50D+(/"((M$)$R)15B+
-M0@2)002+0@B)00B+0@R)00R+0A")01"+0A2)012+1"1DB45PBT0D:(E%=(M$
-M)"")1"0,B6PD"(N4)$0"``")5"0$BXPD0`(``(D,).C\____Z1@!``")]H/'
-M`8/#`8GX.D0D)P^$(`$``.FZ_?__B3PDZ/S___^-6/B)7"0(QT0D!`8```"+
-ME"1``@``B10DZ/S___^`>T\`=!J)-"3H_/___\<$)`$```#H_/___X![3P!U
-MYHM#((7`=&W'0&``````]D,H!'4?B30DZ/S____'1"0(`0```(M#((E$)`2)
-M-"3H_/___XM#((E$)`B+ACP%``")1"0$QP0D`0```.C\____BT,@B40D"(N&
-M/`4``(E$)`3'!"0&````Z/S____'0R``````BQ.+0P2)0@2)$(N,)$`"``"`
-M:0H!@&TP`8E<)`2)-"3H_/___SE]*`^%&/___XN$)$`"``"`:!P!B6PD!(DT
-M).C\____BTPD*(N4)$`"```Y2BQT'(!L)"8!=!7I2/S__XU]*#E]*`^%V?[_
-M_XGVZ[V!Q"P"``!;7E]=PXUV`%575E.!["P"``"+K"1$`@``BT4`B40D'(N4
-M)$`"``")5"0$B2PDZ/S____'1"00`````,=$)`P`````QT0D"`````");"0$
-MBYPD0`(``(D<).C\____B$0D(X3`#X2^`P``QD0D(@#'1"0D`````)#'1"00
-M`````(M$)"2)1"0,QT0D"`$```");"0$BY0D0`(``(D4).C\____#[;`P>`$
-M@\!D/0`"```/AU@#``"-7"0LB5PD$(M$)"2)1"0,QT0D"`$```");"0$BY0D
-M0`(``(D4).C\____C9PDB````(E<)`2)+"3H_/___SS_#X42`P``BT0D'(D$
-M).C\____B<>%P`^$+P,``(!%'`'&0#``BX0DB````(D'BX0DC````(E'!(V$
-M)(````")1"0$B2PDZ/S___\\_W06#[;`:<`4#0``BU0D'`."J`4``(E'#`^V
-M1"0NB$<Q#[9$)"_1Z(/@`<'@!`^V5S6#XN\)PHA7-0^V1"0OP>@#@^`!P>`%
-M@^+?"<*(5S4/MD0D+\'H`H/@`<'@`X/B]PG"B%<UB6\(#[9$)#*(AXL```"+
-M1"0TB4=`BT0D.(E'1`^V1"0SB$<R#[=$)#")1S@/MT0D?&:)AX@````/MD0D
-M?HB'B@```(U/>(U4)"R#PD"+1"1LB4=XBT($B4$$BT((B4$(BT(,B4$,C4](
-MC50D+(/"$(M$)#R)1TB+0@2)002+0@B)00B+0@R)00R-3UB-5"0L@\(@BT0D
-M3(E'6(M"!(E!!(M""(E!"(M"#(E!#(M"$(E!$(M"%(E!%(M$)&2)1W"+1"1H
-MB4=TBTTPC5<@B54PC44LB4<@B4\DB1&`?"0L``^$@@$``&;'1"0J``"-73B)
-M7"08C4<HB40D%(VV`````(M4)!R)%"3H_/___XG!A<`/A(0!``"`10H!QD`F
-M!<:`M`````#&0"<$QT!$```%`,=`2`````!FQX"4```````/MW0D*HGPP>`$
-MC90$C`````^V0@2(020/MD(%B$$EB6DLB7DP#[9"!HA!30^V0@B#X`^(@;8`
-M```/MUDX9H'CW_V)V(/($&:)03@/MD((P.@$/`EU"HG8@\@P9HE!.)")\,'@
-M!`^VA`24````P.@$/`IU#&:!23@``HVV`````(GPP>`$C90$C````(M"#(F!
-MH````(M2$(F1I````(F!F````(F1G````(!',`&+13R)33R+7"08B1F)002)
-M"(M7+(U!"(E'+(M<)!2)60B)40R)`@^V422)T(/@!H/X!G4O]L(!=!J)3"0,
-M#[9!38E$)`B)?"0$B2PDZ/S____K$(E,)`2+1"0<B00DZ/S___]F@T0D*@$/
-MMD0D+&8[1"0J#X>9_O__@$0D(@&#1"0D`0^V5"0C.%0D(@^%4/S__X!]"@!U
-M%,9%!?^);"0$BUPD'(D<).C\____@<0L`@``6UY?7<.-="8`C;PG`````%57
-M5E.#["R+;"1`BWPD1,=$)!``````QT0D#`````#'1"0(`````(E\)`2)+"3H
-M_/___X3`=#B[`````(/H`0^V\(U$)"N)1"0,B5PD"(E\)`2)+"3H_/___X!\
-M)"O^#X6E````@\,!C48!.<-UTP^V1S2#Z`&(1S2$P'1UBS?&1S0`BU\L@^L@
-MC5<LC4,@.=!T=X-[#`!U2.L+D(UT)@"#>PP`=3O&1S0!B7PD!(DL).C\____
-MQT0D$``````/MH.+````B40D#(E<)`B)?"0$BX;X"0``B00DZ/S____K*8M;
-M((/K((U#(#G0=;*)]NL8B7PD!(DL).C\____B7PD!(DL).C\____@\0L6UY?
-M7<.-M"8`````C;PG`````%575E.#[`R+="0@BWPD)(LNNPH```")?"0$B30D
-MZ/S___^$P'41QP0DZ`,``.C\____@^L!==\/METKA-MT(`^V5@FY`````/;"
-M`70+ZQ"0B=#3^*@!=0>#P0$XV77QBQ>+1P2)0@2)$(!N"@&)?"0$B2PDZ/S_
-M___V1@@"=$&+1BB%P'43B2PDZ/S___^%P`^$6@$``(E&*(DHB7!4QD`J`,9`
-M*P#&0"8`9H-(,@2)1"0$B2PDZ/S____I,`$``(M&*(7`#X3+````@\!8B40D
-M!(M%%(D$).C\____BT8HB40D!(DL).C\____C7XX.7XX#X27````B3PDZ/S_
-M__^)PXM`((7`=&W'0&``````]D,H!'4?B2PDZ/S____'1"0(`0```(M#((E$
-M)`2)+"3H_/___XM#((E$)`B+A3P%``")1"0$QP0D`0```.C\____BT,@B40D
-M"(N%/`4``(E$)`3'!"0&````Z/S____'0R``````@&X*`8E<)`2)+"3H_/__
-M_SE^.`^%:?___\=&*`````"`?@H`=!.-1CB)!"3H_/___XG!@&X*`>L*B2PD
-MZ/S___^)P87)=#.+5CR)3CR-1CB)`8E1!(D*@$8*`8EQ+,9!)`7&024`QD$G
-M!L9!)@.)3"0$B2PDZ/S___^#Q`Q;7E]=PY"-M"8`````@^PLB5PD'(ET)"")
-M?"0DB6PD*(M\)#"+7"0T#[=3$&:!^H4`=WH/M\(/MHP'L`0``(#Y_W1J9H/Z
-M?W<9#[;!BY=P!0``:<`H`0``BT00+`^V0`3K.V:!^H$`=QD/ML&+EZ@%``!I
-MP!0-``"+1!`(#[9`!.L;#[;!BY>,!0``:<"P````BT005`^V0`2-="8`#[;1
-M//]T"6:!^O\`=2B)]H-[4`!T#XU#4(E$)`2)/"3H_/___XE<)`2)/"3H_/__
-M_^DZ`0``#[;`#[:,!S8%```/M\)IP"@!``")Q@.W<`4``(![%``/A*8```!K
-MP5R-K`=``0``#[9%"HE$)!`/MD4)B40D#`^V0R>)1"0(#[9#)HE$)`3'!"2L
-M!```Z/S___^+%HM&!(E"!(D0@&T*`8ET)`2)/"3H_/___XE<)`2)/"3H_/__
-M_P^V=RN)\(3`#X2J````#[9=";D`````]L,!=0WK'`^VRHG8T_BH`706B4PD
-M!(D\).C\____Z7X```"Z`````(/"`8GP.,)UUNMN:\%<C:P'0`$``(![)@%U
-M-L<$)!`G``#H_/___XE<)`2)/"3H_/___\=$)`P!````QT0D"`````")="0$
-MB2PDZ/S____K*,<$)%##``#H_/___XE<)`2)/"3H_/___XET)`2)+"3H_/__
-M_XUT)@"+7"0<BW0D((M\)"2+;"0H@\0LPXVV`````(V_`````%575E.#[!R+
-M="0PBVPD-`^V1"0XB$0D%P^V1"0\B$0D%HL&B40D&(!^"@!T=+L`````C7XX
-MB3PDZ/S___^)PHM&/(E6/(DZB4($B1`Y:C!U#P^V1"07.$)-=`V0C70F`(/#
-M`3A>"G?-.%X*=#2`?"064'4MQD(G!L9")@7&0B0'QD(E`(EJ,(ER+,:"E@``
-M``")5"0$BT0D&(D$).C\____@\0<6UY?7<.-M"8`````@^PLB5PD'(ET)"")
-M?"0DB6PD*(ML)#"+1"0T#[=0$&:!^H4`#X>&````#[?"#[:$*+`$```\_W1W
-M9H/Z?W<8#[;`:<`H`0```X5P!0``BT`L#[90!.M>BU0D-`^W0A!F/8$`=R`/
-MM\`/MH0HL`0``&G`%`T```.%J`4``(M`"`^V4`3K,(M,)#0/MT$0#[:$*+`$
-M``!IP+`````#A8P%``"+0%0/ME`$ZPN-M@````"Z_____[G_____BT0D-&:!
-M>!"%`'<0BTPD-`^W01`/MHPHL`0```^VP@^VA"@V!0``:\!<C;P%0`$```^V
-MP6G`L````(NUC`4```'&BT0D-(!X*`(/A8@````/MD`L)?````"#^"!T!8/X
-M$'5UBTPD-`^V42R)T(/@#X/X`74QB=`E\````,=$)!`!````B40D#,=$)`@"
-M````QT0D!`````")-"3H_/___^D!"@``D`^V1BN+5(8\BTPD-`^V02PE\```
-M`(/X(`^4P(/`"(B"M@```(M"-&:!8#+__NG."0``BU0D-`^V0A2$P'1#B<.#
-M>E``=!&)T(/`4(E$)`2)+"3H_/___XM,)#2)3"0$B2PDZ/S___^`^P(/A9`)
-M``")="0$B2PDZ/S____I?PD``,>&F``````````/MD8F/"0/APD)```/ML#_
-M)(6<"```BT<8]D`J"`^$,@D``(GVZ<`%``"+E3@*``"!PDP(```/MD8TP>`(
-M`<*+`J,`````@_@%=P6(1A_K!,9&'P6`?PL`=`W&1B8`QD<+`.FN"```QD8F
-M`NFE"```BY4X"@``@<),"```#[9&-,'@"`'"BP*C``````^VP&:)1B"+E3@*
-M``"!PD0(```/MD8TP>`(`<*+`J,`````B<+!Z@AFB58BP>`(9@E&(&:!^D!!
-M#Y3`@^@!@^#J@\`9B$8FZ3T(``"+E3@*``"!PD0(```/MD8TP>`(`<*+`J,`
-M````B$8=BY4X"@``@<),"```#[9&-,'@"`'"BP*C`````*@(=`;&1AX,ZQJH
-M!'0&QD8>"^L0@^`"@_@!&<#WT(/@"HA&'@^V1BL\`1G`@^`"@\`4B$8FZ<@'
-M``"+A3@*```%3`@```^V5C3!X@@!T(L`HP````"#R`B(1BS&1B8%Z9X'``#&
-M1B8`#[=&,F8E]_V#R`)FB48RBT0D-(-X4`!T#X/`4(E$)`2)+"3H_/___XM4
-M)#2)5"0$B2PDZ/S____&1P7_B7PD!(DL).C\____Z:T'``#&1B8$Z40'```/
-MMD8K@\`!B$8K.D8?<U?&1B86BTPD-(-Y4`!T$8G(@\!0B40D!(DL).C\____
-MBT0D-(E$)`2)+"3H_/___\=&6("$'@#'1F``````B79DC498BU44B40D!(D4
-M).C\____Z3X'``#&1BL`QD8F%\<$)""A!P#H_/___^G%!@``QD8F%.F\!@``
-MQD8F".FS!@``QD8F%.FJ!@``QD8N`.C\____B8:(````QD8F%>F2!@``BY4X
-M"@``@<),"```#[9&-,'@"`'"BQJ)'0`````/MMN+E3@*``"!PD0(```/MD8T
-MP>`(`<*+`J,`````Z/S___^)AHP```"#XP^#^P-U"<9&)@KI.@8``(N&B```
-M``5`#0,`.8:,````>1</MD8N/`IW#\9&)A6#P`&(1B[I$`8```^V1BN#?(8\
-M``^$R0$``,=$)!0`````@'\*`'0^QD0D&@"-7SB)'"3H_/___XE$)!0/MD8K
-MBU0D%#E4ACQT'(M#!(E3!(D:B4($B1"`1"0:`0^V3"0:.$\*=\J`;PH!BU0D
-M%(M"((7`#X1.`0``QT!@`````/9"*`1U.XDL).C\____BTPD%(M!-,:`K```
-M``&+02#'1"0(`0```(E$)`2)+"3H_/___XM4)!2+0C3&@*P`````BTPD%(M!
-M((N5/`4``(E$)`B)5"0$QP0D`0```.C\____BU0D%(M"((M(<(7)=#`/MT(<
-MQX2%L`(```````"+0B#'0'``````BT(@BU!XQT0D"/____^)1"0$B10D_]&+
-M3"04BT$@A<!T*XM0=(72="0/MT$<QX2%L`(```````"+02#'0'0`````BT$@
-MBT!XB00D_]*+1"04#[983XM0(`^V@I@````/ME("C02`#[:$`@`````/ME4B
-M#[9-(8E<)!")1"0,B50D"(E,)`3'!"0`!0``Z/S___^+5"04BT(@BY4\!0``
-MB40D"(E4)`3'!"0&````Z/S___^+3"04QT$@``````^V1BO'1(8\`````(M$
-M)!2)1"0$B2PDZ/S____&1B8)Z2\$``"+E3@*``"!PDP(```/MD8TP>`(`<*+
-M"HD-``````^VR8N5.`H``('"1`@```^V1C3!X`@!PHL"HP````#!X`@)R(E&
-M.(!^)@IT!ZD```$`=`G&1B8+Z=4#``#&1B8,#[9&*X-\ACP`=$J`?PH`#X0<
-M!```QD0D&P"-7SB)'"3H_/___XG"#[9&*SE4ACQU!H!O"@'K*(M#!(E3!(D:
-MB4($B1"`1"0;`0^V3"0;.$\*=@SKR(DL).C\____B<*%T@^$R@,```^V1BN)
-M5(8\#[9&+XB"M@```.E3`P``C78`B2PDZ/S____'!"0!````Z/S___^#ZP&#
-M^_]T"8M'&/9`*@ATV\9&)@GI(@,``(N5.`H``('"3`@```^V1C3!X`@!PHL*
-MB0T`````#[;)BY4X"@``@<)$"```#[9&-,'@"`'"BP*C``````^VP,'@"`G(
-M)?\/```]$P$```^4PCTC`0``#Y3!A-)U$(3)=0P],P$``'4YZ>P"``#&1B88
-MA-)T"<9&+PCII`(``(3)B?9T"<9&+PGIE0(``#TS`0``#X6*`@``QD8O"NF!
-M`@``#[9.*@^VT0^V1A^#Z`$YPGT3C4$!B$8J@$8K`<9&)@?I7`(``,9&*P#&
-M1B8>Z4\"``#&1B8#Z48"``#&1B8BB?;I.P(``,9&)B/I,@(``,9&)@/I*0(`
-M`(N5.`H``('"3`@```^V1C3!X`@!PHL*B0T`````BY4X"@``@<)$"```#[9&
-M-,'@"`'"BQ*)%0````")T,'@"`^VR0G(9CT#$0^%F@```(G0P>@(9CU%4W0*
-M9CU``P^%A0```&;'1B`#$6:)1B)F/453=1R`OJ4````"=!/&AJ4````"QX:H
-M````'P```.LB9H%^(D`#=1J`OJ4````#=!'&AJ4````#QX:H````#_@#`,:&
-MK`````&)-"3H_/___\:&K`````"+!HN`/`4``,=$)`0`````B00DZ/S____&
-M1B8#Z4$!``#&1B8AQH:E`````.DQ`0``BY4X"@``@<),"```#[9&-,'@"`'"
-MBP*C`````(N5.`H``('"1`@```^V1C3!X`@!PHL"HP````#&1B8?Z?````#&
-M1B8@Z><```"+E3@*``"!PDP(```/MD8TP>`(`<*+`J,`````BY4X"@``@<)$
-M"```#[9&-,'@"`'"BP*C``````^V3BL/MD8?C5$!B%8K#[;)#[;`@^@!.<$/
-MG,"#Z`&#X.>#P!^(1B;I@@```(N5.`H``('"3`@```^V1C3!X`@!PHL*B0T`
-M````#[;)BY4X"@``@<)$"```#[9&-,'@"`'"BP*C`````,'@"`G!B8Z4````
-MQD8F&NLUQD8F&^LOBX4X"@``!4P(```/ME8TP>((`="+`*,`````@^#WB$8L
-MQD8F'.L(QD8F'8UT)@"+1"0T@WA0`'0/@\!0B40D!(DL).C\____BU0D-(E4
-M)`2)+"3H_/___XET)`2)+"3H_/___^LIQD8F&.D<_?__B2PDZ/S____'!"0!
-M````Z/S___^[/D(/`.EN_/__B?:+7"0<BW0D((M\)"2+;"0H@\0LPXVV````
-M`(V_`````(/L7(E<)$R)="10B7PD5(EL)%B+;"1@BWPD9`^W5Q!F@?J%``^'
-MO@````^WP@^VC`6P!```@/G_#X2J````9H/Z?W<<#[;!BY5P!0``:<`H`0``
-MBT00+`^V0`3K.HUV`&:!^H$`=QD/ML&+E:@%``!IP!0-``"+1!`(#[9`!.L7
-M#[;!BY6,!0``:<"P````BT005`^V0`0\_W1-#[;`#[:4!38%``"`^O]T%8#Y
-M_W00#[9?%(#[!G57C;0F`````(#Z_W0C@/G_=!X/ML%IP"@!``")Q@.U<`4`
-M`,9&)P+&1B;_Z;@'``"#?U``=`^-1U")1"0$B2PDZ/S___^)?"0$B2PDZ/S_
-M___IP@<``(GV#[;!:<`H`0``B<8#M7`%```/MX:4````9HE$)#9F/:L-=P6`
-M^P)U.H-_4`!T#XU'4(E$)`2)+"3H_/___XE\)`2)+"3H_/___\9&)O_&1B<"
-MB70D!(DL).C\____Z5X'``#&1"0]`(#[('4EBT\X#[8!@^!_/'%V#0^V20&#
-MX0^(3"0]ZPL/MDD"@^$/B$PD/0^VTHE4)#!KPER-A`5``0``B40D.`^V1R0\
-M&@^$!P8``#P:=Q\\$G11/!6-="8`#X28!@``A,`/A*4%``")]NF[!@``/"4/
-MA.`"```\)9!W$SP;#X6F!@``C;8`````Z74%```\G@^$S0,``#R@D`^%B@8`
-M`.EB!@``A-N-=@`/A8,"``"+3S2`?R4`C78`=&&%R71+@'D!@'5%@'D"`'4_
-M#[9!`SP\=S</MMB-5E"X`````,8$$""#P`&#^!1U](/[$W8%NQ0```"-5E"-
-M002)7"0(B40D!(D4).C\____9L>&E```````QD8F&>D-!@``QD8F&/9!!D!U
-M$0^V`8/@'X/X#0^%8P$``.L+#[8!@^`?@_@-=0G&1B4-C78`ZP3&1B4B#[9&
-M)8E$)`3'!"1@`0``Z/S___^#?U``=`^-1U")1"0$B2PDZ/S___^)?"0$B2PD
-MZ/S___]K1"0P7("\!4H!````#X3"!0``O@````")PXV\!7@!``")/"3H_/__
-M_XT4*XN*?`$``(F"?`$``(DXB4@$B0$/MD`E/")T!#P-=0Z#Q@&)\CB4'4H!
-M``!WR&M$)#!<#[:$!4H!``")\3C(#X5E!0``A,`/A%T%``"^`````&;'1"0^
-M``#'1"1``````&M<)#!<C;P=>`$``(D\).C\____B<&-!"N+D'P!``")B'P!
-M``").8E1!(D*#[9!)3PB=`0\#744#[=!'&8[1"0^<@EFB40D/HE,)$"#Q@&)
-M\#B$'4H!``!WLH-\)$``#X3D!```BU0D0(!Z)O\/A-8$``#&0B;_B50D!(DL
-M).C\____Z<$$``"#^`%U$<9&)0'&1B;_C70F`.E[!```]D$%`70&9H%..``$
-MBU\TA=MT6XU69+@`````Q@00`(/``8/X*'7TC9:,````L`#&!!``@\`!@_@(
-M=?2-3F2-4PB+0PB)1F2+0@2)002+0@B)00B+0@R)00R+0A")01"+0A2)012+
-M0R")AHP```"#OAP!````#X4`!```QD8F'.GW`P``#[=$)#:#P`%FB8:4````
-MQP0D$"<``.C\____QD8F!>G3`P``BT\TA-L/A9`````/ME$&P>((#[9!!<'@
-M$`G"#[9!!PG"#[9!!,'@&`G"B9:P````#[81P>(8#[9!`PG"#[9!`L'@"`G"
-M#[9!`<'@$`G0B49$QT9(`````(.^L`````!U'6:#AI0````!QP0D$"<``.C\
-M____QD8F&^E5`P``@_C_=0]F@4XX``3&1B8;Z4$#``#&1B8-Z3@#``"`^R!U
-M,X!\)#T&=`>`?"0]`G4E#[=$)#:#P`%FB8:4````QP0D$"<``.C\____QD8F
-M!>D!`P``D(-_4`!T#XU'4(E$)`2)+"3H_/___XE\)`2)+"3H_/___XET)`B+
-M3"0XB4PD!(DL).C\____Z?8"``"+1S2)1"1$A-L/A1\!```/ME`*P>((#[9`
-M"<'@$`G"BTPD1`^V00L)P@^V00C!X!@)PHF6L`````^V00.)PK@`````B40D
-M*(E4)"P/MD$"B<*X`````,'B"(M,)"@)P8M<)"P)TXM$)$0/M@")1"0@QT0D
-M)`````"+1"0@B<*X`````,'B&`G!"=.+1"1$#[9``8E$)!C'1"0<`````(M$
-M)!B)PK@`````P>(0"<$)TXM$)$0/ME`&P>((#[9`!8E$)!C!X!`)PHM$)$0/
-MMD`'"<*+1"1$#[9`!(E$)!C!X!@)P@G*B59$B5Y(BU0D1/9"#`%T!6:#3CH$
-M@[ZP`````'4=9H.&E`````''!"00)P``Z/S____&1B8;Z:8!``!F@TXX`<9&
-M)@WIF`$``(#[('4S@'PD/09T!X!\)#T"=24/MT0D-H/``6:)AI0```#'!"00
-M)P``Z/S____&1B8;Z6$!``"0@W]0`'0/C4=0B40D!(DL).C\____B7PD!(DL
-M).C\____B70D"(M,)#B)3"0$B2PDZ/S____I5@$``,9&)A3I'0$``(#[('4X
-M@'PD/0:-=@!T!X!\)#T"=2</MT0D-H/``6:)AI0```#'!"00)P``Z/S____&
-M1B84Z>,```"-=@#&1B8;Z=<```"$VY"-="8`=5R+1S1F@TXX`F:#3CH!9H%.
-M.(0`@'@#`'4%@#@6=QUF@X:4`````<<$)!`G``#H_/___\9&)@WIDP```/9`
-M!@1T!V:#3CH"ZP5F@V8Z_8M'4(E&&,='4`````#K.H#[('4P@'PD/09T"(!\
-M)#T"D'4F#[=$)#:#P`%FB8:4````QP0D$"<``.C\____QD8F!>L]9H-F./G&
-M1B8.ZS*$VW4%9H-..@/&1B8/ZR.$VY!U#(E\)`2)+"3H_/___X.^'`$```$9
-MP(/@$X/`!8A&)H-_4`!T#XU'4(E$)`2)+"3H_/___XE\)`2)+"3H_/___XET
-M)`2)+"3H_/___XUV`(M<)$R+="10BWPD5(ML)%B#Q%S#D)"0D)"0D)"0D)"0
-M@^$'P>$(@,T@BT`$+>0\```/MM+!X@@!T(D(#[<`9J,`````#[;`PY"-M"8`
-M````@^$'P>$(BDPD!(#-$(M`!"WD/```#[;2P>((`=")",-55U93@^P(B<?&
-M1"0"`,9$)`,`O?_____'1"0$``````^V1"0$B$0D`8-$)`0!N`$```")Q@^V
-M3"0$T^:)\;L`````N,#AY`"Z`````/?Q.?AW'8GZ*<*)T#GJ<Q,/ME0D`8A4
-M)`*(7"0#B<6-="8`@\,!`?&#^Q!UR8-\)`0(=9\/MD0D`\'@`PI$)`(/ML"#
-MQ`A;7E]=PY"-M"8`````@^P,B5PD!(ET)`B+7"00#[9T)!3'!"0`````N0<`
-M``")\HG8Z!?___\/MH,="P``B00DN0,```")\HG8Z/_^__^+7"0$BW0D"(/$
-M#,.-=@!3B=,/MM&Y`P```.BP_O__.-@/E,`/ML!;PXVV`````%.+7"0(A=MT
-M+[H`````B?8/MH0:,@4```^VR#S_=!$/M\%IP+`````#@XP%``#K#8/"`8/Z
-M!'78N`````!;PY!64X/L!(M$)!"+F$`%``"%VW4"B<.^`````,<$)`````"Y
-M!P```(GRB=CH8?[__\<$)$0```"Y`@```(GRB=CH3/[__\<$)-````"Y````
-M`(GRB=CH-_[__\<$)`````"Y!````(GRB=CH(O[__X/&`8/^`G6DN*"&`0#H
-M,/[__XB#'0L```^VP(D$)+D#````N@````")V.CS_?__@\0$6U[#C;8`````
-MC;PG`````(/L/(E<)"R)="0PB7PD-(EL)#B+5"1`#[:"I0```#P"#X7J````
-MBXJH````B4PD%&;'1"0:``"]````*L=$)!P`````NP````"^`````+\$````
-MN@$```")T(G9T^"%1"04=1R-2P;3XF8)5"0:"50D'+@5````B?'3X`G%ZPF0
-MB?B)\=/@"<6#PP&#Q@6#QP.#^P5UO8M$)!R)1"0,QT0D"*@#``#'1"0$`0``
-M`(M4)$")%"3H_/___XEL)`S'1"0(Q`,``,=$)`0!````BTPD0(D,).C\____
-M#[=$)!J+5"1`"X*H````B40D#,=$)`B@`P``QT0D!`$```")%"3H_/___^G]
-M````C;8`````/`,/A>\```"+3"1`BXFH````B4PD*&;'1"0B``"]````*L=$
-M)"0`````NP````"^`````+\$````C;0F`````+H!````B=")V=/@A40D*'4?
-MC4L&T^)F"50D(@E4)"2X%0```(GQT^`)Q>L,C70F`(GXB?'3X`G%@\,!@\8%
-M@\<#@_L$=;J+1"0DB40D#,=$)`BH`P``QT0D!`$```"+5"1`B10DZ/S___^)
-M;"0,QT0D",0#``#'1"0$`0```(M,)$")#"3H_/___P^W1"0BBU0D0`N"J```
-M`/?0B40D#,=$)`B@`P``QT0D!`$```")%"3H_/___XM<)"R+="0PBWPD-(ML
-M)#B#Q#S#D(UT)@"#[`R+5"00#[9,)!2`?"08`'0/N/[____3P"&"J````.L-
-MN`$```#3X`F"J````(D4).C\____@\0,PY"-="8`4X/L&(M<)"!FQX.<````
-M`0#'1"00`0````^W1"0DP>`-B40D#,=$)`B@`P``QT0D!`$```")'"3H_/__
-M_\=$)`04````B1PDZ/S___^#Q!A;PXVT)@````"-O"<`````@^P,BU0D$`^V
-M3"04@'PD&`!U$+C^____T\!F(8*0````ZPZX`0```-/@9@F"D`````^W@I``
-M``")1"0$B10DZ/S___^#Q`S#D(VT)@````"#[!R)7"00B70D%(E\)!B+1"0D
-M#[9\)"@/MK"8````#[98`HM0:(72=!B)^0^VP8E$)`@/ML.)1"0$B10DZ/S_
-M__^`^P-W#XT4LXGP/`-V$XU4LP3K#8GQC580@/D#=@.-5B")^0^VP8E$)`@/
-MML*)1"0$BT0D((D$).C\____BUPD$(MT)!2+?"08@\0<PY!75E.#[!")Q[L`
-M````#[;RN0(```")\HGXZ/+Y__^H"'0.N`````#K(XVT)@````#'!"0!````
-MZ/S___^#PP&!^Q`G``!UR;C_````@\006UY?PXVV`````(V\)P````"#[`R)
-M'"2)="0$B7PD"(G&B<\/MMJ)VNB$____A<!U,(GX#[;0B=F)\.C"^O__A<!T
-M'KD!````B=J)\.AP^?__BU0D$(@"N`````#K"(UV`+C_____BQPDBW0D!(M\
-M)`B#Q`S#C;8`````C;\`````@^P<B5PD$(ET)!2)?"08B<8/MOD/MMJ)/"2Y
-M`0```(G:Z$KY___'!"1`````N0(```")VHGPZ#7Y__^)VHGPZ.S^__^%P'5.
-M@WPD(`!T-??'`0```'09B=FZ0````(GPZ!OZ__^%P'0MZS*0C70F`(G9NA@`
-M``")\.@"^O__A<!T%.L9B=FZ*````(GPZ.[Y__^%P'4'N/\```#K!;@`````
-MBUPD$(MT)!2+?"08@\0<PXVT)@````"-O"<`````55=64X/L#(G'BVPD)(G3
-MB<Z$R0^$Z@````^VVL<$)&0```"Y`@```(G:B?CH?_C__XG:B?CH-O[__X7`
-M=0ZY`P```(G:B?CH-/C__XGP#[;(QP0D`0```(G:B?CHW_[__[[_____A,`/
-MA7<!``"^`````(7M#XYJ`0``O@````"-1?^)1"0(.70D"'4UQP0D0````+D"
-M````B=J)^.@.^/__BT0D(`'PB00DN5@```")VHGXZ!?^__^%P'0YZ2,!``#'
-M!"1$````N0(```")VHGXZ-GW__^+1"0@`?")!"2Y4````(G:B?CHXOW__X7`
-M#X7O````@\8!.>X/A.0```#KA+B@A@$`Z,/W__\/MML/ML")!"2Y`P```(G:
-MB?CHC/?__XG:B?CH0_W__X7`="(/MH<="P``B00DN0,```")VHGXZ&?W__^^
-M_____^F2````B=FZ8````(GXZ%_X__^%P'0-O@````"%[7Y?B?;K'P^VAQT+
-M``")!"2Y`P```(G:B?CH)O?__[[_____ZU2^`````,<$)$0```"Y`@```(G:
-MB?CH!??__XM$)"`!\(D$)+F`````B=J)^.@._?__A<!U!X/&`3GN=<D/MH<=
-M"P``B00DN0,```")VHGXZ,OV__^)\(/$#%M>7UW#D(/L'(E<)!2)="08BW0D
-M(`^V3"0DBT0D+(E$)`2+1"0HB00DN@$```")\.CA_?__B</'!"14````N0(`
-M``"Z`0```(GPZ'?V__^)V(M<)!2+="08@\0<PXGVC;PG`````(/L'(E<)!2)
-M="08BW0D(`^V3"0DBT0D+(E$)`2+1"0HB00DN@````")\.B!_?__B</'!"14
-M````N0(```"Z`````(GPZ!?V__^)V(M<)!2+="08@\0<PXGVC;PG`````%57
-M5E.#[`R)QXML)"2)RP^V\L<$)&0```"Y`@```(GRZ-OU__^)\HGXZ)+[__^%
-MP'4.N0,```")\HGXZ)#U__\/MLO'!"0!````B?*)^.@]_/__A,!U+H7M?C&[
-M`````(M$)"`/M@P#QP0D`````(GRB?CH&/S__X3`=0F#PP$YZW0)Z]NX____
-M_^L%N`````"#Q`Q;7E]=PXVT)@````"#[!R)7"04B70D&(MT)"`/MDPD)(M$
-M)"R)1"0$BT0D*(D$)+H`````B?#H,?___XG#QP0D5````+D"````N@````")
-M\.@7]?__B=B+7"04BW0D&(/$',.)]HV\)P````"#[!R+3"0@#[94)"2+@4`%
-M``"%P'4"B<B(%2````#'1"0,(````,=$)`@@````QT0D!`X```")!"3H_/__
-M_X/$',.-M"8`````C;PG`````(/L#(M4)!`/MDPD%(!\)!@`=!"X`0```-/@
-M9@F"K`P``.L.N/[____3P&8A@JP,```/MH*L#```B40D!(D4).C\____@\0,
-MPY"-M"8`````55=64X/L3(M$)&2+2!B#P0&+4!"#Z@&)5"0DQT0D2`````"+
-M6!R)7"0H#[91`8#Z`74-QT`L`````.GE!```D(#Z`G50@'D"`74ZBW0D8(N&
-M0`4``(7`=0*)\(N`/`4```^V40.(D*X,```/ME$#B)!N&0``BT0D9,=`+```
-M``#IGP0``(M4)&3'0BS^____Z8\$``"`^@0/A3("```/MD$#@^@[/`$/AR,"
-M``"+3"1DBUD8@\,!B5PD.`^V<P*+1"1@BY@\!0``B?(/ML*)1"0$B1PDZ/S_
-M__^)PH3`=`T/ML"`O`.P!```_W56BYL\!0``@</`#```BX,\!0``B00DZ/S_
-M__^)\2C!#[;!B40D!(D<).C\____B<*$P'0-#[;`@+P#L`0``/]U%HM<)&3'
-M0RS_____B1PD_U,HZ?P#```/ML(/MH0#L`0``(#Z@7=F#[;(:<D4#0``BT0D
-M.`^V0`2(1"0WBW0D.`^V5@7!XA`/MD8&P>`("<(/MD8'"<*)5"0L#[96",'B
-M$`^V1@G!X`@)P@^V1@H)PHE4)#")S@.SJ`4```^$!P$``(!^,`!U&^G\````
-MBT0D9,=`+/____^)!"3_4"CI<`,``+\`````QD0D-@"-;BB+5"0X@\(+B50D
-M'(DL).C\____C5CXBU8LB48LB6L(B5,,B0(/MD,E/`UT"#PB#X6,````BTPD
-M.`^V00,\.W0T/#QU?(M$)&2)1"00BU0D+(E4)`R+3"0PB4PD"`^V1"0WB40D
-M!(D<).C\____QD0D-@'K3(N#Z````(M4)"R)5"0(BTPD'(E,)`2)!"3H_/__
-M_XM$)&2)1"00BU0D+(E4)`R+3"0PB4PD"`^V1"0WB40D!(D<).C\____QD0D
-M-@&#QP&)^SA>,`^'/?___X!\)#8`#X6*`@``BW0D9,=&+/____^)-"3_5BCI
-M=`(``)"-="8`@/H##X6X````@'D"`8UV``^%FP```(M4)&`/MD(FC30`#[99
-M`XG:B=C!^A_W_HG3.=9^;8UY!`^V\@^V002)1"0(B70D!(M,)&")#"3H_/__
-M_XU#_(/X`W88C4/T@_@#=A"-0^R#^`-V"(U#Y(/X`W<(@40D8,`,```/M@>)
-M1"0(B70D!(M<)&")'"3H_/___XMT)&3'1BP`````Z;,!``"+1"1DQT`L_O__
-M_^FC`0``BU0D9,="+/[____IDP$``(`Y!79*@'D$_G5$C40D2(E$)`B+3"1D
-MB4PD!(M<)&"+@SP%``")!"3H_/___X3`#X5>`0``QT0D2`````"+="1DQT8L
-M_____^E&`0``B?:+1"1@BZA`!0``A>UU`HG%B<NX`@```"G(B40D(.F3````
-M#[8SC7H!#[;(]L$!=$"+5"1(C006BUPD9#M#%`^'W0```(ET)`2+1"0H`=")
-M!"2Z`````(GHZ'/W__\Y\`^%O`````%T)$B)^^M(C78`C1PWBT0D(`'8.T0D
-M)`^/G@```(ET)`2)/"2Z`````(GHZ.KY__^%P`^%@P```(`[`'4&@'L!`'0,
-MQP0D$"<``.C\____C5,!#[9#`83`#X5>____#[8#A,!T80^VV,<$)%0```"Y
-M`@```+H`````B>CHFN___XM4)$B+="1DBT84*=`YPW8"B<.)7"0$BT0D*`'0
-MB00DN0````"Z`````(GHZ+GV__^%P'@&`40D2.L+BT0D9,=`+/_____'!"14
-M````N0(```"Z`````(GHZ#SO__^+3"1DBU$@A=)T!HM$)$B)`HM<)&2)'"3_
-M4RB#Q$Q;7E]=PXGVC;PG`````(/L'(M4)""+@D`%``"%P'4"B="+D#P%```/
-MMH*O#```A,!T#8/H`8B"KPP``(3`=2?&!2,`````QT0D#"````#'1"0((```
-M`,=$)`0.````B10DZ/S___^#Q!S#C70F`(/L'(M4)""+@D`%``"%P'4"B="+
-M@#P%``"`N*X,````=2Z`@*\,```!Q@4C`````<=$)`P@````QT0D""````#'
-M1"0$#@```(D$).C\____@\0<PXVV`````(V_`````(/L'(E<)!2)="08BW0D
-M(`^V3"0DBT0D+(E$)`2+1"0HB00DN@````")\.@A^/__B</'!"14````N0(`
-M``"Z`````(GPZ`?N__^)V(M<)!2+="08@\0<PY"0D)"0D)"0D(M$)`2+0`0M
-M``(!``-$)`B+`*,`````PY"-M"8`````BT0D!(M`!"T``@$``T0D"(M4)`R)
-M$,.)]HV\)P````!3@^P,BUPD%(M3!('J``(!`,>"@``!``````"+@@0!`0"C
-M`````(#,`8F"!`$!`,=$)`@(````QT0D!`S"``")'"3H_/___\=$)`BX"P``
-MQT0D!`C"``")'"3H_/___\=$)`@!```\QT0D!`#"``")'"3H_/___\=$)`@(
-M````QT0D!`S#``")'"3H_/___\=$)`BX"P``QT0D!`C#``")'"3H_/___\=$
-M)`@!```\QT0D!`##``")'"3H_/___\=$)`B`@("`QT0D!#C"``")'"3H_/__
-M_\=$)`@(&"@XQT0D!"#"``")'"3H_/___\=$)`B`@("`QT0D!#S"``")'"3H
-M_/___\=$)`@)&2DYQT0D!"3"``")'"3H_/___\=$)`B`@("`QT0D!$#"``")
-M'"3H_/___\=$)`@*&BHZQT0D!"C"``")'"3H_/___\=$)`B`@("`QT0D!$3"
-M``")'"3H_/___\=$)`@+&RL[QT0D!"S"``")'"3H_/___\=$)`B`@("`QT0D
-M!$C"``")'"3H_/___\=$)`A(24I+QT0D!##"``")'"3H_/___\=$)`B`@("`
-MQT0D!#C#``")'"3H_/___\=$)`@,'"P\QT0D!"##``")'"3H_/___\=$)`B`
-M@("`QT0D!#S#``")'"3H_/___\=$)`@-'2T]QT0D!"3#``")'"3H_/___\=$
-M)`B`@("`QT0D!$##``")'"3H_/___\=$)`@.'BX^QT0D!"C#``")'"3H_/__
-M_\=$)`B`@("`QT0D!$3#``")'"3H_/___\=$)`@/'R\_QT0D!"S#``")'"3H
-M_/___\=$)`B`@("`QT0D!$C#``")'"3H_/___\=$)`A,34Y/QT0D!###``")
-M'"3H_/___\=#/("`@(#'0T"`@("`QT-$@("`@,=#2("`@(#'0TR`@("`@</`
-M#```QT,\@("`@,=#0("`@(#'0T2`@("`QT-(@("`@,=#3("`@("#Q`Q;PXM$
-M)`2+4`2!Z@`"`0"+@FP``0"C`````(F";``!`,.0BT0D!(M0!('J``(!`(N"
-M:``!`*,`````"T0D"(F":``!`,.-M@````"-O"<`````@^P@B5PD$(ET)!2)
-M?"08B6PD'(MT)"0/ME0D*`^V?"0L.;8\!0``#X4(`0``B=#`Z`*]``````^V
-MP(E$)`R)T/?0@^`#C1S%`````+@'````B=G3X/?0BTPD#(M4CCPAPHE4CCR)
-M^(3`=!.X`0```(G9T^`)T(M4)`R)1)8\B>D/MMG!XPB+1CR)1"0(C8,XP@``
-MB40D!(N&/`4``(D$).C\____BT9`B40D"(V#/,(``(E$)`2+ACP%``")!"3H
-M_/___XM&1(E$)`B-@T#"``")1"0$BX8\!0``B00DZ/S___^+1DB)1"0(C8-$
-MP@``B40D!(N&/`4``(D$).C\____BT9,B40D"('#2,(``(E<)`2+ACP%``")
-M!"3H_/___XM<)!"+="04BWPD&(ML)!R#Q"##B=#`Z`*#Z`6]`0```.GP_O__
-MB?:-O"<`````55=64X/L'(M\)#`/MD0D-(A$)!L/ME0D.(A4)!H/MFPD/(M'
-M"(LPB30DZ/S___^)PX7`#X3X````B30DZ/S___^)PH7`#X3F````QD<T`<9#
-M).'&0R4!QD,F$,9#%;L/MD<S9HE#$(ES&,=#()````"-0@B)0S2)4U")P8G"
-MN`````#&!!``@\`!/9````!U\L9!`8+&`4`/MD0D&XA!`@^V5"0:B%$#B>B(
-M000\`G<CC4$(B>D/MM'!X@*-CG@+``")5"0(B4PD!(D$).C\____ZS>+AG@+
-M``")00B+AGP+``")00R#P1")Z@^VPHT$A?C___^-EH`+``")1"0(B50D!(D,
-M).C\____QT-L`````,=$)`0`````C4,\B00DZ/S___^)7"0$B30DZ/S___^#
-MQ!Q;7E]=PXVT)@````"#["R)7"0<B70D((E\)"2);"0HBWPD,(ML)#2+1"0X
-MB40D&(M4)#R)5"04BT<(BS")-"3H_/___XG#A<`/A(````")-"3H_/___XG"
-MA<!T<L9'-`'&0R3AQD,E`<9#)A#&0Q6[#[9',V:)0Q")<QC'0R"0````C4((
-MB4,TB5-0QD`!`L9""$")ZHA0`@^V5"08B%`##[94)!2(4`3'0VP`````QT0D
-M!`````"-0SR)!"3H_/___XE<)`2)-"3H_/___XM<)!R+="0@BWPD)(ML)"B#
-MQ"S#C78`C;PG`````%575E.#[!R+="0P#[9L)#0/MD0D.(A$)!N+1@B+&,=$
-M)`P"````QT0D"`````#'1"0$`````(DT).C\____@'XT`'0:B1PDZ/S____'
-M!"0!````Z/S___^`?C0`=>:+1@B+``5X"P``@'@"`'A$@$@"@,=$)`P!````
-MQT0D"`````#'1"0$`````(DT).C\____@'XT`'0:B1PDZ/S____'!"0!````
-MZ/S___^`?C0`=>:)Z,#H`@^V^,=$)`P!````B7PD",=$)`0#````B30DZ/S_
-M__^`?C0`=!Z-="8`B1PDZ/S____'!"0!````Z/S___^`?C0`=>:+1@B+&(GI
-M]]&#X0.`?"0;``^5PL'B`P^VA`MX"P``@^#G"="(A`MX"P``QT0D#`$```")
-M?"0(QT0D!`,```")-"3H_/___X/$'%M>7UW#C;0F`````(/L'(E<)`R)="00
-MB7PD%(EL)!B+7"0@BW0D)`^W1A!F/84`=QN+JZ@%```/M\`/MH0#L`0``&GX
-M%`T``.L-B?:+JZ@%``"_[`8-`(M&-(!X`0)U)(V+>`L``(U0!(M`!(F#>`L`
-M`(M"!(E!!(M""(E!"(M"#(E!#(M&4(7`=`R)1"0$B1PDZ/S___^)="0$B1PD
-MZ/S____&1#TT`(M<)`R+="00BWPD%(ML)!B#Q!S#@^P0B1PDB70D!(E\)`B)
-M;"0,BTPD%(MT)!B+5"0<BUPD((NY<`4```^W1A"]V"8!`&8]A0!W$0^WP`^V
-MA`&P!```:>@H`0``C8H@!```QH(@!```)V:!?B3A`74C#[96)HU"_SP!=PD/
-MME8G@^(/ZR2-0N^Z#P```#P!=AB-=@"-!"^Z`````(-X-`!T!P^V4$V#X@\/
-MMD$!@^#P"="(00&X`0```&:!?B3A`742#[9&)H/H`3P!#Y?`#[;`C78`B<+!
-MX@</MD$!@^!_"="(00$/MD,&B$$"#[8#B$$##[9#!8A!!P^V0P>(00\/MD,"
-MB$$$#[9#`XA!!0^V0P2(008/MD,!B$$,#[9#"HA!"`^V0PN(00D/MD,,B$$*
-M#[9#"(A!"P^V0PF(00V+'"2+="0$BWPD"(ML)`R#Q!##B?8/MD0D!,.-=@"-
-MO"<`````#[9$)`7#C78`C;PG`````%.+5"0(BUPD$,9"%`*+2CB+1"0,B$$"
-MBT(XQD`'`(M".(A8#%O#C78`C;PG`````(M4)`2+3"0(#[9"*8A!`@^V0BB(
-M00,/MD(GB$$$#[9")HA!"L.-="8`C;PG`````(M4)`2+3"0(#[9"+8A!`@^V
-M0BR(00,/MD(KB$$$#[9"*HA!"@^V0BF(00L/MD(HB$$,PXVV`````(V\)P``
-M``"+3"0,A<E^';H`````C78`B<@IT(/X`@^=P`^VP(U4`@$YT7_K\\.)]HV\
-M)P````"#[!R)7"0,B70D$(E\)!2);"08BUPD((MT)"@/MD0D)(A$)`L/MD,D
-M/"IT)CPJ=Q`\*`^%V````.L8C;8`````/(AT)#R*#X7$````C70F`.L6#[9[
-M+`^V:RN)="0$B1PDZ/S____K%`^V>S$/MFLPB70D!(D<).C\____QD8%0(M#
-M9*D```$`="R)^(@&B>B(1@@/MD0D"\'@`XA&`0^V0R0\*'0$/(AU!L9&!F#K
-M8,9&!F'K6JD```0`D(UT)@!T(HGXB$8!B>B(1@D/MD,D/"AT!#R(=0;&1@8E
-MZS+&1@8UZRR)^(A&`0^V0R:#X`\(1@4/MD,D/"AT!#R(=0;&1@;(ZPO&1@;*
-MC;0F`````(M<)`R+="00BWPD%(ML)!B#Q!S#C;8`````C;\`````@^P,BTPD
-M$`^V028*02<*02@*02D/ML`/ME$L@^(!"=!T'L=$)`@D````QT0D!`4```")
-M#"3H_/___^L3C70F`(M$)!3&0`;LQT%L`````(/$#,.-M@````"-O"<`````
-M@^P8B5PD"(ET)`R)?"00B6PD%(M<)!R+="0@#[9#)#PO=`T\CW5@ZQV-M"8`
-M````#[9[+`^V:RN)="0$B1PDZ/S____K%`^V>S$/MFLPB70D!(D<).C\____
-MQD8%0/9#9@1T$(GXB$8!B>B(1@G&1@9"ZQ.)^(A&`0^V0R:#X`\(1@7&1@9`
-MBUPD"(MT)`R+?"00BVPD%(/$&,.0C70F`%.#[`R+3"08BU0D',9"!4`/MD$D
-M/#5T"#R1=2KK(HGVBUPD%`^W0SB#X`&#^`$9P(/@_8/H%HA"!NLED(UT)@#&
-M0@;JZQK'1"0()````,=$)`0%````B0PDZ/S____K"O9!)0)T!,9!%`"#Q`Q;
-MB?;#ZPV0D)"0D)"0D)"0D)"0@^P,BT0D$/9`*/!T&,=$)`@D````QT0D!`4`
-M``")!"3H_/___X/$#,.-M"8`````4X/L$(M<)!R+3"0D#[9$)""Z`````,8$
-M"@"#P@&#^@UU]`^V4R2`^C4/A*\```"`^C5W-(#Z*'1L@/HHC70F`'<3@/H;
-M#X6:`P``D(UT)@#IJ@```(#Z*G1+@/HOC78`#X5_`P``ZUV`^H^0C70F`'13
-M@/J/=Q&`^HAT*8#ZBI`/A5\#``#K'8#ZD9"-="8`=$R`^N$/A4H#``"0C70F
-M`.F2````B4PD"`^VP(E$)`2)'"3H_/___\=$)`P!````Z2@#``")3"0$B1PD
-MZ/S____'1"0,`0```.D/`P``B4PD"(E<)`2+1"08B00DZ/S____'1"0,`0``
-M`.GN`@``]D,H`70AQD$&<,9!!`#&00,`QD$"`,9!!4#'1"0,`0```.G'`@``
-MQD$&X,=$)`P!````Z;8"``"`>R4!#X6D`@``@'LF'`^'F@(```^V0R:0_R2%
-M,`D``,9!!P3'1"0,`0```.F%`@``QD$'`,=$)`P!````Z70"``#&00;LQT0D
-M#`$```#I8P(``,9!!N_&`0,/MD,G@\A`B$$!QT0D#`$```#I10(``,9!!N_&
-M`0?'1"0,`0```.DQ`@``QD$&0,9!`0'&005`QT0D#`$```#I&`(``,9!!N_&
-M`0,/MD,G@\@(B$$!QT0D#`$```#I^@$``,9!!N_&`0+'1"0,`0```.GF`0``
-MQD$&[\8!@L=$)`P!````Z=(!``#&00;OQ@$&QT0D#`$```#IO@$``,9!!N_&
-M`8;'1"0,`0```.FJ`0``QD$&XP^V0R>(00''1"0,`0```.F2`0``QD$&L,8!
-MV,9!`T_&003"QT0D#`$```#I=@$``,9!!K#&`=G&00-/QD$$PL=$)`P!````
-MZ5H!``#&00:PQ@':QD$#3\9!!,+'1"0,`0```.D^`0``BT0D&/9`.`%T$<9!
-M!NK'1"0,`0```.DC`0``QD$&Y\=$)`P!````Z1(!``#&00;OQ@&JQT0D#`$`
-M``#I_@```,9!!N_&`57'1"0,`0```.GJ````QD$&+\9!`0'&00(0QT0D#`$`
-M``#IT0```,9!!N0/MD,HB`$/MD,IB$$(#[9#)XA!!<=$)`P!````Z:P````/
-MMD,GB$$&#[9#*(@!#[9#*8A!`@^V0RJ(00,/MD,KB$$$#[9#+8A!"@^V0RR(
-M00''1"0,`0```.MRQD$&Z`^V0RB(`0^V0RF(00@/MD,GB$$%#[9#*HA!`@^V
-M0RN(00,/MD,LB$$$#[9#+8A!`<=$)`P!````ZS3'1"0,`0```/9#*`%T)L9!
-M!G#&000`QD$#`,9!`@#&005`QT0D#`$```#K",=$)`P`````BT0D#(/$$%O#
-MC78`C;PG`````(/L/(E<)"R)="0PB7PD-(EL)#B+;"1$BW4TC7PD#/RY"```
-M`+@`````\ZOVAJ<````$=!2+CL@```"+GLP```"#P?^#T__K#8M&>(/H`8G!
-MNP````"`?20E=6>)R`^LV!B(1"0,B<@/K-@0B$0D#8G(#ZS8"(A$)`Z(3"0/
-M]H;5````$'44QD0D$@+&1"03`+D(````Z:D```"-5"00QT0D"`0```"-ANH`
-M``")1"0$B10DZ/S___^Y"````.F!````B=C!Z!B(1"0,B=C!Z!"(1"0-B=C!
-MZ`B(1"0.B%PD#XG(#ZS8&(A$)!")R`^LV!"(1"01B<@/K-@(B$0D$HA,)!/V
-MAM4````0=13&1"06`L9$)!<`N2````#K)HUV`(U4)!3'1"0(!````(V&Z@``
-M`(E$)`2)%"3H_/___[D@````BU4TC40D#(E,)`B)1"0$B10DZ/S___^+7"0L
-MBW0D,(M\)#2+;"0X@\0\PXGV5E.#[!2+3"0@BUPD)(M1+(LR#[9#)#PO=&@\
-M+W<T/!L/A#(!```\&W<./!*-="8`#X4Z`0``ZTH\*(VV`````'1`/"H/A28!
-M``"-M@````#K,#R*="P\BG<8/#6-="8`#X3R````/(@/A0(!``")]NL0/(]T
-M##SA#X7R````B?;K=?9!.`%T!X%+9```!`#V03H0#X3^````@WDT`(UV``^%
-M\0````^V0R0\*'00/"IT##R(=`@\B@^%V0```/9""`%U&`^V0@2)1"0$B30D
-MZ/S___^$P`^$NP```(![%($/A+$```"!2V0```$`N`$```#IJ0```(![)0$/
-MA8\```"`>R8<#X>%````#[Y+)K@!````T^"I]C_`'74EJ0A`!@!U#JD``"``
-M=2*0C70F`.M>@TMD"+@!````D(UT)@#K7H-+9`&X`0```.M3@TMD(+@!````
-MZTCV03@!=`>!2V0```0`@TMD`;@!````ZS"+0V2I```@`'06]D$X`707#0``
-M!`")0V2X`0```.L1D+@`````ZPFX`0```(UT)@"#Q!1;7L.0D)"0D)"0D)"0
-M@^P(B1PDB70D!(G3BW0D%(M0!`^V1"00P>`$#[;)P>$("<&`?"0,`'0#@\D$
-M@_[_=!")\"7__P,`B8($QO__@\D"B0N+'"2+="0$@\0(PY"+0`0M``(!`(/*
-M`8F0`,@``,.-M"8`````C;PG`````%=64X/L$(G7BT`$A=)T2HVP`,;__XN`
-M`,;__Z,`````NP````"H`742ZR>0C70F`(L&HP````"H`707QP0D"@```.C\
-M____@\,!.?MUXHGVZP>X`````.L%N/____^#Q!!;7E_#C70F`(V\)P````!6
-M4X/L)(M<)##'1"0@`````(MS!,:#L`P````/M@T(````C50D(,=$)`@`````
-MQT0D!`(```#'!"0!````B=CHW/[__XM4)"")V.@A____NJ"&`0")V.@U____
-MA<!U1XN&#,;__Z,`````B40D(#T?8P``=3''@Z`,```?8P``QX.D#``````$
-M`,>#J`P``````0#'@[0,````````9K@``.DZ`@``QT0D(`````"+<P3&@[`,
-M```!#[8-&````(U4)"#'1"0(_____\=$)`0"````QP0D`0```(G8Z#_^__^+
-M5"0@B=CHA/[__[H0)P``B=CHF/[__X7`=6>+A@S&__^C`````(E$)"`]'T,`
-M`'0N/1]$``!U2L>#H`P``!]$``#'@Z0,``````<`QX.H#``````!`.F$`0``
-MC70F`,>#H`P``!]#``#'@Z0,``````0`QX.H#``````!`.E=`0``QT0D(```
-M``"+<P3&@[`,````#[8-*````(U4)"#'1"0(`````,=$)`0"````QP0D`0``
-M`(G8Z(+]__^+5"0@B=CHQ_W__[H0)P``B=CHV_W__X7`=4>+A@S&__^C````
-M`(E$)"`]OT,``'4QQX.@#```OT,``,>#I`P`````(`#'@Z@,````$```QX.T
-M#```(````&:X``#IX````,=$)"``````BW,$QH.P#`````^V#3@```"-5"0@
-MQT0D"`````#'1"0$`@```,<$)`$```")V.CE_/__BU0D((G8Z"K]__^Z$"<`
-M`(G8Z#[]__^%P'5?BX8,QO__HP````")1"0@/>\1``!T"3WO$@``=4+K(,>#
-MH`P``.\1``#'@Z0,``````0`QX.H#``````!`.L\QX.@#```[Q(``,>#I`P`
-M````"`#'@Z@,``````$`ZQRX_____^LDC70F`,>#M`P``!````"X`````.L/
-MQX.T#```,````+@`````@\0D6U[#C78`C;PG`````(/L/(E<)"R)="0PB7PD
-M-(EL)#B)QHG7B4PD&(MH!`^V1"1`/`1V!;@$````#[;8BX:T#```#[9(!(U4
-M)"B)?"0(B5PD!,<$)`$```")\.C=^___BU0D*(GPZ"+\__^Z$"<``(GPZ#;\
-M__^Z_____X7`=1J+A0S&__^C`````(E$)"B+5"08B0*Z`````(G0BUPD+(MT
-M)#"+?"0TBVPD.(/$/,.-M@````"-O"<`````4X/L*(M<)#"+@[0,```/MD@+
-MC50D)(M$)#2)1"0(QT0D!`$```#'!"0!````B=CH3/O__XM4)"2)V.B1^___
-MNA`G``")V.BE^___NO____^%P'4:BT,$+?0Y``"+`*,`````BU0D.(@"N@``
-M``")T(/$*%O#C70F`(V\)P````!55U93@^PLB<.(5"0;B<V#?"1```^$DP``
-M`+X`````D(M[!(N#M`P```^V2`+'1"0(_____\=$)`0!````QP0D`0```(U4
-M)"B)V.BQ^O__BU0D*(G8Z/;Z__^Z$"<``(G8Z`K[__^%P'4JBY<,QO__B14`
-M````#[9$)!LAT(GI.,AU#;@`````ZRB-M@````")5"0HQP0D"@```.C\____
-M@\8!.W0D0`^%<____[C_____@\0L6UY?7<.-M@````!3@^PHB<.+@+0,```/
-MM@B-5"0DQT0D"/_____'1"0$`````,<$)`````")V.@/^O__BU0D)(G8Z%3Z
-M__^Z$"<``(G8Z&CZ__^%P'4DQP0DX),$`+D"````N@,```")V.C<_O__N@``
-M``"%P'0(C78`NO____^)T(/$*%O#C70F`(/L+(E<)"2)="0HBUPD,(MT)#3&
-M1"0C_XU$)".)1"0(B70D!(D<).C\____A<!U<H!\)",`='F)V.A"____@_C_
-M=%^+@[0,```/MD@*C50D'(ET)`C'1"0$`````,<$)`````")V.A5^?__BU0D
-M'(G8Z)KY__^Z$"<``(G8Z*[Y__^%P'4<QP0DX),$`+D`````N@,```")V.@B
-M_O__A<!T#KC_____ZPR-M"8`````N`````"+7"0DBW0D*(/$+,/K#9"0D)"0
-MD)"0D)"0D)!55U93@^P\BVPD4`^V1"1@@[VT#`````^$&@,``(M\)%B$P`^$
-M:P$``(-\)%3_=10/MX6@#```9HD'N`$```#I'`,``(-\)%3^=16+A:0,``")
-M![@!````Z0,#``"-=@"#?"14_749BX6H#```B0>X`0```.GG`@``C;0F````
-M`(M$)%P#1"14B40D&#N%I`P```^'GP(``(M<)%2#X_R+5"14@^(#B50D('1N
-MC70D.,<$)`0```")\8G:B>CH_OO__X/#!,=$)!P$````.5PD&',0BT0D("M$
-M)%0#1"08B40D'(M$)"`Y1"0<=BV-#`:)_HM$)!R-5`0XC;8`````#[8!B`:#
-MQ@&#P0$YT77QBT0D'"M$)""-/`>+="08@^;\.?-S),<$)`0```"-3"0XB=J)
-MZ.B'^___BT0D.(D'@\<$@\,$.=YWW#E<)!@/ANT!``"-="0XQP0D!````(GQ
-MB=J)Z.A7^___BTPD&"G9#X3+`0``N@````"-M@`````/M@06B`0Z@\(!.<H/
-MA*X!``#K[(-\)%3_=2F`/P^)]G41QH6Q#````;@!````Z:T!``#&A;$,````
-MN`$```#IG`$``(M4)%R)5"0HB=`#1"14.X6D#```#X=9`0``@+VQ#`````^$
-M3`$``(M$)%2Z`````/>UJ`P``(72#X6<````@+VP#````'08BT0D5(E$)`2)
-M+"3H_/___X7`#X44`0``B>CHAOS__X/X_P^$!`$``(N%M`P```^V2`:-5"0X
-MBT0D5(E$)`C'1"0$`````,<$)`````")Z.B1]O__BU0D.(GHZ-;V__^Z$"<`
-M`(GHZ.KV__^%P`^%N0```,<$)."3!`"Y`````+H#````B>CH6OO__X7`#X69
-M````@WPD7``/A)<```#'1"0D`````(M4)%B+1"0DBS0"B<<#?"14BUT$@>L`
-M`@$`B>CHWOO__XFS",@``(N%M`P```^V2`6)?"0(QT0D!`0```#'!"0`````
-MC50D.(GHZ/#U__^+5"0XB>CH-?;__[H0)P``B>CH2?;__X7`=1S'!"2($P``
-MN0````"Z`0```(GHZ+WZ__^%P'00N`````#K(HGVN`$```#K&8-$)"0$BU0D
-M)#E4)"AVZNE6____D(UT)@"#Q#Q;7E]=PY"0D)"0D)"0N`````##C78`C;PG
-M`````(M4)`2+3"0(N``````Y%=`+``!^-(T44L'B`P^W@AP!``!FB0$/MX(>
-M`0``9HE!`@^V@B0!``"(00@/MH(E`0``B$$)N`$```#SPY"-="8`N(`;``##
-MC78`C;PG`````+B<````PXUV`(V\)P````"X!````,.-=@"-O"<`````5U93
-MBW0D$+L`````OP````"Y``````^VE#$P!0``@/K_=$*-@8````!F/8$`=P6#
-MPP'K,0^VPHN6C`4``&G`L````("\$*4````#=16#QP&-1P.#^`9V#8/#`;\`
-M````ZP.#PP&#P0&#^09UJ8G86UY?PXVV`````(V\)P````!55U93@^P$BVPD
-M&+X`````QP0D`````+N`````#[9$)!R->`&)V0^VA"NP!```//]T26:!^X$`
-M=P>#Q@'K.8GV#[;`BY6,!0``:<"P````@+P0I0````-U&X,$)`&+!"2#P`.#
-M^`9V#X/&`<<$)`````#K`X/&`3GW=!"#PP&!^X8```!UGKD`````B<B#Q`1;
-M7E]=PXUT)@"-O"<`````\\.-M"8`````C;PG`````(M$)`3&@)<`````PXUT
-M)@!64XM<)`RX_P```(7;=$R^_____[F"````C;0F``````^VA!FP!```//]T
-M'P^VP(N3C`4``&G`L`````^VA!"D````B?(XPG8"B<:#P0&!^88```!URHGR
-M#[;"6U[#B?:X`````,.-=@"-O"<`````N`````##C78`C;PG`````(G!B=#`
-MZ`0\"78%@\!7ZP.#P#"(`8G0@^`/@_@)?A&)T(/@#X/`5^L/C;0F`````(G0
-M@^`/@\`PB$$!PXUT)@"#[`B)'"2)="0$B<:)TP^VUNBJ____#[;;@\8"B=J)
-M\.B;____BQPDBW0D!(/$",.+1"0,QT`$`````,<``````+@`````PXGVC;PG
-M`````(M,)`2+06"%P'1%QT`@`````(!(*`3'06``````QT%H`````,=!9```
-M``"+40B#^C]_#XM!;,>$D+`"````````PXM!;,>$D+`!````````\\.-M"8`
-M````C;PG`````(M,)`2+06"%P'1%QT`@`````(!@*/O'06``````QT%H````
-M`,=!9`````"+40B#^C]_#XM!;,>$D+`"````````PXM!;,>$D+`!````````
-M\\.-M"8`````C;PG`````(/L#,<$)(````#H_/___[@`````@\0,PY"-M"8`
-M````5U93@^Q`BT0D4,9$)!AMQD0D&?_&1"0:(\9$)!L4QD0D'#K&1"0=[\9$
-M)!X6QD0D'Y*+L$`%``"%]G4"B<:-1"0@B<+&``"#P`&)TXU,)$`YR'7PQD0D
-M)`''1"0,(````(E4)`C'1"0$#@```(DT).C\____A<!U3,<$)(`:!@#H_/__
-M_\=$)`P@````B5PD",=$)`0/````B30DZ/S___^#^"!U'XUT)#"-?"08N0@`
-M``#\\Z8/E\(/DL"Y`0```#C"=!''!"1T`0``Z/S___^Y``````^VP8/$0%M>
-M7\-55U93@^Q<BT0D<(N0/`4``('"P`P``(E4)#B)P8L`A<!T%BT```(`B0&)
-M1"0$BT$0B00DZ/S___^+7"1PBT,(A<!T#XE$)`2+0Q")!"3H_/___XM4)'"+
-M0@R%P'0/B40D!(M"$(D$).C\____C40D3HE$)#2-1"10B40D,(U$)$J)1"0L
-MC40D3(E$)"B-1"14B40D)(U$)%:)1"0@C40D5XE$)!R-1"12B40D&(U$)%B)
-M1"04C40D2(E$)!"-1"19B40D#(U$)%J)1"0(C40D6XE$)`2+3"1P#[=!)(D$
-M).C\____BUPD<(N#<`4``(7`=#")1"0$B=@%6`4``(D$).C\____BU0D.(N"
-M<`4``(E$)`2)T`58!0``B00DZ/S___^+3"1PBX&,!0``A<!T,(E$)`2)R`5T
-M!0``B00DZ/S___^+7"0XBX.,!0``B40D!(G8!70%``")!"3H_/___XM4)'"+
-M@J@%``"%P'0PB40D!(G0!9`%``")!"3H_/___XM,)#B+@:@%``")1"0$B<@%
-MD`4``(D$).C\____BUPD<(N#X`8``(7`=#")1"0$B=@%R`8``(D$).C\____
-MBU0D.(N"X`8``(E$)`2)T`7(!@``B00DZ/S___^`?"1;`'1:O@````"+;"1P
-M@<4`!P``BWPD.(''``<``(UV``^WWHM,)'"+A)D8!P``B40D!(DL).C\____
-MBU0D.(N$FA@'``")1"0$B3PDZ/S___^#Q@$/MD0D6V8Y\'?"BTPD<(N!@`D`
-M`(7`=#")1"0$B<@%:`D``(D$).C\____BUPD.(N#@`D``(E$)`2)V`5H"0``
-MB00DZ/S___^+5"1PBX*H"0``A<!T,(E$)`2)T`60"0``B00DZ/S___^+3"0X
-MBX&H"0``B40D!(G(!9`)``")!"3H_/___XM<)'"+@_@)``"%P'0PB40D!(G8
-M!>`)``")!"3H_/___XM4)#B+@O@)``")1"0$B=`%X`D``(D$).C\____BTPD
-M<(N!Q`4``(7`=#")1"0$B<@%K`4``(D$).C\____BUPD.(N#Q`4``(E$)`2)
-MV`6L!0``B00DZ/S___^+5"1PBX)P!@``A<!T,(E$)`2)T`58!@``B00DZ/S_
-M__^+3"0XBX%P!@``B40D!(G(!5@&``")!"3H_/___XM<)'"+@R`&``"%P'0P
-MB40D!(G8!0@&``")!"3H_/___XM4)#B+@B`&``")1"0$B=`%"`8``(D$).C\
-M____BTPD<(N!/`8``(7`=#")1"0$B<@%)`8``(D$).C\____BUPD.(N#/`8`
-M`(E$)`2)V`4D!@``B00DZ/S___^+5"1PBX*H!@``A<!T,(E$)`2)T`60!@``
-MB00DZ/S___^+3"0XBX&H!@``B40D!(G(!9`&``")!"3H_/___XM<)'"+@\0&
-M``"%P'0PB40D!(G8!:P&``")!"3H_/___XM4)#B+@L0&``")1"0$B=`%K`8`
-M`(D$).C\____BTPD<(N!_`8``(7`=#")1"0$B<@%Y`8``(D$).C\____BUPD
-M.(N#_`8``(E$)`2)V`7D!@``B00DZ/S___^+5"1PBX(P"0``A<!T,(E$)`2)
-MT`48"0``B00DZ/S___^+3"0XBX$P"0``B40D!(G(!1@)``")!"3H_/___XM<
-M)'"+@U@)``"%P'0PB40D!(G8!4`)``")!"3H_/___XM4)#B+@E@)``")1"0$
-MB=`%0`D``(D$).C\____BTPD<(N!T`D``(7`=#")1"0$B<@%N`D``(D$).C\
-M____BUPD.(N#T`D``(E$)`2)V`6X"0``B00DZ/S___^+5"1PBX*,!@``A<!T
-M,(E$)`2)T`5T!@``B00DZ/S___^+3"0XBX&,!@``B40D!(G(!70&``")!"3H
-M_/___XM<)'"+BQ0*``"%R718BX,8"@``BY,<"@``B40D"(E4)`R)3"0$B=@%
-M_`D``(D$).C\____BTPD.(N!&`H``(N1'`H``(E$)`B)5"0,BX$4"@``B40D
-M!(G(!?P)``")!"3H_/___XM<)'"+BS@*``"%R718BX,\"@``BY-`"@``B40D
-M"(E4)`R)3"0$B=@%(`H``(D$).C\____BTPD.(N!/`H``(N10`H``(E$)`B)
-M5"0,BX$X"@``B40D!(G(!2`*``")!"3H_/___XM<)'"+BUP*``"%R718BX-@
-M"@``BY-D"@``B40D"(E4)`R)3"0$B=@%1`H``(D$).C\____BTPD.(N!8`H`
-M`(N19`H``(E$)`B)5"0,BX%<"@``B40D!(G(!40*``")!"3H_/___XM<)'"+
-MBZ0*``"%R718BX.H"@``BY.L"@``B40D"(E4)`R)3"0$B=@%C`H``(D$).C\
-M____BTPD.(N!J`H``(N1K`H``(E$)`B)5"0,BX&D"@``B40D!(G(!8P*``")
-M!"3H_/___XM<)'"+BX`*``"%R718BX.$"@``BY.("@``B40D"(E4)`R)3"0$
-MB=@%:`H``(D$).C\____BTPD.(N!A`H``(N1B`H``(E$)`B)5"0,BX&`"@``
-MB40D!(G(!6@*``")!"3H_/___XM<)'"+B\@*``"%R718BX/,"@``BY/0"@``
-MB40D"(E4)`R)3"0$B=@%L`H``(D$).C\____BTPD.(N!S`H``(N1T`H``(E$
-M)`B)5"0,BX'("@``B40D!(G(!;`*``")!"3H_/___XM<)'"+B^P*``"%R718
-MBX/P"@``BY/T"@``B40D"(E4)`R)3"0$B=@%U`H``(D$).C\____BTPD.(N!
-M\`H``(N1]`H``(E$)`B)5"0,BX'L"@``B40D!(G(!=0*``")!"3H_/___XM<
-M)'"+BQ`+``"%R718BX,4"P``BY,8"P``B40D"(E4)`R)3"0$B=@%^`H``(D$
-M).C\____BTPD.(N!%`L``(N1&`L``(E$)`B)5"0,BX$0"P``B40D!(G(!?@*
-M``")!"3H_/___X/$7%M>7UW#C;8`````@^P<B5PD%(ET)!B+="0@BUPD)(A>
-M-P^VVXE<)`2)-"3H_/___XE<)`2!QL`,``")-"3H_/___[@!````BUPD%(MT
-M)!B#Q!S#D(VT)@````!64X/L%(MT)"")-"3H_/___XDT).C\____C9[`#```
-MB1PDZ/S___^)-"3H_/___\<$)-`'``#H_/___XDT).C\____QT0D!`$```")
-M-"3H_/___\=$)`0!````B1PDZ/S___^[@````(N6/`4```^VA!.P!```//]T
-M*P^VP&G`L`````."C`4``/9`,@)T%F;'0#(!`,9`)AV)1"0$B30DZ/S___^#
-MPP&!^X8```!UN(N>/`4``('#P`P``+X`````#[:$'C`%```\_W0K#[;`:<"P
-M`````X.,!0``]D`R`G069L=`,@$`QD`F'8E$)`2)'"3H_/___X/&`8/^!G7!
-M@\046U[#C78`C;PG`````%.#[`B+7"00B1PDZ/S___^+@SP%```%P`P``(D$
-M).C\____@\0(6\.0C;0F`````%.#[`B+7"00B1PDZ/S___^+@SP%```%P`P`
-M`(D$).C\____@\0(6\.0C;0F`````(/L#(M$)!")!"3H_/___P^VP(/$#,.-
-M=@"-O"<`````@^PLB5PD'(ET)"")?"0DB6PD*(G#B=>)S8MP8(M`;(E$)!2%
-M]@^$-0$``("[EP`````/A2@!``")!"3H_/___XE$)!B%P`^$%`$``,9`).'&
-M0"4!B?J$TG0-B>@\`1G`]]"#P`?K#(GJ@/H!&<#WT(/`#8M4)!B(0B;&0A2`
-M#[=&'&:)0A")6AC'0B``````QT(T`````,=";#">`0")5"0$BT0D%(D$).C\
-M____QH.7`````6;'@Y0```#T`87;=%F+0V"%P'1<9H&[E````)8`=1>)1"0(
-MQT0D!"$```"+0"R)!"3H_/___V:#JY0````!QP0DT`<``.C\____BU0D%(D4
-M).C\____BT-@A<!T"8"[EP````!UKF:#NY0`````=!R+1"08@'@4`'42BT-@
-M#[=`.F:)0UJ[`````.L%N_____^+5"08B50D!(M$)!2)!"3H_/___^L)C70F
-M`+O_____B=B+7"0<BW0D((M\)"2+;"0H@\0LPY"-="8`@^Q,B5PD/(ET)$")
-M?"1$B6PD2(MT)%`/MFPD5(M^8(M&;(E$)""%_P^$\@0``("^EP`````/A>4$
-M``")!"3H_/___XE$)"2%P`^$T00``/8&`@^%!`$``(GJ@/H4=PL/ML*-!$#!
-MX`+K&+B)____B>KVXF;!Z`C`Z`0/ML`%\````(M4)"3&0B3AQD(E`<9")AR(
-M0B?&0A2`#[=''&:)0A")<AC'0B``````QT(T`````,=";#">`0")5"0$BT0D
-M((D$).C\____QH:7`````6;'AI0```#$"87V=%F+1F"%P'1@9H&^E````)8`
-M=1>)1"0(QT0D!"$```"+0"R)!"3H_/___V:#KI0````!QP0DT`<``.C\____
-MBU0D((D4).C\____BT9@A<!T"8"^EP````!UKF:#OI0`````#X2\`P``NP``
-M``"+1"0D@'@4``^$K@,``.FD`P``BU0D((D4).C\____B40D.(7`#X2,`P``
-MBUPD)(/#/(M`"(E$)!R+1"0DQD`D&L9`)0C&0"8:QD`G`,9`*!#&0"D`BT0D
-M.(M4)"2)0E#&0A2`#[=''&:)0A")<AB+1"0XBT`(B4(TQT(@$````(M&8`6X
-M````B4(XQD(<(,=";#">`0#'1"0$`````(D<).C\____BU0D)(M"((E$)`R+
-M1"0XBU`0BT`,B40D!(E4)`B)'"3H_/___XM$)"2)1"0$BU0D((D4).C\____
-MQH:7`````6;'AI0```#Z`(7V=%F+1F"%P'1<9H&^E````)8`=1>)1"0(QT0D
-M!"$```"+0"R)!"3H_/___V:#KI0````!QP0DT`<``.C\____BT0D((D$).C\
-M____BT9@A<!T"8"^EP````!UKF:#OI0`````=`J+5"0D@'H4`'0>C40D.(E$
-M)`2+1"0@B00DZ/S___^[_____^D^`@``BU0D)(E4)`2+1"0@B00DZ/S___^+
-M5"0@B10DZ/S___^)1"0DA<!U(8U$)#B)1"0$BT0D((D$).C\____N______I
-M&`(``(UV`(M4)"2#PCR)5"0HBTPD'(/!!(M4)!P/MD(##[8$`8A"!,9!`0K&
-M00(`N`````"+5"0<Q@00`(/``8/X!'7PB>B$P'4&@&$#_.M-B>@/MM!ITF#J
-M``"X'X7K4??JP?H%@$D#`XG5P>T8B>B(002)T\'K$(A9!8G0P>@(B40D&(A!
-M!HA1!XGHB$$(B%D)#[9$)!B(00J(40N+1"0XBU0D)(E"4,9")!4/M@'`^`?W
-MT(/`$8A")<9")@#&0B<`QD(H$,9"*0"`(3_&0A2`#[=''&:)0A")<AB+1"0X
-MBT`(B4(TQT(@$````(M&8`6X````B4(XQD(<(,=";#">`0#'1"0$`````(M$
-M)"B)!"3H_/___XM4)"2+0B")1"0,BT0D.(M0$(M`#(E$)`2)5"0(BT0D*(D$
-M).C\____BU0D)(E4)`2+1"0@B00DZ/S____&AI<````!9L>&E````/H`A?9T
-M68M&8(7`=%QF@;Z4````E@!U%XE$)`C'1"0$(0```(M`+(D$).C\____9H.N
-ME`````''!"30!P``Z/S___^+5"0@B10DZ/S___^+1F"%P'0)@+Z7`````'6N
-M9H.^E`````!T#[L`````BT0D)(!X%`!T!;O_____C40D.(E$)`2+5"0@B10D
-MZ/S____K!I"[_____XM$)"2)1"0$BU0D((D4).C\____ZPJ0C70F`+O_____
-MB=B+7"0\BW0D0(M\)$2+;"1(@\1,PY"-="8`@^Q,B5PD/(ET)$")?"1$B6PD
-M2(M\)%"+7"14BW0D6`^W1"1<9HE$)!X/ME0D9(A4)!V+;V"%[0^$Z0,``("_
-MEP`````/A=P#``"+32R)3"0XBT=LB40D)&;'AY0````0)XD$).C\____B40D
-M-(7`#X2Q`P``#[=4)!Z)5"0@9H-\)!X$=A*)5"0$QP0DD`$``.C\____ZQ2+
-M3"0DB0PDZ/S___^)1"0HA<!U'HM$)#2)1"0$BU0D)(D4).C\____N______I
-M=@,``(M,)"#!X0F)3"0PBU0D)(N"/`4``,9`)P&)?"0(BX(\!0``B40D!,<$
-M)`4```#H_/___X!-*`*+1V")1"0(QT0D!"$```"+3"0XB0PDZ/S___^+1"0T
-M@\`\B40D+(!\)!T`=!&+5"0TQT)D"@```,9")"CK+HM,)#3'0602````QD$D
-M*HM4)"B+0@B+3"0PB4PD"(M4)&")5"0$B00DZ/S___^+1V#V0#@!='F`?"0=
-M`1G`@^`"@^AXBTPD-(A!),9!)0")\,'H&(A!)HGPP>@0B$$GB?#!Z`B(02B)
-M\HA1*8G8#ZSP&(A!*HG8#ZSP$(A!*XG8#ZSP"(A!+(A9+<9!+@#&02\`#[=$
-M)!YFP>@(B$$P#[9$)!Z(03'&03(`QD$S`.M6@'PD'0$9P(/@`H/`*(M4)#2(
-M0B3&0B4`B=@/K/`8BTPD-(A!)HG8#ZSP$(A!)XG8#ZSP"(A!*(A9*<9!*@`/
-MMT0D'F;!Z`B(02L/MD0D'HA!+,9!+0"+5"0TB10DZ/S___^+1V`/MT`<BTPD
-M-&:)01#&012`B7D8BU0D*(M""(E!-(M$)#")02")45#&01P@BT=@!;@```")
-M03C'06PPG@$`QT0D!`````"+5"0LB10DZ/S___^+3"0TBT$@B40D#(M,)"B+
-M00R+41")1"0$B50D"(M$)"R)!"3H_/___\:'EP````&+5"0TB50D!(M,)"2)
-M#"3H_/___X7_#X2O````BT=@A<`/A*0```"`OY<`````#X0D`0``9H&_E```
-M`)8`=1>)1"0(QT0D!"$```"+0"R)!"3H_/___V:#KY0````!QP0DT`<``.C\
-M____BT0D)(D$).C\____BT=@A<!T3H"_EP`````/A,X```"0ZZ>+5"0T@'H4
-M`'4TNP````"`?"0=`'0MBTPD*(M!"(M4)#")5"0(B40D!(M,)&")#"3H_/__
-M_[L`````ZP>)]KO_____BT0D-(-X4`!T-8%X(``(``!W%8/`4(E$)`2+5"0D
-MB10DZ/S____K%XM$)#2#P%")1"0$BTPD)(D,).C\____BT0D-(E$)`2+5"0D
-MB10DZ/S___^+3"0DBX$\!0``QD`G`(E\)`B+@3P%``")1"0$QP0D!@```.C\
-M____@&4H_>L:N______K$V:#OY0`````#X4G____Z6#___^)V(M<)#R+="1`
-MBWPD1(ML)$B#Q$S#C78`C;PG`````(/L'(E<)!")="04B7PD&(M4)""+7"0D
-MBT(LBSB+<T@/MD,4/"!T/SP@=PJ$P'0C/`9W%NLM/")T+3PBD(UT)@!R((/`
-M@#P!=AFX`````(GVZUJ+0B#'0`0`````QD9F`>L$QD9F#8-[4`!T*8%[(``(
-M``!W$8U#4(E$)`2)/"3H_/___^L/C4-0B40D!(D\).C\____B5PD!(D\).C\
-M____B30D_U9PN`$```"+7"00BW0D%(M\)!B#Q!S#C70F`(/L'(E<)!")="04
-MB7PD&(MT)""+7F"%VW46BT0D*(D$)/]4)"3I5@$``(VV`````(-^=`!U#(-^
-M<`"-M@````!T$XM$)"B)!"3_5"0DC78`Z2L!``"`N[0`````#X41`0``@'LF
-M_P^%!P$``(M#-(7`=`J`>#4`#X7V````BT,L]D`($`^%Z0```(LX@'M/`'04
-MB5PD",=$)`0&````B00DZ/S___^+1"0DB49TBT0D*(E&>`^V2R0/MM&)T(/@
-M!H/X!G4T]L(!#X2&````QD,F!<9#)P2)7"0,#[9#38E$)`B+0S")1"0$BT,L
-MB00DZ/S____IAP```(/X!`^%?@```/;!`71YBU,TA=)T,`^W0C*H`G1J@^#]
-M9HE",HM#-&;'0#(!`(M#-,9`)AV+0S2)1"0$B3PDZ/S____K0L9#)@/&0R<$
-MB5PD!(D\).C\____ZRS&0R8%QD,G!F;'@Y0``````(E<)`2)/"3H_/___^L-
-MBT0D*(D$)/]4)"2)]HM<)!"+="04BWPD&(/$',-3@^P(BUPD$(7;#X2X````
-MBT-LB00DZ/S___^)PH7`#X1[````@+BE`````'1R@`L!#[:`I0```#P"=3B#
-M>V@`=1D/MH.8````@^`#B$,"#[:"I````(A#`>MM#[:#F0```(A#`HM#:`^V
-M@*0```"(0P'K5#P#=5`/MH.8````@^`#P>`"`H.9````B$,"BT-H#[:`I```
-M`(A#`>LKC78`BT-HA<!U"XM#9(7`=1")]NL6#[:`I````(A#`>L*#[:`D@``
-M`(A#`8/$"%O#C78`5E.#[`2+="00A?9T:KL`````#[:$,[`$```\_W0W#[;`
-M:<`H`0``B<(#EG`%``!T)(M")"4`__\`/0``_P!U%?9")P1T#XM"((7`=`B)
-M!"3H_/___X/#`8'[@````'6RBX8\!0``.?!U#07`#```B00DZ/S___^#Q`1;
-M7L.-=@!64X/L%(M<)""-L\`,``")'"3H_/___XE#%(E&%(F;/`4``(F>/`4`
-M`(N#2`4``(F&2`4``,:#K@P```'&AJX,```!B1PDZ/S___^)'"3H_/___XDT
-M).C\____B1PDZ/S___^$P'1NB30DZ/S___^$P'1BB1PDZ/S____'!"30!P``
-MZ/S___^)'"3H_/___\>#*`$``.@#``#'@S`!````````B9LT`0``C8,H`0``
-MB40D!(M#%(D$).C\____QT0D!`````")'"3H_/___[@!````ZP6X`````(/$
-M%%M>PU.#[`B+7"00B1PDZ/S___^!P\`,``")'"3H_/___[@!````@\0(6\.0
-MC;0F`````%575E.#[#R#/>0`````#X6!`0``QP7D`````0```,=$)#@`````
-MZ;P"``"0C70F``^WAAX!``#!X!`/MY8<`0``"=`Y1"0H#X43`0``OP````"Y
-M`````(E\)#!F@[D``````'5[B?K!X@6+AAP!``")@@````"+AB`!``")@@0`
-M``"+AB0!``")@@@````/MH(<````C0S]`````(T$`0^V7"0OB!R%#0````^V
-M@AP```"-!`$/MEPD+H@<A0X````/MH(<`````<'&!(T/`````(""'`````'K
-M>9"-="8`#[:9'````(G8N@````#WMC`!``"%TG1-BTPD,,'A`XT$&0^V5"0O
-MB!2%#0```(M4)##!X@4/MH(<````C00!#[9<)"Z('(4.````#[:"'`````'!
-MQ@2-#P````"`@AP````!ZP^#QP&#P2"#_P0/A0/___^#AB@!```!D(UT)@"#
-MQ0&#QA@[+=`+```/A;[^__^#1"0T`8-\)#0@#X48`0``@T0D.`&!?"0X_P``
-M``^%4@$``(-\)%0`=`>+="14Q@8`BQW0"P``QT0D)`````"%VWXYN0````#'
-M1"0D`````+H`````BX(H`0```40D)(-\)%0`=`R+@BP!``"+="14``:#P0&#
-MPA@YV779@WPD6``/A`$!``"]`````+L`````9H.[```````/A.D````/MH,<
-M````B40D((7`?FK'1"08`````(T4[0````")5"0<BT0D'`-$)!B--(4,````
-MBWPD6+@$````_(G!\Z8/E\(/DL`XPG4A@WPD5`!T#0^V@QT```"+="14B`8/
-MMH,<````B40D).L/@T0D&`&+5"0@.50D&'6I@\4!@\,@@_T$=&7I:?___P^V
-M3"0TB$PD+L=$)`P`````QT0D"`````"+7"0TB5PD!(MT)#B)-"3H_/___XE$
-M)"B]`````+X`````@SW0"P````^/3OW__^F+_O__#[9$)#B(1"0OQT0D-```
-M``#KH`^V1"0D@\0\6UY?7<.)]HV\)P````"#[!R)7"00B70D%(E\)!B+1"0@
-M#[9T)"2+>&R+6&#V``%T=8M3,(72=!F)\0^VP8E$)`@/MD--B40D!(D4).C\
-M____BY/D````A=)T'(GQ#[;!B40D"`^V@]D```")1"0$B10DZ/S___^)/"3H
-M_/___X7`=#N`N*4`````=#*)\@^VPHE$)`B+0R")1"0$B3PDZ/S____K&(GQ
-M#[;!B40D"(M#((E$)`2)/"3H_/___XM<)!"+="04BWPD&(/$',.#[#R)7"0L
-MB70D,(E\)#2);"0XBWPD0`^V="1$BU]@BV]LA=L/A'8#``"`OY<`````#X5I
-M`P``]@<"#X5@`P``#[:#)`$``(3`=`N)\CC0=4/I2@,```^V@]L```")1"00
-M#[8'@^`!#[;`B40D#`^V1P*)1"0(#[9'`8E$)`3'!"0D!0``Z/S___^[____
-M_^D1`P``B2PDZ/S___^)1"0<A<`/A/@"``"+4R")\0^VP8E$)!`/MH*8````
-M#[92`HT$@`^VA`(`````B40D#`^V12*)1"0(#[9%(8E$)`3'!"1L!0``Z/S_
-M__^+1"0<QD`DX<9`)0&)\H#Z`@^5P(/`&HM,)!R(02;&012`#[=#'&:)01")
-M>1C'02``````QT$T`````,=!;#">`0")3"0$B2PDZ/S____&AY<````!9L>'
-ME````/0!A?]T58M'8(7`=%QF@;^4````E@!U%XE$)`C'1"0$(0```(M`+(D$
-M).C\____9H.OE`````''!"30!P``Z/S___^)+"3H_/___XM'8(7`=`F`OY<`
-M````=;)F@[^4``````^$V0$``(M$)!R`>!0`#X7+`0``BU=@B50D*(M"+(L`
-MB40D)(D$).C\____B<.%P'40BTPD*,:!M0````'IH@$``(M$)"2)!"3H_/__
-M_XG&A<!U)8M4)"C&@K4````!B5PD!(M,)"2)#"3H_/___[L`````Z6L!``"-
-M0SR)1"0@QD,DX<9#)0'&0R8#BU0D*`^W0AQFB4,0QD-H#XE[&,=#(``"``"+
-M5@B)4S2X`````,8$$`"#P`$]``(``'7RB7-0QT-L,)X!`,=$)`0`````BTPD
-M((D,).C\____BT,@B40D#(M&#(M6$(E$)`2)5"0(BT0D((D$).C\____B5PD
-M!(M4)"2)%"3H_/___\:'EP````%FQX>4````^@"%_W19BT=@A<!T7&:!OY0`
-M``"6`'47B40D",=$)`0A````BT`LB00DZ/S___]F@Z^4`````<<$)-`'``#H
-M_/___XM,)"2)#"3H_/___XM'8(7`=`F`OY<`````=:YF@[^4`````'0J@'L4
-M`'4DBT,TB40D!(M$)"B)!"3H_/___XM4)"@/MH(D`0``B(>;````@WM0`'03
-MC4-0B40D!(M,)"2)#"3H_/___XE<)`2+1"0DB00DZ/S___^[`````.L%N___
-M__^+5"0<B50D!(DL).C\____ZP:0N_____^)V(M<)"R+="0PBWPD-(ML)#B#
-MQ#S#D(UT)@"#[!R)7"0,B70D$(E\)!2);"08BW0D((M4)"2`.@EW$`^V`O\D
-MA:0)``"-M@````"X_____^E*`0``BU($BX)`!0``A<!U"8G0C;0F`````(N`
-M/`4``,:`KPP```&)!"3H_/___[@`````Z14!```/MDH$N@````")\.@AZ/__
-MZ0`!```/MDH$N@$```")\.@,Z/__Z>L````/MD($B40D!(DT).C\____Z=8`
-M```/MFH$BWYLBUY@N/_____V1E@(#X2]````B70D"(N'/`4``(E$)`3'!"0%
-M````Z/S___^`2R@"B5PD",=$)`0A````BT,LB00DZ/S___^`>T\`=!K'!"30
-M!P``Z/S___^)/"3H_/___X![3P!UYHGHA,!T#&:#3EH09H-+.A#K"F:#9EKO
-M9H-C.N^)="0(BX<\!0``B40D!,<$)`8```#H_/___X!C*/VX`````.LG#[9"
-M!(E$)`2)-"3H_/___^L5#[9"!(E$)`2)-"3H_/___[@`````BUPD#(MT)!"+
-M?"04BVPD&(/$',.0C;0F`````(/L+(E<)"")="0DB7PD*(MT)#"+?FR+ASP%
-M``"`>"<`=6"+7G`/MH:;````B40D$`^VAI@````/ME8"C02`#[:$`@````")
-M1"0,#[9'(HE$)`@/MD<AB40D!,<$))@%``#H_/___\=&<`````"+1@B)1"0(
-MB70D!(M&>(D$)/_3ZSB-7GR)7"0$BT<4B00DZ/S____'1GST`0``QX:$````
-MT,0!`(FVB````(E<)`2+1Q2)!"3H_/___XM<)""+="0DBWPD*(/$+,.-M@``
-M``!55U93@^P<#[=$)#AIP"@!``")Q8M4)#`#JG`%``"+NCP%``"!Q\`,``"+
-M3"0TB6E@B4T@@WTP`'4M@WTT`'4G#[9R*XGSA-L/A"`$``"+72RY`````#N:
-MF`L```^$W0,``.GY`P``BT0D-(`(`8M%-(M4)#2)0FB+13")0F2+3"0P#[9Q
-M*XGSA-MT4XM=++D`````BT0D,#N8F`L``'0:ZR\/ML&)PL'B!HT$@HM4)#`Y
-MG`*8"P``=1R+7"0P#[9#*8T$@8M4)#2(@I@```#K#KD`````@\$!B?`XP77#
-MBU0D,(N*/`4```^V@3`%``"[`````#S_="2+53"%TG08#[;`:<`4#0```X&H
-M!0``NP`````YPG0JNP$````/MH$Q!0``//]T*XM5,(72="$/ML!IP!0-```#
-M@:@%```YPG4.BTPD-(A9`>G>````B?:#PP&Z``````^VA`HR!0``//]T(P^V
-MP&G`L`````.!C`4``#M%-'4,BWPD-(A?`>FH````@\,!@\(!@_H$=<F)V0^V
-MAS`%```\_W0DBU4PA=)U!8U9`>L8#[;`:<`4#0```X>H!0``.<)UZ.LHC78`
-M#[:',04``#S_="B+53"%TG0>#[;`:<`4#0```X>H!0``.<)U"XM$)#2(6`'K
-M/HGV@\,!N@`````/MH0Z,@4``#S_="`/ML!IP+`````#AXP%```[131U"8M4
-M)#2(6@'K"X/#`8/"`8/Z!'7,BTPD,(!Y.0%U2(M5,(72=!C'1"0(``````^V
-M14V)1"0$B10DZ/S___^+E>0```"%T@^$MP$``,=$)`@`````#[:%V0```(E$
-M)`2)%"3H_/___X.]Y``````/A(\!``"+=3"`?C``=%:_`````(U>*(UT)@")
-M7"08B1PDZ/S___^-2/B+5BR)1BR)60B)40R)`H"YVP```/]U#X!Y)0!U"8.Y
-MY`````!U"H/'`8GX.$8P=\&)^CA6,`^%E`````^VA=L```"+3"0TB$$"@'XP
-M``^$C@$``+L`````C7XHC;8`````B3PDZ/S___^-2/B+5BR)1BR)>0B)40R)
-M`HM!((7`=$`/MI';````.%`"=#2#>'``=2Z#>'0`=2B(4`(/MT$<B40D"(M4
-M)#"+@CP%``")1"0$QP0D!P```.C\____C78`@\,!.%XP#X84`0``ZY(/MD5-
-MBTPD-(A!`L:%VP```/^`?C``#X3V````NP````"0BWPD&(D\).C\____C4CX
-MBU8LB48LB7D(B5$,B0*`N=L```#_=$K&@=L```#_BT$@A<!T/`^V44TX4`)T
-M,X-X<`!U+8-X=`!U)XA0`@^W01R)1"0(BU0D,(N"/`4``(E$)`3'!"0'````
-MZ/S___^)]H/#`3A>,'9XZX8/MD5-BTPD-(A!`NMI#[;!B<+!X@:-!(*+?"0P
-M.9P'F`L``'4FBU0D,`^V0BF-!(&+7"0TB$,!B(.8````.$HK=1KK$(GVN0``
-M``"#P0&)\#C!=;F+5"0TQD(!_XM,)#3&00(`@[T<`0```'0)BX4@`0``B$$"
-MBTPD-(/!((U59(M%9(M<)#2)0R"+0@2)002+0@B)00B+0@R)00R+0A")01"+
-M0A2)012+0AB)01B+0AR)01R+0B")02"+0B2)022)V8/!#(U54(M%4(E##(M"
-M!(E!!(M""(E!"(M"#(E!#(M"$(E!$(N%C````(E#2(N%D````(E#3`^W13AF
-MB4-8#[=%.F:)0UJ+142+54B)0U")4U0/MD5.B$-<#[:%)`$``(B#FP```/9%
-M*`1U#(M\)#")/"3H_/___P^V522)T(/@!H/X!G4.]L(!=0F+1"0T@`@"ZP>+
-M5"0T@"+]#[95*-#J@^($BTPD-`^V`8/@^PG0B`$/MD$!B(&:````#[9!`HB!
-MF0```(D,).C\____QT0D"`````"+12")1"0$BUPD,(D<).C\____BWPD-(D\
-M).A?^?__@\0<6UY?7<.-M"8`````@^P<B5PD%(ET)!B+="0@BYX\!0``B30D
-MZ/S___^`?CD!=2V-@\`,``"`>#D!=%^`OK@,````=1C'1"0$`````(D$).C\
-M____@(:X#````9"-GB@!``")7"0$BT84B00DZ/S____'AB@!``#H`P``QX8P
-M`0```````(FV-`$``(E<)`2+1A2)!"3H_/___XM<)!2+="08@\0<PXVV````
-M`%575E.#[$R+1"1DBU`8B50D((M`'(E$)!@/MDH+B4PD'(M4)&"+@CP%``"+
-MF#P%``"^`````+\`````N0`````/MI09,`4``(#Z_W1&C8&`````9CV!`'<'
-M@\8!ZS6)]@^VPHN3C`4``&G`L````("\$*4````#=1>#QP&-1P.#^`9V#X/&
-M`;\`````ZP6)]H/&`8/!`8/Y!G6EB?6+FSP%``"!P\`,``"Q`)"-="8`#[:4
-M&3`%``"`^O]T1HV!@````&8]@0!W!X/&`>LUB?8/ML*+DXP%``!IP+````"`
-MO!"E`````W47@\<!C4<#@_@&=@^#Q@&_`````.L%B?:#Q@&#P0&#^09UI3ET
-M)!P/C3P)```[;"0<#Y[`BTPD:,<!`````#S_#X0<"0``#[;`:<#`#```BU0D
-M8`."/`4``(D$).C\____B<&%P`^$]P@``(M$)!B)1"0D#[:!I0```#P"#X4$
-M`@``BU0D:,<"!````(M$)"`/MG`'BQ$/MT$DNP````"`O`*P!```_P^$T0$`
-M`(GR@/HC#X>W`0``#[;"_R2%S`D``(M,)"3'`453`Q&X`0```.FE`0``C40D
-M2(E$)`S'1"0($`,``,=$)`0!````B0PDZ/S___^$P`^$<0$``(M$)$B%P`^$
-M;`$``"7_`P``:<`0)P``C8@0EJ__NG.(JTR)R/?BB<@IT-'H`<+!Z@>+3"0D
-MB1&X`0```.D\`0``C40D2(E$)`S'1"0("`,``,=$)`0!````B0PDZ/S___^$
-MP`^$"`$``(M$)$B%P`^$`P$``"7_`P``:<#H`P``C8C(Y??_NLMK**^)R/?B
-MB<@IT-'H`<+!Z@2+3"0DB1&X`0```.G3````C40D2(E$)`S'1"0("`,``,=$
-M)`0!````B0PDZ/S___^$P`^$GP```(M$)$B%P`^$F@```,'H$"7_`P``:<#H
-M`P``C8C(Y??_NLMK**^)R/?BB<@IT-'H`<+!Z@2+3"0DB1&X`0```.MJC40D
-M2(E$)`S'1"0(#`,``,=$)`0!````B0PDZ/S___^$P'0ZBT0D2(7`=#DE_P,`
-M`&G`Z`,``(V(R.7W_[K+:RBOB<CWXHG(*=#1Z`'"P>H$BTPD)(D1N`$```#K
-M#+@`````ZP6X`0````^VV`^VP^GR!@``/`,/A=0&``"+1"1HQP`$````BU0D
-M(`^V4@>(5"0KQT0D.`````#'1"0\`````,=$)$``````QT0D1`````"+$0^V
-MJMD```"%[0^.CP```+\`````QT0D%`````"X`0```(G&B?G3YHM,)!0/MH01
-M,@4``#S_=!\/ML!IP+````")PP.:C`4``(M#5(M`&`^V0`8Y\'02@T0D%`&#
-M?"04!`^$+`8``.N_A=L/A"(&```/MT,D@+P"L`0``/\/A!`&``"`NZ4````#
-M#X4#!@``B5R\.(/'`3G]#X5V____@'PD*U4/A]L%```/MD0D*_\DA5P*``"+
-M1"0DQP!``P,1N`$```#IP`4``(U$)$B)1"0,QT0D"#0#``#'1"0$`0````^V
-M1"0K@\`!@^`#BT2$.(D$).C\____A,`/A(0%```/MU0D2(E4)$B!^O__``!U
-M%(M4)"3'`O____^X`0```.ED!0``N,#AY`")T;H`````]_&+5"0DB0*X`0``
-M`.E&!0``C40D2(E$)`S'1"0($`,``,=$)`0!````BT0D/(D$).C\____A,`/
-MA!4%``"+1"1()?\#``!IP!`G``"-B!"6K_^Z<XBK3(G(]^*)R"G0T>@!PL'J
-M!XM,)"2)$;@!````Z>$$``"-1"1(B40D#,=$)`@(`P``QT0D!`$```"+1"0\
-MB00DZ/S___^$P`^$L`0``(M$)$@E_P,``&G`Z`,``(V(R.7W_[K+:RBOB<CW
-MXHG(*=#1Z`'"P>H$BTPD)(D1N`$```#I?`0``(U$)$B)1"0,QT0D"`@#``#'
-M1"0$`0```(M$)#R)!"3H_/___X3`#X1+!```#[=$)$HE_P,``&G`Z`,``(V(
-MR.7W_[K+:RBOB<CWXHG(*=#1Z`'"P>H$BTPD)(D1N`$```#I%@0``(U$)$B)
-M1"0,QT0D"`P#``#'1"0$`0```(M$)#R)!"3H_/___X3`#X3E`P``BT0D2"7_
-M`P``:<#H`P``C8C(Y??_NLMK**^)R/?BB<@IT-'H`<+!Z@2+3"0DB1&X`0``
-M`.FQ`P``C40D2(E$)`S'1"0(%`,``,=$)`0!````BT0D.(D$).C\____A,`/
-MA(`#``"+1"1()?\#``"Z`````&G:.K@!`+DZN`$`]^&-%!,%XTH#`(/2`,=$
-M)`B@A@$`QT0D#`````")!"2)5"0$Z/S___^+3"0DB0&X`0```.DS`P``C40D
-M2(E$)`S'1"0(%`,``,=$)`0!````BT0D/(D$).C\____A,`/A`(#``"+1"1(
-M)?\#``"Z`````&G:.K@!`+DZN`$`]^&-%!,%XTH#`(/2`,=$)`A0PP``QT0D
-M#`````")!"2)5"0$Z/S___^+3"0DB0&X`0```.FU`@``C40D2(E$)`S'1"0(
-M%`,``,=$)`0!````BT0D0(D$).C\____A,`/A(0"``"+1"1()?\#``"Z````
-M`&G:YA-``KGF$T`"]^&-%!,%#?].!(/2`,=$)`B`EI@`QT0D#`````")!"2)
-M5"0$Z/S___^+3"0DB0&X`0```.DW`@``C40D2(E$)`S'1"0(%`,``,=$)`0!
-M````BT0D1(D$).C\____A,`/A`8"``"+1"1()?\#``"Z`````&G:KD7A`+FN
-M1>$`]^&-%!,%*5*O`8/2`,=$)`A`0@\`QT0D#`````")!"2)5"0$Z/S___^+
-M3"0DB0&X`0```.FY`0``C40D2(E$)`S'1"0(L`,``,=$)`0!````BT0D/(D$
-M).C\____A,`/A(@!``"+1"1(P>@/@^`!BU0D)(D"N`$```#I<P$``(M,)""`
-M>0@`=!"+1"0\@:"H````__?__^L.BT0D/(&(J``````(``"+1"0\B00DZ/S_
-M__^X`0```.DU`0``BT0D((!X"`!T$(M$)#R!H*@```#_[___ZPZ+1"0\@8BH
-M`````!```(M$)#R)!"3H_/___[@!````Z?<```"+5"0@@'H(`'00BT0D/(&@
-MJ````/_?___K#HM$)#R!B*@`````(```BT0D/(D$).C\____N`$```#IN0``
-M`(M,)""`>0@`=!"+1"0\@:"H````_[___^L.BT0D/(&(J`````!```"+1"0\
-MB00DZ/S___^X`0```.E[````BT0D((!X"`!T$(M$)#R!H*@```#___[_ZPZ+
-M1"0\@8BH```````!`(M$)#R)!"3H_/___[@!````ZT"+5"0@@'H(`'00BT0D
-M/(&@J````/___?_K#HM$)#R!B*@```````(`BT0D/(D$).C\____N`$```#K
-M!;@`````#[;`ZPF-="8`N``````/ML#K%K@`````ZP^+3"1HQP$`````N```
-M``"#Q$Q;7E]=PY"-M"8`````55=64X/L;(N\)(````"+A"2$````B[0DC```
-M`(G%P>T8B<+!ZA"(5"1`#[;,B$PD,(A$)"^+G"2(````@</`#```N`````"+
-ME"2(````Q@00`(/``3V`&P``=>N)<A"AX````(A"*(/``:/@````B>F(2B,/
-MMD0D0(A"(@^V3"0PB$HA#[9$)"^(0B#&0BD`#[<'9HE"&`^W1P)FB4(:BT<$
-MB4(<BY0DB````('"@!D``(N,)(@```")D;P,``")<Q`/MD$HB$,HB>B(0R,/
-MMDPD0(A+(@^V1"0PB$,A#[9,)"^(2R#&0RD!#[<'9HE#&`^W1P)FB4,:BT<$
-MB4,<B9.\#```BY0DB`````^W0AIF/20G#X0C`0``9CTD)P^'C````&8]1"$/
-MA`\!``!F/40A=TQF/2`A#X3_````9CT@(7<19CU0!P^%"@$``(GVZ>@```!F
-M/2(AC;0F``````^$UP```&8]0"&-M@`````/A>(```#IP@```)"-="8`9CT0
-M)P^"S@```&8]$2>)]@^&IP```&8M("=F@_@"B?8/A[(```#ID@```)"-="8`
-M9CV`)P^$@P```&8]@">)]G<R9CU`)W1U9CU`)XUT)@!W$&8],"</A7P```"-
-M="8`ZUMF/40G=%5F/6`GC70F`'5FZTEF/8!R=$-F/8!RB?9W"&8]@B=U4.LS
-M9CV`D8GV=`YF/8"4=4#K(XVV`````(N,)(@```!FQT$D@)'&028$9L=#)("1
-MQD,F!.L;BX0DB````&;'0"2`E,9`)@1FQT,D@)3&0R8$#[9'"(N4)(@```"(
-M0BH/MD<(B$,JQT0D#```!`#'1"0(`````,=$)`0"````B30DZ/S___^+C"2(
-M````B0''1"0,`"```,=$)`@`````QT0D!`````")-"3H_/___XG!B[0DB```
-M`(E&"(L&A<`/A.T!``"%R0^$Y0$``(V0``(!`(E6!(V````"`(D&!0!```")
-M`XE3!(E+"(LUT`L``(7V?E^[`````+D`````#[>!'`$``&8[!W4_#[>!'@$`
-M`&8[1P)U,HN1+`$``(/"`8F1+`$``(N!*`$``(E$)!B%P'05.<)V$8G0N@``
-M``#W="08B9$L`0``@\,!@\$8.?-UJXN4)(@```"+0@0MX'T``,<``?`#`(M"
-M!"W8?0``QP`!``#HBT(0QT0D!'@```")!"3H_/___XG")0!P```]`"```'8F
-MB="`Y(^`S""+C"2(````BU$0B40D",=$)`1X````B10DZ/S___^)Z(A$)%\/
-MME0D0(A4)%X/MDPD,(A,)%T/MD0D+XA$)%S'1"0H`````+T`````9H.]````
-M```/A*````"`O1P`````#X2`````NP````"+5"0HP>(#B50D)(U,)%R)3"0<
-MBT0D)`'8C32%#````+D$````_(M\)!SSI@^7P@^2P#C"=3</MH4=````@\`!
-MB(4=````#[:5'````(32=!PXT'88#[;`#[;*N@````!F]_&(E1T```"-="8`
-M@\,!#[:%'````#G8?YB#1"0H`8/%((-\)"@$#X52____B[0DB````,>&2`4`
-M``$```"X`0```.L%N`````"#Q&Q;7E]=PXUV`(V\)P````!55U93@^P,BW0D
-M((M\)"2+;FP/M@:#X`$/ML")1"0(N`````#&!#@`@\`!@_@@=?2+G;P,``")
-MVK``C;8`````Q@00`(/``3T``@``=?*-2S:Z``````^V1#(AB`0*#[9$,B"(
-M1`H!@\("@_HH=>>-2Q2R`@^V1#(+B$0*_@^V1#(*B$0*_X/"`H/Z%G7FC4LN
-ML@`/MD0R28@$"@^V1#)(B$0*`8/"`H/Z"'7GB5\8BT90BU94@\`!@](`B0>)
-M5P2#?F``=3SV!@%T-XM&9(7M#Y7"A<!T$H32=`X/MD`S@+P%L`0``/]U&8M&
-M:(32=#6%P'0Q#[=`)("\!;`$``#_=",/MH:8````#[96`HT$@`^VA`(`````
-MB$<,QT0D"`````#K(HDL).C\____A<!T$H"XI0````)U"0^V1@&(1PSK!,9'
-M#/_&1PT`QD<.`<9'$A#&1Q$0#[9$)`B-%``/ME\*@^/]"=.(7PK!X`4/MD\(
-M@^'?"<&(3P@/MT98P>@'@^`!P>`&@^&_"<&(3P@/MT98P>@"@^`!#[97"8/B
-M_@G"B%<)#[=&6L'H`\'@!X/A?PG!B$\(#[=&6M'H@^`!`<"#XOT)PHA7"0^W
-M1EC!Z`.#X`'!X`:#XK\)PHA7"0^W1EK!Z`3!X`>#XG\)PHA7"8/)$(A/"`^V
-M!M#H@^`!@^/^"<.(7PH/M@:#X`2#X_L)PXA?"F;'1Q0`$`^VAIL```"(1P\/
-MMH:8````B$<<@\0,6UY?7<.)]HV\)P````!55U93@^P(BUPD*(MT)"R%VW03
-MN`````#&!!@`@\`!/:P```!U\H7V=!*X`````)#&!#``@\`!@_@H=?2+1"0<
-MB[@\!0``#[9$)"")1"0$B3PDZ/S___^)P6:%P'0-#[?`@+P'L`0``/]U2XN_
-M/`4``(''P`P``(N'/`4``(D$).C\____*40D(`^V1"0@B40D!(D\).C\____
-MB<%FA<`/A"D#```/M\"`O`>P!```_P^$&`,```^WP0^VA`>P!```9H'Y@0`/
-MAS<"``"+CZ@%```/M\!IP!0-``"-+`&%VP^$U@```(M5#(72=&P/MH<P!0``
-M//]T%0^VP&G`%`T``(T$`;Z`````.<)T(`^VAS$%```\_W0:#[;`:<`4#0``
-MC00!.<)U"KZ!````B?"(0P*`?3(`="^Z``````^VP@^V3`5`N`$```#3X`E#
-M((/"`3A5,G80Z^3&0P+_BT4(#[9`"8E#(,8#`0^V13&(0P&+14B)0P2+14R)
-M0PB-2PR-55B+15B)0PR+0@2)002+0@B)00B+0@R)00R+17")0QR+5"0@B5,D
-M#[:%D````(E#*+@`````Z1<"``"%]@^$"@(``(-\)"0`#XC_`0``#[:%D```
-M`#E$)"0/C>X!``"+1"0DC12`C535`(V"D`````^V2`2(#@^V0`6(1@&+@I@`
-M```/M@"#X`^(1@*`^0-T(H#Y`W<.@/D"#X6.````Z9````"`^01T-8#Y$HUV
-M`'5\ZU6+5"0DC022BY3%F`````^V0@&#X`</ML#!X`@/ME("`="-!(`!P(E&
-M!.M6BU0D)(T$DHN$Q9@````/MD`"A,!U"<=&!`````#K-P^VP(/H%(E&!.LL
-MBU0D)(T$DHN4Q9@````/MD("P>`(#[92`P'0C02``<")1@3K!\=&!`````"-
-M3@B+5"0DC022C83%D````(U0#(M`#(E&"(M"!(E!!(M""(E!"(M"#(E!#(M"
-M$(E!$(M"%(E!%(M"&(E!&(M"'(E!'+@`````Z=`````/M]!ITK````")U@.W
-MC`4``,9#`O_&`P*+AXP%```/MD0"'XA#`8M&5`^V0`F)0R`/MH:E````/`)U
-M+<=#!$A05`"-0PS'0PQ2;V-KQT`$9713=,=`"&]R(``/MU8BC4,7Z/>]___K
-M13P#=2'&0P$0QT,@`0```,=#!$A05`#'0PQ%2C,T9L=#$#``ZR#&0P1V#[=6
-M((U#!>C`O?__QD,,9`^W5B*-0PWHL+W__\9#''(/ME8=C4,=Z&"]__^+1"0@
-MB4,DN`````#K!;C_____@\0(6UY?7<.0C70F`%575E.#[`R+="0HN`````#&
-M!#``@\`!/2@-``!U\HM$)""+F#P%```/MD0D)(E$)`2)'"3H_/___XG!9H7`
-M=`T/M\"`O`.P!```_W5+BYL\!0``@</`#```BX,\!0``B00DZ/S___\I1"0D
-M#[9$)"2)1"0$B1PDZ/S___^)P6:%P`^$1P,```^WP("\`[`$``#_#X0V`P``
-M#[?!#[:$`[`$``!F@?F!``^'50(``(N+J`4```^WP&G`%`T``(TL`8M5#(72
-M=&P/MH,P!0``//]T%0^VP&G`%`T``(T$`;^`````.<)T(`^V@S$%```\_W0:
-M#[;`:<`4#0``C00!.<)U"K^!````B?B(1@*`?3(`="^Z``````^VP@^V3`5`
-MN`$```#3X`E&((/"`3A5,G80Z^3&1@+_BT4(#[9`"8E&(,8&`0^V13&(1@&+
-M14B)1@2+14R)1@B-3@R-55B+15B)1@R+0@2)002+0@B)00B+0@R)00R+17")
-M1AR+1"0DB48D@+V0``````^$1@(``,9$)`L`#[9\)`N-!+_!X`.-##`!Z(V0
-MD`````^V6@2(F:@````/ME(%B)&I````BX"8````#[8`@^`/B(&J````@/L#
-M="V`^P-W#H#[`@^%K0```.FV````@/L$D(UT)@!T/H#[$@^%E0```)"-="8`
-MZV:-#+_!X0.+E`V8````#[9"`8/@!P^VP,'@"`^V4@(!T(T$@`'`B80.K```
-M`.MNC02_C13%`````(N$%9@````/MD`"A,!U#<>$%JP`````````ZTB-%+\/
-MML"#Z!2)A-:L````ZS:-#+_!X0.+E`V8````#[9"`L'@"`^V4@,!T(T$@`'`
-MB80.K````.L.C02_QX3&K`````````"-!+_!X`.-G`:@````C4L0C80%D```
-M`(U0#(M`#(E#$(M"!(E!!(M""(E!"(M"#(E!#(M"$(E!$(M"%(E!%(M"&(E!
-M&(M"'(E!'(!$)`L!#[9$)`LXA9`````/AM<```#ID?[__P^WT&G2L````(G7
-M`[N,!0``QD8"_\8&`HN#C`4```^V1`(?B$8!BT=4#[9`"8E&(`^VAZ4````\
-M`G4MQT8$2%!4`(U&#,=&#%)O8VO'0`1E=%-TQT`(;W(@``^W5R*-1A?H%[K_
-M_^M%/`-U(<9&`1#'1B`!````QT8$2%!4`,=&#$5*,S1FQT80,`#K(,9&!'8/
-MMU<@C48%Z."Y___&1@QD#[=7(HU&#>C0N?__QD8<<@^V5QV-1AWH@+G__XM$
-M)"2)1B2X`````.L,N/_____K!;@`````@\0,6UY?7<.-M"8`````C;PG````
-M`%575E.#[`R+="0HN`````#&!#``@\`!/:0,``!U\HM$)""+F#P%```/MD0D
-M)(E$)`2)'"3H_/___XG!9H7`=`T/M\"`O`.P!```_W5+BYL\!0``@</`#```
-MBX,\!0``B00DZ/S___^+5"0D*<(/ML*)1"0$B1PDZ/S___^)P6:%P`^$'@,`
-M``^WP("\`[`$``#_#X0-`P``#[?!#[:$`[`$``!F@?F!``^',P(``(N+J`4`
-M``^WP&G`%`T``(TL`8M5#(72=&P/MH,P!0``//]T%0^VP&G`%`T``(T$`;^`
-M````.<)T(`^V@S$%```\_W0:#[;`:<`4#0``C00!.<)U"K^!````B?B(1@*`
-M?3(`="^Z``````^VP@^V3`5`N`$```#3X`E&((/"`3A5,G80Z^3&1@+_BT4(
-M#[9`"8E&(,8&`0^V13&(1@&+14B)1@2+14R)1@B-3@R-55B+15B)1@R+0@2)
-M002+0@B)00B+0@R)00R+17")1AR`O9``````#X0D`@``QD0D"P`/MGPD"XT$
-MO\'@`XT,,`'HC9"0````#[9:!(A9)`^V4@6(426+@)@````/M@"#X`^(02:`
-M^P-T+8#[`W<.@/L"#X6A````Z:<```"`^P20C70F`'0[@/L2#X6)````D(UT
-M)@#K78T,O\'A`XN4#9@````/MD(!@^`'#[;`P>`(#[92`@'0C02``<")1`XH
-MZV*-!+^-%,4`````BX05F`````^V0`*$P'4*QT06*`````#K/XT4OP^VP(/H
-M%(E$UBCK,(T,O\'A`XN4#9@````/MD("P>`(#[92`P'0C02``<")1`XHZPN-
-M!+_'1,8H`````(T$O\'@`XU<!B"-2PR-A`60````C5`,BT`,B4,,BT($B4$$
-MBT((B4$(BT(,B4$,BT(0B4$0BT(4B4$4BT(8B4$8BT(<B4$<@$0D"P$/ME0D
-M"SB5D`````^&T````.FL_O__#[?0:=*P````B=<#NXP%``#&1@+_Q@8"BX.,
-M!0``#[9$`A^(1@&+1U0/MD`)B48@#[:'I0```#P"=2W'1@1(4%0`C48,QT8,
-M4F]C:\=`!&5T4W3'0`AO<B``#[=7(HU&%^A)MO__ZT4\`W4AQD8!$,=&(`$`
-M``#'1@1(4%0`QT8,14HS-&;'1A`P`.L@QD8$=@^W5R"-1@7H$K;__\9&#&0/
-MMU<BC48-Z`*V___&1AQR#[97'8U&'>BRM?__N`````#K#+C_____ZP6X````
-M`(/$#%M>7UW#C;0F`````%575E.#[`B+7"0DN`````#&!!@`@\`!/0`!``!U
-M\HM$)!R+N#P%```/MD0D((E$)`2)/"3H_/___XG!9H7`=`T/M\"`O`>P!```
-M_W5+B[\\!0``@<?`#```BX<\!0``B00DZ/S___^+5"0@*<(/ML*)1"0$B3PD
-MZ/S___^)P6:%P`^$P@$```^WP("\![`$``#_#X2Q`0``#[?!#[:$![`$``!F
-M@?F!``^'UP```(N/J`4```^WP&G`%`T``(TT`8M6#(72=&P/MH<P!0``//]T
-M%0^VP&G`%`T``(T$`;V`````.<)T(`^VAS$%```\_W0:#[;`:<`4#0``C00!
-M.<)U"KV!````B>B(0P*`?C(`="^Z``````^VP@^V3`9`N`$```#3X`E#((/"
-M`3A6,G80Z^3&0P+_BT8(#[9`"8E#(,8#`0^V1C&(0P&+1DB)0P2+1DR)0PB-
-M2PR-5EB+1EB)0PR+0@2)002+0@B)00B+0@R)00R+1G")0QRX`````.G)````
-M#[?0:=*P````B=8#MXP%``#&0P+_Q@,"BX>,!0``#[9$`A^(0P&+1E0/MD`)
-MB4,@#[:&I0```#P"=2W'0P1(4%0`C4,,QT,,4F]C:\=`!&5T4W3'0`AO<B``
-M#[=6(HU#%^CEL___ZT4\`W4AQD,!$,=#(`$```#'0P1(4%0`QT,,14HS-&;'
-M0Q`P`.L@QD,$=@^W5B"-0P7HKK/__\9##&0/MU8BC4,-Z)ZS___&0QQR#[96
-M'8U#'>A.L___N`````#K!;C_____@\0(6UY?7<.-=@"-O"<`````@^PLB5PD
-M'(ET)"")?"0DB6PD*(M\)#"+;"0TBT=LB40D%(M%)(DXBT=@A<!U$L9%9@*)
-M+"3_57#IN`4``(UV`/9`*`)T$L9%9@*)+"2-=@#_57#IG04``(M,)!2)#"3H
-M_/___XG&A<!U%L9%9@*)+"3_57#I?`4``(VT)@````#'0&0`````B6A(BT=@
-MB488BT=@#[=`'&:)1A#&1A2`#[9%9#P"#X19`0``/`)W"83`="+INP(``#P#
-MC;8`````#X3!`0``/`0/A:4"``")]NF-`0``BT=@]D`X`8UT)@`/A)`````/
-MMD5EJ`)T!L9&)(CK$(/@!#P!&<"#X`6#Z':(1B2+34B+74P/MT509HE$)!K&
-M1B4`B=C!Z!B(1B:)V,'H$(A&)XG8P>@(B$8HB%XIB<@/K-@8B$8JB<@/K-@0
-MB$8KB<@/K-@(B$8LB$XMQD8N`,9&+P`/MT0D&F;!Z`B(1C`/MDPD&HA.,<9&
-M,@#&1C,`ZVL/MD5EJ`)T!L9&)"CK$(/@!#P!&<"#X`6#P"J(1B2+34B+74P/
-MMT509HE$)!K&1B4`B<@/K-@8B$8FB<@/K-@0B$8GB<@/K-@(B$8HB$XIQD8J
-M``^W1"0:9L'H"(A&*P^V3"0:B$XLQD8M`(M'8`6X````B48XQD8<(`^W1"0:
-MP>`)B48@@TYD`NE\`0``#[9%2#P0=P7V!P)U"<9%9@;IK0,``(U.)`^VP(U5
-M4(E$)`B)5"0$B0PDZ/S___^+1V`%N````(E&.,9&'""!3F0``!``QD85J_9%
-M908/A"D!``"+14R)1B#I'@$```^V166#X#`\('41QD8D&\9&)0'&1B@`Z0(!
-M``#&1B0UZ?D```"+1V`/MD`D@^`%@_@%=1.!3F0``"``#[=55&8[54IU#NM<
-MQD5F!HUV`.D2`P``#[9%4SSCD(UT)@!T0SSC=Q(\0G0[/+"-="8`="`\0'4B
-MZRT\[(VV`````'00/.]T'SSE=0Z-M@````#K$V:)54KK#<9%9@:-="8`Z<("
-M``#&1B2P#[=%2(A&)0^W14J(1B8/MT5,B$8G#[=%3HA&*`^W15"(1BD/MD52
-MB$8J#[9%4XA&*P^V14F(1BP/MD5+B$8M#[9%38A&+@^V14^(1B\/MD51B$8P
-M]D5E!G0=#[=%5,'@"8E&((-.9`3K#<9%9@;I2P(``(UT)@#'1FSPM@$`#[9%
-M9:@&#X0>`@``J`)T!H-.9`CK!(-.9!"-?CR+76B%VW0&]D5E`74\BU5LA=(/
-MA","``#'1"0(`````(M,)!2+@3P&``")1"0$B2PD_]*%P`^$``(``(M$)!2+
-MF#P&``"%VW1(B30DZ/S____'1"0$`````(D\).C\____@\,0BT/PB40D#(M#
-M^(M3_(E$)`2)5"0(B3PDZ/S___^+0_2#PQ"%P`^%@@$``.O3QT0D!`````")
-M/"3H_/___XM&(#T`"```=T.+3"04B0PDZ/S___^)PH7`=0G&168+Z5T!``"+
-M0`B)1C2)5E"+1B")1"0,BT(,BU(0B40D!(E4)`B)/"3H_/___^M3/0```0!W
-M0XM$)!2)!"3H_/___XG"A<!U"<9%9@OI$P$``(M`"(E&-(E64(M&((E$)`R+
-M0@R+4A")1"0$B50D"(D\).C\____ZPG&168&Z>(````/MD5EJ`20C70F``^$
-MOP```(!]9`-U(HM-6(7)=!N+5C2+1B")1"0(B4PD!(D4).C\____Z9<```"+
-M56B%TG4-BU5LA=(/A;D```#K:(M^-*@!=0F)TY"-="8`ZS"+56R%TG0IQT0D
-M"`$```"+3"04BX$\!@``B40D!(DL)/_2A<!T"HM$)!2+F#P&``"#PQ"+0_B+
-M4_")5"0(B40D!(D\).C\____`WOPBT/T@\,0A<!U'>O;BT8@BU8TA<!T$<8"
-M`(/"`8/H`70&Z_.#3F0!B70D!(M,)!2)#"3H_/___^LNB70D!(M$)!2)!"3H
-M_/___XDL)/]5<.L6NP````#I3/[__XM^-(UT)@#I5/___XM<)!R+="0@BWPD
-M)(ML)"B#Q"S#C;0F`````%=64X/L$(M\)""+="0DN`````#&!#``@\`!@_AX
-M=?2#OT@%```!#Y1&$P^V5R(/MD\A#[9?(`^V1R.(1@.(5@*(3@&('H!.$1`/
-MMT<89HE&!`^W1QIFB48&BX=(!0``B$9LQD82(`^W5QIF@?H@(70'9H'Z(B%U
-M1\9&%P*-1CS'1CQ2;V-KQT`$97120<=`"$E$(%/'0`Q31"`RQT`0,3)X(,=`
-M%$-O;G3'0!AR;VQL9L=`'&5RQD`>`.G^````C8+PV/__9H/X`7829H'Z0"%T
-M"V:!^D0A#X6E````QD87!`^W5QJ-@O#8__]F@_@!=T.-1CS'1CQ2;V-KQT`$
-M97120<=`"$E$(#+'0`PW,7@@QT`04T%3(,=`%$-O;G3'0!AR;VQL9L=`'&5R
-MQD`>`.F)````9H'Z0"%T!V:!^D0A=7N-1CS'1CQ2;V-KQT`$97120<=`"$E$
-M(%/'0`Q31"`RQT`0,31X(,=`%$-O;G3'0!AR;VQL9L=`'&5RQD`>`.L[QD87
-M"(U&/,=&/%)O8VO'0`1E="`WQT`(-3`@4\=`#$%402#'0!!#;VYTQT`4<F]L
-M;&;'0!AE<L9`&@#&1A<HQD82`<9&$"B-1AC'1AA(:6=HQT`$4&]I;L=`"'0@
-M5&7'0`QC:&YOQT`0;&]G:<=`%&5S+"#'0!A);F,NQD`<`(N'1`4``(7`=!"+
-M0`B)1F2)PL'Z'XE6:.L.BT<(B49DB<+!^A^)5FC'1F``(```QT0D!'P```"+
-M1Q")!"3H_/___XG"@>+P`P``P>H$B%9M@^`/B$9OQT0D!(````"+1Q")!"3H
-M_/___XG"@>(``/`#P>H4B%9N)0``#P#!Z!"(1G"#Q!!;7E_#C;8`````55=6
-M4X/L'(M\)#"+="0TBUPD.+@`````Q@08`(/``3V<````=?*)<PB#_A-^"8''
-MP`P``(/N%+@`````@[RWL`(````/A9\"``")G+>P`@``B7MLBT0D/(E#<(M,
-M)$")2WB`?SD!#X5X`@``@?Z%````#X]:`@``#[:$-[`$```\_P^$2@(```^V
-MP&:)1"08#[?`:<`H`0``B<4#KW`%``#V12<$#X0G`@``BT4D)0#__P`]``#_
-M``^%%`(``/9%*`0/A(<!``#&A;0`````#[9-)`^VT8G0@^`&@_@&=3GVP@$/
-MA`,!``#&128%QD4G!(EL)`P/MD5-B40D"(M%,(E$)`2+12R)!"3H_/___[@!
-M````Z=`!``"#^`0/A<(!``#VP0$/A+D!``"+72R+132%P`^%@@```,9%)@/&
-M12<$@'L*`'11O@````"-0SB)1"04BTPD%(D,).C\____B<*+0SR)4SR+3"04
-MB0J)0@2)$(!Z)O]T%3G5=!'&A;4````!N`$```#I7`$``(/&`0^V0PHY\'^[
-M@+VU`````0^$/P$``(EL)`2)/"3H_/___[@!````Z2X!``"`>"8`#X4?`0``
-M9H-@,OV+131FQT`R(`"+132)1"0$B3PDZ/S___^X`0```.G]````BT4L#[9`
-M"8!_)@!T+[L`````#[;P#[;+B?#3^*@!=!3'1"0(`````(E,)`2)/"3H_/__
-M_X/#`3A?)G?9QD4G!L9%)@5FQX64``````");"0$B3PDZ/S___^X`0```.F:
-M````BVTL@'T*`'1>QD0D&P"-13B)1"00BTPD$(D,).C\____B<*+13R)53R+
-M3"00B0J)0@2)$(!Z)O]T'@^V0B4\(G0$/`UU$L>$M[`"````````N`````#K
-M0H!$)!L!#[9$)!LX10IWK@^W1"08B40D"(E<)`2)/"3H_/___[@!````ZQ?'
-MA+>P`@```````+@`````ZP6X`0```(/$'%M>7UW#D)"0D)"0D)"0D)"0D)"0
-MBT0D!`^V5"0,Q@`(QD`!$H!\)`@`=`F`2`($ZP>-=@"`8`+[A-)T"(!@#-_K
-M!HGV@$@,(+@4````PXVV`````//#C;0F`````(V\)P````!55U93@^PLBVPD
-M0(M\)$@/MD0D3(A$)!L/ME0D4(A4)!J+5"1$BT(8B40D*,="&`````"#?"0H
-M``^%70$``(DL).C\____B<:X`````(7V#X3]`0``B2PDZ/S___^)1"0HA<!U
-M%HET)`2)+"3H_/___[@`````Z=<!``#&1B0:QD8E",9&)@C&1B<`QD8H_\9&
-M*0#&1A6KBU0D1`^W0AQFB480B6X8QT8@_P```,=&9`@```"+1"0HBT`(B48T
-M!?\```")1CC&1APDBT0D*(E&4,=&;'#W`0#&1A2`C5X\QT0D!`````")'"3H
-M_/___\=$)`S_````BT0D*(M0$(M`#(E$)`2)5"0(B1PDZ/S___^)="0$B2PD
-MZ/S___^[R/___^L;QP0DZ`,``.C\____@^L!B2PDZ/S___^$VW0,#[9&%#R`
-M=-V$P'0]C40D*(E$)`2)+"3H_/___P^W1AZ)1"0$BU0D1(M"+(D$).C\____
-MB70D!(DL).C\____N`````#IR@```,=&4`````")="0$B2PDZ/S___^+1"0H
-MBU@(#[9$)!J)1"0(#[9$)!N)1"0$C4,$B00DZ/S___^)QL8#`,9#`0#&0P(`
-MQD,#`(E\)`2)+"3H_/___XU7)+@`````Q@00`(/``8/X$'7TC5X$QD<D%<9'
-M)1&(7RC&1RD`C7<\#[;;B5\@QT=D`````(M4)"B+0@B)1S2)5U#'1"0$````
-M`(DT).C\____B5PD#(M$)"B+4!"+0`R)1"0$B50D"(DT).C\____N`$```"#
-MQ"Q;7E]=PY"0D)"0D%.+7"0(BT0D#(G"9HE#!,9#"@!FQT,(``!FA<!T&H/J
-M`;D`````BP-FB10(@\$"@^H!9H/Z_W7N6\.-M@````!64XM<)`R+1"00B<9F
-MB4,$QD,*`6;'0P@``&:%P'0BN@````"Y`````(VT)@````"+`V:)%`B#P@&#
-MP0)F.?)U[UM>PXVV`````(V_`````%.+7"0(@'L*`74J#[=#"`^WR(L3#[<4
-M2H/``6:)0PAF.T,&<@9FQT,(``!F@VL$`0^WPNL4BQ,/MT,$@^@!9HE#!`^W
-MP`^W!$);PY"-="8`@^P(B1PDB70D!(M<)`R+3"00B<Z`>PH!=28/MU,$#[=#
-M"`'"#[=#!HG&B=#!^A_W_HL#9HD,4&:#0P0!ZQ:)]@^W0P0/M\B+$V:)-$J#
-MP`%FB4,$BQPDBW0D!(/$",.0BT0D!&:#>`0`#Y3`#[;`PXM$)`2+"#G(=0>Y
-M`````.L*BQ&+002)0@2)$(G(PXGV5U93BU0D$(M,)!0/MGPD&(GXA,!T-@^V
-M`HG3O@`````Z`704ZQ\/ME,!#[9!`8/#`8/!`3C"=0V#Q@&)\HGX.,)UX^L'
-MN`````#K!;@!````6UY?PXUT)@"-O"<`````BT0D!,9``0"+5"0(B%`"QT`$
-M`````,.)]HV\)P````!55U93BTPD%(M\)!B+;"0<BW0D(`^V40$/ML*-!$#!
-MX`*)PP-9"(/"`8A1`0%Q!+@`````Q@08`(/``8/X#'7TB3N):P2)\(A#"(GR
-M#[;&B$,)P>H0@^(_#[9#"H/@P`G0B$,*6UY?7<.-M"8`````BU0D!`^V0@$Z
-M`@^2P`^VP,/K#9"0D)"0D)"0D)"0D)!3#[=,)`P/MEPD$(M4)`BX`````(!Z
-M`O]U"&:)"HA:`NL,@\`!@\($9CV``'7F#[?`6\.-M@````"-O"<`````@^P<
-MB5PD#(ET)!")?"04B6PD&(ML)""+3"0HBUPD+`^W1"0DC52%`(!Z`O]U"&:)
-M"HA:`NL9#[;#B40D"`^WP8E$)`2)+"3H_/___P^WP(M<)`R+="00BWPD%(ML
-M)!B#Q!S#C;8`````C;PG`````%,/MUPD#`^V3"00BU0D"+@`````.$H"=1=F
-M.1IU$L9"`O]FQP+__^L3C;0F`````(/``8/"!&8]@`!UV`^WP%O#ZPV0D)"0
-MD)"0D)"0D)"05E.+7"0,#[=T)!`/MDPD%+H`````B=`X3),"=09F.323=`Z#
-MP`&#P@&!^H````!UY&8]@`!U!;B``0``#[?`6U[#C;0F`````(V\)P````"#
-M[!")'"2)="0$B7PD"(EL)`R+;"04#[9%)#P(=$@\*'1$/*@/A!8!```\B(UT
-M)@`/A%H!```\"G0L/"J-="8`="0\J@^$]@```#R*C70F``^$.@$``#PO=`P\
-MCXUT)@`/A>@!```\+P^$E0```#PO=R(\"G1D/`IW"CP(C70F`'5$ZU8\*'1[
-M/"J-M@````!U-.MO/(\/A/0````\CXGV=Q4\B`^$Y@```#R*C70F`'44Z=D`
-M```\J(VT)@````!T?CRJ='J^`````+\`````N`````#I9@$```^V12;!X`@/
-MME4G"=`/ME4E@^(?P>(0"=")QK\`````#[9%*.D]`0``#[95)L'B&`^V12?!
-MX!`)P@^V12D)P@^V12C!X`@)PHG6OP`````/MD4KP>`(#[95+`G0Z04!``"0
-MC70F``^V52;!XA@/MD4GP>`0"<(/MD4I"<(/MD4HP>`("<*)UK\`````#[95
-M*L'B&`^V12O!X!`)P@^V12T)P@^V12S!X`@)T.FV````C;8`````#[9%)HG"
-MN`````#!XA@/MDTGB<NY`````,'C$`G("=H/MDTMNP`````)R`G:#[9-*(G+
-MN0````#!XP@)R`G:#[9-*8G+N0`````)R`G:#[9-*KL`````#Z3+&,'A&`G(
-M"=H/MDTKNP`````/I,L0P>$0"<@)V@^V32R[``````^DRPC!X0B)Q@G.B=<)
-MWP^V52[!XA@/MD4OP>`0"<(/MD4Q"<(/MD4PP>`("="-=@")=5B)?5R)16!F
-M@TT2`8L<)(MT)`2+?"0(BVPD#(/$$,/K#9"0D)"0D)"0D)"0D)!64XMT)`P/
-MMT0D$+K_____9H7`="VZ_____[D`````@^@!#[?`C5@!#[8$,3'0#[;`P>H(
-M,Q2%X`L``(/!`3G9=>:)T%M>PXGVC;PG`````(/L3(M$)%`/ME`SB50D1`^V
-M4#*)5"1`#[90,8E4)#P/ME`PB50D.`^V4"^)5"0T#[90+HE4)#`/ME`MB50D
-M+`^V4"R)5"0H#[90*XE4)"0/ME`JB50D(`^V4"F)5"0<#[90*(E4)!@/ME`G
-MB50D%`^V4":)5"00#[90)8E4)`P/ME`DB50D"(E$)`3'!"3(!0``Z/S___^#
-MQ$S#D(UT)@!3@^P8BU0D((M,)"0/MD$!B$(!#[9!`HA"`HM!!(E"!(M:"`^V
+M?T5,1@$!`0D```````````$``P`!``````````````"P<`0``````#0`````
+M`"@`#@`+`````````````````%.+7"0(BT0D#(G"9HE#!,9#"@!FQT,(``!F
+MA<!T&H/J`;D`````BP-FB10(@\$"@^H!9H/Z_W7N6\.-M@````!64XM<)`R+
+M1"00B<9FB4,$QD,*`6;'0P@``&:%P'0BN@````"Y`````(VT)@````"+`V:)
+M%`B#P@&#P0)F.?)U[UM>PXVV`````(V_`````%.+7"0(@'L*`74J#[=#"`^W
+MR(L3#[<42H/``6:)0PAF.T,&<@9FQT,(``!F@VL$`0^WPNL4BQ,/MT,$@^@!
+M9HE#!`^WP`^W!$);PY"-="8`@^P(B1PDB70D!(M<)`R+3"00B<Z`>PH!=28/
+MMU,$#[=#"`'"#[=#!HG&B=#!^A_W_HL#9HD,4&:#0P0!ZQ:)]@^W0P0/M\B+
+M$V:)-$J#P`%FB4,$BQPDBW0D!(/$",.0BT0D!&:#>`0`#Y3`#[;`PXM$)`2+
+M"#G(=0>Y`````.L*BQ&+002)0@2)$(G(PXGV5U93BU0D$(M,)!0/MGPD&(GX
+MA,!T-@^V`HG3O@`````Z`704ZQ\/ME,!#[9!`8/#`8/!`3C"=0V#Q@&)\HGX
+M.,)UX^L'N`````#K!;@!````6UY?PXUT)@"-O"<`````BT0D!,9``0"+5"0(
+MB%`"QT`$`````,.)]HV\)P````!55U93BTPD%(M\)!B+;"0<BW0D(`^V40$/
+MML*-!$#!X`*)PP-9"(/"`8A1`0%Q!+@`````Q@08`(/``8/X#'7TB3N):P2)
+M\(A#"(GR#[;&B$,)P>H0@^(_#[9#"H/@P`G0B$,*6UY?7<.-M"8`````BU0D
+M!`^V0@$Z`@^2P`^VP,/K#9"0D)"0D)"0D)"0D)!3#[=,)`P/MEPD$(M4)`BX
+M`````(!Z`O]U"&:)"HA:`NL,@\`!@\($9CV``'7F#[?`6\.-M@````"-O"<`
+M````@^P<B5PD#(ET)!")?"04B6PD&(ML)""+3"0HBUPD+`^W1"0DC52%`(!Z
+M`O]U"&:)"HA:`NL9#[;#B40D"`^WP8E$)`2)+"3H_/___P^WP(M<)`R+="00
+MBWPD%(ML)!B#Q!S#C;8`````C;PG`````%,/MUPD#`^V3"00BU0D"+@`````
+M.$H"=1=F.1IU$L9"`O]FQP+__^L3C;0F`````(/``8/"!&8]@`!UV`^WP%O#
+MZPV0D)"0D)"0D)"0D)"05E.+7"0,#[=T)!`/MDPD%+H`````B=`X3),"=09F
+M.323=`Z#P`&#P@&!^H````!UY`^WP%M>PXGVC;PG`````(/L$(D<)(ET)`2)
+M?"0(B6PD#(ML)!0/MD4D/`AT2#PH=$0\J`^$%@$``#R(C70F``^$6@$``#P*
+M="P\*HUT)@!T)#RJ#X3V````/(J-="8`#X0Z`0``/"]T##R/C70F``^%Z`$`
+M`#PO#X25````/"]W(CP*=&0\"G<*/`B-="8`=43K5CPH='L\*HVV`````'4T
+MZV\\CP^$]````#R/B?9W%3R(#X3F````/(J-="8`=13IV0```#RHC;0F````
+M`'1^/*IT>KX`````OP````"X`````.EF`0``#[9%)L'@"`^V52<)T`^V526#
+MXA_!XA`)T(G&OP`````/MD4HZ3T!```/ME4FP>(8#[9%)\'@$`G"#[9%*0G"
+M#[9%*,'@"`G"B=:_``````^V12O!X`@/ME4L"=#I!0$``)"-="8`#[95)L'B
+M&`^V12?!X!`)P@^V12D)P@^V12C!X`@)PHG6OP`````/ME4JP>(8#[9%*\'@
+M$`G"#[9%+0G"#[9%+,'@"`G0Z;8```"-M@`````/MD4FB<*X`````,'B&`^V
+M32>)R[D`````P>,0"<@)V@^V32V[``````G("=H/MDTHB<NY`````,'C"`G(
+M"=H/MDTIB<NY``````G("=H/MDTJNP`````/I,L8P>$8"<@)V@^V32N[````
+M``^DRQ#!X1`)R`G:#[9-++L`````#Z3+",'A"(G&"<Z)UPG?#[95+L'B&`^V
+M12_!X!`)P@^V13$)P@^V13#!X`@)T(UV`(EU6(E]7(E%8&:#31(!BQPDBW0D
+M!(M\)`B+;"0,@\00P^L-D)"0D)"0D)"0D)"0D(/L3(M$)%`/ME`SB50D0`^V
+M4#*)5"0\#[90,8E4)#@/ME`PB50D-`^V4"^)5"0P#[90+HE4)"P/ME`MB50D
+M*`^V4"R)5"0D#[90*XE4)"`/ME`JB50D'`^V4"F)5"08#[90*(E4)!0/ME`G
+MB50D$`^V4":)5"0,#[90)8E4)`@/MD`DB40D!,<$)`````#H_/___X/$3,.)
+M]HV\)P````!3@^P8BU0D((M,)"0/MD$!B$(!#[9!`HA"`HM!!(E"!(M:"`^V
M0@&-!$#!X`*+40B)1"0(B50D!(D<).C\____@\086\.-="8`C;PG`````%.+
-M5"0(BUI$#[9*/+@`````Q@00`(/``8/X<'7TB5I$B$H\6\.-="8`C;PG````
+M5"0(BUI$#[9*/+@`````Q@00`(/``8/X='7TB5I$B$H\6\.-="8`C;PG````
M`(M4)`2X`````(VT)@````#&!!#_@\`!/0`"``!U\O/#BT0D!+D`````.P!T
-M#8M(!(L1BT$$B4($B1")R,.0D)!3BTPD"(L9BX,$`0``B<*!XG[__O^)DP0!
-M```E?O_R_XM1!(D"BU$$B4(,BU$$B4(0BU$$B4(4BU$$B4(8BU$$B4($BP&+
-M@%0!``"C`````"7^`/__BQ&)@E0!``!;PY!3BUPD"`^V3"0,BP.+D`0!``")
+M#8M(!(L1BT$$B4($B1")R,.0D)!3BUPD"(L+BY$$`0``B=`E?O_^_XF!!`$`
+M`('B?O_R_XM#!(D0BT,$B5`,BP.+@%0!``"C`````"7^`/__BQ.)@E0!``!;
+MPXGVC;PG`````%.+7"0(#[9,)`R+`XN0!`$``(D5``````^W0R1F/8!D=`YF
+M/8"1=`AF/8"4=1.)]@^VR8/!"+@!````T^`)PNL/#[;)@\$,N`$```#3X`G"
+MBP.)D`0!``!;PXVV`````%.+7"0(#[9,)`R+`XN0!`$``(D5``````^W0R1F
+M/8!D=`YF/8"1=`AF/8"4=1.)]@^VR8/!"+C^____T\`APNL/#[;)@\$,N/[_
+M___3P"'"BP.)D`0!``!;PXVV`````(/L"(D<)(ET)`2+="0,#[9,)!"`^?]T
+M;H#Y'W<SBYX8`0``N@$```#3XHG0]]`AV(F&&`$``(N&6`$``*,`````(=!T
+M08F&6`$``.LYC78`BYX<`0``#[;!@^@@N@$```")P=/BB=#WT"'8B88<`0``
+MBX9@`0``HP`````AT'0&B89@`0``BQPDBW0D!(/$",/K#9"0D)"0D)"0D)"0
+MD)"#[!R)7"0,B70D$(E\)!2);"08BVPD*`^V5"0DBT0D((LX@/H#=GP/MMK!
+MXP.-M!\``@``QP8,`0``QP0D$"<``.C\____C9P?!`(```^V50/!XA@/MD4"
+MP>`0"<(/MD4`"<(/MD4!P>`("<*)$\<&$`$``,<$)!`G``#H_/___P^V50?!
+MXA@/MD4&P>`0"<(/MD4$"<(/MD4%P>`("<*)$^MZ#[;:P>,#C;0[``(``,<&
+M#`$``,<$)!`G``#H_/___XV<.P0"```/ME4#P>(8#[9%`L'@$`G"#[9%``G"
+M#[9%`<'@"`G"B1/'!A`!``#'!"00)P``Z/S___\/ME4'P>(8#[9%!L'@$`G"
+M#[9%!`G"#[9%!<'@"`G"B1.+7"0,BW0D$(M\)!2+;"08@\0<P^L-D)"0D)"0
+MD)"0D)"0D(/L'(E<)!2)="08BW0D(`^V7"0DB5PD!(DT).C\____QP0D$"<`
+M`.C\____B5PD!(DT).C\____BUPD%(MT)!B#Q!S#C;8`````C;\`````55=6
+M4X/L#(ML)"`/ME0D)`^V1"0HB$0D"XM%`(!])@`/A$(!``"-F(0!``"-N-`!
+M``"^``````^VTHE4)`2)]HM$)`2)\=/XJ`$/A`,!``"#_@-V#HL#HP````"#
+MX/Z)`^L,BP.C`````(/@_HD#QP0D$"<``.C\____@'PD"P!T/H/^`W8.BP>C
+M`````(/(`HD'ZPR+!Z,`````@\@"B0>)^H/^`W8)BP*C`````.L'BP*C````
+M`*@"=&3KY8GV@_X#=BS'@ZP`````````QP0D$"<``.C\____BX.P````HP``
+M``"#R`&)@[````#K-,>#S`````````#'!"00)P``Z/S___^+@]````"C````
+M`(/(`8F#T````.LCC78`@_X#=AO'0_P!````BP.C`````(/(`8D#ZQF-M@``
+M``#'0_P!````BP.C`````(/(`8D#@\8!@\,(@\<$#[9%)CGP#X?8_O__@\0,
+M6UY?7<-64X/L!(M,)!0/MEPD&(M$)!"+,(/Y`W87C93.@`$``(L"HP````"#
+MX/Z)`NL5B?:-E,Z``0``BP*C`````(/@_HD"A-MT68/Y`W85C92.T`$``(L"
+MHP````"#R`*)`NL3C92.T`$``(L"HP````"#R`*)`HV$CM`!``"0C70F`(/Y
+M`W8+BQ")%0````#K"9"+$(D5`````/;"`G1SZ^&0@_D#=C6-',T`````C80S
+M,`(``,<``````,<$)!`G``#H_/___XV<,S0"``"+`Z,`````@\@!B0/K-HT<
+MS0````"-A#-0`@``QP``````QP0D$"<``.C\____C9PS5`(``(L#HP````"#
+MR`&)`XUV`(/$!%M>PY"0D)"0D)"0D)"#[!")'"2)="0$B7PD"(EL)`R+7"08
+MBTPD'`^W;"0@9H%[).$!=1`/MD,F@^@1O@`````\`78OBT0D%(L0B[K4!```
+M#[=#$+XDVP``9CV#`'<1#[?`#[:$`A@$``!I\-P```"--#?&000%@&$%_H`A
+MW[@`````9H%[).$!=1(/MD,F@^@!/`$/EL`/ML"-=@")PL'B!P^V`8/@/PG0
+MB`'V0V8!=01FB6D(#[=!"(A#%6:!>R3A`74H#[93)HU"_SP!=PT/ME,G@^(/
+MZR:-="8`C4+ON@\````\`786C70F`+H`````@WXP`'0'#[9618/B#P^V`8/@
+M\`G0B`&+'"2+="0$BWPD"(ML)`R#Q!##D%.+3"0(BQD/MX$\"```@\`!9HF!
+M/`@``&8[@4`(``!R"6;'@3P(``````^W@3P(``#!X`(#@30'``"+5"0,BQ*)
+M$`^W@3P(``")@RP!``!;P^L-D)"0D)"0D)"0D)"0D%93BTPD&`^W5"00#[9T
+M)!2+7"0,N`````"-M"8`````Q@0(`(/``8/X!'7T9H'B_P\/MP%F)0#P"=!F
+MB0$/ME,(P>(,BP$E_P_P_PG0B0$/MD,&@^`"@_@!&=*#X@*#P@'!X@4/MD$#
+M@^`?"="#R!"#X/>(00/V0P8!=!:)\H/B?\'B!`^W00)F)0_X"=!FB4$"6U[#
+MC70F`(V\)P````"+3"0$BU0D"+@`````C78`Q@00`(/``8/X#77T#[9!)8@"
+M#[9!)HA"`0^V02>(0@(/MD$HB$(##[9!*8A"!`^V02J(0@4/MD$KB$(&]D%F
+M!'0C#[9!+(A""`^V02V(0@D/MD$NB$(*#[9!+XA""P^V03"(0@RX`0```,.0
+MC70F`%575E.+;"04BWPD&+H`````O@$```#K4`'2B=C3^*@!=!#WP@````%U
+M%H'R=R?;`.L.]\(````!=`:!\G<GVP"#Z0&#^?]UT(/&`8/^"748B=#!Z!"(
+M10")T,'H"(A%`8A5`EM>7UW##[9</O^Y!P```.NDC;8`````C;\`````4XM<
+M)`@/MT0D#,'@`@.##`4``(L(A<ET,(L3#[=!'F;!Z`4/M\"-!(4``P``B8)P
+M`0``BQ,/MTD>@^$?N`$```#3X(F"=`$``%O#D(UT)@#SPXVT)@````"-O"<`
+M````@^P<B5PD#(ET)!")?"04B6PD&(ML)"`/MG0D)`^V5"0HB?`/MOB-'/T`
+M````C00[C43%`,>`<`@```````"$T@^$J@$``(GP/`-V-(M%``4``@```=C'
+M`"````#'!"00)P``Z/S___^+10`%!`(``(T$`XL`HP````#K.8UT)@")\`^V
+MV,'C`XM%``4``@```=C'`"````#'!"00)P``Z/S___^+10`%!`(```'#BP.C
+M`````,'H$(3`>2:)\`^VT`^V12F-!(*)1"0$QP0D6````.C\____N`````#I
+MA`$``(GP/`-V>`^VV,'C`XM%``4``@```=C'`"P```#'!"00)P``Z/S___^+
+M10`%!`(``(T$`XL`HP````"-%/\E_P```(F$U7`(``"+10`%``(``(T$`\<`
+M)````,<$)!`G``#H_/___XM%``4$`@```<.+`Z,`````)?___P#K>(GP#[;8
+MP>,#BT4`!0`"```!V,<`+````,<$)!`G``#H_/___XM%``4$`@``C00#BP"C
+M`````(T4_R7_````B835<`@``(M%``4``@``C00#QP`D````QP0D$"<``.C\
+M____BT4`!00"```!PXL#HP`````E____`(T4_\'@"`F$U7`(``"X`0```.MZ
+MC70F`(GP#[;0B=/!XPB)V0.-[`8``(L!HP````#!Z!"$P'D@#[9%*8T$@HE$
+M)`3'!"2$````Z/S___^X`````.LXB?:+20R)#0````"-%/^-5-4`B8IP"```
+MB=@#A>P&``"+0`2C`````,'@"`G(B8)P"```N`$```"+7"0,BW0D$(M\)!2+
+M;"08@\0<PXVV`````%575E.#[!R+;"0P@'TK`'0KN0````"+1"0T]D`(`700
+MZQJ+5"0T#[9""-/XJ`%U#(/!`0^V12MF.<AWYHM4)#2+0AR%P'0E@\!HBU44
+MB40D!(D4).C\____BU0D-(M"'(E$)`2)+"3H_/___XM$)#2#P"B+5"0T.4(H
+M#X1?`0``B40D&(M$)!B)!"3H_/___XG'@W@@``^$'@$``(!X1P!T:6:#?4P`
+M=&*^`````(GVC02U``````.%#`4``(L8A=MT/0^W0Q!F.T<<=3-F/8,`=RT/
+MM\"`O"@8!```_W0@QD,4(0^W0QZ)1"0$B2PDZ/S___^)7"0$B2PDZ/S___^#
+MQ@$/MT5,.?!_I8M'(,=`9`````#V1R@$=26)+"3H_/___XM'(,=$)`@!````
+MB40D!(DL).C\____C;8`````BU<@#[:"EP````^V4@*-!(`/MH0"``````^V
+M52(/MDTAB40D#(E4)`B)3"0$QP0DL````.C\____BT<@BY6@!```B40D"(E4
+M)`3'!"0!````Z/S___^+1R"+E:`$``")1"0(B50D!,<$)`8```#H_/___\='
+M(`````"+5"0T@&H)`8E\)`2)+"3H_/___XM4)!B+1"0T.5`H#X6E_O__BT0D
+M-,=`'`````"+10"+D%@!``")%0````"%TG0)BT4`B9!8`0``@\0<6UY?7<.)
+M]E575E.#["R+="1`BP:+@%`!``")1"0<HP````"+%B7P__\`B8)0`0``C;0F
+M`````/=$)!P`__\`#X1G!@``@'XK``^$708``,9$)"L`C78`#[9L)"N-30BX
+M`0```(G"T^*%5"0<=0^-31#3X(5$)!P/A!P&``"`?"0K`W89BP8%@`$``(T$
+MZ(L`HP````#!Z!.#X`'K%XL&!8`!``"-!.B+`*,`````P>@3@^`!A,!T)\=$
+M)`@`````B6PD!(DT).C\____A,!T#XU$[0"!C,9L"``````(`(L6@'PD*P-V
+M%8V$ZH`!``"+`*,`````)0```0#K$XV$ZH`!``"+`*,`````)0```0"%P'0Z
+M@'PD*P-V$HV$ZH`!``#'`````0#IK`4``(V$ZH`!``#'`````0#IF@4``(U$
+M[0"!C,9L"``````!`(!^,P$/A6\$``"`?"0K`W88BP8%@`$``(T$Z(L`HP``
+M``"#X`'K%HGVBP8%@`$``(T$Z(L`HP````"#X`&$P`^$60$``(U<[0#!XP.-
+MA!YT"```BU84B40D!(D4).C\____BX0>3`@``(7`=!V+4!R%TG06]D(N`G40
+MB00DZ/S___^$P`^%%`$``(U$[0"+A,9,"```A<`/A(L```")1"0D@'@)``^$
+MJ0```,9$)",`B<>#QRB-="8`B3PDZ/S___^)PXM'!(E?!(D[B4,$B1CV0R@"
+M=3V+4R"%TG0>BX:@!```B50D"(E$)`3'!"0%````Z/S___^`2R@"B5PD",=$
+M)`0&````BT0D)(D$).C\____@$0D(P$/ME0D(XM$)"0X4`EV+NN1#[9$)"O'
+M1"0(`0```(E$)`2)-"3H_/___\<$)*"&`0#H_/___[@`+3$!ZP6X0$M,`(U,
+M[0#!X0.-%#&)@G0(``#'@GP(``"P/0``#[9$)"N-!,"-A,9$"```B8*`"```
+MC80.=`@``(M6%(E$)`2)%"3H_/___X!\)"L#=C2-%.T`````BP8%@`$```'0
+MBP"C`````(L&!8`!```!PHL"HP````#!Z`>#X`'K,I"-="8`C13M`````(L&
+M!8`!```!T(L`HP````"+!@6``0```<*+`J,`````P>@'@^`!A,!T7X!\)"L#
+M=BJ-#.T`````BP8%A`$```'(BP"C`````(L6@<*$`0```=$-```!`(D!ZS6-
+M#.T`````BP8%A`$```'(BP"C`````(L6@<*$`0```=$-```!`(D!ZR2-="8`
+M@'PD*P-V&8L&!8`!``"-!.B+`*,`````P>@2@^`!ZQ>+!@6``0``C03HBP"C
+M`````,'H$H/@`83`#X31`0``#[9&*8U$A0`/ME8B#[9.(8E$)`R)5"0(B4PD
+M!,<$)-````#H_/___X!\)"L#=BJ-#.T`````BP8%@`$```'(BP"C``````T`
+M``0`BQ:!PH`!```!T8D!ZRB-#.T`````BP8%@`$```'(BP"C``````T```0`
+MBQ:!PH`!```!T8D!C43M`(N$QDP(``"%P'0+@W@<`'5_Z38!``"`?"0K`Y!V
+M.8T4[0````"+!@6``0```="+"(D-`````(L&!8`!``"-!`*)"(L&!8`!```!
+MPHL"HP````#IV@$``(T4[0````"+!@6``0```="+"(D-`````(L&!8`!``"-
+M!`*)"(L&!8`!```!PHL"HP````#IH0$``(MX'/9'+@(/A(4```#&1"0K`(!_
+M'@!T1L9$)"L`#[9$)"N+7(<XA=MT)8M3((72=!Z+AJ`$``")5"0(B40D!,<$
+M)`4```#H_/___X!+*`*`1"0K`0^V5"0K.%<>=[^-7VB+1A2)7"0$B00DZ/S_
+M___'1VA`2TP`QT=P`````(E_=(M&%(E<)`2)!"3H_/___^LJ#[9&*8U$A0`/
+MME8B#[9.(8E$)`R)5"0(B4PD!,<$)`````#H_/___XGV@'PD*P-V:0^V7"0K
+MP>,#BP8%@`$```'8BQ")%0````"+!@6``0``C00#B1"+!@6``0``C00#BP"C
+M`````(L&!3`"``"-!`/'``````#'!"00)P``Z/S___^+!@4T`@```<.+`Z,`
+M````ZV>0C70F``^V7"0KP>,#BP8%@`$```'8BQ")%0````"+!@6``0``C00#
+MB1"+!@6``0``C00#BP"C`````(L&!5`"``"-!`/'``````#'!"00)P``Z/S_
+M__^+!@54`@```<.+`Z,`````@$0D*P$/MD0D*SA&*P^'J_G__XL&BX!0`0``
+MB40D'*,`````BQ8E\/__`(F"4`$``/=$)!P`__\`=";I7OG__\=$)`@!````
+MB6PD!(DT).C\____A,`/A4KZ___I5/K__[@`````@\0L6UY?79##ZPV0D)"0
+MD)"0D)"0D)"05U93@^P0BW0D((L^@'X>`'0ONP`````/ML.+1(8XA<!T%XE$
+M)`C'1"0$(0```(M&3(D$).C\____@\,!.%X>=];'1"0(`````,=$)`0A````
+MBT9,B00DZ/S___]FQT8N(0#&1B81B70D!(D\).C\____@\006UY?PXVT)@``
+M``!55U93@^P<BTPD-(MT)#"+?DR++P^V1P>H$'0)QD8Q!ND]`0``#[96,8#Z
+M!'0.@/H&#X6=`0``Z28!``"#X/>#R!"(1P>+EH0```"-0@&)AH0```"#^@(/
+MAP4!``"+A90```")2`2)`8V%E````(E!!(F-E````(!^)@!T#;L`````@'X>
+M`'4/ZS2`?PD`B?9U2>FW````#[;#BT2&.(7`=!2)1"0(QT0D!"$```")/"3H
+M_/___X/#`3A>'G?9QT0D"`````#'1"0$(0```(D\).C\____Z?D```#&1"0;
+M`(U'*(E$)!2+5"04B10DZ/S___^)PXM'+(E?+(M4)!2)$XE#!(D8BT,@A<!T
+M'HE$)`B+A:`$``")1"0$QP0D!0```.C\____@$LH`HE<)`C'1"0$!@```(D\
+M).C\____@$0D&P$/MD0D&SA'"7>9]D8N`@^$?````(DT).C\____ZW*`9P?W
+MQX:$`````````(N%E````(E(!(D!C864````B4$$B8V4````@'X>`'0LNP``
+M```/ML.+1(8XA<!T%(E$)`C'1"0$!@```(D\).C\____@\,!.%X>=]G'1"0(
+M`````,=$)`0&````B3PDZ/S___^#Q!Q;7E]=PXUT)@"#[!R)7"00B70D%(E\
+M)!B+?"0@BW0D)`^W3B1F@?GA`74/#[9&)H/H$3P!#X8&`0``#[=&$+K_````
+M9CV#`'<+#[?`#[:4!Q@$```/M\)IP-P```")PP.?U`0``&:!^>$!=0T/MD8F
+M@^@!/`%V)XGV9H'Z_P!T!O9#)P1U&,9&%`:+1"0HQP``````N`$```#IJP``
+M``^V0R2#X`6#^`5U<P^V5RP/MD<Q.,)R*P^VP(E$)`@/ML*)1"0$QP0D'0``
+M`.C\____BT0D*,<``0```+@!````ZVB)="0$B1PDZ/S___^$P'45QD84(8M$
+M)"C'``````"X`0```.M#@'M''W81BT0D*,<``0```+@!````ZRR-ARP&``")
+M!"3H_/___X3`=!&+1"0HQP`!````N`$```#K";@`````C70F`(M<)!"+="04
+MBWPD&(/$',-55U93@^Q,BVPD9(M$)&"+L!`'``!FQT4>_P^-1"0PB40D"(EL
+M)`2+5"1@B10DZ/S___^$P'0)BT0D,.EX!```#[=5$+O_````9H'Z@P!W#P^W
+MPHM,)&`/MIP!&`0```^W321F@?GA`74/#[9%)H/H$3P!#X:4````9H'Z@P!W
+M3P^WPHM\)&`/MH0'&`0``#S_=#QF@_I_=QD/ML"+E]0$``!IP-P```"+1!`L
+M#[9`!.LB#[;`BWPD8(N7\`0``&G`E````(M$$$P/MD`$ZP6X_____P^VP(M4
+M)&`/MH0"G`0``&O`3(V$`N@```")1"0<#[?#:<#<`````X+4!```B40D(&:!
+M^>$!=3SK*`^WPVG`E````(M,)&`#@?`$``")1"0DBWA,B7PD',=$)"``````
+MZSD/ME4FC4+O/`%V)HU"_SP!=A]F@?O_`'0*BT0D(/9`)P1U#L9%%`:X````
+M`.E2`P``QT0D)`````"-1"1(B40D!(M4)&")%"3H_/___V:)1"0:9HE%'HM-
+M4(E,)"@/M_B)?"04:<>P!```C30PC48@BU0D8"N"$`<``(G"P?H?BTPD8`.!
+M%`<``!.1&`<``(M,)$B)02"+3"1(B5$DBWPD*(M'#(M7$(M,)$B)02B+3"1(
+MB5$LBT0D2`^W5"0:9HE0"+@`````C70F`,8$,`"#P`$]L`0``'7R9H%]).$!
+M=6H/MD4F@^@1/`%W7XU$)#>)1"0,BT0D2`^V0`B)1"0(B6PD!(M,)"")#"3H
+M_/___XV&(`0``(M\)&`KAQ`'``")PL'Z'P.'%`<``!.7&`<``(M,)$B)01"+
+M3"1(B5$4Z:\```"-M"8`````BWPD'/9'!@$/A)H```#V168@=!*-1"0WB40D
+M!(DL).C\____ZR2-1"0WB40D#(M$)$@/MD`(B40D"(EL)`2+1"0@B00DZ/S_
+M__^-AB`$``"+5"1@*X(0!P``B<+!^A^+3"1@`X$4!P``$Y$8!P``BTPD2(E!
+M$(M,)$B)412)\(M\)&`KAQ`'``")PL'Z'P.'%`<``!.7&`<``(M,)$B)01B+
+M3"1(B5$<#[95/8M$)$AFB5`"@'T]`'0XOP````"[`````(M$)"B+2`B+542+
+M!!J)!!F+1!H$B409!(M$&@B)1!D(@\<!@\,,#[9%/3GX=]*+52"+1"1(B5`,
+M#[=<)!J)7"0,BT0D2(E$)`B);"0$BU0D'(D4).C\____C40D-XE$)`R)="0(
+MB6PD!(M,)&")#"3H_/___XM\)&"+APP%``"+5"04B2R0#[=4)!IFP>H%#[?2
+MB=F#X1^X`0```-/@"827$`4``&:!?23A`75/#[9%)H/H$3P!=T2+3"0DB4PD
+M!(D\).C\____C40D1(E$)`R+?"0D#[9',(E$)`B)7"0$BT0D'(D$).C\____
+M@ST``````G4_ZWB0C70F`(M4)"")5"0$BTPD8(D,).C\____C40D1(E$)`R+
+M?"0@#[9'.HE$)`B)7"0$BT0D'(D$).C\____C40D1(E$)`2+5"1@B10DZ/S_
+M__^+1B"+5B2)T0G!=!N)1"0$B50D",<$)/P```#H_/___[@#````ZP6X`P``
+M`(/$3%M>7UW#55=64X/L#(MT)""-OI0```#I"@$``(D\).C\____B<,/ME`0
+M9HE0$&:#^G]V$V:!>"3A`74B#[9`)H/H$3P!=Q=F@?J#`'<0#[?"#[:4!A@$
+M``"`^O]U&,9#%`:)7"0$B30DZ/S____ILP```(UV`&:!>R3A`748#[9+)HU!
+M[SP!#X>G````ZRZ-M"8`````#[;":<#<`````X;4!```]D`G!'42QD,4!HE<
+M)`2)-"3H_/___^MIB5PD!(DT).C\____@_@"=PJ#^`%S)8UV`.L0@_@#=4F)
+M]HV\)P````#K+(E<)`2)-"3H_/___XGVZRZ-EI0```"+AI0```")6`2)`XE3
+M!(F>E````.M#B5PD!(DT).C\____C;8`````.;Z4````#X7J_O__ZR.+KM0$
+M``"-0?\\`0^&>/___P^VPFG`W````(U$!0#I3O___X/$#%M>7UW#C;0F````
+M`(/L+(E<)!R)="0@B7PD)(EL)"B+?"0TBT0D,(MP+(LNNP````!F@7\DX0%U
+M$P^V1R:#Z`$\`0^6P`^VV(UT)@"+5"0P#[:"E````#P$=!$\!@^%40(``.GG
+M`0``C70F`(M,)##&@98`````BT0D,(M(((7)=1\/MI#9````C4(!BTPD,(B!
+MV0```(#Z`@^'L`$``.L2BU$$C4(!B4$$@_HH#X><`0``BX64````B7@$B0>-
+MA90```")1P2)O90```#&1Q2`BT0D,(E$)`C'1"0$(0```(DT).C\____A=L/
+MA<,!``"+5"0P@'HF_W0XB=&+4C"%T@^$K`$``(!Z)@!T)?9"+@(/A)P!```/
+MMDE%N`$```#3X`E"-(M$)#"`2"@0Z8$!```/MD8'@^#W@\@0B$8'@'X)`'1:
+MOP````"-5BB)5"08BTPD&(D,).C\____B<.+1BR)7BR+5"08B1.)0P2)&(M#
+M((7`=!Z)1"0(BX6@!```B40D!,<$)`4```#H_/___X!+*`*#QP&)^3A."7>R
+MBT0D,(M0,(72=3;&0"8#9L>`C```````B40D",=$)`0A````B30DZ/S___^+
+M5"0PB50D!(DL).C\____Z=,```#V0BX"#X3)````BT0D,`^V2$6X`0```-/@
+M"4(TBU0D,(!**!"+0C"#P&B)1"0$BT44B00DZ/S___^+3"0PBT$PQT!H@(0>
+M`(M!,,=`<`````"+03")0'2+03"#P&B)1"0$BT44B00DZ/S____K98M$)#`/
+MME@F@&8'[XN%E````(EX!(D'C864````B4<$B;V4````BU0D,(E4)`C'1"0$
+M!@```(DT).C\____@/O_=1J+3"0PB4PD"(ET)`2)+"3H_/___XVV`````(DL
+M).C\____BUPD'(MT)""+?"0DBVPD*(/$+,.-="8`55=64X/L#(ML)""+C=0$
+M``"+5"0D#[="$+HDVP``9CV#`'<1#[?`#[:$!1@$``!IT-P```"--!&)="0$
+MB2PDZ/S___^)="0$B2PDZ/S___^+3"0D#[=!'HE$)`2)+"3H_/___XM4)"0/
+MMT(>B40D!(DL).C\____BTPD)&;'01[_#XL1BT$$B4($B1"`;D<!C7X0.7X0
+M=%N-A90```")1"0(B3PDZ/S___^)PP^W0!Z)1"0$B2PDZ/S___\/MT,>B40D
+M!(DL).C\____9L=#'O\/@&Y'`8N%E````(E8!(D#BU0D"(E3!(F=E````#E^
+M$'6OQH:4````!(M,)"2)3"0$B30DZ/S___^X`0```(/$#%M>7UW#B?:-O"<`
+M````55=64X/L;(N<)(````"+C"2(````B4PD6(N$)(P```")1"1<BRL/MX0D
+MA````,'@`@.%#`4``(LX9H%_).$!=2\/MD<F@^@1/`%W)(M3'`^V0C"(1"0G
+MO@`````+3"1<=5G&0C$`O@````#K3HUV`(N5U`0``+@DVP``9H%_$(,`=Q(/
+MMT<0#[:$!1@$``!IP-P```"--`(/ME8ZB%0D)[H`````BT0D6`M$)%QU#,:&
+ME`````"Z`````(!_%(%U!(!C!_>+1"18"T0D7`^%+P$``,9'%`"#/0`````!
+M=1=F@7\DX0%U#P^V1R:#Z!$\`7<$QD<4(?9'9B`/A"\$``"+1TB%P`^$)`0`
+M`(G#]D!E`G0ABTA8A<ET&HM7-(72=!.+1R")1"0(B50D!(D,).C\____BY7L
+M!@``@<)`"```#[9&.L'@"`'"BP*C`````(G"P>H0B%-3P>@89HE#2(N5[`8`
+M`('"1`@```^V1CK!X`@!PHL2B14`````#[;"9HE#3`^VQF:)0TZ)T,'H$`^V
+MP&:)0U#!ZAB(4U*+E>P&``"!PDP(```/MD8ZP>`(`<*+`J,`````#[;`9HE#
+M2HN5[`8``('"2`@```^V1CK!X`@!PHL"HP````")PL'B"&8)4TR)PH'B`/\`
+M`&8)4T[!Z`@E`/\``&8)0U#I+@,```^W1QYIP+`$```#A1`'``")1"0H!2`$
+M``")1"0L@'\4@'4+QD<4(8VT)@````"%]@^$H0```(M6((72=$L/MH*7````
+M#[92`HT$@`^VC`(`````#[9=(@^V=2&+1"18BU0D7(E$)!")5"04B4PD#(E<
+M)`B)="0$QP0D*`$``.C\____Z98```"+4Q@/MD4I#[92!(T$@@^V5D6-!(`/
+MMHP"``````^V72(/MG4ABT0D6(M4)%R)1"00B50D%(E,)`R)7"0(B70D!,<$
+M)"@!``#H_/___^M'A=)T0XM#&`^V32D/MD`$C0R(#[9=(@^V=2&+1"18BU0D
+M7(E$)!")5"04B4PD#(E<)`B)="0$QP0D9`$``.C\____D(UT)@"+3"0LBT$,
+MBU$(B<N+202+&XE$)!")5"0,B4PD"(E<)`3'!"2@`0``Z/S___^+1"0H]D`B
+M`749@'@G`'D3#[=''HE$)`2)+"3H_/___XUV``^V1"1;J`$/A$H!```/ME0D
+M)\'B"(N%[`8```5`"````="+"(D-`````(G+P>L0B%PD0(G(P>@8B$0D,(N%
+M[`8```5$"```C00"BS")-0````"+A>P&```%2`@``(T$`HL8B1T`````BX7L
+M!@``!4P(```!PHL2B50D5(D5``````^V1"0P#[94)$")1"08B50D%(M4)%2)
+M5"00B5PD#(ET)`B)3"0$QP0DR`$``.C\____9H%_).$!=14/MD<F@^@1/`$/
+MAO8```"-M@````#&1Q0"]D=F('1<BT](#[9$)$"(05,/MD0D,&:)04B)W\'G
+M"(GP#[;0C0079HE!3(G?9H'G`/^)\`^VU(T$%V:)04Z)VL'J$,'B"(GPP>@0
+M#[;``<)FB5%0#[9$)%1FB4%*Z8H```!F@7\DX0%U"P^V1R:#Z!H\`79WB7PD
+M!(DL).C\____ZVF$P'EE@'PD)Q]W+HM%`(N06`$``(D5`````+@!````#[9,
+M)"?3X"'"=#^+10")D%@!``#K-(UT)@"+10"+D&`!``")%0`````/MDPD)X/I
+M(+@!````T^`APG0.BT4`B9!@`0``D(UT)@"#Q&Q;7E]=PY"-M"8`````55=6
+M4X/L?(NT))`````/MX8^"```9HE$)"Z+AE@'``"+`*,`````9B7_#V:)ACX(
+M``!F.T0D+G5`BP:+@%`!``"C`````(L6)?#__P")@E`!``"Z`````(7`#X19
+M!```BY0DD````(D4).C\____N@$```#I0`0``&:!OCX(``#_#P^%N`,``.G5
+M`P``C78`BYX0!P``9H-$)"X!#[=,)"YF.XY""```&<`AP6:)3"0NBY98!P``
+M@\($#[?!BQ2"B=#!Z!"(1"1`J`@/A*\```"+!HN84`$``(D=`````(L6B=@E
+M\/__`(F"4`$``(7`=&"`?BL`=%KVQP%U,;\`````]\,```$`=#SK(HUT)@`/
+MM\>-2`BZ`0```(G5T^6%ZW40C4@0T^*%TW4'ZQB_``````^WQVO`3(V<!N@`
+M``"%VW4BZPR#QP$/MD8K9CGX=[Z+A"20````B00DZ/S____IZ@(``(N4))``
+M``")%"3H_/___XA#"NG3`@``C78`B=%F@>'_#V:)3"1<#[?):<&P!```BWP#
+M((ML`R2)?"1@B6PD9(T<C0````"+A@P%```!V(LXA?\/A>(```"+?"1@BVPD
+M9(E\)!");"04B50D#(E,)`B)3"0$QP0D"`(``.C\____9H-^3``/A%\"``#&
+M1"1K``^V?"1KC2R]`````(EL)%B)Z`.&#`4``(L0A=)T<FG?L`0```.>$`<`
+M``^V0A6)1"0,B7PD"(E4)`3'!"0N````Z/S___^)Z`.&#`4``(L`B00DZ/S_
+M__^+@RP$``"+DR@$``"+BR0$``"+FR`$``")1"04B50D$(E,)`R)7"0(B7PD
+M!,<$)$0"``#H_/___X!$)&L!#[9$)&MF.T9,#X.V`0``Z5?___^0B=@#A@P%
+M``"+``^W4!!F@?J#`'=G#[?"#[:$!A@$```\_W189H/Z?W<8#[;`:<#<````
+M`X;4!```BT`L#[9`!.LIB=@#A@P%``"+``^W0!`/MH0P&`0``&G`E`````.&
+M\`0``(M`3`^V0`0\_W0-#[;`@+P&G`0``/]U'<9'%`:)/"3H_/___XE\)`2)
+M-"3H_/___^D7`0``#[:$!IP$``!KP$R-A`;H````BU0D9`M4)&!T%_9$)$`"
+M=1#'1"1@`````,=$)&0`````]D`&`@^%V@````^W3"1<B4PD;(M4)&"+3"1D
+MB50D"(E,)`R+3"1LB4PD!(D$).C\____BX:<````.T0D/'1*NP````"#PP&+
+M`#E$)#QU]83;=#;&1"1?`(ML)#R)+"3H_/___XU(^(M5!(E%!(DHB5`$B0(Y
+M^74%QD0D7P&`ZP%UUH!\)%\`=5N`?Q2!=%5F@7\>_P]T38M$)#R+4`2-1PB+
+M3"0\B4$$B4\(B5`$B0(/MU0D7&;!Z@4/M]*+3"1L@^$?N`$```#3X`E$EE#K
+M%(UT)@"-OIP```")?"0\C;8`````#[=L)"YF.:X^"```#X4N_/__C8:<````
+M.8:<````=#R)QXD\).C\____@^@(#[=('HG+9L'K!0^WVX/A'[K^____T\(A
+M5)Y0B40D!(DT).C\____.;Z<````=<:)-"3H_/___[H!````B="#Q'Q;7E]=
+MPXVV`````(V\)P````!64X/L%(M,)""+D:`$``"+0@2+,(DU`````/?&````
+MD'0%BT($B3"+F:`$``#WQ@``!`!T*XL#BY!0`0``B14`````A=)T&8L#B9!0
+M`0``BP.+@%`!``"C`````(UT)@#WQ@``"`!T+8'#A`D``(L#BY!0`0``B14`
+M````A=)T%8L#B9!0`0``BP.+@%`!``"C`````(N#H`0``,=$)`0`````B00D
+MZ/S___^+FZ`$``")'"3H_/___XV#A`D``(D$).C\____BX.@!```QT0D!`$`
+M``")!"3H_/___X7V#Y7`#[;`@\046U[#D(UT)@!55U93@^P\#[9$)%2(1"0F
+M#[;HC43M`(M4)%"-!,*+N$P(```/MH!*"```B$0D)XL"@'PD)@-V#,>`<`$`
+M`,0!``#K"L>`<`$``*@!``")1"0X!70!``")1"0HBTPD.(N!=`$``*,`````
+MB>F#X0.[!P```-/CB=X)QHM$)#B)L'0!``#'!"3H`P``Z/S____WTR'SBU0D
+M.(F:=`$``(!\)"8#=DJ+3"0XC92IT`$``(L"HP````"#R`B)`HT<[0````"-
+MA!D``@``QP`X````QP0D$"<``.C\____BU0D.(V$&@0"``#'``````#K2(M,
+M)#B-E*G0`0``BP*C`````(/("(D"C1SM`````(V$&0`"``#'`#@```#'!"00
+M)P``Z/S___^+5"0XC80:!`(``,<``````(7_#X2=`P``BTPD4(!Y*P!T.+L`
+M````B?8/MLL/MD<(T_BH`708QT0D"`$```")3"0$BT0D4(D$).C\____@\,!
+MBU0D4#A:*W?/]D<&`71GB7PD!(M,)%")#"3H_/___XEL)`2+7"10B1PDZ/S_
+M__^-1.T`C13#BX)H"```J0``$`!T"R7__^__B8)H"```B7PD!(M$)%")!"3H
+M_/___XU$[0"+5"10QX3"3`@```````#I[@(``+C^____B>G3P")$)">(1"0O
+M#X6Z`0``QT0D"`````#'1"0$!@```(D\).C\____B6PD!(M<)%")'"3H_/__
+M_XU$[0"-%,.+@F@(``"I```0`'0+)?__[_^)@F@(``"-1R`Y1R!U^XU'*#E'
+M*`^$/`$``,=$)#``````B40D&(M4)!B)%"3H_/___XG&@'A'`'0^BUPD,(/#
+M`8%\)#!_EI@`=RF+3"10B0PDZ/S____'!"0!````Z/S___^`?D<`=`N#PP&!
+M^X&6F`!UUXE<)#"+1B"%P`^$L@```,=`9`````#V1B@$=2.+7"10B1PDZ/S_
+M__^+1B#'1"0(`0```(E$)`2)'"3H_/___XM6(`^V@I<````/ME("C02`#[:$
+M`@````"+3"10#[91(@^V22&)1"0,B50D"(E,)`3'!"2P````Z/S___^+1B"+
+M7"10BY.@!```B40D"(E4)`3'!"0!````Z/S___^+1B"+DZ`$``")1"0(B50D
+M!,<$)`8```#H_/___\=&(`````"`;PD!B70D!(M$)%")!"3H_/___XM4)!@Y
+M5R@/A=#^__^)?"0$BTPD4(D,).C\____C43M`(M<)%#'A,-,"````````(M$
+M)%"`>"L`#X0/`0``QT0D-``````/ME0D+XE4)""+3"0X@<'0`0``B4PD'(UT
+M)@`/MGPD-(G[#[;KBT0D((GIT_BH`74*.%PD)@^%MP```(G[@/L#=EF+1"0X
+MQX!P`0``Q`$``(M4)"B+`J,`````B>F#X0.-#$F[!P```-/CB=X)QHDRQP0D
+MZ`,``.C\____]],A\XM,)"B)&8M<)!R-%*N+`J,`````@\@(B0+K5XM$)#C'
+M@'`!``"H`0``BU0D*(L"HP````")Z8/A`XT,2;L'````T^.)W@G&B3+'!"3H
+M`P``Z/S____WTR'>BTPD*(DQBUPD'(T4JXL"HP````"#R`B)`H-$)#0!C4<!
+MBU0D4#A"*P^'%/___X/$/%M>7UW#C;8`````C;\`````55=64X/L'(M\)#"+
+M="0T#[9O*XGHA,!T+`^V5@B[`````/;"`703ZQR-M"8`````B=")V=/XJ`%U
+M$(/#`8GH.,-U[>L%NP````#V1@<"=0B-1B@Y1BAU:HDT).C\____A,!T3XD\
+M).C\____B<&%P'10BU8LB48LC48HB0&)402)"H!&"0&)<2S&020%QD$E`,9!
+M10_'1"0,`0```,=$)`@!````B4PD!(DT).C\____ZP\/ML.)1"0$B3PDZ/S_
+M__^#Q!Q;7E]=PXVV`````%575E.#[`R+;"0@#[9\)"2)^`^VP(E$)`B)QL'F
+M`KL`````QP0D$"<``.C\____B?J`^@-V&HM%``70`0```?"+`*,`````P>@4
+M@^`!ZQF0BT4`!=`!``"-!`:+`*,`````P>@4@^`!A,!U"H/#`6:!^RP!=:V+
+M1"0(B40D!(DL).C\____B2PDZ/S___^+5"0(C032C43%`/:`20@```%T$HN`
+M3`@``(E$)`2)+"3H_/___X/$#%M>7UW#C70F`%575E.#[!P/MD0D-(A$)!N+
+M="0P#[;XC03_BZS&3`@``(7M#X0``0``N/[___^)^=/`A$4(#X7N````@'T)
+M``^$NP$``+\`````C5THC78`B1PDZ/S___^)PHM#!(E3!(D:B4($B1"`>B4`
+M#X6E````#[="'(.\AA@"````=0:#>B``=',/MT(<BX2&&`(``(-X<`!T0\:"
+ME``````/MDHDB<B#X`:#^`9U!?;!`75F#[9*)(G(@^`&@_@$=5CVP0%T4\9"
+M)@/&0B<$B50D!(DT).C\____ZSV+0B"+EJ`$``")1"0(B50D!,<$)`0```#H
+M_/___^L>#[="'(N6H`0``(E$)`B)5"0$QP0D`@```.C\____@\<!B?@X10D/
+MAMP```#I)____XTLO0````"[`````,<$)!`G``#H_/___X!\)!L#=AB+!@70
+M`0```>B+`*,`````P>@4@^`!ZQ:+!@70`0```>B+`*,`````P>@4@^`!A,!U
+M"H/#`6:!^RP!=;&)?"0$B30DZ/S___^)-"3H_/___XT$_XN\QDP(``"%_W1:
+M@'XK`'0NNP`````/MLL/MD<(T_BH`704QT0D"`````")3"0$B30DZ/S___^#
+MPP$X7BMWUP^V1"0;C03`C83&1`@``(E'&/9'!@%T#HE\)`2)-"3H_/___XGV
+M@\0<6UY?7<.0C;0F`````%=64X/L$(MT)""+'HM^*`^V4RN$TG1*C8-$"```
+MN0`````Y\'43ZSD/ML&-!,"-A,-$"```.?!T!X/!`3C1=>B`^0-V(8L#!=`!
+M```/MM&-%)"+`J,`````P>@4@^`!ZQ^Y`````(L#!=`!```/MM&-%)"+`J,`
+M````P>@4@^`!A,!T%0^VP8E\)`B)1"0$B1PDZ/S____K#P^VP8E$)`2)'"3H
+M_/___X/$$%M>7\.04X/L6(M<)&"-1"1*B40D-(U$)$R)1"0PC40D1(E$)"R-
+M1"1&B40D*(U$)%")1"0DC40D4HE$)""-1"13B40D'(U$)$Z)1"08C40D5(E$
+M)!2-1"1(B40D$(U$)%6)1"0,C40D5HE$)`B-1"17B40D!`^W0R2)!"3H_/__
+M_\=$)`P!````#[9$)%=IP-P```")1"0(BT,0B40D!(V#O`0``(D$).C\____
+MQT0D#`$````/MD0D56G`E````(E$)`B+0Q")1"0$C8/8!```B00DZ/S____'
+M1"0,`0````^W1"10P>`"B40D"(M#$(E$)`2-@_0$``")!"3H_/___\=$)`P!
+M````#[=$)$AKP'2)1"0(BT,0B40D!(V#H`4``(D$).C\____QT0D#`$````/
+MMD0D5`^W5"1(#Z_"C01`P>`"B40D"(M#$(E$)`2-@U`%``")!"3H_/___\=$
+M)`P!````QT0D"``"``"+0Q")1"0$C8-L!0``B00DZ/S____'1"0,`0````^V
+M1"13C02`P>`"B40D"(M#$(E$)`2-@[P%``")!"3H_/___\=$)`P!````QT0D
+M"*````"+0Q")1"0$C8/8!0``B00DZ/S____'1"0,`0````^W1"1.C01`P>`#
+MB40D"(M#$(E$)`2-@_0%``")!"3H_/___\=$)`P!````#[=$)%`!P(E$)`B+
+M0Q")1"0$C8,0!@``B00DZ/S____'1"0,`0````^V1"17`<")1"0(BT,0B40D
+M!(V#.`8``(D$).C\____QT0D#`$````/MD0D50'`B40D"(M#$(E$)`2-@V`&
+M``")!"3H_/___\=$)`P!````#[9#)@'`B40D"(M#$(E$)`2-@X@&``")!"3H
+M_/___\=$)!`!````QT0D#$`````/MT0D4,'@!HE$)`B+0Q")1"0$C8.P!@``
+MB00DZ/S____'1"00`0```,=$)`P``0``QT0D"`!)``"+0Q")1"0$C8/4!@``
+MB00DZ/S____'1"00`0```,=$)`R`````#[=$)%!IP+`$``")1"0(BT,0B40D
+M!(V#^`8``(D$).C\____QT0D$`$```#'1"0,!`````^W1"1,P>`"B40D"(M#
+M$(E$)`2-@QP'``")!"3H_/___\=$)!`!````QT0D#`0````/MT0D2L'@`HE$
+M)`B+0Q")1"0$C8-`!P``B00DZ/S____'1"00`0```,=$)`P(````#[9$)%/!
+MX`R)1"0(BT,0B40D!(V#9`<``(D$).C\____QT0D$`$```#'1"0,"````,=$
+M)`@```@`BT,0B40D!(V#B`<``(D$).C\____QT0D$`$```#'1"0,"`````^W
+M1"1.:<",`0``B40D"(M#$(E$)`2!PZP'``")'"3H_/___[@`````@\186\.0
+MC70F`%.#[`B+3"00BU0D%(N9F````(F1F````(V!E````(D"B5H$B1.)#"3H
+M_/___X/$"%O#C;0F`````(V\)P````!55U93@^P<BW0D,,=$)!@`````BU0D
+M&`^VA#*<!```//\/A,P````/MM!KPDR-C`;H````B4PD%("\!O$`````#X2M
+M````OP````")1"00C:P&$`$``(V$!N````")1"0,B2PDZ/S___^)PXM$)!`!
+M\(N0%`$``(F8%`$``(DKB5,$B1J+0R"%P'0>B40D"(N&H`0``(E$)`3'!"0%
+M````Z/S___^`2R@"B5PD",=$)`0A````BT0D%(D$).C\____@'M'`'0:B30D
+MZ/S____'!"0!````Z/S___^`>T<`=>:#QP&)^HM,)`PX41$/AV[___^#1"08
+M`8-\)!@$#X40____B30DZ/S___^#Q!Q;7E]=PXVV`````(V\)P````!55U93
+M@^PLBT0D0(E$)!R+<"R++HN%6`<``(L`B40D*(M4)!R)5"0$B2PDZ/S___^+
+M7"0<@\,0QT0D(`````"+3"0<.5D0="*)'"3H_/___XE$)""+5"0<BT(0BTPD
+M((E(!(D!B5D$B4H0BT0D'(M0((72=%"X__\``(-\)"``=`B+3"0@#[=!'HE$
+M)!`/MH*7````#[92`HT$@`^VA`(`````B40D#`^V12*)1"0(#[9%(8E$)`3'
+M!"1L`@``Z/S____K6;C__P``@WPD(`!T"(M4)"`/MT(>B40D$`^V12F+5A@/
+MME($C02"BTPD'`^V446-!(`/MH0"`````(E$)`P/MD4BB40D"`^V12&)1"0$
+MQP0D;`(``.C\____@WPD(``/A.@!``"+1"0@#[=8'FG;L`0```.=$`<``(VS
+M(`0``(D$).C\____BT8,B40D%(M&"(E$)!"+1@2)1"0,BX,@!```B40D"(M4
+M)"`/MT(>B40D!,<$))P"``#H_/___V:#?4P`#X1(`0``9L=$)"8``(V-E```
+M`(E,)!B)]@^W5"0FBX4,!0``BS20A?8/A`H!``"+1"0<#[=X'&8[?A`/A?@`
+M```/MY4^"```.50D*'1A#[>=0@@``(N-6`<``(/!!(/"`3G:&<`APHL$D:D`
+M``@`=3AF)?\/9CM$)"9U+3ET)"!U+8DL).C\____BU0D(`^W0AZ)1"0$QP0D
+MT`(``.C\____Z>,```")]CM4)"AUKV:!_X,`D(UT)@!W?@^WQX"\!1@$``#_
+M='&#?"1``'1JBTPD'`^V022#X`6#^`5U6CMT)"!T(HL&BU8$B5`$B0*+A90`
+M``")<`2)!HM$)!B)1@2)M90````/MT8>B40D!(DL).C\____#[=&'HE$)`2)
+M+"3H_/___V;'1A[_#XM4)!R`:D<!C70F`&:#1"0F`0^W3"0F9CE-3`^'R_[_
+M_X-\)$``=#6+5"0<#[9")(/@!8/X!74EQH*4````!(M,)""+$8M!!(E"!(D0
+MB4PD!(M$)!R)!"3H_/___X/$+%M>7UW#C;0F`````%575E.#[&R+A"2`````
+MQD`S`,9`,@#&@'4)````B<*!PD0(``"X`````(VV`````,8$$`"#P`$](`$`
+M`'7RBX0D@`````64````BY0D@````(F"E````(F"F````(G0!9P```")@IP`
+M``")@J````")UH'&I````(FRI````(FRJ````(U`$(F"K````(F"L````('"
+MM````(E4)#R+C"2`````B9&T````B9&X````@<&\````B4PD0(N<)(````")
+MB[P```")B\````"!P\0```")7"1$B[PD@````(F?Q````(F?R````(U$)&:)
+M1"0TC40D:(E$)#"-1"18B40D+(U$)%Z)1"0HC40D:HE$)"2-1"1@B40D((U$
+M)&&)1"0<C40D7(E$)!B-1"1CB40D%(U$)%J)1"00C40D8HE$)`R-1"1DB40D
+M"(U$)&6)1"0$#[=')(D$).C\____#[9$)&6(1RX/MD0D8HB'DP````^W1"1J
+M9HE'3`^W1"1H9HF'0`@```^W1"1F@^@!9HF'0@@```^W1"1:9HE'-`^W1R1F
+M/8"1=`IF/8"4#X7O!P``BX0D@````,9`,`3&0"L$QD`Q0,9`+P#&@)(````)
+MQD`L`(N$)(`````%O`0``(D$).C\____B<*+C"2`````B8'4!```#[9$)&5I
+MP-P```"%P'0+Q@(`@\(!@^@!=?6+A"2`````!=@$``")!"3H_/___XG"BYPD
+M@````(F#\`0```^V1"1B:<"4````A<!T"\8"`(/"`8/H`77UBX0D@`````7T
+M!```B00DZ/S___^)PHN\)(````")APP%```/MT0D:L'@`H7`=`O&`@"#P@&#
+MZ`%U]8N$)(`````%;`4``(D$).C\____BY0D@````(F"A`4``(G0!5`%``")
+M!"3H_/___XG#BXPD@````(F!:`4``(G(!:`%``")!"3H_/___XG"B[PD@```
+M`(F'N`4``&:#?"1:`'1"N0````")6D0/MD0D8XA"/(N\)(````"+AZ@```")
+MEZ@```"),HE"!(D0#[9$)&.-!$"-'(.#PG2#P0%F.4PD6G?#BX0D@`````6\
+M!0``B00DZ/S___^)PHN$)(````")D-0%``"`?"1A`'0SN0````"+G"2`````
+MBX.X````B9.X````BW0D/(DRB4($B1"#PA2#P0$/MD0D868YR'?2BX0D@```
+M``78!0``B00DZ/S___^)PHN\)(````")A_`%``"-B*````"+G"2`````BX/`
+M````B9/`````BW0D0(DRB4($B1"#PA0YRG7;B=@%]`4``(D$).C\____B<*)
+M@PP&``!F@WPD7`!T,+D`````B[PD@````(N'R````(F7R````(M<)$2)&HE"
+M!(D0@\(8@\$!9CE,)%QWU8N$)(`````%$`8``(D$).C\____B[0D@````(F&
+M*`8``(F&+`8```^W1"1J9HF&,@8```^WP(E$)`2)\`4L!@``B00DZ/S___^)
+M\`4X!@``B00DZ/S___^)AE`&``")AE0&```/MD0D96:)AEH&```/M\")1"0$
+MB?`%5`8``(D$).C\____B?`%8`8``(D$).C\____B89X!@``B89\!@``#[9$
+M)&)FB8:"!@``#[?`B40D!(GP!7P&``")!"3H_/___XGP!8@&``")!"3H_/__
+M_XF&H`8``(F&I`8```^V1B9FB8:J!@``#[9&)HE$)`2)\`6D!@``B00DZ/S_
+M__^_`````(!^)@`/A((```"^``````^WQFO`3(N4)(````"-O`+H````C100
+MC9K@````B?&(2PS&0PT`BXPD@````(F*Z````,9#$0#'@C`!````````C80!
+M``$``(U("(F*"`$``(F*#`$``(/`$(F"$`$``(F"%`$``,9##@*#Q@&+G"2`
+M````#[9#)F8Y\'>#B[0D@````,9&+P#&AIP$``#_QH:=!```_\:&G@0``/_&
+MAI\$``#_@'PD90`/A(,```"[``````^WRVG1W````(NT)(````"+AM0$``#&
+M1!`G`8N&U`0``,9$`B8`BX;4!```QD0"1/^+AM0$``#&1`(Z_XN&U`0``&;'
+MA`*,``````#'A(X8`@```````(G1`X[4!```C4$0B4$0`Y;4!```C4(0B4(4
+M@\,!#[9$)&5F.=AW@HN$)(````!FQX"0``````"X`````(N4)(````#&A!`8
+M!```_X/``3V$````=>>`?"1B`'1]NP`````/M]-ITI0```"+C"2`````BX'P
+M!```9L=$$"X$`(N!\`0``,9$`B8`BX'P!```QD0")_^+@?`$``#&1`(P_XG1
+MB[0D@`````..\`0``(U!%(E!%(G1`X[P!```C4$4B4$8BX;P!```B7P"3(/#
+M`0^V1"1B9CG8=XB+A"2`````!<P&``")1"0$BX0D@`````6P!@``B00DZ/S_
+M__^+O"2`````B8?(!@``B?@%\`8``(E$)`2-0.2)!"3H_/___XF'[`8``(GX
+M!10'``")1"0$C4#DB00DZ/S___^)AQ`'``")^`4X!P``B40D!(U`Y(D$).C\
+M____B8<T!P``B?@%7`<``(E$)`2-0.2)!"3H_/___XF'6`<``(GX!8`'``")
+M1"0$C4#DB00DZ/S___^)P8F'?`<``(N<)(````"+@X`'``"+DX0'``"`?"1A
+M`'1:B<.)UK\`````B<TIQ8M$)#R)!"3H_/___XU4'0")4`B)6`R)<!"+C"2`
+M````BY&X````B8&X````BTPD/(D(B5`$B0*!PP`0``"#U@"#QP$/MD0D868Y
+M^'>SBX0D@`````6D!P``B40D!(N$)(`````%B`<``(D$).C\____B40D2(N<
+M)(````")@Z`'``"+O"2`````BY^D!P``B[>H!P``OP````"]`````(M$)$")
+M!"3H_/___XM4)$@!^HE0"(E8#(EP$(N,)(````"+D<````")@<````"+3"1`
+MB0B)4`2)`H'#```!`(/6`(''```!`(/5`(GX-0``"``)Z'6JBX0D@`````7(
+M!P``B40D!(N$)(`````%K`<``(D$).C\____B<&+G"2`````B8/$!P``B[0D
+M@````(N&R`<``(N6S`<``&:#?"1<`'17B<.)UK\`````B<TIQ8M$)$2)!"3H
+M_/___XU4'0")4`B)6`R)<!"+C"2`````BY'(````B8'(````BTPD1(D(B5`$
+MB0*!PXP!``"#U@"#QP%F.7PD7'>V@\1L6UY?7<.-M"8`````55=64X/L+(M$
+M)$")1"0<BW!,BRZ+A5@'``"+`(E$)"B+5"0<B50D!(DL).C\____BUPD'(/#
+M%(M,)!PY610/A,P```")'"3H_/___XE$)""+5"0<BT(4BTPD((E(!(D!B5D$
+MB4H4A<D/A#`"```/MT$>B40D$`^V12F+5A@/ME($C02"B40D#`^V12*)1"0(
+M#[9%(8E$)`3'!"3T`@``Z/S___^+1"0@#[=8'FG;L`0```.=$`<``(VS(`0`
+M`(D$).C\____BT8,B40D%(M&"(E$)!"+1@2)1"0,BX,@!```B40D"(M4)"`/
+MMT(>B40D!,<$))P"``#H_/___V:#?4P`=4?I<0$``(VT)@````#'1"00__\`
+M``^V12F+5A@/ME($C02"B40D#`^V12*)1"0(#[9%(8E$)`3'!"3T`@``Z/S_
+M___IB0$``&;'1"0F``"-C90```")3"08C70F``^W5"0FBX4,!0``BS20A?8/
+MA.\```"+1"0<#[=X)&8[?A`/A=T````/MY4^"```.50D*'1A#[>=0@@``(N-
+M6`<``(/!!(/"`3G:&<`APHL$D:D```@`=3AF)?\/9CM$)"9U+3ET)"!U+8DL
+M).C\____BU0D(`^W0AZ)1"0$QP0DT`(``.C\____Z>8```")]CM4)"AUKV:!
+M_X,`D(UT)@!W8P^WQX"\!1@$``#_=%8Y="0@="*+!HM6!(E0!(D"BX64````
+MB7`$B0:+3"08B4X$B;64````#[=&'HE$)`2)+"3H_/___P^W1AZ)1"0$B2PD
+MZ/S___]FQT8>_P^+1"0<@&@H`6:#1"0F`0^W5"0F9CE53`^'YO[__XM,)""+
+M$8M!!(E"!(D0BT0D',9`,02)3"0$B00DZ/S____K-L=$)!#__P``#[9%*8M6
+M&`^V4@2-!(*)1"0,#[9%(HE$)`@/MD4AB40D!,<$)/0"``#H_/___X/$+%M>
+M7UW#D)"0D(!\)`@!&<#WT"4```R`BU0D!(M2!(E"#,.0D)"0D)"05U93BUPD
+M%(M\)#"+3"0TBW0D/`^W5"009H'Z(B=W6&:!^B`G#X.(````9H'Z0"$/A'T`
+M``!F@?I`(7<89H'Z("%T;V:!^B(A=&AF@?I0!Y!U:NM>9H'Z1"&-M"8`````
+M=%!F@?I$(7)3C8+PV/__9H/X`7='ZSMF@?J")W0T9H'Z@B=W$&:!^B0G="9F
+M@?J`)W4IZQUF@?J`D8VV`````'009H'Z@)1T"6:!^H!RB?9U"L8#%(M$)!C&
+M``"+1"0<Q@`$9H'Z4`=T!L8'`.L&D`^V`X@'9L<!@`!FQP8``(M$)"3&`""+
+M1"0H9L<```$/MA.+1"0LB!`/M@-F`P%F`P:+5"0X9HD"BU0D(&:)`@^W$8M$
+M)$!FB1`/MQ&#P@N+1"1$9HD06UY?PXVV`````//#C;0F`````(V\)P````!5
+M5U93B<>)UKT`````C78`#[:$/9@$```\_W1;#[;`:<"4````B<,#G_`$``"`
+M>QX`=#FZ``````^VPHM,@SB%R70ABT$D)0#__P`]``#_`'42]D$G!'0,BT$@
+MA<!T!8GQB$@!@\(!.%,>=\R)\(B#D````(/&`8/%`8/]!'61BX>@!```.?AU
+M#`6$"0``B?+H:____UM>7UW#C;8`````BU0D!+@`````C;0F`````,8$$`"#
+MP`$]E````'7RQD(G_\9",/^-0A2)0A2)0AC#BU0D!+@`````C;0F`````,8$
+M$`"#P`$]W````'7RQD)$_\9".O_&0D8?C4(0B4(0B4(4PXVV`````(V_````
+M`%.+1"0(BUPD#(L3BXC`````B9#`````!;P```")`HE*!(D1QP,`````6\.0
+MC70F`%.+1"0(BUPD#(L3BXBX````B9"X````!;0```")`HE*!(D1QP,`````
+M6\.0C70F`%.+1"0(BUPD#(L3BXC(````B9#(````!<0```")`HE*!(D1QP,`
+M````6\.0C70F`%=64X/L$(M\)""+5"0D@'HP_P^%Y0```(L'B[`8`0``B34`
+M````N0````"0C70F`+@!````B</3XX7>=3.(2C"+%XG8"?")@A@!``"+!XN`
+M6`$``*,`````B=HAP@^$E@```(L'B9!8`0``Z8D```"#P0&#^2!UN(L'B[`<
+M`0``B34`````L0"X`0```(G#T^.%WG4LB$HPBQ>)V`GPB8(<`0``BP>+@&`!
+M``"C`````(G:(<)T0HL'B9!@`0``ZSB#P0&#^2!UOXM'!(L`BP>+D!P!``"+
+M@!@!``"C`````(E$)`R)1"0(B40D!,<$)!P#``#H_/___X!'+`&#Q!!;7E_#
+MC;8`````C;\`````55=64X/L'(ML)#"+?"0T#[97)(G0@^`&@_@&=0GVP@$/
+MA/@```"`?SK_#X7N````BT4`B[`8`0``B34`````N0````"X`0```(G#T^.%
+MWG4VB$\ZBU4`B=@)\(F"&`$``(M%`(N`6`$``*,`````B=HAP@^$H0```(M%
+M`(F06`$``.F3````@\$!@_D@=;6+10"+L!P!``")-0````"Q`(G*N`$```")
+MP]/CA=YU,HU"((A'.HM5`(G8"?")@AP!``"+10"+@&`!``"C`````(G:(<)T
+M1(M%`(F08`$``.LY@\$!@_D@=;>+102+`(M%`(N0'`$``(N`&`$``*,`````
+MB40D#(E$)`B)1"0$QP0D'`,``.C\____@$4L`8/$'%M>7UW#C78`C;PG````
+M`(/L#(M$)!"-D,0```"Y`````#F0Q````'01B10DZ/S___^)P<=`%`````")
+MR(/$#,/K#9"0D)"0D)"0D)"0D)"#[!R)7"00B70D%(E\)!B+?"0@#[=4)"0/
+MM_*+APP%``#'!+``````9L'J!0^WTHGS@^,?N/[___^)V=/`(827$`4``(ET
+M)`2-CRP&``")#"3H_/___XM<)!"+="04BWPD&(/$',.-=@"-O"<`````@^P,
+MBU0D$(M$)!0/MD@$#[:$$9P$``#&A!&<!```_P^WP(E$)`2!PJ0&``")%"3H
+M_/___X/$#,.0C;0F`````(/L'(E<)!2)="08BUPD((MT)"0/MD8P//]T&0^V
+MP(E$)`2+`XD$).C\____QD8P_X!K+`&+7"04BW0D&(/$',.#[!R)7"04B70D
+M&(M<)""+="0D#[9&.CS_=!D/ML")1"0$BP.)!"3H_/___\9&.O^`:RP!BUPD
+M%(MT)!B#Q!S#5E.#[!2+="0@BUPD)#ES&'0U@WM,`'0O@'M4`'4I@7L@`!``
+M`'<1C4-,B40D!(DT).C\____ZP^-0TR)1"0$B30DZ/S___]F@7LDX0$/A8T`
+M```/MT,09CV#`'=U#[?`#[:$!A@$```\_W1FBY;4!```@'L4`'5:#[;`:<#<
+M````C00"#[93)H#Z!W0<@/H'=P>`^@9U,.L9@/H,C70F`'0@@/H-=2#K$&:#
+M8#;]B?;K%6:#2#8"ZPYF@V`V]XGVZP5F@T@V"&:!>R3A`8UV`'4.@'LF"W4(
+MQD,4`(UT)@")7"0$BT,8B00D_U-L9H%[).$!=4L/MD,F@^@1/`%W0`^W0Q!F
+M/8,`=W8/M\`/MH0&&`0``#S_=&</ML!IP)0````#AO`$``"`>"@`=5*)1"0$
+MB30DZ/S____K1(UT)@`/MT,09CV#`'<V#[?`#[:$!A@$``"+EM0$```\_W0A
+M#[;`:<#<````C00"@'A'`'4/B40D!(DT).C\____C78`@\046U[#C78`C;PG
+M`````(/L#(E<)`2)="0(BW0D$(V&I````+L`````.8:D````="6)!"3H_/__
+M_XG#B00DZ/S____&0Q2`B30DZ/S___^)0U#&0W`!B=B+7"0$BW0D"(/$#,.-
+M="8`C;PG`````(/L'(E<)!")="04B7PD&(MT)""-GJ0&``")'"3H_/___X3`
+M#X6G````B1PDZ/S___^)P;@`````B<.`O#"<!```_W4,.$8O<Q*(1B_K#8GV
+M@\,!@\`!@_@$==V`^P1T<`^VPXB,!IP$```/M_EKQTR-E`;H````N`````"-
+M="8`Q@00`(/``8/X3'7T#[?!:\!,C90&``$``(U*"`'PB8@(`0``B8@,`0``
+M@\(0B9`0`0``B9`4`0``B)CL````:\=,C80&Z````.L*D(UT)@"X`````(M<
+M)!"+="04BWPD&(/$',.-="8`C;PG`````(/L'(E<)!")="04B7PD&(MT)""-
+MGE0&``")'"3H_/___X3`#X6W````B1PDZ/S___^)PK@`````B<.`O#`8!```
+M_W4<#[;`9CF&D````',=9HF&D````.L4C;0F`````(/#`8/``3V`````=<N`
+M^X!T;@^VPXB4!A@$```/M\)I^-P```")^`.&U`0``(D$).C\____BY;4!```
+M#[;#9HE$%QR+AM0$``#&1`<F`(N&U`0``,9$!SC_BX;4!```QD0'.?^`?C,!
+M=0N+AM0$``"`3`<H`8GX`X;4!```ZP:0N`````"+7"00BW0D%(M\)!B#Q!S#
+MC70F`(V\)P````!3@^P(BUPD$(M4)!2)V.B]]O__BX.@!```B00DZ/S___^#
+MQ`A;PXUV`(V\)P````"#[!R)7"00B70D%(E\)!B+="0@C9Y\!@``B1PDZ/S_
+M__^$P`^%MP```(D<).C\____B<*)\+^`____C;8`````@+B8!```_W03@\<!
+M@\`!B?F`^80/A(8```#KY(GX/(1T?@^VP(B4!A@$```/M]IIVY0```")V`.&
+M\`0``(D$).C\____BY;P!```B?D/ML%FB403)(N&\`0``,9$`R8`BX;P!```
+M9L=$`RX``(N&\`0``&;'A`.```````#'1"0$`````(N&H`0``(D$).C\____
+MB=@#AO`$``#K"(UV`+@`````BUPD$(MT)!2+?"08@\0<PXUT)@"-O"<`````
+M5E.#[!2+="0@BT0D)`^W0"0/MIPP&`0``,:$,!@$``#_#[?;B5PD!(V&?`8`
+M`(D$).C\____:=N4````B=@#AO`$``"`>##_=`R)1"0$B30DZ/S____'1"0$
+M`````(N&H`0``(D$).C\____@\046U[#C;0F`````(V\)P````!3@^P(BUPD
+M%(![)_]T&HU#4(E$)`2+5"00BT(4B00DZ/S____&0R?_@\0(6\.-=@!3@^P(
+MBUPD%(![1/]T'8V#N````(E$)`2+5"00BT(4B00DZ/S____&0T3_@\0(6\.#
+M[!R)7"00B70D%(E\)!B+="0@BWPD)`^W1QP/MHPP&`0``(N4AA@"``"%TG02
+M@WIP`'4,QX2&&`(```````"0#[='',:$!A@$``#_#[?9B5PD!(V&5`8``(D$
+M).C\____:=O<````B=@#AM0$``"`>#K_=`R)1"0$B30DZ/S___^)?"0$B30D
+MZ/S___^+AM0$``#&1`,F`(N&U`0``,9$`R<!BUPD$(MT)!2+?"08@\0<PXVV
+M`````(V\)P````"#[!R)7"0,B70D$(E\)!2);"08BVPD((M\)"1F@7\DX0$/
+MA;D````/MD<F@^@1/`$/AZH````/MT<09CV#``^'1`$```^WP`^VA`48!```
+MBY7P!```//\/A"L!```/ML!IP)0```"-'`*`:R@!C7,4B30DZ/S___^)PCGX
+M=4*)7"0$B2PDZ/S___\[<Q0/A/4```#'0U``$GH`QT-8`````(E;7(U#4(E$
+M)`2+112)!"3H_/___\9#)P#IR0```)"+0Q2)4`2)`HER!(E3%(L7BT<$B4($
+MB1#IJP```(UV``^W1Q!F/8,`#X>:````#[?`#[:$!1@$``"+E=0$```\_P^$
+M@0````^VP&G`W````(T<`H!K1P&-<Q")-"3H_/___XG".?AU2(E<)`2)+"3H
+M_/___SMS$'1/QX.X`````!)Z`,>#P`````````")F\0```"-@[@```")1"0$
+MBT44B00DZ/S____&0T0`ZQJ)]HM#$(E0!(D"B7($B5,0BQ>+1P2)0@2)$(M<
+M)`R+="00BWPD%(ML)!B#Q!S#C70F`(/L'(E<)!2)="08BW0D((M<)"0/MTL>
+M9H'Y_P]T#P^WT8N&#`4``(,\D`!U(P^WP8E$)`R)7"0(QT0D!`````#'!"0[
+M````Z/S____K+XGV#[?!B40D!(DT).C\____9L=#'O\/B5PD!(DT).C\____
+MB5PD!(DT).C\____BUPD%(MT)!B#Q!S#C;0F`````%575E.#[`P/MD0D)(A$
+M)`N+5"0@BQIF@WM,``^$O@```+\`````#[?7BX,,!0``BS20A?8/A)@````/
+MMTX09H'Y@P!W2P^WP0^VA`,8!```//]T/&:#^7]W&0^VP(N3U`0``&G`W```
+M`(M$$"P/MD`$ZR(/ML"+D_`$``!IP)0```"+1!!,#[9`!.L)C70F`+C_____
+MBU0D(#I"!'4T@WPD*`!T"HM$)"AF.T@<=2,/ME0D"XA6%`^WQXE$)`2)'"3H
+M_/___XET)`2)'"3H_/___X/'`68Y>TP/AT?___^`?"0+@0^$``$``(N#E```
+M`(V[E````#GX#X3L````O0````"#Q0&+`#GX=?=FA>T/A-4```")/"3H_/__
+M_XG!#[=P$&:!_H,`=T</M\8/MH0#&`0``#S_=#AF@_Y_=QD/ML"+D]0$``!I
+MP-P```"+1!`L#[9`!.L>#[;`BY/P!```:<"4````BT003`^V0`3K!;C_____
+M@WPD*`!T(XM4)"AF.W(<=!F+@Y@```")BY@```").8E!!(D(ZSR-="8`BU0D
+M(#I"!'4<@'D4@'4(#[9$)`N(012)3"0$B1PDZ/S____K$XN#F````(F+F```
+M`(DYB4$$B0AF@^T!=`PYNY0````/A2O___^#Q`Q;7E]=PXVT)@````"-O"<`
+M````5E.#[!2+3"0@BW0D)&:!?B3A`0^%EP````^V1B:#Z!$\`0^'B`````^W
+M1A"Z_P```&8]@P!W"P^WP`^VE`$8!```:<*4````B<,#F?`$``"`>R?_=3P/
+MME9HN`@```"$TG0#C002#[;`:<!`0@\`B4-0QT-8`````(E;7(U#4(E$)`2+
+M012)!"3H_/___\9#)P"+4QB)<QB-0Q2)!HE6!(DR@$,H`>F/````D(UT)@`/
+MMT80NO\```!F/8,`=PL/M\`/MI0!&`0``&G"W````(G#`YG4!```@'M$_W5(
+M#[96:+@(````A-)T`XT$$@^VP&G`0$(/`(F#N````,>#P`````````")F\0`
+M``"-@[@```")1"0$BT$4B00DZ/S____&0T0`BU,4B7,4C4,0B0:)5@2),H!#
+M1P&#Q!1;7L-55U93@^P<BVPD.,9%)P'&128`B6PD",=$)`0&````BT0D-(D$
+M).C\____@'U'`'0>BU0D,(D4).C\____QP0D`0```.C\____@'U'`'7BBUT@
+MA=L/A"P!``#V12@$B?9U)XM,)#")#"3H_/___\=$)`@!````BT4@B40D!(M$
+M)#")!"3H_/___XM5(`^V14>)1"00#[:"EP````^V4@*-!(`/MH0"`````(E$
+M)`R+5"0P#[9"(HE$)`@/MD(AB40D!,<$)$`#``#H_/___XM%((E$)`B+3"0P
+MBX&@!```B40D!,<$)`$```#H_/___XM3<(72#X2<`0``#[=%'(M,)##'A($8
+M`@```````,=#<`````#'1"0(_____XE<)`2+0WB)!"3_TNEI`0``#[=%'(M,
+M)##'A($8`@```````,=#=`````"+0WB)!"3_TO9%*`)T(8M%((E$)`B+5"0P
+MBX*@!```B40D!,<$)`8```#H_/___\=%(`````#'0V0`````ZTF+3"0P#[9!
+M*8M,)#2+41@/ME($C02"#[9518T$@`^VA`(`````B40D#(M4)#`/MD(BB40D
+M"`^V0B&)1"0$QP0D40```.C\____BU4PA=)T#`^V147'1((X`````(M5`(M%
+M!(E"!(D0BTPD-`^V40F#Z@&(40F+13"%P'0'9H-X+@)U=832='&^`````(M\
+M)#2#QRB-M"8`````B3PDZ/S___^)PXM4)#2+0BR)6BR).XE#!(D8A=MT,?9#
+M*`)T*XM#((E$)`B+3"0PBX&@!```B40D!,<$)`8```#H_/___X!C*/V-M@``
+M``"#Q@&)\(M4)#0X0@EWHHEL)`2+3"0PB0PDZ/S___^#Q!Q;7E]=PXM3=(72
+M#X6,_O__Z:G^__^-=@"-O"<`````4X/L"(M,)!"+7"04BY&H````B9FH````
+MC8&D````B0.)4P2)&H-[4`!T#XU#4(E$)`2)#"3H_/___\9#<`"#Q`A;PXVV
+M`````(V\)P````"#[`R+1"00C9"T````N0`````YD+0```!T"HD4).C\____
+MB<&)R(/$#,.-M@````"#[`R+1"00C9"\````N0`````YD+P```!T"HD4).C\
+M____B<&)R(/$#,.-M@````!3@^P(BT0D$(N8R`8```4L!@``B00DZ/S___^)
+MP0^WP,'@!HT4&(M$)!2)$+@`````Q@00`(/``8/X0'7T#[?!@\0(6\.0D)"0
+MD)"0D)"0D%93BU0D#(L"BS`/ME@KA-MT-P^V4@BY`````/;"`70*ZR>)T-/X
+MJ`%U!X/!`3C9=?&`^0-V&`^VP8V$AM`!``"+`*,`````ZQ:Y``````^VP8V$
+MAM`!``"+`*,`````P>@4@^`!6U[#D(VT)@````!3BUPD"`^V`\#H!(G"@^('
+M#[9+`O;!!'0#@,X"#[9#`Z@$=`:!R@```@#VP0AT`X#."*@(=`:!R@``"`#V
+MP0)T`X#.!*@"=`:!R@``!``/MD,4P>`8"=!;PXVT)@````!3B<.%TGY`#[8(
+MA,ET!8#Y('4MN`````#K%HVV``````^V#!B$R70(@/D@=1.-=@"#P`$YT'7I
+MZPZ-M"8`````N`````#K!;@!````6XUV`,/K#9"0D)"0D)"0D)"0D)!75E.)
+MQHG3B<^%R70>N0`````/MA8/MD8!B`.(4P&#PP*#Q@*#P0$Y^77G6UY?PY"#
+M[!R)7"00B70D%(E\)!B+?"0@BUPD)(M'3(LPB30DZ/S____&0"3AQD`E`<9`
+M)A+&0"</QD`HH,9`*0,/MM>(4"J)VL'J$(A0*XG:P>H8B%`LB%@M#[=7)&:)
+M4!")<!C'0"``````QT`T`````,=`;`````")1"0$B30DZ/S___^+7"00BW0D
+M%(M\)!B#Q!S#ZPV0D)"0D)"0D)"0D)"0@^P<B5PD#(ET)!")?"04B6PD&(ML
+M)"0/MG0D*`^V?"0LBT0D((L8B1PDZ/S___^)PH7`=1#&A94````!QD4F`^E_
+M````QD`DX<9`)0&)\#P!&<#WT(/``HA")HGXA,!U/X-],`!T!`^V146(0B</
+MMT4<9HE"$(E:&,="(`````#'0C0`````N."0``")0FR)5"0$B1PDZ/S____K
+M)XUV`,9")P\/MT4<9HE"$(E:&,="(`````#'0C0`````N`````#KR(M<)`R+
+M="00BWPD%(ML)!B#Q!S#D(VT)@````"#[!R)7"0,B70D$(E\)!2);"08#[9\
+M)"0/MFPD*`^W="0LBU0D((M"3(L8B1PDZ/S___^)PH7`='[&0"3AQD`E`8GY
+M@/D!#Y3`@\`1B$(FN`\```")Z83)=0B+3"0@#[9!*8A")XGPB$(HB?$/ML6(
+M0BF)^#P!=1V+3"0P#[;%B$(JB<C!Z!"(0BN)R,'H&(A"+(A*+8M,)"`/MT$D
+M9HE"$(E:&(M$)#2)0FR)5"0$B1PDZ/S___^+7"0,BW0D$(M\)!2+;"08@\0<
+MPY"-="8`@^P<B5PD#(ET)!")?"04B6PD&(ML)"0/MG0D*`^V?"0LBT0D((L8
+MB1PDZ/S___^)PH7`=0W&A94````!QD4F`^M4QD`DX<9`)0&)\#P!&<#WT(/`
+M`HA")K@/````B?F$R74$#[9%18A")P^W11QFB4(0B5H8QT(@`````,="-```
+M``"+1"0PB4)LB50D!(D<).C\____BUPD#(MT)!"+?"04BVPD&(/$',.-M@``
+M``"#[!R)7"0,B70D$(E\)!2);"08BVPD(`^V?"0DBW4`B?@\`W8P#[;8P>,#
+MC80>,`(``,<`#````,<$)!`G``#H_/___XV$'C0"``"+,(DU`````.LPB?@/
+MMMC!XP.-A#-0`@``QP`,````QP0D$"<``.C\____C9PS5`(``(LSB34`````
+MB?@/MM"-!-*-C,5`"```#[99"8/C_(A9"8GP)0``/P`]```0`'4*B=B#R`*(
+M00GK#XT4THG8@\@!B(3520@``(M<)`R+="00BWPD%(ML)!B#Q!S#C;0F````
+M`%575E.#[`R+="0@BVPD)(M&3(LX9H.^B`````!T,HGKQP0DZ`,``.C\____
+MA>UT!8/[`78;B3PDZ/S___]F@[Z(`````'0)@^L"Z]2-="8`@\0,6UY?7<.0
+MC;0F`````(/L'(E<)!")="04B7PD&(MT)""+?"0D#[='$+K_````9CV#`'<+
+M#[?`#[:4!A@$```/M])ITI0````#EO`$``"+GNP&```/MD(PP>`(C80#3`@`
+M`(L(B0T`````@>'_````#[9",,'@"(V<`T0(``"+`Z,`````P>`("<B)@HP`
+M``!FQX*(``````")?"0$B30DZ/S___^+7"00BW0D%(M\)!B#Q!S#B?:-O"<`
+M````55=64X/L!(M\)!B+;"0<B2PD#[=%`&:%P'D+)0`?``#!^`B(1R6-1TB-
+M312+512)5TB+402)4`2+40B)4`B+40R)4`R+41")4!"-MX0```"+52Z)EX0`
+M``"+53*)5@2-7UR-33:+53:)5UR+402)4P2+40B)4PB+40R)4PR+41")4Q"+
+M412)4Q2+41B)4QB+41R)4QR+42")4R"+422)4R2Y"@```(G"Z#/Z__^Y!```
+M`(GRB?#H)?K__[D4````B=J)V.@7^O__9L='-```9L='-@``BP0D9H.XL@$`
+M``$/E,+!X@,/MD<H@^#W"="(1RCVA:<````$=`9FQT<T`0#VA:0````!="9F
+M@T\T`O:%J@````%T!6:#3S8!]H6H`````70*9H%/-``!C70F`/:%I````"!T
+M%V:#3S0$]H6J````('0)9H-/-@*-="8`]H6D````0'079H%/-(``]H6J````
+M0'0(9H-/-@B-=@#&1T8!]D<T`706BX7(````BY7,````B4<\B5=`ZP^)]HM5
+M>(E7/,='0``````/MX74````)0#0``"Z``(``#T`4```=1L/MX7L````P>`0
+M#[>5Z@````'0C10`D(UT)@")EY````"#1SS_@U=`_\9'.`+V16H"=!@/MX6`
+M````J`]T#6:#^`(9P(/`!(A'.)#&1SG_]D5J!'0>N0````"0#[>%L````-/X
+MJ`%T`XA/.8/!`8/Y!W7HQH?8`````(L$)/:`I@```"!T&`^W@*P```"#X""#
+M^`$9P(/``HB'V````+@!````@\0$6UY?7<-55U93@^PLBVPD2(M$)$"+$(M$
+M)$3!X`.-O!```@``C;00!`(``+L<`0``D(UT)@"#?"1$`W89B1_'!"00)P``
+MZ/S___^+!J,`````ZQ>)]HD?QP0D$"<``.C\____BP:C`````(F$'/3^__^#
+MPP2!^S@!``!UN8M$)!")10"+1"04B44$BT0D&(E%"(M$)!R)10R+1"0@B440
+MBT0D)(E%%(M$)"B)11B#Q"Q;7E]=PU575E.#["R+;"1(BT0D0(L0BT0D1,'@
+M`XV\$``"``"-M!`$`@``NP`!``"0C70F`(-\)$0#=AF)'\<$)!`G``#H_/__
+M_XL&HP````#K%XGVB1_'!"00)P``Z/S___^+!J,`````B80<$/___X/#!('[
+M'`$``'6YBT0D$(E%`(M$)!2)102+1"08B44(BT0D'(E%#(M$)"")11"+1"0D
+MB444BT0D*(E%&(/$+%M>7UW#55=64X/L/(M\)%"+1"14B$0D&XLO#[;PC13V
+MC137C8I`"```B$$(B;I$"```QD$*`(ET)`2)/"3H_/___XU$)!R)PL8``(/`
+M`8G3C4PD/#G(=?`/MD0D&XE4)`B)1"0$B3PDZ/S___^)'"3H_/___XT<]0``
+M``"-%#/!X@.-##J)@5`(``"-E!=0"```BT0D*(E"!(M$)"R)0@B`?"0;`W8E
+MC82UT`$``(L`HP````")@6@(``"-A!V``0``BQ")%0````#K+XV$M=`!``"+
+M"(D-`````(T4]0````"-!#*)C,=H"```C805@`$``(L0B14`````C03VC03'
+MB9!L"```]H!J"```$`^$LP```/:`20@```)U"L>`7`@```$``@"`?"0;`W8Q
+MC1SU`````(V$*S`"``#'`!@```#'!"00)P``Z/S___^-G"LT`@``BQ.)%0``
+M``#K+XT<]0````"-A"M0`@``QP`8````QP0D$"<``.C\____C9PK5`(``(L3
+MB14`````C03V]X3':`@``````P!U"('B____W^L&@<H````@@'PD&P-V"XV$
+M]30"``")$.L)C83U5`(``(D0@\0\6UY?7<.-M@````!55U93@^P<BT0D-(M4
+M)#"+$HE4)!B+$L9`)0#&0"0%QD`G!HM,)#")2"RY`````+T`````C8(``@``
+MB40D%('"!`(``(E4)!#K%XVV`````(M4)#`/MD((T_BH`74,@\$!BT0D&#I(
+M*W+F@/D#=G$/MMG!XP.+?"04`=_'!RP```#'!"00)P``Z/S___\#7"00BS.)
+M-0````#'!R0```#'!"00)P``Z/S___^+`Z,`````P>`(@>;_````"<;'!R``
+M``#'!"00)P``Z/S___^+&XD=`````.MOC;0F``````^VV<'C`XM\)!0!W\<'
+M+````,<$)!`G``#H_/___P-<)!"+,XDU`````,<')````,<$)!`G``#H_/__
+M_XL#HP````#!X`B!YO\````)QL<'(````,<$)!`G``#H_/___XL;B1T`````
+M@?X!`6F6=1>+5"0P@$H'!HG8P>@0/%`/E,`/MMCK6H'^`0$``'41B=C!Z!`\
+M4`^4P`^VV.M#B?;'!"2($P``Z/S___^#Q0&)Z8#Y!'<*N0````#IP?[__XG8
+MP>@0/%`/E,`/MMB)7"0(B70D!,<$)&0#``#H_/___XG8@\0<6UY?7<.0C70F
+M`%575E.#[#R+5"10BP*`>BL`#X3)`@``QT0D.`````"-B``"``")3"0<!00"
+M``")1"08#[9$)#B(1"0W#[;HC43M`(M4)%"-',+V@VH(```0#X1P`@``C9-`
+M"```N`$```")Z=/@"$(*BYM,"```B5PD,/9""0(/A!@!```/MEPD-X/#`8MT
+M)%`X7BL/A@,!``"-1.T`B40D((VT)@`````/MO.-!/;!X`.+5"10C3P0]H=J
+M"```$`^$QP```(M,)"#!X0,!RHE4)"SW@EP(``````X`#X2J````BU0D4(V$
+M`E`(``")1"0HB<*#PA"+1"10C8P(4`@``(E,)"2)R(/`$,=$)`@(````B50D
+M!(D$).C\____A,!T:HM$)"B#P`2+5"0D@\($QT0D"`@```")1"0$B10DZ/S_
+M__^$P'1$N`$```")\=/@BU0D+('"0`@```I""HA""HB'2@@``(-\)#``=0R+
+MOTP(``")?"0PZQ*-!/:+5"0PBW0D4(F4QDP(``"#PP&+3"10.%DK#X<,____
+M@WPD,``/A:$```"+="10B30DZ/S___^)1"0PA<`/A"D!``"-1.T`C03&BU0D
+M,(F03`@```^V5"0WC132C9361`@``(M,)#")41@/MH!)"```B$$&QD$%`(DQ
+MQD$)``^V5"0W@\(!.%8K=E2-1.T`C9S&0`@``(VV``````^VR@^V0PK3^*@!
+M=!*-!,F+3"0PBW0D4(F,QDP(``"#P@&+="10.%8K=ACKTXUV`(U$[0"+3"0P
+MBU0D4(F,PDP(``"-'.T`````C00KBW0D4(V$QD`(```/ME`*BTPD,(A1"`^V
+M<`J`?"0W`W8CBT0D'`'8QP`X````QP0D$"<``.C\____BU0D&(T$$XDPZR6-
+M'.T`````BT0D'`'8QP`X````QP0D$"<``.C\____`UPD&(DS@T0D.`$/MD0D
+M-X/``8M,)%`X02L/AU+]__^#Q#Q;7E]=PY"-M"8`````55=64X/L/(M$)%"+
+M",9$)#!0QD0D,0'&1"0RD\9$)#/`QD0D-!'&1"0U`\9$)#8`QD0D-P`[@*`$
+M```/A9X```")PH'"A`D``(M$)#"+7"10B8.T!```BT0D-(F#N`0``*$`````
+M`(.W!```@\`!HP`````/MH.T!```B(*T!```#[:#M00``(B"M00```^V@[8$
+M``"(@K8$```/MH.W!```@\`"B(*W!```#[:#N`0``(B"N`0```^V@[D$``"(
+M@KD$```/MH.Z!```B(*Z!```#[:#NP0``(B"NP0``(G/C8$``0``B40D&(N!
+M``$``*,`````#[?0B50D.*@@=`LEW_\``(E$)#CK%HG0@\@@B40D.(M4)!B)
+M`HL"HP````"+3"10BP''@`0!````````BP''@!@!````````BP''@!P!````
+M````QP0DD-`#`.C\____QX=P`0``&`$``(N'=`$``*,`````@.3]@,P$B40D
+M.,>'<`$``!@!``"+1"0XB8=T`0``QX=P`0``*`$``,>'=`$``']_``#'AW`!
+M```D`0``BX=T`0``HP````!FN```#?\_``")1"0XQX=P`0``)`$``(M$)#B)
+MAW0!``#'AW`!```\`0``QX=T`0````!Z`,>'<`$``*0!``#'AW0!``!]O^__
+MQX=P`0``N`$``(N'=`$``*,`````)?__```-``#Z`(E$)#C'AW`!``"X`0``
+MBT0D.(F'=`$``,>'G````/\```#'AY`"``!$`0``QX>4`@``!A``",>'D`(`
+M`+0!``#'AY0"``!?<```QX>0`@``,````(N'E`(``*,`````,.2`S#.)1"0X
+MB8>4`@``BUPD4(![*P`/A'T"``#'1"0<`````(V'4`(``(E$)!"-EU0"``")
+M5"0,#[9,)!R(3"0C@/D##X80`0``#[;IC1SM`````(E<)!2-M!\P`@``QP8(
+M````QP0D$"<``.C\____BT0D%(V<!S0"``"+`Z,`````B40D.`T``(``B0.+
+M1"10!;0$``")1"0(B6PD!(M4)%")%"3H_/___XEL)`2+3"10B0PDZ/S____'
+M!D0!``#'!"00)P``Z/S____'`P80``C'!K0!``#'!"00)P``Z/S____'`U]P
+M``#'!@@```#'!"00)P``Z/S____'1"0X_U2``,<#_U0``,=$)`@!````B6PD
+M!(M<)%")'"3H_/___XM$)!2-E`>``0``BP*C`````"7___[_B0+'1"0X!0'(
+M`(M4)!2-A!>$`0``QP`%`<@`Z0D!```/MFPD(XT,[0````")3"0HBW0D$`'.
+MQP8(````QP0D$"<``.C\____BUPD*`-<)`R+`Z,`````B40D.`T``(``B0.+
+M1"10!;0$``")1"0(B6PD!(M$)%")!"3H_/___XEL)`2+5"10B10DZ/S____'
+M!D0!``#'!"00)P``Z/S____'`P80``C'!K0!``#'!"00)P``Z/S____'`U]P
+M``#'!@@```#'!"00)P``Z/S____'1"0X_U2``,<#_U0``,=$)`@!````B6PD
+M!(M,)%")#"3H_/___XM<)"B-E#N``0``BP*C`````"7___[_B0+'1"0X!0'(
+M`(V$.X0!``")1"0DQP`%`<@`QP0DH(8!`.C\____B6PD!(M4)%")%"3H_/__
+M_X-$)!P!#[9$)".#P`&+3"10.$$K#X>?_?__BUPD4(D<).C\____BX<$`0``
+MHP````"#R`*)1"0XB8<$`0``BU0D&(L"HP`````E\/___0T-```"B40D.(D"
+MBP*C`````(M,)%"+@<P&``")AP@!``"+@=`&``")APP!``"+7"10BX/P!@``
+MB8<0`0``BX/T!@``B8<4`0``QX<@`0````````^W@T`(```E_P\```T```$`
+MB8<@`0``BTPD4(N!.`<``(F')`$``(N!/`<``(F'*`$``(N!6`<``,<`_P\`
+M`,>'-`$````````/MX%""```)?\/```-```!`(F'-`$``(M<)%"+@UP'``")
+MAS@!``"+@V`'``")ASP!``#'AT@!````````QT0D.``!``#'ATP!`````0``
+MBX<$`0``HP````"#R%F)AP0!``#'1"0X^_\`#,>'5`$``/O_``S'AUP!``#_
+M_P``N`````"+5"10QX2"$`4```````"#P`&#^!!UZ6;'@CP(``#_#V;'@CX(
+M``#_#[`!@\0\6UY?7<.0C70F`%575E.#[!R)1"04B=>+*(DL).C\____B<.%
+MP'4,QH>5`````>G`````B2PDZ/S___^)QH7`=1C&AY4````!B5PD!(DL).C\
+M____Z9H```"-0SR)1"08QD,DX<9#)0'&0R8##[=''&:)0Q#&0V@/BU0D%(L"
+MB4,8QT,@``(``(M6"(E3-+@`````C;0F`````,8$$`"#P`$]``(``'7RB7-,
+MQT-LX)```,=$)`0`````BT0D&(D$).C\____BT,@B40D#(M&#(M6$(E$)`2)
+M5"0(BU0D&(D4).C\____B5PD!(DL).C\____@\0<6UY?7</K#9"0D)"0D)"0
+MD)"0D)!55U93@^PLBWPD0(M<)$2%VW05#[9#!83`=`T\_P^%C08``.D+`0``
+MN@````"-=@`/MH0ZG`0``#S_=`T/ML!KP$R-G`?H````@\(!@_H$==^^````
+M``^VA#Z<!```//]T'P^VP&O`3(V<!^@```#VA`?N`````G4(B1PDZ/S___^#
+MQ@&#_@1US0^V1R9F.8>H!@``#X46!@``A=L/A7P```"`?S,`#X4$!@``QD<S
+M`8N$GQ@"``"%P'15BU!PA=)T*,=`<`````#'A)\8`@```````,=$)`C_____
+MB40D!(M`>(D$)/_2ZR:+4'2%TG0?QT!T`````,>$GQ@"````````BT!XB00D
+M_]*0C70F`(/#`8/[%`^$E`4``.N2QD,%_XE<)`2)/"3H_/___^E]!0``N@``
+M```/MH0ZG`0``#S_=&P/MLAKP4R-A`?@````@'@-_W19@'@1``^$3P4``+L`
+M````:^E,C;0O$`$``(DT).C\____C4P]`(N1%`$``(F!%`$``(DPB5`$B0*`
+M>";_#X47!0``@\,!.)GQ````#X8(!0``Z\:-M@````"#P@&#^@1U@,=$)"``
+M````@'\S``^%C@```+L`````D(N4GQ@"```/MH0[&`0``(72=&2+2G"%R71=
+M@WID`'57//]T+0^V\&G&W`````.'U`0``/9`)P1T&(!X)0!U$HET)`B)5"0$
+MB3PDZ/S____K)L>$GQ@"````````QT)P`````,=$)`C_____B50D!(M">(D$
+M)/_1@\,!@_L4=8'&1S,!Z5@$``"+5"0@#[:$.IP$```\_P^$+@0```^VT&O"
+M3(V,!^@```")3"0H@+P'\0`````/A`\$``#&1"0G`(G%C80'$`$``(E$)!2-
+M=@"+5"04B10DZ/S___^)PXU$/0"+D!0!``")F!0!``"+3"04B0N)4P2)&H![
+M)O\/A;`#```/MT,<B40D&`^VE#@8!```9HE4)!Z+M(<8`@``]D,H!'1KA?9T
+M9X-^<`!T88-^9`!U6X!C*/OV0R<$C78`=!4/M\*)1"0(B70D!(D\).C\____
+MZSF+5G"+3"08QX2/&`(```````#'1G``````QT,@`````,=$)`C_____B70D
+M!(M&>(D$)/_2D(UT)@#V0R<$#X1J`0``QH.4`````("D+^\```#G]D,H`0^$
+M_@```(!C*/Z+0R"%P'18@'LE`'4S]D,G!'0M#[9'*8T$@(M4)!B-!(*)1"0(
+MBX>@!```B40D!,<$)`<```#H_/___^G=````B40D"(N'H`0``(E$)`3'!"0!
+M````Z/S____IO@```(7V=&&+5G"%TI!T68![)0!U(/9#)P1T&@^W1"0>B40D
+M"(ET)`2)/"3H_/___^F,````BTPD&,>$CQ@"````````QT9P`````,=#(```
+M``#'1"0(_____XET)`2+1GB)!"3_TNM9@'LE`'53]D,G!'1-#[9'*8T$@(M4
+M)!B-!(*)1"0(BX>@!```B40D!,<$)`(```#H_/___^LCBT,@A<!T'(M0=(72
+MC78`=!+'0'0`````BT,@BT!XB00D_]+V0R@"#X35`0``BT,@B40D"(N'H`0`
+M`(E$)`3'!"0&````Z/S___^`8RC]Z8@!``"+0R"%P`^$?0$``(-X=``/A',!
+M``#&0R<!QD,F`(E<)`C'1"0$!@```(M,)"B)#"3H_/___X![1P!T&Y")/"3H
+M_/___\<$)`$```#H_/___X![1P!UYHMS((7V#X3V````]D,H!'5=B3PDZ/S_
+M___'1"0(`0```(M#((E$)`2)/"3H_/___XM3(`^V0@*)1"0(#[9"`8E$)`3'
+M!"1O````Z/S___^+0R")1"0(BX>@!```B40D!,<$)`$```#H_/___^LY#[9&
+M`HE$)`@/MD8!B40D!,<$)&\```#H_/___XM#((E$)`B+AZ`$``")1"0$QP0D
+M`0```.C\____BU9TA=)T'@^W0QS'A(<8`@```````,=&=`````"+1GB)!"3_
+MTO9#*`)T(8M#((E$)`B+AZ`$``")1"0$QP0D!@```.C\____@&,H_<=#(```
+M``#'1F0`````BU,PA=)T#`^V0T7'1((X`````(L3BT,$B4($B1"`K"_Q````
+M`8E<)`2)/"3H_/____9#*`)T(8M#((E$)`B+AZ`$``")1"0$QP0D!@```.C\
+M____@&,H_8!$)"<!#[9$)"<XA"_Q````#X<&_/__@T0D(`&#?"0@!`^%KOO_
+M_XVV`````+@!````@\0L6UY?7<.-=@"#["R)7"0<B70D((E\)"2);"0HBUPD
+M-(M[+`^W0QRZ`````(M,)#"`O`$8!```_P^$<`<```^V0R8\"0^$@@4``#P)
+M=TL\!0^$F````#P%D'<>/`,/A+8````\!(UT)@`/A2H'``#IY````)"-="8`
+M/`</A.8$```\!XVV``````^';`0``.F.`@``D(UT)@`\%@^$VP,``#P6C;8`
+M````=R,\%`^$ZP4``#P4C70F``^'$`,``#P*#X72!@``B?;I8P4``#P:#X0X
+M`@``//^0#X3#!0``/!</A;(&``")]NFA`P``BW0D,`^V;BN)Z(3`#X2A````
+M#[97"+X`````]L(!#X2"````Z8H```")]HM'&(%@*/___O^+0RS'1"0,````
+M`,=$)`@!````B5PD!(D$).C\____QP0D!0```.C\____N@$```#I5@8``,=$
+M)`P`````QT0D"`````")7"0$B3PDZ/S____'!"10PP``Z/S___^Z`0```.DD
+M!@``B=")\=/XJ`%U$H/&`8GPB>DXR'7KZP6^``````^V4R2)T(/@!H/X!G4)
+M]L(!#X75````BU<8BT(HJ0```0!T#27___[_B4(HZ;L```")\@^VPL'@`XE$
+M)!B]$"<``)"+3"0PBQ&)\#P#=AF+3"08C801@`$``(L`HP`````E```!`.L7
+MBTPD&(V$$8`!``"+`*,`````)0```0"%P'0RB?`\`W86BTPD&(V$$8`!``#'
+M`````0#I6P4``(M,)!B-A!&``0``QP````$`Z44%``#'!"3H`P``Z/S___^#
+M[0$/A7G____&0R<"QD,F_XE<)`2+="0PB30DZ/S___^Z`0```.D<!0``]D<&
+M`70VB5PD!(D\).C\____A,!U)KWZ````B5PD!(D\).C\____A,!U$<<$).@#
+M``#H_/___X/M`77?B?`\`W8>BU0D,(L"!8`!``")\0^VT8T4T(L"HP````")
+M`NL<BU0D,(L"!8`!``")\0^VT8T4T(L"HP````")`HM#+(G:Z#'U__^Z`0``
+M`.F,!```BW0D,`^V1BF+5Q@/ME($C02"#[9318T$@`^VA`(`````#[96(@^V
+M3B&)1"0,B50D"(E,)`3'!"24`P``Z/S___^+<RR+/HD\).C\____B<&%P'41
+MQH.5`````;H!````Z2<$``#&0"3AQD`E`<9`)A</MT,<9HE!$,9!:`^+!HE!
+M&,=!(`````#'030`````QT%LX)```(E,)`2)/"3H_/___[H!````Z=\#``"+
+M5"0P#[9"*8M7&`^V4@2-!((/ME-%C02`#[:$`@````"+3"0P#[91(@^V22&)
+M1"0,B50D"(E,)`3'!"34`P``Z/S___^+<RR+/HD\).C\____B<&%P'41QH.5
+M`````;H!````Z78#``#&0"3AQD`E`<9`)A@/MT,<9HE!$(L&B4$8QT$@````
+M`,=!-`````#'06S@D```B4PD!(D\).C\____N@$```#I,@,``(G:B?CHQ//_
+M_[H!````Z1\#``"+-XDT).C\____B<$/MD,XA<EU$<:#E0````&Z`0```.GZ
+M`@``QD$DX<9!)0'&028%B$$G#[=#'&:)01"+!XE!&,=!(`````#'030`````
+MQT%LX)```(E,)`2)-"3H_/___[H!````Z;,"``"+-XDT).C\____B<$/MD,Y
+MA<EU$<:#E0````&Z`0```.F.`@``QD$DX<9!)0'&028$B$$G#[=#'&:)01"+
+M!XE!&,=!(`````#'030`````QT%LX)```(E,)`2)-"3H_/___[H!````Z4<"
+M``"+-XDT).C\____B<&%P'41QH.5`````;H!````Z28"``#&0"3AQD`E`<9`
+M)@8/MT,<9HE!$(L'B4$8QT$@`````,=!-`````#'06S@D```B4PD!(DT).C\
+M____N@$```#IX@$``(LWB30DZ/S___^)P87`=1'&@Y4````!N@$```#IP0$`
+M`,9`).'&0"4!QD`F#`^W0QQFB4$0BP>)01C'02``````QT$T`````,=!;."0
+M``")3"0$B30DZ/S___^Z`0```.E]`0``BS>)-"3H_/___XG!A<!U$<:#E0``
+M``&Z`0```.E<`0``QD`DX<9`)0'&0"86QD`H`0^W0QQFB4$0QD%H#XL'B4$8
+MQT$@`````,=!-`````#'06S@D```B4PD!(DT).C\____N@$```#I$`$``,9#
+M)O]FQX.,``````"`>R<"=1B+0RR)7"0(B40D!(MT)#")-"3H_/___Y#V1P<"
+M=1.[`````(UW*(!_"0!U+.F6````BT<<@$`I`8E$)`2+1"0PB00DZ/S___^Z
+M`0```.FK````C;8`````B30DZ/S___^)PHM'+(E7+(DRB4($B1"`>B;_=$J`
+M>B4`=3V`NI4`````=&0/MDHDB<B#X`:#^`9T5H/X!'51]L$!=$R)5"0$BU0D
+M,(D4).C\____N@$```#K2I"-="8`QH*5`````(/#`3A?"7>1QD<%_XE\)`2+
+M3"0PB0PDZ/S___^Z`0```.L;C;8`````N@$```#K#H7M#X3(^O__D.GD^O__
+MB="+7"0<BW0D((M\)"2+;"0H@\0LPY"-="8`@^P\B5PD+(ET)#")?"0TB6PD
+M.(M\)$"+;"1$BT4TB40D*`^V728/MU409H'Z@P`/AQP#```/M\(/MHP'&`0`
+M`(#Y_P^$"`,``&:#^G]W&0^VP8N7U`0``&G`W````(M$$"P/MD`$ZQ</ML&+
+ME_`$``!IP)0```"+1!!,#[9`!#S_#X3*`@``#[;`#[:$!YP$```\_W0.@/G_
+M=`D/ME44@/H&=3`\_P^$I0(``(#Y_Y`/A)L"```/ML%IP-P```")Q@.WU`0`
+M`,9&)P+&1B;_Z7$"```/ML%IP-P```")Q@.WU`0``(32#X2H````@/L&#X2?
+M````@/L,#X2\`0``#[>&C````(E$)!@/ML*)1"04#[9&)HE$)!`/MD<IBU8L
+MBU(8#[92!(T$@@^V5D6-!(`/MH0"`````(E$)`P/MD<BB40D"`^V1R&)1"0$
+MQP0D^`,``.C\____#[>6C````(U"`6:)AHP```!F@_H!=A.`?B8&=`W&1B<"
+MQD8F_^G"`0``QP0DZ`,``.C\____D.FP`0``@/L!=0O&1B8$B?;IH`$``(#[
+M`G4+QD8F!8GVZ9`!``"`^P,/A?T```"+1"0H@'XF&G4<9H%X!,@WB?9U$F;'
+MAHP``````,9&)@;I80$``(E$)`2)-"3H_/___XU&7+HH````Z!/8__^$P'4_
+MC49(NA0```#H`MC__X3`=2Z-AH0```"Z"````.CNU___A,!U&HM&/`M&0'02
+M9L>&C```````QD8F%^D%`0``#[>&C````(E$)!`/MD<IBU8LBU(8#[92!(T$
+M@@^V5D6-!(`/MH0"`````(E$)`P/MD<BB40D"`^V1R&)1"0$QP0D,`0``.C\
+M____9H.^C````!UV#<9&)P+&1B;_Z:,```#'!"3H`P``Z/S___]F@X:,````
+M`>F*````@/L7=0]FQX:,``````#&1B85ZW:`^QAU#V;'AHP``````,9&)A;K
+M8H#[!'4/9L>&C```````QD8F!^M.@/L%=0]FQX:,``````#&1B8(ZSJ`^P9U
+M#V;'AHP``````,9&)@GK)H#[#'4/9L>&C```````QD8F"NL2@/L6=0UFQX:,
+M``````#&1B84B70D!(D\).C\____@WU,`'0/C45,B40D!(D\).C\____B6PD
+M!(D\).C\____BUPD+(MT)#"+?"0TBVPD.(/$/,.-=@"-O"<`````5E.#["2+
+M="0TBUY,#[=6+KD`````]L(@=06Y`````(!^)AH/AW<%```/MD8F_R2%'```
+M``^V5BD/MD8>.,(/@PH%```/ML*+1(8XA<`/A.T$``#IPP0``,9&)@'&1BD`
+MQT0D%`````#'1"00`````,=$)`P"````QT0D"`$```#'1"0$`````(DT).C\
+M____N`````#I"P4``,=$)!0`````QT0D$`````#'1"0,`````,=$)`@!````
+MQT0D!`````")-"3H_/___[@`````Z=$$``#'1"04`````,=$)!``````QT0D
+M#`$```#'1"0(`0```,=$)`0`````B30DZ/S___^X`````.F7!```QT0D%```
+M``#'1"00`````,=$)`Q@````QT0D"`$```#'1"0$`````(DT).C\____N```
+M``#I700``,=$)!0`````#[9&*HE$)!#'1"0,8````,=$)`@!````QT0D!`$`
+M``")-"3H_/___[@`````Z2,$``#'1"04`````,=$)!````$$QT0D#"$```#'
+M1"0(`0```,=$)`0!````B30DZ/S___^X`````.GI`P``QT0D%`````#'1"00
+M`0```,=$)`P"````QT0D"`````#'1"0$`0```(DT).C\____N`````#IKP,`
+M`,=$)!0`````QT0D$`````#'1"0,`@```,=$)`@`````QT0D!`$```")-"3H
+M_/___[@`````Z74#``")3"04QT0D$`````#'1"0,`````,=$)`@`````QT0D
+M!`````")-"3H_/___[@`````Z3\#``"+0QB!8"C___;_QT0D%`````#'1"00
+M_____\=$)`P!````QT0D"`````#'1"0$`0```(DT).C\____N`````#I^P(`
+M``^V3BF+0Q@/ME`$B4PD%(E4)!"+7"0P#[9#*8T$@HT$@`^VA`$`````B40D
+M#`^V0R*)1"0(#[9#(8E$)`3'!"1H!```Z/S____'1"00`````,=$)`P`````
+MQT0D"`$````/MD8IBT2&.(E$)`2+1DR)!"3H_/___[@`````Z7D"``#'1"00
+M`````,=$)`P`````QT0D"``````/MD8IBT2&.(E$)`2)'"3H_/___[@`````
+MZ4,"``"+0QCW0"@```D`=`;&1B80ZTO&AI(`````C5YHB5PD!(M4)#"+0A2)
+M!"3H_/___\=&:$!"#P#'1G``````B79TB5PD!(M<)#"+0Q2)!"3H_/___[@!
+M````Z>8!``#V1BX@=&.#?C0`=$[&1B82#[9>'H3;=&Z+5C2Y`````+@!````
+M]L(!=1+K&I"-="8`N`$```#3X(7"=!6(3BGWT"%&-.M`N0````"-M@````"#
+MP0$XV779ZRS&1BD`QD8F&6:#9B[?ZQT/MD8I@\`!B$8I.D8><@K&1BD`QD8F
+M&>L$QD8F"XET)`2+1"0PB00DZ/S___^X`0```.E&`0``QT0D%`````#'1"00
+M`````,=$)`P@````QT0D"`$```#'1"0$`````(DT).C\____N`````#I#`$`
+M`,=$)!0`````QT0D$`````#'1"0,`0```,=$)`@`````QT0D!`````")-"3H
+M_/___[@`````Z=(```#'1"04`````,=$)!#_____QT0D#`$```#'1"0(````
+M`,=$)`0!````B30DZ/S___^X`````.F8````C78`#[;"BT2&.(7`="7&0"8:
+MQD`G!HE$)`2+5"0PB10DZ/S___^X`0```.MKC;8`````@\(!B%8I#[9&'CC0
+M=\(XPG5.QD8I`,9&)A&)="0$BUPD,(D<).C\____N`$```#K-(G0@\@"9HE&
+M+L9&)@"+1DS&0`7_BT9,B40D!(M$)#")!"3H_/___[@!````ZP:0N`$```"#
+MQ"1;7L.0C70F`(/L+(E<)"")="0DB7PD*(MT)#"+/HM&3(M0&/="*```"0!U
+M30^VAI(````\"G96#[9.*0^V4@2)3"04B50D$`^V1RF-!(*-!(`/MH0!````
+M`(E$)`P/MD<BB40D"`^V1R&)1"0$QP0DE`0``.C\____QD8F$(ET)`2+!HD$
+M).C\____ZSN#P`&(AI(```"-7FB)7"0$BT<4B00DZ/S____'1FA`0@\`QT9P
+M`````(EV=(E<)`2+1Q2)!"3H_/___XM<)""+="0DBWPD*(/$+,-55U93@^PL
+MBWPD0(M$)$0/MU`09H'Z@P!W5@^WP@^VA#@8!```//]T1V:#^G]W&`^VP&G`
+MW`````.'U`0``(M`+`^V4`3K+HM4)$0/MT(0#[:$.!@$``!IP)0````#A_`$
+M``"+0$P/ME`$ZPF-="8`NO____^Y_____XM$)$1F@7@0@P!W$(M,)$0/MT$0
+M#[:,.!@$```/ML(/MH0XG`0``&O`3(VT!^@````/ML%IP)0```"+K_`$```!
+MQ8M$)$2`>!0`#X36````#[95*8E4)"0/MDTFB4PD*(M&&`^V4`0/MD<IC02"
+MB40D#`^V3R(/ME\ABT0D)(E$)!B)5"04BU0D*(E4)!")3"0(B5PD!,<$),`$
+M``#H_/___X!]'@!T*+L`````#[;#BT2%.(7`=!")1"0(B70D!(D\).C\____
+M@\,!.%T>=]V+3"1$@WE,`'01B<B#P$R)1"0$B3PDZ/S___^+1"1$B40D!(D\
+M).C\____9H--+@+&128`BT5,QD`%_XM%3(E$)`2)/"3H_/___^F:`0``C;0F
+M`````(N7[`8``('"0`@```^V13#!X`@!PHL"HP````"+E^P&``"!PD0(```/
+MMD4PP>`(`<*+"HD-`````(N7[`8``('"2`@```^V13#!X`@!PHL"HP````"+
+ME^P&``"!PDP(```/MD4PP>`(`<*+$HD5``````^V128\$70K/!%W#3P+#X7Q
+M````Z9T````\$HUV`'1X/!,/A=T```"-M@````#I?0```(G(P>`("T4T#[;2
+M"=")132Y`````(!]'@!T.+D`````N`$```#V130!=0[K%K@!````T^"%131T
+M$HA-*??0(44TZQ"Y`````(UV`(/!`3A-'G?:.$T>#Y3`C03%$@```(A%)NMM
+MB<C!X`BI```!!'0&QD4F$^M;QD4F"^M5QD4F"^M/BT5,BT`8@6`H___W_\9%
+M)A")T(/@#X/X`W48#[9%*8M$A3B%P'0&]D`H$'0BQD4F#.L<#[9%*8M$A3B%
+MP'00B40D"(ET)`2)/"3H_/___XM4)$2)5"0$B3PDZ/S___^);"0$B3PDZ/S_
+M__^#Q"Q;7E]=PY"-="8`@^P,BT0D$(E$)`2+`(D$).C\____@\0,PXVT)@``
+M``"#[`R+1"00QD`F"(E$)`2+`(D$).C\____@\0,PXUV`(/L#(M$)!#&0"8.
+MB40D!(L`B00DZ/S___^#Q`S#C78`5U93@^P0BW0D((L^B30DZ/S___^$P'08
+M#[9?*X3;=#$/ME8(N0````#VP@%T'.LAQD8%_XET)`2)/"3H_/___^M<B=#3
+M^*@!=0>#P0$XV77QB3PDZ/S___^)P87`=#^+5BR)1BR-1BB)`8E1!(D*@$8)
+M`8EQ+,9!)`7&024`QD%%#\=$)`P!````QT0D"`$```")3"0$B30DZ/S___^#
+MQ!!;7E_#C70F`(V\)P````!55U93@^P,BW0D((M\)"2++KL*````B7PD!(DT
+M).C\____A,!U$<<$).@#``#H_/___X/K`77?#[9=*X3;="`/ME8(N0````#V
+MP@%T"^L0D(G0T_BH`74'@\$!.-EU\8L7BT<$B4($B1"`;@D!B7PD!(DL).C\
+M____]D8'`G0^BT8<A<!U$XDL).C\____A<`/A%<!``")1AR)*(EP3,9`*0#&
+M0"8`9L=`+@$`B40D!(DL).C\____Z3`!``"+1AR%P`^$RP```(/`:(E$)`2+
+M112)!"3H_/___XM&'(E$)`2)+"3H_/___XU^*#E^*`^$EP```(D\).C\____
+MB<.+0""%P'1MQT!D`````/9#*`1U'XDL).C\____QT0D"`$```"+0R")1"0$
+MB2PDZ/S___^+0R")1"0(BX6@!```B40D!,<$)`$```#H_/___XM#((E$)`B+
+MA:`$``")1"0$QP0D!@```.C\____QT,@`````(!N"0&)7"0$B2PDZ/S___\Y
+M?B@/A6G____'1AP`````@'X)`'03C48HB00DZ/S___^)P8!N"0'K"HDL).C\
+M____B<&%R70SBU8LB4XLC48HB0&)402)"H!&"0&)<2S&020%QD$E`,9!)P;&
+M028#B4PD!(DL).C\____@\0,6UY?7<.-="8`C;PG`````(/L+(E<)!R)="0@
+MB7PD)(EL)"B+;"0PBUPD-`^W4Q!F@?J#`'=:#[?"#[:,!1@$``"`^?]T2F:#
+M^G]W&0^VP8N5U`0``&G`W````(M$$"P/MD`$ZQ</ML&+E?`$``!IP)0```"+
+M1!!,#[9`!`^VR3S_=`UF@?G_`'47C;8`````B5PD!(DL).C\____Z3D!```/
+MML`/MI0%G`0```^WP6G`W````(G&`[74!```@'L4``^$J0```&O"3(V\!>``
+M```/MD<1B40D$`^V1Q")1"0,#[9#)XE$)`@/MD,FB40D!,<$)/@$``#H_/__
+M_XL6BT8$B4($B1"`;Q$!B70D!(DL).C\____B5PD!(DL).C\____#[9U*XGP
+MA,`/A*D````/ME\0N0````#VPP%U#>L<#[;*B=C3^*@!=!:)3"0$B2PDZ/S_
+M___I?0```+H`````@\(!B?`XPG76ZVV-=@!KPDR-O`7H````@'LF`74VQP0D
+M$"<``.C\____B5PD!(DL).C\____QT0D#`$```#'1"0(`````(ET)`2)/"3H
+M_/___^LDQP0D4,,``.C\____B5PD!(DL).C\____B70D!(D\).C\____BUPD
+M'(MT)""+?"0DBVPD*(/$+,.)]E575E.#["R+="1`BT0D1`^W4!!F@?J#`'=6
+M#[?"#[:$,!@$```\_W1'9H/Z?W<8#[;`:<#<`````X;4!```BT`L#[90!.LN
+MBU0D1`^W0A`/MH0P&`0``&G`E`````.&\`0``(M`3`^V4`3K"8UT)@"Z____
+M_[G_____BUPD1&:!>Q"#`'<0BTPD1`^W01`/MHPP&`0```^VP@^VA#"<!```
+M:\!,C;P&Z````(M<)$0/MD,F@^@!QT0D)``````\`7<3#[;!:<#<`````X;4
+M!```B40D)(MO'(M$)$2`>!0`#X1J`0``@WA,`'0/@\!,B40D!(DT).C\____
+MBU0D1(E4)`2)-"3H_/___XM,)$0/ME$FC4+_/`$/AX<```"`^@$/E,(/MM*+
+M1Q@/MD`$B40D'`^V32D/MD8IBUPD'(T$@XT$@`^VA`$`````B40D#`^V7B(/
+MMD8AB40D!(E4)!B)3"04BU0D'(E4)!")7"0(QP0D3`4``.C\____BTPD)(E,
+M)`B)?"0$B30DZ/S____&1280B6PD!(DT).C\____Z5($```/METIB5PD*`^V
+M12:)1"0@BT<8#[90!`^V1BF-!(*)1"0,#[9.(@^V7B&+1"0HB40D&(E4)!2+
+M5"0@B50D$(E,)`B)7"0$QP0DP`0``.C\____@'T>`'0HNP`````/ML.+1(4X
+MA<!T$(E$)`B)?"0$B30DZ/S___^#PP$X71YWW6:#32X"QD4F`(M%3,9`!?^+
+M14R)1"0$B30DZ/S____IK@,``(VT)@`````/MD4F@^@-N@````"Y`````#P!
+M=G*+ENP&``"!PD`(```/MD4PP>`(`<*+`J,`````BY;L!@``@<)$"```#[9%
+M,,'@"`'"BPJ)#0````"+ENP&``"!PD@(```/MD4PP>`(`<*+`J,`````BY;L
+M!@``@<),"```#[9%,,'@"`'"BQ*)%0`````/MD4F/`X/AQ0#```/ML#_)(6(
+M````@_H%=P6(51[K!,9%'@7&128"D.F[`@``B<C!X`@/MM()T&:)12")R,'H
+M"&:)12+&128#Z9L"``"(31SVP@AT!L9%'0SK(?;"!'0*QD4="XUT)@#K$HG0
+M@^`"@_@!&<#WT(/@"HA%'<9%)@3I8P(``(G0@\@(B$4JQD4F!>E2`@``QD4F
+M!NE)`@``QD4F!^E``@``#[9%*8/``8A%*3I%'G-3BTPD1(-Y3`!T$8G(@\!,
+MB40D!(DT).C\____BUPD1(E<)`2)-"3H_/___\=%:("$'@#'17``````B6UT
+MC45HBU84B40D!(D4).C\____Z14"``#&12D`C5UHBT84B5PD!(D$).C\____
+MBT0D1(E$)`2)-"3H_/___\=%:$!"#P#'17``````B6UTBT84B5PD!(D$).C\
+M____Z<H!```/MD4I@\`!B$4I.D4>#X6``0``QD4I`,9%*V3&128+Z6\!``#&
+M128*Z68!``#&128+Z5T!``"+14R+0!B!8"C___?_B="#X`^#^`-U"<9%)@SI
+M/0$```^V12N$P'07@^@!B$4KQP0DZ`,``.C\____Z1X!```/MD4I@\`!B$4I
+M.D4>#X(+`0``QD4I`,9%)AGI_@````^V12F+1(4XA<!T%HG!@&`H[XL0BT`$
+MB4($B1"`;PD!ZSZ)-"3H_/___XG!A<!U,(M4)$2#>DP`=!&)T(/`3(E$)`2)
+M-"3H_/___XM,)$2)3"0$B30DZ/S____IU0```,9%)@T/MD4IB4R%.(EY+(EI
+M,`^V12F(047&024`@$DD!8!'"0&-1RB+4`2)2`2)`8E1!(D*ZV>-76B+1A2)
+M7"0$B00DZ/S____'16A0PP``QT5P`````(EM=(M&%(E<)`2)!"3H_/___XM<
+M)$2#>TP`=!&)V(/`3(E$)`2)-"3H_/___XM$)$2)1"0$B30DZ/S____K/\9%
+M)@^-="8`BU0D1(-Z3`!T$8G0@\!,B40D!(DT).C\____BTPD1(E,)`2)-"3H
+M_/___XEL)`2)-"3H_/___X/$+%M>7UW#D(/A!\'A"(#-((M`!"WD/```#[;2
+MP>((`=")"`^W`&:C``````^VP,.0C;0F`````(/A!\'A"(I,)`2`S1"+0`0M
+MY#P```^VTL'B"`'0B0C#55=64X/L"(G'QD0D`@#&1"0#`+W_____QT0D!```
+M```/MD0D!(A$)`&#1"0$`;@!````B<8/MDPD!-/FB?&[`````+C`X>0`N@``
+M``#W\3GX=QV)^BG"B=`YZG,3#[94)`&(5"0"B%PD`XG%C70F`(/#`0'Q@_L0
+M=<F#?"0$"'6?#[9$)`/!X`,*1"0"#[;`@\0(6UY?7<.0C;0F`````(/L#(E<
+M)`2)="0(BUPD$`^V="04QP0D`````+D'````B?*)V.@7____#[:#T0<``(D$
+M)+D#````B?*)V.C__O__BUPD!(MT)`B#Q`S#C78`4XG3#[;1N0,```#HL/[_
+M_SC8#Y3`#[;`6\.-M@````!3BUPD"(7;="^Z`````(GV#[:$&I@$```/ML@\
+M_W01#[?!:<"4`````X/P!```ZPV#P@&#^@1UV+@`````6\.05E.#[`2+1"00
+MBYBD!```A=MU`HG#O@````#'!"0`````N0<```")\HG8Z&'^___'!"1$````
+MN0(```")\HG8Z$S^___'!"30````N0````")\HG8Z#?^___'!"0`````N00`
+M``")\HG8Z"+^__^#Q@&#_@)UI+B@A@$`Z##^__^(@]$'```/ML")!"2Y`P``
+M`+H`````B=CH\_W__X/$!%M>PXVV`````(V\)P````!3@^P(BUPD$&;'@X@`
+M```!``^W1"04P>`-B40D!(D<).C\____QT0D!!0```")'"3H_/___X/$"%O#
+MC;8`````@^P,BU0D$`^V3"04@'PD&`!U$+C^____T\!F(8*`````ZPZX`0``
+M`-/@9@F"@`````^W@H````")1"0$B10DZ/S___^#Q`S#D(VT)@````"#[!R)
+M7"00B70D%(E\)!B+1"0D#[9\)"@/MK"7````#[98`HM0:(72=!B)^0^VP8E$
+M)`@/ML.)1"0$B10DZ/S___^`^P-W#XT4LXGP/`-V$XU4LP3K#8GQC580@/D#
+M=@.-5B")^0^VP8E$)`@/ML*)1"0$BT0D((D$).C\____BUPD$(MT)!2+?"08
+M@\0<PY!75E.#[!")Q[L`````#[;RN0(```")\HGXZ'+\__^H"'0.N`````#K
+M(XVT)@````#'!"0!````Z/S___^#PP&!^Q`G``!UR;C_````@\006UY?PXVV
+M`````(V\)P````"#[`R)'"2)="0$B7PD"(G&B<\/MMJ)VNB$____A<!U,(GX
+M#[;0B=F)\.A"_?__A<!T'KD!````B=J)\.CP^___BU0D$(@"N`````#K"(UV
+M`+C_____BQPDBW0D!(M\)`B#Q`S#C;8`````C;\`````@^P<B5PD$(ET)!2)
+M?"08B<8/MOD/MMJ)/"2Y`0```(G:Z,K[___'!"1`````N0(```")VHGPZ+7[
+M__^)VHGPZ.S^__^%P'5.@WPD(`!T-??'`0```'09B=FZ0````(GPZ)O\__^%
+MP'0MZS*0C70F`(G9NA@```")\.B"_/__A<!T%.L9B=FZ*````(GPZ&[\__^%
+MP'4'N/\```#K!;@`````BUPD$(MT)!2+?"08@\0<PXVT)@````"-O"<`````
+M55=64X/L'(G'BVPD-(G3B<Z$R0^$#P$```^VVHE<)!C'!"1D````N0(```")
+MVHGXZ/OZ__^+5"08B?CH,/[__X7`=1"Y`P```(M4)!B)^.BL^O__B?`/MLC'
+M!"0!````BU0D&(GXZ-7^__^^_____X3`#X6H`0``O@````"%[0^.FP$``+L`
+M````C47_B40D%(M$)#`#1"04B40D$(MT)!0YWG4[QP0D0````+D"````BU0D
+M&(GXZ'3Z__^+1"00B00DN5@```"+5"08B?CH_?W__X7`=$'I1`$``(UT)@#'
+M!"1$````N0(```"+5"08B?CH.?K__XM$)#`!V(D$)+E0````BU0D&(GXZ,#]
+M__^%P`^%_P```(/#`3GK#X3T````Z77___^XH(8!`(UV`.@;^O__#[;;#[;`
+MB00DN0,```")VHGXZ.3Y__^)VHGXZ!O]__^%P'0G#[:'T0<``(D$)+D#````
+MB=J)^.B_^?__OO_____II0```)"-="8`B=FZ8````(GXZ++Z__^%P'00O@``
+M``"%[7YBD(UT)@#K'P^VA]$'``")!"2Y`P```(G:B?CH=OG__[[_____ZU^^
+M`````,<$)$0```"Y`@```(G:B?CH5?G__XM$)#`!\(D$)+F`````B=J)^.C>
+M_/__A<!U!X/&`3GN=<D/MH?1!P``B00DN0,```")VHGXZ!OY___K"8G>C;0F
+M`````(GP@\0<6UY?7<.-M@````"#[!R)7"04B70D&(MT)"`/MDPD)(M$)"R)
+M1"0$BT0D*(D$)+H!````B?#HH?W__XG#QP0D5````+D"````N@$```")\.BW
+M^/__B=B+7"04BW0D&(/$',.)]HV\)P````"#[!R)7"04B70D&(MT)"`/MDPD
+M)(M$)"R)1"0$BT0D*(D$)+H`````B?#H0?W__XG#QP0D5````+D"````N@``
+M``")\.A7^/__B=B+7"04BW0D&(/$',.)]HV\)P````!55U93@^P,B<>+;"0D
+MB<L/MO+'!"1D````N0(```")\N@;^/__B?*)^.A2^___A<!U#KD#````B?*)
+M^.C0]___#[;+QP0D`0```(GRB?CH_?O__X3`=2Z%[7XQNP````"+1"0@#[8,
+M`\<$)`````")\HGXZ-C[__^$P'4)@\,!.>MT">O;N/_____K!;@`````@\0,
+M6UY?7<.-M"8`````@^P<B5PD%(ET)!B+="0@#[9,)"2+1"0LB40D!(M$)"B)
+M!"2Z`````(GPZ#'___^)P\<$)%0```"Y`@```+H`````B?#H5_?__XG8BUPD
+M%(MT)!B#Q!S#B?:-O"<`````@^P<BTPD(`^V5"0DBX&D!```A<!U`HG(B!4@
+M````QT0D#"````#'1"0((````,=$)`0.````B00DZ/S___^#Q!S#C;0F````
+M`(V\)P````"#[`R+5"00#[9,)!2`?"08`'00N`$```#3X&8)@G`)``#K#KC^
+M____T\!F(8)P"0``#[:"<`D``(E$)`2)%"3H_/___X/$#,.0C;0F`````%57
+M5E.#[!R+1"0TBT@8@\$!BU`0@^H!B50D$(M`'(E$)!@/MD$!/`%U&(M4)#3'
+M0BP`````QT0D%`````#IB`(``#P"=6"`>0(!=4*+5"0PBX*D!```A<!U`HG0
+MBX"@!```#[91`XB0<@D```^V40.(D/82``"+1"0TQT`L`````,=$)!0`````
+MZ3P"``"+5"0TQT(L_O___\=$)!0`````Z20"```\`P^%S0```(!Y`@$/A:L`
+M``"+5"0P#[9")HTT``^V60.)VHG8P?H?]_Z)TSG6?G6->00/MO(/MD$$B40D
+M"(ET)`2+1"0PB00DZ/S___^-0_R#^`-V&(U#](/X`W80C4/L@_@#=@B-0^2#
+M^`-W"(%$)#"$"0``#[8'B40D"(ET)`2+5"0PB10DZ/S___^+1"0TQT`L````
+M`,=$)!0`````Z7\!``"+5"0TQT(L_O___\=$)!0`````Z6<!``"+1"0TQT`L
+M_O___\=$)!0`````Z4\!``"+5"0PBZJD!```A>UU`HG5B<O'1"04`````+@"
+M````*<B)1"0,Z9(````/MC.->@$/MLCVP0%T/XM$)!2-'`:+5"0T.UH4#X?@
+M````B70D!(M$)!@#1"04B00DN@````")Z.B.^?__.?`/A;T```")7"04B?OK
+M18T<-XM$)`P!V#M$)!`/CZ(```")="0$B3PDN@````")Z.A(_/__A<`/A8<`
+M``"`.P!U!H![`0!T#,<$)!`G``#H_/___XU3`0^V0P&$P`^%7____XMT)!0/
+MM@.$P'1A#[;8QP0D5````+D"````N@````")Z.@T]/__BU0D-(M"%"M$)!0Y
+MPW8"B<.)7"0$BT0D&`'PB00DN0````"Z`````(GHZ-7X__^%P'@(`?")1"04
+MZPN+1"0TQT`L_____\<$)%0```"Y`@```+H`````B>CHUO/__XM4)#2+0B"%
+MP'0&BU0D%(D0BT0D-(D$)/]0*(/$'%M>7UW#C78`@^P<BU0D((N"I`0``(7`
+M=0*)T(N0H`0```^V@G,)``"$P'0-@^@!B()S"0``A,!U)\8%(P````#'1"0,
+M(````,=$)`@@````QT0D!`X```")%"3H_/___X/$',.-="8`@^P<BU0D((N"
+MI`0``(7`=0*)T(N`H`0``("X<@D```!U+H"`<PD```'&!2,````!QT0D#"``
+M``#'1"0((````,=$)`0.````B00DZ/S___^#Q!S#C;8`````C;\`````@^P<
+MB5PD%(ET)!B+="0@#[9,)"2+1"0LB40D!(M$)"B)!"2Z`````(GPZ('Z__^)
+MP\<$)%0```"Y`@```+H`````B?#HI_+__XG8BUPD%(MT)!B#Q!S#D)"0D)"0
+MD)"0BT0D!(M`!"T``@$``T0D"(L`HP````##D(VT)@````"+1"0$BT`$+0`"
+M`0`#1"0(BU0D#(D0PXGVC;PG`````%.#[`R+7"04BU,$@>H``@$`QX*```$`
+M`````(N"!`$!`*,`````@,P!B8($`0$`QT0D"`@```#'1"0$#,(``(D<).C\
+M____QT0D"+@+``#'1"0$",(``(D<).C\____QT0D"`$``#S'1"0$`,(``(D<
+M).C\____QT0D"`@```#'1"0$#,,``(D<).C\____QT0D"+@+``#'1"0$",,`
+M`(D<).C\____QT0D"`$``#S'1"0$`,,``(D<).C\____QT0D"("`@(#'1"0$
+M.,(``(D<).C\____QT0D"`@8*#C'1"0$(,(``(D<).C\____QT0D"("`@(#'
+M1"0$/,(``(D<).C\____QT0D"`D9*3G'1"0$),(``(D<).C\____QT0D"("`
+M@(#'1"0$0,(``(D<).C\____QT0D"`H:*CK'1"0$*,(``(D<).C\____QT0D
+M"("`@(#'1"0$1,(``(D<).C\____QT0D"`L;*SO'1"0$+,(``(D<).C\____
+MQT0D"("`@(#'1"0$2,(``(D<).C\____QT0D"$A)2DO'1"0$,,(``(D<).C\
+M____QT0D"("`@(#'1"0$.,,``(D<).C\____QT0D"`P<+#S'1"0$(,,``(D<
+M).C\____QT0D"("`@(#'1"0$/,,``(D<).C\____QT0D"`T=+3W'1"0$),,`
+M`(D<).C\____QT0D"("`@(#'1"0$0,,``(D<).C\____QT0D"`X>+C['1"0$
+M*,,``(D<).C\____QT0D"("`@(#'1"0$1,,``(D<).C\____QT0D"`\?+S_'
+M1"0$+,,``(D<).C\____QT0D"("`@(#'1"0$2,,``(D<).C\____QT0D"$Q-
+M3D_'1"0$,,,``(D<).C\____QT,X@("`@,=#/("`@(#'0T"`@("`QT-$@("`
+M@,=#2("`@("!PX0)``#'0SB`@("`QT,\@("`@,=#0("`@(#'0T2`@("`QT-(
+M@("`@(/$#%O#BT0D!(M0!('J``(!`(N";``!`*,`````B8)L``$`PY"+1"0$
+MBU`$@>H``@$`BX)H``$`HP`````+1"0(B8)H``$`PXVV`````(V\)P````"#
+M["")7"00B70D%(E\)!B);"0<BW0D)`^V5"0H#[9\)"PYMJ`$```/A0@!``")
+MT,#H`KT`````#[;`B40D#(G0]]"#X`.-',4`````N`<```")V=/@]]"+3"0,
+MBU2.."'"B52..(GXA,!T$[@!````B=G3X`G0BU0D#(E$ECB)Z0^VV<'C"(M&
+M.(E$)`B-@SC"``")1"0$BX:@!```B00DZ/S___^+1CR)1"0(C8,\P@``B40D
+M!(N&H`0``(D$).C\____BT9`B40D"(V#0,(``(E$)`2+AJ`$``")!"3H_/__
+M_XM&1(E$)`B-@T3"``")1"0$BX:@!```B00DZ/S___^+1DB)1"0(@<-(P@``
+MB5PD!(N&H`0``(D$).C\____BUPD$(MT)!2+?"08BVPD'(/$(,.)T,#H`H/H
+M!;T!````Z?#^__^0D)"0D)"0D)"#[!")'"2)="0$B7PD"(EL)`R+3"04BW0D
+M&(M4)!R+7"0@B[G4!```#[=&$+TDVP``9CV#`'<1#[?`#[:$`1@$``!IZ-P`
+M``"-BB`$``#&@B`$```G9H%^).$!=2,/ME8FC4+_/`%W"0^V5B>#X@_K)(U"
+M[[H/````/`%V&(UV`(T$+[H`````@W@P`'0'#[9018/B#P^V00&#X/`)T(A!
+M`;@!````9H%^).$!=1(/MD8F@^@!/`$/E\`/ML"-=@")PL'B!P^V00&#X'\)
+MT(A!`0^V0P:(00(/M@.(00,/MD,%B$$'#[9#!XA!#P^V0P*(000/MD,#B$$%
+M#[9#!(A!!@^V0P&(00P/MD,*B$$(#[9#"XA!"0^V0PR(00H/MD,(B$$+#[9#
+M"8A!#8L<)(MT)`2+?"0(BVPD#(/$$,.)]E.+5"0(BUPD$,9"%`*+2CB+1"0,
+MB$$"BT(XQD`'`(M".(A8#%O#C78`C;PG`````(M4)`2+3"0(#[9"*8A!`@^V
+M0BB(00,/MD(GB$$$#[9")HA!"L.-="8`C;PG`````(M4)`2+3"0(#[9"+8A!
+M`@^V0BR(00,/MD(KB$$$#[9"*HA!"@^V0BF(00L/MD(HB$$,PXVV`````(V\
+M)P````"+3"0,A<E^';H`````C78`B<@IT(/X`@^=P`^VP(U4`@$YT7_K\\.)
+M]HV\)P````"#[!B)7"0(B70D#(E\)!");"04BUPD'(M\)"0/MD,D/"IT'SPJ
+M=PL\*`^%H0```)#K$#R(="(\B@^%D@```(GVZQ8/MG,L#[9K*XE\)`2)'"3H
+M_/___^L4#[9S,0^V:S")?"0$B1PDZ/S____&1P5`BT-DJ0```0!U5JD```0`
+M="6)\(A'`8GHB$<)#[9#)#PH=`0\B'4)QD<&)>LSC78`QD<&->LJB?"(1P$/
+MMD,F@^`/"$<%#[9#)#PH=`0\B'4&QD<&R.L)QD<&RI"-="8`BUPD"(MT)`R+
+M?"00BVPD%(/$&,.-M@````"-OP````"#[`R+3"00#[9!)@I!)PI!*`I!*0^V
+MP`^V42R#X@$)T'0>QT0D""0```#'1"0$!0```(D,).C\____ZQ.-="8`BT0D
+M%,9`!NS'06P`````@\0,PXVV`````(V\)P````"#[!B)7"0(B70D#(E\)!")
+M;"04BUPD'(MT)"`/MD,D/"]T#3R/=6#K'8VT)@`````/MGLL#[9K*XET)`2)
+M'"3H_/___^L4#[9[,0^V:S")="0$B1PDZ/S____&1@5`]D-F!'00B?B(1@&)
+MZ(A&"<9&!D+K$XGXB$8!#[9#)H/@#PA&!<9&!D"+7"0(BW0D#(M\)!"+;"04
+M@\08PY"-="8`4X/L#(M,)!B+5"0<QD(%0`^V020\-70(/)%U*NLBB?:+7"04
+M#[=#-(/@`8/X`1G`@^#]@^@6B$(&ZR60C70F`,9"!NKK&L=$)`@D````QT0D
+M!`4```")#"3H_/___^L*]D$E`G0$QD$4`(/$#%N)]L/K#9"0D)"0D)"0D)"0
+MD)"#[`R+1"00]D`H\'08QT0D""0```#'1"0$!0```(D$).C\____@\0,PXVT
+M)@````!3@^P0BUPD'(M,)"0/MD0D(+H`````Q@0*`(/"`8/Z#77T#[93)(#Z
+M-0^$KP```(#Z-7<T@/HH=&R`^BB-="8`=Q.`^AL/A84#``"0C70F`.FJ````
+M@/HJ=$N`^B^-=@`/A6H#``#K78#ZCY"-="8`=%.`^H]W$8#ZB'0I@/J*D`^%
+M2@,``.L=@/J1D(UT)@!T3(#ZX0^%-0,``)"-="8`Z9(```")3"0(#[;`B40D
+M!(D<).C\____QT0D#`$```#I$P,``(E,)`2)'"3H_/___\=$)`P!````Z?H"
+M``")3"0(B5PD!(M$)!B)!"3H_/___\=$)`P!````Z=D"``#V0R@!="'&009P
+MQD$$`,9!`P#&00(`QD$%0,=$)`P!````Z;("``#&00;@QT0D#`$```#IH0(`
+M`(![)0$/A8\"``"`>R8<#X>%`@``#[9#)I#_)(7$````QD$'!,=$)`P!````
+MZ7`"``#&00<`QT0D#`$```#I7P(``,9!!NS'1"0,`0```.E.`@``QD$&[\8!
+M`P^V0R>#R$"(00''1"0,`0```.DP`@``QD$&[\8!!\=$)`P!````Z1P"``#&
+M009`QD$!`<9!!4#'1"0,`0```.D#`@``QD$&[\8!`P^V0R>#R`B(00''1"0,
+M`0```.GE`0``QD$&[\8!`L=$)`P!````Z=$!``#&00;OQ@&"QT0D#`$```#I
+MO0$``,9!!N_&`0;'1"0,`0```.FI`0``QD$&[\8!AL=$)`P!````Z94!``#&
+M00;C#[9#)XA!`<=$)`P!````Z7T!``#&00:PQ@'8QD$#3\9!!,+'1"0,`0``
+M`.EA`0``QD$&L,8!V<9!`T_&003"QT0D#`$```#I10$``,9!!K#&`=K&00-/
+MQD$$PL=$)`P!````Z2D!``"+1"08]D`T`701QD$&ZL=$)`P!````Z0X!``#&
+M00;GQT0D#`$```#I_0```,9!!N_&`:K'1"0,`0```.GI````QD$&[\8!5<=$
+M)`P!````Z=4```#&00;D#[9#*(@!#[9#*8A!"`^V0R>(007'1"0,`0```.FP
+M````#[9#)XA!!@^V0RB(`0^V0RF(00(/MD,JB$$##[9#*XA!!`^V0RV(00H/
+MMD,LB$$!QT0D#`$```#K=L9!!N@/MD,HB`$/MD,IB$$(#[9#)XA!!0^V0RJ(
+M00(/MD,KB$$##[9#+(A!!`^V0RV(00''1"0,`0```.LXQT0D#`$```#V0R@!
+M="K&009PQD$$`,9!`P#&00(`QD$%0,=$)`P!````ZPR-="8`QT0D#`````"+
+M1"0,@\006\/K#9"0D)"0D)"0D)"0D)"#[#R)7"0LB70D,(E\)#2);"0XBVPD
+M1(MU-(U\)`S\N0@```"X`````/.K]H:G````!'04BX[(````BY[,````@\'_
+M@]/_ZPV+1GB#Z`&)P;L`````@'TD)75GB<@/K-@8B$0D#(G(#ZS8$(A$)`V)
+MR`^LV`B(1"0.B$PD#_:&U0```!!U%,9$)!("QD0D$P"Y"````.FI````C50D
+M$,=$)`@$````C8;J````B40D!(D4).C\____N0@```#I@0```(G8P>@8B$0D
+M#(G8P>@0B$0D#8G8P>@(B$0D#HA<)`^)R`^LV!B(1"00B<@/K-@0B$0D$8G(
+M#ZS8"(A$)!*(3"03]H;5````$'44QD0D%@+&1"07`+D@````ZR:-=@"-5"04
+MQT0D"`0```"-ANH```")1"0$B10DZ/S___^Y(````(M5-(U$)`R)3"0(B40D
+M!(D4).C\____BUPD+(MT)#"+?"0TBVPD.(/$/,.)]H/L#(M4)!0/MD(D/#4/
+MA(\````\-7<K/"AT33PHC78`=Q`\$G1"/!L/A9(```")]NMP/"IT,CPO#X6"
+M````B?;K)CR/="(\CW<./(B-="8`=!8\BG5JZQ`\L(VV`````'1U/.%U6NL:
+MBT0D$/9`-`%T98%*9```!`"X`0```(GVZUJ`>B4!=4B`>B8<=T(/ODHFN`$`
+M``#3X*G^/\8==3?K+HM$)!#V0#0!="N!2F0```0`N`$```#K(HVV`````(D4
+M).C\____N`````#K#9"X`````.L%N`$```"#Q`R0PY"0D)"0D)"0D)"0D)"0
+MD(/L"(D<)(ET)`2)TXMT)!2+4`0/MD0D$,'@!`^VR<'A"`G!@'PD#`!T`X/)
+M!(/^_W00B?`E__\#`(F"!,;__X/)`HD+BQPDBW0D!(/$",.0BT`$+0`"`0"#
+MR@&)D`#(``##C;0F`````(V\)P````!75E.#[!")UXM`!(72=$J-L`#&__^+
+M@`#&__^C`````+L`````J`%U$NLGD(UT)@"+!J,`````J`%T%\<$)`H```#H
+M_/___X/#`3G[=>*)]NL'N`````#K!;C_____@\006UY?PXUT)@"-O"<`````
+M5E.#["2+7"0PQT0D(`````"+<P3&@W0)````#[8-"````(U4)"#'1"0(````
+M`,=$)`0"````QP0D`0```(G8Z-S^__^+5"0@B=CH(?___[J@A@$`B=CH-?__
+M_X7`=4>+A@S&__^C`````(E$)"`]'V,``'4QQX-D"0``'V,``,>#:`D`````
+M!`#'@VP)``````$`QX-X"0```````&:X``#I.@(``,=$)"``````BW,$QH-T
+M"0```0^V#1@```"-5"0@QT0D"/_____'1"0$`@```,<$)`$```")V.@__O__
+MBU0D((G8Z(3^__^Z$"<``(G8Z)C^__^%P'5GBX8,QO__HP````")1"0@/1]#
+M``!T+CT?1```=4K'@V0)```?1```QX-H"0`````'`,>#;`D``````0#IA`$`
+M`(UT)@#'@V0)```?0P``QX-H"0`````$`,>#;`D``````0#I70$``,=$)"``
+M````BW,$QH-T"0````^V#2@```"-5"0@QT0D"`````#'1"0$`@```,<$)`$`
+M``")V.B"_?__BU0D((G8Z,?]__^Z$"<``(G8Z-O]__^%P'5'BX8,QO__HP``
+M``")1"0@/;]#``!U,<>#9`D``+]#``#'@V@)`````"``QX-L"0```!```,>#
+M>`D``"````!FN```Z>````#'1"0@`````(MS!,:#=`D````/M@TX````C50D
+M(,=$)`@`````QT0D!`(```#'!"0!````B=CHY?S__XM4)"")V.@J_?__NA`G
+M``")V.@^_?__A<!U7XN&#,;__Z,`````B40D(#WO$0``=`D][Q(``'5"ZR#'
+M@V0)``#O$0``QX-H"0`````$`,>#;`D``````0#K/,>#9`D``.\2``#'@V@)
+M``````@`QX-L"0`````!`.L<N/_____K)(UT)@#'@W@)```0````N`````#K
+M#\>#>`D``#````"X`````(/$)%M>PXUV`(V\)P````"#[#R)7"0LB70D,(E\
+M)#2);"0XB<:)UXE,)!B+:`0/MD0D0#P$=@6X!`````^VV(N&>`D```^V2`2-
+M5"0HB7PD"(E<)`3'!"0!````B?#HW?O__XM4)"B)\.@B_/__NA`G``")\.@V
+M_/__NO____^%P'4:BX4,QO__HP````")1"0HBU0D&(D"N@````")T(M<)"R+
+M="0PBWPD-(ML)#B#Q#S#C;8`````C;PG`````%.#["B+7"0PBX-X"0``#[9(
+M"XU4)"2+1"0TB40D",=$)`0!````QP0D`0```(G8Z$S[__^+5"0DB=CHD?O_
+M_[H0)P``B=CHI?O__[K_____A<!U&HM#!"WT.0``BP"C`````(M4)#B(`KH`
+M````B="#Q"A;PXUT)@"-O"<`````55=64X/L+(G#B%0D&XG-@WPD0``/A),`
+M``"^`````)"+>P2+@W@)```/MD@"QT0D"/_____'1"0$`0```,<$)`$```"-
+M5"0HB=CHL?K__XM4)"B)V.CV^O__NA`G``")V.@*^___A<!U*HN7#,;__XD5
+M``````^V1"0;(=")Z3C(=0VX`````.LHC;8`````B50D*,<$)`H```#H_/__
+M_X/&`3MT)$`/A7/___^X_____X/$+%M>7UW#C;8`````4X/L*(G#BX!X"0``
+M#[8(C50D),=$)`C_____QT0D!`````#'!"0`````B=CH#_K__XM4)"2)V.A4
+M^O__NA`G``")V.AH^O__A<!U),<$)."3!`"Y`@```+H#````B=CHW/[__[H`
+M````A<!T"(UV`+K_____B="#Q"A;PXUT)@"#["R)7"0DB70D*(M<)#"+="0T
+MQD0D(_^-1"0CB40D"(ET)`2)'"3H_/___X7`=7*`?"0C`'1YB=CH0O___X/X
+M_W1?BX-X"0``#[9("HU4)!R)="0(QT0D!`````#'!"0`````B=CH5?G__XM4
+M)!R)V.B:^?__NA`G``")V.BN^?__A<!U',<$)."3!`"Y`````+H#````B=CH
+M(O[__X7`=`ZX_____^L,C;0F`````+@`````BUPD)(MT)"B#Q"S#ZPV0D)"0
+MD)"0D)"0D)"055=64X/L/(ML)%`/MD0D8(.]>`D````/A!H#``"+?"18A,`/
+MA&L!``"#?"14_W44#[>%9`D``&:)![@!````Z1P#``"#?"14_G45BX5H"0``
+MB0>X`0```.D#`P``C78`@WPD5/UU&8N%;`D``(D'N`$```#IYP(``(VT)@``
+M``"+1"1<`T0D5(E$)!@[A6@)```/AY\"``"+7"14@^/\BU0D5(/B`XE4)"!T
+M;HUT)#C'!"0$````B?&)VHGHZ/[[__^#PP3'1"0<!````#E<)!AS$(M$)"`K
+M1"14`T0D&(E$)!R+1"0@.40D''8MC0P&B?Z+1"0<C50$.(VV``````^V`8@&
+M@\8!@\$!.=%U\8M$)!PK1"0@C3P'BW0D&(/F_#GS<R3'!"0$````C4PD.(G:
+MB>CHA_O__XM$)#B)!X/'!(/#!#G>=]PY7"08#X;M`0``C70D.,<$)`0```")
+M\8G:B>CH5_O__XM,)!@IV0^$RP$``+H`````C;8`````#[8$%H@$.H/"`3G*
+M#X2N`0``Z^R#?"14_W4I@#\/B?9U$<:%=0D```&X`0```.FM`0``QH5U"0``
+M`+@!````Z9P!``"+5"1<B50D*(G0`T0D5#N%:`D```^'60$``("]=0D````/
+MA$P!``"+1"14N@````#WM6P)``"%T@^%G````("]=`D```!T&(M$)%2)1"0$
+MB2PDZ/S___^%P`^%%`$``(GHZ(;\__^#^/\/A`0!``"+A7@)```/MD@&C50D
+M.(M$)%2)1"0(QT0D!`````#'!"0`````B>CHD?;__XM4)#B)Z.C6]O__NA`G
+M``")Z.CJ]O__A<`/A;D```#'!"3@DP0`N0````"Z`P```(GHZ%K[__^%P`^%
+MF0```(-\)%P`#X27````QT0D)`````"+5"18BT0D)(LT`HG'`WPD5(M=!('K
+M``(!`(GHZ-[[__^)LPC(``"+A7@)```/MD@%B7PD",=$)`0$````QP0D````
+M`(U4)#B)Z.CP]?__BU0D.(GHZ#7V__^Z$"<``(GHZ$GV__^%P'4<QP0DB!,`
+M`+D`````N@$```")Z.B]^O__A<!T$+@`````ZR*)]K@!````ZQF#1"0D!(M4
+M)"0Y5"0H=NKI5O___Y"-="8`@\0\6UY?7<.0D)"0D)"0D+@`````PXUV`(V\
+M)P````"+5"0$BTPD"+@`````.15\`0``?C2-%%+!X@,/MX(<`0``9HD!#[>"
+M'@$``&:)00(/MH(D`0``B$$(#[:")0$``(A!";@!````\\.0C70F`+@(%0``
+MPXUV`(V\)P````"XG````,.-=@"-O"<`````N`0```##C78`C;PG`````//#
+MC;0F`````(V\)P````"+1"0$QH"6`````(M$)`C&0'``PXVV`````(V_````
+M`(M4)`2%TG01BT)HA<!T"@^V@)````"(0@'SPY"-="8`5E.#[`2+="00A?9T
+M:KL`````#[:$,Q@$```\_W0W#[;`:<#<````B<(#EM0$``!T)(M")"4`__\`
+M/0``_P!U%?9")P1T#XM"((7`=`B)!"3H_/___X/#`8'[@````'6RBX:@!```
+M.?!U#06$"0``B00DZ/S___^#Q`1;7L.-=@"X`````,.-=@"-O"<`````N```
+M``##C78`C;PG`````+C_____PXUV`(V\)P````"X_____\.-=@"-O"<`````
+MN/_____#C78`C;PG`````+C_____PXUV`(V\)P````"+1"0,QT`$`````,<`
+M`````+@`````PXGVC;PG`````(M,)`2+062%P'1#QT`@`````(!(*`3'060`
+M````QT%H`````(M1"(/Z/W\4BT%LQX20&`(```````##D(UT)@"+06S'A)`8
+M`0```````//#BTPD!(M!9(7`=$/'0"``````@&`H^\=!9`````#'06@`````
+MBU$(@_H_?Q2+06S'A)`8`@```````,.0C70F`(M!;,>$D!@!````````\\.#
+M[`S'!"2`````Z/S___^X`````(/$#,.0C;0F`````%=64X/L0(M$)%#&1"08
+M;<9$)!G_QD0D&B/&1"0;%,9$)!PZQD0D'>_&1"0>%L9$)!^2B["D!```A?9U
+M`HG&C40D((G"Q@``@\`!B=.-3"1`.<AU\,9$)"0!QT0D#"````")5"0(QT0D
+M!`X```")-"3H_/___X7`=4S'!"2`&@8`Z/S____'1"0,(````(E<)`C'1"0$
+M#P```(DT).C\____@_@@=1^-="0PC7PD&+D(````_/.F#Y?"#Y+`N0$````X
+MPG01QP0DA0```.C\____N0`````/ML&#Q$!;7E_#5E.#[&2+="1PBYZ@!```
+M@<.$"0``BP:%P'06+0```@")!HE$)`2+1A")!"3H_/___XM&"(7`=`^)1"0$
+MBT80B00DZ/S___^+1@R%P'0/B40D!(M&$(D$).C\____C40D5HE$)#2-1"18
+MB40D,(U$)%*)1"0LC40D5(E$)"B-1"1<B40D)(U$)%Z)1"0@C40D7XE$)!R-
+M1"1:B40D&(U$)&")1"04C40D4(E$)!"-1"1AB40D#(U$)&*)1"0(C40D8XE$
+M)`0/MT8DB00DZ/S___^+AM0$``"%P'0JB40D!(V&O`0``(D$).C\____BX/4
+M!```B40D!(V#O`0``(D$).C\____BX;P!```A<!T*HE$)`2-AM@$``")!"3H
+M_/___XN#\`0``(E$)`2-@]@$``")!"3H_/___XN&>`8``(7`="J)1"0$C89@
+M!@``B00DZ/S___^+@W@&``")1"0$C8-@!@``B00DZ/S___^+A@P%``"%P'0J
+MB40D!(V&]`0``(D$).C\____BX,,!0``B40D!(V#]`0``(D$).C\____BX:X
+M!0``A<!T*HE$)`2-AJ`%``")!"3H_/___XN#N`4``(E$)`2-@Z`%``")!"3H
+M_/___XN&:`4``(7`="J)1"0$C890!0``B00DZ/S___^+@V@%``")1"0$C8-0
+M!0``B00DZ/S___^+AH0%``"%P'0JB40D!(V&;`4``(D$).C\____BX.$!0``
+MB40D!(V#;`4``(D$).C\____BX;4!0``A<!T*HE$)`2-AKP%``")!"3H_/__
+M_XN#U`4``(E$)`2-@[P%``")!"3H_/___XN&\`4``(7`="J)1"0$C8;8!0``
+MB00DZ/S___^+@_`%``")1"0$C8/8!0``B00DZ/S___^+A@P&``"%P'0JB40D
+M!(V&]`4``(D$).C\____BX,,!@``B40D!(V#]`4``(D$).C\____BX8H!@``
+MA<!T*HE$)`2-AA`&``")!"3H_/___XN#*`8``(E$)`2-@Q`&``")!"3H_/__
+M_XN&4`8``(7`="J)1"0$C88X!@``B00DZ/S___^+@U`&``")1"0$C8,X!@``
+MB00DZ/S___^+AJ`&``"%P'0JB40D!(V&B`8``(D$).C\____BX.@!@``B40D
+M!(V#B`8``(D$).C\____BX[(!@``A<ET4HN&S`8``(N6T`8``(E$)`B)5"0,
+MB4PD!(V&L`8``(D$).C\____BX/,!@``BY/0!@``B40D"(E4)`R+@\@&``")
+M1"0$C8.P!@``B00DZ/S___^+CNP&``"%R712BX;P!@``BY;T!@``B40D"(E4
+M)`R)3"0$C8;4!@``B00DZ/S___^+@_`&``"+D_0&``")1"0(B50D#(N#[`8`
+M`(E$)`2-@]0&``")!"3H_/___XN.$`<``(7)=%*+AA0'``"+EA@'``")1"0(
+MB50D#(E,)`2-AO@&``")!"3H_/___XN#%`<``(N3&`<``(E$)`B)5"0,BX,0
+M!P``B40D!(V#^`8``(D$).C\____BXY8!P``A<ET4HN&7`<``(N68`<``(E$
+M)`B)5"0,B4PD!(V&0`<``(D$).C\____BX-<!P``BY-@!P``B40D"(E4)`R+
+M@U@'``")1"0$C8-`!P``B00DZ/S___^+CC0'``"%R712BX8X!P``BY8\!P``
+MB40D"(E4)`R)3"0$C88<!P``B00DZ/S___^+@S@'``"+DSP'``")1"0(B50D
+M#(N#-`<``(E$)`2-@QP'``")!"3H_/___XN.?`<``(7)=%*+AH`'``"+EH0'
+M``")1"0(B50D#(E,)`2-AF0'``")!"3H_/___XN#@`<``(N3A`<``(E$)`B)
+M5"0,BX-\!P``B40D!(V#9`<``(D$).C\____BXZ@!P``A<ET4HN&I`<``(N6
+MJ`<``(E$)`B)5"0,B4PD!(V&B`<``(D$).C\____BX.D!P``BY.H!P``B40D
+M"(E4)`R+@Z`'``")1"0$C8.(!P``B00DZ/S___^+CL0'``"%R712BX;(!P``
+MBY;,!P``B40D"(E4)`R)3"0$C8:L!P``B00DZ/S___^+@\@'``"+D\P'``")
+M1"0(B50D#(N#Q`<``(E$)`2-@ZP'``")!"3H_/___X/$9%M>PY"-="8`@^P<
+MB5PD%(ET)!B+7"0@B1PDZ/S___^)'"3H_/___XVSA`D``(DT).C\____B1PD
+MZ/S____'!"30!P``Z/S___^)'"3H_/___\=$)`0!````B1PDZ/S____'1"0$
+M`0```(DT).C\____BUPD%(MT)!B#Q!S#C70F`(V\)P````"#[`R+5"00BT0D
+M%(A",@^VP(E$)`2)%"3H_/___[@!````@\0,PXUV`(V\)P````!3@^P(BUPD
+M$(D<).C\____BX.@!```!80)``")!"3H_/___X/$"%O#D(VT)@````!3@^P(
+MBUPD$(D<).C\____BX.@!```!80)``")!"3H_/___X/$"%O#D(VT)@````"#
+M[`R+1"00B00DZ/S___^Z`0```(,]``````!U`P^VT(G0@\0,PXUV`(V\)P``
+M``"#["R)7"0<B70D((E\)"2);"0HB<.)UXG-BW!DBT!LB40D%(7V#X0M`0``
+M@+N6``````^%(`$``(D$).C\____B40D&(7`#X0,`0``QD`DX<9`)0&)^H32
+M=`V)Z#P!&<#WT(/`!^L,B>J`^@$9P/?0@\`-BU0D&(A")@^W1AQFB4(0B5H8
+MQT(@`````,="-`````#'0FRPT0``B50D!(M$)!2)!"3H_/___\:#E@````%F
+MQX.4````]`&%VW19BT-DA<!T7&:!NY0```"6`'47B40D",=$)`0A````BT`L
+MB00DZ/S___]F@ZN4`````<<$)-`'``#H_/___XM4)!2)%"3H_/___XM#9(7`
+M=`F`NY8`````=:YF@[N4`````'0<BT0D&(!X%`!U$HM#9`^W0#9FB4->NP``
+M``#K!;O_____BU0D&(E4)`2+1"04B00DZ/S____K!;O_____B=B+7"0<BW0D
+M((M\)"2+;"0H@\0LPXVV`````(V\)P````"#["R)7"0<B70D((E\)"2);"0H
+MBW0D,`^V7"0TBWYDBVYLA?\/A"@!``"`OI8`````#X4;`0``B2PDZ/S___^)
+M1"08A<`/A`<!``#V!@(/A><```"`^Q1W"P^VPXT$0,'@`NL6N(G____VXV;!
+MZ`C`Z`0/ML`%\````(M4)!C&0B3AQD(E`<9")AR(0B</MT<<9HE"$(ER&,="
+M(`````#'0C0`````QT)LL-$``(E4)`2)+"3H_/___\:&E@````%FQX:4````
+MQ`F%]G15BT9DA<!T6&:!OI0```"6`'47B40D",=$)`0A````BT`LB00DZ/S_
+M__]F@ZZ4`````<<$)-`'``#H_/___XDL).C\____BT9DA<!T"8"^E@````!U
+MLF:#OI0`````=`^[`````(M$)!B`>!0`=`6[_____XM4)!B)5"0$B2PDZ/S_
+M___K!;O_____B=B+7"0<BW0D((M\)"2+;"0H@\0LPXUV`(/L'(E<)!")="04
+MB7PD&(M4)""+7"0DBT(LBSB+<T@/MD,4/`9T/SP&=PJ$P'0A/`)U#^LK/"%T
+M+3R`D(UT)@!T)+@`````ZVV-M"8`````BT(@QT`$`````,9&9@'K"L9&9A#K
+M!,9&9@V#>TP`="^!>R``$```=Q>-0TR)1"0$B3PDZ/S____K%8VV`````(U#
+M3(E$)`2)/"3H_/___XE<)`2)/"3H_/___XDT)/]6<+@!````BUPD$(MT)!2+
+M?"08@\0<PXUV`(V\)P````!55U93@^P<B<.)U8MT)#"+?"0T#[=$)#AFB40D
+M$@^V5"0\BT5LB40D%(U#/(E$)!B`^@$9P(/@"(/`"HE#9(M%9/9`-`%T>8#Z
+M`1G`@^`"@^AXB$,DQD,E`(GXP>@8B$,FB?C!Z!"(0R>)^,'H"(A#*(GZB%,I
+MB?`/K/@8B$,JB?`/K/@0B$,KB?`/K/@(B$,LB?"(0RW&0RX`QD,O``^W1"02
+M9L'H"(A#,`^V1"02B$,QQD,R`,9#,P#K4HUT)@"`^@$9P(/@`H/`*(A#),9#
+M)0")\`^L^!B(0R:)\`^L^!"(0R>)\`^L^`B(0RB)\(A#*<9#*@`/MT0D$F;!
+MZ`B(0RL/MD0D$HA#+,9#+0")'"3H_/___XM%9`^W0!QFB4,0QD,4@(EK&(M#
+M3(M`"(E#-`^W1"02#Z]%6(E#(,9#'""+160%EP```(E#.,=#;+#1``#'1"0$
+M`````(M$)!B)!"3H_/___XM#((E$)`R+0TR+4!"+0`R)1"0$B50D"(M$)!B)
+M!"3H_/___\:%E@````&)7"0$BT0D%(D$).C\____A>UT;XM%9(7`=&B`O98`
+M````=&9F@;V4````E@!U%XE$)`C'1"0$(0```(M`+(D$).C\____9H.ME```
+M``''!"30!P``Z/S___^+1"04B00DZ/S___^+162%P'06@+V6`````'04ZZRX
+M`````(![%`!T$[C_____ZPQF@[V4`````'3OZ^*#Q!Q;7E]=PX/L/(E<)"R)
+M="0PB7PD-(EL)#B+7"1$BW0D2`^W;"1,#[9$)%2(1"03BU0D0(MZ9(7_#X2L
+M`@``@+J6``````^%GP(``(M'+(E$)""+4FR)5"04BT0D0&;'@)0````0)XD4
+M).C\____B40D'(7`#X1P`@``9H/]!'86#[?%B40D!,<$)*$```#H_/___^L5
+MD(M4)!2)%"3H_/___XE$)!B%P'4>BT0D'(E$)`2+5"04B10DZ/S___^[____
+M_^DG`@``BU0D&(M$)!R)4$S&0%0!BU0D%(N"H`0``,9`)P&+1"1`B40D"(N"
+MH`0``(E$)`3'!"0%````Z/S___^`3R@"BU0D0(M"9(E$)`C'1"0$(0```(M$
+M)"")!"3H_/___XM4)$"#>F0`#X0B`0``@+J6``````^%%0$```^WU8G0P>`)
+MB40D*(M$)$"+2%C&1"0G`('Y`!```'4<B=B#X`>(1"0G#ZSS`\'N`P^VP(U$
+M`@>)Q<'M`X!\)!,`=6R!^0`0``!U/<=$)`P!````#[?%B40D"(D<)(ET)`2+
+M5"1`BT0D'.@G_/__A<!T%L<$)(`%``#H_/___[O_____Z9(````/MD0D)\'@
+M"8M4)!@#0@B+5"0HB50D"(M4)%")5"0$B00DZ/S___\/MD0D$XE$)`P/M\6)
+M1"0(B1PDB70D!(M4)$"+1"0<Z,+[__^%P'4^NP````"`?"03`'0W#[9$)"?!
+MX`F+5"08`T((BU0D*(E4)`B)1"0$BT0D4(D$).C\____NP````#K"8UT)@"[
+M_____XM4)!R#>DP`=#^!>B``$```=Q>)T(/`3(E$)`2+1"04B00DZ/S____K
+M%XM$)!R#P$R)1"0$BU0D%(D4).C\____BT0D',9`5`"+5"0<B50D!(M$)!2)
+M!"3H_/___XM4)!2+@J`$``#&0"<`BT0D0(E$)`B+@J`$``")1"0$QP0D!@``
+M`.C\____@&<H_>L%N_____^)V(M<)"R+="0PBWPD-(ML)#B#Q#S#D(/L'(E<
+M)!")="04B7PD&(MT)""+7F2%VW46BT0D*(D$)/]4)"3I!@$``(VV`````(-^
+M=`!U#(-^<`"-M@````!T$XM$)"B)!"3_5"0DC78`Z=L```"`NY0`````#X6^
+M````@'LF_P^%M````(M#,(7`=!2`>#$`#X6C````]D`N`@^$F0```(M#+/9`
+M!Q")]@^%B@```(LX@'M'`'04B5PD",=$)`0&````B00DZ/S___^+1"0DB49T
+MBT0D*(E&>`^V4R2)T(/@!H/X!G1B@_@$=5WVP@%T6(M#,(7`C78`="3V0"X"
+M=$AFQT`N`0"+0S#&0"8!BT,PB40D!(D\).C\____ZRK&0R8#QD,G!(E<)`2)
+M/"3H_/___^L4C70F`(M$)"B)!"3_5"0DD(UT)@"+7"00BW0D%(M\)!B#Q!S#
+M5E.#[!2+7"0@C;.$"0``B1PDZ/S___^)0Q2)1A2)FZ`$``")GJ`$``"+@ZP$
+M``")AJP$``#&@W()```!QH9R"0```8D<).C\____B1PDZ/S___^)-"3H_/__
+M_\=$)`0`````B1PDZ/S___^)'"3H_/___X3`=&Z)-"3H_/___X3`=&*)'"3H
+M_/___\<$)-`'``#H_/___XD<).C\____QX/0````Z`,``,>#V`````````")
+MF]P```"-@]````")1"0$BT,4B00DZ/S____'1"0$`````(D<).C\____N`$`
+M``#K!;@`````@\046U[#4X/L"(M<)!")'"3H_/___X'#A`D``(D<).C\____
+MN`$```"#Q`A;PY"-M"8`````55=64X/L/(,]Q``````/A8$!``#'!<0````!
+M````QT0D.`````#IO`(``)"-="8`#[>&'@$``,'@$`^WEAP!```)T#E$)"@/
+MA1,!``"_`````+D`````B7PD,&:#N0``````=7N)^L'B!8N&'`$``(F"````
+M`(N&(`$``(F"!````(N&)`$``(F""`````^V@AP```"-#/T`````C00!#[9<
+M)"^('(4-````#[:"'````(T$`0^V7"0NB!R%#@````^V@AP````!P<8$C0\`
+M````@((<`````>MYD(UT)@`/MID<````B=BZ`````/>V,`$``(72=$V+3"0P
+MP>$#C009#[94)"^(%(4-````BU0D,,'B!0^V@AP```"-!`$/MEPD+H@<A0X`
+M```/MH(<`````<'&!(T/`````(""'`````'K#X/'`8/!((/_!`^%`____X.&
+M*`$```&0C70F`(/%`8/&&#LM?`$```^%OO[__X-$)#0!@WPD-"`/A1@!``"#
+M1"0X`8%\)#C_````#X52`0``@WPD5`!T!XMT)%3&!@"+'7P!``#'1"0D````
+M`(7;?CFY`````,=$)"0`````N@````"+@B@!```!1"0D@WPD5`!T#(N"+`$`
+M`(MT)%0`!H/!`8/"&#G9==F#?"18``^$`0$``+T`````NP````!F@[L`````
+M``^$Z0````^V@QP```")1"0@A<!^:L=$)!@`````C13M`````(E4)!R+1"0<
+M`T0D&(TTA0P```"+?"18N`0```#\B<'SI@^7P@^2P#C"=2&#?"14`'0-#[:#
+M'0```(MT)%2(!@^V@QP```")1"0DZP^#1"08`8M4)"`Y5"08=:F#Q0&#PR"#
+M_01T9>EI____#[9,)#2(3"0NQT0D#`````#'1"0(`````(M<)#2)7"0$BW0D
+M.(DT).C\____B40D*+T`````O@````"#/7P!````#X]._?__Z8O^__\/MD0D
+M.(A$)"_'1"0T`````.N@#[9$)"2#Q#Q;7E]=PXGVC;PG`````(/L'(E<)!")
+M="04B7PD&(M$)"`/MG0D)(M8;(MX9/8``70OB1PDZ/S___^%P'0[@+B1````
+M`'0RB?(/ML*)1"0(BT<@B40D!(D<).C\____ZQB)\@^VPHE$)`B+1R")1"0$
+MB1PDZ/S___^+7"00BW0D%(M\)!B#Q!S#C;8`````@^P\B5PD+(ET)#")?"0T
+MB6PD.(M\)$`/MG0D1(M?9(MO;(7;#X1M`P``@+^6``````^%8`,``/8'`@^%
+M5P,```^V@]@```"$P'0+B?(XT'51Z4$#``"+4R")\0^VP8E$)!`/MH*7````
+M#[92`HT$@`^VA`(`````B40D#`^V12*)1"0(#[9%(8E$)`3'!"2D!0``Z/S_
+M__^X_____^GZ`@``B2PDZ/S___^)1"0@A<`/A.$"``"+4R")\0^VP8E$)!`/
+MMH*7````#[92`HT$@`^VA`(`````B40D#`^V12*)1"0(#[9%(8E$)`3'!"30
+M!0``Z/S___^+1"0@QD`DX<9`)0&)\H#Z`@^5P(/`&HM,)""(028/MT,<9HE!
+M$(EY&,=!(`````#'030`````QT%LL-$``(E,)`2)+"3H_/___\:'E@````%F
+MQX>4````]`&%_W15BT=DA<!T3F:!OY0```"6`'47B40D",=$)`0A````BT`L
+MB00DZ/S___]F@Z^4`````<<$)-`'``#H_/___XDL).C\____BT=DA<!T"8"_
+ME@````!ULHM$)"")1"0$B2PDZ/S___]F@[^4``````^$QP$``(M4)""`>A0`
+M#X6Y`0``BT]DB4PD*(M!+(LHB2PDZ/S___^)PX7`=16+1"0HQH"5`````;@`
+M````Z98!``")+"3H_/___XG&A<!U(8M4)"C&@I4````!B5PD!(DL).C\____
+MN`````#I9P$``(U+/(E,)"3&0R3AQD,E`<9#)@.+5"0H#[="'&:)0Q#&0V@/
+MB7L8QT,@``(``(M6"(E3-+@`````Q@00`(/``3T``@``=?*)<TS'0VRPT0``
+MQT0D!`````"+3"0DB0PDZ/S___^+0R")1"0,BT8,BU80B40D!(E4)`B+1"0D
+MB00DZ/S___^)7"0$B2PDZ/S____&AY8````!9L>'E````/H`A?]T58M'9(7`
+M=%AF@;^4````E@!U%XE$)`C'1"0$(0```(M`+(D$).C\____9H.OE`````''
+M!"30!P``Z/S___^)+"3H_/___XM'9(7`=`F`OY8`````=;)F@[^4`````'0J
+M@'L4`'4DBT,TB40D!(M4)"B)%"3H_/___XM,)"@/MH'8````B(>:````@WM,
+M`'0/C4-,B40D!(DL).C\____B5PD!(DL).C\____N`````#K$9"-="8`N/__
+M___K!;C_____BUPD+(MT)#"+?"0TBVPD.(/$/,.#[`R+5"04@#H)=PH/M@+_
+M)(4X`0``N/_____IH````(M2!(N"I`0``(7`=0.)T)"+@*`$``#&@',)```!
+MB00DZ/S___^X`````.MT#[9*!+H`````BT0D$.@2[?__ZV`/MDH$N@$```"+
+M1"00Z/[L___K3`^V0@2)1"0$BT0D$(D$).C\____ZS8/MD($B40D!(M$)!")
+M!"3H_/___^L@#[9"!(E$)`2+1"00B00DZ/S___^X`````(VT)@````"#Q`S#
+MC;8`````C;\`````@^PLB5PD((ET)"2)?"0HBW0D,(M^;(N'H`0``(!X)P!U
+M8(M><`^VAIH```")1"00#[:&EP````^V5@*-!(`/MH0"`````(E$)`P/MD<B
+MB40D"`^V1R&)1"0$QP0D_`4``.C\____QT9P`````(M&"(E$)`B)="0$BT9X
+MB00D_]/K.(U>?(E<)`2+1Q2)!"3H_/___\=&?/0!``#'AH0```"0[P``B;:(
+M````B5PD!(M'%(D$).C\____BUPD((MT)"2+?"0H@\0LPXVV`````%575E.#
+M[!R+;"0PBWPD-`^W1"0X:<#<````B<,#G=0$``"+A:`$```%A`D``(E$)!B)
+M7V2)>R#&@]D`````@WLP`'4G#[9U*XGQA,D/A"P!``"+2RRZ`````#N-3`@`
+M``^$[0```.D%`0``@`\!BT,PB4=H#[9U*XGPA,!T/HM+++H`````.XU,"```
+M=!'K'@^VPHT$P#F,Q4P(``!U%`^V12F-!(*(AY<```#K#KH`````@\(!B?`X
+MPG74BXV@!```O@````"Z`````(UT)@`/MH0*F`0``#S_=!X/ML!IP)0````#
+M@?`$```[0S!U!XGQB$\!ZT2#Q@&#P@&#^@1USK(`BTPD&`^VA`J8!```//]T
+M'P^VP&G`E`````.!\`0``#M#,'4(B?"(1P'K#)"#Q@&#P@&#^@1UR0^V0T6(
+M1P+K5`^VPHT$P#F,Q4P(``!U(@^V12F-!(*(1P&(AY<````X52MU&NL4C;8`
+M````N@````"#P@&)\#C"=<;&1P'_QD<"`(.[T`````!T"8N#U````(A'`HU/
+M((U37(M#7(E'((M"!(E!!(M""(E!"(M"#(E!#(M"$(E!$(M"%(E!%(M"&(E!
+M&(M"'(E!'(M"((E!((M")(E!)(U/#(U32(M#2(E'#(M"!(E!!(M""(E!"(M"
+M#(E!#(M"$(E!$(N#A````(E'2(N#B````(E'3`^W0S1FB4=<#[=#-F:)1UZ+
+M0SR+4T")1U")5U2+@Y````")1U@/MD-&B$=@#[:#V````(B'F@```/9#*`1U
+M"(DL).C\____#[93)(G0@^`&@_@&=0OVP@%T"8VV`````(`G_0^V4RC0ZH/B
+M!`^V!X/@^PG0B`</MD<!B(>9````#[9'`HB'F````(D\).C\____QT0D"```
+M``"+0R")1"0$B2PDZ/S___^)/"3H;_S__X/$'%M>7UW#C;0F`````(/L'(E<
+M)!2)="08BW0D((N>H`0``(DT).C\____@'XS`74MC8.$"0``@'@S`71?@+Y\
+M"0```'48QT0D!`````")!"3H_/___X"&?`D```&0C9[0````B5PD!(M&%(D$
+M).C\____QX;0````Z`,``,>&V`````````")MMP```")7"0$BT84B00DZ/S_
+M__^+7"04BW0D&(/$',.-M@````!55U93@^QLB[PD@````(N$)(0```"+M"2,
+M````B<7![1B)PL'J$(A4)$`/MLR(3"0PB$0D+XN<)(@```"!PX0)``"X````
+M`(N4)(@```#&!!``@\`!/0@5``!UZXER$*'`````B$(H@\`!H\````")Z8A*
+M(P^V1"1`B$(B#[9,)#"(2B$/MD0D+XA"(,9"*0`/MP=FB4(8#[='`F:)0AJ+
+M1P2)0AR+E"2(````@<(($P``BXPDB````(F1@`D``(ES$`^V02B(0RB)Z(A#
+M(P^V3"1`B$LB#[9$)#"(0R$/MDPD+XA+(,9#*0$/MP=FB4,8#[='`F:)0QJ+
+M1P2)0QR)DX`)``"+E"2(````#[="&F8])"</A",!``!F/20G#X>,````9CU$
+M(0^$#P$``&8]1"%W3&8]("$/A/\```!F/2`A=Q%F/5`'#X4*`0``B?;IZ```
+M`&8](B&-M"8`````#X37````9CU`(8VV``````^%X@```.G"````D(UT)@!F
+M/1`G#X+.````9CT1)XGV#X:G````9BT@)V:#^`*)]@^'L@```.F2````D(UT
+M)@!F/8`G#X2#````9CV`)XGV=S)F/4`G='5F/4`GC70F`'<09CTP)P^%?```
+M`(UT)@#K6V8]1"=T568]8">-="8`=6;K268]@')T0V8]@'*)]G<(9CV")W50
+MZS-F/8"1B?9T#F8]@)1U0.LCC;8`````BXPDB````&;'022`D<9!)@1FQT,D
+M@)'&0R8$ZQN+A"2(````9L=`)("4QD`F!&;'0R2`E,9#)@0/MD<(BY0DB```
+M`(A"*@^V1PB(0RK'1"0,```$`,=$)`@`````QT0D!`(```")-"3H_/___XN,
+M)(@```")`<=$)`P`(```QT0D"`````#'1"0$`````(DT).C\____B<&+M"2(
+M````B48(BP:%P`^$[0$``(7)#X3E`0``C9```@$`B58$C8````(`B08%`$``
+M`(D#B5,$B4L(BS5\`0``A?9^7[L`````N0`````/MX$<`0``9CL'=3\/MX$>
+M`0``9CM'`G4RBY$L`0``@\(!B9$L`0``BX$H`0``B40D&(7`=!4YPG81B="Z
+M`````/=T)!B)D2P!``"#PP&#P1@Y\W6KBY0DB````(M"!"W@?0``QP`!\`,`
+MBT($+=A]``#'``$``.B+0A#'1"0$>````(D$).C\____B<(E`'```#T`(```
+M=B:)T(#DCX#,((N,)(@```"+41")1"0(QT0D!'@```")%"3H_/___XGHB$0D
+M7P^V5"1`B%0D7@^V3"0PB$PD70^V1"0OB$0D7,=$)"@`````O0````!F@[T`
+M``````^$H````("]'``````/A(````"[`````(M4)"C!X@.)5"0DC4PD7(E,
+M)!R+1"0D`=B--(4,````N00```#\BWPD'/.F#Y?"#Y+`.,)U-P^VA1T```"#
+MP`&(A1T````/MI4<````A-)T'#C0=A@/ML`/MLJZ`````&;W\8B5'0```(UT
+M)@"#PP$/MH4<````.=A_F(-$)"@!@\4@@WPD*`0/A5+___^+M"2(````QX:L
+M!````0```+@!````ZP6X`````(/$;%M>7UW#C78`C;PG`````%575E.#[`2+
+M="08BWPD'(MN;`^V!H/@`0^VP(D$)+@`````Q@0X`(/``8/X)'7TBYV`"0``
+MB=JP`(VT)@````#&!!``@\`!/0`"``!U\HU+-KH`````#[9$,B&(!`H/MD0R
+M((A$"@&#P@*#^BAUYXU+%+("#[9$,@N(1`K^#[9$,@J(1`K_@\("@_H6=>:-
+M2RZR``^V1#))B`0*#[9$,DB(1`H!@\("@_H(=>>)7QR+5E"+3E2#P@&#T0")
+M%XE/!(M&6(E'"#T`$```=1")T(G*#Z3"`\'@`XD'B5<$@WYD`'4>]@8!=!F+
+M1FB%P'0RA>UT+@^W0"2`O`48!```_W0@#[:&EP````^V5@*-!(`/MH0"````
+M`(A'$,<$)`````#&1Q$`QD<2`<9'%A#&1Q40#[8$)(T4``^V7PZ#X_T)TXA?
+M#L'@!0^V5PR#XM\)PHA7#`^W1ES!Z`>#X`'!X`:#XK\)PHA7#`^W1ES!Z`*#
+MX`$/MD\-@^'^"<&(3PT/MT9>P>@#P>`'@^)_"<*(5PP/MT9>T>B#X`$!P(/A
+M/0G!B$\-@\H0B%<,#[8&T.B#X`&#X_X)PXA?#@^V!H/@!(/C^PG#B%\.9L='
+M&``0#[:&F@```(A'$P^VAI<```"(1R"#Q`1;7E]=PXVT)@````"#["R)7"0<
+MB70D((E\)"2);"0HBUPD,(M#;(E$)!B+5"0TBT(DB1B+0V2%P'42QD)F`HD4
+M)/]2<.F8!0``C78`]D`H`G0:BTPD-,9!9@*)#"3_47#I?`4``(VT)@````"+
+M1"08B00DZ/S___^)QH7`=1.+5"0TQD)F`HD4)/]2<.E0!0``QT!D`````(M,
+M)#2)2$B+0V2)1AB+0V0/MT`<9HE&$`^V060\`@^$4P$``#P"=PR$P'0CZ8H"
+M``"-=@`\`P^$C0$``#P$C;8`````#X5Q`@``Z5$!``"+1"0TBWA(BVA,#[=(
+M4(%[6``0``!U"P^L[P/![0-FP>D#BT-D]D`T`0^$@0```(M4)#0/MD)EJ`)T
+M!L9&)(CK$(/@!#P!&<"#X`6#Z':(1B3&1B4`B>C!Z!B(1B:)Z,'H$(A&)XGH
+MP>@(B$8HB>J(5BF)^`^LZ!B(1BJ)^`^LZ!"(1BN)^`^LZ`B(1BR)^(A&+<9&
+M+@#&1B\`B<AFP>@(B$8PB$XQQD8R`,9&,P#K6HM4)#0/MD)EJ`)T!L9&)"CK
+M$(/@!#P!&<"#X`6#P"J(1B3&1B4`B?@/K.@8B$8FB?@/K.@0B$8GB?@/K.@(
+MB$8HB?B(1BG&1BH`B<AFP>@(B$8KB$XLQD8M`(M#9`67````B48XQD8<(`^W
+MP0^O0UB)1B#I40$``(M4)#2`>D@0=P7V`P)U#8M,)#3&068&Z80#``"+1"0T
+MQD!F!NEW`P``BU0D-`^V0F6#X#`\('41QD8D&\9&)0'&1B@`Z0@!``#&1B0U
+MZ?\```"+0V0/MD`D@^`%@_@%=1>!3F0``"``BTPD-`^W451F.U%*=0_K7HM$
+M)#3&0&8&Z1L#``"+3"0T#[9!4SSC=$4\XW<0/$)T/3RPB?9T(#Q`=2;K,3SL
+MC;8`````=!`\[W0C/.5U$HVV`````.L7BT0D-&:)4$KK#8M4)#3&0F8&Z<H"
+M``#&1B2PBTPD-`^W04B(1B4/MT%*B$8F#[=!3(A&)P^W04Z(1B@/MT%0B$8I
+M#[9!4HA&*@^V05.(1BL/MD%)B$8L#[9!2XA&+0^V04V(1BX/MD%/B$8O#[9!
+M48A&,/9!909T&0^W053!X`F)1B#K#8M$)#3&0&8&Z4\"``#'1FP@WP``BU0D
+M-`^V0F6H!@^$)@(``(U^/(M::(7;=`2H`75$BTPD-(M1;(72#X0W`@``QT0D
+M"`````"+3"08BX&$!0``B40D!(M$)#2)!"3_TH7`#X00`@``BU0D&(N:A`4`
+M`(7;=$B)-"3H_/___\=$)`0`````B3PDZ/S___^#PQ"+0_")1"0,BT/XBU/\
+MB40D!(E4)`B)/"3H_/___XM#](/#$(7`#X6.`0``Z]/'1"0$`````(D\).C\
+M____BT8@/0`0``!W1XM,)!B)#"3H_/___XG"A<!U#8M$)#3&0&8+Z64!``"+
+M0`B)1C2)5DR+1B")1"0,BT(,BU(0B40D!(E4)`B)/"3H_/___^M;/0```0!W
+M1XM4)!B)%"3H_/___XG"A<!U#8M,)#3&068+Z1<!``"+0`B)1C2)5DR+1B")
+M1"0,BT(,BU(0B40D!(E4)`B)/"3H_/___^L-BT0D-,9`9@;IX@```(M4)#0/
+MMD)EJ`0/A,````"`>F0#=2*+2EB%R70;BU8TBT8@B40D"(E,)`2)%"3H_/__
+M_^F8````BTPD-(M1:(72=0V+46R%T@^%N@```.MKBWXTJ`%U!(G3ZSB+1"0T
+MBU!LA=)T+<=$)`@!````BTPD&(N!A`4``(E$)`2+1"0TB00D_]*%P'0*BU0D
+M&(N:A`4``(/#$(M#^(M3\(E4)`B)1"0$B3PDZ/S___\#>_"+0_2#PQ"%P'47
+MZ]N+1B"+5C2%P'0+Q@(`@\(!@^@!=?6)="0$BTPD&(D,).C\____ZS*)="0$
+MBT0D&(D$).C\____BU0D-(D4)/]2<.L6NP````#I//[__XM^-(UT)@#I4O__
+M_XM<)!R+="0@BWPD)(ML)"B#Q"S#C;0F`````%=64X/L$(M\)""+="0DN```
+M``#&!#``@\`!@_AX=?2#OZP$```!#Y1&$P^V5R(/MD\A#[9?(`^V1R.(1@.(
+M5@*(3@&('H!.$1`/MT<89HE&!`^W1QIFB48&BX>L!```B$9LQD82(`^W5QIF
+M@?H@(70'9H'Z(B%U1\9&%P*-1CS'1CQ2;V-KQT`$97120<=`"$E$(%/'0`Q3
+M1"`RQT`0,3)X(,=`%$-O;G3'0!AR;VQL9L=`'&5RQD`>`.G^````C8+PV/__
+M9H/X`7829H'Z0"%T"V:!^D0A#X6E````QD87!`^W5QJ-@O#8__]F@_@!=T.-
+M1CS'1CQ2;V-KQT`$97120<=`"$E$(#+'0`PW,7@@QT`04T%3(,=`%$-O;G3'
+M0!AR;VQL9L=`'&5RQD`>`.F)````9H'Z0"%T!V:!^D0A=7N-1CS'1CQ2;V-K
+MQT`$97120<=`"$E$(%/'0`Q31"`RQT`0,31X(,=`%$-O;G3'0!AR;VQL9L=`
+M'&5RQD`>`.L[QD87"(U&/,=&/%)O8VO'0`1E="`WQT`(-3`@4\=`#$%402#'
+M0!!#;VYTQT`4<F]L;&;'0!AE<L9`&@#&1A<HQD82`<9&$"B-1AC'1AA(:6=H
+MQT`$4&]I;L=`"'0@5&7'0`QC:&YOQT`0;&]G:<=`%&5S+"#'0!A);F,NQD`<
+M`(N'J`0``(7`=!"+0`B)1F2)PL'Z'XE6:.L.BT<(B49DB<+!^A^)5FC'1F``
+M(```QT0D!'P```"+1Q")!"3H_/___XG"@>+P`P``P>H$B%9M@^`/B$9OQT0D
+M!(````"+1Q")!"3H_/___XG"@>(``/`#P>H4B%9N)0``#P#!Z!"(1G"#Q!!;
+M7E_#C;8`````55=64X/L'(ML)#"+="0TBUPD.+@`````Q@08`(/``3V<````
+M=?*)<PB#_A-^"8'%A`D``(/N%+@`````@[RU&`(````/A?T!``")G+48`@``
+MB6MLBT0D/(E#<(M,)$")2WB`?3,!#X76`0``@?Z#````#X^X`0``#[:$-1@$
+M```\_P^$J`$```^VP&:)1"08#[?`:<#<````B<<#O=0$``#V1R<$#X2%`0``
+MBT<D)0#__P`]``#_``^%<@$``/9'*`0/A.0```#&AY0`````#[97)(G0@^`&
+M@_@&#X1A`0``@_@$#X58`0``]L(!#X1/`0``BU\LBT<PA<`/A8(```#&1R8#
+MQD<G!(!["0!T4;X`````C4,HB40D%(M,)!2)#"3H_/___XG"BT,LB5,LBTPD
+M%(D*B4($B1"`>B;_=!4YUW01QH>5`````;@!````Z?(```"#Q@$/MD,).?!_
+MNX"_E0````$/A-4```")?"0$B2PDZ/S___^X`0```.G$````@'@F``^%M0``
+M`&;'0"X!`(M',(E$)`2)+"3H_/___[@!````Z9L```"+?RR`?PD`=%[&1"0;
+M`(U'*(E$)!"+3"00B0PDZ/S___^)PHM'+(E7+(M,)!")"HE"!(D0@'HF_W0>
+M#[9")3PB=`0\#742QX2U&`(```````"X`````.M#@$0D&P$/MD0D&SA'"7>N
+M#[=$)!B)1"0(B5PD!(DL).C\____N`$```#K&)#'A+48`@```````+@`````
+MZP6X`0```(/$'%M>7UW#D(M$)`0/ME0D#,8`",9``1*`?"0(`'0)@$@"!.L'
+MC78`@&`"^X32=`B`8`S?ZP:)]H!(#""X%````,.-M@````#SPXVT)@````"-
+MO"<`````55=64X/L+(ML)$"+?"1(#[9$)$R(1"0;#[94)%"(5"0:BU0D1(M"
+M&(E$)"C'0A@`````@WPD*``/A5T!``")+"3H_/___XG&N`````"%]@^$_0$`
+M`(DL).C\____B40D*(7`=1:)="0$B2PDZ/S___^X`````.G7`0``QD8D&L9&
+M)0C&1B8(QD8G`,9&*/_&1BD`QD85JXM4)$0/MT(<9HE&$(EN&,=&(/\```#'
+M1F0(````BT0D*(M`"(E&-`7_````B48XQD8<)(M$)"B)1E#'1FR@!0$`QD84
+M@(U>/,=$)`0`````B1PDZ/S____'1"0,_P```(M$)"B+4!"+0`R)1"0$B50D
+M"(D<).C\____B70D!(DL).C\____N\C____K&\<$).@#``#H_/___X/K`8DL
+M).C\____A-MT#`^V1A0\@'3=A,!T/8U$)"B)1"0$B2PDZ/S___\/MT8>B40D
+M!(M4)$2+0BR)!"3H_/___XET)`2)+"3H_/___[@`````Z<H```#'1E``````
+MB70D!(DL).C\____BT0D*(M8"`^V1"0:B40D"`^V1"0;B40D!(U#!(D$).C\
+M____B<;&`P#&0P$`QD,"`,9#`P")?"0$B2PDZ/S___^-5R2X`````,8$$`"#
+MP`&#^!!U](U>!,9')!7&1R41B%\HQD<I`(UW/`^VVXE?(,='9`````"+5"0H
+MBT((B4<TB5=0QT0D!`````")-"3H_/___XE<)`R+1"0HBU`0BT`,B40D!(E4
+M)`B)-"3H_/___[@!````@\0L6UY?7<.0D)"0D)!3BUPD"(M$)`R)PF:)0P3&
+M0PH`9L=#"```9H7`=!J#Z@&Y`````(L#9HD4"(/!`H/J`6:#^O]U[EO#C;8`
+M````5E.+7"0,BT0D$(G&9HE#!,9#"@%FQT,(``!FA<!T(KH`````N0````"-
+MM"8`````BP-FB10(@\(!@\$"9CGR=>];7L.-M@````"-OP````!3BUPD"(![
+M"@%U*@^W0P@/M\B+$P^W%$J#P`%FB4,(9CM#!G(&9L=#"```9H-K!`$/M\+K
+M%(L3#[=#!(/H`6:)0P0/M\`/MP1"6\.0C70F`(/L"(D<)(ET)`2+7"0,BTPD
+M$(G.@'L*`74F#[=3!`^W0P@!P@^W0P:)QHG0P?H?]_Z+`V:)#%!F@T,$`>L6
+MB?8/MT,$#[?(BQ-FB31*@\`!9HE#!(L<)(MT)`2#Q`C#D(M$)`1F@W@$``^4
+MP`^VP,.+1"0$BP@YR'4'N0````#K"HL1BT$$B4($B1")R,.)]E=64XM4)!"+
+M3"04#[9\)!B)^(3`=#8/M@*)T[X`````.@%T%.L?#[93`0^V00&#PP&#P0$X
+MPG4-@\8!B?*)^#C"=>/K![@`````ZP6X`0```%M>7\.-="8`C;PG`````(M$
+M)`3&0`$`BU0D"(A0`L=`!`````##B?:-O"<`````55=64XM,)!2+?"08BVPD
+M'(MT)"`/ME$!#[;"C01`P>`"B<,#60B#P@&(40$!<02X`````,8$&`"#P`&#
+M^`QU](D[B6L$B?"(0PB)\@^VQHA#"<'J$(/B/P^V0PJ#X,`)T(A#"EM>7UW#
+MC;0F`````(M4)`0/MD(!.@(/DL`/ML##ZPV0D)"0D)"0D)"0D)"04P^W3"0,
+M#[9<)!"+5"0(N`````"`>@+_=0AFB0J(6@+K#(/``8/"!&8]@`!UY@^WP%O#
+MC;8`````C;PG`````(/L'(E<)`R)="00B7PD%(EL)!B+;"0@BTPD*(M<)"P/
+MMT0D)(U4A0"`>@+_=0AFB0J(6@+K&0^VPXE$)`@/M\&)1"0$B2PDZ/S___\/
+MM\"+7"0,BW0D$(M\)!2+;"08@\0<PXVV`````(V\)P````!3#[=<)`P/MDPD
+M$(M4)`BX`````#A*`G479CD:=1+&0@+_9L<"___K$XVT)@````"#P`&#P@1F
+M/8``==@/M\!;P^L-D)"0D)"0D)"0D)"0D%93BUPD#`^W="00#[9,)!2Z````
+M`(G0.$R3`G4&9CDTDW0.@\`!@\(!@?J`````=>1F/8``=06X@`$```^WP%M>
+MPXVT)@````"-O"<`````@^P0B1PDB70D!(E\)`B);"0,BVPD%`^V120\"'1(
+M/"AT1#RH#X06`0``/(B-="8`#X1:`0``/`IT+#PJC70F`'0D/*H/A/8````\
+MBHUT)@`/A#H!```\+W0,/(^-="8`#X7H`0``/"\/A)4````\+W<B/`IT9#P*
+M=PH\"(UT)@!U1.M6/"AT>SPJC;8`````=33K;SR/#X3T````/(^)]G<5/(@/
+MA.8````\BHUT)@!U%.G9````/*B-M"8`````='X\JG1ZO@````"_`````+@`
+M````Z68!```/MD4FP>`(#[95)PG0#[95)8/B'\'B$`G0B<:_``````^V12CI
+M/0$```^V52;!XA@/MD4GP>`0"<(/MD4I"<(/MD4HP>`("<*)UK\`````#[9%
+M*\'@"`^V52P)T.D%`0``D(UT)@`/ME4FP>(8#[9%)\'@$`G"#[9%*0G"#[9%
+M*,'@"`G"B=:_``````^V52K!XA@/MD4KP>`0"<(/MD4M"<(/MD4LP>`("=#I
+MM@```(VV``````^V12:)PK@`````P>(8#[9-)XG+N0````#!XQ`)R`G:#[9-
+M+;L`````"<@)V@^V32B)R[D`````P>,("<@)V@^V32F)R[D`````"<@)V@^V
+M32J[``````^DRQC!X1@)R`G:#[9-*[L`````#Z3+$,'A$`G("=H/MDTLNP``
+M```/I,L(P>$(B<8)SHG7"=\/ME4NP>(8#[9%+\'@$`G"#[9%,0G"#[9%,,'@
+M"`G0C78`B758B7U<B45@9H--$@&+'"2+="0$BWPD"(ML)`R#Q!##ZPV0D)"0
+MD)"0D)"0D)"05E.+="0,#[=$)!"Z_____V:%P'0MNO____^Y`````(/H`0^W
+MP(U8`0^V!#$QT`^VP,'J"#,4A8`!``"#P0$YV77FB=!;7L.)]HV\)P````"#
+M[$R+1"10#[90,XE4)$0/ME`RB50D0`^V4#&)5"0\#[90,(E4)#@/ME`OB50D
+M-`^V4"Z)5"0P#[90+8E4)"P/ME`LB50D*`^V4"N)5"0D#[90*HE4)"`/ME`I
+MB50D'`^V4"B)5"08#[90)XE4)!0/ME`FB50D$`^V4"6)5"0,#[90)(E4)`B)
+M1"0$QP0D+`8``.C\____@\1,PY"-="8`4X/L&(M4)""+3"0D#[9!`8A"`0^V
+M00*(0@*+002)0@2+6@@/MD(!C01`P>`"BU$(B40D"(E4)`2)'"3H_/___X/$
+M&%O#C70F`(V\)P````!3BU0D"(M:1`^V2CRX`````,8$$`"#P`&#^'!U](E:
+M1(A*/%O#C70F`(V\)P````"+5"0$N`````"-M"8`````Q@00_X/``3T``@``
+M=?+SPXM$)`2Y`````#L`=`V+2`2+$8M!!(E"!(D0B<C#D)"04XM<)`B+"XN1
+M!`$``(G0)7[__O^)@00!``"!XG[_\O^+0P2)$(M#!(E0#(L#BX!4`0``HP``
+M```E_@#__XL3B8)4`0``6\.)]HV\)P````!3BUPD"`^V3"0,BP.+D`0!``")
M%0`````/MT,D9CV`9'0.9CV`D70(9CV`E'43B?8/MLF#P0BX`0```-/@"<+K
M#P^VR8/!#+@!````T^`)PHL#B9`$`0``6\.-M@````!3BUPD"`^V3"0,BP.+
MD`0!``")%0`````/MT,D9CV`9'0.9CV`D70(9CV`E'43B?8/MLF#P0BX_O__
@@ -2957,8 +1581,8 @@ MB0*-A([0`0``D(UT)@"#^0-V"XL0B14`````ZPF0BQ")%0````#VP@)T<^OA
MD(/Y`W8UC1S-`````(V$,S`"``#'``````#'!"00)P``Z/S___^-G#,T`@``
MBP.C`````(/(`8D#ZS:-',T`````C80S4`(``,<``````,<$)!`G``#H_/__
M_XV<,U0"``"+`Z,`````@\@!B0.-=@"#Q`1;7L.0D)"0D)"0D)"04XM,)`B+
-M&0^W@90+``"#P`%FB8&4"P``9CN!F`L``'()9L>!E`L`````#[>!E`L``,'@
-M`@.!C`H``(M4)`R+$HD0#[>!E`L``(F#+`$``%O#ZPV0D)"0D)"0D)"0D)"0
+M&0^W@9`+``"#P`%FB8&0"P``9CN!E`L``'()9L>!D`L`````#[>!D`L``,'@
+M`@.!B`H``(M4)`R+$HD0#[>!D`L``(F#+`$``%O#ZPV0D)"0D)"0D)"0D)"0
M5E.+3"08#[=4)!`/MG0D%(M<)`RX`````(VT)@````#&!`@`@\`!@_@$=?1F
M@>+_#P^W`68E`/`)T&:)`0^V4PG!X@R+`27_#_#_"=")`0^V0P:#X`*#^`$9
MTH/B`H/"`<'B!0^V00.#X!\)T(/($(/@]XA!`_9#!@%T%HGR@^)_P>($#[=!
@@ -2968,39 +1592,39 @@ M*HA"!0^V02N(0@;V068$=",/MD$LB$((#[9!+8A""0^V02Z(0@H/MD$OB$(+
M#[9!,(A"#+@!````PY"-="8`55=64XML)!2+?"08N@````"^`0```.M0`=*)
MV-/XJ`%T$/?"`````746@?)W)]L`ZP[WP@````%T!H'R=R?;`(/I`8/Y_W70
M@\8!@_X)=1B)T,'H$(A%`(G0P>@(B$4!B%4"6UY?7<,/MEP^_[D'````ZZ2-
-MM@````"-OP````"+1"0$BX!$"@``BQ"+4`2+4`B+0`RC`````,.0C70F`%=6
+MM@````"-OP````"+1"0$BX!`"@``BQ"+4`2+4`B+0`RC`````,.0C70F`%=6
M4X/L$(M\)""+="0DBT94#[9?*X3;="8/ME`)N0````#VP@%T$>L6C;0F````
M`(G0T_BH`74'@\$!.-EU\<9&)@R)="0$B3PDZ/S___^#Q!!;7E_#C78`C;PG
M`````(/L#(M$)!"+$&;'0#(!`,9`)AV)1"0$B10DZ/S___^#Q`S#C;8`````
-MC;PG`````%93@^P4BT0D((LP#[=$)"3!X`(#AM`%``"+&(7;=$2+%@^W0QYF
+MC;PG`````%93@^P4BT0D((LP#[=$)"3!X`(#ALP%``"+&(7;=$2+%@^W0QYF
MP>@%#[?`C02%``,``(F"<`$``(L6#[=+'H/A'[@!````T^")@G0!``#'1"0(
M`````(E<)`2)-"3H_/___X/$%%M>PXVT)@````!55U93@^P<BVPD,(!]*P!T
M*[D`````BT0D-/9`"0%T$.L:BU0D-`^V0@G3^*@!=0R#P0$/MD4K9CG(=^:+
M5"0TBT(HA<!T)8/`6(M5%(E$)`2)%"3H_/___XM4)#2+0BB)1"0$B2PDZ/S_
M__^+1"0T@\`XBU0D-#E".`^$=0$``(E$)!B+1"08B00DZ/S___^)QH-X(``/
-MA#0!``"`>$\`#X29````9H-]7``/A(X```"_`````(T$O0`````#A=`%``"+
-M&(7;=&</MT,09CM&''5=9CV%`'=7#[?`@+PHO`0``/]T2HM5``^W0QYFP>@%
+MA#0!``"`>$\`#X29````9H-]6``/A(X```"_`````(T$O0`````#A<P%``"+
+M&(7;=&</MT,09CM&''5=9CV%`'=7#[?`@+PHN`0``/]T2HM5``^W0QYFP>@%
M#[?`C02%``,``(F"<`$``(M5``^W2QZ#X1^X`0```-/@B8)T`0``QD,4(<=$
-M)`@`````B5PD!(DL).C\____@\<!#[=%7#GX#X]W____BT8@QT!@`````/9&
+M)`@`````B5PD!(DL).C\____@\<!#[=%6#GX#X]W____BT8@QT!@`````/9&
M*`1U(8DL).C\____BT8@QT0D"`$```")1"0$B2PDZ/S___^)]HM&(`^V4`(/
-MMD`!B50D"(E$)`3'!"2P`0``Z/S___^+1B"+E4@%``")1"0(B50D!,<$)`$`
-M``#H_/___XM&((N52`4``(E$)`B)5"0$QP0D!@```.C\____QT8@`````(M4
+MMD`!B50D"(E$)`3'!"3!````Z/S___^+1B"+E40%``")1"0(B50D!,<$)`$`
+M``#H_/___XM&((N51`4``(E$)`B)5"0$QP0D!@```.C\____QT8@`````(M4
M)#2`:@H!B70D!(DL).C\____BU0D&(M$)#0Y4#@/A8_^__^+1"0TQT`H````
M`(M%`(N(6`$``(D-`````(7)=`F+10")B%@!``"#Q!Q;7E]=PXVV`````(V_
-M`````%=64X/L((MT)#"+/@^V7RN$VW0QC8><"P``N0`````Y\'49ZR`/ML&)
-MPL'B!HV$@I`+``"-1`<,.?!T#H/!`3C9=>+K!;D`````#[;1B=#!X`:-!)"+
-MC`>D"P``A<D/A'X```#V008"='B-A`><"P``.4$8=6P/MD$TA,!T"(/``8A!
+M`````%=64X/L((MT)#"+/@^V7RN$VW0QC8>8"P``N0`````Y\'49ZR`/ML&)
+MPL'B!HV$@I`+``"-1`<(.?!T#H/!`3C9=>+K!;D`````#[;1B=#!X`:-!)"+
+MC`>@"P``A<D/A'X```#V008"='B-A`>8"P``.4$8=6P/MD$TA,!T"(/``8A!
M-.M<BU$L@^H@C5DLC4(@.=AT3(-Z#`!U.>L(B?:#>@P`=2_&030!QT0D$```
-M```/MH*+````B40D#(E4)`B)3"0$BX<$"@``B00DZ/S____K#8M2((/J((U"
+M```/MH*+````B40D#(E4)`B)3"0$BX<`"@``B00DZ/S____K#8M2((/J((U"
M(#G8=;Z#Q"!;7E_#C;0F`````(/L'(E<)`R)="00B7PD%(EL)!B+7"0@BWPD
-M)(M'3(MH'`^W5Q!F@?J%`'=T#[?"#[:$`[P$```\_W1E9H/Z?W<?#[;`BY-\
-M!0``:<`H`0``BT00+`^V0`3K2XVV`````&:!^H$`=QD/ML"+D[0%``!IP!0-
-M``"+1!`(#[9`!.LE#[;`BY.8!0``:<"P````BT005`^V0`3K#(VT)@````"X
-M_P````^VM!A"!0``BT=0A<!T#(E$)`2)'"3H_/___XE\)`2)'"3H_/___XEL
-M)`2)\@^VPFO`7(V$`TP!``")!"3_E9P```"+7"0,BW0D$(M\)!2+;"08@\0<
+M)(M'3(MH'`^W5Q!F@?J%`'=T#[?"#[:$`[@$```\_W1E9H/Z?W<?#[;`BY-X
+M!0``:<`H`0``BT00+`^V0`3K2XVV`````&:!^H$`=QD/ML"+D[`%``!IP!0-
+M``"+1!`(#[9`!.LE#[;`BY.4!0``:<"P````BT005`^V0`3K#(VT)@````"X
+M_P````^VM!@^!0``BT=0A<!T#(E$)`2)'"3H_/___XE\)`2)'"3H_/___XEL
+M)`2)\@^VPFO`7(V$`T@!``")!"3_E9P```"+7"0,BW0D$(M\)!2+;"08@\0<
MPXUT)@"#[!R)7"0,B70D$(E\)!2);"08BW0D)(M<)"@/MVPD+&:!?B3A`740
-M#[9&)H/H$;\`````/`%V+HM$)""+$(NZ?`4```^W1A"YV"8!`&8]A0!W$0^W
-MP`^VA`*\!```:<@H`0```<_&0P0%@&,%_H`CW[@`````9H%^).$!=1(/MD8F
+M#[9&)H/H$;\`````/`%V+HM$)""+$(NZ>`4```^W1A"YV"8!`&8]A0!W$0^W
+MP`^VA`*X!```:<@H`0```<_&0P0%@&,%_H`CW[@`````9H%^).$!=1(/MD8F
M@^@!/`$/EL`/ML"-=@#!X`</MA.#XG\)PH@3#[9&9H/@`<'@!H/BOPG"B!/V
M1F8!=`Z)/"3H_/___V:)0PCK!&:):P@/MT,(B$859H%^).$!=2L/ME8FC4+_
M/`%W$`^V5B>#X@_K*8VT)@````"-0N^Z#P```#P!=A:-="8`N@````"#?S0`
@@ -3008,67 +1632,67 @@ M=`</ME=-@^(/#[8#@^#P"="(`XM<)`R+="00BWPD%(ML)!B#Q!S#@^P\B5PD
M+(ET)#")?"0TB6PD.(M<)$0/MD,D/`AT$3PH=`T\J'0)/(AU"Y"-="8`@TMD
M"NL>/`IT%CPJC70F`'0./*IT"CR*=0J-M@````"#2V0"#[=[)&:!_^$!=1D/
MMD,F@^@1/`%W#H-+9`BX`````.E]!0``BT,D)?___P")1"0@/>$!$``/A>0`
-M```/MU,09H'ZA0`/AS(%```/M\*+="1`#[:,!KP$``"X_____X#Y_W1I9H/Z
-M?W<=#[;!BW0D0(N6?`4``&G`*`$``(M$$"P/MD`$ZT9F@?J!`'<=#[;!BW0D
-M0(N6M`4``&G`%`T``(M$$`@/MD`$ZR(/ML&+="1`BY:8!0``:<"P````BT00
-M5`^V0`2-M"8`````#[;`BU0D0`^VA`)"!0``:\!<C;0"3`$``(N2M`4```^V
+M```/MU,09H'ZA0`/AS(%```/M\*+="1`#[:,!K@$``"X_____X#Y_W1I9H/Z
+M?W<=#[;!BW0D0(N6>`4``&G`*`$``(M$$"P/MD`$ZT9F@?J!`'<=#[;!BW0D
+M0(N6L`4``&G`%`T``(M$$`@/MD`$ZR(/ML&+="1`BY:4!0``:<"P````BT00
+M5`^V0`2-M"8`````#[;`BU0D0`^VA`(^!0``:\!<C;0"2`$``(N2L`4```^V
MP6G`%`T``,=$)"0`````]D0"-1`/A4H"``#&0Q0$BU0D2,<"`````+@!````
-MZ8($```/MU,0N?\```"X_____V:!^H4`=WX/M\*+="1`#[:,!KP$``"X____
-M_X#Y_W1B9H/Z?W<=#[;!BW0D0(N6?`4``&G`*`$``(M$$"P/MD`$ZS]F@?J!
-M`'<=#[;!BW0D0(N6M`4``&G`%`T``(M$$`@/MD`$ZQL/ML&+="1`BY:8!0``
-M:<"P````BT005`^V0`0/MLD/ML")1"0HBU0D0`^VK!!"!0``:\5<C;0"3`$`
-M``^WP6G`*`$```."?`4``(E$)"1F@?_A`74+#[9#)H/H`3P!=BEF@?G_`'0*
+MZ8($```/MU,0N?\```"X_____V:!^H4`=WX/M\*+="1`#[:,!K@$``"X____
+M_X#Y_W1B9H/Z?W<=#[;!BW0D0(N6>`4``&G`*`$``(M$$"P/MD`$ZS]F@?J!
+M`'<=#[;!BW0D0(N6L`4``&G`%`T``(M$$`@/MD`$ZQL/ML&+="1`BY:4!0``
+M:<"P````BT005`^V0`0/MLD/ML")1"0HBU0D0`^VK!`^!0``:\5<C;0"2`$`
+M``^WP6G`*`$```.">`4``(E$)"1F@?_A`74+#[9#)H/H`3P!=BEF@?G_`'0*
MBTPD)/9!)P1U&,9#%`:+="1(QP8`````N`$```#IA`,``(M4)"0/MD(DB<*#
-MX@6#^@5U(8M,)$`/MD$L.D$V<A2+="1(QP8!````N`$```#I40,``(-\)"0`
+MX@6#^@5U(8M,)$`/MD$L.D$R<A2+="1(QP8!````N`$```#I40,``(-\)"0`
M#X3V````@_H%#X7M````B5PD!(M$)"2)!"3H_/___X3`=1C&0Q0$BU0D2,<"
M`````+@!````Z1$#``"+3"0D@'E/'W84BW0D2,<&`0```+@!````Z?,"``#V
-M0V8!=!-KQ5R+5"1`]H0"5`$```%T%^M@:\5<BTPD0/:$`50!```!#X08`@``
+M0V8!=!-KQ5R+5"1`]H0"4`$```%T%^M@:\5<BTPD0/:$`5`!```!#X08`@``
MBW0D*(ET)`2+1"1`B00DZ/S___^$P'04BU0D2,<"`0```+@!````Z9D"``#V
-M0V8!#X3B`0``:\5<BTPD0/:$`50!```!#X3-`0``BW0D)(DT).C\____9H/X
+M0V8!#X3B`0``:\5<BTPD0/:$`5`!```!#X3-`0``BW0D)(DT).C\____9H/X
M'P^&MP$``(M$)$C'``$```"X`0```.E0`@``]D8&`G0U@7PD(.$!$``/A(\!
M``"+5"0D#[9"3SI"3G(HBTPD2,<!`0```+@!````Z1L"``"-M@````"!?"0@
MX0$0``^$6@$``(MT)"0/MT8Z@'LDX0^%2`$``(![)0$/A3X!``#1Z(G"@^(!
-M#[9#)H/H!CP)#X<0`0``#[;`_R2%X`\``,=$)!`!````QT0D#`$```")7"0(
+M#[9#)H/H!CP)#X<0`0``#[;`_R2%@`4``,=$)!`!````QT0D#`$```")7"0(
MBT0D)(E$)`2+5"1`B10DZ/S___^$P`^%[@```(M,)$C'`0(```"X`0```.F'
M`0``QT0D$`$```#'1"0,`````(E<)`B+="0DB70D!(M$)$")!"3H_/___X3`
M#X6J````BU0D2,<"`@```+@!````Z4,!``#'1"00`0````^VPHE$)`R)7"0(
MBTPD)(E,)`2+="1`B30DZ/S___^$P'5KBT0D2,<``@```+@!````Z00!``#'
M1"00``````^VPHE$)`R)7"0(BU0D)(E4)`2+3"1`B0PDZ/S___^$P'4LBW0D
M2,<&`@```+@!````Z<4```#&0Q0$BT0D2,<``````+@!````Z:T```"+1"1`
-M!4`)``")!"3H_/___X3`=!2+5"1(QP(!````N`$```#IA````(![).%U4(![
+M!3P)``")!"3H_/___X3`=!2+5"1(QP(!````N`$```#IA````(![).%U4(![
M)0%U2H![)@]U1(![*0%U/@^V0RC!X`@/ME,G`=`/M\")1"0$BTPD0(D,).C\
M____.T-(=02%P'45QD,4!(MT)$C'!@````"X`0```.LNN`````#K)XGVBU0D
-M0`^V@D$&``!KP%R-M`),`0``BY*T!0``N.P&#0#I4_O__XM<)"R+="0PBWPD
+M0`^V@CT&``!KP%R-M`)(`0``BY*P!0``N.P&#0#I4_O__XM<)"R+="0PBWPD
M-(ML)#B#Q#S#C;0F`````(/L'(M$)"R)1"0,BT0D*(E$)`B+1"0DB40D!(M$
-M)""+`(D$).C\____@\0<PXUV`%575E.#[$R+1"1@BYAH"@``BU0D9&;'0A[_
+M)""+`(D$).C\____@\0<PXUV`%575E.#[$R+1"1@BYAD"@``BU0D9&;'0A[_
M#XU$)#")1"0(B50D!(M,)&")#"3H_/___X3`=`F+3"0PZ4P,``"+="1DBT8D
M)?___P`]X0$0``^%W0```,<$)(@3``#H_/___P^W5A!F@?J%``^'\0L```^W
-MPHM\)&`/MHP'O`0``+C_____@/G_=&)F@_I_=QT/ML&+="1@BY9\!0``:<`H
-M`0``BT00+`^V0`3K/V:!^H$`=QT/ML&+?"1@BY>T!0``:<`4#0``BT00"`^V
-M0`3K&P^VP8MT)&"+EI@%``!IP+````"+1!!4#[9`!`^VP(M\)&`/MH0'0@4`
-M`&O`7(V$!TP!``")1"0<BY>T!0``#[;!:<`4#0```<*)5"0DQT0D(`````#'
-M1"0H`````.ER`0``BT0D9`^W4!"Y_P```&:!^H4`=P\/M\*+="1@#[:,!KP$
+MPHM\)&`/MHP'N`0``+C_____@/G_=&)F@_I_=QT/ML&+="1@BY9X!0``:<`H
+M`0``BT00+`^V0`3K/V:!^H$`=QT/ML&+?"1@BY>P!0``:<`4#0``BT00"`^V
+M0`3K&P^VP8MT)&"+EI0%``!IP+````"+1!!4#[9`!`^VP(M\)&`/MH0'/@4`
+M`&O`7(V$!T@!``")1"0<BY>P!0``#[;!:<`4#0```<*)5"0DQT0D(`````#'
+M1"0H`````.ER`0``BT0D9`^W4!"Y_P```&:!^H4`=P\/M\*+="1@#[:,!K@$
M``"+?"1D#[=W)&:!_N$!=0\/MD<F@^@1/`$/AK@```!F@?J%`'=S#[?"BWPD
-M8`^VA`>\!```//]T8&:#^G]W&0^VP(N7?`4``&G`*`$``(M$$"P/MD`$ZT9F
-M@?J!`'<=#[;`BWPD8(N7M`4``&G`%`T``(M$$`@/MD`$ZR(/ML"+?"1@BY>8
-M!0``:<"P````BT005`^V0`3K!;C_____#[;`BU0D8`^VA`)"!0``:\!<C80"
-M3`$``(E$)!P/M\%IP"@!```#@GP%``")1"0@9H'^X0%U2.LP#[?!:<"P````
-MBTPD8`.!F`4``(E$)"B+<%2)="0<QT0D(`````#'1"0D`````.M)BWPD9`^V
+M8`^VA`>X!```//]T8&:#^G]W&0^VP(N7>`4``&G`*`$``(M$$"P/MD`$ZT9F
+M@?J!`'<=#[;`BWPD8(N7L`4``&G`%`T``(M$$`@/MD`$ZR(/ML"+?"1@BY>4
+M!0``:<"P````BT005`^V0`3K!;C_____#[;`BU0D8`^VA`(^!0``:\!<C80"
+M2`$``(E$)!P/M\%IP"@!```#@G@%``")1"0@9H'^X0%U2.LP#[?!:<"P````
+MBTPD8`.!E`4``(E$)"B+<%2)="0<QT0D(`````#'1"0D`````.M)BWPD9`^V
M5R:-0N\\`78JC4+_/`%V(V:!^?\`=`J+1"0@]D`G!'42BU0D9,9"%`:Y````
M`.GV"0``QT0D)`````#'1"0H`````(U$)$B)1"0$BTPD8(D,).C\____9HE$
M)!J+="1D9HE&'HM\)&")/"3H_/___XG%N0(```"%P`^$J@D``(M$)&2):%0/
-MMU0D&HE4)!1IPK`$``"-/!B-1R"+3"1@*X%H"@``B<+!^A\#@6P*```3D7`*
+MMU0D&HE4)!1IPK`$``"-/!B-1R"+3"1@*X%D"@``B<+!^A\#@6@*```3D6P*
M``"+3"1(B4$@BTPD2(E1)(M%#(M5$(M,)$B)02B+3"1(B5$LBT0D2`^W="0:
M9HEP"+@`````C78`Q@0X`(/``3VP!```=?*+1"1D9H%X).$!=6:)P@^V0":#
MZ!$\`7=9C40D-XE$)`R+1"1(#[9`"(E$)`B)5"0$BTPD((D,).C\____C8<@
-M!```BUPD8"N#:`H``(G"P?H?`X-L"@``$Y-P"@``BTPD2(E!$(M,)$B)413I
+M!```BUPD8"N#9`H``(G"P?H?`X-H"@``$Y-L"@``BTPD2(E!$(M,)$B)413I
M1@$``)"+1"0<#[90!O;"`74KBTPD9(M!)"7___\`/>$!$``/A+8```"+7"0@
M#[9#)(/@!8/X!0^%H@```(MT)&3V1F8@=!*-1"0WB40D!(DT).C\____ZRB-
M1"0WB40D#(M$)$@/MD`(B40D"(M$)&2)1"0$BU0D((D4).C\____C8<@!```
-MBTPD8"N!:`H``(G"P?H?B<L#@6P*```3D7`*``"+3"1(B4$0BTPD2(E1%(GX
-M*X-H"@``B<+!^A^+="1@`X9L"@``$Y9P"@``BTPD2(E!&(M,)$B)41SK:_;"
-M`G1FB?B+5"1@*X)H"@``B<+!^A^+3"1@`X%L"@``$Y%P"@``BTPD2(E!&(M,
-M)$B)41R-AR`$``"+7"1@*X-H"@``B<+!^A\#@VP*```3DW`*``"+3"1(B4$0
+MBTPD8"N!9`H``(G"P?H?B<L#@6@*```3D6P*``"+3"1(B4$0BTPD2(E1%(GX
+M*X-D"@``B<+!^A^+="1@`X9H"@``$Y9L"@``BTPD2(E!&(M,)$B)41SK:_;"
+M`G1FB?B+5"1@*X)D"@``B<+!^A^+3"1@`X%H"@``$Y%L"@``BTPD2(E!&(M,
+M)$B)41R-AR`$``"+7"1@*X-D"@``B<+!^A\#@V@*```3DVP*``"+3"1(B4$0
MBTPD2(E1%(M$)$B`2`$"BT0D9`^V4#V+1"1(9HE0`HM4)&2`>CT`=#R^````
M`+L`````BTT(BT0D9(M01(L$&HD$&8M$&@2)1!D$BT0:"(E$&0B#Q@&#PPR+
M5"1D#[9"/3GP=\Z+3"1DBU$@BT0D2(E0#&:!>23A`751#[9!)H/H$3P!=T8/
@@ -3081,20 +1705,20 @@ MB10DZ/S___^+3"1D]D%F`70*BUPD'(!+"`'K"(MT)!R`9@C^Q@>ABU0D(`^V
M@K8```"#X`\/ME<!@^+P"<*(5P&+3"0@#[=!'(/``6;!P`AFB4<"B<N!PZ``
M``#I@`,``)"+7"1D9H%[).$!#X4Y`@``#[9#)CP/=!*[`````#P0#X5:`P``
MZ;8```"+="1D#[96*,'B"`^V1B<!PHM$)$C&0`0-BT0D2(!@!?Z`3"1'"(M<
-M)$@/MD85BW0D8`^VCN(```#3X&8)0PB+3"1(#[9!`8/@'X/(((A!`8M,)&2+
+M)$@/MD85BW0D8`^VCMX```#3X&8)0PB+3"1(#[9!`8/@'X/(((A!`8M,)&2+
M02J)AS@$``"+02Z)ASP$``!FP<((9HF71`0```^V02F(AT($``#&!Y&+7"0@
M#[=#'(/``6;!P`AFB4<"#[:3M@```(/B#P^V1P&#X/`)T(A'`8M<)""!PZ``
-M``#IGP(``(M4)$B+="1D#[9&%8M<)&`/MHOB````T^!F"4((Q@>!9L='`O__
+M``#IGP(``(M4)$B+="1D#[9&%8M<)&`/MHO>````T^!F"4((Q@>!9L='`O__
MBW0D)`^VEHL```"#X@\/MD<!@^#P"="(1P&+1"1D@W@T`'4.QD`4(;D`````
-MZ80$``"+5"1D]D(G`70NBUHXA=MT)XE<)`2+3"1@BX$$"@``B00DZ/S___^#
+MZ80$``"+5"1D]D(G`70NBUHXA=MT)XE<)`2+3"1@BX$`"@``B00DZ/S___^#
MX`\/ME<!@^+P"<*(5P'K!(M<)"2+="1DBU8T#[9"`;X0````/(!T?#R`=QP\
M%7<2/!!S9(/H`CP!=T*0C70F`.M//!=W-^M7/(6-M@````!T)#R%=PX\@70^
M/(*-="8`=1OK(#R0<A6^*````#R2D'8R/)-U![Z,````ZR>^!````.L@#[9"
M!(TTA0@```#K$[X(````ZPR^#````.L%OAP```")\L'J`HM$)$B(4`2+3"1(
M9L'J"(/B`0^V006#X/X)T(A!!8V7(`0``(M,)&2+032)="0(B40D!(D4).C\
-M____Z38!``"+7"1D#[9#)(/H!#RK=T$/ML#_)(4($```BW0D9`^V1BS!X`@/
+M____Z38!``"+7"1D#[9#)(/H!#RK=T$/ML#_)(6H!0``BW0D9`^V1BS!X`@/
MME8MC0P0@_D-=Q:X`0```-/@J=@^``!T"(M$)$B`2`$$BT0D2(!(`0'K"(M$
-M)$B`8`'[BT0D2,9`!`V+1"1(@&`%_HM4)$B+3"1D#[9!%8M<)&`/MHOB````
+M)$B`8`'[BT0D2,9`!`V+1"1(@&`%_HM4)$B+3"1D#[9!%8M<)&`/MHO>````
MT^!F"4((BT0D2(!@`1_&AR`$```&BUPD(('#H````(E<)`2-AR$$``")!"3H
M_/___XE<)`2-AR4$``")!"3H_/___XV/1`0``(M4)&2#PB2+="1DBT8DB8=$
M!```BT($B4$$BT((B4$(BT(,B4$,BU0D((N"J````(F'.`0``(N"K````(F'
@@ -3102,1905 +1726,1905 @@ M/`0``,8'D8M,)"`/MI&V````@^(/#[9'`8/@\`G0B$<!#[=!'(/``6;!P`AF
MB4<"A=L/A(<```"+`XE'!(M#!(E'".MZJ`%T=@^W1"0:B40D#(M$)$B)1"0(
MBUPD9(E<)`2+="0<B30DZ/S____V0V8!=`^+1"1(#[=`",'@`XA$)#B-1"0W
MB40D#(E\)`B+1"1DB40D!(M4)!R)%"3H_/___XM,)&3V068!=`J+7"0<@$L(
-M`>L(BW0D'(!F"/Z+5"1@BX+0!0``BUPD9(M,)!2)'(@/MU0D&F;!Z@4/M](/
-MMUPD&HG9@^$?N`$```#3X(MT)&`)A);4!0``BU0D9(M")"7___\`/>$!$`!U
+M`>L(BW0D'(!F"/Z+5"1@BX+,!0``BUPD9(M,)!2)'(@/MU0D&F;!Z@4/M](/
+MMUPD&HG9@^$?N`$```#3X(MT)&`)A);0!0``BU0D9(M")"7___\`/>$!$`!U
M-(U$)$2)1"0,QT0D"`````")7"0$BTPD'(D,).C\____#[9$)$>#X!^#R$"(
M1"1'Z<$```"+="1D9H%^).$!=44/MD8F@^@1/`%W.HM$)"B)1"0$BU0D8(D4
M).C\____C40D1(E$)`R+3"0H#[9!-(E$)`B)7"0$BUPD'(D<).C\____ZW"+
M="0@B70D!(M$)&")!"3H_/___XU$)$2)1"0,#[9&0HE$)`B)7"0$BU0D'(D4
M).C\____#[96)(G0@^`&@_@&=2[VP@%T*0^V1"1'@^`?@\A@B$0D1P^V5D*#
MXG_!X@0/MT0D1F8E#_@)T&:)1"1&C40D1(E$)`2+3"1@B0PDZ/S___^+1R"+
-M5R2Y`P```(G3"<-T1(E$)`2)5"0(QP0D(`8``.C\____N0,```#K*8MT)&`/
-MMH9!!@``:\!<C80&3`$``(E$)!R+EK0%``"X[`8-`.F-]/__B<B#Q$Q;7E]=
-MPXUV`(V\)P````!55U93@^P<BW0D,,=$)!0`````C;[H````Z:(!``")]HD\
-M).C\____B<.#>$P`=3")-"3H_/___XE#3(7`=2&-EN@```"+AN@```")6`2)
-M`XE3!(F>Z````.F(`0``B?:+0R0E____`#WA`1``#X33````#[=#$&8]@``/
+M5R2Y`P```(G3"<-T1(E$)`2)5"0(QP0DA`8``.C\____N0,```#K*8MT)&`/
+MMH8]!@``:\!<C80&2`$``(E$)!R+EK`%``"X[`8-`.F-]/__B<B#Q$Q;7E]=
+MPXUV`(V\)P````!55U93@^P<BW0D,,=$)!0`````C;[D````Z:(!``")]HD\
+M).C\____B<.#>$P`=3")-"3H_/___XE#3(7`=2&-EN0```"+AN0```")6`2)
+M`XE3!(F>Y````.F(`0``B?:+0R0E____`#WA`1``#X33````#[=#$&8]@``/
MA,4````/MM!FB5,09H/Z?W839H%[).$!=2(/MD,F@^@1/`%W%V:!^H4`=Q`/
-MM\(/MHP&O`0``(#Y_W48QD,4!HE<)`2)-"3H_/___^GS````C78`#[=K)&:!
-M_>$!=14/MD,FB$0D&X/H$3P!#X?@````ZQ4/ML%IP"@!```#AGP%``")1"04
+MM\(/MHP&N`0``(#Y_W48QD,4!HE<)`2)-"3H_/___^GS````C78`#[=K)&:!
+M_>$!=14/MD,FB$0D&X/H$3P!#X?@````ZQ4/ML%IP"@!```#AG@%``")1"04
MZPP/MD0D&X/H`3P!=C5F@?J``'0N9H']X0%U"P^V0R:#Z!$\`78<BT0D%/9`
M)P1U$L9#%`:)7"0$B30DZ/S____K>HE<)`2)-"3H_/___X/X`G<+@_@!<R:-
M="8`ZQ"#^`-U68GVC;PG`````.M!B5PD!(DT).C\____B?;K/H-[5`!T#XU#
-M5(E$)`2)-"3H_/___XV6Z````(N&Z````(E8!(D#B5,$B9[H````ZS.)7"0$
-MB30DZ/S___^0.;[H````#X54_O__ZQ@/ML%IP"@!```#AGP%``")1"04Z1__
+M5(E$)`2)-"3H_/___XV6Y````(N&Y````(E8!(D#B5,$B9[D````ZS.)7"0$
+MB30DZ/S___^0.;[D````#X54_O__ZQ@/ML%IP"@!```#AG@%``")1"04Z1__
M__^#Q!Q;7E]=PXGV@^P\B5PD+(ET)#")?"0TB6PD.(M\)$"+=RR++@^V1@BH
M$'0,QH>T````!NFB`@``#[:7M````(#Z`0^$@P```(#Z`7(;@/H$#X2J````
M@/H&#X7A`@``Z78"``"-="8`QH>T`````8E\)`2)+"3H_/___XM$)$3&0!2!
-M@$X("(-X5`!T$XM$)$2#P%2)1"0$B2PDZ/S___^+A>@```"+5"1$B5`$B0*-
-MA>@```")0@2)E>@```")+"3H_/___^EU`@``@^#WB$8(@(>W`````<:'M```
+M@$X("(-X5`!T$XM$)$2#P%2)1"0$B2PDZ/S___^+A>0```"+5"1$B5`$B0*-
+MA>0```")0@2)E>0```")+"3H_/___^EU`@``@^#WB$8(@(>W`````<:'M```
M``"+3"1$QD$4`HE,)`2)+"3H_/___XDL).C\____Z4`"``#&A[<`````BT0D
M1(-X5`!T#X/`5(E$)`2)+"3H_/___XM/((7)#X2O`0``BU$$C4(!B4$$@_HH
-M#X>=`0``BX7H````BU0D1(E0!(D"C87H````B4($B97H````@'\F_W0FBT<T
+M#X>=`0``BX7D````BU0D1(E0!(D"C87D````B4($B97D````@'\F_W0FBT<T
MA<!T!H!X)@!T&8E\)`C'1"0$`@```(DT).C\____Z;D!```/MD8(@^#W@\@0
MB$8(BU<PA=)U#8!^"@!U,.D"`0``B?;'1"00`````,=$)`P"````#[9'38E$
M)`B)5"0$B30DZ/S____I;P$``,=$)"``````QD0D)P"-3CB)3"0<BT0D'(D$
-M).C\____B40D*(M&/(M4)"B)5CR+3"0<B0J)0@2)$(M"((7`="*)1"0(BX5(
+M).C\____B40D*(M&/(M4)"B)5CR+3"0<B0J)0@2)$(M"((7`="*)1"0(BX5$
M!0``B40D!,<$)`4```#H_/___XM$)"B`2"@"BU0D*(E4)`C'1"0$!@```(DT
M).C\____BTPD*(!Y3P!T0(M<)""#PP&!?"0@?Y:8`'<KB?:)+"3H_/___\<$
M)`$```#H_/___XM$)"B`>$\`=`N#PP&!^X&6F`!UUXE<)""`1"0G`0^V5"0G
M.%8*#X<]____BT<TA<!U&\9')@-FQX>4``````")?"0$B2PDZ/S____K=HD$
-M).C\____C;8`````ZV8/ME\FQP0DQ@$``.C\____@&8([XN%Z````(M,)$2)
-M2`2)`8V%Z````(E!!(F-Z````(E\)`C'1"0$!@```(DT).C\____@/O_=1.)
+M).C\____C;8`````ZV8/ME\FQP0DUP```.C\____@&8([XN%Y````(M,)$2)
+M2`2)`8V%Y````(E!!(F-Y````(E\)`C'1"0$!@```(DT).C\____@/O_=1.)
M?"0(B70D!(DL).C\____C78`B2PDZ/S___^+7"0LBW0D,(M\)#2+;"0X@\0\
-MPXUT)@!55U93@^QLB[0D@````(N6?`4``+C8)@$`BXPDA````&:!>1"%`'<9
-MBYPDA`````^W0Q`/MH0PO`0``&G`*`$``(T\`HN61`H``('"0`@```^V1T+!
-MX`@!PHL*B0T`````B<C!Z!"(1"1`BY9$"@``@<)`"```#[9'0L'@"`'"BT($
-MHP````"(1"18B<+!Z@B(5"19P>@0B$0D6HN61`H``('"0`@```^V1T+!X`@!
+MPXUT)@!55U93@^QLB[0D@````(N6>`4``+C8)@$`BXPDA````&:!>1"%`'<9
+MBYPDA`````^W0Q`/MH0PN`0``&G`*`$``(T\`HN60`H``('"0`@```^V1T+!
+MX`@!PHL*B0T`````B<C!Z!"(1"1`BY9`"@``@<)`"```#[9'0L'@"`'"BT($
+MHP````"(1"18B<+!Z@B(5"19P>@0B$0D6HN60`H``('"0`@```^V1T+!X`@!
MPHM""*,`````B$0D6XG"P>H(B%0D7,'H$(A$)%W&1"1>`,9$)%\`B<W![1@/
-MMEPD0(M$)%R)1"00BT0D6(E$)`R);"0(B5PD!,<$)$P&``#H_/___XG8@_`!
+MMEPD0(M$)%R)1"00BT0D6(E$)`R);"0(B5PD!,<$)+`&``#H_/___XG8@_`!
MB<*#X@%T((!\)$``=!F+E"2$````QD(4`+@`````Z;0"``"-="8`BXPDA```
M`(!Y%(%U,XU$)%B)1"0,B6PD"(E<)`2)#"3H_/___XN<)(0```#&0Q0"N```
M``#I=@(``(VV`````(N,)(0```"+020E____`#WA`0X`=0[&010AN`````#I
M3`(``(N$)(0```#V0&8!=3.$TG4O@'\F_W0IC40D6(E$)`R);"0(B5PD!(N4
M)(0```")%"3H_/___[@`````Z0P"``")?"0$B30DZ/S___^)?"0$B30DZ/S_
M__^+%HN,)(0````/MT$>9L'H!0^WP(T$A0`#``")@G`!``"+!HN<)(0````/
-MMTL>@^$?N@$```")U=/EB:AT`0``#[=#'L'@`@.&T`4``,<```````^W2QZ)
-MR&;!Z`4/M\"#X1^)T]/CB=GWT2&,AM0%``"+K"2$````#[=-'HG(9L'H!0^W
-MP(/A']/B]](A5(9@BU4`BT4$B4($B1`/MT4>C99`"0``B40D!(D4).C\____
+MMTL>@^$?N@$```")U=/EB:AT`0``#[=#'L'@`@.&S`4``,<```````^W2QZ)
+MR&;!Z`4/M\"#X1^)T]/CB=GWT2&,AM`%``"+K"2$````#[=-'HG(9L'H!0^W
+MP(/A']/B]](A5(9<BU4`BT4$B4($B1`/MT4>C98\"0``B40D!(D4).C\____
M@&]/`<9%%(&#?50`=!&)Z(/`5(E$)`2)-"3H_/___XU'$#E'$`^$[````(E$
-M)"R-ED`)``")5"0\BTPD+(D,).C\____B<.+%@^W0!YFP>@%#[?`C02%``,`
-M`(F"<`$```^W2QZ#X1^Z`0```(G5T^6+!HFH=`$```^W0Q[!X`(#AM`%``#'
-M```````/MTL>B<AFP>@%#[?`@^$?B=73Y8GI]]$AC(;4!0``#[=+'HG(9L'H
-M!0^WP(/A']/B]](A5(9@#[=#'HE$)`2+1"0\B00DZ/S___^`;T\!@WM4`'0/
-MC4-4B40D!(DT).C\____C9;H````BX;H````B5@$B0.)4P2)GN@```"+5"0L
+M)"R-ECP)``")5"0\BTPD+(D,).C\____B<.+%@^W0!YFP>@%#[?`C02%``,`
+M`(F"<`$```^W2QZ#X1^Z`0```(G5T^6+!HFH=`$```^W0Q[!X`(#ALP%``#'
+M```````/MTL>B<AFP>@%#[?`@^$?B=73Y8GI]]$AC(;0!0``#[=+'HG(9L'H
+M!0^WP(/A']/B]](A5(9<#[=#'HE$)`2+1"0\B00DZ/S___^`;T\!@WM4`'0/
+MC4-4B40D!(DT).C\____C9;D````BX;D````B5@$B0.)4P2)GN0```"+5"0L
M.5<0#X4B____BXPDA````(%A9/___O_&A[0````$B4PD!(D\).C\____N`$`
M``"0C70F`(/$;%M>7UW#D(VT)@````!55U93@^Q,#[=L)&2+5"1HB50D,(M$
-M)&R)1"0TBWPD8(LWBX9H"@``B40D%`M4)#0/A(L"```/M]5IPK`$``"+7"04
-MC0P8]D$A`G05C025``````.&T`4``(L`QD`4`NL3C025``````.&T`4``(L`
-MQD`4(<'B`HE4)"R)T`.&T`4``(L0BT(D)?___P`]X0$0``^$B@$```^W0A!F
-M/84`=P\/M\`/MH0&O`0``#S_=16+1"0L`X;0!0``BP#&0!0&Z2X(```/ML!I
-MP"@!```#AGP%``")1"08@'PD,P!Y70^V4"2)T(/@!H/X!G4?]L(!=!J+!HN0
+M)&R)1"0TBWPD8(LWBX9D"@``B40D%`M4)#0/A(L"```/M]5IPK`$``"+7"04
+MC0P8]D$A`G05C025``````.&S`4``(L`QD`4`NL3C025``````.&S`4``(L`
+MQD`4(<'B`HE4)"R)T`.&S`4``(L0BT(D)?___P`]X0$0``^$B@$```^W0A!F
+M/84`=P\/M\`/MH0&N`0``#S_=16+1"0L`X;,!0``BP#&0!0&Z2X(```/ML!I
+MP"@!```#AG@%``")1"08@'PD,P!Y70^V4"2)T(/@!H/X!G4?]L(!=!J+!HN0
M6`$``(D5`````(72=`B+!HF06`$``(L&BX!0`0``HP````"#R`*+%HF"4`$`
M`(L&BX`$`0``HP````"`S/^+%HF"!`$``&;W02`""`^$X0```(!^*P`/A-<`
M``#&1"0?`+L`````C78`B=H/MLL/MD<)T_BH`71'@/L#=AR+!@70`0``C02(
MBP"C`````,'H%(/@`>L:C78`BP8%T`$``(T$B(L`HP````#!Z!2#X`&$P'0+
MN`$```#3X`A$)!^#PP&-0@$X1BMWGX!\)!\`=&(/MD0D'SA'"758B>AFP>@%
-M#[?`B>F#X1^Z`0```-/BA52&8'4]BU0D&("ZM`````)W!\:"M`````.+1"0L
-M`X;0!0``BP")1"0$BTPD&(D,).C\____Z=(&``#'1"08`````/9$)#,!#X2_
-M!@``BT0D+`.&T`4``(L(QD$4(8M!)"7___\`/>$!#@`/A)P&``"+ED0*``"!
-MPD`(``"+7"08#[9#0L'@"`'"BP*C`````(N61`H``('"1`@```^V0T+!X`@!
-MPHL"HP````"+ED0*``"!PD@(```/MD-"P>`(`<*+`J,`````B4PD!(DT).C\
-M____Z3,&```/M_V-++T`````BX;0!0```>B+$&:!>B3A`0^%!P$```^V6B:`
+M#[?`B>F#X1^Z`0```-/BA52&7'4]BU0D&("ZM`````)W!\:"M`````.+1"0L
+M`X;,!0``BP")1"0$BTPD&(D,).C\____Z=(&``#'1"08`````/9$)#,!#X2_
+M!@``BT0D+`.&S`4``(L(QD$4(8M!)"7___\`/>$!#@`/A)P&``"+ED`*``"!
+MPD`(``"+7"08#[9#0L'@"`'"BP*C`````(N60`H``('"1`@```^V0T+!X`@!
+MPHL"HP````"+ED`*``"!PD@(```/MD-"P>`(`<*+`J,`````B4PD!(DT).C\
+M____Z3,&```/M_V-++T`````BX;,!0```>B+$&:!>B3A`0^%!P$```^V6B:`
M^Q`/AP8&``"X`0```(G9T^"IP#````^%TP```*D```$`=5'VQ(`/A.(%``!I
-MQ[`$``"+7"04C0P8#[9!,XA"%(GH`X;0!0``BP#V0!,$#X2Z!0``@'@4``^$
-ML`4``(M0.(72#X2E!0``#[9!,X@"Z9H%``!IQ[`$``"+5"04C3P0B>@#AM`%
-M``"+$`^V1RJ(0A2)Z`.&T`4``(L`@W@T``^$:`4```^VAR$$``")!"3H_/__
-M_XGJ`Y;0!0``BQ*+4B")PSG0=@*)TXU7*(GH`X;0!0``BP"+0#2)7"0(B50D
-M!(D$).C\____Z1\%``")Z`.&T`4``(L`QD`4`.D,!0``B>@#AM`%``"+`(E$
-M)""+2$B)3"0DN/____^+7"0@9H%[$(4`=Q:)Z`.&T`4``(L`#[=`$`^VA#"\
-M!```#[;`:<`H`0``BYY\!0```</&@[0`````#[93)(G0@^`&@_@&#X5T`0``
+MQ[`$``"+7"04C0P8#[9!,XA"%(GH`X;,!0``BP#V0!,$#X2Z!0``@'@4``^$
+ML`4``(M0.(72#X2E!0``#[9!,X@"Z9H%``!IQ[`$``"+5"04C3P0B>@#ALP%
+M``"+$`^V1RJ(0A2)Z`.&S`4``(L`@W@T``^$:`4```^VAR$$``")!"3H_/__
+M_XGJ`Y;,!0``BQ*+4B")PSG0=@*)TXU7*(GH`X;,!0``BP"+0#2)7"0(B50D
+M!(D$).C\____Z1\%``")Z`.&S`4``(L`QD`4`.D,!0``B>@#ALP%``"+`(E$
+M)""+2$B)3"0DN/____^+7"0@9H%[$(4`=Q:)Z`.&S`4``(L`#[=`$`^VA#"X
+M!```#[;`:<`H`0``BYYX!0```</&@[0`````#[93)(G0@^`&@_@&#X5T`0``
M]L(!#X1K`0``BWPD(,9'%`#V1V8@#X2+!```@WPD)``/A(`$``"+1"0D]D!E
M`@^$K````(M7((72#X2A````BTA8A<ET&(M'-(E4)`B)1"0$B0PDZ/S____I
M@@```(M4)""#>C0`='B+3"0D@WEH`'4&@WEL`'1HBWPD((MO-(M4)"2+0FB%
-MP'0(B<?V0F4!="V+3"0DBT%LBY9(!@``QT0D"`$```")5"0$B0PD_]"_````
-M`(7`=`:+OD@&``"+1PB+%XE4)`B);"0$B00DZ/S___\#+XM'!(/'$(7`=-^+
-MED0*``"!PD`(```/MD-"P>`(`<*+`J,`````B<+!ZA"+?"0DB%=3P>@89HE'
-M2(N61`H``('"1`@```^V0T+!X`@!PHL2B14`````#[;"9HE'3`^VQF:)1TZ)
-MT,'H$`^VP&:)1U#!ZAB(5U*+ED0*``"!PDP(```/MD-"P>`(`<*+`J,`````
-M#[;`9HE'2NDR`P``:<>P!```BU0D%(T\$`^V1S.$P`^%S````(GH`X;0!0``
+MP'0(B<?V0F4!="V+3"0DBT%LBY9$!@``QT0D"`$```")5"0$B0PD_]"_````
+M`(7`=`:+OD0&``"+1PB+%XE4)`B);"0$B00DZ/S___\#+XM'!(/'$(7`=-^+
+MED`*``"!PD`(```/MD-"P>`(`<*+`J,`````B<+!ZA"+?"0DB%=3P>@89HE'
+M2(N60`H``('"1`@```^V0T+!X`@!PHL2B14`````#[;"9HE'3`^VQF:)1TZ)
+MT,'H$`^VP&:)1U#!ZAB(5U*+ED`*``"!PDP(```/MD-"P>`(`<*+`J,`````
+M#[;`9HE'2NDR`P``:<>P!```BU0D%(T\$`^V1S.$P`^%S````(GH`X;,!0``
MBP#&0!0`BTPD(/9!9A`/A/T"``"#?"0D``^$\@(```^V1S.+7"0DB$-*]D-E
M`@^$W0(``(-Y(``/A-,"``"#>V@`=0^#>VP`D(UT)@`/A+X"``"+1"0@BW@T
-MBU0D)(M":(7`=`B)P_9"90%T,(M,)"2+06R+ED@&``#'1"0(`0```(E4)`2)
-M#"3_T+L`````A<!T"8N>2`8``(UV`(M#"(L3B50D"(E\)`2)!"3H_/___P,[
+MBU0D)(M":(7`=`B)P_9"90%T,(M,)"2+06R+ED0&``#'1"0(`0```(E4)`2)
+M#"3_T+L`````A<!T"8N>1`8``(UV`(M#"(L3B50D"(E\)`2)!"3H_/___P,[
MBT,$@\,0A<`/A4\"``#KV3P"#X4)`@``#[9/0(M'.(E$)$0/ME0D1P^V1"1$
MP>`8"<(/MD0D1<'@$`G"#[9$)$;!X`B)TPG#@^%_@/EQ=C;&1"0I`(/[`78+
M#[9'08/@#XA$)"G&1"0J`(/[`G8(#[970HA4)"J#^P-V7`^V3T.(3"0KZU?&
M1"0I`(/[`G8+#[9'0H/@#XA$)"G&1"0J`,9$)"L`@_L'=C,/MD='@\`(.<-V
M`HG#QD0D*@"#^PQV"`^V5TR(5"0J@_L-=@H/MD]-B$PD*^L%QD0D*P")Z`.&
-MT`4``(L`@'@<`'1#A=MT/\9`%"")Z`.&T`4``(L`#[9`'#C8<P,/MMB)Z`.&
-MT`4``(L`BU`XA=)T(XU'0(E<)`B)1"0$B10DZ/S____K#HGH`X;0!0``BP#&
-M0!0B@'PD*01U#HGH`X;0!0``BP#&0!0"BT0D(#EP&`^$_0```(-\)"0`#X3R
+MS`4``(L`@'@<`'1#A=MT/\9`%"")Z`.&S`4``(L`#[9`'#C8<P,/MMB)Z`.&
+MS`4``(L`BU`XA=)T(XU'0(E<)`B)1"0$B10DZ/S____K#HGH`X;,!0``BP#&
+M0!0B@'PD*01U#HGH`X;,!0``BP#&0!0"BT0D(#EP&`^$_0```(-\)"0`#X3R
M````]D!F$'1&#[9',XM4)"2(0DKV0F4"=#6+3"0@#[91'(G8.--V`HG0A,!T
M(8M<)"2+2V"%R706#[;`C5=`B40D"(E4)`2)#"3H_/___X!\)"D+=UD/MD0D
-M*?\DA;@2``"+?"0DQD=F`>F&````@'PD*@1U$8!\)"L"=0J+1"0DQD!F$>MN
+M*?\DA5@(``"+?"0DQD=F`>F&````@'PD*@1U$8!\)"L"=0J+1"0DQD!F$>MN
MBU0D),9"9@+K9(M,)"3&0680ZUJ+7"0DQD-F"^M0BWPD),9'9@;K1HM$)"3&
-M0&8-ZSP\*'4:#[9#3X/H`8A#3HGH`X;0!0``BP#&0!2!ZQX\"'4,QP0D$"<`
-M`.C\____B>@#AM`%``"+`,9`%"&#Q$Q;7E]=PXUT)@!55U93@>R<````BZPD
-ML`````^WA98+``!FB40D?HM%`(N`0`$``*,`````9B7_#V:)A98+``!F.T0D
-M?G5NBT4`BXA0`0``B0T`````BT4`B8A0`0``N`````#WP0#__P`/A#H)``")
-M3"0$QP0DY`$``.C\____BY0DL````(D4).C\____N`$```#I$0D``)"+10"+
-M@$`!``"C`````&8E_P]FB866"P``ZQ6-C?````")3"14C9U`"0``B5PD4)"+
-MA;`*``"+`*,`````#[>-E@L``"7_#P``#[?1.=!UL&:!^?\/#X45"```Z2((
-M``"+M6@*``!F@T0D?@$/MWPD?F8[O9H+```9P"''9HE\)'Z+E;`*``"#P@0/
-MM\>+%(*)U\'O$/?'"`````^$KP```(M%`(N04`$``(D5`````(M%`(F04`$`
-M`/?"`/__`'1A@'TK`'1;]L8!=3*^`````/?"```!`'0]ZR.0C70F``^WQHU(
-M"+L!````B=_3YX7Z=1"-2!#3XX7:=0?K&+X`````#[?&:\!<C9P%3`$``(7;
-M=2+K#(/&`0^V12MF.?!WOHN$)+````")!"3H_/___^DZ!P``BY0DL````(D4
-M).C\____B$,+Z2,'``"-=@")T6:!X?\/9HE,)$X/M]F)7"1$:<.P!```BTP&
-M((M<!B2)C"2`````B9PDA````(MT)$3!Y@*+A=`%```!\(L`B40D>(7`#X7$
-M`0``B4PD$(E<)!2)5"0,BUPD1(E<)`B)7"0$QP0DF`8``.C\____9H-]7``/
-MA*4&``#&A"2+``````^VO"2+````C02]`````(E$)%@#A=`%``"+$(72#X1(
-M`0``:?>P!````[5H"@``BYT@"@``#[9"%8E$)`R)?"0(B50D!,<$)/\!``#H
-M_/___XM$)%@#A=`%``"+`(D$).C\____BX8L!```BY8H!```BXXD!```B[8@
-M!```B40D%(E4)!")3"0,B70D"(E\)`3'!"34!@``Z/S___^)^,'@!@'#BU,T
-MB50D2(M3,(M++(MS*(M[)(M#((E$)%R+0QR)1"1@BT,8B40D9(M#%(E$)&B+
-M0Q")1"1LBT,,B80DE````(M#"(F$))````"+0P2)A"2,````BQN+1"1(B40D
-M.(E4)#2)3"0PB70D+(E\)"B+5"1<B50D)(M,)&")3"0@BWPD9(E\)!R+1"1H
-MB40D&(M4)&R)5"04BXPDE````(E,)!"+O"20````B7PD#(N$)(P```")1"0(
-MB5PD!,<$)/P&``#H_/___X"$)(L````!#[:$)(L```!F.T5<#X,8!0``Z7;^
-M__^-=@#WQR`````/A(<!``"+5"1X@'H4@0^%5P$``,9"%"$/MT(>P>`"`X70
-M!0``QP``````#[=*'HG(9L'H!0^WP(/A'[H!````B=/3XXG9]]$AC(74!0``
-MBWPD>`^W3QZ)R&;!Z`4/M\"#X1_3XO?2(52%8`^W1QZ)1"0$BT0D4(D$).C\
-M____@W]4`'01B?B#P%2)1"0$B2PDZ/S___^+3"1X#[=1$&:!^H4`#X?"````
-M#[?"#[:$!;P$```\_P^$KP```&:#^G]W&P^VP&G`*`$```.%?`4``(M`+(!X
-M!/\/E<#K5XM<)'@/MT,09CV!`'<C#[?`#[:$*+P$``!IP!0-```#A;0%``"+
-M0`B`>`3_#Y7`ZR:+?"1X#[='$`^VA"B\!```:<"P`````X68!0``BT!4@'@$
-M_P^5P(3`=#.+1"1XB40D!(DL).C\____C97H````BX7H````BTPD>(E(!(D!
-MB5$$B8WH````Z9\#``"+7"14BU,$BT0D>(/`"(E#!(M\)'B)7PB)4`2)`NE]
-M`P``#[=$)$YFP>@%#[?`B40D<`^W7"1.B=F#X1^X`0```-/@B40D=(M4)'"%
-M1)5@#X5*`P``B?`#A=`%``"+``^W4!!F@?J%``^'GP````^WP@^VA`6\!```
-M//\/A(P```!F@_I_=Q@/ML!IP"@!```#A7P%``"+0"P/MD`$ZUV)\`.%T`4`
-M`(L`#[=`$&8]@0!W(`^WP`^VA"B\!```:<`4#0```X6T!0``BT`(#[9`!.LI
-MB?`#A=`%``"+``^W0!`/MH0HO`0``&G`L`````.%F`4``(M`5`^V0`0\_W0-
-M#[;`@+P%0@4``/]U.XM<)'2+3"1PA5R-8`^%@`(``(M\)'C&1Q0&B3PDZ/S_
-M___'1"0(`````(E\)`2)+"3H_/___^E7`@``#[:$!4(%``!KP%R-A`5,`0``
-MBY0DA`````N4)(````!T'O?'`@```'46QX0D@`````````#'A"2$````````
-M`/9`!@(/A%D!``"+E"2`````BXPDA````(E4)`B)3"0,B5PD!(D$).C\____
-MBUPD=(M,)'"%7(U@#X79`0``BWPD>(!_%($/A8L````/MT<>P>`"`X70!0``
-MQP``````#[=/'HG*9L'J!0^WTH/A'[C^____T\`AA)74!0``#[=''HE$)`2+
-M1"10B00DZ/S___^)?"0$B2PDZ/S___^#?U0`=!&)^(/`5(E$)`2)+"3H_/__
-M_XV5Z````(N%Z````(M,)'B)2`2)`8E1!(F-Z````.E``0``BX7P````.T0D
-M5'1/NP````"#PP&+`#E$)%1U]83;=#N^`````(M\)%2)/"3H_/___XU(^(M7
-M!(E'!(DXB5`$B0([3"1X=06^`0```(#K`774B?"$P`^%Y0```(M,)%2+402+
-M1"1X@\`(B4$$BUPD>(E+"(E0!(D"BT0D=(M\)'`)A+V@````Z;0```"+E"2`
-M````BXPDA````(E4)`B)3"0,B5PD!(D$).C\____BX7P````.T0D5'1/NP``
-M``"#PP&+`#E$)%1U]83;=#N^`````(M,)%2)#"3H_/___XU(^(M\)%2+5P2)
-M1P2).(E0!(D".TPD>'4%O@$```"`ZP%UT(GPA,!U-XM4)'B`>A2!="V+3"14
-MBU$$BT0D>(/`"(E!!(M<)'B)2PB)4`2)`HM$)'2+?"1P"82]H````)`/MU0D
-M?F8YE98+```/A=[W__]F@;V6"P``_P]T(8N%L`H``(L`HP`````E_P\```^W
-ME98+```YT`^%@O?__XV%\````#F%\````'1'B<:)-"3H_/___X/H"`^W2!Z)
-MRV;!ZP4/M]N#X1^Z_O___]/"(92=H````,=$)`@`````B40D!(DL).C\____
-M.;7P````=;N)+"3H_/___[@!````@<2<````6UY?7<.0C70F`(/L'(E<)`R)
-M="00B7PD%(EL)!B+1"0@BYA(!0``BT,$BRB)+0````#WQ0```)!T:(M#!(DH
-MZV&!P\P,``"+`XN04`$``(D5`````(L#B9!0`0``A=)T-_?"````$'09BP/'
-M@%`!```````0BP.+@%`!``"C`````(L#QX!0`0```0```(D<).C\____`<>#
-MQ@&#_@)UH>L,OP````"^`````.N9B?B$P`^5P(7M#Y7""=`/ML"+7"0,BW0D
-M$(M\)!2+;"08@\0<PXVT)@````!55U93@^PLBW0D0(L&BX!0`0``B40D%*,`
-M````BP:+5"04B9!0`0``]T0D%`#__P`/A+$'``"`?BL`#X2G!P``QD0D*P`/
-MMFPD*XU-"+@!````B<+3XH54)!1U#XU-$-/@A40D%`^$:0<``(!\)"L#=AZ+
-M!@6``0``C03HBP"C`````,'H$X/@`>L<D(UT)@"+!@6``0``C03HBP"C````
-M`,'H$X/@`83`=!N)-"3H_/___XGHP>`&C02H@8P&Q`L`````"`"+%H!\)"L#
-M=A6-A.J``0``BP"C`````"4```$`ZQ.-A.J``0``BP"C`````"4```$`A<!T
-M*X!\)"L#=A*-A.J``0``QP````$`Z?T&``"-A.J``0``QP````$`Z>L&``"`
-M?CD!#X77!0``@'PD*P-V&8L&!8`!``"-!.B+`*,`````@^`!ZQ>-=@"+!@6`
-M`0``C03HBP"C`````(/@`83`#X1D`0``B>C!X`:-'*B-A![("P``BU84B40D
-M!(D4).C\____BX0>I`L``(7`=!V+4"B%TG06]D(R`G40B00DZ/S___^$P`^%
-M'@$``(GHP>`&C02HBX0&I`L``(7`#X2'````B40D)(!X"@`/A*4```#&1"0C
-M`(G'@\<XB3PDZ/S___^)PXM'!(E?!(D[B4,$B1CV0R@"=3V+4R"%TG0>BX9(
-M!0``B50D"(E$)`3'!"0%````Z/S___^`2R@"B5PD",=$)`0&````BTPD)(D,
-M).C\____@$0D(P$/MD0D(XM4)"0X0@IV+NN1#[9$)"O'1"0(`0```(E$)`2)
-M-"3H_/___\<$)*"&`0#H_/___[H`+3$!ZP6Z0$M,`(GHP>`&C1RHC0PSB9'(
-M"P``QX'0"P``P%8"``^V1"0KB<+!X@:-A(*0"P``C40&#(F!U`L``(V$'L@+
-M``"+5A2)1"0$B10DZ/S___^-=@"`?"0K`W8OC13M`````(L&!8`!```!T(L`
-MHP````"+!@6``0```<*+`J,`````P>@'@^`!ZRV-%.T`````BP8%@`$```'0
-MBP"C`````(L&!8`!```!PHL"HP````#!Z`>#X`&$P'1;@'PD*P-V*HT,[0``
-M``"+!@6$`0```<B+`*,`````BQ:!PH0!```!T0T```$`B0'K,8T,[0````"+
-M!@6$`0```<B+`*,`````BQ:!PH0!```!T0T```$`B0'K((!\)"L#=AF+!@6`
-M`0``C03HBP"C`````,'H$H/@`>L7BP8%@`$``(T$Z(L`HP````#!Z!*#X`&$
-MP`^$WP$``(!\)"L#=BJ-#.T`````BP8%@`$```'(BP"C``````T```0`BQ:!
-MPH`!```!T8D!ZRB-#.T`````BP8%@`$```'(BP"C``````T```0`BQ:!PH`!
-M```!T8D!B>C!X`:-!*B+A`:D"P``A<!T#8G%@W@H`'5_Z68!``"`?"0K`Y!V
-M.8T4[0````"+!@6``0```="+"(D-`````(L&!8`!``"-!`*)"(L&!8`!```!
-MPHL"HP````#I7`,``(T4[0````"+!@6``0```="+"(D-`````(L&!8`!``"-
-M!`*)"(L&!8`!```!PHL"HP````#I(P,``(M`*`^W2#(/M]'VQ@$/A=D```")
-MQ_;"`@^$S@```(G(@^#]9HE',HU'<(M6%(E$)`2)%"3H_/___\9$)"L`@'\?
-M``^$?0```,9$)"L`#[9$)"N+7(<\A=MT7(M3((72=!Z+AD@%``")5"0(B40D
-M!,<$)`4```#H_/___X!+*`*)7"0(QT0D!`8```")+"3H_/___X![3P!T'8UV
-M`(DT).C\____QP0D`0```.C\____@'M/`'7F@$0D*P$/MDPD*SA/'W>(QT=P
-M0$M,`,='>`````")?WR-1W"+5A2)1"0$B10DZ/S___^-="8`@'PD*P-V'HL&
-M!8`!```/ME0D*XT4T(L"HP````#!Z`B#X`'K'(L&!8`!```/ME0D*XT4T(L"
-MHP````#!Z`B#X`&$P`^$#@$``(!\)"L#=AZ+!@6``0``#[94)"N-%-"+`J,`
-M````@_`!@^`!ZQR+!@6``0``#[94)"N-%-"+`J,`````@_`!@^`!A,`/A,4`
-M```/MD0D*XG"P>(&C82"D`L``(T$!HU0#(E4)!R+4@B%T@^$GP```(E4)!B#
-MP#B+5A2)1"0$B10DZ/S___^+1"08@'@*`'14O0````")QX/'.(D\).C\____
-MB<.+1P2)7P2).XE#!(D8BU,@A=)T'HN&2`4``(E4)`B)1"0$QP0D!0```.C\
-M____@$LH`H/%`8GJBTPD&#A1"G>VBT0D',=`+("$'@#'0#0`````B4`XBT0D
-M'(/`+(M6%(E$)`2)%"3H_/___X!\)"L#=F0/MEPD*\'C`XL&!8`!```!V(L0
-MB14`````BP8%@`$``(T$`XD0BP8%@`$``(T$`XL`HP````"+!@4P`@``C00#
-MQP``````QP0D$"<``.C\____BP8%-`(```'#BP.C`````.MB#[9<)"O!XP.+
-M!@6``0```=B+$(D5`````(L&!8`!``"-!`.)$(L&!8`!``"-!`.+`*,`````
-MBP8%4`(``(T$`\<``````,<$)!`G``#H_/___XL&!50"```!PXL#HP````"`
-M1"0K`0^V5"0K.%8K#X=>^/__BP:+@%`!``")1"04HP````"+!HM,)!2)B%`!
-M``#WP0#__P!T'>D7^/__B>C!X`:-!*B!C`;$"P`````!`.G]^/__N`````"#
-MQ"Q;7E]=PXUV`(V\)P````!55U93@^Q<BVPD<`^V1"1TB$0D,P^VT(E4)#2)
-MT,'@!HT$D`'HBXBD"P``B4PD/`^VN*(+``"+10"`?"0S`W8,QX!P`0``Q`$`
-M`.L*QX!P`0``J`$``(E$)%@%=`$``(E$)#B+7"18BX-T`0``HP````"+3"0T
-M@^$#NP<```#3XXG>"<:+1"18B;!T`0``QP0DZ`,``.C\____]],A\XM4)%B)
-MFG0!``"`?"0S`W90BTPD-(M<)%B-E(O0`0``BP*C`````(/("(D"B<O!XP.+
-M5"18C80:``(``,<`.````,<$)!`G``#H_/___XM,)%B-A!D$`@``QP``````
-MZU"+7"0TBT0D6(V4F-`!``"+`J,`````@\@(B0*+7"0TP>,#BU0D6(V$&@`"
-M``#'`#@```#'!"00)P``Z/S___^+3"18C809!`(``,<``````(-\)#P`#X1F
-M"```@'TK`'0RNP`````/MLN+5"0\#[9""=/XJ`%T%,=$)`@!````B4PD!(DL
-M).C\____@\,!.%TK=].+3"0\]D$&`71MB4PD!(DL).C\____BUPD-(E<)`2)
-M+"3H_/___XG8P>`&C028C10HBX+`"P``J0``$`!T"R7__^__B8+`"P``BT0D
-M/(E$)`2)+"3H_/___XM$)#3!X`:+5"0TC020QX0%I`L```````#IMP<``(M,
-M)#R`>30`=!J+A00*``")3"0$B00DZ/S___^+7"0\@&LT`;C^____#[9,)#33
-MP(G[(,.(7"1##X22`@``BT0D-(E$)`2)+"3H_/___XM$)#3!X`:+5"0TC020
-MC10HBX+`"P``J0``$`!T"R7__^__B8+`"P``#[9,)$.+7"0\B$L)@'TK``^$
-MK@$``,=$)$P`````#[;!B40D((M4)%B!P@`"``")5"0<#[9,)$R(3"13#[;Y
-MBT0D((GYT_BH`0^$/@$``(T<O0````")7"0LB?C!X`8!V`^V5"1#B)0%H@L`
-M`(!\)%,##X:-````C1S]`````(M$)!P!V,<`.````,<$)!`G``#H_/___XM,
-M)%B-A!D$`@``BUPD((D8QX%P`0``Q`$``(M4)#B+`J,`````B?F#X0.[!P``
-M`-/CB=X)QHDRQP0DZ`,``.C\____]],A\XM,)#B)&8M<)%B+1"0LC90#T`$`
-M`(L"HP````"#R`B)`NF(````C1S]`````(M$)!P!V,<`.````,<$)!`G``#H
-M_/___XM4)%B-A!H$`@``BTPD((D(QX)P`0``J`$``(M<)#B+`Z,`````B?F#
-MX0.[!P```-/CB=X)QHM$)#B),,<$).@#``#H_/____?3(=Z+5"0XB3*+3"18
-MC92YT`$``(L"HP````"#R`B)`H-$)$P!#[9$)%.#P`$X12MV)>F/_O__B1PD
-MZ/S___^-<."+4P2)0P2)&(E0!(D"@WX,`'07ZPR^`````(M<)#R#PRR+1"0\
-M.5@L=<N%]G0XQD8R`(!]*P!T+KD`````N@````"+7"0\#[9#"=/XJ`%T#@^V
-MPHA,!D"`1C(!@\(!@\$!.$TK=]S'1"0(`````,=$)`2!````BT0D/(D$).C\
-M____BT0D-,'@!HM4)#2-!)#'A`6D"P```````(!]*P`/A<T#``#IYP0``,=$
-M)`@`````QT0D!`8```"+3"0\B0PDZ/S___^+7"0TB5PD!(DL).C\____B=C!
-MX`:-!)B-%"B+@L`+``"I```0`'0+)?__[_^)@L`+``"+1"0\@\`LBU0D/#E"
-M+`^$'@(``(E$)!2+3"04B0PDZ/S___^-6.")7"1$C5`(.5`(#X32`0``@\,H
-MB5PD&(M$)!B)!"3H_/___XU8^(![)0UU&HV0_````(M#+(L`BT`4B50D!(D$
-M).C\____BQ.+0P2)0@2)$(![3P!T&HDL).C\____QP0D`0```.C\____@'M/
-M`'7FBT,@A<`/A#H!``#'0&``````@'M/``^$I````&:#?5P`#X29````OP``
-M``"0C70F`(T$O0`````#A=`%``"+,(7V=&T/MT809CM#''5C9CV%`'==#[?`
-M@+PHO`0``/]T4(M5``^W1AYFP>@%#[?`C02%``,``(F"<`$``(M5``^W3AZ#
-MX1^X`0```-/@B8)T`0``QD84(<=$)`@`````B70D!(DL).C\____C;8`````
-M@\<!#[=%7#GX#X]Q____]D,H!'4?B2PDZ/S___^+0R#'1"0(`0```(E$)`2)
-M+"3H_/___XM#(`^V4`(/MD`!B50D"(E$)`3'!"2P`0``Z/S___^+0R"+E4@%
-M``")1"0(B50D!,<$)`$```#H_/___XM#((N52`4``(E$)`B)5"0$QP0D!@``
-M`.C\____QT,@`````(M4)#R`:@H!BTPD1(!I,`&)7"0$B2PDZ/S___^+1"08
-MBUPD1#E#*`^%-?[__XM4)#R`:AP!BTPD1(E,)`2)+"3H_/___XM$)!2+7"0\
-M.4,L#X7F_?__BT0D/(/`.(M4)#PY0C@/A`4!``"^`````(G'B3PDZ/S___^)
-MPX!X3P!T-HU&`8'^?Y:8`'8$B<;K)XG&B2PDZ/S____'!"0!````Z/S___^`
-M>T\`=`N#Q@&!_H&6F`!UVXM#((7`#X2,````QT!@`````/9#*`1U'XDL).C\
-M____BT,@QT0D"`$```")1"0$B2PDZ/S___^+0R`/ME`"#[9``8E4)`B)1"0$
-MQP0DL`$``.C\____BT,@BY5(!0``B40D"(E4)`3'!"0!````Z/S___^+0R"+
-ME4@%``")1"0(B50D!,<$)`8```#H_/___\=#(`````"+3"0\@&D*`8E<)`2)
-M+"3H_/___XM<)#PY>S@/A0+___^+1"0\B40D!(DL).C\____BT0D-,'@!HM4
-M)#2-!)#'A`6D"P```````.DI_/__QT0D2``````/MDPD0XE,)"B+7"18@</0
-M`0``B5PD)`^V?"1(B?@/ML")1"14BT0D*`^V3"14T_BH`74,B?LX7"0S#X7&
-M````B?@\`W9CBU0D6,>"<`$``,0!``"+3"0XBP&C`````(M,)%2#X0.-#$F[
-M!P```-/CB=X)QHM$)#B),,<$).@#``#H_/____?3(?.+5"0XB1J+3"14BUPD
-M)(T4BXL"HP````"#R`B)`NM=BT0D6,>`<`$``*@!``"+5"0XBP*C`````(M,
-M)%2#X0.-#$F[!P```-/CB=X)QHDRQP0DZ`,``.C\____]],AWHM,)#B),8M<
-M)%2+1"0DC128BP*C`````(/("(D"@T0D2`&-1P$X12L/AP#___^#Q%Q;7E]=
-MPY"-M"8`````55=64X/L'(M\)#"+="0T#[9O*XGHA,!T+`^V5@F[`````/;"
-M`703ZQR-M"8`````B=")V=/XJ`%U$(/#`8GH.,-U[>L%NP````#V1@@"=0B-
-M1C@Y1CAU:HDT).C\____A,!T3XD\).C\____B<&%P'10BU8\B48\C48XB0&)
-M402)"H!&"@&)<2S&020%QD$E`,9!30_'1"0,`0```,=$)`@!````B4PD!(DT
-M).C\____ZP\/ML.)1"0$B3PDZ/S___^#Q!Q;7E]=PXVV`````%575E.#[`R+
-M;"0@#[9\)"2)^`^VP(E$)`B)QL'F`KL`````QP0D$"<``.C\____B?J`^@-V
-M&HM%``70`0```?"+`*,`````P>@4@^`!ZQF0BT4`!=`!``"-!`:+`*,`````
-MP>@4@^`!A,!U"H/#`6:!^RP!=:V+1"0(B40D!(DL).C\____B2PDZ/S___^+
-M1"0(P>`&BU0D"(T$D`'H]H"A"P```702BX"D"P``B40D!(DL).C\____@\0,
-M6UY?7</K#9"0D)"0D)"0D)"0D)!55U93@^P<#[9$)#2(1"0:BWPD,`^V\(GP
-MP>`&C02PBZP'I`L``(7M#X2J`0``N/[___^)\=/`A$4)#X68`0``C44L.44L
-M=0V`?0H`=2F)]ND#`P``#[9$)!J)PL'B!HV$@I`+``"-1`<,B00DZ/S____I
-MX0(``,9$)!L`C74XD(DT).C\____B<.+1@2)7@2),XE#!(D8@'LE``^%'P$`
-M``^W0QR#O(>\`@```'41@WL@``^$Z````(VT)@`````/MT,<BX2'O`(``(-X
-M<``/A*T```#&@[0`````#[93)(G0@^`&@_@&=3;VP@%T,<9#)@7&0R<$#[9#
-M38M3,(M++(E<)`R)1"0(B50D!(D,).C\____Z:8```"-M@`````/ME,DB="#
-MX`:#^`1U(O;"`70=QD,F`\9#)P2)7"0$B3PDZ/S____K=XVT)@`````/ME,D
-MB="#X`:#^`9U8O;"`75=QD,G!L9#)@5FQX.4``````")7"0$B3PDZ/S____K
-M/HM#((N72`4``(E$)`B)5"0$QP0D!````.C\____ZQ\/MT,<BY=(!0``B40D
-M"(E4)`3'!"0"````Z/S___^0@$0D&P$/MD0D&SA%"@^&A0$``.FH_O__C2RU
-M`````+L`````QP0D$"<``.C\____@'PD&@-V&8L'!=`!```!Z(L`HP````#!
-MZ!2#X`'K%Y"+!P70`0```>B+`*,`````P>@4@^`!A,!U"H/#`6:!^RP!=;")
-M="0$B3PDZ/S___^)/"3H_/___XGPP>`&C02PB[0'I`L``(7V#X3Y````@'\K
-M`'0TNP````"-M@`````/MLL/MD8)T_BH`704QT0D"`````")3"0$B3PDZ/S_
-M__^#PP$X7RMWUP^V1"0:B<+!X@:-A(*0"P``C40'#(E&&(U&+#E&+'4JC48X
-M.48X=2+K<8D<).C\____C6C@BU,$B4,$B1B)4`2)`H-]#`!T%.L-O0````"-
-M7BR0C70F`#E>+'7.A>UT7\9%,@"`?RL`=%6Z`````+L`````C78`#[9&"8G1
-MT_BH`70.#[;#B%0%0(!%,@&#PP&#P@$X5RMV)NO<]D8&`70.B70D!(D\).C\
-M____ZQ#'1"0$`````(DT).C\____@\0<6UY?7<-55U93@^P,BWPD((L?BV\H
-M#[9S*XGPA,!T5XV#G`L``+D`````.?AU'NM&D(UT)@`/ML&)PL'B!HV$@I`+
-M``"-1`,,.?AT"8/!`8GP.,%UX(#Y`W8ABP,%T`$```^VT8T4D(L"HP````#!
-MZ!2#X`'K'[D`````BP,%T`$```^VT8T4D(L"HP````#!Z!2#X`&$P'05#[;!
-MB6PD"(E$)`2)'"3H_/___^L/#[;!B40D!(D<).C\____@\0,6UY?7<-55U93
-M@^P<BUPD-(M$)#")1"04BWA4BS?V1P@0=`3&0#4&BU0D%`^V0C4\`71U/`%R
-M&3P$#X26````/`:-="8`#X4Z`P``Z:<!``"+3"04QD$U`8E,)`2)-"3H_/__
-M_\9#%(&`3P@(@WM4`'0/C4-4B40D!(DT).C\____C9;H````BX;H````B5@$
-MB0.)4P2)GN@```")-"3H_/___^G=`@``@&<(]XM$)!2`0#8!QD`U`,9#%`*)
-M7"0$B30DZ/S___^)-"3H_/___^FP`@``#[9'"(/@]X/($(A'"(M,)!2+D9@`
-M``"-0@&)@9@```"#^@(/A_D```"#>U0`=`^-0U2)1"0$B30DZ/S___^-EN@`
-M``"+AN@```")6`2)`XE3!(F>Z````(M$)!2`>"8`=0N`?PH`=2+II````,=$
-M)`@`````QT0D!`(```")/"3H_/___^DF`@``QD0D&P"-;SB)+"3H_/___XG#
-MBT4$B5T$B2N)0P2)&(M3((72=!Z+AD@%``")5"0(B40D!,<$)`4```#H_/__
-M_X!+*`*)7"0(QT0D!`8```")/"3H_/___X![3P!T&HDT).C\____QP0D`0``
-M`.C\____@'M/`'7F@$0D&P$/ME0D&SA7"G>!BTPD%(D,).C\____Z8X!``"`
-M9PCWBT0D%,>`F`````````"#>U0`=`^-0U2)1"0$B30DZ/S___^-EN@```"+
-MAN@```")6`2)`XE3!(F>Z````,=$)`@`````QT0D!`8```")/"3H_/___XU'
-M.#E'.`^$E@```(G%C;0F`````(DL).C\____B<.+0""%P'1GQT!@`````(DT
-M).C\____BT,@QT0D"`$```")1"0$B30DZ/S___^+0R"+ED@%``")1"0(B50D
-M!,<$)`$```#H_/___XM#((N62`4``(E$)`B)5"0$QP0D!@```.C\____QT,@
-M`````(E<)`2)-"3H_/___SEO.`^%<____XM4)!2)5"0$B30DZ/S____'1R@`
-M````BP:+D%@!``")%0````"%TG0(BP:)D%@!``#V1P8!=%R`?BL`="&Y````
-M`/9'"0%T#.L4#[9'"=/XJ`%U#X/!`3A.*W?NZP6Y``````^VV8E<)`2)-"3H
-M_/___XE\)`2)-"3H_/___XG8P>`&C1R8QX0>I`L```````")]H/$'%M>7UW#
-MD(VT)@````"#["R)7"0<B70D((E\)"2);"0HBWPD-(MT)#"+1BR)1"08BR@/
-MMT\>B<AFP>@%#[?8@^$?N`$```#3X(5$G6`/A>\#``"+50"-!)T``P``B8)P
-M`0``BT4`BY!T`0``B14`````QD<4(8M')"7___\`/>$!#P!U(8D\).C\____
-MQT0D"`````")?"0$B2PDZ/S____IG`,```^W3QZ#X1^X`0```-/@A<)T%HD\
-M).C\____B2PDZ/S___^-M@`````/MH:T````/`0/AV4#```/ML#_)(7H$@``
-MQH:T`````<=$)`@!````B7PD!(M4)!B)%"3H_/___^DW`P``QH:T`````L=$
-M)`@(````B7PD!(M$)!B)!"3H_/___^D3`P``QH:T`````XET)`C'1"0$(0``
-M`(M4)!B)%"3H_/___XM6,(72="T/MD9-QT0D$`````#'1"0,`0```(E$)`B)
-M5"0$BT0D&(D$).C\____Z<`"``"+5"08#[9""<=$)`@`````B40D!(DL).C\
-M____Z9\"``#&AK0````$@WXP`'1(B70D",=$)`0A````BT0D&(D$).C\____
-M#[9&38M6,,=$)!``````QT0D#`(```")1"0(B50D!(M4)!B)%"3H_/___^E*
-M`@``QT0D"`````#'1"0$(0```(M$)!B)!"3H_/___XM4)!@/MD()QT0D"`$`
-M``")1"0$B2PDZ/S____I#0(``(!^)O]T'8ET)`C'1"0$!@```(M$)!B)!"3H
-M_/___^GJ`0``B70D",=$)`0&````BU0D&(D4).C\____BTX@A<ET$HM1!(U"
-M`8E!!(/Z!0^&N0$``,9&)P'&1B8`@'Y/`'0AC;0F`````(DL).C\____QP0D
-M`0```.C\____@'Y/`'7F@WXP`(GV=!2+5@B+1@R)0@2)$(M&,(!H,`'K$XM6
-M-(72=`P/MD9-QT2"/`````"+%HM&!(E"!(D0BT0D&(!H"@&+EN0```"%TG0;
-M#[:&V0```,=$)`@!````B40D!(D4).C\____BU8PA=)T&`^V1DW'1"0(`0``
-M`(E$)`2)%"3H_/___XM&((7`#X2&````QT!@`````(DL).C\____BT8@QT0D
-M"`$```")1"0$B2PDZ/S___^+1B`/ME`"#[9``8E4)`B)1"0$QP0DL`$``.C\
-M____BT8@BY5(!0``B40D"(E4)`3'!"0!````Z/S___^+1B"+E4@%``")1"0(
-MB50D!,<$)`8```#H_/___\=&(`````")="0$B2PDZ/S___^+5"08@'H%_W1>
-MO@````"`>@H`=#B^`````(M<)!B#PSB-=@")'"3H_/___XM3!(E#!(D8B5`$
-MB0*`>";_=0Z#Q@&)\(M4)!@X0@IWUXGPBU0D&#A""G<0QD(%_XE4)`2)+"3H
-M_/___XM<)!R+="0@BWPD)(ML)"B#Q"S#D(VT)@````!55U93@>R,````B[PD
-MH````(M'5(E$)'B+*(N%L`H``(L`B40D?(E\)`2)+"3H_/___X!_-@%V!,9'
-M-02-7Q0Y7Q0/A+@!``")'"3H_/___XE$)'2+1Q2+5"1TB5`$B0*)6@2)5Q2%
-MT@^$G`,```^W<AZ+3"1XBT$8#[9`!`^V52D/MDTB#[9=(8ET)!2)1"00B50D
-M#(E,)`B)7"0$QP0D5`<``.C\____BT0D=`^W0!Z)1"18:?"P!````[5H"@``
-MBYT@"@``BU0D=(D4).C\____BXXL!```B4PD2(N6*`0``(N.)`0``(NV(`0`
-M`(M$)'0/MT`>B40D!(M$)$B)1"04B50D$(E,)`R)="0(QP0DA`<``.C\____
-MBU0D6,'B!@'3BTLTB4PD2(M3,(M++(MS*(M#)(E$)%R+0R")1"1@BT,<B40D
-M9(M#&(E$)&B+0Q2)1"1LBT,0B40D<(M##(F$)(@```"+0PB)A"2$````BT,$
-MB80D@````(L;BT0D2(E$)#B)5"0TB4PD,(ET)"R+5"1<B50D*(M,)&")3"0D
-MBT0D9(E$)""+5"1HB50D'(M,)&R)3"08BT0D<(E$)!2+E"2(````B50D$(N,
-M)(0```")3"0,BX0D@````(E$)`B)7"0$QP0D_`8``.C\____9H-]7`!U1NGE
-M`0``D(M4)'B+0A@/MD`$#[95*0^V32(/METAQT0D%/___P")1"00B50D#(E,
-M)`B)7"0$QP0D5`<``.C\____Z04"``"^`````(V-0`D``(E,)%"-A>@```")
-M1"1,C;0F``````^WQL'@`@.%T`4``(L8A=L/A&$!```/MT,09CE')`^%4P$`
-M``^WE98+```Y5"1\=$6#P@$/MX6:"P``.<(9P"'"BX6P"@``@\`$BP20J0``
-M"`!U'&8E_P]F.?!U$SE<)'1U$XDL).C\____Z74!```[5"1\=;L/MT,09CV%
-M`(GV#X?Q````#[?`@+P%O`0``/\/A.````"+5"1X@'HT``^%T@```/9"!@$/
-MA,@```"+50`/MT,>9L'H!0^WP(T$A0`#``")@G`!```/MTL>@^$?N@$```")
-MT-/@B<&+10")B'0!```/MT,>P>`"`X70!0``QP``````#[=+'HG(9L'H!0^W
-MP(E$)$B#X1^)T-/@B<'WT8M$)$@AC(74!0``#[=+'HG(9L'H!0^WP(/A']/B
-M]](A5(5@.5PD='0BBP.+4P2)4`2)`HN%Z````(E8!(D#BU0D3(E3!(F=Z```
-M``^W0QZ)1"0$BTPD4(D,).C\____@&\I`8/&`68Y=5P/AWS^__^+1"1X]D`&
-M`717BTPD=(L1BT$$B4($B1")3"0$B3PDZ/S____K.XM4)'B+0A@/MD`$#[95
-M*0^V32(/METAQT0D%/___P")1"00B50D#(E,)`B)7"0$QP0D5`<``.C\____
-M@<2,````6UY?7<-55U93@^QLBXPD@````(N4)(@```")5"1@BX0DC````(E$
-M)&2+`8E$)#P/MX0DA````,'@`HM<)#P#@]`%``"+.&:!?R3A`74W#[9')H/H
-M$3P!=RR+<2B)="1$QT0D0``````+5"1D=6^+1"1$QD`U`,=$)$``````ZUV0
-MC70F`(M<)#R+DWP%``"XV"8!`&:!?Q"%`'<6#[='$(MT)#P/MH0&O`0``&G`
-M*`$```'"B50D0,=$)$0`````BT0D8`M$)&1U$XM$)$#&@+0`````QT0D1```
-M``"`?Q2!=02`80CWBT0D8`M$)&0/A>````#&1Q0`]D=F(`^$J`4``(M'2(7`
-M#X2=!0``B</V0&4"="&+2%B%R70:BU<TA=)T$XM'((E$)`B)5"0$B0PDZ/S_
-M__^+3"0\BY%$"@``@<)`"```BW0D0`^V1D+!X`@!PHL"HP````")PL'J$(A3
-M4\'H&&:)0TB+D40*``"!PD0(```/MD9"P>`(`<*+$HD5``````^VPF:)0TP/
-MML9FB4-.B=#!Z!`/ML!FB4-0P>H8B%-2BY%$"@``@<),"```#[9&0L'@"`'"
-MBP*C``````^VP&:)0TKIW`0``(VV``````^W1QYIP+`$``"+5"0\`X)H"@``
-MB40D2(G%@<4@!```@'\4@'4*QD<4(8VV`````(-\)$``='*+7"1`@WL@``^%
-MP0```(MW((ET)%@/MD--B40D-(M!&`^V2`2+5"0\#[9:*0^V<B(/MD(AB40D
-M!(M$)&"+5"1DB40D'(E4)""+5"18B50D&(M$)#2)1"04B4PD$(E<)`R)="0(
-MQP0DM`<``.C\____ZUV#?"1$`'16BU<@B50D7(M!&`^V2`2+="0\#[9>*0^V
-M=B*+1"0\#[9`(8E$)`2+1"1@BU0D9(E$)!B)5"0<BU0D7(E4)!2)3"00B5PD
-M#(ET)`C'!"3P!P``Z/S___^+10R+50B+302+70`/MW<>B40D%(E4)!")3"0,
-MB5PD"(ET)`3'!"0L"```Z/S___^+3"1(]D$B`0^$Q````(U?/(E<)$R+=U2)
-M="14BT,$#[93`8E$)`B)5"0$QP0D#`(``.C\____@'\\``^$/P$``,9$)%,`
-MC70F``^V="13C01VP>`"BU0D3(M*"`'!B<.+5"14`UH(BT,(B40D.(L#BU,$
-MB40D*(E4)"R+:0B+602+"8M4)#B)5"0<BT0D*(M4)"R)1"04B50D&(EL)!")
-M3"0(B5PD#(ET)`3'!"1<"```Z/S___^`1"13`0^V5"13BTPD3#@1#X:S````
-MZ7C___^+7"1(@'LG``^)H`````^W5QZ)T&;!Z`4/M\`/M]*)1"0(B50D!,<$
-M)"@"``#H_/___XMT)#R+AN`%``"+EMP%``"+CM@%``"+GM0%``")1"00B50D
-M#(E,)`B)7"0$QP0D/P(``.C\____#[=''HE$)`3'!"1;`@``Z/S___^+%@^W
-M1QYFP>@%#[?`C02%``,``(F"<`$``(L6#[=/'H/A'[@!````T^")@G0!``!F
-M@7\DX0%U(@^V1R:#Z!$\`7<7BT0D1(D$).C\____Z?P!``"-M@`````/ME0D
-M8_;"`0^$P@$``(M')"7___\`/>$!#@`/A*\!``"+3"0\BY%$"@``@<)`"```
-MBUPD0`^V0T+!X`@!PHLRB34`````BY%$"@``@<)$"```#[9#0L'@"`'"BRJ)
-M+0````"+D40*``"!PD@(```/MD-"P>`(`<*+&HD=`````(N11`H``('"3`@`
-M`(M,)$`/MD%"P>`(`<*+`J,`````B40D$(E<)`R);"0(B70D!,<$)&P"``#H
-M_/____9'9B`/A,T```"+3TC&0680QD<4((GPP>@0B$%3B?#!Z!AFB4%(B=[!
-MY@B)Z`^VT(T$%F:)04R)WF:!Y@#_B>@/MM2-!!9FB4%.B=K!ZA#!X@B)Z,'H
-M$`^VP`'"9HE14(M<)#R+DT0*``"!PDP(``"+="1`#[9&0L'@"`'"BP*C````
-M``^VP&:)04H/MU%,#[=93@^W25`/M\")5"00B5PD#(E,)`B)1"0$QP0DB0(`
-M`.C\____BT0D/(N01`H``('"0`@```^V1D+!X`@!PL<"`````.MC9H%_).$!
-M=1T/MD<F@^@:/`%W$L<$))0(``#H_/___\9'%"'K/HE\)`2+5"0\B10DZ/S_
-M___K+(VV`````(32>2*+3"0\BP&+B%@!``")#0````"%R70,BUPD/(L#B8A8
-M`0``@\1L6UY?7<.)]E.#[`B+7"04BTPD$`^V0R0Y2QAU03P(=%8\*'12/*B0
-M=$T\B'1)/`IT13PJC70F`'0]/*IT.3R*=#6+@>@```")6`2)`XV!Z````(E#
-M!(F9Z````.L9BY'L````B9GL````C8'H````B0.)4P2)&HD,).C\____@\0(
-M6\.-="8`@^P,BT0D%(E$)`2+1"00B00DZ/S___^#Q`S#D(UT)@!3@^Q8BUPD
-M8(U$)$J)1"0TC40D3(E$)#"-1"1$B40D+(U$)$:)1"0HC40D4(E$)"2-1"12
-MB40D((U$)%.)1"0<C40D3HE$)!B-1"14B40D%(U$)$B)1"00C40D58E$)`R-
-M1"16B40D"(U$)%>)1"0$#[=#)(D$).C\____#[9$)%>)1"0(#[9$)%:)1"0$
-MC40D0(D$).C\____QT0D#`$````/MD0D5VG`*`$``(E$)`B+0Q")1"0$C8-D
-M!0``B00DZ/S____'1"0,`0````^V1"15:<"P````B40D"(M#$(E$)`2-@X`%
-M``")!"3H_/___\=$)`P!````#[9$)%9IP!0-``")1"0(BT,0B40D!(V#G`4`
-M`(D$).C\____QT0D#`$````/MT0D4,'@`HE$)`B+0Q")1"0$C8.X!0``B00D
-MZ/S____'1"0,`0````^W1"1(:\!PB40D"(M#$(E$)`2-@V0&``")!"3H_/__
-M_\=$)`P!````#[9$)%0/MU0D2`^OPHT$0,'@`HE$)`B+0Q")1"0$C8,4!@``
-MB00DZ/S____'1"0,`0```,=$)`@``@``BT,0B40D!(V#,`8``(D$).C\____
-M#[9$)%>)1"0,QT0D"``(``"+0Q")1"0$C8,,!P``B00DZ/S____'1"0,`0``
-M``^V1"13C02`P>`"B40D"(M#$(E$)`2-@YP&``")!"3H_/___\=$)`P!````
-MQT0D"*````"+0Q")1"0$C8.X!@``B00DZ/S____'1"0,`0````^V1"12:<"8
-M````B40D"(M#$(E$)`2-@]0&``")!"3H_/___\=$)`P!````#[=$)$Z-!$#!
-MX`.)1"0(BT,0B40D!(V#\`8``(D$).C\____QT0D#`$````/MT0D4`'`B40D
-M"(M#$(E$)`2-@R0)``")!"3H_/___\=$)`P!````#[9$)%<!P(E$)`B+0Q")
-M1"0$C8-,"0``B00DZ/S____'1"0,`0````^V1"15`<")1"0(BT,0B40D!(V#
-M=`D``(D$).C\____QT0D#`$````/MD0D5@'`B40D"(M#$(E$)`2-@YP)``")
-M!"3H_/___\=$)`P!````#[9#)@'`B40D"(M#$(E$)`2-@\0)``")!"3H_/__
-M_\=$)`P!````#[=$)$;!X`6)1"0(BT,0B40D!(V#@`8``(D$).C\____QT0D
-M#`$```"+1"1`B40D"(M#$(E$)`2-@^P)``")!"3H_/___\=$)!`!````QT0D
-M#$`````/MT0D4,'@!HE$)`B+0Q")1"0$C8,("@``B00DZ/S____'1"00`0``
-M`,=$)`P``0``QT0D"``9``"+0Q")1"0$C8,L"@``B00DZ/S____'1"00`0``
-M`,=$)`R`````#[=$)%!IP+`$``")1"0(BT,0B40D!(V#4`H``(D$).C\____
-MQT0D$`$```#'1"0,!`````^W1"1,P>`"B40D"(M#$(E$)`2-@W0*``")!"3H
-M_/___\=$)!`!````QT0D#`0````/MT0D2L'@`HE$)`B+0Q")1"0$C8.8"@``
-MB00DZ/S____'1"00`0```,=$)`P(````#[9$)%/!X`N)1"0(BT,0B40D!(V#
-MO`H``(D$).C\____QT0D$`$```#'1"0,"````,=$)`@```@`BT,0B40D!(V#
-MX`H``(D$).C\____QT0D$`$```#'1"0,"`````^W1"1.:<",`0``B40D"(M#
-M$(E$)`2!PP0+``")'"3H_/___[@`````@\186\.-=@"#["R)7"0<B70D((E\
-M)"2);"0HBVPD,(M%`(E$)!2-72R)'"3H_/___XG&C5#@B50D&(M$)!2)!"3H
-M_/___XG'BT4PB74PBU0D&(E:((E")(DPN`$```"%_P^$@````,9').'&1R4!
-MQD<F$(!/)P&+5"0TBX*<````B4=(BT=,B5`<B=`%D````(E'.,9'%<R+5"08
-M#[9",V:)1Q"+10")1QC'1R"0````BT0D-(E'-,=';/`-`@#'1"0$`````(U'
-M/(D$).C\____B7PD!(M4)!2)%"3H_/___[@`````BUPD'(MT)""+?"0DBVPD
-M*(/$+,.-M@````"-O"<`````55=64X/L'(MT)##'1"08`````(M4)!@/MH0R
-M0@4``#S_#X3,````#[;0:\)<C8P&3`$``(E,)!2`O`96`0````^$K0```+\`
-M````B40D$(VL!H0!``"-A`9``0``B40D#(DL).C\____B<.+1"00`?"+D(@!
-M``")F(@!``")*XE3!(D:BT,@A<!T'HE$)`B+AD@%``")1"0$QP0D!0```.C\
-M____@$LH`HE<)`C'1"0$`@```(M$)!2)!"3H_/___X![3P!T&HDT).C\____
-MQP0D`0```.C\____@'M/`'7F@\<!B?J+3"0,.%$6#X=N____@T0D&`&#?"08
-M!`^%$/___XDT).C\____@\0<6UY?7<.-M@````"-O"<`````55=64X/L?(N$
-M))````#&0#D`QD`X`,9`-P#&@+T,````B<*!PIP+``"X`````(GVQ@00`(/`
-M`3T0`0``=?*+A"20````!>@```"+E"20````B8+H````B8+L````B=`%\```
-M`(F"\````(F"]````('"^````(E4)$2+C"20````B9'X````B9'\````B<^!
-MQP`!``")N0`!``")N00!``"!P0@!``")3"1,BYPDD````(F+"`$``(F+#`$`
-M`('#$`$``(E<)%"+M"20````B9X0`0``B9X4`0``B?6!Q2`!``")KB`!``")
-MKB0!``"!QB@!``")="1(BX0DD````(FP*`$``(FP+`$```48`0``B40D5(N4
-M))````")@A@!``")@AP!``"-1"1VB40D-(U$)'B)1"0PC40D:(E$)"R-1"1N
-MB40D*(U$)'J)1"0DC40D<(E$)""-1"1QB40D'(U$)&R)1"08C40D<XE$)!2-
-M1"1JB40D$(U$)'*)1"0,C40D=(E$)`B-1"1UB40D!`^W0B2)!"3H_/___P^V
-M1"1UBXPDD````(A!+@^V1"1TB$$O#[9$)'*(@>4````/MT0D>F:)05P/MT0D
-M>&:)@9@+```/MT0D=H/H`6:)@9H+```/MT0D:F:)03H/MT$D9CV`D70*9CV`
-ME`^%X0H``(N<))````#&0S4$QD,K!,9#-D#&0S0`QH/B````"<9#+`")V`5D
-M!0``B00DZ/S___^)PHF#?`4```^V1"1U:<`H`0``A<!T"\8"`(/"`8/H`77U
-MBX0DD`````6`!0``B00DZ/S___^)PHNT))````")AI@%```/MD0D<FG`L```
-M`(7`=`O&`@"#P@&#Z`%U]8N$))`````%G`4``(D$).C\____B<*+A"20````
-MB9"T!0``#[9$)'1IP!0-``"%P'0+Q@(`@\(!@^@!=?6+A"20````!;@%``")
-M!"3H_/___XG"BXPDD````(F!T`4```^W1"1ZP>`"A<!T"\8"`(/"`8/H`77U
-MBX0DD`````4P!@``B00DZ/S___^+G"20````B8-(!@``B=@%%`8``(D$).C\
-M____B<.+M"20````B88L!@``B?`%9`8``(D$).C\____B<*)AGP&``!F@WPD
-M:@!T1KD`````B5I$#[9$)'.(0CR+M"20````BX;\````B9;\````BW0D1(DR
-MB4($B1`/MD0D<XT$0(T<@X/"<(/!`68Y3"1J=[^+A"20````!8`&``")!"3H
-M_/___XG"BX0DD````(F0F`8``&:#?"1N`'0PN0````#&0@@`BYPDD````(N#
-M!`$``(F3!`$``(DZB4($B1"#PB"#P0%F.4PD;G?5BX0DD`````6<!@``B00D
-MZ/S___^)PHNT))````")AK0&``"`?"1Q`'0SN0````"+G"20````BX,,`0``
-MB9,,`0``BW0D3(DRB4($B1"#PA2#P0$/MD0D<68YR'?2BX0DD`````6X!@``
-MB00DZ/S___^)PHN$))````")D-`&``"-BJ````"+G"20````BX,4`0``B9,4
-M`0``BW0D4(DRB4($B1"#PA0YRG7;B=@%U`8``(D$).C\____B<*)@^P&``"`
-M?"1P`'0RN0````"+G"20````BX,D`0``B9,D`0``B2J)0@2)$('"F````(/!
-M`0^V1"1P9CG(=].+A"20````!?`&``")!"3H_/___XG"B[0DD````(F&"`<`
-M`&:#?"1L`'0PN0````"+G"20````BX,<`0``B9,<`0``BW0D5(DRB4($B1"#
-MPAB#P0%F.4PD;'?5@'PD=0!T3[L`````B[0DD````('&#`<``(DT).C\____
-M#[?3BXPDD````(F$D20'``"+D2P!``")@2P!``"+3"1(B0B)4`2)`H/#`0^V
-M1"1U9CG8=\.+A"20````!20)``")!"3H_/___XN<))````")@SP)``")@T`)
-M```/MT0D>F:)@T8)```/M\")1"0$B=@%0`D``(D$).C\____B=@%3`D``(D$
-M).C\____B8-D"0``B8-H"0``#[9$)'5FB8-N"0``#[?`B40D!(G8!6@)``")
-M!"3H_/___XG8!70)``")!"3H_/___XF#C`D``(F#D`D```^V1"1R9HF#E@D`
-M``^WP(E$)`2)V`60"0``B00DZ/S___^)V`6<"0``B00DZ/S___^)@[0)``")
-M@[@)```/MD0D=&:)@[X)```/M\")1"0$B=@%N`D``(D$).C\____B=@%Q`D`
-M`(D$).C\____B8/<"0``B8/@"0``#[9#)F:)@^8)```/MD,FB40D!(G8!>`)
-M``")!"3H_/___XG8!>P)``")!"3H_/___XG"B8,$"@``#[9$)'1IP'0$``")
-MP8'!=$4``'0/B=")RL8``(/``8/J`77UB[0DD````(N&!`H``(D(BY8$"@``
-M#[9$)'2(0@0/MD0D=(E$)`B)3"0$BX8$"@``B00DZ/S___^]`````(!^)@`/
-MA*<```"_``````^WWVO;7(N$))````"-K!A,`0``C00#C;!``0``B?J(5A#&
-M1A$`BXPDD````(F(3`$``,9&%@#&@(`!````QH!H`0```,>`I`$```````"-
-ME!E@`0``C4H,B8AL`0``B8AP`0``@\(8B9!X`0``B9!\`0``BXPDD````(V4
-M&80!``")D(0!``")D(@!``#&1A("@\<!#[9!)F8Y^`^'7O___XN<))````#&
-M0S0`QH-"!0``_\:#0P4``/_&@T0%``#_QH-%!0``_X!\)'4`#X2#````NP``
-M```/M\MIT2@!``"+M"20````BX9\!0``QD00)P&+AGP%``#&1`(F`(N&?`4`
-M`,9$`DS_BX9\!0``QD0"0O^+AGP%``!FQX0"E```````QX2.O`(```````")
-MT0..?`4``(U!$(E!$`.6?`4``(U"$(E"%(/#`0^V1"1U9CG8=X*+A"20````
-M9L>`X```````N`````"+E"20````QH00O`0``/^#P`$]A@```'7G@'PD=``/
-MA*T```"[``````^WPVG`%`T``(N,))````"+D;0%``#&1`(P`(N1M`4``,9$
-M$#$`BY&T!0``QT00#`````")P8NT))`````#CK0%``"-41")41")P0..M`4`
-M`(U1$(E1%(G!`XZT!0``C5$8B5$8B<$#CK0%``"-41B)41R+EK0%``");!`(
-MB<$#CK0%``"-42B)42@#AK0%``"-4"B)4"R#PP$/MD0D=&8YV`^'6/___XN$
-M))````#&@.,```"`@'PD<@!T?;L`````#[?3:=*P````BXPDD````(N!F`4`
-M`&;'1!`R!`"+@9@%``#&1`(F`(N!F`4``,9$`BC_BX&8!0``QD0"-/^)T8NT
-M))`````#CI@%``"-012)012)T0..F`4``(U!%(E!&(N&F`4``(EL`E2#PP$/
-MMD0D<F8YV'>(BX0DD````,:`Y````(*+A"20````!20*``")1"0$BX0DD```
-M``4("@``B00DZ/S___^+E"20````B8(@"@``B=`%2`H``(E$)`2-0.2)!"3H
-M_/___XN,))````")@40*``")R`5L"@``B40D!(U`Y(D$).C\____BYPDD```
-M`(F#:`H``(G8!9`*``")1"0$C4#DB00DZ/S___^)@XP*``")V`6T"@``B40D
-M!(U`Y(D$).C\____B8.P"@``B=@%V`H``(E$)`2-0.2)!"3H_/___XG!B8/4
-M"@``B[0DD````(N&V`H``(N6W`H``(!\)'$`=%J)PXG6OP````")S2G%BT0D
-M3(D$).C\____C50=`(E0"(E8#(EP$(N,))````"+D0P!``")@0P!``"+3"1,
-MB0B)4`2)`H'#``@``(/6`(/'`0^V1"1Q9CGX=[.+A"20````!?P*``")1"0$
-MBX0DD`````7@"@``B00DZ/S___^)1"18BYPDD````(F#^`H``(N$))````"+
-MF/P*``"+L``+``"_`````+T`````BU0D4(D4).C\____BU0D6`'ZB5`(B5@,
-MB7`0BXPDD````(N1%`$``(F!%`$``(M,)%")"(E0!(D"@<,```$`@]8`@<<`
-M``$`@]4`B?@U```(``GH=:J+A"20````!2`+``")1"0$BX0DD`````4$"P``
-MB00DZ/S___^)P8N<))````")@QP+``"+M"20````BX8@"P``BY8D"P``9H-\
-M)&P`=%>)PXG6OP````")S2G%BT0D5(D$).C\____C50=`(E0"(E8#(EP$(N,
-M))````"+D1P!``")@1P!``"+3"14B0B)4`2)`H'#C`$``(/6`(/'`68Y?"1L
-M=[:#Q'Q;7E]=PY"-M"8`````55=64X/L#(ML)""+?"0DBU]4#[9'*XE$)`B)
-M;"0$B1PDZ/S___^)QF:#3S(0@'TK`'1)N0````#V0PD!=`SK/`^V0PG3^*@!
-M=0R#P0$/MD4K9CG(=^IF@_D#=B6+10`%T`$```^WT8T4D(L"HP````#!Z!2#
-M\`&#X`'K([D`````BT4`!=`!```/M]&-%)"+`J,`````P>@4@_`!@^`!A,!T
-M%`^VP8E$)`2)+"3H_/___^F&`0``C4,X.4,X#X01`0``A?8/A`D!```/MD9-
-MQT2'/`````"+%HM&!(E"!(D0B70D",=$)`0&````B1PDZ/S___^`?D\`=!^0
-MC70F`(DL).C\____QP0D`0```.C\____@'Y/`'7FBT8@A<!T5L=`8`````#V
-M1B@$=0B)+"3H_/___XM&((N52`4``(E$)`B)5"0$QP0D`0```.C\____BT8@
-MBY5(!0``B40D"(E4)`3'!"0&````Z/S____'1B``````@&L*`8ET)`2)+"3H
-M_/___XM%`(N06`$``(D5`````(72=`F+10")D%@!``#&1R8`9H-G,N^`?Q\`
-M="*Z``````^WPHM$ASR%P'0&@'@F_W5U@\(!#[9''V8YT'?C@'\R`'@-O@``
-M``"`?Q\`=1#K3(E\)`2)+"3H_/___^M(#[?&BUR'/(7;="?V0R@"="&+0R"+
-ME4@%``")1"0(B50D!,<$)`8```#H_/___X!C*/V#Q@$/MD<?9CGP=\)FQT<R
-M`@"`9RW]@\0,6UY?7<.-="8`C;PG`````%575E.![)P```"+A"2P````B40D
-M=(M0+(E4)'R+.HN'L`H``(L`B80D@````(M,)'2)3"0$B3PDZ/S___^+;"1T
-M@+VW`````78'QH6T````!(M$)'2#P!#'1"1X`````(M4)'0Y0A!T*HM<)'2#
-MPQ")'"3H_/___XE$)'B+3"1TBT$0BVPD>(EH!(E%`(E=!(EI$(M$)'2#>"``
-M=5>]____`(-\)'@`=`B+5"1X#[=J'HM,)'0/MG%-BU0D?(M"&`^V0`0/ME<I
-M#[9/(@^V7R&);"08B70D%(E$)!")5"0,B4PD"(E<)`3'!"2X"```Z/S___^#
-M?"1X``^$8P0``(M,)'@/MTD>B4PD5&GQL`0```.W:`H``(N?(`H``(ML)'B)
-M+"3H_/___XN&+`0``(E$)$"+EB@$``"+CB0$``"+MB`$``"+1"1X#[=H'HM$
-M)$")1"04B50D$(E,)`R)="0(B6PD!,<$)(0'``#H_/___XM$)%3!X`8!PXM3
-M-(E4)$"+4S"+2RR+<RB+:R2);"18BT,@B40D7(MK'(EL)&"+0QB)1"1DBVL4
-MB6PD:(M#$(E$)&R+:PR+0PB)A"24````BT,$B80DD````(L;BT0D0(E$)#B)
-M5"0TB4PD,(ET)"R+5"18B50D*(M,)%R)3"0DBT0D8(E$)""+5"1DB50D'(M,
-M)&B)3"08BT0D;(E$)!2);"00BY0DE````(E4)`R+C"20````B4PD"(E<)`3'
-M!"3\!@``Z/S___^+;"1X@\4\B:PDA````(M$)'B+0%2)A"2,````BT4$#[95
-M`8E$)`B)5"0$QP0D#`(``.C\____@'T!``^$G@```,:$)(L`````#[:T)(L`
-M``"-!';!X`*+E"2$````BTH(`<&)PXNL)(P````#70B+0PB)1"1PBP.+4P2)
-M1"1`B50D1(MI"(M9!(L)BU0D<(E4)!R+1"1`BU0D1(E$)!2)5"08B6PD$(E,
-M)`B)7"0,B70D!,<$)%P(``#H_/___X"$)(L````!#[:4)(L```"+C"2$````
-M.%$!#X=J____9H-_7``/A`@"``"^`````(VO0`D``(V'Z````(E$)%"-M@``
-M```/M\;!X`(#A]`%``"+&(7;#X3*`0``#[=#$(M4)'1F.4(<#X6X`0``#[>7
-ME@L``#F4)(````!T88/"`0^WAYH+```YPAG`(<*+A[`*``"#P`2+!)"I```(
-M`'4U9B7_#V8Y\'4L.5PD>'4OBTPD>`^W01Z)1"0$QP0DG0(``.C\____B3PD
-MZ/S____IDP$``)`[E"2`````=9^+1"1\@'@T``^%.0$```^W0Q!F/84`#X<K
-M`0``#[?`@+P'O`0``/\/A!H!``"#O"2P``````^$\0```(M4)'0/MD(D@^`%
-M@_@%#X7=````BQ</MT,>9L'H!0^WP(T$A0`#``")@G`!```/MTL>@^$?N@$`
-M``")T-/@B<&+!XF(=`$```^W0Q[!X`(#A]`%``#'```````/MTL>B<AFP>@%
-M#[?`B40D3(/A'XG0T^")P??1BT0D3"&,A]0%```/MTL>B<AFP>@%#[?`@^$?
-MT^+WTB%4AV`[7"1X=#>+$XM#!(E"!(D0@WM4`'0/C4-4B40D!(D\).C\____
-MBX?H````B5@$B0.+5"10B5,$B9_H````#[=#'HE$)`2)+"3H_/___XM,)'2`
-M:4\!ZQN+1"1\]D`&`G01B5PD!(M4)'2)%"3H_/___Y"#Q@%F.7=<#X<3_O__
-M@[PDL`````!T*XM,)'0/MD$D@^`%@_@%=1N+;"1XBU4`BT4$B4($B1");"0$
-MB0PDZ/S___^!Q)P```!;7E]=PY"0D%575E.#[`R+?"0@#[9T)"0/MD0D+(A$
-M)`N+1RR+"+H`````#[9<)"@!\XA<)`.)]@^VA`J\!```//]T1@^VP&G`*`$`
-M`(E$)`0#@7P%``")\SB8V@```'4I.;CD````=2$/MEPD`XB8V0```(N!?`4`
-M``^V7"0+BVPD!(B<!=@```"#P@&!^H````!UHX/$#%M>7UW#C70F`(V\)P``
-M``"#[`B)'"2)="0$BW0D&`^V7"00#[94)!2+1"0,BT@P#[:!D````#Q/=RD/
-MML"-!(`!VHB4P94````/MH&0````C02`B?*(E,&4````@(&0`````8L<)(MT
-M)`2#Q`C#B?975E.+?"00#[=$)!2[_____V:%P'1!N_____^Y`````(/H`0^W
-M\`^V%#F-0M`\"7<7@/O_#Y3`@^@!(<,/ML.-!("-7$+0ZP6`^_]U"H/!`8U&
-M`3G!=<\/ML-;7E_#B?955U93BVPD%`^V="08#[9\)!R+12R+"+H`````C70F
-M``^VA`J\!```//]T*P^VP&G`*`$```.!?`4``#FHY````'44B?,XF-D```!U
-M"HGZB)#;````ZPN#P@&!^H````!UOEM>7UW#B?:-O"<`````55=64X/L!(MT
-M)!@/MGPD'`^V1"0DB$0D`XM&+(L8BVXPN0`````/MH09O`0``#S_=$8/ML!I
-MP"@!``")P@.3?`4``#FRY````'4MB?@X@MD```!U(X!\)`,`=`Z+@N````"+
-M5"0@B0+K&8M,)""+`8F"X````.L+@\$!@?F`````=:.)ZKD`````C;8`````
-M#[:"E````#P!=CD\%W0UB?@X@I4```!U*X!\)`,`=!*-!(F+A,68````BU0D
-M((D"ZQV-%(F+3"0@BP&)A-68````ZPN#P0&#PBB#^5!UL8/$!%M>7UW#B?:-
-MO"<`````55=64X/L(`^V;"0XBT0D-(NPZ`````^V1@+!X`@/ME8#C3P0#[?'
-M@\`$/0`(```/C^T```")ZH32=$Z+3"0T#[:1W````(G3@^/@#[9&`8/@#XG1
-M@^$0"=@)R(G3@^,(@^#SB=&#X00)V`G(@^("@^#\BUPD-`^VB]P```"#X0$)
-MT`G(B$8!ZTP/ME8!B=.#X^"+3"0T#[:!W````(/@#XG1@^$0"=@)R(G3@^,(
-M@^#SB=&#X00)V`G(@^("@^#\#[9.`8/A`0G0"<B+7"0TB(/<````C58(#[?'
-MC7P&!#G7=C^)5"0<NP````")Z`^V\(UL)!R)="0,B6PD"`^VPXE$)`2+5"0T
-MB10DZ/S___^+1"0<@\`$B40D'(/#`3GX<M.#Q"!;7E]=PXVV`````%.#[!B+
-M3"0DBUDT#[9#`L'@"`^V4P,!T`^WP(U0!`^W02`YPG\NBTPD((N!Z````(E4
-M)`B)7"0$B00DZ/S____'1"0$`````(M$)"")!"3H_/___X/$&%O#C;0F````
-M`%575E.#[!P/MGPD.(M$)#"+6#")7"08O@````"+;"0T@\4$#[:#E````#P!
-M=D(\%W0^B?@X@Y4```!U-(T$MHM,)!B-E,&<````BTPD-`^V00,\('8%N"``
-M```/ML")1"0(B6PD!(D4).C\____B?:#Q@&#PRB#_E!UJ(/$'%M>7UW#C;8`
-M````C;PG`````(/L+(E<)!R)="0@B7PD)(EL)"B+7"0P#[9$)#2(1"07BT,L
-MBRB)+"3H_/___XG&A<`/A`<!``")+"3H_/___XG'A<!U$8ET)`2)+"3H_/__
-M_^GH````C58\B50D&(M0"(N#Z````(M,)#R)3"0(B40D!(D4).C\____QD9H
-M"L9&%:P/MT,<9HE&$(M$)$")1DB);AB+5"0\B58@@TYD$HM'"(E&-(E^4(V#
-MN````(E&.,9&'"#'1FP`````QD8D.\9&)0(/MDPD%XA.)HM$)#C!Z!"(1B>+
-M5"0X#[;&B$8HB%8I#[9&(HA&*@^V1B&(1BL/MDPD/(A.+,9&+0#'1"0$````
-M`(M$)!B)!"3H_/___XM&((E$)`R+1PR+5Q")1"0$B50D"(M4)!B)%"3H_/__
-M_XET)`2)+"3H_/___XM<)!R+="0@BWPD)(ML)"B#Q"S#C;0F`````(V\)P``
-M``"#["R)7"0<B70D((E\)"2);"0HBUPD,`^V1"0TB$0D%XM#+(LHB2PDZ/S_
-M__^)QH7`#X3M````B2PDZ/S___^)QX7`=1&)="0$B2PDZ/S____IS@```(U6
-M/(E4)!C&1F@*QD85K`^W0QQFB480BT0D0(E&2(EN&,=&9`@```")?E"+1PB)
-M1C2+5"0\B58@C8.X````B48XQD8<(,=&;`````#&1B0\QD8E`@^V1"07B$8F
-MBT0D.,'H$(A&)XM4)#@/ML:(1BB(5BD/MD8BB$8J#[9&(8A&*P^V1"0\B$8L
-MQD8M`,=$)`0`````BU0D&(D4).C\____BT8@B40D#(M'#(M7$(E$)`2)5"0(
-MBT0D&(D$).C\____B70D!(DL).C\____BUPD'(MT)""+?"0DBVPD*(/$+,.0
-MC;0F`````(/L+(E<)!R)="0@B7PD)(EL)"B+;"0PBT4LBP")1"04BY7H````
-M#[9"`L'@"`^V4@,!T`^WP(U8!('[``@```^/[P```(M$)!2)!"3H_/___XG&
-MA<`/A-D```"+1"04B00DZ/S___^)QX7`=16)="0$BT0D%(D$).C\____Z;(`
-M``"-1CR)1"08BU<(BX7H````B5PD"(E$)`2)%"3H_/___\9&%:P/MT4<9HE&
-M$(M$)!2)1AB)7B"#3F02BT<(B48TB7Y0C86X````B48XQD8<(,=&;`````#&
-M1B0=QD8E$,9&)@(/MD8AB$8GB%XHQT0D!`````"+1"08B00DZ/S___^+1B")
-M1"0,BT<,BU<0B40D!(E4)`B+1"08B00DZ/S___^)="0$BT0D%(D$).C\____
-MBUPD'(MT)""+?"0DBVPD*(/$+,.0C;0F`````(/L+(E<)"2)="0HBUPD,`^V
-M5"0T#[9T)#C'1"0@`````(![)P%T2L=$)`P!````C40D((E$)`@/ML*)1"0$
-MB1PDZ/S___^+1"0@A<!T(X`(@(GPA,!T"HM$)""`2`,@ZPB+1"0@@&`#WXD<
-M).C\____BUPD)(MT)"B#Q"S#C78`@^PLB5PD'(ET)"")?"0DB6PD*(M<)#`/
-MMD0D-(A$)!>+0RR+*(DL).C\____B<:%P`^$N0```(DL).C\____B<>%P'41
-MB70D!(DL).C\____Z9H```"-1CR)1"08QD85K`^W0QQFB480B6X8QT9D"```
-M`(E^4(M'"(E&-,=&(``(``"-@[@```")1CC&1AP@QT9L`````,9&)!S&1B4!
-M#[9$)!>(1B;&1B<(QD8H`,=$)`0`````BT0D&(D$).C\____BT8@B40D#(M'
-M#(M7$(E$)`2)5"0(BT0D&(D$).C\____B70D!(DL).C\____BUPD'(MT)""+
-M?"0DBVPD*(/$+,.-M@````"-OP````!55U93@^P<BTPD-(M9-`^V0P+!X`@/
-MME,#`=`/M_"-5@0/MT$@.<(/CX,!``"->PB-;#,$B7PD$,9$)!<`QT0D&```
-M```Y[P^#]0```(UV``^V1"08B$0D%@^V1P+!X`@/ME<#`=!FB40D%`^W\(ET
-M)`2+1"00@\`$B00DZ/S___\\_W5KBT0D$(U4,`2)TSG5#X;Z````QD0D%_^-
-M="8`#[9"`L'@"`^V4@.--!`/M\:)1"0$C4,$B00DZ/S___\\_W41@'PD%_\/
-MA8X```"0Z8,````X1"07=@2(1"07#[?&C50#!(G3.=5V<>NRB?8J1"07#[;`
-MB40D"`^V7"06B5PD!(M4)#")%"3H_/___XE<)`B)?"0$BT0D,(D$).C\____
-M#[=$)!2+5"00C7P"!(E\)!"#1"08`3G]#X<.____QT0D!`(```"+1"0PB00D
-MZ/S____K6,9$)!<`#[9$)!:)1"0(B7PD!(M4)#")%"3H_/___P^W1"04BU0D
-M$(U\`@2)?"00@T0D&`'IO_[__P^V1"06B40D"(E\)`2+1"0PB00DZ/S____K
-MEHUT)@"#Q!Q;7E]=PY"-M"8`````55=64X/L'(M,)#2+630/MD,"P>`(#[93
-M`P'0#[?`@\`$#[=1(#G0#X\>`0``C7,(#[9;`;D`````N@````")]@).`@^V
-M1@.-=`8$@\(!.--S[H3)#X33````QD0D&P"_`````(U!_P^VP(/``8E$)!0/
-MME2^`0!4)!L/M@2^/`%T!#P7=4H/MEPD&RC3.%PD&P^&B0```(U'`0^VZ(UV
-M``^V!+Z)1"0,B6PD"`^VPXE$)`2+1"0PB00DZ/S___^#PP$Z7"0;=%CKUHVV
-M`````(M,)#"+03"`N)$````!=$`/MEPD&RC3.%PD&W8SC4<!#[;H#[8$OHE$
-M)`R);"0(#[;#B40D!(M$)#")!"3H_/___X/#`3I<)!MUV)"-="8`@\<!.WPD
-M%`^%1/___XM4)#"+0C#&@)$````!QT0D!`<```")%"3H_/___X/$'%M>7UW#
-MC;8`````C;PG`````(/L+(E<)!R)="0@B7PD)(EL)"B+7"0PA=L/A,P```"+
-M0RR+*(DL).C\____B<:%P`^$M0```(DL).C\____B<>%P'41B70D!(DL).C\
-M____Z98```"-1CR)1"08QD85K`^W0QQFB480B6X8QT9D"````(E^4(M'"(E&
-M-,=&(``(``"-@[@```")1CC&1AP@QT9L`````,9&)!S&1B4!QD8F`L9&)PC&
-M1B@`QT0D!`````"+1"08B00DZ/S___^+1B")1"0,BT<,BU<0B40D!(E4)`B+
-M1"08B00DZ/S___^)="0$B2PDZ/S___^+7"0<BW0D((M\)"2+;"0H@\0LPY"#
-M[!R)7"00B70D%(E\)!B+?"0DBW0D((M?2`^W5Q!F@?J%``^'AP````^WP@^V
-MC`:\!```@/G_='=F@_I_=QD/ML&+EGP%``!IP"@!``"+1!`L#[9`!.LX9H'Z
-M@0!W&0^VP8N6M`4``&G`%`T``(M$$`@/MD`$ZQ@/ML&+EI@%``!IP+````"+
-M1!!4#[9`!)`\_W0<#[;`@+P&0@4``/]T#X#Y_W0*#[9'%#P&=3*)]H-_4`!T
-M#XU'4(E$)`2)-"3H_/___XE\)`2)-"3H_/___\=#+/____^)'"3_4RCK<83`
-M=3KV1V0(=!F+2QR+5S2+1R")1"0(B50D!(D,).C\____QT,L`````(M3((72
-M=`6+0Q2)`HD<)/]3*.L2QT,L_____XD<)/]3*)"-="8`@W]0`'0/C4=0B40D
-M!(DT).C\____B7PD!(DT).C\____BUPD$(MT)!2+?"08@\0<P^L-D)"0D)"0
-MD)"0D)"0D(/L'(E<)`R)="00B7PD%(EL)!B+7"0DBWPD(`^V:Q0/MT,09CV%
-M`'<9BY=\!0``#[?`#[:$![P$``!IP"@!``#K"XN7?`4``+C8)@$`C30"B>B$
-MP'4A9L>&E```````@'LD''42@'LF`G4,B5PD!(DT).C\____@WM0`'0/C4-0
-MB40D!(D\).C\____B5PD!(D\).C\____B>@\!G0^C9X$`0``B5PD!(M'%(D$
-M).C\____QX8$`0``@(0>`,>&#`$```````")MA`!``")7"0$BT<4B00DZ/S_
-M__^+7"0,BW0D$(M\)!2+;"08@\0<PU575E.#[!P/MD0D.(A$)!N+5"0PBT(L
-MBS"_`````(ML)#2#Q0P/MH0WO`0``#S_=%$/ML!IV"@!``#'1"0("````(EL
-M)`2)V`.&?`4```6@````B00DZ/S___^$P'0CBX9\!0``#[94)!N(E`/:````
-MBX9\!0``BU0D,(F4`^0```"#QP&!_X````!UF(/$'%M>7UW#C70F`(V\)P``
-M``!55U93@^P<BTPD-(MQ-`^V1@+!X`@/ME8#`=`/M_B-5P0/MT$@.<(/C_4`
-M``"-7@B-=#X$B70D%(G=.=X/ALP```#'1"08`````(VV``````^V3"08#[83
-MA-(/B)4```")T(/@#SP&#X6(````]D,#P'0*]D,%P`^%>````/;"$'0U@'L$
-M`'1MC74(OP`````/MD,#B40D"(ET)`2+1"0PB00DZ/S___^#QAR#QP&)^#A#
-M!'9`Z]F`>P(`=#B-=02_``````^VR8E,)!"-="8`BT0D$(E$)`B)="0$BT0D
-M,(D$).C\____@\8<@\<!B?@X0P)WVP^V0P&-7`4"B=V#1"08`3M<)!0/@D+_
-M___'1"0$`0```(M$)#")!"3H_/___X/$'%M>7UW#C;8`````55=64X/L+(M$
-M)$")1"0@BU0D1`^V4A2(5"0KBTPD1`^W41!F@?J%``^'N0,```^WPHM<)"`/
-MMHP#O`0``+C_````@/G_=&)F@_I_=QT/ML&+7"0@BY-\!0``:<`H`0``BT00
-M+`^V0`3K/V:!^H$`=QT/ML&+7"0@BY.T!0``:<`4#0``BT00"`^V0`3K&P^V
-MP8M<)""+DY@%``!IP+````"+1!!4#[9`!(M4)"`/MH0"0@4``(E$)!QKP%R-
-MA`),`0``B40D)(N2?`4```^VP6G`*`$``(TT`H!\)"L`#X62`@``9L>&E```
-M````BT0D1(!X)!P/A7L"```/MD`F/`)T6CP"=PL\`0^%9P(``)#K(3P'=#(\
-M"@^%6`(``(M,)$2)3"0$B30DZ/S____I0P(``(M<)$2)7"0$B30DZ/S____I
-M+@(``(M$)$2)1"0$B30DZ/S____I&0(``(M4)$2)5"0$B30DZ/S___^-G@0!
-M``")7"0$BT8LBP"+0!2)!"3H_/___\>&!`$``("$'@#'A@P!````````B;80
-M`0``B5PD!(M&+(L`BT`4B00DZ/S____&1B;_:T0D'%R+3"0@@+P!5@$````/
-MA'H!``"_`````(G#C:P!A`$``(GVB2PDZ/S___^)QHM4)""-!!.+D(@!``")
-ML(@!``")+HE6!(DR@'XF_P^$H@```(!^)0`/A9\```")\X"^M0`````/A$\!
-M```/MDXD#[;1B="#X`:#^`9U*?;"`70DB70D#`^V1DV)1"0(BT8PB40D!(M,
-M)"2)#"3H_/___^D5`0``@_@$=2'VP0&-M"8`````=!6)7"0$BUPD((D<).C\
-M____Z>\```"#^`8/A>8```#VP0$/A=T```")7"0$BT0D((D$).C\____Z<@`
-M``")]L:&M0````"#QP&+3"0@C9090`$```^V0A:)^3C(#X<-____.,%U<X3`
-M=&^_`````&M<)!Q<BT0D((VL&(0!``")+"3H_/___XG&BU0D((T$$XN0B`$`
-M`(FPB`$``(DNB58$B3*`?B;_=!X/MD8E/")T!#P-=1+'1"0$"@```(DT).C\
-M____ZSZ#QP&)^8M$)"`XC!A6`0``=Z9K1"0<7(M4)"#&A`)1`0``_XM,)"2)
-M3"0$B10DZ/S___^`?"0K``^%H@```(M<)$2#>U``=!6)V(/`4(E$)`2+1"0@
-MB00DZ/S___^+5"1$B50D!(M,)"")#"3H_/___X!\)"L`=&@/MX:4````@\`!
-M9HF&E````&:#^`IV#F;'AI0``````.G@_?__QT0D!`H```")-"3H_/___^LQ
-MBUPD(`^VFT$&``")7"0<:\-<BU0D((V$`DP!``")1"0DBY)\!0``N-@F`0#I
-MOOS__X/$+%M>7UW#@^P(B1PDB70D!(M<)`R+="00BU0D%(M,)!R%VW1$A?9T
-M0(72=#R#?"08`'0U9H'YA0!W+@^WP8"\`[P$``#_="'&0B3AQD(E`<9")A-F
-MB4H0B7(8BT0D&(E";+@!````ZP6X`````(L<)(MT)`2#Q`C#C;0F`````(V\
-M)P````"+3"0$BT$$BT`$HP````"`?"0(`'0*B<*!R@``#`#K"(G"@>+___/_
-MBT$$B1"+002)4`R+002)4!"+002)4!2+002)4!B+002)4`3#D)"0D%93BUPD
-M$(M,)#"+="0X#[=$)`QF/2(G=TEF/2`G<WEF/4`A='-F/4`A=QEF/2`AD'1F
-M9CTB(71@9CU0!XUT)@!U8.M49CU$(71.9CU$(8GV<E!F+1`G9H/X`7=&C70F
-M`.LV9CV")W0P9CV")XUT)@!W$F8])"=T(&8]@">-="8`=2#K%&8]@)%T#F8]
-M@)2)]G0&9CV`<G4*Q@-`BT0D%,8``HM$)!C&``0/MA.+1"0LB!!FQP&``&;'
-M!@``BT0D(,8`((M$)"1FQP```0^V$XM$)"B($`^V`V8#`68#!HM4)#1FB0*+
-M5"0<9HD"#[<1BT0D/&:)$`^W$8/""XM$)$!FB1!;7L.-=@"-O"<`````55=6
-M4X/L!(M\)!@/MD0D'(A$)`,/MV]<9H7M#X3>````BX_0!0``O@````"-="8`
-MBP&%P`^$M@````^W4!"[_P```+C_____9H'ZA0!W=`^WP@^VG`>\!```N/__
-M__^`^_]T7&:#^G]W&0^VPXN7?`4``&G`*`$``(M$$"P/MD`$ZSUF@?J!`'<9
-M#[;#BY>T!0``:<`4#0``BT00"`^V0`3K'0^VPXN7F`4``&G`L````(M$$%0/
-MMD`$C;8`````#[;;BY=\!0``.D0D`W4A#[?#:<`H`0``#[9$$"2#X`6#^`5U
-M"[`!ZQN-M"8`````@\8!@\$$9CGN#X4Q____N`````"#Q`1;7E]=PXUT)@!5
-M5U93@^P(BU0D'(M"+(LHBX4@"@``B40D!`^W?5RY`````+X`````ZTF-M@``
-M```/M]F+A=`%``"+%)B%TG0PBT(D)?___P`]X0$0`'0ABT0D'`^W0!QF.T(0
-M=1.)V,'@!HM4)`1F.700"'0+C78`@\$!9CGY<KAF.?ET$(/&`6:#_A]W![D`
-M````Z^8/M\:#Q`A;7E]=PY"-M"8`````4XM4)`B+3"0,BUPD$(M".(7`=!;&
-M`'"+0CB(2`*+0CC&0`<`BT(XB%@,6\.-="8`\\.-M"8`````C;PG`````(/L
-M$(D<)(ET)`2)?"0(B6PD#(M,)!0/MWPD&(GZ@>+_`0``BX'0!0``BS20A?9T
-M,`^VF>(````/MD85B=G3X`^WZ`^WU[C__P``T^`APCG5#Y7`#[;`@^@!(<:0
-MC70F`(GPBQPDBW0D!(M\)`B+;"0,@\00PXUT)@"-O"<`````BU0D!+@`````
-MC;0F`````,8$$`"#P`$]L````'7RQD(H_\9"-/^-0A2)0A2)0AC#BU0D!+@`
-M````C;0F`````,8$$`"#P`$]*`$``'7RQD),_\9"0O_&0DX?C4(0B4(0B4(4
-MPXVV`````(V_`````%.+1"0(BUPD#(L3BX@$`0``B9`$`0``!0`!``")`HE*
-M!(D1QP,`````6\.0C70F`%.#[`B+7"00BTPD%(N3_````(F+_````(V#^```
-M`(D!B5$$B0J#>4P`=`^-04R)1"0$B1PDZ/S___^#Q`A;PY!3BT0D"(M<)`R+
-M$XN(%`$``(F0%`$```40`0``B0*)2@2)$<<#`````%O#D(UT)@!3BT0D"(M<
-M)`R+$XN(#`$``(F0#`$```4(`0``B0*)2@2)$<<#`````%O#D(UT)@"+1"0$
-MBU0D"(N()`$``(F0)`$```4@`0``B0*)2@2)$</K#9"0D)"0D)"0D)"0D)!3
-MBT0D"(M<)`R+$XN(+`$``(F0+`$```4H`0``B0*)2@2)$<<#`````%O#D(UT
-M)@!3BT0D"(M<)`R+$XN('`$``(F0'`$```48`0``B0*)2@2)$<<#`````%O#
-MD(UT)@`/MD0D!#P7=Q</ML#_)(4`$P``N#0```##C;0F`````+@$````P[@\
-M````D(UT)@##N!0```##N$````"-="8`P[@<````P[@8````C70F`,.X*```
-M`,.X(````(UT)@##N$P```##B?:-O"<`````55=64XML)!2+?"08#[97)(G0
-M@^`&@_@&=0GVP@$/A,H```"`?T+_#X7`````BT4`B[`8`0``B34`````N0``
-M``"X`0```(G#T^.%WG4RB$]"BU4`B=@)\(F"&`$``(M%`(N`6`$``*,`````
-MB=HAPG1WBT4`B9!8`0``ZVR-=@"#P0&#^2!UN8M%`(NP'`$``(DU`````+$`
-MC;0F`````(G*N`$```")P]/CA=YU,HU"((A'0HM5`(G8"?")@AP!``"+10"+
-M@&`!``"C`````(G:(<)T$XM%`(F08`$``.L(@\$!@_D@=;>`12P!6UY?7<.-
-MM"8`````C;PG`````%=64XM\)!"+5"04@'HT_P^%MP```(L'B[`8`0``B34`
-M````N0````"X`0```(G#T^.%WG4LB$HTBQ>)V`GPB8(8`0``BP>+@%@!``"C
-M`````(G:(<)T<8L'B9!8`0``ZV>#P0&#^2!UOXL'B[`<`0``B34`````L0"-
-MM"8`````N`$```")P]/CA=YU,XA*-(L7B=@)\(F"'`$``(L'BX!@`0``HP``
-M``")VB'"=!F+!XF08`$``.L/C;0F`````(/!`8/Y('6X@$<L`5M>7\-3#[9<
-M)!"+1"0(BT@HA<ET,;H`````BT21/(7`=`4X6$UT#X/"`8/Z!707D(UT)@#K
-MY&:!>22%`'<(A<"-="8`=06X`````%O#C;0F`````%575E.#[`R+;"0@#[9$
-M)"3!X`@/ME0D*(TT$(!]'``/A,D```"#?3@`#X2_````]D5D"0^4P(G'N0``
-M``"-=@")RP^W%,U@$P``B?`AT&8YP@^%BP````^V%,UE$P``@/H#=`6`^@=U
-M"XGX.`3-9!,``'5NQD44(`^V!-UF$P``B40D"`^VPHE$)`2)+"3H_/___XM5
-M.`^V!-UG$P``B$(-@WPD+`!T*XM$)"R+&(MP!(M-.(EQ`XM%.(`(@/9%9@1T
-M$(7V=`R+13B)6`B+13B`('^+53@/MD4<@^@'B$('ZPR#P0&#^1`/A5+___^#
-MQ`Q;7E]=PXUV`(V\)P````"#[`R+1"00C9`8`0``N0`````YD!@!``!T$8D4
-M).C\____B<''0!0`````B<B#Q`S#ZPV0D)"0D)"0D)"0D)"0@^P,BT0D$(V0
-M*`$``+D`````.9`H`0``=`J)%"3H_/___XG!B<B#Q`S#C;8`````@^P,BT0D
-M$(V0(`$``+D`````.9`@`0``="2)%"3H_/___XG!B<*X`````)"-="8`Q@00
-M`(/``3V8````=?*)R(/$#,.-M@````"-OP````"#[`R+1"00C9`(`0``N0``
-M```YD`@!``!T"HD4).C\____B<&)R(/$#,.-M@````"#[`R+1"00C9```0``
-MN0`````YD``!``!T#HD4).C\____B<'&0`@`B<B#Q`S#B?955U93@^P<B40D
-M$(G5QT0D%`````#'1"08`````(UV`(M4)!B+3"00#[:$"CP%```\_P^$*`$`
-M``^VT`^W1"089H/H@&8]@0`/AWP````/M\)IP!0-``")PP.9M`4``(![,`!T
-M5;X`````C7LHC78`B3PDZ/S___^-2/B+4RR)0RR)>0B)40R)`HM!)"4`__\`
-M/0``_P!U&/9!)P1T$HM!((7`=`N)ZHA0`8VV`````(/&`8GQ.$LP=[:)Z(B#
-MD@```(/%`>F6````#[?":<"P````B<.+5"00`YJ8!0``@'L?`'1#N0````"-
-MM@`````/ML&+5(,\A=)T)8M")"4`__\`/0``_P!U%O9")P1T$(M"((7`=`F)
-MZHA0`8UT)@"#P0$X2Q]WR(GIB(ND````@+NE`````W4>@T0D%`&+1"04@\`#
-M@_@&=A:#Q0''1"04`````.L)@\4!C;8`````@T0D&`&#?"08!@^%L/[__XM4
-M)!"+@D@%```YT'4,!<P,``")ZNAV_O__@\0<6UY?7<.-M"8`````C;PG````
-M`(/L#(M4)!"+1"04#[9(!`^VA!%"!0``QH010@4``/\/M\")1"0$@<+@"0``
-MB10DZ/S___^#Q`S#D(VT)@````"#[`B)'"2)="0$BW0D$(M>3(7;="2-3B2-
-M4PR+0PR)1B2+0@2)002+0@B)00B+0@R)00R+0QR)1C2+'"2+="0$@\0(PXVV
-M`````(V_`````(/L"(D<)(ET)`2+="00BUY,A=MT*(U+#(U6)(M&)(E##(M"
-M!(E!!(M""(E!"(M"#(E!#(M&-(E#',9#"`&+'"2+="0$@\0(PY"-M"8`````
-M5U93@^P0BWPD((L?9H-[7``/A+L```"^`````(UT)@`/M]:+@]`%``"+#)"%
-MR0^$D0````^W41!F@?J%`'=Q#[?"#[:$`[P$```\_W1B9H/Z?W<<#[;`BY-\
-M!0``:<`H`0``BT00+`^V4`3K2(UV`&:!^H$`=QD/ML"+D[0%``!IP!0-``"+
-M1!`(#[90!.LE#[;`BY.8!0``:<"P````BT005`^V4`3K#(VT)@````"Z_P``
-M``^V1P0YPG4(B0PDZ/S___^#Q@%F.7-<#X=.____@\006UY?PXVT)@````"#
-M[!R)7"04B70D&(M<)""+="0D#[9&-#S_=!D/ML")1"0$BP.)!"3H_/___\9&
-M-/^`:RP!BUPD%(MT)!B#Q!S#@^P<B5PD%(ET)!B+7"0@BW0D)`^V1D(\_W09
-M#[;`B40D!(L#B00DZ/S____&1D+_@&LL`8M<)!2+="08@\0<PU=64X/L$(MT
-M)""+7"0D.7,8#X3/````@'L4``^%E@````^V0R0\%70(/%4/A88```"+0TR%
-MP'1_B<*`>`@!=7=F@7@,X0%U;XN^?`4```^W0Q"YV"8!`&8]A0!W$0^WP`^V
-MA`:\!```:<@H`0``C00/#[92#H#Z!W0?@/H'=P>`^@9U,^L<@/H,C;0F````
-M`'0@@/H-=2#K$&:#8#K]B?;K%6:#2#H"ZPYF@V`Z]XGVZP5F@T@Z"(-[4`!T
-M*8%[(``(``!W$8U#4(E$)`2)-"3H_/___^L/C4-0B40D!(DT).C\____9H%[
-M).$!#X4&`0``#[=#$&8]A0!W>@^WP`^VA`:\!```//]T:XN6?`4``(![%`!U
-M7P^VP&G`*`$``(T$`@^V4R:`^@=T'8#Z!W<'@/H&=3'K&H#Z#)"-="8`=""`
-M^@UU(.L09H-@.OV)]NL59H-(.@+K#F:#8#KWB?;K!6:#2#H(9H%[).$!C78`
-M#X6"````@'LF"W5\#[=+$`^V1BZ->/^)RNL<D(UT)@"#P@%F@?J%`'<-#[?"
-M@+PPO`0``/]U"0^WPCGX?.+K1&8]_P!U&>L\@\$!9H'YA0!W#0^WP8"\,+P$
-M``#_=0P/M\$YQW_BN/\```!FB4,0QD,4@(E<)`2)-"3H_/___^D<`0``QD,4
-M`#ES&'0HBT-,A<!T(8!X"`%U#(E<)`2)-"3H_/___XU#3(E$)`2)-"3H_/__
-M_X-[5`!T#XU#5(E$)`2)-"3H_/___XE<)`2+0QB)!"3_4VP/MU,D9H'ZX0%U
-M50^V0R:#Z!$\`7=*#[=#$&8]A0`/AZ4````/M\`/MH0&O`0``#S_#X22````
-M#[;`:<"P`````X:8!0``@'@I`'5]@'@T_W1WB40D!(DT).C\____ZVD/MT,0
-M9CV%`'=?#[?`#[:,!KP$``"+OGP%``"+0R0E____`#WA`1``=#^!^?\```!T
-M-V:!^N$!=1`/MD,F@^@1/`%V)9"-="8`:<$H`0``C00'@'A/`'41B40D!(DT
-M).C\____D(UT)@"#Q!!;7E_#B?:-O"<`````@^P<B5PD$(ET)!2)?"08BW0D
-M((M<)"0/MU,09H'ZA0`/AXH````/M\(/MHP&O`0``(#Y_W1Z9H/Z?W<9#[;!
-MBY9\!0``:<`H`0``BT00+`^V0`3K.V:!^H$`=QD/ML&+EK0%``!IP!0-``"+
-M1!`(#[9`!.L;#[;!BY:8!0``:<"P````BT005`^V0`2-="8`9CW_`'0:#[?`
-M#[:\!D(%``")^#S_=`D/ML%F/?\`=1")7"0$B30DZ/S____K?HGV#[93)P^V
-M0R@/MDLI@/D!=`6`^0AU6HM+2,'@"`^VT@'0)?\!``"+EM`%```Y#()U/P^W
-M21Z)RF;!Z@4/M]*#X1^X_O___]/`(4268(M#2`^W0!Z)1"0$B?H/ML)KP%R-
-MA`9,`0``B00DZ/S___^)]HE<)`2)-"3H_/___XM<)!"+="04BWPD&(/$',.-
-M="8`@^P,B5PD!(ET)`B+7"00C8/X````O@`````Y@_@```!T'8D$).C\____
-MB<:)!"3H_/___XD<).C\____B49,B?"+7"0$BW0D"(/$#,.-=@"#[!R)7"00
-MB70D%(E\)!B+?"0@BT<LBS")-"3H_/___XG#A<!T:XDT).C\____B<*%P'4<
-MQH>U`````8E<)`2)-"3H_/___^M(C;0F`````,9#)``/MT<<9HE#$,9#:`^)
-M<QC'0R``````QT,T`````(M""(E#.,9#'"2)4U#'0VP`````B5PD!(DT).C\
-M____BUPD$(MT)!2+?"08@\0<P^L-D)"0D)"0D)"0D)"0D(/L'(E<)!")="04
-MB7PD&(M\)""+="0DBT<LBQB)'"3H_/___XG"A<!T/<9`)!O&0"4!B?"(0B@/
-MMT<<9HE"$,9":`^)6AC'0B``````QT(T`````,=";`````")5"0$B1PDZ/S_
-M__^+7"00BW0D%(M\)!B#Q!S#B?:-O"<`````@^PLB5PD'(ET)"")?"0DB6PD
-M*(M<)#2+1"0PBRB)+"3H_/___XG&A<`/A*(```")+"3H_/___XG'A<!U$XET
-M)`2)+"3H_/___^F#````B?:-5CR)5"08QD8DX<9&)0'&1B8.#[=#'&:)1A!F
-M@V,X]XM4)#"+`HE&&,=&(``(``"+1PB)1C2)?E#'1FP0M`(`QT0D!`````"+
-M1"08B00DZ/S___^+1B")1"0,BT<,BU<0B40D!(E4)`B+5"08B10DZ/S___^)
-M="0$B2PDZ/S___^+7"0<BW0D((M\)"2+;"0H@\0LPXUT)@"-O"<`````@^P<
-MB5PD$(ET)!2)?"08BW0D*(M$)""+&(D<).C\____B<*%P'1EQD`DX<9`)0&)
-M\(A")L9")P^+3"0D#[=!'&:)0A")6AC'0B``````QT(T`````,=";`````")
-M5"0$B1PDZ/S___^)\#P!=1+'!"0%````Z/S____K$(UT)@#'!"10PP``Z/S_
-M__^+7"00BW0D%(M\)!B#Q!S#C70F`(/L'(E<)!")="04B7PD&(MT)""+7"0D
-M#[=3$&:!^H4`#X>+````#[?"#[:,!KP$``"`^?]T>V:#^G]W&0^VP8N6?`4`
-M`&G`*`$``(M$$"P/MD`$ZSMF@?J!`'<9#[;!BY:T!0``:<`4#0``BT00"`^V
-M0`3K&P^VP8N6F`4``&G`L````(M$$%0/MD`$C70F`#S_=!T/ML`/MI0&0@4`
-M`(#Z_W0-@/G_=`@/MD,4/`9U/X-[4`!T*X%[(``(``")]G<1C4-0B40D!(DT
-M).C\____ZP^-0U")1"0$B30DZ/S___^)7"0$B30DZ/S____K<HN^?`4``(3`
-M="W'1"0(`0````^VP6G`*`$``(T$!XE$)`0/ML)KP%R-A`9,`0``B00DZ/S_
-M__^#>U``="F!>R``"```=Q&-0U")1"0$B30DZ/S____K#XU#4(E$)`2)-"3H
-M_/___XE<)`2)-"3H_/___XM<)!"+="04BWPD&(/$',.-M"8`````C;PG````
-M`(/L+(E<)!R)="0@B7PD)(EL)"B+7"0PBVPD-`^W51!F@?J%``^'#@$```^W
-MP@^VC`.\!```@/G_#X3Z````9H/Z?W<<#[;!BY-\!0``:<`H`0``BT00+`^V
-M0`3K.HUV`&:!^H$`=QD/ML&+D[0%``!IP!0-``"+1!`(#[9`!.L7#[;!BY.8
-M!0``:<"P````BT005`^V0`0\_P^$F0````^V^0^VP`^VM`-"!0``B?`\_P^$
-M@0```&:!__\`='J`?10&='2+DWP%``")5"08@'TF`75,QP0D"@```.C\____
-MB6PD!(D<).C\____QT0D"`(````/M\=IP"@!```#1"08B40D!(GR#[;":\!<
-MC80#3`$``(D$).C\____ZQJ)]L<$)/0!``#H_/___XEL)`2)'"3H_/___XM<
-M)!R+="0@BWPD)(ML)"B#Q"S#C70F`(/L+(E<)"")="0DB7PD*(M\)#"+1RR+
-M,(DT).C\____B<.%P'4*QH>U`````>MDD,9`)!7&0!6K#[=''&:)0Q")<QC'
-M1"00`0```,=$)`P!````B5PD"(E\)`2)-"3H_/___X3`=1F)7"0$B30DZ/S_
-M___&A[4````!ZQ>-="8`QT-L`````(E<)`2)-"3H_/___XM<)""+="0DBWPD
-M*(/$+,.-M@````"-O"<`````@^PLB5PD'(ET)"")?"0DB6PD*(M<)#"+0RR+
-M*(DL).C\____B<:%P'4,QH.U`````>FX````B2PDZ/S___^)QX7`=1S&@[4`
-M```!B70D!(DL).C\____Z9(```"-="8`QD8D&L9&)0C&1B8(QD8G`,9&*/_&
-M1BD`QD85JP^W0QQFB480B6X8QT8@_P```,=&9`@```"+1PB)1C0%_P```(E&
-M.,9&'"2)?E#'1FP`````C5X\QT0D!`````")'"3H_/___\=$)`S_````BT<,
-MBU<0B40D!(E4)`B)'"3H_/___XET)`2)+"3H_/___XM<)!R+="0@BWPD)(ML
-M)"B#Q"S#C;0F`````(V\)P````"#["R)7"0<B70D((E\)"2);"0HBVPD,`^V
-M1"0TB$0D%XM%+(LXB3PDZ/S___^)PX7`=0W&A;4````!Z;H```"0B3PDZ/S_
-M__^)QH7`=1C&A;4````!B5PD!(D\).C\____Z9,```"-0SR)1"08QD,D$H!\
-M)!<`=`[&0R4!QD,F@,9#*$#K!,9#*"3&0Q6K#[=%'&:)0Q")>QC'0R!@````
-MQT-D"````(M&"(E#-(ES4,=#;`````#'1"0$`````(M$)!B)!"3H_/___\=$
-M)`Q@````BT8,BU80B40D!(E4)`B+1"08B00DZ/S___^)7"0$B3PDZ/S___^+
-M7"0<BW0D((M\)"2+;"0H@\0LPXUV`(/L+(E<)!R)="0@B7PD)(EL)"B+7"0P
-MBT,LBRB)+"3H_/___XG&A<!U#,:#M0````'IN@```(DL).C\____B<>%P'4<
-MQH.U`````8ET)`2)+"3H_/___^F4````C70F`(U&/(E$)!C&1B2>QD8E$,9&
-M,2#&1A6K#[=#'&:)1A");AC'1B`@````QT9D"````(M'"(E&-(E^4(/`((E&
-M.,9&'"3'1FP`````QD9H#\=$)`0`````BT0D&(D$).C\____QT0D#"````"+
-M1PR+5Q")1"0$B50D"(M$)!B)!"3H_/___XET)`2)+"3H_/___XM<)!R+="0@
-MBWPD)(ML)"B#Q"S#C;8`````C;\`````@^PLB5PD'(ET)"")?"0DB6PD*(M<
-M)#"+0RR+*(DL).C\____B<:%P'4,QH.U`````>FN````B2PDZ/S___^)QX7`
-M=1S&@[4````!B70D!(DL).C\____Z8@```"-="8`C48\B40D&,9&)"7&1A6K
-M#[=#'&:)1A");AC'1B`(````QT9D"````(M'"(E&-(/`"(E&.,9&'"2)?E#'
-M1FP`````QT0D!`````"+1"08B00DZ/S____'1"0,"````(M'#(M7$(E$)`2)
-M5"0(BT0D&(D$).C\____B70D!(DL).C\____BUPD'(MT)""+?"0DBVPD*(/$
-M+,.0C;0F`````(/L+(E<)!R)="0@B7PD)(EL)"B+1"0XB40D%(M4)#"+.HN/
-M?`4``(E,)!B+5"0T#[="$`^VK`>\!```B3PDZ/S___^)PXM,)#0/MW$>B?&#
-MX1^X`0```-/@B<&)\&;!Z`4/M\"%3(=@#X7)````A=L/A,$```")Z0^VT6G2
-M*`$```-4)!B+3"0T#[9!%0^VC^(```#3X`GPQD,DX<9#)0'&0R8/B$,G9L'H
-M"(A#*`^V1"04B$,IBX*H````B4,JBX*L````B4,NBTPD-(E+2,9#%:H/MT(<
-M9HE#$(M4)#"+`HE#&,=#(`````#'0S0`````QT-LL*\"`,=$)`0`````C4,\
-MB00DZ/S___^)7"0$B3PDZ/S___^+1"0T#[=('HG(9L'H!0^WP(/A'[H!````
-MT^()5(=@BUPD'(MT)""+?"0DBVPD*(/$+,.0C70F`%575E.#[!P/MD0D-(A$
-M)!N+5"0PBQIF@WM<``^$_@$``+T`````#[?5BX/0!0``BPR0A<D/A-@!``"+
-M>22!Y____P"!_^$!$``/A9$```"#?"0X``^%N`$```^W41!F@?J%`'=G#[?"
-M#[:$`[P$```\_W189H/Z?W<9#[;`BY-\!0``:<`H`0``BT00+`^V4`3K/F:!
-M^H$`=QD/ML"+D[0%``!IP!0-``"+1!`(#[90!.L>#[;`BY.8!0``:<"P````
-MBT005`^V4`3K!;K_____O@````#II0```)"-="8`#[=1$&:!^H4`#X>'````
-M#[?"#[:T`[P$``")\#S_='9F@_I_=QD/ML"+DWP%``!IP"@!``"+1!`L#[90
-M!.M!9H'Z@0!W&XGR#[;"BY.T!0``:<`4#0``BT00"`^V4`3K'XGR#[;"BY.8
-M!0``:<"P````BT005`^V4`2-M@````"!YO\```!IQB@!``")Q@.S?`4``.L*
-MNO____^^`````(M$)#`X4`0/A84```"#?"0X`'0.BU0D.`^W0AQF.T$0=7"`
-M?"0;!G1.@?_A`1``=$8/ME8DB="#X`:#^`9U./;"`74S@+ZT`````'4J@?_A
-M`0\`=#T/MD0D&XA!%,=$)`@!````B4PD!(M4)#")%"3H_/___^L;#[9$)!N(
-M010/M\6)1"0$BU0D,(D4).C\____@\4!9CEK7`^'!_[__X!\)!N!#X0U`0``
-MBX/H````C;/H````.<8/A"$!``"Z`````(/"`8L`.<9U]V:%T@^$"@$``(UZ
-M_XDT).C\____B<&#?"0X`'0GBU0D.`^W0AQF.T$0=!F+@^P```")B^P```")
-M,8E!!(D(Z;D```"0#[=1$&:!^H4`=V</M\(/MH0#O`0``#S_=%AF@_I_=QD/
-MML"+DWP%``!IP"@!``"+1!`L#[9`!.L^9H'Z@0!W&0^VP(N3M`4``&G`%`T`
-M`(M$$`@/MD`$ZQX/ML"+DY@%``!IP+````"+1!!4#[9`!.L%N/____^+5"0P
-M.D($=26+020E____`#WA`0\`=!8/MD0D&XA!%(E,)`2)'"3H_/___^L3BX/L
-M````B8OL````B3&)002)"(U'_V:%_W0/.[/H````=`>)Q^GY_O__@\0<6UY?
-M7<.)]HV\)P````"#[!R)7"0,B70D$(E\)!2);"08BVPD(`^V?"0HBW4`B30D
-MZ/S___^)PX7`=1.+1"0LQH"U`````>F0````C78`B30DZ/S___^)PH7`=1F)
-M7"0$B30DZ/S___^+5"0LQH*U`````>MFQD,DX<9#)0'&0R80B?F(2Q6+3"0D
-M#[9!,V:)0Q"+10")0QC'0R"0````C4((B4,TB5-0QD`!$L9""$")^HA0"<=#
-M;`````#'1"0$`````(U#/(D$).C\____B5PD!(DT).C\____BUPD#(MT)!"+
-M?"04BVPD&(/$',/K#9"0D)"0D)"0D)"0D)"#[!R)7"0,B70D$(E\)!2);"08
-MBVPD((M\)"B+1"0LB40D"(MU`(DT).C\____B<.%P`^$B````(DT).C\____
-MB<*%P'1ZQD,DX<9#)0'&0R80B?F(2Q6+3"0D#[9!,V:)0Q"+10")0QC'0R"0
-M````C4((B4,TB5-0QD`!D<9""$")^HA0"0^V3"0(B$@*QT-L`````,=$)`0`
-M````C4,\B00DZ/S___^)7"0$B30DZ/S____'!"2@A@$`Z/S___^+7"0,BW0D
-M$(M\)!2+;"08@\0<PXVV`````(V_`````(/L'(E<)`R)="00B7PD%(EL)!B+
-M?"0@BVPD*(LWB30DZ/S___^)PX7`='*)-"3H_/___XG"A<!T9,9#).'&0R4!
-MQD,F$,9#%;N+3"0D#[9!,V:)0Q"+!XE#&,=#()````"-0@B)0S2)4U#&0`$0
-MQD((0(GJB%`)QT-L`````,=$)`0`````C4,\B00DZ/S___^)7"0$B30DZ/S_
-M__^+7"0,BW0D$(M\)!2+;"08@\0<P^L-D)"0D)"0D)"0D)"0D(/L'(E<)!")
-M="04B7PD&(M\)""+-XDT).C\____B<.%P'1MB30DZ/S___^)PH7`=%_&0R3A
-MQD,E`<9#)A#&0Q6[BTPD)`^V03-FB4,0BP>)0QC'0R"0````C4((B4,TB5-0
-MQD`!`,9""$#'0VP`````QT0D!`````"-0SR)!"3H_/___XE<)`2)-"3H_/__
-M_XM<)!"+="04BWPD&(/$',.#[!R)7"0,B70D$(E\)!2);"08BW0D((V>X`D`
-M`(D<).C\____A,`/A;@```")'"3H_/___XG#N`````")P8"\,$(%``#_=0HX
-M1C1S$(A&-.L+@\$!@\`!@_@$==^`^00/A'\````/ML&(G`9"!0``#[?K:\5<
-MC90&3`$``+@`````Q@00`(/``8/X7'7T#[?;B5PD"&O[7(V4/F`!``"-6@R-
-M!#>)F&P!``")F'`!``"#PAB)D'@!``")D'P!``"-E#Z$`0``B9"$`0``B9"(
-M`0``B(A0`0``:\5<C80&3`$``.L%N`````"+7"0,BW0D$(M\)!2+;"08@\0<
-MPXGV@^P<B5PD$(ET)!2)?"08BW0D((V>:`D``(D<).C\____A,`/A1<!``")
-M'"3H_/___XG"N`````")PX"\,+P$``#_=1P/ML!F.8;@````<QUFB8;@````
-MZQ2-M"8`````@\,!@\`!/8````!URX#[@`^$R@````^VPXB4!KP$```/M\)I
-M^"@!``")^`.&?`4``(D$).C\____BY9\!0``#[;#9HE$%QR+AGP%``#&1`<F
-M`(N&?`4``,9$!SW_BX9\!0``QD0'//^+AGP%``#&1`<^_XN&?`4``,9$!T#_
-MBX9\!0``QD0'/_^+AGP%``#&1`=!_XN&?`4``,:$![8`````BX9\!0``QH0'
-MVP```/^)-"3H_/___XN6?`4``(F$%^@```"`?CD!=0N+AGP%``"`3`<H`8GX
-M`X9\!0``ZP6X`````(M<)!"+="04BWPD&(/$',.-="8`C;PG`````%.#[`B+
-M7"00BU0D%(G8Z(WB__^+@T@%``")!"3H_/___X/$"%O#C78`C;PG`````(/L
-M'(E<)!")="04B7PD&(MT)""-GI`)``")'"3H_/___X3`#X7=````B1PDZ/S_
-M__^)PHGPNX+___^-M@````"`N#X%``#_=1<XGN0```!S((B>Y````.L8C;0F
-M`````(/#`8/``8#[A@^$EP```.O/@/N&#X2,````#[;#B)0&O`0```^WPFGX
-ML````(GX`X:8!0``B00DZ/S___^+EI@%```/ML-FB407)(!^.0%U#8N&F`4`
-M`&;'1`<P__^+AI@%``#&1`<F`(N&F`4``&;'1`<R``"+AI@%``!FQX0'D```
-M`/__QT0D!`````"+AD@%``")!"3H_/___XGX`X:8!0``ZP6X`````(M<)!"+
-M="04BWPD&(/$',.0C70F`%93@^P4BW0D((M$)"0/MT`D#[:<,+P$``#&A#"\
-M!```_P^WVXE<)`2-AI`)``")!"3H_/___VG;L````(G8`X:8!0``@'@T_W0,
-MB40D!(DT).C\____QT0D!`````"+AD@%``")!"3H_/___X/$%%M>PXVT)@``
-M``"-O"<`````4X/L"(M<)!"+1"04#[90,P^VA!J\!```QH0:O`0``/\/M\")
-M1"0$C8.X"0``B00DZ/S____'1"0$`````(N#2`4``(D$).C\____@\0(6\-3
-M@^P(BUPD%(![*/]T&HU#6(E$)`2+5"00BT(4B00DZ/S____&0RC_@\0(6\.-
-M=@!3@^P(BUPD%(![3/]T'8V#[````(E$)`2+5"00BT(4B00DZ/S____&0TS_
-M@\0(6\.#[!R)7"0,B70D$(E\)!2);"08BUPD((ML)"0/MT4<#[:\`[P$```/
-MM\=I\"@!``")\`.#?`4```7H````B40D!(D<).C\____#[=5'(N$D[P"``"%
-MP'08@WAP`'42QX23O`(```````"-M"8`````#[=%',:$`[P$``#_#[?'B40D
-M!(V#:`D``(D$).C\____B?`#@WP%``"`>$+_=`R)1"0$B1PDZ/S___^);"0$
-MB1PDZ/S___^+@WP%``#&1`8F`(N#?`4``,9$!B<!BUPD#(MT)!"+?"04BVPD
-M&(/$',/K#9"0D)"0D)"0D)"0D)"#[!R)7"0,B70D$(E\)!2);"08BVPD((MT
-M)"1F@7XDX0$/A;D````/MD8F@^@1/`$/AZH````/MT809CV%``^'5`$```^W
-MP`^VA`6\!```BY68!0``//\/A#L!```/ML!IP+````"-'`*`:RD!C7L4B3PD
-MZ/S___^)PCGP=4*)7"0$B2PDZ/S___\[>Q0/A`4!``#'0U@`$GH`QT-@````
-M`(E;9(U#6(E$)`2+112)!"3H_/___\9#*`#IV0```)"+0Q2)4`2)`HEZ!(E3
-M%(L6BT8$B4($B1#INP```(UV``^W1A!F/84`#X>J````#[?`#[:4!;P$``"+
-MC7P%``"+1B0E____`#WA`1``#X2&````@?K_````='YIPB@!``"-'`&`:T\!
-MC7L0B3PDZ/S___^)PCGP=4B)7"0$B2PDZ/S___\[>Q!T3\>#[``````2>@#'
-M@_0`````````B9OX````C8/L````B40D!(M%%(D$).C\____QD-,`.L:B?:+
-M0Q")4`2)`HEZ!(E3$(L6BT8$B4($B1"+7"0,BW0D$(M\)!2+;"08@\0<PXUT
-M)@"#[!R)7"0,B70D$(E\)!2);"08BWPD((ML)"0/MU4>B=!FP>@%#[?8#[?R
-MB?&#X1^X_O___]/`B<$A1)]@9H'Z_P]T28T$M0`````#A]`%``"#.`!T-\<`
-M`````"&,G]0%``")="0$C8=`"0``B00DZ/S___^);"0$B3PDZ/S___^);"0$
-MB3PDZ/S___^+7"0,BW0D$(M\)!2+;"08@\0<P^L-D)"0D)"0D)"0D)"0D(/L
-M'(E<)!")="04B7PD&(M\)""+="0D9H%^).$!#X62````#[9&)H/H$3P!#X>#
-M````#[=&$+K_````9CV%`'<+#[?`#[:4![P$``!IPK````")PP.?F`4``(![
-M*/]U/`^V5FBX"````(32=`.-!!(/ML!IP$!"#P")0UC'0V``````B5MDC4-8
-MB40D!(M'%(D$).C\____QD,H`(M3&(ES&(U#%(D&B58$B3*`0RD!Z9\````/
-MMT80N?\```!F/84`=PL/M\`/MHP'O`0``(N7?`4``(M&)"7___\`/>$!$`!T
-M<&G!*`$``(T<`H![3/]U30^V5FBX"````(32=`.-!!(/ML!IP$!"#P")@^P`
-M``#'@_0`````````B9OX````C8/L````B40D!(M'%(D$).C\____QD-,`)"-
-M="8`BU,4B7,4C4,0B0:)5@2),H!#3P&+7"00BW0D%(M\)!B#Q!S#C;8`````
-MC;\`````55=64X/L+(M$)$0/MU`09H'ZA0`/AQ\#```/M\*+7"1`#[:,`[P$
-M``"X_____X#Y_W1B9H/Z?W<=#[;!BUPD0(N3?`4``&G`*`$``(M$$"P/MD`$
-MZS]F@?J!`'<=#[;!BUPD0(N3M`4``&G`%`T``(M$$`@/MD`$ZQL/ML&+7"1`
-MBY.8!0``:<"P````BT005`^V0`0/ML"+5"1`#[:L`D(%``!KQ5R-A`),`0``
-MB40D((N2M`4```^VP6G`%`T```'"B50D'(M$)$2+4#0/MD(!/!)T)SR1#X4J
-M`@``:\5<N0````"+5"1`@+P"5@$````/A-H!``#I<0$``&O%7`-$)$"+B$P!
-M``")3"0H#[9:"8A<)"8/ME(:B%0D)[L`````@+A6`0```'1FOP````!K]5R+
-M1"1`C:PPA`$``)")+"3H_/___XG#BU0D0(T$%HN0B`$``(F8B`$``(DKB5,$
-MB1J+3"0<.4LP=1,/MD--BU0D1#I"%708C;8`````@\<!B?F+1"1`.(PP5@$`
-M`'>NBU0D1(M"4(7`=!")1"0$BTPD*(D,).C\____BT0D1(E$)`2+5"0HB10D
-MZ/S___\/MH.6````C5`!B).6````/`-W.(!\)"<`=3''1"00`````,=$)`P"
-M````BTPD1`^V016)1"0(BT,PB40D!(M<)"")'"3H_/___^LVC4(!B(.6````
-M@/H"=BB`?"0G`'4AQD,G`L9#)O^`8RC^B5PD!(M$)"B)!"3H_/___^D?`0``
-M#[9$)">)1"0,#[9$)":)1"0(BU0D'(E4)`2+3"0@B0PDZ/S____I]````+X`
-M````:]U<BT0D0(V\&(0!``")/"3H_/___XG!BU0D0(T$$XN0B`$``(F(B`$`
-M`(DYB5$$B0J+1"0<.4$P=1(/MD%-BU0D1#I"%707D(UT)@"#Q@&)\(M4)$`X
-MA!I6`0``=Z\/ME$DB="#X`:#^`9U*/;"`70CB4PD#(M<)$0/MD,5B40D"(M!
-M,(E$)`2+1"0@B00DZ/S___^+5"1$BT)0A<!T$(E$)`2+3"1`B0PDZ/S___^+
-M7"1$B5PD!(M$)$")!"3H_/___^LIBU0D0`^VJD$&``!KQ5R-A`),`0``B40D
-M((N2M`4``+CL!@T`Z5_]__^#Q"Q;7E]=PXVV`````%575E.#[`R+;"0@BWPD
-M)(M<)"C&0R<!QD,F`(E<)`C'1"0$!@```(D\).C\____@WLP`'02BU,(BT,,
-MB4($B1"+0S"`:#`!@'M/`'0=C78`B2PDZ/S____'!"0!````Z/S___^`>T\`
-M=>:+D^0```"%TG0;QT0D"`$````/MH/9````B40D!(D4).C\____BU,PA=)T
-M&,=$)`@!````#[9#38E$)`2)%"3H_/___XMS((7V#X2@````@WYP``^%B```
-M`(-^=``/A7X```#V0R@$=1^)+"3H_/___\=$)`@!````BT,@B40D!(DL).C\
-M____BU,@#[9"`HE$)`@/MD(!B40D!,<$)+H"``#H_/___XM#((E$)`B+A4@%
-M``")1"0$QP0D`0```.C\____BT,@B40D"(N%2`4``(E$)`3'!"0&````Z/S_
-M___'0R``````QT9@`````(M3-(72=`P/MD--QT2"/`````"+$XM#!(E"!(D0
-M@&\*`8E<)`2)+"3H_/___X!_!?]T3H!_"@!T.+L`````C7<XC;8`````B30D
-MZ/S___^+5SR)1SR),(E0!(D"@'@F_W4*@\,!.%\*=@?KVSA?"G<0QD<%_XE\
-M)`2)+"3H_/___X/$#%M>7UW#C;0F`````(V\)P````!55U93@^P,BVPD*,9%
-M)P'&128`B6PD",=$)`0&````BT0D)(D$).C\____@WTP`'02BU4(BT4,B4($
-MB1"+13"`:#`!@'U/`'0EC;0F`````(M4)"")%"3H_/___\<$)`$```#H_/__
-M_X!]3P!UXHN5Y````(72=!O'1"0(`0````^VA=D```")1"0$B10DZ/S___^+
-M53"%TG08QT0D"`$````/MD5-B40D!(D4).C\____BUT@A=L/A$$!``#V12@$
-M=6F+3"0@B0PDZ/S____'1"0(`0```(M%((E$)`2+1"0@B00DZ/S___^+52`/
-MMD("B40D"`^V0@&)1"0$QP0DN@(``.C\____BT4@B40D"(M4)""+@D@%``")
-M1"0$QP0D`0```.C\____ZST/MD,"B40D"`^V0P&)1"0$QP0DN@(``.C\____
-MBT4@B40D"(M,)""+@4@%``")1"0$QP0D`0```.C\____BU-PA=(/A$0!```/
-MMT4<BTPD(,>$@;P"````````QT-P`````,=$)`C_____B5PD!(M#>(D$)/_2
-MZ1$!```/MT4<BTPD(,>$@;P"````````QT-T`````(M#>(D$)/_2]D4H`G0A
-MBT4@B40D"(M4)""+@D@%``")1"0$QP0D!@```.C\____QT4@`````,=#8```
-M``"+532%TG0,#[9%3<=$@CP`````BU4`BT4$B4($B1"+3"0D#[91"H/J`8A1
-M"HM%-(7`=`=F@W@R`G5HA-)T9+X`````BWPD)(/'.(D\).C\____B<.+5"0D
-MBT(\B5H\B3N)0P2)&(7;="OV0R@"="6+0R")1"0(BTPD((N!2`4``(E$)`3'
-M!"0&````Z/S___^`8RC]@\8!B?"+5"0D.$(*=ZB);"0$BTPD((D,).C\____
-M@\0,6UY?7<.+4W2%T@^%Y/[__^D!____D(VT)@````"#["R)7"0<B70D((E\
-M)"2);"0HBUPD,(M#+(LHB2PDZ/S___^)QH7`#X3,````B2PDZ/S___^)QX7`
-M=1C&@[4````!B70D!(DL).C\____Z:8```#&1B2@C58EN`````#&!!``@\`!
-M@_@%=?3&1BH`QD8K`,9&+`#&1BV(QD8N`,9&+P#&1A6K#[=#'&:)1A");AC'
-M1F0(````QT8@B````(M'"(E&-`6(````B48XQD8<)(E^4,=&;`````"-7CS'
-M1"0$`````(D<).C\____QT0D#(@```"+1PR+5Q")1"0$B50D"(D<).C\____
-MB70D!(DL).C\____BUPD'(MT)""+?"0DBVPD*(/$+,.)]E93@^P4BW0D((V>
-MN`D``(D<).C\____A,`/A?$```")'"3H_/___XG"N8#___^`OCP%``#_=!*`
-MOCT%``#_#X7,````N8'___\XCN,```!S!HB.XP```(#Y@@^$L`````^VP8B4
-M!KP$```/M\)IV!0-``")V@.6M`4``+@`````Q@00`(/``3T4#0``=?*)V@.6
-MM`4``(U"$(E"$(G:`Y:T!0``C4(0B4(4B=H#EK0%``"-0AB)0AB)V@.6M`4`
-M`(U"&(E"'(G:`Y:T!0``C4(HB4(HB=H#EK0%``"-0BB)0BR+AK0%``"(3`,S
-MQT0D!`````"+AD@%``")!"3H_/___XG8`X:T!0``ZPF-="8`N`````"#Q!1;
-M7L.0C70F`%.#[`B+1"00BY@@"@``!4`)``")!"3H_/___XG!#[?`P>`&C108
-MBT0D%(D0N`````#&!!``@\`!@_A`=?0/M\&#Q`A;PXUT)@"-O"<`````@^P,
-MBT0D$(V0$`$``+D`````.9`0`0``=`J)%"3H_/___XG!B<B#Q`S#D)"0D)"0
-M#[9$)`AIP'0$```%=$4``(M4)`2)`L.)]HV\)P````"+5"0(#[9,)`P/MT1*
-M<(/``6:)1$IP#[92`@'0#[?`PXM4)`2X`0```(VT)@````"`NCLR```!=!*#
-MP`&!PJ0```"#^"!UZ6:X___SPXUV`%93BW0D#`^V3"00#[9<)!2)\K@!````
-M.(HX,@``=1@XFCDR``!U$&G`I````,:$!I<Q```!ZPZ#P`&!PJ0```"#^"!U
-MTEM>PY"-M"8`````55=64X/L"(M\)"`/MD0D)(A$)`>+;"0<BU0D*,8"_@^V
-M702(7"0#A-MT5XGJN0````"^`````+@`````C70F`#FZY$<``'4HB?,Z7"0'
-M=19IP'0$```/MH0%V$4``(M4)"B(`NL<@\8!C;0F`````(/!`8/``8'"=`0`
-M`#I,)`-UOH/$"%M>7UW#C;8`````55=64X/L'(ML)#0/MEPD/(M\)#"`?"0X
-M`708#[9W!+L`````B?"$P`^$(P$``.GX````QD0D&P"#?"1```^$TP```(M4
-M)$")5"04#[97!,9$)!L`A-)T*XGXQD0D&P"Y`````#FHY$<``'4'.-ET$X/!
-M`8!$)!L!!70$```X5"0;=>$/MFPD&VG==`0``(V$'W1%``#'1"0(9````(E$
-M)`2+1"04B00DZ/S___^`O!]T10```'1?O@````")W8V4'W!%``")5"00C;0F
-M`````(GR#[;"P>`$BU0D%(U<`F"-2P2-A"C@1P``C00'C5`(BT`(B4,$BT($
-MB4$$BT((B4$(BT(,B4$,@\8!B?"+5"00.$($=[H/MD0D&VG`=`0```^VA`=T
-M10``ZRF)^KD`````NP`````YJN1'```/E,`!PX/!`8'"=`0``(GP.,%UY@^V
-MPX/$'%M>7UW#C70F`%575E.#[`0/MD0D)(A$)`,/MUPD*&:)'"2+?"08O@``
-M``")]6G6.`P``(M$)!PY1#H4=7"-3!<4N`````"-=@")PP^V41R$TG0&@/KP
-M=4B0:<4X#```C11;C130C0PZBUPD'(E9'(M$)"")02"-01`/MQPD9HE8%@^V
-M7"0#B%@4B<*+7"0LBP.)0AB+0P2)0AS&03#_ZPV#P`&#P1@]@@```'6<@\8!
-M@_X$#X5R____@\0$6UY?7<.0C;0F`````%575E.#[`R+;"0DBW0D((!^!`!T
-M2;\`````C;8`````B?@/MMAIPW0$``"`O`;810``_70?QT0D"`@```");"0$
-MC80&T$4``(D$).C\____A,!U#X/'`8GX.$8$=\*[_P```(G8@\0,6UY?7<.-
-M=@!3@^P(BUPD$(M$)!2)1"0$B1PDZ/S___^Z"0```#S_=!$/ML!IP'0$```/
-MMI0#>D4``(G0@\0(6\.-M"8`````55=64X/L#(M\)""+;"0H#[9T)"P/MUPD
-M,(GYC9?T,```N`````#&!!``@\`!/9````!U\L:!]3```!/&@?0P``!`#[;'
-MB('Z,```B)G[,```B?"(@?TP``#'@9`Q``#0Z0(`B;F,,0``BT5<B8&$,0``
-MBT5@B8&(,0``C8'T,```B40D!(M$)"2)!"3H_/___X/$#%M>7UW#C;0F````
-M`%575E.#[$P/MD0D;(A$)#\/MU0D<&:)5"0@BU0D8(G7N`$```")Q8G&@+H[
-M,@```0^%W````&G`I`````'XC9"0,0``QD('`(FXC#$```^V2@9IP:0```"-
-ME`?T,```N`````#&!!``@\`!/9````!U\FG9I````(T,.XV1\#```,9"!9#&
-M0@1`#[=$)"`/ML2)1"0<B$(*#[9$)""(@?LP```/MDPD/XA*#8M,)'2+`8E"
-M%(M!!(E"&&G6I````(T$.L>`D#$``-#I`@"+3"1@B8B,,0``C907@#$``(M,
-M)&B+05R)0@2+06")0@B)Z@^VPFG`I````(V$!_0P``")1"0$BTPD9(D,).C\
-M____ZQ2#P`&!PJ0```"#^"`/A0'___^P`8/$3%M>7UW#B?955U93@^P,#[9L
-M)"@/MGPD+(M,)"")SK@!````C70F`(G"@+D[,@```0^%P@```&G`I````(V$
-M!I`Q``")Z8A(!(G[B%@%QD`'``^V6`9IPZ0```"-C`;T,```N`````#&!`@`
-M@\`!/9````!U\FG#I````(V$!O`P``#&0`40QD`$0(GYB$@-:=*D````#[:,
-M%I8Q``!IR:0```"-!#''@)`Q``#0Z0(`BUPD((F8C#$``(V<%H`Q``")Z@^V
-MPFG`=`0``(V4!L!%``"+0A")0P2+0A2)0PB-A`[T,```B40D!(M,)"2)#"3H
-M_/___^L4@\`!@<&D````@_@@#X4=____L`&#Q`Q;7E]=PXUV`%93@^P4BW0D
-M(`^V1"0HB?/&AI<Q````C8[T,```N@````#&!`H`@\(!@?J0````=?'&@_4P
-M```!QH/T,```0,>#D#$``-#I`@")LXPQ```/ML!IP'0$``"-E`/`10``BT(0
-MB8.$,0``BT(4B8.(,0``C8/T,```B40D!(M$)"2)!"3H_/___X/$%%M>PXUV
-M`%93@^P4BW0D(`^V1"0HB?/&AI<Q````C8[T,```N@````#&!`H`@\(!@?J0
-M````=?'&@_4P````QH/T,```0,>#D#$``-#I`@")LXPQ```/ML!IP'0$``"-
-ME`/`10``BT(0B8.$,0``BT(4B8.(,0``C8/T,```B40D!(M$)"2)!"3H_/__
-M_X/$%%M>PXUV`%575E.#[$P/MGPD:`^V5"1L#[9$)'"(1"0GBVPD8(GY#[;)
-MB4PD*&G!=`0``("\!=A%``#]#X0Y"0``@/H0#X2Y`@``@/H0=QR$TI"-="8`
-M#X2A````@/H!#X45"0``D.D+`0``@/KB=!N`^O^-=@!T*8#ZD`^%^0@``)"-
-M="8`Z38'``"Y`````(!]!`")]@^%.@@``.E="```:40D*'0$``#&A`7810``
-M_X"]ES$```%U+8M<)"B)7"0(BW0D9(ET)`2+?"1@B3PDZ/S___^%P`^%G`@`
-M`(!%!@'IDP@``(M$)"C&1`4'`8M4)&2)5(4,Z7T(``"`O9<Q```!=5J-C?0P
-M``!I1"0H=`0```'H#[91"8B0=D4```7010``#[91"H/B`8A0"<9`"`"+3"0H
-MB4PD"(M<)&2)7"0$BW0D8(DT).C\____A<`/A2,(``"`108!Z1H(``"+?"0H
-MQD0]!P&+1"1DB42]#.D$"```:70D*'0$``"-/"X/MH4F,0``B(?&10``#[>%
-M)#$``&:)A#7$10``C90UL$4``(N%'#$``(E"!(N%(#$``(E""(V4-8!%``"+
-MA0`Q``")0@2+A00Q``")0@B-G#6010``C4L$C94(,0``BX4(,0``B4,$BT($
-MB4$$BT((B4$(BT(,B4$,BX48,0``B80UK$4``,:'V$4```&`?08?#X1B!P``
-MNP````!I1"0H=`0```'HC;!P10``C;C`10``ZU20#[;#B40D#(M4)"B)5"0(
-MBTPD9(E,)`2+1"1@B00DZ/S___^%P'01:40D*'0$``"(G`7'10``ZR"#PP&`
-M108!.%X&#Y3`@^@!(=B(1P>`?08?=`4Z7@9RJ,:%ES$```$/MDT$A,D/A-D&
-M``"Z`````(!]!P%T#.M$#[;0@'P5!P%U/\9$%0?_QT0D%`````#'1"00````
-M`,=$)`S_````B50D"(M$E0R)1"0$BU0D8(D4).C\____Z8@&``"X`````(/`
-M`3C(=;#I=P8``(M,)'2)3"0P@\$8B4PD+(U,)$"+7"0PBT,8B40D0(MT)"R+
-M1@2)1"1$:40D*'0$``"--"B-EM!%``#&0@@0]D,,<`^$90,``(N&W$4``(7`
-M#X2(````#[9:"L=$)`@(````B4PD!(/`7(D$).C\____A,!U:8M$)##V0`\/
-M=%^+AMQ%``"%P'15B<:`?F4`=$T/MMN)7"0(B70D!(DL).C\____BU0D+(E4
-M)!0/M\")1"00B5PD#(ET)`B+3"1DB4PD!(M<)&")'"3H_/___P^V7F:+1FB%
-MP'0$B<;KK8MT)#`/MD8/J`T/A/T```!I5"0H=`0```^VC!5T10``@/D?#X?D
-M````J`AT$@^VP<'@!`'0QH0%Z$<```;K&`^VP<'@!&E4)"AT!````=#&A`7H
-M1P``!P^V\8GRP>($:5PD*'0$```!VHV,%>!'``#&00D`BWPD,`^V1P^(00N+
-M1"1`B4$0BT0D1(E!%`^V1PF(00H/MD<-@^`/#[:4'7I%```XT'8"B=")PH/B
-M#P^V00R#X/`)T(A!#(GPP>`$:50D*'0$```!T(V,!>!'``"+7"0P#[9#*8/@
-M#P^VE!5Z10``.-!V`HG0P>`$#[91#(/B#PG"B%$,:40D*'0$``"`A`5T10``
-M`>G"`0``J`(/A+H!``"-1"1`B40D!(DL).C\____B<(\_P^%7P$```^V302$
-MR70X#[:%V$4``#S_="VZ`````#S]=1OK(@^VPFG`=`0```^VA`7810``//]T
-M$CS]=`Z#P@$XRG7@ZP6Z``````^VPFG`=`0``(V,!71%``"X`````,8$"`"#
-MP`&#^&1U]`^VTHE4)#1ITG0$``"-'"J)^0^VP6G`=`0``(V$!71%``")@]Q%
-M``"-C!7`10``:70D*'0$``"-E#7`10``BT(0B4$(BT(4B4$,BWPD9(F[Y$<`
-M``'NBX;@10``B8/@10``QH/810``_XV#<$4```^V2`N+?"0P#[97"8B4"WQ%
-M``"`0`L!#[:.>D4```^V5PV#X@\XRG8"B<J(4`II5"0T=`0``(V,%<!%``"+
-M1"1`B4$0BT0D1(E!%`'JBTPD,`^V00^(@G=%```/MEPD)XB:VD4```^V104Z
-M101U!,9%!0"`104!BW0D-,9$-0<!BWPD9(E\M0SK06E$)"AT!```#[;2:<IT
-M!```C90-=$4``#F4!=Q%``!T((T<*8V#<$4```^V2`N+="0P#[96"8B4"WQ%
-M``"`0`L!BWPD,`^V1PF)1"0(BT0D*(E$)`2)+"3H_/___VE$)"AT!```@+P%
-MQT4````/A)P```"`?08?=7#IC0(``,:&V$4``!`/MD,'B40D#(M4)"B)5"0(
-MBTPD9(E,)`2+1"1@B00DZ/S___^%P`^%6@(``(!%!@$/MDL'#[;!@\`!#[:6
-M=D4``#G0=0W&0P<`Z3@"``"-="8`C4$!B$,'@'T&'P^$)`(``.L1:40D*'0$
-M``"--"B-GL!%```/MD,'.H9V10``#X)T____Z?P!``"`?08`#X7R`0``QT0D
-M%`````#'1"00`````,=$)`R0````BU0D*(E4)`B+3"1DB4PD!(M<)&")'"3H
-M_/___^FY`0``OP````!IQS@,``"+="1D.70H%'5VC5P%,+X`````B40D((UV
-M`(`[_W53@'T&'P^$A0$``(T$=HM4)""-1,(0C40%&(E$)!0/MT/VB40D$`^V
-M0_2)1"0,BT/PB40D"(M,)&2)3"0$BT0D8(D$).C\____A<!U!X!%!@'&`_"#
-MQ@&#PQB!_H(```!UFH/'`8/_!`^%;O___X!]!@`/A1@!```/MDT$A,D/A-@`
-M``"Z`````(!]!P%T#.M$#[;0@'P5!P%U0<9$%0?_QT0D%`````#'1"00````
-M`,=$)`S_````B50D"(M$E0R)1"0$BU0D8(D4).C\____Z;L```"X`````(GV
-M@\`!.,AUKNMWC;0F``````^VP6G`=`0``(V4!=!%```/MD((//UT"#S_=`3&
-M0@C^@\$!.$T$=]AI1"0H=`0``(N<!>!%``"_`````(UT)@"`?"\8`749QD0O
-M&`"+1"\4B40D!(M,)&")#"3_TXUV`(''.`P``('_X#```'0VZ]#'1"04````
-M`,=$)!``````QT0D#.(```"+7"0HB5PD"(MT)&2)="0$BWPD8(D\).C\____
-M@\1,6UY?7<.-="8`@^PLB5PD((ET)"2)?"0HBW0D-(N>F````(![!@`/A(0!
-M``"-AI````")1"0$B1PDZ/S___^)P3S_#X1H`0``B?</MD8!/`%T;#P!<A@\
-M$`^$K````#R0#X5*`0``C78`Z?H```"`NY<Q````C70F``^%,0$``,:#ES$`
-M``&`:P8!QT0D%`````#'1"00`````,=$)`P`````#[;!B40D"(M$)#")1"0$
-MB1PDZ/S____I\@```("[ES$````/A>4```#&@Y<Q```!@&L&`<=$)!0`````
-MQT0D$`````#'1"0,`0````^VP8E$)`B+1"0PB40D!(D<).C\____Z:8```"Z
-M`````#J,&C@R``!U$0^VA!HY,@``.D<)=!*-="8`@<*D````@?K<$P``==B`
-M:P8!B7PD%`^V1PF)1"00QT0D#!`````/ML&)1"0(BT0D,(E$)`2)'"3H_/__
-M_^M(#[:&H@```&G`I````,:$`Y<Q```!@&L&`<=$)!0`````QT0D$`````#'
-M1"0,D`````^VP8E$)`B+1"0PB40D!(D<).C\____BUPD((MT)"2+?"0H@\0L
-MPXGVC;PG`````%93BU0D$`^V="04BUPD#(72=`^)V8G0Q@$`@\$!@^@!=?6)
-M$X'J=$4``,'J`KA9MOER]^+!Z@>(4P2)\#C0<P.(0P2`>P0`="6Z`````(GV
-M#[;"QD0#!_]IP'0$``#&A`/810``_8/"`3A3!'?BQD,&`,9#!0")V+H`````
-MC78`QH"7,0```8B0EC$``(/"`06D````@_H@=>9;7L.-=@!75E.+?"04BTPD
-M$(!Y!``/A($```"[``````^V\VG&=`0``#F\`>1'``!U8K@`````.)P(.#(`
-M`'4(QH0(.S(```$%I````#W<$P``=>-IQG0$``#'A`'D1P```````(V4`71%
-M``"X`````)"-="8`Q@00`(/``8/X9'7T:<9T!```QH0!V$4``/V`:04!@\,!
-M.%D$=X2)R[X`````.7L4=2W'0Q0`````QD,8`&G&.`P``(U$`12Z`````(UT
-M)@#&0!P`@\(!@\`8@/J"=?&#Q@&!PS@,``"#_@1UP%M>7\/K#9"0D)"0D)"0
-MD)"0D)!55U93@^P<#[9$)#R(1"0:BUPD,`^V0P4Z0P1U!,9#!0`/ME,%B%0D
-M&XG=B=BY`````(G.B<^+4!0[5"0T=4IIP3@,``#&1`,8`0^V4P3&1"0;`(32
-M=%O&1"0;`(M\)#0YO>1'``!U#@^VA=A%``"#P`,\`78\@$0D&P&!Q70$```X
-M5"0;="OKTX72=15IQS@,```!V(M4)#2)4!3&0!@!ZQ"#Q@&#P0$%.`P``(/Y
-M!'6`B?(/ML)IP#@,``"-1`,<N@````#&!`(`@\(!@?H"#```=?$/MG0D&XM\
-M)#2)?+,,:<9T!```C90#=$4``+@`````Q@00`(/``8/X9'7T:<9T!```C90#
-MY$4``+@`````Q@00`(/``3T``@``=?)ISG0$``"-%!F+1"0TB8+D1P``BT0D
-M0(F"X$4``,:"V$4``/_'@MQ%````````C8P+P$4``(M\)#B+!XE!$(M'!(E!
-M%`^V1"0:B()Z10``QT0D%`````#'1"00`````,=$)`S_````B70D"(M4)#2)
-M5"0$BWPD,(D\).C\____@$,%`8/$'%M>7UW#D)"0D)!64XM4)`R+`HLP#[98
-M*X3;=#</ME()N0````#VP@%T"NLGB=#3^*@!=0>#P0$XV77Q@/D#=A@/ML&-
-MA(;0`0``BP"C`````.L6N0`````/ML&-A(;0`0``BP"C`````,'H%(/@`5M>
-MPY"-M"8`````55=64X/L!(M$)!B+$`^V>BN]"@```(GYA,ET20^V<`F[````
-M`+T*````N0````"0B?#3^*@!=!X/MH+""P``@^`#@\`(B$0D`XGH.D0D`W8%
-M#[9L)`.#PP&#P0&#PD2)^#C#=<N)Z@^VPH/$!%M>7UW#C;0F`````(V\)P``
-M``!55U93@^P$BT0D&(L0#[9Z*[T(````B?F$R71)#[9P";L`````O0@```"Y
-M`````)")\-/XJ`%T'@^V@L(+``"#X`.#P`B(1"0#B>@Z1"0#<P4/MFPD`X/#
-M`8/!`8/"1(GX.,-URXGJ#[;"@\0$6UY?7<.-M"8`````C;PG`````%.+7"0(
-M#[8#P.@$B<*#X@</MDL"]L$$=`.`S@(/MD,#J`1T!H'*```"`/;!"'0#@,X(
-MJ`AT!H'*```(`/;!`G0#@,X$J`)T!H'*```$``^V0Q3!X!@)T%O#C;0F````
-M`(/L!(M$)`B)!"3H_/___X/$!,.-M@````"-O"<`````BTPD!(N!7`4``"7_
-M__\`N@`````]4`&3`'45#[:!7P4``,#H!#P,#Y3`#[;0C78`B=##C;8`````
-MC;PG`````%.)PX72?D`/M@B$R70%@/D@=2VX`````.L6C;8`````#[8,&(3)
-M=`B`^2!U$XUV`(/``3G0=>GK#HVT)@````"X`````.L%N`$```!;C78`P^L-
-MD)"0D)"0D)"0D)"0D%.+7"0(#[9#`P^V4P+!X@@)T,'@$`^V2P$/MA/!X@@)
-MT0G(6\.-="8`C;PG`````%=64XG&B=.)SX7)=!ZY``````^V%@^V1@&(`XA3
-M`8/#`H/&`H/!`3GY=>=;7E_#D(/L'(E<)!")="04B7PD&(MT)""+?"0D#[='
-M$+K_````9CV%`'<+#[?`#[:4!KP$```/M])ITK`````#EI@%``"+GD0*```/
-MMD(TP>`(C80#3`@``(L(B0T`````@>'_````#[9"-,'@"(V<`T0(``"+`Z,`
-M````P>`("<B)@J````!FQX*<``````")?"0$B30DZ/S___^+7"00BW0D%(M\
-M)!B#Q!S#B?:-O"<`````@^P<B5PD#(ET)!")?"04B6PD&(ML)"`/MGPD)(MU
-M`(GX/`-V,`^VV,'C`XV$'C`"``#'``P```#'!"00)P``Z/S___^-A!XT`@``
-MBS")-0````#K,(GX#[;8P>,#C80S4`(``,<`#````,<$)!`G``#H_/___XV<
-M,U0"``"+,XDU`````(GX#[;(B<C!X`:-!(B-E`60"P``#[9:$8/C_(A:$8GP
-M)0``/P`]```0`'4/B=B#R`*(0A'K&9"-="8`B<C!X`:-%(B)V(/(`8B$%:$+
-M``"+7"0,BW0D$(M\)!2+;"08@\0<PY"-M"8`````55=64X/L'(M$)#2+5"0P
-MBQ*)5"08BQ+&0"4`QD`D!<9`)P:+3"0PB4@LN0````"]`````(V"``(``(E$
-M)!2!P@0"``")5"00ZQ>-M@````"+5"0P#[9""=/XJ`%U#(/!`8M$)!@Z2"MR
-MYH#Y`W9Q#[;9P>,#BWPD%`'?QP<L````QP0D$"<``.C\____`UPD$(LSB34`
-M````QP<D````QP0D$"<``.C\____BP.C`````,'@"('F_P````G&QP<@````
-MQP0D$"<``.C\____BQN)'0````#K;XVT)@`````/MMG!XP.+?"04`=_'!RP`
-M``#'!"00)P``Z/S___\#7"00BS.)-0````#'!R0```#'!"00)P``Z/S___^+
-M`Z,`````P>`(@>;_````"<;'!R````#'!"00)P``Z/S___^+&XD=`````('^
-M`0%IEG47BU0D,(!*"`:)V,'H$#Q0#Y3`#[;`ZT:!_@$!``!U$8G8P>@0/%`/
-ME,`/ML#K+XGVQP0DB!,``.C\____@\4!B>F`^01W"KD`````Z<'^__^)V,'H
-M$#Q0#Y3`#[;`@\0<6UY?7<.-="8`C;PG`````%575E.#[`R+="0@BVPD)(M&
-M5(LX9H.^G`````!T,HGKQP0DZ`,``.C\____A>UT!8/[`78;B3PDZ/S___]F
-M@[Z<`````'0)@^L"Z]2-="8`@\0,6UY?7<.0C;0F`````(/L'(E<)`R)="00
-MB7PD%(EL)!B+7"0L#[9L)"0/MWPD*`^V1"0PB$0D"XM4)""+0E2+,(DT).C\
-M____B<+&0"3AQD`E`<9`)A*X#P```(GIA,EU"(M,)"`/MD$KB$(GB?B(0BB)
-M^0^VQ8A"*0^VQXA"*HG8P>@0B$(KB=C!Z!B(0BR(6BV+3"0@#[=!)&:)0A")
-M<AC'0B``````QT(T`````+@`````@'PD"P!U!;@`````B4)LB50D!(DT).C\
-M____BUPD#(MT)!"+?"04BVPD&(/$',.-=@"-O"<`````@^P<B5PD#(ET)!")
-M?"04B6PD&(M<)"P/MFPD)`^W?"0HBU0D((M"5(LPB30DZ/S___^)PL9`).'&
-M0"4!QD`F$K@/````B>F$R74(BTPD(`^V02N(0B>)^(A"*(GY#[;%B$(I#[;'
-MB$(JB=C!Z!"(0BN)V,'H&(A"+(A:+8M,)"`/MT$D9HE"$(ER&,="(`````#'
-M0C0`````QT)L`````(E4)`2)-"3H_/___XM<)`R+="00BWPD%(ML)!B#Q!S#
-M55=64X/L'(M\)#`/MD0D-(A$)!L/MVPD.(7_#X3N````BS>%]@^$Y`````^V
-M7BN%VWY#BT=4#[90";D`````]L(!=`KK,(G0T_BH`74'@\$!.=EU\8/Y`WXA
-MBP8%T`$``(T$B(L`HP````#!Z!2#\`&#X`'K'[D`````BP8%T`$``(T$B(L`
-MHP````#!Z!2#\`&#X`&$P'5V@+^L`````'4&@'\F`'5G#[=')("\!KP$``#_
-M=%G&1R8E9L>'G`````$`#[?%#[94)!O'1"00`0```(M,)#R)3"0,B40D"(E4
-M)`2)/"3H_/___\=$)`0%````B3PDZ/S____&1R8`9H._G``````/E,`/ML#K
-M!;@`````@\0<6UY?7<.-="8`@^P<B5PD#(ET)!")?"04B6PD&(M\)"`/MFPD
-M)`^W7"0HBT=4BS")-"3H_/___XG"QD`DX<9`)0'&0"81N`\```")Z83)=00/
-MMD<KB$(GB%HH#[;'B$(I#[=')&:)0A")<AC'0B``````QT(T`````,=";```
-M``")5"0$B30DZ/S___^+7"0,BW0D$(M\)!2+;"08@\0<PXGVC;PG`````%57
-M5E.#[!R+?"0P#[9$)#2(1"0;#[=L)#B%_P^$\P```(LWA?8/A.D````/MEXK
-MA=M^0XM'5`^V4`FY`````/;"`70*ZS")T-/XJ`%U!X/!`3G+=?&#^0-^(8L&
-M!=`!``"-!(B+`*,`````P>@4@_`!@^`!ZQ^Y`````(L&!=`!``"-!(B+`*,`
-M````P>@4@_`!@^`!A,!U>X"_K`````!U!H!_)@!U;`^W1R2`O`:\!```_W1>
-MQD<F)6;'AYP````!``^WQ0^V5"0;QT0D#`$```")1"0(B50D!(D\).C\____
-MQT0D!`4```")/"3H_/___\9')@!F@[^<`````'43BX>@````BU0D/(D"N`$`
-M``#K!;@`````@\0<6UY?7</K#9"0D)"0D)"0D)"0D)"#[!R)7"0,B70D$(E\
-M)!2);"08BWPD(`^V;"0D#[=<)"@/MD0D+(A$)`N+1U2+,(DT).C\____B<+&
-M0"3AQD`E`<9`)A&X#P```(GIA,EU!`^V1RN(0B>(6B@/ML>(0BD/MT<D9HE"
-M$(ER&,="(`````#'0C0`````N`````"`?"0+`'4%N`````")0FR)5"0$B30D
-MZ/S___^+7"0,BW0D$(M\)!2+;"08@\0<PXUV`(/L'(E<)`R)="00B7PD%(EL
-M)!B+;"0D#[9T)"@/MGPD+(M$)""+&(D<).C\____B<*%P'40QH6U`````<9%
-M)@/I?P```,9`).'&0"4!B?`\`1G`]]"#P`*(0B:)^(3`=3^#?30`=`0/MD5-
-MB$(G#[=%'&:)0A")6AC'0B``````QT(T`````+C`+@,`B4)LB50D!(D<).C\
-M____ZR>-=@#&0B</#[=%'&:)0A")6AC'0B``````QT(T`````+@`````Z\B+
-M7"0,BW0D$(M\)!2+;"08@\0<PY"-M"8`````55=64X/L+(ML)$B+1"1`BQ"+
-M1"1$P>`#C;P0``(``(VT$`0"``"['`$``)"-="8`@WPD1`-V&8D?QP0D$"<`
-M`.C\____BP:C`````.L7B?:)'\<$)!`G``#H_/___XL&HP````")A!ST_O__
-M@\,$@?LX`0``=;F+1"00B44`BT0D%(E%!(M$)!B)10B+1"0<B44,BT0D((E%
-M$(M$)"2)112+1"0HB448@\0L6UY?7<-55U93@^PLBVPD2(M$)$"+$(M$)$3!
-MX`.-O!```@``C;00!`(``+L``0``D(UT)@"#?"1$`W89B1_'!"00)P``Z/S_
-M__^+!J,`````ZQ>)]HD?QP0D$"<``.C\____BP:C`````(F$'!#___^#PP2!
-M^QP!``!UN8M$)!")10"+1"04B44$BT0D&(E%"(M$)!R)10R+1"0@B440BT0D
-M)(E%%(M$)"B)11B#Q"Q;7E]=PU575E.#[#R+3"14B$PD$XM$)%"+`(E$)!@/
-MMOF)^,'@!HT$N`-$)%"-D)`+``"(2A"+3"10B8B<"P``QD(2`(E\)`2)#"3H
-M_/___XUT)!R)\(GRQ@``@\`!B=.-;"0\.>AU\`^V1"03B40D%(E4)`B)1"0$
-MBU0D4(D4).C\____B1PDZ/S___^)1"0,C0R]`````(GZP>(&C101BT0D4(T<
-M`HM$)`R)@Z@+``"+1"10C900H`L``(M$)"B)0@R+1"0LB4(0@'PD$P-V*8M4
-M)!B-A`K0`0``BP"C`````(F#P`L``(V$^H`!``"+$(D5`````.L_C12]````
-M`(M,)!B-A!'0`0``BPB)#0````")^,'@!@'"BT0D4(F,$,`+``"+5"08C83Z
-M@`$``(L0B14`````B?C!X`:-!+@#1"10B9#$"P``]H#""P``$`^$/0$``/:`
-MH0L```)T7(UT)@#&!@"#Q@$Y[G7VC5PD'(E<)`B+3"04B4PD!(M$)%")!"3H
-M_/___XD<).C\____B?K!X@:-%+J+3"10B801M`L``(V4$:`+``"+1"0HB4(8
-MBT0D+(E"'.L7B?C!X`:-!+B+5"10QX0"M`L```$``@"`?"03`W8YC1S]````
-M`(M,)!B-A`LP`@``QP`8````QP0D$"<``.C\____BT0D&(V<`S0"``"+$XD5
-M`````.LWC1S]`````(M4)!B-A!-0`@``QP`8````QP0D$"<``.C\____BTPD
-M&(V<"U0"``"+$XD5`````(GXP>`&C02XBTPD4/>$`<`+``````,`=0B!XO__
-M_]_K!H'*````((!\)!,#=@^+3"08C83Y-`(``(D0ZPV+3"08C83Y5`(``(D0
-M@\0\6UY?7<.0C;0F`````%575E.#[`R+?"0@BVPD)(EL)`@/MT4`9H7`>0LE
-M`!\``,'X"(A')8U'4(U-%(M5%(E74(M1!(E0!(M1"(E0"(M1#(E0#(M1$(E0
-M$(VWC````(M5+HF7C````(M5,HE6!(U?9(U--HM5-HE79(M1!(E3!(M1"(E3
-M"(M1#(E3#(M1$(E3$(M1%(E3%(M1&(E3&(M1'(E3'(M1((E3((M1)(E3)+D*
-M````B<+H0O'__[D$````B?*)\.@T\?__N10```")VHG8Z";Q__]FQT<X``!F
-MQT<Z``"+1"0(9H.XL@$```$/E,+!X@,/MD<H@^#W"="(1RCVA:<````$=`9F
-MQT<X`0#VA:0````!="1F@T\X`O:%J@````%T!6:#3SH!]H6H`````70(9H%/
-M.``!B?;VA:0````@=!=F@T\X!/:%J@```"!T"6:#3SH"C70F`/:%I````$!T
-M%V:!3SB``/:%J@```$!T"&:#3SH(C78`QD=.`O:%F0````%T,P^W1SBH`70,
-M@\@(9HE'.&:#3SH0#[:%E@```(/@'X/``8A'3CP@=0O&1TX?C;0F`````/:%
-MF`````AT!F:!3S@``O:%F`````1T!6:#3S@@]H68`````G0%9H-/.!#VA:@`
-M```@=`[VA:X````@=`5F@T\X0/9'.`%T&(N%R````(N5S````(E'1(E72.L1
-MC70F`(M5>(E71,='2`````"#1T3_@U=(__9%:@)T&0^WA8````"H#W0.9H/X
-M`AG`@\`$B$<\ZP3&1SP"QD<]_P^W57X/M\*H!'0)QD<]`NL9C78`J`)T!L9'
-M/0'K#/;"`8UV`'0$QD<]`,9'/O_V16H$=!VY``````^WA;````#3^*@!=`.(
-M3SZ#P0&#^0=UZ,=$)`0``@``B2PDZ/S___^)AY@```"+1"0(]H"F````('0@
-M#[>`K````(/@((/X`1G`@\`"B(<D`0``ZPV-M@````#&AR0!````N`$```"#
-MQ`Q;7E]=PXVV`````(V_`````(/L'(E<)`R)="00B7PD%(EL)!B+;"0@BWT`
-MNX#____K!8#[A7=*#[;##[:T![P$``")\#S_=#D/ML!IP!0-```#A[0%```Y
-M:`AU)<=$)`@(````BU0D)(E4)`2)!"3H_/___X3`=`F)\.L2D(UT)@"#PP&`
-M^X%VJ;C_____#[;`BUPD#(MT)!"+?"04BVPD&(/$',.-M@````"-OP````!5
-M5U93@^P\BU0D4(L"@'HK``^$`P,``,=$)#@`````C8@``@``B4PD&`4$`@``
-MB40D%`^V1"0XB$0D-P^VZ(GHP>`&C02HBU0D4(T<$/:#P@L``!`/A*8"``"-
-MDY`+``"X`0```(GIT^`(0A*+FZ0+``")7"0P]D(1`@^$,`$```^V7"0W@\,!
-MBW0D4#A>*P^&&P$``(T$K0````")1"0@B>K!X@:)5"0<C;0F``````^V\XGP
-MP>`&C02PBTPD4(T\"/:'P@L``!`/A-$```"+3"0@`TPD'(M4)%`!RHE4)"SW
-M@K0+``````X`#X2O````BU0D4(V$`J`+``")1"0HB<*#PAB+1"10C8P(H`L`
-M`(E,)"2)R(/`&,=$)`@(````B50D!(D$).C\____A,!T;XM$)"B#P`R+5"0D
-M@\(,QT0D"`@```")1"0$B10DZ/S___^$P'1)N`$```")\=/@BU0D+('"D`L`
-M``I"$HA"$HB'H@L``(-\)#``=0R+OZ0+``")?"0PZQ>)\,'@!HT$L(M4)#"+
-M="10B90&I`L``(/#`8M,)%`X62L/AP#___^#?"0P``^%MP```(MT)%")-"3H
-M_/___XE$)#"%P`^$1P$``(GHP>`&C0RH`?&+1"0PB8&D"P``#[9$)#>)PL'B
-M!HV$@I`+``"-1`8,BU0D,(E"&`^V@:$+``"(0@;&0@4`B3+&0@H`QD(T`,9"
-M'``/ME0D-X/"`3A6*W9=B>C!X`:-!*B-G`:0"P``D(UT)@`/MLH/MD,2T_BH
-M`707B<C!X`:-!(B+="0PBTPD4(FT`:0+``"#P@&+1"10.%`K=AGKSHGHP>`&
-MC02HBTPD,(M4)%")C`*D"P``B>C!X`:-!*B+="10C90&D`L```^V0A*+3"0P
-MB$$)#[9R$H!\)#<#=B>-'.T`````BT0D&`'8QP`X````QP0D$"<``.C\____
-M`UPD%(DSZR>-'.T`````BT0D&`'8QP`X````QP0D$"<``.C\____`UPD%(DS
-MB?:#1"0X`0^V1"0W@\`!BW0D4#A&*P^'&/W__X/$/%M>7UW#C;0F`````(V\
-M)P````!55U93@^Q,BW0D8(L>QD0D0%#&1"1!!<9$)$($QD0D0S#&1"1$$<9$
-M)$6KQD0D1@#&1"1'`,>#`$`!`!,@``"+!L>`!$`!`/__``"+!L>`!$`!````
-M```[MD@%```/A>0```"-OLP,``"-KEP%``#'1"00`0```,=$)`P(````B6PD
-M",=$)`0```(`B30DZ/S___^+AE0%```/MI9?!0``@^H$C02"B(9?!0``B30D
-MZ/S___^$P'41BT0D0(F&7`4``(M$)$2)102A``````"&7P4``(/``:,`````
-M#[:&7`4``(B'7`4```^VAET%``"(AUT%```/MH9>!0``B(=>!0``#[:&7P4`
-M`(/``HB'7P4```^VAF`%``"(AV`%```/MH9A!0``B(=A!0``#[:&8@4``(B'
-M8@4```^VAF,%``"(AV,%``")WXV#``$``(E$)"B+@P`!``"C``````^WT(E4
-M)$BH('0+)=__``")1"1(ZQ:)T(/(((E$)$B+5"0HB0*+`J,`````BP;'@`0!
-M````````BP;'@!@!````````BP;'@!P!````````QP0DD-`#`.C\____QX=P
-M`0``&`$``(N'=`$``*,`````@.3]@,P$B40D2,>'<`$``!@!``"+1"1(B8=T
-M`0``QX=P`0``*`$``,>'=`$``']_``#'AW`!```D`0``BX=T`0``HP````!F
-MN```#?\_``")1"1(QX=P`0``)`$``(M$)$B)AW0!``#'AW`!```\`0``QX=T
-M`0````!Z`,>'<`$``*0!``#'AW0!``!]O^__QX=P`0``N`$``(N'=`$``*,`
-M````)?__```-``#Z`(E$)$C'AW`!``"X`0``BT0D2(F'=`$``,>'G````/\`
-M``#'AY`"``!$`0``QX>4`@``!A``",>'D`(``+0!``#'AY0"``!?<```QX>0
-M`@``,````(N'E`(``*,`````,.2`S#.)1"1(B8>4`@``@'XK``^$>@(``,=$
-M)"P`````C8=0`@``B40D&(V75`(``(E4)!0/MD0D+(A$)#,\`P^&$0$```^V
-MZ(T4[0````")5"0DC807,`(``(E$)"#'``@```#'!"00)P``Z/S___^+5"0D
-MC9P7-`(``(L#HP````")1"1(#0``@`")`XV&7`4``(E$)`B);"0$B30DZ/S_
-M__^);"0$B30DZ/S___^+1"0@QP!$`0``QP0D$"<``.C\____QP,&$``(BU0D
-M(,<"M`$``,<$)!`G``#H_/___\<#7W```(M$)"#'``@```#'!"00)P``Z/S_
-M___'1"1(_U2``,<#_U0``,=$)`@!````B6PD!(DT).C\____BT0D)(V4!X`!
-M``"+`J,`````)?___O^)`L=$)$@%`<@`BU0D)(V$%X0!``#'``4!R`#I#@$`
-M``^V;"0SC03M`````(E$)#B+5"08`<*)5"0<QP((````QP0D$"<``.C\____
-MBUPD.`-<)!2+`Z,`````B40D2`T``(``B0.-AEP%``")1"0(B6PD!(DT).C\
-M____B6PD!(DT).C\____BT0D',<`1`$``,<$)!`G``#H_/___\<#!A``"(M4
-M)!S'`K0!``#'!"00)P``Z/S____'`U]P``"+1"0<QP`(````QP0D$"<``.C\
-M____QT0D2/]4@`#'`_]4``#'1"0(`0```(EL)`2)-"3H_/___XM$)#B-E#B`
-M`0``BP*C`````"7___[_B0+'1"1(!0'(`(M4)#B-E#J$`0``B50D-,<"!0'(
-M`,<$)*"&`0#H_/___XEL)`2)-"3H_/___X-$)"P!#[9$)#.#P`$X1BL/AZ+]
-M__^)-"3H_/___XN'!`$``*,`````@\@"B40D2(F'!`$``(M4)"B+`J,`````
-M)?#___T-#0```HE$)$B)`HL"HP````"+AB0*``")AP@!``"+AB@*``")APP!
-M``"+AD@*``")AQ`!``"+ADP*``")AQ0!``#'AR`!````````#[>&F`L``"7_
-M#P``#0```0")AR`!``"+AI`*``")AR0!``"+AI0*``")AR@!``"+AK`*``#'
-M`/\/``#'AS0!````````#[>&F@L``"7_#P``#0```0")AS0!``"+AK0*``")
-MAS@!``"+AK@*``")ASP!``#'AT@!````````QT0D2``!``#'ATP!`````0``
-MBX<$`0``HP````"#R%F)AP0!``#'1"1(^_\`#,>'5`$``/O_``S'AUP!``#_
-M_P``N`````#'A(;4!0```````,=$AF``````@\`!@_@0=>5FQX:4"P``_P]F
-MQX:6"P``_P_&1C@!L`&#Q$Q;7E]=PXUT)@!55U93@^P<B40D%(G7BRB)+"3H
-M_/___XG#A<!U#,:'M0````'IP````(DL).C\____B<:%P'48QH>U`````8E<
-M)`2)+"3H_/___^F:````C4,\B40D&,9#).'&0R4!QD,F`P^W1QQFB4,0QD-H
-M#XM4)!2+`HE#&,=#(``"``"+5@B)4S2X`````(VT)@````#&!!``@\`!/0`"
-M``!U\HES4,=#;,`N`P#'1"0$`````(M$)!B)!"3H_/___XM#((E$)`R+1@R+
-M5A")1"0$B50D"(M4)!B)%"3H_/___XE<)`2)+"3H_/___X/$'%M>7UW#ZPV0
-MD)"0D)"0D)"0D)"055=64X/L3(M$)&"+*`^V0`F$P`^$5P0```^VV,=$)#@`
-M````]L,!=1FZ`````(GV@\(!#[;*B4PD.(G8T_BH`73NBT0D.,'@!HMT)#B-
-M!+"-%"B+@K0+``"I```"`'00#0``!``E___]_XF"M`L``(M$)#C!X`:+?"0X
-MC02XBX0%M`L``*D```0`#X0&`P``BX5(!0``B40D2#GH=0J-E<P,``")5"1(
-MBT0D.,'@!HM,)#B-!(@!Z`^VD+\+``")5"0H#[:0O@L``(E4)"0/MI"]"P``
-MB50D(`^VD+P+``")5"0<#[:0NPL``(E4)!@/MI"Z"P``B50D%`^VD+D+``")
-M5"00#[:`N`L``(E$)`P/MD4IB40D"(E,)`3'!"3P"```Z/S____'1"0\````
-M`(MT)#C!Y@*)="1$BWPD.,'G!HE\)$"+5"0\BTPD2`^VA`H\!0``//\/A*(`
-M```/ML!IP!0-``")PP.9M`4``(MT)$2+?"1`C80^H`L``(U\!1BX"````/R)
-MWHG!\Z8/E\(/DL`XPG5H#[9#!XE$)"`/MD,&B40D'`^V0P6)1"08#[9#!(E$
-M)!0/MD,#B40D$`^V0P*)1"0,#[9#`8E$)`@/M@.)1"0$QP0D0`D``.C\____
-MBWPD8,9'!?^)?"0$B2PDZ/S____I=`(``(UT)@"#1"0\`8-\)#P"#X4V____
-MB2PDZ/S___^)PX7`#X1.`@``BT0D.,'@!HM4)#B-!)#VA`6U"P``!'0$@$LU
-M`HM$)#C!X`:+3"0XC02(]H0%M@L```1T!(!+-1"+1"0XP>`&BW0D.(T$L/:$
-M!;4+```(=`2`2S4$BT0D.,'@!HM\)#B-!+CVA`6V"P``"'0$@$LU((M$)#C!
-MX`:+5"0XC020]H0%M0L```)T!(!+-0&+1"0XP>`&BTPD.(T$B/:$!;8+```"
-M=`2`2S4(QD,P`(G?BT0D.,'@!HMT)#B-A+"@"P``C40%`(M0&(D3BT`<B4,$
-MBT0D8(E#"(D$).C\____B(.+````BU0D8(!"'`&`?2L`=#"Y`````+H`````
-MB?:+="1@#[9&"=/XJ`%T#@^VPHA,`T"`0S(!@\(!@\$!.$TK=]R+1"1@BT@P
-MC5,@B5`PBT0D8(/`+(E#((E+)(D1BU0D8(!"-`''1"00``````^V@XL```")
-M1"0,B7PD"(E4)`2+A00*``")!"3H_/___^G:````J0``"``/A,\```")+"3H
-M_/___XG#A<`/A+T```#&0"<&QD`F!6;'@)0``````,9`)`;&0"4`QT!$```%
-M`,=`2`````"-B*````"+1"0XP>`&BW0D.(V$L*`+``"-1`4`BU`8B9.@````
-MBT`<B4$$BX.@````B8.8````BT$$B8.<````BWPD8(E[+(D\).C\____B(.V
-M````9H-+.!")/"3H_/___SP)=@9F@4LX``*+1"1@QD`*`8M0/(E8/(M$)&"#
-MP#B)`XE3!(D:B5PD!(DL).C\____B?:#Q$Q;7E]=PY"-M"8`````55=64X/L
-M+(M\)$"+7"1$A=MT%0^V0P6$P'0-//\/A90'``#I'`$``+H`````C78`#[:$
-M.D(%```\_W0-#[;`:\!<C9P'3`$``(/"`8/Z!'7?O@`````/MH0^0@4``#S_
-M=#$/ML!KP%R-G`=,`0``]H0'4@$```)T$L=$)`0`````B1PDZ/S____K"(D<
-M).C\____@\8!@_X$=;L/MD<F9CF'Y`D```^%"P<``(7;=7^`?SD`#X7]!@``
-MQD<Y`8GVBX2?O`(``(7`=%:+4'"%TG0NQT!P`````,>$G[P"````````QT0D
-M"/____^)1"0$BT!XB00D_]+K)XVV`````(M0=(72=!K'0'0`````QX2?O`(`
-M``````"+0'B)!"3_TH/#`8/[0`^$B@8``.N1QD,%_XE<)`2)/"3H_/___^ES
-M!@``N@````"-M"8`````#[:$.D(%```\_P^$]P````^VR&O!7(V<!TP!``")
-M7"0DC80'0`$``(!X$?\/A-4```"`>!8`#X0K!@``O@````!KV5R-K!^$`0``
-MB2PDZ/S___^)P8T$.XN0B`$``(F(B`$``(DIB5$$B0J`>2;_='^`N;4`````
-M#X3I!0``#[99)`^VTXG0@^`&@_@&=2GVP@%T1XE,)`P/MD%-B40D"(M!,(E$
-M)`2+1"0DB00DZ/S____IKP4``(/X!`^%I@4``/;#`0^$G04``(E,)`2)/"3H
-M_/___^F,!0``B4PD!(D\).C\____Z7L%``"-="8`@\8!B?(XE!]6`0``#X9E
-M!0``Z43___^#P@&#^@0/A>W^___'1"0<`````(!_.0"0#X62````NP````"0
-MC70F`(N4G[P"```/MH0[O`0``(72=&2+2G"%R71=@WI@`'57//]T+0^V\&G&
-M*`$```.'?`4``/9`)P1T&(!X)0!U$HET)`B)5"0$B3PDZ/S____K)L>$G[P"
-M````````QT)P`````,=$)`C_____B50D!(M">(D$)/_1@\,!@_M`=8'&1SD!
-MZ:\$``"+3"0<#[:$.4(%```\_P^$BP0```^VT&O"7(V<!TP!``")7"0H@+P'
-M5@$````/A&P$``#&1"0C`(G%C80'A`$``(E$)!"-=@"+5"00B10DZ/S___^)
-MPXU$/0"+D(@!``")F(@!``"+3"00B0N)4P2)&H![)O\/A0T$```/MT,<B40D
-M%`^VE#B\!```9HE4)!J+M(>\`@``]D,H!'1KA?9T9X-^<`!T88-^8`!U6X!C
-M*/OV0R<$C78`=!4/M\*)1"0(B70D!(D\).C\____ZSF+5G"+3"04QX2/O`(`
-M``````#'1G``````QT,@`````,=$)`C_____B70D!(M&>(D$)/_2D(UT)@#V
-M0R<$#X1F`0``QH.T`````("D+U0!``#G]D,H`0^$_0```(!C*/Z+0R"%P'15
-M@'LE`'4P]D,G!'0J#[9'*<'@!@-$)!2)1"0(BX=(!0``B40D!,<$)`<```#H
-M_/___^G<````B40D"(N'2`4``(E$)`3'!"0!````Z/S____IO0```(7V=&2+
-M5G"%THUT)@!T68![)0!U(/9#)P1T&@^W1"0:B40D"(ET)`2)/"3H_/___^F(
-M````BT0D%,>$A[P"````````QT9P`````,=#(`````#'1"0(_____XET)`2+
-M1GB)!"3_TNM5@'LE`'5/]D,G!'1)#[9'*<'@!@-$)!2)1"0(BX=(!0``B40D
-M!,<$)`(```#H_/___^LBB?:+0R"%P'09BU!TA=)T$L=`=`````"+0R"+0'B)
-M!"3_TO9#*`(/A#8"``"+0R")1"0(BX=(!0``B40D!,<$)`8```#H_/___X!C
-M*/WIY`$``(M#((7`#X39`0``@WAT`)`/A,X!``#&0R<!QD,F`(E<)`C'1"0$
-M!@```(M4)"B)%"3H_/___X-[,`!T$HM3"(M##(E"!(D0BT,P@&@P`8![3P!T
-M&HD\).C\____QP0D`0```.C\____@'M/`'7FBY/D````A=)T&\=$)`@!````
-M#[:#V0```(E$)`2)%"3H_/___XM3,(72=!C'1"0(`0````^V0TV)1"0$B10D
-MZ/S___^+<R"%]@^$]@```/9#*`1U78D\).C\____QT0D"`$```"+0R")1"0$
-MB3PDZ/S___^+4R`/MD("B40D"`^V0@&)1"0$QP0DT`(``.C\____BT,@B40D
-M"(N'2`4``(E$)`3'!"0!````Z/S____K.0^V1@*)1"0(#[9&`8E$)`3'!"30
-M`@``Z/S___^+0R")1"0(BX=(!0``B40D!,<$)`$```#H_/___XM6=(72=!X/
-MMT,<QX2'O`(```````#'1G0`````BT9XB00D_]+V0R@"="&+0R")1"0(BX=(
-M!0``B40D!,<$)`8```#H_/___X!C*/W'0R``````QT9@`````(M3-(72=`P/
-MMD--QT2"/`````"+$XM#!(E"!(D0@*PO5@$```&)7"0$B3PDZ/S____V0R@"
-M=":+0R")1"0(BX=(!0``B40D!,<$)`8```#H_/___X!C*/V0C70F`(!$)",!
-M#[9,)",XC"]6`0``#X>I^___@T0D'`&#?"0<!`^%4?O__[@!````@\0L6UY?
-M7<.-M@````"-OP````!75E.#[!"+="0@BSZ)-"3H_/___X3`=!@/ME\KA-MT
-M,0^V5@FY`````/;"`70<ZR'&1@7_B70D!(D\).C\____ZUR)T-/XJ`%U!X/!
-M`3C9=?&)/"3H_/___XG!A<!T/XM6/(E&/(U&.(D!B5$$B0J`1@H!B7$LQD$D
-M!<9!)0#&04T/QT0D#`$```#'1"0(`0```(E,)`2)-"3H_/___X/$$%M>7\.-
-M="8`C;PG`````(/L+(E<)!R)="0@B7PD)(EL)"B+="0TBUY4#[9&)CPD#X=J
-M!P``#[;`_R2%X!,```^W1C(/M]#VP@1T#&;'1C(!`,9&)@'K0V:#^"!U#&;'
-M1C((`,9&)A'K,832>17V1BT#=`\D?X/("&:)1C+&1B8-ZQCVP@AT!L9&)@?K
-M#?;&`G0(QD8K`,9&)AZ)="0$BT0D,(D$).C\____Z?`&``#'1"0,`0```,=$
-M)`@"````QT0D!`$```")-"3H_/___^G+!@``QT0D#`$```#'1"0(`````,=$
-M)`0!````B30DZ/S____II@8``,=$)`P!````QT0D"`$```#'1"0$`0```(DT
-M).C\____Z8$&``#'1"0,`0```,=$)`A@````QT0D!`$```")-"3H_/___^E<
-M!@``#[9&+,=$)!`!````B40D#,=$)`A@````QT0D!`$```")-"3H_/___^DO
-M!@``QT0D$`$```#'1"0,```!!,=$)`@A````QT0D!`$```")-"3H_/___^D"
-M!@``BT,8@6`H___W_\=$)!`!````QT0D#`$```#'1"0(`@```,=$)`0`````
-MB30DZ/S____IRP4``,=$)!`!````QT0D#`````#'1"0(`@```,=$)`0`````
-MB30DZ/S____'!"00)P``Z/S____ID@4``(M#&(%@*/__]__'1"00`0```,=$
-M)`P!````QT0D"`(```#'1"0$`````(DT).C\____Z5L%``#'1"00`0```,=$
-M)`P`````QT0D"`(```#'1"0$`````(DT).C\____QP0D$"<``.C\____Z2(%
-M``#'1"0,`0```,=$)`@"````QT0D!`````")-"3H_/___^G]!```QT0D#`$`
-M``#'1"0(`````,=$)`0`````B30DZ/S____IV`0``,=$)`P!````QT0D"`$`
-M``#'1"0$`````(DT).C\____Z;,$``#'1"00`0```,=$)`S_____QT0D"`$`
-M``#'1"0$`````(DT).C\____Z88$``#'1"0,`0```,=$)`@`````QT0D!```
-M``")-"3H_/___^EA!```#[9&*XM\ACR)7RR)=S0/MD8KB$=-QD<F`\9')0"`
-M3R0%@$,*`8M3/(U#.(E[/(D'B5<$B3K'!"2`&@8`Z/S___^+5"0P@'HK`'0I
-MO@````#V0PD!=`[K'`^V0PF)\=/XJ`%U%8/&`8GPBU0D,#A"*W?FZP6^````
-M`(M3&(M"**D```@`=`HE___W_XE"*.MDB?$/ML&-+,4`````N[@+``")\#P#
-M=AR+5"0PBP(%@`$```'HBP"C`````,'H$X/@`>L<BTPD,(L!!8`!``"-1`4`
-MBP"C`````,'H$X/@`83`=1''!"3H`P``Z/S___^#ZP%UK6;'AY0``````(E\
-M)`2+1"0PB00DZ/S____I3P,``,<$)$`-`P#H_/___\=$)`P`````QT0D""``
-M``#'1"0$`0```(DT).C\____QP0D$"<``.C\____Z1(#``#'1"0,`````,=$
-M)`@!````QT0D!`````")-"3H_/___\<$)!`G``#H_/___^GA`@``BT,8@6`H
-M___W_\=$)!``````QT0D#/_____'1"0(`0```,=$)`0`````B30DZ/S____'
-M!"00)P``Z/S____IG@(``,=$)`P`````QT0D"`````#'1"0$`````(DT).C\
-M____QP0D$"<``.C\____Z6T"``")="0$BU0D,(D4).C\____Z5@"``")="0$
-MBTPD,(D,).C\____Z4,"``#'1"00`0```,=$)`SP````QT0D")L```#'1"0$
-M`0```(DT).C\____Z18"``#'1"00`0```,=$)`R@UEHKQT0D".`#``#'1"0$
-M`0```(DT).C\____Z>D!``#'1"00`0```,=$)`P`X`,`QT0D"*0#``#'1"0$
-M`0```(DT).C\____Z;P!``#'1"00`0```,=$)`SDJ`8!QT0D",0#``#'1"0$
-M`0```(DT).C\____Z8\!``#'1"0,`0```,=$)`A(`P``QT0D!`$```")-"3H
-M_/___^EJ`0``QP0D0`T#`.C\____QT0D#`$```#'1"0((````,=$)`0!````
-MB30DZ/S____'!"00)P``Z/S____I+0$``,=$)!`!````QT0D#`````#'1"0(
-M(0```,=$)`0!````B30DZ/S____I``$``,=$)`P!````QT0D"&````#'1"0$
-M`0```(DT).C\____Z=L````/MD8LQT0D$`$```")1"0,QT0D"&````#'1"0$
-M`0```(DT).C\____Z:X```#&0P4`BT94B00DZ/S____IF@```,=$)`P!````
-MQT0D"`$```#'1"0$`````(DT).C\____QP0D$"<``.C\____ZVR+0QB!8"C_
-M__?_QT0D$`$```#'1"0,_____\=$)`@!````QT0D!`````")-"3H_/___\<$
-M)!`G``#H_/___^LLQT0D#`$```#'1"0(`0```,=$)`0`````B30DZ/S____'
-M!"00)P``Z/S___^X`0```(M<)!R+="0@BWPD)(ML)"B#Q"S#C;0F`````(/L
-M'(E<)!")="04B7PD&(M<)""+?"0D#[=7$&:!^H4`=WX/M\(/MH08O`0``#S_
-M=&]F@_I_=QD/ML!IP"@!```#@WP%``"+0"P/MD@$ZU:0#[='$&8]@0!W(`^W
-MP`^VA!B\!```:<`4#0```X.T!0``BT`(#[9(!.LK#[='$`^VA!B\!```:<"P
-M`````X.8!0``BT!4#[9(!.L*D(UT)@"Y_____[C_____9H%_$(4`=PP/MT<0
-M#[:$&+P$``"+LY@%```/MM&`^?]T%("\&D(%``#_=`H\_W0&@'\4!G4F@W]0
-M`'0/C4=0B40D!(D<).C\____B7PD!(D<).C\____Z>H````/ML!IP+`````!
-MQ@^V1B8\&G1V/!IW"CP1#X6;````ZQL\&XVT)@````!T8SP<#X6&````C;8`
-M````ZWJ+DT0*``"!PDP(```/MD8TP>`(`<*+"HD-``````^VR8N31`H``('"
-M1`@```^V1C3!X`@!PHL"HP````#!X`@)P8F.E````,9&)AKK,<9&)AOK*XN#
-M1`H```5,"```#[96-,'B"`'0BP"C`````(/@]XA&+,9&)ASK!,9&)AV#?U``
-M=`^-1U")1"0$B1PDZ/S___^)?"0$B1PDZ/S___^)="0$B1PDZ/S___^-=@"+
-M7"00BW0D%(M\)!B#Q!S#@^P,BT0D$(E$)`2+`(D$).C\____@\0,PXVT)@``
-M``"#["R)7"0<B70D((E\)"2);"0HBUPD-(MS+`^W4QRX`````(M,)#"`O`J\
-M!```_P^$.PD```^V0R8\"0^$+P4``#P)=TL\!0^$F````#P%D'<>/`,/A+8`
-M```\!(UT)@`/A>X(``#IY````)"-="8`/`</A(T$```\!XVV``````^'$`0`
-M`.F9`@``D(UT)@`\%@^$?`,``#P6C;8`````=R,\%`^$F`4``#P4C70F``^'
-MY@(``#P*#X66"```B?;I$`4``#P:#X0W`@``//^0#X1P!0``/!</A78(``")
-M]NE"`P``BT0D,`^V:"N)ZH32#X2A````#[96";\`````]L(!#X2"````Z8H`
-M``")]HM&&(%@*/___O^+0RS'1"0,`````,=$)`@!````B5PD!(D$).C\____
-MQP0D!0```.C\____N`$```#I(0@``,=$)`P`````QT0D"`````")7"0$B30D
-MZ/S____'!"10PP``Z/S___^X`0```.GO!P``B=")^=/XJ`%U$H/'`8GXB>DX
-MR'7KZP6_``````^V4R2)T(/@!H/X!G4)]L(!#X75````BU88BT(HJ0```0!T
-M#27___[_B4(HZ;L```")^@^VPL'@`XE$)!B]$"<``)"+3"0PBQ&)^#P#=AF+
-M3"08C801@`$``(L`HP`````E```!`.L7BTPD&(V$$8`!``"+`*,`````)0``
-M`0"%P'0RB?@\`W86BTPD&(V$$8`!``#'`````0#I'P<``(M,)!B-A!&``0``
-MQP````$`Z0D'``#'!"3H`P``Z/S___^#[0$/A7G____&0R<"QD,F_XE<)`2+
-M1"0PB00DZ/S___^X`0```.GG!@``]D8&`70VB5PD!(DT).C\____A,!U)KWZ
-M````B5PD!(DT).C\____A,!U$<<$).@#``#H_/___X/M`77?B?J`^@-V'(M,
-M)#"+`06``0``#[;2C130BP*C`````(D"ZQR+5"0PBP(%@`$``(GY#[;1C130
-MBP*C`````(D"BT,LB=KH(N7__\<$)"!.``#H_/___[@!````Z4P&``")5"0$
-MQP0D>`D``.C\____BW,LBSZ)/"3H_/___XG!A<!U$<:#M0````&X`0```.D8
-M!@``QD`DX<9`)0'&0"87#[=#'&:)01"+!HE!&,=!(`````#'030`````QT%L
-MP"X#`(E,)`2)/"3H_/___[@!````Z=0%``")5"0$QP0DY@(``.C\____BW,L
-MBSZ)/"3H_/___XG!A<!U$<:#M0````&X`0```.F@!0``QD`DX<9`)0'&0"88
-M#[=#'&:)01"+!HE!&,=!(`````#'030`````QT%LP"X#`(E,)`2)/"3H_/__
-M_[@!````Z5P%``")VHGPZ!/D__^X`0```.E)!0``BSZ)/"3H_/___XG"#[9+
-M/(7`=1'&@[4````!N`$```#I)`4``,9`).'&0"4!QD`F!8A()P^W0QQFB4(0
-MBP:)0AC'0B``````QT(T`````,=";,`N`P"(2S^)5"0$B3PDZ/S___^X`0``
-M`.G:!```BSZ)/"3H_/___XG"#[9+/H7`=1'&@[4````!N`$```#IM00``,9`
-M).'&0"4!QD`F!(A()P^W0QQFB4(0BP:)0AC'0B``````QT(T`````,=";,`N
-M`P"(2T&)5"0$B3PDZ/S___^X`0```.EK!```BSZ)/"3H_/___XG!A<!U$<:#
-MM0````&X`0```.E*!```QD`DX<9`)0'&0"8&#[=#'&:)01"+!HE!&,=!(```
-M``#'030`````QT%LP"X#`(E,)`2)/"3H_/___[@!````Z08$``"-M@````"+
-M/HD\).C\____B<&%P'41QH.U`````;@!````Z=\#``#&0"3AQD`E`<9`)@P/
-MMT,<9HE!$(L&B4$8QT$@`````,=!-`````#'06S`+@,`B4PD!(D\).C\____
-MN`$```#IFP,``(L^B3PDZ/S___^)P87`=1'&@[4````!N`$```#I>@,``,9`
-M).'&0"4!QD`F%L9`*`$/MT,<9HE!$,9!:`^+!HE!&,=!(`````#'030`````
-MQT%LP"X#`(E,)`2)/"3H_/___[@!````Z2X#``#&0R;_9L>#E```````#[93
-M)(G0@^`&@_@&=07VP@%U'H-[-`!U&(DT))"-="8`Z/S___^(@[8```"0C70F
-M`(![)P)U&HM#+(E<)`B)1"0$BT0D,(D$).C\____C78`]D8(`G4:NP````"-
-M?CB`?@H`#X5@`0``Z7P"``"-=@"+5B@/MEHJ#[;+#[9"'X/H`3G!?3:-0P&(
-M0BJ`0BL!QD(F``^W0C*#X/Z#R`AFB4(RB50D!(M4)#")%"3H_/___[@!````
-MZ64"```YP706NP````"-?CB`?@H`=32-=@#I+P(``,9")@`/MT(R@^#V@,P"
-M9HE",HE4)`2+3"0PB0PDZ/S___^X`0```.D?`@``B3PDZ/S___^)P8M&/(E.
-M/(DYB4$$B0B`>2;_#X2.````@+FU``````^$U0$```^V620/MM.)T(/@!H/X
-M!G4J]L(!=%$/MD%-BU$PB4PD#(E$)`B)5"0$B30DZ/S___^X`0```.FV`0``
-M@_@$#X61`0``]L,!#X2(`0``B4PD!(M$)#")!"3H_/___[@!````Z8H!``")
-M3"0$BU0D,(D4).C\____N`$```#I<`$``,:!M0````"#PP$X7@H/AD$!``#I
-M.?___XD\).C\____B<&+1CR)3CR).8E!!(D(@'DF_P^$GP```(!Y)0`/A8X`
-M``"`N;4`````#X0$`0``#[99)`^VTXG0@^`&@_@&=2KVP@%T40^V04V+43")
-M3"0,B40D"(E4)`2)-"3H_/___[@!````Z>4```"#^`0/A<````#VPP$/A+<`
-M``")3"0$BTPD,(D,).C\____N`$```#IN0```(E,)`2+1"0PB00DZ/S___^X
-M`0```.F?````QH&U`````(/#`0^V1@HXV`^',?___SC#=4Z$P'1*NP````"-
-M?CB)/"3H_/___XG"BT8\B58\B3J)0@2)$`^V0B4\(G0$/`UU%\=$)`0*````
-MB10DZ/S___^X`0```.L_@\,!.%X*=[[&1@7_B70D!(M4)#")%"3H_/___[@!
-M````ZQRX`0```.L5A>V-=@`/A`'Y___I'OG__Y"-="8`BUPD'(MT)""+?"0D
-MBVPD*(/$+,.-M@````"-OP````"#["R)7"0<B70D((E\)"2);"0HBWPD,(ML
-M)#0/MU409H'ZA0`/A[X````/M\(/MHP'O`0``(#Y_P^$J@```&:#^G]W'`^V
-MP8N7?`4``&G`*`$``(M$$"P/MD`$ZSJ-=@!F@?J!`'<9#[;!BY>T!0``:<`4
-M#0``BT00"`^V0`3K%P^VP8N7F`4``&G`L````(M$$%0/MD`$//]T30^VP`^V
-MG`="!0``@/O_=!6`^?]T$`^V512`^@9U5XVT)@````"`^_]T(X#Y_W0>#[;!
-M:<`H`0``B<8#MWP%``#&1B<"QD8F_^E8`@``@WU0`'0/C450B40D!(D\).C\
-M____B6PD!(D\).C\____Z5\"``")]@^VP6G`*`$``(G&`[=\!0``BTTTA-(/
-MA+0````/MD4F/`8/A,T````\#`^$Q0````^WEI0```"-0@%FB8:4````9H/Z
-M"787@'XF!G01QD8G`L9&)O^`9BC^Z=(!``#'!"3H`P``Z/S___\/ME8DB="#
-MX`:#^`9U/O;"`70YQT0D$`````#'1"0,`@````^V1DV)1"0(BT8PB40D!`^V
-MPVO`7(V$!TP!``")!"3H_/___^FG`0``QD8F`XET)`2)/"3H_/___^F2`0``
-MD(UT)@`/MD4F/`%U#<9&)@2-="8`Z4L!```\`G4,QD8F!8UV`.D[`0``/`,/
-MA;T```")R(!^)@5U*V:!>03(-W4C#[=&'(E$)`3'!"2L"0``Z/S____&1B8&
-MZ08!``"-M@````")1"0$B30DZ/S___^-1F2Z*````.CGO___A,!U.(U&4+H4
-M````Z-:___^$P'4GC8:,````N@@```#HPK___X3`=1.+1D0+1DAT"\9&)A>)
-M]NFK````9H.^E````!UV$<9&)P+&1B;_@&8H_NF0````QP0DZ`,``.C\____
-MQD8F&F:#AI0````!ZW8\%W4&QD8F%>ML/!AU"L9&)A:-="8`ZUX\!'4&QD8F
-M!^M4/`6)]G4&QD8F".M(/`9U!L9&)@GK/CP,=0;&1B8*ZS0\%HGV=0;&1B84
-MZR@\#G4D@WU0`'0/C450B40D!(D\).C\____B6PD!(D\).C\____ZRZ0@WU0
-M`'0/C450B40D!(D\).C\____B6PD!(D\).C\____B70D!(D\).C\____BUPD
-M'(MT)""+?"0DBVPD*(/$+,/K#9"0D)"0D)"0D)"0D)"#["R)7"0<B70D((E\
-M)"2);"0HBVPD-(MU+`^W11RZ`````(M,)#"`O`&\!```_P^$ZP(```^V128\
-M%`^$U````#P4=SL\#0^$!`$``#P-D'<0/`4/A;L"``"-M@````#K4SP.#X3[
-M````/`^-="8`#X6?`@``Z?P```"0C70F`#P;#X2?````/!N-M@````!W$#P8
-M=#D\&0^%=P(``(GVZT<\''1=//\/A6<"``")]NG&````QT0D!`````")+"3H
-M_/___[H!````Z5$"``#'1"0$`0```(DL).C\____N@$```#I-P(``,=$)`0!
-M````B2PDZ/S___^Z`0```.D=`@``B2PDZ/S___^Z`0```.D+`@``B2PDZ/S_
-M__^Z`0```.GY`0``]D4Y!'02B2PDZ/S___^Z`0```.GA`0``B2PDZ/S___^Z
-M`0```.G/`0``B2PDZ/S___^Z`0```(GVZ;L!``")+"3H_/___[H!````Z:D!
-M``#&12;_@'X*``^$Z0```+L`````C7XXC78`B3PDZ/S___^)PHM&/(E6/(DZ
-MB4($B1"`>B;_#X2?````@'HE``^%G````("ZM0`````/A$T!```/MEHD#[;+
-MB<B#X`:#^`9U*O;!`712B50D#`^V0DV)1"0(BT(PB40D!(DT).C\____N@$`
-M``#I'0$``(/X!`^%"0$``/;#`9`/A/\```")5"0$BT0D,(D$).C\____N@$`
-M``#I\````(E4)`2+3"0PB0PDZ/S___^Z`0```.G6````C;8`````QH*U````
-M`(/#`0^V1@HXV`^'*O___SC##X6,````#[9%)3PB=!0\#700OP````"-;CB`
-M?@H`=1SK<,=$)`0*````B2PDZ/S___^Z`0```.E\````B2PDZ/S___^)PXM&
-M/(E>/(DKB4,$B1@/MD,E/")T!#P-=2F)7"0$QP0D_`(``.C\____QT0D!`H`
-M``")'"3H_/___[H!````ZS*)]H/'`8GX.$8*=ZK&1@7_B70D!(M,)#")#"3H
-M_/___[H!````ZPNZ`0```(VV`````(G0BUPD'(MT)""+?"0DBVPD*(/$+,.-
-M=@"-O"<`````55=64X/L+(M<)$0/MU,0N?____^X_____V:!^H4`=WL/M\*+
-M="1`#[:,!KP$``"X_____X#Y_W1B9H/Z?W<=#[;!BWPD0(N7?`4``&G`*`$`
-M`(M$$"P/MD`$ZS]F@?J!`'<=#[;!BW0D0(N6M`4``&G`%`T``(M$$`@/MD`$
-MZQL/ML&+?"1`BY>8!0``:<"P````BT005`^V0`0/ML"+5"1`#[:T`D(%``!K
-MQER-A`),`0``B40D)`^VP6G`*`$```."?`4``(E$)"B+2S0/MA'!XA@/MD$!
-MP>`0"<(/MD$#"<(/MD$"P>`("<*-60B)T,'H`X/X$'8%N!````"-!,&)1"0<
-M.<,/AY`!``#'1"0@`````&OV7(ET)!@#="1`B70D%(D<).C\____B<6-<P2_
-M=!0``+D$````_/.F#Y?"#Y+`.,(/A40!``"#_1`/ASL!``"#1"0@`8-\)"`!
-M=2J+3"0HQX$<`0```0```(FI(`$``(L#B8&H````BT,$B8&L````Z04!``"+
-M="1`B30DZ/S___^)QH7`#X3\````QD`G!L9`)@5FQX"4``````#&0"0&QD`E
-M`,=`1```!0#'0$@`````QX`<`0```0```(FH(`$``(M4)"B!PJ````"+?"0H
-MBX>@````B8:@````BT($B8:D````BX>@````B8:8````BT($B8:<````BP.)
-MAJ@```"+0P2)AJP```"+1"0DB48LB00DZ/S___^(AK8```!F@TXX$(M4)"2)
-M%"3H_/___SP)=@9F@4XX``*+3"04@(%6`0```8N1B`$``(FQB`$``(M\)$"+
-M3"08C80/A`$``(D&B58$B3*)="0$B3PDZ/S___^-M@````"#PP@[7"0<#X:'
-M_O__@\0L6UY?7<.-="8`C;PG`````%575E.!["P"```/MH0D2`(``(N4)$`"
-M``"+4@B)5"0<BPJ)3"0@BY0D0`(```^V4C"(5"0GBXPD0`(``(/!*(E,)"B+
-ME"1``@``.4HH#X2K`@``@'PD)P`/A*`"```/ML")1"04BTPD*(D,).C\____
-MC7CXC40D+(E$)!"+5"04B50D#,=$)`@!````BTPD'(E,)`2+A"1$`@``B00D
-MZ/S___^`?"0L``^$_@```+T`````C9>@````B50D&(UV`(GI#[;QQT0D"`@`
-M``"+1"08B40D!(GSP>,$C80<F````(D$).C\____A,`/A)\```"-E!R,````
-M#[9""(/@#XB'M@````^W3SAF@>'?_8G(@\@09HE'.`^V0@C`Z`0\"74)B<B#
-MR#!FB4<XB?#!X`0/MH0$E````,#H!#P*=09F@4\X``*+3"0HBU$$C4<(B4$$
-MB4\(B5<,B0+V1R@"=$"`9RC]BT<@A<!T-8E$)`B+5"0@BX)(!0``B40D!,<$
-M)`8```#H_/___^L5D(UT)@"#Q0&)Z3A,)"QV$>D@____B>@X1"0L#X<W`0``
-MB7PD",=$)`0&````BU0D'(D4).C\____@']/`'0DC;8`````BTPD((D,).C\
-M____QP0D`0```.C\____@']/`'7BBY?D````A=)T&\=$)`@!````#[:'V0``
-M`(E$)`2)%"3H_/___XM7,(72=!C'1"0(`0````^V1TV)1"0$B10DZ/S___^+
-M1R"%P'1]QT!@`````/9'*`1U)XM$)"")!"3H_/___\=$)`@!````BT<@B40D
-M!(M4)"")%"3H_/___XM'((E$)`B+3"0@BX%(!0``B40D!,<$)`8```#H_/__
-M_XM'((E$)`B+5"0@BX)(!0``B40D!,<$)`$```#H_/___\='(`````"+%XM'
-M!(E"!(D0BTPD'(!I"@&+A"1``@``@&@P`8E\)`2+5"0@B10DZ/S___^+1"0H
-MBXPD0`(``#E!*'0+@&PD)P$/A6?]__^!Q"P"``!;7E]=PXVT)@````!55U93
-M@>PL`@``B[PD1`(``(N$)$`"``"+`(E$)"0/MK0D3`(``(U<)"R)7"00B70D
-M#,=$)`@!````BY0D0`(``(E4)`2)/"3H_/___XET)`B)?"0$B[0D2`(``(DT
-M).C\____BVXH@^T(B?.#PRB-10@YV'0K#[9%)3P-=!0\(G4PZPX/MD4E/`UT
-M!CPBB?9U(,9%)@7&12<$QD0D*@'K!<9$)"H`@'PD+`!U%>D@`@``BVT(@^T(
-MC44(.=AUQ9#KW\9$)"L`BX0D0`(``(/`.(E$)""+E"1(`@``BW(H@^X(C48(
-M.<,/A`,"```/MD0D*\'@!(V\!)@```"-="8`QT0D"`@```")?"0$C8:@````
-MB00DZ/S___^$P`^%G`$``(MV"(/N"(U&"#G8#X2]`0``Z\N+M"1``@``@$8*
-M`<9!)@7&@;0`````QD$G!&;'@90``````,:!E@````#'040```4`QT%(````
-M``^V="0KB?#!X`2-E`2,````#[9"!(A!)`^V0@6(026+A"1``@``B4$L#[9"
-M"(/@#XB!M@````^W>3AF@>??_8GX@\@09HE!.`^V0@C`Z`0\"74)B?B#R#!F
-MB4$XB?#!X`0/MH0$E````,#H!#P*=09F@4DX``*+E"1(`@``B5$PB?+!X@0/
-MMH04D@```(A!38V4%(P```"+0@R)@:````"+4A")D:0```")@9@```")D9P`
-M``"+M"1(`@``@$8P`8N4)$`"``"+0CR)2CR+="0@B3&)002)"(N$)$@"``"+
-M4"R-00B+M"1(`@``B48LB5D(B5$,B0(/ME$DB="#X`;&1"0J`(/X!G5']L(!
-M="V)3"0,#[9!38E$)`B+A"1(`@``B40D!(N4)$`"``")%"3H_/___\9$)"H`
-MZQ6)3"0$BW0D)(DT).C\____QD0D*@"`1"0K`0^V1"0K.$0D+`^'`_[__X!\
-M)"H`="W'1"0$"@```(DL).C\____ZQN0C70F`(M4)"2)%"3H_/___XG!A<`/
-MA2_^__^!Q"P"``!;7E]=P^L-D)"0D)"0D)"0D)"0D%575E.!["P"``"+A"1`
-M`@``BS`/ME`<B%0D)H/`+(E$)"B+C"1``@``.4$L#X30`P``A-(/A,@#``"+
-M1"0HB00DZ/S___^-:.#'1"00`````,=$)`P`````QT0D"`````"+E"1``@``
-MB50D!(N,)$0"``")#"3H_/___XA$)">$P`^$:P,``+\`````NP````")7"0@
-MQT0D$`````")7"0,QT0D"`$```"+A"1``@``B40D!(N4)$0"``")%"3H_/__
-M_P^VP,'@!(/`9#T``@``#X?I`0``C4PD+(E,)!")7"0,QT0D"`$```"+A"1`
-M`@``B40D!(N4)$0"``")%"3H_/___\=$)`@(````B6PD!(V,)(@```")#"3H
-M_/___X3`#X28`0``BT0D*(M0!(U%((M,)"B)002)32")522)`@^V1"0NB$4Q
-MC80D@````(E$)`2+A"1``@``B00DZ/S___\\_W02#[;`:<`4#0```X:T!0``
-MB44,B?J$TG15#[9$)"_1Z(/@`<'@!`^V536#XN\)PHA5-0^V1"0OP>@#@^`!
-MP>`%@^+?"<*(534/MD0D+\'H`H/@`<'@`X/B]PG"B%4U#[9$)#*(A8L```#I
-MOP````^V1"0NB$4QBXPD0`(``(E-"`^V1"0RB(6+````#[=$)#")13@/MT0D
-M?&:)A8@````/MD0D?HB%B@```(U->(U4)"R#PD"+1"1LB45XBT($B4$$BT((
-MB4$(BT(,B4$,C4U(C50D+(/"$(M$)#R)14B+0@2)002+0@B)00B+0@R)00R-
-M35B-5"0L@\(@BT0D3(E%6(M"!(E!!(M""(E!"(M"#(E!#(M"$(E!$(M"%(E!
-M%(M$)&2)17"+1"1HB45TBT0D((E$)`R);"0(BY0D1`(``(E4)`2+C"1``@``
-MB0PDZ/S____I&`$``(GV@\<!@\,!B?@Z1"0G#X0@`0``Z;K]__^)/"3H_/__
-M_XU8^(E<)`C'1"0$!@```(N4)$`"``")%"3H_/___X![3P!T&HDT).C\____
-MQP0D`0```.C\____@'M/`'7FBT,@A<!T;<=`8`````#V0R@$=1^)-"3H_/__
-M_\=$)`@!````BT,@B40D!(DT).C\____BT,@B40D"(N&2`4``(E$)`3'!"0!
-M````Z/S___^+0R")1"0(BX9(!0``B40D!,<$)`8```#H_/___\=#(`````"+
-M$XM#!(E"!(D0BXPD0`(``(!I"@&`;3`!B5PD!(DT).C\____.7TH#X48____
-MBX0D0`(``(!H'`&);"0$B30DZ/S___^+3"0HBY0D0`(``#E*+'0<@&PD)@%T
-M%>E(_/__C7TH.7TH#X79_O__B?;KO8'$+`(``%M>7UW#C78`55=64X'L+`(`
-M`(NL)$0"``"+10")1"0<BY0D0`(``(E4)`2)+"3H_/___\=$)!``````QT0D
-M#`````#'1"0(`````(EL)`2+G"1``@``B1PDZ/S___^(1"0CA,`/A+X#``#&
-M1"0B`,=$)"0`````D,=$)!``````BT0D)(E$)`S'1"0(`0```(EL)`2+E"1`
-M`@``B10DZ/S___\/ML#!X`2#P&0]``(```^'6`,``(U<)"R)7"00BT0D)(E$
-M)`S'1"0(`0```(EL)`2+E"1``@``B10DZ/S___^-G"2(````B5PD!(DL).C\
-M____//\/A1(#``"+1"0<B00DZ/S___^)QX7`#X0O`P``@$4<`<9`,`"+A"2(
-M````B0>+A"2,````B4<$C80D@````(E$)`2)+"3H_/___SS_=!8/ML!IP!0-
-M``"+5"0<`X*T!0``B4<,#[9$)"Z(1S$/MD0D+]'H@^`!P>`$#[97-8/B[PG"
-MB%<U#[9$)"_!Z`.#X`'!X`6#XM\)PHA7-0^V1"0OP>@"@^`!P>`#@^+W"<*(
-M5S6);P@/MD0D,HB'BP```(M$)#2)1T"+1"0XB4=$#[9$)#.(1S(/MT0D,(E'
-M.`^W1"1\9HF'B`````^V1"1^B(>*````C4]XC50D+(/"0(M$)&R)1WB+0@2)
-M002+0@B)00B+0@R)00R-3TB-5"0L@\(0BT0D/(E'2(M"!(E!!(M""(E!"(M"
-M#(E!#(U/6(U4)"R#PB"+1"1,B4=8BT($B4$$BT((B4$(BT(,B4$,BT(0B4$0
-MBT(4B4$4BT0D9(E'<(M$)&B)1W2+33"-5R")53"-12R)1R")3R2)$8!\)"P`
-M#X2"`0``9L=$)"H``(U=.(E<)!B-1RB)1"04C;8`````BU0D'(D4).C\____
-MB<&%P`^$A`$``(!%"@'&0"8%QH"T`````,9`)P3'0$0```4`QT!(`````&;'
-M@)0```````^W="0JB?#!X`2-E`2,````#[9"!(A!)`^V0@6(026):2R)>3`/
-MMD(&B$%-#[9""(/@#XB!M@````^W63AF@>/?_8G8@\@09HE!.`^V0@C`Z`0\
-M"74*B=B#R#!FB4$XD(GPP>`$#[:$!)0```#`Z`0\"G4,9H%).``"C;8`````
-MB?#!X`2-E`2,````BT(,B8&@````BU(0B9&D````B8&8````B9&<````@$<P
-M`8M%/(E-/(M<)!B)&8E!!(D(BU<LC4$(B4<LBUPD%(E9"(E1#(D"#[91)(G0
-M@^`&@_@&=2_VP@%T&HE,)`P/MD%-B40D"(E\)`2)+"3H_/___^L0B4PD!(M$
-M)!R)!"3H_/___V:#1"0J`0^V1"0L9CM$)"H/AYG^__^`1"0B`8-$)"0!#[94
-M)",X5"0B#X50_/__@'T*`'44QD4%_XEL)`2+7"0<B1PDZ/S___^!Q"P"``!;
-M7E]=PXUT)@"-O"<`````55=64X/L+(ML)$"+?"1$QT0D$`````#'1"0,````
-M`,=$)`@`````B7PD!(DL).C\____A,!T.+L`````@^@!#[;PC40D*XE$)`R)
-M7"0(B7PD!(DL).C\____@'PD*_X/A:4```"#PP&-1@$YPW73#[9'-(/H`8A'
-M-(3`='6+-\9'-`"+7RR#ZR"-5RR-0R`YT'1W@WL,`'5(ZPN0C70F`(-[#`!U
-M.\9'-`&)?"0$B2PDZ/S____'1"00``````^V@XL```")1"0,B5PD"(E\)`2+
-MA@0*``")!"3H_/___^LIBUL@@^L@C4,@.=!ULHGVZQB)?"0$B2PDZ/S___^)
-M?"0$B2PDZ/S___^#Q"Q;7E]=PXVT)@````"-O"<`````55=64X/L#(MT)""+
-M?"0DBRZ["@```(E\)`2)-"3H_/___X3`=1''!"3H`P``Z/S___^#ZP%UWP^V
-M72N$VW0@#[96";D`````]L(!=`OK$)")T-/XJ`%U!X/!`3C9=?&+%XM'!(E"
-M!(D0@&X*`8E\)`2)+"3H_/____9&"`)T08M&*(7`=1.)+"3H_/___X7`#X1:
-M`0``B48HB2B)<%3&0"H`QD`K`,9`)@!F@T@R!(E$)`2)+"3H_/___^DP`0``
-MBT8HA<`/A,L```"#P%B)1"0$BT44B00DZ/S___^+1BB)1"0$B2PDZ/S___^-
-M?C@Y?C@/A)<```")/"3H_/___XG#BT`@A<!T;<=`8`````#V0R@$=1^)+"3H
-M_/___\=$)`@!````BT,@B40D!(DL).C\____BT,@B40D"(N%2`4``(E$)`3'
-M!"0!````Z/S___^+0R")1"0(BX5(!0``B40D!,<$)`8```#H_/___\=#(```
-M``"`;@H!B5PD!(DL).C\____.7XX#X5I____QT8H`````(!^"@!T$XU&.(D$
-M).C\____B<&`;@H!ZPJ)+"3H_/___XG!A<ET,XM6/(E./(U&.(D!B5$$B0J`
-M1@H!B7$LQD$D!<9!)0#&02<&QD$F`XE,)`2)+"3H_/___X/$#%M>7UW#D(VT
-M)@````"#["R)7"0<B70D((E\)"2);"0HBWPD,(M<)#0/MU,09H'ZA0!W>@^W
-MP@^VC`>\!```@/G_=&IF@_I_=QD/ML&+EWP%``!IP"@!``"+1!`L#[9`!.L[
-M9H'Z@0!W&0^VP8N7M`4``&G`%`T``(M$$`@/MD`$ZQL/ML&+EY@%``!IP+``
-M``"+1!!4#[9`!(UT)@`/MM$\_W0)9H'Z_P!U*(GV@WM0`'0/C4-0B40D!(D\
-M).C\____B5PD!(D\).C\____Z3H!```/ML`/MHP'0@4```^WPFG`*`$``(G&
-M`[=\!0``@'L4``^$I@```&O!7(VL!T`!```/MD46B40D$`^V116)1"0,#[9#
-M)XE$)`@/MD,FB40D!,<$),P)``#H_/___XL6BT8$B4($B1"`;18!B70D!(D\
-M).C\____B5PD!(D\).C\____#[9W*XGPA,`/A*H````/MET5N0````#VPP%U
-M#>L<#[;*B=C3^*@!=!:)3"0$B3PDZ/S____I?@```+H`````@\(!B?`XPG76
-MZVYKP5R-K`=,`0``@'LF`74VQP0D$"<``.C\____B5PD!(D\).C\____QT0D
-M#`$```#'1"0(`````(ET)`2)+"3H_/___^LHQP0D4,,``.C\____B5PD!(D\
-M).C\____B70D!(DL).C\____C70F`(M<)!R+="0@BWPD)(ML)"B#Q"S#C;8`
-M````C;\`````55=64X/L'(MT)#"+;"0T#[9$)#B(1"07#[9$)#R(1"06BP:)
-M1"08@'X*`'1TNP````"-?CB)/"3H_/___XG"BT8\B58\B3J)0@2)$#EJ,'4/
-M#[9$)!<X0DUT#9"-="8`@\,!.%X*=\TX7@IT-(!\)!90=2W&0B<&QD(F!<9"
-M)`?&0B4`B6HPB7(LQH*6`````(E4)`2+1"08B00DZ/S___^#Q!Q;7E]=PXVT
-M)@````"#["R)7"0<B70D((E\)"2);"0HBVPD,(M$)#0/MU`09H'ZA0`/AX8`
-M```/M\(/MH0HO`0``#S_='=F@_I_=Q@/ML!IP"@!```#A7P%``"+0"P/ME`$
-MZUZ+5"0T#[="$&8]@0!W(`^WP`^VA"B\!```:<`4#0```X6T!0``BT`(#[90
-M!.LPBTPD-`^W01`/MH0HO`0``&G`L`````.%F`4``(M`5`^V4`3K"XVV````
-M`+K_____N?____^+1"0T9H%X$(4`=Q"+3"0T#[=!$`^VC"B\!```#[;"#[:$
-M*$(%``!KP%R-O`5,`0``#[;!:<"P````B[68!0```<:+1"0T@'@H`@^%B```
-M``^V0"PE\````(/X('0%@_@0=76+3"0T#[91+(G0@^`/@_@!=3&)T"7P````
-MQT0D$`$```")1"0,QT0D"`(```#'1"0$`````(DT).C\____Z0$*``"0#[9&
-M*XM4ACR+3"0T#[9!+"7P````@_@@#Y3`@\`(B(*V````BT(T9H%@,O_^Z<X)
-M``"+5"0T#[9"%(3`=$.)PX-Z4`!T$8G0@\!0B40D!(DL).C\____BTPD-(E,
-M)`2)+"3H_/___X#[`@^%D`D``(ET)`2)+"3H_/___^E_"0``QX:8````````
-M``^V1B8\)`^'"0D```^VP/\DA7P4``"+1QCV0"H(#X0R"0``B?;IMP4``(N5
-M1`H``('"3`@```^V1C3!X`@!PHL"HP````"#^`5W!8A&'^L$QD8?!8!_"P!T
-M#<9&)@#&1PL`Z:X(``#&1B8"Z:4(``"+E40*``"!PDP(```/MD8TP>`(`<*+
-M`J,`````#[;`9HE&((N51`H``('"1`@```^V1C3!X`@!PHL"HP````")PL'J
-M"&:)5B+!X`AF"48@9H'Z0$%U"<9&)AGI1@@``&:!?B(5EP^4P(/H`8/@WX/`
-M)(A&)NDL"```BY5$"@``@<)$"```#[9&-,'@"`'"BP*C`````(A&'8N51`H`
-M`('"3`@```^V1C3!X`@!PHL"HP````"H"'0&QD8>#.L:J`1T!L9&'@OK$(/@
-M`H/X`1G`]]"#X`J(1AX/MD8K/`$9P(/@`H/`%(A&)NFW!P``BX5$"@``!4P(
-M```/ME8TP>((`="+`*,`````@\@(B$8LQD8F!>F-!P``QD8F``^W1C)F)??]
-M@\@"9HE&,HM$)#2#>%``=`^#P%")1"0$B2PDZ/S___^+5"0TB50D!(DL).C\
-M____QD<%_XE\)`2)+"3H_/___^F<!P``QD8F!.DS!P``#[9&*X/``8A&*SI&
-M'W-7QD8F%HM,)#2#>5``=!&)R(/`4(E$)`2)+"3H_/___XM$)#2)1"0$B2PD
-MZ/S____'1EB`A!X`QT9@`````(EV9(U&6(M5%(E$)`2)%"3H_/___^DM!P``
-MQD8K`,9&)A?'!"0@H0<`Z/S____IM`8``,9&)A3IJP8``,9&)@B-M"8`````
-MZ9L&``#&1B84Z9(&``#&1BX`Z/S___^)AH@```#&1B85Z7H&``"+E40*``"!
-MPDP(```/MD8TP>`(`<*+&HD=``````^VVXN51`H``('"1`@```^V1C3!X`@!
-MPHL"HP````#H_/___XF&C````(/C#X/[`W4)QD8F"NDB!@``BX:(````!4`-
-M`P`YAHP```!Y%P^V1BX\"G</QD8F%8/``8A&+NGX!0``#[9&*X-\ACP`#X2G
-M`0``QT0D%`````"`?PH`=#[&1"0:`(U?.(D<).C\____B40D%`^V1BN+5"04
-M.52&/'0<BT,$B5,$B1J)0@2)$(!$)!H!#[9,)!HX3PIWRH!O"@&+5"04BT(@
-MA<`/A"P!``#'0&``````]D(H!'4[B2PDZ/S___^+3"04BT$TQH"L`````8M!
-M(,=$)`@!````B40D!(DL).C\____BU0D%(M"-,:`K`````"+3"04BT$@BY5(
-M!0``B40D"(E4)`3'!"0!````Z/S___^+5"04BT(@BTAPA<ET,`^W0AS'A(6\
-M`@```````(M"(,=`<`````"+0B"+4'C'1"0(_____XE$)`2)%"3_T8M,)!2+
-M02"%P'0KBU!TA=)T)`^W01S'A(6\`@```````(M!(,=`=`````"+02"+0'B)
-M!"3_THM4)!2+0B`/ME`"#[9``8E4)`B)1"0$QP0DT`(``.C\____BTPD%(M!
-M((N52`4``(E$)`B)5"0$QP0D!@```.C\____BT0D%,=`(``````/MD8KQT2&
-M/`````"+5"04B50D!(DL).C\____QD8F">DY!```BY5$"@``@<),"```#[9&
-M-,'@"`'"BPJ)#0`````/MLF+E40*``"!PD0(```/MD8TP>`(`<*+`J,`````
-MP>`("<B)1CB`?B8*=`>I```!`'0)QD8F"^G?`P``QD8F#`^V1BN#?(8\`'1.
-M@'\*``^$)@0``,9$)!L`C5\XB1PDZ/S___^)P@^V1BLY5(8\=0J`;PH!ZRR-
-M="8`BT,$B5,$B1J)0@2)$(!$)!L!#[9,)!LX3PIV#.O$B2PDZ/S___^)PH72
-M#X30`P``#[9&*XE4ACP/MD8OB(*V````Z5D#``")+"3H_/___\<$)`$```#H
-M_/___X/K`8/[_W0)BT<8]D`J"'3;QD8F">DK`P``BY5$"@``@<),"```#[9&
-M-,'@"`'"BPJ)#0`````/MLF+E40*``"!PD0(```/MD8TP>`(`<*+`J,`````
-M#[;`P>`("<@E_P\``#T3`0``#Y3"/2,!```/E,&$TG43A,EU#STS`0``=4*-
-M=@#I\@(``,9&)AB$TI"-="8`=`G&1B\(Z:4"``"$R8UV`'0)QD8O">F5`@``
-M/3,!```/A8H"``#&1B\*Z8$"```/MDXJ#[;1#[9&'X/H`3G"?1.-00&(1BJ`
-M1BL!QD8F!^E<`@``QD8K`,9&)A[I3P(``,9&)@/I1@(``,9&)B*)]ND[`@``
-MQD8F(^DR`@``QD8F`^DI`@``BY5$"@``@<),"```#[9&-,'@"`'"BPJ)#0``
-M``"+E40*``"!PD0(```/MD8TP>`(`<*+$HD5`````(G0P>`(#[;)"<AF/0,1
-M#X6:````B=#!Z`AF/453=`IF/4`##X6%````9L=&(`,19HE&(F8]15-U'("^
-MI0````)T$\:&I0````+'AJ@````?````ZR)F@7XB0`-U&H"^I0````-T$<:&
-MI0````/'AJ@````/^`,`QH:L`````8DT).C\____QH:L`````(L&BX!(!0``
-MQT0D!`````")!"3H_/___\9&)@/I00$``,9&)B'&AJ4`````Z3$!``"+E40*
-M``"!PDP(```/MD8TP>`(`<*+`J,`````BY5$"@``@<)$"```#[9&-,'@"`'"
-MBP*C`````,9&)A_I\````,9&)B#IYP```(N51`H``('"3`@```^V1C3!X`@!
-MPHL"HP````"+E40*``"!PD0(```/MD8TP>`(`<*+`J,`````#[9.*P^V1A^-
-M40&(5BL/MLD/ML"#Z`$YP0^<P(/H`8/@YX/`'XA&)NF"````BY5$"@``@<),
-M"```#[9&-,'@"`'"BPJ)#0`````/MLF+E40*``"!PD0(```/MD8TP>`(`<*+
-M`J,`````P>`("<&)CI0```#&1B8:ZS7&1B8;ZR^+A40*```%3`@```^V5C3!
-MX@@!T(L`HP````"#X/>(1BS&1B8<ZPC&1B8=C70F`(M$)#2#>%``=`^#P%")
-M1"0$B2PDZ/S___^+5"0TB50D!(DL).C\____B70D!(DL).C\____ZRG&1B88
-MZ1O]__^)+"3H_/___\<$)`$```#H_/___[L^0@\`Z67\__^)]HM<)!R+="0@
-MBWPD)(ML)"B#Q"S#C;8`````C;\`````@^Q<B5PD3(ET)%")?"14B6PD6(ML
-M)&"+?"1D#[=7$&:!^H4`#X>^````#[?"#[:,!;P$``"`^?\/A*H```!F@_I_
-M=QP/ML&+E7P%``!IP"@!``"+1!`L#[9`!.LZC78`9H'Z@0!W&0^VP8N5M`4`
-M`&G`%`T``(M$$`@/MD`$ZQ</ML&+E9@%``!IP+````"+1!!4#[9`!#S_=$T/
-MML`/MI0%0@4``(#Z_W05@/G_=!`/ME\4@/L&=5>-M"8`````@/K_=".`^?]T
-M'@^VP6G`*`$``(G&`[5\!0``QD8G`L9&)O_IN`<``(-_4`!T#XU'4(E$)`2)
-M+"3H_/___XE\)`2)+"3H_/___^G"!P``B?8/ML%IP"@!``")Q@.U?`4```^W
-MAI0```!FB40D-F8]JPUW!8#[`G4Z@W]0`'0/C4=0B40D!(DL).C\____B7PD
-M!(DL).C\____QD8F_\9&)P*)="0$B2PDZ/S____I7@<``,9$)#T`@/L@=26+
-M3S@/M@&#X'\\<78-#[9)`8/A#XA,)#WK"P^V20*#X0^(3"0]#[;2B50D,&O"
-M7(V$!4P!``")1"0X#[9')#P:#X0'!@``/!IW'SP2=%$\%8UT)@`/A)@&``"$
-MP`^$I04``(GVZ;L&```\)0^$X`(``#PED'<3/!L/A:8&``"-M@````#I=04`
-M`#R>#X3-`P``/*"0#X6*!@``Z6(&``"$VXUV``^%@P(``(M/-(!_)0"-=@!T
-M887)=$N`>0&`=46`>0(`=3\/MD$#/#QW-P^VV(U64+@`````Q@00((/``8/X
-M%'7T@_L3=@6[%````(U64(U!!(E<)`B)1"0$B10DZ/S___]FQX:4``````#&
-M1B89Z0T&``#&1B88]D$&0'41#[8!@^`?@_@-#X5C`0``ZPL/M@&#X!^#^`UU
-M"<9&)0V-=@#K!,9&)2(/MD8EB40D!,<$)!`#``#H_/___X-_4`!T#XU'4(E$
-M)`2)+"3H_/___XE\)`2)+"3H_/___VM$)#!<@+P%5@$````/A,(%``"^````
-M`(G#C;P%A`$``(D\).C\____C10KBXJ(`0``B8*(`0``B3B)2`2)`0^V0"4\
-M(G0$/`UU#H/&`8GR.)0=5@$``'?(:T0D,%P/MH0%5@$``(GQ.,@/A64%``"$
-MP`^$704``+X`````9L=$)#X``,=$)$``````:UPD,%R-O!V$`0``B3PDZ/S_
-M__^)P8T$*XN0B`$``(F(B`$``(DYB5$$B0H/MD$E/")T!#P-=10/MT$<9CM$
-M)#YR"6:)1"0^B4PD0(/&`8GP.(0=5@$``'>R@WPD0``/A.0$``"+5"1`@'HF
-M_P^$U@0``,9")O^)5"0$B2PDZ/S____IP00``(/X`741QD8E`<9&)O^-="8`
-MZ7L$``#V004!=`9F@4XX``2+7S2%VW1;C59DN`````#&!!``@\`!@_@H=?2-
-MEHP```"P`,8$$`"#P`&#^`AU](U.9(U3"(M#"(E&9(M"!(E!!(M""(E!"(M"
-M#(E!#(M"$(E!$(M"%(E!%(M#((F&C````(.^'`$````/A0`$``#&1B8<Z?<#
-M```/MT0D-H/``6:)AI0```#'!"00)P``Z/S____&1B8%Z=,#``"+3S2$VP^%
-MD`````^V40;!X@@/MD$%P>`0"<(/MD$'"<(/MD$$P>`8"<*)EK`````/MA'!
-MXA@/MD$#"<(/MD$"P>`("<(/MD$!P>`0"=")1D3'1D@`````@[ZP`````'4=
-M9H.&E`````''!"00)P``Z/S____&1B8;Z54#``"#^/]U#V:!3C@`!,9&)AOI
-M00,``,9&)@WI.`,``(#[('4S@'PD/09T!X!\)#T"=24/MT0D-H/``6:)AI0`
-M``#'!"00)P``Z/S____&1B8%Z0$#``"0@W]0`'0/C4=0B40D!(DL).C\____
-MB7PD!(DL).C\____B70D"(M,)#B)3"0$B2PDZ/S____I]@(``(M'-(E$)$2$
-MVP^%'P$```^V4`K!X@@/MD`)P>`0"<*+3"1$#[9!"PG"#[9!",'@&`G"B9:P
-M````#[9!`XG"N`````")1"0HB50D+`^V00*)PK@`````P>((BTPD*`G!BUPD
-M+`G3BT0D1`^V`(E$)"#'1"0D`````(M$)"")PK@`````P>(8"<$)TXM$)$0/
-MMD`!B40D&,=$)!P`````BT0D&(G"N`````#!XA`)P0G3BT0D1`^V4`;!X@@/
-MMD`%B40D&,'@$`G"BT0D1`^V0`<)PHM$)$0/MD`$B40D&,'@&`G""<J)5D2)
-M7DB+5"1$]D(,`70%9H-..@2#OK``````=1UF@X:4`````<<$)!`G``#H_/__
-M_\9&)AOII@$``&:#3C@!QD8F#>F8`0``@/L@=3.`?"0]!G0'@'PD/0)U)0^W
-M1"0V@\`!9HF&E````,<$)!`G``#H_/___\9&)AOI80$``)"#?U``=`^-1U")
-M1"0$B2PDZ/S___^)?"0$B2PDZ/S___^)="0(BTPD.(E,)`2)+"3H_/___^E6
-M`0``QD8F%.D=`0``@/L@=3B`?"0]!HUV`'0'@'PD/0)U)P^W1"0V@\`!9HF&
-ME````,<$)!`G``#H_/___\9&)A3IXP```(UV`,9&)AOIUP```(3;D(UT)@!U
-M7(M'-&:#3C@"9H-..@%F@4XXA`"`>`,`=06`.!9W'6:#AI0````!QP0D$"<`
-M`.C\____QD8F#>F3````]D`&!'0'9H-..@+K!6:#9CK]BT=0B488QT=0````
-M`.LZ@/L@=3"`?"0]!G0(@'PD/0*0=28/MT0D-H/``6:)AI0```#'!"00)P``
-MZ/S____&1B8%ZSUF@V8X^<9&)@[K,H3;=05F@TXZ`\9&)@_K(X3;D'4,B7PD
-M!(DL).C\____@[X<`0```1G`@^`3@\`%B$8F@W]0`'0/C4=0B40D!(DL).C\
-M____B7PD!(DL).C\____B70D!(DL).C\____C78`BUPD3(MT)%"+?"14BVPD
-M6(/$7,.0D)"0D)"0D)"0D)"#X0?!X0B`S2"+0`0MY#P```^VTL'B"`'0B0@/
-MMP!FHP`````/ML##D(VT)@````"#X0?!X0B*3"0$@,T0BT`$+>0\```/MM+!
-MX@@!T(D(PU575E.#[`B)Q\9$)`(`QD0D`P"]_____\=$)`0`````#[9$)`2(
-M1"0!@T0D!`&X`0```(G&#[9,)`33YHGQNP````"XP.'D`+H`````]_$Y^'<=
-MB?HIPHG0.>IS$P^V5"0!B%0D`HA<)`.)Q8UT)@"#PP$!\8/[$'7)@WPD!`AU
-MGP^V1"0#P>`#"D0D`@^VP(/$"%M>7UW#D(VT)@````"#[`R)7"0$B70D"(M<
-M)!`/MG0D%,<$)`````"Y!P```(GRB=CH%____P^V@RD+``")!"2Y`P```(GR
-MB=CH__[__XM<)`2+="0(@\0,PXUV`%.)TP^VT;D#````Z+#^__\XV`^4P`^V
-MP%O#C;8`````4XM<)`B%VW0ON@````")]@^VA!H^!0``#[;(//]T$0^WP6G`
-ML`````.#F`4``.L-@\(!@_H$==BX`````%O#D%93@^P$BT0D$(N83`4``(7;
-M=0*)P[X`````QP0D`````+D'````B?*)V.AA_O__QP0D1````+D"````B?*)
-MV.A,_O__QP0DT````+D`````B?*)V.@W_O__QP0D`````+D$````B?*)V.@B
-M_O__@\8!@_X"=:2XH(8!`.@P_O__B(,I"P``#[;`B00DN0,```"Z`````(G8
-MZ//]__^#Q`1;7L.-M@````"-O"<`````@^P\B5PD+(ET)#")?"0TB6PD.(M4
-M)$`/MH*E````/`(/A>H```"+BJ@```")3"049L=$)!H``+T````JQT0D'```
-M``"[`````+X`````OP0```"Z`0```(G0B=G3X(5$)!1U'(U+!M/B9@E4)!H)
-M5"0<N!4```")\=/@"<7K"9")^(GQT^`)Q8/#`8/&!8/'`X/[!76]BT0D'(E$
-M)`S'1"0(J`,``,=$)`0!````BU0D0(D4).C\____B6PD#,=$)`C$`P``QT0D
-M!`$```"+3"1`B0PDZ/S___\/MT0D&HM4)$`+@J@```")1"0,QT0D"*`#``#'
-M1"0$`0```(D4).C\____Z?T```"-M@`````\`P^%[P```(M,)$"+B:@```")
-M3"0H9L=$)"(``+T````JQT0D)`````"[`````+X`````OP0```"-M"8`````
-MN@$```")T(G9T^"%1"0H=1^-2P;3XF8)5"0B"50D)+@5````B?'3X`G%ZPR-
-M="8`B?B)\=/@"<6#PP&#Q@6#QP.#^P1UNHM$)"2)1"0,QT0D"*@#``#'1"0$
-M`0```(M4)$")%"3H_/___XEL)`S'1"0(Q`,``,=$)`0!````BTPD0(D,).C\
-M____#[=$)"*+5"1`"X*H````]]")1"0,QT0D"*`#``#'1"0$`0```(D4).C\
-M____BUPD+(MT)#"+?"0TBVPD.(/$/,.0C70F`(/L#(M4)!`/MDPD%(!\)!@`
-M=`^X_O___]/`(8*H````ZPVX`0```-/@"8*H````B10DZ/S___^#Q`S#D(UT
-M)@"#[!S'1"00`0````^W1"0DP>`(@\`/B40D#,=$)`B:````QT0D!`$```"+
-M1"0@B00DZ/S___^#Q!S#C;8`````@^P,BU0D$`^V3"04@'PD&`!T$+C^____
-MT\!F(8*0````ZPZX`0```-/@9@F"D`````^W@I````")1"0$B10DZ/S___^#
-MQ`S#D(VT)@````"#["R)7"0<B70D((E\)"2);"0HBW0D,(M$)#0/ME0D.(A4
-M)!L/MIB8````#[9H`HM0:(72=!H/MD0D&XE$)`B)Z0^VP8E$)`2)%"3H_/__
-M_XDT).C\____@/L'=TH/ML/_)(40%0``O_L```"-="8`ZS6_,P```.LNOSL`
-M``")]NLEOW,```#K'K][````B?;K%;^S````ZPZ_NP```(GVZP6_\P```(E\
-M)`2)-"3H_/___P^V1"0;B40D"(U$G0`/ML")1"0$B30DZ/S___^+7"0<BW0D
-M((M\)"2+;"0H@\0LPXVV`````(V\)P````!75E.#[!")Q[L`````#[;RN0(`
-M``")\HGXZ++Y__^H"'0.N`````#K(XVT)@````#'!"0!````Z/S___^#PP&!
-M^Q`G``!UR;C_````@\006UY?PXVV`````(V\)P````"#[`R)'"2)="0$B7PD
-M"(G&B<\/MMJ)VNB$____A<!U,(GX#[;0B=F)\.B"^O__A<!T'KD!````B=J)
-M\.@P^?__BU0D$(@"N`````#K"(UV`+C_____BQPDBW0D!(M\)`B#Q`S#C;8`
-M````C;\`````@^P<B5PD$(ET)!2)?"08B<8/MOD/MMJ)/"2Y`0```(G:Z`KY
-M___'!"1`````N0(```")VHGPZ/7X__^)VHGPZ.S^__^%P'5.@WPD(`!T-??'
-M`0```'09B=FZ0````(GPZ-OY__^%P'0MZS*0C70F`(G9NA@```")\.C"^?__
-MA<!T%.L9B=FZ*````(GPZ*[Y__^%P'4'N/\```#K!;@`````BUPD$(MT)!2+
-M?"08@\0<PXVT)@````"-O"<`````55=64X/L#(G'BVPD)(G3B<Z$R0^$Z@``
-M``^VVL<$)&0```"Y`@```(G:B?CH/_C__XG:B?CH-O[__X7`=0ZY`P```(G:
-MB?CH]/?__XGP#[;(QP0D`0```(G:B?CHW_[__[[_____A,`/A7<!``"^````
-M`(7M#XYJ`0``O@````"-1?^)1"0(.70D"'4UQP0D0````+D"````B=J)^.C.
-M]___BT0D(`'PB00DN5@```")VHGXZ!?^__^%P'0YZ2,!``#'!"1$````N0(`
-M``")VHGXZ)GW__^+1"0@`?")!"2Y4````(G:B?CHXOW__X7`#X7O````@\8!
-M.>X/A.0```#KA+B@A@$`Z(/W__\/MML/ML")!"2Y`P```(G:B?CH3/?__XG:
-MB?CH0_W__X7`="(/MH<I"P``B00DN0,```")VHGXZ"?W__^^_____^F2````
-MB=FZ8````(GXZ!_X__^%P'0-O@````"%[7Y?B?;K'P^VARD+``")!"2Y`P``
-M`(G:B?CHYO;__[[_____ZU2^`````,<$)$0```"Y`@```(G:B?CHQ?;__XM$
-M)"`!\(D$)+F`````B=J)^.@._?__A<!U!X/&`3GN=<D/MH<I"P``B00DN0,`
-M``")VHGXZ(OV__^)\(/$#%M>7UW#D(/L'(E<)!2)="08BW0D(`^V3"0DBT0D
-M+(E$)`2+1"0HB00DN@````")\.CA_?__B</'!"14````N0(```"Z`````(GP
-MZ#?V__^)V(M<)!2+="08@\0<PXGVC;PG`````(/L'(E<)!2)="08BW0D(`^V
-M3"0DBT0D+(E$)`2+1"0HB00DN@$```")\.B!_?__B</'!"14````N0(```"Z
-M`0```(GPZ-?U__^)V(M<)!2+="08@\0<PXGVC;PG`````%575E.#[`R)QXML
-M)"2)RP^V\L<$)&0```"Y`@```(GRZ)OU__^)\HGXZ)+[__^%P'4.N0,```")
-M\HGXZ%#U__\/MLO'!"0!````B?*)^.@]_/__A,!U+H7M?C&[`````(M$)"`/
-MM@P#QP0D`````(GRB?CH&/S__X3`=0F#PP$YZW0)Z]NX_____^L%N`````"#
+M0&8-ZSP\*'4:#[9#3X/H`8A#3HGH`X;,!0``BP#&0!2!ZQX\"'4,QP0D$"<`
+M`.C\____B>@#ALP%``"+`,9`%"&#Q$Q;7E]=PXUT)@!55U93@>R<````BZPD
+ML`````^WA9(+``!FB40D?HN%K`H``(L`HP````!F)?\/9HF%D@L``&8[1"1^
+M=5:+10"+B%`!``")#0````"+10")RH'B\/__`(F04`$``+@`````A=(/A.`(
+M``")3"0$QP0D]0```.C\____BY0DL````(D4).C\____N`$```#IMP@``&:!
+MO9(+``#_#P^%(`@``.E!"```B[5D"@``9H-$)'X!#[=,)'YF.XV6"P``&<`A
+MP6:)3"1^BY6L"@``@\($#[?!BQ2"B=?![Q#WQP@````/A+````"+10"+F%`!
+M``")'0````"+50")V"7P__\`B8)0`0``A<!T8H!]*P!T7/;'`74MO@````#W
+MPP```0!T/NL>#[?&C4@(N@$```")U]/GA?MU$(U($-/BA=-U!^L>O@`````/
+MM\9KP%R-G`5(`0``A=MU*.L2C;8`````@\8!#[9%*V8Y\'>XBX0DL````(D$
+M).C\____Z54'``"+E"2P````B10DZ/S___^(0POI/@<``(G19H'A_P]FB4PD
+M3@^WV8E<)$1IP[`$``"+3`8@BUP&)(F,)(````")G"2$````BW0D1,'F`HN%
+MS`4```'PBP")1"1XA<`/A<T!``")3"00B5PD%(E4)`R+7"1$B5PD"(E<)`3'
+M!"3\!@``Z/S___]F@WU8``^$PP8``,:$)(L`````C;8`````#[:\)(L```"-
+M!+T`````B40D6`.%S`4``(L0A=(/A$@!``!I][`$```#M60*``"+G1P*```/
+MMD(5B40D#(E\)`B)5"0$QP0D$`$``.C\____BT0D6`.%S`4``(L`B00DZ/S_
+M__^+ABP$``"+EB@$``"+CB0$``"+MB`$``")1"04B50D$(E,)`R)="0(B7PD
+M!,<$)#@'``#H_/___XGXP>`&`<.+4S2)5"1(BU,PBTLLBW,HBWLDBT,@B40D
+M7(M#'(E$)&"+0QB)1"1DBT,4B40D:(M#$(E$)&R+0PR)A"24````BT,(B80D
+MD````(M#!(F$)(P```"+&XM$)$B)1"0XB50D-(E,)#")="0LB7PD*(M4)%R)
+M5"0DBTPD8(E,)""+?"1DB7PD'(M$)&B)1"08BU0D;(E4)!2+C"24````B4PD
+M$(N\))````")?"0,BX0DC````(E$)`B)7"0$QP0D8`<``.C\____@(0DBP``
+M``$/MH0DBP```&8[15@/@S`%``#I=O[__XVV`````/?'(`````^$AP$``(M4
+M)'B`>A2!#X57`0``QD(4(0^W0A[!X`(#A<P%``#'```````/MTH>B<AFP>@%
+M#[?`@^$?N@$```")T]/CB=GWT2&,A=`%``"+?"1X#[=/'HG(9L'H!0^WP(/A
+M']/B]](A5(5<#[=''HE$)`2+1"10B00DZ/S___^#?U0`=!&)^(/`5(E$)`2)
+M+"3H_/___XM,)'@/MU$09H'ZA0`/A\(````/M\(/MH0%N`0``#S_#X2O````
+M9H/Z?W<;#[;`:<`H`0```X5X!0``BT`L@'@$_P^5P.M7BUPD>`^W0Q!F/8$`
+M=R,/M\`/MH0HN`0``&G`%`T```.%L`4``(M`"(!X!/\/E<#K)HM\)'@/MT<0
+M#[:$*+@$``!IP+`````#A90%``"+0%2`>`3_#Y7`A,!T,XM$)'B)1"0$B2PD
+MZ/S___^-E>0```"+A>0```"+3"1XB4@$B0&)402)C>0```#IM`,``(M<)%2+
+M4P2+1"1X@\`(B4,$BWPD>(E?"(E0!(D"Z9(#```/MT0D3F;!Z`4/M\")1"1P
+M#[=<)$Z)V8/A'[@!````T^")1"1TBU0D<(5$E5P/A5\#``")\`.%S`4``(L`
+M#[=0$&:!^H4`#X>?````#[?"#[:$!;@$```\_P^$C````&:#^G]W&`^VP&G`
+M*`$```.%>`4``(M`+`^V0`3K78GP`X7,!0``BP`/MT`09CV!`'<@#[?`#[:$
+M*+@$``!IP!0-```#A;`%``"+0`@/MD`$ZRF)\`.%S`4``(L`#[=`$`^VA"BX
+M!```:<"P`````X64!0``BT!4#[9`!#S_=`T/ML"`O`4^!0``_W4[BUPD=(M,
+M)'"%7(U<#X65`@``BWPD>,9'%`:)/"3H_/___\=$)`@`````B7PD!(DL).C\
+M____Z6P"```/MH0%/@4``&O`7(V$!4@!``"+E"2$````"Y0D@````'0>]\<"
+M````=1;'A"2``````````,>$)(0`````````]D`&`@^$60$``(N4)(````"+
+MC"2$````B50D"(E,)`R)7"0$B00DZ/S___^+7"1TBTPD<(5<C5P/A>X!``"+
+M?"1X@'\4@0^%BP````^W1Q[!X`(#A<P%``#'```````/MT\>B<IFP>H%#[?2
+M@^$?N/[____3P"&$E=`%```/MT<>B40D!(M$)%")!"3H_/___XE\)`2)+"3H
+M_/___X-_5`!T$8GX@\!4B40D!(DL).C\____C97D````BX7D````BTPD>(E(
+M!(D!B5$$B8WD````Z54!``"+A>P````[1"14=$^[`````(/#`8L`.40D5'7U
+MA-MT.[X`````BWPD5(D\).C\____C4CXBU<$B4<$B3B)4`2)`CM,)'AU!;X!
+M````@.L!==2)\(3`#X7Z````BTPD5(M1!(M$)'B#P`B)002+7"1XB4L(B5`$
+MB0*+1"1TBWPD<`F$O9P```#IR0```(N4)(````"+C"2$````B50D"(E,)`R)
+M7"0$B00DZ/S___^+A>P````[1"14=$^[`````(/#`8L`.40D5'7UA-MT.[X`
+M````BTPD5(D,).C\____C4CXBWPD5(M7!(E'!(DXB5`$B0([3"1X=06^`0``
+M`(#K`770B?"$P'5,BU0D>(!Z%(%T0HM,)%2+402+1"1X@\`(B4$$BUPD>(E+
+M"(E0!(D"BT0D=(M\)'`)A+V<````ZQ2-E>P```")5"14C8T\"0``B4PD4`^W
+M7"1^9CF=D@L```^%O_?__XV%[````#F%[````'1'B<:)-"3H_/___X/H"`^W
+M2!Z)RV;!ZP4/M]N#X1^Z_O___]/"(92=G````,=$)`@`````B40D!(DL).C\
+M____.;7L````=;N)+"3H_/___[@!````@<2<````6UY?7<.-M@````"-OP``
+M``!64X/L%(M,)""+D40%``"+0@2+,(DU`````/?&````D'0%BT($B3"+F40%
+M``#WQ@``!`!T*XL#BY!0`0``B14`````A=)T&8L#B9!0`0``BP.+@%`!``"C
+M`````(UT)@#WQ@``"`!T+8'#R`P``(L#BY!0`0``B14`````A=)T%8L#B9!0
+M`0``BP.+@%`!``"C`````(N#1`4``,=$)`0`````B00DZ/S___^+FT0%``")
+M'"3H_/___XV#R`P``(D$).C\____BX-$!0``QT0D!`$```")!"3H_/___[@!
+M````A?9U"[@`````@'LS`'4`@\046U[#B?:-O"<`````55=64X/L+(MT)$"+
+M!HN`4`$``(E$)!2C`````(L6)?#__P")@E`!``"-M"8`````]T0D%`#__P`/
+MA+D'``"`?BL`#X2O!P``QD0D*P"-=@`/MFPD*XU-"+@!````B<+3XH54)!1U
+M#XU-$-/@A40D%`^$;@<``(!\)"L#=AF+!@6``0``C03HBP"C`````,'H$X/@
+M`>L7BP8%@`$``(T$Z(L`HP````#!Z!.#X`&$P'0?B30DZ/S___^)Z,'@!HT$
+MJ(&,!L`+``````@`C70F`(L6@'PD*P-V%XV$ZH`!``"+`*,`````)0```0#K
+M%8GVC83J@`$``(L`HP`````E```!`(7`="N`?"0K`W82C83J@`$``,<````!
+M`.D$!P``C83J@`$``,<````!`.GR!@``@'XU`0^%VP4``(!\)"L#=AV+!@6`
+M`0``C03HBP"C`````(/@`>L;C;0F`````(L&!8`!``"-!.B+`*,`````@^`!
+MA,`/A&0!``")Z,'@!HT<J(V$'L0+``"+5A2)1"0$B10DZ/S___^+A!Z@"P``
+MA<!T'8M0*(72=!;V0C("=1")!"3H_/___X3`#X4>`0``B>C!X`:-!*B+A`:@
+M"P``A<`/A(<```")1"0D@'@*``^$I0```,9$)",`B<>#QSB)/"3H_/___XG#
+MBT<$B5\$B3N)0P2)&/9#*`)U/8M3((72=!Z+AD0%``")5"0(B40D!,<$)`4`
+M``#H_/___X!+*`*)7"0(QT0D!`8```"+3"0DB0PDZ/S___^`1"0C`0^V1"0C
+MBU0D)#A""G8NZY$/MD0D*\=$)`@!````B40D!(DT).C\____QP0DH(8!`.C\
+M____N@`M,0'K!;I`2TP`B>C!X`:-'*B-##.)D<0+``#'@<P+``#09`$`#[9$
+M)"N)PL'B!HV$@I`+``"-1`8(B8'0"P``C80>Q`L``(M6%(E$)`2)%"3H_/__
+M_XUV`(!\)"L#=B^-%.T`````BP8%@`$```'0BP"C`````(L&!8`!```!PHL"
+MHP````#!Z`>#X`'K+8T4[0````"+!@6``0```="+`*,`````BP8%@`$```'"
+MBP*C`````,'H!X/@`83`=%N`?"0K`W8JC0SM`````(L&!80!```!R(L`HP``
+M``"+%H'"A`$```'1#0```0")`>LQC0SM`````(L&!80!```!R(L`HP````"+
+M%H'"A`$```'1#0```0")`>L@@'PD*P-V&8L&!8`!``"-!.B+`*,`````P>@2
+M@^`!ZQ>+!@6``0``C03HBP"C`````,'H$H/@`83`#X3?`0``@'PD*P-V*HT,
+M[0````"+!@6``0```<B+`*,`````#0``!`"+%H'"@`$```'1B0'K*(T,[0``
+M``"+!@6``0```<B+`*,`````#0``!`"+%H'"@`$```'1B0&)Z,'@!HT$J(N$
+M!J`+``"%P'0-B<6#>"@`=7_I9@$``(!\)"L#D'8YC13M`````(L&!8`!```!
+MT(L(B0T`````BP8%@`$``(T$`HD(BP8%@`$```'"BP*C`````.E<`P``C13M
+M`````(L&!8`!```!T(L(B0T`````BP8%@`$``(T$`HD(BP8%@`$```'"BP*C
+M`````.DC`P``BT`H#[=(,@^WT?;&`0^%V0```(G']L("#X3.````B<B#X/UF
+MB4<RC4=PBU84B40D!(D4).C\____QD0D*P"`?Q\`#X1]````QD0D*P`/MD0D
+M*XM<ASR%VW1<BU,@A=)T'HN&1`4``(E4)`B)1"0$QP0D!0```.C\____@$LH
+M`HE<)`C'1"0$!@```(DL).C\____@'M/`'0=C78`B30DZ/S____'!"0!````
+MZ/S___^`>T\`=>:`1"0K`0^V3"0K.$\?=XC'1W!`2TP`QT=X`````(E_?(U'
+M<(M6%(E$)`2)%"3H_/___XUT)@"`?"0K`W8>BP8%@`$```^V5"0KC130BP*C
+M`````,'H"(/@`>L<BP8%@`$```^V5"0KC130BP*C`````,'H"(/@`83`#X0.
+M`0``@'PD*P-V'HL&!8`!```/ME0D*XT4T(L"HP````"#\`&#X`'K'(L&!8`!
+M```/ME0D*XT4T(L"HP````"#\`&#X`&$P`^$Q0````^V1"0KB<+!X@:-A(*0
+M"P``C00&C5`(B50D'(M2"(72#X2?````B50D&(/`-(M6%(E$)`2)%"3H_/__
+M_XM$)!B`>`H`=%2]`````(G'@\<XB3PDZ/S___^)PXM'!(E?!(D[B4,$B1B+
+M4R"%TG0>BX9$!0``B50D"(E$)`3'!"0%````Z/S___^`2R@"@\4!B>J+3"08
+M.%$*=[:+1"0<QT`L@(0>`,=`-`````")0#B+1"0<@\`LBU84B40D!(D4).C\
+M____@'PD*P-V9`^V7"0KP>,#BP8%@`$```'8BQ")%0````"+!@6``0``C00#
+MB1"+!@6``0``C00#BP"C`````(L&!3`"``"-!`/'``````#'!"00)P``Z/S_
+M__^+!@4T`@```<.+`Z,`````ZV(/MEPD*\'C`XL&!8`!```!V(L0B14`````
+MBP8%@`$``(T$`XD0BP8%@`$``(T$`XL`HP````"+!@50`@``C00#QP``````
+MQP0D$"<``.C\____BP8%5`(```'#BP.C`````(!$)"L!#[94)"LX5BL/AUGX
+M__^+!HN`4`$``(E$)!2C`````(L6)?#__P")@E`!``#W1"04`/__`'0=Z0SX
+M__^)Z,'@!HT$J(&,!L`+``````$`Z?;X__^X`````(/$+%M>7UW#C;0F````
+M`%575E.#[%R+;"1P#[9$)'2(1"0S#[;0B50D-(G0P>`&C020`>B+B*`+``")
+M3"0\#[:XG@L``(M%`(!\)#,#=@S'@'`!``#$`0``ZPK'@'`!``"H`0``B40D
+M6`5T`0``B40D.(M<)%B+@W0!``"C`````(M,)#2#X0.[!P```-/CB=X)QHM$
+M)%B)L'0!``#'!"3H`P``Z/S____WTR'SBU0D6(F:=`$``(!\)#,#=E"+3"0T
+MBUPD6(V4B]`!``"+`J,`````@\@(B0*)R\'C`XM4)%B-A!H``@``QP`X````
+MQP0D$"<``.C\____BTPD6(V$&00"``#'``````#K4(M<)#2+1"18C928T`$`
+M`(L"HP````"#R`B)`HM<)#3!XP.+5"18C80:``(``,<`.````,<$)!`G``#H
+M_/___XM,)%B-A!D$`@``QP``````@WPD/``/A&8(``"`?2L`=#*[``````^V
+MRXM4)#P/MD()T_BH`704QT0D"`$```")3"0$B2PDZ/S___^#PP$X72MWTXM,
+M)#SV008!=&V)3"0$B2PDZ/S___^+7"0TB5PD!(DL).C\____B=C!X`:-!)B-
+M%"B+@KP+``"I```0`'0+)?__[_^)@KP+``"+1"0\B40D!(DL).C\____BT0D
+M-,'@!HM4)#2-!)#'A`6@"P```````.FW!P``BTPD/(!Y-`!T&HN%``H``(E,
+M)`2)!"3H_/___XM<)#R`:S0!N/[___\/MDPD--/`B?L@PXA<)$,/A)("``"+
+M1"0TB40D!(DL).C\____BT0D-,'@!HM4)#2-!)"-%"B+@KP+``"I```0`'0+
+M)?__[_^)@KP+```/MDPD0XM<)#R(2PF`?2L`#X2N`0``QT0D3``````/ML&)
+M1"0@BU0D6('"``(``(E4)!P/MDPD3(A,)%,/MOF+1"0@B?G3^*@!#X0^`0``
+MC1R]`````(E<)"R)^,'@!@'8#[94)$.(E`6>"P``@'PD4P,/AHT```"-'/T`
+M````BT0D'`'8QP`X````QP0D$"<``.C\____BTPD6(V$&00"``"+7"0@B1C'
+M@7`!``#$`0``BU0D.(L"HP````")^8/A`[L'````T^.)W@G&B3+'!"3H`P``
+MZ/S____WTR'SBTPD.(D9BUPD6(M$)"R-E`/0`0``BP*C`````(/("(D"Z8@`
+M``"-'/T`````BT0D'`'8QP`X````QP0D$"<``.C\____BU0D6(V$&@0"``"+
+M3"0@B0C'@G`!``"H`0``BUPD.(L#HP````")^8/A`[L'````T^.)W@G&BT0D
+M.(DPQP0DZ`,``.C\____]],AWHM4)#B),HM,)%B-E+G0`0``BP*C`````(/(
+M"(D"@T0D3`$/MD0D4X/``3A%*W8EZ8_^__^)'"3H_/___XUPX(M3!(E#!(D8
+MB5`$B0*#?@P`=!?K#+X`````BUPD/(/#+(M$)#PY6"QURX7V=#C&1C(`@'TK
+M`'0NN0````"Z`````(M<)#P/MD,)T_BH`70.#[;"B$P&0(!&,@&#P@&#P0$X
+M32MWW,=$)`@`````QT0D!($```"+1"0\B00DZ/S___^+1"0TP>`&BU0D-(T$
+MD,>$!:`+````````@'TK``^%S0,``.GG!```QT0D"`````#'1"0$!@```(M,
+M)#R)#"3H_/___XM<)#2)7"0$B2PDZ/S___^)V,'@!HT$F(T4*(N"O`L``*D`
+M`!``=`LE___O_XF"O`L``(M$)#R#P"R+5"0\.4(L#X0>`@``B40D%(M,)!2)
+M#"3H_/___XU8X(E<)$2-4`@Y4`@/A-(!``"#PRB)7"08BT0D&(D$).C\____
+MC5CX@'LE#74:C9#\````BT,LBP"+0!2)5"0$B00DZ/S___^+$XM#!(E"!(D0
+M@'M/`'0:B2PDZ/S____'!"0!````Z/S___^`>T\`=>:+0R"%P`^$.@$``,=`
+M8`````"`>T\`#X2D````9H-]6``/A)D```"_`````)"-="8`C02]``````.%
+MS`4``(LPA?9T;0^W1A!F.T,<=6-F/84`=UT/M\"`O"BX!```_W10BU4`#[=&
+M'F;!Z`4/M\"-!(4``P``B8)P`0``BU4`#[=.'H/A'[@!````T^")@G0!``#&
+M1A0AQT0D"`````")="0$B2PDZ/S___^-M@````"#QP$/MT58.?@/CW'____V
+M0R@$=1^)+"3H_/___XM#(,=$)`@!````B40D!(DL).C\____BT,@#[90`@^V
+M0`&)5"0(B40D!,<$),$```#H_/___XM#((N51`4``(E$)`B)5"0$QP0D`0``
+M`.C\____BT,@BY5$!0``B40D"(E4)`3'!"0&````Z/S____'0R``````BU0D
+M/(!J"@&+3"1$@&DP`8E<)`2)+"3H_/___XM$)!B+7"1$.4,H#X4U_O__BU0D
+M/(!J'`&+3"1$B4PD!(DL).C\____BT0D%(M<)#PY0RP/A>;]__^+1"0\@\`X
+MBU0D/#E".`^$!0$``+X`````B<>)/"3H_/___XG#@'A/`'0VC48!@?Y_EI@`
+M=@2)QNLGB<:)+"3H_/___\<$)`$```#H_/___X![3P!T"X/&`8'^@9:8`'7;
+MBT,@A<`/A(P```#'0&``````]D,H!'4?B2PDZ/S___^+0R#'1"0(`0```(E$
+M)`2)+"3H_/___XM#(`^V4`(/MD`!B50D"(E$)`3'!"3!````Z/S___^+0R"+
+ME40%``")1"0(B50D!,<$)`$```#H_/___XM#((N51`4``(E$)`B)5"0$QP0D
+M!@```.C\____QT,@`````(M,)#R`:0H!B5PD!(DL).C\____BUPD/#E[.`^%
+M`O___XM$)#R)1"0$B2PDZ/S___^+1"0TP>`&BU0D-(T$D,>$!:`+````````
+MZ2G\___'1"1(``````^V3"1#B4PD*(M<)%B!P]`!``")7"0D#[9\)$B)^`^V
+MP(E$)%2+1"0H#[9,)%33^*@!=0R)^SA<)#,/A<8```")^#P#=F.+5"18QX)P
+M`0``Q`$``(M,)#B+`:,`````BTPD5(/A`XT,2;L'````T^.)W@G&BT0D.(DP
+MQP0DZ`,``.C\____]],A\XM4)#B)&HM,)%2+7"0DC12+BP*C`````(/("(D"
+MZUV+1"18QX!P`0``J`$``(M4)#B+`J,`````BTPD5(/A`XT,2;L'````T^.)
+MW@G&B3+'!"3H`P``Z/S____WTR'>BTPD.(DQBUPD5(M$)"2-%)B+`J,`````
+M@\@(B0*#1"1(`8U'`3A%*P^'`/___X/$7%M>7UW#D(VT)@````!55U93@^P<
+MBWPD,(MT)#0/MF\KB>B$P'0L#[96";L`````]L(!=!/K'(VT)@````")T(G9
+MT_BH`740@\,!B>@XPW7MZP6[`````/9&"`)U"(U&.#E&.'5JB30DZ/S___^$
+MP'1/B3PDZ/S___^)P87`=%"+5CR)1CR-1CB)`8E1!(D*@$8*`8EQ+,9!)`7&
+M024`QD%-#\=$)`P!````QT0D"`$```")3"0$B30DZ/S____K#P^VPXE$)`2)
+M/"3H_/___X/$'%M>7UW#C;8`````55=64X/L#(ML)"`/MGPD)(GX#[;`B40D
+M"(G&P>8"NP````#'!"00)P``Z/S___^)^H#Z`W8:BT4`!=`!```!\(L`HP``
+M``#!Z!2#X`'K&9"+10`%T`$``(T$!HL`HP````#!Z!2#X`&$P'4*@\,!9H'[
+M+`%UK8M$)`B)1"0$B2PDZ/S___^)+"3H_/___XM$)`C!X`:+5"0(C020`>CV
+M@)T+```!=!*+@*`+``")1"0$B2PDZ/S___^#Q`Q;7E]=P^L-D)"0D)"0D)"0
+MD)"0D%575E.#[!P/MD0D-(A$)!J+?"0P#[;PB?#!X`:-!+"+K`>@"P``A>T/
+MA*H!``"X_O___XGQT\"$10D/A9@!``"-12PY12QU#8!]"@!U*8GVZ0,#```/
+MMD0D&HG"P>(&C82"D`L``(U$!PB)!"3H_/___^GA`@``QD0D&P"-=3B0B30D
+MZ/S___^)PXM&!(E>!(DSB4,$B1B`>R4`#X4?`0``#[=#'(.\A[@"````=1&#
+M>R``#X3H````C;0F``````^W0QR+A(>X`@``@WAP``^$K0```,:#M``````/
+MME,DB="#X`:#^`9U-O;"`70QQD,F!<9#)P0/MD--BU,PBTLLB5PD#(E$)`B)
+M5"0$B0PDZ/S____II@```(VV``````^V4R2)T(/@!H/X!'4B]L(!=!W&0R8#
+MQD,G!(E<)`2)/"3H_/___^MWC;0F``````^V4R2)T(/@!H/X!G5B]L(!=5W&
+M0R<&QD,F!6;'@Y0``````(E<)`2)/"3H_/___^L^BT,@BY=$!0``B40D"(E4
+M)`3'!"0$````Z/S____K'P^W0QR+ET0%``")1"0(B50D!,<$)`(```#H_/__
+M_Y"`1"0;`0^V1"0;.$4*#X:%`0``Z:C^__^-++4`````NP````#'!"00)P``
+MZ/S___^`?"0:`W89BP<%T`$```'HBP"C`````,'H%(/@`>L7D(L'!=`!```!
+MZ(L`HP````#!Z!2#X`&$P'4*@\,!9H'[+`%UL(ET)`2)/"3H_/___XD\).C\
+M____B?#!X`:-!+"+M`>@"P``A?8/A/D```"`?RL`=#2[`````(VV``````^V
+MRP^V1@G3^*@!=!3'1"0(`````(E,)`2)/"3H_/___X/#`3A?*W?7#[9$)!J)
+MPL'B!HV$@I`+``"-1`<(B488C48L.48L=2J-1C@Y1CAU(NMQB1PDZ/S___^-
+M:."+4P2)0P2)&(E0!(D"@WT,`'04ZPV]`````(U>+)"-="8`.5XL=<Z%[71?
+MQD4R`(!_*P!T5;H`````NP````"-=@`/MD8)B='3^*@!=`X/ML.(5`5`@$4R
+M`8/#`8/"`3A7*W8FZ]SV1@8!=`Z)="0$B3PDZ/S____K$,=$)`0`````B30D
+MZ/S___^#Q!Q;7E]=PU575E.#[`R+?"0@BQ^+;R@/MG,KB?"$P'17C8.8"P``
+MN0`````Y^'4>ZT:0C70F``^VP8G"P>(&C82"D`L``(U$`P@Y^'0)@\$!B?`X
+MP77@@/D#=B&+`P70`0``#[;1C120BP*C`````,'H%(/@`>L?N0````"+`P70
+M`0``#[;1C120BP*C`````,'H%(/@`83`=!4/ML&);"0(B40D!(D<).C\____
+MZP\/ML&)1"0$B1PDZ/S___^#Q`Q;7E]=PU575E.#[!R+7"0TBT0D,(E$)!2+
+M>%2+-_9'"!!T!,9`-0:+5"04#[9"-3P!='4\`7(9/`0/A)8````\!HUT)@`/
+MA3H#``#IIP$``(M,)!3&034!B4PD!(DT).C\____QD,4@8!/"`B#>U0`=`^-
+M0U2)1"0$B30DZ/S___^-EN0```"+AN0```")6`2)`XE3!(F>Y````(DT).C\
+M____Z=T"``"`9PCWBT0D%(!`-@'&0#4`QD,4`HE<)`2)-"3H_/___XDT).C\
+M____Z;`"```/MD<(@^#W@\@0B$<(BTPD%(N1F````(U"`8F!F````(/Z`@^'
+M^0```(-[5`!T#XU#5(E$)`2)-"3H_/___XV6Y````(N&Y````(E8!(D#B5,$
+MB9[D````BT0D%(!X)@!U"X!_"@!U(NFD````QT0D"`````#'1"0$`@```(D\
+M).C\____Z28"``#&1"0;`(UO.(DL).C\____B<.+102)702)*XE#!(D8BU,@
+MA=)T'HN&1`4``(E4)`B)1"0$QP0D!0```.C\____@$LH`HE<)`C'1"0$!@``
+M`(D\).C\____@'M/`'0:B30DZ/S____'!"0!````Z/S___^`>T\`=>:`1"0;
+M`0^V5"0;.%<*=X&+3"04B0PDZ/S____IC@$``(!G"/>+1"04QX"8````````
+M`(-[5`!T#XU#5(E$)`2)-"3H_/___XV6Y````(N&Y````(E8!(D#B5,$B9[D
+M````QT0D"`````#'1"0$!@```(D\).C\____C4<X.4<X#X26````B<6-M"8`
+M````B2PDZ/S___^)PXM`((7`=&?'0&``````B30DZ/S___^+0R#'1"0(`0``
+M`(E$)`2)-"3H_/___XM#((N61`4``(E$)`B)5"0$QP0D`0```.C\____BT,@
+MBY9$!0``B40D"(E4)`3'!"0&````Z/S____'0R``````B5PD!(DT).C\____
+M.6\X#X5S____BU0D%(E4)`2)-"3H_/___\='*`````"+!HN06`$``(D5````
+M`(72=`B+!HF06`$``/9'!@%T7(!^*P!T(;D`````]D<)`70,ZQ0/MD<)T_BH
+M`74/@\$!.$XK=^[K!;D`````#[;9B5PD!(DT).C\____B7PD!(DT).C\____
+MB=C!X`:-')C'A!Z@"P```````(GV@\0<6UY?7<.0C;0F`````(/L+(E<)!R)
+M="0@B7PD)(EL)"B+?"0TBW0D,(M&+(E$)!B+*`^W3QZ)R&;!Z`4/M]B#X1^X
+M`0```-/@A42=7`^%[P,``(M5`(T$G0`#``")@G`!``"+10"+D'0!``")%0``
+M``#&1Q0ABT<D)?___P`]X0$/`'4AB3PDZ/S____'1"0(`````(E\)`2)+"3H
+M_/___^F<`P``#[=/'H/A'[@!````T^"%PG06B3PDZ/S___^)+"3H_/___XVV
+M``````^VAK0````\!`^'90,```^VP/\DA8@(``#&AK0````!QT0D"`$```")
+M?"0$BU0D&(D4).C\____Z3<#``#&AK0````"QT0D"`@```")?"0$BT0D&(D$
+M).C\____Z1,#``#&AK0````#B70D",=$)`0A````BU0D&(D4).C\____BU8P
+MA=)T+0^V1DW'1"00`````,=$)`P!````B40D"(E4)`2+1"08B00DZ/S____I
+MP`(``(M4)!@/MD()QT0D"`````")1"0$B2PDZ/S____IGP(``,:&M`````2#
+M?C``=$B)="0(QT0D!"$```"+1"08B00DZ/S___\/MD9-BU8PQT0D$`````#'
+M1"0,`@```(E$)`B)5"0$BU0D&(D4).C\____Z4H"``#'1"0(`````,=$)`0A
+M````BT0D&(D$).C\____BU0D&`^V0@G'1"0(`0```(E$)`2)+"3H_/___^D-
+M`@``@'XF_W0=B70D",=$)`0&````BT0D&(D$).C\____Z>H!``")="0(QT0D
+M!`8```"+5"08B10DZ/S___^+3B"%R702BU$$C4(!B4$$@_H%#X:Y`0``QD8G
+M`<9&)@"`?D\`="&-M"8`````B2PDZ/S____'!"0!````Z/S___^`?D\`=>:#
+M?C``B?9T%(M6"(M&#(E"!(D0BT8P@&@P`>L3BU8TA=)T#`^V1DW'1((\````
+M`(L6BT8$B4($B1"+1"08@&@*`8N6Y````(72=!L/MH;9````QT0D"`$```")
+M1"0$B10DZ/S___^+5C"%TG08#[9&3<=$)`@!````B40D!(D4).C\____BT8@
+MA<`/A(8```#'0&``````B2PDZ/S___^+1B#'1"0(`0```(E$)`2)+"3H_/__
+M_XM&(`^V4`(/MD`!B50D"(E$)`3'!"3!````Z/S___^+1B"+E40%``")1"0(
+MB50D!,<$)`$```#H_/___XM&((N51`4``(E$)`B)5"0$QP0D!@```.C\____
+MQT8@`````(ET)`2)+"3H_/___XM4)!B`>@7_=%Z^`````(!Z"@!T.+X`````
+MBUPD&(/#.(UV`(D<).C\____BU,$B4,$B1B)4`2)`H!X)O]U#H/&`8GPBU0D
+M&#A""G?7B?"+5"08.$(*=Q#&0@7_B50D!(DL).C\____BUPD'(MT)""+?"0D
+MBVPD*(/$+,.0C;0F`````%575E.![(P```"+O"2@````BT=4B40D>(LHBX6L
+M"@``BP")1"1\B7PD!(DL).C\____@'\V`78$QD<U!(U?%#E?%`^$N`$``(D<
+M).C\____B40D=(M'%(M4)'2)4`2)`HE:!(E7%(72#X2<`P``#[=R'HM,)'B+
+M01@/MD`$#[95*0^V32(/METAB70D%(E$)!")5"0,B4PD"(E<)`3'!"2X!P``
+MZ/S___^+1"1T#[=`'HE$)%AI\+`$```#M60*``"+G1P*``"+5"1TB10DZ/S_
+M__^+CBP$``")3"1(BY8H!```BXXD!```B[8@!```BT0D=`^W0!Z)1"0$BT0D
+M2(E$)!2)5"00B4PD#(ET)`C'!"3H!P``Z/S___^+5"18P>(&`=.+2S2)3"1(
+MBU,PBTLLBW,HBT,DB40D7(M#((E$)&"+0QR)1"1DBT,8B40D:(M#%(E$)&R+
+M0Q")1"1PBT,,B80DB````(M#"(F$)(0```"+0P2)A"2`````BQN+1"1(B40D
+M.(E4)#2)3"0PB70D+(M4)%R)5"0HBTPD8(E,)"2+1"1DB40D((M4)&B)5"0<
+MBTPD;(E,)!B+1"1PB40D%(N4)(@```")5"00BXPDA````(E,)`R+A"2`````
+MB40D"(E<)`3'!"1@!P``Z/S___]F@WU8`'5&Z>4!``"0BU0D>(M"&`^V0`0/
+MME4I#[9-(@^V72''1"04____`(E$)!")5"0,B4PD"(E<)`3'!"2X!P``Z/S_
+M___I!0(``+X`````C8T\"0``B4PD4(V%Y````(E$)$R-M"8`````#[?&P>`"
+M`X7,!0``BQB%VP^$80$```^W0Q!F.4<D#X53`0``#[>5D@L``#E4)'QT18/"
+M`0^WA98+```YPAG`(<*+A:P*``"#P`2+!)"I```(`'4<9B7_#V8Y\'43.5PD
+M='43B2PDZ/S____I=0$``#M4)'QUNP^W0Q!F/84`B?8/A_$````/M\"`O`6X
+M!```_P^$X````(M4)'B`>C0`#X72````]D(&`0^$R````(M5``^W0QYFP>@%
+M#[?`C02%``,``(F"<`$```^W2QZ#X1^Z`0```(G0T^")P8M%`(F(=`$```^W
+M0Q[!X`(#A<P%``#'```````/MTL>B<AFP>@%#[?`B40D2(/A'XG0T^")P??1
+MBT0D2"&,A=`%```/MTL>B<AFP>@%#[?`@^$?T^+WTB%4A5PY7"1T="*+`XM3
+M!(E0!(D"BX7D````B5@$B0.+5"1,B5,$B9WD````#[=#'HE$)`2+3"10B0PD
+MZ/S___^`;RD!@\8!9CEU6`^'?/[__XM$)'CV0`8!=%>+3"1TBQ&+002)0@2)
+M$(E,)`2)/"3H_/___^L[BU0D>(M"&`^V0`0/ME4I#[9-(@^V72''1"04____
+M`(E$)!")5"0,B4PD"(E<)`3'!"2X!P``Z/S___^!Q(P```!;7E]=PU575E.#
+M[&R+C"2`````BY0DB````(E4)&"+A"2,````B40D9(L!B40D/`^WA"2$````
+MP>`"BUPD/`.#S`4``(LX9H%_).$!=3</MD<F@^@1/`%W+(MQ*(ET)$3'1"1`
+M``````M4)&1U;XM$)$3&0#4`QT0D0`````#K79"-="8`BUPD/(N3>`4``+C8
+M)@$`9H%_$(4`=Q8/MT<0BW0D/`^VA`:X!```:<`H`0```<*)5"1`QT0D1```
+M``"+1"1@"T0D9'43BT0D0,:`M`````#'1"1$`````(!_%(%U!(!A"/>+1"1@
+M"T0D9`^%X````,9'%`#V1V8@#X2H!0``BT=(A<`/A)T%``")P_9`90)T(8M(
+M6(7)=!J+5S2%TG03BT<@B40D"(E4)`2)#"3H_/___XM,)#R+D4`*``"!PD`(
+M``"+="1`#[9&0L'@"`'"BP*C`````(G"P>H0B%-3P>@89HE#2(N10`H``('"
+M1`@```^V1D+!X`@!PHL2B14`````#[;"9HE#3`^VQF:)0TZ)T,'H$`^VP&:)
+M0U#!ZAB(4U*+D4`*``"!PDP(```/MD9"P>`(`<*+`J,`````#[;`9HE#2NG<
+M!```C;8`````#[=''FG`L`0``(M4)#P#@F0*``")1"1(B<6!Q2`$``"`?Q2`
+M=0K&1Q0AC;8`````@WPD0`!T<HM<)$"#>R``#X7!````BW<@B70D6`^V0TV)
+M1"0TBT$8#[9(!(M4)#P/MEHI#[9R(@^V0B&)1"0$BT0D8(M4)&2)1"0<B50D
+M((M4)%B)5"08BT0D-(E$)!2)3"00B5PD#(ET)`C'!"08"```Z/S____K78-\
+M)$0`=%:+5R")5"1<BT$8#[9(!(MT)#P/MEXI#[9V(HM$)#P/MD`AB40D!(M$
+M)&"+5"1DB40D&(E4)!R+5"1<B50D%(E,)!")7"0,B70D",<$)%0(``#H_/__
+M_XM%#(M5"(M-!(M=``^W=QZ)1"04B50D$(E,)`R)7"0(B70D!,<$))`(``#H
+M_/___XM,)$CV02(!#X3$````C5\\B5PD3(MW5(ET)%2+0P0/ME,!B40D"(E4
+M)`3'!"0=`0``Z/S___^`?SP`#X0_`0``QD0D4P"-="8`#[9T)%.-!';!X`*+
+M5"1,BTH(`<&)PXM4)%0#6@B+0PB)1"0XBP.+4P2)1"0HB50D+(MI"(M9!(L)
+MBU0D.(E4)!R+1"0HBU0D+(E$)!2)5"08B6PD$(E,)`B)7"0,B70D!,<$),`(
+M``#H_/___X!$)%,!#[94)%.+3"1,.!$/AK,```#I>/___XM<)$B`>R<`#XF@
+M````#[=7'HG09L'H!0^WP`^WTHE$)`B)5"0$QP0D.0$``.C\____BW0D/(N&
+MW`4``(N6V`4``(N.U`4``(N>T`4``(E$)!")5"0,B4PD"(E<)`3'!"10`0``
+MZ/S___\/MT<>B40D!,<$)&P!``#H_/___XL6#[=''F;!Z`4/M\"-!(4``P``
+MB8)P`0``BQ8/MT\>@^$?N`$```#3X(F"=`$``&:!?R3A`74B#[9')H/H$3P!
+M=Q>+1"1$B00DZ/S____I_`$``(VV``````^V5"1C]L(!#X3"`0``BT<D)?__
+M_P`]X0$.``^$KP$``(M,)#R+D4`*``"!PD`(``"+7"1`#[9#0L'@"`'"BS*)
+M-0````"+D4`*``"!PD0(```/MD-"P>`(`<*+*HDM`````(N10`H``('"2`@`
+M``^V0T+!X`@!PHL:B1T`````BY%`"@``@<),"```BTPD0`^V04+!X`@!PHL"
+MHP````")1"00B5PD#(EL)`B)="0$QP0D?0$``.C\____]D=F(`^$S0```(M/
+M2,9!9A#&1Q0@B?#!Z!"(05.)\,'H&&:)04B)WL'F"(GH#[;0C0069HE!3(G>
+M9H'F`/^)Z`^VU(T$%F:)04Z)VL'J$,'B"(GHP>@0#[;``<)FB5%0BUPD/(N3
+M0`H``('"3`@``(MT)$`/MD9"P>`(`<*+`J,`````#[;`9HE!2@^W44P/MUE.
+M#[=)4`^WP(E4)!")7"0,B4PD"(E$)`3'!"2:`0``Z/S___^+1"0\BY!`"@``
+M@<)`"```#[9&0L'@"`'"QP(`````ZV-F@7\DX0%U'0^V1R:#Z!H\`7<2QP0D
+M^`@``.C\____QD<4(>L^B7PD!(M4)#R)%"3H_/___^LLC;8`````A-)Y(HM,
+M)#R+`8N(6`$``(D-`````(7)=`R+7"0\BP.)B%@!``"#Q&Q;7E]=PXGV4X/L
+M"(M<)!2+3"00#[9#)#E+&'5!/`AT5CPH=%(\J)!T33R(=$D\"G1%/"J-="8`
+M=#T\JG0Y/(IT-8N!Y````(E8!(D#C8'D````B4,$B9GD````ZQF+D>@```")
+MF>@```"-@>0```")`XE3!(D:B0PDZ/S___^#Q`A;PXUT)@"#[`R+1"04B40D
+M!(M$)!")!"3H_/___X/$#,.0C70F`%.#[%B+7"1@C40D2HE$)#2-1"1,B40D
+M,(U$)$2)1"0LC40D1HE$)"B-1"10B40D)(U$)%*)1"0@C40D4XE$)!R-1"1.
+MB40D&(U$)%2)1"04C40D2(E$)!"-1"15B40D#(U$)%:)1"0(C40D5XE$)`0/
+MMT,DB00DZ/S___\/MD0D5XE$)`@/MD0D5HE$)`2-1"1`B00DZ/S____'1"0,
+M`0````^V1"17:<`H`0``B40D"(M#$(E$)`2-@V`%``")!"3H_/___\=$)`P!
+M````#[9$)%5IP+````")1"0(BT,0B40D!(V#?`4``(D$).C\____QT0D#`$`
+M```/MD0D5FG`%`T``(E$)`B+0Q")1"0$C8.8!0``B00DZ/S____'1"0,`0``
+M``^W1"10P>`"B40D"(M#$(E$)`2-@[0%``")!"3H_/___\=$)`P!````#[=$
+M)$AKP'")1"0(BT,0B40D!(V#8`8``(D$).C\____QT0D#`$````/MD0D5`^W
+M5"1(#Z_"C01`P>`"B40D"(M#$(E$)`2-@Q`&``")!"3H_/___\=$)`P!````
+MQT0D"``"``"+0Q")1"0$C8,L!@``B00DZ/S___\/MD0D5XE$)`S'1"0(``@`
+M`(M#$(E$)`2-@P@'``")!"3H_/___\=$)`P!````#[9$)%.-!(#!X`*)1"0(
+MBT,0B40D!(V#F`8``(D$).C\____QT0D#`$```#'1"0(H````(M#$(E$)`2-
+M@[0&``")!"3H_/___\=$)`P!````#[9$)%)IP)@```")1"0(BT,0B40D!(V#
+MT`8``(D$).C\____QT0D#`$````/MT0D3HT$0,'@`XE$)`B+0Q")1"0$C8/L
+M!@``B00DZ/S____'1"0,`0````^W1"10`<")1"0(BT,0B40D!(V#(`D``(D$
+M).C\____QT0D#`$````/MD0D5P'`B40D"(M#$(E$)`2-@T@)``")!"3H_/__
+M_\=$)`P!````#[9$)%4!P(E$)`B+0Q")1"0$C8-P"0``B00DZ/S____'1"0,
+M`0````^V1"16`<")1"0(BT,0B40D!(V#F`D``(D$).C\____QT0D#`$````/
+MMD,F`<")1"0(BT,0B40D!(V#P`D``(D$).C\____QT0D#`$````/MT0D1L'@
+M!8E$)`B+0Q")1"0$C8-\!@``B00DZ/S____'1"0,`0```(M$)$")1"0(BT,0
+MB40D!(V#Z`D``(D$).C\____QT0D$`$```#'1"0,0`````^W1"10P>`&B40D
+M"(M#$(E$)`2-@P0*``")!"3H_/___\=$)!`!````QT0D#``!``#'1"0(`!D`
+M`(M#$(E$)`2-@R@*``")!"3H_/___\=$)!`!````QT0D#(`````/MT0D4&G`
+ML`0``(E$)`B+0Q")1"0$C8-,"@``B00DZ/S____'1"00`0```,=$)`P$````
+M#[=$)$S!X`*)1"0(BT,0B40D!(V#<`H``(D$).C\____QT0D$`$```#'1"0,
+M!`````^W1"1*P>`"B40D"(M#$(E$)`2-@Y0*``")!"3H_/___\=$)!`!````
+MQT0D#`@````/MD0D4\'@"XE$)`B+0Q")1"0$C8.X"@``B00DZ/S____'1"00
+M`0```,=$)`P(````QT0D"```"`"+0Q")1"0$C8/<"@``B00DZ/S____'1"00
+M`0```,=$)`P(````#[=$)$YIP(P!``")1"0(BT,0B40D!('#``L``(D<).C\
+M____N`````"#Q%A;PXUV`(/L+(E<)!R)="0@B7PD)(EL)"B+;"0PBT4`B40D
+M%(U=+(D<).C\____B<:-4.")5"08BT0D%(D$).C\____B<>+13")=3"+5"08
+MB5H@B4(DB3"X`0```(7_#X2`````QD<DX<9')0'&1R80@$\G`8M4)#2+@IP`
+M``")1TB+1TR)4!R)T`60````B4<XQD<5S(M4)!@/MD(S9HE'$(M%`(E'&,='
+M()````"+1"0TB4<TQT=L$!P!`,=$)`0`````C4<\B00DZ/S___^)?"0$BU0D
+M%(D4).C\____N`````"+7"0<BW0D((M\)"2+;"0H@\0LPXVV`````(V\)P``
+M``!55U93@^P<BW0D,,=$)!@`````BU0D&`^VA#(^!0``//\/A,P````/MM!K
+MPER-C`9(`0``B4PD%("\!E(!````#X2M````OP````")1"00C:P&@`$``(V$
+M!D`!``")1"0,B2PDZ/S___^)PXM$)!`!\(N0A`$``(F8A`$``(DKB5,$B1J+
+M0R"%P'0>B40D"(N&1`4``(E$)`3'!"0%````Z/S___^`2R@"B5PD",=$)`0"
+M````BT0D%(D$).C\____@'M/`'0:B30DZ/S____'!"0!````Z/S___^`>T\`
+M=>:#QP&)^HM,)`PX41(/AV[___^#1"08`8-\)!@$#X40____B30DZ/S___^#
+MQ!Q;7E]=PXVV`````(V\)P````!55U93@^Q\BX0DD````,9`-0#&0#0`QD`S
+M`,:`N0P```")PH'"F`L``+@`````B?;&!!``@\`!/1`!``!U\HN$))`````%
+MY````(N4))````")@N0```")@N@```")T`7L````B8+L````B8+P````@<+T
+M````B50D1(N,))````")D?0```")D?@```")SX''_````(FY_````(FY``$`
+M`('!!`$``(E,)$R+G"20````B8L$`0``B8L(`0``@<,,`0``B5PD4(NT))``
+M``")G@P!``")GA`!``")]8'%'`$``(FN'`$``(FN(`$``('&)`$``(ET)$B+
+MA"20````B;`D`0``B;`H`0``!10!``")1"14BY0DD````(F"%`$``(F"&`$`
+M`(U$)':)1"0TC40D>(E$)#"-1"1HB40D+(U$)&Z)1"0HC40D>HE$)"2-1"1P
+MB40D((U$)'&)1"0<C40D;(E$)!B-1"1SB40D%(U$)&J)1"00C40D<HE$)`R-
+M1"1TB40D"(U$)'6)1"0$#[=")(D$).C\____#[9$)'6+C"20````B$$N#[9$
+M)'2(02\/MD0D<HB!X0````^W1"1Z9HE!6`^W1"1X9HF!E`L```^W1"1V@^@!
+M9HF!E@L```^W1"1J9HE!-@^W021F/8"1=`IF/8"4#X7A"@``BYPDD````,9#
+M,03&0RL$QD,R0,9#,`#&@]X````)QD,L`(G8!6`%``")!"3H_/___XG"B8-X
+M!0``#[9$)'5IP"@!``"%P'0+Q@(`@\(!@^@!=?6+A"20````!7P%``")!"3H
+M_/___XG"B[0DD````(F&E`4```^V1"1R:<"P````A<!T"\8"`(/"`8/H`77U
+MBX0DD`````68!0``B00DZ/S___^)PHN$))````")D+`%```/MD0D=&G`%`T`
+M`(7`=`O&`@"#P@&#Z`%U]8N$))`````%M`4``(D$).C\____B<*+C"20````
+MB8',!0``#[=$)'K!X`*%P'0+Q@(`@\(!@^@!=?6+A"20````!2P&``")!"3H
+M_/___XN<))````")@T0&``")V`40!@``B00DZ/S___^)PXNT))````")AB@&
+M``")\`5@!@``B00DZ/S___^)PHF&>`8``&:#?"1J`'1&N0````")6D0/MD0D
+M<XA"/(NT))````"+AO@```")EO@```"+="1$B3*)0@2)$`^V1"1SC01`C1R#
+M@\)P@\$!9CE,)&IWOXN$))`````%?`8``(D$).C\____B<*+A"20````B9"4
+M!@``9H-\)&X`=#"Y`````,9""`"+G"20````BX,``0``B9,``0``B3J)0@2)
+M$(/"((/!`68Y3"1N=]6+A"20````!9@&``")!"3H_/___XG"B[0DD````(F&
+ML`8``(!\)'$`=#.Y`````(N<))````"+@P@!``")DP@!``"+="1,B3*)0@2)
+M$(/"%(/!`0^V1"1Q9CG(=]*+A"20````!;0&``")!"3H_/___XG"BX0DD```
+M`(F0S`8``(V*H````(N<))````"+@Q`!``")DQ`!``"+="10B3*)0@2)$(/"
+M%#G*==N)V`70!@``B00DZ/S___^)PHF#Z`8``(!\)'``=#*Y`````(N<))``
+M``"+@R`!``")DR`!``")*HE"!(D0@<*8````@\$!#[9$)'!F.<AWTXN$))``
+M```%[`8``(D$).C\____B<*+M"20````B88$!P``9H-\)&P`=#"Y`````(N<
+M))````"+@Q@!``")DQ@!``"+="14B3*)0@2)$(/"&(/!`68Y3"1L=]6`?"1U
+M`'1/NP````"+M"20````@<8(!P``B30DZ/S___\/M].+C"20````B821(`<`
+M`(N1*`$``(F!*`$``(M,)$B)"(E0!(D"@\,!#[9$)'5F.=AWPXN$))`````%
+M(`D``(D$).C\____BYPDD````(F#.`D``(F#/`D```^W1"1Z9HF#0@D```^W
+MP(E$)`2)V`4\"0``B00DZ/S___^)V`5("0``B00DZ/S___^)@V`)``")@V0)
+M```/MD0D=6:)@VH)```/M\")1"0$B=@%9`D``(D$).C\____B=@%<`D``(D$
+M).C\____B8.("0``B8.,"0``#[9$)')FB8.2"0``#[?`B40D!(G8!8P)``")
+M!"3H_/___XG8!9@)``")!"3H_/___XF#L`D``(F#M`D```^V1"1T9HF#N@D`
+M``^WP(E$)`2)V`6T"0``B00DZ/S___^)V`7`"0``B00DZ/S___^)@]@)``")
+M@]P)```/MD,F9HF#X@D```^V0R:)1"0$B=@%W`D``(D$).C\____B=@%Z`D`
+M`(D$).C\____B<*)@P`*```/MD0D=&G`=`0``(G!@<%T10``=`^)T(G*Q@``
+M@\`!@^H!=?6+M"20````BX8`"@``B0B+E@`*```/MD0D=(A"!`^V1"1TB40D
+M"(E,)`2+A@`*``")!"3H_/___[T`````@'XF``^$IP```+\`````#[??:]M<
+MBX0DD````(VL&$@!``"-!`.-L$`!``")^HA6#,9&#0"+C"20````B8A(`0``
+MQD82`,:`?`$```#&@&0!````QX"@`0```````(V4&6`!``"-2@B)B&@!``")
+MB&P!``"#PA2)D'0!``")D'@!``"+C"20````C909@`$``(F0@`$``(F0A`$`
+M`,9&#@*#QP$/MD$F9CGX#X=>____BYPDD````,9#,`#&@SX%``#_QH,_!0``
+M_\:#0`4``/_&@T$%``#_@'PD=0`/A(,```"[``````^WRVG1*`$``(NT))``
+M``"+AG@%``#&1!`G`8N&>`4``,9$`B8`BX9X!0``QD0"3/^+AG@%``#&1`)"
+M_XN&>`4``&;'A`*4``````#'A(ZX`@```````(G1`XYX!0``C4$0B4$0`Y9X
+M!0``C4(0B4(4@\,!#[9$)'5F.=AW@HN$))````!FQX#<``````"X`````(N4
+M))````#&A!"X!```_X/``3V&````=>>`?"1T``^$K0```+L`````#[?#:<`4
+M#0``BXPDD````(N1L`4``,9$`C``BY&P!0``QD00,0"+D;`%``#'1!`,````
+M`(G!B[0DD`````..L`4``(U1$(E1$(G!`XZP!0``C5$0B5$4B<$#CK`%``"-
+M41B)41B)P0..L`4``(U1&(E1'(N6L`4``(EL$`B)P0..L`4``(U1*(E1*`.&
+ML`4``(U0*(E0+(/#`0^V1"1T9CG8#X=8____BX0DD````,:`WP```("`?"1R
+M`'1]NP`````/M]-ITK````"+C"20````BX&4!0``9L=$$#($`(N!E`4``,9$
+M`B8`BX&4!0``QD0"*/^+@90%``#&1`(T_XG1B[0DD`````..E`4``(U!%(E!
+M%(G1`XZ4!0``C4$4B4$8BX:4!0``B6P"5(/#`0^V1"1R9CG8=XB+A"20````
+MQH#@````@HN$))`````%(`H``(E$)`2+A"20````!00*``")!"3H_/___XN4
+M))````")@AP*``")T`5$"@``B40D!(U`Y(D$).C\____BXPDD````(F!0`H`
+M`(G(!6@*``")1"0$C4#DB00DZ/S___^+G"20````B8-D"@``B=@%C`H``(E$
+M)`2-0.2)!"3H_/___XF#B`H``(G8!;`*``")1"0$C4#DB00DZ/S___^)@ZP*
+M``")V`74"@``B40D!(U`Y(D$).C\____B<&)@]`*``"+M"20````BX;4"@``
+MBY;8"@``@'PD<0!T6HG#B=:_`````(G-*<6+1"1,B00DZ/S___^-5!T`B5`(
+MB5@,B7`0BXPDD````(N1"`$``(F!"`$``(M,)$R)"(E0!(D"@<,`"```@]8`
+M@\<!#[9$)'%F.?AWLXN$))`````%^`H``(E$)`2+A"20````!=P*``")!"3H
+M_/___XE$)%B+G"20````B8/T"@``BX0DD````(N8^`H``(NP_`H``+\`````
+MO0````"+5"10B10DZ/S___^+5"18`?J)4`B)6`R)<!"+C"20````BY$0`0``
+MB8$0`0``BTPD4(D(B5`$B0*!PP```0"#U@"!QP```0"#U0")^#4```@`">AU
+MJHN$))`````%'`L``(E$)`2+A"20````!0`+``")!"3H_/___XG!BYPDD```
+M`(F#&`L``(NT))````"+AAP+``"+EB`+``!F@WPD;`!T5XG#B=:_`````(G-
+M*<6+1"14B00DZ/S___^-5!T`B5`(B5@,B7`0BXPDD````(N1&`$``(F!&`$`
+M`(M,)%2)"(E0!(D"@<.,`0``@]8`@\<!9CE\)&QWMH/$?%M>7UW#D(VT)@``
+M``!55U93@^P,BVPD((M\)"2+7U0/MD<KB40D"(EL)`2)'"3H_/___XG&9H-/
+M,A"`?2L`=$FY`````/9#"0%T#.L\#[9#"=/XJ`%U#(/!`0^V12MF.<AWZF:#
+M^0-V)8M%``70`0``#[?1C120BP*C`````,'H%(/P`8/@`>LCN0````"+10`%
+MT`$```^WT8T4D(L"HP````#!Z!2#\`&#X`&$P'04#[;!B40D!(DL).C\____
+MZ88!``"-0S@Y0S@/A!$!``"%]@^$"0$```^V1DW'1(<\`````(L6BT8$B4($
+MB1")="0(QT0D!`8```")'"3H_/___X!^3P!T'Y"-="8`B2PDZ/S____'!"0!
+M````Z/S___^`?D\`=>:+1B"%P'16QT!@`````/9&*`1U"(DL).C\____BT8@
+MBY5$!0``B40D"(E4)`3'!"0!````Z/S___^+1B"+E40%``")1"0(B50D!,<$
+M)`8```#H_/___\=&(`````"`:PH!B70D!(DL).C\____BT4`BY!8`0``B14`
+M````A=)T"8M%`(F06`$``,9')@!F@V<R[X!_'P!T(KH`````#[?"BT2'/(7`
+M=`:`>";_=76#P@$/MD<?9CG0=^.`?S(`>`V^`````(!_'P!U$.M,B7PD!(DL
+M).C\____ZT@/M\:+7(<\A=MT)_9#*`)T(8M#((N51`4``(E$)`B)5"0$QP0D
+M!@```.C\____@&,H_8/&`0^V1Q]F.?!WPF;'1S("`(!G+?V#Q`Q;7E]=PXUT
+M)@"-O"<`````55=64X'LG````(N$)+````")1"1TBU`LB50D?(LZBX>L"@``
+MBP")A"2`````BTPD=(E,)`2)/"3H_/___XML)'2`O;<````!=@?&A;0````$
+MBT0D=(/`$,=$)'@`````BU0D=#E"$'0JBUPD=(/#$(D<).C\____B40D>(M,
+M)'2+01"+;"1XB6@$B44`B5T$B6D0BT0D=(-X(`!U5[W___\`@WPD>`!T"(M4
+M)'@/MVH>BTPD=`^V<4V+5"1\BT(8#[9`!`^V5RD/MD\B#[9?(8EL)!B)="04
+MB40D$(E4)`R)3"0(B5PD!,<$)!P)``#H_/___X-\)'@`#X1C!```BTPD>`^W
+M21Z)3"14:?&P!````[=D"@``BY\<"@``BVPD>(DL).C\____BX8L!```B40D
+M0(N6*`0``(N.)`0``(NV(`0``(M$)'@/MV@>BT0D0(E$)!2)5"00B4PD#(ET
+M)`B);"0$QP0DZ`<``.C\____BT0D5,'@!@'#BU,TB50D0(M3,(M++(MS*(MK
+M)(EL)%B+0R")1"1<BVL<B6PD8(M#&(E$)&2+:Q2);"1HBT,0B40D;(MK#(M#
+M"(F$))0```"+0P2)A"20````BQN+1"1`B40D.(E4)#2)3"0PB70D+(M4)%B)
+M5"0HBTPD7(E,)"2+1"1@B40D((M4)&2)5"0<BTPD:(E,)!B+1"1LB40D%(EL
+M)!"+E"24````B50D#(N,))````")3"0(B5PD!,<$)&`'``#H_/___XML)'B#
+MQ3R)K"2$````BT0D>(M`5(F$)(P```"+100/ME4!B40D"(E4)`3'!"0=`0``
+MZ/S___^`?0$`#X2>````QH0DBP`````/MK0DBP```(T$=L'@`HN4)(0```"+
+M2@@!P8G#BZPDC`````-="(M#"(E$)'"+`XM3!(E$)$")5"1$BVD(BUD$BPF+
+M5"1PB50D'(M$)$"+5"1$B40D%(E4)!B);"00B4PD"(E<)`R)="0$QP0DP`@`
+M`.C\____@(0DBP````$/MI0DBP```(N,)(0````X40$/AVK___]F@W]8``^$
+M"`(``+X`````C:\\"0``C8?D````B40D4(VV``````^WQL'@`@.'S`4``(L8
+MA=L/A,H!```/MT,0BU0D=&8Y0AP/A;@!```/MY>2"P``.90D@````'1A@\(!
+M#[>'E@L``#G"&<`APHN'K`H``(/`!(L$D*D```@`=35F)?\/9CGP=2PY7"1X
+M=2^)/"3H_/___XM,)'@/MT$>B40D!,<$)%0)``#H_/___^F3`0``D#N4)(``
+M``!UGXM$)'R`>#0`#X4Y`0``#[=#$&8]A0`/ARL!```/M\"`O`>X!```_P^$
+M&@$``(.\)+``````#X3Q````BU0D=`^V0B2#X`6#^`4/A=T```"+%P^W0QYF
+MP>@%#[?`C02%``,``(F"<`$```^W2QZ#X1^Z`0```(G0T^")P8L'B8AT`0``
+M#[=#'L'@`@.'S`4``,<```````^W2QZ)R&;!Z`4/M\")1"1,@^$?B=#3X(G!
+M]]&+1"1,(8R'T`4```^W2QZ)R&;!Z`4/M\"#X1_3XO?2(52'7#M<)'AT-XL3
+MBT,$B4($B1"#>U0`=`^-0U2)1"0$B3PDZ/S___^+A^0```")6`2)`XM4)%")
+M4P2)G^0````/MT,>B40D!(DL).C\____BTPD=(!I3P'K&XM$)'SV0`8"=!&)
+M7"0$BU0D=(D4).C\____D(/&`68Y=U@/AQ/^__^#O"2P`````'0KBTPD=`^V
+M022#X`6#^`5U&XML)'B+50"+102)0@2)$(EL)`2)#"3H_/___X'$G````%M>
+M7UW#D)"055=64X/L#(M\)"`/MG0D)`^V1"0LB$0D"XM'+(L(N@`````/MEPD
+M*`'SB%PD`XGV#[:$"K@$```\_W1&#[;`:<`H`0``B40D!`.!>`4``(GS.)C:
+M````=2DYN.0```!U(0^V7"0#B)C9````BX%X!0``#[9<)`N+;"0$B)P%V```
+M`(/"`8'Z@````'6C@\0,6UY?7<.-="8`C;PG`````(/L"(D<)(ET)`2+="08
+M#[9<)!`/ME0D%(M$)`R+2#`/MH&0````/$]W*0^VP(T$@`':B)3!E0````^V
+M@9````"-!(")\HB4P90```"`@9`````!BQPDBW0D!(/$",.)]E=64XM\)!`/
+MMT0D%+O_____9H7`=$&[_____[D`````@^@!#[?P#[84.8U"T#P)=Q>`^_\/
+ME,"#Z`$APP^VPXT$@(U<0M#K!8#[_W4*@\$!C48!.<%USP^VPUM>7\.)]E57
+M5E.+;"04#[9T)!@/MGPD'(M%+(L(N@````"-="8`#[:$"K@$```\_W0K#[;`
+M:<`H`0```X%X!0``.:CD````=12)\SB8V0```'4*B?J(D-L```#K"X/"`8'Z
+M@````'6^6UY?7<.)]HV\)P````!55U93@^P$BW0D&`^V?"0<#[9$)"2(1"0#
+MBT8LBQB+;C"Y``````^VA!FX!```//]T1@^VP&G`*`$``(G"`Y-X!0``.;+D
+M````=2V)^#B"V0```'4C@'PD`P!T#HN"X````(M4)"")`NL9BTPD((L!B8+@
+M````ZPN#P0&!^8````!UHXGJN0````"-M@`````/MH*4````/`%V.3P7=#6)
+M^#B"E0```'4K@'PD`P!T$HT$B8N$Q9@```"+5"0@B0+K'8T4B8M,)""+`8F$
+MU9@```#K"X/!`8/"*(/Y4'6Q@\0$6UY?7<.)]HV\)P````!55U93@^P@#[9L
+M)#B+1"0TB[#H````#[9&`L'@"`^V5@.-/!`/M\>#P`0]``@```^/[0```(GJ
+MA-)T3HM,)#0/MI'<````B=.#X^`/MD8!@^`/B=&#X1`)V`G(B=.#XPB#X/.)
+MT8/A!`G8"<B#X@*#X/R+7"0T#[:+W````(/A`0G0"<B(1@'K3`^V5@&)TX/C
+MX(M,)#0/MH'<````@^`/B=&#X1`)V`G(B=.#XPB#X/.)T8/A!`G8"<B#X@*#
+MX/P/MDX!@^$!"=`)R(M<)#2(@]P```"-5@@/M\>-?`8$.==V/XE4)!R[````
+M`(GH#[;PC6PD'(ET)`R);"0(#[;#B40D!(M4)#2)%"3H_/___XM$)!R#P`2)
+M1"0<@\,!.?ARTX/$(%M>7UW#C;8`````4X/L&(M,)"2+630/MD,"P>`(#[93
+M`P'0#[?`C5`$#[=!(#G"?RZ+3"0@BX'H````B50D"(E<)`2)!"3H_/___\=$
+M)`0`````BT0D((D$).C\____@\086\.-M"8`````55=64X/L'`^V?"0XBT0D
+M,(M8,(E<)!B^`````(ML)#2#Q00/MH.4````/`%V0CP7=#Z)^#B#E0```'4T
+MC02VBTPD&(V4P9P```"+3"0T#[9!`SP@=@6X(`````^VP(E$)`B);"0$B10D
+MZ/S___^)]H/&`8/#*(/^4'6H@\0<6UY?7<.-M@````"-O"<`````@^PLB5PD
+M'(ET)"")?"0DB6PD*(M<)#`/MD0D-(A$)!>+0RR+*(DL).C\____B<:%P`^$
+M!P$``(DL).C\____B<>%P'41B70D!(DL).C\____Z>@```"-5CR)5"08BU`(
+MBX/H````BTPD/(E,)`B)1"0$B10DZ/S____&1F@*QD85K`^W0QQFB480BT0D
+M0(E&2(EN&(M4)#R)5B"#3F02BT<(B48TB7Y0C8.X````B48XQD8<(,=&;```
+M``#&1B0[QD8E`@^V3"07B$XFBT0D.,'H$(A&)XM4)#@/ML:(1BB(5BD/MD8B
+MB$8J#[9&(8A&*P^V3"0\B$XLQD8M`,=$)`0`````BT0D&(D$).C\____BT8@
+MB40D#(M'#(M7$(E$)`2)5"0(BU0D&(D4).C\____B70D!(DL).C\____BUPD
+M'(MT)""+?"0DBVPD*(/$+,.-M"8`````C;PG`````(/L+(E<)!R)="0@B7PD
+M)(EL)"B+7"0P#[9$)#2(1"07BT,LBRB)+"3H_/___XG&A<`/A.T```")+"3H
+M_/___XG'A<!U$8ET)`2)+"3H_/___^G.````C58\B50D&,9&:`K&1A6L#[=#
+M'&:)1A"+1"1`B49(B6X8QT9D"````(E^4(M'"(E&-(M4)#R)5B"-@[@```")
+M1CC&1AP@QT9L`````,9&)#S&1B4"#[9$)!>(1B:+1"0XP>@0B$8GBU0D.`^V
+MQHA&*(A6*0^V1B*(1BH/MD8AB$8K#[9$)#R(1BS&1BT`QT0D!`````"+5"08
+MB10DZ/S___^+1B")1"0,BT<,BU<0B40D!(E4)`B+1"08B00DZ/S___^)="0$
+MB2PDZ/S___^+7"0<BW0D((M\)"2+;"0H@\0LPY"-M"8`````@^PLB5PD'(ET
+M)"")?"0DB6PD*(ML)#"+12R+`(E$)!2+E>@````/MD("P>`(#[92`P'0#[?`
+MC5@$@?L`"```#X_O````BT0D%(D$).C\____B<:%P`^$V0```(M$)!2)!"3H
+M_/___XG'A<!U%8ET)`2+1"04B00DZ/S____IL@```(U&/(E$)!B+5PB+A>@`
+M``")7"0(B40D!(D4).C\____QD85K`^W11QFB480BT0D%(E&&(E>((-.9!*+
+M1PB)1C2)?E"-A;@```")1CC&1AP@QT9L`````,9&)!W&1B40QD8F`@^V1B&(
+M1B>(7BC'1"0$`````(M$)!B)!"3H_/___XM&((E$)`R+1PR+5Q")1"0$B50D
+M"(M$)!B)!"3H_/___XET)`2+1"04B00DZ/S___^+7"0<BW0D((M\)"2+;"0H
+M@\0LPY"-M"8`````@^PLB5PD)(ET)"B+7"0P#[94)#0/MG0D.,=$)"``````
+M@'LG`71*QT0D#`$```"-1"0@B40D"`^VPHE$)`2)'"3H_/___XM$)""%P'0C
+M@`B`B?"$P'0*BT0D((!(`R#K"(M$)""`8`/?B1PDZ/S___^+7"0DBW0D*(/$
+M+,.-=@"#["R)7"0<B70D((E\)"2);"0HBUPD,`^V1"0TB$0D%XM#+(LHB2PD
+MZ/S___^)QH7`#X2Y````B2PDZ/S___^)QX7`=1&)="0$B2PDZ/S____IF@``
+M`(U&/(E$)!C&1A6L#[=#'&:)1A");AC'1F0(````B7Y0BT<(B48TQT8@``@`
+M`(V#N````(E&.,9&'"#'1FP`````QD8D',9&)0$/MD0D%XA&)L9&)PC&1B@`
+MQT0D!`````"+1"08B00DZ/S___^+1B")1"0,BT<,BU<0B40D!(E4)`B+1"08
+MB00DZ/S___^)="0$B2PDZ/S___^+7"0<BW0D((M\)"2+;"0H@\0LPXVV````
+M`(V_`````%575E.#[!R+3"0TBUDT#[9#`L'@"`^V4P,!T`^W\(U6!`^W02`Y
+MP@^/@P$``(U["(UL,P2)?"00QD0D%P#'1"08`````#GO#X/U````C78`#[9$
+M)!B(1"06#[9'`L'@"`^V5P,!T&:)1"04#[?PB70D!(M$)!"#P`2)!"3H_/__
+M_SS_=6N+1"00C50P!(G3.=4/AOH```#&1"07_XUT)@`/MD("P>`(#[92`XTT
+M$`^WQHE$)`2-0P2)!"3H_/___SS_=1&`?"07_P^%C@```)#I@P```#A$)!=V
+M!(A$)!</M\:-5`,$B=,YU79QZ[*)]BI$)!</ML")1"0(#[9<)!:)7"0$BU0D
+M,(D4).C\____B5PD"(E\)`2+1"0PB00DZ/S___\/MT0D%(M4)!"-?`($B7PD
+M$(-$)!@!.?T/AP[____'1"0$`@```(M$)#")!"3H_/___^M8QD0D%P`/MD0D
+M%HE$)`B)?"0$BU0D,(D4).C\____#[=$)!2+5"00C7P"!(E\)!"#1"08`>F_
+M_O__#[9$)!:)1"0(B7PD!(M$)#")!"3H_/___^N6C70F`(/$'%M>7UW#D(VT
+M)@````!55U93@^P<BTPD-(M9-`^V0P+!X`@/ME,#`=`/M\"#P`0/MU$@.=`/
+MCQX!``"-<P@/MEL!N0````"Z`````(GV`DX"#[9&`XUT!@2#P@$XTW/NA,D/
+MA-,```#&1"0;`+\`````C4'_#[;`@\`!B40D%`^V5+X!`%0D&P^V!+X\`70$
+M/!=U2@^V7"0;*-,X7"0;#X:)````C4<!#[;HC78`#[8$OHE$)`R);"0(#[;#
+MB40D!(M$)#")!"3H_/___X/#`3I<)!MT6.O6C;8`````BTPD,(M!,("XD0``
+M``%T0`^V7"0;*-,X7"0;=C.-1P$/MN@/M@2^B40D#(EL)`@/ML.)1"0$BT0D
+M,(D$).C\____@\,!.EPD&W78D(UT)@"#QP$[?"04#X5$____BU0D,(M",,:`
+MD0````''1"0$!P```(D4).C\____@\0<6UY?7<.-M@````"-O"<`````@^PL
+MB5PD'(ET)"")?"0DB6PD*(M<)#"%VP^$S````(M#+(LHB2PDZ/S___^)QH7`
+M#X2U````B2PDZ/S___^)QX7`=1&)="0$B2PDZ/S____IE@```(U&/(E$)!C&
+M1A6L#[=#'&:)1A");AC'1F0(````B7Y0BT<(B48TQT8@``@``(V#N````(E&
+M.,9&'"#'1FP`````QD8D',9&)0'&1B8"QD8G",9&*`#'1"0$`````(M$)!B)
+M!"3H_/___XM&((E$)`R+1PR+5Q")1"0$B50D"(M$)!B)!"3H_/___XET)`2)
+M+"3H_/___XM<)!R+="0@BWPD)(ML)"B#Q"S#D(/L'(E<)!")="04B7PD&(M\
+M)"2+="0@BU](#[=7$&:!^H4`#X>'````#[?"#[:,!K@$``"`^?]T=V:#^G]W
+M&0^VP8N6>`4``&G`*`$``(M$$"P/MD`$ZSAF@?J!`'<9#[;!BY:P!0``:<`4
+M#0``BT00"`^V0`3K&`^VP8N6E`4``&G`L````(M$$%0/MD`$D#S_=!P/ML"`
+MO`8^!0``_W0/@/G_=`H/MD<4/`9U,HGV@W]0`'0/C4=0B40D!(DT).C\____
+MB7PD!(DT).C\____QT,L_____XD<)/]3*.MQA,!U.O9'9`AT&8M+'(M7-(M'
+M((E$)`B)5"0$B0PDZ/S____'0RP`````BU,@A=)T!8M#%(D"B1PD_U,HZQ+'
+M0RS_____B1PD_U,HD(UT)@"#?U``=`^-1U")1"0$B30DZ/S___^)?"0$B30D
+MZ/S___^+7"00BW0D%(M\)!B#Q!S#ZPV0D)"0D)"0D)"0D)"0@^P<B5PD#(ET
+M)!")?"04B6PD&(M<)"2+?"0@#[9K%`^W0Q!F/84`=QF+EW@%```/M\`/MH0'
+MN`0``&G`*`$``.L+BY=X!0``N-@F`0"--`*)Z(3`=2%FQX:4``````"`>R0<
+M=1*`>R8"=0R)7"0$B30DZ/S___^#>U``=`^-0U")1"0$B3PDZ/S___^)7"0$
+MB3PDZ/S___^)Z#P&=#Z-G@0!``")7"0$BT<4B00DZ/S____'A@0!``"`A!X`
+MQX8,`0```````(FV$`$``(E<)`2+1Q2)!"3H_/___XM<)`R+="00BWPD%(ML
+M)!B#Q!S#55=64X/L'`^V1"0XB$0D&XM4)#"+0BR+,+\`````BVPD-(/%#`^V
+MA#>X!```//]T40^VP&G8*`$``,=$)`@(````B6PD!(G8`X9X!0``!:````")
+M!"3H_/___X3`=".+AG@%```/ME0D&XB4`]H```"+AG@%``"+5"0PB90#Y```
+M`(/'`8'_@````'68@\0<6UY?7<.-="8`C;PG`````%575E.#[!R+3"0TBW$T
+M#[9&`L'@"`^V5@,!T`^W^(U7!`^W02`YP@^/]0```(U>"(UT/@2)="04B=TY
+MW@^&S````,=$)!@`````C;8`````#[9,)!@/MA.$T@^(E0```(G0@^`//`8/
+MA8@```#V0P/`=`KV0P7`#X5X````]L(0=#6`>P0`=&V-=0B_``````^V0P.)
+M1"0(B70D!(M$)#")!"3H_/___X/&'(/'`8GX.$,$=D#KV8![`@!T.(UU!+\`
+M````#[;)B4PD$(UT)@"+1"00B40D"(ET)`2+1"0PB00DZ/S___^#QAR#QP&)
+M^#A#`G?;#[9#`8U<!0*)W8-$)!@!.UPD%`^"0O___\=$)`0!````BT0D,(D$
+M).C\____@\0<6UY?7<.-M@````!55U93@^PLBT0D0(E$)""+5"1$#[92%(A4
+M)"N+3"1$#[=1$&:!^H4`#X>Y`P``#[?"BUPD(`^VC`.X!```N/\```"`^?]T
+M8F:#^G]W'0^VP8M<)""+DW@%``!IP"@!``"+1!`L#[9`!.L_9H'Z@0!W'0^V
+MP8M<)""+D[`%``!IP!0-``"+1!`(#[9`!.L;#[;!BUPD((N3E`4``&G`L```
+M`(M$$%0/MD`$BU0D(`^VA`(^!0``B40D'&O`7(V$`D@!``")1"0DBY)X!0``
+M#[;!:<`H`0``C30"@'PD*P`/A9("``!FQX:4``````"+1"1$@'@D'`^%>P(`
+M``^V0"8\`G1:/`)W"SP!#X5G`@``D.LA/`=T,CP*#X58`@``BTPD1(E,)`2)
+M-"3H_/___^E#`@``BUPD1(E<)`2)-"3H_/___^DN`@``BT0D1(E$)`2)-"3H
+M_/___^D9`@``BU0D1(E4)`2)-"3H_/___XV>!`$``(E<)`2+1BR+`(M`%(D$
+M).C\____QX8$`0``@(0>`,>&#`$```````")MA`!``")7"0$BT8LBP"+0!2)
+M!"3H_/___\9&)O]K1"0<7(M,)""`O`%2`0````^$>@$``+\`````B<.-K`&`
+M`0``B?:)+"3H_/___XG&BU0D((T$$XN0A`$``(FPA`$``(DNB58$B3*`?B;_
+M#X2B````@'XE``^%GP```(GS@+ZU``````^$3P$```^V3B0/MM&)T(/@!H/X
+M!G4I]L(!="2)="0,#[9&38E$)`B+1C")1"0$BTPD)(D,).C\____Z14!``"#
+M^`1U(?;!`8VT)@````!T%8E<)`2+7"0@B1PDZ/S____I[P```(/X!@^%Y@``
+M`/;!`0^%W0```(E<)`2+1"0@B00DZ/S____IR````(GVQH:U`````(/'`8M,
+M)""-E!E``0``#[9"$HGY.,@/APW___\XP75SA,!T;[\`````:UPD'%R+1"0@
+MC:P8@`$``(DL).C\____B<:+5"0@C003BY"$`0``B;"$`0``B2Z)5@2),H!^
+M)O]T'@^V1B4\(G0$/`UU$L=$)`0*````B30DZ/S____K/H/'`8GYBT0D(#B,
+M&%(!``!WIFM$)!Q<BU0D(,:$`DT!``#_BTPD)(E,)`2)%"3H_/___X!\)"L`
+M#X6B````BUPD1(-[4`!T%8G8@\!0B40D!(M$)"")!"3H_/___XM4)$2)5"0$
+MBTPD((D,).C\____@'PD*P!T:`^WAI0```"#P`%FB8:4````9H/X"G8.9L>&
+ME```````Z>#]___'1"0$"@```(DT).C\____ZS&+7"0@#[:;/08``(E<)!QK
+MPUR+5"0@C80"2`$``(E$)"2+DG@%``"XV"8!`.F^_/__@\0L6UY?7<.#[`B)
+M'"2)="0$BUPD#(MT)!"+5"04BTPD'(7;=$2%]G1`A=)T/(-\)!@`=#5F@?F%
+M`'<N#[?!@+P#N`0``/]T(<9").'&0B4!QD(F$V:)2A")<AB+1"08B4)LN`$`
+M``#K!;@`````BQPDBW0D!(/$",.-M"8`````C;PG`````(!\)`@!&<#WT"4`
+M``R`BU0D!(M2!(E"#,.0D)"0D)"05E.+7"00BTPD,(MT)#@/MT0D#&8](B=W
+M268]("=S>68]0"%T<V8]0"%W&68]("&0=&9F/2(A=&!F/5`'C70F`'5@ZU1F
+M/40A=$YF/40AB?9R4&8M$"=F@_@!=T:-="8`ZS9F/8(G=#!F/8(GC70F`'<2
+M9CTD)W0@9CV`)XUT)@!U(.L49CV`D70.9CV`E(GV=`9F/8!R=0K&`T"+1"04
+MQ@`"BT0D&,8`!`^V$XM$)"R($&;'`8``9L<&``"+1"0@Q@`@BT0D)&;'```!
+M#[83BT0D*(@0#[8#9@,!9@,&BU0D-&:)`HM4)!QFB0(/MQ&+1"0\9HD0#[<1
+M@\(+BT0D0&:)$%M>PXUV`(V\)P````!55U93@^P$BWPD&`^V1"0<B$0D`P^W
+M;UAFA>T/A-X```"+C\P%``"^`````(UT)@"+`87`#X2V````#[=0$+O_````
+MN/____]F@?J%`'=T#[?"#[:<![@$``"X_____X#[_W1<9H/Z?W<9#[;#BY=X
+M!0``:<`H`0``BT00+`^V0`3K/6:!^H$`=QD/ML.+E[`%``!IP!0-``"+1!`(
+M#[9`!.L=#[;#BY>4!0``:<"P````BT005`^V0`2-M@`````/MMN+EW@%```Z
+M1"0#=2$/M\-IP"@!```/MD00)(/@!8/X!74+L`'K&XVT)@````"#Q@&#P01F
+M.>X/A3'___^X`````(/$!%M>7UW#C70F`%575E.#[`B+5"0<BT(LBRB+A1P*
+M``")1"0$#[=]6+D`````O@````#K28VV``````^WV8N%S`4``(L4F(72=#"+
+M0B0E____`#WA`1``="&+1"0<#[=`'&8[0A!U$XG8P>`&BU0D!&8Y=!`(=`N-
+M=@"#P0%F.?ERN&8Y^700@\8!9H/^'W<'N0````#KY@^WQH/$"%M>7UW#D(VT
+M)@````!3BU0D"(M,)`R+7"00BT(XA<!T%L8`<(M".(A(`HM".,9`!P"+0CB(
+M6`Q;PXUT)@#SPXVT)@````"-O"<`````@^P0B1PDB70D!(E\)`B);"0,BTPD
+M%`^W?"08B?J!XO\!``"+@<P%``"+-)"%]G0P#[:9W@````^V1A6)V=/@#[?H
+M#[?7N/__``#3X"'".=4/E<`/ML"#Z`$AQI"-="8`B?"+'"2+="0$BWPD"(ML
+M)`R#Q!##C70F`(V\)P````"+5"0$N`````"-M"8`````Q@00`(/``3VP````
+M=?+&0BC_QD(T_XU"%(E"%(E"&,.+5"0$N`````"-M"8`````Q@00`(/``3TH
+M`0``=?+&0DS_QD)"_\9"3A^-0A")0A")0A3#C;8`````C;\`````4XM$)`B+
+M7"0,BQ.+B``!``")D``!```%_````(D"B4H$B1''`P````!;PY"-="8`4X/L
+M"(M<)!"+3"04BY/X````B8OX````C8/T````B0&)402)"H-Y3`!T#XU!3(E$
+M)`2)'"3H_/___X/$"%O#D%.+1"0(BUPD#(L3BX@0`0``B9`0`0``!0P!``")
+M`HE*!(D1QP,`````6\.0C70F`%.+1"0(BUPD#(L3BX@(`0``B9`(`0``!00!
+M``")`HE*!(D1QP,`````6\.0C70F`(M$)`2+5"0(BX@@`0``B9`@`0``!1P!
+M``")`HE*!(D1P^L-D)"0D)"0D)"0D)"0D%.+1"0(BUPD#(L3BX@H`0``B9`H
+M`0``!20!``")`HE*!(D1QP,`````6\.0C70F`%.+1"0(BUPD#(L3BX@8`0``
+MB9`8`0``!10!``")`HE*!(D1QP,`````6\.0C70F``^V1"0$/!=W%P^VP/\D
+MA:`(``"X-````,.-M"8`````N`0```##N#P```"0C70F`,.X%````,.X0```
+M`(UT)@##N!P```##N!@```"-="8`P[@H````P[@@````C70F`,.X3````,.)
+M]HV\)P````!55U93BVPD%(M\)!@/ME<DB="#X`:#^`9U"?;"`0^$R@```(!_
+M0O\/A<````"+10"+L!@!``")-0````"Y`````+@!````B</3XX7>=3*(3T*+
+M50")V`GPB8(8`0``BT4`BX!8`0``HP````")VB'"='>+10")D%@!``#K;(UV
+M`(/!`8/Y('6YBT4`B[`<`0``B34`````L0"-M"8`````B<JX`0```(G#T^.%
+MWG4RC4(@B$="BU4`B=@)\(F"'`$``(M%`(N`8`$``*,`````B=HAPG03BT4`
+MB9!@`0``ZPB#P0&#^2!UMX!%+`%;7E]=PXVT)@````"-O"<`````5U93BWPD
+M$(M4)!2`>C3_#X6W````BP>+L!@!``")-0````"Y`````+@!````B</3XX7>
+M=2R(2C2+%XG8"?")@A@!``"+!XN`6`$``*,`````B=HAPG1QBP>)D%@!``#K
+M9X/!`8/Y('6_BP>+L!P!``")-0````"Q`(VT)@````"X`0```(G#T^.%WG4S
+MB$HTBQ>)V`GPB8(<`0``BP>+@&`!``"C`````(G:(<)T&8L'B9!@`0``ZP^-
+MM"8`````@\$!@_D@=;B`1RP!6UY?PU,/MEPD$(M$)`B+2"B%R70QN@````"+
+M1)$\A<!T!3A8370/@\(!@_H%=!>0C70F`.OD9H%Y)(4`=PB%P(UT)@!U!;@`
+M````6\.-M"8`````55=64X/L#(ML)"`/MD0D),'@"`^V5"0HC300@'T<``^$
+MR0```(-].``/A+\```#V160)#Y3`B<>Y`````(UV`(G+#[<4S0`)``")\"'0
+M9CG"#X6+````#[84S04)``"`^@-T!8#Z!W4+B?@X!,T$"0``=6[&110@#[8$
+MW08)``")1"0(#[;"B40D!(DL).C\____BU4X#[8$W0<)``"(0@V#?"0L`'0K
+MBT0D+(L8BW`$BTTXB7$#BT4X@`B`]D5F!'00A?9T#(M%.(E8"(M%.(`@?XM5
+M.`^V11R#Z`>(0@?K#(/!`8/Y$`^%4O___X/$#%M>7UW#C78`C;PG`````(/L
+M#(M$)!"-D!0!``"Y`````#F0%`$``'01B10DZ/S___^)P<=`%`````")R(/$
+M#,/K#9"0D)"0D)"0D)"0D)"#[`R+1"00C9`D`0``N0`````YD"0!``!T"HD4
+M).C\____B<&)R(/$#,.-M@````"#[`R+1"00C9`<`0``N0`````YD!P!``!T
+M)(D4).C\____B<&)PK@`````D(UT)@#&!!``@\`!/9@```!U\HG(@\0,PXVV
+M`````(V_`````(/L#(M$)!"-D`0!``"Y`````#F0!`$``'0*B10DZ/S___^)
+MP8G(@\0,PXVV`````(/L#(M$)!"-D/P```"Y`````#F0_````'0.B10DZ/S_
+M__^)P<9`"`")R(/$#,.)]E575E.#[!R)1"00B=7'1"04`````,=$)!@`````
+MC78`BU0D&(M,)!`/MH0*.`4``#S_#X0H`0``#[;0#[=$)!AF@^B`9CV!``^'
+M?`````^WPFG`%`T``(G#`YFP!0``@'LP`'15O@````"->RB-=@")/"3H_/__
+M_XU(^(M3+(E#+(EY"(E1#(D"BT$D)0#__P`]``#_`'48]D$G!'02BT$@A<!T
+M"XGJB%`!C;8`````@\8!B?$X2S!WMHGHB(.2````@\4!Z98````/M\)IP+``
+M``")PXM4)!`#FI0%``"`>Q\`=$.Y`````(VV``````^VP8M4@SR%TG0EBT(D
+M)0#__P`]``#_`'46]D(G!'00BT(@A<!T"8GJB%`!C70F`(/!`3A+'W?(B>F(
+MBZ0```"`NZ4````#=1Z#1"04`8M$)!2#P`.#^`9V%H/%`<=$)!0`````ZPF#
+MQ0&-M@````"#1"08`8-\)!@&#X6P_O__BU0D$(N"1`4``#G0=0P%R`P``(GJ
+MZ';^__^#Q!Q;7E]=PXVT)@````"-O"<`````@^P,BU0D$(M$)!0/MD@$#[:$
+M$3X%``#&A!$^!0``_P^WP(E$)`2!PMP)``")%"3H_/___X/$#,.0C;0F````
+M`(/L"(D<)(ET)`2+="00BUY,A=MT)(U.)(U3#(M##(E&)(M"!(E!!(M""(E!
+M"(M"#(E!#(M#'(E&-(L<)(MT)`2#Q`C#C;8`````C;\`````@^P(B1PDB70D
+M!(MT)!"+7DR%VW0HC4L,C58DBT8DB4,,BT($B4$$BT((B4$(BT(,B4$,BT8T
+MB4,<QD,(`8L<)(MT)`2#Q`C#D(VT)@````!75E.#[!"+?"0@BQ]F@WM8``^$
+MNP```+X`````C70F``^WUHN#S`4``(L,D(7)#X21````#[=1$&:!^H4`=W$/
+MM\(/MH0#N`0``#S_=&)F@_I_=QP/ML"+DW@%``!IP"@!``"+1!`L#[90!.M(
+MC78`9H'Z@0!W&0^VP(N3L`4``&G`%`T``(M$$`@/ME`$ZR4/ML"+DY0%``!I
+MP+````"+1!!4#[90!.L,C;0F`````+K_````#[9'!#G"=0B)#"3H_/___X/&
+M`68Y<U@/AT[___^#Q!!;7E_#C;0F`````(/L'(E<)!2)="08BUPD((MT)"0/
+MMD8T//]T&0^VP(E$)`2+`XD$).C\____QD8T_X!K+`&+7"04BW0D&(/$',.#
+M[!R)7"04B70D&(M<)""+="0D#[9&0CS_=!D/ML")1"0$BP.)!"3H_/___\9&
+M0O^`:RP!BUPD%(MT)!B#Q!S#5U93@^P0BW0D((M<)"0Y<Q@/A,\```"`>Q0`
+M#X66````#[9#)#P5=`@\50^%A@```(M#3(7`='^)PH!X"`%U=V:!>`SA`75O
+MB[YX!0``#[=#$+G8)@$`9CV%`'<1#[?`#[:$!K@$``!IR"@!``"-!`\/ME(.
+M@/H'=!^`^@=W!X#Z!G4SZQR`^@R-M"8`````=""`^@UU(.L09H-@.OV)]NL5
+M9H-(.@+K#F:#8#KWB?;K!6:#2#H(@WM0`'0I@7L@``@``'<1C4-0B40D!(DT
+M).C\____ZP^-0U")1"0$B30DZ/S___]F@7LDX0$/A08!```/MT,09CV%`'=Z
+M#[?`#[:$!K@$```\_W1KBY9X!0``@'L4`'5?#[;`:<`H`0``C00"#[93)H#Z
+M!W0=@/H'=P>`^@9U,>L:@/H,D(UT)@!T((#Z#74@ZQ!F@V`Z_8GVZQ5F@T@Z
+M`NL.9H-@.O>)]NL%9H-(.@AF@7LDX0&-=@`/A8(```"`>R8+=7P/MTL0#[9&
+M+HUX_XG*ZQR0C70F`(/"`6:!^H4`=PT/M\*`O#"X!```_W4)#[?".?A\XNM$
+M9CW_`'49ZSR#P0%F@?F%`'<-#[?!@+PPN`0``/]U#`^WP3G'?^*X_P```&:)
+M0Q#&0Q2`B5PD!(DT).C\____Z1P!``#&0Q0`.7,8="B+0TR%P'0A@'@(`74,
+MB5PD!(DT).C\____C4-,B40D!(DT).C\____@WM4`'0/C4-4B40D!(DT).C\
+M____B5PD!(M#&(D$)/]3;`^W4R1F@?KA`755#[9#)H/H$3P!=TH/MT,09CV%
+M``^'I0````^WP`^VA`:X!```//\/A)(````/ML!IP+`````#AI0%``"`>"D`
+M=7V`>#3_='>)1"0$B30DZ/S____K:0^W0Q!F/84`=U\/M\`/MHP&N`0``(N^
+M>`4``(M#)"7___\`/>$!$`!T/X'Y_P```'0W9H'ZX0%U$`^V0R:#Z!$\`78E
+MD(UT)@!IP2@!``"-!`>`>$\`=1&)1"0$B30DZ/S___^0C70F`(/$$%M>7\.)
+M]HV\)P````"#[!R)7"00B70D%(E\)!B+="0@BUPD)`^W4Q!F@?J%``^'B@``
+M``^WP@^VC`:X!```@/G_='IF@_I_=QD/ML&+EG@%``!IP"@!``"+1!`L#[9`
+M!.L[9H'Z@0!W&0^VP8N6L`4``&G`%`T``(M$$`@/MD`$ZQL/ML&+EI0%``!I
+MP+````"+1!!4#[9`!(UT)@!F/?\`=!H/M\`/MKP&/@4``(GX//]T"0^VP68]
+M_P!U$(E<)`2)-"3H_/___^M^B?8/ME,G#[9#*`^V2RF`^0%T!8#Y"'5:BTM(
+MP>`(#[;2`=`E_P$``(N6S`4``#D,@G4_#[=)'HG*9L'J!0^WTH/A'[C^____
+MT\`A1)9<BT-(#[=`'HE$)`2)^@^VPFO`7(V$!D@!``")!"3H_/___XGVB5PD
+M!(DT).C\____BUPD$(MT)!2+?"08@\0<PXUT)@"#[`R)7"0$B70D"(M<)!"-
+M@_0```"^`````#F#]````'0=B00DZ/S___^)QHD$).C\____B1PDZ/S___^)
+M1DR)\(M<)`2+="0(@\0,PXUV`(/L'(E<)!")="04B7PD&(M\)""+1RR+,(DT
+M).C\____B<.%P'1KB30DZ/S___^)PH7`=1S&A[4````!B5PD!(DT).C\____
+MZTB-M"8`````QD,D``^W1QQFB4,0QD-H#XES&,=#(`````#'0S0`````BT((
+MB4,XQD,<)(E34,=#;`````")7"0$B30DZ/S___^+7"00BW0D%(M\)!B#Q!S#
+MZPV0D)"0D)"0D)"0D)"0@^P<B5PD$(ET)!2)?"08BWPD((MT)"2+1RR+&(D<
+M).C\____B<*%P'0]QD`D&\9`)0&)\(A"*`^W1QQFB4(0QD)H#XE:&,="(```
+M``#'0C0`````QT)L`````(E4)`2)'"3H_/___XM<)!"+="04BWPD&(/$',.)
+M]HV\)P````"#["R)7"0<B70D((E\)"2);"0HBUPD-(M$)#"+*(DL).C\____
+MB<:%P`^$H@```(DL).C\____B<>%P'43B70D!(DL).C\____Z8,```")]HU6
+M/(E4)!C&1B3AQD8E`<9&)@X/MT,<9HE&$&:#8SCWBU0D,(L"B488QT8@``@`
+M`(M'"(E&-(E^4,=&;/#!`0#'1"0$`````(M$)!B)!"3H_/___XM&((E$)`R+
+M1PR+5Q")1"0$B50D"(M4)!B)%"3H_/___XET)`2)+"3H_/___XM<)!R+="0@
+MBWPD)(ML)"B#Q"S#C70F`(V\)P````"#[!R)7"00B70D%(E\)!B+="0HBT0D
+M((L8B1PDZ/S___^)PH7`=&7&0"3AQD`E`8GPB$(FQD(G#XM,)"0/MT$<9HE"
+M$(E:&,="(`````#'0C0`````QT)L`````(E4)`2)'"3H_/___XGP/`%U$L<$
+M)`4```#H_/___^L0C70F`,<$)%##``#H_/___XM<)!"+="04BWPD&(/$',.-
+M="8`@^P<B5PD$(ET)!2)?"08BW0D((M<)"0/MU,09H'ZA0`/AXL````/M\(/
+MMHP&N`0``(#Y_W1[9H/Z?W<9#[;!BY9X!0``:<`H`0``BT00+`^V0`3K.V:!
+M^H$`=QD/ML&+EK`%``!IP!0-``"+1!`(#[9`!.L;#[;!BY:4!0``:<"P````
+MBT005`^V0`2-="8`//]T'0^VP`^VE`8^!0``@/K_=`V`^?]T"`^V0Q0\!G4_
+M@WM0`'0K@7L@``@``(GV=Q&-0U")1"0$B30DZ/S____K#XU#4(E$)`2)-"3H
+M_/___XE<)`2)-"3H_/___^MRB[YX!0``A,!T+<=$)`@!````#[;!:<`H`0``
+MC00'B40D!`^VPFO`7(V$!D@!``")!"3H_/___X-[4`!T*8%[(``(``!W$8U#
+M4(E$)`2)-"3H_/___^L/C4-0B40D!(DT).C\____B5PD!(DT).C\____BUPD
+M$(MT)!2+?"08@\0<PXVT)@````"-O"<`````@^PLB5PD'(ET)"")?"0DB6PD
+M*(M<)#"+;"0T#[=5$&:!^H4`#X<.`0``#[?"#[:,`[@$``"`^?\/A/H```!F
+M@_I_=QP/ML&+DW@%``!IP"@!``"+1!`L#[9`!.LZC78`9H'Z@0!W&0^VP8N3
+ML`4``&G`%`T``(M$$`@/MD`$ZQ</ML&+DY0%``!IP+````"+1!!4#[9`!#S_
+M#X29````#[;Y#[;`#[:T`SX%``")\#S_#X2!````9H'__P!T>H!]%`9T=(N3
+M>`4``(E4)!B`?28!=4S'!"0*````Z/S___^);"0$B1PDZ/S____'1"0(`@``
+M``^WQVG`*`$```-$)!B)1"0$B?(/ML)KP%R-A`-(`0``B00DZ/S____K&HGV
+MQP0D]`$``.C\____B6PD!(D<).C\____BUPD'(MT)""+?"0DBVPD*(/$+,.-
+M="8`@^PLB5PD((ET)"2)?"0HBWPD,(M'+(LPB30DZ/S___^)PX7`=0K&A[4`
+M```!ZV20QD`D%<9`%:L/MT<<9HE#$(ES&,=$)!`!````QT0D#`$```")7"0(
+MB7PD!(DT).C\____A,!U&8E<)`2)-"3H_/___\:'M0````'K%XUT)@#'0VP`
+M````B5PD!(DT).C\____BUPD((MT)"2+?"0H@\0LPXVV`````(V\)P````"#
+M["R)7"0<B70D((E\)"2);"0HBUPD,(M#+(LHB2PDZ/S___^)QH7`=0S&@[4`
+M```!Z;@```")+"3H_/___XG'A<!U',:#M0````&)="0$B2PDZ/S____ID@``
+M`(UT)@#&1B0:QD8E",9&)@C&1B<`QD8H_\9&*0#&1A6K#[=#'&:)1A");AC'
+M1B#_````QT9D"````(M'"(E&-`7_````B48XQD8<)(E^4,=&;`````"-7CS'
+M1"0$`````(D<).C\____QT0D#/\```"+1PR+5Q")1"0$B50D"(D<).C\____
+MB70D!(DL).C\____BUPD'(MT)""+?"0DBVPD*(/$+,.-M"8`````C;PG````
+M`(/L+(E<)!R)="0@B7PD)(EL)"B+;"0P#[9$)#2(1"07BT4LBSB)/"3H_/__
+M_XG#A<!U#<:%M0````'IN@```)")/"3H_/___XG&A<!U&,:%M0````&)7"0$
+MB3PDZ/S____IDP```(U#/(E$)!C&0R02@'PD%P!T#L9#)0'&0R:`QD,H0.L$
+MQD,H),9#%:L/MT4<9HE#$(E[&,=#(&````#'0V0(````BT8(B4,TB7-0QT-L
+M`````,=$)`0`````BT0D&(D$).C\____QT0D#&````"+1@R+5A")1"0$B50D
+M"(M$)!B)!"3H_/___XE<)`2)/"3H_/___XM<)!R+="0@BWPD)(ML)"B#Q"S#
+MC78`@^PLB5PD'(ET)"")?"0DB6PD*(M<)#"+0RR+*(DL).C\____B<:%P'4,
+MQH.U`````>FZ````B2PDZ/S___^)QX7`=1S&@[4````!B70D!(DL).C\____
+MZ90```"-="8`C48\B40D&,9&))[&1B40QD8Q(,9&%:L/MT,<9HE&$(EN&,=&
+M("````#'1F0(````BT<(B48TB7Y0@\`@B48XQD8<),=&;`````#&1F@/QT0D
+M!`````"+1"08B00DZ/S____'1"0,(````(M'#(M7$(E$)`2)5"0(BT0D&(D$
+M).C\____B70D!(DL).C\____BUPD'(MT)""+?"0DBVPD*(/$+,.-M@````"-
+MOP````"#["R)7"0<B70D((E\)"2);"0HBUPD,(M#+(LHB2PDZ/S___^)QH7`
+M=0S&@[4````!Z:X```")+"3H_/___XG'A<!U',:#M0````&)="0$B2PDZ/S_
+M___IB````(UT)@"-1CR)1"08QD8D)<9&%:L/MT,<9HE&$(EN&,=&(`@```#'
+M1F0(````BT<(B48T@\`(B48XQD8<)(E^4,=&;`````#'1"0$`````(M$)!B)
+M!"3H_/___\=$)`P(````BT<,BU<0B40D!(E4)`B+1"08B00DZ/S___^)="0$
+MB2PDZ/S___^+7"0<BW0D((M\)"2+;"0H@\0LPY"-M"8`````@^PLB5PD'(ET
+M)"")?"0DB6PD*(M$)#B)1"04BU0D,(LZBX]X!0``B4PD&(M4)#0/MT(0#[:L
+M![@$``")/"3H_/___XG#BTPD-`^W<1Z)\8/A'[@!````T^")P8GP9L'H!0^W
+MP(5,AUP/A<D```"%VP^$P0```(GI#[;1:=(H`0```U0D&(M,)#0/MD$5#[:/
+MW@```-/@"?#&0R3AQD,E`<9#)@^(0R=FP>@(B$,H#[9$)!2(0RF+@J@```")
+M0RJ+@JP```")0RZ+3"0TB4M(QD,5J@^W0AQFB4,0BU0D,(L"B4,8QT,@````
+M`,=#-`````#'0VR0O0$`QT0D!`````"-0SR)!"3H_/___XE<)`2)/"3H_/__
+M_XM$)#0/MT@>B<AFP>@%#[?`@^$?N@$```#3X@E4AUR+7"0<BW0D((M\)"2+
+M;"0H@\0LPY"-="8`55=64X/L'`^V1"0TB$0D&XM4)#"+&F:#>U@`#X3^`0``
+MO0`````/M]6+@\P%``"+#)"%R0^$V`$``(MY)('G____`('_X0$0``^%D0``
+M`(-\)#@`#X6X`0``#[=1$&:!^H4`=V</M\(/MH0#N`0``#S_=%AF@_I_=QD/
+MML"+DW@%``!IP"@!``"+1!`L#[90!.L^9H'Z@0!W&0^VP(N3L`4``&G`%`T`
+M`(M$$`@/ME`$ZQX/ML"+DY0%``!IP+````"+1!!4#[90!.L%NO____^^````
+M`.FE````D(UT)@`/MU$09H'ZA0`/AX<````/M\(/MK0#N`0``(GP//]T=F:#
+M^G]W&0^VP(N3>`4``&G`*`$``(M$$"P/ME`$ZT%F@?J!`'<;B?(/ML*+D[`%
+M``!IP!0-``"+1!`(#[90!.L?B?(/ML*+DY0%``!IP+````"+1!!4#[90!(VV
+M`````('F_P```&G&*`$``(G&`[-X!0``ZPJZ_____[X`````BT0D,#A0!`^%
+MA0```(-\)#@`=`Z+5"0X#[="'&8[01!U<(!\)!L&=$Z!_^$!$`!T1@^V5B2)
+MT(/@!H/X!G4X]L(!=3.`OK0`````=2J!_^$!#P!T/0^V1"0;B$$4QT0D"`$`
+M``")3"0$BU0D,(D4).C\____ZQL/MD0D&XA!%`^WQ8E$)`2+5"0PB10DZ/S_
+M__^#Q0%F.6M8#X<'_O__@'PD&X$/A#4!``"+@^0```"-L^0````YQ@^$(0$`
+M`+H`````@\(!BP`YQG7W9H72#X0*`0``C7K_B30DZ/S___^)P8-\)#@`=">+
+M5"0X#[="'&8[01!T&8N#Z````(F+Z````(DQB4$$B0CIN0```)`/MU$09H'Z
+MA0!W9P^WP@^VA`.X!```//]T6&:#^G]W&0^VP(N3>`4``&G`*`$``(M$$"P/
+MMD`$ZSYF@?J!`'<9#[;`BY.P!0``:<`4#0``BT00"`^V0`3K'@^VP(N3E`4`
+M`&G`L````(M$$%0/MD`$ZP6X_____XM4)#`Z0@1U)8M!)"7___\`/>$!#P!T
+M%@^V1"0;B$$4B4PD!(D<).C\____ZQ.+@^@```")B^@```"),8E!!(D(C4?_
+M9H7_=`\[L^0```!T!XG'Z?G^__^#Q!Q;7E]=PXGVC;PG`````(/L'(E<)`R)
+M="00B7PD%(EL)!B+;"0@#[9\)"B+=0")-"3H_/___XG#A<!U$XM$)"S&@+4`
+M```!Z9````"-=@")-"3H_/___XG"A<!U&8E<)`2)-"3H_/___XM4)"S&@K4`
+M```!ZV;&0R3AQD,E`<9#)A")^8A+%8M,)"0/MD$S9HE#$(M%`(E#&,=#()``
+M``"-0@B)0S2)4U#&0`$2QD((0(GZB%`)QT-L`````,=$)`0`````C4,\B00D
+MZ/S___^)7"0$B30DZ/S___^+7"0,BW0D$(M\)!2+;"08@\0<P^L-D)"0D)"0
+MD)"0D)"0D(/L'(E<)`R)="00B7PD%(EL)!B+;"0@BWPD*(M$)"R)1"0(BW4`
+MB30DZ/S___^)PX7`#X2(````B30DZ/S___^)PH7`='K&0R3AQD,E`<9#)A")
+M^8A+%8M,)"0/MD$S9HE#$(M%`(E#&,=#()````"-0@B)0S2)4U#&0`&1QD((
+M0(GZB%`)#[9,)`B(2`K'0VP`````QT0D!`````"-0SR)!"3H_/___XE<)`2)
+M-"3H_/___\<$)*"&`0#H_/___XM<)`R+="00BWPD%(ML)!B#Q!S#C;8`````
+MC;\`````@^P<B5PD#(ET)!")?"04B6PD&(M\)""+;"0HBS>)-"3H_/___XG#
+MA<!T<HDT).C\____B<*%P'1DQD,DX<9#)0'&0R80QD,5NXM,)"0/MD$S9HE#
+M$(L'B4,8QT,@D````(U""(E#-(E34,9``1#&0@A`B>J(4`G'0VP`````QT0D
+M!`````"-0SR)!"3H_/___XE<)`2)-"3H_/___XM<)`R+="00BWPD%(ML)!B#
+MQ!S#ZPV0D)"0D)"0D)"0D)"0@^P<B5PD$(ET)!2)?"08BWPD((LWB30DZ/S_
+M__^)PX7`=&V)-"3H_/___XG"A<!T7\9#).'&0R4!QD,F$,9#%;N+3"0D#[9!
+M,V:)0Q"+!XE#&,=#()````"-0@B)0S2)4U#&0`$`QD((0,=#;`````#'1"0$
+M`````(U#/(D$).C\____B5PD!(DT).C\____BUPD$(MT)!2+?"08@\0<PX/L
+M'(E<)`R)="00B7PD%(EL)!B+="0@C9[<"0``B1PDZ/S___^$P`^%N````(D<
+M).C\____B<.X`````(G!@+PP/@4``/]U"CA&,',0B$8PZPN#P0&#P`&#^`1U
+MWX#Y!`^$?P````^VP8B<!CX%```/M^MKQ5R-E`9(`0``N`````#&!!``@\`!
+M@_A<=?0/M]N)7"0(:_M<C90^8`$``(U:"(T$-XF8:`$``(F8;`$``(/"%(F0
+M=`$``(F0>`$``(V4/H`!``")D(`!``")D(0!``"(B$P!``!KQ5R-A`9(`0``
+MZP6X`````(M<)`R+="00BWPD%(ML)!B#Q!S#B?:#[!R)7"00B70D%(E\)!B+
+M="0@C9YD"0``B1PDZ/S___^$P`^%%P$``(D<).C\____B<*X`````(G#@+PP
+MN`0``/]U'`^VP&8YAMP```!S'6:)AMP```#K%(VT)@````"#PP&#P`$]@```
+M`'7+@/N`#X3*````#[;#B)0&N`0```^WPFGX*`$``(GX`X9X!0``B00DZ/S_
+M__^+EG@%```/ML-FB407'(N&>`4``,9$!R8`BX9X!0``QD0'/?^+AG@%``#&
+M1`<\_XN&>`4``,9$!S[_BX9X!0``QD0'0/^+AG@%``#&1`<__XN&>`4``,9$
+M!T'_BX9X!0``QH0'M@````"+AG@%``#&A`?;````_XDT).C\____BY9X!0``
+MB807Z````(!^-0%U"XN&>`4``(!,!R@!B?@#AG@%``#K!;@`````BUPD$(MT
+M)!2+?"08@\0<PXUT)@"-O"<`````4X/L"(M<)!"+5"04B=CHC>+__XN#1`4`
+M`(D$).C\____@\0(6\.-=@"-O"<`````@^P<B5PD$(ET)!2)?"08BW0D((V>
+MC`D``(D<).C\____A,`/A=T```")'"3H_/___XG"B?"[@O___XVV`````("X
+M.@4``/]U%SB>X````',@B)[@````ZQB-M"8`````@\,!@\`!@/N&#X27````
+MZ\^`^X8/A(P````/ML.(E`:X!```#[?":?BP````B?@#AI0%``")!"3H_/__
+M_XN6E`4```^VPV:)1!<D@'XU`74-BX:4!0``9L=$!S#__XN&E`4``,9$!R8`
+MBX:4!0``9L=$!S(``(N&E`4``&;'A`>0````___'1"0$`````(N&1`4``(D$
+M).C\____B?@#AI0%``#K!;@`````BUPD$(MT)!2+?"08@\0<PY"-="8`5E.#
+M[!2+="0@BT0D)`^W0"0/MIPPN`0``,:$,+@$``#_#[?;B5PD!(V&C`D``(D$
+M).C\____:=NP````B=@#AI0%``"`>#3_=`R)1"0$B30DZ/S____'1"0$````
+M`(N&1`4``(D$).C\____@\046U[#C;0F`````(V\)P````!3@^P(BUPD$(M$
+M)!0/ME`S#[:$&K@$``#&A!JX!```_P^WP(E$)`2-@[0)``")!"3H_/___\=$
+M)`0`````BX-$!0``B00DZ/S___^#Q`A;PU.#[`B+7"04@'LH_W0:C4-8B40D
+M!(M4)!"+0A2)!"3H_/___\9#*/^#Q`A;PXUV`%.#[`B+7"04@'M,_W0=C8/L
+M````B40D!(M4)!"+0A2)!"3H_/___\9#3/^#Q`A;PX/L'(E<)`R)="00B7PD
+M%(EL)!B+7"0@BVPD)`^W11P/MKP#N`0```^WQVGP*`$``(GP`X-X!0``!>@`
+M``")1"0$B1PDZ/S___\/MU4<BX23N`(``(7`=!B#>'``=1+'A).X`@``````
+M`(VT)@`````/MT4<QH0#N`0``/\/M\>)1"0$C8-D"0``B00DZ/S___^)\`.#
+M>`4``(!X0O]T#(E$)`2)'"3H_/___XEL)`2)'"3H_/___XN#>`4``,9$!B8`
+MBX-X!0``QD0&)P&+7"0,BW0D$(M\)!2+;"08@\0<P^L-D)"0D)"0D)"0D)"0
+MD(/L'(E<)`R)="00B7PD%(EL)!B+;"0@BW0D)&:!?B3A`0^%N0````^V1B:#
+MZ!$\`0^'J@````^W1A!F/84`#X=4`0``#[?`#[:$!;@$``"+E90%```\_P^$
+M.P$```^VP&G`L````(T<`H!K*0&->Q2)/"3H_/___XG".?!U0HE<)`2)+"3H
+M_/___SM[%`^$!0$``,=#6``2>@#'0V``````B5MDC4-8B40D!(M%%(D$).C\
+M____QD,H`.G9````D(M#%(E0!(D"B7H$B5,4BQ:+1@2)0@2)$.F[````C78`
+M#[=&$&8]A0`/AZH````/M\`/MI0%N`0``(N->`4``(M&)"7___\`/>$!$``/
+MA(8```"!^O\```!T?FG"*`$``(T<`8!K3P&->Q")/"3H_/___XG".?!U2(E<
+M)`2)+"3H_/___SM[$'1/QX/L`````!)Z`,>#]`````````")F_@```"-@^P`
+M``")1"0$BT44B00DZ/S____&0TP`ZQJ)]HM#$(E0!(D"B7H$B5,0BQ:+1@2)
+M0@2)$(M<)`R+="00BWPD%(ML)!B#Q!S#C70F`(/L'(E<)`R)="00B7PD%(EL
+M)!B+?"0@BVPD)`^W51Z)T&;!Z`4/M]@/M_*)\8/A'[C^____T\")P2%$GUQF
+M@?K_#W1)C02U``````.'S`4``(,X`'0WQP``````(8R?T`4``(ET)`2-ASP)
+M``")!"3H_/___XEL)`2)/"3H_/___XEL)`2)/"3H_/___XM<)`R+="00BWPD
+M%(ML)!B#Q!S#ZPV0D)"0D)"0D)"0D)"0@^P<B5PD$(ET)!2)?"08BWPD((MT
+M)"1F@7XDX0$/A9(````/MD8F@^@1/`$/AX,````/MT80NO\```!F/84`=PL/
+MM\`/MI0'N`0``&G"L````(G#`Y^4!0``@'LH_W4\#[96:+@(````A-)T`XT$
+M$@^VP&G`0$(/`(E#6,=#8`````")6V2-0UB)1"0$BT<4B00DZ/S____&0R@`
+MBU,8B7,8C4,4B0:)5@2),H!#*0'IGP````^W1A"Y_P```&8]A0!W"P^WP`^V
+MC`>X!```BY=X!0``BT8D)?___P`]X0$0`'1P:<$H`0``C1P"@'M,_W5-#[96
+M:+@(````A-)T`XT$$@^VP&G`0$(/`(F#[````,>#]`````````")F_@```"-
+M@^P```")1"0$BT<4B00DZ/S____&0TP`D(UT)@"+4Q2)<Q2-0Q")!HE6!(DR
+M@$-/`8M<)!"+="04BWPD&(/$',.-M@````"-OP````!55U93@^PLBT0D1`^W
+M4!!F@?J%``^''P,```^WPHM<)$`/MHP#N`0``+C_____@/G_=&)F@_I_=QT/
+MML&+7"1`BY-X!0``:<`H`0``BT00+`^V0`3K/V:!^H$`=QT/ML&+7"1`BY.P
+M!0``:<`4#0``BT00"`^V0`3K&P^VP8M<)$"+DY0%``!IP+````"+1!!4#[9`
+M!`^VP(M4)$`/MJP"/@4``&O%7(V$`D@!``")1"0@BY*P!0``#[;!:<`4#0``
+M`<*)5"0<BT0D1(M0-`^V0@$\$G0G/)$/A2H"``!KQ5RY`````(M4)$"`O`)2
+M`0````^$V@$``.EQ`0``:\5<`T0D0(N(2`$``(E,)"@/MEH)B%PD)@^V4AJ(
+M5"0GNP````"`N%(!````=&:_`````&OU7(M$)$"-K#"``0``D(DL).C\____
+MB<.+5"1`C006BY"$`0``B9B$`0``B2N)4P2)&HM,)!PY2S!U$P^V0TV+5"1$
+M.D(5=!B-M@````"#QP&)^8M$)$`XC#!2`0``=ZZ+5"1$BT)0A<!T$(E$)`2+
+M3"0HB0PDZ/S___^+1"1$B40D!(M4)"B)%"3H_/___P^V@Y8```"-4`&(DY8`
+M```\`W<X@'PD)P!U,<=$)!``````QT0D#`(```"+3"1$#[9!%8E$)`B+0S")
+M1"0$BUPD((D<).C\____ZS:-0@&(@Y8```"`^@)V*(!\)"<`=2'&0R<"QD,F
+M_X!C*/Z)7"0$BT0D*(D$).C\____Z1\!```/MD0D)XE$)`P/MD0D)HE$)`B+
+M5"0<B50D!(M,)"")#"3H_/___^GT````O@````!KW5R+1"1`C;P8@`$``(D\
+M).C\____B<&+5"1`C003BY"$`0``B8B$`0``B3F)402)"HM$)!PY03!U$@^V
+M04V+5"1$.D(5=!>0C70F`(/&`8GPBU0D0#B$&E(!``!WKP^V422)T(/@!H/X
+M!G4H]L(!=".)3"0,BUPD1`^V0Q6)1"0(BT$PB40D!(M$)"")!"3H_/___XM4
+M)$2+0E"%P'00B40D!(M,)$")#"3H_/___XM<)$2)7"0$BT0D0(D$).C\____
+MZRF+5"1`#[:J/08``&O%7(V$`D@!``")1"0@BY*P!0``N.P&#0#I7_W__X/$
+M+%M>7UW#C;8`````55=64X/L#(ML)""+?"0DBUPD*,9#)P'&0R8`B5PD",=$
+M)`0&````B3PDZ/S___^#>S``=!*+4PB+0PR)0@2)$(M#,(!H,`&`>T\`=!V-
+M=@")+"3H_/___\<$)`$```#H_/___X![3P!UYHN3Y````(72=!O'1"0(`0``
+M``^V@]D```")1"0$B10DZ/S___^+4S"%TG08QT0D"`$````/MD--B40D!(D4
+M).C\____BW,@A?8/A*````"#?G``#X6(````@WYT``^%?@```/9#*`1U'XDL
+M).C\____QT0D"`$```"+0R")1"0$B2PDZ/S___^+4R`/MD("B40D"`^V0@&)
+M1"0$QP0DK@$``.C\____BT,@B40D"(N%1`4``(E$)`3'!"0!````Z/S___^+
+M0R")1"0(BX5$!0``B40D!,<$)`8```#H_/___\=#(`````#'1F``````BU,T
+MA=)T#`^V0TW'1((\`````(L3BT,$B4($B1"`;PH!B5PD!(DL).C\____@'\%
+M_W1.@'\*`'0XNP````"-=SB-M@````")-"3H_/___XM7/(E'/(DPB5`$B0*`
+M>";_=0J#PP$X7PIV!^O;.%\*=Q#&1P7_B7PD!(DL).C\____@\0,6UY?7<.-
+MM"8`````C;PG`````%575E.#[`R+;"0HQD4G`<9%)@");"0(QT0D!`8```"+
+M1"0DB00DZ/S___^#?3``=!*+50B+10R)0@2)$(M%,(!H,`&`?4\`="6-M"8`
+M````BU0D((D4).C\____QP0D`0```.C\____@'U/`'7BBY7D````A=)T&\=$
+M)`@!````#[:%V0```(E$)`2)%"3H_/___XM5,(72=!C'1"0(`0````^V14V)
+M1"0$B10DZ/S___^+72"%VP^$00$``/9%*`1U:8M,)"")#"3H_/___\=$)`@!
+M````BT4@B40D!(M$)"")!"3H_/___XM5(`^V0@*)1"0(#[9"`8E$)`3'!"2N
+M`0``Z/S___^+12")1"0(BU0D((N"1`4``(E$)`3'!"0!````Z/S____K/0^V
+M0P*)1"0(#[9#`8E$)`3'!"2N`0``Z/S___^+12")1"0(BTPD((N!1`4``(E$
+M)`3'!"0!````Z/S___^+4W"%T@^$1`$```^W11R+3"0@QX2!N`(```````#'
+M0W``````QT0D"/____^)7"0$BT-XB00D_]+I$0$```^W11R+3"0@QX2!N`(`
+M``````#'0W0`````BT-XB00D_]+V12@"="&+12")1"0(BU0D((N"1`4``(E$
+M)`3'!"0&````Z/S____'12``````QT-@`````(M5-(72=`P/MD5-QT2"/```
+M``"+50"+102)0@2)$(M,)"0/ME$*@^H!B%$*BT4TA<!T!V:#>#("=6B$TG1D
+MO@````"+?"0D@\<XB3PDZ/S___^)PXM4)"2+0CR)6CR).XE#!(D8A=MT*_9#
+M*`)T)8M#((E$)`B+3"0@BX%$!0``B40D!,<$)`8```#H_/___X!C*/V#Q@&)
+M\(M4)"0X0@IWJ(EL)`2+3"0@B0PDZ/S___^#Q`Q;7E]=PXM3=(72#X7D_O__
+MZ0'___^0C;0F`````(/L+(E<)!R)="0@B7PD)(EL)"B+7"0PBT,LBRB)+"3H
+M_/___XG&A<`/A,P```")+"3H_/___XG'A<!U&,:#M0````&)="0$B2PDZ/S_
+M___II@```,9&)*"-5B6X`````,8$$`"#P`&#^`5U],9&*@#&1BL`QD8L`,9&
+M+8C&1BX`QD8O`,9&%:L/MT,<9HE&$(EN&,=&9`@```#'1B"(````BT<(B48T
+M!8@```")1CC&1APDB7Y0QT9L`````(U>/,=$)`0`````B1PDZ/S____'1"0,
+MB````(M'#(M7$(E$)`2)5"0(B1PDZ/S___^)="0$B2PDZ/S___^+7"0<BW0D
+M((M\)"2+;"0H@\0LPXGV5E.#[!2+="0@C9ZT"0``B1PDZ/S___^$P`^%\0``
+M`(D<).C\____B<*Y@/___X"^.`4``/]T$H"^.04``/\/A<P```"Y@?___SB.
+MWP```',&B([?````@/F"#X2P````#[;!B)0&N`0```^WPFG8%`T``(G:`Y:P
+M!0``N`````#&!!``@\`!/10-``!U\HG:`Y:P!0``C4(0B4(0B=H#EK`%``"-
+M0A")0A2)V@.6L`4``(U"&(E"&(G:`Y:P!0``C4(8B4(<B=H#EK`%``"-0BB)
+M0BB)V@.6L`4``(U"*(E"+(N&L`4``(A,`S/'1"0$`````(N&1`4``(D$).C\
+M____B=@#AK`%``#K"8UT)@"X`````(/$%%M>PY"-="8`4X/L"(M$)!"+F!P*
+M```%/`D``(D$).C\____B<$/M\#!X`:-%!B+1"04B1"X`````,8$$`"#P`&#
+M^$!U]`^WP8/$"%O#C70F`(V\)P````"#[`R+1"00C9`,`0``N0`````YD`P!
+M``!T"HD4).C\____B<&)R(/$#,.0D)"0D)`/MD0D"&G`=`0```5T10``BU0D
+M!(D"PXGVC;PG`````(M4)`@/MDPD#`^W1$IP@\`!9HE$2G`/ME("`=`/M\##
+MBU0D!+@!````C;0F`````("Z.S(```%T$H/``8'"I````(/X('7I9KC___/#
+MC78`5E.+="0,#[9,)!`/MEPD%(GRN`$````XBC@R``!U&#B:.3(``'40:<"D
+M````QH0&ES$```'K#H/``8'"I````(/X('726U[#D(VT)@````!55U93@^P(
+MBWPD(`^V1"0DB$0D!XML)!R+5"0HQ@+^#[9=!(A<)`.$VW17B>JY`````+X`
+M````N`````"-="8`.;KD1P``=2B)\SI<)`=U%FG`=`0```^VA`7810``BU0D
+M*(@"ZQR#Q@&-M"8`````@\$!@\`!@<)T!```.DPD`W6^@\0(6UY?7<.-M@``
+M``!55U93@^P<BVPD-`^V7"0\BWPD,(!\)#@!=!@/MG<$NP````")\(3`#X0C
+M`0``Z?@```#&1"0;`(-\)$``#X33````BU0D0(E4)!0/ME<$QD0D&P"$TG0K
+MB?C&1"0;`+D`````.:CD1P``=0<XV703@\$!@$0D&P$%=`0``#A4)!MUX0^V
+M;"0;:=UT!```C80?=$4``,=$)`AD````B40D!(M$)!2)!"3H_/___X"\'W1%
+M````=%^^`````(G=C90?<$4``(E4)!"-M"8`````B?(/ML+!X`2+5"04C5P"
+M8(U+!(V$*.!'``"-!`>-4`B+0`B)0P2+0@2)002+0@B)00B+0@R)00R#Q@&)
+M\(M4)!`X0@1WN@^V1"0;:<!T!```#[:$!W1%``#K*8GZN0````"[`````#FJ
+MY$<```^4P`'#@\$!@<)T!```B?`XP77F#[;#@\0<6UY?7<.-="8`55=64X/L
+M!`^V1"0DB$0D`P^W7"0H9HD<)(M\)!B^`````(GU:=8X#```BT0D'#E$.A1U
+M<(U,%Q2X`````(UV`(G##[91'(32=`:`^O!U2)!IQ3@,``"-%%N-%-"-##J+
+M7"0<B5D<BT0D((E!((U!$`^W'"1FB5@6#[9<)`.(6!2)PHM<)"R+`XE"&(M#
+M!(E"',9!,/_K#8/``8/!&#V"````=9R#Q@&#_@0/A7+___^#Q`1;7E]=PY"-
+MM"8`````55=64X/L#(ML)"2+="0@@'X$`'1)OP````"-M@````")^`^VV&G#
+M=`0``("\!MA%``#]=!_'1"0("````(EL)`2-A`;010``B00DZ/S___^$P'4/
+M@\<!B?@X1@1WPKO_````B=B#Q`Q;7E]=PXUV`%.#[`B+7"00BT0D%(E$)`2)
+M'"3H_/___[H)````//]T$0^VP&G`=`0```^VE`-Z10``B="#Q`A;PXVT)@``
+M``!55U93@^P,BWPD((ML)"@/MG0D+`^W7"0PB?F-E_0P``"X`````,8$$`"#
+MP`$]D````'7RQH'U,```$\:!]#```$`/ML>(@?HP``"(F?LP``")\(B!_3``
+M`,>!D#$``+#W`0")N8PQ``"+15R)@80Q``"+16")@8@Q``"-@?0P``")1"0$
+MBT0D)(D$).C\____@\0,6UY?7<.-M"8`````55=64X/L3`^V1"1LB$0D/P^W
+M5"1P9HE4)""+5"1@B=>X`0```(G%B<:`NCLR```!#X7<````:<"D`````?B-
+MD)`Q``#&0@<`B;B,,0``#[9*!FG!I````(V4!_0P``"X`````,8$$`"#P`$]
+MD````'7R:=FD````C0P[C9'P,```QD(%D,9"!$`/MT0D(`^VQ(E$)!R(0@H/
+MMD0D((B!^S````^V3"0_B$H-BTPD=(L!B4(4BT$$B4(8:=:D````C00ZQX"0
+M,0``L/<!`(M,)&")B(PQ``"-E!>`,0``BTPD:(M!7(E"!(M!8(E""(GJ#[;"
+M:<"D````C80']#```(E$)`2+3"1DB0PDZ/S____K%(/``8'"I````(/X(`^%
+M`?___[`!@\1,6UY?7<.)]E575E.#[`P/MFPD*`^V?"0LBTPD((G.N`$```"-
+M="8`B<*`N3LR```!#X7"````:<"D````C80&D#$``(GIB$@$B?N(6`7&0`<`
+M#[98!FG#I````(V,!O0P``"X`````,8$"`"#P`$]D````'7R:<.D````C80&
+M\#```,9`!1#&0`1`B?F(2`UITJ0````/MHP6EC$``&G)I````(T$,<>`D#$`
+M`+#W`0"+7"0@B9B,,0``C9P6@#$``(GJ#[;":<!T!```C90&P$4``(M"$(E#
+M!(M"%(E#"(V$#O0P``")1"0$BTPD)(D,).C\____ZQ2#P`&!P:0```"#^"`/
+MA1W___^P`8/$#%M>7UW#C78`5E.#[!2+="0@#[9$)"B)\\:&ES$```"-CO0P
+M``"Z`````,8$"@"#P@&!^I````!U\<:#]3````'&@_0P``!`QX.0,0``L/<!
+M`(FSC#$```^VP&G`=`0``(V4`\!%``"+0A")@X0Q``"+0A2)@X@Q``"-@_0P
+M``")1"0$BT0D)(D$).C\____@\046U[#C78`5E.#[!2+="0@#[9$)"B)\\:&
+MES$```"-CO0P``"Z`````,8$"@"#P@&!^I````!U\<:#]3````#&@_0P``!`
+MQX.0,0``L/<!`(FSC#$```^VP&G`=`0``(V4`\!%``"+0A")@X0Q``"+0A2)
+M@X@Q``"-@_0P``")1"0$BT0D)(D$).C\____@\046U[#C78`55=64X/L3`^V
+M?"1H#[94)&P/MD0D<(A$)">+;"1@B?D/MLF)3"0H:<%T!```@+P%V$4``/T/
+MA#D)``"`^A`/A+D"``"`^A!W'(32D(UT)@`/A*$```"`^@$/A14)``"0Z0L!
+M``"`^N)T&X#Z_XUV`'0I@/J0#X7Y"```D(UT)@#I-@<``+D`````@'T$`(GV
+M#X4Z"```Z5T(``!I1"0H=`0``,:$!=A%``#_@+V7,0```74MBUPD*(E<)`B+
+M="1DB70D!(M\)&")/"3H_/___X7`#X6<"```@$4&`>F3"```BT0D*,9$!0<!
+MBU0D9(E4A0SI?0@``("]ES$```%U6HV-]#```&E$)"AT!````>@/ME$)B)!V
+M10``!=!%```/ME$*@^(!B%`)QD`(`(M,)"B)3"0(BUPD9(E<)`2+="1@B30D
+MZ/S___^%P`^%(P@``(!%!@'I&@@``(M\)"C&1#T'`8M$)&2)1+T,Z00(``!I
+M="0H=`0``(T\+@^VA28Q``"(A\9%```/MX4D,0``9HF$-<1%``"-E#6P10``
+MBX4<,0``B4($BX4@,0``B4((C90U@$4``(N%`#$``(E"!(N%!#$``(E""(V<
+M-9!%``"-2P2-E0@Q``"+A0@Q``")0P2+0@2)002+0@B)00B+0@R)00R+A1@Q
+M``")A#6L10``QH?810```8!]!A\/A&('``"[`````&E$)"AT!````>B-L'!%
+M``"-N,!%``#K5)`/ML.)1"0,BU0D*(E4)`B+3"1DB4PD!(M$)&")!"3H_/__
+M_X7`=!%I1"0H=`0``(B<!<=%``#K((/#`8!%!@$X7@8/E,"#Z`$AV(A'!X!]
+M!A]T!3I>!G*HQH67,0```0^V302$R0^$V08``+H`````@'T'`70,ZT0/MM"`
+M?!4'`74_QD05!__'1"04`````,=$)!``````QT0D#/\```")5"0(BT25#(E$
+M)`2+5"1@B10DZ/S____IB`8``+@`````@\`!.,AUL.EW!@``BTPD=(E,)#"#
+MP1B)3"0LC4PD0(M<)#"+0QB)1"1`BW0D+(M&!(E$)$1I1"0H=`0``(TT*(V6
+MT$4``,9""!#V0PQP#X1E`P``BX;<10``A<`/A(@````/MEH*QT0D"`@```")
+M3"0$@\!<B00DZ/S___^$P'5IBT0D,/9`#P]T7XN&W$4``(7`=%6)QH!^90!T
+M30^VVXE<)`B)="0$B2PDZ/S___^+5"0LB50D%`^WP(E$)!")7"0,B70D"(M,
+M)&2)3"0$BUPD8(D<).C\____#[9>9HM&:(7`=`2)QNNMBW0D,`^V1@^H#0^$
+M_0```&E4)"AT!```#[:,%71%``"`^1\/A^0```"H"'02#[;!P>`$`=#&A`7H
+M1P``!NL8#[;!P>`$:50D*'0$```!T,:$!>A'```'#[;QB?+!X@1I7"0H=`0`
+M``':C8P5X$<``,9!"0"+?"0P#[9'#XA!"XM$)$")01"+1"1$B4$4#[9'"8A!
+M"@^V1PV#X`\/MI0=>D4``#C0=@*)T(G"@^(/#[9!#(/@\`G0B$$,B?#!X`1I
+M5"0H=`0```'0C8P%X$<``(M<)#`/MD,I@^`/#[:4%7I%```XT'8"B=#!X`0/
+MME$,@^(/"<*(40QI1"0H=`0``("$!71%```!Z<(!``"H`@^$N@$``(U$)$")
+M1"0$B2PDZ/S___^)PCS_#X5?`0``#[9-!(3)=#@/MH7810``//]T+;H`````
+M//UU&^LB#[;":<!T!```#[:$!=A%```\_W02//UT#H/"`3C*=>#K!;H`````
+M#[;":<!T!```C8P%=$4``+@`````Q@0(`(/``8/X9'7T#[;2B50D-&G2=`0`
+M`(T<*HGY#[;!:<!T!```C80%=$4``(F#W$4``(V,%<!%``!I="0H=`0``(V4
+M-<!%``"+0A")00B+0A2)00R+?"1DB;OD1P```>Z+AN!%``")@^!%``#&@]A%
+M``#_C8-P10``#[9("XM\)#`/ME<)B)0+?$4``(!`"P$/MHYZ10``#[97#8/B
+M#SC*=@*)RHA0"FE4)#1T!```C8P5P$4``(M$)$")01"+1"1$B4$4`>J+3"0P
+M#[9!#XB"=T4```^V7"0GB)K:10``#[9%!3I%!'4$QD4%`(!%!0&+="0TQD0U
+M!P&+?"1DB7RU#.M!:40D*'0$```/MM)IRG0$``"-E`UT10``.90%W$4``'0@
+MC1PIC8-P10``#[9("XMT)#`/ME8)B)0+?$4``(!`"P&+?"0P#[9'"8E$)`B+
+M1"0HB40D!(DL).C\____:40D*'0$``"`O`7'10````^$G````(!]!A]U<.F-
+M`@``QH;810``$`^V0P>)1"0,BU0D*(E4)`B+3"1DB4PD!(M$)&")!"3H_/__
+M_X7`#X5:`@``@$4&`0^V2P</ML&#P`$/MI9V10``.=!U#<9#!P#I.`(``(UT
+M)@"-00&(0P>`?08?#X0D`@``ZQ%I1"0H=`0``(TT*(V>P$4```^V0P<ZAG9%
+M```/@G3____I_`$``(!]!@`/A?(!``#'1"04`````,=$)!``````QT0D#)``
+M``"+5"0HB50D"(M,)&2)3"0$BUPD8(D<).C\____Z;D!``"_`````&G'.`P`
+M`(MT)&0Y="@4=7:-7`4PO@````")1"0@C78`@#O_=5.`?08?#X2%`0``C01V
+MBU0D((U$PA"-1`48B40D%`^W0_:)1"00#[9#](E$)`R+0_")1"0(BTPD9(E,
+M)`2+1"1@B00DZ/S___^%P'4'@$4&`<8#\(/&`8/#&('^@@```'6:@\<!@_\$
+M#X5N____@'T&``^%&`$```^V302$R0^$V````+H`````@'T'`70,ZT0/MM"`
+M?!4'`75!QD05!__'1"04`````,=$)!``````QT0D#/\```")5"0(BT25#(E$
+M)`2+5"1@B10DZ/S____INP```+@`````B?:#P`$XR'6NZW>-M"8`````#[;!
+M:<!T!```C90%T$4```^V0@@\_70(//]T!,9""/Z#P0$X301WV&E$)"AT!```
+MBYP%X$4``+\`````C70F`(!\+Q@!=1G&1"\8`(M$+Q2)1"0$BTPD8(D,)/_3
+MC78`@<<X#```@?_@,```=#;KT,=$)!0`````QT0D$`````#'1"0,X@```(M<
+M)"B)7"0(BW0D9(ET)`2+?"1@B3PDZ/S___^#Q$Q;7E]=PXUT)@"#["R)7"0@
+MB70D)(E\)"B+="0TBYZ8````@'L&``^$A`$``(V&D````(E$)`2)'"3H_/__
+M_XG!//\/A&@!``")]P^V1@$\`71L/`%R&#P0#X2L````/)`/A4H!``"-=@#I
+M^@```("[ES$```"-="8`#X4Q`0``QH.7,0```8!K!@''1"04`````,=$)!``
+M````QT0D#``````/ML&)1"0(BT0D,(E$)`2)'"3H_/___^GR````@+N7,0``
+M``^%Y0```,:#ES$```&`:P8!QT0D%`````#'1"00`````,=$)`P!````#[;!
+MB40D"(M$)#")1"0$B1PDZ/S____II@```+H`````.HP:.#(``'41#[:$&CDR
+M```Z1PET$HUT)@"!PJ0```"!^MP3``!UV(!K!@&)?"04#[9'"8E$)!#'1"0,
+M$`````^VP8E$)`B+1"0PB40D!(D<).C\____ZT@/MH:B````:<"D````QH0#
+MES$```&`:P8!QT0D%`````#'1"00`````,=$)`R0````#[;!B40D"(M$)#")
+M1"0$B1PDZ/S___^+7"0@BW0D)(M\)"B#Q"S#B?:-O"<`````5E.+5"00#[9T
+M)!2+7"0,A=)T#XG9B=#&`0"#P0&#Z`%U]8D3@>IT10``P>H"N%FV^7+WXL'J
+M!XA3!(GP.-!S`XA#!(![!`!T);H`````B?8/ML+&1`,'_VG`=`0``,:$`]A%
+M``#]@\(!.%,$=^+&0P8`QD,%`(G8N@````"-=@#&@)<Q```!B)"6,0``@\(!
+M!:0```"#^B!UYEM>PXUV`%=64XM\)!2+3"00@'D$``^$@0```+L`````#[;S
+M:<9T!```.;P!Y$<``'5BN``````XG`@X,@``=0C&A`@[,@```06D````/=P3
+M``!UXVG&=`0``,>$`>1'````````C90!=$4``+@`````D(UT)@#&!!``@\`!
+M@_AD=?1IQG0$``#&A`'810``_8!I!0&#PP$X601WA(G+O@`````Y>Q1U+<=#
+M%`````#&0Q@`:<8X#```C40!%+H`````C70F`,9`'`"#P@&#P!B`^H)U\8/&
+M`8'#.`P``(/^!'7`6UY?P^L-D)"0D)"0D)"0D)"0D%575E.#[!P/MD0D/(A$
+M)!J+7"0P#[9#!3I#!'4$QD,%``^V4P6(5"0;B=V)V+D`````B<Z)SXM0%#M4
+M)#1U2FG!.`P``,9$`Q@!#[93!,9$)!L`A-)T6\9$)!L`BWPD-#F]Y$<``'4.
+M#[:%V$4``(/``SP!=CR`1"0;`8'%=`0``#A4)!MT*^O3A=)U%6G'.`P```'8
+MBU0D-(E0%,9`&`'K$(/&`8/!`04X#```@_D$=8")\@^VPFG`.`P``(U$`QRZ
+M`````,8$`@"#P@&!^@(,``!U\0^V="0;BWPD-(E\LPQIQG0$``"-E`-T10``
+MN`````#&!!``@\`!@_AD=?1IQG0$``"-E`/D10``N`````#&!!``@\`!/0`"
+M``!U\FG.=`0``(T4&8M$)#2)@N1'``"+1"1`B8+@10``QH+810``_\>"W$4`
+M``````"-C`O`10``BWPD.(L'B4$0BT<$B4$4#[9$)!J(@GI%``#'1"04````
+M`,=$)!``````QT0D#/\```")="0(BU0D-(E4)`2+?"0PB3PDZ/S___^`0P4!
+M@\0<6UY?7<.0D)"0D%93BU0D#(L"BS`/ME@KA-MT-P^V4@FY`````/;"`70*
+MZR>)T-/XJ`%U!X/!`3C9=?&`^0-V&`^VP8V$AM`!``"+`*,`````ZQ:Y````
+M``^VP8V$AM`!``"+`*,`````P>@4@^`!6U[#D(VT)@````!55U93@^P$BT0D
+M&(L0#[9Z*[T*````B?F$R71)#[9P";L`````O0H```"Y`````)")\-/XJ`%T
+M'@^V@KX+``"#X`.#P`B(1"0#B>@Z1"0#=@4/MFPD`X/#`8/!`8/"1(GX.,-U
+MRXGJ#[;"@\0$6UY?7<.-M"8`````C;PG`````%575E.#[`2+1"08BQ`/MGHK
+MO0@```")^83)=$D/MG`)NP````"]"````+D`````D(GPT_BH`70>#[:"O@L`
+M`(/@`X/`"(A$)`.)Z#I$)`-S!0^V;"0#@\,!@\$!@\)$B?@XPW7+B>H/ML*#
+MQ`1;7E]=PXVT)@````"-O"<`````4XM<)`@/M@/`Z`2)PH/B!P^V2P+VP01T
+M`X#.`@^V0P.H!'0&@<H```(`]L$(=`.`S@BH"'0&@<H```@`]L$"=`.`S@2H
+M`G0&@<H```0`#[9#%,'@&`G06\.-M"8`````@^P$BT0D"(D$).C\____@\0$
+MPXVV`````(V\)P````"+3"0$BX%8!0``)?___P"Z`````#U0`9,`=14/MH%;
+M!0``P.@$/`P/E,`/MM"-=@")T,.-M@````"-O"<`````4XG#A=)^0`^V"(3)
+M=`6`^2!U+;@`````ZQ:-M@`````/M@P8A,ET"(#Y('43C78`@\`!.=!UZ>L.
+MC;0F`````+@`````ZP6X`0```%N-=@##ZPV0D)"0D)"0D)"0D)"04XM<)`@/
+MMD,##[93`L'B"`G0P>`0#[9+`0^V$\'B"`G1"<A;PXUT)@"-O"<`````5U93
+MB<:)TXG/A<ET'KD`````#[86#[9&`8@#B%,!@\,"@\8"@\$!.?EUYUM>7\.0
+M@^P<B5PD$(ET)!2)?"08BW0D((M\)"0/MT<0NO\```!F/84`=PL/M\`/MI0&
+MN`0```^WTFG2L`````.6E`4``(N>0`H```^V0C3!X`B-A`-,"```BPB)#0``
+M``"!X?\````/MD(TP>`(C9P#1`@``(L#HP````#!X`@)R(F"H````&;'@IP`
+M`````(E\)`2)-"3H_/___XM<)!"+="04BWPD&(/$',.)]HV\)P````"#[!R)
+M7"0,B70D$(E\)!2);"08BVPD(`^V?"0DBW4`B?@\`W8P#[;8P>,#C80>,`(`
+M`,<`#````,<$)!`G``#H_/___XV$'C0"``"+,(DU`````.LPB?@/MMC!XP.-
+MA#-0`@``QP`,````QP0D$"<``.C\____C9PS5`(``(LSB34`````B?@/MLB)
+MR,'@!HT$B(V4!9`+```/MEH-@^/\B%H-B?`E```_`#T``!``=0^)V(/(`HA"
+M#>L9D(UT)@")R,'@!HT4B(G8@\@!B(05G0L``(M<)`R+="00BWPD%(ML)!B#
+MQ!S#D(VT)@````!55U93@^P<BT0D-(M4)#"+$HE4)!B+$L9`)0#&0"0%QD`G
+M!HM,)#")2"RY`````+T`````C8(``@``B40D%('"!`(``(E4)!#K%XVV````
+M`(M4)#`/MD()T_BH`74,@\$!BT0D&#I(*W+F@/D#=G$/MMG!XP.+?"04`=_'
+M!RP```#'!"00)P``Z/S___\#7"00BS.)-0````#'!R0```#'!"00)P``Z/S_
+M__^+`Z,`````P>`(@>;_````"<;'!R````#'!"00)P``Z/S___^+&XD=````
+M`.MOC;0F``````^VV<'C`XM\)!0!W\<'+````,<$)!`G``#H_/___P-<)!"+
+M,XDU`````,<')````,<$)!`G``#H_/___XL#HP````#!X`B!YO\````)QL<'
+M(````,<$)!`G``#H_/___XL;B1T`````@?X!`6F6=1>+5"0P@$H(!HG8P>@0
+M/%`/E,`/ML#K1H'^`0$``'41B=C!Z!`\4`^4P`^VP.LOB?;'!"2($P``Z/S_
+M__^#Q0&)Z8#Y!'<*N0````#IP?[__XG8P>@0/%`/E,`/ML"#Q!Q;7E]=PXUT
+M)@"-O"<`````55=64X/L#(MT)""+;"0DBT94BSAF@[Z<`````'0RB>O'!"3H
+M`P``Z/S___^%[70%@_L!=AN)/"3H_/___V:#OIP`````=`F#ZP+KU(UT)@"#
+MQ`Q;7E]=PY"-M"8`````@^P<B5PD#(ET)!")?"04B6PD&(M<)"P/MFPD)`^W
+M?"0H#[9$)#"(1"0+BU0D((M"5(LPB30DZ/S___^)PL9`).'&0"4!QD`F$K@/
+M````B>F$R74(BTPD(`^V02N(0B>)^(A"*(GY#[;%B$(I#[;'B$(JB=C!Z!"(
+M0BN)V,'H&(A"+(A:+8M,)"`/MT$D9HE"$(ER&,="(`````#'0C0`````N```
+M``"`?"0+`'4%N`````")0FR)5"0$B30DZ/S___^+7"0,BW0D$(M\)!2+;"08
+M@\0<PXUV`(V\)P````"#[!R)7"0,B70D$(E\)!2);"08BUPD+`^V;"0D#[=\
+M)"B+5"0@BT)4BS")-"3H_/___XG"QD`DX<9`)0'&0"82N`\```")Z83)=0B+
+M3"0@#[9!*XA")XGXB$(HB?D/ML6(0BD/ML>(0BJ)V,'H$(A"*XG8P>@8B$(L
+MB%HMBTPD(`^W021FB4(0B7(8QT(@`````,="-`````#'0FP`````B50D!(DT
+M).C\____BUPD#(MT)!"+?"04BVPD&(/$',-55U93@^P<BWPD,`^V1"0TB$0D
+M&P^W;"0XA?\/A.X```"+-X7V#X3D````#[9>*X7;?D.+1U0/ME`)N0````#V
+MP@%T"NLPB=#3^*@!=0>#P0$YV77Q@_D#?B&+!@70`0``C02(BP"C`````,'H
+M%(/P`8/@`>L?N0````"+!@70`0``C02(BP"C`````,'H%(/P`8/@`83`=7:`
+MOZP`````=0:`?R8`=6</MT<D@+P&N`0``/]T6<9')B5FQX><`````0`/M\4/
+MME0D&\=$)!`!````BTPD/(E,)`R)1"0(B50D!(D\).C\____QT0D!`4```")
+M/"3H_/___\9')@!F@[^<``````^4P`^VP.L%N`````"#Q!Q;7E]=PXUT)@"#
+M[!R)7"0,B70D$(E\)!2);"08BWPD(`^V;"0D#[=<)"B+1U2+,(DT).C\____
+MB<+&0"3AQD`E`<9`)A&X#P```(GIA,EU!`^V1RN(0B>(6B@/ML>(0BD/MT<D
+M9HE"$(ER&,="(`````#'0C0`````QT)L`````(E4)`2)-"3H_/___XM<)`R+
+M="00BWPD%(ML)!B#Q!S#B?:-O"<`````55=64X/L'(M\)#`/MD0D-(A$)!L/
+MMVPD.(7_#X3S````BS>%]@^$Z0````^V7BN%VWY#BT=4#[90";D`````]L(!
+M=`KK,(G0T_BH`74'@\$!.<MU\8/Y`WXABP8%T`$``(T$B(L`HP````#!Z!2#
+M\`&#X`'K'[D`````BP8%T`$``(T$B(L`HP````#!Z!2#\`&#X`&$P'5[@+^L
+M`````'4&@'\F`'5L#[=')("\!K@$``#_=%[&1R8E9L>'G`````$`#[?%#[94
+M)!O'1"0,`0```(E$)`B)5"0$B3PDZ/S____'1"0$!0```(D\).C\____QD<F
+M`&:#OYP`````=1.+AZ````"+5"0\B0*X`0```.L%N`````"#Q!Q;7E]=P^L-
+MD)"0D)"0D)"0D)"0D(/L'(E<)`R)="00B7PD%(EL)!B+?"0@#[9L)"0/MUPD
+M*`^V1"0LB$0D"XM'5(LPB30DZ/S___^)PL9`).'&0"4!QD`F$;@/````B>F$
+MR74$#[9'*XA")XA:*`^VQXA"*0^W1R1FB4(0B7(8QT(@`````,="-`````"X
+M`````(!\)`L`=06X`````(E";(E4)`2)-"3H_/___XM<)`R+="00BWPD%(ML
+M)!B#Q!S#C78`@^P<B5PD#(ET)!")?"04B6PD&(ML)"0/MG0D*`^V?"0LBT0D
+M((L8B1PDZ/S___^)PH7`=1#&A;4````!QD4F`^E_````QD`DX<9`)0&)\#P!
+M&<#WT(/``HA")HGXA,!U/X-]-`!T!`^V14V(0B</MT4<9HE"$(E:&,="(```
+M``#'0C0`````N*`\`@")0FR)5"0$B1PDZ/S____K)XUV`,9")P\/MT4<9HE"
+M$(E:&,="(`````#'0C0`````N`````#KR(M<)`R+="00BWPD%(ML)!B#Q!S#
+MD(VT)@````!55U93@^PLBVPD2(M$)$"+$(M$)$3!X`.-O!```@``C;00!`(`
+M`+L<`0``D(UT)@"#?"1$`W89B1_'!"00)P``Z/S___^+!J,`````ZQ>)]HD?
+MQP0D$"<``.C\____BP:C`````(F$'/3^__^#PP2!^S@!``!UN8M$)!")10"+
+M1"04B44$BT0D&(E%"(M$)!R)10R+1"0@B440BT0D)(E%%(M$)"B)11B#Q"Q;
+M7E]=PU575E.#["R+;"1(BT0D0(L0BT0D1,'@`XV\$``"``"-M!`$`@``NP`!
+M``"0C70F`(-\)$0#=AF)'\<$)!`G``#H_/___XL&HP````#K%XGVB1_'!"00
+M)P``Z/S___^+!J,`````B80<$/___X/#!('['`$``'6YBT0D$(E%`(M$)!2)
+M102+1"08B44(BT0D'(E%#(M$)"")11"+1"0DB444BT0D*(E%&(/$+%M>7UW#
+M55=64X/L/(M,)%2(3"03BT0D4(L`B40D&`^V^8GXP>`&C02X`T0D4(V0D`L`
+M`(A*#(M,)%")B)@+``#&0@X`B7PD!(D,).C\____C70D'(GPB?+&``"#P`&)
+MTXUL)#PYZ'7P#[9$)!.)1"04B50D"(E$)`2+5"10B10DZ/S___^)'"3H_/__
+M_XE$)`R-#+T`````B?K!X@:-%!&+1"10C1P"BT0D#(F#I`L``(M$)%"-E!"@
+M"P``BT0D*(E""(M$)"R)0@R`?"03`W8IBU0D&(V$"M`!``"+`*,`````B8.\
+M"P``C83Z@`$``(L0B14`````ZS^-%+T`````BTPD&(V$$=`!``"+"(D-````
+M`(GXP>`&`<*+1"10B8P0O`L``(M4)!B-A/J``0``BQ")%0````")^,'@!HT$
+MN`-$)%")D,`+``#V@+X+```0#X0]`0``]H"="P```G1<C70F`,8&`(/&`3GN
+M=?:-7"0<B5PD"(M,)!2)3"0$BT0D4(D$).C\____B1PDZ/S___^)^L'B!HT4
+MNHM,)%")A!&P"P``C901H`L``(M$)"B)0A2+1"0LB4(8ZQ>)^,'@!HT$N(M4
+M)%#'A`*P"P```0`"`(!\)!,#=CF-'/T`````BTPD&(V$"S`"``#'`!@```#'
+M!"00)P``Z/S___^+1"08C9P#-`(``(L3B14`````ZS>-'/T`````BU0D&(V$
+M$U`"``#'`!@```#'!"00)P``Z/S___^+3"08C9P+5`(``(L3B14`````B?C!
+MX`:-!+B+3"10]X0!O`L``````P!U"('B____W^L&@<H````@@'PD$P-V#XM,
+M)!B-A/DT`@``B1#K#8M,)!B-A/E4`@``B1"#Q#Q;7E]=PY"-M"8`````55=6
+M4X/L#(M\)""+;"0DB6PD"`^W10!FA<!Y"R4`'P``P?@(B$<EC4=0C4T4BU44
+MB5=0BU$$B5`$BU$(B5`(BU$,B5`,BU$0B5`0C;>,````BU4NB9>,````BU4R
+MB58$C5]DC4TVBU4VB5=DBU$$B5,$BU$(B5,(BU$,B5,,BU$0B5,0BU$4B5,4
+MBU$8B5,8BU$<B5,<BU$@B5,@BU$DB5,DN0H```")PNA"\?__N00```")\HGP
+MZ#3Q__^Y%````(G:B=CH)O'__V;'1S@``&;'1SH``(M$)`AF@[BR`0```0^4
+MPL'B`P^V1RB#X/<)T(A'*/:%IP````1T!F;'1S@!`/:%I`````%T)&:#3S@"
+M]H6J`````70%9H-/.@'VA:@````!=`AF@4\X``&)]O:%I````"!T%V:#3S@$
+M]H6J````('0)9H-/.@*-="8`]H6D````0'079H%/.(``]H6J````0'0(9H-/
+M.@B-=@#&1TX"]H69`````70S#[='.*@!=`R#R`AFB4<X9H-/.A`/MH66````
+M@^`?@\`!B$=./"!U"\9'3A^-M"8`````]H68````"'0&9H%/.``"]H68````
+M!'0%9H-/."#VA9@````"=`5F@T\X$/:%J````"!T#O:%K@```"!T!6:#3SA`
+M]D<X`708BX7(````BY7,````B4=$B5=(ZQ&-="8`BU5XB5=$QT=(`````(-'
+M1/^#5TC_]D5J`G09#[>%@````*@/=`YF@_@"&<"#P`2(1SSK!,9'/`+&1SW_
+M#[=5?@^WPJ@$=`G&1ST"ZQF-=@"H`G0&QD<]`>L,]L(!C78`=`3&1ST`QD<^
+M__9%:@1T';D`````#[>%L````-/XJ`%T`XA//H/!`8/Y!W7HQT0D!``"``")
+M+"3H_/___XF'F````(M$)`CV@*8````@="`/MX"L````@^`@@_@!&<"#P`*(
+MAR0!``#K#8VV`````,:')`$```"X`0```(/$#%M>7UW#C;8`````C;\`````
+M@^P<B5PD#(ET)!")?"04B6PD&(ML)""+?0"[@/___^L%@/N%=TH/ML,/MK0'
+MN`0``(GP//]T.0^VP&G`%`T```.'L`4``#EH"'4EQT0D"`@```"+5"0DB50D
+M!(D$).C\____A,!T"8GPZQ*0C70F`(/#`8#[@7:IN/____\/ML"+7"0,BW0D
+M$(M\)!2+;"08@\0<PXVV`````(V_`````%575E.#[#R+5"10BP*`>BL`#X0#
+M`P``QT0D.`````"-B``"``")3"08!00"``")1"04#[9$)#B(1"0W#[;HB>C!
+MX`:-!*B+5"10C1P0]H.^"P``$`^$I@(``(V3D`L``+@!````B>G3X`A"#HN;
+MH`L``(E<)##V0@T"#X0P`0``#[9<)#>#PP&+="10.%XK#X8;`0``C02M````
+M`(E$)"")ZL'B!HE4)!R-M"8`````#[;SB?#!X`:-!+"+3"10C3P(]H>^"P``
+M$`^$T0```(M,)"`#3"0<BU0D4`'*B50D+/>"L`L`````#@`/A*\```"+5"10
+MC80"H`L``(E$)"B)PH/"%(M$)%"-C`B@"P``B4PD)(G(@\`4QT0D"`@```")
+M5"0$B00DZ/S___^$P'1OBT0D*(/`"(M4)"2#P@C'1"0("````(E$)`2)%"3H
+M_/___X3`=$FX`0```(GQT^"+5"0L@<*0"P``"D(.B$(.B(>>"P``@WPD,`!U
+M#(N_H`L``(E\)##K%XGPP>`&C02PBU0D,(MT)%")E`:@"P``@\,!BTPD4#A9
+M*P^'`/___X-\)#``#X6W````BW0D4(DT).C\____B40D,(7`#X1'`0``B>C!
+MX`:-#*@!\8M$)#")@:`+```/MD0D-XG"P>(&C82"D`L``(U$!@B+5"0PB4(8
+M#[:!G0L``(A"!L9"!0"),L9""@#&0C0`QD(<``^V5"0W@\(!.%8K=EV)Z,'@
+M!HT$J(V<!I`+``"0C70F``^VR@^V0P[3^*@!=!>)R,'@!HT$B(MT)#"+3"10
+MB;0!H`L``(/"`8M$)%`X4"MV&>O.B>C!X`:-!*B+3"0PBU0D4(F,`J`+``")
+MZ,'@!HT$J(MT)%"-E`:0"P``#[9"#HM,)#"(00D/MG(.@'PD-P-V)XT<[0``
+M``"+1"08`=C'`#@```#'!"00)P``Z/S___\#7"04B3/K)XT<[0````"+1"08
+M`=C'`#@```#'!"00)P``Z/S___\#7"04B3.)]H-$)#@!#[9$)#>#P`&+="10
+M.$8K#X<8_?__@\0\6UY?7<.-M"8`````C;PG`````%575E.#[$R+="1@BQ[&
+M1"1`4,9$)$$%QD0D0@3&1"1#,,9$)$01QD0D1:O&1"1&`,9$)$<`QX,`0`$`
+M$R```(L&QX`$0`$`__\``(L&QX`$0`$``````#NV1`4```^%Y````(V^R`P`
+M`(VN6`4``,=$)!`!````QT0D#`@```");"0(QT0D!````@")-"3H_/___XN&
+M4`4```^VEEL%``"#Z@2-!(*(AEL%``")-"3H_/___X3`=1&+1"1`B898!0``
+MBT0D1(E%!*$``````(9;!0``@\`!HP`````/MH98!0``B(=8!0``#[:&604`
+M`(B'604```^VAEH%``"(AUH%```/MH9;!0``@\`"B(=;!0``#[:&7`4``(B'
+M7`4```^VAET%``"(AUT%```/MH9>!0``B(=>!0``#[:&7P4``(B'7P4``(G?
+MC8,``0``B40D*(N#``$``*,`````#[?0B50D2*@@=`LEW_\``(E$)$CK%HG0
+M@\@@B40D2(M4)"B)`HL"HP````"+!L>`!`$```````"+!L>`&`$```````"+
+M!L>`'`$```````#'!"20T`,`Z/S____'AW`!```8`0``BX=T`0``HP````"`
+MY/V`S`2)1"1(QX=P`0``&`$``(M$)$B)AW0!``#'AW`!```H`0``QX=T`0``
+M?W\``,>'<`$``"0!``"+AW0!``"C`````&:X```-_S\``(E$)$C'AW`!```D
+M`0``BT0D2(F'=`$``,>'<`$``#P!``#'AW0!`````'H`QX=P`0``I`$``,>'
+M=`$``'V_[__'AW`!``"X`0``BX=T`0``HP`````E__\```T``/H`B40D2,>'
+M<`$``+@!``"+1"1(B8=T`0``QX><````_P```,>'D`(``$0!``#'AY0"```&
+M$``(QX>0`@``M`$``,>'E`(``%]P``#'AY`"```P````BX>4`@``HP`````P
+MY(#,,XE$)$B)AY0"``"`?BL`#X1Z`@``QT0D+`````"-AU`"``")1"08C9=4
+M`@``B50D%`^V1"0LB$0D,SP##X81`0``#[;HC13M`````(E4)"2-A!<P`@``
+MB40D(,<`"````,<$)!`G``#H_/___XM4)"2-G!<T`@``BP.C`````(E$)$@-
+M``"``(D#C898!0``B40D"(EL)`2)-"3H_/___XEL)`2)-"3H_/___XM$)"#'
+M`$0!``#'!"00)P``Z/S____'`P80``B+5"0@QP*T`0``QP0D$"<``.C\____
+MQP-?<```BT0D(,<`"````,<$)!`G``#H_/___\=$)$C_5(``QP/_5```QT0D
+M"`$```");"0$B30DZ/S___^+1"0DC90'@`$``(L"HP`````E___^_XD"QT0D
+M2`4!R`"+5"0DC807A`$``,<`!0'(`.D.`0``#[9L)#.-!.T`````B40D.(M4
+M)!@!PHE4)!S'`@@```#'!"00)P``Z/S___^+7"0X`UPD%(L#HP````")1"1(
+M#0``@`")`XV&6`4``(E$)`B);"0$B30DZ/S___^);"0$B30DZ/S___^+1"0<
+MQP!$`0``QP0D$"<``.C\____QP,&$``(BU0D',<"M`$``,<$)!`G``#H_/__
+M_\<#7W```(M$)!S'``@```#'!"00)P``Z/S____'1"1(_U2``,<#_U0``,=$
+M)`@!````B6PD!(DT).C\____BT0D.(V4.(`!``"+`J,`````)?___O^)`L=$
+M)$@%`<@`BU0D.(V4.H0!``")5"0TQP(%`<@`QP0DH(8!`.C\____B6PD!(DT
+M).C\____@T0D+`$/MD0D,X/``3A&*P^'HOW__XDT).C\____BX<$`0``HP``
+M``"#R`*)1"1(B8<$`0``BU0D*(L"HP`````E\/___0T-```"B40D2(D"BP*C
+M`````(N&(`H``(F'"`$``(N&)`H``(F'#`$``(N&1`H``(F'$`$``(N&2`H`
+M`(F'%`$``,>'(`$````````/MX:4"P``)?\/```-```!`(F'(`$``(N&C`H`
+M`(F')`$``(N&D`H``(F'*`$``(N&K`H``,<`_P\``,>'-`$````````/MX:6
+M"P``)?\/```-```!`(F'-`$``(N&L`H``(F'.`$``(N&M`H``(F'/`$``,>'
+M2`$```````#'1"1(``$``,>'3`$````!``"+AP0!``"C`````(/(68F'!`$`
+M`,=$)$C[_P`,QX=4`0``^_\`#,>'7`$``/__``"X`````,>$AM`%````````
+MQT2&7`````"#P`&#^!!UY6;'AI`+``#_#V;'AI(+``#_#\9&-`&P`8/$3%M>
+M7UW#C70F`%575E.#[!R)1"04B=>+*(DL).C\____B<.%P'4,QH>U`````>G`
+M````B2PDZ/S___^)QH7`=1C&A[4````!B5PD!(DL).C\____Z9H```"-0SR)
+M1"08QD,DX<9#)0'&0R8##[=''&:)0Q#&0V@/BU0D%(L"B4,8QT,@``(``(M6
+M"(E3-+@`````C;0F`````,8$$`"#P`$]``(``'7RB7-0QT-LH#P"`,=$)`0`
+M````BT0D&(D$).C\____BT,@B40D#(M&#(M6$(E$)`2)5"0(BU0D&(D4).C\
+M____B5PD!(DL).C\____@\0<6UY?7</K#9"0D)"0D)"0D)"0D)!55U93@^Q,
+MBT0D8(LH#[9`"83`#X17!```#[;8QT0D.`````#VPP%U&;H`````B?:#P@$/
+MMLJ)3"0XB=C3^*@!=.Z+1"0XP>`&BW0D.(T$L(T4*(N"L`L``*D```(`=!`-
+M```$`"7___W_B8*P"P``BT0D.,'@!HM\)#B-!+B+A`6P"P``J0``!``/A`8#
+M``"+A40%``")1"1(.>AU"HV5R`P``(E4)$B+1"0XP>`&BTPD.(T$B`'H#[:0
+MNPL``(E4)"@/MI"Z"P``B50D)`^VD+D+``")5"0@#[:0N`L``(E4)!P/MI"W
+M"P``B50D&`^VD+8+``")5"04#[:0M0L``(E4)!`/MH"T"P``B40D#`^V12F)
+M1"0(B4PD!,<$)'@)``#H_/___\=$)#P`````BW0D.,'F`HET)$2+?"0XP><&
+MB7PD0(M4)#R+3"1(#[:$"C@%```\_P^$H@````^VP&G`%`T``(G#`YFP!0``
+MBW0D1(M\)$"-A#Z@"P``C7P%%+@(````_(G>B<'SI@^7P@^2P#C"=6@/MD,'
+MB40D(`^V0P:)1"0<#[9#!8E$)!@/MD,$B40D%`^V0P.)1"00#[9#`HE$)`P/
+MMD,!B40D"`^V`XE$)`3'!"3("0``Z/S___^+?"1@QD<%_XE\)`2)+"3H_/__
+M_^ET`@``C70F`(-$)#P!@WPD/`(/A3;___^)+"3H_/___XG#A<`/A$X"``"+
+M1"0XP>`&BU0D.(T$D/:$!;$+```$=`2`2S4"BT0D.,'@!HM,)#B-!(CVA`6R
+M"P``!'0$@$LU$(M$)#C!X`:+="0XC02P]H0%L0L```AT!(!+-02+1"0XP>`&
+MBWPD.(T$N/:$!;(+```(=`2`2S4@BT0D.,'@!HM4)#B-!)#VA`6Q"P```G0$
+M@$LU`8M$)#C!X`:+3"0XC02(]H0%L@L```)T!(!+-0C&0S``B=^+1"0XP>`&
+MBW0D.(V$L*`+``"-1`4`BU`4B1.+0!B)0P2+1"1@B4,(B00DZ/S___^(@XL`
+M``"+5"1@@$(<`8!]*P!T,+D`````N@````")]HMT)&`/MD8)T_BH`70.#[;"
+MB$P#0(!#,@&#P@&#P0$X32MWW(M$)&"+2#"-4R")4#"+1"1@@\`LB4,@B4LD
+MB1&+5"1@@$(T`<=$)!``````#[:#BP```(E$)`R)?"0(B50D!(N%``H``(D$
+M).C\____Z=H```"I```(``^$SP```(DL).C\____B<.%P`^$O0```,9`)P;&
+M0"8%9L>`E```````QD`D!L9`)0#'0$0```4`QT!(`````(V(H````(M$)#C!
+MX`:+="0XC82PH`L``(U$!0"+4!2)DZ````"+0!B)002+@Z````")@Y@```"+
+M002)@YP```"+?"1@B7LLB3PDZ/S___^(@[8```!F@TLX$(D\).C\____/`EV
+M!F:!2S@``HM$)&#&0`H!BU`\B5@\BT0D8(/`.(D#B5,$B1J)7"0$B2PDZ/S_
+M__^)]H/$3%M>7UW#D(VT)@````!55U93@^PLBWPD0(M<)$2%VW05#[9#!83`
+M=`T\_P^%E`<``.D<`0``N@````"-=@`/MH0Z/@4``#S_=`T/ML!KP%R-G`=(
+M`0``@\(!@_H$==^^``````^VA#X^!0``//]T,0^VP&O`7(V<!T@!``#VA`=.
+M`0```G02QT0D!`````")'"3H_/___^L(B1PDZ/S___^#Q@&#_@1UNP^V1R9F
+M.8?@"0``#X4+!P``A=MU?X!_-0`/A?T&``#&1S4!B?:+A)^X`@``A<!T5HM0
+M<(72="['0'``````QX2?N`(```````#'1"0(_____XE$)`2+0'B)!"3_TNLG
+MC;8`````BU!TA=)T&L=`=`````#'A)^X`@```````(M`>(D$)/_2@\,!@_M`
+M#X2*!@``ZY'&0P7_B5PD!(D\).C\____Z7,&``"Z`````(VT)@`````/MH0Z
+M/@4``#S_#X3W````#[;(:\%<C9P'2`$``(E<)"2-A`=``0``@'@-_P^$U0``
+M`(!X$@`/A"L&``"^`````&O97(VL'X`!``")+"3H_/___XG!C00[BY"$`0``
+MB8B$`0``B2F)402)"H!Y)O]T?X"YM0`````/A.D%```/MEDD#[;3B="#X`:#
+M^`9U*?;"`71'B4PD#`^V04V)1"0(BT$PB40D!(M$)"2)!"3H_/___^FO!0``
+M@_@$#X6F!0``]L,!#X2=!0``B4PD!(D\).C\____Z8P%``")3"0$B3PDZ/S_
+M___I>P4``(UT)@"#Q@&)\CB4'U(!```/AF4%``#I1/___X/"`8/Z!`^%[?[_
+M_\=$)!P`````@'\U`)`/A9(```"[`````)"-="8`BY2?N`(```^VA#NX!```
+MA=)T9(M*<(7)=%V#>F``=5<\_W0M#[;P:<8H`0```X=X!0``]D`G!'08@'@E
+M`'42B70D"(E4)`2)/"3H_/___^LFQX2?N`(```````#'0G``````QT0D"/__
+M__^)5"0$BT)XB00D_]&#PP&#^T!U@<9'-0'IKP0``(M,)!P/MH0Y/@4``#S_
+M#X2+!```#[;0:\)<C9P'2`$``(E<)"B`O`=2`0````^$;`0``,9$)",`B<6-
+MA`>``0``B40D$(UV`(M4)!")%"3H_/___XG#C40]`(N0A`$``(F8A`$``(M,
+M)!")"XE3!(D:@'LF_P^%#00```^W0QR)1"04#[:4.+@$``!FB50D&HNTA[@"
+M``#V0R@$=&N%]G1G@WYP`'1A@WY@`'5;@&,H^_9#)P2-=@!T%0^WPHE$)`B)
+M="0$B3PDZ/S____K.8M6<(M,)!3'A(^X`@```````,=&<`````#'0R``````
+MQT0D"/____^)="0$BT9XB00D_]*0C70F`/9#)P0/A&8!``#&@[0`````@*0O
+M4`$``.?V0R@!#X3]````@&,H_HM#((7`=%6`>R4`=3#V0R<$="H/MD<IP>`&
+M`T0D%(E$)`B+AT0%``")1"0$QP0D!P```.C\____Z=P```")1"0(BX=$!0``
+MB40D!,<$)`$```#H_/___^F]````A?9T9(M6<(72C70F`'19@'LE`'4@]D,G
+M!'0:#[=$)!J)1"0(B70D!(D\).C\____Z8@```"+1"04QX2'N`(```````#'
+M1G``````QT,@`````,=$)`C_____B70D!(M&>(D$)/_2ZU6`>R4`=4_V0R<$
+M=$D/MD<IP>`&`T0D%(E$)`B+AT0%``")1"0$QP0D`@```.C\____ZR*)]HM#
+M((7`=!F+4'2%TG02QT!T`````(M#((M`>(D$)/_2]D,H`@^$-@(``(M#((E$
+M)`B+AT0%``")1"0$QP0D!@```.C\____@&,H_>GD`0``BT,@A<`/A-D!``"#
+M>'0`D`^$S@$``,9#)P'&0R8`B5PD",=$)`0&````BU0D*(D4).C\____@WLP
+M`'02BU,(BT,,B4($B1"+0S"`:#`!@'M/`'0:B3PDZ/S____'!"0!````Z/S_
+M__^`>T\`=>:+D^0```"%TG0;QT0D"`$````/MH/9````B40D!(D4).C\____
+MBU,PA=)T&,=$)`@!````#[9#38E$)`2)%"3H_/___XMS((7V#X3V````]D,H
+M!'5=B3PDZ/S____'1"0(`0```(M#((E$)`2)/"3H_/___XM3(`^V0@*)1"0(
+M#[9"`8E$)`3'!"3$`0``Z/S___^+0R")1"0(BX=$!0``B40D!,<$)`$```#H
+M_/___^LY#[9&`HE$)`@/MD8!B40D!,<$),0!``#H_/___XM#((E$)`B+AT0%
+M``")1"0$QP0D`0```.C\____BU9TA=)T'@^W0QS'A(>X`@```````,=&=```
+M``"+1GB)!"3_TO9#*`)T(8M#((E$)`B+AT0%``")1"0$QP0D!@```.C\____
+M@&,H_<=#(`````#'1F``````BU,TA=)T#`^V0TW'1((\`````(L3BT,$B4($
+MB1"`K"]2`0```8E<)`2)/"3H_/____9#*`)T)HM#((E$)`B+AT0%``")1"0$
+MQP0D!@```.C\____@&,H_9"-="8`@$0D(P$/MDPD(SB,+U(!```/AZG[__^#
+M1"0<`8-\)!P$#X51^___N`$```"#Q"Q;7E]=PXVV`````(V_`````%=64X/L
+M$(MT)""+/HDT).C\____A,!T&`^V7RN$VW0Q#[96";D`````]L(!=!SK(<9&
+M!?^)="0$B3PDZ/S____K7(G0T_BH`74'@\$!.-EU\8D\).C\____B<&%P'0_
+MBU8\B48\C48XB0&)402)"H!&"@&)<2S&020%QD$E`,9!30_'1"0,`0```,=$
+M)`@!````B4PD!(DT).C\____@\006UY?PXUT)@"-O"<`````@^PLB5PD'(ET
+M)"")?"0DB6PD*(MT)#2+7E0/MD8F/"0/AVH'```/ML#_)(6`"0``#[=&,@^W
+MT/;"!'0,9L=&,@$`QD8F`>M#9H/X('4,9L=&,@@`QD8F$>LQA-)Y%?9&+0-T
+M#R1_@\@(9HE&,L9&)@WK&/;""'0&QD8F!^L-]L8"=`C&1BL`QD8F'HET)`2+
+M1"0PB00DZ/S____I\`8``,=$)`P!````QT0D"`(```#'1"0$`0```(DT).C\
+M____Z<L&``#'1"0,`0```,=$)`@`````QT0D!`$```")-"3H_/___^FF!@``
+MQT0D#`$```#'1"0(`0```,=$)`0!````B30DZ/S____I@08``,=$)`P!````
+MQT0D"&````#'1"0$`0```(DT).C\____Z5P&```/MD8LQT0D$`$```")1"0,
+MQT0D"&````#'1"0$`0```(DT).C\____Z2\&``#'1"00`0```,=$)`P```$$
+MQT0D""$```#'1"0$`0```(DT).C\____Z0(&``"+0QB!8"C___?_QT0D$`$`
+M``#'1"0,`0```,=$)`@"````QT0D!`````")-"3H_/___^G+!0``QT0D$`$`
+M``#'1"0,`````,=$)`@"````QT0D!`````")-"3H_/___\<$)!`G``#H_/__
+M_^F2!0``BT,8@6`H___W_\=$)!`!````QT0D#`$```#'1"0(`@```,=$)`0`
+M````B30DZ/S____I6P4``,=$)!`!````QT0D#`````#'1"0(`@```,=$)`0`
+M````B30DZ/S____'!"00)P``Z/S____I(@4``,=$)`P!````QT0D"`(```#'
+M1"0$`````(DT).C\____Z?T$``#'1"0,`0```,=$)`@`````QT0D!`````")
+M-"3H_/___^G8!```QT0D#`$```#'1"0(`0```,=$)`0`````B30DZ/S____I
+MLP0``,=$)!`!````QT0D#/_____'1"0(`0```,=$)`0`````B30DZ/S____I
+MA@0``,=$)`P!````QT0D"`````#'1"0$`````(DT).C\____Z6$$```/MD8K
+MBWR&/(E?+(EW-`^V1BN(1TW&1R8#QD<E`(!/)`6`0PH!BU,\C4,XB7L\B0>)
+M5P2).L<$)(`:!@#H_/___XM4)#"`>BL`="F^`````/9#"0%T#NL<#[9#"8GQ
+MT_BH`745@\8!B?"+5"0P.$(K=^;K!;X`````BU,8BT(HJ0``"`!T"B7___?_
+MB4(HZV2)\0^VP8TLQ0````"[N`L``(GP/`-V'(M4)#"+`@6``0```>B+`*,`
+M````P>@3@^`!ZQR+3"0PBP$%@`$``(U$!0"+`*,`````P>@3@^`!A,!U$<<$
+M).@#``#H_/___X/K`76M9L>'E```````B7PD!(M$)#")!"3H_/___^E/`P``
+MQP0D0`T#`.C\____QT0D#`````#'1"0((````,=$)`0!````B30DZ/S____'
+M!"00)P``Z/S____I$@,``,=$)`P`````QT0D"`$```#'1"0$`````(DT).C\
+M____QP0D$"<``.C\____Z>$"``"+0QB!8"C___?_QT0D$`````#'1"0,____
+M_\=$)`@!````QT0D!`````")-"3H_/___\<$)!`G``#H_/___^F>`@``QT0D
+M#`````#'1"0(`````,=$)`0`````B30DZ/S____'!"00)P``Z/S____I;0(`
+M`(ET)`2+5"0PB10DZ/S____I6`(``(ET)`2+3"0PB0PDZ/S____I0P(``,=$
+M)!`!````QT0D#/````#'1"0(FP```,=$)`0!````B30DZ/S____I%@(``,=$
+M)!`!````QT0D#*#66BO'1"0(X`,``,=$)`0!````B30DZ/S____IZ0$``,=$
+M)!`!````QT0D#`#@`P#'1"0(I`,``,=$)`0!````B30DZ/S____IO`$``,=$
+M)!`!````QT0D#.2H!@''1"0(Q`,``,=$)`0!````B30DZ/S____ICP$``,=$
+M)`P!````QT0D"$@#``#'1"0$`0```(DT).C\____Z6H!``#'!"1`#0,`Z/S_
+M___'1"0,`0```,=$)`@@````QT0D!`$```")-"3H_/___\<$)!`G``#H_/__
+M_^DM`0``QT0D$`$```#'1"0,`````,=$)`@A````QT0D!`$```")-"3H_/__
+M_^D``0``QT0D#`$```#'1"0(8````,=$)`0!````B30DZ/S____IVP````^V
+M1BS'1"00`0```(E$)`S'1"0(8````,=$)`0!````B30DZ/S____IK@```,9#
+M!0"+1E2)!"3H_/___^F:````QT0D#`$```#'1"0(`0```,=$)`0`````B30D
+MZ/S____'!"00)P``Z/S____K;(M#&(%@*/__]__'1"00`0```,=$)`S_____
+MQT0D"`$```#'1"0$`````(DT).C\____QP0D$"<``.C\____ZRS'1"0,`0``
+M`,=$)`@!````QT0D!`````")-"3H_/___\<$)!`G``#H_/___[@!````BUPD
+M'(MT)""+?"0DBVPD*(/$+,.-M"8`````@^P<B5PD$(ET)!2)?"08BUPD((M\
+M)"0/MU<09H'ZA0!W?@^WP@^VA!BX!```//]T;V:#^G]W&0^VP&G`*`$```.#
+M>`4``(M`+`^V2`3K5I`/MT<09CV!`'<@#[?`#[:$&+@$``!IP!0-```#@[`%
+M``"+0`@/MD@$ZRL/MT<0#[:$&+@$``!IP+`````#@Y0%``"+0%0/MD@$ZPJ0
+MC70F`+G_____N/____]F@7\0A0!W#`^W1Q`/MH08N`0``(NSE`4```^VT8#Y
+M_W04@+P:/@4``/]T"CS_=`:`?Q0&=2:#?U``=`^-1U")1"0$B1PDZ/S___^)
+M?"0$B1PDZ/S____IZ@````^VP&G`L`````'&#[9&)CP:='8\&G<*/!$/A9L`
+M``#K&SP;C;0F`````'1C/!P/A88```"-M@````#K>HN30`H``('"3`@```^V
+M1C3!X`@!PHL*B0T`````#[;)BY-`"@``@<)$"```#[9&-,'@"`'"BP*C````
+M`,'@"`G!B8Z4````QD8F&NLQQD8F&^LKBX-`"@``!4P(```/ME8TP>((`="+
+M`*,`````@^#WB$8LQD8F'.L$QD8F'8-_4`!T#XU'4(E$)`2)'"3H_/___XE\
+M)`2)'"3H_/___XET)`2)'"3H_/___XUV`(M<)!"+="04BWPD&(/$',.#[`R+
+M1"00B40D!(L`B00DZ/S___^#Q`S#C;0F`````(/L+(E<)!R)="0@B7PD)(EL
+M)"B+7"0TBW,L#[=3'+@`````BTPD,("\"K@$``#_#X0["0``#[9#)CP)#X0O
+M!0``/`EW2SP%#X28````/`60=QX\`P^$M@```#P$C70F``^%[@@``.GD````
+MD(UT)@`\!P^$D00``#P'C;8`````#X<4!```Z9D"``"0C70F`#P6#X2``P``
+M/!:-M@````!W(SP4#X28!0``/!2-="8`#X?J`@``/`H/A98(``")]ND0!0``
+M/!H/A#<"```\_Y`/A'`%```\%P^%=@@``(GVZ48#``"+1"0P#[9H*XGJA-(/
+MA*$````/ME8)OP````#VP@$/A((```#IB@```(GVBT88@6`H___^_XM#+,=$
+M)`P`````QT0D"`$```")7"0$B00DZ/S____'!"0%````Z/S___^X`0```.DA
+M"```QT0D#`````#'1"0(`````(E<)`2)-"3H_/___\<$)%##``#H_/___[@!
+M````Z>\'``")T(GYT_BH`742@\<!B?B)Z3C(=>OK!;\`````#[93)(G0@^`&
+M@_@&=0GVP@$/A=4```"+5AB+0BBI```!`'0-)?___O^)0BCINP```(GZ#[;"
+MP>`#B40D&+T0)P``D(M,)#"+$8GX/`-V&8M,)!B-A!&``0``BP"C`````"4`
+M``$`ZQ>+3"08C801@`$``(L`HP`````E```!`(7`=#*)^#P#=A:+3"08C801
+M@`$``,<````!`.D?!P``BTPD&(V$$8`!``#'`````0#I"0<``,<$).@#``#H
+M_/___X/M`0^%>?___\9#)P+&0R;_B5PD!(M$)#")!"3H_/___[@!````Z><&
+M``#V1@8!=#:)7"0$B30DZ/S___^$P'4FO?H```")7"0$B30DZ/S___^$P'41
+MQP0DZ`,``.C\____@^T!==^)^H#Z`W8<BTPD,(L!!8`!```/MM*-%-"+`J,`
+M````B0+K'(M4)#"+`@6``0``B?D/MM&-%-"+`J,`````B0*+0RR)VN@BY?__
+MQP0D($X``.C\____N`$```#I3`8``(E4)`3'!"0`"@``Z/S___^+<RR+/HD\
+M).C\____B<&%P'41QH.U`````;@!````Z1@&``#&0"3AQD`E`<9`)A</MT,<
+M9HE!$,9!:`^+!HE!&,=!(`````#'030`````QT%LH#P"`(E,)`2)/"3H_/__
+M_[@!````Z=`%``")5"0$QP0DV@$``.C\____BW,LBSZ)/"3H_/___XG!A<!U
+M$<:#M0````&X`0```.F<!0``QD`DX<9`)0'&0"88#[=#'&:)01"+!HE!&,=!
+M(`````#'030`````QT%LH#P"`(E,)`2)/"3H_/___[@!````Z5@%``")VHGP
+MZ`_D__^X`0```.E%!0``BSZ)/"3H_/___XG"#[9+/(7`=1'&@[4````!N`$`
+M``#I(`4``,9`).'&0"4!QD`F!8A()P^W0QQFB4(0BP:)0AC'0B``````QT(T
+M`````,=";*`\`@"(2S^)5"0$B3PDZ/S___^X`0```.G6!```BSZ)/"3H_/__
+M_XG"#[9+/H7`=1'&@[4````!N`$```#IL00``,9`).'&0"4!QD`F!(A()P^W
+M0QQFB4(0BP:)0AC'0B``````QT(T`````,=";*`\`@"(2T&)5"0$B3PDZ/S_
+M__^X`0```.EG!```BSZ)/"3H_/___XG!A<!U$<:#M0````&X`0```.E&!```
+MQD`DX<9`)0'&0"8&#[=#'&:)01"+!HE!&,=!(`````#'030`````QT%LH#P"
+M`(E,)`2)/"3H_/___[@!````Z0($``")]HL^B3PDZ/S___^)P87`=1'&@[4`
+M```!N`$```#IWP,``,9`).'&0"4!QD`F#`^W0QQFB4$0BP:)01C'02``````
+MQT$T`````,=!;*`\`@")3"0$B3PDZ/S___^X`0```.F;`P``BSZ)/"3H_/__
+M_XG!A<!U$<:#M0````&X`0```.EZ`P``QD`DX<9`)0'&0"86QD`H`0^W0QQF
+MB4$0QD%H#XL&B4$8QT$@`````,=!-`````#'06R@/`(`B4PD!(D\).C\____
+MN`$```#I+@,``,9#)O]FQX.4```````/ME,DB="#X`:#^`9U!?;"`74>@WLT
+M`'48B30DD(UT)@#H_/___XB#M@```)"-="8`@'LG`G4:BT,LB5PD"(E$)`2+
+M1"0PB00DZ/S___^-=@#V1@@"=1J[`````(U^.(!^"@`/A6`!``#I?`(``(UV
+M`(M6*`^V6BH/MLL/MD(?@^@!.<%]-HU#`8A"*H!"*P'&0B8`#[=",H/@_H/(
+M"&:)0C*)5"0$BU0D,(D4).C\____N`$```#I90(``#G!=!:[`````(U^.(!^
+M"@!U-(UV`.DO`@``QD(F``^W0C*#X/:`S`)FB4(RB50D!(M,)#")#"3H_/__
+M_[@!````Z1\"``")/"3H_/___XG!BT8\B4X\B3F)002)"(!Y)O\/A(X```"`
+MN;4`````#X35`0``#[99)`^VTXG0@^`&@_@&=2KVP@%T40^V04V+43")3"0,
+MB40D"(E4)`2)-"3H_/___[@!````Z;8!``"#^`0/A9$!``#VPP$/A(@!``")
+M3"0$BT0D,(D$).C\____N`$```#IB@$``(E,)`2+5"0PB10DZ/S___^X`0``
+M`.EP`0``QH&U`````(/#`3A>"@^&00$``.DY____B3PDZ/S___^)P8M&/(E.
+M/(DYB4$$B0B`>2;_#X2?````@'DE``^%C@```("YM0`````/A`0!```/MEDD
+M#[;3B="#X`:#^`9U*O;"`711#[9!38M1,(E,)`R)1"0(B50D!(DT).C\____
+MN`$```#IY0```(/X!`^%P````/;#`0^$MP```(E,)`2+3"0PB0PDZ/S___^X
+M`0```.FY````B4PD!(M$)#")!"3H_/___[@!````Z9\```#&@;4`````@\,!
+M#[9&"CC8#X<Q____.,-U3H3`=$J[`````(U^.(D\).C\____B<*+1CR)5CR)
+M.HE"!(D0#[9")3PB=`0\#747QT0D!`H```")%"3H_/___[@!````ZS^#PP$X
+M7@IWOL9&!?^)="0$BU0D,(D4).C\____N`$```#K'+@!````ZQ6%[8UV``^$
+M`?G__^D>^?__D(UT)@"+7"0<BW0D((M\)"2+;"0H@\0LPXVV`````(V_````
+M`(/L+(E<)!R)="0@B7PD)(EL)"B+?"0PBVPD-`^W51!F@?J%``^'O@````^W
+MP@^VC`>X!```@/G_#X2J````9H/Z?W<<#[;!BY=X!0``:<`H`0``BT00+`^V
+M0`3K.HUV`&:!^H$`=QD/ML&+E[`%``!IP!0-``"+1!`(#[9`!.L7#[;!BY>4
+M!0``:<"P````BT005`^V0`0\_W1-#[;`#[:<!SX%``"`^_]T%8#Y_W00#[95
+M%(#Z!G57C;0F`````(#[_W0C@/G_=!X/ML%IP"@!``")Q@.W>`4``,9&)P+&
+M1B;_Z5@"``"#?5``=`^-15")1"0$B3PDZ/S___^);"0$B3PDZ/S____I7P(`
+M`(GV#[;!:<`H`0``B<8#MW@%``"+332$T@^$M`````^V128\!@^$S0```#P,
+M#X3%````#[>6E````(U"`6:)AI0```!F@_H)=A>`?B8&=!'&1B<"QD8F_X!F
+M*/[IT@$``,<$).@#``#H_/___P^V5B2)T(/@!H/X!G4^]L(!=#G'1"00````
+M`,=$)`P"````#[9&38E$)`B+1C")1"0$#[;#:\!<C80'2`$``(D$).C\____
+MZ:<!``#&1B8#B70D!(D\).C\____Z9(!``"0C70F``^V128\`74-QD8F!(UT
+M)@#I2P$``#P"=0S&1B8%C78`Z3L!```\`P^%O0```(G(@'XF!74K9H%Y!,@W
+M=2,/MT8<B40D!,<$)#0*``#H_/___\9&)@;I!@$``(VV`````(E$)`2)-"3H
+M_/___XU&9+HH````Z.>___^$P'4XC490NA0```#HUK___X3`=2>-AHP```"Z
+M"````.C"O___A,!U$XM&1`M&2'0+QD8F%XGVZ:L```!F@[Z4````'781QD8G
+M`L9&)O^`9BC^Z9````#'!"3H`P``Z/S____&1B8:9H.&E`````'K=CP7=0;&
+M1B85ZVP\&'4*QD8F%HUT)@#K7CP$=0;&1B8'ZU0\!8GV=0;&1B8(ZT@\!G4&
+MQD8F">L^/`QU!L9&)@KK-#P6B?9U!L9&)A3K*#P.=22#?5``=`^-15")1"0$
+MB3PDZ/S___^);"0$B3PDZ/S____K+I"#?5``=`^-15")1"0$B3PDZ/S___^)
+M;"0$B3PDZ/S___^)="0$B3PDZ/S___^+7"0<BW0D((M\)"2+;"0H@\0LP^L-
+MD)"0D)"0D)"0D)"0D(/L+(E<)!R)="0@B7PD)(EL)"B+;"0TBW4L#[=%'+H`
+M````BTPD,("\`;@$``#_#X3K`@``#[9%)CP4#X34````/!1W.SP-#X0$`0``
+M/`V0=Q`\!0^%NP(``(VV`````.M3/`X/A/L````\#XUT)@`/A9\"``#I_```
+M`)"-="8`/!L/A)\````\&XVV`````'<0/!AT.3P9#X5W`@``B?;K1SP<=%T\
+M_P^%9P(``(GVZ<8```#'1"0$`````(DL).C\____N@$```#I40(``,=$)`0!
+M````B2PDZ/S___^Z`0```.DW`@``QT0D!`$```")+"3H_/___[H!````Z1T"
+M``")+"3H_/___[H!````Z0L"``")+"3H_/___[H!````Z?D!``#V13D$=!*)
+M+"3H_/___[H!````Z>$!``")+"3H_/___[H!````Z<\!``")+"3H_/___[H!
+M````B?;INP$``(DL).C\____N@$```#IJ0$``,9%)O^`?@H`#X3I````NP``
+M``"-?CB-=@")/"3H_/___XG"BT8\B58\B3J)0@2)$(!Z)O\/A)\```"`>B4`
+M#X6<````@+JU``````^$30$```^V6B0/MLN)R(/@!H/X!G4J]L$!=%*)5"0,
+M#[9"38E$)`B+0C")1"0$B30DZ/S___^Z`0```.D=`0``@_@$#X4)`0``]L,!
+MD`^$_P```(E4)`2+1"0PB00DZ/S___^Z`0```.GP````B50D!(M,)#")#"3H
+M_/___[H!````Z=8```"-M@````#&@K4`````@\,!#[9&"CC8#X<J____.,,/
+MA8P````/MD4E/")T%#P-=!"_`````(UN.(!^"@!U'.MPQT0D!`H```")+"3H
+M_/___[H!````Z7P```")+"3H_/___XG#BT8\B5X\B2N)0P2)&`^V0R4\(G0$
+M/`UU*8E<)`3'!"3P`0``Z/S____'1"0$"@```(D<).C\____N@$```#K,HGV
+M@\<!B?@X1@IWJL9&!?^)="0$BTPD,(D,).C\____N@$```#K"[H!````C;8`
+M````B="+7"0<BW0D((M\)"2+;"0H@\0LPXUV`(V\)P````!55U93@^PLBUPD
+M1`^W4Q"Y_____[C_____9H'ZA0!W>P^WPHMT)$`/MHP&N`0``+C_____@/G_
+M=&)F@_I_=QT/ML&+?"1`BY=X!0``:<`H`0``BT00+`^V0`3K/V:!^H$`=QT/
+MML&+="1`BY:P!0``:<`4#0``BT00"`^V0`3K&P^VP8M\)$"+EY0%``!IP+``
+M``"+1!!4#[9`!`^VP(M4)$`/MK0"/@4``&O&7(V$`D@!``")1"0D#[;!:<`H
+M`0```X)X!0``B40D*(M+-`^V$<'B&`^V00'!X!`)P@^V00,)P@^V00+!X`@)
+MPHU9"(G0P>@#@_@0=@6X$````(T$P8E$)!PYPP^'D`$``,=$)"``````:_9<
+MB70D&`-T)$")="04B1PDZ/S___^)Q8US!+\4"@``N00```#\\Z8/E\(/DL`X
+MP@^%1`$``(/]$`^'.P$``(-$)"`!@WPD(`%U*HM,)"C'@1P!```!````B:D@
+M`0``BP.)@:@```"+0P2)@:P```#I!0$``(MT)$")-"3H_/___XG&A<`/A/P`
+M``#&0"<&QD`F!6;'@)0``````,9`)`;&0"4`QT!$```%`,=`2`````#'@!P!
+M```!````B:@@`0``BU0D*('"H````(M\)"B+AZ````")AJ````"+0@2)AJ0`
+M``"+AZ````")AI@```"+0@2)AIP```"+`XF&J````(M#!(F&K````(M$)"2)
+M1BR)!"3H_/___XB&M@```&:#3C@0BU0D)(D4).C\____/`EV!F:!3C@``HM,
+M)!2`@5(!```!BY&$`0``B;&$`0``BWPD0(M,)!B-A`^``0``B0:)5@2),HET
+M)`2)/"3H_/___XVV`````(/#"#M<)!P/AH?^__^#Q"Q;7E]=PXUT)@"-O"<`
+M````55=64X'L+`(```^VA"1(`@``BY0D0`(``(M2"(E4)!R+"HE,)""+E"1`
+M`@``#[92,(A4)">+C"1``@``@\$HB4PD*(N4)$`"```Y2B@/A*L"``"`?"0G
+M``^$H`(```^VP(E$)!2+3"0HB0PDZ/S___^->/B-1"0LB40D$(M4)!2)5"0,
+MQT0D"`$```"+3"0<B4PD!(N$)$0"``")!"3H_/___X!\)"P`#X3^````O0``
+M``"-EZ````")5"08C78`B>D/MO''1"0("````(M$)!B)1"0$B?/!XP2-A!R8
+M````B00DZ/S___^$P`^$GP```(V4'(P````/MD((@^`/B(>V````#[=/.&:!
+MX=_]B<B#R!!FB4<X#[9"",#H!#P)=0F)R(/(,&:)1SB)\,'@!`^VA`24````
+MP.@$/`IU!F:!3S@``HM,)"B+402-1PB)002)3PB)5PR)`O9'*`)T0(!G*/V+
+M1R"%P'0UB40D"(M4)""+@D0%``")1"0$QP0D!@```.C\____ZQ60C70F`(/%
+M`8GI.$PD+'81Z2#___^)Z#A$)"P/AS<!``")?"0(QT0D!`8```"+5"0<B10D
+MZ/S___^`?T\`="2-M@````"+3"0@B0PDZ/S____'!"0!````Z/S___^`?T\`
+M=>*+E^0```"%TG0;QT0D"`$````/MH?9````B40D!(D4).C\____BU<PA=)T
+M&,=$)`@!````#[9'38E$)`2)%"3H_/___XM'((7`='W'0&``````]D<H!'4G
+MBT0D((D$).C\____QT0D"`$```"+1R")1"0$BU0D((D4).C\____BT<@B40D
+M"(M,)""+@40%``")1"0$QP0D!@```.C\____BT<@B40D"(M4)""+@D0%``")
+M1"0$QP0D`0```.C\____QT<@`````(L7BT<$B4($B1"+3"0<@&D*`8N$)$`"
+M``"`:#`!B7PD!(M4)"")%"3H_/___XM$)"B+C"1``@``.4$H=`N`;"0G`0^%
+M9_W__X'$+`(``%M>7UW#C;0F`````%575E.!["P"``"+O"1$`@``BX0D0`(`
+M`(L`B40D)`^VM"1,`@``C5PD+(E<)!")="0,QT0D"`$```"+E"1``@``B50D
+M!(D\).C\____B70D"(E\)`2+M"1(`@``B30DZ/S___^+;BB#[0B)\X/#*(U%
+M"#G8="L/MD4E/`UT%#PB=3#K#@^V124\#70&/"*)]G4@QD4F!<9%)P3&1"0J
+M`>L%QD0D*@"`?"0L`'45Z2`"``"+;0B#[0B-10@YV'7%D.O?QD0D*P"+A"1`
+M`@``@\`XB40D((N4)$@"``"+<BB#[@B-1@@YPP^$`P(```^V1"0KP>`$C;P$
+MF````(UT)@#'1"0("````(E\)`2-AJ````")!"3H_/___X3`#X6<`0``BW8(
+M@^X(C48(.=@/A+T!``#KRXNT)$`"``"`1@H!QD$F!<:!M`````#&02<$9L>!
+ME```````QH&6`````,=!1```!0#'04@`````#[9T)"N)\,'@!(V4!(P````/
+MMD($B$$D#[9"!8A!)8N$)$`"``")02P/MD((@^`/B(&V````#[=Y.&:!Y]_]
+MB?B#R!!FB4$X#[9"",#H!#P)=0F)^(/(,&:)03B)\,'@!`^VA`24````P.@$
+M/`IU!F:!23@``HN4)$@"``")43")\L'B!`^VA!22````B$%-C904C````(M"
+M#(F!H````(M2$(F1I````(F!F````(F1G````(NT)$@"``"`1C`!BY0D0`(`
+M`(M"/(E*/(MT)""),8E!!(D(BX0D2`(``(M0+(U!"(NT)$@"``")1BR)60B)
+M40R)`@^V422)T(/@!L9$)"H`@_@&=4?VP@%T+8E,)`P/MD%-B40D"(N$)$@"
+M``")1"0$BY0D0`(``(D4).C\____QD0D*@#K%8E,)`2+="0DB30DZ/S____&
+M1"0J`(!$)"L!#[9$)"LX1"0L#X<#_O__@'PD*@!T+<=$)`0*````B2PDZ/S_
+M___K&Y"-="8`BU0D)(D4).C\____B<&%P`^%+_[__X'$+`(``%M>7UW#ZPV0
+MD)"0D)"0D)"0D)"055=64X'L+`(``(N$)$`"``"+,`^V4!R(5"0F@\`LB40D
+M*(N,)$`"```Y02P/A-`#``"$T@^$R`,``(M$)"B)!"3H_/___XUHX,=$)!``
+M````QT0D#`````#'1"0(`````(N4)$`"``")5"0$BXPD1`(``(D,).C\____
+MB$0D)X3`#X1K`P``OP````"[`````(E<)"#'1"00`````(E<)`S'1"0(`0``
+M`(N$)$`"``")1"0$BY0D1`(``(D4).C\____#[;`P>`$@\!D/0`"```/A^D!
+M``"-3"0LB4PD$(E<)`S'1"0(`0```(N$)$`"``")1"0$BY0D1`(``(D4).C\
+M____QT0D"`@```");"0$C8PDB````(D,).C\____A,`/A)@!``"+1"0HBU`$
+MC44@BTPD*(E!!(E-((E5)(D"#[9$)"Z(13&-A"2`````B40D!(N$)$`"``")
+M!"3H_/___SS_=!(/ML!IP!0-```#AK`%``")10R)^H32=%4/MD0D+]'H@^`!
+MP>`$#[95-8/B[PG"B%4U#[9$)"_!Z`.#X`'!X`6#XM\)PHA5-0^V1"0OP>@"
+M@^`!P>`#@^+W"<*(534/MD0D,HB%BP```.F_````#[9$)"Z(13&+C"1``@``
+MB4T(#[9$)#*(A8L````/MT0D,(E%.`^W1"1\9HF%B`````^V1"1^B(6*````
+MC4UXC50D+(/"0(M$)&R)17B+0@2)002+0@B)00B+0@R)00R-34B-5"0L@\(0
+MBT0D/(E%2(M"!(E!!(M""(E!"(M"#(E!#(U-6(U4)"R#PB"+1"1,B458BT($
+MB4$$BT((B4$(BT(,B4$,BT(0B4$0BT(4B4$4BT0D9(E%<(M$)&B)172+1"0@
+MB40D#(EL)`B+E"1$`@``B50D!(N,)$`"``")#"3H_/___^D8`0``B?:#QP&#
+MPP&)^#I$)"</A"`!``#INOW__XD\).C\____C5CXB5PD",=$)`0&````BY0D
+M0`(``(D4).C\____@'M/`'0:B30DZ/S____'!"0!````Z/S___^`>T\`=>:+
+M0R"%P'1MQT!@`````/9#*`1U'XDT).C\____QT0D"`$```"+0R")1"0$B30D
+MZ/S___^+0R")1"0(BX9$!0``B40D!,<$)`$```#H_/___XM#((E$)`B+AD0%
+M``")1"0$QP0D!@```.C\____QT,@`````(L3BT,$B4($B1"+C"1``@``@&D*
+M`8!M,`&)7"0$B30DZ/S___\Y?2@/A1C___^+A"1``@``@&@<`8EL)`2)-"3H
+M_/___XM,)"B+E"1``@``.4HL=!R`;"0F`705Z4C\__^-?2@Y?2@/A=G^__^)
+M]NN]@<0L`@``6UY?7<.-=@!55U93@>PL`@``BZPD1`(``(M%`(E$)!R+E"1`
+M`@``B50D!(DL).C\____QT0D$`````#'1"0,`````,=$)`@`````B6PD!(N<
+M)$`"``")'"3H_/___XA$)".$P`^$O@,``,9$)"(`QT0D)`````"0QT0D$```
+M``"+1"0DB40D#,=$)`@!````B6PD!(N4)$`"``")%"3H_/___P^VP,'@!(/`
+M9#T``@``#X=8`P``C5PD+(E<)!"+1"0DB40D#,=$)`@!````B6PD!(N4)$`"
+M``")%"3H_/___XV<)(@```")7"0$B2PDZ/S___\\_P^%$@,``(M$)!R)!"3H
+M_/___XG'A<`/A"\#``"`11P!QD`P`(N$)(@```")!XN$)(P```")1P2-A"2`
+M````B40D!(DL).C\____//]T%@^VP&G`%`T``(M4)!P#@K`%``")1PP/MD0D
+M+HA',0^V1"0OT>B#X`'!X`0/ME<U@^+O"<*(5S4/MD0D+\'H`X/@`<'@!8/B
+MWPG"B%<U#[9$)"_!Z`*#X`'!X`.#XO<)PHA7-8EO"`^V1"0RB(>+````BT0D
+M-(E'0(M$)#B)1T0/MD0D,XA',@^W1"0PB4<X#[=$)'QFB8>(````#[9$)'Z(
+MAXH```"-3WB-5"0L@\)`BT0D;(E'>(M"!(E!!(M""(E!"(M"#(E!#(U/2(U4
+M)"R#PA"+1"0\B4=(BT($B4$$BT((B4$(BT(,B4$,C4]8C50D+(/"((M$)$R)
+M1UB+0@2)002+0@B)00B+0@R)00R+0A")01"+0A2)012+1"1DB4=PBT0D:(E'
+M=(M-,(U7((E5,(U%+(E'((E/)(D1@'PD+``/A((!``!FQT0D*@``C5TXB5PD
+M&(U'*(E$)!2-M@````"+5"0<B10DZ/S___^)P87`#X2$`0``@$4*`<9`)@7&
+M@+0`````QD`G!,=`1```!0#'0$@`````9L>`E```````#[=T)"J)\,'@!(V4
+M!(P````/MD($B$$D#[9"!8A!)8EI+(EY,`^V0@:(04T/MD((@^`/B(&V````
+M#[=9.&:!X]_]B=B#R!!FB4$X#[9"",#H!#P)=0J)V(/(,&:)03B0B?#!X`0/
+MMH0$E````,#H!#P*=0QF@4DX``*-M@````")\,'@!(V4!(P```"+0@R)@:``
+M``"+4A")D:0```")@9@```")D9P```"`1S`!BT4\B4T\BUPD&(D9B4$$B0B+
+M5RR-00B)1RR+7"04B5D(B5$,B0(/ME$DB="#X`:#^`9U+_;"`70:B4PD#`^V
+M04V)1"0(B7PD!(DL).C\____ZQ")3"0$BT0D'(D$).C\____9H-$)"H!#[9$
+M)"QF.T0D*@^'F?[__X!$)"(!@T0D)`$/ME0D(SA4)"(/A5#\__^`?0H`=13&
+M107_B6PD!(M<)!R)'"3H_/___X'$+`(``%M>7UW#C70F`(V\)P````!55U93
+M@^PLBVPD0(M\)$3'1"00`````,=$)`P`````QT0D"`````")?"0$B2PDZ/S_
+M__^$P'0XNP````"#Z`$/MO"-1"0KB40D#(E<)`B)?"0$B2PDZ/S___^`?"0K
+M_@^%I0```(/#`8U&`3G#==,/MD<T@^@!B$<TA,!T=8LWQD<T`(M?+(/K((U7
+M+(U#(#G0='>#>PP`=4CK"Y"-="8`@WL,`'4[QD<T`8E\)`2)+"3H_/___\=$
+M)!``````#[:#BP```(E$)`R)7"0(B7PD!(N&``H``(D$).C\____ZRF+6R"#
+MZR"-0R`YT'6RB?;K&(E\)`2)+"3H_/___XE\)`2)+"3H_/___X/$+%M>7UW#
+MC;0F`````(V\)P````!55U93@^P,BW0D((M\)"2++KL*````B7PD!(DT).C\
+M____A,!U$<<$).@#``#H_/___X/K`77?#[9=*X3;="`/ME8)N0````#VP@%T
+M"^L0D(G0T_BH`74'@\$!.-EU\8L7BT<$B4($B1"`;@H!B7PD!(DL).C\____
+M]D8(`G1!BT8HA<!U$XDL).C\____A<`/A%H!``")1BB)*(EP5,9`*@#&0"L`
+MQD`F`&:#2#($B40D!(DL).C\____Z3`!``"+1BB%P`^$RP```(/`6(E$)`2+
+M112)!"3H_/___XM&*(E$)`2)+"3H_/___XU^.#E^.`^$EP```(D\).C\____
+MB<.+0""%P'1MQT!@`````/9#*`1U'XDL).C\____QT0D"`$```"+0R")1"0$
+MB2PDZ/S___^+0R")1"0(BX5$!0``B40D!,<$)`$```#H_/___XM#((E$)`B+
+MA40%``")1"0$QP0D!@```.C\____QT,@`````(!N"@&)7"0$B2PDZ/S___\Y
+M?C@/A6G____'1B@`````@'X*`'03C48XB00DZ/S___^)P8!N"@'K"HDL).C\
+M____B<&%R70SBU8\B4X\C48XB0&)402)"H!&"@&)<2S&020%QD$E`,9!)P;&
+M028#B4PD!(DL).C\____@\0,6UY?7<.0C;0F`````(/L+(E<)!R)="0@B7PD
+M)(EL)"B+?"0PBUPD-`^W4Q!F@?J%`'=Z#[?"#[:,![@$``"`^?]T:F:#^G]W
+M&0^VP8N7>`4``&G`*`$``(M$$"P/MD`$ZSMF@?J!`'<9#[;!BY>P!0``:<`4
+M#0``BT00"`^V0`3K&P^VP8N7E`4``&G`L````(M$$%0/MD`$C70F``^VT3S_
+M=`EF@?K_`'4HB?:#>U``=`^-0U")1"0$B3PDZ/S___^)7"0$B3PDZ/S____I
+M.@$```^VP`^VC`<^!0``#[?":<`H`0``B<8#MW@%``"`>Q0`#X2F````:\%<
+MC:P'0`$```^V11*)1"00#[9%$8E$)`P/MD,GB40D"`^V0R:)1"0$QP0D5`H`
+M`.C\____BQ:+1@2)0@2)$(!M$@&)="0$B3PDZ/S___^)7"0$B3PDZ/S___\/
+MMG<KB?"$P`^$J@````^V71&Y`````/;#`74-ZQP/MLJ)V-/XJ`%T%HE,)`2)
+M/"3H_/___^E^````N@````"#P@&)\#C"==;K;FO!7(VL!T@!``"`>R8!=3;'
+M!"00)P``Z/S___^)7"0$B3PDZ/S____'1"0,`0```,=$)`@`````B70D!(DL
+M).C\____ZRC'!"10PP``Z/S___^)7"0$B3PDZ/S___^)="0$B2PDZ/S___^-
+M="8`BUPD'(MT)""+?"0DBVPD*(/$+,.-M@````"-OP````!55U93@^P<BW0D
+M,(ML)#0/MD0D.(A$)!</MD0D/(A$)!:+!HE$)!B`?@H`='2[`````(U^.(D\
+M).C\____B<*+1CR)5CR).HE"!(D0.6HP=0\/MD0D%SA"370-D(UT)@"#PP$X
+M7@IWS3A>"G0T@'PD%E!U+<9")P;&0B8%QD(D!\9")0"):C")<BS&@I8`````
+MB50D!(M$)!B)!"3H_/___X/$'%M>7UW#C;0F`````(/L+(E<)!R)="0@B7PD
+M)(EL)"B+;"0PBT0D-`^W4!!F@?J%``^'A@````^WP@^VA"BX!```//]T=V:#
+M^G]W&`^VP&G`*`$```.%>`4``(M`+`^V4`3K7HM4)#0/MT(09CV!`'<@#[?`
+M#[:$*+@$``!IP!0-```#A;`%``"+0`@/ME`$ZS"+3"0T#[=!$`^VA"BX!```
+M:<"P`````X64!0``BT!4#[90!.L+C;8`````NO____^Y_____XM$)#1F@7@0
+MA0!W$(M,)#0/MT$0#[:,*+@$```/ML(/MH0H/@4``&O`7(V\!4@!```/ML%I
+MP+````"+M90%```!QHM$)#2`>"@"#X6(````#[9`+"7P````@_@@=`6#^!!U
+M=8M,)#0/ME$LB="#X`^#^`%U,8G0)?````#'1"00`0```(E$)`S'1"0(`@``
+M`,=$)`0`````B30DZ/S____I`0H``)`/MD8KBU2&/(M,)#0/MD$L)?````"#
+M^"`/E,"#P`B(@K8```"+0C1F@6`R__[IS@D``(M4)#0/MD(4A,!T0XG#@WI0
+M`'01B="#P%")1"0$B2PDZ/S___^+3"0TB4PD!(DL).C\____@/L"#X60"0``
+MB70D!(DL).C\____Z7\)``#'AI@`````````#[9&)CPD#X<)"0``#[;`_R2%
+M'`H``(M'&/9`*@@/A#()``")]NFW!0``BY5`"@``@<),"```#[9&-,'@"`'"
+MBP*C`````(/X!7<%B$8?ZP3&1A\%@'\+`'0-QD8F`,9'"P#IK@@``,9&)@+I
+MI0@``(N50`H``('"3`@```^V1C3!X`@!PHL"HP`````/ML!FB48@BY5`"@``
+M@<)$"```#[9&-,'@"`'"BP*C`````(G"P>H(9HE6(L'@"&8)1B!F@?I`074)
+MQD8F&>E&"```9H%^(A67#Y3`@^@!@^#?@\`DB$8FZ2P(``"+E4`*``"!PD0(
+M```/MD8TP>`(`<*+`J,`````B$8=BY5`"@``@<),"```#[9&-,'@"`'"BP*C
+M`````*@(=`;&1AX,ZQJH!'0&QD8>"^L0@^`"@_@!&<#WT(/@"HA&'@^V1BL\
+M`1G`@^`"@\`4B$8FZ;<'``"+A4`*```%3`@```^V5C3!X@@!T(L`HP````"#
+MR`B(1BS&1B8%Z8T'``#&1B8`#[=&,F8E]_V#R`)FB48RBT0D-(-X4`!T#X/`
+M4(E$)`2)+"3H_/___XM4)#2)5"0$B2PDZ/S____&1P7_B7PD!(DL).C\____
+MZ9P'``#&1B8$Z3,'```/MD8K@\`!B$8K.D8?<U?&1B86BTPD-(-Y4`!T$8G(
+M@\!0B40D!(DL).C\____BT0D-(E$)`2)+"3H_/___\=&6("$'@#'1F``````
+MB79DC498BU44B40D!(D4).C\____Z2T'``#&1BL`QD8F%\<$)""A!P#H_/__
+M_^FT!@``QD8F%.FK!@``QD8F"(VT)@````#IFP8``,9&)A3ID@8``,9&+@#H
+M_/___XF&B````,9&)A7I>@8``(N50`H``('"3`@```^V1C3!X`@!PHL:B1T`
+M````#[;;BY5`"@``@<)$"```#[9&-,'@"`'"BP*C`````.C\____B8:,````
+M@^,/@_L#=0G&1B8*Z2(&``"+AH@````%0`T#`#F&C````'D7#[9&+CP*=P_&
+M1B85@\`!B$8NZ?@%```/MD8K@WR&/``/A*<!``#'1"04`````(!_"@!T/L9$
+M)!H`C5\XB1PDZ/S___^)1"04#[9&*XM4)!0Y5(8\=!R+0P2)4P2)&HE"!(D0
+M@$0D&@$/MDPD&CA/"G?*@&\*`8M4)!2+0B"%P`^$+`$``,=`8`````#V0B@$
+M=3N)+"3H_/___XM,)!2+033&@*P````!BT$@QT0D"`$```")1"0$B2PDZ/S_
+M__^+5"04BT(TQH"L`````(M,)!2+02"+E40%``")1"0(B50D!,<$)`$```#H
+M_/___XM4)!2+0B"+2'"%R70P#[="',>$A;@"````````BT(@QT!P`````(M"
+M((M0>,=$)`C_____B40D!(D4)/_1BTPD%(M!((7`="N+4'2%TG0D#[=!',>$
+MA;@"````````BT$@QT!T`````(M!((M`>(D$)/_2BU0D%(M"(`^V4`(/MD`!
+MB50D"(E$)`3'!"3$`0``Z/S___^+3"04BT$@BY5$!0``B40D"(E4)`3'!"0&
+M````Z/S___^+1"04QT`@``````^V1BO'1(8\`````(M4)!2)5"0$B2PDZ/S_
+M___&1B8)Z3D$``"+E4`*``"!PDP(```/MD8TP>`(`<*+"HD-``````^VR8N5
+M0`H``('"1`@```^V1C3!X`@!PHL"HP````#!X`@)R(E&.(!^)@IT!ZD```$`
+M=`G&1B8+Z=\#``#&1B8,#[9&*X-\ACP`=$Z`?PH`#X0F!```QD0D&P"-7SB)
+M'"3H_/___XG"#[9&*SE4ACQU"H!O"@'K+(UT)@"+0P2)4P2)&HE"!(D0@$0D
+M&P$/MDPD&SA/"G8,Z\2)+"3H_/___XG"A=(/A-`#```/MD8KB52&/`^V1B^(
+M@K8```#I60,``(DL).C\____QP0D`0```.C\____@^L!@_O_=`F+1QCV0"H(
+M=-O&1B8)Z2L#``"+E4`*``"!PDP(```/MD8TP>`(`<*+"HD-``````^VR8N5
+M0`H``('"1`@```^V1C3!X`@!PHL"HP`````/ML#!X`@)R"7_#P``/1,!```/
+ME,(](P$```^4P832=1.$R74//3,!``!U0HUV`.GR`@``QD8F&(32D(UT)@!T
+M"<9&+PCII0(``(3)C78`=`G&1B\)Z94"```],P$```^%B@(``,9&+PKI@0(`
+M``^V3BH/MM$/MD8?@^@!.<)]$XU!`8A&*H!&*P'&1B8'Z5P"``#&1BL`QD8F
+M'NE/`@``QD8F`^E&`@``QD8F(HGVZ3L"``#&1B8CZ3("``#&1B8#Z2D"``"+
+ME4`*``"!PDP(```/MD8TP>`(`<*+"HD-`````(N50`H``('"1`@```^V1C3!
+MX`@!PHL2B14`````B=#!X`@/MLD)R&8]`Q$/A9H```")T,'H"&8]15-T"F8]
+M0`,/A84```!FQT8@`Q%FB48B9CU%4W4<@+ZE`````G03QH:E`````L>&J```
+M`!\```#K(F:!?B)``W4:@+ZE`````W01QH:E`````\>&J`````_X`P#&AJP`
+M```!B30DZ/S____&AJP`````BP:+@$0%``#'1"0$`````(D$).C\____QD8F
+M`^E!`0``QD8F(<:&I0````#I,0$``(N50`H``('"3`@```^V1C3!X`@!PHL"
+MHP````"+E4`*``"!PD0(```/MD8TP>`(`<*+`J,`````QD8F'^GP````QD8F
+M(.GG````BY5`"@``@<),"```#[9&-,'@"`'"BP*C`````(N50`H``('"1`@`
+M``^V1C3!X`@!PHL"HP`````/MDXK#[9&'XU1`8A6*P^VR0^VP(/H`3G!#YS`
+M@^@!@^#G@\`?B$8FZ8(```"+E4`*``"!PDP(```/MD8TP>`(`<*+"HD-````
+M``^VR8N50`H``('"1`@```^V1C3!X`@!PHL"HP````#!X`@)P8F.E````,9&
+M)AKK-<9&)AOK+XN%0`H```5,"```#[96-,'B"`'0BP"C`````(/@]XA&+,9&
+M)ASK",9&)AV-="8`BT0D-(-X4`!T#X/`4(E$)`2)+"3H_/___XM4)#2)5"0$
+MB2PDZ/S___^)="0$B2PDZ/S____K*<9&)ACI&_W__XDL).C\____QP0D`0``
+M`.C\____NSY"#P#I9?S__XGVBUPD'(MT)""+?"0DBVPD*(/$+,.-M@````"-
+MOP````"#[%R)7"1,B70D4(E\)%2);"18BVPD8(M\)&0/MU<09H'ZA0`/A[X`
+M```/M\(/MHP%N`0``(#Y_P^$J@```&:#^G]W'`^VP8N5>`4``&G`*`$``(M$
+M$"P/MD`$ZSJ-=@!F@?J!`'<9#[;!BY6P!0``:<`4#0``BT00"`^V0`3K%P^V
+MP8N5E`4``&G`L````(M$$%0/MD`$//]T30^VP`^VE`4^!0``@/K_=!6`^?]T
+M$`^V7Q2`^P9U5XVT)@````"`^O]T(X#Y_W0>#[;!:<`H`0``B<8#M7@%``#&
+M1B<"QD8F_^FX!P``@W]0`'0/C4=0B40D!(DL).C\____B7PD!(DL).C\____
+MZ<('``")]@^VP6G`*`$``(G&`[5X!0``#[>&E````&:)1"0V9CVK#7<%@/L"
+M=3J#?U``=`^-1U")1"0$B2PDZ/S___^)?"0$B2PDZ/S____&1B;_QD8G`HET
+M)`2)+"3H_/___^E>!P``QD0D/0"`^R!U)8M/.`^V`8/@?SQQ=@T/MDD!@^$/
+MB$PD/>L+#[9)`H/A#XA,)#T/MM*)5"0P:\)<C80%2`$``(E$)#@/MD<D/!H/
+MA`<&```\&G<?/!)T43P5C70F``^$F`8``(3`#X2E!0``B?;INP8``#PE#X3@
+M`@``/"60=Q,\&P^%I@8``(VV`````.EU!0``/)X/A,T#```\H)`/A8H&``#I
+M8@8``(3;C78`#X6#`@``BT\T@'\E`(UV`'1AA<ET2X!Y`8!U18!Y`@!U/P^V
+M00,\/'<W#[;8C590N`````#&!!`@@\`!@_@4=?2#^Q-V!;L4````C590C4$$
+MB5PD"(E$)`2)%"3H_/___V;'AI0``````,9&)AGI#08``,9&)ACV009`=1$/
+MM@&#X!^#^`T/A6,!``#K"P^V`8/@'X/X#74)QD8E#8UV`.L$QD8E(@^V1B6)
+M1"0$QP0D!`(``.C\____@W]0`'0/C4=0B40D!(DL).C\____B7PD!(DL).C\
+M____:T0D,%R`O`52`0````^$P@4``+X`````B<.-O`6``0``B3PDZ/S___^-
+M%"N+BH0!``")@H0!``").(E(!(D!#[9`)3PB=`0\#74.@\8!B?(XE!U2`0``
+M=\AK1"0P7`^VA`52`0``B?$XR`^%904``(3`#X1=!0``O@````!FQT0D/@``
+MQT0D0`````!K7"0P7(V\'8`!``")/"3H_/___XG!C00KBY"$`0``B8B$`0``
+MB3F)402)"@^V024\(G0$/`UU%`^W01QF.T0D/G()9HE$)#Z)3"1`@\8!B?`X
+MA!U2`0``=[*#?"1```^$Y`0``(M4)$"`>B;_#X36!```QD(F_XE4)`2)+"3H
+M_/___^G!!```@_@!=1'&1B4!QD8F_XUT)@#I>P0``/9!!0%T!F:!3C@`!(M?
+M-(7;=%N-5F2X`````,8$$`"#P`&#^"AU](V6C````+``Q@00`(/``8/X"'7T
+MC4YDC5,(BT,(B49DBT($B4$$BT((B4$(BT(,B4$,BT(0B4$0BT(4B4$4BT,@
+MB8:,````@[X<`0````^%``0``,9&)ASI]P,```^W1"0V@\`!9HF&E````,<$
+M)!`G``#H_/___\9&)@7ITP,``(M/-(3;#X60````#[91!L'B"`^V007!X!`)
+MP@^V00<)P@^V003!X!@)PHF6L`````^V$<'B&`^V00,)P@^V00+!X`@)P@^V
+M00'!X!`)T(E&1,=&2`````"#OK``````=1UF@X:4`````<<$)!`G``#H_/__
+M_\9&)AOI50,``(/X_W4/9H%..``$QD8F&^E!`P``QD8F#>DX`P``@/L@=3.`
+M?"0]!G0'@'PD/0)U)0^W1"0V@\`!9HF&E````,<$)!`G``#H_/___\9&)@7I
+M`0,``)"#?U``=`^-1U")1"0$B2PDZ/S___^)?"0$B2PDZ/S___^)="0(BTPD
+M.(E,)`2)+"3H_/___^GV`@``BT<TB40D1(3;#X4?`0``#[90"L'B"`^V0`G!
+MX!`)PHM,)$0/MD$+"<(/MD$(P>`8"<*)EK`````/MD$#B<*X`````(E$)"B)
+M5"0L#[9!`HG"N`````#!X@B+3"0H"<&+7"0L"=.+1"1$#[8`B40D(,=$)"0`
+M````BT0D((G"N`````#!XA@)P0G3BT0D1`^V0`&)1"08QT0D'`````"+1"08
+MB<*X`````,'B$`G!"=.+1"1$#[90!L'B"`^V0`6)1"08P>`0"<*+1"1$#[9`
+M!PG"BT0D1`^V0`2)1"08P>`8"<()RHE61(E>2(M4)$3V0@P!=`5F@TXZ!(.^
+ML`````!U'6:#AI0````!QP0D$"<``.C\____QD8F&^FF`0``9H-..`'&1B8-
+MZ9@!``"`^R!U,X!\)#T&=`>`?"0]`G4E#[=$)#:#P`%FB8:4````QP0D$"<`
+M`.C\____QD8F&^EA`0``D(-_4`!T#XU'4(E$)`2)+"3H_/___XE\)`2)+"3H
+M_/___XET)`B+3"0XB4PD!(DL).C\____Z58!``#&1B84Z1T!``"`^R!U.(!\
+M)#T&C78`=`>`?"0]`G4G#[=$)#:#P`%FB8:4````QP0D$"<``.C\____QD8F
+M%.GC````C78`QD8F&^G7````A-N0C70F`'5<BT<T9H-..`)F@TXZ`6:!3CB$
+M`(!X`P!U!8`X%G<=9H.&E`````''!"00)P``Z/S____&1B8-Z9,```#V0`8$
+M=`=F@TXZ`NL%9H-F.OV+1U")1AC'1U``````ZSJ`^R!U,(!\)#T&=`B`?"0]
+M`I!U)@^W1"0V@\`!9HF&E````,<$)!`G``#H_/___\9&)@7K/6:#9CCYQD8F
+M#NLRA-MU!6:#3CH#QD8F#^LCA-N0=0R)?"0$B2PDZ/S___^#OAP!```!&<"#
+MX!.#P`6(1B:#?U``=`^-1U")1"0$B2PDZ/S___^)?"0$B2PDZ/S___^)="0$
+MB2PDZ/S___^-=@"+7"1,BW0D4(M\)%2+;"18@\1<PY"0D)"0D)"0D)"0D(/A
+M!\'A"(#-((M`!"WD/```#[;2P>((`=")"`^W`&:C``````^VP,.0C;0F````
+M`(/A!\'A"(I,)`2`S1"+0`0MY#P```^VTL'B"`'0B0C#55=64X/L"(G'QD0D
+M`@#&1"0#`+W_____QT0D!``````/MD0D!(A$)`&#1"0$`;@!````B<8/MDPD
+M!-/FB?&[`````+C`X>0`N@````#W\3GX=QV)^BG"B=`YZG,3#[94)`&(5"0"
+MB%PD`XG%C70F`(/#`0'Q@_L0=<F#?"0$"'6?#[9$)`/!X`,*1"0"#[;`@\0(
+M6UY?7<.0C;0F`````(/L#(E<)`2)="0(BUPD$`^V="04QP0D`````+D'````
+MB?*)V.@7____#[:#)0L``(D$)+D#````B?*)V.C__O__BUPD!(MT)`B#Q`S#
+MC78`4XG3#[;1N0,```#HL/[__SC8#Y3`#[;`6\.-M@````!3BUPD"(7;="^Z
+M`````(GV#[:$&CH%```/ML@\_W01#[?!:<"P`````X.4!0``ZPV#P@&#^@1U
+MV+@`````6\.05E.#[`2+1"00BYA(!0``A=MU`HG#O@````#'!"0`````N0<`
+M``")\HG8Z&'^___'!"1$````N0(```")\HG8Z$S^___'!"30````N0````")
+M\HG8Z#?^___'!"0`````N00```")\HG8Z"+^__^#Q@&#_@)UI+B@A@$`Z##^
+M__^(@R4+```/ML")!"2Y`P```+H`````B=CH\_W__X/$!%M>PXVV`````(V\
+M)P````"#[#R)7"0LB70D,(E\)#2);"0XBU0D0`^V@J4````\`@^%Z@```(N*
+MJ````(E,)!1FQT0D&@``O0```"K'1"0<`````+L`````O@````"_!````+H!
+M````B=")V=/@A40D%'4<C4L&T^)F"50D&@E4)!RX%0```(GQT^`)Q>L)D(GX
+MB?'3X`G%@\,!@\8%@\<#@_L%=;V+1"0<B40D#,=$)`BH`P``QT0D!`$```"+
+M5"1`B10DZ/S___^);"0,QT0D",0#``#'1"0$`0```(M,)$")#"3H_/___P^W
+M1"0:BU0D0`N"J````(E$)`S'1"0(H`,``,=$)`0!````B10DZ/S____I_0``
+M`(VV`````#P##X7O````BTPD0(N)J````(E,)"AFQT0D(@``O0```"K'1"0D
+M`````+L`````O@````"_!````(VT)@````"Z`0```(G0B=G3X(5$)"AU'XU+
+M!M/B9@E4)"()5"0DN!4```")\=/@"<7K#(UT)@")^(GQT^`)Q8/#`8/&!8/'
+M`X/[!'6ZBT0D)(E$)`S'1"0(J`,``,=$)`0!````BU0D0(D4).C\____B6PD
+M#,=$)`C$`P``QT0D!`$```"+3"1`B0PDZ/S___\/MT0D(HM4)$`+@J@```#W
+MT(E$)`S'1"0(H`,``,=$)`0!````B10DZ/S___^+7"0LBW0D,(M\)#2+;"0X
+M@\0\PY"-="8`@^P,BU0D$`^V3"04@'PD&`!T#[C^____T\`A@J@```#K#;@!
+M````T^`)@J@```")%"3H_/___X/$#,.0C70F`(/L',=$)!`!````#[=$)"3!
+MX`B#P`^)1"0,QT0D")H```#'1"0$`0```(M$)"")!"3H_/___X/$',.-M@``
+M``"#[`R+5"00#[9,)!2`?"08`'00N/[____3P&8A@I````#K#K@!````T^!F
+M"8*0````#[>"D````(E$)`2)%"3H_/___X/$#,.0C;0F`````(/L+(E<)!R)
+M="0@B7PD)(EL)"B+="0PBT0D-`^V5"0XB%0D&P^VF)@````/MF@"BU!HA=)T
+M&@^V1"0;B40D"(GI#[;!B40D!(D4).C\____B30DZ/S___^`^P=W2@^VP_\D
+MA;`*``"_^P```(UT)@#K-;\S````ZRZ_.P```(GVZR6_<P```.L>OWL```")
+M]NL5O[,```#K#K^[````B?;K!;_S````B7PD!(DT).C\____#[9$)!N)1"0(
+MC42=``^VP(E$)`2)-"3H_/___XM<)!R+="0@BWPD)(ML)"B#Q"S#C;8`````
+MC;PG`````%=64X/L$(G'NP`````/MO*Y`@```(GRB?CHLOG__Z@(=`ZX````
+M`.LCC;0F`````,<$)`$```#H_/___X/#`8'[$"<``'7)N/\```"#Q!!;7E_#
+MC;8`````C;PG`````(/L#(D<)(ET)`2)?"0(B<:)SP^VVHG:Z(3___^%P'4P
+MB?@/MM")V8GPZ(+Z__^%P'0>N0$```")VHGPZ##Y__^+5"00B`*X`````.L(
+MC78`N/____^+'"2+="0$BWPD"(/$#,.-M@````"-OP````"#[!R)7"00B70D
+M%(E\)!B)Q@^V^0^VVHD\)+D!````B=KH"OG__\<$)$````"Y`@```(G:B?#H
+M]?C__XG:B?#H[/[__X7`=4Z#?"0@`'0U]\<!````=!F)V;I`````B?#HV_G_
+M_X7`="WK,I"-="8`B=FZ&````(GPZ,+Y__^%P'04ZQF)V;HH````B?#HKOG_
+M_X7`=0>X_P```.L%N`````"+7"00BW0D%(M\)!B#Q!S#C;0F`````(V\)P``
+M``!55U93@^P<B<>+;"0TB=.)SH3)#X0/`0``#[;:B5PD&,<$)&0```"Y`@``
+M`(G:B?CH._C__XM4)!B)^.@P_O__A<!U$+D#````BU0D&(GXZ.SW__^)\`^V
+MR,<$)`$```"+5"08B?CHU?[__[[_____A,`/A:@!``"^`````(7M#XZ;`0``
+MNP````"-1?^)1"04BT0D,`-$)!2)1"00BW0D%#G>=3O'!"1`````N0(```"+
+M5"08B?CHM/?__XM$)!")!"2Y6````(M4)!B)^.C]_?__A<!T0>E$`0``C70F
+M`,<$)$0```"Y`@```(M4)!B)^.AY]___BT0D,`'8B00DN5````"+5"08B?CH
+MP/W__X7`#X7_````@\,!.>L/A/0```#I=?___[B@A@$`C78`Z%OW__\/MML/
+MML")!"2Y`P```(G:B?CH)/?__XG:B?CH&_W__X7`="</MH<E"P``B00DN0,`
+M``")VHGXZ/_V__^^_____^FE````D(UT)@")V;I@````B?CH\O?__X7`=!"^
+M`````(7M?F*0C70F`.L?#[:')0L``(D$)+D#````B=J)^.BV]O__OO_____K
+M7[X`````QP0D1````+D"````B=J)^.B5]O__BT0D,`'PB00DN8````")VHGX
+MZ-[\__^%P'4'@\8!.>YUR0^VAR4+``")!"2Y`P```(G:B?CH6_;__^L)B=Z-
+MM"8`````B?"#Q!Q;7E]=PXVV`````(/L'(E<)!2)="08BW0D(`^V3"0DBT0D
+M+(E$)`2+1"0HB00DN@````")\.BA_?__B</'!"14````N0(```"Z`````(GP
+MZ/?U__^)V(M<)!2+="08@\0<PXGVC;PG`````(/L'(E<)!2)="08BW0D(`^V
+M3"0DBT0D+(E$)`2+1"0HB00DN@$```")\.A!_?__B</'!"14````N0(```"Z
+M`0```(GPZ)?U__^)V(M<)!2+="08@\0<PXGVC;PG`````%575E.#[`R)QXML
+M)"2)RP^V\L<$)&0```"Y`@```(GRZ%OU__^)\HGXZ%+[__^%P'4.N0,```")
+M\HGXZ!#U__\/MLO'!"0!````B?*)^.C]^___A,!U+H7M?C&[`````(M$)"`/
+MM@P#QP0D`````(GRB?CHV/O__X3`=0F#PP$YZW0)Z]NX_____^L%N`````"#
MQ`Q;7E]=PXVT)@````"#[!R)7"04B70D&(MT)"`/MDPD)(M$)"R)1"0$BT0D
-M*(D$)+H!````B?#H,?___XG#QP0D5````+D"````N@$```")\.C7]/__B=B+
-M7"04BW0D&(/$',.)]HV\)P````"#[!R+3"0@#[94)"2+@4P%``"%P'4"B<B(
-M%2`!``#'1"0,(````,=$)`@@`0``QT0D!`X```")!"3H_/___X/$',.-M"8`
-M````C;PG`````(/L#(M4)!`/MDPD%(!\)!@`=!"X`0```-/@9@F"N`P``.L.
-MN/[____3P&8A@K@,```/MH*X#```B40D!(D4).C\____@\0,PY"-M"8`````
+M*(D$)+H!````B?#H,?___XG#QP0D5````+D"````N@$```")\.B7]/__B=B+
+M7"04BW0D&(/$',.)]HV\)P````"#[!R+3"0@#[94)"2+@4@%``"%P'4"B<B(
+M%0`!``#'1"0,(````,=$)`@``0``QT0D!`X```")!"3H_/___X/$',.-M"8`
+M````C;PG`````(/L#(M4)!`/MDPD%(!\)!@`=!"X`0```-/@9@F"M`P``.L.
+MN/[____3P&8A@K0,```/MH*T#```B40D!(D4).C\____@\0,PY"-M"8`````
M55=64X/L3(M$)&2+2!B#P0*+4!"#Z@&)5"0DQT0D2`````"+6!R)7"0HB<:+
-M0!@/ME$!@/H!=0S'1BP`````Z6P%``"`^@)U4X!Y`@&-=@!U.HM4)&"+@DP%
-M``"%P'4"B="+@$@%```/ME$#B)"Z#```#[91`XB0AAD``(M,)&3'02P`````
+M0!@/ME$!@/H!=0S'1BP`````Z6P%``"`^@)U4X!Y`@&-=@!U.HM4)&"+@D@%
+M``"%P'4"B="+@$0%```/ME$#B)"V#```#[91`XB0?AD``(M,)&3'02P`````
MZ20%``"+7"1DQT,L_O___^D4!0``@\`!B40D+(#Z!`^%)0(```^V00.#Z#L\
-M`0^'%@(``(M$)"P/MG`"BU0D8(N:2`4``(GQ#[;!B40D!(D<).C\____B<*$
-MP'0-#[;`@+P#O`0``/]U5HN;2`4``('#S`P``(N#2`4``(D$).C\____B?(H
-MP@^VPHE$)`2)'"3H_/___XG"A,!T#0^VP("\`[P$``#_=1:+3"1DQT$L____
-M_XD,)/]1*.F$!```#[;"#[:$`[P$``"`^H%W9@^VR&G)%`T``(M$)"P/MD`$
+M`0^'%@(``(M$)"P/MG`"BU0D8(N:1`4``(GQ#[;!B40D!(D<).C\____B<*$
+MP'0-#[;`@+P#N`0``/]U5HN;1`4``('#R`P``(N#1`4``(D$).C\____B?(H
+MP@^VPHE$)`2)'"3H_/___XG"A,!T#0^VP("\`[@$``#_=1:+3"1DQT$L____
+M_XD,)/]1*.F$!```#[;"#[:$`[@$``"`^H%W9@^VR&G)%`T``(M$)"P/MD`$
MB$0D.XMT)"P/ME8%P>(0#[9&!L'@"`G"#[9&!PG"B50D,`^V5@C!XA`/MD8)
-MP>`("<(/MD8*"<*)5"0TB<X#L[0%```/A`D!``"`?C``=1WI_@```(M$)&3'
+MP>`("<(/MD8*"<*)5"0TB<X#L[`%```/A`D!``"`?C``=1WI_@```(M$)&3'
M0"S_____B00D_U`HB?;I]@,``+\`````QD0D.@"-;BB+5"0L@\(+B50D'(DL
M).C\____C5CXBU8LB48LB6L(B5,,B0(/MD,E/`UT"#PB#X6,````BTPD+`^V
M00,\.W0T/#QU?(M$)&2)1"00BU0D,(E4)`R+3"0TB4PD"`^V1"0[B40D!(D<
@@ -5009,48 +3633,48 @@ M)&2)1"00BU0D,(E4)`R+3"0TB4PD"`^V1"0[B40D!(D<).C\____QD0D.@&#
MQP&)^SA>,`^'/?___X!\)#H`#X40`P``BW0D9,=&+/____^)-"3_5BCI^@(`
M`(#Z`P^%MP```(!Y`@&)]@^%FP```(M4)&`/MD(FC30`#[99`XG:B=C!^A_W
M_HG3.=9^;8UY!`^V\@^V002)1"0(B70D!(M,)&")#"3H_/___XU#_(/X`W88
-MC4/T@_@#=A"-0^R#^`-V"(U#Y(/X`W<(@40D8,P,```/M@>)1"0(B70D!(M<
+MC4/T@_@#=A"-0^R#^`-V"(U#Y(/X`W<(@40D8,@,```/M@>)1"0(B70D!(M<
M)&")'"3H_/___XMT)&3'1BP`````Z3\"``"+1"1DQT`L_O___^DO`@``BU0D
M9,="+/[____I'P(``(`Y!79*@'D$_G5$C40D2(E$)`B+3"1DB4PD!(M<)&"+
-M@T@%``")!"3H_/___X3`#X7J`0``QT0D2`````"+="1DQT8L_____^G2`0``
-MB?:+1"1@BZA,!0``A>UU`HG%B<NX`@```"G(B40D(.GN````#[8SC7H!#[;(
+M@T0%``")!"3H_/___X3`#X7J`0``QT0D2`````"+="1DQT8L_____^G2`0``
+MB?:+1"1@BZA(!0``A>UU`HG%B<NX`@```"G(B40D(.GN````#[8SC7H!#[;(
M]L$!='"+5"1(B70D&(T$%HM<)&0[0Q0/AV$!``"+1"0L@#@!=2*)="0$BT0D
-M*`'0B00DN@$```")Z.AF]___.?!T)NDV`0``B70D!(M$)"@!T(D$)+H`````
-MB>CH1/?__SGP#X45`0``BU0D&`%4)$B)^^MPC1PWBT0D(`'8.T0D)`^/]@``
+M*`'0B00DN@$```")Z.@F]___.?!T)NDV`0``B70D!(M$)"@!T(D$)+H`````
+MB>CH!/?__SGP#X45`0``BU0D&`%4)$B)^^MPC1PWBT0D(`'8.T0D)`^/]@``
M`(M$)"R`.`%U'(ET)`2)/"2Z`0```(GHZ+'Y__^%P'0@Z=$```")="0$B3PD
MN@````")Z.B5^?__A<`/A;8```"`.P!U"H![`0"-="8`=`['!"00)P``Z/S_
M__^)]HU3`0^V0P&$P`^%`____P^V`X3`#X2*````#[;8QP0D5````+D"````
-MN@````")Z.C[[O__BU0D2(M,)&2+010IT#G#=@*)PXMT)"R`/@%U((E<)`2+
-M1"0H`=")!"2Y`````+H!````B>CH4?;__^L>B5PD!(M$)"@!T(D$)+D`````
-MN@````")Z.@Q]O__A<!X!@%$)$CK"XM$)&3'0"S_____QP0D5````+D"````
-MN@````")Z.AT[O__C70F`(M,)&2+42"%TG0&BT0D2(D"BUPD9(D<)/]3*(/$
-M3%M>7UW#C;8`````C;PG`````(/L'(M4)""+@DP%``"%P'4"B="+D$@%```/
-MMH*[#```A,!T#8/H`8B"NPP``(3`=2?&!2,!````QT0D#"````#'1"0((`$`
-M`,=$)`0.````B10DZ/S___^#Q!S#C70F`(/L'(M4)""+@DP%``"%P'4"B="+
-M@$@%``"`N+H,````=2Z`@+L,```!Q@4C`0```<=$)`P@````QT0D""`!``#'
+MN@````")Z.B[[O__BU0D2(M,)&2+010IT#G#=@*)PXMT)"R`/@%U((E<)`2+
+M1"0H`=")!"2Y`````+H!````B>CH$?;__^L>B5PD!(M$)"@!T(D$)+D`````
+MN@````")Z.CQ]?__A<!X!@%$)$CK"XM$)&3'0"S_____QP0D5````+D"````
+MN@````")Z.@T[O__C70F`(M,)&2+42"%TG0&BT0D2(D"BUPD9(D<)/]3*(/$
+M3%M>7UW#C;8`````C;PG`````(/L'(M4)""+@D@%``"%P'4"B="+D$0%```/
+MMH*W#```A,!T#8/H`8B"MPP``(3`=2?&!0,!````QT0D#"````#'1"0(``$`
+M`,=$)`0.````B10DZ/S___^#Q!S#C70F`(/L'(M4)""+@D@%``"%P'4"B="+
+M@$0%``"`N+8,````=2Z`@+<,```!Q@4#`0```<=$)`P@````QT0D"``!``#'
M1"0$#@```(D$).C\____@\0<PXVV`````(V_`````(/L'(E<)!2)="08BW0D
M(`^V3"0DBT0D+(E$)`2+1"0HB00DN@````")\.B1]___B</'!"14````N0(`
-M``"Z`````(GPZ#?M__^)V(M<)!2+="08@\0<PY"0D)"0D)"0D(M$)`2+0`0M
+M``"Z`````(GPZ/?L__^)V(M<)!2+="08@\0<PY"0D)"0D)"0D(M$)`2+0`0M
M``(!``-$)`B+`*,`````PY"-M"8`````BT0D!(M`!"T``@$``T0D"(M4)`R)
M$,.)]HV\)P````!3@^P,BUPD%(M3!('J``(!`,>"@``!``````"+@@0!`0"C
M`````(#,`8F"!`$!`,=$)`@$````QT0D!`S"``")'"3H_/___\=$)`BX"P``
MQT0D!`C"``")'"3H_/___\=$)`@!``P`QT0D!`#"``")'"3H_/___\=$)`@$
M````QT0D!`S#``")'"3H_/___\=$)`BX"P``QT0D!`C#``")'"3H_/___\=$
M)`@!``P`QT0D!`##``")'"3H_/___XM#!"VT`0``9L<```"+0P0ME`$```^W
-M`&:C``````^WP(M3!('JE`$``(/(!&:)`HM#!"V8`0``9L<`!`!FQX.X#```
+M`&:C``````^WP(M3!('JE`$``(/(!&:)`HM#!"V8`0``9L<`!`!FQX.T#```
M__^#Q`Q;PXVV`````(M$)`2+4`2!Z@`"`0"+@FP``0"C``````S(B8)L``$`
MP^L-D)"0D)"0D)"0D)"0D(M$)`2+4`2!Z@`"`0"+@F@``0"C`````"0W"T0D
M"(F":``!`,.-="8`C;PG`````(/L((E<)!")="04B7PD&(EL)!R+7"0D#[9,
-M)"@/MGPD+#F;2`4``'5\B<C`Z`*]``````^VT(G(@^`#C31`N`<```")\=/@
-M]]`C1),\B40D#(E$DSR)^(3`=`^X!````-/@"T0D#(E$DSR+1),\B40D"(GJ
-M#[;"P>`(!5#"``")1"0$BX-(!0``B00DZ/S___^+7"00BW0D%(M\)!B+;"0<
+M)"@/MGPD+#F;1`4``'5\B<C`Z`*]``````^VT(G(@^`#C31`N`<```")\=/@
+M]]`C1),XB40D#(E$DSB)^(3`=`^X!````-/@"T0D#(E$DSB+1),XB40D"(GJ
+M#[;"P>`(!5#"``")1"0$BX-$!0``B00DZ/S___^+7"00BW0D%(M\)!B+;"0<
M@\0@PXG(P.@"@^@$O0$```#I?/___XGVC;PG`````%575E.#[!R+?"0P#[9$
M)#2(1"0;#[94)#B(5"0:#[9L)#R+1PB+,(DT).C\____B<.%P`^$^````(DT
M).C\____B<*%P`^$Y@```,9'-`'&0R3AQD,E`<9#)A#&0Q6[#[9',V:)0Q")
M<QC'0R"0````C4((B4,TB5-0B<&)PK@`````Q@00`(/``3V0````=?+&00&"
-MQ@%`#[9$)!N(00(/ME0D&HA1`XGHB$$$/`)W(XU!"(GI#[;1P>("C8Z$"P``
-MB50D"(E,)`2)!"3H_/___^LWBX:$"P``B4$(BX:("P``B4$,@\$0B>H/ML*-
-M!(7X____C9:,"P``B40D"(E4)`2)#"3H_/___\=#;`````#'1"0$`````(U#
+MQ@%`#[9$)!N(00(/ME0D&HA1`XGHB$$$/`)W(XU!"(GI#[;1P>("C8Z`"P``
+MB50D"(E,)`2)!"3H_/___^LWBX:`"P``B4$(BX:$"P``B4$,@\$0B>H/ML*-
+M!(7X____C9:("P``B40D"(E4)`2)#"3H_/___\=#;`````#'1"0$`````(U#
M/(D$).C\____B5PD!(DT).C\____@\0<6UY?7<.-M"8`````@^PLB5PD'(ET
M)"")?"0DB6PD*(M\)#"+;"0TBT0D.(E$)!B+5"0\B50D%(M'"(LPB30DZ/S_
M__^)PX7`#X2`````B30DZ/S___^)PH7`='+&1S0!QD,DX<9#)0'&0R80QD,5
@@ -5059,17 +3683,17 @@ M&(A0`P^V5"04B%`$QT-L`````,=$)`0`````C4,\B00DZ/S___^)7"0$B30D
MZ/S___^+7"0<BW0D((M\)"2+;"0H@\0LPXUV`(V\)P````!55U93@^P<BW0D
M,`^V;"0T#[9$)#B(1"0;BT8(BQC'1"0,`@```,=$)`@`````QT0D!`````")
M-"3H_/___X!^-`!T&HD<).C\____QP0D`0```.C\____@'XT`'7FBT8(BP`%
-MA`L``(!X`@!X1(!(`H#'1"0,`0```,=$)`@`````QT0D!`````")-"3H_/__
+M@`L``(!X`@!X1(!(`H#'1"0,`0```,=$)`@`````QT0D!`````")-"3H_/__
M_X!^-`!T&HD<).C\____QP0D`0```.C\____@'XT`'7FB>C`Z`(/MOC'1"0,
M`0```(E\)`C'1"0$`P```(DT).C\____@'XT`'0>C70F`(D<).C\____QP0D
-M`0```.C\____@'XT`'7FBT8(BQB)Z??1@^$#@'PD&P`/E<+!X@,/MH0+A`L`
-M`(/@YPG0B(0+A`L``,=$)`P!````B7PD",=$)`0#````B30DZ/S___^#Q!Q;
+M`0```.C\____@'XT`'7FBT8(BQB)Z??1@^$#@'PD&P`/E<+!X@,/MH0+@`L`
+M`(/@YPG0B(0+@`L``,=$)`P!````B7PD",=$)`0#````B30DZ/S___^#Q!Q;
M7E]=PXVT)@````"#[!R)7"0,B70D$(E\)!2);"08BUPD((MT)"0/MT809CV%
-M`'<;BZNT!0``#[?`#[:$`[P$``!I^!0-``#K#8GVBZNT!0``O^P&#0"+1C2`
-M>`$"=22-BX0+``"-4`2+0`2)@X0+``"+0@2)002+0@B)00B+0@R)00R+1E"%
+M`'<;BZNP!0``#[?`#[:$`[@$``!I^!0-``#K#8GVBZNP!0``O^P&#0"+1C2`
+M>`$"=22-BX`+``"-4`2+0`2)@X`+``"+0@2)002+0@B)00B+0@R)00R+1E"%
MP'0,B40D!(D<).C\____B70D!(D<).C\____QD0]-`"+7"0,BW0D$(M\)!2+
-M;"08@\0<PX/L$(D<)(ET)`2)?"0(B6PD#(M,)!2+="08BU0D'(M<)""+N7P%
-M```/MT80O=@F`0!F/84`=Q$/M\`/MH0!O`0``&GH*`$``(V*(`0``,:"(`0`
+M;"08@\0<PX/L$(D<)(ET)`2)?"0(B6PD#(M,)!2+="08BU0D'(M<)""+N7@%
+M```/MT80O=@F`0!F/84`=Q$/M\`/MH0!N`0``&GH*`$``(V*(`0``,:"(`0`
M`"=F@7XDX0%U(P^V5B:-0O\\`7<)#[96)X/B#^LDC4+ON@\````\`788C78`
MC00ON@````"#>#0`=`</ME!-@^(/#[9!`8/@\`G0B$$!N`$```!F@7XDX0%U
M$@^V1B:#Z`$\`0^7P`^VP(UV`(G"P>('#[9!`8/@?PG0B$$!#[9#!HA!`@^V
@@ -5104,7 +3728,7 @@ M^I&0C70F`'1,@/KA#X5*`P``D(UT)@#ID@```(E,)`@/ML")1"0$B1PDZ/S_
M___'1"0,`0```.DH`P``B4PD!(D<).C\____QT0D#`$```#I#P,``(E,)`B)
M7"0$BT0D&(D$).C\____QT0D#`$```#I[@(``/9#*`%T(<9!!G#&000`QD$#
M`,9!`@#&005`QT0D#`$```#IQP(``,9!!N#'1"0,`0```.FV`@``@'LE`0^%
-MI`(``(![)AP/AYH"```/MD,FD/\DA3`5``#&00<$QT0D#`$```#IA0(``,9!
+MI`(``(![)AP/AYH"```/MD,FD/\DA=`*``#&00<$QT0D#`$```#IA0(``,9!
M!P#'1"0,`0```.ET`@``QD$&[,=$)`P!````Z6,"``#&00;OQ@$##[9#)X/(
M0(A!`<=$)`P!````Z44"``#&00;OQ@$'QT0D#`$```#I,0(``,9!!D#&00$!
MQD$%0,=$)`P!````Z1@"``#&00;OQ@$##[9#)X/("(A!`<=$)`P!````Z?H!
@@ -5142,257 +3766,257 @@ M$,'@!`^VR<'A"`G!@'PD#`!T`X/)!(/^_W00B?`E__\#`(F"!,;__X/)`HD+
MBQPDBW0D!(/$",.0BT`$+0`"`0"#R@&)D`#(``##C;0F`````(V\)P````!7
M5E.#[!")UXM`!(72=$J-L`#&__^+@`#&__^C`````+L`````J`%U$NLGD(UT
M)@"+!J,`````J`%T%\<$)`H```#H_/___X/#`3G[=>*)]NL'N`````#K!;C_
-M____@\006UY?PXUT)@"-O"<`````5E.#["2+7"0PQT0D(`````"+<P3&@[P,
+M____@\006UY?PXUT)@"-O"<`````5E.#["2+7"0PQT0D(`````"+<P3&@[@,
M````#[8-2`$``(U4)"#'1"0(`````,=$)`0"````QP0D`0```(G8Z-S^__^+
M5"0@B=CH(?___[J@A@$`B=CH-?___X7`=4>+A@S&__^C`````(E$)"`]'V,`
-M`'4QQX.L#```'V,``,>#L`P`````!`#'@[0,``````$`QX/`#```0`$``&:X
-M``#I.@(``,=$)"``````BW,$QH.\#````0^V#5@!``"-5"0@QT0D"/_____'
+M`'4QQX.H#```'V,``,>#K`P`````!`#'@[`,``````$`QX.\#```0`$``&:X
+M``#I.@(``,=$)"``````BW,$QH.X#````0^V#5@!``"-5"0@QT0D"/_____'
M1"0$`@```,<$)`$```")V.@__O__BU0D((G8Z(3^__^Z$"<``(G8Z)C^__^%
-MP'5GBX8,QO__HP````")1"0@/1]#``!T+CT?1```=4K'@ZP,```?1```QX.P
-M#``````'`,>#M`P``````0#IA`$``(UT)@#'@ZP,```?0P``QX.P#``````$
-M`,>#M`P``````0#I70$``,=$)"``````BW,$QH.\#`````^V#6@!``"-5"0@
+MP'5GBX8,QO__HP````")1"0@/1]#``!T+CT?1```=4K'@Z@,```?1```QX.L
+M#``````'`,>#L`P``````0#IA`$``(UT)@#'@Z@,```?0P``QX.L#``````$
+M`,>#L`P``````0#I70$``,=$)"``````BW,$QH.X#`````^V#6@!``"-5"0@
MQT0D"`````#'1"0$`@```,<$)`$```")V.B"_?__BU0D((G8Z,?]__^Z$"<`
-M`(G8Z-O]__^%P'5'BX8,QO__HP````")1"0@/;]#``!U,<>#K`P``+]#``#'
-M@[`,`````"``QX.T#````!```,>#P`P``&`!``!FN```Z>````#'1"0@````
-M`(MS!,:#O`P````/M@UX`0``C50D(,=$)`@`````QT0D!`(```#'!"0!````
+M`(G8Z-O]__^%P'5'BX8,QO__HP````")1"0@/;]#``!U,<>#J`P``+]#``#'
+M@ZP,`````"``QX.P#````!```,>#O`P``&`!``!FN```Z>````#'1"0@````
+M`(MS!,:#N`P````/M@UX`0``C50D(,=$)`@`````QT0D!`(```#'!"0!````
MB=CHY?S__XM4)"")V.@J_?__NA`G``")V.@^_?__A<!U7XN&#,;__Z,`````
-MB40D(#WO$0``=`D][Q(``'5"ZR#'@ZP,``#O$0``QX.P#``````$`,>#M`P`
-M`````0#K/,>#K`P``.\2``#'@[`,``````@`QX.T#``````!`.L<N/_____K
-M)(UT)@#'@\`,``!0`0``N`````#K#\>#P`P``'`!``"X`````(/$)%M>PXUV
+MB40D(#WO$0``=`D][Q(``'5"ZR#'@Z@,``#O$0``QX.L#``````$`,>#L`P`
+M`````0#K/,>#J`P``.\2``#'@ZP,``````@`QX.P#``````!`.L<N/_____K
+M)(UT)@#'@[P,``!0`0``N`````#K#\>#O`P``'`!``"X`````(/$)%M>PXUV
M`(V\)P````"#[#R)7"0LB70D,(E\)#2);"0XB<:)UXE,)!B+:`0/MD0D0#P$
-M=@6X!`````^VV(N&P`P```^V2`2-5"0HB7PD"(E<)`3'!"0!````B?#HW?O_
+M=@6X!`````^VV(N&O`P```^V2`2-5"0HB7PD"(E<)`3'!"0!````B?#HW?O_
M_XM4)"B)\.@B_/__NA`G``")\.@V_/__NO____^%P'4:BX4,QO__HP````")
M1"0HBU0D&(D"N@````")T(M<)"R+="0PBWPD-(ML)#B#Q#S#C;8`````C;PG
-M`````%.#["B+7"0PBX/`#```#[9("XU4)"2+1"0TB40D",=$)`0!````QP0D
+M`````%.#["B+7"0PBX.\#```#[9("XU4)"2+1"0TB40D",=$)`0!````QP0D
M`0```(G8Z$S[__^+5"0DB=CHD?O__[H0)P``B=CHI?O__[K_____A<!U&HM#
M!"WT.0``BP"C`````(M4)#B(`KH`````B="#Q"A;PXUT)@"-O"<`````55=6
-M4X/L+(G#B%0D&XG-@WPD0``/A),```"^`````)"+>P2+@\`,```/MD@"QT0D
+M4X/L+(G#B%0D&XG-@WPD0``/A),```"^`````)"+>P2+@[P,```/MD@"QT0D
M"/_____'1"0$`0```,<$)`$```"-5"0HB=CHL?K__XM4)"B)V.CV^O__NA`G
M``")V.@*^___A<!U*HN7#,;__XD5``````^V1"0;(=")Z3C(=0VX`````.LH
MC;8`````B50D*,<$)`H```#H_/___X/&`3MT)$`/A7/___^X_____X/$+%M>
-M7UW#C;8`````4X/L*(G#BX#`#```#[8(C50D),=$)`C_____QT0D!`````#'
+M7UW#C;8`````4X/L*(G#BX"\#```#[8(C50D),=$)`C_____QT0D!`````#'
M!"0`````B=CH#_K__XM4)"2)V.A4^O__NA`G``")V.AH^O__A<!U),<$)."3
M!`"Y`@```+H#````B=CHW/[__[H`````A<!T"(UV`+K_____B="#Q"A;PXUT
M)@"#["R)7"0DB70D*(M<)#"+="0TQD0D(_^-1"0CB40D"(ET)`2)'"3H_/__
-M_X7`=7*`?"0C`'1YB=CH0O___X/X_W1?BX/`#```#[9("HU4)!R)="0(QT0D
+M_X7`=7*`?"0C`'1YB=CH0O___X/X_W1?BX.\#```#[9("HU4)!R)="0(QT0D
M!`````#'!"0`````B=CH5?G__XM4)!R)V.B:^?__NA`G``")V.BN^?__A<!U
M',<$)."3!`"Y`````+H#````B=CH(O[__X7`=`ZX_____^L,C;0F`````+@`
M````BUPD)(MT)"B#Q"S#ZPV0D)"0D)"0D)"0D)"055=64X/L/(ML)%`/MD0D
-M8(.]P`P````/A!H#``"+?"18A,`/A&L!``"#?"14_W44#[>%K`P``&:)![@!
-M````Z1P#``"#?"14_G45BX6P#```B0>X`0```.D#`P``C78`@WPD5/UU&8N%
-MM`P``(D'N`$```#IYP(``(VT)@````"+1"1<`T0D5(E$)!@[A;`,```/AY\"
+M8(.]O`P````/A!H#``"+?"18A,`/A&L!``"#?"14_W44#[>%J`P``&:)![@!
+M````Z1P#``"#?"14_G45BX6L#```B0>X`0```.D#`P``C78`@WPD5/UU&8N%
+ML`P``(D'N`$```#IYP(``(VT)@````"+1"1<`T0D5(E$)!@[A:P,```/AY\"
M``"+7"14@^/\BU0D5(/B`XE4)"!T;HUT)#C'!"0$````B?&)VHGHZ/[[__^#
MPP3'1"0<!````#E<)!AS$(M$)"`K1"14`T0D&(E$)!R+1"0@.40D''8MC0P&
MB?Z+1"0<C50$.(VV``````^V`8@&@\8!@\$!.=%U\8M$)!PK1"0@C3P'BW0D
M&(/F_#GS<R3'!"0$````C4PD.(G:B>CHA_O__XM$)#B)!X/'!(/#!#G>=]PY
M7"08#X;M`0``C70D.,<$)`0```")\8G:B>CH5_O__XM,)!@IV0^$RP$``+H`
M````C;8`````#[8$%H@$.H/"`3G*#X2N`0``Z^R#?"14_W4I@#\/B?9U$<:%
-MO0P```&X`0```.FM`0``QH6]#````+@!````Z9P!``"+5"1<B50D*(G0`T0D
-M5#N%L`P```^'60$``("]O0P````/A$P!``"+1"14N@````#WM;0,``"%T@^%
-MG````("]O`P```!T&(M$)%2)1"0$B2PDZ/S___^%P`^%%`$``(GHZ(;\__^#
-M^/\/A`0!``"+A<`,```/MD@&C50D.(M$)%2)1"0(QT0D!`````#'!"0`````
+MN0P```&X`0```.FM`0``QH6Y#````+@!````Z9P!``"+5"1<B50D*(G0`T0D
+M5#N%K`P```^'60$``("]N0P````/A$P!``"+1"14N@````#WM;`,``"%T@^%
+MG````("]N`P```!T&(M$)%2)1"0$B2PDZ/S___^%P`^%%`$``(GHZ(;\__^#
+M^/\/A`0!``"+A;P,```/MD@&C50D.(M$)%2)1"0(QT0D!`````#'!"0`````
MB>CHD?;__XM4)#B)Z.C6]O__NA`G``")Z.CJ]O__A<`/A;D```#'!"3@DP0`
MN0````"Z`P```(GHZ%K[__^%P`^%F0```(-\)%P`#X27````QT0D)`````"+
-M5"18BT0D)(LT`HG'`WPD5(M=!('K``(!`(GHZ-[[__^)LPC(``"+A<`,```/
+M5"18BT0D)(LT`HG'`WPD5(M=!('K``(!`(GHZ-[[__^)LPC(``"+A;P,```/
MMD@%B7PD",=$)`0$````QP0D`````(U4)#B)Z.CP]?__BU0D.(GHZ#7V__^Z
M$"<``(GHZ$GV__^%P'4<QP0DB!,``+D`````N@$```")Z.B]^O__A<!T$+@`
M````ZR*)]K@!````ZQF#1"0D!(M4)"0Y5"0H=NKI5O___Y"-="8`@\0\6UY?
-M7<.0D)"0D)"0D+@`````PXUV`(V\)P````"+5"0$BTPD"+@`````.14`&```
+M7<.0D)"0D)"0D+@`````PXUV`(V\)P````"+5"0$BTPD"+@`````.16@#0``
M?C2-%%+!X@,/MX(<`@``9HD!#[>"'@(``&:)00(/MH(D`@``B$$(#[:")0(`
-M`(A!";@!````\\.0C70F`+B8&P``PXUV`(V\)P````"XG````,.-=@"-O"<`
+M`(A!";@!````\\.0C70F`+B0&P``PXUV`(V\)P````"XG````,.-=@"-O"<`
M````N`0```##C78`C;PG`````%=64XMT)!"[`````+\`````N0`````/MI0Q
-M/`4``(#Z_W1"C8&`````9CV!`'<%@\,!ZS$/ML*+EI@%``!IP+````"`O!"E
+M.`4``(#Z_W1"C8&`````9CV!`'<%@\,!ZS$/ML*+EI0%``!IP+````"`O!"E
M`````W45@\<!C4<#@_@&=@V#PP&_`````.L#@\,!@\$!@_D&=:F)V%M>7\.-
MM@````"-O"<`````55=64X/L!(ML)!B^`````,<$)`````"[@`````^V1"0<
-MC7@!B=D/MH0KO`0``#S_=$EF@?N!`'<'@\8!ZSF)]@^VP(N5F`4``&G`L```
+MC7@!B=D/MH0KN`0``#S_=$EF@?N!`'<'@\8!ZSF)]@^VP(N5E`4``&G`L```
M`("\$*4````#=1N#!"0!BP0D@\`#@_@&=@^#Q@''!"0`````ZP.#Q@$Y]W00
M@\,!@?N&````=9ZY`````(G(@\0$6UY?7<.-="8`C;PG`````//#C;0F````
M`(V\)P````"+1"0$QH"7`````,.-="8`5E.+7"0,N/\```"%VW1,N8(```"^
-M_____XVT)@`````/MH09O`0``#S_=!\/ML"+DY@%``!IP+`````/MH00I```
+M_____XVT)@`````/MH09N`0``#S_=!\/ML"+DY0%``!IP+`````/MH00I```
M`(GR.,)V`HG&@\$!@?F&````=<J)\@^VPEM>PXGVN`````##C78`C;PG````
-M`%=64XM$)!"+F$@%``"^`````+\`````N0````"-="8`#[:4&3P%``"`^O]T
-M1HV!@````&8]@0!W!X/&`>LUB?8/ML*+DY@%``!IP+````"`O!"E`````W47
-M@\<!C4<#@_@&=@^#Q@&_`````.L%B?:#Q@&#P0&#^09UI8N;2`4``('#S`P`
-M`+$`C;0F``````^VE!D\!0``@/K_=$:-@8````!F/8$`=P>#Q@'K-8GV#[;"
-MBY.8!0``:<"P````@+P0I0````-U%X/'`8U'`X/X!G8/@\8!OP````#K!8GV
+M`%=64XM$)!"+F$0%``"^`````+\`````N0````"-="8`#[:4&3@%``"`^O]T
+M1HV!@````&8]@0!W!X/&`>LUB?8/ML*+DY0%``!IP+````"`O!"E`````W47
+M@\<!C4<#@_@&=@^#Q@&_`````.L%B?:#Q@&#P0&#^09UI8N;1`4``('#R`P`
+M`+$`C;0F``````^VE!DX!0``@/K_=$:-@8````!F/8$`=P>#Q@'K-8GV#[;"
+MBY.4!0``:<"P````@+P0I0````-U%X/'`8U'`X/X!G8/@\8!OP````#K!8GV
M@\8!@\$!@_D&=:6)\%M>7\/K#9"0D)"0D)"0D)"0D)")P8G0P.@$/`EV!8/`
M5^L#@\`PB`&)T(/@#X/X"7X1B="#X`^#P%?K#XVT)@````")T(/@#X/`,(A!
M`<.-="8`@^P(B1PDB70D!(G&B=,/MM;HJO___P^VVX/&`HG:B?#HF____XL<
M)(MT)`2#Q`C#BT0D#,=`!`````#'``````"X`````,.)]HV\)P````"+3"0$
MBT%@A<!T1<=`(`````"`2"@$QT%@`````,=!:`````#'060`````BU$(@_H_
-M?P^+06S'A)"\`@```````,.+06S'A)"\`0```````//#C;0F`````(V\)P``
+M?P^+06S'A)"X`@```````,.+06S'A)"X`0```````//#C;0F`````(V\)P``
M``"+3"0$BT%@A<!T1<=`(`````"`8"C[QT%@`````,=!:`````#'060`````
-MBU$(@_H_?P^+06S'A)"\`@```````,.+06S'A)"\`0```````//#C;0F````
+MBU$(@_H_?P^+06S'A)"X`@```````,.+06S'A)"X`0```````//#C;0F````
M`(V\)P````"#[`S'!"2``0``Z/S___^X`````(/$#,.0C;0F`````%=64X/L
M0(M$)%#&1"08;<9$)!G_QD0D&B/&1"0;%,9$)!PZQD0D'>_&1"0>%L9$)!^2
-MB[!,!0``A?9U`HG&C40D((G"Q@``@\`!B=.-3"1`.<AU\,9$)"0!QT0D#"``
+MB[!(!0``A?9U`HG&C40D((G"Q@``@\`!B=.-3"1`.<AU\,9$)"0!QT0D#"``
M``")5"0(QT0D!`X```")-"3H_/___X7`=4S'!"2`&@8`Z/S____'1"0,(```
M`(E<)`C'1"0$#P```(DT).C\____@_@@=1^-="0PC7PD&+D(````_/.F#Y?"
-M#Y+`N0$````XPG01QP0D)`,``.C\____N0`````/ML&#Q$!;7E_#55=64X/L
-M7(M$)'"+D$@%``"!PLP,``")5"0XB<&+`(7`=!8M```"`(D!B40D!(M!$(D$
+M#Y+`N0$````XPG01QP0D&`(``.C\____N0`````/ML&#Q$!;7E_#55=64X/L
+M7(M$)'"+D$0%``"!PL@,``")5"0XB<&+`(7`=!8M```"`(D!B40D!(M!$(D$
M).C\____BUPD<(M#"(7`=`^)1"0$BT,0B00DZ/S___^+5"1PBT(,A<!T#XE$
M)`2+0A")!"3H_/___XU$)$Z)1"0TC40D4(E$)#"-1"1*B40D+(U$)$R)1"0H
MC40D5(E$)"2-1"16B40D((U$)%>)1"0<C40D4HE$)!B-1"18B40D%(U$)$B)
M1"00C40D68E$)`R-1"1:B40D"(U$)%N)1"0$BTPD<`^W022)!"3H_/___XM<
-M)'"+@WP%``"%P'0PB40D!(G8!60%``")!"3H_/___XM4)#B+@GP%``")1"0$
-MB=`%9`4``(D$).C\____BTPD<(N!F`4``(7`=#")1"0$B<@%@`4``(D$).C\
-M____BUPD.(N#F`4``(E$)`2)V`6`!0``B00DZ/S___^+5"1PBX*T!0``A<!T
-M,(E$)`2)T`6<!0``B00DZ/S___^+3"0XBX&T!0``B40D!(G(!9P%``")!"3H
-M_/___XM<)'"+@^P&``"%P'0PB40D!(G8!=0&``")!"3H_/___XM4)#B+@NP&
-M``")1"0$B=`%U`8``(D$).C\____@'PD6P!T6KX`````BVPD<('%#`<``(M\
-M)#B!QPP'``"-=@`/M]Z+3"1PBX29)`<``(E$)`2)+"3H_/___XM4)#B+A)HD
-M!P``B40D!(D\).C\____@\8!#[9$)%MF.?!WPHM,)'"+@8P)``"%P'0PB40D
-M!(G(!70)``")!"3H_/___XM<)#B+@XP)``")1"0$B=@%=`D``(D$).C\____
-MBU0D<(N"M`D``(7`=#")1"0$B=`%G`D``(D$).C\____BTPD.(N!M`D``(E$
-M)`2)R`6<"0``B00DZ/S___^+7"1PBX,$"@``A<!T,(E$)`2)V`7L"0``B00D
-MZ/S___^+5"0XBX($"@``B40D!(G0!>P)``")!"3H_/___XM,)'"+@=`%``"%
-MP'0PB40D!(G(!;@%``")!"3H_/___XM<)#B+@]`%``")1"0$B=@%N`4``(D$
-M).C\____BU0D<(N"?`8``(7`=#")1"0$B=`%9`8``(D$).C\____BTPD.(N!
-M?`8``(E$)`2)R`5D!@``B00DZ/S___^+7"1PBX,L!@``A<!T,(E$)`2)V`44
-M!@``B00DZ/S___^+5"0XBX(L!@``B40D!(G0!10&``")!"3H_/___XM,)'"+
-M@4@&``"%P'0PB40D!(G(!3`&``")!"3H_/___XM<)#B+@T@&``")1"0$B=@%
-M,`8``(D$).C\____BU0D<(N"M`8``(7`=#")1"0$B=`%G`8``(D$).C\____
-MBTPD.(N!M`8``(E$)`2)R`6<!@``B00DZ/S___^+7"1PBX/0!@``A<!T,(E$
-M)`2)V`6X!@``B00DZ/S___^+5"0XBX+0!@``B40D!(G0!;@&``")!"3H_/__
-M_XM,)'"+@0@'``"%P'0PB40D!(G(!?`&``")!"3H_/___XM<)#B+@P@'``")
-M1"0$B=@%\`8``(D$).C\____BU0D<(N"/`D``(7`=#")1"0$B=`%)`D``(D$
-M).C\____BTPD.(N!/`D``(E$)`2)R`4D"0``B00DZ/S___^+7"1PBX-D"0``
-MA<!T,(E$)`2)V`5,"0``B00DZ/S___^+5"0XBX)D"0``B40D!(G0!4P)``")
-M!"3H_/___XM,)'"+@=P)``"%P'0PB40D!(G(!<0)``")!"3H_/___XM<)#B+
-M@]P)``")1"0$B=@%Q`D``(D$).C\____BU0D<(N"F`8``(7`=#")1"0$B=`%
-M@`8``(D$).C\____BTPD.(N!F`8``(E$)`2)R`6`!@``B00DZ/S___^+7"1P
-MBXL@"@``A<ET6(N#)`H``(N3*`H``(E$)`B)5"0,B4PD!(G8!0@*``")!"3H
-M_/___XM,)#B+@20*``"+D2@*``")1"0(B50D#(N!(`H``(E$)`2)R`4("@``
-MB00DZ/S___^+7"1PBXM$"@``A<ET6(N#2`H``(N33`H``(E$)`B)5"0,B4PD
-M!(G8!2P*``")!"3H_/___XM,)#B+@4@*``"+D4P*``")1"0(B50D#(N!1`H`
-M`(E$)`2)R`4L"@``B00DZ/S___^+7"1PBXMH"@``A<ET6(N#;`H``(N3<`H`
-M`(E$)`B)5"0,B4PD!(G8!5`*``")!"3H_/___XM,)#B+@6P*``"+D7`*``")
-M1"0(B50D#(N!:`H``(E$)`2)R`50"@``B00DZ/S___^+7"1PBXNP"@``A<ET
-M6(N#M`H``(N3N`H``(E$)`B)5"0,B4PD!(G8!9@*``")!"3H_/___XM,)#B+
-M@;0*``"+D;@*``")1"0(B50D#(N!L`H``(E$)`2)R`68"@``B00DZ/S___^+
-M7"1PBXN,"@``A<ET6(N#D`H``(N3E`H``(E$)`B)5"0,B4PD!(G8!70*``")
-M!"3H_/___XM,)#B+@9`*``"+D90*``")1"0(B50D#(N!C`H``(E$)`2)R`5T
-M"@``B00DZ/S___^+7"1PBXO4"@``A<ET6(N#V`H``(N3W`H``(E$)`B)5"0,
-MB4PD!(G8!;P*``")!"3H_/___XM,)#B+@=@*``"+D=P*``")1"0(B50D#(N!
-MU`H``(E$)`2)R`6\"@``B00DZ/S___^+7"1PBXOX"@``A<ET6(N#_`H``(N3
-M``L``(E$)`B)5"0,B4PD!(G8!>`*``")!"3H_/___XM,)#B+@?P*``"+D0`+
-M``")1"0(B50D#(N!^`H``(E$)`2)R`7@"@``B00DZ/S___^+7"1PBXL<"P``
-MA<ET6(N#(`L``(N3)`L``(E$)`B)5"0,B4PD!(G8!00+``")!"3H_/___XM,
-M)#B+@2`+``"+D20+``")1"0(B50D#(N!'`L``(E$)`2)R`4$"P``B00DZ/S_
+M)'"+@W@%``"%P'0PB40D!(G8!6`%``")!"3H_/___XM4)#B+@G@%``")1"0$
+MB=`%8`4``(D$).C\____BTPD<(N!E`4``(7`=#")1"0$B<@%?`4``(D$).C\
+M____BUPD.(N#E`4``(E$)`2)V`5\!0``B00DZ/S___^+5"1PBX*P!0``A<!T
+M,(E$)`2)T`68!0``B00DZ/S___^+3"0XBX&P!0``B40D!(G(!9@%``")!"3H
+M_/___XM<)'"+@^@&``"%P'0PB40D!(G8!=`&``")!"3H_/___XM4)#B+@N@&
+M``")1"0$B=`%T`8``(D$).C\____@'PD6P!T6KX`````BVPD<('%"`<``(M\
+M)#B!QP@'``"-=@`/M]Z+3"1PBX29(`<``(E$)`2)+"3H_/___XM4)#B+A)H@
+M!P``B40D!(D\).C\____@\8!#[9$)%MF.?!WPHM,)'"+@8@)``"%P'0PB40D
+M!(G(!7`)``")!"3H_/___XM<)#B+@X@)``")1"0$B=@%<`D``(D$).C\____
+MBU0D<(N"L`D``(7`=#")1"0$B=`%F`D``(D$).C\____BTPD.(N!L`D``(E$
+M)`2)R`68"0``B00DZ/S___^+7"1PBX,`"@``A<!T,(E$)`2)V`7H"0``B00D
+MZ/S___^+5"0XBX(`"@``B40D!(G0!>@)``")!"3H_/___XM,)'"+@<P%``"%
+MP'0PB40D!(G(!;0%``")!"3H_/___XM<)#B+@\P%``")1"0$B=@%M`4``(D$
+M).C\____BU0D<(N">`8``(7`=#")1"0$B=`%8`8``(D$).C\____BTPD.(N!
+M>`8``(E$)`2)R`5@!@``B00DZ/S___^+7"1PBX,H!@``A<!T,(E$)`2)V`40
+M!@``B00DZ/S___^+5"0XBX(H!@``B40D!(G0!1`&``")!"3H_/___XM,)'"+
+M@40&``"%P'0PB40D!(G(!2P&``")!"3H_/___XM<)#B+@T0&``")1"0$B=@%
+M+`8``(D$).C\____BU0D<(N"L`8``(7`=#")1"0$B=`%F`8``(D$).C\____
+MBTPD.(N!L`8``(E$)`2)R`68!@``B00DZ/S___^+7"1PBX/,!@``A<!T,(E$
+M)`2)V`6T!@``B00DZ/S___^+5"0XBX+,!@``B40D!(G0!;0&``")!"3H_/__
+M_XM,)'"+@00'``"%P'0PB40D!(G(!>P&``")!"3H_/___XM<)#B+@P0'``")
+M1"0$B=@%[`8``(D$).C\____BU0D<(N".`D``(7`=#")1"0$B=`%(`D``(D$
+M).C\____BTPD.(N!.`D``(E$)`2)R`4@"0``B00DZ/S___^+7"1PBX-@"0``
+MA<!T,(E$)`2)V`5("0``B00DZ/S___^+5"0XBX)@"0``B40D!(G0!4@)``")
+M!"3H_/___XM,)'"+@=@)``"%P'0PB40D!(G(!<`)``")!"3H_/___XM<)#B+
+M@]@)``")1"0$B=@%P`D``(D$).C\____BU0D<(N"E`8``(7`=#")1"0$B=`%
+M?`8``(D$).C\____BTPD.(N!E`8``(E$)`2)R`5\!@``B00DZ/S___^+7"1P
+MBXL<"@``A<ET6(N#(`H``(N3)`H``(E$)`B)5"0,B4PD!(G8!00*``")!"3H
+M_/___XM,)#B+@2`*``"+D20*``")1"0(B50D#(N!'`H``(E$)`2)R`4$"@``
+MB00DZ/S___^+7"1PBXM`"@``A<ET6(N#1`H``(N32`H``(E$)`B)5"0,B4PD
+M!(G8!2@*``")!"3H_/___XM,)#B+@40*``"+D4@*``")1"0(B50D#(N!0`H`
+M`(E$)`2)R`4H"@``B00DZ/S___^+7"1PBXMD"@``A<ET6(N#:`H``(N3;`H`
+M`(E$)`B)5"0,B4PD!(G8!4P*``")!"3H_/___XM,)#B+@6@*``"+D6P*``")
+M1"0(B50D#(N!9`H``(E$)`2)R`5,"@``B00DZ/S___^+7"1PBXNL"@``A<ET
+M6(N#L`H``(N3M`H``(E$)`B)5"0,B4PD!(G8!90*``")!"3H_/___XM,)#B+
+M@;`*``"+D;0*``")1"0(B50D#(N!K`H``(E$)`2)R`64"@``B00DZ/S___^+
+M7"1PBXN("@``A<ET6(N#C`H``(N3D`H``(E$)`B)5"0,B4PD!(G8!7`*``")
+M!"3H_/___XM,)#B+@8P*``"+D9`*``")1"0(B50D#(N!B`H``(E$)`2)R`5P
+M"@``B00DZ/S___^+7"1PBXO0"@``A<ET6(N#U`H``(N3V`H``(E$)`B)5"0,
+MB4PD!(G8!;@*``")!"3H_/___XM,)#B+@=0*``"+D=@*``")1"0(B50D#(N!
+MT`H``(E$)`2)R`6X"@``B00DZ/S___^+7"1PBXOT"@``A<ET6(N#^`H``(N3
+M_`H``(E$)`B)5"0,B4PD!(G8!=P*``")!"3H_/___XM,)#B+@?@*``"+D?P*
+M``")1"0(B50D#(N!]`H``(E$)`2)R`7<"@``B00DZ/S___^+7"1PBXL8"P``
+MA<ET6(N#'`L``(N3(`L``(E$)`B)5"0,B4PD!(G8!0`+``")!"3H_/___XM,
+M)#B+@1P+``"+D2`+``")1"0(B50D#(N!&`L``(E$)`2)R`4`"P``B00DZ/S_
M__^#Q%Q;7E]=PXVV`````(/L'(E<)!2)="08BUPD((D<).C\____B1PDZ/S_
-M__^-L\P,``")-"3H_/___XD<).C\____QP0DT`<``.C\____B1PDZ/S____'
+M__^-L\@,``")-"3H_/___XD<).C\____QP0DT`<``.C\____B1PDZ/S____'
M1"0$`0```(D<).C\____QT0D!`$```")-"3H_/___XM<)!2+="08@\0<PXUT
-M)@"-O"<`````@^P<B5PD%(ET)!B+="0@BUPD)(A>-P^VVXE<)`2)-"3H_/__
-M_XE<)`2!QLP,``")-"3H_/___[@!````BUPD%(MT)!B#Q!S#D(VT)@````!3
-M@^P(BUPD$(D<).C\____BX-(!0``!<P,``")!"3H_/___X/$"%O#D(VT)@``
-M``!3@^P(BUPD$(D<).C\____BX-(!0``!<P,``")!"3H_/___X/$"%O#D(VT
-M)@````"#[`R+1"00B00DZ/S___\/ML"#Q`S#C78`C;PG`````(/L+(E<)!R)
-M="0@B7PD)(EL)"B)PXG7B<V+<&"+0&R)1"04A?8/A#4!``"`NY<`````#X4H
-M`0``B00DZ/S___^)1"08A<`/A!0!``#&0"3AQD`E`8GZA-)T#8GH/`$9P/?0
-M@\`'ZPR)ZH#Z`1G`]]"#P`V+5"08B$(FQD(4@`^W1AQFB4(0B5H8QT(@````
-M`,="-`````#'0FQ`DP,`B50D!(M$)!2)!"3H_/___\:#EP````%FQX.4````
-M]`&%VW19BT-@A<!T7&:!NY0```"6`'47B40D",=$)`0A````BT`LB00DZ/S_
-M__]F@ZN4`````<<$)-`'``#H_/___XM4)!2)%"3H_/___XM#8(7`=`F`NY<`
-M````=:YF@[N4`````'0<BT0D&(!X%`!U$HM#8`^W0#IFB4-:NP````#K!;O_
-M____BU0D&(E4)`2+1"04B00DZ/S____K"8UT)@"[_____XG8BUPD'(MT)""+
-M?"0DBVPD*(/$+,.0C70F`(/L3(E<)#R)="1`B7PD1(EL)$B+="10#[9L)%2+
-M?F"+1FR)1"0@A?\/A/($``"`OI<`````#X7E!```B00DZ/S___^)1"0DA<`/
-MA-$$``#V!@(/A00!``")ZH#Z%'<+#[;"C01`P>`"ZQBXB?___XGJ]N)FP>@(
-MP.@$#[;`!?````"+5"0DQD(DX<9")0'&0B8<B$(GQD(4@`^W1QQFB4(0B7(8
-MQT(@`````,="-`````#'0FQ`DP,`B50D!(M$)"")!"3H_/___\:&EP````%F
-MQX:4````Q`F%]G19BT9@A<!T8&:!OI0```"6`'47B40D",=$)`0A````BT`L
-MB00DZ/S___]F@ZZ4`````<<$)-`'``#H_/___XM4)"")%"3H_/___XM&8(7`
-M=`F`OI<`````=:YF@[Z4``````^$O`,``+L`````BT0D)(!X%``/A*X#``#I
-MI`,``(M4)"")%"3H_/___XE$)#B%P`^$C`,``(M<)"2#PSR+0`B)1"0<BT0D
-M),9`)!K&0"4(QD`F&L9`)P#&0"@0QD`I`(M$)#B+5"0DB4)0QD(4@`^W1QQF
-MB4(0B7(8BT0D.(M`"(E"-,="(!````"+1F`%N````(E".,9"'"#'0FQ`DP,`
-MQT0D!`````")'"3H_/___XM4)"2+0B")1"0,BT0D.(M0$(M`#(E$)`2)5"0(
-MB1PDZ/S___^+1"0DB40D!(M4)"")%"3H_/___\:&EP````%FQX:4````^@"%
-M]G19BT9@A<!T7&:!OI0```"6`'47B40D",=$)`0A````BT`LB00DZ/S___]F
-M@ZZ4`````<<$)-`'``#H_/___XM$)"")!"3H_/___XM&8(7`=`F`OI<`````
-M=:YF@[Z4`````'0*BU0D)(!Z%`!T'HU$)#B)1"0$BT0D((D$).C\____N___
-M___I/@(``(M4)"2)5"0$BT0D((D$).C\____BU0D((D4).C\____B40D)(7`
-M=2&-1"0XB40D!(M$)"")!"3H_/___[O_____Z1@"``"-=@"+5"0D@\(\B50D
-M*(M,)!R#P02+5"0<#[9"`P^V!`&(0@3&00$*QD$"`+@`````BU0D',8$$`"#
-MP`&#^`1U\(GHA,!U!H!A`_SK38GH#[;0:=)@Z@``N!^%ZU'WZL'Z!8!)`P.)
-MU<'M&(GHB$$$B=/!ZQ"(606)T,'H"(E$)!B(00:(40>)Z(A!"(A9"0^V1"08
-MB$$*B%$+BT0D.(M4)"2)0E#&0B05#[8!P/@']]"#P!&(0B7&0B8`QD(G`,9"
-M*!#&0BD`@"$_QD(4@`^W1QQFB4(0B7(8BT0D.(M`"(E"-,="(!````"+1F`%
-MN````(E".,9"'"#'0FQ`DP,`QT0D!`````"+1"0HB00DZ/S___^+5"0DBT(@
-MB40D#(M$)#B+4!"+0`R)1"0$B50D"(M$)"B)!"3H_/___XM4)"2)5"0$BT0D
-M((D$).C\____QH:7`````6;'AI0```#Z`(7V=%F+1F"%P'1<9H&^E````)8`
-M=1>)1"0(QT0D!"$```"+0"R)!"3H_/___V:#KI0````!QP0DT`<``.C\____
-MBU0D((D4).C\____BT9@A<!T"8"^EP````!UKF:#OI0`````=`^[`````(M$
-M)"2`>!0`=`6[_____XU$)#B)1"0$BU0D((D4).C\____ZP:0N_____^+1"0D
-MB40D!(M4)"")%"3H_/___^L*D(UT)@"[_____XG8BUPD/(MT)$"+?"1$BVPD
-M2(/$3,.0C70F`(/L3(E<)#R)="1`B7PD1(EL)$B+?"10BUPD5(MT)%@/MT0D
-M7&:)1"0>#[94)&2(5"0=BV]@A>T/A.D#``"`OY<`````#X7<`P``BTTLB4PD
-M.(M';(E$)"1FQX>4````$">)!"3H_/___XE$)#2%P`^$L0,```^W5"0>B50D
-M(&:#?"0>!'82B50D!,<$)$`#``#H_/___^L4BTPD)(D,).C\____B40D*(7`
-M=1Z+1"0TB40D!(M4)"2)%"3H_/___[O_____Z78#``"+3"0@P>$)B4PD,(M4
-M)"2+@D@%``#&0"<!B7PD"(N"2`4``(E$)`3'!"0%````Z/S___^`32@"BT=@
-MB40D",=$)`0A````BTPD.(D,).C\____BT0D-(/`/(E$)"R`?"0=`'01BU0D
-M-,="9`H```#&0B0HZRZ+3"0TQT%D$@```,9!)"J+5"0HBT((BTPD,(E,)`B+
-M5"1@B50D!(D$).C\____BT=@]D`X`71Y@'PD'0$9P(/@`H/H>(M,)#2(023&
-M024`B?#!Z!B(02:)\,'H$(A!)XGPP>@(B$$HB?*(42F)V`^L\!B(02J)V`^L
-M\!"(02N)V`^L\`B(02R(62W&02X`QD$O``^W1"0>9L'H"(A!,`^V1"0>B$$Q
-MQD$R`,9!,P#K5H!\)!T!&<"#X`*#P"B+5"0TB$(DQD(E`(G8#ZSP&(M,)#2(
-M02:)V`^L\!"(02>)V`^L\`B(02B(62G&02H`#[=$)!YFP>@(B$$K#[9$)!Z(
-M02S&02T`BU0D-(D4).C\____BT=@#[=`'(M,)#1FB4$0QD$4@(EY&(M4)"B+
-M0@B)032+1"0PB4$@B5%0QD$<((M'8`6X````B4$XQT%L0),#`,=$)`0`````
-MBU0D+(D4).C\____BTPD-(M!((E$)`R+3"0HBT$,BU$0B40D!(E4)`B+1"0L
-MB00DZ/S____&AY<````!BU0D-(E4)`2+3"0DB0PDZ/S___^%_P^$KP```(M'
-M8(7`#X2D````@+^7``````^$)`$``&:!OY0```"6`'47B40D",=$)`0A````
-MBT`LB00DZ/S___]F@Z^4`````<<$)-`'``#H_/___XM$)"2)!"3H_/___XM'
-M8(7`=$Z`OY<`````#X3.````D.NGBU0D-(!Z%`!U-+L`````@'PD'0!T+8M,
-M)"B+00B+5"0PB50D"(E$)`2+3"1@B0PDZ/S___^[`````.L'B?:[_____XM$
-M)#2#>%``=#6!>"``"```=Q6#P%")1"0$BU0D)(D4).C\____ZQ>+1"0T@\!0
-MB40D!(M,)"2)#"3H_/___XM$)#2)1"0$BU0D)(D4).C\____BTPD)(N!2`4`
-M`,9`)P")?"0(BX%(!0``B40D!,<$)`8```#H_/___X!E*/WK&KO_____ZQ-F
-M@[^4``````^%)____^E@____B=B+7"0\BW0D0(M\)$2+;"1(@\1,PXUV`(V\
-M)P````"#[!R)7"00B70D%(E\)!B+5"0@BUPD)(M"+(LXBW-(#[9#%#P@=#\\
-M('<*A,!T(SP&=Q;K+3PB="T\(I"-="8`<B"#P(`\`789N`````")]NM:BT(@
-MQT`$`````,9&9@'K!,9&9@V#>U``="F!>R``"```=Q&-0U")1"0$B3PDZ/S_
-M___K#XU#4(E$)`2)/"3H_/___XE<)`2)/"3H_/___XDT)/]6<+@!````BUPD
-M$(MT)!2+?"08@\0<PXUT)@"#[!R)7"00B70D%(E\)!B+="0@BUY@A=MU%HM$
-M)"B)!"3_5"0DZ58!``"-M@````"#?G0`=0R#?G``C;8`````=!.+1"0HB00D
-M_U0D)(UV`.DK`0``@+NT``````^%$0$``(![)O\/A0<!``"+0S2%P'0*@'@U
-M``^%]@```(M#+/9`"!`/A>D```"+.(![3P!T%(E<)`C'1"0$!@```(D$).C\
-M____BT0D)(E&=(M$)"B)1G@/MDLD#[;1B="#X`:#^`9U-/;"`0^$A@```,9#
-M)@7&0R<$B5PD#`^V0TV)1"0(BT,PB40D!(M#+(D$).C\____Z8<```"#^`0/
-MA7X```#VP0%T>8M3-(72=#`/MT(RJ`)T:H/@_6:)0C*+0S1FQT`R`0"+0S3&
-M0"8=BT,TB40D!(D\).C\____ZT+&0R8#QD,G!(E<)`2)/"3H_/___^LLQD,F
-M!<9#)P9FQX.4``````")7"0$B3PDZ/S____K#8M$)"B)!"3_5"0DB?:+7"00
-MBW0D%(M\)!B#Q!S#4X/L"(M<)!"%VP^$N````(M#;(D$).C\____B<*%P`^$
-M>P```("XI0````!T<H`+`0^V@*4````\`G4X@WMH`'49#[:#F````(/@`XA#
-M`@^V@J0```"(0P'K;0^V@YD```"(0P*+0V@/MH"D````B$,!ZU0\`W50#[:#
-MF````(/@`\'@`@*#F0```(A#`HM#:`^V@*0```"(0P'K*XUV`(M#:(7`=0N+
-M0V2%P'40B?;K%@^V@*0```"(0P'K"@^V@)(```"(0P&#Q`A;PXUV`%93@^P$
-MBW0D$(7V=&J[``````^VA#.\!```//]T-P^VP&G`*`$``(G"`Y9\!0``="2+
-M0B0E`/__`#T``/\`=17V0B<$=`^+0B"%P'0(B00DZ/S___^#PP&!^X````!U
-MLHN&2`4``#GP=0T%S`P``(D$).C\____@\0$6U[#C78`5E.#[!2+7"0@C;/,
-M#```B1PDZ/S___^)0Q2)1A2)FT@%``")GD@%``"+@U0%``")AE0%``#&@[H,
-M```!QH:Z#````8D<).C\____B1PDZ/S___^)-"3H_/___XD<).C\____A,!T
-M;HDT).C\____A,!T8HD<).C\____QP0DT`<``.C\____B1PDZ/S____'@S0!
-M``#H`P``QX,\`0```````(F;0`$``(V#-`$``(E$)`2+0Q2)!"3H_/___\=$
+M)@"-O"<`````@^P,BU0D$(M$)!2(0C,/ML")1"0$B10DZ/S___^X`0```(/$
+M#,.-=@"-O"<`````4X/L"(M<)!")'"3H_/___XN#1`4```7(#```B00DZ/S_
+M__^#Q`A;PY"-M"8`````4X/L"(M<)!")'"3H_/___XN#1`4```7(#```B00D
+MZ/S___^#Q`A;PY"-M"8`````@^P,BT0D$(D$).C\____N@$```"#/0``````
+M=0,/MM")T(/$#,.-=@"-O"<`````@^PLB5PD'(ET)"")?"0DB6PD*(G#B=>)
+MS8MP8(M`;(E$)!2%]@^$-0$``("[EP`````/A2@!``")!"3H_/___XE$)!B%
+MP`^$%`$``,9`).'&0"4!B?J$TG0-B>@\`1G`]]"#P`?K#(GJ@/H!&<#WT(/`
+M#8M4)!B(0B;&0A2`#[=&'&:)0A")6AC'0B``````QT(T`````,=";&"A`@")
+M5"0$BT0D%(D$).C\____QH.7`````6;'@Y0```#T`87;=%F+0V"%P'1<9H&[
+ME````)8`=1>)1"0(QT0D!"$```"+0"R)!"3H_/___V:#JY0````!QP0DT`<`
+M`.C\____BU0D%(D4).C\____BT-@A<!T"8"[EP````!UKF:#NY0`````=!R+
+M1"08@'@4`'42BT-@#[=`.F:)0UJ[`````.L%N_____^+5"08B50D!(M$)!2)
+M!"3H_/___^L)C70F`+O_____B=B+7"0<BW0D((M\)"2+;"0H@\0LPY"-="8`
+M@^Q,B5PD/(ET)$")?"1$B6PD2(MT)%`/MFPD5(M^8(M&;(E$)""%_P^$\@0`
+M`("^EP`````/A>4$``")!"3H_/___XE$)"2%P`^$T00``/8&`@^%!`$``(GJ
+M@/H4=PL/ML*-!$#!X`+K&+B)____B>KVXF;!Z`C`Z`0/ML`%\````(M4)"3&
+M0B3AQD(E`<9")AR(0B?&0A2`#[=''&:)0A")<AC'0B``````QT(T`````,="
+M;&"A`@")5"0$BT0D((D$).C\____QH:7`````6;'AI0```#$"87V=%F+1F"%
+MP'1@9H&^E````)8`=1>)1"0(QT0D!"$```"+0"R)!"3H_/___V:#KI0````!
+MQP0DT`<``.C\____BU0D((D4).C\____BT9@A<!T"8"^EP````!UKF:#OI0`
+M````#X2\`P``NP````"+1"0D@'@4``^$K@,``.FD`P``BU0D((D4).C\____
+MB40D.(7`#X2,`P``BUPD)(/#/(M`"(E$)!R+1"0DQD`D&L9`)0C&0"8:QD`G
+M`,9`*!#&0"D`BT0D.(M4)"2)0E#&0A2`#[=''&:)0A")<AB+1"0XBT`(B4(T
+MQT(@$````(M&8`6X````B4(XQD(<(,=";&"A`@#'1"0$`````(D<).C\____
+MBU0D)(M"((E$)`R+1"0XBU`0BT`,B40D!(E4)`B)'"3H_/___XM$)"2)1"0$
+MBU0D((D4).C\____QH:7`````6;'AI0```#Z`(7V=%F+1F"%P'1<9H&^E```
+M`)8`=1>)1"0(QT0D!"$```"+0"R)!"3H_/___V:#KI0````!QP0DT`<``.C\
+M____BT0D((D$).C\____BT9@A<!T"8"^EP````!UKF:#OI0`````=`J+5"0D
+M@'H4`'0>C40D.(E$)`2+1"0@B00DZ/S___^[_____^D^`@``BU0D)(E4)`2+
+M1"0@B00DZ/S___^+5"0@B10DZ/S___^)1"0DA<!U(8U$)#B)1"0$BT0D((D$
+M).C\____N______I&`(``(UV`(M4)"2#PCR)5"0HBTPD'(/!!(M4)!P/MD(#
+M#[8$`8A"!,9!`0K&00(`N`````"+5"0<Q@00`(/``8/X!'7PB>B$P'4&@&$#
+M_.M-B>@/MM!ITF#J``"X'X7K4??JP?H%@$D#`XG5P>T8B>B(002)T\'K$(A9
+M!8G0P>@(B40D&(A!!HA1!XGHB$$(B%D)#[9$)!B(00J(40N+1"0XBU0D)(E"
+M4,9")!4/M@'`^`?WT(/`$8A")<9")@#&0B<`QD(H$,9"*0"`(3_&0A2`#[='
+M'&:)0A")<AB+1"0XBT`(B4(TQT(@$````(M&8`6X````B4(XQD(<(,=";&"A
+M`@#'1"0$`````(M$)"B)!"3H_/___XM4)"2+0B")1"0,BT0D.(M0$(M`#(E$
+M)`2)5"0(BT0D*(D$).C\____BU0D)(E4)`2+1"0@B00DZ/S____&AI<````!
+M9L>&E````/H`A?9T68M&8(7`=%QF@;Z4````E@!U%XE$)`C'1"0$(0```(M`
+M+(D$).C\____9H.NE`````''!"30!P``Z/S___^+5"0@B10DZ/S___^+1F"%
+MP'0)@+Z7`````'6N9H.^E`````!T#[L`````BT0D)(!X%`!T!;O_____C40D
+M.(E$)`2+5"0@B10DZ/S____K!I"[_____XM$)"2)1"0$BU0D((D4).C\____
+MZPJ0C70F`+O_____B=B+7"0\BW0D0(M\)$2+;"1(@\1,PY"-="8`@^Q,B5PD
+M/(ET)$")?"1$B6PD2(M\)%"+7"14BW0D6`^W1"1<9HE$)!X/ME0D9(A4)!V+
+M;V"%[0^$Z0,``("_EP`````/A=P#``"+32R)3"0XBT=LB40D)&;'AY0````0
+M)XD$).C\____B40D-(7`#X2Q`P``#[=4)!Z)5"0@9H-\)!X$=A*)5"0$QP0D
+M-`(``.C\____ZQ2+3"0DB0PDZ/S___^)1"0HA<!U'HM$)#2)1"0$BU0D)(D4
+M).C\____N______I=@,``(M,)"#!X0F)3"0PBU0D)(N"1`4``,9`)P&)?"0(
+MBX)$!0``B40D!,<$)`4```#H_/___X!-*`*+1V")1"0(QT0D!"$```"+3"0X
+MB0PDZ/S___^+1"0T@\`\B40D+(!\)!T`=!&+5"0TQT)D"@```,9")"CK+HM,
+M)#3'0602````QD$D*HM4)"B+0@B+3"0PB4PD"(M4)&")5"0$B00DZ/S___^+
+M1V#V0#@!='F`?"0=`1G`@^`"@^AXBTPD-(A!),9!)0")\,'H&(A!)HGPP>@0
+MB$$GB?#!Z`B(02B)\HA1*8G8#ZSP&(A!*HG8#ZSP$(A!*XG8#ZSP"(A!+(A9
+M+<9!+@#&02\`#[=$)!YFP>@(B$$P#[9$)!Z(03'&03(`QD$S`.M6@'PD'0$9
+MP(/@`H/`*(M4)#2(0B3&0B4`B=@/K/`8BTPD-(A!)HG8#ZSP$(A!)XG8#ZSP
+M"(A!*(A9*<9!*@`/MT0D'F;!Z`B(02L/MD0D'HA!+,9!+0"+5"0TB10DZ/S_
+M__^+1V`/MT`<BTPD-&:)01#&012`B7D8BU0D*(M""(E!-(M$)#")02")45#&
+M01P@BT=@!;@```")03C'06Q@H0(`QT0D!`````"+5"0LB10DZ/S___^+3"0T
+MBT$@B40D#(M,)"B+00R+41")1"0$B50D"(M$)"R)!"3H_/___\:'EP````&+
+M5"0TB50D!(M,)"2)#"3H_/___X7_#X2O````BT=@A<`/A*0```"`OY<`````
+M#X0D`0``9H&_E````)8`=1>)1"0(QT0D!"$```"+0"R)!"3H_/___V:#KY0`
+M```!QP0DT`<``.C\____BT0D)(D$).C\____BT=@A<!T3H"_EP`````/A,X`
+M``"0ZZ>+5"0T@'H4`'4TNP````"`?"0=`'0MBTPD*(M!"(M4)#")5"0(B40D
+M!(M,)&")#"3H_/___[L`````ZP>)]KO_____BT0D-(-X4`!T-8%X(``(``!W
+M%8/`4(E$)`2+5"0DB10DZ/S____K%XM$)#2#P%")1"0$BTPD)(D,).C\____
+MBT0D-(E$)`2+5"0DB10DZ/S___^+3"0DBX%$!0``QD`G`(E\)`B+@40%``")
+M1"0$QP0D!@```.C\____@&4H_>L:N______K$V:#OY0`````#X4G____Z6#_
+M__^)V(M<)#R+="1`BWPD1(ML)$B#Q$S#C78`C;PG`````(/L'(E<)!")="04
+MB7PD&(M4)""+7"0DBT(LBSB+<T@/MD,4/"!T/SP@=PJ$P'0C/`9W%NLM/")T
+M+3PBD(UT)@!R((/`@#P!=AFX`````(GVZUJ+0B#'0`0`````QD9F`>L$QD9F
+M#8-[4`!T*8%[(``(``!W$8U#4(E$)`2)/"3H_/___^L/C4-0B40D!(D\).C\
+M____B5PD!(D\).C\____B30D_U9PN`$```"+7"00BW0D%(M\)!B#Q!S#C70F
+M`(/L'(E<)!")="04B7PD&(MT)""+7F"%VW46BT0D*(D$)/]4)"3I5@$``(VV
+M`````(-^=`!U#(-^<`"-M@````!T$XM$)"B)!"3_5"0DC78`Z2L!``"`N[0`
+M````#X41`0``@'LF_P^%!P$``(M#-(7`=`J`>#4`#X7V````BT,L]D`($`^%
+MZ0```(LX@'M/`'04B5PD",=$)`0&````B00DZ/S___^+1"0DB49TBT0D*(E&
+M>`^V2R0/MM&)T(/@!H/X!G4T]L(!#X2&````QD,F!<9#)P2)7"0,#[9#38E$
+M)`B+0S")1"0$BT,LB00DZ/S____IAP```(/X!`^%?@```/;!`71YBU,TA=)T
+M,`^W0C*H`G1J@^#]9HE",HM#-&;'0#(!`(M#-,9`)AV+0S2)1"0$B3PDZ/S_
+M___K0L9#)@/&0R<$B5PD!(D\).C\____ZRS&0R8%QD,G!F;'@Y0``````(E<
+M)`2)/"3H_/___^L-BT0D*(D$)/]4)"2)]HM<)!"+="04BWPD&(/$',-3@^P(
+MBUPD$(7;#X2X````BT-LB00DZ/S___^)PH7`#X1[````@+BE`````'1R@`L!
+M#[:`I0```#P"=3B#>V@`=1D/MH.8````@^`#B$,"#[:"I````(A#`>MM#[:#
+MF0```(A#`HM#:`^V@*0```"(0P'K5#P#=5`/MH.8````@^`#P>`"`H.9````
+MB$,"BT-H#[:`I````(A#`>LKC78`BT-HA<!U"XM#9(7`=1")]NL6#[:`I```
+M`(A#`>L*#[:`D@```(A#`8/$"%O#C78`5E.#[`2+="00A?9T:KL`````#[:$
+M,[@$```\_W0W#[;`:<`H`0``B<(#EG@%``!T)(M")"4`__\`/0``_P!U%?9"
+M)P1T#XM"((7`=`B)!"3H_/___X/#`8'[@````'6RBX9$!0``.?!U#07(#```
+MB00DZ/S___^#Q`1;7L.-=@!64X/L%(M<)""-L\@,``")'"3H_/___XE#%(E&
+M%(F;1`4``(F>1`4``(N#4`4``(F&4`4``,:#M@P```'&AK8,```!B1PDZ/S_
+M__^)'"3H_/___XDT).C\____QT0D!`````")'"3H_/___XD<).C\____A,!T
+M;HDT).C\____A,!T8HD<).C\____QP0DT`<``.C\____B1PDZ/S____'@S`!
+M``#H`P``QX,X`0```````(F;/`$``(V#,`$``(E$)`2+0Q2)!"3H_/___\=$
M)`0`````B1PDZ/S___^X`0```.L%N`````"#Q!1;7L-3@^P(BUPD$(D<).C\
-M____@</,#```B1PDZ/S___^X`0```(/$"%O#D(VT)@````!55U93@^P\@SWD
-M`0````^%@0$``,<%Y`$```$```#'1"0X`````.F\`@``D(UT)@`/MX8>`@``
+M____@</(#```B1PDZ/S___^X`0```(/$"%O#D(VT)@````!55U93@^P\@SW$
+M`0````^%@0$``,<%Q`$```$```#'1"0X`````.F\`@``D(UT)@`/MX8>`@``
MP>`0#[>6'`(```G0.40D*`^%$P$``+\`````N0````")?"0P9H.Y``````!U
M>XGZP>(%BX8<`@``B8(`````BX8@`@``B8($````BX8D`@``B8((````#[:"
M'````(T,_0````"-!`$/MEPD+X@<A0T````/MH(<````C00!#[9<)"Z('(4.
M````#[:"'`````'!Q@2-#P````"`@AP````!ZWF0C70F``^VF1P```")V+H`
M````][8P`@``A=)T38M,)##!X0.-!!D/ME0D+X@4A0T```"+5"0PP>(%#[:"
M'````(T$`0^V7"0NB!R%#@````^V@AP````!P<8$C0\`````@((<`````>L/
-M@\<!@\$@@_\$#X4#____@X8H`@```9"-="8`@\4!@\88.RT`&```#X6^_O__
+M@\<!@\$@@_\$#X4#____@X8H`@```9"-="8`@\4!@\88.RV@#0``#X6^_O__
M@T0D-`&#?"0T(`^%&`$``(-$)#@!@7PD./\````/A5(!``"#?"14`'0'BW0D
-M5,8&`(L=`!@``,=$)"0`````A=M^.;D`````QT0D)`````"Z`````(N"*`(`
+M5,8&`(L=H`T``,=$)"0`````A=M^.;D`````QT0D)`````"Z`````(N"*`(`
M``%$)"2#?"14`'0,BX(L`@``BW0D5``&@\$!@\(8.=EUV8-\)%@`#X0!`0``
MO0````"[`````&:#NP``````#X3I````#[:#'````(E$)""%P'YJQT0D&```
M``"-%.T`````B50D'(M$)!P#1"08C32%#````(M\)%BX!````/R)P?.F#Y?"
M#Y+`.,)U(8-\)%0`=`T/MH,=````BW0D5(@&#[:#'````(E$)"3K#X-$)!@!
MBU0D(#E4)!AUJ8/%`8/#((/]!'1EZ6G___\/MDPD-(A,)"['1"0,`````,=$
-M)`@`````BUPD-(E<)`2+="0XB30DZ/S___^)1"0HO0````"^`````(,]`!@`
+M)`@`````BUPD-(E<)`2+="0XB30DZ/S___^)1"0HO0````"^`````(,]H`T`
M```/CT[]___IB_[__P^V1"0XB$0D+\=$)#0`````ZZ`/MD0D)(/$/%M>7UW#
MB?:-O"<`````@^P<B5PD$(ET)!2)?"08BT0D(`^V="0DBWALBUA@]@`!='6+
M4S"%TG09B?$/ML&)1"0(#[9#38E$)`2)%"3H_/___XN3Y````(72=!R)\0^V
@@ -5401,18 +4025,18 @@ MB?(/ML*)1"0(BT,@B40D!(D\).C\____ZQB)\0^VP8E$)`B+0R")1"0$B3PD
MZ/S___^+7"00BW0D%(M\)!B#Q!S#@^P\B5PD+(ET)#")?"0TB6PD.(M\)$`/
MMG0D1(M?8(MO;(7;#X1V`P``@+^7``````^%:0,``/8'`@^%8`,```^V@R0!
M``"$P'0+B?(XT'5#Z4H#```/MH/;````B40D$`^V!X/@`0^VP(E$)`P/MD<"
-MB40D"`^V1P&)1"0$QP0D(`H``.C\____N______I$0,``(DL).C\____B40D
+MB40D"`^V1P&)1"0$QP0DJ`H``.C\____N______I$0,``(DL).C\____B40D
M'(7`#X3X`@``B?(/ML*)1"04BT=@#[:`VP```(E$)!`/M@>#X`$/ML")1"0,
-M#[9'`HE$)`@/MD<!B40D!,<$)&@*``#H_/___XM$)!S&0"3AQD`E`8GR@/H"
+M#[9'`HE$)`@/MD<!B40D!,<$)/`*``#H_/___XM$)!S&0"3AQD`E`8GR@/H"
M#Y7`@\`:BU0D'(A")L9"%(`/MT,<9HE"$(EZ&,="(`````#'0C0`````QT)L
-M0),#`(E4)`2)+"3H_/___\:'EP````%FQX>4````]`&%_W15BT=@A<!T7&:!
+M8*$"`(E4)`2)+"3H_/___\:'EP````%FQX>4````]`&%_W15BT=@A<!T7&:!
MOY0```"6`'47B40D",=$)`0A````BT`LB00DZ/S___]F@Z^4`````<<$)-`'
M``#H_/___XDL).C\____BT=@A<!T"8"_EP````!ULF:#OY0`````#X39`0``
MBT0D'(!X%``/A<L!``"+5V")5"0HBT(LBP")1"0DB00DZ/S___^)PX7`=1"+
M1"0HQH"U`````>FB`0``BU0D)(D4).C\____B<:%P'4EBT0D*,:`M0````&)
M7"0$BU0D)(D4).C\____NP````#I:P$``(U#/(E$)"#&0R3AQD,E`<9#)@.+
M5"0H#[="'&:)0Q#&0V@/B7L8QT,@``(``(M6"(E3-+@`````Q@00`(/``3T`
-M`@``=?*)<U#'0VQ`DP,`QT0D!`````"+1"0@B00DZ/S___^+0R")1"0,BT8,
+M`@``=?*)<U#'0VQ@H0(`QT0D!`````"+1"0@B00DZ/S___^+0R")1"0,BT8,
MBU80B40D!(E4)`B+5"0@B10DZ/S___^)7"0$BT0D)(D$).C\____QH>7````
M`6;'AY0```#Z`(7_=%F+1V"%P'1<9H&_E````)8`=1>)1"0(QT0D!"$```"+
M0"R)!"3H_/___V:#KY0````!QP0DT`<``.C\____BU0D)(D4).C\____BT=@
@@ -5420,46 +4044,46 @@ MA<!T"8"_EP````!UKF:#OY0`````="J`>Q0`=22+0S2)1"0$BT0D*(D$).C\
M____BU0D*`^V@B0!``"(AYL```"#>U``=!.-0U")1"0$BT0D)(D$).C\____
MB5PD!(M4)"2)%"3H_/___[L`````ZP6[_____XM$)!R)1"0$B2PDZ/S____K
M"(UV`+O_____B=B+7"0LBW0D,(M\)#2+;"0X@\0\PY"-="8`@^P<B5PD#(ET
-M)!")?"04B6PD&(MT)""+5"0D@#H)=Q`/M@+_)(7`%0``C;8`````N/_____I
-M2@$``(M2!(N"3`4``(7`=0F)T(VT)@````"+@$@%``#&@+L,```!B00DZ/S_
-M__^X`````.D5`0``#[9*!+H`````B?#H(>C__^D``0``#[9*!+H!````B?#H
-M#.C__^GK````#[9"!(E$)`2)-"3H_/___^G6````#[9J!(M^;(M>8+C_____
-M]D98"`^$O0```(ET)`B+AT@%``")1"0$QP0D!0```.C\____@$LH`HE<)`C'
+M)!")?"04B6PD&(MT)""+5"0D@#H)=Q`/M@+_)(5@"P``C;8`````N/_____I
+M2@$``(M2!(N"2`4``(7`=0F)T(VT)@````"+@$0%``#&@+<,```!B00DZ/S_
+M__^X`````.D5`0``#[9*!+H`````B?#H$>C__^D``0``#[9*!+H!````B?#H
+M_.?__^GK````#[9"!(E$)`2)-"3H_/___^G6````#[9J!(M^;(M>8+C_____
+M]D98"`^$O0```(ET)`B+AT0%``")1"0$QP0D!0```.C\____@$LH`HE<)`C'
M1"0$(0```(M#+(D$).C\____@'M/`'0:QP0DT`<``.C\____B3PDZ/S___^`
-M>T\`=>:)Z(3`=`QF@TY:$&:#2SH0ZPIF@V9:[V:#8SKOB70D"(N'2`4``(E$
+M>T\`=>:)Z(3`=`QF@TY:$&:#2SH0ZPIF@V9:[V:#8SKOB70D"(N'1`4``(E$
M)`3'!"0&````Z/S___^`8RC]N`````#K)P^V0@2)1"0$B30DZ/S____K%0^V
M0@2)1"0$B30DZ/S___^X`````(M<)`R+="00BWPD%(ML)!B#Q!S#D(VT)@``
-M``"#[$R)7"1`B70D1(E\)$B+?"10BW=LBX9(!0``@'@G``^%N@```(M?<(M7
+M``"#[$R)7"1`B70D1(E\)$B+?"10BW=LBX9$!0``@'@G``^%N@```(M?<(M7
M8`^V@J<```")1"0T#[:"I@```(E$)#`/MH*E````B40D+`^V@J0```")1"0H
M#[:"HP```(E$)"0/MH*B````B40D(`^V@J$```")1"0<#[:"H````(E$)!@/
MMH+;````B40D%`^V!X/@`0^VP(E$)!`/MD<"B40D#`^V1P&)1"0(BT<(B40D
-M!,<$)*P*``#H_/___\='<`````"+1PB)1"0(B7PD!(M'>(D$)/_3ZSV0C70F
-M`(U??(E<)`2+1A2)!"3H_/___\='?/0!``#'AX0```!`N@,`B;^(````B5PD
+M!,<$)#0+``#H_/___\='<`````"+1PB)1"0(B7PD!(M'>(D$)/_3ZSV0C70F
+M`(U??(E<)`2+1A2)!"3H_/___\='?/0!``#'AX0```!@R`(`B;^(````B5PD
M!(M&%(D$).C\____BUPD0(MT)$2+?"1(@\1,PY"-M"8`````55=64X/L'`^W
-M1"0X:<`H`0``B<6+5"0P`ZI\!0``B[I(!0``@<?,#```BTPD-(EI8(E-((-]
-M,`!U+8-]-`!U)P^V<BN)\X3;#X0@!```BUTLN0`````[FJ0+```/A-T#``#I
+M1"0X:<`H`0``B<6+5"0P`ZIX!0``B[I$!0``@<?(#```BTPD-(EI8(E-((-]
+M,`!U+8-]-`!U)P^V<BN)\X3;#X0@!```BUTLN0`````[FJ`+```/A-T#``#I
M^0,``(M$)#2`"`&+132+5"0TB4)HBT4PB4)DBTPD,`^V<2N)\X3;=%.+72RY
-M`````(M$)#`[F*0+``!T&NLO#[;!B<+!X@:-!(*+5"0P.9P"I`L``'4<BUPD
-M,`^V0RF-!(&+5"0TB(*8````ZPZY`````(/!`8GP.,%UPXM4)#"+BD@%```/
-MMH$\!0``NP`````\_W0DBU4PA=)T&`^VP&G`%`T```.!M`4``+L`````.<)T
-M*KL!````#[:!/04``#S_="N+53"%TG0A#[;`:<`4#0```X&T!0``.<)U#HM,
-M)#2(60'IW@```(GV@\,!N@`````/MH0*/@4``#S_=",/ML!IP+`````#@9@%
-M```[131U#(M\)#2(7P'IJ````(/#`8/"`8/Z!'7)B=D/MH<\!0``//]T)(M5
-M,(72=06-60'K&`^VP&G`%`T```.'M`4``#G"=>CK*(UV``^VAST%```\_W0H
-MBU4PA=)T'@^VP&G`%`T```.'M`4``#G"=0N+1"0TB%@!ZSZ)]H/#`;H`````
-M#[:$.CX%```\_W0@#[;`:<"P`````X>8!0``.T4T=0F+5"0TB%H!ZPN#PP&#
-MP@&#^@1US(M,)#"`>3D!=4B+53"%TG08QT0D"``````/MD5-B40D!(D4).C\
+M`````(M$)#`[F*`+``!T&NLO#[;!B<+!X@:-!(*+5"0P.9P"H`L``'4<BUPD
+M,`^V0RF-!(&+5"0TB(*8````ZPZY`````(/!`8GP.,%UPXM4)#"+BD0%```/
+MMH$X!0``NP`````\_W0DBU4PA=)T&`^VP&G`%`T```.!L`4``+L`````.<)T
+M*KL!````#[:!.04``#S_="N+53"%TG0A#[;`:<`4#0```X&P!0``.<)U#HM,
+M)#2(60'IW@```(GV@\,!N@`````/MH0*.@4``#S_=",/ML!IP+`````#@90%
+M```[131U#(M\)#2(7P'IJ````(/#`8/"`8/Z!'7)B=D/MH<X!0``//]T)(M5
+M,(72=06-60'K&`^VP&G`%`T```.'L`4``#G"=>CK*(UV``^VASD%```\_W0H
+MBU4PA=)T'@^VP&G`%`T```.'L`4``#G"=0N+1"0TB%@!ZSZ)]H/#`;H`````
+M#[:$.CH%```\_W0@#[;`:<"P`````X>4!0``.T4T=0F+5"0TB%H!ZPN#PP&#
+MP@&#^@1US(M,)#"`>34!=4B+53"%TG08QT0D"``````/MD5-B40D!(D4).C\
M____BY7D````A=(/A+<!``#'1"0(``````^VA=D```")1"0$B10DZ/S___^#
MO>0`````#X2/`0``BW4P@'XP`'16OP````"-7BB-="8`B5PD&(D<).C\____
MC4CXBU8LB48LB5D(B5$,B0*`N=L```#_=0^`>24`=0F#N>0`````=0J#QP&)
M^#A&,'?!B?HX5C`/A90````/MH7;````BTPD-(A!`H!^,``/A(X!``"[````
M`(U^*(VV`````(D\).C\____C4CXBU8LB48LB7D(B5$,B0*+02"%P'1`#[:1
-MVP```#A0`G0T@WAP`'4N@WAT`'4HB%`"#[=!'(E$)`B+5"0PBX)(!0``B40D
+MVP```#A0`G0T@WAP`'4N@WAT`'4HB%`"#[=!'(E$)`B+5"0PBX)$!0``B40D
M!,<$)`<```#H_/___XUV`(/#`3A>,`^&%`$``.N2#[9%38M,)#2(00+&A=L`
M``#_@'XP``^$]@```+L`````D(M\)!B)/"3H_/___XU(^(M6+(E&+(EY"(E1
M#(D"@+G;````_W1*QH';````_XM!((7`=#P/ME%-.%`"=#.#>'``=2V#>'0`
-M=2>(4`(/MT$<B40D"(M4)#"+@D@%``")1"0$QP0D!P```.C\____B?:#PP$X
-M7C!V>.N&#[9%38M,)#2(00+K:0^VP8G"P>(&C02"BWPD,#F<!Z0+``!U)HM4
+M=2>(4`(/MT$<B40D"(M4)#"+@D0%``")1"0$QP0D!P```.C\____B?:#PP$X
+M7C!V>.N&#[9%38M,)#2(00+K:0^VP8G"P>(&C02"BWPD,#F<!Z`+``!U)HM4
M)#`/MD(IC02!BUPD-(A#`8B#F````#A**W4:ZQ")]KD`````@\$!B?`XP76Y
MBU0D-,9"`?^+3"0TQD$"`(.]'`$```!T"8N%(`$``(A!`HM,)#2#P2"-562+
M162+7"0TB4,@BT($B4$$BT((B4$(BT(,B4$,BT(0B4$0BT(4B4$4BT(8B4$8
@@ -5469,20 +4093,20 @@ MBT5$BU5(B4-0B5-4#[9%3HA#7`^VA20!``"(@YL```#V12@$=0R+?"0PB3PD
MZ/S___\/ME4DB="#X`:#^`9U#O;"`74)BT0D-(`(`NL'BU0D-(`B_0^V52C0
MZH/B!(M,)#0/M@&#X/L)T(@!#[9!`8B!F@````^V00*(@9D```")#"3H_/__
M_\=$)`@`````BT4@B40D!(M<)#")'"3H_/___XM\)#2)/"3H__C__X/$'%M>
-M7UW#C;0F`````(/L'(E<)!2)="08BW0D((N>2`4``(DT).C\____@'XY`74M
-MC8/,#```@'@Y`71?@+[$#````'48QT0D!`````")!"3H_/___X"&Q`P```&0
-MC9XT`0``B5PD!(M&%(D$).C\____QX8T`0``Z`,``,>&/`$```````")MD`!
+M7UW#C;0F`````(/L'(E<)!2)="08BW0D((N>1`4``(DT).C\____@'XU`74M
+MC8/(#```@'@U`71?@+[`#````'48QT0D!`````")!"3H_/___X"&P`P```&0
+MC9XP`0``B5PD!(M&%(D$).C\____QX8P`0``Z`,``,>&.`$```````")MCP!
M``")7"0$BT84B00DZ/S___^+7"04BW0D&(/$',.-M@````!55U93@^Q,BT0D
-M9(M0&(E4)""+0!R)1"08#[9*"XE,)!R+5"1@BX)(!0``BYA(!0``O@````"_
-M`````+D`````#[:4&3P%``"`^O]T1HV!@````&8]@0!W!X/&`>LUB?8/ML*+
-MDY@%``!IP+````"`O!"E`````W47@\<!C4<#@_@&=@^#Q@&_`````.L%B?:#
-MQ@&#P0&#^09UI8GUBYM(!0``@</,#```L0"0C70F``^VE!D\!0``@/K_=$:-
-M@8````!F/8$`=P>#Q@'K-8GV#[;"BY.8!0``:<"P````@+P0I0````-U%X/'
+M9(M0&(E4)""+0!R)1"08#[9*"XE,)!R+5"1@BX)$!0``BYA$!0``O@````"_
+M`````+D`````#[:4&3@%``"`^O]T1HV!@````&8]@0!W!X/&`>LUB?8/ML*+
+MDY0%``!IP+````"`O!"E`````W47@\<!C4<#@_@&=@^#Q@&_`````.L%B?:#
+MQ@&#P0&#^09UI8GUBYM$!0``@</(#```L0"0C70F``^VE!DX!0``@/K_=$:-
+M@8````!F/8$`=P>#Q@'K-8GV#[;"BY.4!0``:<"P````@+P0I0````-U%X/'
M`8U'`X/X!G8/@\8!OP````#K!8GV@\8!@\$!@_D&=:4Y="0<#XT\"0``.VPD
-M'`^>P(M,)&C'`0`````\_P^$'`D```^VP&G`S`P``(M4)&`#@D@%``")!"3H
+M'`^>P(M,)&C'`0`````\_P^$'`D```^VP&G`R`P``(M4)&`#@D0%``")!"3H
M_/___XG!A<`/A/<(``"+1"08B40D)`^V@:4````\`@^%!`(``(M4)&C'`@0`
-M``"+1"0@#[9P!XL1#[=!)+L`````@+P"O`0``/\/A-$!``")\H#Z(P^'MP$`
-M``^VPO\DA>@5``"+3"0DQP%%4P,1N`$```#II0$``(U$)$B)1"0,QT0D"!`#
+M``"+1"0@#[9P!XL1#[=!)+L`````@+P"N`0``/\/A-$!``")\H#Z(P^'MP$`
+M``^VPO\DA8@+``"+3"0DQP%%4P,1N`$```#II0$``(U$)$B)1"0,QT0D"!`#
M``#'1"0$`0```(D,).C\____A,`/A'$!``"+1"1(A<`/A&P!```E_P,``&G`
M$"<``(V($):O_[ISB*M,B<CWXHG(*=#1Z`'"P>H'BTPD)(D1N`$```#I/`$`
M`(U$)$B)1"0,QT0D"`@#``#'1"0$`0```(D,).C\____A,`/A`@!``"+1"1(
@@ -5493,11 +4117,11 @@ M:RBOB<CWXHG(*=#1Z`'"P>H$BTPD)(D1N`$```#K:HU$)$B)1"0,QT0D"`P#
M``#'1"0$`0```(D,).C\____A,!T.HM$)$B%P'0Y)?\#``!IP.@#``"-B,CE
M]_^ZRVLHKXG(]^*)R"G0T>@!PL'J!(M,)"2)$;@!````ZPRX`````.L%N`$`
M```/MM@/ML/I\@8``#P##X74!@``BT0D:,<`!````(M4)"`/ME('B%0D*\=$
-M)#@`````QT0D/`````#'1"1``````,=$)$0`````BQ$/MJKE````A>T/CH\`
-M``"_`````,=$)!0`````N`$```")QHGYT^:+3"04#[:$$3X%```\_W0?#[;`
-M:<"P````B<,#FI@%``"+0U2+0!@/MD`&.?!T$H-$)!0!@WPD%`0/A"P&``#K
-MOX7;#X0B!@``#[=#)("\`KP$``#_#X00!@``@+NE`````P^%`P8``(E<O#B#
-MQP$Y_0^%=O___X!\)"M5#X?;!0``#[9$)"O_)(5X%@``BT0D),<`0`,#$;@!
+M)#@`````QT0D/`````#'1"1``````,=$)$0`````BQ$/MJKA````A>T/CH\`
+M``"_`````,=$)!0`````N`$```")QHGYT^:+3"04#[:$$3H%```\_W0?#[;`
+M:<"P````B<,#FI0%``"+0U2+0!@/MD`&.?!T$H-$)!0!@WPD%`0/A"P&``#K
+MOX7;#X0B!@``#[=#)("\`K@$``#_#X00!@``@+NE`````P^%`P8``(E<O#B#
+MQP$Y_0^%=O___X!\)"M5#X?;!0``#[9$)"O_)(48#```BT0D),<`0`,#$;@!
M````Z<`%``"-1"1(B40D#,=$)`@T`P``QT0D!`$````/MD0D*X/``8/@`XM$
MA#B)!"3H_/___X3`#X2$!0``#[=4)$B)5"1(@?K__P``=12+5"0DQP+_____
MN`$```#I9`4``+C`X>0`B=&Z`````/?QBU0D)(D"N`$```#I1@4``(U$)$B)
@@ -5533,11 +4157,11 @@ M`0"+1"0\B00DZ/S___^X`0```.M`BU0D((!Z"`!T$(M$)#R!H*@```#___W_
MZPZ+1"0\@8BH```````"`(M$)#R)!"3H_/___[@!````ZP6X``````^VP.L)
MC70F`+@`````#[;`ZQ:X`````.L/BTPD:,<!`````+@`````@\1,6UY?7<.0
MC;0F`````%575E.#[&R+O"2`````BX0DA````(NT)(P```")Q<'M&(G"P>H0
-MB%0D0`^VS(A,)#"(1"0OBYPDB````('#S`P``+@`````BY0DB````,8$$`"#
-MP`$]F!L``'7KB7(0H>`!``"(0BB#P`&CX`$``(GIB$HC#[9$)$"(0B(/MDPD
+MB%0D0`^VS(A,)#"(1"0OBYPDB````('#R`P``+@`````BY0DB````,8$$`"#
+MP`$]D!L``'7KB7(0H<`!``"(0BB#P`&CP`$``(GIB$HC#[9$)$"(0B(/MDPD
M,(A*(0^V1"0OB$(@QD(I``^W!V:)0A@/MT<"9HE"&HM'!(E"'(N4)(@```"!
-MPI@9``"+C"2(````B9'(#```B7,0#[9!*(A#*(GHB$,C#[9,)$"(2R(/MD0D
-M,(A#(0^V3"0OB$L@QD,I`0^W!V:)0Q@/MT<"9HE#&HM'!(E#'(F3R`P``(N4
+MPI`9``"+C"2(````B9'$#```B7,0#[9!*(A#*(GHB$,C#[9,)$"(2R(/MD0D
+M,(A#(0^V3"0OB$L@QD,I`0^W!V:)0Q@/MT<"9HE#&HM'!(E#'(F3Q`P``(N4
M)(@````/MT(:9CTD)P^$(P$``&8])"</AXP```!F/40A#X0/`0``9CU$(7=,
M9CT@(0^$_P```&8]("%W$68]4`</A0H!``")]NGH````9CTB(8VT)@`````/
MA-<```!F/4`AC;8`````#X7B````Z<(```"0C70F`&8]$"</@LX```!F/1$G
@@ -5548,7 +4172,7 @@ ME'5`ZR.-M@````"+C"2(````9L=!)("1QD$F!&;'0R2`D<9#)@3K&XN$)(@`
M``!FQT`D@)3&0"8$9L=#)("4QD,F!`^V1PB+E"2(````B$(J#[9'"(A#*L=$
M)`P```0`QT0D"`````#'1"0$`@```(DT).C\____BXPDB````(D!QT0D#``@
M``#'1"0(`````,=$)`0`````B30DZ/S___^)P8NT)(@```")1@B+!H7`#X3M
-M`0``A<D/A.4!``"-D``"`0")5@2-@````@")!@4`0```B0.)4P2)2PB+-0`8
+M`0``A<D/A.4!``"-D``"`0")5@2-@````@")!@4`0```B0.)4P2)2PB+-:`-
M``"%]GY?NP````"Y``````^W@1P"``!F.P=U/P^W@1X"``!F.T<"=3*+D2P"
M``"#P@&)D2P"``"+@2@"``")1"08A<!T%3G"=A&)T+H`````]W0D&(F1+`(`
M`(/#`8/!&#GS=:N+E"2(````BT($+>!]``#'``'P`P"+0@0MV'T``,<``0``
@@ -5558,4077 +4182,3711 @@ M)#"(3"1=#[9$)"^(1"1<QT0D*`````"]`````&:#O0``````#X2@````@+T<
M``````^$@````+L`````BU0D*,'B`XE4)"2-3"1<B4PD'(M$)"0!V(TTA0P`
M``"Y!````/R+?"0<\Z8/E\(/DL`XPG4W#[:%'0```(/``8B%'0````^VE1P`
M``"$TG0<.-!V&`^VP`^VRKH`````9O?QB)4=````C70F`(/#`0^VA1P````Y
-MV'^8@T0D*`&#Q2"#?"0H!`^%4O___XNT)(@```#'AE0%```!````N`$```#K
+MV'^8@T0D*`&#Q2"#?"0H!`^%4O___XNT)(@```#'AE`%```!````N`$```#K
M!;@`````@\1L6UY?7<.-=@"-O"<`````55=64X/L#(MT)""+?"0DBVYL#[8&
-M@^`!B$0D"[@`````Q@0X`(/``8/X('7TBYW(#```B=JP`,8$$`"#P`$]``(`
-M`'7RC4LVN@````"-=@`/MD0R(8@$"@^V1#(@B$0*`8/"`H/Z*'7GC4L4L@(/
-MMD0R"XA$"OX/MD0R"HA$"O^#P@*#^A9UYHU++K(`#[9$,DF(!`H/MD0R2(A$
-M"@&#P@*#^@AUYXE?&(M&4(M65(/``8/2`(D'B5<$@WY@`'4\]@8!=#>+1F2%
-M[0^5PH7`=!*$TG0.#[9`,X"\!;P$``#_=1F+1FB$TG0;A<!T%P^W0"2`O`6\
-M!```_W0)#[9&`8A'#.LBB2PDZ/S___^%P'02@+BE`````G4)#[9&`8A'#.L$
-MQD<,_P^V1@*(1PVX`0```/9&6A!T!`^V1ER(1P[&1Q(0QD<1$`^V1"0+C10`
-M#[9?"H/C_0G3B%\*P>`%#[9/"(/AWPG!B$\(#[=&6,'H!X/@`<'@!H/AOPG!
-MB$\(#[=&6,'H`H/@`0^V5PF#XOX)PHA7"0^W1EK!Z`/!X`>#X7\)P8A/"`^W
-M1EK1Z(/@`0'`@^+]"<*(5PD/MT98P>@#@^`!P>`&@^*_"<*(5PD/MT9:P>@$
-MP>`'@^)_"<*(5PF#R1"(3P@/M@;0Z(/@`8/C_@G#B%\*#[8&@^`$@^/["<.(
-M7PIFQT<4`!`/MH:;````B$</#[:&F````(A''(/$#%M>7UW#D(VT)@````!5
-M5U93@^P(BUPD*(MT)"R%VW03N`````#&!!@`@\`!/:P```!U\H7V=!*X````
-M`)#&!#``@\`!@_@H=?2+1"0<B[A(!0``#[9$)"")1"0$B3PDZ/S___^)P6:%
-MP'0-#[?`@+P'O`0``/]U2XN_2`4``(''S`P``(N'2`4``(D$).C\____*40D
-M(`^V1"0@B40D!(D\).C\____B<%FA<`/A"D#```/M\"`O`>\!```_P^$&`,`
-M``^WP0^VA`>\!```9H'Y@0`/AS<"``"+C[0%```/M\!IP!0-``"-+`&%VP^$
-MU@```(M5#(72=&P/MH<\!0``//]T%0^VP&G`%`T``(T$`;Z`````.<)T(`^V
-MAST%```\_W0:#[;`:<`4#0``C00!.<)U"KZ!````B?"(0P*`?3(`="^Z````
-M``^VP@^V3`5`N`$```#3X`E#((/"`3A5,G80Z^3&0P+_BT4(#[9`"8E#(,8#
-M`0^V13&(0P&+14B)0P2+14R)0PB-2PR-55B+15B)0PR+0@2)002+0@B)00B+
-M0@R)00R+17")0QR+5"0@B5,D#[:%D````(E#*+@`````Z1<"``"%]@^$"@(`
-M`(-\)"0`#XC_`0``#[:%D````#E$)"0/C>X!``"+1"0DC12`C535`(V"D```
-M``^V2`2(#@^V0`6(1@&+@I@````/M@"#X`^(1@*`^0-T(H#Y`W<.@/D"#X6.
-M````Z9````"`^01T-8#Y$HUV`'5\ZU6+5"0DC022BY3%F`````^V0@&#X`</
-MML#!X`@/ME("`="-!(`!P(E&!.M6BU0D)(T$DHN$Q9@````/MD`"A,!U"<=&
-M!`````#K-P^VP(/H%(E&!.LLBU0D)(T$DHN4Q9@````/MD("P>`(#[92`P'0
-MC02``<")1@3K!\=&!`````"-3@B+5"0DC022C83%D````(U0#(M`#(E&"(M"
-M!(E!!(M""(E!"(M"#(E!#(M"$(E!$(M"%(E!%(M"&(E!&(M"'(E!'+@`````
-MZ=`````/M]!ITK````")U@.WF`4``,9#`O_&`P*+AY@%```/MD0"'XA#`8M&
-M5`^V0`F)0R`/MH:E````/`)U+<=#!$A05`"-0PS'0PQ2;V-KQT`$9713=,=`
-M"&]R(``/MU8BC4,7Z#>^___K13P#=2'&0P$0QT,@`0```,=#!$A05`#'0PQ%
-M2C,T9L=#$#``ZR#&0P1V#[=6((U#!>@`OO__QD,,9`^W5B*-0PWH\+W__\9#
-M''(/ME8=C4,=Z*"]__^+1"0@B4,DN`````#K!;C_____@\0(6UY?7<.0C70F
-M`%575E.#[`R+="0HN`````#&!#``@\`!/2@-``!U\HM$)""+F$@%```/MD0D
-M)(E$)`2)'"3H_/___XG!9H7`=`T/M\"`O`.\!```_W5+BYM(!0``@</,#```
-MBX-(!0``B00DZ/S___\I1"0D#[9$)"2)1"0$B1PDZ/S___^)P6:%P`^$1P,`
-M``^WP("\`[P$``#_#X0V`P``#[?!#[:$`[P$``!F@?F!``^'50(``(N+M`4`
-M``^WP&G`%`T``(TL`8M5#(72=&P/MH,\!0``//]T%0^VP&G`%`T``(T$`;^`
-M````.<)T(`^V@ST%```\_W0:#[;`:<`4#0``C00!.<)U"K^!````B?B(1@*`
-M?3(`="^Z``````^VP@^V3`5`N`$```#3X`E&((/"`3A5,G80Z^3&1@+_BT4(
-M#[9`"8E&(,8&`0^V13&(1@&+14B)1@2+14R)1@B-3@R-55B+15B)1@R+0@2)
-M002+0@B)00B+0@R)00R+17")1AR+1"0DB48D@+V0``````^$1@(``,9$)`L`
-M#[9\)`N-!+_!X`.-##`!Z(V0D`````^V6@2(F:@````/ME(%B)&I````BX"8
-M````#[8`@^`/B(&J````@/L#="V`^P-W#H#[`@^%K0```.FV````@/L$D(UT
-M)@!T/H#[$@^%E0```)"-="8`ZV:-#+_!X0.+E`V8````#[9"`8/@!P^VP,'@
-M"`^V4@(!T(T$@`'`B80.K````.MNC02_C13%`````(N$%9@````/MD`"A,!U
-M#<>$%JP`````````ZTB-%+\/ML"#Z!2)A-:L````ZS:-#+_!X0.+E`V8````
-M#[9"`L'@"`^V4@,!T(T$@`'`B80.K````.L.C02_QX3&K`````````"-!+_!
-MX`.-G`:@````C4L0C80%D````(U0#(M`#(E#$(M"!(E!!(M""(E!"(M"#(E!
-M#(M"$(E!$(M"%(E!%(M"&(E!&(M"'(E!'(!$)`L!#[9$)`LXA9`````/AM<`
-M``#ID?[__P^WT&G2L````(G7`[N8!0``QD8"_\8&`HN#F`4```^V1`(?B$8!
+M@^`!#[;`B40D"+@`````Q@0X`(/``8/X)'7TBYW$#```B=JP`(VV`````,8$
+M$`"#P`$]``(``'7RC4LVN@`````/MD0R(8@$"@^V1#(@B$0*`8/"`H/Z*'7G
+MC4L4L@(/MD0R"XA$"OX/MD0R"HA$"O^#P@*#^A9UYHU++K(`#[9$,DF(!`H/
+MMD0R2(A$"@&#P@*#^@AUYXE?'(M&4(M65(/``8/2`(D'B5<$@WY@`'4\]@8!
+M=#>+1F2%[0^5PH7`=!*$TG0.#[9`,X"\!;@$``#_=1F+1FB$TG0LA<!T*`^W
+M0"2`O`6X!```_W0:#[:&F````,'@`@)&`HA'$,=$)`@`````ZR*)+"3H_/__
+M_X7`=!*`N*4````"=0D/MD8!B$<0ZP3&1Q#_#[9&`HA'$;@!````]D9:$'0$
+M#[9&7(A'$L9'%A#&1Q40#[9$)`B-%``/ME\.@^/]"=.(7P[!X`4/MD\,@^'?
+M"<&(3PP/MT98P>@'@^`!P>`&@^&_"<&(3PP/MT98P>@"@^`!#[97#8/B_@G"
+MB%<-#[=&6L'H`\'@!X/A?PG!B$\,#[=&6M'H@^`!`<"#XOT)PHA7#0^W1EC!
+MZ`.#X`'!X`:#XK\)PHA7#0^W1EK!Z`3!X`>#XG\)PHA7#8/)$(A/#`^V!M#H
+M@^`!@^/^"<.(7PX/M@:#X`2#X_L)PXA?#F;'1Q@`$`^VAIL```"(1Q,/MH:8
+M````B$<@@\0,6UY?7<.055=64X/L"(M<)"B+="0LA=MT$[@`````Q@08`(/`
+M`3VL````=?*%]G02N`````"0Q@0P`(/``8/X*'7TBT0D'(NX1`4```^V1"0@
+MB40D!(D\).C\____B<%FA<!T#0^WP("\![@$``#_=4N+OT0%``"!Q\@,``"+
+MAT0%``")!"3H_/___RE$)"`/MD0D((E$)`2)/"3H_/___XG!9H7`#X0I`P``
+M#[?`@+P'N`0``/\/A!@#```/M\$/MH0'N`0``&:!^8$`#X<W`@``BX^P!0``
+M#[?`:<`4#0``C2P!A=L/A-8```"+50R%TG1L#[:'.`4``#S_=!4/ML!IP!0-
+M``"-!`&^@````#G"="`/MH<Y!0``//]T&@^VP&G`%`T``(T$`3G"=0J^@0``
+M`(GPB$,"@'TR`'0ON@`````/ML(/MDP%0+@!````T^`)0R"#P@$X53)V$.OD
+MQD,"_XM%"`^V0`F)0R#&`P$/MD4QB$,!BT5(B4,$BT5,B4,(C4L,C558BT58
+MB4,,BT($B4$$BT((B4$(BT(,B4$,BT5PB4,<BU0D((E3)`^VA9````")0RBX
+M`````.D7`@``A?8/A`H"``"#?"0D``^(_P$```^VA9`````Y1"0D#XWN`0``
+MBT0D)(T4@(U4U0"-@I`````/MD@$B`X/MD`%B$8!BX*8````#[8`@^`/B$8"
+M@/D#="*`^0-W#H#Y`@^%C@```.F0````@/D$=#6`^1*-=@!U?.M5BU0D)(T$
+MDHN4Q9@````/MD(!@^`'#[;`P>`(#[92`@'0C02``<")1@3K5HM4)"2-!)*+
+MA,68````#[9``H3`=0G'1@0`````ZS</ML"#Z!2)1@3K+(M4)"2-!)*+E,68
+M````#[9"`L'@"`^V4@,!T(T$@`'`B48$ZP?'1@0`````C4X(BU0D)(T$DHV$
+MQ9````"-4`R+0`R)1@B+0@2)002+0@B)00B+0@R)00R+0A")01"+0A2)012+
+M0AB)01B+0AR)01RX`````.G0````#[?0:=*P````B=8#MY0%``#&0P+_Q@,"
+MBX>4!0``#[9$`A^(0P&+1E0/MD`)B4,@#[:&I0```#P"=2W'0P1(4%0`C4,,
+MQT,,4F]C:\=`!&5T4W3'0`AO<B``#[=6(HU#%^@GOO__ZT4\`W4AQD,!$,=#
+M(`$```#'0P1(4%0`QT,,14HS-&;'0Q`P`.L@QD,$=@^W5B"-0P7H\+W__\9#
+M#&0/MU8BC4,-Z."]___&0QQR#[96'8U#'>B0O?__BT0D((E#)+@`````ZP6X
+M_____X/$"%M>7UW#D(UT)@!55U93@^P,BW0D*+@`````Q@0P`(/``3TH#0``
+M=?*+1"0@BYA$!0``#[9$)"2)1"0$B1PDZ/S___^)P6:%P'0-#[?`@+P#N`0`
+M`/]U2XN;1`4``('#R`P``(N#1`4``(D$).C\____*40D)`^V1"0DB40D!(D<
+M).C\____B<%FA<`/A$<#```/M\"`O`.X!```_P^$-@,```^WP0^VA`.X!```
+M9H'Y@0`/AU4"``"+B[`%```/M\!IP!0-``"-+`&+50R%TG1L#[:#.`4``#S_
+M=!4/ML!IP!0-``"-!`&_@````#G"="`/MH,Y!0``//]T&@^VP&G`%`T``(T$
+M`3G"=0J_@0```(GXB$8"@'TR`'0ON@`````/ML(/MDP%0+@!````T^`)1B"#
+MP@$X53)V$.ODQD8"_XM%"`^V0`F)1B#&!@$/MD4QB$8!BT5(B48$BT5,B48(
+MC4X,C558BT58B48,BT($B4$$BT((B4$(BT(,B4$,BT5PB48<BT0D)(E&)("]
+MD``````/A$8"``#&1"0+``^V?"0+C02_P>`#C0PP`>B-D)`````/MEH$B)FH
+M````#[92!8B1J0```(N`F`````^V`(/@#XB!J@```(#[`W0M@/L#=PZ`^P(/
+MA:T```#IM@```(#[!)"-="8`=#Z`^Q(/A94```"0C70F`.MFC0R_P>$#BY0-
+MF`````^V0@&#X`</ML#!X`@/ME("`="-!(`!P(F$#JP```#K;HT$OXT4Q0``
+M``"+A!68````#[9``H3`=0W'A!:L`````````.M(C12_#[;`@^@4B836K```
+M`.LVC0R_P>$#BY0-F`````^V0@+!X`@/ME(#`="-!(`!P(F$#JP```#K#HT$
+MO\>$QJP`````````C02_P>`#C9P&H````(U+$(V$!9````"-4`R+0`R)0Q"+
+M0@2)002+0@B)00B+0@R)00R+0A")01"+0A2)012+0AB)01B+0AR)01R`1"0+
+M`0^V1"0+.(60````#X;7````Z9'^__\/M]!ITK````")UP.[E`4``,9&`O_&
+M!@*+@Y0%```/MD0"'XA&`8M'5`^V0`F)1B`/MH>E````/`)U+<=&!$A05`"-
+M1@S'1@Q2;V-KQT`$9713=,=`"&]R(``/MU<BC487Z$>Z___K13P#=2'&1@$0
+MQT8@`0```,=&!$A05`#'1@Q%2C,T9L=&$#``ZR#&1@1V#[=7((U&!>@0NO__
+MQD8,9`^W5R*-1@WH`+K__\9&''(/ME<=C48=Z+"Y__^+1"0DB48DN`````#K
+M#+C_____ZP6X`````(/$#%M>7UW#C;0F`````(V\)P````!55U93@^P,BW0D
+M*+@`````Q@0P`(/``3VD#```=?*+1"0@BYA$!0``#[9$)"2)1"0$B1PDZ/S_
+M__^)P6:%P'0-#[?`@+P#N`0``/]U2XN;1`4``('#R`P``(N#1`4``(D$).C\
+M____BU0D)"G"#[;"B40D!(D<).C\____B<%FA<`/A!X#```/M\"`O`.X!```
+M_P^$#0,```^WP0^VA`.X!```9H'Y@0`/AS,"``"+B[`%```/M\!IP!0-``"-
+M+`&+50R%TG1L#[:#.`4``#S_=!4/ML!IP!0-``"-!`&_@````#G"="`/MH,Y
+M!0``//]T&@^VP&G`%`T``(T$`3G"=0J_@0```(GXB$8"@'TR`'0ON@`````/
+MML(/MDP%0+@!````T^`)1B"#P@$X53)V$.ODQD8"_XM%"`^V0`F)1B#&!@$/
+MMD4QB$8!BT5(B48$BT5,B48(C4X,C558BT58B48,BT($B4$$BT((B4$(BT(,
+MB4$,BT5PB48<@+V0``````^$)`(``,9$)`L`#[9\)`N-!+_!X`.-##`!Z(V0
+MD`````^V6@2(620/ME(%B%$EBX"8````#[8`@^`/B$$F@/L#="V`^P-W#H#[
+M`@^%H0```.FG````@/L$D(UT)@!T.X#[$@^%B0```)"-="8`ZUV-#+_!X0.+
+ME`V8````#[9"`8/@!P^VP,'@"`^V4@(!T(T$@`'`B40.*.MBC02_C13%````
+M`(N$%9@````/MD`"A,!U"L=$%B@`````ZS^-%+\/ML"#Z!2)1-8HZS"-#+_!
+MX0.+E`V8````#[9"`L'@"`^V4@,!T(T$@`'`B40.*.L+C02_QT3&*`````"-
+M!+_!X`.-7`8@C4L,C80%D````(U0#(M`#(E##(M"!(E!!(M""(E!"(M"#(E!
+M#(M"$(E!$(M"%(E!%(M"&(E!&(M"'(E!'(!$)`L!#[94)`LXE9`````/AM``
+M``#IK/[__P^WT&G2L````(G7`[N4!0``QD8"_\8&`HN#E`4```^V1`(?B$8!
MBT=4#[9`"8E&(`^VAZ4````\`G4MQT8$2%!4`(U&#,=&#%)O8VO'0`1E=%-T
-MQT`(;W(@``^W5R*-1A?H5[K__^M%/`-U(<9&`1#'1B`!````QT8$2%!4`,=&
-M#$5*,S1FQT80,`#K(,9&!'8/MU<@C48%Z""Z___&1@QD#[=7(HU&#>@0NO__
-MQD8<<@^V5QV-1AWHP+G__XM$)"2)1B2X`````.L,N/_____K!;@`````@\0,
-M6UY?7<.-M"8`````C;PG`````%575E.#[`R+="0HN`````#&!#``@\`!/:0,
-M``!U\HM$)""+F$@%```/MD0D)(E$)`2)'"3H_/___XG!9H7`=`T/M\"`O`.\
-M!```_W5+BYM(!0``@</,#```BX-(!0``B00DZ/S___^+5"0D*<(/ML*)1"0$
-MB1PDZ/S___^)P6:%P`^$'@,```^WP("\`[P$``#_#X0-`P``#[?!#[:$`[P$
-M``!F@?F!``^',P(``(N+M`4```^WP&G`%`T``(TL`8M5#(72=&P/MH,\!0``
-M//]T%0^VP&G`%`T``(T$`;^`````.<)T(`^V@ST%```\_W0:#[;`:<`4#0``
-MC00!.<)U"K^!````B?B(1@*`?3(`="^Z``````^VP@^V3`5`N`$```#3X`E&
-M((/"`3A5,G80Z^3&1@+_BT4(#[9`"8E&(,8&`0^V13&(1@&+14B)1@2+14R)
-M1@B-3@R-55B+15B)1@R+0@2)002+0@B)00B+0@R)00R+17")1AR`O9``````
-M#X0D`@``QD0D"P`/MGPD"XT$O\'@`XT,,`'HC9"0````#[9:!(A9)`^V4@6(
-M426+@)@````/M@"#X`^(02:`^P-T+8#[`W<.@/L"#X6A````Z:<```"`^P20
-MC70F`'0[@/L2#X6)````D(UT)@#K78T,O\'A`XN4#9@````/MD(!@^`'#[;`
-MP>`(#[92`@'0C02``<")1`XHZV*-!+^-%,4`````BX05F`````^V0`*$P'4*
-MQT06*`````#K/XT4OP^VP(/H%(E$UBCK,(T,O\'A`XN4#9@````/MD("P>`(
-M#[92`P'0C02``<")1`XHZPN-!+_'1,8H`````(T$O\'@`XU<!B"-2PR-A`60
-M````C5`,BT`,B4,,BT($B4$$BT((B4$(BT(,B4$,BT(0B4$0BT(4B4$4BT(8
-MB4$8BT(<B4$<@$0D"P$/ME0D"SB5D`````^&T````.FL_O__#[?0:=*P````
-MB=<#NY@%``#&1@+_Q@8"BX.8!0``#[9$`A^(1@&+1U0/MD`)B48@#[:'I0``
-M`#P"=2W'1@1(4%0`C48,QT8,4F]C:\=`!&5T4W3'0`AO<B``#[=7(HU&%^B)
-MMO__ZT4\`W4AQD8!$,=&(`$```#'1@1(4%0`QT8,14HS-&;'1A`P`.L@QD8$
-M=@^W5R"-1@7H4K;__\9&#&0/MU<BC48-Z$*V___&1AQR#[97'8U&'>CRM?__
-MN`````#K#+C_____ZP6X`````(/$#%M>7UW#C;0F`````%575E.#[`B+7"0D
-MN`````#&!!@`@\`!/0`!``!U\HM$)!R+N$@%```/MD0D((E$)`2)/"3H_/__
-M_XG!9H7`=`T/M\"`O`>\!```_W5+B[](!0``@<?,#```BX=(!0``B00DZ/S_
-M__^+5"0@*<(/ML*)1"0$B3PDZ/S___^)P6:%P`^$P@$```^WP("\![P$``#_
-M#X2Q`0``#[?!#[:$![P$``!F@?F!``^'UP```(N/M`4```^WP&G`%`T``(TT
-M`8M6#(72=&P/MH<\!0``//]T%0^VP&G`%`T``(T$`;V`````.<)T(`^VAST%
-M```\_W0:#[;`:<`4#0``C00!.<)U"KV!````B>B(0P*`?C(`="^Z``````^V
-MP@^V3`9`N`$```#3X`E#((/"`3A6,G80Z^3&0P+_BT8(#[9`"8E#(,8#`0^V
-M1C&(0P&+1DB)0P2+1DR)0PB-2PR-5EB+1EB)0PR+0@2)002+0@B)00B+0@R)
-M00R+1G")0QRX`````.G)````#[?0:=*P````B=8#MY@%``#&0P+_Q@,"BX>8
-M!0``#[9$`A^(0P&+1E0/MD`)B4,@#[:&I0```#P"=2W'0P1(4%0`C4,,QT,,
-M4F]C:\=`!&5T4W3'0`AO<B``#[=6(HU#%^@EM/__ZT4\`W4AQD,!$,=#(`$`
-M``#'0P1(4%0`QT,,14HS-&;'0Q`P`.L@QD,$=@^W5B"-0P7H[K/__\9##&0/
-MMU8BC4,-Z-ZS___&0QQR#[96'8U#'>B.L___N`````#K!;C_____@\0(6UY?
-M7<.-=@"-O"<`````@^PLB5PD'(ET)"")?"0DB6PD*(M\)#"+;"0TBT=LB40D
-M%(M%)(DXBT=@A<!U$L9%9@*)+"3_57#IN`4``(UV`/9`*`)T$L9%9@*)+"2-
-M=@#_57#IG04``(M,)!2)#"3H_/___XG&A<!U%L9%9@*)+"3_57#I?`4``(VT
-M)@````#'0&0`````B6A(BT=@B488BT=@#[=`'&:)1A#&1A2`#[9%9#P"#X19
-M`0``/`)W"83`="+INP(``#P#C;8`````#X3!`0``/`0/A:4"``")]NF-`0``
-MBT=@]D`X`8UT)@`/A)`````/MD5EJ`)T!L9&)(CK$(/@!#P!&<"#X`6#Z':(
-M1B2+34B+74P/MT509HE$)!K&1B4`B=C!Z!B(1B:)V,'H$(A&)XG8P>@(B$8H
-MB%XIB<@/K-@8B$8JB<@/K-@0B$8KB<@/K-@(B$8LB$XMQD8N`,9&+P`/MT0D
-M&F;!Z`B(1C`/MDPD&HA.,<9&,@#&1C,`ZVL/MD5EJ`)T!L9&)"CK$(/@!#P!
-M&<"#X`6#P"J(1B2+34B+74P/MT509HE$)!K&1B4`B<@/K-@8B$8FB<@/K-@0
-MB$8GB<@/K-@(B$8HB$XIQD8J``^W1"0:9L'H"(A&*P^V3"0:B$XLQD8M`(M'
-M8`6X````B48XQD8<(`^W1"0:P>`)B48@@TYD`NE\`0``#[9%2#P0=P7V!P)U
-M"<9%9@;IK0,``(U.)`^VP(U54(E$)`B)5"0$B0PDZ/S___^+1V`%N````(E&
-M.,9&'""!3F0``!``QD85J_9%908/A"D!``"+14R)1B#I'@$```^V166#X#`\
-M('41QD8D&\9&)0'&1B@`Z0(!``#&1B0UZ?D```"+1V`/MD`D@^`%@_@%=1.!
-M3F0``"``#[=55&8[54IU#NM<QD5F!HUV`.D2`P``#[9%4SSCD(UT)@!T0SSC
-M=Q(\0G0[/+"-="8`="`\0'4BZRT\[(VV`````'00/.]T'SSE=0Z-M@````#K
-M$V:)54KK#<9%9@:-="8`Z<("``#&1B2P#[=%2(A&)0^W14J(1B8/MT5,B$8G
-M#[=%3HA&*`^W15"(1BD/MD52B$8J#[9%4XA&*P^V14F(1BP/MD5+B$8M#[9%
-M38A&+@^V14^(1B\/MD51B$8P]D5E!G0=#[=%5,'@"8E&((-.9`3K#<9%9@;I
-M2P(``(UT)@#'1FQ@K`,`#[9%9:@&#X0>`@``J`)T!H-.9`CK!(-.9!"-?CR+
-M76B%VW0&]D5E`74\BU5LA=(/A","``#'1"0(`````(M,)!2+@4@&``")1"0$
-MB2PD_]*%P`^$``(``(M$)!2+F$@&``"%VW1(B30DZ/S____'1"0$`````(D\
-M).C\____@\,0BT/PB40D#(M#^(M3_(E$)`2)5"0(B3PDZ/S___^+0_2#PQ"%
-MP`^%@@$``.O3QT0D!`````")/"3H_/___XM&(#T`"```=T.+3"04B0PDZ/S_
-M__^)PH7`=0G&168+Z5T!``"+0`B)1C2)5E"+1B")1"0,BT(,BU(0B40D!(E4
-M)`B)/"3H_/___^M3/0```0!W0XM$)!2)!"3H_/___XG"A<!U"<9%9@OI$P$`
-M`(M`"(E&-(E64(M&((E$)`R+0@R+4A")1"0$B50D"(D\).C\____ZPG&168&
-MZ>(````/MD5EJ`20C70F``^$OP```(!]9`-U(HM-6(7)=!N+5C2+1B")1"0(
-MB4PD!(D4).C\____Z9<```"+56B%TG4-BU5LA=(/A;D```#K:(M^-*@!=0F)
-MTY"-="8`ZS"+56R%TG0IQT0D"`$```"+3"04BX%(!@``B40D!(DL)/_2A<!T
-M"HM$)!2+F$@&``"#PQ"+0_B+4_")5"0(B40D!(D\).C\____`WOPBT/T@\,0
-MA<!U'>O;BT8@BU8TA<!T$<8"`(/"`8/H`70&Z_.#3F0!B70D!(M,)!2)#"3H
-M_/___^LNB70D!(M$)!2)!"3H_/___XDL)/]5<.L6NP````#I3/[__XM^-(UT
-M)@#I5/___XM<)!R+="0@BWPD)(ML)"B#Q"S#C;0F`````%=64X/L$(M\)""+
-M="0DN`````#&!#``@\`!@_AX=?2#OU0%```!#Y1&$P^V5R(/MD\A#[9?(`^V
-M1R.(1@.(5@*(3@&('H!.$1`/MT<89HE&!`^W1QIFB48&BX=4!0``B$9LQD82
-M(`^W5QIF@?H@(70'9H'Z(B%U1\9&%P*-1CS'1CQ2;V-KQT`$97120<=`"$E$
-M(%/'0`Q31"`RQT`0,3)X(,=`%$-O;G3'0!AR;VQL9L=`'&5RQD`>`.D"`0``
-MC8+PV/__9H/X`7829H'Z0"%T"V:!^D0A#X6E````QD87!`^W5QJ-@O#8__]F
-M@_@!=T.-1CS'1CQ2;V-KQT`$97120<=`"$E$(#+'0`PW,7@@QT`04T%3(,=`
-M%$-O;G3'0!AR;VQL9L=`'&5RQD`>`.F-````9H'Z0"%T!V:!^D0A=7^-1CS'
-M1CQ2;V-KQT`$97120<=`"$E$(%/'0`Q31"`RQT`0,31X(,=`%$-O;G3'0!AR
-M;VQL9L=`'&5RQD`>`.L_QD87"(U&/,=&/$1A=&''0`1#96YTQT`(97(@-\=`
-M##(X,"#'0!!3051!QT`4($-O;L=`&'1R;VS'0!QL97(`#[9&$O9F%XA&$(3`
-M=03&1A"`C488QT882&EG:,=`!%!O:6['0`AT(%1EQT`,8VAN;\=`$&QO9VG'
-M0!1E<RP@QT`826YC+L9`'`"+AU`%``"%P'00BT`(B49DB<+!^A^)5FCK#HM'
-M"(E&9(G"P?H?B59HQT9@`"```,=$)`1\````BT<0B00DZ/S___^)PH'B\`,`
-M`,'J!(A6;8/@#XA&;\=$)`2`````BT<0B00DZ/S___^)PH'B``#P`\'J%(A6
-M;B4```\`P>@0B$9P@\006UY?PXVV`````(V_`````%575E.#[!R+?"0PBW0D
-M-(M<)#BX`````,8$&`"#P`$]G````'7RB7,(@_X_?@F!Q\P,``"#[D"X````
-M`(.\M[P"````#X6?`@``B9RWO`(``(E[;(M$)#R)0W"+3"1`B4MX@'\Y`0^%
-M>`(``('^A0````^/6@(```^VA#>\!```//\/A$H"```/ML!FB40D&`^WP&G`
-M*`$``(G%`Z]\!0``]D4G!`^$)P(``(M%)"4`__\`/0``_P`/A10"``#V12@$
-M#X2'`0``QH6T``````^V320/MM&)T(/@!H/X!G4Y]L(!#X0#`0``QD4F!<9%
-M)P2);"0,#[9%38E$)`B+13")1"0$BT4LB00DZ/S___^X`0```.G0`0``@_@$
-M#X7"`0``]L$!#X2Y`0``BUTLBT4TA<`/A8(```#&128#QD4G!(!["@!T4;X`
-M````C4,XB40D%(M,)!2)#"3H_/___XG"BT,\B5,\BTPD%(D*B4($B1"`>B;_
-M=!4YU701QH6U`````;@!````Z5P!``"#Q@$/MD,*.?!_NX"]M0````$/A#\!
-M``");"0$B3PDZ/S___^X`0```.DN`0``@'@F``^%'P$``&:#8#+]BT4T9L=`
-M,B``BT4TB40D!(D\).C\____N`$```#I_0```(M%+`^V0`F`?R8`="^[````
-M``^V\`^VRXGPT_BH`704QT0D"`````")3"0$B3PDZ/S___^#PP$X7R9WV<9%
-M)P;&128%9L>%E```````B6PD!(D\).C\____N`$```#IF@```(MM+(!]"@!T
-M7L9$)!L`C44XB40D$(M,)!")#"3H_/___XG"BT4\B54\BTPD$(D*B4($B1"`
-M>B;_=!X/MD(E/")T!#P-=1+'A+>\`@```````+@`````ZT*`1"0;`0^V1"0;
-M.$4*=ZX/MT0D&(E$)`B)7"0$B3PDZ/S___^X`0```.L7QX2WO`(```````"X
-M`````.L%N`$```"#Q!Q;7E]=PY"0D)"0D)"0D)"0D)"0D(M4)`2A`````(E"
-M!(D5`````,.-M@````"-O"<`````H0`````%F`$#`,.0C70F`(M$)`2+3"0(
-MA<!T%(L0A=)T"87)=`6+0@2)`8G0PXGVBQ4`````Z^:0C;0F`````(M$)`2+
-M5"0(!9@!`P`#0A##ZPV0D)"0D)"0D)"0D)"04X'L^````(N4)``!``"-A"2`
-M````BYPD!`$``(M*!(E$)`2+0@B)!"3_41R-1"0(BU,$B40D!(M#"(D$)/]2
-M'`^V1"0).(0D@0```'8-N`$```"!Q/@```!;PW(D#[9$)`HXA"2"````=^-R
-M%`^V1"0+.(0D@P```'?3<@0QP.O2N/_____KRY"-M"8`````5U93@^P0BQT`
-M````BW0D((7;=0CK>HL;A=MT=(M#"(7`=':+5@0[4`1UZXM`"(E$)`2+1@B)
-M!"3_4B2$P'37BU,(C7L(A=)U'^MFD(UT)@")5"0$B30DZ/S___^%P'A1BS^+
-M%X72=$F+1@2+B(````"%R73;.T($==:+0@B)1"0$BT8(B00D_]'KT9"-="8`
-M,<"#Q!!;7E_#QP8`````N`$```")7@R)<PB#Q!!;7E_#BP>)7@R)!K@!````
-MB3?KT>L-D)"0D)"0D)"0D)"0D(M4)`2A`````(D"BT(,B14`````A<!T$*$`
-M````B4(0`T(,HP````#SPXVV`````%=64X/L$(L=``````^V="0@A=MT+8GP
-M.$,$=":)\`^V^.L'B?`X0P1T&(M#0(7`=`F)/"3_T(7`=0B+&X7;B?9UX8/$
-M$(G86UY?PY"-="8`5HG64S'2BU@,@\`,.=AT'CF3]/W__XG9=0[K&(UT)@`Y
-MD?3]__]T#(L).<AU\HE6'%M>PX/"`>O3C;0F`````(L5`````+AT````A=)T
-M%##`BTH8.<AS`HG(BQ*%TG7Q@\!T\\.-="8`C;PG`````%.+1"0(BUPD#(M0
-M#(U(##G*=0CK$XL2.<IT#8V"V/W__SE8''7O6\-;,<##C70F`%.#[`B+1"00
-MBU@(A=MT$Y"+4P2+0PB)!"3_4FR+&X7;=>Z#Q`A;PXGVC;PG`````(M$)`2)
-MPHL`Z2/___^-=@"+1"0$BU`<A=)X!\=`'/_____SPXVV`````(V_`````%.+
-M7"0,,<"%VW07BU0D"#')`=,/M@*#P@$!P3G:=?0/ML%;PXVV`````(V_````
-M`*$`````BTPD!(7`="2+4`B%TG07.4H(=0SK&)"-="8`.4H(=`R+$H72=?6+
-M`(7`==SSP_/#C70F`(V\)P````!75E.+1"00BW0D%(M\)!B+4`R-6`PYVG4-
-MZS&0C70F`(L2.=-T)HV"V/W__X!X"`1V[CEP)'7IA?]X%XM(#(7)=-XY1+E(
-M==A;7E_#6S'`7E_#BT@,A<EUQ^OMD(UT)@!75E.#[!"+?"0@B3PDC7<,Z/S_
-M__^+7PPY\W0JC70F`(V3V/W__XN")`(``(7`=!"+0@2+0#B%P'0&B10D_]"0
-MBQLY\W7:B3PDZ/S___^+1PPY\'4(ZQF+`#GP=!.+6/B%VW3S@\00N`$```!;
-M7E_#@\00,<!;7E_#C;0F`````%<QP%93@^P0BWPD(("_A`$#``!U)XM?"(7;
-M=!XQ]HGVBT,$BU,(B10D_U!4BQL)QH7;=>R)\(3`=0DQP(/$$%M>7\.)/"3H
-M_/___X/$$(GR6P^VPEY?PXGVC;PG`````%575E.#[`R+="0@Z/S___^+GL@`
-M``")QX7;#X2,````BT,$B=J-KL@````I^(7`?@[IA@```(M"!"GXA<!_,XM"
-M%(7`=`.):!")AL@```")PXM"#,="$`````#'0A0`````B00D_U((BY;(````
-MA=)UQ(DT).C\____A=MT"HN&R````#G8=`B#Q`Q;7E]=PXM`!"GXB40D!(M&
-M!(D$).C\____@\0,6UY?7<.)="0@@\0,6UY?7>G\____B30DZ/S____KN(UV
-M`(V\)P````!75E.+="04BWPD$.C\____BTX0A<ET%HM6%(72=`:)2A"+3A")
-M$<=&$`````"+E\@```")P0,.C9_(````A=*)3@1U#.L^C5H4BU(4A=)T-(M"
-M!"G(A<!^[8E6%(U&%(DS.;?(````B5X0B4(0=26+!HE$)!2+1P2)1"006UY?
-MZ?S___^)5A2),SFWR````(E>$'3;6UY?PY"-M"8`````5E.#[`2+3"04BW0D
-M$(M1$(72=%"+012+GL@```"%P'0&B5`0BU$0B0+'010`````BX;(````QT$0
-M`````(7`=",YPW0?BU@$Z/S___\IPXE<)!2+1@2)1"00@\0$6U[I_/___X/$
-M!%M>PXVV`````%93@^P4BW0D((M>"(7;=13K+HM3!(M#"(D$)/]2:(L;A=MT
-M'(![1`!TZ(M3!,=$)`0`````BT,(B00D_U(HZ]*-ALP```")-"2)1"0$Z/S_
-M__^#Q!1;7L.0C;0F`````%=64X/L$(M\)""+7PB%VW4(ZS*+&X7;="R+4P2+
-M0PB)!"3_4G"`>T0`=.B+4P3'1"0$`0```(M#"(D$)/]2*(L;A=MUU(M?#(UW
-M##GS=0CK)XL;.?-T(8V3V/W__X!Z"`%U[HM"!(M`.(7`=.2)%"3_T(L;.?-U
-MWX`]``````!T.(V?S````(E<)`2)/"3H_/___\>'S`````"'DP/'A]0`````
-M````B;_8````B5PD!(D\).C\____@\006UY?PU575E.#[`R+="0DBVPD((7V
-M=%Z+5@2+1@B)!"3_4G"`?D0`#X6:````BUT,C7T,.?MU".LLBQLY^W0FC9/8
-M_?__@'H(`77N.7)8=>F+0@2+0#B%P'3?B10D_]"+&SG[==J+-H7V=!&#Q`R)
-M\%M>7UW#BW4(A?9UFX`]``````!TYHV=S````(E<)`2)+"3H_/___\>%S```
-M``"'DP/'A=0`````````B:W8````B5PD!(DL).C\____@\0,B?!;7E]=PXM6
-M!,=$)`0!````BT8(B00D_U(HZ4W___^-="8`4X/L"(M<)!")'"3H_/___XG!
-MQT`(`````(U`=(E!)(M##(U1*(/H=(E!((U!#(E!#(E!$#'`Q@00`(/``8/X
-M3'7T@\0(B<A;PXVT)@````"#[`PQTHE<)`2+7"04B70D"(MT)!@Y<PAR(8D<
-M).C\____B<*+1"00B7((B5H$B0*+0PB#P`$I\(E#"(M<)`2)T(MT)`B#Q`S#
-MC;0F`````(/L#(M4)!"+1"04B10DB40D"(U":(E$)`3H_/___X/$#,.-M"8`
-M````C;PG`````(M,)`B+1"0$BU$(`U`(@^H!B5`(Z?S___^-M"8`````@^P,
-MBT0D$(E$)`2+`(/`:(D$).C\____@\0,PXUT)@!5B<575E.#[`R+<`R->`PY
-M_G4(ZT>+-CG^=$&-GMC]__^`>P@!=>X/MD-,J$`/A6T!``"`/0``````=-FH
-M`G75J`$/A9T!``#V0TP$C70F`'7#@$M,)(LV.?YUOXM=%(UU%#GS=!&-0_2)
-M!"3H_/___XL;.?-U[XMU##G^#X2:````C8;8_?__@'@(!'8+BU@,A=L/A#H!
-M``"+-CG^=>.+70PY^W1VQD0D"P#K"8UV`(L;.?-T/HV3V/W__X!Z"`%U[O9"
-M3"!TZ(M")(!B3-N%P'4/Z=4```"+`(7`#X3+````BT@4A<ET[XL;QD0D"P$Y
-M\W7"BW4,.?=T(9"-="8`C9[8_?__]H,<`@```70'BT,,A<!T((LV.?YUY(N5
-MC`$#`(72=`B+102)!"3_TH/$#%M>7UW##[93"(#Z!'8/BX-D`0``A<!T$#E8
-M!'0+@.H!=</V0TP"=+V+0QR%P(GV#XB/````]H,<`@```G2GQT0D!`````")
-M+"3H_/___X7`B<)TD3G#=(WV@!P"```"='.`HQP"``#]Z7C___^)]HD<).C\
-M____Z6C^__^`?"0+``^%^/[__X`]``````&0#X7J_O__B10DZ/S____IW?[_
-M_XD$).C\____D(UT)@#IM/[__XD<).C\____C78`Z5/^__^)VHGHZ&+V__^)
-M]NEA____BT,<B4(<QT,<`````.G__O__B?:-O"<`````55=64X'LG````(N<
-M)+````"%VXM[#`^$WP```,=$)!@`````C50D)(M#!(E4)`2+4PB)%"3_4!P/
-MMD0D-#L%-`(```^.G@```(U#$(E$)!3K(#EK&(-4)!@`BQ4T`@``#[9$)#2#
-MP@$YT(D5-`(``'YU]D0D-0%U$0^V!0`````[1"08#X2-````BVL8BU0D%(.'
-MD`$#``&)%"3H_/___XM3!(E<)!#'1"0,8/L#`(E$)`B)QJ$T`@``B40D!(M#
-M"(D$)/]2-(3`=8>+1"04B70D!(D$).C\____@Z^0`0,``>ES____BQO'!30"
-M````````A=L/A2G___^+AY`!`P"#Z`&%P(F'D`$#`'4[B?CHR_S__^LR#[8%
-M`````,<%)`(```````")'2@"``#'1"0$'`(``&G`0$(/`(D\)*,<`@``Z/S_
-M__^!Q)P```!;7E]=PXVV`````(V_`````%575E.#[`R+="0@BVPD*(M\)"2+
-M7@B)KHP!`P"%VW4(ZR6+&X7;=!^+0P2+4PB)%"3_4'B$P'7JQH:$`0,``8/$
-M#%M>7UW#BQT`````A=MT$HM#*(7`=`6)-"3_T(L;A=MU[H7_=!B+5P3'1"0$
-M`0```(M'"(D$)/]2*,9'1`&+1@C'AI`!`P`!````B00DZ/S___^+AI`!`P"%
-MP'2AA>UT$(ET)""#Q`Q;7E]=Z?S____'!"2@A@$`Z/S___^)-"3H_/___XN^
-MD`$#`(7_=>+I:O___XUT)@"-O"<`````@^P<B70D%(MT)"")?"08BT0D*(E<
-M)!"+?"0DBUX,@ZN0`0,``87`>$>)1"0(B7PD!(DT).C\____A<!T1(N#D`$#
-M`(7`=!"+7"00BW0D%(M\)!B#Q!S#B=B+="04BUPD$(M\)!B#Q!SI,_O__XUV
-M`(U&$(E\)`2)!"3H_/___^N\BT8$B3PD_U!`C480B7PD!(D$).C\____ZZ*0
-MC70F`%575E.#[`R+?"0@BP>+<!R-:!R)1"0(ZQ&-M"8`````C5[TBS8Y>RAT
-M/SGU=?*+1P2+0#2%P'0%B3PD_]"+ARP"``"+ER@"``")0@2)$(M$)`B)?"0$
-M@\`XB00DZ/S___^#Q`Q;7E]=PXM3#(U+#(M#$(E"!(D0B4L0B4L,QD-F`HD<
-M).C\____ZY^0C70F`%575E.#[!R+?"0PBVPD-(M'#(M0#(/`##G"=0_IHP``
-M`(L2.<(/A)D```"-FMC]__^`>P@!=>H[:U1UY3M[6'7@A=MT?_:#'`(```$/
-MA=(```"+@Z0```"%P`^%Q````(N#E````(7`#X6V````BT,DA<!U".M%BP"%
-MP'0_BU`4A=)T\XMR#(7V#X2A````@'XP``^$EP```#')ZP\/MD8P@\$!.<@/
-MCH0````Y5(Y(=>O'1(Y(`````.OAB1PDZ/S___^-=Q")-"3H_/___X7`B<-T
-M3XM$)#R+5P2)7"0(B6PD!(E$)!"+1"0XB40D#(M'"(D$)/]2-+H!````A,!T
-M"H/$'(G06UY?7<.)7"0$B30DZ/S___^#Q!PQTEN)T%Y?7<.#Q!PQTEN)T%Y?
-M7<.)%"3H_/___^DQ____C78`55=64X'LG````(NL)+0```"+O"2P````A>T/
-MA+X!``"+=PB%]G1QBX>4`0,`BU8$B48HC40D)(E$)`2+1@B)!"3_4AR+5@2+
-M1@@/MEPD-`&?E`$#`(D$)/]2,(E<)`R);"0$B40D"(U&$(D$).C\____#[9$
-M)#3'1"0(%````(EL)`2)1"0,C48LB00DZ/S___^+-H7V=8^A`````+I@`@``
-MA<!T%S')BU`4.=%S`HG1BP"%P'7QC9%@`@``BX>4`0,`B50D"(EL)`2-!,")
-M1"0,C4<XB00DZ/S___^+AY0!`P#'1"0(``(``(EL)`2)1"0,C4=0B00DZ/S_
-M__^-AY@```")!"3'1"0,`0```,=$)`@L````B6PD!.C\____BX>4`0,`QT0D
-M"!0```");"0$B40D#(V'L````(D$).C\____BX>4`0,`QT0D"&@```");"0$
-MC03`B40D#(V'@````(D$).C\____QX?D`````0```,>'\``````0``#'A^@`
-M````$```Z/S____'1"0,0B$``(EL)`2)1"0(C4=HB00DZ/S___^+'0````"%
-MVW0@BU,<A=)T$XN'E`$#`(EL)`2)/"2)1"0(_]*+&X7;=>"!Q)P```!;7E]=
-MPXMO!.DZ_O__C78`C;PG`````%93BQT`````Z/S___^+="0,A<!T#8GRQ@(`
-M@\(!@^@!=?6A`````(7`=0?K6HUV`(G#BP.%P'7XB3.+1"00QX9D`0,``!``
-M`(E&!(U&#(E&#(E&$(U&%(E&%(E&&(U&'(E&'(E&((V&0`$``(F&0`$``(F&
-M1`$``(V&8`$``(F&8`$#`%M>PXDU`````.NKD(/L'(`]``````*)="00#[9T
-M)"2)7"0,B7PD%(EL)!@/A``!``")\@^VPHD$).C\____A<")QP^$\P```(ML
-M)""#Q3B)+"3H_/___XG#,<"0Q@08`(/``3U@`@``=?*A.`(``(E[!(/``:,X
-M`@``B8-8`@``C8-(`@``@(L<`@```8F#2`(``(F#3`(``(GPB$,(BT<4BU0D
-M((7`B1-T(8M7%(V#8`(``(E#$(72=!$QP,:$&&`"````@\`!.=!U\8V#,`(`
-M`(F#,`(``(F#-`(``(V#.`(``(F#.`(``(F#/`(``(M',,=#(`(!``#'0QS_
-M____A<!T"8D<)/_0A<!U18M$)""-DR@"``"+2!")4!"#P`R)@R@"``")BRP"
-M``")$>L,B?`L`0^$]O[__S';B=B+="00BUPD#(M\)!2+;"08@\0<PXE<)`0Q
-MVXDL).C\____Z]J)]HV\)P````!75E.#[!"+%0````"+="0@.?)U#NFQ````
-MC;0F`````(G"A=)T"HL".?!U](L&B0*+1@R-7@PYV'0:C;8`````+2@"``")
-M!"3H_/___XM&##G8=>R+1A2-?A0Y^'0GC9Z`````@^@,BT@,BU`0B5$$B0J)
-M1"0$B1PDZ/S___^+1A0Y^'7?@+Z$`0,``'4<BQT`````A=MT$HM#+(7`=`6)
-M-"3_T(L;A=MU[HM>"(7;=!*+4P2+0PB)!"3_4G2+&X7;=>Z#Q!!;7E_#BP:C
-M`````.E:____D)"0D)"0D)"0D(M,)`0QP(M1$(VT)@````#&!!``@\`!@_@L
-M=?2-0@B)0@B)0@PQP(D2B5($QT(4<#`$`(E*&,="'`````##B?:+0"2#Z!0#
-M!7@"``##C78`BT`0,=*+"#G!=!*+$8M!!(E"!(D0BU$,B0F)202)T,.#[!R)
-MT8E<)!2)PXET)!B+<!"`>F0`=1(/MT)0,=(#04@344R)0T")4T2#1A`!BT-<
-MBU-0B4PD!(D$)/]23(M<)!2+="08@\0<PXVV`````(/L#(M$)!#V@!P"```(
-MBU`0=2;'0B0`````BU!0@(@<`@``"(E$)`C'1"0$X`@$`(M`7(D$)/]21(/$
-M#,.-=@!6N?____]3BT0D#(MT)!P/MUPD&`^V5"0@]H`<`@```70=A-)T%P^W
-MT\'B"872=`TQP,8$,`"#P`$YT'7U,<E;B<A>PXVV`````(V_`````(/L$(ET
-M)`2+="04B1PDB7PD"(EL)`SV1DQ`QT8P`````,=&-`````!U68M.)(7)=',Q
-M_S'M,=OK$(VT)@````"#PP&+"87)="V+012%P'7PBT$,BU$0`48P$58TBU$0
-MBT$,.>IRW7<$.?AVUXL)B<>)U87)==.#^P-_"(E^*(EN+.L.QT8H`````,=&
-M+`````"+'"2+="0$BWPD"(ML)`R#Q!##,?\Q[>O1C;8`````5E.+="0,B?,#
-M7"00.=YS%XG9#[91_@^V0?^(4?^(0?Z#Z0(YSG+K.=YT)0^V!CP@=2&)\NL'
-M#[8"/"!U&(/"`3G:=?*)\<8!`(/!`3G9=?9;7L.)\HGQA,!T()"-="8`@\(!
-M/"!T&P^V0O^(`8/!`3G3=`</M@*$P'7E.<MUQY#KSCG:=/4/M@*$P)"-="8`
-M=,4\('3!#[9"_X@!@\$!Z]/K#9"0D)"0D)"0D)"0D)"+1"0$BT`0QT`D`0``
-M`,.05E.#[`2+="00]D9,`G4MBUXDA=MT%HM3%(72=`F+0@2)%"3_4"2+&X7;
-M=>K'AJ0`````````@\0$6U[#B30DZ/S____'AJ0`````````@\0$6U[#C;8`
-M````C;\`````4X/L"(M<)!"+5"04]D-.`HM#$'0+]D`H`G05D(UT)@"#0"0!
-M@\0(6\.-M"8`````.5`D<NO'1"0$`0```(L#B00DZ/S___^%P(G"=-</MD!E
-MB5HHB5HLQD)D!(/@SX/(((A"9<9"9@#'0G"P!P0`B50D$(/$"%OI_/___XUT
-M)@!3B<.#[`C'1"0$`0```(L`B00DZ/S___^%P(G"=$#V0TX"=4'&0&0#QT!8
-M`````,9`4T!FQT!,``!FQT!.``!FQT!0``#&0%)`9L=`2```9L=`2@$`9L=`
-M5```B5HH@\0(B=!;P\9`9`*A!!@``(E"4`^W!0@8``#&0D@&QT),`````,9"
-M20!FB4)4Z\Z-=@"#[!R)7"04B<.)="08BW`0Z%O___^Z_____X7`=!W'0'!P
-M"`0`@$XH`8M34(E$)`2+0UR)!"3_4DPQTHM<)!2)T(MT)!B#Q!S#C;0F````
-M`%=64X/L$(M<)""+?"0D@'L(!'9&@'LP`'0Y,?;K#8GV#[9#,(/&`3GP?BB+
-M1+-(A<!T[?:`'`(```%TY(D$)(/&`8E\)`3H_/___P^V0S`Y\'_8@\006UY?
-MPW0P]H,<`@```73NB=CHM/[__X7`=..#!P&)>"S'0'#`!P0`B40D((/$$%M>
-M7^G\____BULD]H,<`@```72[Z\N-M@````#I_/___XUT)@"-O"<`````@^P<
-MBT0D((E<)!2)="08BU@LBS")!"3H_/___XL#@^@!A<")`W4/C4,$B40D!(DT
-M).C\____BUPD%(MT)!B#Q!S#C;0F`````(V\)P````!64X/L!(LU`````,<%
-M>`(```````"%]G4.ZRB0C70F`(MV!(7V=!R+'7@"``#_5D@YPW/L_U9(BW8$
-MA?:C>`(``'7DQP0D8`(``(,%>`(``!3H_/___X/$!#'`6U[#B?:#[!R+3"0@
-MB5PD%(ET)!B+<2B+7A`/ME,HB="#X/Z(0RB`>68!=#F)#"3H_/___XM3((72
-M=1N-0Q3'0R`!````B40D!(L&@\`LB00DZ/S___^+7"04BW0D&(/$',.-=@"#
-MXOR(4RCKOY"-M"8`````@^P,BU0D$(M"$("B'`(``/?'@I0`````````BT@@
-MA<EU&\=`(`$```"#P!2)1"0$BP*#P"R)!"3H_/___X/$#,/K#9"0D)"0D)"0
-MD)"0D)!3@^P(BT0D$(M8$(E$)`2+`P6P````B00DZ/S___^-@Y@```#'@Y@`
-M``!0!00`B9N<````QX.@`````````(E$)`2+`X/`)(D$).C\____@\0(6\.-
-MM@````"-OP````!64X/L%(MT)"#'1"0$8`(``(M<)"2+!HD$).C\____B<&+
-M1B2%P'05.=B-5B1U!NL2.=AT#HG"BP"%P'7T@\046U[#BP.)`HE<)"2)3"0@
-M@\046U[I_/___XVT)@````!5B<U7B==6,?93@^Q,BU0D9(E$)"2+1"1@B50D
-M'(M4)"2)1"08BU(DA=*)5"0X=!:)UC'`@WX4`8LV@]C_A?9U\X/X`WX*@\1,
-MB?!;7E]=PXM$)!B+5"0<BTPD.`'X$>J)3"0\B40D$(E4)!3K*HGVBUPD/(M3
-M"(M#!#'J,?@)P@^$`@$``(M4)#R+$H72B50D/`^$YP```(M4)#R+0A2%P'7-
-MBUH(BTH$.>MWV7($.?EWTXM4)!2+1"00B50D+(M4)#R)1"0HBT(,BU(0B40D
-M,`'(B50D-!':.50D+'>G<@8Y1"0H=Y^)VHG(,>HQ^`G"#X1/`@``.>MWBP^#
-M7@$``(M4)"3'1"0$8`(``(L"B00DZ/S___^)!"3H_/___X7`B<$/A!W___\Q
-MP,8$"`"#P`&#^!AU](M<)#R+0P2+4PB)002)^(E1"(GJ*T,$&U,(B7L$B4$,
-MBP.)41"+4Q"):PB)`8M##"M!#!M1$#E4)!R)"XE##(E3$`^&5@(``(MT)#SI
-MOO[__XL+A<ET5KL!````ZP:+"87)=$"+012%P'3SBU$(BT$$,>HQ^`G"=>6+
-M00R+41")1"0(BT0D/(E4)`P[4!!R#W<)BU0D"#M0#'8$B4PD/(/#`>NZ@^L!
-M#X]B_O__BUPD/(M+#(M;$#E<)!R)3"1`B5PD1'=P<@8Y3"08=VB+5"0DQT0D
-M!&`"``"+`HD$).C\____B00DZ/S___^%P(G"#X0:_O__,<#&!!``@\`!@_@8
-M=?2+7"0<B=:+3"08B7H$B6H(B5H0BUPD/(E*#(L#B0*)$^GG_?__.?D/@Q_^
-M___IE?[__XM<)#CK"HL;A=L/A,K]__^+0Q2%P'7OBTPD/(M$)$"+5"1$`T$$
-M$U$(BTL(,T,$,=$)P771BT0D0(M4)$0#0PP34Q`Y5"0<#X>-_?__<@HY1"08
-M#X>!_?__BW0D),=$)`1@`@``BP:)!"3H_/___XD$).C\____B<$QP,8$"`"#
-MP`&#^!AU](MT)#R+1"08BU0D'`-&!!-6"(E#!(M##(E3"(M3$`-&#!-6$"M$
-M)!@;5"0<B7D$B4,,BT0D&(E3$(M4)!R):0B)00R+!HE1$(D!B0Z)SND`_?__
-MBU0D'(M$)!@S5"0T,T0D,`G"#X0A_O__BTPD),=$)`1@`@``BP&)!"3H_/__
-M_XD$).C\____A<")P0^$P/S__S'`Q@0(`(/``8/X&'7TBUPD/(M##(G>*T0D
-M&(M3$!M4)!R)00R+1"0HB5$0BU0D+(E!!(L#B5$(BU0D&(D!B0N+3"0<B5,,
-MB4L0Z7'\__]R"CE$)!@/@Y[]__^+5"0DQT0D!&`"``"+`HD$).C\____B00D
-MZ/S___^)P3'`A<ET4\8$"`"#P`&#^!AU](M<)#R+1"08BU0D'`-#!(G>$U,(
-MB4$$BT,,*T0D&(E1"(M3$!M4)!R)00R+`XE1$(M4)!R)`8M$)!B)"XE3$(E#
-M#.GL^___BTPD/(L9BT,$BU,(B4$$BP.)40B+5"0DB0''1"0$8`(``(L"B00D
-MZ/S___^)7"0$B00DZ/S____IK_O__XGVC;PG`````%=64X/L$(M\)"#'1"0$
-M8`(``(L'B00DZ/S____V1TP(B<9U((M')(7`=!F0C70F`(L8B40D!(DT).C\
-M____A=N)V'7LBU=0BT=<B00D_U)`BT=<B40D!(M'6(/`$(D$).C\____@\00
-M6UY?PXUT)@!64X/L%(M<)""+4R2`HQP"``#^A=)T%(M"%(7`=`>`H!P"``#^
-MBQ*%TG7LB5PD!,<$)`$```#H_/___XL#QX.D`````0````6P````B00DZ/S_
-M__^%P(G&=%S'``$```#'0`0P"00`B48(QT`,`````(E8$(M;)(7;=#"0C70F
-M`(M3%(72=0OK'(VT)@````")PHM"#(7`=?>)="0$B10DZ/S___^+&X7;==6+
-M!H/H`87`B09T!H/$%%M>PXET)""#Q!1;7NEF^?__C;8`````4X/L&(M$)""+
-M7"0HQT0D!&`"``")!"3H_/___XM4)"2-'-N)7"0,QT0D"!@```")5"0$B00D
-MZ/S___^#Q!A;PX/L/(E\)#2+?"1`B70D,(MT)$2);"0XBVPD2(E<)"R#_P=W
-M3/\DO0P8``"+LY0```"%]G4[BT,$QX.4`````0```(M`.(F;C````,>#D```
-M``````")@X@```"-@X@```")1"0$C4$LB00DZ/S___^+7"0LBW0D,(M\)#2+
-M;"0X@\0\PXM>$,=&$`````")="0$QP0D`P```.C\____B5X0Z\V)-"3H_/__
-M_XM8"(G'A=MU".L,BQN%VW0&.7,(D'7TC4,LB00DZ/S___^%P'2?B5@,B6@0
-MQP#@$00`B4`$QT`(`````(E$)`2-1R2)!"3H_/___^EU____B30DZ/S___^)
-MP8M`#(U1##G0=0_I7/___XL`.=`/A%+___^-F-C]__^`>P@!=>HY:UQUY8/_
-M!P^'./____\DO2P8``"+0UB+4`2-1"0,B40D!(DL)/]2/`^V1"0:B$-*#[94
-M)!8/MD-.@^(!`=*#X/T)T(A#3NGZ_O__BT,0@*,<`@``[XM0((72#X7E_O__
-MQT`@`0```(/`%(E$)`2-02R)!"3H_/___^G'_O__@(L<`@``$.F[_O__BT,$
-MB1PD_U`DB?;IJ_[__XUT)@"-O"<`````@^P<BT0D((E<)!2)="08BU@,BW`0
-MB40D!(U#+(D$).C\____B5PD#(ET)`2)'"3'1"0(,"<$`.C\____BUPD%(MT
-M)!B#Q!S#D(VT)@````"!["P"``"`/0``````B9PD)`(``(N<)#`"``")M"0H
-M`@``=1R+G"0D`@``B[0D*`(``('$+`(``,.-M"8`````#[9#3(UT)"2#R`.#
-MX/N(0TS'1"04`0```(ET)!#'1"0,`0```,=$)`0)````QT0D"`````")'"3H
-M_/___X7`=4^!?"0D>6-G;'1E]D-,`9!TDHMS)(7V="7'1"0$8`(``(L#B00D
-MZ/S___^)="0$B00DZ/S____'0R0`````BT,XBU,\B4,4B5,8Z57___^0@*,<
-M`@``_HE<)`3'!"0!````Z/S___^`2TP!Z33____'1"0$``(``(DT).C\____
-MA,!UAP^V3"0H#[:#'`(``(G*P.H$@^#]@^(""="(@QP"``#V1"0H$'0,@$M,
-M@`^V1"0IB$-+]D0D*P%T%P^V4TV)R,#H`H/@`H/*`8/B_0G"B%--]D0D*P)T
-M%0^V4TV-!`F#X`B#R@2#XO<)PHA33?9$)"L(=!4/MD--P>$$@^$@@\@0@^#?
-M"<B(0TWV1"0K!`^$]/[__P^V4TT/MD0D*(/*0(/@`8/B?\'@!PG"B%--Z=7^
-M__^-=@"-O"<`````55=64X'L'`(``(N,)#`"``"#P20/MD$H@^`#+`$/A+\"
-M``"+E"0P`@``#[9"3(/@[XG&B$),C40D'(VV`````,8``(V<)!P"``"#P`$Y
-MV'7O]D$H`@^%AP(``(N\)#`"``")\X/C]XA?3(N\)#`"``#'1"0<7W=A4HM'
-M%(M7&(E$)"")5"0D@'DH`'D-@$PD*!`/MD=+B$0D*?9!*0%T)(N$)#`"``"`
-M3"0K`0^V4$T/MD0D*,'B`H/B"(/@]PG0B$0D*/9!*01T(XN\)#`"``"`3"0K
-M`@^V1"0H#[9738/@^]#J@^($"="(1"0H]D$I$'0DBX0D,`(``(!,)"L(#[90
-M30^V1"0HP.H$@^("@^#]"="(1"0H]D$I0'0AB[PD,`(``(!,)"L$#[9$)"@/
-MME=-@^#^P.H'"="(1"0HBX0D,`(``(-X+``/AIX!``#V02@@#X2S`0``BY0D
-M,`(``(MR)(7V=$`Q_XMN%(7M=#&+1@2-#'^#QP&+5@B-3,P<B4$0B5$4BT8,
-MBU80B4$8BT84B5$<BU`LBT`HB5$DB4$@BS:%]G7"BXPD,`(``(U<)!R-?"0<
-M#[9!3HD<),:$)!L"```!QT0D!``"``"#X`&(A"0:`@``Z/S___^+C"0P`@``
-MB7PD$,=$)!0`````QT0D#`$```#WV(B$)!P!``"+03B+43R)#"0%``#^_X/2
-M_R4``/[_B40D!(E4)`CH_/___XN<)#`"``"+>R2%_W1/,>V+3Q2%R71`BYPD
-M,`(``(UT;0"+0SB+4SR+62R+22@!P1'3@<$`^/__@]/_!0``_O^#TO\E``#^
-M_RG!&=.#Q0&)3/0\B5ST0(L_A?]ULXU\)!S&A"0<`0```,=$)`0``@``B3PD
-MZ/S___^+C"0P`@``QT0D%`````#'1"0,`0```/?8B(0D'`$``(U$)!R)1"00
-MBT$XBU$\B0PD!0#X__^#TO^)1"0$B50D".C\____@<0<`@``6UY?7<.!>"C_
-M_Q\`#X=5_O__B?.#X_.(6$SV02@@#X5-_O__P.L"@^,!B%PD*ND^_O__D(UT
-M)@!3B<.#[`C'1"0$8`(``(L`B00DZ/S___^)!"3H_/___XG!,<"%R70RQ@0(
-M`(/``8/X&'7TBT,4BU,8B4$,B5$0BT,4BU,8B4LDB4,PB5,TB4,HB5,L@\0(
-M6\.)'"3H_/___^OQC;8`````C;\`````55=64X'L/`,``(N\)%`#``"`/0``
-M```"C7<D#X0O`0``C40D2,=$)!0!````B40D$,=$)`P!````BT<XBU<\B3PD
-M!0#X__^#TO^)1"0$B50D".C\____A<")1"0L#X3O`P``C6PD2,=$)!0!````
-MB6PD$,=$)`P!````BT<XBU<\B3PD!0``_O^#TO\E``#^_XE$)`2)5"0(Z/S_
-M__^%P(E$)"@/A$8#``"#?"0L_P^4P(-\)"C_#X34!@``BT0D*(7`#Y5$)"</
-MA#("``"+1"0LA<`/A28"``"-3"1(QT0D%`$```")3"00QT0D#`$```"+1SB+
-M5SR)/"0%`/C__X/2_XE$)`2)5"0(Z/S___^%P(E$)"P/A.0!``"`IQP"``#^
-MB7PD!,<$)`$```#H_/___X!/3`&!Q#P#``!;7E]=PX`]```````/A0`"``"0
-M@$],`O9'3`)T#0^V1TR#R`&#X/N(1TSV1B@!=#B+7R2%VW0EQT0D!&`"``"+
-M!XD$).C\____B5PD!(D$).C\____QT<D`````(M'.(M7/(E'%(E7&(!^*``/
-MB/$```#V1BD!#X6U````]D8I!'5\]D8I$'4^]D8I0`^$:/___\9$)$@%#[9'
-M38UL)$C&1"1-`,#H!XA$)$R+5U");"0$BT=<B00D_U)@@<0\`P``6UY?7</&
-M1"1(!`^V1TV-3"1(QD0D30#`Z`6#X`&(1"1,BU=0B4PD!(M'7(D$)/]28/9&
-M*4`/A/[^___KE,9$)$@##[9'3<#H`X/@`8A$)$R-1"1(BU=0B40D!(M'7(D$
-M)/]28/9&*1`/A%G____KE<9$)$@"#[9'38UL)$C0Z(/@`8A$)$R+5U");"0$
-MBT=<B00D_U)@]D8I!`^$(?___^N;QD0D2``/MD=+C4PD2(A$)$R+5U")3"0$
-MBT=<B00D_U)@]D8I`0^$[O[__^NAC50D2,=$)`0``@``B10DZ/S___^$P`^%
-M4`$``("\)$<"````=0C'1"0L_O___\9$)"<`@7PD2%]W85(/A`L"``"+3SB+
-M7SR!P0``_O^#T_^)R(G:)0``_O^)T#'2B=4)Q0^%=`$``(!/3`$/M@4`````
-M/`(/A`G^__\L`0^$\_W___:''`(```$/A/C]__^`IQP"``#[C40D2(V4)$@"
-M``")]L8``(/``3G0=?:-;"1(QT0D%`$```");"00QT0D#`$```#'1"0$````
-M`,=$)`@`````B3PDZ/S___^`?"1(10^$\`,``("\)$8"``!5#X61_?__@+PD
-M1P(``*H/A8/]__\QP(N4!!("``"%T@^%;OW__X/`$(/X0'7IZ67]__^0C40D
-M2`^VG"1'`@``QT0D!``"``")!"3H_/___XE<)`S'!"0D"P``#[;`B40D"(M$
-M)$B)1"0$Z/S___^!?"1(7W=A4@^$E/[__XM$)"R%P`^%>/S__\=$)"S_____
-MZ6O\__^-5"1(#[:<)$<"``")%"3'1"0$``(``.C\____B5PD#,<$)``+```/
-MML")1"0(BT0D2(E$)`3H_/___X%\)$A?=V%2#X1J`P``QT0D+/[____IN_O_
-M_XU$)$@QTHE$)!")R"4``/[_QT0D%`$```#'1"0,`0```(E$)`2)5"0(B3PD
-MZ/S___^%P`^%._S__X%\)$A?=V%2#X5%_O__C50D2,=$)`0``@``B10DZ/S_
-M__^$P`^$[@8``(%\)$A?=V%2#X4;_O__C50D2,=$)`0``@``B10DZ/S___^$
-MP`^%__W__X!\)%8`#[9'3`^5PL'B`H/@^PG0B$=,#[9'3H"\)$8"````#Y7"
-M@^#^"=`/MM*(1TZ)5"0(B70D!,<$)&`#``#H_/___XM'.(M7/`4``/[_B<&#
-MTO^!X0``_O^)^(E/%(E7&.CS^?__]D0D5!!T#(!/3(`/MD0D58A'2_9$)%<!
-M=!H/ME=-#[9$)%2#R@'`Z`*#XOV#X`()PHA73?9$)%<"=!D/ME=-#[9$)%2#
-MR@0!P(/B]X/@"`G"B%=-]D0D5PAT&@^V5TT/MD0D5(/*$,'@!(/BWX/@(`G"
-MB%=-]D0D5P1T&@^V5TT/MD0D5(/*0(/@`8/B?\'@!PG"B%=-QT0D-``````Q
-M[8M$+&`+1"QD#X7;`0``@\48@_U@=>J`?"0G``^$0P,``&8Q[8M$+&`+1"QD
-M=#2+3"QHBT<XBUPL;(M7/('!``@``(/3`"G!&=,%``#^_X/2_R4``/[_`<$1
-MTXE,+&B)7"QL@\48@_U@=;J-5"1(B10DQH0D2`$```#'1"0$``(``.C\____
-MC4PD2,=$)!0`````B4PD$,=$)`P!````]]B(A"1(`0``BT<XBU<\B3PD!0``
-M_O^#TO\E``#^_XE$)`2)5"0(Z/S____'1"0X`````,=$)#P`````C6PD2,=$
-M)!0!````B6PD$,=$)`P!````BT<XBU<\B3PD!0'X__^#TO\#1"0X$U0D/(E$
-M)`2)5"0(Z/S___^%P`^$70$``(-$)#@!BT0D.(-4)#P`@_`$"T0D/'6CBTPD
-M-(7)#X34`P``@$],0(D\).C\____Z13Z__^$P`^$)/G__XVT)@````#I=_G_
-M_X!\)$E2C;8`````#X7_^___C40D2,=$)!0!````B40D$,=$)`P!````QT0D
-M!`$```#'1"0(`````(D\).C\____@'PD2%`/A<3[__^`?"1)30^%N?O__XUT
-M)@#I2_G__XU,)$C'1"0$``(``(D,).C\____A,`/A$+X___I=?S__\=$)`0$
-M````BP>)!"3H_/___X7`B40D-`^$\_C__XM$+&"+5"QDB00DB?B)5"0$BU0L
-M6(M,+%SH#NK__X7`B40D,`^$X@0``(M,)#2)>22+1"0HA<`/A=D```"+1"QH
-MBU0L;(E!*(E1+(M,)#"+5"0TB4HPBTPD,(M!#(M1$(M,)#2)012+1"0PB5$8
-MB4@4Z9']__^-1"1(QT0D%`````")1"00QT0D#`$```"+1SB+5SR)/"0%``#^
-M_X/2_R4``/[_@\`!@](``T0D.!-4)#R)1"0$B50D".C\____BT\XBU\\QP0D
-M2`L``(G(!0``_O^)VH/2_R4``/[_@\`!@](``T0D.!-4)#R!P0'X__^#T_\#
-M3"0X$UPD/(E$)`R)5"00B4PD!(E<)`CH_/___^D#_O__BT0D+(7`#X4I____
-MBTPL:(M'.(M<+&R+5SR!P0`(``"#TP`IP1G3!0``_O^#TO\E``#^_P'!BT0D
-M-!'3B4@HB5@LZ>[^__^+7"0LA=L/A,?]__^`O"1'`@````^$(`$``#'MBT0L
-M8`M$+&1T-(M'.(M7/(G!`TPL:(G3$UPL;('!`/C__X/3_P4``/[_@]+_)0``
-M_O\IP1G3B4PL:(E<+&R#Q1B#_6!UNHUL)$C&A"1(`0```,=$)`0``@``B2PD
-MZ/S____'1"04`````,=$)`P!````]]B(A"1(`0``C40D2(E$)!"+1SB+5SR)
-M/"0%`/C__X/2_XE$)`2)5"0(Z/S____'1"1``````,=$)$0`````C50D2,=$
-M)!0!````B50D$,=$)`P!````BT<XBU<\B3PD!0``_O^#TO\E``#^_X/``8/2
-M``-$)$`35"1$B40D!(E4)`CH_/___X7`#X2F````@T0D0`&+1"1`@U0D1`"#
-M\`0+1"1$=9CIF?S__\<$)'4#``#H_/___XU4)$B)%"3&A"1'`@```<:$)$@!
-M````QT0D!``"``#H_/___XU,)$C'1"04`````(E,)!#'1"0,`0```/?8B(0D
-M2`$``(M'.(M7/(D\)`4``/[_@]+_)0``_O^)1"0$B50D".C\____Z6?^___V
-M1B@$#X3:]___B?;I&_S__XU,)$B)3"00QT0D%`````#'1"0,`0```(M'.(M7
-M/(D\)`4!^/__@]+_`T0D0!-4)$2)1"0$B50D".C\____BT<XBU<\BTPD0(M<
-M)$0%`?C__X/2_P'!$=,%_P?^_X/2_R4``/[_@\`!@](``T0D0!-4)$2)3"0,
-MB5PD$(E$)`2)5"0(QP0D>`L``.C\____Z<;^__^-E"1(`@``C40D6,=$)`CP
-M````C9PD4`(``(E$)`2-K"1``P``B10DZ/S____K"X/#&#GK#X21````BP,+
-M0P1T[HU,)$@QTL=$)!0!````B4PD$,=$)`P!````BT,(B50D"(D\)(E$)`3H
-M_/___X7`#X6M]/__C40D2(D$).C\____@7PD2/06>%H/A-@```"-3"1(QT0D
-M%`````")3"00QT0D#`$```"+0PB+4PR)/"2)1"0$B50D".C\____A<`/A&G_
-M___I6/3__XUL)$C'1"04`0```(EL)!#'1"0,`0```(M'.(D\)`4``/[_,=(E
-M``#^_XE$)`2)5"0(Z/S___^%P`^%&?3__XU$)$C'1"04`````(E$)!#'1"0,
-M`0```(M'.(M7/(D\)`4``/[_@]+_)0``_O^)1"0$B50D".C\____A<`/A=;S
-M___IP/?__Y"-="8`BU0D-(D4).C\____Z=;S__^-5"1(QT0D!``"``")%"3H
-M_/___^D/____C;8`````55=64X/L3(ML)&#'1"0$`0```(M%#(D$).C\____
-MC50D+(G'BT4$B50D!(M4)&2)%"3_4#R+ARP"``"+ER@"``")0@2)$(L'BU@,
-M@\`,.<-U#>M_BP>+&X/`##G8='2-L]C]__^`?@@!=>F+1EB+500[4`0/A"8!
-M``")1"0$B2PDZ/S___^#^`!\2'7'C40D#(M5!(E$)`2+1ER)!"3_4CP/ME0D
-M-@^V1"06T.K0Z(/B`8/@`3G"?YM\&`^V1"08.$0D.'>.<@L/MD0D.3I$)!EW
-M@8M3!(V'*`(``(E#!(F?*`(``,='(`$```")`H"/'`(```&+102)ERP"``")
-M1U"+5"1DB6]8B5=<BT0D:(E'5(M$)"R+5"0PB4<XB5<\B4<4B5<8#[9$)#J(
-M1TH/MT0D0&:)1T@/ME0D-@^V1TZ#X@$!TH/@_0G0B$=.C4=@B00DQT0D!"@`
-M``#H_/___XU$)"R+5U")1"0$BT=<B00D_U(\BT0D1/9$)#8!=0GV@``!```$
-M=0B)/"3H_/___X/$3(GX6UY?7<.-M@````"+DH````"%T@^$S/[__XM`"(E$
-M)`2+10B)!"3_TNG$_O__C;0F`````(V\)P````!3@^P(BUPD$(!["`%T"KC_
-M____@\0(6\.`/0`````"=.V+0SB+4SP%``#^_XG!@]+_@>$``/[_B=B)2Q2)
-M4QCH_.___X!C3/3'0QS_____B1PDZ/S___\QP.NXD(UT)@"#[!R+1"0HB70D
-M%(MT)"")?"08BWPD)(E<)!"%P'AQB40D"(E\)`2)-"3H_/___X7`B<-T3`^V
-M0$R+=@RH`G5P@#T``````'08J`%U;?9#3$1U!(!+3"2+AB0!``"%P'1CB5PD
-M)(MT)!3'1"0@`@```(M<)!"+?"08@\0<Z?S___^+1@2)/"3_4$"-M@````"-
-M1A"+7"00B7PD)(MT)!2)1"0@BWPD&(/$'.G\____D(D<).C\____ZZ>)'"3H
-M_/___^N)C888`0``QX8D`0```0```,>&&`$```````")MAP!``#'AB`!````
-M````B40D!(U&)(D$).C\____Z5____^-M"8`````C;PG`````%575E.#[#R+
-M1"10B40D&(MH)(MX,(MU)(7V#X0"`@``B?/'1"0<`````.L*C70F`(L;A=MT
-M(#G[=/:+4PB+3PB+0P0S1P0QT0G!=>2)7"0<BQN%VW7@BT0D'(7`#X3Y````
-MBTPD'(M'#(M1#(M)$(E$)"")5"00BU<0B4PD%#G1B50D)'):=P8Y1"00<E*)
-M?"0$B2PDZ/S___^`34P0BT0D&(D$).C\____B6PD4(/$/%M>7UWI_/___XVV
-M`````(M$)""+5"0DBTX(`T<$$U<(,T8$,=$)P71`BS:%]G0-BUX4A=MTV8LV
-MA?9U\XM,)!S'1Q0`````BT$$`T$,BU$($U$0B4<$BT0D$"E'#(E7"(M4)!09
-M5Q#K@(M,)!R+400!5"00BTD($4PD%(M$)!"+5"04BTPD'(E&!(M&#(E6"(M6
-M$`-'#!-7$"M!#!M1$(E&#(E6$.DS____,=OK!Y"+-H7V=%F+3A2%R77SBU8$
-MBTX(BT<$B50D,(M7"(E,)#2+3"0TB40D*`-'#(E4)"P35Q`S1"0P,=$)P71^
-MBT0D,(M4)#2+3"0L`T8,$U80,T0D*#'1"<%UIXET)!SKH8M4)!S'1Q0`````
-MA=)T*(M,)!R+002+40B)1P2+00R)5PB+41`!1PP15Q")3"0$B2PDZ/S___^%
-MVP^$G/[__XM##(M3$`%'#!%7$(E<)`2)+"3H_/___^E__O__B?/I/O___\='
-M%`````"-M"8`````Z67^__^-="8`C;PG`````%4Q[5=64X/L+(M\)$R+1"1$
-MBU0D2(7_B40D$(E4)!0/A``!``"+5"1,BVHPA>T/A/$```"+1"1`BU@DA=L/
-MA)$```#'1"08`````,=$)!P`````ZPPY1"1,=`V+&X7;=$F+0Q2%P'7MBTL0
-M.4PD%(M3#'<,<FHY5"00=F2-="8`A<!UUX7M=-.+102+50B+2P@#10P351`S
-M0P0QT0G!=;N)7"0<BQN%VW6WBT0D'(7`=!:+3"0<BT$,BU$0`T4,$U40.50D
-M%'8QBT0D&(7`#X5^````,>V#Q"R)Z%M>7UW#BW0D&(7V=`N+="08.TX0=X]S
-M'XE<)!CKAXVT)@````!S1(EL)!B+1"08A<!TQHGVZT`[5@P/@V7___^)7"08
-MD.E;____BTPD0(M<)!0Y62QRH@^'_/[__XMT)!`Y<2ARD^GN_O__.40D$`^'
-M>/___^NPBUPD0,=$)`0$````BP.)!"3H_/___X7`B<4/A&3___^)6"2+="1`
-MBTXXBUX\@<$``/[_B<B#T_\E``#^_XE$)""#1"0@`8E<)"2#5"0D`#';BU8D
-MA=)T(XVV`````(M"%(7`=!"+2"BX`0```"M,)"#3X`G#BQ*%TG7C,<FX`0``
-M`-/@A<-T*H/!`8/Y!'7MQT4H`````,=%+`````")+"0Q[>C\____@\0LB>A;
-M7E]=PXG*B<C!^A\#1"0@$U0D)(E%*(G1"<&)52QTT8MT)!2+7"00BT0D0(EU
-M&(MT)!B)712+7"00BU8$BTX(BW0D%(D<)(ET)`3H(=W__X7`=)V):!2)13"+
-M="1`@$Y,$(DT).C\____Z6C^__^)]E93@^P$BW0D$(M&)(7`=0CK3XL`A<!T
-M28M0%(72C78`=/"+6@R%VW0N@'LP`'0H,<GK"P^V0S"#P0$YR'X9.52+2'7O
-M#[9#,,=$BT@`````@\$!.<A_YXD4).C\____ZZB)-"3H_/___XM64(M&7(D$
-M)/]29(ET)!"#Q`1;7NG\____C;8`````C;PG`````%93@^P$BW0D$(M>)(!F
-M3+^%VW0PBT,4A<!T"(D$).C\____BQN%VW7KBU8DA=)T%(M"%(7`=`>+2`R%
-MR704BQ*%TG7LB70D$(/$!%M>Z?S___^)!"3H_/___XM6).O-D%575E.#[`R+
-M1"0@BV@0B40D!(V%L````(D$)(U]#.C\____BUT,QX4D`0```````#G[=0CK
-M+XL;.?MT*8V#V/W__X!X"`%U[O9`3$!TZ/:`'`(```%TWXD$).C\____BQLY
-M^W77BUT4C744.?-T$I"-0_2)!"3H_/___XL;.?-U[XMU##G^#X2N````C70F
-M`(V&V/W__X!X"`1V"XM8#(7;#X1!`0``BS8Y_G7CBUT,.?L/A((```#&1"0+
-M`.L'D(L;.?-T/HV3V/W__X!Z"`%U[O9"3"!TZ(M")(!B3-N%P'4/Z<@```"+
-M`(7`#X2^````BT@4A<ET[XL;QD0D"P$Y\W7"BUT,.=]U"^LMC78`BQLY^W0D
-MC8/8_?__BV@<A>UX'_:`'`(```%UY(D$).C\____BQLY^W7<@\0,6UY?7</V
-M@!P"```!=,4/ME`(@/H$=G:+<`R%]G6U]H!(`0``0'6LBY!D`0``A=)T!3E"
-M!'6=#[9P,(7V?B0QR8M4B$B%TG03@'H(!'8-]H)(`0``0`^%>/___X/!`3GQ
-M==Z)!"3H_/___^ED____C70F`(!\)`L`#X4%____B10DB?;H_/___^GV_O__
-M@.H!C78`#X4Z____]D!,`HVV``````^$*O___^NWB00DD(UT)@#H_/___^FM
-M_O__C;8`````5U93@^P0BWPD((V'L````(D$).C\____A<")QG15BU\,B7@0
-M@\<,QP`!````QT`$X"T$`#G[B48(QT`,`````'4(ZR2+&SG[=!Z-@]C]__^`
-M>`@!=>Z)="0$B00DZ/S___^+&SG[=>*+!H/H`87`B09T!X/$$%M>7\.)="0@
-M@\006UY?Z7?]__^-M"8`````@^P<B70D%(MT)"")7"00B7PD&(M>$,=#(```
-M``#VAAP"```8=7R+AI0```"%P'5R#[9#**@!=6JH`HU["'06.7L(=00Y&W04
-MB?#H`=;___9#*`%U38M+"#GY=58/MD9*.4,0<A+K.XGPZ"+2__\/MD9*.4,0
-M<RN)\.CRT?__A<")PG0>#[=`9&8E_S!F/00@==4Y&W5+]D9.`G3+@$LH`NO%
-MBUPD$(MT)!2+?"08@\0<PXM[$(7_=>F+$8M!!(E"!(D0BU$,B?")"8E)!(M<
-M)!"+="04BWPD&(/$'.FOT?__QD)F`8D4).C\____B?#H?-'__XG"Z6S___^0
-MC70F`(/L'(E<)!"+7"0@B70D%(E\)!B)V(M[*.A#T?__@'MD!(MW$(G"='B+
-M0W#'1B0`````B3+'0A``````B4((BT8$B5H,B58$QT-P0#($`(E"!(D0#[9'
-M2CE&$','BT8@A<!T$(M<)!"+="04BWPD&(/$',.-1A3'1B`!````B40D!(L'
-M@\`LB00DZ/S___^+7"00BW0D%(M\)!B#Q!S#B?;V0V4P=`KV1B@"#X1X____
-MQD-F`8MT)!2)7"0@BWPD&(M<)!"#Q!SI_/___XUT)@"#[!R)="00BW0D((E<
-M)`R)?"04B6PD&(GPZ'+0__^+7BB+>Q")Q8-O$`$/MD9F/`UT7CP1#X1]````
-M/`MT8CP0#X20````BT4(B49PB30DZ/S___^+1R"%P'4;C4<4QT<@`0```(E$
-M)`2+`X/`+(D$).C\____BUPD#(MT)!"+?"04BVPD&(/$',.-M@````"`?F0`
-M=;"`?F<`=6K&1F<!QD9F`(M7#(U'"(EO#(E%`(E5!(DJZYV)V.C"T___A<!U
-M"`^V1F<\`79"#[9&9CP0#X5P____@'YD`P^$9O___XM#$(ES$(E<)`3'!"0#
-M````B40D".C\____BT0D"(E#$.E`____QD9F$.O*@\`!B$9GZXR0D)"0D)"0
-MD)"0D)!64XL=`````(MT)`R%VW0MBU,,C4L,.<IU#.L;C70F`(L2.<IT$8V"
-MV/W__SFP6`(``'7L6U[#BQN%VW73,<"0Z_*-M"8`````C;PG`````(!X!`!U
-M#8$X>P$```^7P`^VP,.!.'L!```/E\`/ML##4XG!#[8:#[8`.-AT%>LID`^V
-M60$/MD(!.,-U$(/!`8/"`83`=>HQTEN)T,,/OM,/OL!;*<*)T,,/OM`/OL,I
-MPNOFC;0F`````(V\)P````!55U93@>R<````BRT`````B40D&(E4)!2%[71!
-M,?:-?"0DBUT(A=MT+8E\)!"-=@"+4P2)?"0$BT,(B00D_U(<@'PD-P!T"3MT
-M)!AT'X/&`8L;A=MUVHMM`(7M=<4QVX'$G````(G86UY?7<.+1"04A<!TZXM4
-M)!2+`@^V5"0[.=!\W(L;A=MTUBG0BU0D%(D"BT0D$(M3!(E$)`2+0PB)!"3_
-M4AR`?"0W`'3(ZZ^)]E575HG.4X'LG````(E$)`RA`````(N\)+````#'`0``
-M``")5"0(A<#'!P````")1"00#X21````O?_____'1"04`````(M4)!"+6@B%
-MVP^$@````(7_#Y5$)!OK%HUV`(L;#[9$)#L!!HM4)!0!%X7;=&&-5"0DBT,$
-MB50D!(M3"(D4)/]0'(M#!(N0A````(72=!.`?"0;`'0,BT,(B00D_]*)1"04
-M@'PD-P!T#\<&`````(/%`<<'`````#M<)`QUG8M$)`B)*('$G````%M>7UW#
-MBT0D$(L`A<")1"00#X5?____Z^&0C;0F`````%575C'V4X'LC````(L]````
-M`(7_="^-;"04BU\(A=MT'HM3!(EL)`2+0PB)!"3_4AR+&X!\)"<!@][_A=MU
-MXHL_A?]UU8'$C````(GP6UY?7<.-M"8`````C;PG`````%57B<]64X'LO```
-M`(E4)!B-5"08Z.?]__^)1"00BU0D$+C_____A=(/A/D```"+1"00BW`,,<#&
-M!#@`@\`!@_A$=?2+5"00BTPD$(M"!(U4)!R)5"0$BU$(B10D_U`<@'PD+@]V
-M!<9$)"X/BT0D$(M,)!"+4`2-A"2T````B40D"(M$)!B)1"0$BT$(B00D_U)<
-MA<`/A)@```"+7@R-;@PYZP^$?0```,9$)!<`ZP>0BQLYZW1OC;/8_?__@'X(
-M`77NBT0D$#M&6'7EC8PDE````(M64(E,)`2+1ER)!"3_4CSVA"2>`````G7$
-M#[:$)*`````[1"08=;8/MH0DH0```#I$)"YSJ`^VT(N&6`(``(!$)!<!B427
-M"`^V1"07.$0D+G6+,<"!Q+P```!;7E]=PXN$)+@```")1P2+A"2T````B0?I
-M4/___XVV`````(/H!3'2@_@'=PS_)(5,&```N@$```")T,.Z"````(G0P[H"
-M````B=##N@<```")T,.Z`P```(G0P[H$````B=##N@4```")T,.Z!@```(G0
-MP^L-D)"0D)"0D)"0D)"0D%:)UE,/MH@<`@``B<,/ME((B<B#\`&#X`'VPB!T
-M`X/((/;!!'0#@\@"@^$"=`.#R`2#XA!T`X/($`^V5@KVP@%T`X/(0(/B`G0"
-M#(`/ME-,]L($=`4-````@/;"`G0%#0```@"#X@%T!0T```$`]D-.`70%#0``
-M!`!;7L.-="8`55>_Z`,``%93@^PLBT0D0(N84`$``(N(3`$```^V:#`/K-D+
-MB<C!ZPOWYVGSZ`,``(G!C1P6BW0D0(M6&(M&%(D,)(E<)`2)ZP^LT`O!Z@N)
-M1"0(B50D#.C\____BTX$#[9)!BG+N0H```#WX_?AA>V)1"0D#XZ2````,?:-
-M=@"+1"1`BURP2(7;=';V@QP"```!=&V`>P@$=F?V@T@!``!P=%Z+4P0/MD,P
-M#[92!BG0BY-0`0``C02`C3P`BX-,`0``#ZS0"VG(Z`,``(M#%,'J"XM3&`^L
-MT`O!Z@N)1"08B<B+3"0DB50D'#'2]W0D&`^O^(7)=`8Y?"0D=@2)?"0D@\8!
-M.?4/A7/___^+1"0D/1`G``!V!;@0)P``@\0L6UY?7<.-="8`C;PG`````(/L
-M+(M$)#")7"0<B70D((E\)"2);"0HBZAD`0``#[9%9CP"#X6J````BT4(BU`4
-MBT@8BT4$B50D$(MT)!")3"04BWPD%(M(%(M8&+@0)P``*<X9WP^L_@O![PN)
-M^@GR=$Z`?10`=5R+15R+56`IR!G:#ZS0"[GH`P``P>H+:=KH`P``]^&)="0(
-MB7PD#(T4$XD$)(E4)`3H_/___[D*````]^$]$"<``'8%N!`G``"+7"0<BW0D
-M((M\)"2+;"0H@\0LPXM$)!"+5"04*T5<&U5@ZYX\`P^$E0```(!]%`!T/HM%
-M"(M8&+[H`P``BT@4B=J)R"M%7!M58`^LV0O!ZPL/K-`+P>H+:?KH`P``]^:)
-M3"0(B5PD#(T4%^EQ____BUU@O^@#``"+35P/K-D+B<CWY\'K"VGSZ`,``(G!
-MBT4(C1P6BU`8BT`4B0PDB5PD!`^LT`O!Z@N)1"0(B50D#.C\____N0H```#W
-MX>DS____@'T4`'0(BT4$Z6;___^+76"_Z`,``(M-7`^LV0N)R/?GP>L+:?/H
-M`P``B<&+102-'!;KGXVV`````(V_`````%93BT@,B<.%R70S#[9!,(3`#[;P
-M=!@QTCE92'06,=+K!CE<D4AT#(/"`3GR=?-;,<!>PXM!)%M>@\`!`=##BT`D
-M6U[#C;8`````C;\`````55>)UU93@^P$B00D#[9H,(7M?E,Q]HL$)(M4L$B%
-MTG0_]H(<`@```70V@'H(!'9!#[9:,(7;?B@QR8VV`````(M$BDB%P'0.]H`<
-M`@```70%.7@D=!.#P0$YV77CC78`@\8!.>YUKS'`@\0$6UY?7<,Y>B1UZHG0
-MZ^^-M@````!55U93@^Q`B40D&(M<)!B(5"07#[9$)%@/ME0D7(E,)!"%VXA$
-M)`^(5"0.#X1/`0``BTPD&(!Y"`</E,"`?"07!P^4PH3`#X48`0``A-(/A2P!
-M``"+3"00A<D/A"<#``#'1"0<_____S'_,>W'1"0@_____\=$)#@`````C70F
-M`(M4)#B+3"14BP21B00DZ/S___^%P(G##X2W````BU0D&(L`.P(/A:D```"`
-M>P@!#X6?````BT0D&(G:Z,#^___'1"0L`````(7`B<9T!XM(,(E,)"R+6R2%
-MVP^$%0$``(G8,=(QR8-X%`!T!H/"`8/1`(L`A<!U[H/Y`'<)@_H##X;O````
-MQT0D)`````#'1"0H`````,=$)!P`````QT0D(``````#?"0DBU0D$!-L)"B#
-M1"0X`3E4)#@/A3____\/MDPD#X/A#X!\)!<'#X;'`0``,?\Q[8/$0(GXB>I;
-M7E]=PXM,)!@/MD$P/`$/A.#^__^$TG0(A,`/A?L!``"+7"00A=L/A/L!```Q
-MVS'_,>W'1"0<_____\=$)"#_____ZSF`>`@!=:J+4"R+0"B)T0G!=)X!QQ'5
-M.50D('(0=P8Y1"0<=@B)1"0<B50D((/#`3M<)!`/A&3___^+5"14BP2:B00D
-MZ/S___^%P'6TZ5____^%]L=$)"0`````QT0D*`````!T#HM&%(M6&(E$)"2)
-M5"0HA=L/A)8```#'1"0P`````.LDC;0F`````(M#%#G&=!"+5"0LA=)T'H7`
-M#X2A````BQN%VW0VA?:0==Z+5"0LBT,4A=)UXH7`=>:+4Q`[5"0HBT,,<MIW
-M!CM$)"1VTHL;B40D)(E4)"B%VW7*BT0D+(7`="J+="0PA?9T(HM,)#"+00R+
-M41"+3"0L`T$,$U$0.50D*'<(<F(Y1"0D<ER+1"0H.40D(`^"8_[__W<.BU0D
-M)#E4)!P/AE/^__^+1"0DBU0D*(E$)!R)5"0@Z3[^__^+3"0LBT$$BU$(`T$,
-M$U$0BTL(,T,$,=$)P0^%6?___XE<)##I4/___XE$)"2)5"0HZYH/MD0D%_\D
-MA6P8``"#?"00`0^&(O[__X-\)!`"BWPD'(ML)"`/AA/^__\/ML&Z_____XG!
-MBT0D'-/BB=/1;"00(="+5"0@BTPD$,'['R':B=8/K_'WX8G'C2P6Z=W]__^+
-M5"00A=(/A?H````Q_S'MQT0D'/_____'1"0@_____^FA_?__@WPD$`,/AJG]
-M__\/ML&Z_____XG!BT0D'-/BBTPD$(G3P?L?(="+5"0@@^D"(=KKF8-\)!`"
-M#X9X_?__#[;!NO____^)P8M$)!S3XHM,)!")T\'['R'0BU0D((/I`2':Z67_
-M__^`?"0.`0^&,0$``(!\)`X"#X8,____#[9T)`XQTHM$)!#W]H72B<,/A2+]
-M__^#ZP$/CAG]__^#[@'W[HG&#[;!B<&+1"0<B=>Z_____]/BB=,AT(M4)"#!
-M^Q^)P0^OSXE$)`0AVHG3#Z_>B50D"/?F`=F)QXTL$>G7_/__BT%(,?:%P'4?
-MZ<7\__\Y="00#X;G_/__BU0D&(M$LDB%P`^$J_S__XM,)%2+6"2+!+&)!"3H
-M_/___SG#=!6+5"08@\8!#[9",#GP#X:N_/__Z[N+3"08#[9!,`^VT#E4)!")
-M5"0T#X)G_/__A,!T=HM!2#'VA<!U+.E5_/__D(M,)!B#Q@$/MD$P#[;0.?*)
-M5"0T=E&+3"08BT2Q2(7`#X0N_/__BU0D5(M8)(L$LHD$).C\____.<-TQ.D3
-M_/__#[;!NO____^)P8M$)!S3XHM,)!")T\'['R'0BU0D("':Z0/^__^+3"08
-M#[;`BW2!1(MY%(MI&(M&)(M8)(7;=0CK+XL;A=MT*8M#%(7`D'7RBTXPBT$$
-MBU$(`T$,$U$0BTL(,T,$,=$)P777`WL,$VL0BU0D-#E4)!`/AI?[__^+3"14
-MC1R1ZSJ-M@````"+3"08BP`[`0^%=OO__X!Z"`$/A6S[__\#>BB+1"00$VHL
-M@\,$@T0D-`$Y1"0T#X14^___BP.)!"3H_/___X7`B<)UO.D[^___C;0F````
-M`//#C;0F`````(V\)P````!6BS5$`@``4XM,)`R-5@&)T,'X'\'H'(T<`H/C
-M#RG#N/____\['4`"``!T;8L!:]8LB8)@`@``BT$$B8)D`@``BT$(B8)H`@``
-MBT$,B8)L`@``BT$0B8)P`@``BT$4B8)T`@``BT$8B8)X`@``BT$<B8)\`@``
-MBT$@B8*``@``BT$DB8*$`@``BT$HB1U$`@``B8*(`@``,<!;7L.-="8`@^P\
-MBU0D0(E<)#2+3"1(B70D.(M<)$P/MW0D4`^V0@@\`70R/`1T2(U4)!2#?"1$
-M`1G`@\`9B$0D$(U$)`AFB7((B00DZ/S___^+7"0TBW0D.(/$/,.+@E@"``"-
-M5"04B4PD%(E<)!B)1"0,Z[Z)]HM",(M2)`-(!(N26`(``!-8"(E,)!2)5"0,
-MC50D%(E<)!CKF(VV`````(V_`````%93@^PDQD0D'`:+6`B%VW0BC70D'(M#
-M"(E$)""+0P2)="0$QP0D`````/]08(L;A=MUXH/$)%M>PXVT)@````!55U93
-M@^P$BU0D&(ML)!R+0B@/MUI0BXAD`0``B=^+,,'G"8!Y%`!T"O9"900/A8H`
-M```/MU%:P>()BXY@`0,`A?^+MF0!`P")-"1T7(G0,=+W]HT$0(G3C32!C4T0
-MZR^+!@'8B4'XBP0D*=@Y^(E!\'8"B?@IQXG-A?^)0?#'0?0`````C4D0=!^#
-MQ@PQVXML)""%[77),=*)V`-&!!-6"(E!^(E1_.N^QT7T`0```(/$!+@!````
-M6UY?7<,/MU%8#[=!6BG"*=K!X@GI:?___^L-D)"0D)"0D)"0D)"0D%6)U5=6
-M4X/L!(D$)(!Z,`!T:3'_ZR:+%"2+1C"+2C"+4`B+0`2+60@S000QTPG#=#0/
-MMD4P@\<!.?A^/XMTO4B%]G3M@'X(!';,BP0DB?+HK/___X3`=-F#Q`2X`0``
-M`%M>7UW#BQ0DBT8D.T(D=.@/MD4P@\<!.?A_P8/$!#'`6UY?7<.-="8`C;PG
-M`````%6)U5>)QU93@'@P`'1`,?;K%(GJB=CHY?___P^V1S"#Q@$Y\'XHBURW
-M2(7;=.V`>P@$=]Z)ZHG8Z#/___^$P`^40S0/MD<P@\8!.?!_V%M>7UW#C;8`
-M````C;PG`````%93B=.`>`@!=`5;,<!>PX72=%&+DF0!``"%TG1'BW($.=YT
-M1(M0)(72=#&0C70F`(M"%(7`=!^%VW4)D(UT)@#KR(G(BT@,A<EU]SG8C78`
-M=`0Y\'6TBQ*%TG746[@!````7L.)WNN\BW((Z[>-=@"+1"0$BU`0A=)X!H-X
-M%`-W!\=`+/[____SPXVV`````(M$)`2!>!#'````=@F!>!3'````=P?'0"S^
-M____\\.0BT0D!(%X$,<```!V"8M(%(7)>`+SP\=`+/[____#B?:+1"0$BU`0
-MA=)X!H-X%`-W!\=`+/[____SPXVV`````(M$)`2#>!`#=@:#>!1+=P?'0"S^
-M____\\.-M"8`````BT0D!(-X$`-V!H-X%%=W!\=`+/[____SPXVT)@````"+
-M1"0$@W@0`W8&@W@40W<'QT`L_O____/#C;0F`````(M$)`2#>!`'=@:#>!0/
-M=P?'0"S^____\\.-M"8`````BT0D!(-X$`=V!H-X%$-W!\=`+/[____SPXVT
-M)@````"+1"0$@W@0`W8&@W@4`W<'QT`L_O____/#C;0F`````(M$)`2#>!`'
-M=@F!>!3_````=P?'0"S^____\\.-="8`BT0D!(-X$`=V"8%X%*,,``!W!\=`
-M+/[____SPXUT)@"+1"0$@W@0!W8)@7@4)PT``'<'QT`L_O____/#C70F`(M$
-M)`2#>!`'=@F!>!2K````=P?'0"S^____\\.-="8`BT0D!(-X$`MV!H-X%"=W
-M!\=`+/[____SPXVT)@````"+5"0$BT(8@WH0`XL`=@R-!(4$````.4(4<P?'
-M0BS^____\\.-M@````"-OP````"+5"0$BT(8@WH0`XL`=@R-!(4$````.4(4
-M<P?'0BS^____\\.-M@````"-OP````!3@^P$BUPD#(M#&(-[$`.+`'8)@7L4
-MK0```'<,QT,L_O___X/$!%O#B00DZ/S___^%P'3H@\0$6\.-M"8`````4X/L
-M!(M<)`R+0QB#>Q`#BP!V"8%[%-<```!W#,=#+/[___^#Q`1;PXD$).C\____
-MA<!TZ(/$!%O#C;0F`````%.#[`2+7"0,BT,8@WL0`XL`=@F!>Q3Y````=PS'
-M0RS^____@\0$6\.)!"3H_/___X7`=.B#Q`1;PXVT)@````"#[`R)7"0$BUPD
-M$(ET)`B+0QB#>Q`(BTL<BS!V!H-[%`1_$\=#+/[___^+7"0$BW0D"(/$#,,/
-MME`(BT`$A-*)`8A1!'0@@3G#`0``=M6)-"3H_/___X7`=,F+7"0$BW0D"(/$
-M#,,]PP$``':VZ]^0@^P,B70D"(MT)!")7"0$@7X0LP```'8&@WX4!W<3QT8L
-M_O___XM<)`2+="0(@\0,PXM&&(L8B1PD@^L!Z/S___^#^_UWWX7`=-2`>`@$
-MB?9VS(N(9`$``(7)=<+KQXGV@^P0B70D"(MT)!2)7"0$B7PD#(-^$`AV!H-^
-M%`=W%\=&+/[___^+7"0$BW0D"(M\)`R#Q!##BWX8BQ^)'"2#ZP'H_/___X/[
-M_7<1A<!T!H!X"`1W%<=&+/[___^-1P3HC.G__RP!=;?KO(N89`$``(7;=>'K
-MYHUV`(V\)P````"#[!2)?"0,BWPD&(E<)`2)="0(B6PD$(M7&(LJC02M!```
-M`#E'$')*BW<4A?9X0X`]``````)T.C'VA>UU"XGVZS<Y[G0SBU<8@\8!BQRR
-MB1PDZ/S___^%P'07B1PDZ/S___^)PHL`.T<(=2'V0DP!==#'1RS^____BUPD
-M!(MT)`B+?"0,BVPD$(/$%,/'1RS\____Z^.-=@"-O"<`````@^P4B7PD#(M\
-M)!B)7"0$B70D"(EL)!"!?Q"'````BW<8=@V#?Q0#=R>-M"8`````QT<L_O__
-M_XM<)`2+="0(BWPD#(ML)!"#Q!3#D(UT)@`/MD8!/`AWV#'MA,!U'HGVZ]6)
-M'"3H_/___XL`.T<(D'4A@\4!B>@X1@%VNXGJ#[;"BUR&:(D<).C\____A<!U
-MT>N=QT<L_/___XVV`````.N5C;0F`````(V\)P````"+1"0$@W@0`W8&@W@4
-M`W\'QT`L_O____/#C;0F`````(/L"+H0````BTPD#(D<)(ET)`2+01B+6`B+
-M<`R+01"%VW0#C580.<)W"X7;BT$4=0LYQG8'QT$L_O___XL<)(MT)`2#Q`C#
-MB?:-O"<`````@^P4B7PD#(M\)!B)7"0$B70D"(EL)!"!?Q"O````BW<8=@V#
-M?Q0#=R>-M"8`````QT<L_O___XM<)`2+="0(BWPD#(ML)!"#Q!3#D(UT)@`/
-MMD8!/!!WV#'MA,!U'HGVZ]6)'"3H_/___XL`.T<(D'4A@\4!B>@X1@%VNXGJ
-M#[;"BUR&<(D<).C\____A<!UT>N=QT<L_/___XVV`````.N5C;0F`````(V\
-M)P````"#[!2)7"0$BUPD&(ET)`B)?"0,B6PD$(-[$`2+<QA^!H-[%`-W&\=#
-M+/[___^+7"0$BW0D"(M\)`R+;"00@\04PXGPZ+CF__\L`77:#[9&#3Q`=](Q
-M[83`=1_KT8UT)@")/"3H_/___XL`.T,(=2&#Q0&)Z#A&#7:TB>H/ML*+?(9\
-MB3PDZ/S___^%P'72ZY;'0RS\____ZY2-M"8`````@^P4B5PD!(M<)!B)="0(
-MB7PD#(EL)!"+>QB!>Q"S````BS=V!H-[%`-W&\=#+/[___^+7"0$BW0D"(M\
-M)`R+;"00@\04PXDT).C\____A<!TV8DT).C\____BP`[0PAT"<=#+/S____K
-MR(/'!`^V1P$\$'>V,>V$P'4>Z[6-=@")-"3H_/___XL`.T,(==*#Q0&)Z#A'
-M`7:9B>H/ML*+=(=PB30DZ/S___^%P'72Z7C___^-M@````"-O"<`````@^P4
-MB5PD!(M<)!B)="0(B7PD#(EL)!"+>QB#>Q`(BS=V!H-[%`-W&\=#+/[___^+
-M7"0$BW0D"(M\)`R+;"00@\04PXDT).C\____A<!TV8DT).C\____BP`[0PAT
-M"<=#+/S____KR(/'!(GXZ"_E__\L`76S#[9'#3Q`=ZLQ[83`=1OKJHDT).C\
-M____BP`[0PAURH/%`8GH.$<-=I&)Z@^VPHMTAWR)-"3H_/___X7`==+I</__
-M_Y"-M"8`````BT0D!(M0$(72>`:#>!0K=P?'0"S^____\\.-M@````"#[`R)
-M7"0$BUPD$(ET)`B+0QB#>Q`(BS!V-HM+%(7)>"^)-"3H_/___X7`=".)-"3H
-M_/___XL`.T,(=!O'0RS\____BUPD!(MT)`B#Q`S#D,=#+/[___^+7"0$BW0D
-M"(/$#,.-M@````"-O"<`````@^P,B5PD!(M<)!")="0(BT,8@WL0"(LP=C:+
-M0Q2%P'XOB30DZ/S___^%P'0CB30DZ/S___^+`#M#"'0;QT,L_/___XM<)`2+
-M="0(@\0,PY#'0RS^____BUPD!(MT)`B#Q`S#C;8`````C;PG`````(/L#(E<
-M)`2+7"00B70D"(M#&(-[$`B+,'8VBT,4A<!X+XDT).C\____A<!T(XDT).C\
-M____BP`[0PAT&\=#+/S___^+7"0$BW0D"(/$#,.0QT,L_O___XM<)`2+="0(
-M@\0,PXVV`````(V\)P````"#[`R)7"0$BUPD$(ET)`B+0QB#>Q`-BS!V-HM#
-M%(7`>"^)-"3H_/___X7`=".)-"3H_/___XL`.T,(=!O'0RS\____BUPD!(MT
-M)`B#Q`S#D,=#+/[___^+7"0$BW0D"(/$#,.-M@````"-O"<`````@^P,B5PD
-M!(M<)!")="0(BT,8@WL0#8LP=C:+0Q2%P'XOB30DZ/S___^%P'0CB30DZ/S_
-M__^+`#M#"'0;QT,L_/___XM<)`2+="0(@\0,PY#'0RS^____BUPD!(MT)`B#
-MQ`S#C;8`````C;PG`````(/L#(E<)`2+7"00B70D"(M#&(-[$`V+,'8VBT,4
-MA<!X+XDT).C\____A<!T(XDT).C\____BP`[0PAT&\=#+/S___^+7"0$BW0D
-M"(/$#,.0QT,L_O___XM<)`2+="0(@\0,PXVV`````(V\)P````"#[`R)7"0$
-MBUPD$(ET)`B+0QB#>Q`#BS!V6XM#%(7`>%2)-"3H_/___X7`=$B)-"3H_/__
-M_XG"BP`[0PAT$\=#+/S___^+7"0$BW0D"(/$#,.`>@@$=AZ+@F0!``"%P'04
-M@'AG`'4.#[:"20$``(/@&#P(=`?'0RS^____BUPD!(MT)`B#Q`S#D(VT)@``
-M``"#[`R)7"0$BUPD$(ET)`B+0QB#>Q`#BS!V/8M3%(72>#:)-"3H_/___X7`
-M="J)-"3H_/___XG"BP`[0PAT$\=#+/S___^+7"0$BW0D"(/$#,.`>@@!=`?'
-M0RS^____BUPD!(MT)`B#Q`S#C;8`````@^P,B5PD!(M<)!")="0(BT,8@WL0
-M`XLP=CV+2Q2%R7@VB30DZ/S___^%P'0JB30DZ/S___^)PHL`.T,(=!/'0RS\
-M____BUPD!(MT)`B#Q`S#@'H(`70'QT,L_O___XM<)`2+="0(@\0,PXVV````
-M`(/L$(E<)`2+7"04B70D"(E\)`R+0QB#>Q`'BS"+>`1V?XM#%(7`>'B)-"3H
-M_/___X7`=&R)/"3H_/___X7`B?9T7HDT).C\____B3PDB<;H_/___XG"BP8[
-M0PAT%\=#+/S___^+7"0$BW0D"(M\)`R#Q!##.P)UY8M&!(!X!@!T'X!Z"`%U
-M&8M&0`M&1'01BX9D`0``A<!T#H!X9P!T")#'0RS^____BUPD!(MT)`B+?"0,
-M@\00PXGVC;PG`````(/L#(E<)`2+7"00B70D"(M#&(-[$`>+,'8]BT,4A<!X
-M-HDT).C\____A<!T*HDT).C\____B<*+`#M#"'03QT,L_/___XM<)`2+="0(
-M@\0,PX!Z"`1W!\=#+/[___^+7"0$BW0D"(/$#,.-M@````"#[`R)7"0$BUPD
-M$(ET)`B+0QB#>Q!7BS!V1HM#%(7`>#^)-"3H_/___X7`=#.)-"3H_/___XG"
-MBP`[0PAT$\=#+/S___^+7"0$BW0D"(/$#,.`>@@$=@F+0@R%P'0)B?;'0RS^
-M____BUPD!(MT)`B#Q`S#C;8`````C;PG`````(/L#(ET)`B+="00B5PD!(M&
-M&(-^$$.+&'8XBT84A<!X,87;=#2)'"3H_/___X7`D'0@B1PDZ/S___^)PHL`
-M.T8(=`G'1BS\____ZPV`>@@!=`?'1BS^____BUPD!(MT)`B#Q`S#C70F`(V\
-M)P````"#[`R)="0(BW0D$(E<)`2+1AB#?A`(BQAV.(M&%(7`>#&%VW0TB1PD
-MZ/S___^%P)!T((D<).C\____B<*+`#M&"'0)QT8L_/___^L-@'H(`70'QT8L
-M_O___XM<)`2+="0(@\0,PXUT)@"-O"<`````BT0D!(M($(7)>`F+4!2%TG@"
-M\\/'0"S^____PXUT)@"+1"0$BU`0A=)X!H-X%"MW!\=`+/[____SPXVV````
-M`(M$)`2+2!"%R7@&@W@4?W<'QT`L_O____/#C;8`````@^P0B7PD#(M\)!2)
-M="0(OA````")7"0$BU\8BU<0#[9#"P^V2PS!X`F`^0)T,CG6=Q&`Z0&+5Q2^
-M$````'11.=9V(L='+/[___^+7"0$BW0D"(M\)`R#Q!##C;8`````C7`0Z\F+
-M`XD$).C\____A<!TT(L#B00DZ/S___^)PHL`.T<(=!/'1RS\____Z[N0C7`0
-M.=9WK.O,@'H(`8UV`'6AZZ:-M@````"-OP````"#[!")?"0,BWPD%(ET)`B^
-M%````(E<)`2+7QB+5Q`/MT,0#[9+$L'@"8#Y`G0R.=9W$8#I`8M7%+X4````
-M=%$YUG8BQT<L_O___XM<)`2+="0(BWPD#(/$$,.-M@````"-<!3KR8L#B00D
-MZ/S___^%P'30BP.)!"3H_/___XG"BP`[1PAT$\='+/S____KNY"-<!0YUG>L
-MZ\R`>@@!C78`=:'KIHVV`````(V_`````(/L#(E<)`2+7"00B70D"(M#&(-[
-M$`.+,'8VBT,4A<!X+XDT).C\____A<!T(XDT).C\____BP`[0PAT&\=#+/S_
-M__^+7"0$BW0D"(/$#,.0QT,L_O___XM<)`2+="0(@\0,PXVV`````(V\)P``
-M``"#[!2)?"0,BWPD&(E<)`2)="0(B6PD$(M7&`^V*HT$K00````Y1Q!R/X-_
-M%`-V.3'VA>UU">LX.>YT-(M7&(/&`8L<LHD<).C\____A<!T&(D<).C\____
-MBP`[1PATV,='+/S____K!\='+/[___^+7"0$BW0D"(M\)`R+;"00@\04PXVV
-M`````(V\)P````"#[!2)?"0,BWPD&(E<)`2)="0(B6PD$(M7&`^V*HT$K00`
-M```Y1Q!R/X-_%`-V.3'VA>UU">LX.>YT-(M7&(/&`8L<LHD<).C\____A<!T
-M&(D<).C\____BP`[1PATV,='+/S____K!\='+/[___^+7"0$BW0D"(M\)`R+
-M;"00@\04PXVV`````(V\)P````"#[`R)7"0$BUPD$(ET)`B+0QB#>Q`'BS!W
-M%L=#+/[___^+7"0$BW0D"(/$#,.-=@")-"3H_/___X7`=-Z)-"3H_/___XL`
-M.T,(=-;'0RS\____BUPD!(MT)`B#Q`S#B?:+5"0$BT(8@WH0`XL`=@R-!(4$
-M````.4(4<P?'0BS^____\\.-M@````"-OP````!3@^P(BUPD$(M#&(-[$`(/
-MM@!V/(M3%(72>#4QT@^VP.B+VO__A<")PG0EBT`$BT!\A<!T&XM"##M#"'0:
-MQT,L_/___X/$"%O#C;0F`````,=#+/[___^#Q`A;PXUT)@"#[`RY'````(E<
-M)`2+7"00B70D"(MS&(M#$`^V5@2`^@)T+3G!=Q&`Z@&+0Q2Y"````'1..<%V
-M(,=#+/[___^+7"0$BW0D"(/$#,.0C70F`(M.&(/!'.O+BP:)!"3H_/___X7`
-M=-*+!HD$).C\____B<*+`#M#"'05QT,L_/___^N]BTX8@\$(.<%WK.O*@'H(
-M`76D@'X'$'>>C;8`````ZYV-M"8`````C;PG`````%.+1"0(BUPD#(M(+#'`
-M@WPD$`"+41AT'8!Z!`%T&8U"'(E#"(M"&,=#!`$```")`[@!````6\.+01R#
-MP`B)0PCKXHVT)@````"-O"<`````@^P0B70D"(MT)!2)7"0$B7PD#(M6$(M>
-M&(/Z"W9EBWX4A?]X7H![!P!U=0^V0P;!X`F-2`PQP#G*<DB#P`0YQW)!BP.)
-M!"3H_/___X7`=#.+`XD$).C\____B<*+`#M&"'0)QT8L_/___^L>@'H(`741
-M#[9#!@^W4P0!T#T`(```?@?'1BS^____BUPD!(MT)`B+?"0,@\00PXVV````
-M``^V0P:Y#````,'@">N)B?:#[!")7"0$BUPD%(ET)`B)?"0,BTL0BW,8@_D'
-M=B6+>Q2%_W@>A<D/ME8$#[9&!7@2#[;`#[;2`=#!X`F#P`@YQW,7QT,L_O__
-M_XM<)`2+="0(BWPD#(/$$,.+!HD$).C\____A<!TVXL&B00DZ/S___^)PHL`
-M.T,(=`G'0RS\____Z\:`>@@!=;F-M@````#KN(VT)@````"-O"<`````5XG'
-M5HG64X/L$*'``@``@_C_=&^+4@R[P`(``.L,B?:#PQ2+`X/X_W19.=!U\H/`
-M`710QT8L`````(DT)(UV`/]3!(M&+(7`=4V`OX0!`P``=3"+2Q"%R0^%C0``
-M`(N7*`$``(72=#J+ET0!``"-AT`!``")MT0!``")!HE6!(DRZPW'1BS^____
-MB30D_U8H@\006UY?PXDT)/]6*(UV`.ONBT,(B;<H`0``A<!T/(M##,>'+`$`
-M``$```")MS0!``#'AS@!````````B8<P`0``B30D_U,(BX<L`0``@^@!A<")
-MARP!``!UI8DT)/]3#.N=C;8`````C;PG`````%.+"(V8"`(``,>`V`$```__
-M``")F.0!``")B-0!``"+B%@"``#'@-P!```(````QX#@`0```````,>`[`$`
-M``````")B`@"``")4P2-D,P!``#'@/0!```@0@0`BX#4`0``6^F8_O__D(VT
-M)@````"#[`R)7"0$BUPD$(ET)`B+<P@YGB@!``!T%HE<)!"+2RB+="0(BUPD
-M!(/$#/_AB?:+CD`!``"-AD`!``#'AB@!````````.<%TT(L1BT$$B4($B1")
-MRHGPB0F)203H+O[__^NVC;8`````C;\`````BT0D!(N`6`(``,.0C70F`%=6
-M4X/L-(M,)$B-="0(#[94)$2)\(G+Q@``C7PD-(/``3GX=?*`^@>(5"00#X2M
-M````@/H&=#2`^@1T+X#Z!9!T*8#Z"'0D@/H<=&Z`^@.0="Z+@U@"``")-"2)
-M1"0,Z/S___^#Q#1;7E_#]H%(`0```733@/H<QD0D%`%USNLZBTL0A<ETRP^V
-M062(1"04@'ED`'6]BT%(BU%,B40D&(E4)!P/MT%0B40D(`^V0670Z(/@`8A$
-M)!7KF(N!3`$``(N14`$``(E$)!0/MX$4`@``B50D&&:)1"0<Z7/___^+00R%
-MP'0*BX!8`@``B40D%(M9).E:____D(VT)@````"+1"0(H@````##C;8`````
-M4XM$)`B+7"0,BU`,C4@,.<IU".LHBQ(YRG0BC8+8_?__@'@(`77N]H`<`@``
-M`73EA=MT"XL2@^L!.<IUWC'`6\/K#9"0D)"0D)"0D)"0D)"#[!R)7"04B<.)
-M="08BT`@B=:)1"0$BP.)!"3H_/___P^V4&6)6"B)6"R)<#"#XL^#RB"(4&7&
-M0&0$QD!F`,=`<'!H!`")!"3H_/___XM<)!2+="08@\0<PXVT)@````"#[!R)
-M="00B7PD%(G'B6PD&(G5B5PD#(L8BT`@B4PD"(D<)('#F````(E$)`3H_/__
-M_XD<)(G&Z/S____'``````#'0`0`````BU<4BT\8QT`@`````,=`$`````")
-M4`B-4!2)2`S'0!P`````QT`D`````(E0%(E0&,=`*`````")1CS&1F0$BT0D
-M"(E^*(EN+,9&9@")1G")-"3H_/___XM<)`R+="00BWPD%(ML)!B#Q!S#C70F
-M`(V\)P````"#[!R)7"00B<N)="04B=:)?"08B<>#`0&+0"")1"0$BP>)!"3H
-M_/___X/^`8G!&<`/ME%E@\`"@^`#P>`$B7DH@^+/"<*(467&060$B5DLQD%F
-M`(!_"`1V%XN'9`$``(7`=`W'07#@:00`ZPN-="8`QT%PD&D$`(D,).C\____
-MBP>)!"3H_/___XM<)!"+="04BWPD&(/$',.-M"8`````55=64X/L'(M\)#"+
-M1"0TBVPD.(V/L````(E$)!2)3"08B0PDZ/S___^%P(G&#X2.````BU\,QP`!
-M````BT0D%(E^$(/'#(EN"#G[B48$QT8,`````'4/ZS2-M"8`````BQLY^W0G
-MC8/8_?__@'@(`77N]H`<`@```73EB?&Z`0```.C9_O__BQLY^W79BP:#Z`&%
-MP(D&=`B#Q!Q;7E]=PXM,)!B)="0$B0PDZ/S___^+3"04B6PD,(/$'%M>7UW_
-MX<<$)(X#``#H_/___^OAD%575E.#[!R+?"0PBT0D-(ML)#B-C[````")1"04
-MB4PD&(D,).C\____A<")QG1SBU\,QP`!````BT0D%(E^$(/'#(EN"#G[B48$
-MQT8,`````'0;C8/8_?__@W@<_W0)B?$QTN@H_O__BQLY^W7EBP:#Z`&%P(D&
-M=`B#Q!Q;7E]=PXM,)!B)="0$B0PDZ/S___^+3"04B6PD,(/$'%M>7UW_X<<$
-M)*D#``#H_/___^OA4X/L"(M4)!2+7"00BTH@B5H(A<ET!8M"%(D!B=CH3OG_
-M_XE<)!"#Q`A;Z?S___^04XM$)`R+7"0(BY!8`@``C8@(`@``B9C4`0``QX#8
-M`0``#_\``(F(Y`$``(F0"`(``(V0%@(``,>`W`$```@```#'000,````B9#H
-M`0``QX#@`0```````,>`[`$```````")@/`!``#'@/0!``#`G00`!<P!``")
-M1"0,B5PD"%OI_/___XUT)@"-O"<`````@^P,BT0D$(M0"(F"3`$``(V"2`$`
-M`,>"2`$``+!M!`#'@E`!````````@\(DB40D!(D4).C\____@\0,PXUV`(/L
-M#(M$)!"+4`B)@DP!``"-@D@!``#'@D@!``"@;P0`QX)0`0```````(/")(E$
-M)`2)%"3H_/___X/$#,.-=@"#[`R+1"00BU`(B8),`0``C8)(`0``QX)(`0``
-M@/8$`,>"4`$```````"#PB2)1"0$B10DZ/S___^#Q`S#C78`@^P,BT0D$(M0
-M"(F"3`$``(V"2`$``,>"2`$``(#G!`#'@E`!````````@\(DB40D!(D4).C\
-M____@\0,PXUV`(/L#(M$)!"+4`B)@DP!``"-@D@!``#'@D@!````JP0`QX)0
-M`0```````(/")(E$)`2)%"3H_/___X/$#,.-=@"#[`R+1"00BU`(B8),`0``
-MC8)(`0``QX)(`0``8.L$`,>"4`$```````"#PB2)1"0$B10DZ/S___^#Q`S#
-MC78`@^P,BT0D$(M0"(F"3`$``(V"2`$``,>"2`$``."N!`#'@E`!````````
-M@\(DB40D!(D4).C\____@\0,PXUV`(/L#(M$)!"+4`B)@DP!``"-@D@!``#'
-M@D@!``#0JP0`QX)0`0```````(/")(E$)`2)%"3H_/___X/$#,.-=@"#[`R+
-M1"00BU`(B8),`0``C8)(`0``QX)(`0``\/D$`,>"4`$```````"#PB2)1"0$
-MB10DZ/S___^#Q`S#C78`@^P,BT0D$(M0"(F"3`$``(V"2`$``,>"2`$``!"?
-M!`#'@E`!````````@\(DB40D!(D4).C\____@\0,PXUV`(/L#(M$)!"+4`B)
-M@DP!``"-@D@!``#'@D@!``#`[00`QX)0`0```````(/")(E$)`2)%"3H_/__
-M_X/$#,.-=@"#[`R+1"00BU`(B8),`0``C8)(`0``QX)(`0``P*\$`,>"4`$`
-M``````"#PB2)1"0$B10DZ/S___^#Q`S#C78`@^P,BT0D$(M0"(F"3`$``(V"
-M2`$``,>"2`$``,"O!`#'@E`!````````@\(DB40D!(D4).C\____@\0,PXUV
-M`(/L#(M$)!"+4`B)@DP!``"-@D@!``#'@D@!```@L@0`QX)0`0```````(/"
-M)(E$)`2)%"3H_/___X/$#,.-=@"#[`R+1"00BU`(B8),`0``C8)(`0``QX)(
-M`0``<,4$`,>"4`$```````"#PB2)1"0$B10DZ/S___^#Q`S#C78`@^P,BT0D
-M$(M0"(F"3`$``(V"2`$``,>"2`$``"#[!`#'@E`!````````@\(DB40D!(D4
-M).C\____@\0,PXUV`(/L#(M$)!"+4`B)@DP!``"-@D@!``#'@D@!``#`Q@0`
-MQX)0`0```````(/")(E$)`2)%"3H_/___X/$#,.-=@"#[`R+1"00BU`(B8),
-M`0``C8)(`0``QX)(`0``T.X$`,>"4`$```````"#PB2)1"0$B10DZ/S___^#
-MQ`S#C78`@^P,BT0D$(M0"(F"3`$``(V"2`$``,>"2`$``.#%!`#'@E`!````
-M````@\(DB40D!(D4).C\____@\0,PXUV`(/L#(M$)!"+4`B)@DP!``"-@D@!
-M``#'@D@!``#@S@0`QX)0`0```````(/")(E$)`2)%"3H_/___X/$#,.-=@"#
-M[`R+1"00C5`4QT`4P`(%`(E`&,=`'`````")5"0$BP"#P"2)!"3H_/___X/$
-M#,.#[`R+1"00C5`8QT`8<,\$`(E`',=`(`````")5"0$BT`$BP"#P"2)!"3H
-M_/___X/$#,.-M@````"-O"<`````4X/L"(M<)!"`>V8!=`X/MD-G@\`!/`*(
-M0V=V1(M#/(E$)`2+`P68````B00DZ/S___^-0Q3'0Q00QP0`B5L8QT,<````
-M`(E$)`2+`X/`)(D$).C\____@\0(6\.-="8`BT,\QD-F`,=`$`````"+0SR-
-M4!3'0!P`````QT`@`````,=`)`````")4!2)4!C'0"@`````B5PD$(/$"%OI
-M_/___XVV`````(V\)P````"#[`R+3"00BT$LBQ"#Z@&%THD0=2N-013'012@
-M:@0`B4D8QT$<`````(E$)`2+`8/`+(D$).C\____@\0,PXGVB4PD$(/$#.G\
-M____C70F`(/L'(M,)"")7"00B70D%(E\)!B+02B+D&0!``"+>@0YQP^$BP``
-M`(7_=`GVAQP"```!=1R)3"0@BUPD$(MT)!2+?"08@\0<Z63___^-="8`BW$L
-M#[9998D,).C\____BT<@P.L$@^,#B40D!(L'P>,$B00DZ/S___\/ME!EB7@H
-MQD!D!(EP+(/BSPG:B%!EQD!F`,=`<)!I!`"+7"00B40D((MT)!2+?"08@\0<
-MZ?S___^+>@CI;?___XVV`````(/L'(ET)!B+="0@B5PD%(M>+(M#"(D$)/]3
-M!(E<)`2+!@6P````B00DZ/S___^+7"04B70D((MT)!B#Q!SI_/___XVT)@``
-M``"-O"<`````5U93@>S`````B[PDT````(V$))0```"+=RB+7EB+5E")1"0$
-MBT9<B00D_U(\C40D'(M3!(E$)`2+0PB)!"3_4AR-A"2T````B00DC8PDN```
-M`(G8C90DO````.B`R?__]H0DG@````)T:8N4)+0````/MH0DH````(!_9@&-
-M!`)T7HE$)`B+A"2\````QP0DT`L``(E$)`3H_/___XET)`3'!"0:````Z/S_
-M__^+1RR)1"0$BP:#P%")!"3H_/___XD\).C\____@<3`````6UY?PXN4)+@`
-M``#KE8UT)@")1"0(BX0DO````,<$)*@+``")1"0$Z/S___^)="0$QP0D&P``
-M`.C\____ZZ"-=@"#[!R+5"0@B5PD%(ET)!B+6BR+0P2+,(D4).C\____QT,8
-M\`,%`(E;'(/&),=#(`````"#PQB)7"0$B30DZ/S___^+7"04BW0D&(/$',.)
-M]H/L+(E<)!R+7"0PB70D((E\)"2);"0HBRN+<RR+A2@!``"+?@B)1"04BT8$
-MB40D&(![9@%T$@^V0V>#P`$\`HA#9P^&OP```(M#/(E$)`2-A9@```")!"3H
-M_/___XD<).C\____BT0D%(7_BU`<#X1]````BX=8`@``B0*#P`%T=HM$)!B-
-M5@R`B$D!```$@(])`0``!("G2`$``/V)MV0!``")L&0!``"+31B-112)1@R-
-M1AB)51C'1AA@EP0`B4X0B78<QT8@`````(D1B40D!(U%)(D$).C\____BUPD
-M'(MT)""+?"0DBVPD*(/$+,/'`O____^+1"04QT`L_____^EZ____BT,\QD-F
-M`,=`$`````"+0SR-4!3'0!P`````QT`@`````,=`)`````")4!2)4!C'0"@`
-M````BW0D((E<)#"+?"0DBUPD'(ML)"B#Q"SI_/___XVT)@````!55U93@^PL
-MBT0D0(MH&(M0'(M%`(E4)!R)!"3H_/___XE$)"B+1"1`#[9-!`^V707'0"S_
-M____#[95!H#Z"P^'W````(!]!PL/A](````/ML&)1"0@#[;"`T0D((/X"WX'
-MN0L````HT8M4)!R(2@0/MDT'#[;3#[;!`="#^`M^![L+````*,N+3"0<BT0D
-M'(/!"(E,)"2`>`0`B%@%#X2N````,?_K$HM,)!R#QP&)^CA1!`^&F````(GZ
-MBTPD*`^V\HGPP>`)`T0D),=$)!0!````QT0D#`$```")1"00BT$XBU$\#[9-
-M!@4``/[_@]+_)0``_O\QVP'($=HQVP'PB40D!(M$)"@1VHE4)`B)!"3H_/__
-M_X7`=(V-M@````"+3"1`B<B#P##'03"0700`B4DTQT$X`````(E$)`2+00B)
-M!"3H_/___X/$+%M>7UW#BT0D'(!X!0!T>C'_ZP^0BT0D'(/'`8GY.$@%=F>+
-M3"0@B?H/MO+'1"04`0```,=$)`P!````C00.P>`)`T0D)(E$)!"+1"0HBT@X
-MBU@\#[9%!X'!`/C__X/3_S'2`<$1TS'2`?$1TXM4)"B)3"0$B5PD"(D4).C\
-M____A<!TD.E+____BU0D0,="+`````#I.____XUT)@"-O"<`````55=64X/L
-M+(M$)$"+>!B+!XD$).C\____BU0D0(E$)"2+0AS'``````#'0BP`````@'\'
-M``^$T0```(G&@\8$B70D*(!_!@`/A(T````Q[>L*@\4!B>@X1P9V?P^V1P>)
-MZC';#[;2BW0D),=$)`P!````B50D((E$)!2)T,'@"0-$)"B)1"00#[=/!(M&
-M.(M6/(DT)(/!"X/3``4``/[_@]+_)0``_O\!P8M$)"`1TS'2`<$1TXE,)`2)
-M7"0(Z/S___^%P'2+BU0D0(M"',<`_____\="+/____^+5"1`B="#P##'0C"0
-M700`B5(TQT(X`````(E$)`2+0@B)!"3H_/___X/$+%M>7UW#C4<,B40D*.DL
-M____B?:-O"<`````5E.#[!2+3"0@BUDL@'EF`8MS''0^@'E*`'4XQT,L____
-M_XD,).C\____C4,PQT,PD%T$`(E;-,=#.`````")1"0$BT,(B00DZ/S___^#
-MQ!1;7L/'0RP`````#[9!2H3`B`9U'(M!3(E&!(M3((72=+&+1@2#P`B)`NNG
-MD(UT)@`/MD%)B48$Z^&-M"8`````@>RL````B;0DH````(NT)+````")G"2<
-M````B;PDI````(FL)*@```"+1A@/ME`"#[8(@/H##X0D`0``@/H$#X0\`0``
-M@'@!!78'@'@%_I!T8@^VP3'2Z'3"__^)PXM&"(M6*,=&*&!S!`")L$P!``")
-MD$@!``"+4P3'@%`!````````B70D!(M#"(D$)/]2?(N<))P```"+M"2@````
-MB[PDI````(NL)*@```"!Q*P```##C5`+B50D%`^V>`LQTHM&%(E$)!@/ML'H
-M`,+__X7`B<-T3(UL)""-M@````"+0P2+D(0```"%TG08BT,(B00D_]*)^CC0
-M#X?T````B?HHPHG7BQN%VW07BU,$B6PD!(M#"(D$)/]2'(!\)#,`=+Z+1B#'
-M``````"-1C#'1BS_____QT8PD%T$`(EV-,=&.`````")1"0$BT8(B00DZ/S_
-M___I-____XVV``````^V0`2-E"28````B80DF`````^VP>A6P?__B</IW?[_
-M_XU0`XE4)!`QT@^V>`,/ML'H.L'__X7`B<-TCXUL)"#K*XGZ*,*)UXL;A=L/
-MA'G___^+4P2);"0$BT,(B00D_U(<@'PD,P`/A5[___^+0P2+D(0```"%TG3.
-MBT,(B00D_]*)^CC0=KJ+1"00B!#I:_[__XM$)!2($(M&((M4)!B)$.E7_O__
-MB?:-O"<`````@^P,BT0D$(M("(E`-,=`.`````"+D4@!``#'0#"0700`B5`H
-M@\`PB40D!(D,).C\____@\0,PXGVC;PG`````%575E.![)P```"+-0````"+
-ME"2P````QT0D&`````"%]HM"&(L`B40D$(M"''1P@\`$,?^)1"04C6PD)(M>
-M"(7;=0OK2H/'`8L;A=MT08M3!(EL)`2+0PB)!"3_4AR`?"0W`'3CBX0DL```
-M`#EP"'74@T0D&`&+5"04BT0D&#E$)!").G8/@\($B50D%.NVBS:%]G6GBY0D
-ML````(M"'(M4)!B)$(N$)+````"+E"2P````QT`PD%T$`(E`-,=`.`````"#
-MP#")1"0$BT((B00DZ/S___^!Q)P```!;7E]=P^L-D)"0D)"0D)"0D)"0D%93
-M@^P4BS5``@``BUPD(#LU1`(``(M+'`^$I0```&O6+(N"8`(``(D!BX)D`@``
-MB4$$BX)H`@``B4$(BX)L`@``B4$,BX)P`@``B4$0BX)T`@``B4$4BX)X`@``
-MB4$8BX)\`@``B4$<BX*``@``B4$@BX*$`@``B4$DBX*(`@``B4$HC48!B<+!
-M^A_!ZAP!T(/@#RG0HT`"``"-0S#'0S"0700`B5LTQT,X`````(E$)`2+0PB)
-M!"3H_/___X/$%%M>P\=#+/_____KSHUT)@"#["PQTHE<)!R+7"0PB70D((E\
-M)"2);"0HBT,8BV@$BW`(BW@,BP#HE+[__X7`B<%T?H7V=&"+0`3'1"00````
-M`(E\)`R+4QB#PA")5"0(B6PD!(M1"(D4)/^0F````(U#,,=#,)!=!`")6S3'
-M0S@`````B40D!(M#"(D$).C\____BUPD'(MT)""+?"0DBVPD*(/$+,.+0`3'
-M1"00`0```(E\)`R+4QSKH8VV`````,=#+/[____KIHVT)@````!6,=)3@>R4
-M````BYPDH````(M#&(L`Z.6]__^+<QR%P(G!=%&+4`2-1"0<B40D!(M!"(D$
-M)/]2'`^W1"0@9HD&#[=$)")FB48"C4,PQT,PD%T$`(E;-,=#.`````")1"0$
-MBT,(B00DZ/S___^!Q)0```!;7L/'0RS^____Z\N)]H/L+(E\)"2+?"0PB70D
-M((EL)"B)7"0<BT<8BQB-<`2+1QR)'"2#ZP&)1"08Z/S___^#^_Z)Q1G`(<4/
-MMD8*A,!U!P^V1@[`Z`0/ML`/MDX-#[96#(E$)`@/MD8.@^`/B40D!(U&?(D$
-M)(GHZ/#$__^+3"08QT<PD%T$`(E_-,='.`````")`8U',(E1!(E$)`2+1PB)
-M!"3H_/___XM<)!R+="0@BWPD)(ML)"B#Q"S#@^PLB70D((MT)#");"0HB5PD
-M'(E\)"2+?AB+1AR+'XUO!(E$)!B)'"2#ZP'H_/___X/[_@^V30&)PAG`(=`/
-MME<$@\=TQT0D"``````/MET"B3PD@^,/B5PD!.A0Q/__BTPD&,=&,)!=!`")
-M=C3'1C@`````B0&-1C")402)1"0$BT8(B00DZ/S___^+7"0<BW0D((M\)"2+
-M;"0H@\0LPU575E.#[`R+1"0@BU0D((M`'(G%B40D"(M"&(/%!(LXA?\/CGX`
-M``"+-0````"%]G1T,=N+5@R-3@PYRG4(ZUZ+$CG*=%B-@MC]__^`>`@!=>Z+
-M@%@"``")1)T`@\,!.=]UW8G8BU0D"(D"BT0D((M4)"#'0#"0700`B4`TQT`X
-M`````(/`,(E$)`2+0@B)!"3H_/___X/$#%M>7UW#BS:%]G60Z[TQP.N[C;8`
-M````55=64X/L'(M$)#"+5"0PBT`<B40D%(/`!(E$)!B+0AB+*(7M#X[(````
-MBST`````A?\/A+H````Q]HM7#(U?##G:=1;IF0```(VT)@````"+$CG:#X2(
-M````C8+8_?__BT@,A<EUZ0^V2`B`^01V8HN(9`$``(7)=`N#>00`=`4Y00AT
-MRXN`6`(``(M,)!B)!+&#Q@$Y[G6WB?"+3"0PBU0D%,=!,)!=!`")`HG(@\`P
-MB4DTQT$X`````(E$)`2+00B)!"3H_/___X/$'%M>7UW#@.D!=;[V0$P"=+B-
-M=@#KHXL_A?\/A4[___^-="8`ZZ<QP.NEC78`C;PG`````%575E.![)P```"+
-MO"2P````BT<8BU`(BW`$BP")5"08BU<<B50D%#'2Z%*Z___'1RS_____A<")
-MPW0]C6PD))"+0P2+D(0```"%TG0.BT,(B00D_](YQGQ-*<:+&X7;=!>+4P2)
-M;"0$BT,(B00D_U(<@'PD-P!TR(U',,=',)!=!`")?S3'1S@`````B40D!(M'
-M"(D$).C\____@<2<````6UY?7<.+5"04BT,$QT0D#`````")="0$B50D$(M4
-M)!B)5"0(BU,(B10D_Y"4````A<!UH\='+`````#KFHGV55=64X'LG````(N\
-M)+````"+1QB+5QR+<`2+`(E4)!@QTNAYN?__QT<L_____X7`B<-T0#'MBT,$
-MBY"$````A=)T$(M#"(D$)/_2.<9\4RG&`<6+&X7;=!N-1"0DBU,$B40D!(M#
-M"(D$)/]2'(!\)#<`=,*-1S#'1S"0700`B7\TQT<X`````(E$)`2+1PB)!"3H
-M_/___X'$G````%M>7UW#BT,$BY"4````A=)TQ8M$)!C'1"00`````,=$)`@`
-M````B70D!(E$)`R+0PB)!"3_TH7`=9V+5"08#[9"`CS_=`4!Z(A"`L='+```
-M``#K@^L-D)"0D)"0D)"0D)"0D%575E.![)P```"+O"2P````BT<8BU<<BW`$
-MBP")5"08,=+H>;C__\='+/____^%P(G#=$`Q[8M#!(N0A````(72=!"+0PB)
-M!"3_TCG&?%,IQ@'%BQN%VW0;C40D)(M3!(E$)`2+0PB)!"3_4AR`?"0W`'3"
-MC4<PQT<PD%T$`(E_-,='.`````")1"0$BT<(B00DZ/S___^!Q)P```!;7E]=
-MPXM#!(N0D````(72=,6+1"08B70D!(E$)`B+0PB)!"3_TH7`=:V+5"08#[9"
-M`CS_=`4!Z(A"`L='+`````#KD^L-D)"0D)"0D)"0D)"0D%575E.![)P```"+
-MO"2P````BT<8BU<<BW`$BP")5"08,=+HB;?__\='+/____^%P(G#=$`Q[8M#
-M!(N0A````(72=!"+0PB)!"3_TCG&?%,IQ@'%BQN%VW0;C40D)(M3!(E$)`2+
-M0PB)!"3_4AR`?"0W`'3"C4<PQT<PD%T$`(E_-,='.`````")1"0$BT<(B00D
-MZ/S___^!Q)P```!;7E]=PXM#!(N0C````(72=,6+1"08B70D!(E$)`B+0PB)
-M!"3_TH7`=:V+5"08#[9"`CS_=`4!Z(A"`L='+`````#KD^L-D)"0D)"0D)"0
-MD)"0D%575E.![)P```"+O"2P````BT<8BU<<BW`$BP")5"08,=+HF;;__\='
-M+/____^%P(G#=$`Q[8M#!(N0A````(72=!"+0PB)!"3_TCG&?%,IQ@'%BQN%
-MVW0;C40D)(M3!(E$)`2+0PB)!"3_4AR`?"0W`'3"C4<PQT<PD%T$`(E_-,='
-M.`````")1"0$BT<(B00DZ/S___^!Q)P```!;7E]=PXM#!(N0B````(72=,6+
-M1"08B70D!(E$)`B+0PB)!"3_TH7`=:V+5"08#[9"`CS_=`4!Z(A"`L='+```
-M``#KD^L-D)"0D)"0D)"0D)"0D%4QTE=64X'LC````(N\)*````"+1QB+`.BS
-MM?__,=*%P(G#=$$Q]HUL)!20C70F`(M#!(N0A````(72=`J+0PB)!"3_T@'&
-MBQN%VW07BU,$B6PD!(M#"(D$)/]2'(!\)"<`=,R)\HM'',=',)!=!`")?S3'
-M1S@`````B1"-1S")1"0$BT<(B00DZ/S___^!Q(P```!;7E]=PXVT)@````!3
-M@^P(BUPD$(M#&(M+'(M0!(L`Z!BW__^%P'0'QT,L_____XU#,,=#,)!=!`")
-M6S3'0S@`````B40D!(M#"(D$).C\____@\0(6\.0C70F`%<QTE93@>R0````
-MB[0DH````(M&&(M>'(L`Z,&T__^%P`^$E````#'2C;0F`````,8$&@"#P@&#
-M^D1U](U,)!B)RL8"`(V\))````"#P@$Y^G7OBU`$B4PD!(M`"(D$)/]2'`^V
-MA"2%````B`,/MH0DA@```(A#`0^VA"2'````B$,"#[:$)(@```"(0P.-1C#'
-M1C"0700`B78TQT8X`````(E$)`2+1@B)!"3H_/___X'$D````%M>7\/'1BS_
-M____Z\J-M@````"-OP````"#[!R)7"04BUPD((ET)!B+<QSHF;7__\=#,)!=
-M!`")6S3'0S@`````B0:-0S")1"0$BT,(B00DZ/S___^+7"04BW0D&(/$',.0
-MC;0F`````%:ZP0,``%.#[!2+="0@BUX8B=CH6+/__X7`=30/MD,@H@````"-
-M1C#'1C"0700`B78TQT8X`````(E$)`2+1@B)!"3H_/___X/$%%M>PXGVNLX#
-M``")V.@4L___A<!U$@^V0R"-!,5P_O__HP````#KL[K?`P``B=CH\K+__X7`
-M=$2Z_`,``(G8Z.*R__^%P'5"BT8(QX!(`0``4(@$`(FP3`$``(V02`$``,>`
-M4`$```````"#P"2)5"0$B00DZ/S____K@@^V0R"B`````.E1____NAD$``")
-MV.B0LO__A<!U#XM&",>`2`$``*"!!`#KK,=&+/_____I)O___Y"#[`R+1"00
-MBU`<QT`PD%T$`(E`-,=`.`````#'`@```0*-4#")5"0$BT`(B00DZ/S___^#
-MQ`S#B?:-O"<`````55=64X/L/(ML)%"+11B+50C&1"0T!X!X(`&->@P9P(/`
-M`HA$)#B+<@PY_G0AC78`C9[8_?__]H,<`@```70&@'L(`70XBS8Y_G7EBU4(
-MQT4L`````(U%,,=%,)!=!`");33'13@`````B40D!(D4).C\____@\0\6UY?
-M7<.-5"04BT-0B50D!(M37(D4)/]0/`^V1"0C.D0D.'2IC40D-(M34(E$)`2+
-M0UR)!"3_4F#KDXVT)@````"-O"<`````@^P<B5PD#(M<)"")?"04B70D$(EL
-M)!B+`XMS+(E$)`B+1AB+*(DL).C\____@'MF`8G'=!(/MD-G@\`!/`*(0V</
-MAHD```"+0SR)1"0$BT0D"`68````B00DZ/S___^)'"3H_/___XM&##TI_P``
-M=%4].?\``'1.A?]T#(L7.U0D"`^$F@```(U&,,=&+/[____'1C"0700`B78T
-MQT8X`````(E$)`2+1@B)!"3H_/___XM<)`R+="00BWPD%(ML)!B#Q!S#BT8<
-MB2CKJXUV`(M#/,9#9@#'0!``````BT,\C5`4QT`<`````,=`(`````#'0"0`
-M````B5`4B5`8QT`H`````(MT)!")7"0@BWPD%(M<)`R+;"08@\0<Z?S___^-
-M@D@!``#'@D@!```0EP0`B;),`0``QX)0`0```````(E$)`2-0B2)!"3H_/__
-M_^E<____C78`C;PG`````(/L#(L0B00D@<(L`0``B50D!.C\____@\0,PY"-
-M="8`@^P,BT0D$(M`&(L`B00DZ/S___^#Q`SKQXVT)@````"#[`R+1"00BT`8
-MBP")!"3H_/___X/$#.NGC;0F`````(/L#(M$)!"+0!B`>`0!BQ!T!(/$#,.)
-M%"3H_/___X/$#.EZ____C78`C;PG`````%575E.#[`R+;"0@BT48BQ!F]\(`
-M_W5%B=>!Y_\```!^.S'VNP0```#K"8VV`````(M%&(L$&(D$).C\____A<!T
-M$(!X"`1V"HN09`$``(72=!*#Q@&#PP0Y_G74@\0,6UY?7</H!____^OGD(UT
-M)@"#[`R+1"00BT`8BP")!"3H_/___X/$#.GD_O__C70F`(/L#(M$)!")="0(
-MB5PD!(M`&(M8!(L`B00DZ/S___^#^PV)QG0O@_L!=!B#^P2)]G01@_L'=`R+
-M7"0$BW0D"(/$#,.)\(M<)`2+="0(@\0,Z8O^__^%P'3>BX!D`0``A<!TU(M0
-M!(72=`V)T.AO_O__BX9D`0``BT`(A<!TN8M<)`2+="0(@\0,Z5+^__^)]H/L
-M#(M$)!")="0(B5PD!(M`&(M8!(L`B00DZ/S___^)'"2)QNC\____B<.)\.@>
-M_O__B=B+="0(BUPD!(/$#.D,_O__C;8`````C;\`````@^P,BT0D$(M`&(L`
-MB00DZ/S___^#Q`SIY/W__XUT)@"#[`R+1"00BT`8BP")!"3H_/___X/$#.G$
-M_?__C70F`%.#[`B+1"00BT`8BP")!"3H_/___X7`B<-T-8N`9`$``(7`="N+
-M4`2%TG0-B=#HC?W__XN#9`$``(M`"(7`=""#Q`A;Z7?]__^-M"8`````B=B#
-MQ`A;Z67]__^0C70F`(/$"%O#C70F`(V\)P````!64X/L!(M$)!"+<!B#Q@2`
-M?@T`=!XQVXM$GGR#PP&)!"3H_/___^@E_?__#[9&#3G8=^2#Q`1;7L.-M"8`
-M````5E.#[`2+1"00BW`8@\8$@'X!`'0>,=N+1)YP@\,!B00DZ/S____HY?S_
-M_P^V1@$YV'?D@\0$6U[#C;0F`````%93@^P$BT0D$(MP&(!^#0!T'C';BT2>
-M?(/#`8D$).C\____Z*C\__\/MD8-.=AWY(/$!%M>PXUV`(V\)P````!64X/L
-M!(M$)!"+<!B`?@$`=!XQVXM$GG"#PP&)!"3H_/___^AH_/__#[9&`3G8=^2#
-MQ`1;7L.-=@"-O"<`````5E.#[`2+1"00BW`8@'X!`'0>,=N+1)YH@\,!B00D
-MZ/S____H*/S__P^V1@$YV'?D@\0$6U[#C78`C;PG`````%93@^P$BT0D$(MP
-M&(L.A<ET&C';BT2>!(/#`8D$).C\____Z.C[__\Y'G?H@\0$6U[#C;0F````
-M`(V\)P````!6NOP#``!3@^P$BW0D$(M&&.C*J___A<!U+HM&"(M8#(/`##G#
-M="&-@]C]___V@!P"```!=`:`>`@!=!*+1@B+&X/`##G8==^#Q`1;7L/H??O_
-M_^OGC70F`(V\)P````!55U93@>R,````BX0DH````(MH"(M0&(MU#(U]#(E4
-M)`@Y_G0?C9[8_?__]H,<`@```70*@'L(`0^$N@```(LV.?YUX8M4)`@/MD(@
-MH@````"+70B%VW1=C70D#.L(B?:+&X7;=$^+4P2)="0$BT,(B00D_U(<]D0D
-M'1!TXXV=S````(E<)`2)+"3H_/___\>%S`````"'DP/'A=0`````````B:W8
-M````B5PD!(DL).C\____BX0DH````(N4)*````#'0"P`````QT`PD%T$`(E`
-M-,=`.`````"#P#")1"0$BT((B00DZ/S___^!Q(P```!;7E]=PXD<).C\____
-MBU0D",:$)(0````(#[9"((B$)(@```"-A"2$````BU-0B40D!(M#7(D$)/]2
-M8.D+____C;8`````C;PG`````(/L'(E<)`R)="00B<:);"08B=6)?"04BT`@
-MB40D!(L&B00DZ/S___^%P(G##X3E`0``QD!D`X%]#$+_``")<"@/E,`/MOB%
-M_P^%E````(M5&#'`@'H*]`^4P(7`#X64````A?\/A!8!```/MD(2/`$/A(\!
-M```\`@^$:0$```^V0@^(0U,/MT((9HE#3`^W0@IFB4-.#[="#&:)0U`/MD(.
-MB$-2#[="!&:)0T@/MT(&9HE#2@^W0A!FB4-4B6LLQT-P@.@$`(D<).C\____
-MBUPD#(MT)!"+?"04BVPD&(/$',.+51@QP(!Z#_0/E,"%P`^$;/___XL&@\!0
-MB00DZ/S___^%P(G&#X0Y`0``A?\/A;L```"+11B#P!#'1"0(``(``(E$)`2)
-M-"3H_/___XU%,(!+902)<UC&0U/T9L=#5`$`B7,LQT-P\&H$`,=%+`````#'
-M13"0700`B6TTQT4X`````(E$)`2+10B)!"3H_/___^E-____C;0F``````^V
-M0@P\`71N/`)T3P^V0@J(0U,/MD(&9HE#3`^V0@=FB4-.#[9""&:)0U`/MD()
-MB$-2#[9"!&:)0T@/MD(%9HE#2@^V0@MFB4-4Z>W^__^0BT48@\`4Z4#___^`
-M2V4$C4(0B4-8ZZ6`2V4$C4(4B4-8Z8C^__^`2V4"BT4<@\`0B4-8ZX>`2V4"
-MBT4<@\`4B4-8Z6?^__^-13#'12S]____QT4PD%T$`(EM-,=%.`````")1"0$
-MBT4(B00DZ/S____IB/[__XU%,,=%+/_____'13"0700`B6TTQT4X`````(E$
-M)`2+10B)!"3H_/___XD<).C\____Z5'^__^-=@!3@^P(BUPD$(M#&(L`B00D
-MZ/S___^)VH/$"%OI8/W__U.#[`B+7"00BT,8BP")!"3H_/___XG:@\0(6^E`
-M_?__@^P<B6PD&(ML)"")7"0,B70D$(E\)!2+?1B+!XD$).C\____B<:+0"")
-M1"0$BP:)!"3H_/___X7`B<,/A(L```"):"R)<"C&0&0"#[9'!#P!=&T\`G1O
-M#[9'!XU+4(U7"(E4)`2)#"2)1"0(Z/S___\/MD<'B$-(BT<8B4-,#[9%%(/H
-M"(3`B$-)=`F+11R#P`B)0V#'0VR`6@0`QT-PP'`$`(MT)!")7"0@BWPD%(M<
-M)`R+;"08@\0<Z?S___^0@$ME`NN1@$ME!.N+C44PQT4L_?___\=%,)!=!`")
-M;33'13@`````B40D!(M%"(D$).C\____BUPD#(MT)!"+?"04BVPD&(/$',.-
-MM@````!64X/L9(M<)'"-3"0@BT,8BW,<BU`$BP#HHZC__X7`=##'0RS_____
-MC4,PQT,PD%T$`(E;-,=#.`````")1"0$BT,(B00DZ/S___^#Q&1;7L.+1"0@
-MB0:+1"0DB48$BT0D*(E&"(M$)"R)1@SKNHGV5U93@^P0BWPD((`]``````&+
-M7QB+=QS'1RP`````#X8<`0``NLX#``")V.C0I?__A<`/A(D```"ZWP,``(G8
-MZ+RE__^%P`^%UP```(L#B0:+0P2)1@2+0PB)1@B+0PR)1@R+0Q")1A"+0Q2)
-M1A2+0QB)1AB+0QS&1D0`QD9!`,9&0`*)1AP/MD-%B$9%#[8%`````(A&((U'
-M,,=',)!=!`")?S3'1S@`````B40D!(M'"(D$).C\____@\006UY?PXL#B0:+
-M0P2)1@2+0PB)1@B+0PR)1@R+0Q")1A"+0Q2)1A2+0QB)1AB+0QS&1D0`QD9!
-M`,9&0`&)1AP/MD-%B$9%BQ4`````@<*0`0``B=#!^!_!Z!T!T,'X`XA&(.ET
-M____NOP#``")V.C1I/__A<!T<<='+/_____I6/___Y"ZP0,``(G8Z+2D__^%
-MP`^%T/[__XL#B0:+0P2)1@2+0PB)1@B+0PR)1@R+0Q")1A"+0Q2)1A2+0QB)
-M1AB+0QS&1D0`QD9!`,9&0`*)1AP/MD-%B$9%#[8%`````(A&(.GS_O__BP.)
-M!HM#!(E&!(M#"(E&"(M##(E&#(M#$(E&$(M#%(E&%(M#&(E&&(M#',9&1`#&
-M1D$`QD9``8E&'`^V0T6(1D4/M@4`````B$8@Z:/^__^-M@````"-OP````!5
-M5XG'5E.![%P"``")5"0DB$PD(P^V0@_&1"0P`83`>`^`?P@&QD0D,``/A!@#
-M``"-1"10Q@``C90D4`(``(/``3G0=>^+7"0D#[:72`$```^V0PN(1S0/MD,.
-MB$<Q#[9+#K@!````T^!FB4<RB="#R`2(AT@!``#V0P\##X0G`@``B="#R`6(
-MAT@!``"+1P3'ATP!````````QX=0`0```````(!X!P`/A3@"``"+7"0DC8]4
-M`0``BU0D)`^V=S"+0Q"#PA"%]HF'5`$``(M"!(E!!(M""(E!"(M"#(E!#,=$
-M)"C_____QT0D+/____]^5#'MZPL/MG<P@\4!.>Y^18M<KTB+4Q@Y5"0LB7L,
-MBT,4<A!W!CE$)"AV"(E$)"B)5"0L@'L(!'7,@'PD(P"+<R1U<H!\)#``=78/
-MMG<P@\4!.>Y_NX!_"`</A,P!``"+;P2`?04`#X5E`0``#[9%!HM,)"R+7"0H
-M*<:)\HGPP?H?#Z_:#Z_.]V0D*`'9C101B4<4B5<8BU0D)`^V0@^#X!S!^`*(
-MAQT"``"!Q%P"``!;7E]=PX!\)#``#X22````C50D4,=$)!0!````B50D$,=$
-M)`P!````BT,PBU`(BT`$B30DB50D"(E$)`3H_/___X7`#X4,____@+PD3@(`
-M`*H/A'@!```QP(!\)%!2#X11`0``A<`/A.G^__^-1"10QT0D%`````")1"00
-MQT0D#`$```"+0S"+4`B+0`2)-"2)5"0(B40D!.C\____Z;/^___'1"1(````
-M`,=$)$P`````C40D4,=$)!0`````B40D$,=$)`P!````BT,PBU`(BT`$`T0D
-M2!-4)$R)-"2)1"0$B50D".C\____@T0D2`&+1"1(@U0D3`"#\`(+1"1,#X1/
-M_O__ZZK'ATP!``#_____QX=0`0``_____^GL_?__#[=/,HM$)"B+5"0L]]F)
-MRR'(P?L?(=J)1"0HB50D+.EW_O__@\H'@'\("HB72`$```^%M?W__P^V3S`Q
-MP#'2@^D!]L$@#Y3`#Y7"T^+3X(E'.(E7/.F2_?__@'\P``^$8?[__S')BT2/
-M2(M0&(M`%`%'%`^V1S`15QB#P0$YR'_EZ3_^___1Z(/@`8A$)##IVOS__X!\
-M)%%%#X6D_O__QD0D4$7&1"114NF=_O__@+PD3P(``%4/A7K^__^P`<:$)$X"
-M``!5QH0D3P(``*KI9?[__XUT)@"-O"<`````53'25U93@>R,````B[PDH```
-M`(M'&(MW'(L`Z)"@__^%P(G##X1O`0``,<"-="8`Q@0P`(/``8/X6'7TC6PD
-M%(GHQ@``C90DC````(/``3G0=>^+4P2);"0$BT,(B00D_U(<#[9$)"J-5@2(
-M1@,/MD0D*(@&#[9$)"F(1@&+1"10B48$BT0D5(E"!(M$)%B)0@B+1"1<B4(,
-MBT0D8(E"$(M$)&2)0A2+1"1HB4(8BT0D;(E"'(M$)'")0B"+1"0LC58HB48H
-MBT0D,(E"!(M$)#2)0@B+1"0XB4(,BT0D/(E"$(M$)$")0A2+1"1$B4(8BT0D
-M2(E"'(M$)$R)0B`/MD0D%(A&4`^V1"05B$91#[9$)!:(1E(/MD0D%XA&4XM#
-M#(E&3(![1`!U:0^V1"0KB$8"BQN%VW46ZRN-M@`````/MD0D*P!&`HL;A=MT
-M%XM3!(EL)`2+0PB)!"3_4AR`?"0G`'3;C4<PQT<PD%T$`(E_-,='.`````")
-M1"0$BT<(B00DZ/S___^!Q(P```!;7E]=PX!.`P3KD<='+/_____KPXVT)@``
-M``"-O"<`````53'25U93@>R,````B[PDH````(M'&(MW'(L`Z.">__^%P(G#
-M#X0Y`0``,<"-="8`Q@0P`(/``8/X3'7TC6PD%(GHQ@``C90DC````(/``3G0
-M=>^+4P2);"0$BT,(B00D_U(<#[9$)"J-5@2(1@,/MD0D*(@&#[9$)"F(1@&+
-M1"10B48$BT0D5(E"!(M$)%B)0@B+1"1<B4(,BT0D8(E"$(M$)&2)0A2+1"1H
-MB4(8BT0D;(E"'(M$)'")0B"+1"0LC58HB48HBT0D,(E"!(M$)#2)0@B+1"0X
-MB4(,BT0D/(E"$(M$)$")0A2+1"1$B4(8BT0D2(E"'(M$)$R)0B`/MD0D*XA&
-M`HL;A=MU$NLGB?8/MD0D*P!&`HL;A=MT%XM3!(EL)`2+0PB)!"3_4AR`?"0G
-M`'3;C4<PQT<PD%T$`(E_-,='.`````")1"0$BT<(B00DZ/S___^!Q(P```!;
-M7E]=P\='+/_____KR8UT)@"#[!R)="04B<:)7"00B7PD&(M8!(M0"(M#'(L[
-MB4(<@*-)`0``\\=#'/____^+0AR`HDD!``#SB40D!(M'!(D$).C\____BT,@
-MB3PDB40D!.C\____B5@HB7`LQD!D!,=`<`!L!`")!"3H_/___XM<)!"+="04
-MBWPD&(/$',.)]E.#[`B+7"00BT,8BP")!"3H_/___XD$).C\____C4,PQT,P
-MD%T$`(E;-,=#.`````")1"0$BT,(B00DZ/S___^#Q`A;PXUT)@"-O"<`````
-M4X/L"(M$)!"+0`2+&(D$).C\____BX,H`0``C5`PQT`PD%T$`(E`-,=`.```
-M``")5"0$BT`(B00DZ/S___^#Q`A;PXVV`````(V\)P````"#[!R+5"0@B5PD
-M$(ET)!2)?"08@WHL_8MZ)`^$\P```/:'20$```C&AQ<"````='2+0BR#^/T/
-MA+8"``"%P`^%MP(``(N'9`$``#'),?:+4%P/MUAD@>+__P\`.?$/@U,!``#'
-MA\0!``#@8@0`B;_(`0``QX?``0```````(V'P`$``(E$)`2+!XM`!(D$).C\
-M____BUPD$(MT)!2+?"08@\0<PP^VMT@!``#WQA`````/A(D```"+0BR#^/T/
-MA-@!``"%P`^%W0$``(M/!`^V1S"+GU`!```/MDD&*<B+CTP!``")PL'Z'P^O
-MV`^ORO>G3`$```'9C101.U<8#X+=`0``#X8I`@``N@,```#I<@$```^VAQ<"
-M```\`@^/_O[__X/``8B'%P(``,>'Q`$``(";!`")O\@!``#I/?____?&(```
-M``^%M````/?&0`````^$//____?&`0```(GV#X0G`@``BUHLA=L/A?P!``"+
-M3P0/MD<PBY]0`0``#[9)!BG(BX],`0``B<+!^A\/K]@/K\KWITP!```!V8T4
-M$3M7&'(A=P4[1Q1R&KH)````Z<\```!W#CG:C;8`````#X*=_O__]H=(`0``
-M4(UV``^$5?___XN'3`$``#'2)?__/P"#^@`/AS____^#^'\/AS;____I:?[_
-M_XVV`````(M2++@+````A=)U4(GRL`J$TGA(BT\$#[9',(N?4`$```^V208I
-MR(N/3`$``(G"P?H?#Z_8#Z_*]Z=,`0```=F-%!$[5Q@/@F$!``!W"3M'%`^"
-M5@$``+@,````@^9?B?*(ET@!``")?"0$B00DZ/S____VAT@!```(#X04_O__
-MN@$```")^(M<)!"+="04BWPD&(/$'.G5PO__@#T```````^%E````(/F[XGP
-MB(=(`0``B7PD!,<$)`@```#H_/___^G,_?__QT(L`````(E\)`3'!"0<````
-MZ/S___^0]H=)`0``"`^$V?[__^E2_?__@#T``````'7-BX=D`0``@*=)`0``
-M]XM`"("@20$``/>)?"0$QP0D%````.C\____BUPD$(MT)!2+?"08@\0<PSM'
-M%'*IZ<W]___'0BP`````B7PD!,<$)!P```#H_/___P^WAQ0"```QT@&'3`$`
-M`!&74`$``.E>_?__@^:_B?"(AT@!``")?"0$QP0D#P```.C\____Z0?]__^#
-MYK^)\HB72`$``(E\)`3'!"0.````Z/S____IY_S__XN'Z`$``(`X``^$"O[_
-M_X/FWXGPB(=(`0``Z;3^__^-="8`@^P4B70D"(MT)!R);"00BVPD&(E<)`2)
-M?"0,C88(`@``B8;D`0``C886`@``B8;H`0``BX98`@``]H9)`0``"(FNU`$`
-M`,>&X`$```````#'ANP!````````B;;P`0``QX;T`0``L)<$`(F&"`(``'16
-MQX;8`0``*O\``,>&W`$```0```"+AKP!```QTH/``8/X90^=PH/J`2'0B8:\
-M`0``C8;,`0``BUPD!(EL)!B+="0(B40D'(M\)`R+;"00@\04Z?S___\/MKY(
-M`0``]\=P````#X3-````B?B#X*`\H`^$Z````(M6!`^V1C")%"0/MDH&BYY0
-M`0``*<B+CDP!``")PL'Z'P^OV`^ORO>F3`$```'9C101.U88#X.=````]\<0
-M````N"/_``!U$(/G((GX/`$9P/?0!27_``"+EE`!``"+CN0!``")AM@!``"+
-MADP!``")40B+%"2)002`>@4`#X21````BY;D`0``#[=&,F:)0@SVAD@!```@
-MQX;<`0``#@````^$]O[__XN&Z`$``,8``,>&X`$```$```#IWO[__XM<)`2+
-M="0(BWPD#(ML)!"#Q!3#C70F`'<..T84#X)8____D(UT)@"-ALP!``#'AO@!
-M````````BUPD!(E$)!B+="0(BWPD#(ML)!"#Q!3I-/K__XM&%(M6&"N&3`$`
-M`!N64`$``(N.Y`$``(/Z`'8.N(````!FB4$,Z5+___\]@````';PB?;KYXVT
-M)@````"-O"<`````@^P,BT0D$(M`)(V0P`$``,>`Q`$``(";!`")@,@!``")
-M5"0$BP"+0`2)!"3H_/___X/$#,.-="8`C;PG`````(/L'(ET)!B+="0@B5PD
-M%(M>#(7;#X3N````#[:#20$``*@$='NH"'5GBY-D`0``A=)T78M"!(7`=%:+
-M2@B%R71/@(A)`0``"(M""("(20$```B-@\`!``#'@\0!``"`FP0`B9O(`0``
-MB40D!(L#BT`$B00DZ/S___^)7"0$QP0D$@```.C\____C;0F`````(M<)!2+
-M="08@\0<PXUT)@`/MI9(`0``]L(0=>2%VW0$J`AUW/;"8'77@^+W@\H0C8;`
-M`0``B)9(`0``QX;$`0``@)L$`(FVR`$``(E$)`2+!HM`!(D$).C\____B70D
-M!,<$)`0```#H_/___XM<)!2+="08@\0<PXGSZ0O___^055=64X/L#(ML)""+
-M11B+6`2+`(D$).C\____@_L.B<9V,L=%+/[___^-13#'13"0700`B6TTQT4X
-M`````(E$)`2+10B)!"3H_/___X/$#%M>7UW#_R2=C!@``)"-="8`B<:+1@R%
-MP'7W@'X(!8UV``^$"08``("F2`$``+^)="0$QP0D#@```.C\____BUX<A=L/
-MB&T&``"+3@RZ`0```.D$!```BT`,A<!T#?:`20$```P/A6G___]F]X9(`0``
-M<`P/A5K____VAAP"```!#X1-____@'X(!0^%.P8``(!^,``/A)`&```Q_Y"-
-M="8`ZP\/MD8P@\<!.?@/CG@&``"+7+Y(A=MTZ8!["`1VX_:#2`$``!!UVHM3
-M1(M#0(E4)`2)!"3H_/___XM3!`^V4@8YT`^-Z?[__P^V@T@!``#'@\0!``"`
-MFP0`B9O(`0``@^#W@\@0B(-(`0``C8/``0``B40D!(L#BT`$B00DZ/S___^)
-M7"0$QP0D!````.C\____Z6K___^`>`@%#X2=!```@*!(`0``YXE$)`3'!"0%
-M````Z/S___^+3@RZ`0```.GS`@``]H!(`0``$`^$7_[___:`'`(```$/A%+^
-M__^`H$@!``#EBU9$BT!`QX9,`0``_____\>&4`$``/____^)5CR)1CB)="0$
-MQP0D!@```.C\____BTX,@*9(`0``_H7)=$V`>3``=$<QVXM$F4B%P'0O]H`<
-M`@```70F@'@(!'8@#[:02`$```^V@4@!``"#X@&#X/X)T*@!B(%(`0``=0L/
-MMD$P@\,!.=A_OHM.#(M&0`M&1(/X`1G2@\("Z30"``"+0`R%P'0-]H!)`0``
-M#`^%F?W__V;WAD@!``!P#`^%BOW___:&'`(```$/A'W]__^`?@@%#X7R!```
-M@'XP``^$</W__\=$)`@`````ZQ.#1"0(`0^V1C`[1"0(#XY3_?__BT0D"(M\
-MADB%_W3A@'\(!';;]H=(`0``('72BTXXBUX\BT9`BU9$"<@)VHE4)`2)!"3H
-M_/___XM6!`^V4@8YT`^-!OW__XV'P`$``("/2`$``"#'ATP!````````QX=0
-M`0```````,>'Q`$``(";!`")O\@!``")1"0$BP>+0`2)!"3H_/___XE\)`3'
-M!"0)````Z/S____I4/___X"@2`$``-^)1"0$QP0D"@```.C\____Z9K\__^`
-MH$@!``#?Z8[\___V@!P"```!#X1Z_/__BT!`"T9$#X5N_/__#[>&2`$``&8E
-M<0QF@^@!#X59_/__@'X(!0^%4`0``(!^,`!T+3'_BUR^2(7;=!B`>P@$=A(/
-MMH-(`0``@^!!+`$/A'\$```/MD8P@\<!.?A_U8"F2`$``/?I%_S__X"@2`$`
-M`+3'@$P!``#_____QX!0`0``_____\=`.`````#'0#P`````B40D!,<$)!``
-M``#H_/___XM>#(7;#X1[`@``#[9+,(7)#XYQ`@``,=(Q]HM$DTB%P'0B]H`<
-M`@```709@'@(!'83]H!(`0```70*O@$```"0C70F`(/"`3G*=<^%]@^$-`(`
-M`(M+#(G>N@$```"#^@,/E<"$P`^$,P$``(7)#X0K`0``B<Z+20SI&0$``("@
-M2`$``-^)1"0$QP0D"P```.C\____Z43[__]F]X9(`0``<`B+@&0!```/A2C[
-M__^%P`^$(/O__X!X9P`/A1;[__^+4`2+0`CV@AP"```!#X0#^___]H`<`@``
-M`0^$]OK__X"B20$``.^`H$D!``#O@(I)`0``"("(20$```B-AL`!``#'AL0!
-M``"`FP0`B;;(`0``B40D!(L&BT`$B00DZ/S___^)="0$QP0D$@```.C\____
-MZ:7Z__^+B&0!```/MX!(`0``9B5P"&8]``@/A8/Z__^%R0^$>_K__XM!!(M1
-M"("@20$``/>`HDD!``#WB70D!,<$)!,```#H_/___XM.#+H!````Z='^__^+
-M2`RZ`P```#'`A,`/A<W^__^`CD@!```$@_H"#X3M````BX9D`0``A<`/A.T`
-M``"+4`2+6`B%TG0(B10DZ/S___^%VP^$!_K__XD<).C\____Z?KY__\QVX!X
-M,`!U&.E<^O__C70F``^V1C"#PP$YV`^.2?K__XM$GDB%P'3I@'@(!';C]H!(
-M`0``$'3:@*!(`0``YXE$)`3'!"0%````Z/S____KP8!^,``/A`3Z__\QVY"-
-M="8`ZP\/MD8P@\,!.=@/CNSY__^+1)Y(A<!TZ8!X"`1VX_:`2`$``$!TVH"@
-M2`$``+^)1"0$QP0D#@```.C\____Z\&)\X"C2`$``/Z)'"3H_/___^FX_?__
-MB30DZ/S___^0Z33Y__^)-"3H_/___XUV`.DD^?__B30DZ/S___^+3@RZ`0``
-M`.F/_?__BU9$BT9`B50D!(D$).C\____BU8$#[92!CG0#XWG^/__C8;``0``
-M@(Y(`0``$,>&Q`$``(";!`")ML@!``")1"0$BP:+0`2)!"3H_/___XET)`3'
-M!"0$````Z/S___^+1D"`ID@!``#W"T9$#X0,^?__Z/S___^+3@RZ`0```(E&
-M*.D(_?__BTXXBUX\BT9`BU9$"<@)VHE4)`2)!"3H_/___XM6!`^V4@8YT`^-
-M5OC__XV&P`$``(".2`$``"#'ADP!````````QX90`0```````,>&Q`$``(";
-M!`")ML@!``")1"0$BP:+0`2)!"3H_/___XET)`3'!"0)````Z/S____I!OC_
-M_XV&P`$``(".2`$``$#'ADP!````````QX90`0```````,>&Q`$``(";!`")
-MML@!``")1"0$BP:+0`2)!"3H_/___XET)`3'!"0-````Z/S____IC/O__P^V
-M@T@!``#'@TP!````````QX-0`0```````,>#Q`$``(";!`"#R$"#X/>(@T@!
-M``"-@\`!``")F\@!``")1"0$BP.+0`2)!"3H_/___XE<)`3'!"0-````Z/S_
-M___I'OO__XUV`%575E.#[!R)1"00]H`<`@```74D#[:`20$``(/@!#P!&?^!
-MYP#X__^!QP$(``"#Q!R)^%M>7UW#BTPD$`^VL4@!``#WQ@(````/A%4!``"+
-M1"00BTA`BUA$OP(```#WQ@$```!T!H'/`!```/?&$````'0#@\\$]\8@````
-M=`:!SP`!``"#YD!T!H'/``(``(G:"<H/A3L"``"+;"00#[:%'`(``*@$=`.#
-MSQ"H`G0#@\]`BT0D$/:`2`$```AT!H'/@````(M4)!`/MH))`0``J`1T!H'/
-M``@``*@(=`:!SP`$``"+3"00#[9),(7)B4PD&`^.T@```#'MZVV+<42+64")
-M\HG8]](C43SWT"-!.(G1"<%T`X//`O9$)!<!=`:!SP`0``#V1"07$'0#@\\$
-M]D0D%R!T!H'/``$``/9$)!=`=`:!SP`"``")\`G8=`.#SPCV1"07"'0&@<^`
-M````@\4!.6PD&'1ABT0D$(M,J$B%R73K]H$<`@```73B@'D(!';<#[:12`$`
-M`(A4)!>#X@(/A&3___^+64"+<43I<____XG/BTE`BU]$B<B)VO?0]](C5SPC
-M1S@Q_XG5"<4/A)C^___ICO[___?'`@```'06]\<`$```C;0F``````^$V@``
-M`(/G_8MT)!B%]@^.#0$``(M4)!"+6DB%VP^$*O[__S'M]H,<`@```0^$&_[_
-M_X!["`0/AI,````/MG,PA?9^6XM#2(7`#X3^_?__]H`<`@```0^$\?W__XM0
-M,(M"!`M""`^%XOW__S')ZRB+1(M(A<`/A-+]___V@!P"```!#X3%_?__BU`P
-MBT($"T((#X6V_?__@\$!.<YUT9"#Q0$Y;"08='F+3"00BURI2(7;#X25_?__
-M]H,<`@```0^$B/W__X!["`0/AVW___^+4S"+0@0+0@ATQ>EN_?__B?@E""``
-M`(/X"`^%&?___^D1____B0PD@\\(B5PD!.C\____BTPD$(M1!`^V4@8YT`^-
-MH_W__X'/`"```.F8_?__@<\```!`Z2']__^-=@!55U93@^P,BWPD((M'&(M?
-M"(LHB2PDZ/S___^+<PR#PPPYWHE$)`AU#>M/D(UT)@"+-CG>=$2-AMC]__^+
-M4`R%TG7MA>UU"?:`'`(```)U#SE$)`AT6?:`'`(```)TT8"@'`(``/V`>`@!
-M=#F)!"3H_/___XLV.=YUO(U',,=',)!=!`")?S3'1S@`````B40D!(M'"(D$
-M).C\____@\0,6UY?7<.)!"3H_/___^N!]H`<`@```@^%=/___X"('`(```+K
-MH8UT)@"-O"<`````@^Q,B7PD1(M\)%")7"0\B70D0(EL)$B+7QB+`X7`=4:+
-M1PCH>)?__\='+/S___^-1S#'1S"0700`B7\TQT<X`````(E$)`2+1PB)!"3H
-M_/___XM<)#R+="1`BWPD1(ML)$B#Q$S#B00DC6L$Z/S___^)QHM#!*@!=6>H
-M`@^%K@```*@$#X7^````J`B-="8`#X5*`0``J!`/A=8!``"H0`^%CP$``*@@
-M#X4B`@``]D9,$`^$=____XU$)!2+5E")1"0$BT9<B00D_U(\#[9$)"*(1DJ)
-M-"3H_/___^E.____QD0D-``/MD4$B$0D.(U$)#2+5E")1"0$BT9<B00D_U)@
-MA<")1RQU&0^V1DR)PH/(D(/*@(A63`^V502(1DR(5DN+0P2H`@^$5?___XUV
-M`,9$)#0$#[9%!<9$)#D`B$0D.(U$)#2+5E")1"0$BT9<B00D_U)@A<")1RQU
-M(`^V5DV#RA"(5DV`?04`#Y7`@^+?@$Y,$,'@!0G"B%9-BT4`J`0/A`+____&
-M1"0T!0^V10;&1"0Y`(A$)#B-1"0TBU90B40D!(M&7(D$)/]28(7`B4<L=2`/
-MME9-@\I`B%9-@'T&``^5P(/B?X!.3!#!X`<)PHA638M%`*@(#X2V_O__QD0D
-M-`,/MD4'B$0D.(U$)#2+5E")1"0$BT9<B00D_U)@A<")1RQU(`^V5DV#R@2(
-M5DV`?0<`#Y7`@^+W@$Y,$,'@`PG"B%9-BT4`J!`/A&O^___K/P^V10K'!"0`
-M#```B40D!.C\____QT<L``````^V1DZ`?0H`#Y7"@^#^"="`3DP0B$9.BT4`
-MJ"`/A#S^___K7,9$)#0"#[9%"(A$)#B-1"0TBU90B40D!(M&7(D$)/]28(7`
-MB4<L=1\/ME9-@\H!B%9-@'T(``^5P(/B_8!.3!`!P`G"B%9-BT4`J$`/A.#]
-M___I:O___Y"-="8`QD0D-`</MD4)B$0D.(U$)#2+5E")1"0$BT9<B00D_U)@
-MB4<L]D9,$`^$,?W__^FU_?__C;8`````C;PG`````(/L+(ET)""+="0PB5PD
-M'(E\)"2);"0HBUX8BP.%P'5&BT8(Z&B4___'1BS\____C48PQT8PD%T$`(EV
-M-,=&.`````")1"0$BT8(B00DZ/S___^+7"0<BW0D((M\)"2+;"0H@\0LPXD$
-M)(UK!.C\____]D,$`8G'=1?V1TP0=+")/"3H_/___^NFC;0F`````,9$)!0`
-M#[9%!(A$)!B-1"04BU=0B40D!(M'7(D$)/]28(7`B48L=<$/MD=,B<*#R)"#
-MRH"(5TP/ME4$B$=,B%=+ZZ:-M@````"-O"<`````@^P<B5PD#(M<)"")="00
-MB7PD%(EL)!B]`0```(M#&(L`B00DZ/S___^!>PP,_P``B<8/E,`/MDY,B<>)
-MR,#H`B'%B?@/MM`YU70:C02]`````(/A^PG!@\D0B$Y,B30DZ/S___^-0S#'
-M0S"0700`B5LTQT,X`````(E$)`2+0PB)!"3H_/___XM<)`R+="00BWPD%(ML
-M)!B#Q!S#C70F`%57B<=64X'L+`(``(E,)"2(5"0K@'@P``^$B0```(G(,>V#
-MZ`&)1"0@ZU*0C70F`(-\)"`!#X:%````@'LT`(MS)'4'@'PD*P!T#?:&'`(`
-M``$/A8,```")'"3H_/____9&3!!T#?:&'`(```$/A?(```"#Q0&)Z#A','8J
-MBURO2(7;=.X/MD,(/`1VHP^V5"0KB=B#Q0&+3"0DZ&#___^)Z#A','?6B3PD
-MZ/S___^!Q"P"``!;7E]=PXVV`````#P$B=X/A,D```"#?"0D`G6BB30DZ/S_
-M___KF(U$)"S'1"04`0```(E$)!#'1"0,`0```(M#,(M0"(M`!(DT)(E4)`B)
-M1"0$Z/S___^%P`^%1/___X"\)"H"``!5=%<QP(!\)"Q%='R%P`^$*?___XU$
-M)"S'1"04`````(E$)!#'1"0,`0```(M#,(M0"(M`!(DT)(E4)`B)1"0$Z/S_
-M___I\_[__XDT).C\____C78`Z?[^__^`O"0K`@``JG6?L`'&A"0J`@``JL:$
-M)"L"``!5ZXV+<R2)'"3H_/___^DG____@'PD+5(/A7G____&1"0L4L9$)"U%
-MZ7+___^-=@"#[!R)7"0,BUPD((ET)!")?"04B6PD&(M#&(M3"(MH!(L`B50D
-M"(D$).C\____B[!D`0``A?8/A(0```"+5@2%TG1=BXH@`@``A<ET1XM#',<`
-M_____\=#+/____^-0S#'0S"0700`B5LTQT,X`````(E$)`2+0PB)!"3H_/__
-M_XM<)`R+="00BWPD%(ML)!B#Q!S#BY)4`@``A=)UKXGVBU8(A=)T&8NZ(`(`
-M`(7_=9R+BE0"``"%R762D(UT)@#V@$@!``!P=80/MG@PA?]^)#')BU2(2(72
-M=!.`>@@$=@WV@D@!``!P#X5?____@\$!.?EUWH/E`P^4P87VB<]T4(M&!(7`
-M=`H/MM$QR>@N_?__BT8(A<!T#(GY#[;1,<GH&_W__XM&$(M6#(E"!(D0BT0D
-M"(ET)`2#Z(")!"3H_/___XM#',<``````.D,____#[;1,<GHY?S__^OFC78`
-M55=6B<Y3@>RL````B50D'(E$)"#H_/___XM6>(E4)#2)1"0LBT9TB40D,`^V
-M1@Z)PL#J!(32B%0D/W4,#[9."H3)B$PD/W1C#[96#8/@#XA&#H#Z0'<+@/H!
-M=Q:`?@P'=!"X_____X'$K````%M>7UW#A-)T/#';ZQV-M@````#V@!P"```!
-M=-D/ME8-@\,!#[;".=A^&XM$GGR)!"3H_/___X!X"`%TU^NWQD0D/P'KEH!^
-M#`AWJ@^V1@R-="8`_R2%R!@``,9$)#X,QD0D0`#'A"2,````#````(N$)(P`
-M``")!"3H_/___X7`B40D5`^$:____X!\)#\!QT0D6`````!V,`^V1@TQT@^V
-M3"0_9O?Q9H72#X5%____#[9$)$")!"3H_/___X7`B40D6`^$+/___XM4)#0+
-M5"0P#X68`P``@'PD/@</A"8$``#'1"0P_____S';QT0D-/____^`?@T`#X3>
-M!P``BT2>?(D$).C\____BU`L.50D-(M`*'(0=P8Y1"0P=@B)1"0PB50D-`^V
-M1@V#PP$YV'_-BU0D5`^V6@6$VW4:BT0D6(7`#X2U````BU0D6(!Z!0`/A*<`
-M```/MD8.NO____^)P8M$)##3XHG3P?L?(="+5"0TB40D,(E&="':BUPD5(E4
-M)#2)5GB`>P4`=#4/MD8-]G0D/XM,)#0/MM`/MD,&*<*+1"0PB=7!_1\/K\H/
-MK\4!P8M$)##WXHTL$8E&=(EN>(M$)%B%P'0TBU0D6(!Z!0!T*@^V2@8/MD0D
-M/XM>="G(BTYXB<+!^A\/K]H/K\CW9G0!V8T4$8E&=(E6>(M$)!R%P`^$@```
-M`(M,)!R`>0@$#X;=_?__BQF+1"0@B5PD)#G##X7+_?__]H$<`@```0^$OOW_
-M_XN!9`$``(7`#X6P_?__9O>!2`$``%`"#X6A_?__BU$8.U9XBT$4#X>2_?__
-M<@D[1G0/AX?]__^`9@_\BUPD'(!["`</A,T!``"`?@P'#X3;`0``,?^+A"2,
-M````BU0D((E$)`2)%"3H_/___X7`B40D7`^$1OW__X!\)#X'#X0/!0``#[96
-M#<>$))0`````````A-)U).EU`@``D(/"`8F4))0````/ME8-#[;".X0DE```
-M``^.5@(``(N,))0```"+1(Y\B00DZ/S___^)PS'`A?]U$XML)!R%[70+BT0D
-M'(G:Z'2$__^+5"0TB40D#(M$)#")'"2)5"0(B40D!.C\____BY0DE````(M,
-M)%R%P(E$D4AUA8N$))0```"%P'X>,=N+5"1<BT2:2(/#`8D$).C\____.YPD
-ME````'7DBTPD7(D,).C\____N/_____I;?S__\9$)#X'QD0D0`#'A"2,````
-M!P```.G(_/__@'X.!P^%1/S__\9$)#X*QD0D0`#'A"2,````"@```.FD_/__
-MQD0D/@G&1"1``,>$)(P````)````Z8K\___&1"0^",9$)$``QX0DC`````@`
-M``#I</S__X#Z`@^&N@0``,9$)#X%QD0D/P+&1"1`!L>$)(P````%````Z4C\
-M__^`?"0_`\9$)#X%QX0DC`````4````9VX/C_H/#"(A<)$#I(OS__X!^#`</
-MA+X'``"+7"0<@'LP`0^$)?[__[\!````Z1W^__^+3"14#[99!83;=#H/MD8-
-M]G0D/P^V408/ML`IT(G"P?H?B40D"(M$)#")5"0,BU0D-(D$)(E4)`3H_/__
-M_XE$)#")5"0TBU0D6(72#X1X_/__BU0D6(!Z!0`/A&K\__\/ME(&#[9$)#\I
-MT(M4)#2)1"0(B<&+1"0PP?D?B4PD#(E4)`2)!"3H_/___XE$)#")5"0TZ3'\
-M__\QVX!^#0!U&NF'"````49T#[9&#1%6>(/#`3G8#XZR`P``BT2>?(D$).C\
-M____BU`LBT`HB=$)P773Z:[Z__^+7"1<B%,PBU0D+(M$)%R)4"2)4"R`?"0_
-M`0^&2`8```^V3"1`,>T/MGPD/XF,))@```"+G"28````BT0D((E<)`2)!"3H
-M_/___X7`B<,/A)L%``"+3"1<C52I2#')A?]^$(L"@\($B42+2(/!`3G/=?`/
-MMD0D/XA#,(M4)%R+0B2)\HE#)#'`@WPD'``/E,")P8E$)"B)V.C_U?__B>J)
-MZ,'Z'XM,)%SW_P^V43")7(%(#[9$)#\!Z`'].-`/@G#___\/ML+V="0_/#^(
-M03!W(8M<)%P/ML"-2`&-5(-(@\$!C4'_QP(`````@\($/#]V[8M$)%R)\HM,
-M)"CHF]7__XM$)%P/ME`PA=)^3#'_BTPD7(M<N4B#QP&+3"14#[9!!HM,)%PI
-MPHG0P?@?B50D"(E$)`R+012+41B)!"2)5"0$Z/S___^)4QB)0Q2+7"1<#[93
-M,#GZ?[:+7"0<A=L/A%$&``"+5"0<BTPD7(M"+(E!+(E,)`2)%"3H_/___X3`
-M#X4;`@``BUPD'(M,)%P/MI,<`@``#[:!'`(``(/B!(/@^PG0B($<`@``#[:3
-M'`(``(/@_8/B`@G0B($<`@``#[9#-(A!-(M<)!R+4Q@[41B+0Q1W67(%.T$4
-M=U*+5"1<BT($@'@&`'4,BT)(BT`$@'@&`'0YBT0D'.B][/__B<>!YP(0```/
-MA9H!``"+3"0<BUPD7(M1&#M3&(M!%`^"@P$``'<).T,4#X)X`0``BT0D'("X
-M'0(```(/A``&``"+5"0<BTPD7(M<)""+0AR)01R+0QR)V8/!'#G(=0_I8`,`
-M`(L`.<@/A%8#``"-4/2+7"0<.5HH=>J+7"1<B5HHZ^&+?G2+;G@/ME8-B?D)
-MZ0^5P(72?@^$P,>$))0`````````=3;'A"24`````````(3`=`TYE"24````
-M#X1%^___#[:$))0```"+5"1<B$(PZ3']__^-M@````"+G"24````BT2>?(D$
-M).C\____BT@LBU`HB7PD8(EL)&0YS7(.=P0YUW8(B50D8(E,)&2+3"1DBU0D
-M8,=$)`P`````B00DB4PD"(E4)`3H_/___XN,))0```"+7"1<A<")1(M(#X3!
-M^O__*WPD8!ML)&2#A"24`````8G[#[96#0GK#Y7`.Y0DE`````^.0____X3`
-M#X1,____Z6'____&1"0^!L9$)$``QX0DC`````8```#ID_?__XM$)%0/ME@%
-MZ5#X__^_`0```(M$)""#Z(")!"3H_/___XG#,<#&!!@`@\`!@_AH=?3H_/__
-M_XM4)%R)4PB)`XM$)!R)0P2)'"3H_/___XM,)%R+002`>`8`#X5<`@``BT%(
-MBT`$@'@&``^%3`(``,9#9@.`>Q0`#X3+`P``@'MF`P^$S0,``(M,)%R+012+
-M41B`>V8"B4-<B5-@#X1I`P``BT0D'("X'0(```(/A%@#``"+5"0<@(I)`0``
-M!(M,)%R`B4D!```$@*%(`0``_8F99`$``(F:9`$``(M$)""-4PR+2!B)4!B#
-MP!2)0PR)$8M4)!R)2Q")%"3H_/___XM,)%R)#"3H_/___P^V1@^H`0^%C0``
-M`*@"='J`?"0_`0^&/0,``(M<)%B`>P8`#X0O`P``BT0D7(!X,`!T5S'VBU0D
-M7(M<LDB#Q@&-@\`!``"`BT@!```0QX/$`0``@)L$`(F;R`$``(E$)`2+`XM`
-M!(D$).C\____B5PD!,<$)`0```#H_/___XM,)%P/MD$P.?!_JXM4)%R+@E@"
-M``#I>O7__X!\)#\!#X8^`0``BT0D6(!X!@`/A#`!``"+5"1<@'HP`'17,?:+
-M3"1<BURQ2(/&`8V#P`$``("+2`$``$#'@\0!``"`FP0`B9O(`0``B40D!(L#
-MBT`$B00DZ/S___^)7"0$QP0D#0```.C\____BUPD7`^V0S`Y\'^KBT0D7("@
-M2`$``+_I9____XM$)!PQR3'2Z%SQ__^+5"1<BTPD((M"'(E$)`2+002)!"3H
-M_/___^FE_O__B>J)Z,'Z'_?_A<")QGX;BU0D7+D!````BT2:2#'2@\,!Z!?Q
-M__\Y\W7EBTPD7`^V03`YQ0^-!_C__XUTJ4B)ZXL&@\,!@\8$B00DZ/S___^+
-M5"1<#[9",#G8?^3IX/?__X7_N`(```!T!X![%``/E<"(0V;IH/W__S')BT0D
-M7(GR@WPD'``/E,'H']#__^G7^O__BU0D7(G0!<`!``"`BD@!``!`QX+$`0``
-M@)L$`(F2R`$``(E$)`2+`HM`!(D$).C\____BTPD7,<$)`T```")3"0$Z/S_
-M___I7/[__XM$)!R`>#``#X0T^/__@'X-``^$*OC__XM`2#'_A<!U-.FZ\___
-MBUPD'(/'`0^V0S`Y^`^.=0$```^V1@TY^`^.3P$``(M,)!R+1+E(A<`/A(OS
-M__^+6"2+1+Y\B00DZ/S___\YPW6^BTPD'`^V03`Z1@T/AV?S__\/MLB%R0^.
-M,`$``(M<)!PQ_XM#2(7`=2CI2O/__XM<)!R#QP$/MDLP.?D/C@L!``"+5"0<
-MBT2Z2(7`#X0G\___BU@DBT2^?(D$).C\____.<-TRND/\___BT0D'+E0;`0`
-MB=KH[9[__S'`Z?WR__^+3"1<B0PDZ/S____V1@\!#X5M_?__BUPD7(D<).C\
-M____Z</\__\QP#'2A?\/A3W\__^+3"0<BT$4BU$8Z2[\__^+7"1<B=@%P`$`
-M`("+2`$``!#'@\0!``"`FP0`B9O(`0``B40D!(L#BT`$B00DZ/S___^)7"0$
-MQP0D!````.C\____Z>K\__^+5"1<N>!H!`#H3I[__S'`Z5[R__^+3"14#[99
-M!>F0\___BU0D'`^V0@@\!P^$GO;__^FG]O__D(UT)@`/MD,(Z^B+7"0<BT9T
-MBU9XB<>)U2M[%!MK&(GK"?L/A-D```"+1"0<BTR(1(E,)'R+422)5"1XBUHD
-MA=MU#^DV`0``BQN%VP^$+`$``(M#%(7`=>^+3"1\BTDPBT$,BU$0B8PDB```
-M`(F$)(````")E"2$`````T$$$U$(BTL(,T,$,=$)P76[BU0D?(M"%(M2&(E$
-M)'"+0PR)5"1TBU,0.=4/AXH"``!R"#G'#X.``@``BX0D@````(N4)(0```"+
-MC"2(`````?@1ZHE!#(E1$(M,)'R)012)41@!>P01:P@I>PP9:Q"+7"1X@$M,
-M$(D<).C\____BT9TBU9XBTPD'(M<)!R)41B-5A")012+1A"!P50!``")@U0!
-M``"+0@2)002+0@B)00B+0@R)00R)'"3H_/___XM#'(E$)`2+`XM`!(D$).C\
-M____#[9&#X/@','X`H"['0(```*)P@^$*`(``(M,)!R+@5@"``"(D1T"``#I
-MOO#__\=$)'``````QT0D=`````"+5"0<B?D)Z0^5P`^V4C")E"2<````#[96
-M#3F4))P````/C;0```"$P`^$N0```(N<))P```#'A"20`````````(E<)!B+
-MG"20`````UPD&(M$GGR)!"3H_/___XM(+(M0*(E\)&B);"1L.<UR#G<$.==V
-M"(E4)&B)3"1LBTPD;(M4)&C'1"0,`````(D$)(E,)`B)5"0$Z/S___^+3"0<
-MA<")1)E(=&@K?"1HBU0D'!ML)&R)^8.$))P````!">F)4`P/ME8-#Y7`@X0D
-MD`````$[E"2<````?RR$P'0).90DG````'0HBT0D'`^VG"2<````B%@PBT9T
-MBU9XZ7+^__^0C70F`(3`=-WI-?___XM<)'0+7"1P=$N+5"0<#[9",(M$@D2)
-M!"3H_/___XM,)!R+5"1TBT0D<`^V63")5"0(BU0D>,=$)`P`````B40D!(/K
-M`8D4).C\____BTPD'(E$F4B+7"0<#[9#,#N$))P````/C2_O__^-7(-(,?:)
-MQXL#@\8!B00DZ/S___^-!#['`P````"#PP0[A"2<````?-[I`.___XN,)(@`
-M```IQQG5`X0D@````!.4)(0```")00R)41"+3"1\B4$4B5$8B5PD!(M<)'B)
-M'"3H_/___X!+3!")'"3H_/___XGH"?@/A0C^__^+1G2+5GCI<?W__SP"#X30
-M_?__B(,=`@``BT0D)+E@@@0`BY`H`0``B=CH<)K__S'`Z8#N__^)]HV\)P``
-M``!64X/L%(MT)""+7AB+`XD$).C\____C4L$B<*+1@CH[>W__X7`B<)T+8/X
-M_W0RBT8<QT8PD%T$`(EV-,=&.`````")$(U&,(E$)`2+1@B)!"3H_/___X/$
-M%%M>PXUT)@#'1BS_____Z\6-M"8`````55=64X'LK````(N\),````"-="00
-MB?"-5"0<BV\(BU\8Q@``@\`!.=!U]HU&#,<&?`$``(E<)`3'1"0(:````(D$
-M).C\____C5-HQT9T`````(U.?,=&>`````"+0VB)1GR+0@2)002+0@B)00B+
-M0@R)00R+0A")01"+0A2)012+0AB)01B+0APQTHE!'(GQB>B+7QSH!NW__XD#
-M@\`!=0?'1RS_____C4<PQT<PD%T$`(E_-,='.`````")1"0$BT<(B00DZ/S_
-M__^!Q*P```!;7E]=PXUV`(V\)P````!6,=)3@^P4BW0D((M.&(M&"(M>'.BG
-M[/__B0.#P`%U!\=&+/____^-1C#'1C"0700`B78TQT8X`````(E$)`2+1@B)
-M!"3H_/___X/$%%M>PU575E.#[`R+1"0@BRB+6"B+>"R+M2@!``")!"3H_/__
-M_XM#'(U-'(E''(M%'#G(=0CK&(L`.<AT$HU0]#E:*)!U\8L`B7HH.<AU[C')
-M,=*)V.CZZ/__BT<<B40D!(M%!(D$).C\____B3PDZ/S___^+AU@"``"+5AS'
-M1C"0700`B78TQT8X`````(D"C48PB40D!(M&"(D$).C\____@\0,6UY?7<.-
-M=@"-O"<`````55>)QU:)UE.![+P```"+6%BX_____X!_"`%T"X'$O````%M>
-M7UW#C:PDD````(M74(EL)`2+1UR)!"3_4CR-1"08BU,$B40D!(M#"(D$)/]2
-M'(V$)+````")!"2-C"2T````B=B-E"2X````Z)]L__\/MH0DG0```(A&`O:$
-M))H````"#X5\`0``#[:$)+0````"A"2<````B$8!BX0DN````(@&@'],``^)
-M9`$```^V1TN(1@,/MH0DHP```(A&!0^VE"28````#[9&!@^VG"29````P.H&
-MB=&#X/R#X0$)R`^VC"29````T.H!T@G0@^$!@^#SP>$"C12=``````G(@^((
-MB=D)T(/A$(/@SXG:@^(@"<@)T(G9@^%`@^`_B=H)R(/B@`G0B$8&#[9&!P^V
-ME"2?````@^#\@^(#"=#VPP2(1@</A-<```#&1@0"B>J)^.BW;O__BY0DJ```
-M`(72B48(="Z-1@R-7D*)5"0$QT0D")8```")!"3H_/___\=$)`0H````B1PD
-MZ/S____&0R<`]D=,074DBT<PBU<TB8:B````B9:F````BT<HBU<LB8:J````
-MB9:N````BU<DA=)T,S')ZPR-M@````"+$H72=".+0A2%P'07BT`,A<!T$(N`
-M6`(``(F$CKH```"#P0&#^0=^UX'$O````#'`6UY?7<,/MH0DL````.E__O__
-M#[:$)*(```"(1@/ID_[__X/C"(#[`1G`@^#^@\`#B$8$Z1?___^-M"8`````
-M55=64X/L#(M4)""+0AB+6AR+,(DT).C\____BQ.#Z@6)QW0.,<#&1!@%`(/`
-M`3G"=?2%]G1>A?]T6HM'%(M7&(E#$(M'#(E3%+K_____A<!T!HN06`(``(E3
-M&(M7'(G0P?@?"="(0P^+!XM`!(D$).C\____B$,.#[:''0(``(A##0^V1P@\
-M!'9&QD,,`8!_,$!V5(M$)"#'0"S_____BU0D((G0@\`PQT(PD%T$`(E2-,="
-M.`````")1"0$BT((B00DZ/S___^#Q`Q;7E]=PRP!=<#&0PP"C5,LB?CHWOS_
-M_X7`=:[KMXM'.(M7/(F#O````(GXB9/`````Z"]P__^-EU0!``"-2RR)@[``
-M``"+AU0!``")0RR+0@2)002+0@B)00B+0@R)00P/MD<(Z#QL__^(@Y`````/
-MMD<QB(.1````#[9'-(B#M````(N'3`$``(N74`$``(F#G````(GXB9.@````
-MZ(/<__^)@Y0```")/"3H_/___\:#D@````")@Y@```"`?S``#X0Q`0``,>V+
-M=*](A?8/A.4```"`NY,`````#X3H````@'X(!`^$]P```(N&6`(``(F$J\0`
-M```/MI.2````@\4!@\(!B).2````#[9',#GH#X^-````#[;2@_H_?QB-A)/$
-M````@\(!QP#_____@\`$@_H_?N^+AV0!``"%P`^$CO[__XM0!+G_____A=)T
-M!HN*6`(``(F+I````(M0"+G_____A=)T!HN*6`(``(F+J````(MP!(7V#X13
-M_O__BT@(A<D/A$C^__^)/"3H_/___XF#K````.DU_O__C;8`````@_T_#X]J
-M____BW2O2(7V#X4;____QX2KQ`````````#I+____P^V1@CHTFK__XB#DP``
-M`(!^"`0/A0G___^+1B2+@%@"``")A*O$````Z0'___\QTNDA____C;8`````
-M@>S,````B;PDQ````(G'@'\(`8FT),````")UHF<)+P```")K"3(````BUA8
-MN/____]T(XN<)+P```"+M"3`````B[PDQ````(NL),@```"!Q,P```##BT=<
-MC:PDD````(M74(EL)`2)!"3_4CR-1"08BU,$B40D!(M#"(D$)/]2'(V$)+``
-M``")!"2-C"2T````B=B-E"2X````Z%]G__\/MH0DG0```/:$))H````"B$8"
-M#X46`0``#[:$)+0````"A"2<````B$8!BX0DN````(@&@'],``^)%`$```^V
-M1TN(1@,/MI0DF`````^V1@8/MIPDF0```,#J!HG1@^#\@^$!"<@/MHPDF0``
-M`-#J`=()T(/A`8/@\\'A`HT4G0`````)R(/B"(G9"="#X1"#X,^)VH/B(`G(
-M"=")V8/A0(/@/XG:"<B#XH`)T`^VE"2?````B$8&#[9&!X/B`X/@_`G0]L,$
-MB$8'#[:$)*,```"(1@5T:,9&!`*)ZHGXZ'MI__^+E"2H````B48(,<"%T@^$
-MF_[__XU&#(U>0HE4)`3'1"0(E@```(D$).C\____QT0D!"@```")'"3H_/__
-M_S'`QD,G`.EF_O__B?8/MH0DL````.GE_O__C78`@^,(@/L!&<"#X/Z#P`.(
-M1@3KB0^VA"2B````B$8#Z>/^__^-M@````"-O"<`````55=64X/L#(ML)""+
-M?1B+!X7`=$0Q]NL/B1PD@\8!Z/S___\Y-W8QBT2W!(D$).C\____@'@(`8G#
-M=4CV0$P"=->)!"2#Q@'H_/___XD<).C\____.3=WSXU%,,=%,)!=!`");33'
-M13@`````B40D!(M%"(D$).C\____@\0,6UY?7</'12S^____Z\R-="8`@^P<
-MBT0D((E<)!2)="08BU@(BW`$B40D!(L#@^B`B00DZ/S___^)\#'),=+HO^#_
-M_X"+2`$```2+="08B5PD((M<)!2#Q!SI_/___XUT)@"#[!PQTHE<)!2+7"0@
-MB70D&(M#!(LP#[=#6(N.9`$#`,'@"8F>>`$#`,>&@`$#``````"-1`'_]_''
-MAG0!`P#0^P0`QX9\`0,``````(F&<`$#`(V&<`$#`(DT)(E$)`3H_/___XM<
-M)!2+="08@\0<P^L-D)"0D)"0D)"0D)"0D(/L/(M$)$")7"0LB70D,(E\)#2)
-M;"0XBT`8BP")!"3H_/___XN`9`$``(E$)!B`>!0`#X2+````B<*+0%R+4F")
-M1"0@BT0D&(E4)"2+5"0DBT@$BT0D((MY%(MI&#'X,>H)P@^$'P(``#EL)"0/
-M@V,!``"+5"0DBT0D(#'J,?@)P@^$%0(``(M,)!@Q]CMT)"0/MTED9HE,)!X/
-MM]D/@GT!``!W"CM<)"`/AG$!```/MT0D(#'V#[?89HE$)![I70$``(M$)!B+
-M2%R+6&"+0`2)VHMP%(MX&(G(,?`Q^@G"#X1Z`0``BT0D&`^V:&:)ZH32#X5(
-M`0``BT0D&#'2#[=`9&:)1"0>#[?``<@1VCG7=PX/@\H!``!F*<YFB70D'HM4
-M)!@/MT0D'F;'0EH``(E*4(E:5&:)0EB)ZH32="6`^@-T((M$)!B+7"0LBW0D
-M,(M\)#2)1"1`BVPD.(/$/.D<_O__BT0D&#'2B4@DB<''0#0`````B5@H#[=`
-M6`-!4!-15,=!0,#/!`")02R)R(/`.(E!.(E!/(/H%(E1,(E)1,=!2`````#'
-M04P!````B40D!(M!!(D$).C\____A<!T@HM<)"R+="0PBWPD-(ML)#B#Q#S#
-M=PHY?"0@#X:1_O__BU0D&(GX,?8/MU)D#[?:`=AFB50D'HGJ$?([5"0D<AX/
-MAN<````/MTPD(#'V9BGY9HE,)!X/M]F-M@````"+1"0@BU0D)"G8&?*)P8G3
-MBU0D&`^V:F;IX_[__XUV`(#Z`P^$K_[__XM4)!B+0@B+<!2+>!CIG?[__Y"-
-M="8`BT0D&`^V:&:)ZH#Z`P^$E````(GHA,!UT(M4)!B]`0```,9"9@'KP8M4
-M)!@/MD)F/`)T<2P!#X2#````BT0D&#'VBU0D((M,)"0/MT!DB70D#(D4)(E,
-M)`0/M]B)7"0(9HE$)![H_/___V:%P`^$3?___P^WV#'V9HE$)![I/O___SG&
-M#X,V_O__Z2G^__\[1"0@#X(G____C;0F`````.D#____B="+7"0LBW0D,(M\
-M)#2+;"0X@\0\Z3'#__^+1"08QD!F`(MY%(MI&.DW_?__C;0F`````(V\)P``
-M``"#[&R)5"0TBU0D=(E\)&2+?"1\B6PD:(G%BT0D<(E<)%R)5"0L#[=4)'B)
-M="1@BT\(,?:)1"0HBT0D*&:)5"0F#[?:BU0D+(E,)""+3"0T`=B)1"0X$?*)
-M5"0\.U$\#X-^````BU0D-(M,)""+0B")#"2)1"0$Z/S___^%P(E$)$0/A%P!
-M``"+1"1$QD!F`&:#?"0F`8EX+,=`<&#C!`#'0&P`````#X0[`@``@?T9_P``
-M#X2*````=W2!_0O_```/A#`!``#'1RS^____BT0D1(D$).C\____BU<(B50D
-M(.L)=C_'1RS^____BTPD((U',,=',)!=!`")?S3'1S@`````BUPD7(E$)'2+
-M="1@B4PD<(M\)&2+;"1H@\1LZ?S___\[03@/ACC____KMH'](_\```^$O```
-M`('])/\``'6$BT0D-/9`3@(/A50!``"+="1$QD9D`\9&4R2+?"1$#[9'98/@
-M^X/(`HA'98M$)$2`>&0##X2A`0``BTPD1`^V04@\$`^$1@(``#P*#X3Y`@``
-MBUPD((M,)#2+5"1$BT,DB4HHA<`/A%D#``"+="0@BU0D1(M\)$2+3B")\(/"
-M#(/`'(E6((E'#(E/$(D1BUPD7(MT)&"+?"1DBVPD:(/$;,.+7PC'1RS]____
-MB5PD(.GU_O__9H-\)"8!#X?$_O__BT0D-(MH)(7M=$^-=@"+50@Y5"0LBT4$
-M#X*W````=PHY1"0H#X*K`````T4,$U40.50D/`^'FP````^#BP```(M5%(72
-MB50D3'0/BTH,A<F)3"1(#X7H`@``BT0D-/9`3@(/A+@"``"+5"1$QD)D`HM<
-M)#R+3"0XB=DQVPG+#X2M`@``QD)0BL9"2!"+?"1$#[9'98/(!(/@_8A'9>G)
-M_O__BU0D1,9"9`*+7"0\BTPD.(G9,=L)RP^$``$``,9"4(C&0D@0Z8_^__\Y
-M1"0X#X9K____BVT`A>T/A2[____I=?___XM,)"R+5"0HQT0D%`$```");"0$
-MB4PD$(M,)#2)5"0,QP0D(`P``(E,)`CH_/___^F0_?__QT!8`````(M4)"R+
-M1"0H#ZS0$,'J$`^V5"0HB<$PP&:!X?\`"="+5"1$9HE"3(MT)"R+7"0H#ZSS
-M",'N"`^VPXGWB=X/K/X0B70D*`^W5"0HP>\0B7PD+(M\)$0PT@G09HE'3HM4
-M)"R+1"0H#ZS0"(E$)"@/MT0D*,'J"(E4)"S&1U)`9L='2```,,`)P6:)3U`/
-MMU0D)F:)5TIFB5=4Z=/]__^+7"1$QD-0*,9#2`KIB_W__\9!20`/MT0D)L'@
-M"8E!3(M4)"R+1"0HB=`QTL'H&(A!4HM4)"R+1"0HB=`QTL'H$(A!4XM4)"R+
-M1"0HB=`QTL'H"(A!5(M4)"R+1"0HB=`QTHA!58M4)"R+1"0H#ZS0&(A!5L'J
-M&(M$)"B+5"0L#ZS0$(A!5\'J$(M$)"B+5"0L#ZS0"(A!6`^V7"0HP>H(QD%:
-M`,9!6P"(65D/MT0D)F;!Z`B(05P/MD0D)L9!7@"(05W&05\`Z0?]__^+5"1$
-MQD))``^W1"0FP>`)B4),BU0D+(M$)"B+3"1$#ZS0&(A!4L'J&(M$)"B+5"0L
-M#ZS0$(A!4\'J$(M$)"B+5"0L#ZS0"(A!5`^V7"0HP>H(QD%6`(A950^W1"0F
-M9L'H"(A!5P^V1"0FQD%9`(A!6.F1_/__BU0D1(E4)'"+7"1<BW0D8(M\)&2+
-M;"1H@\1LZ?S___^+="1$QD9D`\9&4S3I6_W__XM<)$3&0U`JQD-("NE*_?__
-MBTPD2(M11(M!0(E4)`2)!"3H_/___XM,)$B+400X0@8/AO+\__^+50B+102)
-M5"14BU0D1(E$)%#&0F0!BT0D(`68````B00DZ/S___^%P(G!#X3C`0``BWPD
-M*"M\)%"+;"0L&VPD5`'[QT`0`````!'NB7`,BW0D2(EH!(E8"(M<)$3'0"``
-M````B3C'0!P`````QT`D`````(U`%(E!%(E!&(M&!,=!*`$```")2SR)<RB`
-M>`4`#X2,````QD-2`0^V3C$/K>_3[?;!('0$B>\Q[8E[2(EK3`^V3C"$R70R
-MBWPD3+@!````.WY(#X0[`0``,=+K%8M<)$@/ML*+="1,.W2#2`^$'P$``(/"
-M`3C*=>2+1"0@BT`DA<`/A)S^__^+7"0@BU0D1(MT)$2+2R")V(/"#(/`'(E3
-M((E&#(E.$(D1Z4+[__^+1"0@BTPD1(N09`$#`,9!4@&+1"0@B7E(B6E,!6`!
-M`P")050/MUPD)F:)65"+="1(#[9>,(3;="Z+?"1,N`$````[?D@/A(X````Q
-MP.L1BW0D2`^VR(M\)$P[?(Y(='*#P`$XV'7H#[=$)":)TXMT)""+?"1$P>`)
-MC40"_S'2]_/'AH`!`P``````QX9T`0,`<`(%`(F^>`$#`,>&?`$#``````")
-MAG`!`P")\(M<)%P%<`$#`(M\)&2)="1PBVPD:(E$)'2+="1@@\1LZ?S___^X
-M`0```-/@BTPD1(A!4^N%C4(!BWPD1(A'4^G9_O__QT<L_?___^E#^?__C;8`
-M````@^Q,B5PD/(M<)%R);"1(B=6+5"14B70D0(7MB7PD1(E$)"2+2PB+1"10
-MB50D'`^W5"18B4PD$(E$)!B+@60!`P!FB50D%HE$)"AT"?:%20$```1T/XM4
-M)!"-0S#'0RS^____QT,PD%T$`(E;-,=#.`````")1"14B50D4(M<)#R+="1`
-MBWPD1(ML)$B#Q$SI_/___XM%!`^V2`:$R72V#[=$)!8/MM$Q_XG&#[9%,`-T
-M)!@3?"0<*=")P<'Y'XE$)`B)3"0,BT44BU48B00DB50D!.C\____.=</AW7_
-M__]R"#G&#X=K____BT0D$`68````B40D+(D$).C\____A<")1"0P#X1!`0``
-MBT4@BU0D$(E$)`2)%"3H_/___X7`B40D-`^$#@$``(M,)#"+1"08BU0D,,=!
-M(`````")`8G(@\`4QT(0`````(M4)!R)012)01B+1"0TB7$(B5$$B7D,QT$<
-M`````,=!)`````#'02@!````B4@\B5@LQD!D`:$`````A<!^##N%O`$```^?
-MP`^VP(M4)#2)0C2+102`>`4`=#^+3"0D@>D+_P``@_D:#X:%`0``BT0D,(M4
-M)"R)1"0$B10DZ/S___^+3"0TB0PDZ/S___^+0PB)1"00Z7#^__\/MT0D%HM4
-M)"B+3"0DP>`)C40"_S'2]W0D*('I"_\``(/Y&HG&=FN+5"0PBTPD+(E4)`2)
-M#"3H_/___XM$)#2)!"3H_/___XM3"(E4)!#I'?[__XM,)#"+1"0LB4PD!(D$
-M).C\____C4,PQT,L_?___\=#,)!=!`")6S3'0S@`````B40D5(M#"(E$)%#I
-M!?[__[@!````T^"I`(``!`^%:@$``*D`0``"#X50`0``J0$```$/A&W___^+
-M3"0TQD%2`8M$)!"+3"0T!6`!`P")052+3"0TBT0D&(M4)!R):2B)04B)44P/
-MMUPD%L9!9@#'06P`````QT%P0.0$`&:)65"+1"00BU0D$(FP<`$#`,>`@`$#
-M``````#'@'0!`P!P`@4`B8AX`0,`QX!\`0,```````5P`0,`BUPD/(E$)%2+
-M="1`B50D4(M\)$2+;"1(@\1,Z?S___^X`0```-/@J0"```0/A;T```"I`$``
-M`@^%I0```*D!```!#X13_O__QD)2`0^V33&+5"0<BT0D&`^MT-/J]L$@=`2)
-MT#'2BTPD-(E!2(E13,9!9@"+7"00QT%L`````(EI*,=!<$#D!`"+0R2%P'1L
-MBU0D-(M<)!"#P@R+2R")V(E3((M<)#2#P!R)0PR)2Q")$8M<)#R+="1`BWPD
-M1(ML)$B#Q$S#BT0D-`'VQD!2`NFT_O__BUPD-,9#4@/II_[__XM,)#3&05("
-MZ5W___^+7"0TQD-2`^E0____BTPD-(M<)#R+="1`BWPD1(E,)%"+;"1(@\1,
-MZ?S___^-M@````"#["R)7"0<BUPD,(ET)"")?"0DB6PD*(M#&(MP!(MX"`^W
-M:`R+`(D$).C\____B<*+0PR)7"0,B6PD"(DT)(E\)`3H>?O__XM<)!R+="0@
-MBWPD)(ML)"B#Q"S#D(UT)@"#["R)7"0<BUPD,(ET)"")?"0DB6PD*(M#&(MP
-M!(MX"`^W:`R+`(D$).C\____@'@(`8G!=#"+0PP/M]6)5"0(B<J)7"0,B30D
-MB7PD!.@.^___BUPD'(MT)""+?"0DBVPD*(/$+,.+0PP/M]6)5"0(B<J)7"0,
-MB30DB7PD!.A.\___Z\Z-M@````"-OP````"#["R)7"0<BUPD,(ET)"")?"0D
-MB6PD*(M#&(MP!(MX"`^W:`R+`(D$).C\____@'@(`8G!=#"+0PP/M]6)5"0(
-MB<J)7"0,B30DB7PD!.A^^O__BUPD'(MT)""+?"0DBVPD*(/$+,.+0PP/M]6)
-M5"0(B<J)7"0,B30DB7PD!.B^\O__Z\Z-M@````"-OP````"#["R)7"0<BUPD
-M,(E\)"0Q_XET)"");"0HBT,8#[9H"(MP!(L`B00DZ/S___^)PHM##(E<)`R)
-M;"0(B30DB7PD!.CZ^?__BUPD'(MT)""+?"0DBVPD*(/$+,.-M@````"#[!R)
-M7"00BUPD((ET)!2)?"08BT,8BW@$#[9P"(L`B00DZ/S___^`>`@!B<%T,HM#
-M#(E<)`R)\P^VTXE4)`B)RHD\),=$)`0`````Z(_Y__^+7"00BW0D%(M\)!B#
-MQ!S#BT,,B5PD#(GS#[;3B50D"(G*B3PDQT0D!`````#HS?'__XM<)!"+="04
-MBWPD&(/$',.-M@````"-O"<`````@^P<B5PD$(M<)"")="04B7PD&(M#&(MX
-M!`^V<`B+`(D$).C\____@'@(`8G!=#*+0PR)7"0,B?,/MM.)5"0(B<J)/"3'
-M1"0$`````.CO^/__BUPD$(MT)!2+?"08@\0<PXM##(E<)`R)\P^VTXE4)`B)
-MRHD\),=$)`0`````Z"WQ__^+7"00BW0D%(M\)!B#Q!S#C;8`````C;PG````
-M`%6)U5=6B<93@^P,A=*)EF@!`P!T,8G#,?^-M"8`````C01_@\<!C82&9`$`
-M`(E$)`2)-"3H_/___XF#8`$``(/###GO==JA`````,>&;`$#`!(```"%P'0?
-MC;0F`````(M0"#F6;`$#`'8&B99L`0,`BT`$A<!UZ(/$#%M>7UW#5U:)QE.#
-M[!"+@&@!`P"%P'0XB?,Q_XN#9`$``(/'`8N3:`$``(E$)`B)5"0,BX-@`0``
-M@\,,B30DB40D!.C\____.;YH`0,`=\S'AF@!`P``````B30DZ/S___^#Q!!;
-M7E_#C;8`````C;PG`````%93@^P4BW0D((!^9`.+7BP/A(P````/MD9F/!`/
-MA(X````\!70@=QHL`8VV``````^$A````,=#+/____^-=@#K#CP+=7W'0RS]
-M____C78`BT8\A<!T$XE$)`2+!@68````B00DZ/S___^+!N@?____B30DZ/S_
-M__^-0S#'0S"0700`B5LTQT,X`````(E$)`2+0PB)!"3H_/___X/$%%M>P_9&
-M4P$/A&K____&1F80BT,<Q@`!QD9F`<=#+`````#KC3P-#X1[____QT,L____
-M_^EY____B?:-O"<`````5E.#[!2+="0@BUXLBT,,/23_``!T:CT9_P``=&.`
-M?F80=F_'0RS_____C;8`````BT8\B40D!(L&!9@```")!"3H_/___XL&Z&/^
-M__^)-"3H_/___XU#,,=#,)!=!`")6S3'0S@`````B40D!(M#"(D$).C\____
-M@\046U[#B?:`?F8,=#^+0QS&``"`?F80=Y$/ODYFN`$```#3X*D@*0$`=12H
-M`@^$=____\=#+`````#I>/___\=#+/W___^0Z6O___^+0QS&``&+1BC'!"01
-M````B40D!.C\____QD9F`>O(C;8`````C;\`````@^P<B5PD%(M<)"")="08
-MBT,8@WL0!XLP=@:#>Q0#=Q/'0RS^____BUPD%(MT)!B#Q!S#B30DZ/S___^%
-MP'3AB30DZ/S___^+$#M3"'0)QT,L_/___^O0BT@,A<EUPH!X"`1VO(M`'(/X
-M_W2[B40D!(M"!(D$).C\____A<!TJ,=#+/_____KGY"-M"8`````@^P<B5PD
-M$(G#B7PD&(G7B70D%(N`(`(``(7`=0J+LU0"``"%]G09,<"+7"00BW0D%(M\
-M)!B#Q!S#C;0F`````(M#'(/X_W05B40D!(L#BT`$B00DZ/S___^%P'7*@'L(
-M!'8X9O>#2`$``'`(=;F`>S``="`Q]HM$LTB%P'0+B?KH>____X3`=)X/MD,P
-M@\8!.?!_XK@!````ZXYT$8GZB=CH&E___P^VP.E[____BT,DB?KH"%___P^V
-MP.EI____@^P,@'@(!'87,<F#N&0!````=`R)R(/$#,.-M@````#H&____X/$
-M#`^VR(G(PXGV55=64X/L#(MT)""+3AB+5AR+`<<"`````(G%B<>!Y0`!``"!
-MY_\```!T;#';ZR*0BT@,A<EU6X!X"`49TO?2(<+HBO___X3`=$@Y^W1)BTX8
-M@\,!BP29B00DZ/S___^%[77-BU`,A=)U*&;W@$@!``!P"'4=BU`<@_K_=,V)
-M5"0$BP"+0`2)!"3H_/___X7`=+B+1AR)&(U&,,=&,)!=!`")=C3'1C@`````
-MB40D!(M&"(D$).C\____@\0,6UY?7<.-M"8`````C;PG`````%575E.#[`R+
-M="0@BT88BQ`QP/;&_P^4P`^V^HE$)`B+1APQVP^V;"0(QP``````D#G[<CR%
-M_W0E,=N-M@````"+1AB#PP&+!)B)!"3H_/___XD$).C\____.?MUXXM<)`B%
-MVW5LQT8L`````.LXB?:)Z(3`=+Z+1AB#PP&+!)B)!"3H_/___X!X"`49TO?2
-M(<+H:O[__X3`=9:+1AS'1BS_____B1B-1C#'1C"0700`B78TQT8X`````(E$
-M)`2+1@B)!"3H_/___X/$#%M>7UW#A?]TT8M&&(M`!(D$).C\____@\0,,=);
-M7E]=Z?]V___K#9"0D)"0D)"0D)"0D)"#[#R)="0TBW0D0(E<)#")?"0XBUXL
-MBWXH@7L,0O\```^$B@````^V1E.+4QR(0@H/MT9,B$(&#[=&3HA"!P^W1E"(
-M0@@/MD92B$()#[=&2(A"!`^W1DJ(0@4/MT94B$(+@'YF`0^$E0```,=#+/__
-M__^)-"3H_/___XU#,,=#,)!=!`")6S3'0S@`````B40D!(M#"(D$).C\____
-MBUPD,(MT)#2+?"0X@\0\PXUV``^V1E.+4QR(0@\/MT9,9HE""`^W1DYFB4(*
-M#[=&4&:)0@P/MD92B$(.#[=&2&:)0@0/MT9*9HE"!@^W1E1FB4(0@'YF`0^%
-M</___Y"-="8`BT,,QT,L`````#U"_P``=%,]&/\```^%5O___XM#&(!X"O(/
-MA4G___^-5"00BT=0B50D!(M77(D4)/]0/(M4)"B!P@`!```/M@*H!`^$(/__
-M_X/@^X@"B3PDZ/S____I#O___XM#&(!X#_(/A0'____KMHVV`````(V\)P``
-M``!55U93B<.#[`PQP)"-="8`Q@08`(/``8/X+'7TQP,L````Z)E+__^(0P2A
-M`````(LPA?8/E$,%H0````")!"3H_/___\'@##W___\!#X:)````QD,&!<9#
-M!PL/MD,+,>V_!0```,9#"`#&0PD!QD,*#X/@_H/("(A#"\9$)`L`ZQ6#_P7&
-M1!X<0'0X@\4!@\<!@_\-=#2)/"3H_/___X7`=.R)Z`^V\(GXZ,),__^#_P:(
-M1!X,=<K&1!X<`H!,)`M`Z\B`3"0+(.O!@'PD"V!T%X/$##'`6UY?7</&0P8'
-MQD,'!^ER____H0````"#N)0!`P`#=MN)Z@^VPL9$&`P2QD08'$"#Q`PQP%M>
-M7UW#D%.#[`B+7"00BT,<Z.#^__^%P'0'QT,L_____XU#,,=#,)!=!`")6S3'
-M0S@`````B40D!(M#"(D$).C\____@\0(6\.-M@````"-O"<`````55=64X'L
-MG````(NL)+````"+?0B)^.CU5___BX>0`0,`A<`/A84```"+=PC'AY`!`P`!
-M````A?8/A*4```"-5"0DBT8$B50D!(M6"(D4)/]0'`^V1"0T`8>0`0,`@'PD
-M-`!T,3';B70D#,=$)`B0[`0`B5PD!(DT).C\____A,!U!X.OD`$#``$/MD0D
-M-(/#`3G8?]&+-H7V=:.+AY`!`P"#Z`&%P(F'D`$#`'0_C44PQT4L_/___\=%
-M,)!=!`");33'13@`````B40D!(M%"(D$).C\____@<2<````6UY?7</'AY`!
-M`P``````C8=4`0``QX=4`0``@.P$`(F_6`$``,>'7`$```````")1"0$C4<D
-MB00DZ/S____KD(GVZ?S___^-="8`C;PG`````(/L'(E\)!2+?"0@B6PD&(M$
-M)"B)7"0,BVPD)(ET)!"+=PR#KI`!`P`!A<`/B+0```")1"0(B6PD!(D\).C\
-M____A<")PP^$K@```(`]``````!U+HE<)`3'!"0"````Z/S___^+AI`!`P"%
-MP'0TBUPD#(MT)!"+?"04BVPD&(/$',,/MD!,J`)URJ@!#X6$````]D-,!'6\
-M@$M,)(UT)@#KLHV&5`$``,>&5`$``(#L!`")ME@!``#'AEP!````````BUPD
-M#(E$)"2-1B2+?"04B40D((MT)!"+;"08@\0<Z?S___^-1Q");"0$B00DZ/S_
-M___I:____XM'!(DL)/]00(U'$(EL)`2)!"3H_/___^E.____B1PDZ/S___^)
-M]NEM____C70F`(V\)P````"#[!R)7"00BUPD((E\)!B)="04BT,8BW`$BP")
-M!"3H_/___XDT)(G'Z/S___^)/"2)1"0$Z/S____'0S"0700`B5LTQT,X````
-M`(/X`1G`]]")0RR-0S")1"0$BT,(B00DZ/S___^+7"00BW0D%(M\)!B#Q!S#
-MC78`C;PG`````%=64X/L$(`]``````"+?"0@=&V+7PR-=PPY\W4)ZS60BQLY
-M\W0NC9/8_?__@'H(`77N]H(<`@```73E#[8%`````(D4)(E$)`3H_/___XL;
-M.?-UTL>'S`````"'DP.-A\P```#'A]0`````````B;_8````B40D!(D\).C\
-M____@\006UY?PXGVC;PG`````%575E.![,P```"+M"3@````C7PD$(GXC50D
-M'(MN"(M.&,8``(/``3G0=?:-1PS'!WP!``")3"0$QT0D"+````")!"3H_/__
-M_S'2B?F)Z(M>'.A:Q/__B0.#P`%U!\=&+/____^-1C#'1C"0700`B78TQT8X
-M`````(E$)`2+1@B)!"3H_/___X'$S````%M>7UW#C;0F`````(V\)P````!6
-M,<!3@^P4BW0D((M>'(GVQ@08`(/``3V`````=?*)V.AK^O__A<!T,,=&+/__
-M__^-1C#'1C"0700`B78TQT8X`````(E$)`2+1@B)!"3H_/___X/$%%M>P\<#
-M@````#'2QT,\`"````^V1!H,@^`/@^@#/`)W!<9$&BP&@\(!@_H0=>3KJHUV
-M`(V\)P````!55U93@^P,BU0D((M"&(M:'(LP,<#&!!@`@\`!/?H```!U\HDT
-M).C\____B<4QP)#&!!@`@\`!/?H```!U\H7V=%V%[719BT44BU48B4,$BT4,
-MB5,(NO____^%P'0&BY!8`@``B5,,BU4<B=#!^!\)T(A#`XM%`(M`!(D$).C\
-M____B$,"#[:%'0(``(A#`0^V10@\!'=$+`$/A*\!``"+1"0@QT`L_____XM4
-M)"")T(/`,,=",)!=!`")4C3'0C@`````B40D!(M""(D$).C\____@\0,6UY?
-M7</&`P&+13AFB8/H````B>CH04K__XV55`$``(U+((F#Y````(N%5`$``(E#
-M((M"!(E!!(M""(E!"(M"#(E!#`^V10CH3D;__XB#A`````^V13&(@X4```"+
-MA4P!``"+E5`!``")@]````")Z(F3U````.B?MO__B8.(````B2PDZ/S____&
-M@X8`````B8/,````@'TP``^$3@$``#'_BW2]2(7V#X0"`0``@+N'``````^$
-M!0$``(!^"`0/A!0!``"+AE@"``")A+N,````#[:3A@```(/'`8/"`8B3A@``
-M``^V13`Y^`^/H0````^VTH/Z#W\8C823C````(/"`<<`_____X/`!(/Z#W[O
-MBX5D`0``A<`/A+7^__^+4`2Y_____X72=`:+BE@"``")B]@```"+4`BY____
-M_X72=`:+BE@"``")B]P```"+4`2%T@^$>O[__XM`"(7`#X1O_O__B2PDZ/S_
-M__^)@^````#I7/[__\8#`HU3((GHZ&75__^%P`^%//[__^E"_O__@_\/D(UT
-M)@`/CU'___^+=+U(A?:-="8`#X7^_O__QX2[C`````````#I$O___P^V1@CH
-MT43__XB#AP```(!^"`0/A>S^__^+1B2+@%@"``")A+N,````Z>3^__\QTND$
-M____D(UT)@!55U93@^P,BU0D((M"&(M:'(LP,<#&!!@`@\`!/=@```!U\HDT
-M).C\____B<<QP)#&!!@`@\`!/=@```!U\H7V=#6%_W0QBT<4BU<8B4,$BT<,
-MB5,(NO____^%P'0&BY!8`@``B5,,#[9'"#P$=T0L`0^$&`$``(M$)"#'0"S_
-M____BU0D((G0@\`PQT(PD%T$`(E2-,=".`````")1"0$BT((B00DZ/S___^#
-MQ`Q;7E]=P\8#`8N'5`$``(V75`$``(U+$(E#$(M"!(E!!(M""(E!"(M"#(E!
-M#`^V1PCHO4/__XA#=`^V1S&(0W6+ATP!``"+EU`!``")@\````")^(F3Q```
-M`.@4M/__B4-XB3PDZ/S____&0W8`B8.\````@'\P``^$I0```#'MZRV`?@@$
-M=$</ME-VBX98`@``B423?`^V0W:#P`$\#XA#=G=8#[9',(/%`3GH?DV+=*](
-MA?9T[8![=P!UQ0^V1@CH+4/__XA#=X!^"`1UN8M6)`^V0W:+DE@"``")5(-\
-MZ[3&`P*-4Q")^.ADV/__A<`/A=/^___IV?[__P^V4W:#^@\/C\S^__^-1)-\
-M@\(!QP#_____@\`$@_H/?N_ILO[__S'2Z^*-M@````"-OP````!55U93@^P,
-MBU0D((M"&(M:'(LP,<#&!!@`@\`!/:X```!U\HDT).C\____B<<QP)#&!!@`
-M@\`!/:X```!U\H7V="^%_W0KBT<4NO____^)0P2+1PR%P'0&BY!8`@``B5,(
-M#[9'"#P$=T0L`0^$#`$``(M$)"#'0"S_____BU0D((G0@\`PQT(PD%T$`(E2
-M-,=".`````")1"0$BT((B00DZ/S___^#Q`Q;7E]=P\8#`8N'5`$``(V75`$`
-M`(U+#(E##(M"!(E!!(M""(E!"(M"#(E!#`^V1PCHXT'__XA#<`^V1S&(0W&+
-MATP!``")@YP```")^.A&LO__B4-TB3PDZ/S____&0W(`B8.8````@'\P``^$
-MIP```#'MZRV`?@@$=$</ME-RBX98`@``B423>`^V0W*#P`$\!XA#<G=8#[9'
-M,(/%`3GH?DV+=*](A?9T[8![<P!UQ0^V1@CH7T'__XA#<X!^"`1UN8M6)`^V
-M0W*+DE@"``")5(-XZ[3&`P*-4PR)^.B6UO__A<`/A=_^___IY?[__P^V4W*#
-M^@>)]@^/UO[__XU$DWB#P@''`/____^#P`2#^@=^[^F\_O__,=+KXHVV````
-M`(V_`````%575E.#[#R+;"10BUT8BP.%P'5KBS4`````QD0D-`:%]G0QC7PD
-M-(M>"(7;="")]HM#"(E$)#B+0P2)?"0$QP0D`````/]08(L;A=MUXHLVA?9U
-MTXU%,,=%,)!=!`");33'13@`````B40D!(M%"(D$).C\____@\0\6UY?7<.)
-M!"2->P3H_/___XG&#[9#!(3`=3V`?@@!#X0_`0``QT4L_O____9&3!!TJ8U$
-M)!2+5E")1"0$BT9<B00D_U(\#[9$)"*(1DJ)-"3H_/___^N#+`%T$,=%+/[_
-M__^-="8`Z6____^`?@@$=K,/MD<!/`%T20^#W0$``(-]$!B-=@!UG(V.5`$`
-M`#'`Q@0(`(/``8/X$'7TBT<$C5<$B0&+0@2)002+0@B)00B+0@R)00R`CD@!
-M```$Z8<```"#?1!(#X58____C8YL`0``,<#&!`@`@\`!@_@$=?2+5P2-1P2)
-M$8M0!(E1!(M0"(E1"(M0#(E1#(M0$(E1$(M0%(E1%(M0&(E1&(M0'(E1'(M0
-M((E1((M0)(E1)(M0*(E1*(M0+(E1+(M0,(E1,(M0-(E1-(M0.(E1.(M`/(E!
-M/(".2`$```3VAD@!```$#X2$_O__B30DZ/S____I=_[__X!_`04/A[?^__\/
-MMD<!D(UT)@#_)(7L&```@WT0"9"-="8`#X68_O__QD0D-`D/MD<$B$0D.(U$
-M)#2+5E")1"0$BT9<B00D_U)@B44LZ7;^__^0@WT0"0^%9/[__\9$)#0%#[9'
-M!,9$)#D`B$0D.(U$)#2+5E")1"0$BT9<B00D_U)@B44L@$Y,$.DY_O__C70F
-M`(-]$`D/A23^___&1"0T!`^V1P3&1"0Y`(A$)#CKOHGV@WT0"0^%!/[__\9$
-M)#0##[9'!(A$)#CKHXVT)@````"#?1`)#X7D_?__QD0D-`+KWH-]$`D/A=/]
-M__^`3DR`QD0D-`#KR3P"=`S'12S^____Z=W^__^#?1`)#[:^'0(```^%I_W_
-M_XU#"(GZB40D"`^V0P@XPG0Z@'X(!(B&'0(``'8N@'XP`'0H,<F+5(Y(A=)T
-M$X!Z"`1V#0^VAAT"``"(@AT"```/MD8P@\$!.<A_VHGX/`)T#(".2`$```3I
-M;_[__XM4)`B`.@)TZ[E@@@0`B>J)\.CE9?__Z0?]__]55U93@^P,BVPD((M=
-M&(L#C7L$B00DZ/S___^)QHM#!*@!=#N-CE0!```QP(UT)@#&!`@`@\`!@_@0
-M=?2+1P2-5P2)`8M"!(E!!(M""(E!"(M"#(E!#(".2`$```2+!Z@"#X1^````
-MC8YL`0``,<"0Q@0(`(/``8/X0'7TBU<4C4<4B1&+4`2)402+4`B)40B+4`R)
-M40R+4!")41"+4!2)412+4!B)41B+4!R)41R+4"")42"+4"2)422+4"B)42B+
-M4"R)42R+4#")43"+4#2)432+4#B)43B+0#R)03R`CD@!```$]H9(`0``!'0(
-MB30DZ/S___^-13#'13"0700`B6TTQT4X`````(E$)`2+10B)!"3H_/___X/$
-M#%M>7UW#ZPV0D)"0D)"0D)"0D)"055=64X'LS````(NT).````"-7"00BWX8
-MBP>)!"3H_/___XU4)!R)Q8G8C;8`````Q@``@\`!.=!U]HU7!(U##,<#?`$`
-M`(E4)`3'1"0(L````(D$).C\____BT8(B>J)V>CZM___A<")PG0M@_C_=#.+
-M1AS'1C"0700`B78TQT8X`````(D0C48PB40D!(M&"(D$).C\____@<3,````
-M6UY?7</'1BS_____Z\2-=@!55U93@^P<BT0D,(E$)!2+0`2+,(N.*`$``(GP
-MBY9P`0,`B4PD&.AUYO__BVPD%(M%"(M-!(M0((M!(#G0<P*)T(E$)`2+`8D$
-M).C\____A<")QP^$B`$``(L5`````(72?A.+3"04BT$$.Y"\`0``#Y_`#[;0
-MQD=F`(ML)!2)5S0/MD5FA,`/A=8```"+1"04BU0D%(/`)(E'.(M"!(!/90*+
-MCF0!`P")1RB+;"04B<K!Z@D/MT5:#[==6"G#BX9L`0,`@^@!#Z_0.=-V`HG3
-M9H'[``%FB5]0=@9FQT=0``&+1"04@'@4``^$UP```/9'900/A,T```")P0^W
-M0%@QTHG-`T%0$U%4,=L/MT]0*<@/MTU:&=HQVRG(&=J)1TB)5TR`3V4(BTXD
-MBT0D&,='<$#^!`#'1VRP0P0`A<F)1RP/A`X!``"+3B"-5PR-1AR)5B")1PR)
-M3Q")$8/$'%M>7UW#/`,/A"+___^+3"04BT$(@$]E!(N>:`$#`(E'*(7;#X3>
-M````BXYD`0,`,>TQVXN&8`$#`(7)BP08=!6)PHG(Q@(`@\(!@^@!=?6+CF0!
-M`P"#Q0&#PPPYKF@!`P!WT.GE_O__BTPD%#'2#[=!6@-!4!-15(E'2(E73.E"
-M____BU0D%`^V0F:$P'5BBT0D%(M,)!2#P"2)1"0$BT$$B00DZ/S___^+;"04
-MBT4$BP#H"^7__XM$)!B+5"08QT`L_____\=`,)!=!`")0#3'0#@`````@\`P
-MB40D!(M""(D$).C\____@\0<6UY?7<,\`W6TZYB)?"0P@\0<6UY?7>G\____
-MBXYD`0,`Z3O^__^#["R)?"0DBWPD,(E<)!R)="0@B6PD*(M'+(M7*(LOB40D
-M%`^V1V:+LF0!```\`71#/`(/A`D!``"-1AC&1V8`QT88,`(%`(E^',=&(```
-M``")1"0$C44DB00DZ/S___^+7"0<BW0D((M\)"2+;"0H@\0LPP^W1EIF`T=0
-M.U8$9HE&6@^$MP(```^W1EIF.T98#X,Y`0``#[9'9<='/`````#'1S@`````
-M@^#]@\@$B$=EBU8(B5<HQD=F``^W1EH/MTY8BY5D`0,`*<&+A6P!`P#!Z@F#
-MZ`$/K]`YT78"B=%F@?D``6:)3U!V!F;'1U```8!^%`!T"O9'900/A5,"```/
-MMT9:,=(#1E`35E2)1TB)5TSV1V4"#X3;`0``BW4DA?8/A-`!``"+32"-5PR-
-M11R)52")1PR)3Q")$>D>____BT8$QD9G`8"@'`(``/Z+1@B`H!P"``#^BT8$
-M@*!)`0``]XM&"("@20$``/>+1@2+`.@XX___#[9&9H3`#X3D````/`,/A-P`
-M``")/"3H_/___XM4)!3'0BS_____B="#P##'0C"0700`B5(TQT(X`````(E$
-M)`2+0@B)!"3H_/___^F7_O__C;0F`````(NR9`$``(M&!(M6"(E$)!")5"08
-M#[9N9H!^%``/A(T```"+3EPQT@^W1EB+7F`IP8GH&=,L`8E.7(E>8`^$G`$`
-M`(GJ@/H"#X2N`0``BT9<"T9@#X6B````BU0D$(L"Z'SB__^)Z(3`#X19`0``
-M/`,/A%$!``")/"3H_/___XGPBUPD'(MT)""+?"0DBVPD*(/$+.GHE?__C48D
-MB40D!(M&!(D$).C\____Z0W___\/MT98,=N)ZHG!`TY<$UY@A-*)3ER)7F!U
-M?(M$)!"+4!@QVHE4)`B+4!2+1"0(,<H)T'4$QD9F`8M$)!B+4!@S2!0QV@G*
-M#X1>____BU0D$(L"Z-KA__^)Z(3`#X2@````/`,/A)@```")/"3H_/___XM4
-M)!3IIO[__XE\)#"+7"0<BW0D((M\)"2+;"0H@\0LZ?S___^)ZH#Z`W6;BT0D
-M$(M0&#':B50D"(M0%(M$)`@QR@G0=8'I[O[__Y"-="8`9CM&6`^";OW__V;'
-M1EH``.DT_?__#[=.6C'2#[=&6`-&4!-65#';*<@/MT]0&=HQVRG(&=J)1TB)
-M5TSIE/W__XU&)(E$)`2+1@2)!"3H_/___^E1____C48DB40D!(M&!(D$).C\
-M____Z9C^__^+1"00BU`8,T@4,=H)R@^%6_[__\9&9@#I4O[__XM$)!"+4!@S
-M2!0QV@G*#X4^_O__Z47^__^-M@````"-OP````!3BUPD"/9#90*+`\9#9@!T
-M'XM0)(72=!B+2""-4PR)4""#P!R)0PR)2Q")$5O#B?:)7"0(6^G\____C;8`
-M````4X/L"(M<)!"+`XN0<`$#`.CKW___BP.+2"2%R709BT@@C5,,B5`@@\`<
-MB4,,B4L0B1&#Q`A;PXE<)!"#Q`A;Z?S___^-M@````"-OP````"#["R+5"0P
-MB5PD'(ET)"")?"0DB6PD*(M:+(LKB[TH`0``BT<8BP")1"04BT(PB10DB40D
-M&.C\____@'L(!`^&C````(NS9`$``(7V#X3*````BT8$A<!T#+D"````,=+H
-M.ZW__XM&"(7`=`RY`@```#'2Z"BM__^+1A"+5@R)0@2)$(V%@````(ET)`2)
-M!"3H_/___XM<)!B#PP$[7"04=$.+1QB+5"08BT20"(D$).C\____B=J+="0@
-MBUPD'(M\)"2+;"0H@\0LZ>%;__^0B1PDZ/S___^+7"08@\,!.UPD%'6]C4<P
-MQT<PD%T$`(E_-,='.`````")1"0$BT<(B00DZ/S___^+7"0<BW0D((M\)"2+
-M;"0H@\0LP[D"````,=*)V.AVK/__Z6;___^0@^P<B5PD#(M<)"")="00B7PD
-M%(EL)!B+:P2+<PB+10")\HNX*`$``(GHZ`%!___'AF0!````````#[:5'`(`
-M`,>%9`$````````/MH8<`@``@^($@^#["="(AAP"```/MI4<`@``@^#]@^("
-M"="(AAP"```/MD4TB$8TC4<PQT<PD%T$`(E_-,='.`````")1"0$BT<(B00D
-MZ/S___^)="0$QP0D%0```.C\____BT,0BU,,QT,8H&@$`(E;',=#(`````"#
-MPQB)0@2)$(E<)`2+10")!"3H_/___XM<)`R+="00BWPD%(ML)!B#Q!S#58G5
-M5U93@^P,B00DBX!0`@``A<!T08M="(MU#(UT)@`Y<`1W*W($.1AS)8M(##M-
-M!(M0"'8-@\0,N`$```!;7E]=PW(+.U4`=^R-M@````"+0!"%P'7)BP0DB[@P
-M`@``!3`"``")1"0$.<=T18UV`(U/](!Y9`!U+HM92#'2#[=!4(MQ3`'8$?(Y
-M501W&7(%.44`<Q([=0QRG(VV`````'<%.UT(<H^+/SE\)`2-=@!UOHL4)(NZ
-M.`(``('".`(``(E4)`@YUW43ZUB0C70F`#R`=!.+/SM\)`AT1XU/]`^V062$
-MP'7IBUE(,=(/MT%0BW%,`=@1\CE5!'?8<@4Y10!ST3MU#`^"*O___XUT)@!W
-MPCM="`^"&____XL_.WPD"'6Y@\0,,<!;7E]=PXUV`(/L"(D<)(M<)`R)="0$
-MBW0D$(G8B?+HM?[__X7`=1R+@U`"``")1A`QP(FS4`(``(L<)(MT)`2#Q`C#
-MBU8<N/____^%TG3IBY-4`@``C8-4`@``A=)T"HU"$(M2$(72=?:),+C_____
-MZ\:-M@````"#[!");"0,BVPD%(D<)(M,)!B)="0$B7PD"(N%4`(``(V54`(`
-M`#G(=!"-M@````"-4!"+0!`YR'7VBUD4C7D4BT$0B[5,`@``.=^)`L=!$```
-M``!T%8M1&(L&B7,$B1Z)4`2)`HEY&(EY%(M%`,=`-`$```"+'"2+="0$BWPD
-M"(ML)`R#Q!##D(VT)@````"+5"0$BTPD"(L"A<!T"HM"!(E("(E*!,.)2@2)
-M"L.)]HM$)`2#P"R)1"0$Z?S___]3@^P(BUPD$(M30(72=!.+0T3'0T``````
-MB1PDB40D!/_2BT-PB5L8QT,<`````(E#%(U#%(E$)`2+`X/`+(D$).C\____
-M@\0(6\.0C70F`(/L'(E<)!2+7"0@B70D&(MS*(D<).C\____BT,0C4L,BU,,
-M@ZXD`@```8.N(`(```&)0@2)$(M#/(E+#(E+$(7`=`R)1"0$B30DZ/S___^+
-M7"04BW0D&(/$',.0C70F`%575E.#["R+="1`BWPD1(M.+(M&2(M63(M9:(E$
-M)!B)5"0<BT%(BU%,A=N)1"0@B50D)`^W=E`/A*,````/MD%E#[=4)$B#X`$/
-MML`YT`^$C````(M,)!@K3"0@BRO!X0DYZ8GH<POIH0```(UT)@")T(/#$(G"
-M`Q,YT7/SBRLIP0^W]L'F"8G(B<HQR0-3"!-+#"G%.>Z)5PB)3PR-3Q")+W8F
-MBT,8BU,<*S?'1P0`````B<^)00B+0Q"#PQ")40R)`8/!$#GP<MJ)-[@!````
-MQT<$`0```(/$+%M>7UW#BT%LA<!T'(M4)$B)?"0$B0PDB50D"/_0A<!T!XG[
-MZ5'___^#Q"PQP%M>7UW#,<#I:____XVV`````(V_`````%575E.#["R+="1`
-MBT8HB40D((!^9``/A;8```"+3"0@,=*+?D@/MT90BVY,BYE0`@```?@1ZH7;
-M#X0B`0``#[9.98/A0(3)=`J#>R@`#X0"`0``.5XX#X3Y````.U,$D`^"[P``
-M`'<..P.-M@`````/AM\````[:PR-M"8`````#X?/````#X/`````BTL8C58,
-MC4,4B5,8B48,B4X0B1&#Q"Q;7E]=PXM4)!R+3"0@BT((@ZD@`@```8E&*(.`
-M(`(```&)1"0@@'@(!`^'4P(``(M<)""+3"0@BY,P`@``@<$P`@``.<IU(XL&
-MB4X,QT`T`0```(U&#(E!!(F#,`(``(E.$(/$+%M>7UW#@WXT``^%Z@$``(M$
-M)""+F#0"``"->_2+1S2%P`^(PP(``(M4)""-1@R)3@R)`XF"-`(``(E>$(/$
-M+%M>7UW#.WL(#X(W____BUL0A=L/A>7^__^+3CB%R0^$#`(``(M,)""`>0@$
-M#X99____BUPD((N;9`$``(7;B5PD'`^$E@$``(![9P`/A8P!``#V1F4(#X6"
-M`0``@7YP``X%``^$=0$``(M,)"`[2P0/A6@!``"`>Q0`#X1%`@``BTM<BUM@
-MB4PD"#G=B5PD#`^'R_[__W((.<\/@\'^__\[5"0,D(UT)@!W%`^"+0$``#M$
-M)`B-="8`#X8?`0``BT8$@T`(`8D$).C\____BU0D'(E$)"2+!HM<)"2)`XM&
-M!(E#!(M&-(E#-(M"!(M,)"2)>4B):4R+7"0<B4$HB7$LQT%L\`<%``^W0US'
-M07``#@4`QD%F`,=!:`````!F*?AFB4%0#[9690^V066)TXG1@^.`@^`_@^%`
-M"=@)R(G3@^,P@^#'B=$)V(/A"`G(B=&#X02#X/F#X@()R`G0#[9698/@_H/B
-M`0G0BU0D)(A"98M&.(7`#X2V`0``B4(XBUPD'(U6#(M#!(N(/`(``(F0/`(`
-M``4X`@``B48,B1'&1F2`BT0D)(E.$(E$)$"#Q"Q;7E]=Z?S___\/CLL```"-
-M1@R)0@2)3A"+3"0@B58,B8$P`@``@\0L6UY?7</V1F4$#X2C_?__BU0D(/:"
-M20$``"`/A)+]__^`HDD!``#?Z/S___^+3"0@@(E(`0``!(E!*(L&QX"(`0,`
-M`0```(M!0`E!.(M!1`E!/.E;_?__]D9E0`^%ZOW__XM,)""+F50"``"%VW49
-MZ=?]__\[>P@/@N_\__^+6Q"%VP^$P_W__SM3!'+PC78`=P0[`W;G.VL,C;0F
-M`````'?;#X+$_/__D(VT)@````#KPHM<)""-1@R)3@R+DS0"``")@S0"``")
-M`HE6$.D3_?__BU,$C48,@T<T`8E#!(E>#(E6$(D"Z?G\__^+7"0<BTM<BUM@
-MB4PD$#G:B5PD%`^"@OS__W<(.<@/AGC\__\[;"04<A`/A^G^__\[?"00#X/?
-M_O__BT8$@T`(`8D$).C\____BU0D'(E$)"2+!HM<)"2)`XM&!(E#!(M&-(E#
-M-(M"".F[_?__BTPD),=!.`$```#I/?[__XVT)@````!3@^P(BUPD$(M#*(.`
-M(`(```&+0SR%P'0JQT`<`````(E8(,=`)`````")1"0$BT,HB00DZ/S___^%
-MP'43BT,\B4,XB5PD$(/$"%OI_/___X/$"%O#C70F`(V\)P````"#["R)="0@
-MBW0D,(E<)!R)?"0DB6PD*(M&*(M>+(E$)!B+N&0!```/MT90#[=K4&:)1"06
-M@'YF`71'#[9&9L9#9`"(0V:)="0$BT,$B00DZ/S___^+0P2#:`@!BT<$@X`D
-M`@```8MT)"")7"0PBWPD)(M<)!R+;"0H@\0LZ?S___^+5DR+2TR+1D@S0T@Q
-MT0G!=:>+1B"+5B2%P'0.C78`Q@(`@\(!@^@!=?6+1P0[1"08=#B)1BB+5V"+
-M1UR)5DR)1DAF*VPD%L9&9@!FB6Y0BUPD'(ET)#"+?"0DBW0D((ML)"B#Q"SI
-M_/___XM'".O#ZPV0D)"0D)"0D)"0D)"055=64X/L'(M$)#"+3"0P@\`,B40D
-M$(M$)#"#P1R)3"0,@\`LB40D"(M,)##'030`````ZQV+0@B%THM,)#")02QT
-M+8M"!,=""`````")!"3_$HM$)#"+4"P[4#!UUX72QT`P`````,=`+`````!U
-MTXM$)#"+3"00BT`,.<B)1"04#X0S`@``QT0D&`````"+="04@>XH`@``BX8@
-M`@``A<!U$(M$)!3VAAP"```@C7@(=`^+3"04QT0D&`$```"->0B-KC@"``"+
-MCC`"```Y^71_BQ&)RXM!!(/K#(E"!(D0B4D$B0ET:0^VEAP"``#VP@$/A#@!
-M``"+AB0"``"%P'0/BX9$`@``.T,T#X^&`0``@^(8#X5]`0``BT,TB6L,@X8D
-M`@```8F&1`(``(N&/`(``(F./`(``(D(B4,0BT8$B1PD_U`@BXXP`@``.?EU
-M@8V^2`(``(N.2`(``#GY=%F+$8G+BT$$@^L,B4($B1")202)"71#BT,\A<!T
-M*L=`'`````")6"#'0"0`````B40D!(M#*(D$).C\____A<!UM8M#/(E#.(D<
-M).C\____BXY(`@``.?EUIXN^5`(``(7_="B-OE0"``"-M@````"+'X7;=!:)
-MVHGPZ`'T__^%P'1]C7L0BQ^%VW7JBT0D%(M,)!"+`#G(B40D%`^%C?[__XM<
-M)!B%VP^$K````(M,)#"+42R%T@^%"_[__XM!-(7`#X4`_O__@\0<6UY?7</&
-M0V8"BX8\`@``@X8D`@```8F./`(``(EK#(E#$(D(B1PDZ/S____I;/[__XUT
-M)@"+0Q")!XN&4`(``(E#$(U#'(F>4`(``(E$)`2+1"0(B00DZ/S___^+3"0P
-MQT$T`0```.DY____BX8P`@``C5,,B5`$B7L0C;Y(`@``B4,,B98P`@``Z9W^
-M__^+1"0PBXB(`0,`A<ET'^MMBT((BTPD,(E!)(72=$V+0@3'0@@`````B00D
-M_Q*+3"0PBU$D.U$H==?'02@`````QT$D`````.O1BT$$BQ&)0@2)$(G(@^@,
-MB0F)200/A/'^__^)!"3H_/___XM$)#"+2!P[3"0,=='IU_[__\>`B`$#````
-M``")!"3H_/___^N<D(UT)@"#[`R)7"0$BUPD$(ET)`B+,XM&)(7`="B+3B"-
-M4PR-1AR)5B")0PR)2Q")$8ET)!"+7"0$BW0D"(/$#.G\____B1PDZ/S____K
-MXI"0D)"0D%4Q[5=64XM\)!B+="04B?@)\'0?B?&)^X/%`8/!_X/3_XGPB?HA
-MR"':B<:)T(G7"?!UX8GH6UY?7<.-M@````!55U93@^P,BW0D((M&#(E$)`B+
-M7CR+3CB)V`G(=0WVAD@!```"#X7:````,?^+1D"+5D0)R`G:B50D!(D$).C\
-M____BU8$#[92!@'X.=!^7("F'`(``/[VAAP"```!=$2+1"0(A<!T/(M<)`@/
-MME,PA-)T,(M$)`BY_O___[O_____.7!(=&TQP.L2D(UT)@"+7"0(#[;(.72+
-M2'0^@\`!.-!U[(/$#%M>7UW#BVX\BWXX@(X<`@```8GI"?ETF(M>1(M.0#'K
-M,?F)V`G(=4R`ID@!``#]Z7S___\QP#'2]L$@#Y3`#Y7"T^+3X(G3B<'WT_?1
-MBT0D""%(0(G&(5A$Z0;___^+1@2`>`<!#X49____#[9X!ND2____B=J)R"'J
-M(?B)T0G!#X0J____@(Y(`0```ND>____C;0F`````%93BT@,B<,/MG$PB?"$
-MP'0A,<`QTCE92'4/ZQN-="8`#[;".5R!2'0.@\(!B?`XPG7NN/\```!;7L.-
-MM@````!75HG&4XMZ)(7_=$.+1Q2%P'0VBT`,A<!T+SGP=#4/ME`PA=)^[3';
-MBTR82(7)=`J`>0@$=@0Y\709@\,!.=J0?^:+0`R%P'71BS^%_W6],<#K!;@!
-M````6UY?PXUT)@!75E.#[!R+7"0LBW0D,(M\)#2`>P@$=GS'1"08`````,=$
-M)!0!````#[9+,(7)?A^+4T@QP(72=`_K=)"-="8`BU2#2(72=6>#P`$YR'7Q
-MBU,$@'H%`'0A#[9#,`^V4@8IT`^O1"04B40D%`^W0S([1"08=@2)1"08A?9T
-M!HM$)!B)!H7_=`:+1"04B0>#Q!Q;7E_#A?9T!L<&`````(7_=.O'!P$```"#
-MQ!Q;7E_#C40D%(E$)`B-1"08B10DB40D!.C\____BU,$@'H%`'2IZX:-M"8`
-M````C;PG`````%.#[!R+7"0DC40D%(E$)`B-1"08B40D!(M#!(D$).C\____
-MC40D#(E$)`B-1"00B40D!(M#"(D$).C\____BTPD%#M,)`P/ET,4BU0D&(M$
-M)!`YT',"B=`/K\%FA<!FB4-D=09FQT-D@`"#Q!Q;PY"#[!B);"04BVPD'(M4
-M)"")7"0(B70D#(E\)!`/MD4(.D((=!RX`0```(M<)`B+="0,BWPD$(ML)!2#
-MQ!C#C78`#[=%,&8[0C!UVH!],``/A+,```"+34B+4DB%R73&,?^%TG3`@'D(
-M!'8]@'H(!(GV=K*)5"0$B0PDZ/S___^$P'6B#[9%,(/'`3GX?GJ+3+U(BT0D
-M((7)BU2X2'2'A=)T@X!Y"`1WPX!Z"`20C70F``^';O___XM!)#M")`^%8O__
-M_XMQ,(M:,(M6"(M+"(M&!#-#!#'1"<$/A4;___^+5A`[4Q"+1@P/AS?___]R
-M"3M##`^'+/____:%2`$```.0=(#I'?___S'`Z1O___^)]E.#[`B+5"00BUH$
-MBT((A=MT+H7`=&[V@QP"```!=36`H!P"``#^@*,<`@``_L=#'/_____&0F<!
-M@\0(6\.-=@"%P'3P@*`<`@``_L9"9P&#Q`A;P_:`'`(```%TPL9"9P"`BTD!
-M```$@(A)`0``!(D4).C\____B5PD$(/$"%OI_/___X"C'`(``/[&0F<!@\0(
-M6\.-M@````"-OP````!55U93@^PLBUPD0(M$)$2)1"00#[93,(72#XZ_`0``
-MQT0D%`````#II0```(UT)@"%P(E=#'0'QT`,`````(M$)!3'@TP!````````
-MQX-0`0```````(EL@T@/MI-(`0``B="#R`JH((B#2`$``'0)@\J*B)-(`0``
-M#[9,)!0QP#'2]L$@#Y3`#Y7"T^+3X`E3//?2"4,X]]`A4T0A0T"+3"00A<D/
-MA$0!``"`BT@!```$BU0D$(72#X4@`0``@T0D%`$/ME,P.U0D%`^.#0$``(M,
-M)!2+1(M(A<!T"?:`'`(```%UV(ML)!"%[0^%/O___XM#!`^V0`8IPHG0P?@?
-MB50D"(E$)`R+0Q2+4QB)!"2)5"0$Z/S___^)1"0@BP.)5"0DBW`,@\`,.<9T
-MD,=$)!C_____QT0D'/_____K"XL#BS:#P`PY\'19C;[8_?__]H<<`@```73F
-M@'\(`77@]D=,!'3:B?J)V.@Q^___A,!US8M7+#E4)"2+1RAWP9!R!CE$)"!W
-MN#M4)!R-="8`=ZX/@[,```")_8E$)!B)5"0<ZYR%[0^$$O____:#20$```)T
-M7XM%)(7`=!6-="8`BW`4A?8/A?/^__^+`(7`=>^+3"04BT2+2.E2_O__]H-(
-M`0``"'4=@\0L6UY?7<.);"0$QP0D!P```.C\____Z:?^__^)7"1`@\0L6UY?
-M7>G\____BU0D((M,)"2)+"3'1"0,`````(E4)`2)3"0(Z/S___^%P(G%#X2`
-M_O__BU0D%(M$DTCIY?W__SM$)!@/@^O^___I/O___XVV`````%575E.![!P"
-M``"+M"0P`@``@'X(!'8'@*9(`0``^_:&'`(```%T5H!^"`1V6X!^,`!T2C';
-MBTR>2(7)=#4/MI8<`@``#[:!'`(``(/B`H/@_0G0B($<`@``BU2>2(!Z"`1V
-M!P^V1C2(0C2)%"3H_/___P^V1C"#PP$YV'^X@<0<`@``6UY?7<.+1B2)1"08
-M]H`<`@```0^$1`,``(MN##'_A>UT"XM]#(7_#X1H`P``C5PD'(G8Q@``C90D
-M'`(``(/``3G0=>^%_\<#]!9X6@^$+`,``(M')(E#!(M'+(F#Q@```/:&'`(`
-M``)T!(!+%@&%_P^$%@,``(/]`1G`@\`"B$,8BX]D`0``A<ET-HL!BU%@B4,(
-MBT%<B5,0#[93%HE##`^V012#XOV#X`$!P`G"B%,6.7D(#X3M`@``#[9!9HA#
-M%`^V1S2%[8B#Q0````^VAQT"``"(0Q>+1Q2+5QB)0QF)4QT/MD<(B$,A#[9'
-M,(A#(HGH#X2G`@``Z'_X__\/ME,E@^+[B$,C#[9',8A#)`^VAT@!``"#X`'!
-MX`()PHA3)?:'2`$```)T!H/*`8A3)8M'.(U+28M7/(F#K0```(F3L0```(M'
-M.&:)0R>+ATP!``"+EU`!``")0RF)4RV+1RB-EU0!``")@[T```"+AU0!``")
-M0TF+0@2)002+0@B)00B+0@R-EZP!``")00R+AV@!``"-BYT```")0UF+AZP!
-M``")@YT```"+0@2)002+0@B)00B+0@R)00R+EVP!``"-AVP!``"-2UV)4UV+
-M4`2)402+4`B)40B+4`R)40R+4!")41"+4!2)412+4!B)41B+4!R)41R+4"")
-M42"+4"2)422+4"B)42B+4"R)42R+4#")43"+4#2)432+4#B)43B+0#R)03R%
-M[0^$AP```(M%%(M5&(E#,8E3-0^V10B(0SD/MD4PB$,ZB?#H+??__P^V4SV#
-MXON(0SL/MD4QB$,\#[:%2`$``(/@`<'@`@G"B%,]]H5(`0```G0&@\H!B%,]
-MBT4XBU4\B8.U````B9.Y````BT4X9HE#/XN%3`$``(N54`$``(E#08E318M%
-M*(F#P0```(D<).C\____B1PDQT0D!``"``#H_/___XE<)!#'1"04`````,=$
-M)`P!````]]B(1"0QBT8HBU8LB40D!(E4)`B+1B2)!"3H_/___XM,)!B+03B+
-M43R)7"00QT0D%`````#'1"0,`0```(G!`TXHB=,37BR!P0#X__^#T_\%``#^
-M_X/2_R4``/[_*<$9TXE,)`2)7"0(BT8DB00DZ/S___^+=B2)="08BT0D&/9`
-M3!`/A(_\__^)!"3H_/___X'$'`(``%M>7UW#,<#'0P0`````Z<_\___&0Q@`
-MZ9+^__^)Z#'MB<?IC?S__XGPZ5+]__^#R@2(4Q;I"/W__XUT)@"-O"<`````
-M5E.#[`2+1"00BU@,C7`,.?-U".LYBQLY\W0SC9/8_?__@'H(!';N]H)(`0``
-M!'3EBT(,A<!T"8G"BT(,A<!U]XD4).C\____BQLY\W7-@\0$6U[#C;8`````
-MC;\`````5U93@^P0BUPD(.L&C70F`(G#BT,,A<!U]^C\____B[MD`0``A?^)
-M0R1T*HMW!#G>=$CH_/___X7VB0=T&(UV`.C\____B48D.T,D=/.)-"3H_/__
-M_XD<).C\____BT,$BT@\A<ET#(E<)""#Q!!;7E__X8/$$%M>7\.+=PCKLY"#
-M["R)="0@BW0D,(E<)!R)?"0DB6PD*`^V1@B#Z`4\!0^'Z@````^VP/\DA009
-M```/MT8R,=+WV(/2`/?:(89,`0``(990`0``]H8<`@```0^%Q@$``(M^0(MN
-M1(GH"?AU"(M&.`M&/'16@'X("@^$T@$``("F2`$``/Z)Z@GZ=#^+1D"`CDD!
-M```@"T9$=##VAAP"```!='>+?@R%_W0)]H<<`@```70CQT0D!`````")-"3H
-M_/___XVT)@````#VAAP"```!=$>+?@SVADD!```$=3[VAD@!```#=#6+1CB+
-M5CR)1"00B50D%`G"#X5_`0``A?]T"?:''`(```%T&H".2`$```B)-"3H_/__
-M_XM^#(7_#X38````BUPD'(MT)""+?"0DBVPD*(/$+,,Q_S'M@'XP`'42Z]60
-MC70F``^V1C"#QP$Y^'Y$BUR^2(7;=.V`>P@$=N>)'"3H_/____:#2`$```1T
-M!X".2`$```0/MH-(`0``@^`#/`)UP0^V1C"#QP&]`0```#GX?[R%[0^$>?__
-M_X"F2`$``/XQVX7`?QOI9____XVT)@`````/MD8P@\,!.=@/CE'___^+5)Y(
-MA=)TZ8!Z"`1VX_:"2`$```%TV@^V@D@!``"#X+Z#R`*(@D@!``")%"3H_/__
-M_^N]]H9(`0``!`^$&____XET)#"+7"0<BW0D((M\)"2+;"0H@\0LZ?S___^+
-M;D2+?D")ZHGX]](C5CSWT"-&.(G1"<$/A"+^__^`CD@!```"Z1;^__\/MDXP
-M,<`QTH/I`?;!(`^4P`^5PM/BT^"+3CPS1C@QT0G!#X4&_O__Z0C^__^+7D2+
-M1D")V8G"]]$C3"04]](C5"00B<@)T`^$@/[__^E<_O__D(VT)@````"#["R)
-M?"0HBWPD,(M4)#2)7"0@B70D)(GXZ&+R__^$P'5>BT<4BU<8B40D&(M'!(E4
-M)!P/MD\P]H=)`0```@^V4`9T43'`]H=(`0``!'41BUPD((MT)"2+?"0H@\0L
-MPY")/"3H_/___XM<)"`QP(MT)"2+?"0H@\0LPXVV`````(M<)""X_____XMT
-M)"2+?"0H@\0LPP^VP0^VTBG0B<+!^A_'1"0,`````(MT)`R)1"0(BT0D&(E4
-M)`R+5"0<B00DB50D!.C\____B70D#(E4)`B+5"0TB40D!(D4).C\____A<!T
-MFHE$)`2)/"3H_/___^E-____B?:-O"<`````55>)UU93C11)@^P,C2S7B4PD
-M"`^V52&)!"2)5"0$Z/S___^%P(G&#X1T`0``@*`<`@``_@^V1Q>(AAT"``"+
-M1P2)1B2+A\8```"%P(E&+'4&BT<$B48L#[:'Q0```(U=$(A&-`^V4Q4/MH9(
-M`0``P.H"@^(!@^#^"="(AD@!``"+12F+52V)ADP!``")EE`!``"+5"0(BX27
-MO0```(E&*`^V322X`0```-/@B$XQ9HE&,HM#"8M3#8E&%+C_____B588#[9-
-M(KK_____@/D_B$XP#X;8````B59$C5=)B49`BT=)C8Y4`0``B894`0``BT($
-MB4$$BT((B4$(BT(,C9>=````B4$,BT=9C8ZL`0``B89H`0``BX>=````B8:L
-M`0``BT($B4$$BT((B4$(BT(,B4$,BU==C4==C8YL`0``B99L`0``BU`$B5$$
-MBU`(B5$(BU`,B5$,BU`0B5$0BU`4B5$4BU`8B5$8BU`<B5$<BU`@B5$@BU`D
-MB5$DBU`HB5$HBU`LB5$LBU`PB5$PBU`TB5$TBU`XB5$XBT`\B4$\@\0,B?!;
-M7E]=PY"-="8`,<`QTO;!(`^4P`^5PM/@T^*#P/^#TO_I#/___XUT)@"![&P"
-M``"+A"1P`@``C4PD6(F<)%P"``"+E"1P`@``B;0D8`(``(NT)'`"``")O"1D
-M`@``B:PD:`(``(L`B40D/(MZ)(M'.(M7/(E,)!#'1"04`0```,=$)`P!````
-MB<$#3BB)TQ->+(D\)('!`/C__X/3_P4``/[_@]+_)0``_O\IP1G3B4PD!(E<
-M)`CH_/___X7`B<8/A`P!``"+G"1P`@``C4PD6,=$)!0!````B4PD$,=$)`P!
-M````BT,HBU,LB40D!(E4)`B+0R2)!"3H_/___X/X_XG%=$6-3"18B0PDZ/S_
-M__^!?"18]!9X6@^$\0```+C_____BYPD7`(``(NT)&`"``"+O"1D`@``BZPD
-M:`(``('$;`(``,.-=@"%]G71BT<XBU<\QT0D%`$```#'1"0,`0```(E$)""+
-MA"1P`@``B50D)(M,)""-5"18BUPD)(E4)!"+5"0D`T@H$U@LBT0D(('!`/C_
-M_X/3_P4``/[_@]+_)0``_O\IP1G3BY0D<`(``(E,)`2)7"0(BT(DB00DZ/S_
-M__^%P`^$./___^E-____C40D6(D$).C\____@7PD6/06>%IT"K[^____Z=3^
-M__^-5"18QT0D!``"``")%"3H_/___X3`#X2X_O__Z]B-7"18QT0D!``"``")
-M'"3H_/___X3`#X7S_O__A>T/A3L&``"%]HUT)@`/A80&``"`?"1Y!`^&U/[_
-M_X!\)'I`#X?)_O__@+PDD@```$`/A[O^__^+="0\,=*+G"0)`0``#[=$)'^+
-MC"0%`0``"=.+5@R)7"1$"<&)3"1`B?&#P0PYRG0=C;K8_?__@'\(!'8+BT<,
-MA<`/A)$&``"+$CG*=>.+1"0\,<F-5"18Z)G[__^%P(G'#X14_O__#[:72`$`
-M`(G0@^+]T.@*1"1]@^`!`<`)PHM'.(B72`$``(M7/(E$)"B)5"0L#[9',,=$
-M)!C_____QT0D'/____\\/W<EB<&)SL'N!8/F`8GS@_,!T^/3YHE<)!B#1"08
-M_XET)!R#5"0<_XM$)$"+3"0H(T0D&(M4)$0C5"0<"<&)3SB+1"0L"=`/MI=(
-M`0``B4<\#[9$)'V#X@'`Z`*#X`$XPG0B#[:72`$``(M'!(/B_HB72`$``(!X
-M!@!T"8/*`HB72`$``(M$)&"%P'1BBX]D`0``@(])`0``!(7)#X35`P``@'D4
-M``^$?P0``(M4)&@Y46"+1"1D=P=R$SE!7'8.B4%<B5%@#[9$)&R(06;V1"1N
-M!`^$BP,``(M1"(72#X1S`P``BT$$.<(/A%<#``"+1R@[A"05`0``#X0.`P``
-M@(](`0```L>'3`$```````#'AU`!````````#[:7'`(``(G0@^+]T.@*1"1N
-M@^`!`<`)PHB7'`(```^V1"1[@'PD<`$/AEL"```/MMB+=)](A?8/A"0"```/
-MMI8<`@``B="#XOW0Z`I$)&Z#X`$!P`G"B)8<`@``#[:62`$``(G0@^+]T.@*
-MA"25````@^`!`<`)PHM&.(B62`$``(M6/(N,)!$!```/MYPDEP```(E$)%")
-M5"14BY0D#0$``(E,)$R)5"1(#[9.,,=$)##_____QT0D-/____^`^3]W(S'`
-M,=+VP2`/E,`/E<+3X-/BB40D,(-$)##_B50D-(-4)#3_BTPD,`^WPS'2"T0D
-M2(M<)#0+5"1,(<&+1"10(=,/MI9(`0``"<B)1CB+1"14@^(!"=B)1CP/MH0D
-ME0```,#H`H/@`3C"="(/MI9(`0``BT8$@^+^B)9(`0``@'@&`'0)@\H"B)9(
-M`0``#[:,)),```"+;(Y(A>T/A93[__^+E"1P`@``BT8HB52.2#N$)!D!``")
-M<@P/A*<```"`CD@!```"QX9,`0```````,>&4`$````````QP#'2]L$@#Y3`
-M#Y7"T^+3X/?2]]`A5D0A1D")-"3H_/___P^VAD@!``"H$'4-J"!T'8/(@(B&
-M2`$``,>&3`$```````#'AE`!````````]H<<`@```70MBX=D`0``A<!T(XM0
-M!(72=!R+0`B%P'05.==T`HG0B00DZ/S___\QP.G;^O__,<#IU/K__XN4))T`
-M```YEE`!``"+A"29````#X):____=PPYADP!```/ADS___^)ADP!``")EE`!
-M``#I.____XM$)#RY`0```(U4)%CHO_?__X7`B<8/A'KZ__^)>`R)1)](Z;3]
-M__\/ML@QTHN<)'`"```QP/;!(`^4P`^5PM/BT^#WTO?0(5=$(4=`B5R/2(E[
-M#(D\).C\____#[:'2`$``*@0=1&H(`^$&____X/(@(B'2`$``,>'3`$`````
-M``#'AU`!````````Z?G^__^+E"2%````.9=0`0``BX0D@0````^"\_S__W<,
-M.8=,`0``#X;E_/__B8=,`0``B9=0`0``Z=3\__^X_____\=!!`````#IP/G_
-M_XM!!(GZB7D(Z8/\__^+002%P`^$XP```(M1".EP_/__BW0D/(M&%(GS@\,4
-M.=AT*(M4)&"-2/0Y4/1T#HL`.=AT%CE0](U(]'7RA<F)CV0!```/A?/[__^+
-M1"0\@^B`B00DZ/S___^%P(G!B8=D`0``#X1$^?__,<#&!`@`@\`!@_AH=?2+
-M5"0\BW0D/(E9#(M"&(U1#(E6&(D0BU0D:(E!$(M$)&")`8M$)&2)46")05P/
-MMD0D;(A!9O9$)&X"#X2&^___BX=D`0``QD`4`>EW^___BU0D:#E18(M$)&0/
-MAY+[__\/@G[[__\Y05P/@X/[__^)]NEN^___BU$(B?B)>02-=@#IA?O__XUT
-M)%B)-"2-7"18Z/S___^+C"1P`@``C40D6,=$)!0`````B40D$,=$)`P!````
-MBT$HBU$LB40D!(E4)`B+022)!"3H_/___XD<).C\____Z7SY__^-="18B30D
-MZ/S___^+1SB-3"18B[0D<`(``(M7/(E,)!#'1"04`````(G!QT0D#`$````#
-M3BB)TQ->+('!`/C__X/3_P4``/[_@]+_)0``_O\IP1G3B4PD!(E<)`B+1B2)
-M!"3H_/___XU$)%B)!"3H_/___^D#^?__BT<D.T0D7`^%8OG___:''`(```%U
-M=X!\)'`!#X9M^?__#[9$)'N+=(=(A?8/A%SY___VAAP"```!#X1/^?__BTXX
-MBX0D#0$``(M>/(N4)!$!```)R`^WC"27````"=HQVPG:"<B)5"0$B00DZ/S_
-M__^+5@0/ME(&.=`/C@[Y__^)/"3H_/___^GH^/__BT0D0(M4)$0+5SP+1SB)
-M5"0$B00DZ/S___^+5P0/ME(&.=!_SNE?____C;8`````55<Q_U93@^P,BT0D
-M((MH#(E$)`@/MD4PA,`/MO`/A(`"``"+5"0(,<DQVSE52'46Z6X"``"-!(T`
-M````BU0D"#E4!4AT$H/!`8/3`(G(B=HQ\#'Z"<)UW3'`,=+VP2`/E,`/E<+3
-MXM/@"45`"55$B2PDZ/S____VA1P"```!#X7&````BT4,A<`/A.,!``"+0`2)
-M+"3_4"0QR3';@'TP`'1GC02-`````(M4!4B%TG1"]H(<`@```70Y@'H(!'8S
-M#[:R2`$``(GP@^"/B()(`0``.U0D"`^$HP$``/:"2`$```%T#H/FCH/.`HGP
-MB()(`0``@\$!#[9%,(/3`#'2.=IWGP^#1P$``(N%9`$``(7`#X0P`0``BU`$
-MA=(/A"4!``"+0`B%P`^$&@$``#G5=`*)T("@'`(``/Z)1"0@@\0,6UY?7>G\
-M____#[:%2`$``(/@OZ@@B(5(`0``=!V#R("(A4@!``#'A4P!````````QX50
-M`0````````^VM4@!``"+742+34")\(/@_HG:B(5(`0``]]*)R"-5//?0(T4X
-MB=$)P74+@^;LB?"(A4@!``"+=0R%]@^$JP```("F2`$``/XQR3';,?^`?C``
-M#X24````C02-`````(M4!DB%TG0P]H(<`@```70G@'H(!'8A]H)(`0```708
-M#[:"2`$``+\!````@^"L@\@"B()(`0``@\$!#[9&,(/3`#'2.=IWL7,XBYUD
-M`0``A=L/A'P```#VA4@!```$=5.%_W59@(U)`0``((/$#%M>7UW#D#G(#X=*
-M_O__Z:S^__\YR)`/AV[____KO3'_C;8`````Z[.)+"3H_/___^D9_O__@^:,
-MB?"(@D@!``#I9/[__XDL).C\____ZZ>)+"3H_/___^N=N`$````QTNFZ_?__
-MBT4,A<!T#HN(9`$``(7)#X5O____BU4<A=)X%<=$)`0`````B2PDZ/S____I
-M4____X7`#X1+____BT`<A<"-=@!YV>D\____D)"0D)"0D)"0H0````"%P'0R
-M,<F0C70F`(!X"`&+`(/9_X7`=?.%R70:H0````")PL'Z'\'J%`'"P?H,B=#!
-M^A_W^<.+%0````")T,'X'\'H%`'0P?@,PY#SPXVT)@````"-O"<`````BTPD
-M!(M4)`B+@?P```")0@R)D?P```##D(VT)@`````QP,.-M@````"-O"<`````
-M5U93@^P0BWPD((N'[````,>'%`$```````"-M@````"+MP`!``"%]G0Y.09W
-M9#FW!`$```^$BP```(M&$(F'``$``(M&",=&$`````")!"3_5@2+MP`!``"+
-MA^P```"%]G7'/7\!``!W(8N?_````(7;=!?'1"0$`````(L#B00D_U,$BUL,
-MA=MUZ8/$$%M>7\.+G_P```"%VW3OC70F`(L&B40D!(L#B00D_U,$BUL,A=MU
-MZXN'[````#L&#X-=____Z\;'AP0!````````QX<``0```````.EE____B?96
-M4X/L%(MT)""+GOP```"%VW07QT0D!/____^+`XD$)/]3!(M;#(7;=>DQP(-^
-M+``/E<"#Q!1;7L.-M"8`````4X/L"(M<)!"+@Q0!``"%P'4YC8,(`0``QX,(
-M`0``$#(%`(F;#`$``,>#$`$```````")1"0$C4,LB00DZ/S____'@Q0!```!
-M````@\0(6\.#[`R+5"00BTPD%(N"``$``(7`=""+@@0!``")2!")B@0!``")
-M%"3H_/___[@!````@\0,PXN"[````#L!<PZ)B@0!``")B@`!``#KUXM!"(D$
-M)/]1!#'`Z]>-M@````"+1"0$!>0```")1"0$Z?S___^-M"8`````C;PG````
-M`(M$)`0%Y````(E$)`3I_/___Y"0D)"0D)"0D)"0D)"04XM<)`@/MD,4B<*#
-MX/L*4Q6#X@0)T`^V4Q6)P8/@_H/A`8/B`0G*"="(0Q0/MD,DB<*#X/L*4R6#
-MX@0)T`^V4R6)P8/@_H/A`8/B`0G*"="(0R1;PXUT)@"-O"<`````4XM<)`@/
-MMD,EB<*#X/L*4R:#X@0)T`^V4R:)P8/@_H/A`8/B`0G*"="(0R4/MD,]B<*#
-MX/L*4SZ#X@0)T`^V4SZ)P8/@_H/A`8/B`0G*"="(0SU;PP``````````````
-M`````)8P!W<L80[NNE$)F1G$;0>/]&IP-:5CZ:.59)XRB-L.I+C<>1[IU>"(
-MV=*7*TRV";U\L7X'+;CGD1V_D&00MQWR(+!J2'&Y\]Y!OH1]U-H:Z^3=;5&U
-MU/3'A=.#5IAL$\"H:V1Z^6+][,EEBD]<`139;`9C8ST/^O4-"(W((&X[7A!I
-M3.1!8-5R<6>BT>0#/$?4!$O]A0W2:[4*I?JHM35LF+)"ULF[VT#YO*SC;-@R
-M=5S?1<\-UMQ9/=&KK##9)CH`WE&`4=?(%F'0O[7TM"$CQ+-6F96ZSP^EO;B>
-MN`(H"(@%7[+9#,8DZ0NQAWQO+Q%,:%BK'6'!/2UFMI!!W'8&<=L!O"#2F"H0
-MU>^)A;%Q'[6V!J7DOY\SU+CHHLD'>#3Y``^.J`F6&)@.X;L-:G\M/6T(EVQD
-MD0%<8^;T46MK8F%L'-@P985.`&+R[94&;'NE`1O!]`B"5\0/]<;9L&50Z;<2
-MZKB^BWR(N?S?'=UB22W:%?-\TXQE3-3[6&&R3<Y1M3IT`+RCXC"[U$&EWTK7
-ME=@];<31I/OTUM-JZ6E#_-EN-$:(9ZW0N&#:<RT$1.4=`S-?3`JJR7P-W3QQ
-M!5"J00(G$!`+OH8@#,DEM6A7LX5O(`G49KF?Y&'.#OG>7IC)V2DBF-"PM*C7
-MQQ<]LUF!#;0N.UR]MZULNL`@@[CMMK._F@SBM@.:TK%T.4?5ZJ]WTIT5)ML$
-M@Q;<<Q(+8^.$.V24/FIM#:A::GH+SP[DG?\)DR>N``JQG@=]1),/\-*C"(=H
-M\@$>_L(&:5U78O?+9V6`<39L&><&:VYV&]3^X"O3B5IZVA#,2MUG;]^Y^?GO
-MOHY#OK<7U8ZP8.BCUM9^D]&AQ,+8.%+RWT_Q9[O19U>\IMT&M3]+-K)(VBL-
-MV$P;"J_V2@,V8'H$0</O8-]5WV>H[XYN,7F^:4:,LV'+&H-FO*#2;R4VXFA2
-ME7<,S`-'"[NY%@(B+R8%5;X[NL4H"[VRDEJT*P1JLURG_]?",<_0M8N>V2P=
-MKMY;L,)DFR;R8^R<HVIU"I-M`JD&"9P_-@[KA6<'<A-7``6"2K^5%'JXXJXK
-ML7LX&[8,FX[2D@V^U>6W[]Q\(=_;"]32TX9"XM3Q^+/=:&Z#VA_-%KZ!6R:Y
-M]N%WL&]W1[<8YEH(B'!J#__*.P9F7`L!$?^>98]IKF+XT_]K847/;!9XX@J@
-M[M(-UU2#!$["LP,Y829GI_<68-!-1VE)VW=N/DIJT:[<6M;99@O?0/`[V#=3
-MKKRIQ9Z[WG_/LD?I_[4P'/*]O8K"NLHPD[-3IJ.T)`4VT+J3!M?-*5?>5+]G
-MV2,N>F:SN$IAQ`(;:%V4*V\J-[X+M*&.#,,;WP5:C>\"+2H=``!N'0``,!X`
-M`#`>```P'@``,!X``+(=``#Q'0``,!X``$@>``"?*```J2@``*DH``"I*```
-MJ2@``*DH``"I*```J2@``*DH``"I*```J2@``*DH``"I*```J2@``*DH``"I
-M*```J2@``*DH``"I*```J2@``*DH``"I*```J2@``*DH``"I*```J2@``*DH
-M``"I*```J2@``*DH``"I*```J2@``*DH``"I*```J2@``*DH``!R*```J2@`
-M`'(H``"I*```J2@``*DH``!R*```<B@``*DH``"I*```J2@``*DH``"I*```
-MJ2@``*DH``"I*```J2@``*DH``"I*```J2@``*DH``"I*```J2@``*DH``"I
-M*```<B@``*DH``"I*```J2@``*DH``"I*```J2@``*DH``"I*```J2@``*DH
-M``"I*```J2@``*DH``"I*```<B@``'(H``!R*```<B@``*DH``"I*```J2@`
-M`*DH``"I*```J2@``*DH``"I*```J2@``*DH``"I*```J2@``*DH``"I*```
-MJ2@``*DH``"I*```J2@``*DH``"I*```J2@``*DH``"I*```J2@``*DH``"I
-M*```J2@``*DH``"I*```J2@``*DH``"I*```J2@``*DH``"I*```J2@``*DH
-M``"I*```J2@``*DH``"I*```J2@``*DH``!R*```J2@``*DH``"I*```J2@`
-M`*DH``"I*```J2@``*DH``!R*```J2@``'(H``"I*```J2@``*DH``!R*```
-M<B@``*DH``"I*```J2@``'(H``"I*```J2@``*DH``"I*```J2@``*DH``"I
-M*```J2@``*DH``"I*```J2@``*DH``"I*```J2@``*DH``"I*```J2@``*DH
-M``"I*```J2@``'(H``"I*```<B@``*DH``"I*```J2@``'(H``!R*```OCT`
-M`'$]``!^/0``H#T``+X]``"T/0``JCT``+X]``"^/0``OCT``+X]``"J/0``
-MZ60```UE```Q90``I64``#=F````````X:T``+:M``#!K0``YZT``+"M``"P
-MK0``L*T``+"M``"PK0``L*T``+"M``"PK0``L*T``+"M``"PK0``L*T``/&M
-M``#GK0``QZT``.&M``#1K0``UZT``/&M``"CK0```"````1$````(`$`!$0`
-M``(!```".@```@$!``(Z```$`0``"P````0!`0`+````"`$```9:`0`(`0$`
-M!EH!`!`!```#%`$`$`$!``,4`0`@`0``!B@``"`!`0`&*```0`$```,1``!`
-M`0$`!R<``(`!```+1P,`@`$!``M'`P#P)`$`8"4!`(4E`0"J)0$`SR4!`/0E
-M`0`A)@$`OB8!`/4F`0#*)P$`>"<!`)TG`0#O)P$``2D!`#XI`0!O*0$`LBD!
-M`.8J`0#C*0$`^"D!`"XG`0!3)P$`3B8!`(4F`0!X)P$`#2H!`",K`0!0*P$`
-M=2L!`*(K`0"V*P$`Y"L!`"0L`0`Z*@$`9RH!`)0J`0#!*@$````````````@
-M80$`-5@!`'M8`0#C6`$`6%D!`()9`0#360$`9%H!`&U:`0#^70$`\5P!`"%8
-M`0`@80$`(&$!`"!A`0`@80$`(&$!`)Y@`0`@80$`(&$!`'9:`0".6@$`W%D!
-M`%M:`0#Q7`$`T5X!`.M@`0#Q8`$`&&$!`"!A`0#O7P$`,&`!`#E@`0#:7@$`
-MY5X!`.Y>`0#W7@$`M8X!`">,`0`XC`$`28P!`%J,`0"EC`$`PXP!`->,`0`K
-MC0$`1XT!`&.-`0!_C0$`JXT!`+^-`0#3C0$`M8X!`+6.`0#LC0$`2XX!`+6.
-M`0"UC@$`$8X!`(F.`0!XC`$`C(P!`+6.`0#KC`$`_XP!`!.-`0!@PP$`8,,!
-M`)_#`0"TPP$`8,,!`-[#`0!JPP$`R<,!`(W$`0"?Q`$`RLT!`'?/`0!WSP$`
-M=\\!`'?/`0!WSP$`=\\!`'?/`0!WSP$`=\\!`'?/`0!WSP$`=\\!`'?/`0!W
-MSP$`=\\!`'?/`0!WSP$`=\\!`'?/`0!WSP$`=\\!`'?/`0!WSP$`=\\!`'?/
-M`0!WSP$`=\\!`'?/`0!WSP$`=\\!`'?/`0#>S0$`1\X!`+#.`0`9SP$`@]`!
-M`%+6`0!2U@$`4M8!`%+6`0!2U@$`4M8!`%+6`0!2U@$`4M8!`%+6`0!2U@$`
-M4M8!`%+6`0!2U@$`4M8!`)?0`0"7T`$`E]`!`%+6`0!2U@$`4M8!`%+6`0!2
-MU@$`4M8!`%+6`0!2U@$`4M8!`%+6`0!2U@$`4M8!`%+6`0`1T0$`=M$!`-O1
-M`0!!T@$`4M8!`%+6`0!2U@$`4M8!`%+6`0!2U@$`4M8!`%+6`0!2U@$`4M8!
-M`%+6`0!2U@$`IM(!`"33`0"BTP$`(-0!`%+6`0!2U@$`4M8!`%+6`0!2U@$`
-M4M8!`%+6`0!2U@$`4M8!`%+6`0!2U@$`4M8!`)[4`0!2U@$`4M8!`%+6`0!2
-MU@$`4M8!`%+6`0!2U@$`4M8!`%+6`0!2U@$`4M8!`%+6`0!2U@$`4M8!`%+6
-M`0#DU`$`(M4!`&#5`0">U0$`W-4!`!?6`0!2;V-K970@-S4P(%-!5$$@0V]N
-M=')O;&QE<@```0````````````````````````"6,`=W+&$.[KI1"9D9Q&T'
-MC_1J<#6E8^FCE62>,HC;#J2XW'D>Z=7@B-G2ERM,M@F]?+%^!RVXYY$=OY!D
-M$+<=\B"P:DAQN?/>0;Z$?=3:&NODW6U1M=3TQX73@U:8;!/`J&MD>OEB_>S)
-M98I/7`$4V6P&8V,]#_KU#0B-R"!N.UX0:4SD06#5<G%GHM'D`SQ'U`1+_84-
-MTFNU"J7ZJ+4U;)BR0M;)N]M`^;RLXVS8,G5<WT7/#=;<63W1JZPPV28Z`-Y1
-M@%'7R!9AT+^U]+0A(\2S5IF5NL\/I;VXGK@"*`B(!5^RV0S&).D+L8=\;R\1
-M3&A8JQUAP3TM9K:00=QV!G';`;P@TI@J$-7OB86Q<1^UM@:EY+^?,]2XZ*+)
-M!W@T^0`/CJ@)EAB8#N&[#6I_+3UM")=L9)$!7&/F]%%K:V)A;!S8,&6%3@!B
-M\NV5!FQ[I0$;P?0(@E?$#_7&V;!E4.FW$NJXOHM\B+G\WQW=8DDMVA7S?-.,
-M94S4^UAALDW.4;4Z=`"\H^(PN]1!I=]*UY78/6W$T:3[]-;3:NEI0_S9;C1&
-MB&>MT+A@VG,M!$3E'0,S7TP*JLE\#=T\<050JD$")Q`0"[Z&(`S));5H5[.%
-M;R`)U&:YG^1AS@[YWEZ8R=DI(IC0L+2HU\<7/;-9@0VT+CM<O;>M;+K`((.X
-M[;:SOYH,XK8#FM*Q=#E'U>JO=]*=%2;;!(,6W',2"V/CA#MDE#YJ;0VH6FIZ
-M"\\.Y)W_"9,GK@`*L9X'?423#_#2HPB':/(!'O["!FE=5V+WRV=E@'$V;!GG
-M!FMN=AO4_N`KTXE:>MH0S$K=9V_?N?GY[[Z.0[ZW%]6.L&#HH];6?I/1H<3"
-MV#A2\M]/\6>[T6=7O*;=!K4_2S:R2-HK#=A,&PJO]DH#-F!Z!$'#[V#?5=]G
-MJ.^.;C%YOFE&C+-ARQJ#9KR@TF\E-N)H4I5W#,P#1PN[N18"(B\F!56^.[K%
-M*`N]LI):M"L$:K-<I__7PC'/T+6+GMDL':[>6[#"9)LF\F/LG*-J=0J3;0*I
-M!@F</S8.ZX5G!W(35P`%@DJ_E11ZN.*N*[%[.!NV#)N.TI(-OM7EM^_<?"'?
-MVPO4TM.&0N+4\?BSW6AN@]H?S1:^@5LFN?;A=[!O=T>W&.9:"(AP:@__RCL&
-M9EP+`1'_GF6/::YB^-/_:V%%SVP6>.(*H.[2#==4@P1.PK,#.6$F9Z?W%F#0
-M34=I2=MW;CY*:M&NW%K6V68+WT#P.]@W4ZZ\J<6>N]Y_S[)'Z?^U,!SRO;V*
-MPKK*,).S4Z:CM"0%-M"ZDP;7S2E7WE2_9]DC+GIFL[A*8<0"&VA=E"MO*C>^
-M"[2AC@S#&]\%6HWO`BU*%`(`CA0"`%`5`@!0%0(`4!4"`%`5`@#2%`(`$14"
-M`%`5`@!H%0(`OQ\"`,D?`@#)'P(`R1\"`,D?`@#)'P(`R1\"`,D?`@#)'P(`
-MR1\"`,D?`@#)'P(`R1\"`,D?`@#)'P(`R1\"`,D?`@#)'P(`R1\"`,D?`@#)
-M'P(`R1\"`,D?`@#)'P(`R1\"`,D?`@#)'P(`R1\"`,D?`@#)'P(`R1\"`,D?
-M`@#)'P(`R1\"`,D?`@#)'P(`DA\"`,D?`@"2'P(`R1\"`,D?`@#)'P(`DA\"
-M`)(?`@#)'P(`R1\"`,D?`@#)'P(`R1\"`,D?`@#)'P(`R1\"`,D?`@#)'P(`
-MR1\"`,D?`@#)'P(`R1\"`,D?`@#)'P(`R1\"`)(?`@#)'P(`R1\"`,D?`@#)
-M'P(`R1\"`,D?`@#)'P(`R1\"`,D?`@#)'P(`R1\"`,D?`@#)'P(`R1\"`)(?
-M`@"2'P(`DA\"`)(?`@#)'P(`R1\"`,D?`@#)'P(`R1\"`,D?`@#)'P(`R1\"
-M`,D?`@#)'P(`R1\"`,D?`@#)'P(`R1\"`,D?`@#)'P(`R1\"`,D?`@#)'P(`
-MR1\"`,D?`@#)'P(`R1\"`,D?`@#)'P(`R1\"`,D?`@#)'P(`R1\"`,D?`@#)
-M'P(`R1\"`,D?`@#)'P(`R1\"`,D?`@#)'P(`R1\"`,D?`@#)'P(`R1\"`,D?
-M`@#)'P(`DA\"`,D?`@#)'P(`R1\"`,D?`@#)'P(`R1\"`,D?`@#)'P(`DA\"
-M`,D?`@"2'P(`R1\"`,D?`@#)'P(`DA\"`)(?`@#)'P(`R1\"`,D?`@"2'P(`
-MR1\"`,D?`@#)'P(`R1\"`,D?`@#)'P(`R1\"`,D?`@#)'P(`R1\"`,D?`@#)
-M'P(`R1\"`,D?`@#)'P(`R1\"`,D?`@#)'P(`R1\"`,D?`@"2'P(`R1\"`)(?
-M`@#)'P(`R1\"`,D?`@"2'P(`DA\"`-XT`@"1-`(`GC0"`,`T`@#>-`(`U#0"
-M`,HT`@#>-`(`WC0"`-XT`@#>-`(`RC0"`.E;`@`-7`(`,5P"`*5<`@`W70(`
-M`````%&D`@`FI`(`,:0"`%>D`@`@I`(`(*0"`""D`@`@I`(`(*0"`""D`@`@
-MI`(`(*0"`""D`@`@I`(`(*0"`""D`@!AI`(`5Z0"`#>D`@!1I`(`0:0"`$>D
-M`@!AI`(`$Z0"```@```$1````"`!``1$```"`0```CH```(!`0`".@``!`$`
-M``L````$`0$`"P````@!```&6@$`"`$!``9:`0`0`0```Q0!`!`!`0`#%`$`
-M(`$```8H```@`0$`!B@``$`!```#$0``0`$!``<G``"``0``"T<#`(`!`0`+
-M1P,`D!L#```<`P`E'`,`2AP#`&\<`P"4'`,`P1P#`%X=`P"5'0,`:AX#`!@>
-M`P`]'@,`CQX#`*$?`P#>'P,`#R`#`%(@`P"&(0,`@R`#`)@@`P#.'0,`\QT#
-M`.X<`P`E'0,`&!X#`*T@`P##(0,`\"$#`!4B`P!"(@,`5B(#`(0B`P#$(@,`
-MVB`#``<A`P`T(0,`82$#````````````P%<#`-5.`P`;3P,`E$\#``E0`P`S
-M4`,`A%`#`!51`P`E40,`E50#`(=3`P#!3@,`P%<#`,!7`P#`5P,`P%<#`,!7
-M`P`^5P,`P%<#`,!7`P`N40,`1E$#`(U0`P`,40,`AU,#`'%5`P"+5P,`D5<#
-M`+A7`P#`5P,`CU8#`-!6`P#95@,`>E4#`(55`P".50,`EU4#`.)F`P#I9@,`
-M\F8#`/EF`P`"9P,`"6<#`!)G`P#79@,`Q8,#`#>!`P!(@0,`68$#`&J!`P"U
-M@0,`TX$#`.>!`P`[@@,`5X(#`'."`P"/@@,`NX(#`,^"`P#C@@,`Q8,#`,6#
-M`P#\@@,`6X,#`,6#`P#%@P,`(8,#`)F#`P"(@0,`G($#`,6#`P#[@0,`#X(#
-M`"."`P``````````````````````````````````````T+@#`-"X`P`/N0,`
-M)+D#`-"X`P!.N0,`VK@#`#FY`P#]N0,`#[H#`)K#`P!'Q0,`1\4#`$?%`P!'
-MQ0,`1\4#`$?%`P!'Q0,`1\4#`$?%`P!'Q0,`1\4#`$?%`P!'Q0,`1\4#`$?%
-M`P!'Q0,`1\4#`$?%`P!'Q0,`1\4#`$?%`P!'Q0,`1\4#`$?%`P!'Q0,`1\4#
-M`$?%`P!'Q0,`1\4#`$?%`P!'Q0,`KL,#`!?$`P"`Q`,`Z<0#`%/&`P`BS`,`
-M(LP#`"+,`P`BS`,`(LP#`"+,`P`BS`,`(LP#`"+,`P`BS`,`(LP#`"+,`P`B
-MS`,`(LP#`"+,`P!GQ@,`9\8#`&?&`P`BS`,`(LP#`"+,`P`BS`,`(LP#`"+,
-M`P`BS`,`(LP#`"+,`P`BS`,`(LP#`"+,`P`BS`,`X<8#`$;'`P"KQP,`$<@#
-M`"+,`P`BS`,`(LP#`"+,`P`BS`,`(LP#`"+,`P`BS`,`(LP#`"+,`P`BS`,`
-M(LP#`';(`P#TR`,`<LD#`/#)`P`BS`,`(LP#`"+,`P`BS`,`(LP#`"+,`P`B
-MS`,`(LP#`"+,`P`BS`,`(LP#`"+,`P!NR@,`(LP#`"+,`P`BS`,`(LP#`"+,
-M`P`BS`,`(LP#`"+,`P`BS`,`(LP#`"+,`P`BS`,`(LP#`"+,`P`BS`,`M,H#
-M`/+*`P`PRP,`;LL#`*S+`P#GRP,``````````````````````$1A=&%#96YT
-M97(@-S(X,"!3051!($-O;G1R;VQL97(``0```!L````!````@!`$``L1!`"S
-M$`0`E!`$``L1!``+$00`"Q$$``L1!`"`$`0`Q1$$`(`0!`"`$`0`.Q`$`+D1
-M!`"&$00`3Q$$`($W!`"1-P0`F3<$`*$W!`"I-P0`L3<$`+DW!`")-P0`5#T$
-M``5`!``G/P0`T3\$`*`_!`#1/P0`5#T$`%@]!``RGP0`M9\$`)B@!`#&H`0`
-MA:$$`(.B!`"?H@0`JZ($`'*?!``BHP0`V:,$`#*?!`#HI`0`]:,$`)2D!`#B
-MLP0`%+@$`.RW!`#2MP0`N+<$`)2W!`#BLP0`>K<$`$>T!`!!^00`,/D$`!#Y
-M!`#P^`0`L/@$`'?X!`!O(`4`EA\%`&\@!0!P'P4`<!\%`'`?!0!-5E]297%U
-M97-T("5P.B!#9&);)3)X+"4R>"PE,G@L)3)X+"`E,G@L)3)X+"4R>"PE,G@L
-M("4R>"PE,G@L)3)X+"4R>"P@)3)X+"4R>"PE,G@L)3)X72X`6R4P,G@Z)3`R
-M>"`E,#)D72!D:7-K(')E;6]V960N``!%<G)O<B!I;B!I<W-U:6YG(&-O;6UA
-M;F0L(&5R<B!I;F9O(#!X)6QL6````%1A<VL@9FEL92!E<G)O<BP@4W1A='5S
-M4F5G/3!X)7@L($5R<E)E9STP>"5X+"!,0D%;,"TS73TP>"5X+$Q"05LT+3==
-M/3!X)7@N``!296-E:79E9"!.54P@4F5Q('-L;W1.;R@E>"\E>"D@14Y44ED@
-M*"4P.'@I+"!E<G)O<B`P>"5L;%@```!@+2!&25,H4VQO=#HE,#)X*3H@)3`X
-M>"`E,#AX("4P.'@@)3`X>```0TU$($AE861E<CH@)3`X>"`E,#AX("4P.'@@
-M)3`X>"`N("4P.'@@)3`X>"`E,#AX("4P.'@@+B`E,#AX("4P.'@@)3`X>"`E
-M,#AX("X@)3`X>"`E,#AX`%LE,#)X.B4P,G@@)3`R9"`E,#)D72!032!R97%U
-M97-T*"5X*2!T:6UE;W5T+@```%1I;65O=70@2#)$($9)4RA3;&]T.B4P,G@I
-M.B`E,#AX("4P.'@@)3`X>"`E,#AX`%LE,#)X.B4P,G@@)3`R9%T@6&9E<B`E
-M>"!%<G)O<B!I;F9O<FUA=&EO;B`P>"5L;%@```!;)3`R>#HE,#)X("4P,F0@
-M)3`R9"`E,#)D72!89F5R("5X($5R<F]R(&EN9F]R;6%T:6]N(#!X)6QL6`!;
-M)3`R>#HE,#)X("4P,G@@)3`R>%T@4$T@6&9E<B`E>"!%<G)O<B!I;F9O<FUA
-M=&EO;B`P>"5L;%@```!2=6YN:6YG($@R1"!&25,H4VQO=#HE,#)X*3H@)3`X
-M>"`E,#AX("4P.'@@)3`X>``@4T<@:71E;2`E,#)X.B!A9&1R("5L;'@@<VEZ
-M92`E>"!31T@@861D<B`E;&QX('-I>F4@)7@``$9A:6QE9"!T;R!E;F%B;&4O
-M9&ES86)L92!S<&EN('5P+@```%LE,#)X.B4P,G@@)3`R9%T@1&5V:6-E(')E
-M<75E<W0H)7@I('1I;65O=70N`````%LE,#)X.B4P,G@@)3`R9"`E,#)D("4P
-M,F1=($1E=FEC92!R97%U97-T*"5X*2!T:6UE;W5T+@``6R4P,G@Z)3`R>"`E
-M,#)D72!D:7-K(')E;6]V960@*"5X*2X`071T1&5V4T%3061D<ELE>%T@(%M5
+MQT`(;W(@``^W5R*-1A?H>;;__^M%/`-U(<9&`1#'1B`!````QT8$2%!4`,=&
+M#$5*,S1FQT80,`#K(,9&!'8/MU<@C48%Z$*V___&1@QD#[=7(HU&#>@RMO__
+MQD8<<@^V5QV-1AWHXK7__[@`````ZPRX_____^L%N`````"#Q`Q;7E]=PXVT
+M)@````!55U93@^P(BUPD)+@`````Q@08`(/``3T``0``=?*+1"0<B[A$!0``
+M#[9$)"")1"0$B3PDZ/S___^)P6:%P'0-#[?`@+P'N`0``/]U2XN_1`4``(''
+MR`P``(N'1`4``(D$).C\____BU0D("G"#[;"B40D!(D\).C\____B<%FA<`/
+MA,(!```/M\"`O`>X!```_P^$L0$```^WP0^VA`>X!```9H'Y@0`/A]<```"+
+MC[`%```/M\!IP!0-``"--`&+5@R%TG1L#[:'.`4``#S_=!4/ML!IP!0-``"-
+M!`&]@````#G"="`/MH<Y!0``//]T&@^VP&G`%`T``(T$`3G"=0J]@0```(GH
+MB$,"@'XR`'0ON@`````/ML(/MDP&0+@!````T^`)0R"#P@$X5C)V$.ODQD,"
+M_XM&"`^V0`F)0R#&`P$/MD8QB$,!BT9(B4,$BT9,B4,(C4L,C598BT98B4,,
+MBT($B4$$BT((B4$(BT(,B4$,BT9PB4,<N`````#IR0````^WT&G2L````(G6
+M`[>4!0``QD,"_\8#`HN'E`4```^V1`(?B$,!BT94#[9`"8E#(`^VAJ4````\
+M`G4MQT,$2%!4`(U##,=##%)O8VO'0`1E=%-TQT`(;W(@``^W5B*-0Q?H%;3_
+M_^M%/`-U(<9#`1#'0R`!````QT,$2%!4`,=##$5*,S1FQT,0,`#K(,9#!'8/
+MMU8@C4,%Z-ZS___&0PQD#[=6(HU##>C.L___QD,<<@^V5AV-0QWH?K/__[@`
+M````ZP6X_____X/$"%M>7UW#C78`C;PG`````(/L+(E<)!R)="0@B7PD)(EL
+M)"B+?"0PBVPD-(M';(E$)!2+122).(M'8(7`=1+&168"B2PD_U5PZ;@%``"-
+M=@#V0"@"=!+&168"B2PDC78`_U5PZ9T%``"+3"04B0PDZ/S___^)QH7`=1;&
+M168"B2PD_U5PZ7P%``"-M"8`````QT!D`````(EH2(M'8(E&&(M'8`^W0!QF
+MB480QD84@`^V160\`@^$60$``#P"=PF$P'0BZ;L"```\`XVV``````^$P0$`
+M`#P$#X6E`@``B?;IC0$``(M'8/9`.`&-="8`#X20````#[9%9:@"=`;&1B2(
+MZQ"#X`0\`1G`@^`%@^AVB$8DBTU(BUU,#[=%4&:)1"0:QD8E`(G8P>@8B$8F
+MB=C!Z!"(1B>)V,'H"(A&*(A>*8G(#ZS8&(A&*HG(#ZS8$(A&*XG(#ZS8"(A&
+M+(A.+<9&+@#&1B\`#[=$)!IFP>@(B$8P#[9,)!J(3C'&1C(`QD8S`.MK#[9%
+M9:@"=`;&1B0HZQ"#X`0\`1G`@^`%@\`JB$8DBTU(BUU,#[=%4&:)1"0:QD8E
+M`(G(#ZS8&(A&)HG(#ZS8$(A&)XG(#ZS8"(A&*(A.*<9&*@`/MT0D&F;!Z`B(
+M1BL/MDPD&HA.+,9&+0"+1V`%N````(E&.,9&'"`/MT0D&L'@"8E&((-.9`+I
+M?`$```^V14@\$'<%]@<"=0G&168&Z:T#``"-3B0/ML"-55")1"0(B50D!(D,
+M).C\____BT=@!;@```")1CC&1AP@@4YD```0`,9&%:OV164&#X0I`0``BT5,
+MB48@Z1X!```/MD5E@^`P/"!U$<9&)!O&1B4!QD8H`.D"`0``QD8D->GY````
+MBT=@#[9`)(/@!8/X!743@4YD```@``^W551F.U5*=0[K7,9%9@:-=@#I$@,`
+M``^V15,\XY"-="8`=$,\XW<2/$)T.SRPC70F`'0@/$!U(NLM/.R-M@````!T
+M$#SO=!\\Y74.C;8`````ZQ-FB55*ZPW&168&C70F`.G"`@``QD8DL`^W14B(
+M1B4/MT5*B$8F#[=%3(A&)P^W14Z(1B@/MT50B$8I#[9%4HA&*@^V15.(1BL/
+MMD5)B$8L#[9%2XA&+0^V14V(1BX/MD5/B$8O#[9%48A&,/9%909T'0^W153!
+MX`F)1B"#3F0$ZPW&168&Z4L"``"-="8`QT9L<+H"``^V166H!@^$'@(``*@"
+M=`:#3F0(ZP2#3F00C7X\BUUHA=MT!O9%90%U/(M5;(72#X0C`@``QT0D"```
+M``"+3"04BX%$!@``B40D!(DL)/_2A<`/A``"``"+1"04BYA$!@``A=MT2(DT
+M).C\____QT0D!`````")/"3H_/___X/#$(M#\(E$)`R+0_B+4_R)1"0$B50D
+M"(D\).C\____BT/T@\,0A<`/A8(!``#KT\=$)`0`````B3PDZ/S___^+1B`]
+M``@``'=#BTPD%(D,).C\____B<*%P'4)QD5F"^E=`0``BT`(B48TB590BT8@
+MB40D#(M"#(M2$(E$)`2)5"0(B3PDZ/S____K4ST```$`=T.+1"04B00DZ/S_
+M__^)PH7`=0G&168+Z1,!``"+0`B)1C2)5E"+1B")1"0,BT(,BU(0B40D!(E4
+M)`B)/"3H_/___^L)QD5F!NGB````#[9%9:@$D(UT)@`/A+\```"`?60#=2*+
+M35B%R70;BU8TBT8@B40D"(E,)`2)%"3H_/___^F7````BU5HA=)U#8M5;(72
+M#X6Y````ZVB+?C2H`74)B=.0C70F`.LPBU5LA=)T*<=$)`@!````BTPD%(N!
+M1`8``(E$)`2)+"3_TH7`=`J+1"04BYA$!@``@\,0BT/XBU/PB50D"(E$)`2)
+M/"3H_/___P-[\(M#](/#$(7`=1WKVXM&((M6-(7`=!'&`@"#P@&#Z`%T!NOS
+M@TYD`8ET)`2+3"04B0PDZ/S____K+HET)`2+1"04B00DZ/S___^)+"3_57#K
+M%KL`````Z4S^__^+?C2-="8`Z53___^+7"0<BW0D((M\)"2+;"0H@\0LPXVT
+M)@````!75E.#[!"+?"0@BW0D)+@`````Q@0P`(/``8/X>'7T@[]0!0```0^4
+M1A,/ME<B#[9/(0^V7R`/MD<CB$8#B%8"B$X!B!Z`3A$0#[='&&:)1@0/MT<:
+M9HE&!HN'4`4``(A&;,9&$B`/MU<:9H'Z("%T!V:!^B(A=4?&1A<"C48\QT8\
+M4F]C:\=`!&5T4D''0`A)1"!3QT`,4T0@,L=`$#$R>"#'0!1#;VYTQT`8<F]L
+M;&;'0!QE<L9`'@#I`@$``(V"\-C__V:#^`%V$F:!^D`A=`MF@?I$(0^%I0``
+M`,9&%P0/MU<:C8+PV/__9H/X`7=#C48\QT8\4F]C:\=`!&5T4D''0`A)1"`R
+MQT`,-S%X(,=`$%-!4R#'0!1#;VYTQT`8<F]L;&;'0!QE<L9`'@#IC0```&:!
+M^D`A=`=F@?I$(75_C48\QT8\4F]C:\=`!&5T4D''0`A)1"!3QT`,4T0@,L=`
+M$#$T>"#'0!1#;VYTQT`8<F]L;&;'0!QE<L9`'@#K/\9&%PB-1CS'1CQ$871A
+MQT`$0V5N=,=`"&5R(#?'0`PR.#`@QT`04T%40<=`%"!#;V['0!AT<F]LQT`<
+M;&5R``^V1A+V9A>(1A"$P'4$QD80@(U&&,=&&$AI9VC'0`10;VENQT`(="!4
+M9<=`#&-H;F_'0!!L;V=IQT`497,L(,=`&$EN8R[&0!P`BX=,!0``A<!T$(M`
+M"(E&9(G"P?H?B59HZPZ+1PB)1F2)PL'Z'XE6:,=&8``@``#'1"0$?````(M'
+M$(D$).C\____B<*!XO`#``#!Z@2(5FV#X`^(1F_'1"0$@````(M'$(D$).C\
+M____B<*!X@``\`/!ZA2(5FXE```/`,'H$(A&<(/$$%M>7\.-M@````"-OP``
+M``!55U93@^P<BWPD,(MT)#2+7"0XN`````#&!!@`@\`!/9P```!U\HES"(/^
+M/WX)@<?(#```@^Y`N`````"#O+>X`@````^%GP(``(F<M[@"``")>VR+1"0\
+MB4-PBTPD0(E+>(!_-0$/A7@"``"!_H4````/CUH"```/MH0WN`0``#S_#X1*
+M`@``#[;`9HE$)!@/M\!IP"@!``")Q0.O>`4``/9%)P0/A"<"``"+120E`/__
+M`#T``/\`#X44`@``]D4H!`^$AP$``,:%M``````/MDTD#[;1B="#X`:#^`9U
+M.?;"`0^$`P$``,9%)@7&12<$B6PD#`^V14V)1"0(BT4PB40D!(M%+(D$).C\
+M____N`$```#IT`$``(/X!`^%P@$``/;!`0^$N0$``(M=+(M%-(7`#X6"````
+MQD4F`\9%)P2`>PH`=%&^`````(U#.(E$)!2+3"04B0PDZ/S___^)PHM#/(E3
+M/(M,)!2)"HE"!(D0@'HF_W05.=5T$<:%M0````&X`0```.E<`0``@\8!#[9#
+M"CGP?[N`O;4````!#X0_`0``B6PD!(D\).C\____N`$```#I+@$``(!X)@`/
+MA1\!``!F@V`R_8M%-&;'0#(@`(M%-(E$)`2)/"3H_/___[@!````Z?T```"+
+M12P/MD`)@'\F`'0ONP`````/MO`/MLN)\-/XJ`%T%,=$)`@`````B4PD!(D\
+M).C\____@\,!.%\F=]G&12<&QD4F!6;'A90``````(EL)`2)/"3H_/___[@!
+M````Z9H```"+;2R`?0H`=%[&1"0;`(U%.(E$)!"+3"00B0PDZ/S___^)PHM%
+M/(E5/(M,)!")"HE"!(D0@'HF_W0>#[9")3PB=`0\#742QX2WN`(```````"X
+M`````.M"@$0D&P$/MD0D&SA%"G>N#[=$)!B)1"0(B5PD!(D\).C\____N`$`
+M``#K%\>$M[@"````````N`````#K!;@!````@\0<6UY?7<.0D)"0D)"0D)"0
+MD)"0D)"+5"0$H0````")0@2)%0````##C;8`````C;PG`````*$`````!9@!
+M`P##D(UT)@"+1"0$BTPD"(7`=!2+$(72=`F%R70%BT($B0&)T,.)]HL5````
+M`.OFD(VT)@````"+1"0$BU0D"`68`0,``T(0P^L-D)"0D)"0D)"0D)"0D%.!
+M[/@```"+E"0``0``C80D@````(N<)`0!``"+2@2)1"0$BT((B00D_U$<C40D
+M"(M3!(E$)`2+0PB)!"3_4AP/MD0D"3B$)($```!V#;@!````@<3X````6\-R
+M)`^V1"0*.(0D@@```'?C<A0/MD0D"SB$)(,```!WTW($,<#KTKC_____Z\N0
+MC;0F`````%=64X/L$(L=`````(MT)""%VW4(ZWJ+&X7;='2+0PB%P'1VBU8$
+M.U`$=>N+0`B)1"0$BT8(B00D_U(DA,!TUXM3"(U["(72=1_K9I"-="8`B50D
+M!(DT).C\____A<!X48L_BQ>%TG1)BT8$BXB`````A<ETVSM"!'76BT((B40D
+M!(M&"(D$)/_1Z]&0C70F`#'`@\006UY?P\<&`````+@!````B5X,B7,(@\00
+M6UY?PXL'B5X,B0:X`0```(DWZ]'K#9"0D)"0D)"0D)"0D)"+5"0$H0````")
+M`HM"#(D5`````(7`=!"A`````(E"$`-"#*,`````\\.-M@````!75E.#[!"+
+M'0`````/MG0D((7;="V)\#A#!'0FB?`/MOCK!XGP.$,$=!B+0T"%P'0)B3PD
+M_]"%P'4(BQN%VXGV=>&#Q!")V%M>7\.0C70F`%:)UE.#[$2`/0`````"=#2+
+M6`PQR8/`##G8=!HYB_3]__^)VG4*ZQ<YBO3]__]T#XL2.<)U\HE.'(/$1%M>
+MPX/!`>O4C40D((M25(E$)`2+1F")!"3_4CR+5EP/MD0D,`-"*(E&'(/$1%M>
+MPXUT)@"+%0````"X=````(72=!0PP(M*&#G(<P*)R(L2A=)U\8/`=//#C70F
+M`(V\)P````!3BT0D"(M<)`R+4`R-2`PYRG4(ZQ.+$CG*=`V-@MC]__\Y6!QU
+M[UO#6S'`PXUT)@!3@^P(BT0D$(M8"(7;=!.0BU,$BT,(B00D_U)LBQN%VW7N
+M@\0(6\.)]HV\)P````"+1"0$B<*+`.GS_O__C78`BT0D!(M0'(72>`?'0!S_
+M____\\.-M@````"-OP````!3BUPD##'`A=MT%XM4)`@QR0'3#[8"@\(!`<$Y
+MVG7T#[;!6\.-M@````"-OP````"A`````(M,)`2%P'0DBU`(A=)T%SE*"'4,
+MZQB0C70F`#E*"'0,BQ*%TG7UBP"%P'7<\\/SPXUT)@"-O"<`````5U93BT0D
+M$(MT)!2+?"08BU`,C5@,.=IU#>LQD(UT)@"+$CG3=":-@MC]__^`>`@$=NXY
+M<"1UZ87_>!>+2`R%R73>.42Y2'786UY?PULQP%Y?PXM(#(7)=<?K[9"-="8`
+M5U93@^P0BWPD((D\)(UW#.C\____BU\,.?-T*HUT)@"-D]C]__^+@B0"``"%
+MP'00BT($BT`XA<!T!HD4)/_0D(L;.?-UVHD\).C\____BT<,.?!U".L9BP`Y
+M\'03BUCXA=MT\X/$$+@!````6UY?PX/$$#'`6UY?PXVT)@````!7,<!64X/L
+M$(M\)""`OX0!`P``=2>+7PB%VW0>,?:)]HM#!(M3"(D4)/]05(L;"<:%VW7L
+MB?"$P'4),<"#Q!!;7E_#B3PDZ/S___^#Q!")\EL/ML)>7\.)]HV\)P````!5
+M5U93@^P,BW0D(.C\____BY[(````B<>%VP^$C````(M#!(G:C:[(````*?B%
+MP'X.Z88```"+0@0I^(7`?S.+0A2%P'0#B6@0B8;(````B<.+0@S'0A``````
+MQT(4`````(D$)/]2"(N6R````(72=<2)-"3H_/___X7;=`J+AL@````YV'0(
+M@\0,6UY?7<.+0`0I^(E$)`2+1@2)!"3H_/___X/$#%M>7UW#B70D((/$#%M>
+M7UWI_/___XDT).C\____Z[B-=@"-O"<`````5U93BW0D%(M\)!#H_/___XM.
+M$(7)=!:+5A2%TG0&B4H0BTX0B1''1A``````BY?(````B<$##HV?R````(72
+MB4X$=0SK/HU:%(M2%(72=#2+0@0IR(7`?NV)5A2-1A2),SFWR````(E>$(E"
+M$'4EBP:)1"04BT<$B40D$%M>7^G\____B584B3,YM\@```")7A!TVUM>7\.0
+MC;0F`````%93@^P$BTPD%(M<)!"+41"%TG1<BT$4B[/(````A<!T!HE0$(M1
+M$(D"QT$4`````(N#R````,=!$`````"%P'0O.<9T*^C\____BY/(````BU($
+M*<*%THG0?AN)1"04BT,$B40D$(/$!%M>Z?S___^#Q`1;7L/'!"14`@``Z/S_
+M__^XZ`,``.O2C;0F`````%93@^P4BW0D((M>"(7;=13K+HM3!(M#"(D$)/]2
+M:(L;A=MT'(![1`!TZ(M3!,=$)`0`````BT,(B00D_U(HZ]*-ALP```")-"2)
+M1"0$Z/S___^#Q!1;7L.0C;0F`````%=64X/L$(M\)""+7PB%VW4(ZS*+&X7;
+M="R+4P2+0PB)!"3_4G"`>T0`=.B+4P3'1"0$`0```(M#"(D$)/]2*(L;A=MU
+MU(M?#(UW##GS=0CK)XL;.?-T(8V3V/W__X!Z"`%U[HM"!(M`.(7`=.2)%"3_
+MT(L;.?-UWX`]``````!T.(V?S````(E<)`2)/"3H_/___\>'S`````"'DP/'
+MA]0`````````B;_8````B5PD!(D\).C\____@\006UY?PU575E.#[`R+="0D
+MBVPD((7V=%Z+5@2+1@B)!"3_4G"`?D0`#X6:````BUT,C7T,.?MU".LLBQLY
+M^W0FC9/8_?__@'H(`77N.7)<=>F+0@2+0#B%P'3?B10D_]"+&SG[==J+-H7V
+M=!&#Q`R)\%M>7UW#BW4(A?9UFX`]``````!TYHV=S````(E<)`2)+"3H_/__
+M_\>%S`````"'DP/'A=0`````````B:W8````B5PD!(DL).C\____@\0,B?!;
+M7E]=PXM6!,=$)`0!````BT8(B00D_U(HZ4W___^-="8`4X/L"(M<)!")'"3H
+M_/___XG!QT`(`````(U`=(E!)(M##(U1*(/H=(E!((U!#(E!#(E!$#'`Q@00
+M`(/``8/X3'7T@\0(B<A;PXVT)@````"#[`PQTHE<)`2+7"04B70D"(MT)!@Y
+M<PAR(8D<).C\____B<*+1"00B7((B5H$B0*+0PB#P`$I\(E#"(M<)`2)T(MT
+M)`B#Q`S#C;0F`````(/L#(M4)!"+1"04B10DB40D"(U":(E$)`3H_/___X/$
+M#,.-M"8`````C;PG`````(M,)`B+1"0$BU$(`U`(@^H!B5`(Z?S___^-M"8`
+M````@^P,BT0D$(E$)`2+`(/`:(D$).C\____@\0,PXUT)@!5B<575E.#[`R+
+M<`R->`PY_G4(ZT>+-CG^=$&-GMC]__^`>P@!=>X/MD-0J$`/A6T!``"`/0``
+M````=-FH`G75J`$/A9T!``#V0U`$C70F`'7#@$M0)(LV.?YUOXM=%(UU%#GS
+M=!&-0_2)!"3H_/___XL;.?-U[XMU##G^#X2:````C8;8_?__@'@(!'8+BU@,
+MA=L/A#H!``"+-CG^=>.+70PY^W1VQD0D"P#K"8UV`(L;.?-T/HV3V/W__X!Z
+M"`%U[O9"4"!TZ(M")(!B4-N%P'4/Z=4```"+`(7`#X3+````BT@4A<ET[XL;
+MQD0D"P$Y\W7"BW4,.?=T(9"-="8`C9[8_?__]H,<`@```70'BT,,A<!T((LV
+M.?YUY(N5C`$#`(72=`B+102)!"3_TH/$#%M>7UW##[93"(#Z!'8/BX-D`0``
+MA<!T$#E8!'0+@.H!=</V0U`"=+V+0QR%P(GV#XB/````]H,<`@```G2GQT0D
+M!`````")+"3H_/___X7`B<)TD3G#=(WV@!P"```"='.`HQP"``#]Z7C___^)
+M]HD<).C\____Z6C^__^`?"0+``^%^/[__X`]``````&0#X7J_O__B10DZ/S_
+M___IW?[__XD$).C\____D(UT)@#IM/[__XD<).C\____C78`Z5/^__^)VHGH
+MZ!+V__^)]NEA____BT,<B4(<QT,<`````.G__O__B?:-O"<`````55=64X'L
+MG````(N<)+````"%VXM[#`^$WP```,=$)!@`````C50D)(M#!(E4)`2+4PB)
+M%"3_4!P/MD0D-#L%%`(```^.G@```(U#$(E$)!3K(#EK&(-4)!@`BQ44`@``
+M#[9$)#2#P@$YT(D5%`(``'YU]D0D-0%U$0^V!0`````[1"08#X2-````BVL8
+MBU0D%(.'D`$#``&)%"3H_/___XM3!(E<)!#'1"0,X`D#`(E$)`B)QJ$4`@``
+MB40D!(M#"(D$)/]2-(3`=8>+1"04B70D!(D$).C\____@Z^0`0,``>ES____
+MBQO'!10"````````A=L/A2G___^+AY`!`P"#Z`&%P(F'D`$#`'4[B?CHR_S_
+M_^LR#[8%`````,<%!`(```````")'0@"``#'1"0$_`$``&G`0$(/`(D\)*/\
+M`0``Z/S___^!Q)P```!;7E]=PXVV`````(V_`````%575E.#[`R+="0@BVPD
+M*(M\)"2+7@B)KHP!`P"%VW4(ZR6+&X7;=!^+0P2+4PB)%"3_4'B$P'7JQH:$
+M`0,``8/$#%M>7UW#BQT`````A=MT$HM#*(7`=`6)-"3_T(L;A=MU[H7_=!B+
+M5P3'1"0$`0```(M'"(D$)/]2*,9'1`&+1@C'AI`!`P`!````B00DZ/S___^+
+MAI`!`P"%P'2AA>UT$(ET)""#Q`Q;7E]=Z?S____'!"2@A@$`Z/S___^)-"3H
+M_/___XN^D`$#`(7_=>+I:O___XUT)@"-O"<`````@^P<B70D%(MT)"")?"08
+MBT0D*(E<)!"+?"0DBUX,@ZN0`0,``87`>$>)1"0(B7PD!(DT).C\____A<!T
+M1(N#D`$#`(7`=!"+7"00BW0D%(M\)!B#Q!S#B=B+="04BUPD$(M\)!B#Q!SI
+M,_O__XUV`(U&$(E\)`2)!"3H_/___^N\BT8$B3PD_U!`C480B7PD!(D$).C\
+M____ZZ*0C70F`%575E.#[`R+?"0@BP>+<!R-:!R)1"0(ZQ&-M"8`````C5[T
+MBS8Y>RAT/SGU=?*+1P2+0#2%P'0%B3PD_]"+ARP"``"+ER@"``")0@2)$(M$
+M)`B)?"0$@\`XB00DZ/S___^#Q`Q;7E]=PXM3#(U+#(M#$(E"!(D0B4L0B4L,
+MQD-F`HD<).C\____ZY^0C70F`%575E.#[!R+?"0PBVPD-(M'#(M0#(/`##G"
+M=0_IHP```(L2.<(/A)D```"-FMC]__^`>P@!=>H[:UAUY3M[7'7@A=MT?_:#
+M'`(```$/A=(```"+@Z@```"%P`^%Q````(N#F````(7`#X6V````BT,DA<!U
+M".M%BP"%P'0_BU`4A=)T\XMR#(7V#X2A````@'XP``^$EP```#')ZP\/MD8P
+M@\$!.<@/CH0````Y5(Y(=>O'1(Y(`````.OAB1PDZ/S___^-=Q")-"3H_/__
+M_X7`B<-T3XM$)#R+5P2)7"0(B6PD!(E$)!"+1"0XB40D#(M'"(D$)/]2-+H!
+M````A,!T"H/$'(G06UY?7<.)7"0$B30DZ/S___^#Q!PQTEN)T%Y?7<.#Q!PQ
+MTEN)T%Y?7<.)%"3H_/___^DQ____C78`55=64X'LG````(NL)+0```"+O"2P
+M````A>T/A+X!``"+=PB%]G1QBX>4`0,`BU8$B48HC40D)(E$)`2+1@B)!"3_
+M4AR+5@2+1@@/MEPD-`&?E`$#`(D$)/]2,(E<)`R);"0$B40D"(U&$(D$).C\
+M____#[9$)#3'1"0(%````(EL)`2)1"0,C48LB00DZ/S___^+-H7V=8^A````
+M`+I@`@``A<!T%S')BU`4.=%S`HG1BP"%P'7QC9%@`@``BX>4`0,`B50D"(EL
+M)`2-!,")1"0,C4<XB00DZ/S___^+AY0!`P#'1"0(``(``(EL)`2)1"0,C4=0
+MB00DZ/S___^-AY@```")!"3'1"0,`0```,=$)`@L````B6PD!.C\____BX>4
+M`0,`QT0D"!0```");"0$B40D#(V'L````(D$).C\____BX>4`0,`QT0D"&@`
+M``");"0$C03`B40D#(V'@````(D$).C\____QX?D`````0```,>'\``````0
+M``#'A^@`````$```Z/S____'1"0,0B$``(EL)`2)1"0(C4=HB00DZ/S___^+
+M'0````"%VW0@BU,<A=)T$XN'E`$#`(EL)`2)/"2)1"0(_]*+&X7;=>"!Q)P`
+M``!;7E]=PXMO!.DZ_O__C78`C;PG`````%93BQT`````Z/S___^+="0,A<!T
+M#8GRQ@(`@\(!@^@!=?6A`````(7`=0?K6HUV`(G#BP.%P'7XB3.+1"00QX9D
+M`0,``!```(E&!(U&#(E&#(E&$(U&%(E&%(E&&(U&'(E&'(E&((V&0`$``(F&
+M0`$``(F&1`$``(V&8`$``(F&8`$#`%M>PXDU`````.NKD(/L'(`]``````*)
+M="00#[9T)"2)7"0,B7PD%(EL)!@/A``!``")\@^VPHD$).C\____A<")QP^$
+M\P```(ML)""#Q3B)+"3H_/___XG#,<"0Q@08`(/``3U@`@``=?*A&`(``(E[
+M!(/``:,8`@``B8-8`@``C8-(`@``@(L<`@```8F#2`(``(F#3`(``(GPB$,(
+MBT<4BU0D((7`B1-T(8M7%(V#8`(``(E#$(72=!$QP,:$&&`"````@\`!.=!U
+M\8V#,`(``(F#,`(``(F#-`(``(V#.`(``(F#.`(``(F#/`(``(M',,=#(`(!
+M``#'0QS_____A<!T"8D<)/_0A<!U18M$)""-DR@"``"+2!")4!"#P`R)@R@"
+M``")BRP"``")$>L,B?`L`0^$]O[__S';B=B+="00BUPD#(M\)!2+;"08@\0<
+MPXE<)`0QVXDL).C\____Z]J)]HV\)P````!75E.#[!"+%0````"+="0@.?)U
+M#NFQ````C;0F`````(G"A=)T"HL".?!U](L&B0*+1@R-7@PYV'0:C;8`````
+M+2@"``")!"3H_/___XM&##G8=>R+1A2-?A0Y^'0GC9Z`````@^@,BT@,BU`0
+MB5$$B0J)1"0$B1PDZ/S___^+1A0Y^'7?@+Z$`0,``'4<BQT`````A=MT$HM#
+M+(7`=`6)-"3_T(L;A=MU[HM>"(7;=!*+4P2+0PB)!"3_4G2+&X7;=>Z#Q!!;
+M7E_#BP:C`````.E:____D)"0D)"0D)"0D(M,)`0QP(M1$(VT)@````#&!!``
+M@\`!@_@L=?2-0@B)0@B)0@PQP(D2B5($QT(4\#X#`(E*&,="'`````##B?:+
+M0"2#Z!0#!7@"``##C78`BT`0,=*+"#G!=!*+$8M!!(E"!(D0BU$,B0F)202)
+MT,.#[!R)T8E<)!2)PXET)!B+<!"`>F0`=1(/MT)0,=(#04@344R)0T")4T2#
+M1A`!BT-@BU-4B4PD!(D$)/]23(M<)!2+="08@\0<PXVV`````(/L#(M$)!#V
+M@!P"```(BU`0=2;'0B0`````BU!4@(@<`@``"(E$)`C'1"0$8!<#`(M`8(D$
+M)/]21(/$#,.-=@!6N?____]3BT0D#(MT)!P/MUPD&`^V5"0@]H`<`@```70=
+MA-)T%P^WT\'B"872=`TQP,8$,`"#P`$YT'7U,<E;B<A>PXVV`````(V_````
+M`(/L$(ET)`2+="04B1PDB7PD"(EL)`SV1E!`QT8P`````,=&-`````!U68M.
+M)(7)=',Q_S'M,=OK$(VT)@````"#PP&+"87)="V+012%P'7PBT$,BU$0`48P
+M$58TBU$0BT$,.>IRW7<$.?AVUXL)B<>)U87)==.#^P-_"(E^*(EN+.L.QT8H
+M`````,=&+`````"+'"2+="0$BWPD"(ML)`R#Q!##,?\Q[>O1C;8`````5E.+
+M="0,B?,#7"00.=YS%XG9#[91_@^V0?^(4?^(0?Z#Z0(YSG+K.=YT)0^V!CP@
+M=2&)\NL'#[8"/"!U&(/"`3G:=?*)\<8!`(/!`3G9=?9;7L.)\HGQA,!T()"-
+M="8`@\(!/"!T&P^V0O^(`8/!`3G3=`</M@*$P'7E.<MUQY#KSCG:=/4/M@*$
+MP)"-="8`=,4\('3!#[9"_X@!@\$!Z]/K#9"0D)"0D)"0D)"0D)"+1"0$BT`0
+MQT`D`0```,.05E.#[`2+="00]D90`G4MBUXDA=MT%HM3%(72=`F+0@2)%"3_
+M4"2+&X7;=>K'AJ@`````````@\0$6U[#B30DZ/S____'AJ@`````````@\0$
+M6U[#C;8`````C;\`````4X/L"(M<)!"+5"04]D-2`HM#$'0+]D`H`G05D(UT
+M)@"#0"0!@\0(6\.-M"8`````.5`D<NO'1"0$`0```(L#B00DZ/S___^%P(G"
+M=-</MD!EB5HHB5HLQD)D!(/@SX/(((A"9<9"9@#'0G`P%@,`B50D$(/$"%OI
+M_/___XUT)@!3B<.#[`C'1"0$`0```(L`B00DZ/S___^%P(G"=$#V0U("=4'&
+M0&0#QT!8`````,9`4T!FQT!,``!FQT!.``!FQT!0``#&0%)`9L=`2```9L=`
+M2@$`9L=`5```B5HH@\0(B=!;P\9`9`*AI`T``(E"4`^W!:@-``#&0D@&QT),
+M`````,9"20!FB4)4Z\Z-=@"#[!R)7"04B<.)="08BW`0Z%O___^Z_____X7`
+M=!W'0'#P%@,`@$XH`8M35(E$)`2+0V")!"3_4DPQTHM<)!2)T(MT)!B#Q!S#
+MC;0F`````%=64X/L$(M<)""+?"0D@'L(!'9&@'LP`'0Y,?;K#8GV#[9#,(/&
+M`3GP?BB+1+-(A<!T[?:`'`(```%TY(D$)(/&`8E\)`3H_/___P^V0S`Y\'_8
+M@\006UY?PW0P]H,<`@```73NB=CHM/[__X7`=..#!P&)>"S'0'!`%@,`B40D
+M((/$$%M>7^G\____BULD]H,<`@```72[Z\N-M@````#I_/___XUT)@"-O"<`
+M````@^P<BT0D((E<)!2)="08BU@LBS")!"3H_/___XL#@^@!A<")`W4/C4,$
+MB40D!(DT).C\____BUPD%(MT)!B#Q!S#C;0F`````(V\)P````!64X/L!(LU
+M`````,<%>`(```````"%]G4.ZRB0C70F`(MV!(7V=!R+'7@"``#_5D@YPW/L
+M_U9(BW8$A?:C>`(``'7DQP0D8`(``(,%>`(``!3H_/___X/$!#'`6U[#B?:#
+M[!R+3"0@B5PD%(ET)!B+<2B+7A`/ME,HB="#X/Z(0RB`>68!=#F)#"3H_/__
+M_XM3((72=1N-0Q3'0R`!````B40D!(L&@\`LB00DZ/S___^+7"04BW0D&(/$
+M',.-=@"#XOR(4RCKOY"-M"8`````@^P,BU0D$(M"$("B'`(``/?'@I@`````
+M````BT@@A<EU&\=`(`$```"#P!2)1"0$BP*#P"R)!"3H_/___X/$#,/K#9"0
+MD)"0D)"0D)"0D)!3@^P(BT0D$(M8$(E$)`2+`P6P````B00DZ/S___^-@YP`
+M``#'@YP```#0$P,`B9N@````QX.D`````````(E$)`2+`X/`)(D$).C\____
+M@\0(6\.-M@````"-OP````!64X/L%(MT)"#'1"0$8`(``(M<)"2+!HD$).C\
+M____B<&+1B2%P'05.=B-5B1U!NL2.=AT#HG"BP"%P'7T@\046U[#BP.)`HE<
+M)"2)3"0@@\046U[I_/___XVT)@````!5B<U7B==6,?93@^Q,BU0D9(E$)"2+
+M1"1@B50D'(M4)"2)1"08BU(DA=*)5"0X=!:)UC'`@WX4`8LV@]C_A?9U\X/X
+M`WX*@\1,B?!;7E]=PXM$)!B+5"0<BTPD.`'X$>J)3"0\B40D$(E4)!3K*HGV
+MBUPD/(M3"(M#!#'J,?@)P@^$`@$``(M4)#R+$H72B50D/`^$YP```(M4)#R+
+M0A2%P'7-BUH(BTH$.>MWV7($.?EWTXM4)!2+1"00B50D+(M4)#R)1"0HBT(,
+MBU(0B40D,`'(B50D-!':.50D+'>G<@8Y1"0H=Y^)VHG(,>HQ^`G"#X1/`@``
+M.>MWBP^#7@$``(M4)"3'1"0$8`(``(L"B00DZ/S___^)!"3H_/___X7`B<$/
+MA!W___\QP,8$"`"#P`&#^!AU](M<)#R+0P2+4PB)002)^(E1"(GJ*T,$&U,(
+MB7L$B4$,BP.)41"+4Q"):PB)`8M##"M!#!M1$#E4)!R)"XE##(E3$`^&5@(`
+M`(MT)#SIOO[__XL+A<ET5KL!````ZP:+"87)=$"+012%P'3SBU$(BT$$,>HQ
+M^`G"=>6+00R+41")1"0(BT0D/(E4)`P[4!!R#W<)BU0D"#M0#'8$B4PD/(/#
+M`>NZ@^L!#X]B_O__BUPD/(M+#(M;$#E<)!R)3"1`B5PD1'=P<@8Y3"08=VB+
+M5"0DQT0D!&`"``"+`HD$).C\____B00DZ/S___^%P(G"#X0:_O__,<#&!!``
+M@\`!@_@8=?2+7"0<B=:+3"08B7H$B6H(B5H0BUPD/(E*#(L#B0*)$^GG_?__
+M.?D/@Q_^___IE?[__XM<)#CK"HL;A=L/A,K]__^+0Q2%P'7OBTPD/(M$)$"+
+M5"1$`T$$$U$(BTL(,T,$,=$)P771BT0D0(M4)$0#0PP34Q`Y5"0<#X>-_?__
+M<@HY1"08#X>!_?__BW0D),=$)`1@`@``BP:)!"3H_/___XD$).C\____B<$Q
+MP,8$"`"#P`&#^!AU](MT)#R+1"08BU0D'`-&!!-6"(E#!(M##(E3"(M3$`-&
+M#!-6$"M$)!@;5"0<B7D$B4,,BT0D&(E3$(M4)!R):0B)00R+!HE1$(D!B0Z)
+MSND`_?__BU0D'(M$)!@S5"0T,T0D,`G"#X0A_O__BTPD),=$)`1@`@``BP&)
+M!"3H_/___XD$).C\____A<")P0^$P/S__S'`Q@0(`(/``8/X&'7TBUPD/(M#
+M#(G>*T0D&(M3$!M4)!R)00R+1"0HB5$0BU0D+(E!!(L#B5$(BU0D&(D!B0N+
+M3"0<B5,,B4L0Z7'\__]R"CE$)!@/@Y[]__^+5"0DQT0D!&`"``"+`HD$).C\
+M____B00DZ/S___^)P3'`A<ET4\8$"`"#P`&#^!AU](M<)#R+1"08BU0D'`-#
+M!(G>$U,(B4$$BT,,*T0D&(E1"(M3$!M4)!R)00R+`XE1$(M4)!R)`8M$)!B)
+M"XE3$(E##.GL^___BTPD/(L9BT,$BU,(B4$$BP.)40B+5"0DB0''1"0$8`(`
+M`(L"B00DZ/S___^)7"0$B00DZ/S____IK_O__XGVC;PG`````%=64X/L$(M\
+M)"#'1"0$8`(``(L'B00DZ/S____V1U`(B<9U((M')(7`=!F0C70F`(L8B40D
+M!(DT).C\____A=N)V'7LBU=4BT=@B00D_U)`BT=@B40D!(M'7(/`$(D$).C\
+M____@\006UY?PXUT)@!64X/L%(M<)""+4R2`HQP"``#^A=)T%(M"%(7`=`>`
+MH!P"``#^BQ*%TG7LB5PD!,<$)`$```#H_/___XL#QX.H`````0````6P````
+MB00DZ/S___^%P(G&=%S'``$```#'0`2P%P,`B48(QT`,`````(E8$(M;)(7;
+M=#"0C70F`(M3%(72=0OK'(VT)@````")PHM"#(7`=?>)="0$B10DZ/S___^+
+M&X7;==6+!H/H`87`B09T!H/$%%M>PXET)""#Q!1;7NEF^?__C;8`````4X/L
+M&(M$)""+7"0HQT0D!&`"``")!"3H_/___XM4)"2-'-N)7"0,QT0D"!@```")
+M5"0$B00DZ/S___^#Q!A;PX/L3(E\)$2+?"10B70D0(MT)%2);"1(BVPD6(E<
+M)#R#_P=W3/\DO:P-``"+LY@```"%]G4[BT,$QX.8`````0```(M`.(F;D```
+M`,>#E`````````")@XP```"-@XP```")1"0$C4$LB00DZ/S___^+7"0\BW0D
+M0(M\)$2+;"1(@\1,PXM>$,=&$`````")="0$QP0D`P```.C\____B5X0Z\V)
+M-"3H_/___XM8"(G'A=MU".L,BQN%VW0&.7,(D'7TC4,LB00DZ/S___^%P'2?
+MB5@,B6@0QP!@(`,`B4`$QT`(`````(E$)`2-1R2)!"3H_/___^EU____B30D
+MZ/S___^)P8M`#(U1##G0=0_I7/___XL`.=`/A%+___^-F-C]__^`>P@!=>HY
+M:V!UY8/_!P^'./____\DO<P-``"+0UR+4`2-1"08B40D!(DL)/]2/`^V1"0J
+MB$-.#[94)"8/MD-2@^(!`=*#X/T)T(A#4NGZ_O__BT,0@*,<`@``[XM0((72
+M#X7E_O__QT`@`0```(/`%(E$)`2-02R)!"3H_/___^G'_O__@(L<`@``$.F[
+M_O__BT,$B1PD_U`DB?;IJ_[__XUT)@"-O"<`````@^P<BT0D((E<)!2)="08
+MBU@,BW`0B40D!(U#+(D$).C\____B5PD#(ET)`2)'"3'1"0(L#4#`.C\____
+MBUPD%(MT)!B#Q!S#D(VT)@````"!["P"``"`/0``````B9PD)`(``(N<)#`"
+M``")M"0H`@``=1R+G"0D`@``B[0D*`(``('$+`(``,.-M"8`````#[9#4(UT
+M)"2#R`.#X/N(0U#'1"04`0```(ET)!#'1"0,`0```,=$)`0)````QT0D"```
+M``")'"3H_/___X7`=4^!?"0D>6-G;'1E]D-0`9!TDHMS)(7V="7'1"0$8`(`
+M`(L#B00DZ/S___^)="0$B00DZ/S____'0R0`````BT,XBU,\B4,4B5,8Z57_
+M__^0@*,<`@``_HE<)`3'!"0!````Z/S___^`2U`!Z33____'1"0$``(``(DT
+M).C\____A,!UAP^V3"0H#[:#'`(``(G*P.H$@^#]@^(""="(@QP"``#V1"0H
+M$'0,@$M0@`^V1"0IB$-/]D0D*P%T%P^V4U&)R,#H`H/@`H/*`8/B_0G"B%-1
+M]D0D*P)T%0^V4U&-!`F#X`B#R@2#XO<)PHA34?9$)"L(=!4/MD-1P>$$@^$@
+M@\@0@^#?"<B(0U'V1"0K!`^$]/[__P^V4U$/MD0D*(/*0(/@`8/B?\'@!PG"
+MB%-1Z=7^__^-=@"-O"<`````55=64X'L'`(``(N,)#`"``"#P20/MD$L@^`#
+M+`$/A+\"``"+E"0P`@``#[9"4(/@[XG&B$)0C40D'(VV`````,8``(V<)!P"
+M``"#P`$YV'7O]D$L`@^%AP(``(N\)#`"``")\X/C]XA?4(N\)#`"``#'1"0<
+M7W=A4HM'%(M7&(E$)"")5"0D@'DL`'D-@$PD*!`/MD=/B$0D*?9!+0%T)(N$
+M)#`"``"`3"0K`0^V4%$/MD0D*,'B`H/B"(/@]PG0B$0D*/9!+01T(XN\)#`"
+M``"`3"0K`@^V1"0H#[9748/@^]#J@^($"="(1"0H]D$M$'0DBX0D,`(``(!,
+M)"L(#[9040^V1"0HP.H$@^("@^#]"="(1"0H]D$M0'0AB[PD,`(``(!,)"L$
+M#[9$)"@/ME=1@^#^P.H'"="(1"0HBX0D,`(``(-X+``/AIX!``#V02P@#X2S
+M`0``BY0D,`(``(MR)(7V=$`Q_XMN%(7M=#&+1@2-#'^#QP&+5@B-3,P<B4$0
+MB5$4BT8,BU80B4$8BT84B5$<BU`LBT`HB5$DB4$@BS:%]G7"BXPD,`(``(U<
+M)!R-?"0<#[9!4HD<),:$)!L"```!QT0D!``"``"#X`&(A"0:`@``Z/S___^+
+MC"0P`@``B7PD$,=$)!0`````QT0D#`$```#WV(B$)!P!``"+03B+43R)#"0%
+M``#^_X/2_R4``/[_B40D!(E4)`CH_/___XN<)#`"``"+>R2%_W1/,>V+3Q2%
+MR71`BYPD,`(``(UT;0"+0SB+4SR+62R+22@!P1'3@<$`^/__@]/_!0``_O^#
+MTO\E``#^_RG!&=.#Q0&)3/0\B5ST0(L_A?]ULXU\)!S&A"0<`0```,=$)`0`
+M`@``B3PDZ/S___^+C"0P`@``QT0D%`````#'1"0,`0```/?8B(0D'`$``(U$
+M)!R)1"00BT$XBU$\B0PD!0#X__^#TO^)1"0$B50D".C\____@<0<`@``6UY?
+M7<.!>"C__Q\`#X=5_O__B?.#X_.(6%#V02P@#X5-_O__P.L"@^,!B%PD*ND^
+M_O__D(UT)@!3B<.#[`C'1"0$8`(``(L`B00DZ/S___^)!"3H_/___XG!,<"%
+MR70RQ@0(`(/``8/X&'7TBT,4BU,8B4$,B5$0BT,4BU,8B4LDB4,PB5,TB4,H
+MB5,L@\0(6\.)'"3H_/___^OQC;8`````C;\`````55=64X'L/`,``(N\)%`#
+M``"`/0`````"C7<D#X0O`0``C40D2,=$)!0!````B40D$,=$)`P!````BT<X
+MBU<\B3PD!0#X__^#TO^)1"0$B50D".C\____A<")1"0L#X3O`P``C6PD2,=$
+M)!0!````B6PD$,=$)`P!````BT<XBU<\B3PD!0``_O^#TO\E``#^_XE$)`2)
+M5"0(Z/S___^%P(E$)"@/A$8#``"#?"0L_P^4P(-\)"C_#X34!@``BT0D*(7`
+M#Y5$)"</A#("``"+1"0LA<`/A28"``"-3"1(QT0D%`$```")3"00QT0D#`$`
+M``"+1SB+5SR)/"0%`/C__X/2_XE$)`2)5"0(Z/S___^%P(E$)"P/A.0!``"`
+MIQP"``#^B7PD!,<$)`$```#H_/___X!/4`&!Q#P#``!;7E]=PX`]```````/
+MA0`"``"0@$]0`O9'4`)T#0^V1U"#R`&#X/N(1U#V1BP!=#B+7R2%VW0EQT0D
+M!&`"``"+!XD$).C\____B5PD!(D$).C\____QT<D`````(M'.(M7/(E'%(E7
+M&(!^+``/B/$```#V1BT!#X6U````]D8M!'5\]D8M$'4^]D8M0`^$:/___\9$
+M)$@%#[9'48UL)$C&1"1-`,#H!XA$)$R+5U2);"0$BT=@B00D_U)@@<0\`P``
+M6UY?7</&1"1(!`^V1U&-3"1(QD0D30#`Z`6#X`&(1"1,BU=4B4PD!(M'8(D$
+M)/]28/9&+4`/A/[^___KE,9$)$@##[9'4<#H`X/@`8A$)$R-1"1(BU=4B40D
+M!(M'8(D$)/]28/9&+1`/A%G____KE<9$)$@"#[9'48UL)$C0Z(/@`8A$)$R+
+M5U2);"0$BT=@B00D_U)@]D8M!`^$(?___^N;QD0D2``/MD=/C4PD2(A$)$R+
+M5U2)3"0$BT=@B00D_U)@]D8M`0^$[O[__^NAC50D2,=$)`0``@``B10DZ/S_
+M__^$P`^%4`$``("\)$<"````=0C'1"0L_O___\9$)"<`@7PD2%]W85(/A`L"
+M``"+3SB+7SR!P0``_O^#T_^)R(G:)0``_O^)T#'2B=4)Q0^%=`$``(!/4`$/
+MM@4`````/`(/A`G^__\L`0^$\_W___:''`(```$/A/C]__^`IQP"``#[C40D
+M2(V4)$@"``")]L8``(/``3G0=?:-;"1(QT0D%`$```");"00QT0D#`$```#'
+M1"0$`````,=$)`@`````B3PDZ/S___^`?"1(10^$\`,``("\)$8"``!5#X61
+M_?__@+PD1P(``*H/A8/]__\QP(N4!!("``"%T@^%;OW__X/`$(/X0'7IZ67]
+M__^0C40D2`^VG"1'`@``QT0D!``"``")!"3H_/___XE<)`S'!"2L"P``#[;`
+MB40D"(M$)$B)1"0$Z/S___^!?"1(7W=A4@^$E/[__XM$)"R%P`^%>/S__\=$
+M)"S_____Z6O\__^-5"1(#[:<)$<"``")%"3'1"0$``(``.C\____B5PD#,<$
+M)(@+```/ML")1"0(BT0D2(E$)`3H_/___X%\)$A?=V%2#X1J`P``QT0D+/[_
+M___IN_O__XU$)$@QTHE$)!")R"4``/[_QT0D%`$```#'1"0,`0```(E$)`2)
+M5"0(B3PDZ/S___^%P`^%._S__X%\)$A?=V%2#X5%_O__C50D2,=$)`0``@``
+MB10DZ/S___^$P`^$[@8``(%\)$A?=V%2#X4;_O__C50D2,=$)`0``@``B10D
+MZ/S___^$P`^%__W__X!\)%8`#[9'4`^5PL'B`H/@^PG0B$=0#[9'4H"\)$8"
+M````#Y7"@^#^"=`/MM*(1U*)5"0(B70D!,<$)'`"``#H_/___XM'.(M7/`4`
+M`/[_B<&#TO^!X0``_O^)^(E/%(E7&.CS^?__]D0D5!!T#(!/4(`/MD0D58A'
+M3_9$)%<!=!H/ME=1#[9$)%2#R@'`Z`*#XOV#X`()PHA74?9$)%<"=!D/ME=1
+M#[9$)%2#R@0!P(/B]X/@"`G"B%=1]D0D5PAT&@^V5U$/MD0D5(/*$,'@!(/B
+MWX/@(`G"B%=1]D0D5P1T&@^V5U$/MD0D5(/*0(/@`8/B?\'@!PG"B%=1QT0D
+M-``````Q[8M$+&`+1"QD#X7;`0``@\48@_U@=>J`?"0G``^$0P,``&8Q[8M$
+M+&`+1"QD=#2+3"QHBT<XBUPL;(M7/('!``@``(/3`"G!&=,%``#^_X/2_R4`
+M`/[_`<$1TXE,+&B)7"QL@\48@_U@=;J-5"1(B10DQH0D2`$```#'1"0$``(`
+M`.C\____C4PD2,=$)!0`````B4PD$,=$)`P!````]]B(A"1(`0``BT<XBU<\
+MB3PD!0``_O^#TO\E``#^_XE$)`2)5"0(Z/S____'1"0X`````,=$)#P`````
+MC6PD2,=$)!0!````B6PD$,=$)`P!````BT<XBU<\B3PD!0'X__^#TO\#1"0X
+M$U0D/(E$)`2)5"0(Z/S___^%P`^$70$``(-$)#@!BT0D.(-4)#P`@_`$"T0D
+M/'6CBTPD-(7)#X34`P``@$]00(D\).C\____Z13Z__^$P`^$)/G__XVT)@``
+M``#I=_G__X!\)$E2C;8`````#X7_^___C40D2,=$)!0!````B40D$,=$)`P!
+M````QT0D!`$```#'1"0(`````(D\).C\____@'PD2%`/A<3[__^`?"1)30^%
+MN?O__XUT)@#I2_G__XU,)$C'1"0$``(``(D,).C\____A,`/A$+X___I=?S_
+M_\=$)`0$````BP>)!"3H_/___X7`B40D-`^$\_C__XM$+&"+5"QDB00DB?B)
+M5"0$BU0L6(M,+%SH#NK__X7`B40D,`^$X@0``(M,)#2)>22+1"0HA<`/A=D`
+M``"+1"QHBU0L;(E!*(E1+(M,)#"+5"0TB4HPBTPD,(M!#(M1$(M,)#2)012+
+M1"0PB5$8B4@4Z9']__^-1"1(QT0D%`````")1"00QT0D#`$```"+1SB+5SR)
+M/"0%``#^_X/2_R4``/[_@\`!@](``T0D.!-4)#R)1"0$B50D".C\____BT\X
+MBU\\QP0DT`L``(G(!0``_O^)VH/2_R4``/[_@\`!@](``T0D.!-4)#R!P0'X
+M__^#T_\#3"0X$UPD/(E$)`R)5"00B4PD!(E<)`CH_/___^D#_O__BT0D+(7`
+M#X4I____BTPL:(M'.(M<+&R+5SR!P0`(``"#TP`IP1G3!0``_O^#TO\E``#^
+M_P'!BT0D-!'3B4@HB5@LZ>[^__^+7"0LA=L/A,?]__^`O"1'`@````^$(`$`
+M`#'MBT0L8`M$+&1T-(M'.(M7/(G!`TPL:(G3$UPL;('!`/C__X/3_P4``/[_
+M@]+_)0``_O\IP1G3B4PL:(E<+&R#Q1B#_6!UNHUL)$C&A"1(`0```,=$)`0`
+M`@``B2PDZ/S____'1"04`````,=$)`P!````]]B(A"1(`0``C40D2(E$)!"+
+M1SB+5SR)/"0%`/C__X/2_XE$)`2)5"0(Z/S____'1"1``````,=$)$0`````
+MC50D2,=$)!0!````B50D$,=$)`P!````BT<XBU<\B3PD!0``_O^#TO\E``#^
+M_X/``8/2``-$)$`35"1$B40D!(E4)`CH_/___X7`#X2F````@T0D0`&+1"1`
+M@U0D1`"#\`0+1"1$=9CIF?S__\<$)(4"``#H_/___XU4)$B)%"3&A"1'`@``
+M`<:$)$@!````QT0D!``"``#H_/___XU,)$C'1"04`````(E,)!#'1"0,`0``
+M`/?8B(0D2`$``(M'.(M7/(D\)`4``/[_@]+_)0``_O^)1"0$B50D".C\____
+MZ6?^___V1BP$#X3:]___B?;I&_S__XU,)$B)3"00QT0D%`````#'1"0,`0``
+M`(M'.(M7/(D\)`4!^/__@]+_`T0D0!-4)$2)1"0$B50D".C\____BT<XBU<\
+MBTPD0(M<)$0%`?C__X/2_P'!$=,%_P?^_X/2_R4``/[_@\`!@](``T0D0!-4
+M)$2)3"0,B5PD$(E$)`2)5"0(QP0D``P``.C\____Z<;^__^-E"1(`@``C40D
+M6,=$)`CP````C9PD4`(``(E$)`2-K"1``P``B10DZ/S____K"X/#&#GK#X21
+M````BP,+0P1T[HU,)$@QTL=$)!0!````B4PD$,=$)`P!````BT,(B50D"(D\
+M)(E$)`3H_/___X7`#X6M]/__C40D2(D$).C\____@7PD2/06>%H/A-@```"-
+M3"1(QT0D%`````")3"00QT0D#`$```"+0PB+4PR)/"2)1"0$B50D".C\____
+MA<`/A&G____I6/3__XUL)$C'1"04`0```(EL)!#'1"0,`0```(M'.(D\)`4`
+M`/[_,=(E``#^_XE$)`2)5"0(Z/S___^%P`^%&?3__XU$)$C'1"04`````(E$
+M)!#'1"0,`0```(M'.(M7/(D\)`4``/[_@]+_)0``_O^)1"0$B50D".C\____
+MA<`/A=;S___IP/?__Y"-="8`BU0D-(D4).C\____Z=;S__^-5"1(QT0D!``"
+M``")%"3H_/___^D/____C;8`````55=64X/L7(ML)'#'1"0$`0```(M%#(D$
+M).C\____C50D.(G'BT4$B50D!(M4)'2)%"3_4#R+ARP"``"+ER@"``")0@2)
+M$(L'BU@,@\`,.<-U#>M_BP>+&X/`##G8='2-L]C]__^`?@@!=>F+1ER+500[
+M4`0/A"<!``")1"0$B2PDZ/S___^#^`!\2'7'C40D%(M5!(E$)`2+1F")!"3_
+M4CP/ME0D1@^V1"0BT.K0Z(/B`8/@`3G"?YM\&`^V1"0D.$0D2'>.<@L/MD0D
+M23I$)"5W@8M3!(V'*`(``(E#!(F?*`(``,='(`$```")`H"/'`(```&+102)
+MERP"``")1U2+5"1TB6]<B5=@BT0D>(E'6(M4)#B+3"0\B5<XB4\\BT0D0(E/
+M&(E7%(E'2`^V1"1*B$=.#[=$)%!FB4=,#[94)$8/MD=2@^(!`=*#X/T)T(A'
+M4HU'9(D$),=$)`0H````Z/S___^-1"0XBU=4B40D!(M'8(D$)/]2/(M$)%3V
+M1"1&`74)]H```0``!'4(B3PDZ/S___^#Q%R)^%M>7UW#BY*`````A=(/A,O^
+M__^+0`B)1"0$BT4(B00D_]+IP_[__XVV`````(V\)P````!3@^P(BUPD$(![
+M"`%T"KC_____@\0(6\.`/0`````"=.V+0SB+4SP%``#^_XG!@]+_@>$``/[_
+MB=B)2Q2)4QCH_.___X!C4/3'0QS_____B1PDZ/S___\QP.NXD(UT)@"#[!R+
+M1"0HB70D%(MT)"")?"08BWPD)(E<)!"%P'AQB40D"(E\)`2)-"3H_/___X7`
+MB<-T3`^V0%"+=@RH`G5P@#T``````'08J`%U;?9#4$1U!(!+4"2+AB0!``"%
+MP'1CB5PD)(MT)!3'1"0@`@```(M<)!"+?"08@\0<Z?S___^+1@2)/"3_4$"-
+MM@````"-1A"+7"00B7PD)(MT)!2)1"0@BWPD&(/$'.G\____D(D<).C\____
+MZZ>)'"3H_/___^N)C888`0``QX8D`0```0```,>&&`$```````")MAP!``#'
+MAB`!````````B40D!(U&)(D$).C\____Z5____^-M"8`````C;PG`````%57
+M5E.#[#R+1"10B40D&(MH)(MX,(MU)(7V#X0"`@``B?/'1"0<`````.L*C70F
+M`(L;A=MT(#G[=/:+4PB+3PB+0P0S1P0QT0G!=>2)7"0<BQN%VW7@BT0D'(7`
+M#X3Y````BTPD'(M'#(M1#(M)$(E$)"")5"00BU<0B4PD%#G1B50D)'):=P8Y
+M1"00<E*)?"0$B2PDZ/S___^`35`0BT0D&(D$).C\____B6PD4(/$/%M>7UWI
+M_/___XVV`````(M$)""+5"0DBTX(`T<$$U<(,T8$,=$)P71`BS:%]G0-BUX4
+MA=MTV8LVA?9U\XM,)!S'1Q0`````BT$$`T$,BU$($U$0B4<$BT0D$"E'#(E7
+M"(M4)!095Q#K@(M,)!R+400!5"00BTD($4PD%(M$)!"+5"04BTPD'(E&!(M&
+M#(E6"(M6$`-'#!-7$"M!#!M1$(E&#(E6$.DS____,=OK!Y"+-H7V=%F+3A2%
+MR77SBU8$BTX(BT<$B50D,(M7"(E,)#2+3"0TB40D*`-'#(E4)"P35Q`S1"0P
+M,=$)P71^BT0D,(M4)#2+3"0L`T8,$U80,T0D*#'1"<%UIXET)!SKH8M4)!S'
+M1Q0`````A=)T*(M,)!R+002+40B)1P2+00R)5PB+41`!1PP15Q")3"0$B2PD
+MZ/S___^%VP^$G/[__XM##(M3$`%'#!%7$(E<)`2)+"3H_/___^E__O__B?/I
+M/O___\='%`````"-M"8`````Z67^__^-="8`C;PG`````%4Q[5=64X/L+(M\
+M)$R+1"1$BU0D2(7_B40D$(E4)!0/A``!``"+5"1,BVHPA>T/A/$```"+1"1`
+MBU@DA=L/A)$```#'1"08`````,=$)!P`````ZPPY1"1,=`V+&X7;=$F+0Q2%
+MP'7MBTL0.4PD%(M3#'<,<FHY5"00=F2-="8`A<!UUX7M=-.+102+50B+2P@#
+M10P351`S0P0QT0G!=;N)7"0<BQN%VW6WBT0D'(7`=!:+3"0<BT$,BU$0`T4,
+M$U40.50D%'8QBT0D&(7`#X5^````,>V#Q"R)Z%M>7UW#BW0D&(7V=`N+="08
+M.TX0=X]S'XE<)!CKAXVT)@````!S1(EL)!B+1"08A<!TQHGVZT`[5@P/@V7_
+M__^)7"08D.E;____BTPD0(M<)!0Y62QRH@^'_/[__XMT)!`Y<2ARD^GN_O__
+M.40D$`^'>/___^NPBUPD0,=$)`0$````BP.)!"3H_/___X7`B<4/A&3___^)
+M6"2+="1`BTXXBUX\@<$``/[_B<B#T_\E``#^_XE$)""#1"0@`8E<)"2#5"0D
+M`#';BU8DA=)T(XVV`````(M"%(7`=!"+2"BX`0```"M,)"#3X`G#BQ*%TG7C
+M,<FX`0```-/@A<-T*H/!`8/Y!'7MQT4H`````,=%+`````")+"0Q[>C\____
+M@\0LB>A;7E]=PXG*B<C!^A\#1"0@$U0D)(E%*(G1"<&)52QTT8MT)!2+7"00
+MBT0D0(EU&(MT)!B)712+7"00BU8$BTX(BW0D%(D<)(ET)`3H(=W__X7`=)V)
+M:!2)13"+="1`@$Y0$(DT).C\____Z6C^__^)]E93@^P$BW0D$(M&)(7`=0CK
+M3XL`A<!T28M0%(72C78`=/"+6@R%VW0N@'LP`'0H,<GK"P^V0S"#P0$YR'X9
+M.52+2'7O#[9#,,=$BT@`````@\$!.<A_YXD4).C\____ZZB)-"3H_/___XM6
+M5(M&8(D$)/]29(ET)!"#Q`1;7NG\____C;8`````C;PG`````%93@^P$BW0D
+M$(M>)(!F4+^%VW0PBT,4A<!T"(D$).C\____BQN%VW7KBU8DA=)T%(M"%(7`
+M=`>+2`R%R704BQ*%TG7LB70D$(/$!%M>Z?S___^)!"3H_/___XM6).O-D%57
+M5E.#[`R+1"0@BV@0B40D!(V%L````(D$)(U]#.C\____BUT,QX4D`0``````
+M`#G[=0CK+XL;.?MT*8V#V/W__X!X"`%U[O9`4$!TZ/:`'`(```%TWXD$).C\
+M____BQLY^W77BUT4C744.?-T$I"-0_2)!"3H_/___XL;.?-U[XMU##G^#X2N
+M````C70F`(V&V/W__X!X"`1V"XM8#(7;#X1!`0``BS8Y_G7CBUT,.?L/A((`
+M``#&1"0+`.L'D(L;.?-T/HV3V/W__X!Z"`%U[O9"4"!TZ(M")(!B4-N%P'4/
+MZ<@```"+`(7`#X2^````BT@4A<ET[XL;QD0D"P$Y\W7"BUT,.=]U"^LMC78`
+MBQLY^W0DC8/8_?__BV@<A>UX'_:`'`(```%UY(D$).C\____BQLY^W7<@\0,
+M6UY?7</V@!P"```!=,4/ME`(@/H$=G:+<`R%]G6U]H!(`0``0'6LBY!D`0``
+MA=)T!3E"!'6=#[9P,(7V?B0QR8M4B$B%TG03@'H(!'8-]H)(`0``0`^%>/__
+M_X/!`3GQ==Z)!"3H_/___^ED____C70F`(!\)`L`#X4%____B10DB?;H_/__
+M_^GV_O__@.H!C78`#X4Z____]D!0`HVV``````^$*O___^NWB00DD(UT)@#H
+M_/___^FM_O__C;8`````5U93@^P0BWPD((V'L````(D$).C\____A<")QG15
+MBU\,B7@0@\<,QP`!````QT`$8#P#`#G[B48(QT`,`````'4(ZR2+&SG[=!Z-
+M@]C]__^`>`@!=>Z)="0$B00DZ/S___^+&SG[=>*+!H/H`87`B09T!X/$$%M>
+M7\.)="0@@\006UY?Z7?]__^-M"8`````@^P<B70D%(MT)"")7"00B7PD&(M>
+M$,=#(`````#VAAP"```8=7R+AI@```"%P'5R#[9#**@!=6JH`HU["'06.7L(
+M=00Y&W04B?#H`=;___9#*`%U38M+"#GY=58/MD9..4,0<A+K.XGPZ"+2__\/
+MMD9..4,0<RN)\.CRT?__A<")PG0>#[=`9&8E_S!F/00@==4Y&W5+]D92`G3+
+M@$LH`NO%BUPD$(MT)!2+?"08@\0<PXM[$(7_=>F+$8M!!(E"!(D0BU$,B?")
+M"8E)!(M<)!"+="04BWPD&(/$'.FOT?__QD)F`8D4).C\____B?#H?-'__XG"
+MZ6S___^0C70F`(/L'(E<)!"+7"0@B70D%(E\)!B)V(M[*.A#T?__@'MD!(MW
+M$(G"='B+0W#'1B0`````B3+'0A``````B4((BT8$B5H,B58$QT-PP$`#`(E"
+M!(D0#[9'3CE&$','BT8@A<!T$(M<)!"+="04BWPD&(/$',.-1A3'1B`!````
+MB40D!(L'@\`LB00DZ/S___^+7"00BW0D%(M\)!B#Q!S#B?;V0V4P=`KV1B@"
+M#X1X____QD-F`8MT)!2)7"0@BWPD&(M<)!"#Q!SI_/___XUT)@"#[!R)="00
+MBW0D((E<)`R)?"04B6PD&(GPZ'+0__^+7BB+>Q")Q8-O$`$/MD9F/`UT7CP1
+M#X1]````/`MT8CP0#X20````BT4(B49PB30DZ/S___^+1R"%P'4;C4<4QT<@
+M`0```(E$)`2+`X/`+(D$).C\____BUPD#(MT)!"+?"04BVPD&(/$',.-M@``
+M``"`?F0`=;"`?F<`=6K&1F<!QD9F`(M7#(U'"(EO#(E%`(E5!(DJZYV)V.C"
+MT___A<!U"`^V1F<\`79"#[9&9CP0#X5P____@'YD`P^$9O___XM#$(ES$(E<
+M)`3'!"0#````B40D".C\____BT0D"(E#$.E`____QD9F$.O*@\`!B$9GZXR0
+MD)"0D)"0D)"0D)!64XL=`````(MT)`R%VW0MBU,,C4L,.<IU#.L;C70F`(L2
+M.<IT$8V"V/W__SFP6`(``'7L6U[#BQN%VW73,<"0Z_*-M"8`````C;PG````
+M`(!X!`!U#8$X>P$```^7P`^VP,.!.'L!```/E\`/ML##4XG!#[8:#[8`.-AT
+M%>LID`^V60$/MD(!.,-U$(/!`8/"`83`=>HQTEN)T,,/OM,/OL!;*<*)T,,/
+MOM`/OL,IPNOFC;0F`````(V\)P````!55U93@>R<````BRT`````B40D&(E4
+M)!2%[71!,?:-?"0DBUT(A=MT+8E\)!"-=@"+4P2)?"0$BT,(B00D_U(<@'PD
+M-P!T"3MT)!AT'X/&`8L;A=MUVHMM`(7M=<4QVX'$G````(G86UY?7<.+1"04
+MA<!TZXM4)!2+`@^V5"0[.=!\W(L;A=MTUBG0BU0D%(D"BT0D$(M3!(E$)`2+
+M0PB)!"3_4AR`?"0W`'3(ZZ^)]E575HG.4X'LG````(E$)`RA`````(N\)+``
+M``#'`0````")5"0(A<#'!P````")1"00#X21````O?_____'1"04`````(M4
+M)!"+6@B%VP^$@````(7_#Y5$)!OK%HUV`(L;#[9$)#L!!HM4)!0!%X7;=&&-
+M5"0DBT,$B50D!(M3"(D4)/]0'(M#!(N0A````(72=!.`?"0;`'0,BT,(B00D
+M_]*)1"04@'PD-P!T#\<&`````(/%`<<'`````#M<)`QUG8M$)`B)*('$G```
+M`%M>7UW#BT0D$(L`A<")1"00#X5?____Z^&0C;0F`````%575C'V4X'LC```
+M`(L]`````(7_="^-;"04BU\(A=MT'HM3!(EL)`2+0PB)!"3_4AR+&X!\)"<!
+M@][_A=MUXHL_A?]UU8'$C````(GP6UY?7<.-M"8`````C;PG`````%57B<]6
+M4X'LS````(E4)!B-5"08Z.?]__^)1"00BU0D$+C_____A=(/A/D```"+1"00
+MBW`,,<#&!#@`@\`!@_A$=?2+5"00BTPD$(M"!(U4)"B)5"0$BU$(B10D_U`<
+M@'PD.@]V!<9$)#H/BT0D$(M,)!"+4`2-A"3$````B40D"(M$)!B)1"0$BT$(
+MB00D_U)<A<`/A)@```"+7@R-;@PYZP^$?0```,9$)!<`ZP>0BQLYZW1OC;/8
+M_?__@'X(`77NBT0D$#M&7'7EC8PDH````(M65(E,)`2+1F")!"3_4CSVA"2N
+M`````G7$#[:$)+`````[1"08=;8/MH0DL0```#I$)#ISJ`^VT(N&6`(``(!$
+M)!<!B427"`^V1"07.$0D.G6+,<"!Q,P```!;7E]=PXN$),@```")1P2+A"3$
+M````B0?I4/___XVV`````(/H!3'2@_@'=PS_)(7L#0``N@$```")T,.Z"```
+M`(G0P[H"````B=##N@<```")T,.Z`P```(G0P[H$````B=##N@4```")T,.Z
+M!@```(G0P^L-D)"0D)"0D)"0D)"0D%:)UE,/MH@<`@``B<,/ME(,B<B#\`&#
+MX`'VPB!T`X/((/;!!'0#@\@"@^$"=`.#R`2#XA!T`X/($`^V5@[VP@%T`X/(
+M0(/B`G0"#(`/ME-0]L($=`4-````@/;"`G0%#0```@"#X@%T!0T```$`]D-2
+M`70%#0``!`!;7L.-="8`55>_Z`,``%93@^PLBT0D0(N84`$``(N(3`$```^V
+M:#`/K-D+B<C!ZPOWYVGSZ`,``(G!C1P6BW0D0(M6&(M&%(D,)(E<)`2)ZP^L
+MT`O!Z@N)1"0(B50D#.C\____BTX$#[9)!BG+N0H```#WX_?AA>V)1"0D#XZ2
+M````,?:-=@"+1"1`BURP2(7;=';V@QP"```!=&V`>P@$=F?V@T@!``!P=%Z+
+M4P0/MD,P#[92!BG0BY-0`0``C02`C3P`BX-,`0``#ZS0"VG(Z`,``(M#%,'J
+M"XM3&`^LT`O!Z@N)1"08B<B+3"0DB50D'#'2]W0D&`^O^(7)=`8Y?"0D=@2)
+M?"0D@\8!.?4/A7/___^+1"0D/1`G``!V!;@0)P``@\0L6UY?7<.-="8`C;PG
+M`````(/L+(M$)#")7"0<B70D((E\)"2);"0HBZAD`0``#[9%9CP"#X6J````
+MBT4(BU`4BT@8BT4$B50D$(MT)!")3"04BWPD%(M(%(M8&+@0)P``*<X9WP^L
+M_@O![PN)^@GR=$Z`?10`=5R+15R+56`IR!G:#ZS0"[GH`P``P>H+:=KH`P``
+M]^&)="0(B7PD#(T4$XD$)(E4)`3H_/___[D*````]^$]$"<``'8%N!`G``"+
+M7"0<BW0D((M\)"2+;"0H@\0LPXM$)!"+5"04*T5<&U5@ZYX\`P^$E0```(!]
+M%`!T/HM%"(M8&+[H`P``BT@4B=J)R"M%7!M58`^LV0O!ZPL/K-`+P>H+:?KH
+M`P``]^:)3"0(B5PD#(T4%^EQ____BUU@O^@#``"+35P/K-D+B<CWY\'K"VGS
+MZ`,``(G!BT4(C1P6BU`8BT`4B0PDB5PD!`^LT`O!Z@N)1"0(B50D#.C\____
+MN0H```#WX>DS____@'T4`'0(BT4$Z6;___^+76"_Z`,``(M-7`^LV0N)R/?G
+MP>L+:?/H`P``B<&+102-'!;KGXVV`````(V_`````%93BT@,B<.%R70S#[9!
+M,(3`#[;P=!@QTCE92'06,=+K!CE<D4AT#(/"`3GR=?-;,<!>PXM!)%M>@\`!
+M`=##BT`D6U[#C;8`````C;\`````55>)UU93@^P$B00D#[9H,(7M?E,Q]HL$
+M)(M4L$B%TG0_]H(<`@```70V@'H(!'9!#[9:,(7;?B@QR8VV`````(M$BDB%
+MP'0.]H`<`@```70%.7@D=!.#P0$YV77CC78`@\8!.>YUKS'`@\0$6UY?7<,Y
+M>B1UZHG0Z^^-M@````!55U93@^Q`B40D&(M<)!B(5"07#[9$)%@/ME0D7(E,
+M)!"%VXA$)`^(5"0.#X1/`0``BTPD&(!Y"`</E,"`?"07!P^4PH3`#X48`0``
+MA-(/A2P!``"+3"00A<D/A"<#``#'1"0<_____S'_,>W'1"0@_____\=$)#@`
+M````C70F`(M4)#B+3"14BP21B00DZ/S___^%P(G##X2W````BU0D&(L`.P(/
+MA:D```"`>P@!#X6?````BT0D&(G:Z,#^___'1"0L`````(7`B<9T!XM(,(E,
+M)"R+6R2%VP^$%0$``(G8,=(QR8-X%`!T!H/"`8/1`(L`A<!U[H/Y`'<)@_H#
+M#X;O````QT0D)`````#'1"0H`````,=$)!P`````QT0D(``````#?"0DBU0D
+M$!-L)"B#1"0X`3E4)#@/A3____\/MDPD#X/A#X!\)!<'#X;'`0``,?\Q[8/$
+M0(GXB>I;7E]=PXM,)!@/MD$P/`$/A.#^__^$TG0(A,`/A?L!``"+7"00A=L/
+MA/L!```QVS'_,>W'1"0<_____\=$)"#_____ZSF`>`@!=:J+4"R+0"B)T0G!
+M=)X!QQ'5.50D('(0=P8Y1"0<=@B)1"0<B50D((/#`3M<)!`/A&3___^+5"14
+MBP2:B00DZ/S___^%P'6TZ5____^%]L=$)"0`````QT0D*`````!T#HM&%(M6
+M&(E$)"2)5"0HA=L/A)8```#'1"0P`````.LDC;0F`````(M#%#G&=!"+5"0L
+MA=)T'H7`#X2A````BQN%VW0VA?:0==Z+5"0LBT,4A=)UXH7`=>:+4Q`[5"0H
+MBT,,<MIW!CM$)"1VTHL;B40D)(E4)"B%VW7*BT0D+(7`="J+="0PA?9T(HM,
+M)#"+00R+41"+3"0L`T$,$U$0.50D*'<(<F(Y1"0D<ER+1"0H.40D(`^"8_[_
+M_W<.BU0D)#E4)!P/AE/^__^+1"0DBU0D*(E$)!R)5"0@Z3[^__^+3"0LBT$$
+MBU$(`T$,$U$0BTL(,T,$,=$)P0^%6?___XE<)##I4/___XE$)"2)5"0HZYH/
+MMD0D%_\DA0P.``"#?"00`0^&(O[__X-\)!`"BWPD'(ML)"`/AA/^__\/ML&Z
+M_____XG!BT0D'-/BB=/1;"00(="+5"0@BTPD$,'['R':B=8/K_'WX8G'C2P6
+MZ=W]__^+5"00A=(/A?H````Q_S'MQT0D'/_____'1"0@_____^FA_?__@WPD
+M$`,/AJG]__\/ML&Z_____XG!BT0D'-/BBTPD$(G3P?L?(="+5"0@@^D"(=KK
+MF8-\)!`"#X9X_?__#[;!NO____^)P8M$)!S3XHM,)!")T\'['R'0BU0D((/I
+M`2':Z67___^`?"0.`0^&,0$``(!\)`X"#X8,____#[9T)`XQTHM$)!#W]H72
+MB<,/A2+]__^#ZP$/CAG]__^#[@'W[HG&#[;!B<&+1"0<B=>Z_____]/BB=,A
+MT(M4)"#!^Q^)P0^OSXE$)`0AVHG3#Z_>B50D"/?F`=F)QXTL$>G7_/__BT%(
+M,?:%P'4?Z<7\__\Y="00#X;G_/__BU0D&(M$LDB%P`^$J_S__XM,)%2+6"2+
+M!+&)!"3H_/___SG#=!6+5"08@\8!#[9",#GP#X:N_/__Z[N+3"08#[9!,`^V
+MT#E4)!")5"0T#X)G_/__A,!T=HM!2#'VA<!U+.E5_/__D(M,)!B#Q@$/MD$P
+M#[;0.?*)5"0T=E&+3"08BT2Q2(7`#X0N_/__BU0D5(M8)(L$LHD$).C\____
+M.<-TQ.D3_/__#[;!NO____^)P8M$)!S3XHM,)!")T\'['R'0BU0D("':Z0/^
+M__^+3"08#[;`BW2!1(MY%(MI&(M&)(M8)(7;=0CK+XL;A=MT*8M#%(7`D'7R
+MBTXPBT$$BU$(`T$,$U$0BTL(,T,$,=$)P777`WL,$VL0BU0D-#E4)!`/AI?[
+M__^+3"14C1R1ZSJ-M@````"+3"08BP`[`0^%=OO__X!Z"`$/A6S[__\#>BB+
+M1"00$VHL@\,$@T0D-`$Y1"0T#X14^___BP.)!"3H_/___X7`B<)UO.D[^___
+MC;0F`````//#C;0F`````(V\)P````!6BS4D`@``4XM,)`R-5@&)T,'X'\'H
+M'(T<`H/C#RG#N/____\['2`"``!T;8L!:]8LB8)``@``BT$$B8)$`@``BT$(
+MB8)(`@``BT$,B8),`@``BT$0B8)0`@``BT$4B8)4`@``BT$8B8)8`@``BT$<
+MB8)<`@``BT$@B8)@`@``BT$DB8)D`@``BT$HB1TD`@``B8)H`@``,<!;7L.-
+M="8`@^P\BU0D0(E<)#2+3"1(B70D.(M<)$P/MW0D4`^V0@@\`70R/`1T2(U4
+M)!2#?"1$`1G`@\`9B$0D$(U$)`AFB7((B00DZ/S___^+7"0TBW0D.(/$/,.+
+M@E@"``"-5"04B4PD%(E<)!B)1"0,Z[Z)]HM",(M2)`-(!(N26`(``!-8"(E,
+M)!2)5"0,C50D%(E<)!CKF(VV`````(V_`````%93@^PDQD0D'`:+6`B%VW0B
+MC70D'(M#"(E$)""+0P2)="0$QP0D`````/]08(L;A=MUXH/$)%M>PXVT)@``
+M``!55U93@^P$BU0D&(ML)!R+0B@/MUI0BXAD`0``B=^+,,'G"8!Y%`!T"O9"
+M900/A8H````/MU%:P>()BXY@`0,`A?^+MF0!`P")-"1T7(G0,=+W]HT$0(G3
+MC32!C4T0ZR^+!@'8B4'XBP0D*=@Y^(E!\'8"B?@IQXG-A?^)0?#'0?0`````
+MC4D0=!^#Q@PQVXML)""%[77),=*)V`-&!!-6"(E!^(E1_.N^QT7T`0```(/$
+M!+@!````6UY?7<,/MU%8#[=!6BG"*=K!X@GI:?___^L-D)"0D)"0D)"0D)"0
+MD%6)U5=64X/L!(D$)(!Z,`!T:3'_ZR:+%"2+1C"+2C"+4`B+0`2+60@S000Q
+MTPG#=#0/MD4P@\<!.?A^/XMTO4B%]G3M@'X(!';,BP0DB?+HK/___X3`=-F#
+MQ`2X`0```%M>7UW#BQ0DBT8D.T(D=.@/MD4P@\<!.?A_P8/$!#'`6UY?7<.-
+M="8`C;PG`````%6)U5>)QU93@'@P`'1`,?;K%(GJB=CHY?___P^V1S"#Q@$Y
+M\'XHBURW2(7;=.V`>P@$=]Z)ZHG8Z#/___^$P`^40S0/MD<P@\8!.?!_V%M>
+M7UW#C;8`````C;PG`````%93B=.`>`@!=`5;,<!>PX72=%&+DF0!``"%TG1'
+MBW($.=YT1(M0)(72=#&0C70F`(M"%(7`=!^%VW4)D(UT)@#KR(G(BT@,A<EU
+M]SG8C78`=`0Y\'6TBQ*%TG746[@!````7L.)WNN\BW((Z[>-=@"+1"0$BU`0
+MA=)X!H-X%`-W!\=`+/[____SPXVV`````(M$)`2!>!#'````=@F!>!3'````
+M=P?'0"S^____\\.0BT0D!(%X$,<```!V"8M(%(7)>`+SP\=`+/[____#B?:+
+M1"0$BU`0A=)X!H-X%`-W!\=`+/[____SPXVV`````(M$)`2#>!`#=@:#>!1+
+M=P?'0"S^____\\.-M"8`````BT0D!(-X$`-V!H-X%%=W!\=`+/[____SPXVT
+M)@````"+1"0$@W@0`W8&@W@40W<'QT`L_O____/#C;0F`````(M$)`2#>!`'
+M=@:#>!0/=P?'0"S^____\\.-M"8`````BT0D!(-X$`=V!H-X%$-W!\=`+/[_
+M___SPXVT)@````"+1"0$@W@0`W8&@W@4`W<'QT`L_O____/#C;0F`````(M$
+M)`2#>!`'=@F!>!3_````=P?'0"S^____\\.-="8`BT0D!(-X$`=V"8%X%*,,
+M``!W!\=`+/[____SPXUT)@"+1"0$@W@0!W8)@7@4)PT``'<'QT`L_O____/#
+MC70F`(M$)`2#>!`'=@F!>!2K````=P?'0"S^____\\.-="8`BT0D!(-X$`MV
+M!H-X%"=W!\=`+/[____SPXVT)@````"+5"0$BT(8@WH0`XL`=@R-!(4$````
+M.4(4<P?'0BS^____\\.-M@````"-OP````"+5"0$BT(8@WH0`XL`=@R-!(4$
+M````.4(4<P?'0BS^____\\.-M@````"-OP````!3@^P$BUPD#(M#&(-[$`.+
+M`'8)@7L4K0```'<,QT,L_O___X/$!%O#B00DZ/S___^%P'3H@\0$6\.-M"8`
+M````4X/L!(M<)`R+0QB#>Q`#BP!V"8%[%-<```!W#,=#+/[___^#Q`1;PXD$
+M).C\____A<!TZ(/$!%O#C;0F`````%.#[`2+7"0,BT,8@WL0`XL`=@F!>Q3Y
+M````=PS'0RS^____@\0$6\.)!"3H_/___X7`=.B#Q`1;PXVT)@````"#[`R)
+M7"0$BUPD$(ET)`B+0QB#>Q`(BTL<BS!V!H-[%`1_$\=#+/[___^+7"0$BW0D
+M"(/$#,,/ME`(BT`$A-*)`8A1!'0@@3G#`0``=M6)-"3H_/___X7`=,F+7"0$
+MBW0D"(/$#,,]PP$``':VZ]^0@^P,B70D"(MT)!")7"0$@7X0LP```'8&@WX4
+M!W<3QT8L_O___XM<)`2+="0(@\0,PXM&&(L8B1PD@^L!Z/S___^#^_UWWX7`
+M=-2`>`@$B?9VS(N(9`$``(7)=<+KQXGV@^P0B70D"(MT)!2)7"0$B7PD#(-^
+M$`AV!H-^%`=W%\=&+/[___^+7"0$BW0D"(M\)`R#Q!##BWX8BQ^)'"2#ZP'H
+M_/___X/[_7<1A<!T!H!X"`1W%<=&+/[___^-1P3HC.G__RP!=;?KO(N89`$`
+M`(7;=>'KYHUV`(V\)P````"#[!2)?"0,BWPD&(E<)`2)="0(B6PD$(M7&(LJ
+MC02M!````#E'$')*BW<4A?9X0X`]``````)T.C'VA>UU"XGVZS<Y[G0SBU<8
+M@\8!BQRRB1PDZ/S___^%P'07B1PDZ/S___^)PHL`.T<(=2'V0E`!==#'1RS^
+M____BUPD!(MT)`B+?"0,BVPD$(/$%,/'1RS\____Z^.-=@"-O"<`````@^P4
+MB7PD#(M\)!B)7"0$B70D"(EL)!"!?Q"'````BW<8=@V#?Q0#=R>-M"8`````
+MQT<L_O___XM<)`2+="0(BWPD#(ML)!"#Q!3#D(UT)@`/MD8!/`AWV#'MA,!U
+M'HGVZ]6)'"3H_/___XL`.T<(D'4A@\4!B>@X1@%VNXGJ#[;"BUR&:(D<).C\
+M____A<!UT>N=QT<L_/___XVV`````.N5C;0F`````(V\)P````"+1"0$@W@0
+M`W8&@W@4`W\'QT`L_O____/#C;0F`````(/L"+H0````BTPD#(D<)(ET)`2+
+M01B+6`B+<`R+01"%VW0#C580.<)W"X7;BT$4=0LYQG8'QT$L_O___XL<)(MT
+M)`2#Q`C#B?:-O"<`````@^P4B7PD#(M\)!B)7"0$B70D"(EL)!"!?Q"O````
+MBW<8=@V#?Q0#=R>-M"8`````QT<L_O___XM<)`2+="0(BWPD#(ML)!"#Q!3#
+MD(UT)@`/MD8!/!!WV#'MA,!U'HGVZ]6)'"3H_/___XL`.T<(D'4A@\4!B>@X
+M1@%VNXGJ#[;"BUR&<(D<).C\____A<!UT>N=QT<L_/___XVV`````.N5C;0F
+M`````(V\)P````"#[!2)7"0$BUPD&(ET)`B)?"0,B6PD$(-[$`2+<QA^!H-[
+M%`-W&\=#+/[___^+7"0$BW0D"(M\)`R+;"00@\04PXGPZ+CF__\L`77:#[9&
+M#3Q`=](Q[83`=1_KT8UT)@")/"3H_/___XL`.T,(=2&#Q0&)Z#A&#7:TB>H/
+MML*+?(9\B3PDZ/S___^%P'72ZY;'0RS\____ZY2-M"8`````@^P4B5PD!(M<
+M)!B)="0(B7PD#(EL)!"+>QB!>Q"S````BS=V!H-[%`-W&\=#+/[___^+7"0$
+MBW0D"(M\)`R+;"00@\04PXDT).C\____A<!TV8DT).C\____BP`[0PAT"<=#
+M+/S____KR(/'!`^V1P$\$'>V,>V$P'4>Z[6-=@")-"3H_/___XL`.T,(==*#
+MQ0&)Z#A'`7:9B>H/ML*+=(=PB30DZ/S___^%P'72Z7C___^-M@````"-O"<`
+M````@^P4B5PD!(M<)!B)="0(B7PD#(EL)!"+>QB#>Q`(BS=V!H-[%`-W&\=#
+M+/[___^+7"0$BW0D"(M\)`R+;"00@\04PXDT).C\____A<!TV8DT).C\____
+MBP`[0PAT"<=#+/S____KR(/'!(GXZ"_E__\L`76S#[9'#3Q`=ZLQ[83`=1OK
+MJHDT).C\____BP`[0PAURH/%`8GH.$<-=I&)Z@^VPHMTAWR)-"3H_/___X7`
+M==+I</___Y"-M"8`````BT0D!(M0$(72>`:#>!0K=P?'0"S^____\\.-M@``
+M``"#[`R)7"0$BUPD$(ET)`B+0QB#>Q`(BS!V-HM+%(7)>"^)-"3H_/___X7`
+M=".)-"3H_/___XL`.T,(=!O'0RS\____BUPD!(MT)`B#Q`S#D,=#+/[___^+
+M7"0$BW0D"(/$#,.-M@````"-O"<`````@^P,B5PD!(M<)!")="0(BT,8@WL0
+M"(LP=C:+0Q2%P'XOB30DZ/S___^%P'0CB30DZ/S___^+`#M#"'0;QT,L_/__
+M_XM<)`2+="0(@\0,PY#'0RS^____BUPD!(MT)`B#Q`S#C;8`````C;PG````
+M`(/L#(E<)`2+7"00B70D"(M#&(-[$`B+,'8VBT,4A<!X+XDT).C\____A<!T
+M(XDT).C\____BP`[0PAT&\=#+/S___^+7"0$BW0D"(/$#,.0QT,L_O___XM<
+M)`2+="0(@\0,PXVV`````(V\)P````"#[`R)7"0$BUPD$(ET)`B+0QB#>Q`-
+MBS!V-HM#%(7`>"^)-"3H_/___X7`=".)-"3H_/___XL`.T,(=!O'0RS\____
+MBUPD!(MT)`B#Q`S#D,=#+/[___^+7"0$BW0D"(/$#,.-M@````"-O"<`````
+M@^P,B5PD!(M<)!")="0(BT,8@WL0#8LP=C:+0Q2%P'XOB30DZ/S___^%P'0C
+MB30DZ/S___^+`#M#"'0;QT,L_/___XM<)`2+="0(@\0,PY#'0RS^____BUPD
+M!(MT)`B#Q`S#C;8`````C;PG`````(/L#(E<)`2+7"00B70D"(M#&(-[$`V+
+M,'8VBT,4A<!X+XDT).C\____A<!T(XDT).C\____BP`[0PAT&\=#+/S___^+
+M7"0$BW0D"(/$#,.0QT,L_O___XM<)`2+="0(@\0,PXVV`````(V\)P````"#
+M[`R)7"0$BUPD$(ET)`B+0QB#>Q`#BS!V6XM#%(7`>%2)-"3H_/___X7`=$B)
+M-"3H_/___XG"BP`[0PAT$\=#+/S___^+7"0$BW0D"(/$#,.`>@@$=AZ+@F0!
+M``"%P'04@'AG`'4.#[:"20$``(/@&#P(=`?'0RS^____BUPD!(MT)`B#Q`S#
+MD(VT)@````"#[`R)7"0$BUPD$(ET)`B+0QB#>Q`#BS!V/8M3%(72>#:)-"3H
+M_/___X7`="J)-"3H_/___XG"BP`[0PAT$\=#+/S___^+7"0$BW0D"(/$#,.`
+M>@@!=`?'0RS^____BUPD!(MT)`B#Q`S#C;8`````@^P,B5PD!(M<)!")="0(
+MBT,8@WL0`XLP=CV+2Q2%R7@VB30DZ/S___^%P'0JB30DZ/S___^)PHL`.T,(
+M=!/'0RS\____BUPD!(MT)`B#Q`S#@'H(`70'QT,L_O___XM<)`2+="0(@\0,
+MPXVV`````(/L$(E<)`2+7"04B70D"(E\)`R+0QB#>Q`'BS"+>`1V?XM#%(7`
+M>'B)-"3H_/___X7`=&R)/"3H_/___X7`B?9T7HDT).C\____B3PDB<;H_/__
+M_XG"BP8[0PAT%\=#+/S___^+7"0$BW0D"(M\)`R#Q!##.P)UY8M&!(!X!@!T
+M'X!Z"`%U&8M&0`M&1'01BX9D`0``A<!T#H!X9P!T")#'0RS^____BUPD!(MT
+M)`B+?"0,@\00PXGVC;PG`````(/L#(E<)`2+7"00B70D"(M#&(-[$`>+,'8]
+MBT,4A<!X-HDT).C\____A<!T*HDT).C\____B<*+`#M#"'03QT,L_/___XM<
+M)`2+="0(@\0,PX!Z"`1W!\=#+/[___^+7"0$BW0D"(/$#,.-M@````"#[`R)
+M7"0$BUPD$(ET)`B+0QB#>Q!7BS!V1HM#%(7`>#^)-"3H_/___X7`=#.)-"3H
+M_/___XG"BP`[0PAT$\=#+/S___^+7"0$BW0D"(/$#,.`>@@$=@F+0@R%P'0)
+MB?;'0RS^____BUPD!(MT)`B#Q`S#C;8`````C;PG`````(/L#(ET)`B+="00
+MB5PD!(M&&(-^$$.+&'8XBT84A<!X,87;=#2)'"3H_/___X7`D'0@B1PDZ/S_
+M__^)PHL`.T8(=`G'1BS\____ZPV`>@@!=`?'1BS^____BUPD!(MT)`B#Q`S#
+MC70F`(V\)P````"#[`R)="0(BW0D$(E<)`2+1AB#?A`(BQAV.(M&%(7`>#&%
+MVW0TB1PDZ/S___^%P)!T((D<).C\____B<*+`#M&"'0)QT8L_/___^L-@'H(
+M`70'QT8L_O___XM<)`2+="0(@\0,PXUT)@"-O"<`````BT0D!(M($(7)>`F+
+M4!2%TG@"\\/'0"S^____PXUT)@"+1"0$BU`0A=)X!H-X%"MW!\=`+/[____S
+MPXVV`````(M$)`2+2!"%R7@&@W@4?W<'QT`L_O____/#C;8`````@^P0B7PD
+M#(M\)!2)="0(OA````")7"0$BU\8BU<0#[9#"P^V2PS!X`F`^0)T,CG6=Q&`
+MZ0&+5Q2^$````'11.=9V(L='+/[___^+7"0$BW0D"(M\)`R#Q!##C;8`````
+MC7`0Z\F+`XD$).C\____A<!TT(L#B00DZ/S___^)PHL`.T<(=!/'1RS\____
+MZ[N0C7`0.=9WK.O,@'H(`8UV`'6AZZ:-M@````"-OP````"#[!")?"0,BWPD
+M%(ET)`B^%````(E<)`2+7QB+5Q`/MT,0#[9+$L'@"8#Y`G0R.=9W$8#I`8M7
+M%+X4````=%$YUG8BQT<L_O___XM<)`2+="0(BWPD#(/$$,.-M@````"-<!3K
+MR8L#B00DZ/S___^%P'30BP.)!"3H_/___XG"BP`[1PAT$\='+/S____KNY"-
+M<!0YUG>LZ\R`>@@!C78`=:'KIHVV`````(V_`````(/L#(E<)`2+7"00B70D
+M"(M#&(-[$`.+,'8VBT,4A<!X+XDT).C\____A<!T(XDT).C\____BP`[0PAT
+M&\=#+/S___^+7"0$BW0D"(/$#,.0QT,L_O___XM<)`2+="0(@\0,PXVV````
+M`(V\)P````"#[!2)?"0,BWPD&(E<)`2)="0(B6PD$(M7&`^V*HT$K00````Y
+M1Q!R/X-_%`-V.3'VA>UU">LX.>YT-(M7&(/&`8L<LHD<).C\____A<!T&(D<
+M).C\____BP`[1PATV,='+/S____K!\='+/[___^+7"0$BW0D"(M\)`R+;"00
+M@\04PXVV`````(V\)P````"#[!2)?"0,BWPD&(E<)`2)="0(B6PD$(M7&`^V
+M*HT$K00````Y1Q!R/X-_%`-V.3'VA>UU">LX.>YT-(M7&(/&`8L<LHD<).C\
+M____A<!T&(D<).C\____BP`[1PATV,='+/S____K!\='+/[___^+7"0$BW0D
+M"(M\)`R+;"00@\04PXVV`````(V\)P````"#[`R)7"0$BUPD$(ET)`B+0QB#
+M>Q`'BS!W%L=#+/[___^+7"0$BW0D"(/$#,.-=@")-"3H_/___X7`=-Z)-"3H
+M_/___XL`.T,(=-;'0RS\____BUPD!(MT)`B#Q`S#B?:+5"0$BT(8@WH0`XL`
+M=@R-!(4$````.4(4<P?'0BS^____\\.-M@````"-OP````!3@^P(BUPD$(M#
+M&(-[$`(/M@!V/(M3%(72>#4QT@^VP.B+VO__A<")PG0EBT`$BT!\A<!T&XM"
+M##M#"'0:QT,L_/___X/$"%O#C;0F`````,=#+/[___^#Q`A;PXUT)@"#[`RY
+M'````(E<)`2+7"00B70D"(MS&(M#$`^V5@2`^@)T+3G!=Q&`Z@&+0Q2Y"```
+M`'1..<%V(,=#+/[___^+7"0$BW0D"(/$#,.0C70F`(M.&(/!'.O+BP:)!"3H
+M_/___X7`=-*+!HD$).C\____B<*+`#M#"'05QT,L_/___^N]BTX8@\$(.<%W
+MK.O*@'H(`76D@'X'$'>>C;8`````ZYV-M"8`````C;PG`````%.+1"0(BUPD
+M#(M(+#'`@WPD$`"+41AT'8!Z!`%T&8U"'(E#"(M"&,=#!`$```")`[@!````
+M6\.+01R#P`B)0PCKXHVT)@````"-O"<`````@^P0B70D"(MT)!2)7"0$B7PD
+M#(M6$(M>&(/Z"W9EBWX4A?]X7H![!P!U=0^V0P;!X`F-2`PQP#G*<DB#P`0Y
+MQW)!BP.)!"3H_/___X7`=#.+`XD$).C\____B<*+`#M&"'0)QT8L_/___^L>
+M@'H(`741#[9#!@^W4P0!T#T`(```?@?'1BS^____BUPD!(MT)`B+?"0,@\00
+MPXVV``````^V0P:Y#````,'@">N)B?:#[!")7"0$BUPD%(ET)`B)?"0,BTL0
+MBW,8@_D'=B6+>Q2%_W@>A<D/ME8$#[9&!7@2#[;`#[;2`=#!X`F#P`@YQW,7
+MQT,L_O___XM<)`2+="0(BWPD#(/$$,.+!HD$).C\____A<!TVXL&B00DZ/S_
+M__^)PHL`.T,(=`G'0RS\____Z\:`>@@!=;F-M@````#KN(VT)@````"-O"<`
+M````5XG'5HG64X/L$*'``@``@_C_=&^+4@R[P`(``.L,B?:#PQ2+`X/X_W19
+M.=!U\H/``710QT8L`````(DT)(UV`/]3!(M&+(7`=4V`OX0!`P``=3"+2Q"%
+MR0^%C0```(N7*`$``(72=#J+ET0!``"-AT`!``")MT0!``")!HE6!(DRZPW'
+M1BS^____B30D_U8H@\006UY?PXDT)/]6*(UV`.ONBT,(B;<H`0``A<!T/(M#
+M#,>'+`$```$```")MS0!``#'AS@!````````B8<P`0``B30D_U,(BX<L`0``
+M@^@!A<")ARP!``!UI8DT)/]3#.N=C;8`````C;PG`````%.+"(V8"`(``,>`
+MV`$```__``")F.0!``")B-0!``"+B%@"``#'@-P!```(````QX#@`0``````
+M`,>`[`$```````")B`@"``")4P2-D,P!``#'@/0!``"@4`,`BX#4`0``6^F8
+M_O__D(VT)@````"#[`R)7"0$BUPD$(ET)`B+<P@YGB@!``!T%HE<)!"+2RB+
+M="0(BUPD!(/$#/_AB?:+CD`!``"-AD`!``#'AB@!````````.<%TT(L1BT$$
+MB4($B1")RHGPB0F)203H+O[__^NVC;8`````C;\`````BT0D!(N`6`(``,.0
+MC70F`%=64X/L-(M,)$B-="0(#[94)$2)\(G+Q@``C7PD-(/``3GX=?*`^@>(
+M5"00#X2M````@/H&=#2`^@1T+X#Z!9!T*8#Z"'0D@/H<=&Z`^@.0="Z+@U@"
+M``")-"2)1"0,Z/S___^#Q#1;7E_#]H%(`0```733@/H<QD0D%`%USNLZBTL0
+MA<ETRP^V062(1"04@'ED`'6]BT%(BU%,B40D&(E4)!P/MT%0B40D(`^V0670
+MZ(/@`8A$)!7KF(N!3`$``(N14`$``(E$)!0/MX$4`@``B50D&&:)1"0<Z7/_
+M__^+00R%P'0*BX!8`@``B40D%(M9).E:____D(VT)@````"+1"0(H@````##
+MC;8`````4XM$)`B+7"0,BU`,C4@,.<IU".LHBQ(YRG0BC8+8_?__@'@(`77N
+M]H`<`@```73EA=MT"XL2@^L!.<IUWC'`6\/K#9"0D)"0D)"0D)"0D)"#[!R)
+M7"04B<.)="08BT`@B=:)1"0$BP.)!"3H_/___P^V4&6)6"B)6"R)<#"#XL^#
+MRB"(4&7&0&0$QD!F`,=`</!V`P")!"3H_/___XM<)!2+="08@\0<PXVT)@``
+M``"#[!R)="00B7PD%(G'B6PD&(G5B5PD#(L8BT`@B4PD"(D<)('#F````(E$
+M)`3H_/___XD<)(G&Z/S____'``````#'0`0`````BU<4BT\8QT`@`````,=`
+M$`````")4`B-4!2)2`S'0!P`````QT`D`````(E0%(E0&,=`*`````")1CS&
+M1F0$BT0D"(E^*(EN+,9&9@")1G")-"3H_/___XM<)`R+="00BWPD%(ML)!B#
+MQ!S#C70F`(V\)P````"#[!R)7"00B<N)="04B=:)?"08B<>#`0&+0"")1"0$
+MBP>)!"3H_/___X/^`8G!&<`/ME%E@\`"@^`#P>`$B7DH@^+/"<*(467&060$
+MB5DLQD%F`(!_"`1V%XN'9`$``(7`=`W'07!@>`,`ZPN-="8`QT%P$'@#`(D,
+M).C\____BP>)!"3H_/___XM<)!"+="04BWPD&(/$',.-M"8`````55=64X/L
+M'(M\)#"+1"0TBVPD.(V/L````(E$)!2)3"08B0PDZ/S___^%P(G&#X2.````
+MBU\,QP`!````BT0D%(E^$(/'#(EN"#G[B48$QT8,`````'4/ZS2-M"8`````
+MBQLY^W0GC8/8_?__@'@(`77N]H`<`@```73EB?&Z`0```.C9_O__BQLY^W79
+MBP:#Z`&%P(D&=`B#Q!Q;7E]=PXM,)!B)="0$B0PDZ/S___^+3"04B6PD,(/$
+M'%M>7UW_X<<$))X"``#H_/___^OAD%575E.#[!R+?"0PBT0D-(ML)#B-C[``
+M``")1"04B4PD&(D,).C\____A<")QG1SBU\,QP`!````BT0D%(E^$(/'#(EN
+M"#G[B48$QT8,`````'0;C8/8_?__@W@<_W0)B?$QTN@H_O__BQLY^W7EBP:#
+MZ`&%P(D&=`B#Q!Q;7E]=PXM,)!B)="0$B0PDZ/S___^+3"04B6PD,(/$'%M>
+M7UW_X<<$)+D"``#H_/___^OA4X/L"(M4)!2+7"00BTH@B5H(A<ET!8M"%(D!
+MB=CH3OG__XE<)!"#Q`A;Z?S___^04XM$)`R+7"0(BY!8`@``C8@(`@``B9C4
+M`0``QX#8`0``#_\``(F(Y`$``(F0"`(``(V0%@(``,>`W`$```@```#'000,
+M````B9#H`0``QX#@`0```````,>`[`$```````")@/`!``#'@/0!``!PK`,`
+M!<P!``")1"0,B5PD"%OI_/___XUT)@"-O"<`````@^P,BT0D$(M0"(F"3`$`
+M`(V"2`$``,>"2`$``#!\`P#'@E`!````````@\(DB40D!(D4).C\____@\0,
+MPXUV`(/L#(M$)!"+4`B)@DP!``"-@D@!``#'@D@!```@?@,`QX)0`0``````
+M`(/")(E$)`2)%"3H_/___X/$#,.-=@"#[`R+1"00BU`(B8),`0``C8)(`0``
+MQX)(`0``$`4$`,>"4`$```````"#PB2)1"0$B10DZ/S___^#Q`S#C78`@^P,
+MBT0D$(M0"(F"3`$``(V"2`$``,>"2`$``!#V`P#'@E`!````````@\(DB40D
+M!(D4).C\____@\0,PXUV`(/L#(M$)!"+4`B)@DP!``"-@D@!``#'@D@!``"P
+MN0,`QX)0`0```````(/")(E$)`2)%"3H_/___X/$#,.-=@"#[`R+1"00BU`(
+MB8),`0``C8)(`0``QX)(`0``\/D#`,>"4`$```````"#PB2)1"0$B10DZ/S_
+M__^#Q`S#C78`@^P,BT0D$(M0"(F"3`$``(V"2`$``,>"2`$``'"]`P#'@E`!
+M````````@\(DB40D!(D4).C\____@\0,PXUV`(/L#(M$)!"+4`B)@DP!``"-
+M@D@!``#'@D@!``"`N@,`QX)0`0```````(/")(E$)`2)%"3H_/___X/$#,.-
+M=@"#[`R+1"00BU`(B8),`0``C8)(`0``QX)(`0``@`@$`,>"4`$```````"#
+MPB2)1"0$B10DZ/S___^#Q`S#C78`@^P,BT0D$(M0"(F"3`$``(V"2`$``,>"
+M2`$``,"M`P#'@E`!````````@\(DB40D!(D4).C\____@\0,PXUV`(/L#(M$
+M)!"+4`B)@DP!``"-@D@!``#'@D@!``!0_`,`QX)0`0```````(/")(E$)`2)
+M%"3H_/___X/$#,.-=@"#[`R+1"00BU`(B8),`0``C8)(`0``QX)(`0``4+X#
+M`,>"4`$```````"#PB2)1"0$B10DZ/S___^#Q`S#C78`@^P,BT0D$(M0"(F"
+M3`$``(V"2`$``,>"2`$``%"^`P#'@E`!````````@\(DB40D!(D4).C\____
+M@\0,PXUV`(/L#(M$)!"+4`B)@DP!``"-@D@!``#'@D@!``"PP`,`QX)0`0``
+M`````(/")(E$)`2)%"3H_/___X/$#,.-=@"#[`R+1"00BU`(B8),`0``C8)(
+M`0``QX)(`0```-0#`,>"4`$```````"#PB2)1"0$B10DZ/S___^#Q`S#C78`
+M@^P,BT0D$(M0"(F"3`$``(V"2`$``,>"2`$``+`)!`#'@E`!````````@\(D
+MB40D!(D4).C\____@\0,PXUV`(/L#(M$)!"+4`B)@DP!``"-@D@!``#'@D@!
+M``!0U0,`QX)0`0```````(/")(E$)`2)%"3H_/___X/$#,.-=@"#[`R+1"00
+MBU`(B8),`0``C8)(`0``QX)(`0``8/T#`,>"4`$```````"#PB2)1"0$B10D
+MZ/S___^#Q`S#C78`@^P,BT0D$(M0"(F"3`$``(V"2`$``,>"2`$``'#4`P#'
+M@E`!````````@\(DB40D!(D4).C\____@\0,PXUV`(/L#(M$)!"+4`B)@DP!
+M``"-@D@!``#'@D@!``!PW0,`QX)0`0```````(/")(E$)`2)%"3H_/___X/$
+M#,.-=@"#[`R+1"00C5`4QT`44!$$`(E`&,=`'`````")5"0$BP"#P"2)!"3H
+M_/___X/$#,.#[`R+1"00C5`8QT`8`-X#`(E`',=`(`````")5"0$BT`$BP"#
+MP"2)!"3H_/___X/$#,.-M@````"-O"<`````4X/L"(M<)!"`>V8!=`X/MD-G
+M@\`!/`*(0V=V1(M#/(E$)`2+`P68````B00DZ/S___^-0Q3'0Q2@U0,`B5L8
+MQT,<`````(E$)`2+`X/`)(D$).C\____@\0(6\.-="8`BT,\QD-F`,=`$```
+M``"+0SR-4!3'0!P`````QT`@`````,=`)`````")4!2)4!C'0"@`````B5PD
+M$(/$"%OI_/___XVV`````(V\)P````"#[`R+3"00BT$LBQ"#Z@&%THD0=2N-
+M013'010@>0,`B4D8QT$<`````(E$)`2+`8/`+(D$).C\____@\0,PXGVB4PD
+M$(/$#.G\____C70F`(/L'(M,)"")7"00B70D%(E\)!B+02B+D&0!``"+>@0Y
+MQP^$BP```(7_=`GVAQP"```!=1R)3"0@BUPD$(MT)!2+?"08@\0<Z63___^-
+M="8`BW$L#[9998D,).C\____BT<@P.L$@^,#B40D!(L'P>,$B00DZ/S___\/
+MME!EB7@HQD!D!(EP+(/BSPG:B%!EQD!F`,=`<!!X`P"+7"00B40D((MT)!2+
+M?"08@\0<Z?S___^+>@CI;?___XVV`````(/L'(ET)!B+="0@B5PD%(M>+(M#
+M"(D$)/]3!(E<)`2+!@6P````B00DZ/S___^+7"04B70D((MT)!B#Q!SI_/__
+M_XVT)@````"-O"<`````5U93@>S`````B[PDT````(V$))````"+=RB+7ER+
+M5E2)1"0$BT9@B00D_U(\C40D&(M3!(E$)`2+0PB)!"3_4AR-A"2T````B00D
+MC8PDN````(G8C90DO````.B`R?__]H0DG@````)T:8N4)+0````/MH0DH```
+M`(!_9@&-!`)T7HE$)`B+A"2\````QP0D6`P``(E$)`3H_/___XET)`3'!"0:
+M````Z/S___^+1RR)1"0$BP:#P%")!"3H_/___XD\).C\____@<3`````6UY?
+MPXN4)+@```#KE8UT)@")1"0(BX0DO````,<$)#`,``")1"0$Z/S___^)="0$
+MQP0D&P```.C\____ZZ"-=@"#[!R+5"0@B5PD%(ET)!B+6BR+0P2+,(D4).C\
+M____QT,8@!($`(E;'(/&),=#(`````"#PQB)7"0$B30DZ/S___^+7"04BW0D
+M&(/$',.)]H/L+(E<)!R+7"0PB70D((E\)"2);"0HBRN+<RR+A2@!``"+?@B)
+M1"04BT8$B40D&(![9@%T$@^V0V>#P`$\`HA#9P^&OP```(M#/(E$)`2-A9@`
+M``")!"3H_/___XD<).C\____BT0D%(7_BU`<#X1]````BX=8`@``B0*#P`%T
+M=HM$)!B-5@R`B$D!```$@(])`0``!("G2`$``/V)MV0!``")L&0!``"+31B-
+M112)1@R-1AB)51C'1A@0I@,`B4X0B78<QT8@`````(D1B40D!(U%)(D$).C\
+M____BUPD'(MT)""+?"0DBVPD*(/$+,/'`O____^+1"04QT`L_____^EZ____
+MBT,\QD-F`,=`$`````"+0SR-4!3'0!P`````QT`@`````,=`)`````")4!2)
+M4!C'0"@`````BW0D((E<)#"+?"0DBUPD'(ML)"B#Q"SI_/___XVT)@````!5
+M5U93@^PLBT0D0(MH&(M0'(M%`(E4)!R)!"3H_/___XE$)"B+1"1`#[9-!`^V
+M707'0"S_____#[95!H#Z"P^'W````(!]!PL/A](````/ML&)1"0@#[;"`T0D
+M((/X"WX'N0L````HT8M4)!R(2@0/MDT'#[;3#[;!`="#^`M^![L+````*,N+
+M3"0<BT0D'(/!"(E,)"2`>`0`B%@%#X2N````,?_K$HM,)!R#QP&)^CA1!`^&
+MF````(GZBTPD*`^V\HGPP>`)`T0D),=$)!0!````QT0D#`$```")1"00BT$X
+MBU$\#[9-!@4``/[_@]+_)0``_O\QVP'($=HQVP'PB40D!(M$)"@1VHE4)`B)
+M!"3H_/___X7`=(V-M@````"+3"1`B<B#P##'03`0;`,`B4DTQT$X`````(E$
+M)`2+00B)!"3H_/___X/$+%M>7UW#BT0D'(!X!0!T>C'_ZP^0BT0D'(/'`8GY
+M.$@%=F>+3"0@B?H/MO+'1"04`0```,=$)`P!````C00.P>`)`T0D)(E$)!"+
+M1"0HBT@XBU@\#[9%!X'!`/C__X/3_S'2`<$1TS'2`?$1TXM4)"B)3"0$B5PD
+M"(D4).C\____A<!TD.E+____BU0D0,="+`````#I.____XUT)@"-O"<`````
+M55=64X/L+(M$)$"+>!B+!XD$).C\____BU0D0(E$)"2+0AS'``````#'0BP`
+M````@'\'``^$T0```(G&@\8$B70D*(!_!@`/A(T````Q[>L*@\4!B>@X1P9V
+M?P^V1P>)ZC';#[;2BW0D),=$)`P!````B50D((E$)!2)T,'@"0-$)"B)1"00
+M#[=/!(M&.(M6/(DT)(/!"X/3``4``/[_@]+_)0``_O\!P8M$)"`1TS'2`<$1
+MTXE,)`2)7"0(Z/S___^%P'2+BU0D0(M"',<`_____\="+/____^+5"1`B="#
+MP##'0C`0;`,`B5(TQT(X`````(E$)`2+0@B)!"3H_/___X/$+%M>7UW#C4<,
+MB40D*.DL____B?:-O"<`````5E.#[!2+3"0@BUDL@'EF`8MS''0^@'E*`'4X
+MQT,L_____XD,).C\____C4,PQT,P$&P#`(E;-,=#.`````")1"0$BT,(B00D
+MZ/S___^#Q!1;7L/'0RP`````#[9!2H3`B`9U'(M!3(E&!(M3((72=+&+1@2#
+MP`B)`NNGD(UT)@`/MD%)B48$Z^&-M"8`````@>RL````B;0DH````(NT)+``
+M``")G"2<````B;PDI````(FL)*@```"+1A@/ME`"#[8(@/H##X0D`0``@/H$
+M#X0\`0``@'@!!78'@'@%_I!T8@^VP3'2Z'3"__^)PXM&"(M6*,=&*."!`P")
+ML$P!``")D$@!``"+4P3'@%`!````````B70D!(M#"(D$)/]2?(N<))P```"+
+MM"2@````B[PDI````(NL)*@```"!Q*P```##C5`+B50D%`^V>`LQTHM&%(E$
+M)!@/ML'H`,+__X7`B<-T3(UL)""-M@````"+0P2+D(0```"%TG08BT,(B00D
+M_]*)^CC0#X?T````B?HHPHG7BQN%VW07BU,$B6PD!(M#"(D$)/]2'(!\)#,`
+M=+Z+1B#'``````"-1C#'1BS_____QT8P$&P#`(EV-,=&.`````")1"0$BT8(
+MB00DZ/S____I-____XVV``````^V0`2-E"28````B80DF`````^VP>A6P?__
+MB</IW?[__XU0`XE4)!`QT@^V>`,/ML'H.L'__X7`B<-TCXUL)"#K*XGZ*,*)
+MUXL;A=L/A'G___^+4P2);"0$BT,(B00D_U(<@'PD,P`/A5[___^+0P2+D(0`
+M``"%TG3.BT,(B00D_]*)^CC0=KJ+1"00B!#I:_[__XM$)!2($(M&((M4)!B)
+M$.E7_O__B?:-O"<`````@^P,BT0D$(M("(E`-,=`.`````"+D4@!``#'0#`0
+M;`,`B5`H@\`PB40D!(D,).C\____@\0,PXGVC;PG`````%575E.![)P```"+
+M-0````"+E"2P````QT0D&`````"%]HM"&(L`B40D$(M"''1P@\`$,?^)1"04
+MC6PD)(M>"(7;=0OK2H/'`8L;A=MT08M3!(EL)`2+0PB)!"3_4AR`?"0W`'3C
+MBX0DL````#EP"'74@T0D&`&+5"04BT0D&#E$)!").G8/@\($B50D%.NVBS:%
+M]G6GBY0DL````(M"'(M4)!B)$(N$)+````"+E"2P````QT`P$&P#`(E`-,=`
+M.`````"#P#")1"0$BT((B00DZ/S___^!Q)P```!;7E]=P^L-D)"0D)"0D)"0
+MD)"0D%93@^P4BS4@`@``BUPD(#LU)`(``(M+'`^$I0```&O6+(N"0`(``(D!
+MBX)$`@``B4$$BX)(`@``B4$(BX),`@``B4$,BX)0`@``B4$0BX)4`@``B4$4
+MBX)8`@``B4$8BX)<`@``B4$<BX)@`@``B4$@BX)D`@``B4$DBX)H`@``B4$H
+MC48!B<+!^A_!ZAP!T(/@#RG0HR`"``"-0S#'0S`0;`,`B5LTQT,X`````(E$
+M)`2+0PB)!"3H_/___X/$%%M>P\=#+/_____KSHUT)@"#["PQTHE<)!R+7"0P
+MB70D((E\)"2);"0HBT,8BV@$BW`(BW@,BP#HE+[__X7`B<%T?H7V=&"+0`3'
+M1"00`````(E\)`R+4QB#PA")5"0(B6PD!(M1"(D4)/^0F````(U#,,=#,!!L
+M`P")6S3'0S@`````B40D!(M#"(D$).C\____BUPD'(MT)""+?"0DBVPD*(/$
+M+,.+0`3'1"00`0```(E\)`R+4QSKH8VV`````,=#+/[____KIHVT)@````!6
+M,=)3@>R4````BYPDH````(M#&(L`Z.6]__^+<QR%P(G!=%&+4`2-1"0<B40D
+M!(M!"(D$)/]2'`^W1"0@9HD&#[=$)")FB48"C4,PQT,P$&P#`(E;-,=#.```
+M``")1"0$BT,(B00DZ/S___^!Q)0```!;7L/'0RS^____Z\N)]H/L+(E\)"2+
+M?"0PB70D((EL)"B)7"0<BT<8BQB-<`2+1QR)'"2#ZP&)1"08Z/S___^#^_Z)
+MQ1G`(<4/MD8*A,!U!P^V1@[`Z`0/ML`/MDX-#[96#(E$)`@/MD8.@^`/B40D
+M!(U&?(D$)(GHZ/#$__^+3"08QT<P$&P#`(E_-,='.`````")`8U',(E1!(E$
+M)`2+1PB)!"3H_/___XM<)!R+="0@BWPD)(ML)"B#Q"S#@^PLB70D((MT)#")
+M;"0HB5PD'(E\)"2+?AB+1AR+'XUO!(E$)!B)'"2#ZP'H_/___X/[_@^V30&)
+MPAG`(=`/ME<$@\=TQT0D"``````/MET"B3PD@^,/B5PD!.A0Q/__BTPD&,=&
+M,!!L`P")=C3'1C@`````B0&-1C")402)1"0$BT8(B00DZ/S___^+7"0<BW0D
+M((M\)"2+;"0H@\0LPU575E.#[`R+1"0@BU0D((M`'(G%B40D"(M"&(/%!(LX
+MA?\/CGX```"+-0````"%]G1T,=N+5@R-3@PYRG4(ZUZ+$CG*=%B-@MC]__^`
+M>`@!=>Z+@%@"``")1)T`@\,!.=]UW8G8BU0D"(D"BT0D((M4)"#'0#`0;`,`
+MB4`TQT`X`````(/`,(E$)`2+0@B)!"3H_/___X/$#%M>7UW#BS:%]G60Z[TQ
+MP.N[C;8`````55=64X/L'(M$)#"+5"0PBT`<B40D%(/`!(E$)!B+0AB+*(7M
+M#X[(````BST`````A?\/A+H````Q]HM7#(U?##G:=1;IF0```(VT)@````"+
+M$CG:#X2(````C8+8_?__BT@,A<EUZ0^V2`B`^01V8HN(9`$``(7)=`N#>00`
+M=`4Y00ATRXN`6`(``(M,)!B)!+&#Q@$Y[G6WB?"+3"0PBU0D%,=!,!!L`P")
+M`HG(@\`PB4DTQT$X`````(E$)`2+00B)!"3H_/___X/$'%M>7UW#@.D!=;[V
+M0%`"=+B-=@#KHXL_A?\/A4[___^-="8`ZZ<QP.NEC78`C;PG`````%575E.!
+M[)P```"+O"2P````BT<8BU`(BW`$BP")5"08BU<<B50D%#'2Z%*Z___'1RS_
+M____A<")PW0]C6PD))"+0P2+D(0```"%TG0.BT,(B00D_](YQGQ-*<:+&X7;
+M=!>+4P2);"0$BT,(B00D_U(<@'PD-P!TR(U',,=',!!L`P")?S3'1S@`````
+MB40D!(M'"(D$).C\____@<2<````6UY?7<.+5"04BT,$QT0D#`````")="0$
+MB50D$(M4)!B)5"0(BU,(B10D_Y"4````A<!UH\='+`````#KFHGV55=64X'L
+MG````(N\)+````"+1QB+5QR+<`2+`(E4)!@QTNAYN?__QT<L_____X7`B<-T
+M0#'MBT,$BY"$````A=)T$(M#"(D$)/_2.<9\4RG&`<6+&X7;=!N-1"0DBU,$
+MB40D!(M#"(D$)/]2'(!\)#<`=,*-1S#'1S`0;`,`B7\TQT<X`````(E$)`2+
+M1PB)!"3H_/___X'$G````%M>7UW#BT,$BY"4````A=)TQ8M$)!C'1"00````
+M`,=$)`@`````B70D!(E$)`R+0PB)!"3_TH7`=9V+5"08#[9"`CS_=`4!Z(A"
+M`L='+`````#K@^L-D)"0D)"0D)"0D)"0D%575E.![)P```"+O"2P````BT<8
+MBU<<BW`$BP")5"08,=+H>;C__\='+/____^%P(G#=$`Q[8M#!(N0A````(72
+M=!"+0PB)!"3_TCG&?%,IQ@'%BQN%VW0;C40D)(M3!(E$)`2+0PB)!"3_4AR`
+M?"0W`'3"C4<PQT<P$&P#`(E_-,='.`````")1"0$BT<(B00DZ/S___^!Q)P`
+M``!;7E]=PXM#!(N0D````(72=,6+1"08B70D!(E$)`B+0PB)!"3_TH7`=:V+
+M5"08#[9"`CS_=`4!Z(A"`L='+`````#KD^L-D)"0D)"0D)"0D)"0D%575E.!
+M[)P```"+O"2P````BT<8BU<<BW`$BP")5"08,=+HB;?__\='+/____^%P(G#
+M=$`Q[8M#!(N0A````(72=!"+0PB)!"3_TCG&?%,IQ@'%BQN%VW0;C40D)(M3
+M!(E$)`2+0PB)!"3_4AR`?"0W`'3"C4<PQT<P$&P#`(E_-,='.`````")1"0$
+MBT<(B00DZ/S___^!Q)P```!;7E]=PXM#!(N0C````(72=,6+1"08B70D!(E$
+M)`B+0PB)!"3_TH7`=:V+5"08#[9"`CS_=`4!Z(A"`L='+`````#KD^L-D)"0
+MD)"0D)"0D)"0D%575E.![)P```"+O"2P````BT<8BU<<BW`$BP")5"08,=+H
+MF;;__\='+/____^%P(G#=$`Q[8M#!(N0A````(72=!"+0PB)!"3_TCG&?%,I
+MQ@'%BQN%VW0;C40D)(M3!(E$)`2+0PB)!"3_4AR`?"0W`'3"C4<PQT<P$&P#
+M`(E_-,='.`````")1"0$BT<(B00DZ/S___^!Q)P```!;7E]=PXM#!(N0B```
+M`(72=,6+1"08B70D!(E$)`B+0PB)!"3_TH7`=:V+5"08#[9"`CS_=`4!Z(A"
+M`L='+`````#KD^L-D)"0D)"0D)"0D)"0D%4QTE=64X'LC````(N\)*````"+
+M1QB+`.BSM?__,=*%P(G#=$$Q]HUL)!20C70F`(M#!(N0A````(72=`J+0PB)
+M!"3_T@'&BQN%VW07BU,$B6PD!(M#"(D$)/]2'(!\)"<`=,R)\HM'',=',!!L
+M`P")?S3'1S@`````B1"-1S")1"0$BT<(B00DZ/S___^!Q(P```!;7E]=PXVT
+M)@````!3@^P(BUPD$(M#&(M+'(M0!(L`Z!BW__^%P'0'QT,L_____XU#,,=#
+M,!!L`P")6S3'0S@`````B40D!(M#"(D$).C\____@\0(6\.0C70F`%<QTE93
+M@>R0````B[0DH````(M&&(M>'(L`Z,&T__^%P`^$E````#'2C;0F`````,8$
+M&@"#P@&#^D1U](U,)!B)RL8"`(V\))````"#P@$Y^G7OBU`$B4PD!(M`"(D$
+M)/]2'`^VA"2%````B`,/MH0DA@```(A#`0^VA"2'````B$,"#[:$)(@```"(
+M0P.-1C#'1C`0;`,`B78TQT8X`````(E$)`2+1@B)!"3H_/___X'$D````%M>
+M7\/'1BS_____Z\J-M@````"-OP````"#[!R)7"04BUPD((ET)!B+<QSHF;7_
+M_\=#,!!L`P")6S3'0S@`````B0:-0S")1"0$BT,(B00DZ/S___^+7"04BW0D
+M&(/$',.0C;0F`````%:ZT0(``%.#[!2+="0@BUX8B=CH6+/__X7`=30/MD,@
+MH@````"-1C#'1C`0;`,`B78TQT8X`````(E$)`2+1@B)!"3H_/___X/$%%M>
+MPXGVNMX"``")V.@4L___A<!U$@^V0R"-!,5P_O__HP````#KL[KO`@``B=CH
+M\K+__X7`=$2Z#`,``(G8Z.*R__^%P'5"BT8(QX!(`0``T)8#`(FP3`$``(V0
+M2`$``,>`4`$```````"#P"2)5"0$B00DZ/S____K@@^V0R"B`````.E1____
+MNBD#``")V.B0LO__A<!U#XM&",>`2`$``""0`P#KK,=&+/_____I)O___Y"#
+M[`R+1"00BU`<QT`P$&P#`(E`-,=`.`````#'`@```0*-4#")5"0$BT`(B00D
+MZ/S___^#Q`S#B?:-O"<`````55=64X/L/(ML)%"+11B+50C&1"0T!X!X(`&-
+M>@P9P(/``HA$)#B+<@PY_G0AC78`C9[8_?__]H,<`@```70&@'L(`70XBS8Y
+M_G7EBU4(QT4L`````(U%,,=%,!!L`P");33'13@`````B40D!(D4).C\____
+M@\0\6UY?7<.-5"00BT-4B50D!(M38(D4)/]0/`^V1"0C.D0D.'2IC40D-(M3
+M5(E$)`2+0V")!"3_4F#KDXVT)@````"-O"<`````@^P<B5PD#(M<)"")?"04
+MB70D$(EL)!B+`XMS+(E$)`B+1AB+*(DL).C\____@'MF`8G'=!(/MD-G@\`!
+M/`*(0V</AHD```"+0SR)1"0$BT0D"`68````B00DZ/S___^)'"3H_/___XM&
+M##TI_P``=%4].?\``'1.A?]T#(L7.U0D"`^$F@```(U&,,=&+/[____'1C`0
+M;`,`B78TQT8X`````(E$)`2+1@B)!"3H_/___XM<)`R+="00BWPD%(ML)!B#
+MQ!S#BT8<B2CKJXUV`(M#/,9#9@#'0!``````BT,\C5`4QT`<`````,=`(```
+M``#'0"0`````B5`4B5`8QT`H`````(MT)!")7"0@BWPD%(M<)`R+;"08@\0<
+MZ?S___^-@D@!``#'@D@!``#`I0,`B;),`0``QX)0`0```````(E$)`2-0B2)
+M!"3H_/___^E<____C78`C;PG`````(/L#(L0B00D@<(L`0``B50D!.C\____
+M@\0,PY"-="8`@^P,BT0D$(M`&(L`B00DZ/S___^#Q`SKQXVT)@````"#[`R+
+M1"00BT`8BP")!"3H_/___X/$#.NGC;0F`````(/L#(M$)!"+0!B`>`0!BQ!T
+M!(/$#,.)%"3H_/___X/$#.EZ____C78`C;PG`````%575E.#[`R+;"0@BT48
+MBQ!F]\(`_W5%B=>!Y_\```!^.S'VNP0```#K"8VV`````(M%&(L$&(D$).C\
+M____A<!T$(!X"`1V"HN09`$``(72=!*#Q@&#PP0Y_G74@\0,6UY?7</H!___
+M_^OGD(UT)@"#[`R+1"00BT`8BP")!"3H_/___X/$#.GD_O__C70F`(/L#(M$
+M)!")="0(B5PD!(M`&(M8!(L`B00DZ/S___^#^PV)QG0O@_L!=!B#^P2)]G01
+M@_L'=`R+7"0$BW0D"(/$#,.)\(M<)`2+="0(@\0,Z8O^__^%P'3>BX!D`0``
+MA<!TU(M0!(72=`V)T.AO_O__BX9D`0``BT`(A<!TN8M<)`2+="0(@\0,Z5+^
+M__^)]H/L#(M$)!")="0(B5PD!(M`&(M8!(L`B00DZ/S___^)'"2)QNC\____
+MB<.)\.@>_O__B=B+="0(BUPD!(/$#.D,_O__C;8`````C;\`````@^P,BT0D
+M$(M`&(L`B00DZ/S___^#Q`SIY/W__XUT)@"#[`R+1"00BT`8BP")!"3H_/__
+M_X/$#.G$_?__C70F`%.#[`B+1"00BT`8BP")!"3H_/___X7`B<-T-8N`9`$`
+M`(7`="N+4`2%TG0-B=#HC?W__XN#9`$``(M`"(7`=""#Q`A;Z7?]__^-M"8`
+M````B=B#Q`A;Z67]__^0C70F`(/$"%O#C70F`(V\)P````!64X/L!(M$)!"+
+M<!B#Q@2`?@T`=!XQVXM$GGR#PP&)!"3H_/___^@E_?__#[9&#3G8=^2#Q`1;
+M7L.-M"8`````5E.#[`2+1"00BW`8@\8$@'X!`'0>,=N+1)YP@\,!B00DZ/S_
+M___HY?S__P^V1@$YV'?D@\0$6U[#C;0F`````%93@^P$BT0D$(MP&(!^#0!T
+M'C';BT2>?(/#`8D$).C\____Z*C\__\/MD8-.=AWY(/$!%M>PXUV`(V\)P``
+M``!64X/L!(M$)!"+<!B`?@$`=!XQVXM$GG"#PP&)!"3H_/___^AH_/__#[9&
+M`3G8=^2#Q`1;7L.-=@"-O"<`````5E.#[`2+1"00BW`8@'X!`'0>,=N+1)YH
+M@\,!B00DZ/S____H*/S__P^V1@$YV'?D@\0$6U[#C78`C;PG`````%93@^P$
+MBT0D$(MP&(L.A<ET&C';BT2>!(/#`8D$).C\____Z.C[__\Y'G?H@\0$6U[#
+MC;0F`````(V\)P````!6N@P#``!3@^P$BW0D$(M&&.C*J___A<!U+HM&"(M8
+M#(/`##G#="&-@]C]___V@!P"```!=`:`>`@!=!*+1@B+&X/`##G8==^#Q`1;
+M7L/H??O__^OGC70F`(V\)P````!55U93@>R,````BX0DH````(MH"(M0&(MU
+M#(U]#(E4)`@Y_G0?C9[8_?__]H,<`@```70*@'L(`0^$N@```(LV.?YUX8M4
+M)`@/MD(@H@````"+70B%VW1=C70D#.L(B?:+&X7;=$^+4P2)="0$BT,(B00D
+M_U(<]D0D'1!TXXV=S````(E<)`2)+"3H_/___\>%S`````"'DP/'A=0`````
+M````B:W8````B5PD!(DL).C\____BX0DH````(N4)*````#'0"P`````QT`P
+M$&P#`(E`-,=`.`````"#P#")1"0$BT((B00DZ/S___^!Q(P```!;7E]=PXD<
+M).C\____BU0D",:$)(0````(#[9"((B$)(@```"-A"2$````BU-4B40D!(M#
+M8(D$)/]28.D+____C;8`````C;PG`````(/L'(E<)`R)?"04B=>);"08B<6)
+M="00BT`@B40D!(M%`(D$).C\____A<")PP^$Y`$``,9`9`.!?PQ"_P``B6@H
+M#Y3`#[;PA?8/A9@```"+5Q@QP(!Z"O0/E,"%P`^%F````(7V#X05`0``#[9"
+M$CP!#X2.`0``/`(/A&@!```/MD(/B$-3#[=""&:)0TP/MT(*9HE#3@^W0@QF
+MB4-0#[9"#HA#4@^W0@1FB4-(#[="!F:)0TH/MT(09HE#5(E[+,=#<!#W`P#&
+M14X!B1PDZ/S___^+7"0,BW0D$(M\)!2+;"08@\0<PXM7&#'`@'H/]`^4P(7`
+M#X1H____BT4`@\!0B00DZ/S___^%P(G%#X0S`0``A?8/A;4```"+1QB#P!#'
+M1"0(``(``(E$)`2)+"3H_/___XU',(!+902):UC&0U/T9L=#5`$`B6LLQT-P
+M<'D#`(E$)`2+1PC'1RP`````QT<P$&P#`(E_-,='.`````")!"3H_/___^E,
+M____D`^V0@P\`71N/`)T3P^V0@J(0U,/MD(&9HE#3`^V0@=FB4-.#[9""&:)
+M0U`/MD()B$-2#[9"!&:)0T@/MD(%9HE#2@^V0@MFB4-4Z>[^__^0BT<8@\`4
+MZ4;___^`2V4$C4(0B4-8ZZ6`2V4$C4(4B4-8Z8G^__^`2V4"BT<<@\`0B4-8
+MZX>`2V4"BT<<@\`4B4-8Z6C^__^-1S")1"0$BT<(QT<L_?___\=',!!L`P")
+M?S3'1S@`````B00DZ/S____IC?[__XU',(E$)`2+1PC'1RS_____QT<P$&P#
+M`(E_-,='.`````")!"3H_/___XD<).C\____Z5;^__^-=@!3@^P(BUPD$(M#
+M&(L`B00DZ/S___^)VH/$"%OI8/W__U.#[`B+7"00BT,8BP")!"3H_/___XG:
+M@\0(6^E`_?__@^P<B6PD&(ML)"")7"0,B70D$(E\)!2+?1B+!XD$).C\____
+MB<:+0"")1"0$BP:)!"3H_/___X7`B<,/A(L```"):"R)<"C&0&0"#[9'!#P!
+M=&T\`G1O#[9'!XU+4(U7"(E4)`2)#"2)1"0(Z/S___\/MD<'B$-(BT<8B4-,
+M#[9%%(/H"(3`B$-)=`F+11R#P`B)0V#'0VP`:0,`QT-P0'\#`(MT)!")7"0@
+MBWPD%(M<)`R+;"08@\0<Z?S___^0@$ME`NN1@$ME!.N+C44PQT4L_?___\=%
+M,!!L`P");33'13@`````B40D!(M%"(D$).C\____BUPD#(MT)!"+?"04BVPD
+M&(/$',.-M@````!64X/L9(M<)'"-3"0@BT,8BW,<BU`$BP#HHZC__X7`=##'
+M0RS_____C4,PQT,P$&P#`(E;-,=#.`````")1"0$BT,(B00DZ/S___^#Q&1;
+M7L.+1"0@B0:+1"0DB48$BT0D*(E&"(M$)"R)1@SKNHGV5U93@^P0BWPD((`]
+M``````&+7QB+=QS'1RP`````#X8<`0``NMX"``")V.C0I?__A<`/A(D```"Z
+M[P(``(G8Z+RE__^%P`^%UP```(L#B0:+0P2)1@2+0PB)1@B+0PR)1@R+0Q")
+M1A"+0Q2)1A2+0QB)1AB+0QS&1D0`QD9!`,9&0`*)1AP/MD-%B$9%#[8%````
+M`(A&((U',,=',!!L`P")?S3'1S@`````B40D!(M'"(D$).C\____@\006UY?
+MPXL#B0:+0P2)1@2+0PB)1@B+0PR)1@R+0Q")1A"+0Q2)1A2+0QB)1AB+0QS&
+M1D0`QD9!`,9&0`&)1AP/MD-%B$9%BQ4`````@<*0`0``B=#!^!_!Z!T!T,'X
+M`XA&(.ET____N@P#``")V.C1I/__A<!T<<='+/_____I6/___Y"ZT0(``(G8
+MZ+2D__^%P`^%T/[__XL#B0:+0P2)1@2+0PB)1@B+0PR)1@R+0Q")1A"+0Q2)
+M1A2+0QB)1AB+0QS&1D0`QD9!`,9&0`*)1AP/MD-%B$9%#[8%`````(A&(.GS
+M_O__BP.)!HM#!(E&!(M#"(E&"(M##(E&#(M#$(E&$(M#%(E&%(M#&(E&&(M#
+M',9&1`#&1D$`QD9``8E&'`^V0T6(1D4/M@4`````B$8@Z:/^__^-M@````"-
+MOP````!55XG'5E.![%P"``")5"0DB$PD(P^V0@_&1"0P`83`>`^`?P@&QD0D
+M,``/A%(#``"-1"10Q@``C90D4`(``(/``3G0=>^+7"0D#[9#"XA'-(![#0!T
+M,#';ZP^+5"0D@\,!#[9"#3G8?AV+5"0DBT2:?(D$).C\____@7A(`!```'78
+MQD<T`XM<)"0/MI=(`0``#[9##HA',0^V2PZX`0```-/@9HE',HG0@\@$B(=(
+M`0``]D,/`P^$)P(``(G0@\@%B(=(`0``BT<$QX=,`0```````,>'4`$`````
+M``"`>`<`#X4X`@``BUPD)(V/5`$``(M4)"0/MG<PBT,0@\(0A?:)AU0!``"+
+M0@2)002+0@B)00B+0@R)00S'1"0H_____\=$)"S_____?E0Q[>L+#[9W,(/%
+M`3GN?D6+7*](BU,8.50D+(E[#(M#%'(0=P8Y1"0H=@B)1"0HB50D+(!["`1U
+MS(!\)",`BW,D=7*`?"0P`'5V#[9W,(/%`3GN?[N`?P@'#X3,`0``BV\$@'T%
+M``^%90$```^V10:+3"0LBUPD*"G&B?*)\,'Z'P^OV@^OSO=D)"@!V8T4$8E'
+M%(E7&(M4)"0/MD(/@^`<P?@"B(<=`@``@<1<`@``6UY?7<.`?"0P``^$D@``
+M`(U4)%#'1"04`0```(E4)!#'1"0,`0```(M#,(M0"(M`!(DT)(E4)`B)1"0$
+MZ/S___^%P`^%#/___X"\)$X"``"J#X1X`0``,<"`?"104@^$40$``(7`#X3I
+M_O__C40D4,=$)!0`````B40D$,=$)`P!````BT,PBU`(BT`$B30DB50D"(E$
+M)`3H_/___^FS_O__QT0D2`````#'1"1,`````(U$)%#'1"04`````(E$)!#'
+M1"0,`0```(M#,(M0"(M`!`-$)$@35"1,B30DB40D!(E4)`CH_/___X-$)$@!
+MBT0D2(-4)$P`@_`""T0D3`^$3_[__^NJQX=,`0``_____\>'4`$``/_____I
+M[/W__P^W3S*+1"0HBU0D+/?9B<LAR,'['R':B40D*(E4)"SI=_[__X/*!X!_
+M"`J(ET@!```/A;7]__\/MD\P,<`QTH/I`?;!(`^4P`^5PM/BT^")1SB)5SSI
+MDOW__X!_,``/A&'^__\QR8M$CTB+4!B+0!0!1Q0/MD<P$5<8@\$!.<A_Y>D_
+M_O__T>B#X`&(1"0PZ:#\__^`?"1110^%I/[__\9$)%!%QD0D45+IG?[__X"\
+M)$\"``!5#X5Z_O__L`'&A"1.`@``5<:$)$\"``"JZ67^__^053'25U93@>R,
+M````B[PDH````(M'&(MW'(L`Z&"@__^%P(G##X1O`0``,<"-="8`Q@0P`(/`
+M`8/X6'7TC6PD%(GHQ@``C90DC````(/``3G0=>^+4P2);"0$BT,(B00D_U(<
+M#[9$)"J-5@2(1@,/MD0D*(@&#[9$)"F(1@&+1"10B48$BT0D5(E"!(M$)%B)
+M0@B+1"1<B4(,BT0D8(E"$(M$)&2)0A2+1"1HB4(8BT0D;(E"'(M$)'")0B"+
+M1"0LC58HB48HBT0D,(E"!(M$)#2)0@B+1"0XB4(,BT0D/(E"$(M$)$")0A2+
+M1"1$B4(8BT0D2(E"'(M$)$R)0B`/MD0D%(A&4`^V1"05B$91#[9$)!:(1E(/
+MMD0D%XA&4XM##(E&3(![1`!U:0^V1"0KB$8"BQN%VW46ZRN-M@`````/MD0D
+M*P!&`HL;A=MT%XM3!(EL)`2+0PB)!"3_4AR`?"0G`'3;C4<PQT<P$&P#`(E_
+M-,='.`````")1"0$BT<(B00DZ/S___^!Q(P```!;7E]=PX!.`P3KD<='+/__
+M___KPXVT)@````"-O"<`````53'25U93@>R,````B[PDH````(M'&(MW'(L`
+MZ+">__^%P(G##X0Y`0``,<"-="8`Q@0P`(/``8/X3'7TC6PD%(GHQ@``C90D
+MC````(/``3G0=>^+4P2);"0$BT,(B00D_U(<#[9$)"J-5@2(1@,/MD0D*(@&
+M#[9$)"F(1@&+1"10B48$BT0D5(E"!(M$)%B)0@B+1"1<B4(,BT0D8(E"$(M$
+M)&2)0A2+1"1HB4(8BT0D;(E"'(M$)'")0B"+1"0LC58HB48HBT0D,(E"!(M$
+M)#2)0@B+1"0XB4(,BT0D/(E"$(M$)$")0A2+1"1$B4(8BT0D2(E"'(M$)$R)
+M0B`/MD0D*XA&`HL;A=MU$NLGB?8/MD0D*P!&`HL;A=MT%XM3!(EL)`2+0PB)
+M!"3_4AR`?"0G`'3;C4<PQT<P$&P#`(E_-,='.`````")1"0$BT<(B00DZ/S_
+M__^!Q(P```!;7E]=P\='+/_____KR8UT)@"#[!R)="04B<:)7"00B7PD&(M8
+M!(M0"(M#'(L[B4(<@*-)`0``\\=#'/____^+0AR`HDD!``#SB40D!(M'!(D$
+M).C\____BT,@B3PDB40D!.C\____B5@HB7`LQD!D!,=`<(!Z`P")!"3H_/__
+M_XM<)!"+="04BWPD&(/$',.)]E.#[`B+7"00BT,8BP")!"3H_/___XD$).C\
+M____C4,PQT,P$&P#`(E;-,=#.`````")1"0$BT,(B00DZ/S___^#Q`A;PXUT
+M)@"-O"<`````4X/L"(M$)!"+0`2+&(D$).C\____BX,H`0``C5`PQT`P$&P#
+M`(E`-,=`.`````")5"0$BT`(B00DZ/S___^#Q`A;PXVV`````(V\)P````"#
+M[!R+5"0@B5PD$(ET)!2)?"08@WHL_8MZ)`^$\P```/:'20$```C&AQ<"````
+M='2+0BR#^/T/A+8"``"%P`^%MP(``(N'9`$``#'),?:+4%P/MUAD@>+__P\`
+M.?$/@U,!``#'A\0!``!@<0,`B;_(`0``QX?``0```````(V'P`$``(E$)`2+
+M!XM`!(D$).C\____BUPD$(MT)!2+?"08@\0<PP^VMT@!``#WQA`````/A(D`
+M``"+0BR#^/T/A-@!``"%P`^%W0$``(M/!`^V1S"+GU`!```/MDD&*<B+CTP!
+M``")PL'Z'P^OV`^ORO>G3`$```'9C101.U<8#X+=`0``#X8I`@``N@,```#I
+M<@$```^VAQ<"```\`@^/_O[__X/``8B'%P(``,>'Q`$``#"J`P")O\@!``#I
+M/?____?&(`````^%M````/?&0`````^$//____?&`0```(GV#X0G`@``BUHL
+MA=L/A?P!``"+3P0/MD<PBY]0`0``#[9)!BG(BX],`0``B<+!^A\/K]@/K\KW
+MITP!```!V8T4$3M7&'(A=P4[1Q1R&KH)````Z<\```!W#CG:C;8`````#X*=
+M_O__]H=(`0``4(UV``^$5?___XN'3`$``#'2)?__/P"#^@`/AS____^#^'\/
+MAS;____I:?[__XVV`````(M2++@+````A=)U4(GRL`J$TGA(BT\$#[9',(N?
+M4`$```^V208IR(N/3`$``(G"P?H?#Z_8#Z_*]Z=,`0```=F-%!$[5Q@/@F$!
+M``!W"3M'%`^"5@$``+@,````@^9?B?*(ET@!``")?"0$B00DZ/S____VAT@!
+M```(#X04_O__N@$```")^(M<)!"+="04BWPD&(/$'.FEPO__@#T```````^%
+ME````(/F[XGPB(=(`0``B7PD!,<$)`@```#H_/___^G,_?__QT(L`````(E\
+M)`3'!"0<````Z/S___^0]H=)`0``"`^$V?[__^E2_?__@#T``````'7-BX=D
+M`0``@*=)`0``]XM`"("@20$``/>)?"0$QP0D%````.C\____BUPD$(MT)!2+
+M?"08@\0<PSM'%'*IZ<W]___'0BP`````B7PD!,<$)!P```#H_/___P^WAQ0"
+M```QT@&'3`$``!&74`$``.E>_?__@^:_B?"(AT@!``")?"0$QP0D#P```.C\
+M____Z0?]__^#YK^)\HB72`$``(E\)`3'!"0.````Z/S____IY_S__XN'Z`$`
+M`(`X``^$"O[__X/FWXGPB(=(`0``Z;3^__^-="8`@^P4B70D"(MT)!R);"00
+MBVPD&(E<)`2)?"0,C88(`@``B8;D`0``C886`@``B8;H`0``BX98`@``]H9)
+M`0``"(FNU`$``,>&X`$```````#'ANP!````````B;;P`0``QX;T`0``8*8#
+M`(F&"`(``'16QX;8`0``*O\``,>&W`$```0```"+AKP!```QTH/``8/X90^=
+MPH/J`2'0B8:\`0``C8;,`0``BUPD!(EL)!B+="0(B40D'(M\)`R+;"00@\04
+MZ?S___\/MKY(`0``]\=P````#X3-````B?B#X*`\H`^$Z````(M6!`^V1C")
+M%"0/MDH&BYY0`0``*<B+CDP!``")PL'Z'P^OV`^ORO>F3`$```'9C101.U88
+M#X.=````]\<0````N"/_``!U$(/G((GX/`$9P/?0!27_``"+EE`!``"+CN0!
+M``")AM@!``"+ADP!``")40B+%"2)002`>@4`#X21````BY;D`0``#[=&,F:)
+M0@SVAD@!```@QX;<`0``#@````^$]O[__XN&Z`$``,8``,>&X`$```$```#I
+MWO[__XM<)`2+="0(BWPD#(ML)!"#Q!3#C70F`'<..T84#X)8____D(UT)@"-
+MALP!``#'AO@!````````BUPD!(E$)!B+="0(BWPD#(ML)!"#Q!3I-/K__XM&
+M%(M6&"N&3`$``!N64`$``(N.Y`$``(/Z`'8.N(````!FB4$,Z5+___\]@```
+M`';PB?;KYXVT)@````"-O"<`````@^P,BT0D$(M`)(V0P`$``,>`Q`$``#"J
+M`P")@,@!``")5"0$BP"+0`2)!"3H_/___X/$#,.-="8`C;PG`````(/L'(ET
+M)!B+="0@B5PD%(M>#(7;#X3N````#[:#20$``*@$='NH"'5GBY-D`0``A=)T
+M78M"!(7`=%:+2@B%R71/@(A)`0``"(M""("(20$```B-@\`!``#'@\0!```P
+MJ@,`B9O(`0``B40D!(L#BT`$B00DZ/S___^)7"0$QP0D$@```.C\____C;0F
+M`````(M<)!2+="08@\0<PXUT)@`/MI9(`0``]L(0=>2%VW0$J`AUW/;"8'77
+M@^+W@\H0C8;``0``B)9(`0``QX;$`0``,*H#`(FVR`$``(E$)`2+!HM`!(D$
+M).C\____B70D!,<$)`0```#H_/___XM<)!2+="08@\0<PXGSZ0O___^055=6
+M4X/L#(ML)""+11B+6`2+`(D$).C\____@_L.B<9V,L=%+/[___^-13#'13`0
+M;`,`B6TTQT4X`````(E$)`2+10B)!"3H_/___X/$#%M>7UW#_R2=+`X``)"-
+M="8`B<:+1@R%P'7W@'X(!8UV``^$"08``("F2`$``+^)="0$QP0D#@```.C\
+M____BUX<A=L/B&T&``"+3@RZ`0```.D$!```BT`,A<!T#?:`20$```P/A6G_
+M__]F]X9(`0``<`P/A5K____VAAP"```!#X1-____@'X(!0^%.P8``(!^,``/
+MA)`&```Q_Y"-="8`ZP\/MD8P@\<!.?@/CG@&``"+7+Y(A=MTZ8!["`1VX_:#
+M2`$``!!UVHM31(M#0(E4)`2)!"3H_/___XM3!`^V4@8YT`^-Z?[__P^V@T@!
+M``#'@\0!```PJ@,`B9O(`0``@^#W@\@0B(-(`0``C8/``0``B40D!(L#BT`$
+MB00DZ/S___^)7"0$QP0D!````.C\____Z6K___^`>`@%#X2=!```@*!(`0``
+MYXE$)`3'!"0%````Z/S___^+3@RZ`0```.GS`@``]H!(`0``$`^$7_[___:`
+M'`(```$/A%+^__^`H$@!``#EBU9$BT!`QX9,`0``_____\>&4`$``/____^)
+M5CR)1CB)="0$QP0D!@```.C\____BTX,@*9(`0``_H7)=$V`>3``=$<QVXM$
+MF4B%P'0O]H`<`@```70F@'@(!'8@#[:02`$```^V@4@!``"#X@&#X/X)T*@!
+MB(%(`0``=0L/MD$P@\,!.=A_OHM.#(M&0`M&1(/X`1G2@\("Z30"``"+0`R%
+MP'0-]H!)`0``#`^%F?W__V;WAD@!``!P#`^%BOW___:&'`(```$/A'W]__^`
+M?@@%#X7R!```@'XP``^$</W__\=$)`@`````ZQ.#1"0(`0^V1C`[1"0(#XY3
+M_?__BT0D"(M\ADB%_W3A@'\(!';;]H=(`0``('72BTXXBUX\BT9`BU9$"<@)
+MVHE4)`2)!"3H_/___XM6!`^V4@8YT`^-!OW__XV'P`$``("/2`$``"#'ATP!
+M````````QX=0`0```````,>'Q`$``#"J`P")O\@!``")1"0$BP>+0`2)!"3H
+M_/___XE\)`3'!"0)````Z/S____I4/___X"@2`$``-^)1"0$QP0D"@```.C\
+M____Z9K\__^`H$@!``#?Z8[\___V@!P"```!#X1Z_/__BT!`"T9$#X5N_/__
+M#[>&2`$``&8E<0QF@^@!#X59_/__@'X(!0^%4`0``(!^,`!T+3'_BUR^2(7;
+M=!B`>P@$=A(/MH-(`0``@^!!+`$/A'\$```/MD8P@\<!.?A_U8"F2`$``/?I
+M%_S__X"@2`$``+3'@$P!``#_____QX!0`0``_____\=`.`````#'0#P`````
+MB40D!,<$)!````#H_/___XM>#(7;#X1[`@``#[9+,(7)#XYQ`@``,=(Q]HM$
+MDTB%P'0B]H`<`@```709@'@(!'83]H!(`0```70*O@$```"0C70F`(/"`3G*
+M=<^%]@^$-`(``(M+#(G>N@$```"#^@,/E<"$P`^$,P$``(7)#X0K`0``B<Z+
+M20SI&0$``("@2`$``-^)1"0$QP0D"P```.C\____Z43[__]F]X9(`0``<`B+
+M@&0!```/A2C[__^%P`^$(/O__X!X9P`/A1;[__^+4`2+0`CV@AP"```!#X0#
+M^___]H`<`@```0^$]OK__X"B20$``.^`H$D!``#O@(I)`0``"("(20$```B-
+MAL`!``#'AL0!```PJ@,`B;;(`0``B40D!(L&BT`$B00DZ/S___^)="0$QP0D
+M$@```.C\____Z:7Z__^+B&0!```/MX!(`0``9B5P"&8]``@/A8/Z__^%R0^$
+M>_K__XM!!(M1"("@20$``/>`HDD!``#WB70D!,<$)!,```#H_/___XM.#+H!
+M````Z='^__^+2`RZ`P```#'`A,`/A<W^__^`CD@!```$@_H"#X3M````BX9D
+M`0``A<`/A.T```"+4`2+6`B%TG0(B10DZ/S___^%VP^$!_K__XD<).C\____
+MZ?KY__\QVX!X,`!U&.E<^O__C70F``^V1C"#PP$YV`^.2?K__XM$GDB%P'3I
+M@'@(!';C]H!(`0``$'3:@*!(`0``YXE$)`3'!"0%````Z/S____KP8!^,``/
+MA`3Z__\QVY"-="8`ZP\/MD8P@\,!.=@/CNSY__^+1)Y(A<!TZ8!X"`1VX_:`
+M2`$``$!TVH"@2`$``+^)1"0$QP0D#@```.C\____Z\&)\X"C2`$``/Z)'"3H
+M_/___^FX_?__B30DZ/S___^0Z33Y__^)-"3H_/___XUV`.DD^?__B30DZ/S_
+M__^+3@RZ`0```.F/_?__BU9$BT9`B50D!(D$).C\____BU8$#[92!CG0#XWG
+M^/__C8;``0``@(Y(`0``$,>&Q`$``#"J`P")ML@!``")1"0$BP:+0`2)!"3H
+M_/___XET)`3'!"0$````Z/S___^+1D"`ID@!``#W"T9$#X0,^?__Z/S___^+
+M3@RZ`0```(E&*.D(_?__BTXXBUX\BT9`BU9$"<@)VHE4)`2)!"3H_/___XM6
+M!`^V4@8YT`^-5OC__XV&P`$``(".2`$``"#'ADP!````````QX90`0``````
+M`,>&Q`$``#"J`P")ML@!``")1"0$BP:+0`2)!"3H_/___XET)`3'!"0)````
+MZ/S____I!OC__XV&P`$``(".2`$``$#'ADP!````````QX90`0```````,>&
+MQ`$``#"J`P")ML@!``")1"0$BP:+0`2)!"3H_/___XET)`3'!"0-````Z/S_
+M___IC/O__P^V@T@!``#'@TP!````````QX-0`0```````,>#Q`$``#"J`P"#
+MR$"#X/>(@T@!``"-@\`!``")F\@!``")1"0$BP.+0`2)!"3H_/___XE<)`3'
+M!"0-````Z/S____I'OO__XUV`%575E.#[!R)1"00]H`<`@```74D#[:`20$`
+M`(/@!#P!&?^!YP#X__^!QP$(``"#Q!R)^%M>7UW#BTPD$`^VL4@!``#WQ@(`
+M```/A%4!``"+1"00BTA`BUA$OP(```#WQ@$```!T!H'/`!```/?&$````'0#
+M@\\$]\8@````=`:!SP`!``"#YD!T!H'/``(``(G:"<H/A3L"``"+;"00#[:%
+M'`(``*@$=`.#SQ"H`G0#@\]`BT0D$/:`2`$```AT!H'/@````(M4)!`/MH))
+M`0``J`1T!H'/``@``*@(=`:!SP`$``"+3"00#[9),(7)B4PD&`^.T@```#'M
+MZVV+<42+64")\HG8]](C43SWT"-!.(G1"<%T`X//`O9$)!<!=`:!SP`0``#V
+M1"07$'0#@\\$]D0D%R!T!H'/``$``/9$)!=`=`:!SP`"``")\`G8=`.#SPCV
+M1"07"'0&@<^`````@\4!.6PD&'1ABT0D$(M,J$B%R73K]H$<`@```73B@'D(
+M!';<#[:12`$``(A4)!>#X@(/A&3___^+64"+<43I<____XG/BTE`BU]$B<B)
+MVO?0]](C5SPC1S@Q_XG5"<4/A)C^___ICO[___?'`@```'06]\<`$```C;0F
+M``````^$V@```(/G_8MT)!B%]@^.#0$``(M4)!"+6DB%VP^$*O[__S'M]H,<
+M`@```0^$&_[__X!["`0/AI,````/MG,PA?9^6XM#2(7`#X3^_?__]H`<`@``
+M`0^$\?W__XM0,(M"!`M""`^%XOW__S')ZRB+1(M(A<`/A-+]___V@!P"```!
+M#X3%_?__BU`PBT($"T((#X6V_?__@\$!.<YUT9"#Q0$Y;"08='F+3"00BURI
+M2(7;#X25_?__]H,<`@```0^$B/W__X!["`0/AVW___^+4S"+0@0+0@ATQ>EN
+M_?__B?@E""```(/X"`^%&?___^D1____B0PD@\\(B5PD!.C\____BTPD$(M1
+M!`^V4@8YT`^-H_W__X'/`"```.F8_?__@<\```!`Z2']__^-=@!55U93@^P,
+MBWPD((M'&(M?"(LHB2PDZ/S___^+<PR#PPPYWHE$)`AU#>M/D(UT)@"+-CG>
+M=$2-AMC]__^+4`R%TG7MA>UU"?:`'`(```)U#SE$)`AT6?:`'`(```)TT8"@
+M'`(``/V`>`@!=#F)!"3H_/___XLV.=YUO(U',,=',!!L`P")?S3'1S@`````
+MB40D!(M'"(D$).C\____@\0,6UY?7<.)!"3H_/___^N!]H`<`@```@^%=/__
+M_X"('`(```+KH8UT)@"-O"<`````@^Q,B7PD1(M\)%")7"0\B70D0(EL)$B+
+M7QB+`X7`=4:+1PCH2)?__\='+/S___^-1S#'1S`0;`,`B7\TQT<X`````(E$
+M)`2+1PB)!"3H_/___XM<)#R+="1`BWPD1(ML)$B#Q$S#B00DC6L$Z/S___^)
+MQHM#!*@!#X42`0``J`(/A5H!``"H!`^%J@$``*@(#X7Z`0``J!!U9JA`C70F
+M`'0AQT<L``````^V1E*`?0H`#Y7"@^#^"="`3E`0B$92BT4`J"`/A8P```#V
+M1E`0#X1:____C40D$(M65(E$)`2+1F")!"3_4CP/MD0D(HA&3HDT).C\____
+MZ3'___^)]L9$)#0"#[9%"(A$)#B-1"0TBU94B40D!(M&8(D$)/]28(7`B4<L
+M=1\/ME91@\H!B%91@'T(``^5P(/B_8!.4!`!P`G"B%91BT4`J$`/A''____I
+M2____\9$)#0'#[9%"8A$)#B-1"0TBU94B40D!(M&8(D$)/]28(E'+/9&4!`/
+MA*K^___I2____XVV`````,9$)#0`#[9%!(A$)#B-1"0TBU94B40D!(M&8(D$
+M)/]28(7`B4<L=1D/MD90B<*#R)"#RH"(5E`/ME4$B$90B%9/BT,$J`(/A*K^
+M__^-="8`QD0D-`0/MD4%QD0D.0"(1"0XC40D-(M65(E$)`2+1F")!"3_4F"%
+MP(E'+'4@#[9648/*$(A648!]!0`/E<"#XM^`3E`0P>`%"<*(5E&+10"H!`^$
+M5O[__\9$)#0%#[9%!L9$)#D`B$0D.(U$)#2+5E2)1"0$BT9@B00D_U)@A<")
+M1RQU(`^V5E&#RD"(5E&`?08`#Y7`@^)_@$Y0$,'@!PG"B%91BT4`J`@/A`;^
+M___&1"0T`P^V10>(1"0XC40D-(M65(E$)`2+1F")!"3_4F"%P(E'+'4@#[96
+M48/*!(A648!]!P`/E<"#XO>`3E`0P>`#"<*(5E&+10"H$`^$M_W__^D8_O__
+MD(VT)@````"#["R)="0@BW0D,(E<)!R)?"0DB6PD*(M>&(L#A<!U1HM&".A8
+ME/__QT8L_/___XU&,,=&,!!L`P")=C3'1C@`````B40D!(M&"(D$).C\____
+MBUPD'(MT)""+?"0DBVPD*(/$+,.)!"2-:P3H_/____9#!`&)QW47]D=0$'2P
+MB3PDZ/S____KIHVT)@````#&1"04``^V102(1"08C40D%(M75(E$)`2+1V")
+M!"3_4F"%P(E&+'7!#[9'4(G"@\B0@\J`B%=0#[95!(A'4(A73^NFC;8`````
+MC;PG`````(/L'(E<)`R+7"0@B70D$(E\)!2);"08O0$```"+0QB+`(D$).C\
+M____@7L,#/\``(G&#Y3`#[9.4(G'B<C`Z`(AQ8GX#[;0.=5T&HT$O0````"#
+MX?L)P8/)$(A.4(DT).C\____C4,PQT,P$&P#`(E;-,=#.`````")1"0$BT,(
+MB00DZ/S___^+7"0,BW0D$(M\)!2+;"08@\0<PXUT)@!55XG'5E.!["P"``")
+M3"0DB%0D*X!X,``/A(D```")R#'M@^@!B40D(.M2D(UT)@"#?"0@`0^&A0``
+M`(![-`"+<R1U!X!\)"L`=`WVAAP"```!#X6#````B1PDZ/S____V1E`0=`WV
+MAAP"```!#X7R````@\4!B>@X1S!V*HM<KTB%VW3N#[9#"#P$=J,/ME0D*XG8
+M@\4!BTPD).A@____B>@X1S!WUHD\).C\____@<0L`@``6UY?7<.-M@`````\
+M!(G>#X3)````@WPD)`)UHHDT).C\____ZYB-1"0LQT0D%`$```")1"00QT0D
+M#`$```"+0S"+4`B+0`2)-"2)5"0(B40D!.C\____A<`/A43___^`O"0J`@``
+M5717,<"`?"0L171\A<`/A"G___^-1"0LQT0D%`````")1"00QT0D#`$```"+
+M0S"+4`B+0`2)-"2)5"0(B40D!.C\____Z?/^__^)-"3H_/___XUV`.G^_O__
+M@+PD*P(``*IUG[`!QH0D*@(``*K&A"0K`@``5>N-BW,DB1PDZ/S____I)___
+M_X!\)"U2#X5Y____QD0D+%+&1"0M1>ER____C78`@^P<B5PD#(M<)"")="00
+MB7PD%(EL)!B+0QB+4PB+:`2+`(E4)`B)!"3H_/___XNP9`$``(7V#X2$````
+MBU8$A=)T78N*(`(``(7)=$>+0QS'`/_____'0RS_____C4,PQT,P$&P#`(E;
+M-,=#.`````")1"0$BT,(B00DZ/S___^+7"0,BW0D$(M\)!2+;"08@\0<PXN2
+M5`(``(72=:^)]HM6"(72=!F+NB`"``"%_W6<BXI4`@``A<EUDI"-="8`]H!(
+M`0``<'6$#[9X,(7_?B0QR8M4B$B%TG03@'H(!'8-]H)(`0``<`^%7____X/!
+M`3GY==Z#Y0,/E,&%]HG/=%"+1@2%P'0*#[;1,<GH+OW__XM&"(7`=`R)^0^V
+MT3')Z!O]__^+1A"+5@R)0@2)$(M$)`B)="0$@^B`B00DZ/S___^+0QS'````
+M``#I#/___P^VT3')Z.7\___KYHUV`%575HG.4X'LK````(E4)!R)1"0@Z/S_
+M__^+5GB)5"0TB40D+(M&=(E$)#`/MD8.B<+`Z@2$THA4)#]U#`^V3@J$R8A,
+M)#]T8P^V5@V#X`^(1@Z`^D!W"X#Z`7<6@'X,!W00N/____^!Q*P```!;7E]=
+MPX32=#PQV^L=C;8`````]H`<`@```739#[96#8/#`0^VPCG8?AN+1)Y\B00D
+MZ/S___^`>`@!=-?KM\9$)#\!ZY:`?@P(=ZH/MD8,C70F`/\DA6@.``#&1"0^
+M#,9$)$``QX0DC`````P```"+A"2,````B00DZ/S___^%P(E$)%0/A&O___^`
+M?"0_`<=$)%@`````=C`/MD8-,=(/MDPD/V;W\6:%T@^%1?___P^V1"1`B00D
+MZ/S___^%P(E$)%@/A"S___^+5"0T"U0D,`^%F`,``(!\)#X'#X0F!```QT0D
+M,/____\QV\=$)#3_____@'X-``^$W@<``(M$GGR)!"3H_/___XM0+#E4)#2+
+M0"AR$'<&.40D,'8(B40D,(E4)#0/MD8-@\,!.=A_S8M4)%0/MEH%A-MU&HM$
+M)%B%P`^$M0```(M4)%B`>@4`#X2G````#[9&#KK_____B<&+1"0PT^*)T\'[
+M'R'0BU0D-(E$)#")1G0AVHM<)%2)5"0TB59X@'L%`'0U#[9&#?9T)#^+3"0T
+M#[;0#[9#!BG"BT0D,(G5P?T?#Z_*#Z_%`<&+1"0P]^*-+!&)1G2);GB+1"18
+MA<!T-(M4)%B`>@4`="H/MDH&#[9$)#^+7G0IR(M.>(G"P?H?#Z_:#Z_(]V9T
+M`=F-%!&)1G2)5GB+1"0<A<`/A(````"+3"0<@'D(!`^&W?W__XL9BT0D((E<
+M)"0YPP^%R_W___:!'`(```$/A+[]__^+@60!``"%P`^%L/W__V;W@4@!``!0
+M`@^%H?W__XM1&#M6>(M!%`^'DOW__W().T9T#X>'_?__@&8/_(M<)!R`>P@'
+M#X3-`0``@'X,!P^$VP$``#'_BX0DC````(M4)"")1"0$B10DZ/S___^%P(E$
+M)%P/A$;]__^`?"0^!P^$#P4```^V5@W'A"24`````````(32=23I=0(``)"#
+MP@&)E"24````#[96#0^VPCN$))0````/CE8"``"+C"24````BT2.?(D$).C\
+M____B<,QP(7_=1.+;"0<A>UT"XM$)!R)VNADA/__BU0D-(E$)`R+1"0PB1PD
+MB50D"(E$)`3H_/___XN4))0```"+3"1<A<")1)%(=86+A"24````A<!^'C';
+MBU0D7(M$FDB#PP&)!"3H_/___SN<))0```!UY(M,)%R)#"3H_/___[C_____
+MZ6W\___&1"0^!\9$)$``QX0DC`````<```#IR/S__X!^#@</A43\___&1"0^
+M"L9$)$``QX0DC`````H```#II/S__\9$)#X)QD0D0`#'A"2,````"0```.F*
+M_/__QD0D/@C&1"1``,>$)(P````(````Z7#\__^`^@(/AKH$``#&1"0^!<9$
+M)#\"QD0D0`;'A"2,````!0```.E(_/__@'PD/P/&1"0^!<>$)(P````%````
+M&=N#X_Z#PPB(7"1`Z2+\__^`?@P'#X2^!P``BUPD'(![,`$/A"7^__^_`0``
+M`.D=_O__BTPD5`^V606$VW0Z#[9&#?9T)#\/ME$&#[;`*=")PL'Z'XE$)`B+
+M1"0PB50D#(M4)#2)!"2)5"0$Z/S___^)1"0PB50D-(M4)%B%T@^$>/S__XM4
+M)%B`>@4`#X1J_/__#[92!@^V1"0_*="+5"0TB40D"(G!BT0D,,'Y'XE,)`R)
+M5"0$B00DZ/S___^)1"0PB50D-.DQ_/__,=N`?@T`=1KIAP@```%&=`^V1@T1
+M5GB#PP$YV`^.L@,``(M$GGR)!"3H_/___XM0+(M`*(G1"<%UT^FN^O__BUPD
+M7(A3,(M4)"R+1"1<B5`DB5`L@'PD/P$/AD@&```/MDPD0#'M#[9\)#^)C"28
+M````BYPDF````(M$)"")7"0$B00DZ/S___^%P(G##X2;!0``BTPD7(U4J4@Q
+MR87_?A"+`H/"!(E$BTB#P0$YSW7P#[9$)#^(0S"+5"1<BT(DB?*)0R0QP(-\
+M)!P`#Y3`B<&)1"0HB=CH[]7__XGJB>C!^A^+3"1<]_\/ME$PB5R!2`^V1"0_
+M`>@!_3C0#X)P____#[;"]G0D/SP_B$$P=R&+7"1<#[;`C4@!C52#2(/!`8U!
+M_\<"`````(/"!#P_=NV+1"1<B?*+3"0HZ(O5__^+1"1<#[90,(72?DPQ_XM,
+M)%R+7+E(@\<!BTPD5`^V00:+3"1<*<*)T,'X'XE4)`B)1"0,BT$4BU$8B00D
+MB50D!.C\____B5,8B4,4BUPD7`^V4S`Y^G^VBUPD'(7;#X11!@``BU0D'(M,
+M)%R+0BR)02R)3"0$B10DZ/S___^$P`^%&P(``(M<)!R+3"1<#[:3'`(```^V
+M@1P"``"#X@2#X/L)T(B!'`(```^VDQP"``"#X/V#X@()T(B!'`(```^V0S2(
+M032+7"0<BU,8.U$8BT,4=UER!3M!%'=2BU0D7(M"!(!X!@!U#(M"2(M`!(!X
+M!@!T.8M$)!SHW>S__XG'@><"$```#X6:`0``BTPD'(M<)%R+41@[4QB+010/
+M@H,!``!W"3M#%`^">`$``(M$)!R`N!T"```"#X0`!@``BU0D'(M,)%R+7"0@
+MBT(<B4$<BT,<B=F#P1PYR'4/Z6`#``"+`#G(#X16`P``C5#TBUPD'#E:*'7J
+MBUPD7(E:*.OABWYTBVYX#[96#8GY">D/E<"%TGX/A,#'A"24`````````'4V
+MQX0DE`````````"$P'0-.90DE`````^$1?O__P^VA"24````BU0D7(A",.DQ
+M_?__C;8`````BYPDE````(M$GGR)!"3H_/___XM(+(M0*(E\)&");"1D.<UR
+M#G<$.==V"(E4)&")3"1DBTPD9(M4)&#'1"0,`````(D$)(E,)`B)5"0$Z/S_
+M__^+C"24````BUPD7(7`B42+2`^$P?K__RM\)&`;;"1D@X0DE`````&)^P^V
+M5@T)ZP^5P#N4))0````/CD/___^$P`^$3/___^EA____QD0D/@;&1"1``,>$
+M)(P````&````Z9/W__^+1"14#[98!>E0^/__OP$```"+1"0@@^B`B00DZ/S_
+M__^)PS'`Q@08`(/``8/X:'7TZ/S___^+5"1<B5,(B0.+1"0<B4,$B1PDZ/S_
+M__^+3"1<BT$$@'@&``^%7`(``(M!2(M`!(!X!@`/A4P"``#&0V8#@'L4``^$
+MRP,``(![9@,/A,T#``"+3"1<BT$4BU$8@'MF`HE#7(E38`^$:0,``(M$)!R`
+MN!T"```"#X18`P``BU0D'("*20$```2+3"1<@(E)`0``!("A2`$``/V)F60!
+M``")FF0!``"+1"0@C5,,BT@8B5`8@\`4B4,,B1&+5"0<B4L0B10DZ/S___^+
+M3"1<B0PDZ/S___\/MD8/J`$/A8T```"H`G1Z@'PD/P$/ACT#``"+7"18@'L&
+M``^$+P,``(M$)%R`>#``=%<Q]HM4)%R+7+)(@\8!C8/``0``@(M(`0``$,>#
+MQ`$``#"J`P")F\@!``")1"0$BP.+0`2)!"3H_/___XE<)`3'!"0$````Z/S_
+M__^+3"1<#[9!,#GP?ZN+5"1<BX)8`@``Z7KU__^`?"0_`0^&/@$``(M$)%B`
+M>`8`#X0P`0``BU0D7(!Z,`!T5S'VBTPD7(M<L4B#Q@&-@\`!``"`BT@!``!`
+MQX/$`0``,*H#`(F;R`$``(E$)`2+`XM`!(D$).C\____B5PD!,<$)`T```#H
+M_/___XM<)%P/MD,P.?!_JXM$)%R`H$@!``"_Z6?___^+1"0<,<DQTNA<\?__
+MBU0D7(M,)""+0AR)1"0$BT$$B00DZ/S____II?[__XGJB>C!^A_W_X7`B<9^
+M&XM4)%RY`0```(M$FD@QTH/#`>@7\?__.?-UY8M,)%P/MD$P.<4/C0?X__^-
+M=*E(B>N+!H/#`8/&!(D$).C\____BU0D7`^V0C`YV'_DZ>#W__^%_[@"````
+M=`>`>Q0`#Y7`B$-FZ:#]__\QR8M$)%R)\H-\)!P`#Y3!Z`_0___IU_K__XM4
+M)%R)T`7``0``@(I(`0``0,>"Q`$``#"J`P")DL@!``")1"0$BP*+0`2)!"3H
+M_/___XM,)%S'!"0-````B4PD!.C\____Z5S^__^+1"0<@'@P``^$-/C__X!^
+M#0`/A"KX__^+0$@Q_X7`=33INO/__XM<)!R#QP$/MD,P.?@/CG4!```/MD8-
+M.?@/CD\!``"+3"0<BT2Y2(7`#X2+\___BU@DBT2^?(D$).C\____.<-UOHM,
+M)!P/MD$P.D8-#X=G\___#[;(A<D/CC`!``"+7"0<,?^+0TB%P'4HZ4KS__^+
+M7"0<@\<!#[9+,#GY#XX+`0``BU0D'(M$NDB%P`^$)_/__XM8)(M$OGR)!"3H
+M_/___SG#=,KI#_/__XM$)!RYT'H#`(G:Z-V>__\QP.G]\O__BTPD7(D,).C\
+M____]D8/`0^%;?W__XM<)%R)'"3H_/___^G#_/__,<`QTH7_#X4]_/__BTPD
+M'(M!%(M1&.DN_/__BUPD7(G8!<`!``"`BT@!```0QX/$`0``,*H#`(F;R`$`
+M`(E$)`2+`XM`!(D$).C\____B5PD!,<$)`0```#H_/___^GJ_/__BU0D7+E@
+M=P,`Z#Z>__\QP.E>\O__BTPD5`^V607ID//__XM4)!P/MD((/`</A)[V___I
+MI_;__Y"-="8`#[9#".OHBUPD'(M&=(M6>(G'B=4K>Q0;:QB)ZPG[#X39````
+MBT0D'(M,B$2)3"1\BU$DB50D>(M:)(7;=0_I-@$``(L;A=L/A"P!``"+0Q2%
+MP'7OBTPD?(M),(M!#(M1$(F,)(@```")A"2`````B90DA`````-!!!-1"(M+
+M"#-#!#'1"<%UNXM4)'R+0A2+4AB)1"1PBT,,B50D=(M3$#G5#X>*`@``<@@Y
+MQP^#@`(``(N$)(````"+E"2$````BXPDB`````'X$>J)00R)41"+3"1\B4$4
+MB5$8`7L$$6L(*7L,&6L0BUPD>(!+4!")'"3H_/___XM&=(M6>(M,)!R+7"0<
+MB5$8C580B4$4BT80@<%4`0``B8-4`0``BT($B4$$BT((B4$(BT(,B4$,B1PD
+MZ/S___^+0QR)1"0$BP.+0`2)!"3H_/___P^V1@^#X!S!^`*`NQT"```"B<(/
+MA"@"``"+3"0<BX%8`@``B)$=`@``Z;[P___'1"1P`````,=$)'0`````BU0D
+M'(GY">D/E<`/ME(PB90DG`````^V5@TYE"2<````#XVT````A,`/A+D```"+
+MG"2<````QX0DD`````````")7"08BYPDD`````-<)!B+1)Y\B00DZ/S___^+
+M2"R+4"B)?"1HB6PD;#G-<@YW!#G7=@B)5"1HB4PD;(M,)&R+5"1HQT0D#```
+M``")!"2)3"0(B50D!.C\____BTPD'(7`B4292'1H*WPD:(M4)!P;;"1LB?F#
+MA"2<`````0GIB5`,#[96#0^5P(.$))`````!.Y0DG````'\LA,!T"3F4))P`
+M``!T*(M$)!P/MIPDG````(A8,(M&=(M6>.ER_O__D(UT)@"$P'3=Z37___^+
+M7"1T"UPD<'1+BU0D'`^V0C"+1()$B00DZ/S___^+3"0<BU0D=(M$)'`/MEDP
+MB50D"(M4)'C'1"0,`````(E$)`2#ZP&)%"3H_/___XM,)!R)1)E(BUPD'`^V
+M0S`[A"2<````#XTO[___C5R#2#'VB<>+`X/&`8D$).C\____C00^QP,`````
+M@\,$.X0DG````'S>Z0#O__^+C"2(````*<<9U0.$)(`````3E"2$````B4$,
+MB5$0BTPD?(E!%(E1&(E<)`2+7"1XB1PDZ/S___^`2U`0B1PDZ/S___^)Z`GX
+M#X4(_O__BT9TBU9XZ7']__\\`@^$T/W__XB#'0(``(M$)"2YX)`#`(N0*`$`
+M`(G8Z&":__\QP.F`[O__B?:-O"<`````5E.#[!2+="0@BUX8BP.)!"3H_/__
+M_XU+!(G"BT8(Z.WM__^%P(G"="V#^/]T,HM&',=&,!!L`P")=C3'1C@`````
+MB1"-1C")1"0$BT8(B00DZ/S___^#Q!1;7L.-="8`QT8L_____^O%C;0F````
+M`%575E.![*P```"+O"3`````C70D$(GPC50D'(MO"(M?&,8``(/``3G0=?:-
+M1@S'!GP!``")7"0$QT0D"&@```")!"3H_/___XU3:,=&=`````"-3GS'1G@`
+M````BT-HB49\BT($B4$$BT((B4$(BT(,B4$,BT(0B4$0BT(4B4$4BT(8B4$8
+MBT(<,=*)01R)\8GHBU\<Z`;M__^)`X/``74'QT<L_____XU',,=',!!L`P")
+M?S3'1S@`````B40D!(M'"(D$).C\____@<2L````6UY?7<.-=@"-O"<`````
+M5C'24X/L%(MT)""+3AB+1@B+7ASHI^S__XD#@\`!=0?'1BS_____C48PQT8P
+M$&P#`(EV-,=&.`````")1"0$BT8(B00DZ/S___^#Q!1;7L-55U93@^P,BT0D
+M((LHBU@HBW@LB[4H`0``B00DZ/S___^+0QR-31R)1QR+11PYR'4(ZQB+`#G(
+M=!*-4/0Y6BB0=?&+`(EZ*#G(=>XQR3'2B=CH^NC__XM''(E$)`2+102)!"3H
+M_/___XD\).C\____BX=8`@``BU8<QT8P$&P#`(EV-,=&.`````")`HU&,(E$
+M)`2+1@B)!"3H_/___X/$#%M>7UW#C78`C;PG`````%57B<=6B=93@>R\````
+MBUA<N/____^`?P@!=`N!Q+P```!;7E]=PXVL)(P```"+5U2);"0$BT=@B00D
+M_U(\C40D%(M3!(E$)`2+0PB)!"3_4AR-A"2P````B00DC8PDM````(G8C90D
+MN````.B/;/__#[:$))T```"(1@+VA"2:`````@^%@`$```^VA"2T`````H0D
+MG````(A&`8N$)+@```"(!H!_4``/B6@!```/MD=/B$8##[:$)*,```"(1@4/
+MMI0DF`````^V1@8/MIPDF0```,#J!HG1@^#\@^$!"<@/MHPDF0```-#J`=()
+MT(/A`8/@\\'A`HT4G0`````)R(/B"(G9"="#X1"#X,^)VH/B(`G("=")V8/A
+M0(/@/XG:"<B#XH`)T(A&!@^V1@</MI0DGP```(/@_(/B`PG0]L,$B$8'#X3;
+M````QD8$`HGJB?CHIV[__XN4)*@```"%THE&"'0NC48,C5Y"B50D!,=$)`B6
+M````B00DZ/S____'1"0$*````(D<).C\____QD,G`(N$))0```")1G[V1U!!
+M=22+1S"+5S2)AJ(```")EJ8```"+1RB+5RR)AJH```")EJX```"+5R2%TG0M
+M,<GK!HL2A=)T(XM"%(7`=!>+0`R%P'00BX!8`@``B82.N@```(/!`8/Y!W[7
+M@<2\````,<!;7E]=PP^VA"2P````Z7O^__\/MH0DH@```(A&`^F/_O__@^,(
+M@/L!&<"#X/Z#P`.(1@3I$____XUV`%575E.#[`R+5"0@BT(8BUH<BS")-"3H
+M_/___XL3@^H%B<=T#C'`QD08!0"#P`$YPG7TA?9T7H7_=%J+1Q2+5QB)0Q"+
+M1PR)4Q2Z_____X7`=`:+D%@"``")4QB+5QR)T,'X'PG0B$,/BP>+0`2)!"3H
+M_/___XA##@^VAQT"``"(0PT/MD<(/`1V1L9##`&`?S!`=E2+1"0@QT`L____
+M_XM4)"")T(/`,,=",!!L`P")4C3'0C@`````B40D!(M""(D$).C\____@\0,
+M6UY?7<,L`77`QD,,`HU3+(GXZ-[\__^%P'6NZ[>+1SB+5SR)@[P```")^(F3
+MP````.@?</__C9=4`0``C4LLB8.P````BX=4`0``B4,LBT($B4$$BT((B4$(
+MBT(,B4$,#[9'".@L;/__B(.0````#[9',8B#D0````^V1S2(@[0```"+ATP!
+M``"+EU`!``")@YP```")^(F3H````.BCW/__B8.4````B3PDZ/S____&@Y(`
+M````B8.8````@'\P``^$,0$``#'MBW2O2(7V#X3E````@+N3``````^$Z```
+M`(!^"`0/A/<```"+AE@"``")A*O$````#[:3D@```(/%`8/"`8B3D@````^V
+M1S`YZ`^/C0````^VTH/Z/W\8C823Q````(/"`<<`_____X/`!(/Z/W[OBX=D
+M`0``A<`/A([^__^+4`2Y_____X72=`:+BE@"``")BZ0```"+4`BY_____X72
+M=`:+BE@"``")BZ@```"+<`2%]@^$4_[__XM("(7)#X1(_O__B3PDZ/S___^)
+M@ZP```#I-?[__XVV`````(/]/P^/:O___XMTKTB%]@^%&____\>$J\0`````
+M````Z2____\/MD8(Z,)J__^(@Y,```"`?@@$#X4)____BT8DBX!8`@``B82K
+MQ````.D!____,=+I(?___XVV`````('LS````(F\),0```")QX!_"`&)M"3`
+M````B=:)G"2\````B:PDR````(M87+C_____=".+G"2\````B[0DP````(N\
+M),0```"+K"3(````@<3,````PXM'8(VL)(P```"+5U2);"0$B00D_U(\C40D
+M%(M3!(E$)`2+0PB)!"3_4AR-A"2P````B00DC8PDM````(G8C90DN````.A/
+M9___#[:$))T```#VA"2:`````HA&`@^%%@$```^VA"2T`````H0DG````(A&
+M`8N$)+@```"(!H!_4``/B10!```/MD=/B$8##[:4))@````/MD8&#[:<))D`
+M``#`Z@:)T8/@_(/A`0G(#[:,))D```#0Z@'2"="#X0&#X//!X0*-%)T`````
+M"<B#X@B)V0G0@^$0@^#/B=J#XB`)R`G0B=F#X4"#X#^)V@G(@^*`"=`/MI0D
+MGP```(A&!@^V1@>#X@.#X/P)T/;#!(A&!P^VA"2C````B$8%=&C&1@0"B>J)
+M^.AK:?__BY0DJ````(E&"#'`A=(/A)O^__^-1@R-7D*)5"0$QT0D")8```")
+M!"3H_/___\=$)`0H````B1PDZ/S___\QP,9#)P#I9O[__XGV#[:$)+````#I
+MY?[__XUV`(/C"(#[`1G`@^#^@\`#B$8$ZXD/MH0DH@```(A&`^GC_O__C;8`
+M````C;PG`````%575E.#[`R+;"0@BWT8BP>%P'1$,?;K#XD<)(/&`>C\____
+M.3=V,8M$MP2)!"3H_/___X!X"`&)PW5(]D!0`G37B00D@\8!Z/S___^)'"3H
+M_/___SDW=\^-13#'13`0;`,`B6TTQT4X`````(E$)`2+10B)!"3H_/___X/$
+M#%M>7UW#QT4L_O___^O,C70F`(/L'(M$)"")7"04B70D&(M8"(MP!(E$)`2+
+M`X/H@(D$).C\____B?`QR3'2Z+_@__^`BT@!```$BW0D&(E<)""+7"04@\0<
+MZ?S___^-="8`@^P<,=*)7"04BUPD((ET)!B+0P2+,`^W0UB+CF0!`P#!X`F)
+MGG@!`P#'AH`!`P``````C40!__?QQX9T`0,`8`H$`,>&?`$#``````")AG`!
+M`P"-AG`!`P")-"2)1"0$Z/S___^+7"04BW0D&(/$',/K#9"0D)"0D)"0D)"0
+MD)"#[#R+1"1`B5PD+(ET)#")?"0TB6PD.(M`&(L`B00DZ/S___^+@&0!``")
+M1"08@'@4``^$BP```(G"BT!<BU)@B40D((M$)!B)5"0DBU0D)(M(!(M$)""+
+M>12+:1@Q^#'J"<(/A!\"```Y;"0D#X-C`0``BU0D)(M$)"`QZC'X"<(/A!4"
+M``"+3"08,?8[="0D#[=)9&:)3"0>#[?9#X)]`0``=PH[7"0@#X9Q`0``#[=$
+M)"`Q]@^WV&:)1"0>Z5T!``"+1"08BTA<BUA@BT`$B=J+<!2+>!B)R#'P,?H)
+MP@^$>@$``(M$)!@/MFAFB>J$T@^%2`$``(M$)!@QT@^W0&1FB40D'@^WP`'(
+M$=HYUW<.#X/*`0``9BG.9HET)!Z+5"08#[=$)!YFQT):``")2E")6E1FB4)8
+MB>J$TG0E@/H#=""+1"08BUPD+(MT)#"+?"0TB40D0(ML)#B#Q#SI'/[__XM$
+M)!@QTHE()(G!QT`T`````(E8*`^W0%@#05`3453'04!0W@,`B4$LB<B#P#B)
+M03B)03R#Z!2)43")243'04@`````QT%,`0```(E$)`2+002)!"3H_/___X7`
+M=(*+7"0LBW0D,(M\)#2+;"0X@\0\PW<*.7PD(`^&D?[__XM4)!B)^#'V#[=2
+M9`^WV@'89HE4)!Z)ZA'R.U0D)'(>#X;G````#[=,)"`Q]F8I^6:)3"0>#[?9
+MC;8`````BT0D((M4)"0IV!GRB<&)TXM4)!@/MFIFZ>/^__^-=@"`^@,/A*_^
+M__^+5"08BT((BW`4BW@8Z9W^__^0C70F`(M$)!@/MFAFB>J`^@,/A)0```")
+MZ(3`=="+5"08O0$```#&0F8!Z\&+5"08#[9"9CP"='$L`0^$@P```(M$)!@Q
+M]HM4)""+3"0D#[=`9(ET)`R)%"2)3"0$#[?8B5PD"&:)1"0>Z/S___]FA<`/
+MA$W___\/M]@Q]F:)1"0>Z3[___\YQ@^#-O[__^DI_O__.T0D(`^")____XVT
+M)@````#I`____XG0BUPD+(MT)#"+?"0TBVPD.(/$/.E1P___BT0D&,9`9@"+
+M>12+:1CI-_W__XVT)@````"-O"<`````@^QLB50D-(M4)'2)?"1DBWPD?(EL
+M)&B)Q8M$)'")7"1<B50D+`^W5"1XB70D8(M/"#'VB40D*(M$)"AFB50D)@^W
+MVHM4)"R)3"0@BTPD-`'8B40D.!'RB50D/#M1/`^#?@```(M4)#2+3"0@BT(@
+MB0PDB40D!.C\____A<")1"1$#X1<`0``BT0D1,9`9@!F@WPD)@&)>"S'0'#P
+M\0,`QT!L``````^$.P(``(']&?\```^$B@```'=T@?T+_P``#X0P`0``QT<L
+M_O___XM$)$2)!"3H_/___XM7"(E4)"#K"78_QT<L_O___XM,)""-1S#'1S`0
+M;`,`B7\TQT<X`````(M<)%R)1"1TBW0D8(E,)'"+?"1DBVPD:(/$;.G\____
+M.T$X#X8X____Z[:!_2/_```/A+P```"!_23_``!UA(M$)#3V0%("#X54`0``
+MBW0D1,9&9`/&1E,DBWPD1`^V1V6#X/N#R`*(1V6+1"1$@'AD`P^$H0$``(M,
+M)$0/MD%(/!`/A$8"```\"@^$^0(``(M<)""+3"0TBU0D1(M#)(E**(7`#X19
+M`P``BW0D((M4)$2+?"1$BTX@B?"#P@R#P!R)5B")1PR)3Q")$8M<)%R+="1@
+MBWPD9(ML)&B#Q&S#BU\(QT<L_?___XE<)"#I]?[__V:#?"0F`0^'Q/[__XM$
+M)#2+:"2%[71/C78`BU4(.50D+(M%!`^"MP```'<*.40D*`^"JP````-%#!-5
+M$#E4)#P/AYL````/@XL```"+512%THE4)$QT#XM*#(7)B4PD2`^%Z`(``(M$
+M)#3V0%("#X2X`@``BU0D1,9"9`*+7"0\BTPD.(G9,=L)RP^$K0(``,9"4(K&
+M0D@0BWPD1`^V1V6#R`2#X/V(1V7IR?[__XM4)$3&0F0"BUPD/(M,)#B)V3';
+M"<L/A``!``#&0E"(QD)($.F/_O__.40D.`^&:____XMM`(7M#X4N____Z77_
+M__^+3"0LBU0D*,=$)!0!````B6PD!(E,)!"+3"0TB50D#,<$)(@,``")3"0(
+MZ/S____ID/W__\=`6`````"+5"0LBT0D*`^LT!#!ZA`/ME0D*(G!,,!F@>'_
+M``G0BU0D1&:)0DR+="0LBUPD*`^L\PC![@@/ML.)]XG>#ZS^$(ET)"@/MU0D
+M*,'O$(E\)"R+?"1$,-()T&:)1TZ+5"0LBT0D*`^LT`B)1"0H#[=$)"C!Z@B)
+M5"0LQD=20&;'1T@``##`"<%FB4]0#[=4)"9FB5=*9HE75.G3_?__BUPD1,9#
+M4"C&0T@*Z8O]___&04D`#[=$)";!X`F)04R+5"0LBT0D*(G0,=+!Z!B(05*+
+M5"0LBT0D*(G0,=+!Z!"(05.+5"0LBT0D*(G0,=+!Z`B(052+5"0LBT0D*(G0
+M,=*(056+5"0LBT0D*`^LT!B(05;!ZAB+1"0HBU0D+`^LT!"(05?!ZA"+1"0H
+MBU0D+`^LT`B(05@/MEPD*,'J",9!6@#&05L`B%E9#[=$)"9FP>@(B$%<#[9$
+M)";&05X`B$%=QD%?`.D'_?__BU0D1,9"20`/MT0D)L'@"8E"3(M4)"R+1"0H
+MBTPD1`^LT!B(05+!ZAB+1"0HBU0D+`^LT!"(05/!ZA"+1"0HBU0D+`^LT`B(
+M050/MEPD*,'J",9!5@"(654/MT0D)F;!Z`B(05</MD0D)L9!60"(05CID?S_
+M_XM4)$2)5"1PBUPD7(MT)&"+?"1DBVPD:(/$;.G\____BW0D1,9&9`/&1E,T
+MZ5O]__^+7"1$QD-0*L9#2`KI2OW__XM,)$B+442+04")5"0$B00DZ/S___^+
+M3"1(BU$$.$(&#X;R_/__BU4(BT4$B50D5(M4)$2)1"10QD)D`8M$)"`%F```
+M`(D$).C\____A<")P0^$XP$``(M\)"@K?"10BVPD+!ML)%0!^\=`$``````1
+M[HEP#(MT)$B):`2)6`B+7"1$QT`@`````(DXQT`<`````,=`)`````"-0!2)
+M012)01B+1@3'02@!````B4L\B7,H@'@%``^$C````,9#4@$/MDXQ#ZWOT^WV
+MP2!T!(GO,>V)>TB):TP/MDXPA,ET,HM\)$RX`0```#M^2`^$.P$``#'2ZQ6+
+M7"1(#[;"BW0D3#MT@T@/A!\!``"#P@$XRG7DBT0D((M`)(7`#X2<_O__BUPD
+M((M4)$2+="1$BTL@B=B#P@R#P!R)4R")1@R)3A")$>E"^___BT0D((M,)$2+
+MD&0!`P#&05(!BT0D((EY2(EI3`5@`0,`B4%4#[=<)"9FB5E0BW0D2`^V7C"$
+MVW0NBWPD3+@!````.WY(#X2.````,<#K$8MT)$@/MLB+?"1,.WR.2'1R@\`!
+M.-AUZ`^W1"0FB=.+="0@BWPD1,'@"8U$`O\QTO?SQX:``0,``````,>&=`$#
+M```1!`")OG@!`P#'AGP!`P``````B89P`0,`B?"+7"1<!7`!`P"+?"1DB70D
+M<(ML)&B)1"1TBW0D8(/$;.G\____N`$```#3X(M,)$2(05/KA8U"`8M\)$2(
+M1U/IV?[__\='+/W____I0_G__XVV`````(/L3(E<)#R+7"1<B6PD2(G5BU0D
+M5(ET)$"%[8E\)$2)1"0DBTL(BT0D4(E4)!P/MU0D6(E,)!")1"08BX%D`0,`
+M9HE4)!:)1"0H=`GVA4D!```$=#^+5"00C4,PQT,L_O___\=#,!!L`P")6S3'
+M0S@`````B40D5(E4)%"+7"0\BW0D0(M\)$2+;"1(@\1,Z?S___^+100/MD@&
+MA,ETM@^W1"06#[;1,?^)Q@^V13`#="08$WPD'"G0B<'!^1^)1"0(B4PD#(M%
+M%(M5&(D$)(E4)`3H_/___SG7#X=U____<@@YQ@^':____XM$)!`%F````(E$
+M)"R)!"3H_/___X7`B40D,`^$00$``(M%((M4)!")1"0$B10DZ/S___^%P(E$
+M)#0/A`X!``"+3"0PBT0D&(M4)##'02``````B0&)R(/`%,="$`````"+5"0<
+MB4$4B4$8BT0D-(EQ"(E1!(EY#,=!'`````#'020`````QT$H`0```(E(/(E8
+M+,9`9`&A`````(7`?@P[A;P!```/G\`/ML"+5"0TB4(TBT4$@'@%`'0_BTPD
+M)('I"_\``(/Y&@^&A0$``(M$)#"+5"0LB40D!(D4).C\____BTPD-(D,).C\
+M____BT,(B40D$.EP_O__#[=$)!:+5"0HBTPD),'@"8U$`O\QTO=T)"B!Z0O_
+M``"#^1J)QG9KBU0D,(M,)"R)5"0$B0PDZ/S___^+1"0TB00DZ/S___^+4PB)
+M5"00Z1W^__^+3"0PBT0D+(E,)`2)!"3H_/___XU#,,=#+/W____'0S`0;`,`
+MB5LTQT,X`````(E$)%2+0PB)1"10Z07^__^X`0```-/@J0"```0/A6H!``"I
+M`$```@^%4`$``*D!```!#X1M____BTPD-,9!4@&+1"00BTPD-`5@`0,`B4%4
+MBTPD-(M$)!B+5"0<B6DHB4%(B5%,#[=<)!;&068`QT%L`````,=!<-#R`P!F
+MB5E0BT0D$(M4)!")L'`!`P#'@(`!`P``````QX!T`0,``!$$`(F(>`$#`,>`
+M?`$#```````%<`$#`(M<)#R)1"14BW0D0(E4)%"+?"1$BVPD2(/$3.G\____
+MN`$```#3X*D`@``$#X6]````J0!```(/A:4```"I`0```0^$4_[__\9"4@$/
+MMDTQBU0D'(M$)!@/K=#3ZO;!('0$B=`QTHM,)#2)04B)44S&068`BUPD$,=!
+M;`````"):2C'07#0\@,`BT,DA<!T;(M4)#2+7"00@\(,BTL@B=B)4R"+7"0T
+M@\`<B4,,B4L0B1&+7"0\BW0D0(M\)$2+;"1(@\1,PXM$)#0!]L9`4@+IM/[_
+M_XM<)#3&0U(#Z:?^__^+3"0TQD%2`NE=____BUPD-,9#4@/I4/___XM,)#2+
+M7"0\BW0D0(M\)$2)3"10BVPD2(/$3.G\____C;8`````@^PLB5PD'(M<)#")
+M="0@B7PD)(EL)"B+0QB+<`2+>`@/MV@,BP")!"3H_/___XG"BT,,B5PD#(EL
+M)`B)-"2)?"0$Z'G[__^+7"0<BW0D((M\)"2+;"0H@\0LPY"-="8`@^PLB5PD
+M'(M<)#")="0@B7PD)(EL)"B+0QB+<`2+>`@/MV@,BP")!"3H_/___X!X"`&)
+MP70PBT,,#[?5B50D"(G*B5PD#(DT)(E\)`3H#OO__XM<)!R+="0@BWPD)(ML
+M)"B#Q"S#BT,,#[?5B50D"(G*B5PD#(DT)(E\)`3H3O/__^O.C;8`````C;\`
+M````@^PLB5PD'(M<)#")="0@B7PD)(EL)"B+0QB+<`2+>`@/MV@,BP")!"3H
+M_/___X!X"`&)P70PBT,,#[?5B50D"(G*B5PD#(DT)(E\)`3H?OK__XM<)!R+
+M="0@BWPD)(ML)"B#Q"S#BT,,#[?5B50D"(G*B5PD#(DT)(E\)`3HOO+__^O.
+MC;8`````C;\`````@^PLB5PD'(M<)#")?"0D,?^)="0@B6PD*(M#&`^V:`B+
+M<`2+`(D$).C\____B<*+0PR)7"0,B6PD"(DT)(E\)`3H^OG__XM<)!R+="0@
+MBWPD)(ML)"B#Q"S#C;8`````@^P<B5PD$(M<)"")="04B7PD&(M#&(MX!`^V
+M<`B+`(D$).C\____@'@(`8G!=#*+0PR)7"0,B?,/MM.)5"0(B<J)/"3'1"0$
+M`````.B/^?__BUPD$(MT)!2+?"08@\0<PXM##(E<)`R)\P^VTXE4)`B)RHD\
+M),=$)`0`````Z,WQ__^+7"00BW0D%(M\)!B#Q!S#C;8`````C;PG`````(/L
+M'(E<)!"+7"0@B70D%(E\)!B+0QB+>`0/MG`(BP")!"3H_/___X!X"`&)P70R
+MBT,,B5PD#(GS#[;3B50D"(G*B3PDQT0D!`````#H[_C__XM<)!"+="04BWPD
+M&(/$',.+0PR)7"0,B?,/MM.)5"0(B<J)/"3'1"0$`````.@M\?__BUPD$(MT
+M)!2+?"08@\0<PXVV`````(V\)P````!5B=575HG&4X/L#(72B99H`0,`=#&)
+MPS'_C;0F`````(T$?X/'`8V$AF0!``")1"0$B30DZ/S___^)@V`!``"#PPPY
+M[W7:H0````#'AFP!`P`2````A<!T'XVT)@````"+4`@YEFP!`P!V!HF6;`$#
+M`(M`!(7`=>B#Q`Q;7E]=PU=6B<93@^P0BX!H`0,`A<!T.(GS,?^+@V0!``"#
+MQP&+DV@!``")1"0(B50D#(N#8`$``(/##(DT)(E$)`3H_/___SF^:`$#`'?,
+MQX9H`0,``````(DT).C\____@\006UY?PXVV`````(V\)P````!64X/L%(MT
+M)""`?F0#BUXL#X2,````#[9&9CP0#X2.````/`5T('<:+`&-M@`````/A(0`
+M``#'0RS_____C78`ZPX\"W5]QT,L_?___XUV`(M&/(7`=!.)1"0$BP8%F```
+M`(D$).C\____BP;H'____XDT).C\____C4,PQT,P$&P#`(E;-,=#.`````")
+M1"0$BT,(B00DZ/S___^#Q!1;7L/V1E,!#X1J____QD9F$(M#',8``<9&9@''
+M0RP`````ZXT\#0^$>____\=#+/_____I>?___XGVC;PG`````%93@^P4BW0D
+M((M>+(M###TD_P``=&H]&?\``'1C@'YF$'9OQT,L_____XVV`````(M&/(E$
+M)`2+!@68````B00DZ/S___^+!NAC_O__B30DZ/S___^-0S#'0S`0;`,`B5LT
+MQT,X`````(E$)`2+0PB)!"3H_/___X/$%%M>PXGV@'YF#'0_BT,<Q@``@'YF
+M$'>1#[Y.9K@!````T^"I("D!`'44J`(/A'?____'0RP`````Z7C____'0RS]
+M____D.EK____BT,<Q@`!BT8HQP0D$0```(E$)`3H_/___\9&9@'KR(VV````
+M`(V_`````(/L'(E<)!2+7"0@B70D&(M#&(-[$`>+,'8&@WL4`W<3QT,L_O__
+M_XM<)!2+="08@\0<PXDT).C\____A<!TX8DT).C\____BQ`[4PAT"<=#+/S_
+M___KT(M(#(7)=<*`>`@$=KR+0!R#^/]TNXE$)`2+0@2)!"3H_/___X7`=*C'
+M0RS_____ZY^0C;0F`````(/L'(E<)!")PXE\)!B)UXET)!2+@"`"``"%P'4*
+MB[-4`@``A?9T&3'`BUPD$(MT)!2+?"08@\0<PXVT)@````"+0QR#^/]T%8E$
+M)`2+`XM`!(D$).C\____A<!URH!["`1V.&;W@T@!``!P"'6Y@'LP`'0@,?:+
+M1+-(A<!T"XGZZ'O___^$P'2>#[9#,(/&`3GP?^*X`0```.N.=!&)^HG8Z`I?
+M__\/ML#I>____XM#)(GZZ/A>__\/ML#I:?___X/L#(!X"`1V%S')@[AD`0``
+M`'0,B<B#Q`S#C;8`````Z!O___^#Q`P/MLB)R,.)]E575E.#[`R+="0@BTX8
+MBU8<BP''`@````")Q8G'@>4``0``@>?_````=&PQV^LBD(M(#(7)=5N`>`@%
+M&=+WTB'"Z(K___^$P'1(.?MT28M.&(/#`8L$F8D$).C\____A>UUS8M0#(72
+M=2AF]X!(`0``<`AU'8M0'(/Z_W3-B50D!(L`BT`$B00DZ/S___^%P'2XBT8<
+MB1B-1C#'1C`0;`,`B78TQT8X`````(E$)`2+1@B)!"3H_/___X/$#%M>7UW#
+MC;0F`````(V\)P````!55U93@^P,BW0D((M&&(L0,<#VQO\/E,`/MOJ)1"0(
+MBT8<,=L/MFPD",<``````)`Y^W(\A?]T)3';C;8`````BT88@\,!BP28B00D
+MZ/S___^)!"3H_/___SG[=>.+7"0(A=MU;,=&+`````#K.(GVB>B$P'2^BT88
+M@\,!BP28B00DZ/S___^`>`@%&=+WTB'"Z&K^__^$P'66BT8<QT8L_____XD8
+MC48PQT8P$&P#`(EV-,=&.`````")1"0$BT8(B00DZ/S___^#Q`Q;7E]=PX7_
+M=-&+1AB+0`2)!"3H_/___X/$##'26UY?7>GO=O__ZPV0D)"0D)"0D)"0D)"0
+M5U93@^Q@BW0D<(U$)#R+?BB+7BR+5U2)1"0$BT=@B00D_U(\#[9$)$Z(1TZ!
+M>PQ"_P``='X/MD93BU,<B$(*#[=&3(A"!@^W1DZ(0@</MT90B$((#[9&4HA"
+M"0^W1DB(0@0/MT9*B$(%#[=&5(A""X!^9@$/A(8```#'0RS_____B30DZ/S_
+M__^-0S#'0S`0;`,`B5LTQT,X`````(E$)`2+0PB)!"3H_/___X/$8%M>7\,/
+MMD93BU,<B$(/#[=&3&:)0@@/MT9.9HE""@^W1E!FB4(,#[9&4HA"#@^W1DAF
+MB4($#[=&2F:)0@8/MT949HE"$(!^9@%U@(VV`````(M##,=#+``````]0O\`
+M`'13/1C_```/A67___^+0QB`>`KR#X58____C50D&(M'5(E4)`2+5V")%"3_
+M4#R+5"0T@<(``0``#[8"J`0/A"____^#X/N(`HD\).C\____Z1W___^+0QB`
+M>`_R#X40____Z[:-M@````"-O"<`````55=64XG#@^P,,<"0C70F`,8$&`"#
+MP`&#^"QU],<#+````.B)2___B$,$H0````"+,(7V#Y1#!:$`````B00DZ/S_
+M___!X`P]____`0^&B0```,9#!@7&0P<+#[9#"[\%````,>W&0P@`QD,)`<9#
+M"@^#X/Z#R`B(0PO&1"0+`.L5@_\%QD0>'$!T.(/%`8/'`8/_#70TB3PDZ/S_
+M__^%P'3LB>@/MO")^.BR3/__@_\&B$0>#'7*QD0>'`*`3"0+0.O(@$PD"R#K
+MP8!\)`M@=!>#Q`PQP%M>7UW#QD,&!\9#!P?I<O___Z$`````@[B4`0,``W;;
+MB>H/ML+&1!@,$L9$&!Q`@\0,,<!;7E]=PY!3@^P(BUPD$(M#'.C@_O__A<!T
+M!\=#+/____^-0S#'0S`0;`,`B5LTQT,X`````(E$)`2+0PB)!"3H_/___X/$
+M"%O#C;8`````C;PG`````%575E.![)P```"+K"2P````BWT(B?CHY5?__XN'
+MD`$#`(7`#X6%````BW<(QX>0`0,``0```(7V#X2E````C50D)(M&!(E4)`2+
+M5@B)%"3_4!P/MD0D-`&'D`$#`(!\)#0`=#$QVXET)`S'1"0((/L#`(E<)`2)
+M-"3H_/___X3`=0>#KY`!`P`!#[9$)#2#PP$YV'_1BS:%]G6CBX>0`0,`@^@!
+MA<")AY`!`P!T/XU%,,=%+/S____'13`0;`,`B6TTQT4X`````(E$)`2+10B)
+M!"3H_/___X'$G````%M>7UW#QX>0`0,``````(V'5`$``,>'5`$``!#[`P")
+MOU@!``#'AUP!````````B40D!(U')(D$).C\____ZY")]NG\____C70F`(V\
+M)P````"#[!R)?"04BWPD((EL)!B+1"0HB5PD#(ML)"2)="00BW<,@ZZ0`0,`
+M`87`#XBT````B40D"(EL)`2)/"3H_/___X7`B<,/A*X```"`/0``````=2Z)
+M7"0$QP0D`@```.C\____BX:0`0,`A<!T-(M<)`R+="00BWPD%(ML)!B#Q!S#
+M#[9`4*@"=<JH`0^%A````/9#4`1UO(!+4"2-="8`Z[*-AE0!``#'AE0!```0
+M^P,`B;98`0``QX9<`0```````(M<)`R)1"0DC48DBWPD%(E$)""+="00BVPD
+M&(/$'.G\____C4<0B6PD!(D$).C\____Z6O___^+1P2)+"3_4$"-1Q");"0$
+MB00DZ/S____I3O___XD<).C\____B?;I;?___XUT)@"-O"<`````@^P<B5PD
+M$(M<)"")?"08B70D%(M#&(MP!(L`B00DZ/S___^)-"2)Q^C\____B3PDB40D
+M!.C\____QT,P$&P#`(E;-,=#.`````"#^`$9P/?0B4,LC4,PB40D!(M#"(D$
+M).C\____BUPD$(MT)!2+?"08@\0<PXUV`(V\)P````!75E.#[!"`/0``````
+MBWPD('1MBU\,C7<,.?-U">LUD(L;.?-T+HV3V/W__X!Z"`%U[O:"'`(```%T
+MY0^V!0````")%"2)1"0$Z/S___^+&SGS==+'A\P`````AY,#C8?,````QX?4
+M`````````(F_V````(E$)`2)/"3H_/___X/$$%M>7\.)]HV\)P````!55U93
+M@>S,````B[0DX````(U\)!")^(U4)!R+;@B+3AC&``"#P`$YT'7VC4<,QP=\
+M`0``B4PD!,=$)`BP````B00DZ/S___\QTHGYB>B+7ASH6L3__XD#@\`!=0?'
+M1BS_____C48PQT8P$&P#`(EV-,=&.`````")1"0$BT8(B00DZ/S___^!Q,P`
+M``!;7E]=PXVT)@````"-O"<`````5C'`4X/L%(MT)""+7AR)]L8$&`"#P`$]
+M@````'7RB=CH:_K__X7`=##'1BS_____C48PQT8P$&P#`(EV-,=&.`````")
+M1"0$BT8(B00DZ/S___^#Q!1;7L.#2T00,=+'`X````#'0SP`(```#[9$&@R#
+MX`^#Z`,\`G<%QD0:+`:#P@&#^A!UY.NFC;8`````55=64X/L#(M4)""+0AB+
+M6AR+,#'`Q@08`(/``3WZ````=?*)-"3H_/___XG%,<"0Q@08`(/``3WZ````
+M=?*%]G1=A>UT68M%%(M5&(E#!(M%#(E3"+K_____A<!T!HN06`(``(E3#(M5
+M'(G0P?@?"="(0P.+10"+0`2)!"3H_/___XA#`@^VA1T"``"(0P$/MD4(/`1W
+M1"P!#X2O`0``BT0D(,=`+/____^+5"0@B="#P##'0C`0;`,`B5(TQT(X````
+M`(E$)`2+0@B)!"3H_/___X/$#%M>7UW#Q@,!BT4X9HF#Z````(GHZ#%*__^-
+ME50!``"-2R")@^0```"+A50!``")0R"+0@2)002+0@B)00B+0@R)00P/MD4(
+MZ#Y&__^(@X0````/MD4QB(.%````BX5,`0``BY50`0``B8/0````B>B)D]0`
+M``#HO[;__XF#B````(DL).C\____QH.&`````(F#S````(!],``/A$X!```Q
+M_XMTO4B%]@^$`@$``("[AP`````/A`4!``"`?@@$#X04`0``BX98`@``B82[
+MC`````^VDX8```"#QP&#P@&(DX8````/MD4P.?@/CZ$````/MM*#^@]_&(V$
+MDXP```"#P@''`/____^#P`2#^@]^[XN%9`$``(7`#X2U_O__BU`$N?____^%
+MTG0&BXI8`@``B8O8````BU`(N?____^%TG0&BXI8`@``B8O<````BU`$A=(/
+MA'K^__^+0`B%P`^$;_[__XDL).C\____B8/@````Z5S^___&`P*-4R")Z.AE
+MU?__A<`/A3S^___I0O[__X/_#Y"-="8`#X]1____BW2]2(7VC70F``^%_O[_
+M_\>$NXP`````````Z1+___\/MD8(Z,%$__^(@X<```"`?@@$#X7L_O__BT8D
+MBX!8`@``B82[C````.GD_O__,=+I!/___Y"-="8`55=64X/L#(M4)""+0AB+
+M6AR+,#'`Q@08`(/``3W8````=?*)-"3H_/___XG',<"0Q@08`(/``3W8````
+M=?*%]G0UA?]T,8M'%(M7&(E#!(M'#(E3"+K_____A<!T!HN06`(``(E3#`^V
+M1P@\!'=$+`$/A!@!``"+1"0@QT`L_____XM4)"")T(/`,,=",!!L`P")4C3'
+M0C@`````B40D!(M""(D$).C\____@\0,6UY?7</&`P&+AU0!``"-EU0!``"-
+M2Q")0Q"+0@2)002+0@B)00B+0@R)00P/MD<(Z*U#__^(0W0/MD<QB$-UBX=,
+M`0``BY=0`0``B8/`````B?B)D\0```#H-+3__XE#>(D\).C\____QD-V`(F#
+MO````(!_,``/A*4````Q[>LM@'X(!'1'#[93=HN&6`(``(E$DWP/MD-V@\`!
+M/`^(0W9W6`^V1S"#Q0$YZ'Y-BW2O2(7V=.V`>W<`=<4/MD8(Z!U#__^(0W>`
+M?@@$=;F+5B0/MD-VBY)8`@``B52#?.NTQ@,"C5,0B?CH9-C__X7`#X73_O__
+MZ=G^__\/ME-V@_H/#X_,_O__C423?(/"`<<`_____X/`!(/Z#W[OZ;+^__\Q
+MTNOBC;8`````C;\`````55=64X/L#(M4)""+0AB+6AR+,#'`Q@08`(/``3VN
+M````=?*)-"3H_/___XG',<"0Q@08`(/``3VN````=?*%]G0OA?]T*XM'%+K_
+M____B4,$BT<,A<!T!HN06`(``(E3"`^V1P@\!'=$+`$/A`P!``"+1"0@QT`L
+M_____XM4)"")T(/`,,=",!!L`P")4C3'0C@`````B40D!(M""(D$).C\____
+M@\0,6UY?7</&`P&+AU0!``"-EU0!``"-2PR)0PR+0@2)002+0@B)00B+0@R)
+M00P/MD<(Z--!__^(0W`/MD<QB$-QBX=,`0``B8.<````B?CH9K+__XE#=(D\
+M).C\____QD-R`(F#F````(!_,``/A*<````Q[>LM@'X(!'1'#[93<HN&6`(`
+M`(E$DW@/MD-R@\`!/`>(0W)W6`^V1S"#Q0$YZ'Y-BW2O2(7V=.V`>W,`=<4/
+MMD8(Z$]!__^(0W.`?@@$=;F+5B0/MD-RBY)8`@``B52#>.NTQ@,"C5,,B?CH
+MEM;__X7`#X7?_O__Z>7^__\/ME-R@_H'B?8/C];^__^-1)-X@\(!QP#_____
+M@\`$@_H'?N_IO/[__S'2Z^*-M@````"-OP````!55U93@^P\BVPD4(M=&(L#
+MA<!U:XLU`````,9$)#0&A?9T,8U\)#2+7@B%VW0@B?:+0PB)1"0XBT,$B7PD
+M!,<$)`````#_4&"+&X7;=>*+-H7V==.-13#'13`0;`,`B6TTQT4X`````(E$
+M)`2+10B)!"3H_/___X/$/%M>7UW#B00DC7L$Z/S___^)Q@^V0P2$P'4]@'X(
+M`0^$/P$``,=%+/[____V1E`0=*F-1"00BU94B40D!(M&8(D$)/]2/`^V1"0B
+MB$9.B30DZ/S____K@RP!=!#'12S^____C70F`.EO____@'X(!':S#[9'`3P!
+M=$D/@]T!``"#?1`8C78`=9R-CE0!```QP,8$"`"#P`&#^!!U](M'!(U7!(D!
+MBT($B4$$BT((B4$(BT(,B4$,@(Y(`0``!.F'````@WT02`^%6/___XV.;`$`
+M`#'`Q@0(`(/``8/X!'7TBU<$C4<$B1&+4`2)402+4`B)40B+4`R)40R+4!")
+M41"+4!2)412+4!B)41B+4!R)41R+4"")42"+4"2)422+4"B)42B+4"R)42R+
+M4#")43"+4#2)432+4#B)43B+0#R)03R`CD@!```$]H9(`0``!`^$A/[__XDT
+M).C\____Z7?^__^`?P$%#X>W_O__#[9'`9"-="8`_R2%C`X``(-]$`F0C70F
+M``^%F/[__\9$)#0)#[9'!(A$)#B-1"0TBU94B40D!(M&8(D$)/]28(E%+.EV
+M_O__D(-]$`D/A63^___&1"0T!0^V1P3&1"0Y`(A$)#B-1"0TBU94B40D!(M&
+M8(D$)/]28(E%+(!.4!#I.?[__XUT)@"#?1`)#X4D_O__QD0D-`0/MD<$QD0D
+M.0"(1"0XZ[Z)]H-]$`D/A03^___&1"0T`P^V1P2(1"0XZZ.-M"8`````@WT0
+M"0^%Y/W__\9$)#0"Z]Z#?1`)#X73_?__@$Y0@,9$)#0`Z\D\`G0,QT4L_O__
+M_^G=_O__@WT0"0^VOAT"```/A:?]__^-0PB)^HE$)`@/MD,(.,)T.H!^"`2(
+MAAT"``!V+H!^,`!T*#')BU2.2(72=!.`>@@$=@T/MH8=`@``B((=`@``#[9&
+M,(/!`3G(?]J)^#P"=`R`CD@!```$Z6_^__^+5"0(@#H"=.NYX)`#`(GJB?#H
+MU67__^D'_?__55=64X/L#(ML)""+71B+`XU[!(D$).C\____B<:+0P2H`70[
+MC8Y4`0``,<"-="8`Q@0(`(/``8/X$'7TBT<$C5<$B0&+0@2)002+0@B)00B+
+M0@R)00R`CD@!```$BP>H`@^$?@```(V.;`$``#'`D,8$"`"#P`&#^$!U](M7
+M%(U'%(D1BU`$B5$$BU`(B5$(BU`,B5$,BU`0B5$0BU`4B5$4BU`8B5$8BU`<
+MB5$<BU`@B5$@BU`DB5$DBU`HB5$HBU`LB5$LBU`PB5$PBU`TB5$TBU`XB5$X
+MBT`\B4$\@(Y(`0``!/:&2`$```1T"(DT).C\____C44PQT4P$&P#`(EM-,=%
+M.`````")1"0$BT4(B00DZ/S___^#Q`Q;7E]=P^L-D)"0D)"0D)"0D)"0D%57
+M5E.![,P```"+M"3@````C5PD$(M^&(L'B00DZ/S___^-5"0<B<6)V(VV````
+M`,8``(/``3G0=?:-5P2-0PS'`WP!``")5"0$QT0D"+````")!"3H_/___XM&
+M"(GJB=GH^K?__X7`B<)T+8/X_W0SBT8<QT8P$&P#`(EV-,=&.`````")$(U&
+M,(E$)`2+1@B)!"3H_/___X'$S````%M>7UW#QT8L_____^O$C78`55=64X/L
+M'(M$)#")1"04BT`$BS"+CB@!``")\(N6<`$#`(E,)!CH=>;__XML)!2+10B+
+M302+4""+02`YT',"B=")1"0$BP&)!"3H_/___X7`B<</A(@!``"+%0````"%
+MTGX3BTPD%(M!!#N0O`$```^?P`^VT,9'9@"+;"04B5<T#[9%9H3`#X76````
+MBT0D%(M4)!2#P"2)1SB+0@2`3V4"BXYD`0,`B4<HBVPD%(G*P>H)#[=%6@^W
+M75@IPXN&;`$#`(/H`0^OT#G3=@*)TV:!^P`!9HE?4'8&9L='4``!BT0D%(!X
+M%``/A-<```#V1V4$#X3-````B<$/MT!8,=*)S0-!4!-15#';#[=/4"G(#[=-
+M6AG:,=LIR!G:B4=(B5=,@$]E"(M.)(M$)!C'1W#0#`0`QT=L,%(#`(7)B4<L
+M#X0.`0``BTX@C5<,C48<B58@B4<,B4\0B1&#Q!Q;7E]=PSP##X0B____BTPD
+M%(M!"(!/902+GF@!`P")1RB%VP^$W@```(N.9`$#`#'M,=N+AF`!`P"%R8L$
+M&'05B<*)R,8"`(/"`8/H`77UBXYD`0,`@\4!@\,,.:YH`0,`=]#IY?[__XM,
+M)!0QT@^W05H#05`3452)1TB)5TSI0O___XM4)!0/MD)FA,!U8HM$)!2+3"04
+M@\`DB40D!(M!!(D$).C\____BVPD%(M%!(L`Z`OE__^+1"08BU0D&,=`+/__
+M___'0#`0;`,`B4`TQT`X`````(/`,(E$)`2+0@B)!"3H_/___X/$'%M>7UW#
+M/`-UM.N8B7PD,(/$'%M>7UWI_/___XN.9`$#`.D[_O__@^PLB7PD)(M\)#")
+M7"0<B70D((EL)"B+1RR+5RB++XE$)!0/MD=FB[)D`0``/`%T0SP"#X0)`0``
+MC488QD=F`,=&&,`0!`")?AS'1B``````B40D!(U%)(D$).C\____BUPD'(MT
+M)""+?"0DBVPD*(/$+,,/MT9:9@-'4#M6!&:)1EH/A+<"```/MT9:9CM&6`^#
+M.0$```^V1V7'1SP`````QT<X`````(/@_8/(!(A'98M6"(E7*,9'9@`/MT9:
+M#[=.6(N59`$#`"G!BX5L`0,`P>H)@^@!#Z_0.=%V`HG19H'Y``%FB4]0=@9F
+MQT=0``&`?A0`=`KV1V4$#X53`@``#[=&6C'2`T90$U94B4=(B5=,]D=E`@^$
+MVP$``(MU)(7V#X30`0``BTT@C5<,C44<B54@B4<,B4\0B1'I'O___XM&!,9&
+M9P&`H!P"``#^BT8(@*`<`@``_HM&!("@20$``/>+1@B`H$D!``#WBT8$BP#H
+M../__P^V1F:$P`^$Y````#P##X3<````B3PDZ/S___^+5"04QT(L_____XG0
+M@\`PQT(P$&P#`(E2-,=".`````")1"0$BT((B00DZ/S____IE_[__XVT)@``
+M``"+LF0!``"+1@2+5@B)1"00B50D&`^V;F:`?A0`#X2-````BTY<,=(/MT98
+MBUY@*<&)Z!G3+`&)3ER)7F`/A)P!``")ZH#Z`@^$K@$``(M&7`M&8`^%H@``
+M`(M4)!"+`NA\XO__B>B$P`^$60$``#P##X11`0``B3PDZ/S___^)\(M<)!R+
+M="0@BWPD)(ML)"B#Q"SI");__XU&)(E$)`2+1@2)!"3H_/___^D-____#[=&
+M6#';B>J)P0-.7!->8(32B4Y<B5Y@=7R+1"00BU`8,=J)5"0(BU`4BT0D"#'*
+M"=!U!,9&9@&+1"08BU`8,T@4,=H)R@^$7O___XM4)!"+`NC:X?__B>B$P`^$
+MH````#P##X28````B3PDZ/S___^+5"04Z:;^__^)?"0PBUPD'(MT)""+?"0D
+MBVPD*(/$+.G\____B>J`^@-UFXM$)!"+4!@QVHE4)`B+4!2+1"0(,<H)T'6!
+MZ>[^__^0C70F`&8[1E@/@F[]__]FQT9:``#I-/W__P^W3EHQT@^W1E@#1E`3
+M5E0QVRG(#[=/4!G:,=LIR!G:B4=(B5=,Z93]__^-1B2)1"0$BT8$B00DZ/S_
+M___I4?___XU&)(E$)`2+1@2)!"3H_/___^F8_O__BT0D$(M0&#-(%#':"<H/
+MA5O^___&1F8`Z5+^__^+1"00BU`8,T@4,=H)R@^%/O[__^E%_O__C;8`````
+MC;\`````4XM<)`CV0V4"BP/&0V8`=!^+4"2%TG08BT@@C5,,B5`@@\`<B4,,
+MB4L0B1%;PXGVB5PD"%OI_/___XVV`````%.#[`B+7"00BP.+D'`!`P#HZ]__
+M_XL#BT@DA<ET&8M(((U3#(E0((/`'(E##(E+$(D1@\0(6\.)7"00@\0(6^G\
+M____C;8`````C;\`````@^PLBU0D,(E<)!R)="0@B7PD)(EL)"B+6BR+*XN]
+M*`$``(M'&(L`B40D%(M",(D4)(E$)!CH_/___X!["`0/AHP```"+LV0!``"%
+M]@^$R@```(M&!(7`=`RY`@```#'2Z#NM__^+1@B%P'0,N0(````QTN@HK?__
+MBT80BU8,B4($B1"-A8````")="0$B00DZ/S___^+7"08@\,!.UPD%'1#BT<8
+MBU0D&(M$D`B)!"3H_/___XG:BW0D((M<)!R+?"0DBVPD*(/$+.G16___D(D<
+M).C\____BUPD&(/#`3M<)!1UO8U',,=',!!L`P")?S3'1S@`````B40D!(M'
+M"(D$).C\____BUPD'(MT)""+?"0DBVPD*(/$+,.Y`@```#'2B=CH=JS__^EF
+M____D(/L'(E<)`R+7"0@B70D$(E\)!2);"08BVL$BW,(BT4`B?*+N"@!``")
+MZ.CQ0/__QX9D`0````````^VE1P"``#'A60!````````#[:&'`(``(/B!(/@
+M^PG0B(8<`@``#[:5'`(``(/@_8/B`@G0B(8<`@``#[9%-(A&-(U',,=',!!L
+M`P")?S3'1S@`````B40D!(M'"(D$).C\____B70D!,<$)!4```#H_/___XM#
+M$(M3#,=#&"!W`P")6QS'0R``````@\,8B4($B1")7"0$BT4`B00DZ/S___^+
+M7"0,BW0D$(M\)!2+;"08@\0<PU6)U5=64X/L#(D$)(N`4`(``(7`=$&+70B+
+M=0R-="8`.7`$=RMR!#D8<R6+2`P[302+4`AV#8/$#+@!````6UY?7<-R"SM5
+M`'?LC;8`````BT`0A<!UR8L$)(NX,`(```4P`@``B40D!#G'=$6-=@"-3_2`
+M>60`=2Z+64@QT@^W05"+<4P!V!'R.54$=QER!3E%`',2.W4,<IR-M@````!W
+M!3M="'*/BS\Y?"0$C78`=;Z+%"2+NC@"``"!PC@"``")5"0(.==U$^M8D(UT
+M)@`\@'03BS\[?"0(=$>-3_0/MD%DA,!UZ8M92#'2#[=!4(MQ3`'8$?(Y501W
+MV'(%.44`<]$[=0P/@BK___^-="8`=\([70@/@AO___^+/SM\)`AUN8/$##'`
+M6UY?7<.-=@"#[`B)'"2+7"0,B70D!(MT)!")V(GRZ+7^__^%P'4<BX-0`@``
+MB480,<")LU`"``"+'"2+="0$@\0(PXM6'+C_____A=)TZ8N35`(``(V#5`(`
+M`(72=`J-0A"+4A"%TG7VB3"X_____^O&C;8`````@^P0B6PD#(ML)!2)'"2+
+M3"08B70D!(E\)`B+A5`"``"-E5`"```YR'00C;8`````C5`0BT`0.<AU]HM9
+M%(UY%(M!$(NU3`(``#G?B0+'01``````=!6+41B+!HES!(D>B5`$B0*)>1B)
+M>12+10#'0#0!````BQPDBW0D!(M\)`B+;"0,@\00PY"-M"8`````BU0D!(M,
+M)`B+`H7`=`J+0@2)2`B)2@3#B4H$B0K#B?:+1"0$@\`LB40D!.G\____4X/L
+M"(M<)!"+4T"%TG03BT-$QT-``````(D<)(E$)`3_THM#<(E;&,=#'`````")
+M0Q2-0Q2)1"0$BP.#P"R)!"3H_/___X/$"%O#D(UT)@"#[!R)7"04BUPD((ET
+M)!B+<RB)'"3H_/___XM#$(U+#(M3#(.N)`(```&#KB`"```!B4($B1"+0SR)
+M2PR)2Q"%P'0,B40D!(DT).C\____BUPD%(MT)!B#Q!S#D(UT)@!55U93@^PL
+MBW0D0(M\)$2+3BR+1DB+5DR+66B)1"08B50D'(M!2(M13(7;B40D((E4)"0/
+MMW90#X2C````#[9!90^W5"1(@^`!#[;`.=`/A(P```"+3"08*TPD((LKP>$)
+M.>F)Z',+Z:$```"-="8`B="#PQ")P@,3.=%S\XLK*<$/M_;!Y@F)R(G*,<D#
+M4P@32PPIQ3GNB5<(B4\,C4\0B2]V)HM#&(M3'"LWQT<$`````(G/B4$(BT,0
+M@\,0B5$,B0&#P1`Y\'+:B3>X`0```,='!`$```"#Q"Q;7E]=PXM!;(7`=!R+
+M5"1(B7PD!(D,)(E4)`C_T(7`=`>)^^E1____@\0L,<!;7E]=PS'`Z6O___^-
+MM@````"-OP````!55U93@^PLBW0D0(M&*(E$)""`?F0`#X6V````BTPD(#'2
+MBWY(#[=&4(MN3(N94`(```'X$>J%VP^$(@$```^V3F6#X4"$R70*@WLH``^$
+M`@$``#E>.`^$^0```#M3!)`/@N\```!W#CL#C;8`````#X;?````.VL,C;0F
+M``````^'SP````^#P````(M+&(U6#(U#%(E3&(E&#(E.$(D1@\0L6UY?7<.+
+M5"0<BTPD((M""(.I(`(```&)1BB#@"`"```!B40D((!X"`0/AU,"``"+7"0@
+MBTPD((N3,`(``('!,`(``#G*=2.+!HE.#,=`-`$```"-1@R)002)@S`"``")
+M3A"#Q"Q;7E]=PX-^-``/A>H!``"+1"0@BY@T`@``C7OTBT<TA<`/B,,"``"+
+M5"0@C48,B4X,B0.)@C0"``")7A"#Q"Q;7E]=PSM["`^"-____XM;$(7;#X7E
+M_O__BTXXA<D/A`P"``"+3"0@@'D(!`^&6?___XM<)""+FV0!``"%VXE<)!P/
+MA)8!``"`>V<`#X6,`0``]D9E"`^%@@$``(%^<)`<!``/A'4!``"+3"0@.TL$
+M#X5H`0``@'L4``^$10(``(M+7(M;8(E,)`@YW8E<)`P/A\O^__]R"#G/#X/!
+M_O__.U0D#)"-="8`=Q0/@BT!```[1"0(C70F``^&'P$``(M&!(-`"`&)!"3H
+M_/___XM4)!R)1"0DBP:+7"0DB0.+1@2)0P2+1C2)0S2+0@2+3"0DB7E(B6E,
+MBUPD'(E!*(EQ+,=!;(`6!``/MT-<QT%PD!P$`,9!9@#'06@`````9BGX9HE!
+M4`^V5F4/MD%EB=.)T8/C@(/@/X/A0`G8"<B)TX/C,(/@QXG1"=B#X0@)R(G1
+M@^$$@^#Y@^(""<@)T`^V5F6#X/Z#X@$)T(M4)"2(0F6+1CB%P`^$M@$``(E"
+M.(M<)!R-5@R+0P2+B#P"``")D#P"```%.`(``(E&#(D1QD9D@(M$)"2)3A")
+M1"1`@\0L6UY?7>G\____#X[+````C48,B4($B4X0BTPD((E6#(F!,`(``(/$
+M+%M>7UW#]D9E!`^$H_W__XM4)"#V@DD!```@#X22_?__@*))`0``W^C\____
+MBTPD((")2`$```2)02B+!L>`B`$#``$```"+04`)03B+040)03SI6_W___9&
+M94`/A>K]__^+3"0@BYE4`@``A=MU&>G7_?__.WL(#X+O_/__BUL0A=L/A,/]
+M__\[4P1R\(UV`'<$.P-VYSMK#(VT)@````!WVP^"Q/S__Y"-M"8`````Z\*+
+M7"0@C48,B4X,BY,T`@``B8,T`@``B0*)5A#I$_W__XM3!(U&#(-'-`&)0P2)
+M7@R)5A")`NGY_/__BUPD'(M+7(M;8(E,)!`YVHE<)!0/@H+\__]W"#G(#X9X
+M_/__.VPD%'(0#X?I_O__.WPD$`^#W_[__XM&!(-`"`&)!"3H_/___XM4)!R)
+M1"0DBP:+7"0DB0.+1@2)0P2+1C2)0S2+0@CIN_W__XM,)"3'03@!````Z3W^
+M__^-M"8`````4X/L"(M<)!"+0RB#@"`"```!BT,\A<!T*L=`'`````")6"#'
+M0"0`````B40D!(M#*(D$).C\____A<!U$XM#/(E#.(E<)!"#Q`A;Z?S___^#
+MQ`A;PXUT)@"-O"<`````@^PLB70D((MT)#")7"0<B7PD)(EL)"B+1BB+7BR)
+M1"08B[AD`0``#[=&4`^W:U!FB40D%H!^9@%T1P^V1F;&0V0`B$-FB70D!(M#
+M!(D$).C\____BT,$@V@(`8M'!(.`)`(```&+="0@B5PD,(M\)"2+7"0<BVPD
+M*(/$+.G\____BU9,BTM,BT9(,T-(,=$)P76GBT8@BU8DA<!T#HUV`,8"`(/"
+M`8/H`77UBT<$.T0D&'0XB48HBU=@BT=<B59,B49(9BML)!;&1F8`9HEN4(M<
+M)!R)="0PBWPD)(MT)""+;"0H@\0LZ?S___^+1PCKP^L-D)"0D)"0D)"0D)"0
+MD%575E.#[!R+1"0PBTPD,(/`#(E$)!"+1"0P@\$<B4PD#(/`+(E$)`B+3"0P
+MQT$T`````.L=BT((A=*+3"0PB4$L="V+0@3'0@@`````B00D_Q*+1"0PBU`L
+M.U`P==>%TL=`,`````#'0"P`````==.+1"0PBTPD$(M`##G(B40D%`^$,P(`
+M`,=$)!@`````BW0D%('N*`(``(N&(`(``(7`=1"+1"04]H8<`@``((UX"'0/
+MBTPD%,=$)!@!````C7D(C:XX`@``BXXP`@``.?ET?XL1B<N+002#ZPR)0@2)
+M$(E)!(D)=&D/MI8<`@``]L(!#X0X`0``BX8D`@``A<!T#XN&1`(``#M#-`^/
+MA@$``(/B&`^%?0$``(M#-(EK#(.&)`(```&)AD0"``"+ACP"``")CCP"``")
+M"(E#$(M&!(D<)/]0((N.,`(``#GY=8&-OD@"``"+CD@"```Y^719BQ&)RXM!
+M!(/K#(E"!(D0B4D$B0ET0XM#/(7`="K'0!P`````B5@@QT`D`````(E$)`2+
+M0RB)!"3H_/___X7`=;6+0SR)0SB)'"3H_/___XN.2`(``#GY=:>+OE0"``"%
+M_W0HC;Y4`@``C;8`````BQ^%VW06B=J)\.@!]/__A<!T?8U[$(L?A=MUZHM$
+M)!2+3"00BP`YR(E$)!0/A8W^__^+7"08A=L/A*P```"+3"0PBU$LA=(/A0O^
+M__^+032%P`^%`/[__X/$'%M>7UW#QD-F`HN&/`(``(.&)`(```&)CCP"``")
+M:PR)0Q")"(D<).C\____Z6S^__^-="8`BT,0B0>+AE`"``")0Q"-0QR)GE`"
+M``")1"0$BT0D"(D$).C\____BTPD,,=!-`$```#I.?___XN&,`(``(U3#(E0
+M!(E[$(V^2`(``(E##(F6,`(``.F=_O__BT0D,(N(B`$#`(7)=!_K;8M""(M,
+M)#")022%TG1-BT($QT((`````(D$)/\2BTPD,(M1)#M1*'77QT$H`````,=!
+M)`````#KT8M!!(L1B4($B1")R(/H#(D)B4D$#X3Q_O__B00DZ/S___^+1"0P
+MBT@<.TPD#'71Z=?^___'@(@!`P``````B00DZ/S____KG)"-="8`@^P,B5PD
+M!(M<)!")="0(BS.+1B2%P'0HBTX@C5,,C48<B58@B4,,B4L0B1&)="00BUPD
+M!(MT)`B#Q`SI_/___XD<).C\____Z^*0D)"0D)!5,>U75E.+?"08BW0D%(GX
+M"?!T'XGQB?N#Q0&#P?^#T_^)\(GZ(<@AVHG&B=")UPGP=>&)Z%M>7UW#C;8`
+M````55=64X/L#(MT)""+1@R)1"0(BUX\BTXXB=@)R'4-]H9(`0```@^%V@``
+M`#'_BT9`BU9$"<@)VHE4)`2)!"3H_/___XM6!`^V4@8!^#G0?ER`IAP"``#^
+M]H8<`@```71$BT0D"(7`=#R+7"0(#[93,(32=#"+1"0(N?[___^[_____SEP
+M2'1M,<#K$I"-="8`BUPD"`^VR#ETBTAT/H/``3C0=>R#Q`Q;7E]=PXMN/(M^
+M.(".'`(```&)Z0GY=)B+7D2+3D`QZS'YB=@)R'5,@*9(`0``_>E\____,<`Q
+MTO;!(`^4P`^5PM/BT^")TXG!]]/WT8M$)`@A2$")QB%81.D&____BT8$@'@'
+M`0^%&?___P^V>`;I$O___XG:B<@AZB'XB=$)P0^$*O___X".2`$```+I'O__
+M_XVT)@````!64XM(#(G##[9Q,(GPA,!T(3'`,=(Y64AU#^L;C70F``^VPCE<
+M@4AT#H/"`8GP.,)U[KC_````6U[#C;8`````5U:)QE.+>B2%_W1#BT<4A<!T
+M-HM`#(7`="\Y\'0U#[90,(72?NTQVXM,F$B%R70*@'D(!'8$.?%T&8/#`3G:
+MD'_FBT`,A<!UT8L_A?]UO3'`ZP6X`0```%M>7\.-="8`5U93@^P<BUPD+(MT
+M)#"+?"0T@'L(!'9\QT0D&`````#'1"04`0````^V2S"%R7X?BU-(,<"%TG0/
+MZW20C70F`(M4@TB%TG5G@\`!.<AU\8M3!(!Z!0!T(0^V0S`/ME(&*=`/KT0D
+M%(E$)!0/MT,R.T0D&'8$B40D&(7V=`:+1"08B0:%_W0&BT0D%(D'@\0<6UY?
+MPX7V=`;'!@````"%_W3KQP<!````@\0<6UY?PXU$)!2)1"0(C40D&(D4)(E$
+M)`3H_/___XM3!(!Z!0!TJ>N&C;0F`````(V\)P````!3@^P<BUPD)(U$)!2)
+M1"0(C40D&(E$)`2+0P2)!"3H_/___XU$)`R)1"0(C40D$(E$)`2+0PB)!"3H
+M_/___XM,)!0[3"0,#Y=#%(M4)!B+1"00.=!S`HG0#Z_!9H7`9HE#9'4&9L=#
+M9(``@\0<6\.0@^P8B6PD%(ML)!R+5"0@B5PD"(ET)`R)?"00#[9%"#I""'0<
+MN`$```"+7"0(BW0D#(M\)!"+;"04@\08PXUV``^W13!F.T(P==J`?3``#X2S
+M````BTU(BU)(A<ETQC'_A=)TP(!Y"`1V/8!Z"`2)]G:RB50D!(D,).C\____
+MA,!UH@^V13"#QP$Y^'YZBTR]2(M$)""%R8M4N$ATAX72=(.`>0@$=\.`>@@$
+MD(UT)@`/AV[___^+020[0B0/A6+___^+<3"+6C"+5@B+2PB+1@0S0P0QT0G!
+M#X5&____BU80.U,0BT8,#X<W____<@D[0PP/ARS____VA4@!```#D'2`Z1W_
+M__\QP.D;____B?93@^P(BU0D$(M:!(M""(7;="Z%P'1N]H,<`@```74U@*`<
+M`@``_H"C'`(``/['0QS_____QD)G`8/$"%O#C78`A<!T\("@'`(``/[&0F<!
+M@\0(6\/V@!P"```!=,+&0F<`@(M)`0``!("(20$```2)%"3H_/___XE<)!"#
+MQ`A;Z?S___^`HQP"``#^QD)G`8/$"%O#C;8`````C;\`````55=64X/L+(M<
+M)$"+1"1$B40D$`^V4S"%T@^.OP$``,=$)!0`````Z:4```"-="8`A<")70QT
+M!\=`#`````"+1"04QX-,`0```````,>#4`$```````");(-(#[:32`$``(G0
+M@\@*J""(@T@!``!T"8/*BHB32`$```^V3"04,<`QTO;!(`^4P`^5PM/BT^`)
+M4SSWT@E#./?0(5-$(4-`BTPD$(7)#X1$`0``@(M(`0``!(M4)!"%T@^%(`$`
+M`(-$)!0!#[93,#M4)!0/C@T!``"+3"04BT2+2(7`=`GV@!P"```!==B+;"00
+MA>T/A3[___^+0P0/MD`&*<*)T,'X'XE4)`B)1"0,BT,4BU,8B00DB50D!.C\
+M____B40D((L#B50D)(MP#(/`##G&=)#'1"08_____\=$)!S_____ZPN+`XLV
+M@\`,.?!T68V^V/W___:''`(```%TYH!_"`%UX/9'4`1TVHGZB=CH,?O__X3`
+M=<V+5RPY5"0DBT<H=\&0<@8Y1"0@=[@[5"0<C70F`'>N#X.S````B?V)1"08
+MB50D'.N<A>T/A!+____V@TD!```"=%^+122%P'05C70F`(MP%(7V#X7S_O__
+MBP"%P'7OBTPD%(M$BTCI4O[___:#2`$```AU'8/$+%M>7UW#B6PD!,<$)`<`
+M``#H_/___^FG_O__B5PD0(/$+%M>7UWI_/___XM4)""+3"0DB2PDQT0D#```
+M``")5"0$B4PD".C\____A<")Q0^$@/[__XM4)!2+1)-(Z>7]__\[1"08#X/K
+M_O__Z3[___^-M@````!55U93@>P<`@``B[0D,`(``(!^"`1V!X"F2`$``/OV
+MAAP"```!=%:`?@@$=EN`?C``=$HQVXM,GDB%R70U#[:6'`(```^V@1P"``"#
+MX@*#X/T)T(B!'`(``(M4GDB`>@@$=@</MD8TB$(TB10DZ/S___\/MD8P@\,!
+M.=A_N('$'`(``%M>7UW#BT8DB40D&/:`'`(```$/A$0#``"+;@PQ_X7M=`N+
+M?0R%_P^$:`,``(U<)!R)V,8``(V4)!P"``"#P`$YT'7OA?_'`_06>%H/A"P#
+M``"+1R2)0P2+1RR)@\8```#VAAP"```"=`2`2Q8!A?\/A!8#``"#_0$9P(/`
+M`HA#&(N/9`$``(7)=#:+`8M18(E#"(M!7(E3$`^V4Q:)0PP/MD$4@^+]@^`!
+M`<`)PHA3%CEY"`^$[0(```^V06:(0Q0/MD<TA>V(@\4````/MH<=`@``B$,7
+MBT<4BU<8B4,9B5,=#[9'"(A#(0^V1S"(0R*)Z`^$IP(``.A_^/__#[93)8/B
+M^XA#(P^V1S&(0R0/MH=(`0``@^`!P>`""<*(4R7VAT@!```"=`:#R@&(4R6+
+M1SB-2TF+5SR)@ZT```")D[$```"+1SAFB4,GBX=,`0``BY=0`0``B4,IB5,M
+MBT<HC9=4`0``B8.]````BX=4`0``B4-)BT($B4$$BT((B4$(BT(,C9>L`0``
+MB4$,BX=H`0``C8N=````B4-9BX>L`0``B8.=````BT($B4$$BT((B4$(BT(,
+MB4$,BY=L`0``C8=L`0``C4M=B5-=BU`$B5$$BU`(B5$(BU`,B5$,BU`0B5$0
+MBU`4B5$4BU`8B5$8BU`<B5$<BU`@B5$@BU`DB5$DBU`HB5$HBU`LB5$LBU`P
+MB5$PBU`TB5$TBU`XB5$XBT`\B4$\A>T/A(<```"+112+51B)0S&)4S4/MD4(
+MB$,Y#[9%,(A#.HGPZ"WW__\/ME,]@^+[B$,[#[9%,8A#/`^VA4@!``"#X`'!
+MX`()PHA3/?:%2`$```)T!H/*`8A3/8M%.(M5/(F#M0```(F3N0```(M%.&:)
+M0S^+A4P!``"+E5`!``")0T&)4T6+12B)@\$```")'"3H_/___XD<),=$)`0`
+M`@``Z/S___^)7"00QT0D%`````#'1"0,`0```/?8B$0D,8M&*(M6+(E$)`2)
+M5"0(BT8DB00DZ/S___^+3"08BT$XBU$\B5PD$,=$)!0`````QT0D#`$```")
+MP0-.*(G3$UXL@<$`^/__@]/_!0``_O^#TO\E``#^_RG!&=.)3"0$B5PD"(M&
+M)(D$).C\____BW8DB70D&(M$)!CV0%`0#X2/_/__B00DZ/S___^!Q!P"``!;
+M7E]=PS'`QT,$`````.G/_/__QD,8`.F2_O__B>@Q[8G'Z8W\__^)\.E2_?__
+M@\H$B%,6Z0C]__^-="8`C;PG`````%93@^P$BT0D$(M8#(UP##GS=0CK.8L;
+M.?-T,XV3V/W__X!Z"`1V[O:"2`$```1TY8M"#(7`=`F)PHM"#(7`=?>)%"3H
+M_/___XL;.?-US8/$!%M>PXVV`````(V_`````%=64X/L$(M<)"#K!HUT)@")
+MPXM##(7`=??H_/___XN[9`$``(7_B4,D="J+=P0YWG1(Z/S___^%]HD'=!B-
+M=@#H_/___XE&)#M#)'3SB30DZ/S___^)'"3H_/___XM#!(M(/(7)=`R)7"0@
+M@\006UY?_^&#Q!!;7E_#BW<(Z[.0@^PLB70D((MT)#")7"0<B7PD)(EL)"@/
+MMD8(@^@%/`4/A^H````/ML#_)(6D#@``#[=&,C'2]]B#T@#WVB&&3`$``"&6
+M4`$``/:&'`(```$/A<8!``"+?D"+;D2)Z`GX=0B+1C@+1CQT5H!^"`H/A-(!
+M``"`ID@!``#^B>H)^G0_BT9`@(Y)`0``(`M&1'0P]H8<`@```71WBWX,A?]T
+M"?:''`(```%T(\=$)`0`````B30DZ/S___^-M"8`````]H8<`@```71'BWX,
+M]H9)`0``!'4^]H9(`0```W0UBT8XBU8\B40D$(E4)!0)P@^%?P$``(7_=`GV
+MAQP"```!=!J`CD@!```(B30DZ/S___^+?@R%_P^$V````(M<)!R+="0@BWPD
+M)(ML)"B#Q"S#,?\Q[8!^,`!U$NO5D(UT)@`/MD8P@\<!.?A^1(M<ODB%VW3M
+M@'L(!';GB1PDZ/S____V@T@!```$=`>`CD@!```$#[:#2`$``(/@`SP"=<$/
+MMD8P@\<!O0$````Y^'^\A>T/A'G___^`ID@!``#^,=N%P'\;Z6?___^-M"8`
+M````#[9&,(/#`3G8#XY1____BU2>2(72=.F`>@@$=N/V@D@!```!=-H/MH)(
+M`0``@^"^@\@"B()(`0``B10DZ/S____KO?:&2`$```0/A!O___^)="0PBUPD
+M'(MT)""+?"0DBVPD*(/$+.G\____BVY$BWY`B>J)^/?2(U8\]]`C1CB)T0G!
+M#X0B_O__@(Y(`0```ND6_O__#[9.,#'`,=*#Z0'VP2`/E,`/E<+3XM/@BTX\
+M,T8X,=$)P0^%!O[__^D(_O__BUY$BT9`B=F)PO?1(TPD%/?2(U0D$(G("=`/
+MA(#^___I7/[__Y"-M"8`````@^PLB7PD*(M\)#"+5"0TB5PD((ET)"2)^.AB
+M\O__A,!U7HM'%(M7&(E$)!B+1P2)5"0<#[9/,/:'20$```(/ME`&=%$QP/:'
+M2`$```1U$8M<)""+="0DBWPD*(/$+,.0B3PDZ/S___^+7"0@,<"+="0DBWPD
+M*(/$+,.-M@````"+7"0@N/____^+="0DBWPD*(/$+,,/ML$/MM(IT(G"P?H?
+MQT0D#`````"+="0,B40D"(M$)!B)5"0,BU0D'(D$)(E4)`3H_/___XET)`R)
+M5"0(BU0D-(E$)`2)%"3H_/___X7`=)J)1"0$B3PDZ/S____I3?___XGVC;PG
+M`````%57B==64XT428/L#(TLUXE,)`@/ME4AB00DB50D!.C\____A<")Q@^$
+M=`$``("@'`(``/X/MD<7B(8=`@``BT<$B48DBX?&````A<")1BQU!HM'!(E&
+M+`^VA\4```"-71"(1C0/ME,5#[:&2`$``,#J`H/B`8/@_@G0B(9(`0``BT4I
+MBU4MB89,`0``B990`0``BU0D"(N$E[T```")1B@/MDTDN`$```#3X(A.,6:)
+M1C*+0PF+4PV)1A2X_____XE6&`^V32*Z_____X#Y/XA.,`^&V````(E61(U7
+M28E&0(M'28V.5`$``(F&5`$``(M"!(E!!(M""(E!"(M"#(V7G0```(E!#(M'
+M68V.K`$``(F&:`$``(N'G0```(F&K`$``(M"!(E!!(M""(E!"(M"#(E!#(M7
+M78U'78V.;`$``(F6;`$``(M0!(E1!(M0"(E1"(M0#(E1#(M0$(E1$(M0%(E1
+M%(M0&(E1&(M0'(E1'(M0((E1((M0)(E1)(M0*(E1*(M0+(E1+(M0,(E1,(M0
+M-(E1-(M0.(E1.(M`/(E!/(/$#(GP6UY?7<.0C70F`#'`,=+VP2`/E,`/E<+3
+MX-/B@\#_@]+_Z0S___^-="8`@>QL`@``BX0D<`(``(U,)%B)G"1<`@``BY0D
+M<`(``(FT)&`"``"+M"1P`@``B;PD9`(``(FL)&@"``"+`(E$)#R+>B2+1SB+
+M5SR)3"00QT0D%`$```#'1"0,`0```(G!`TXHB=,37BR)/"2!P0#X__^#T_\%
+M``#^_X/2_R4``/[_*<$9TXE,)`2)7"0(Z/S___^%P(G&#X0,`0``BYPD<`(`
+M`(U,)%C'1"04`0```(E,)!#'1"0,`0```(M#*(M3+(E$)`2)5"0(BT,DB00D
+MZ/S___^#^/^)Q71%C4PD6(D,).C\____@7PD6/06>%H/A/$```"X_____XN<
+M)%P"``"+M"1@`@``B[PD9`(``(NL)&@"``"!Q&P"``##C78`A?9UT8M'.(M7
+M/,=$)!0!````QT0D#`$```")1"0@BX0D<`(``(E4)"2+3"0@C50D6(M<)"2)
+M5"00BU0D)`-(*!-8+(M$)""!P0#X__^#T_\%``#^_X/2_R4``/[_*<$9TXN4
+M)'`"``")3"0$B5PD"(M")(D$).C\____A<`/A#C____I3?___XU$)%B)!"3H
+M_/___X%\)%CT%GA:=`J^_O___^G4_O__C50D6,=$)`0``@``B10DZ/S___^$
+MP`^$N/[__^O8C5PD6,=$)`0``@``B1PDZ/S___^$P`^%\_[__X7M#X4[!@``
+MA?:-="8`#X6$!@``@'PD>00/AM3^__^`?"1Z0`^'R?[__X"\))(```!`#X>[
+M_O__BW0D/#'2BYPD"0$```^W1"1_BXPD!0$```G3BU8,B5PD1`G!B4PD0(GQ
+M@\$,.<IT'8VZV/W__X!_"`1V"XM'#(7`#X21!@``BQ(YRG7CBT0D/#')C50D
+M6.B9^___A<")QP^$5/[__P^VET@!``")T(/B_=#H"D0D?8/@`0'`"<*+1SB(
+MET@!``"+5SR)1"0HB50D+`^V1S#'1"08_____\=$)!S_____/#]W)8G!B<[!
+M[@6#Y@&)\X/S`=/CT^:)7"08@T0D&/^)="0<@U0D'/^+1"1`BTPD*"-$)!B+
+M5"1$(U0D'`G!B4\XBT0D+`G0#[:72`$``(E'/`^V1"1]@^(!P.@"@^`!.,)T
+M(@^VET@!``"+1P2#XOZ(ET@!``"`>`8`=`F#R@*(ET@!``"+1"1@A<!T8HN/
+M9`$``("/20$```2%R0^$U0,``(!Y%``/A'\$``"+5"1H.5%@BT0D9'<'<A,Y
+M05QV#HE!7(E18`^V1"1LB$%F]D0D;@0/A(L#``"+40B%T@^$<P,``(M!!#G"
+M#X17`P``BT<H.X0D%0$```^$#@,``("/2`$```+'ATP!````````QX=0`0``
+M``````^VEQP"``")T(/B_=#H"D0D;H/@`0'`"<*(EQP"```/MD0D>X!\)'`!
+M#X9;`@``#[;8BW2?2(7V#X0D`@``#[:6'`(``(G0@^+]T.@*1"1N@^`!`<`)
+MPHB6'`(```^VED@!``")T(/B_=#H"H0DE0```(/@`0'`"<*+1CB(ED@!``"+
+M5CR+C"01`0``#[><))<```")1"10B50D5(N4)`T!``")3"1,B50D2`^V3C#'
+M1"0P_____\=$)#3_____@/D_=R,QP#'2]L$@#Y3`#Y7"T^#3XHE$)#"#1"0P
+M_XE4)#2#5"0T_XM,)#`/M\,QT@M$)$B+7"0T"U0D3"'!BT0D4"'3#[:62`$`
+M``G(B48XBT0D5(/B`0G8B48\#[:$))4```#`Z`*#X`$XPG0B#[:62`$``(M&
+M!(/B_HB62`$``(!X!@!T"8/*`HB62`$```^VC"23````BVR.2(7M#X64^___
+MBY0D<`(``(M&*(E4CD@[A"09`0``B7(,#X2G````@(Y(`0```L>&3`$`````
+M``#'AE`!````````,<`QTO;!(`^4P`^5PM/BT^#WTO?0(59$(49`B30DZ/S_
+M__\/MH9(`0``J!!U#:@@=!V#R("(AD@!``#'ADP!````````QX90`0``````
+M`/:''`(```%T+8N'9`$``(7`=".+4`2%TG0<BT`(A<!T%3G7=`*)T(D$).C\
+M____,<#IV_K__S'`Z=3Z__^+E"2=````.990`0``BX0DF0````^"6O___W<,
+M.89,`0``#X9,____B89,`0``B990`0``Z3O___^+1"0\N0$```"-5"18Z+_W
+M__^%P(G&#X1Z^O__B7@,B42?2.FT_?__#[;(,=*+G"1P`@``,<#VP2`/E,`/
+ME<+3XM/@]]+WT"%71"%'0(E<CTB)>PR)/"3H_/___P^VAT@!``"H$'41J"`/
+MA!O___^#R("(AT@!``#'ATP!````````QX=0`0```````.GY_O__BY0DA0``
+M`#F74`$``(N$)($````/@O/\__]W##F'3`$```^&Y?S__XF'3`$``(F74`$`
+M`.G4_/__N/_____'000`````Z<#Y__^+002)^HEY".F#_/__BT$$A<`/A.,`
+M``"+40CI</S__XMT)#R+1A2)\X/#%#G8="B+5"1@C4CT.5#T=`Z+`#G8=!8Y
+M4/2-2/1U\H7)B8]D`0``#X7S^___BT0D/(/H@(D$).C\____A<")P8F'9`$`
+M``^$1/G__S'`Q@0(`(/``8/X:'7TBU0D/(MT)#R)60R+0AB-40R)5AB)$(M4
+M)&B)01"+1"1@B0&+1"1DB5%@B4%<#[9$)&R(06;V1"1N`@^$AOO__XN'9`$`
+M`,9`%`'I=_O__XM4)&@Y46"+1"1D#X>2^___#X)^^___.4%<#X.#^___B?;I
+M;OO__XM1"(GXB7D$C78`Z87[__^-="18B30DC5PD6.C\____BXPD<`(``(U$
+M)%C'1"04`````(E$)!#'1"0,`0```(M!*(M1+(E$)`2)5"0(BT$DB00DZ/S_
+M__^)'"3H_/___^E\^?__C70D6(DT).C\____BT<XC4PD6(NT)'`"``"+5SR)
+M3"00QT0D%`````")P<=$)`P!`````TXHB=,37BR!P0#X__^#T_\%``#^_X/2
+M_R4``/[_*<$9TXE,)`2)7"0(BT8DB00DZ/S___^-1"18B00DZ/S____I`_G_
+M_XM')#M$)%P/A6+Y___VAQP"```!=7>`?"1P`0^&;?G__P^V1"1[BW2'2(7V
+M#X1<^?__]H8<`@```0^$3_G__XM..(N$)`T!``"+7CR+E"01`0``"<@/MXPD
+MEP````G:,=L)V@G(B50D!(D$).C\____BU8$#[92!CG0#XX.^?__B3PDZ/S_
+M___IZ/C__XM$)$"+5"1$"U<\"T<XB50D!(D$).C\____BU<$#[92!CG0?\[I
+M7____XVV`````%57,?]64X/L#(M$)""+:`R)1"0(#[9%,(3`#[;P#X2``@``
+MBU0D"#'),=LY54AU%NEN`@``C02-`````(M4)`@Y5`5(=!*#P0&#TP")R(G:
+M,?`Q^@G"==TQP#'2]L$@#Y3`#Y7"T^+3X`E%0`E51(DL).C\____]H4<`@``
+M`0^%Q@```(M%#(7`#X3C`0``BT`$B2PD_U`D,<DQVX!],`!T9XT$C0````"+
+M5`5(A=)T0O:"'`(```%T.8!Z"`1V,P^VLD@!``")\(/@CXB"2`$``#M4)`@/
+MA*,!``#V@D@!```!=`Z#YHZ#S@*)\(B"2`$``(/!`0^V13"#TP`QTCG:=Y\/
+M@T<!``"+A60!``"%P`^$,`$``(M0!(72#X0E`0``BT`(A<`/A!H!```YU70"
+MB="`H!P"``#^B40D((/$#%M>7UWI_/___P^VA4@!``"#X+^H((B%2`$``'0=
+M@\B`B(5(`0``QX5,`0```````,>%4`$````````/MK5(`0``BUU$BTU`B?"#
+MX/Z)VHB%2`$``/?2B<@C53SWT"-%.(G1"<%U"X/F[(GPB(5(`0``BW4,A?8/
+MA*L```"`ID@!``#^,<DQVS'_@'XP``^$E````(T$C0````"+5`9(A=)T,/:"
+M'`(```%T)X!Z"`1V(?:"2`$```%T&`^V@D@!``"_`0```(/@K(/(`HB"2`$`
+M`(/!`0^V1C"#TP`QTCG:=[%S.(N=9`$``(7;#X1\````]H5(`0``!'53A?]U
+M68"-20$``""#Q`Q;7E]=PY`YR`^'2O[__^FL_O__.<B0#X=N____Z[TQ_XVV
+M`````.NSB2PDZ/S____I&?[__X/FC(GPB()(`0``Z63^__^)+"3H_/___^NG
+MB2PDZ/S____KG;@!````,=+INOW__XM%#(7`=`Z+B&0!``"%R0^%;____XM5
+M'(72>!7'1"0$`````(DL).C\____Z5/___^%P`^$2____XM`'(7`C78`>=GI
+M//___Y"0D)"0D)"0D*$`````A<!T,C')D(UT)@"`>`@!BP"#V?^%P'7SA<ET
+M&J$`````B<+!^A_!ZA0!PL'Z#(G0P?H?]_G#BQ4`````B=#!^!_!Z!0!T,'X
+M#,.0\\.-M"8`````C;PG`````(M,)`2+5"0(BX'\````B4(,B9'\````PY"-
+MM"8`````,<##C;8`````C;PG`````%=64X/L$(M\)""+A^P```#'AQ0!````
+M````C;8`````B[<``0``A?9T.3D&=V0YMP0!```/A(L```"+1A")AP`!``"+
+M1@C'1A``````B00D_U8$B[<``0``BX?L````A?9UQSU_`0``=R&+G_P```"%
+MVW07QT0D!`````"+`XD$)/]3!(M;#(7;=>F#Q!!;7E_#BY_\````A=MT[XUT
+M)@"+!HE$)`2+`XD$)/]3!(M;#(7;=>N+A^P````[!@^#7?___^O&QX<$`0``
+M`````,>'``$```````#I9?___XGV5E.#[!2+="0@BY[\````A=MT%\=$)`3_
+M____BP.)!"3_4P2+6PR%VW7I,<"#?BP`#Y7`@\046U[#C;0F`````%.#[`B+
+M7"00BX,4`0``A<!U.8V#"`$``,>#"`$``*!`!`")FPP!``#'@Q`!````````
+MB40D!(U#+(D$).C\____QX,4`0```0```(/$"%O#@^P,BU0D$(M,)!2+@@`!
+M``"%P'0@BX($`0``B4@0B8H$`0``B10DZ/S___^X`0```(/$#,.+@NP````[
+M`7,.B8H$`0``B8H``0``Z]>+00B)!"3_400QP.O7C;8`````BT0D!`7D````
+MB40D!.G\____C;0F`````(V\)P````"+1"0$!>0```")1"0$Z?S___^0D)"0
+MD)"0D)"0D)"0D%.+7"0(#[9#%(G"@^#["E,5@^($"=`/ME,5B<&#X/Z#X0&#
+MX@$)R@G0B$,4#[9#)(G"@^#["E,E@^($"=`/ME,EB<&#X/Z#X0&#X@$)R@G0
+MB$,D6\.-="8`C;PG`````%.+7"0(#[9#)8G"@^#["E,F@^($"=`/ME,FB<&#
+MX/Z#X0&#X@$)R@G0B$,E#[9#/8G"@^#["E,^@^($"=`/ME,^B<&#X/Z#X0&#
+MX@$)R@G0B$,]6\,```````````````````````````````````!R-S4P7T-O
+M;7!L971E4F5Q=65S=$%N9%-L;W0`R)0``,R4```*E0``1)4``'Z5``"XE0``
+M\I4``"R6``!FE@``+)8``&:6``"@E@``UI8``!J7``"<EP``TI<``"^8``#/
+MF```"9D``$.9```0F@``$)H``!":```0F@``$)H``*24``#AF0``%ZD```VF
+M```EI@``1:8``'VF``".I@``EZ8``*"F``!-IP``<:<``'JG``"#IP``XJ<`
+M`'FH``#8J```$,0``)?!``"HP0``N<$``,K!```5P@``,\(``$?"``";P@``
+MM\(``-/"``#OP@``&\,``"_#```0Q```$,0``!#$``!#PP``HL,``!#$```0
+MQ```:,,``.##``#HP0``_,$``!#$``!;P@``;\(``(/"``#6[@``UNX```SO
+M```@[P``UNX``-;N``#@[@``-.\``$KO``!@[P``4F]C:V5T(#<U,"!3051!
+M($-O;G1R;VQL97(```$`````````EC`'=RQA#NZZ40F9&<1M!X_T:G`UI6/I
+MHY5DGC*(VPZDN-QY'NG5X(C9TI<K3+8)O7RQ?@<MN.>1';^09!"W'?(@L&I(
+M<;GSWD&^A'W4VAKKY-UM4;74],>%TX-6F&P3P*AK9'KY8OWLR66*3UP!%-EL
+M!F-C/0_Z]0T(C<@@;CM>$&E,Y$%@U7)Q9Z+1Y`,\1]0$2_V%#=)KM0JE^JBU
+M-6R8LD+6R;O;0/F\K.-LV#)U7-]%SPW6W%D]T:NL,-DF.@#>48!1U\@68="_
+MM?2T(2/$LU:9E;K/#Z6]N)ZX`B@(B`5?LMD,QB3I"[&'?&\O$4QH6*L=8<$]
+M+6:VD$'<=@9QVP&\(-*8*A#5[XF%L7$?M;8&I>2_GS/4N.BBR0=X-/D`#XZH
+M"988F`[ANPUJ?RT];0B7;&21`5QCYO11:VMB86P<V#!EA4X`8O+ME09L>Z4!
+M&\'T"()7Q`_UQMFP95#IMQ+JN+Z+?(BY_-\=W6))+=H5\WS3C&5,U/M88;)-
+MSE&U.G0`O*/B,+O40:7?2M>5V#UMQ-&D^_36TVKI:4/\V6XT1HAGK="X8-IS
+M+01$Y1T#,U],"JK)?`W=/'$%4*I!`B<0$`N^AB`,R26U:%>SA6\@"=1FN9_D
+M8<X.^=Y>F,G9*2*8T+"TJ-?'%SVS68$-M"X[7+VWK6RZP""#N.VVL[^:#.*V
+M`YK2L70Y1]7JKW?2G14FVP2#%MQS$@MCXX0[9)0^:FT-J%IJ>@O/#N2=_PF3
+M)ZX`"K&>!WU$DP_PTJ,(AVCR`1[^P@9I75=B]\MG98!Q-FP9YP9K;G8;U/[@
+M*].)6GK:$,Q*W6=OW[GY^>^^CD.^MQ?5CK!@Z*/6UGZ3T:'$PM@X4O+?3_%G
+MN]%G5[RFW0:U/TLVLDC:*PW83!L*K_9*`S9@>@1!P^]@WU7?9ZCOCFXQ>;YI
+M1HRS8<L:@V:\H-)O)3;B:%*5=PS,`T<+N[D6`B(O)@55OCNZQ2@+O;*26K0K
+M!&JS7*?_U\(QS]"UBY[9+!VNWENPPF2;)O)C[)RC:G4*DVT"J08)G#\V#NN%
+M9P=R$U<`!8)*OY44>KCBKBNQ>S@;M@R;CM*2#;[5Y;?OW'PAW]L+U-+3AD+B
+MU/'XL]UH;H/:'\T6OH%;)KGVX7>P;W='MQCF6@B(<&H/_\H[!F9<"P$1_YYE
+MCVFN8OC3_VMA1<]L%GCB"J#NT@W75(,$3L*S`SEA)F>G]Q9@T$U':4G;=VX^
+M2FK1KMQ:UMEF"]]`\#O8-U.NO*G%GKO>?\^R1^G_M3`<\KV]BL*ZRC"3LU.F
+MH[0D!3;0NI,&U\TI5]Y4OV?9(RYZ9K.X2F'$`AMH790K;RHWO@NTH8X,PQO?
+M!5J-[P(M:B(!`*XB`0!P(P$`<",!`'`C`0!P(P$`\B(!`#$C`0!P(P$`B",!
+M`-\M`0#I+0$`Z2T!`.DM`0#I+0$`Z2T!`.DM`0#I+0$`Z2T!`.DM`0#I+0$`
+MZ2T!`.DM`0#I+0$`Z2T!`.DM`0#I+0$`Z2T!`.DM`0#I+0$`Z2T!`.DM`0#I
+M+0$`Z2T!`.DM`0#I+0$`Z2T!`.DM`0#I+0$`Z2T!`.DM`0#I+0$`Z2T!`.DM
+M`0#I+0$`Z2T!`+(M`0#I+0$`LBT!`.DM`0#I+0$`Z2T!`+(M`0"R+0$`Z2T!
+M`.DM`0#I+0$`Z2T!`.DM`0#I+0$`Z2T!`.DM`0#I+0$`Z2T!`.DM`0#I+0$`
+MZ2T!`.DM`0#I+0$`Z2T!`.DM`0"R+0$`Z2T!`.DM`0#I+0$`Z2T!`.DM`0#I
+M+0$`Z2T!`.DM`0#I+0$`Z2T!`.DM`0#I+0$`Z2T!`.DM`0"R+0$`LBT!`+(M
+M`0"R+0$`Z2T!`.DM`0#I+0$`Z2T!`.DM`0#I+0$`Z2T!`.DM`0#I+0$`Z2T!
+M`.DM`0#I+0$`Z2T!`.DM`0#I+0$`Z2T!`.DM`0#I+0$`Z2T!`.DM`0#I+0$`
+MZ2T!`.DM`0#I+0$`Z2T!`.DM`0#I+0$`Z2T!`.DM`0#I+0$`Z2T!`.DM`0#I
+M+0$`Z2T!`.DM`0#I+0$`Z2T!`.DM`0#I+0$`Z2T!`.DM`0#I+0$`Z2T!`+(M
+M`0#I+0$`Z2T!`.DM`0#I+0$`Z2T!`.DM`0#I+0$`Z2T!`+(M`0#I+0$`LBT!
+M`.DM`0#I+0$`Z2T!`+(M`0"R+0$`Z2T!`.DM`0#I+0$`LBT!`.DM`0#I+0$`
+MZ2T!`.DM`0#I+0$`Z2T!`.DM`0#I+0$`Z2T!`.DM`0#I+0$`Z2T!`.DM`0#I
+M+0$`Z2T!`.DM`0#I+0$`Z2T!`.DM`0#I+0$`LBT!`.DM`0"R+0$`Z2T!`.DM
+M`0#I+0$`LBT!`+(M`0#^0@$`L4(!`+Y"`0#@0@$`_D(!`/1"`0#J0@$`_D(!
+M`/Y"`0#^0@$`_D(!`.I"`0#Y:0$`'6H!`$%J`0"U:@$`1VL!```````QL@$`
+M!K(!`!&R`0`WL@$``+(!``"R`0``L@$``+(!``"R`0``L@$``+(!``"R`0``
+ML@$``+(!``"R`0``L@$`0;(!`#>R`0`7L@$`,;(!`"&R`0`GL@$`0;(!`/.Q
+M`0``(```!$0````@`0`$1````@$```(Z```"`0$``CH```0!```+````!`$!
+M``L````(`0``!EH!``@!`0`&6@$`$`$```,4`0`0`0$``Q0!`"`!```&*```
+M(`$!``8H``!``0```Q$``$`!`0`')P``@`$```M'`P"``0$`"T<#`'`I`@#@
+M*0(`!2H"`"HJ`@!/*@(`="H"`*$J`@`^*P(`=2L"`$HL`@#X*P(`'2P"`&\L
+M`@"!+0(`OBT"`.\M`@`R+@(`9B\"`&,N`@!X+@(`KBL"`-,K`@#.*@(`!2L"
+M`/@K`@"-+@(`HR\"`-`O`@#U+P(`(C`"`#8P`@!D,`(`I#`"`+HN`@#G+@(`
+M%"\"`$$O`@```````````*!E`@"U7`(`^UP"`'1=`@#I70(`$UX"`&1>`@#U
+M7@(`!5\"`'5B`@!G80(`H5P"`*!E`@"@90(`H&4"`*!E`@"@90(`'F4"`*!E
+M`@"@90(`#E\"`"9?`@!M7@(`[%X"`&=A`@!18P(`:V4"`'%E`@"890(`H&4"
+M`&]D`@"P9`(`N60"`%IC`@!E8P(`;F,"`'=C`@#"=`(`R70"`-)T`@#9=`(`
+MXG0"`.ET`@#R=`(`MW0"`.61`@!7CP(`:(\"`'F/`@"*CP(`U8\"`/./`@`'
+MD`(`6Y`"`'>0`@"3D`(`KY`"`-N0`@#OD`(``Y$"`.61`@#ED0(`')$"`'N1
+M`@#ED0(`Y9$"`$&1`@"YD0(`J(\"`+R/`@#ED0(`&Y`"`"^0`@!#D`(`````
+M`````````````````````````````````/#&`@#PQ@(`+\<"`$3'`@#PQ@(`
+M;L<"`/K&`@!9QP(`'<@"`"_(`@"ZT0(`9],"`&?3`@!GTP(`9],"`&?3`@!G
+MTP(`9],"`&?3`@!GTP(`9],"`&?3`@!GTP(`9],"`&?3`@!GTP(`9],"`&?3
+M`@!GTP(`9],"`&?3`@!GTP(`9],"`&?3`@!GTP(`9],"`&?3`@!GTP(`9],"
+M`&?3`@!GTP(`9],"`,[1`@`WT@(`H-("``G3`@!SU`(`0MH"`$+:`@!"V@(`
+M0MH"`$+:`@!"V@(`0MH"`$+:`@!"V@(`0MH"`$+:`@!"V@(`0MH"`$+:`@!"
+MV@(`A]0"`(?4`@"'U`(`0MH"`$+:`@!"V@(`0MH"`$+:`@!"V@(`0MH"`$+:
+M`@!"V@(`0MH"`$+:`@!"V@(`0MH"``'5`@!FU0(`R]4"`#'6`@!"V@(`0MH"
+M`$+:`@!"V@(`0MH"`$+:`@!"V@(`0MH"`$+:`@!"V@(`0MH"`$+:`@"6U@(`
+M%-<"`)+7`@`0V`(`0MH"`$+:`@!"V@(`0MH"`$+:`@!"V@(`0MH"`$+:`@!"
+MV@(`0MH"`$+:`@!"V@(`CM@"`$+:`@!"V@(`0MH"`$+:`@!"V@(`0MH"`$+:
+M`@!"V@(`0MH"`$+:`@!"V@(`0MH"`$+:`@!"V@(`0MH"`-38`@`2V0(`4-D"
+M`([9`@#,V0(`!]H"``````````````````````!$871A0V5N=&5R(#<R.#`@
+M4T%402!#;VYT<F]L;&5R``$````;`````0`````?`P"+'P,`,Q\#`!0?`P"+
+M'P,`BQ\#`(L?`P"+'P,``!\#`$4@`P``'P,``!\#`+L>`P`Y(`,`!B`#`,\?
+M`P`!1@,`$48#`!E&`P`A1@,`*48#`#%&`P`Y1@,`"48#`-1+`P"%3@,`ITT#
+M`%%.`P`@3@,`44X#`-1+`P#82P,`XJT#`&6N`P!(KP,`=J\#`#6P`P`SL0,`
+M3[$#`%NQ`P`BK@,`TK$#`(FR`P#BK0,`F+,#`*6R`P!$LP,`<L(#`*3&`P!\
+MQ@,`8L8#`$C&`P`DQ@,`<L(#``K&`P#7P@,`T0<$`,`'!`"@!P0`@`<$`$`'
+M!``'!P0`_RX$`"8N!`#_+@0``"X$```N!```+@0`6R`@("`@("`@72!#9&(@
+M6R4R>"PE,G@L)3)X+"4R>"P@)3)X+"4R>"PE,G@L)3)X+"`E,G@L)3)X+"4R
+M>"PE,G@L("4R>"PE,G@L)3)X+"4R>%TN`````%!H>2`E>"!S:6=N871U<F4@
+M9G)O;2!324=.05154D4@1DE3(&)U<WD`````4&AY("5D('-I9VYA='5R92!F
+M<F]M('5N87-S;V-I871E9"!&25,@8G5S>0!;)3`R>#HE,#)X("4P,F1=(&1I
+M<VL@<F5M;W9E9"X``%LE,#)D.B4P,F0@4"5D72!!<WEN($YO=&EF:6-A=&EO
+M;B!296-E:79E9```17)R;W(@:6X@:7-S=6EN9R!C;VUM86YD+"!E<G(@:6YF
+M;R`P>"5L;%@```!;)3`R>#HE,#)X("4P,F1=(%)E<75E<W0@9F%I;&5D+B!%
+M<G)O<B!I;F9O<FUA=&EO;B`P>"5L;%@```!;)3`R>#HE,#)X($TE9%T@4$T@
+M4F5Q=65S="!F86EL960N($5R<F]R(&EN9F]R;6%T:6]N(#!X)6QL6`!;("`@
+M("`@("!=($@R1"!&25,Z("4P.'@@)3`X>"`E,#AX("4P.'@`6R`@("`@("`@
+M72!$,D@@1DE3.B`E,#AX("4P.'@@)3`X>"`E,#AX("A3=&%T=7,@)7@@17)R
+M;W(@)7@I`````%)E8V5I=F5D($Y53"!297$@<VQO=$YO*"5X+R5X*2!%3E12
+M62`H)3`X>"DL(&5R<F]R(#!X)6QL6````&`M($9)4RA3;&]T.B4P,G@I.B`E
+M,#AX("4P.'@@)3`X>"`E,#AX``!;)3`R>#HE,#)X("4P,F1=($1E=FEC92!R
+M97%U97-T*"5X*2!T:6UE;W5T+@````!;("`@("`@("!=($@R1"!&25,H4VQO
+M=#HE,#)X*3H@)3`X>"`E,#AX("4P.'@@)3`X>```4F5Q("@E>"D@=V%I="!F
+M;W(@8V]M<&QE=&5D(&1O;F4N````6R4P,G@Z)3`R>"!-)61=(%!-(')E<75E
+M<W0H)7@I('1I;65O=70N`%)E9VES=&5R(%-E="`E,#AX("4P.'@@25)1(%-4
+M050@)7@``%LE,#)X.B4P,G@@)3`R9%T@9&ES:R!R96UO=F5D("@E>"DN`$EN
+M=F%L:60@<VEG;F%T=7)E(#!X)7@L('1R96%T(&%S($%402!S=&%T=7,@)7@`
+M`%LE,#)X.B4P,G@@)3`R9%T@1&ES:R!I;B!S=&%N9&)Y(&UO9&4L('-T87)T
+M('1O('!O=V5R(&ET('5P+@````!;)3`R>#HE,#)X("4P,F1=($1I<VL@<&]W
+M97)E9"!U<"X```!;)3`R>#HE,#)X("4P,F1=($1E=FEC92!S=&%T92`E>"!F
+M86EL960@*"5X*2!R971R:65D("5X`%LE,#)X.B4P,G@@)3`R9%T@26YV86QI
+M9"!I9&5N=&EF>2!D871A+"!R971R:65S*"5D*2X`````6R4P,G@Z)3`R>"`E
+M,#)D72!3=&%R="!3;V9T(%)E<V5T(&9O<B`E>"\E>`!;)3`R>#HE,#)X(%`E
+M9%T@4VEG;F%T=7)E('1I;65O=70@9F]R("5X+R5X`%LE,#)D.B4P,F0@325D
+M72!032!297%U97-T(&]F('-T871E("5X(&9O<B`E>"\E>"!F86EL960`4&]R
+M="!R97-E="`H<&AA<V4@)7@@<&UP("5X*2!N;W0@8V]M<&QE=&4@<W5C8V5S
+M<RP@:6=N;W)E('1H92!P;W)T("@E>"!D979I8V4@)7@I````6R4P,G@Z)3`R
+M>"`E,#)D72!297-E="!0:&%S92`E>"!F86EL960@9F]R("5X+R5X`````')E
+M860@97)R;W(@8F5F;W(@=W)I=&4@9&%T82!B86-K`````%LE,#)X.B4P,G@@
+M)3`R9%T@<W!I;B!U<"!M;V1E(&YO="!S=7!P;W)T+@``6R4P,G@Z)3`R>"`E
+M,#)D72!S970@9&ES:R!S<&EN('5P(&UO9&4@)7@N``!;)3`R>#HE,#)X("4P
+M,F1=(&1I<VL@<')O8F5D("AS<&EN=7`@;6]D93H@)60I+@!-5E]297%U97-T
+M("5P.B!#9&);)3)X+"4R>"PE,G@L)3)X+"`E,G@L)3)X+"4R>"PE,G@L("4R
+M>"PE,G@L)3)X+"4R>"P@)3)X+"4R>"PE,G@L)3)X72X`17)R;W(@:6X@:7-S
+M=6EN9R!C;VUM86YD+"!E<G(@:6YF;R`P>"5L;%@```!487-K(&9I;&4@97)R
+M;W(L(%-T871U<U)E9STP>"5X+"!%<G)296<],'@E>"P@3$)!6S`M,UT],'@E
+M>"Q,0D%;-"TW73TP>"5X+@``4F5C96EV960@3E5,(%)E<2!S;&]T3F\H)7@O
+M)7@I($5.5%)9("@E,#AX*2P@97)R;W(@,'@E;&Q8````8"T@1DE3*%-L;W0Z
+M)3`R>"DZ("4P.'@@)3`X>"`E,#AX("4P.'@``$--1"!(96%D97(Z("4P.'@@
+M)3`X>"`E,#AX("4P.'@@+B`E,#AX("4P.'@@)3`X>"`E,#AX("X@)3`X>"`E
+M,#AX("4P.'@@)3`X>"`N("4P.'@@)3`X>`!;)3`R>#HE,#)X("4P,F0@)3`R
+M9%T@4$T@<F5Q=65S="@E>"D@=&EM96]U="X```!4:6UE;W5T($@R1"!&25,H
+M4VQO=#HE,#)X*3H@)3`X>"`E,#AX("4P.'@@)3`X>`!;)3`R>#HE,#)X("4P
+M,F0@)3`R9"`E,#)D72!89F5R("5X($5R<F]R(&EN9F]R;6%T:6]N(#!X)6QL
+M6`!;)3`R>#HE,#)X("4P,G@@)3`R>%T@4$T@6&9E<B`E>"!%<G)O<B!I;F9O
+M<FUA=&EO;B`P>"5L;%@```!2=6YN:6YG($@R1"!&25,H4VQO=#HE,#)X*3H@
+M)3`X>"`E,#AX("4P.'@@)3`X>``@4T<@:71E;2`E,#)X.B!A9&1R("5L;'@@
+M<VEZ92`E>"!31T@@861D<B`E;&QX('-I>F4@)7@``$9A:6QE9"!T;R!E;F%B
+M;&4O9&ES86)L92!S<&EN('5P+@```%LE,#)X.B4P,G@@)3`R9"`E,#)D("4P
+M,F1=($1E=FEC92!R97%U97-T*"5X*2!T:6UE;W5T+@``4F5Q("@E>"D@=V%I
+M="!F;W(@8V]M<&QE=&5D(&1O;F4N````071T1&5V4T%3061D<ELE>%T@(%M5
M;FET260@)7A=('-A<R!A9&1R("4P,G@M)3`R>"TE,#)X+24P,G@M)3`R>"TE
M,#)X+24P,G@M)3`R>`!S86UE('-A<R!A9&1R("4P,G@M)3`R>"TE,#)X+24P
M,G@M)3`R>"TE,#)X+24P,G@M)3`R>````$1E=FEC92`E>"!I;B!S=&%N9&)Y
M(&UO9&4L('-T87)T('1O('!O=V5R(&ET('5P+@````!3=&%R="!T;R!P;W=E
M<B!U<"!D979I8V4@)7@N+BX``%!O<G0@<F5S970H<&AA<V4@)7@@<&UP("5X
M*2!N;W0@8V]M<&QE=&4@<W5C8V5S<RP@:6=N;W)E('1H92!P;W)T("@E>"!D
-M979I8V4@)7@I`````%LE,#)X.B4P,G@@)3`R9%T@9&ES:R!R96UO=F5D("@E
-M>"DN`$1E=FEC92`H4&%T:"`E,#)X('P@5&%R9V5T("4P,G@@?"!%)7@O4R4P
-M,G@I('-P:6X@=7`@;6]D92!N;W0@<W5P<&]R=````%LE,#)X.B4P,G@@)3`R
-M9%T@<V5T(&1I<VL@<W!I;B!U<"!M;V1E("5X+@``6R4P,G@Z)3`R>"`E,#)D
-M72!D:7-K('!R;V)E9"`H<W!I;G5P(&UO9&4Z("5D*2X`359?4F5Q=65S="`E
-M<#H@0V1B6R4R>"PE,G@L)3)X+"4R>"P@)3)X+"4R>"PE,G@L)3)X+"`E,G@L
-M)3)X+"4R>"PE,G@L("4R>"PE,G@L)3)X+"4R>%TN`$5R<F]R(&EN(&ES<W5I
-M;F<@8V]M;6%N9"P@97)R(&EN9F\@,'@E;&Q8````5&%S:R!F:6QE(&5R<F]R
-M+"!3=&%T=7-296<],'@E>"P@17)R4F5G/3!X)7@L($Q"05LP+3-=/3!X)7@L
-M3$)!6S0M-UT],'@E>"X``%)E8V5I=F5D($Y53"!297$@<VQO=$YO*"5X+R5X
-M*2!%3E1262`H)3`X>"DL(&5R<F]R(#!X)6QL6````&`M($9)4RA3;&]T.B4P
-M,G@I.B`E,#AX("4P.'@@)3`X>"`E,#AX``!#340@2&5A9&5R.B`E,#AX("4P
-M.'@@)3`X>"`E,#AX("X@)3`X>"`E,#AX("4P.'@@)3`X>"`N("4P.'@@)3`X
-M>"`E,#AX("4P.'@@+B`E,#AX("4P.'@`6R4P,G@Z)3`R>"`E,#)D("4P,F1=
-M(%!-(')E<75E<W0H)7@I('1I;65O=70N````5&EM96]U="!(,D0@1DE3*%-L
-M;W0Z)3`R>"DZ("4P.'@@)3`X>"`E,#AX("4P.'@`6R4P,G@Z)3`R>"`E,#)D
-M("4P,F0@)3`R9%T@6&9E<B`E>"!%<G)O<B!I;F9O<FUA=&EO;B`P>"5L;%@`
-M6R4P,G@Z)3`R>"`E,#)X("4P,GA=(%!-(%AF97(@)7@@17)R;W(@:6YF;W)M
-M871I;VX@,'@E;&Q8````4G5N;FEN9R!(,D0@1DE3*%-L;W0Z)3`R>"DZ("4P
-M.'@@)3`X>"`E,#AX("4P.'@`(%-'(&ET96T@)3`R>#H@861D<B`E;&QX('-I
-M>F4@)7@@4T=((&%D9'(@)6QL>"!S:7IE("5X``!&86EL960@=&\@96YA8FQE
-M+V1I<V%B;&4@<W!I;B!U<"X```!;)3`R>#HE,#)X("4P,F0@)3`R9"`E,#)D
-M72!$979I8V4@<F5Q=65S="@E>"D@=&EM96]U="X``$%T=$1E=E-!4T%D9');
-M)7A=("!;56YI=$ED("5X72!S87,@861D<B`E,#)X+24P,G@M)3`R>"TE,#)X
-M+24P,G@M)3`R>"TE,#)X+24P,G@`<V%M92!S87,@861D<B`E,#)X+24P,G@M
-M)3`R>"TE,#)X+24P,G@M)3`R>"TE,#)X+24P,G@```!$979I8V4@)7@@:6X@
-M<W1A;F1B>2!M;V1E+"!S=&%R="!T;R!P;W=E<B!I="!U<"X`````4W1A<G0@
-M=&\@<&]W97(@=7`@9&5V:6-E("5X+BXN``!0;W)T(')E<V5T*'!H87-E("5X
-M('!M<"`E>"D@;F]T(&-O;7!L971E('-U8V-E<W,L(&EG;F]R92!T:&4@<&]R
-M="`H)7@@9&5V:6-E("5X*0````!$979I8V4@*%!A=&@@)3`R>"!\(%1A<F=E
-M="`E,#)X('P@125X+U,E,#)X*2!S<&EN('5P(&UO9&4@;F]T('-U<'!O<G0`
-M``!3970@9&5V:6-E("A0871H("4P,G@@?"!487)G970@)3`R>"!\($4E>"]3
-M)3`R>"D@<W!I;B!U<"!M;V1E("5X`````$%T=&%C:&5D(&1E=FEC92!I;F1E
-M>"`E,#)X("A0871H("4P,G@@?"!487)G970@)3`R>"!\($4E>"]3)3`R>"D@
-M("5X)7@E>"5X)7@E>"5X)7@``$)A8VMU<"!S=&%M<"`E>"!S=6T@)7@@8F%C
-M:V5D("5D`````$UA<W1E<B!S=&%M<"`E>"!S=6T@)7@@8F%C:V5D("5D````
-M`%=R:71E(&%R<F%Y(&UE=&$@9&%T82!T;R!M87-T97(@,'@E;&Q8+3XP>"5L
-M;%@``%=R:71E(&%R<F%Y(&UE=&$@9&%T82!T;R!B86-K=7`@,'@E;&Q8+3XP
-M>"5L;%@``%LE9"`E9%T@9&5V:6-E(&5R87-E('5N:70@<W5C8V5S<V9U;&QY
-M+@!;)60@)61=(&1E=FEC92!E<F%S92!U;FET(&9A:6QE9"!O<B!A8F]R=&5D
-M+@````!S970@041)1E]3151?0D%$(&)A9%]S96-T;W(@)60``&1O7V1I<VM?
-M8W1L7V-M9#H@8W1L(&-O9&4@)7@@=F0])7`L($Q"02`P>"5L;%@@;E-E8W1O
-M<B`P>"5X`%)E=')Y:6YG(&9A:6QE9"P@9&ES:R!D;W=N/S\_`'=O<FMR;W5N
-M9"!I<G%3=&%T=7,@/2`P>"5X`%)E<2`E<"`E>"`E>`!$979I8V4@)7@O)7@@
-M<F5M;W9E9"X`3W9E<G)A;&P@4T<@:71E;2`E>"!S:7IE("5X`%-L;W0@8G5S
-M>2P@<VQO="`E>"@E>"D`1'5M<"!S;&]T(&EN9F\Z("5X("5X("5X("5X`$-L
-M96%N('5P('-L;W0@)7@`1#)(($9)4SH@)3`X>"`E,#AX("4P.'@@)3`X>``E
-M,#)X("4P-'@Z)3`T>#HE,#1X`%)E<2`H)7@I('=A:70@9F]R(&-O;7!L971E
-M9"X`1&5V:6-E("5X+R5X(')E;6]V960N`$1E=FEC92`E>"\E>"!R96UO=F5D
-M+@!$979I8V4@)7@@<&]W97)E9"!U<"X`<W1A<G0@4T53(&1E=FEC92`E<`!&
-M;W5N9"!315,@1&5V:6-E("5X`$9A:6QE9"!T;R!V97)I9GD@8V]N=')O;&QE
-M<@!O9&EN(')E860@=W)I=&4@97AC965D<R`E>`!O9&EN`$1E=FEC92`E>"\E
-M>"!R96UO=F5D+@!2971R>6EN9R!F86EL960L(&1I<VL@9&]W;C\_/P!W;W)K
-M<F]U;F0@:7)Q4W1A='5S(#T@,'@E>`!297$@)7`@)7@@)7@`3W9E<G)A;&P@
-M4T<@:71E;2`E>"!S:7IE("5X`%-L;W0@8G5S>2P@<VQO="`E>"@E>"D`1'5M
-M<"!S;&]T(&EN9F\Z("5X("5X("5X("5X`$-L96%N('5P('-L;W0@)7@`1#)(
-M($9)4SH@)3`X>"`E,#AX("4P.'@@)3`X>``E,#)X("4P-'@Z)3`T>#HE,#1X
-M`%)E<2`H)7@I('=A:70@9F]R(&-O;7!L971E9"X`1&5V:6-E("5X+R5X(')E
-M;6]V960N`$1E=FEC92`E>"\E>"!R96UO=F5D+@!$979I8V4@)7@@<&]W97)E
-M9"!U<"X`<W1A<G0@4T53(&1E=FEC92`E<`!&;W5N9"!315,@1&5V:6-E("5X
-M`$9A:6QE9"!T;R!V97)I9GD@8V]N=')O;&QE<@!O9&EN(')E860@=W)I=&4@
-M97AC965D<R`E>`!O9&EN`')A=R`E<"!B861?<V5C=&]R("5X`%=R:71E(&)A
-M8VMU<&5D(&UE=&$@9&%T80!&86EL960@=&\@<W!I;F1O=VX@9&5V:6-E<P!&
-M86EL960@=&\@9FQU<V@@=&%R9V5T<P!!=71O(%)E8G5I;&0`4F5B=6EL9"!0
-M<FEO<FET>0!#;VYT:6YU92!296)U:6QD:6YG(&]N($5R<F]R`%-P:6YD;W=N
-M($ED;&4@1&ES:R`H;6EN=71E<RD`4W1A9V=E<F5D('-P:6YU<```````````
-M```````````````````````````````&!`4!`P)28A4`````````!@0%`0,"
-MV&"?-CD\``````8$!0$#`B!@D%!2```````&!`4!`P+88)````````````$"
-M`Q`$!08'$0@)"@L2#`T.#Q,4%187)!@9&ALE'!T>'R8@(2(C)P``````````
-M`````````````````````*L!````````(0```("<`0"@NP$`T)P!`)#6`0"@
-M\0$`<+L!`'"<`0`@G@$`D+H!`."<`0`P]`$`H)X!`&#;`0``````L+<!`/"<
-M`0"0ZP$`D+(!`+"K`0#PJ0$`,)\!`###`0!0GP$`@*L!`%"K`0!`J@$`$*$!
-M`#"@`0```````````+">`0`PZ0$`<.4!`(#A`0"@W0$```````,14`<`````
-M``(``````````````0````````````````````8$!0$#`E)B%0`````````&
-M!`4!`P+88)\V.3P`````!@0%`0,"(&"04%(```````8$!0$#`MA@D```````
-M``!;`P```````"$```"0D0,`$+$#`."1`P!@S`,`8.<#`."P`P"`D0,`,),#
-M``"P`P#PD0,``.H#`+"3`P`PT0,``````""M`P``D@,`4.$#``"H`P`@H0,`
-M<*`#`#"5`P"@N`,`4)4#`/"@`P#`H`,`\)\#`!"7`P`PE@,```````````#`
-MDP,`\-X#`##;`P!`UP,`8-,#```````#$8!R```````"``````````````$`
-M```````````````````!`?\"````````````````````````````````````
-M```````!`````````!@`````````+````!0```#0#P0`<#$$```/!```````
-M`````)`"!`"0#@0`4`,$````````````````````````````````````````
-M``````````#_``#P100``````&"!!``!`````?\``%!&!```````$(`$``$`
-M```"_P``<$8$```````@E00``0````/_``#01@0``````&"-!``!````-?\`
-M`/!&!```````\'X$``$````$_P``T$<$``````"@>`0``0````7_```P2`0`
-M`````+#T!``!````!O\``.!*!`!PAP0`\&<$```````'_P``,.4$``"&!`"P
-M9@0```````K_``#03@0``````)!T!``!````"_\``/!.!```````T.$$````
-M```,_P``(%($`."%!`!P9@0```````W_``"04@0`P(4$`#!F!```````#O\`
-M``!3!`!PA00`\&4$```````/_P``P%,$`."$!`"P900``````!#_```P5`0`
-MP(0$`'!E!```````$?\``"!5!```````\&0$```````2_P``D%4$``````"P
-M9`0``````!/_``"P500``````!#K!``!````-/\``-!5!```````<.\$``$`
-M```8_P``\%4$```````PC`0``````$+_``"@5@0``````!",!```````&?\`
-M`&!/!```````,.$$```````:_P``T$\$``````#0X`0``````!W_``!05P0`
-M`````'!D!```````'O\``,!7!```````L.8$``$````?_P``4%@$`%"$!``P
-M9`0``````"#_````3`0`,(<$`+!G!```````(?\``'!(!```````T/($``$`
-M```B_P``L%0$```````P900``````"/_``!`4`0``````$#@!```````)/\`
-M`+!0!```````L-\$```````E_P``(%$$``````!0WP0``````"G_``!0300`
-ML(8$`#!G!```````*O\``)!1!```````0-`$```````K_P``X%@$`""$!`#P
-M8P0``````"S_``!@200``````%!W!``!````+?\``$!*!`"PAP0`,&@$````
-M```N_P``L$@$````````\`0``0```"__``"01@0``````'"3!``!````2?\`
-M`+!&!```````0'\$``$````W_P``\$@$````````R@0``0```#C_``"P3`0`
-M\(8$`'!G!```````.?\``!!.!`!PA@0`\&8$```````Z_P``P$D$``````"@
-M=@0``0```#O_``#0600``````%",!``!````//\```!(!```````\'<$``$`
-M```]_P``$$<$``````!0?@0``0```#[_```P1P0``````&!]!``!````0_\`
-M`%!'!```````<'P$``$```!$_P``<$<$``````"`>P0``0```$;_``"01P0`
-M`````(!Z!``!````1_\``+!'!```````H'D$``$````R_P``$$8$``````#0
-MC00``0```#/_```P1@0`\(<$`&"`!```````9/\``$!9!```````H',$``$`
-M```P_P``<%D$``````!0<00``0```&;_``"P2P0``````&!U!``!````9_\`
-M`)!+!```````('8$``$```!%_P``T%H$``"$!`"P8P0``````$C_``"`6P0`
-MX(,$`'!C!```````_____P````````````````````````````````!'0T,Z
-M("A'3E4I(#0N,BXR(#(P,#<P.#,Q('!R97)E;&5A<V4@6T9R965"4T1=``!'
-M0T,Z("A'3E4I(#0N,BXR(#(P,#<P.#,Q('!R97)E;&5A<V4@6T9R965"4T1=
-M``!'0T,Z("A'3E4I(#0N,BXR(#(P,#<P.#,Q('!R97)E;&5A<V4@6T9R965"
-M4T1=``!'0T,Z("A'3E4I(#0N,BXR(#(P,#<P.#,Q('!R97)E;&5A<V4@6T9R
-M965"4T1=``!'0T,Z("A'3E4I(#0N,BXR(#(P,#<P.#,Q('!R97)E;&5A<V4@
-M6T9R965"4T1=``!'0T,Z("A'3E4I(#0N,BXR(#(P,#<P.#,Q('!R97)E;&5A
-M<V4@6T9R965"4T1=``!'0T,Z("A'3E4I(#0N,BXR(#(P,#<P.#,Q('!R97)E
-M;&5A<V4@6T9R965"4T1=``!'0T,Z("A'3E4I(#0N,BXR(#(P,#<P.#,Q('!R
-M97)E;&5A<V4@6T9R965"4T1=``!'0T,Z("A'3E4I(#0N,BXR(#(P,#<P.#,Q
-M('!R97)E;&5A<V4@6T9R965"4T1=``!'0T,Z("A'3E4I(#0N,BXR(#(P,#<P
-M.#,Q('!R97)E;&5A<V4@6T9R965"4T1=``!'0T,Z("A'3E4I(#0N,BXR(#(P
-M,#<P.#,Q('!R97)E;&5A<V4@6T9R965"4T1=``!'0T,Z("A'3E4I(#0N,BXR
-M(#(P,#<P.#,Q('!R97)E;&5A<V4@6T9R965"4T1=``!'0T,Z("A'3E4I(#0N
-M,BXR(#(P,#<P.#,Q('!R97)E;&5A<V4@6T9R965"4T1=``!'0T,Z("A'3E4I
-M(#0N,BXR(#(P,#<P.#,Q('!R97)E;&5A<V4@6T9R965"4T1=``!'0T,Z("A'
-M3E4I(#0N,BXR(#(P,#<P.#,Q('!R97)E;&5A<V4@6T9R965"4T1=``!'0T,Z
-M("A'3E4I(#0N,BXR(#(P,#<P.#,Q('!R97)E;&5A<V4@6T9R965"4T1=``!'
-M0T,Z("A'3E4I(#0N,BXR(#(P,#<P.#,Q('!R97)E;&5A<V4@6T9R965"4T1=
-M``!'0T,Z("A'3E4I(#0N,BXR(#(P,#<P.#,Q('!R97)E;&5A<V4@6T9R965"
-M4T1=``!'0T,Z("A'3E4I(#0N,BXR(#(P,#<P.#,Q('!R97)E;&5A<V4@6T9R
-M965"4T1=``!'0T,Z("A'3E4I(#0N,BXR(#(P,#<P.#,Q('!R97)E;&5A<V4@
-M6T9R965"4T1=``!'0T,Z("A'3E4I(#0N,BXR(#(P,#<P.#,Q('!R97)E;&5A
-M<V4@6T9R965"4T1=``!'0T,Z("A'3E4I(#0N,BXR(#(P,#<P.#,Q('!R97)E
-M;&5A<V4@6T9R965"4T1=``!'0T,Z("A'3E4I(#0N,BXR(#(P,#<P.#,Q('!R
-M97)E;&5A<V4@6T9R965"4T1=``!'0T,Z("A'3E4I(#0N,BXR(#(P,#<P.#,Q
-M('!R97)E;&5A<V4@6T9R965"4T1=``!'0T,Z("A'3E4I(#0N,BXR(#(P,#<P
-M.#,Q('!R97)E;&5A<V4@6T9R965"4T1=``!'0T,Z("A'3E4I(#0N,BXR(#(P
-M,#<P.#,Q('!R97)E;&5A<V4@6T9R965"4T1=``!'0T,Z("A'3E4I(#0N,BXR
-M(#(P,#<P.#,Q('!R97)E;&5A<V4@6T9R965"4T1=``!'0T,Z("A'3E4I(#0N
-M,BXR(#(P,#<P.#,Q('!R97)E;&5A<V4@6T9R965"4T1=``!'0T,Z("A'3E4I
-M(#0N,BXR(#(P,#<P.#,Q('!R97)E;&5A<V4@6T9R965"4T1=``!'0T,Z("A'
-M3E4I(#0N,BXR(#(P,#<P.#,Q('!R97)E;&5A<V4@6T9R965"4T1=``!'0T,Z
-M("A'3E4I(#0N,BXR(#(P,#<P.#,Q('!R97)E;&5A<V4@6T9R965"4T1=``!'
-M0T,Z("A'3E4I(#0N,BXR(#(P,#<P.#,Q('!R97)E;&5A<V4@6T9R965"4T1=
-M``!'0T,Z("A'3E4I(#0N,BXR(#(P,#<P.#,Q('!R97)E;&5A<V4@6T9R965"
-M4T1=``!'0T,Z("A'3E4I(#0N,BXR(#(P,#<P.#,Q('!R97)E;&5A<V4@6T9R
-M965"4T1=``!'0T,Z("A'3E4I(#0N,BXR(#(P,#<P.#,Q('!R97)E;&5A<V4@
-M6T9R965"4T1=``!'0T,Z("A'3E4I(#0N,BXR(#(P,#<P.#,Q('!R97)E;&5A
-M<V4@6T9R965"4T1=``!'0T,Z("A'3E4I(#0N,BXR(#(P,#<P.#,Q('!R97)E
-M;&5A<V4@6T9R965"4T1=``!'0T,Z("A'3E4I(#0N,BXR(#(P,#<P.#,Q('!R
-M97)E;&5A<V4@6T9R965"4T1=``!'0T,Z("A'3E4I(#0N,BXR(#(P,#<P.#,Q
-M('!R97)E;&5A<V4@6T9R965"4T1=```N<WEM=&%B`"YS=')T86(`+G-H<W1R
-M=&%B`"YR96PN=&5X=``N<F5L+G)O9&%T80`N<F]D871A+G-T<C$N-``N<F]D
-M871A+G-T<C$N,0`N<F5L+F1A=&$`+F)S<P`N8V]M;65N=```````````````
-M`````````````````````````````````````````!\````!````!@``````
-M``!`````U30%````````````$``````````;````"0``````````````Y-T%
-M`#"9```,`````0````0````(````*0````$````"`````````"`U!0`<&0``
-M```````````@`````````"4````)```````````````4=P8``!\```P````#
-M````!`````@````Q`````0```#(`````````/$X%`%P,``````````````0`
-M```!````0`````$````R`````````)A:!0`J!``````````````!`````0``
-M`%,````!`````P````````#@7@4`F`<`````````````(`````````!/````
-M"0``````````````%)8&`,@&```,````!P````0````(````60````@````#
-M`````````(!F!0`@!0`````````````@`````````%X````!````````````
-M``"`9@4`4`<``````````````0`````````1`````P``````````````T&T%
-M`&<```````````````$``````````0````(``````````````&AP!0"`+0``
-M#0```'4"```$````$`````D````#``````````````#HG04`^S\`````````
-M`````0```````````````````````````````````````````````P`!````
-M``````````````,``@`````````````````#``,``````````````````P`$
-M``````````````````,`!0`````````````````#``8`````````````````
-M`P`'``````````````````,`"``````````````````#``D`````````````
-M`````P`*``````````````````,`"P`````````````````#``P`````````
-M`````````P`-``$```#``0$`EP````(``0`5````L`(``#H````"``$`(P``
-M`(`&`0"8`@```@`!`#8`````$@``=`````(``0!$`````!D```D&```"``$`
-M9````*!!`0`)`P```@`!`'L````@^@``$P````(``0"*````L/4``.$````"
-M``$`HP```!!\`0!4`````@`!`*\```#`AP$`)P````(``0#+````H``!`!P!
-M```"``$`VP```%````!:`@```@`!`/8```"@>0``\P````(``0`0`0``,`H`
-M`"4````"``$`)@$``'!\`0!7`````@`!`#<!``!0HP``(`0```(``0!4`0``
-M0.D``(T````"``$`;0$``$`)``";`````@`!`($!``!@"@``(`````(``0"A
-M`0``H&\!`$@````"``$`L0$``$`?``"6#````@`!`,P!``!PE@$`=0````(`
-M`0#9`0``<`4``&,````"``$`]P$``%"'`0`E`````@`!`!("``#P?`$`%P``
-M``(``0`K`@``T*P``"L````"``$`1@(``$`#``!+`````@`!`%8"``#0D@$`
-MY@(```(``0!H`@``8*P``#\````"``$`@P(``*#^``!8`````@`!`),"``#`
-MU```H0````(``0"O`@``0*@```8!```"``$`S`(``("5``!2`0```@`!`.T"
-M``!`^P``IP````(``0`#`P``\)0``(,````"``$`'@,``"">``#_`````@`!
-M`$8#``"`B0$`FP````(``0!F`P``$-,``*P!```"``$`>0,``/"9```$`0``
-M`@`!`)L#``"@B@$`*0````(``0"^`P``()@``$@!```"``$`W@,``*"!`0`Y
-M`0```@`!`/H#```@T@``X0````(``0`0!```H,8``&<#```"``$`*`0``+0+
-M```;`````0`#`#,$``!@`@$`(0$```(``0!"!```0'0``!L````"``$`7@0`
-M`-!'`0`-!````@`!`'4$``#@LP``.`````(``0")!```8'4!`%<````"``$`
-MF@0``,!'``#)`````@`!`+P$``#0?`$`&`````(``0#4!```D.4``#D````"
-M``$`]`0``-#A```@`````@`!``T%``!@=@$`1P4```(``0`=!0``$'8!`$@`
-M```"``$`+P4``'!5`0"I`````@`!`$0%```0X```&P$```(``0!=!0``@(@`
-M`$4"```"``$`?04``""``0`C`````@`!`(H%``#`<P``?`````(``0"H!0``
-M\`,``!`````"``$`N04``#`%```S`````@`!`,T%``!PU0``9`$```(``0#>
-M!0``@&L!`$T````"``$`[04``*`*``!?`````@`!``$&``#0B@``PP4```(`
-M`0`6!@``H)$``%X````"``$`*P8``&`,```Q`0```@`!`#\&````RP``U```
-M``(``0!C!@```````#H````"``$`@08``#`3``!I`````@`!`)@&``!`W```
-MM@(```(``0"J!@``(.4``&T````"``$`N08``&#D``"X`````@`!`-0&````
-M=`$`5P````(``0#D!@``8````(`````!``D`Z@8``'"G``!R`````@`!``<'
-M``#`>P``M`P```(``0`B!P``T(X!`&X!```"``$`4`<``(`&``!A`@```@`!
-M`&T'``"`RP$`F@````(``0!]!P``P'4!`$(````"``$`D`<``#"L```K````
-M`@`!`*L'```@,0``Z`,```(``0#+!P``<+\!`+L#```"``$`Y@<``""B```J
-M`0```@`!``L(````"P``6@````(``0`>"`````0``!X````"``$`,0@``#"M
-M```K`````@`!`$8(``#0KP``20````(``0!7"```<,```*,````"``$`>0@`
-M`-#I``!\"0```@`!`(H(``#0+0``3`,```(``0"B"```L&P``!`'```"``$`
-MP`@``!"R```N`````@`!`-P(```0-0``_`@```(``0#\"```X+4``$`````"
-M``$`$0D``%!1`0#X`0```@`!`"8)``!@7```8`,```(``0`]"0```)(``&<`
-M```"``$`6@D``$`$`0#8`````@`!`'4)``#`T0``+0````(``0","0``H+4`
-M`$`````"``$`I`D``""Q```Q`````@`!`+T)````;P$`.P````(``0#-"0``
-M\`@``$<````"``$`V0D``(#A```J`````@`!`/,)````O0``G`````(``0`.
-M"@``0,X``%4!```"``$`)0H``""*`0!Q`````@`!`$@*````@`$`'P````(`
-M`0!<"@``,`8``$(````"``$`<`H```"M```A`````@`!`(H*``#PX0``+0``
-M``(``0"B"@``H*P``"L````"``$`NPH``-`7```P`0```@`!`-H*``!@#P``
-M%@$```(``0#G"@``H!,``#X"```"``$`!`L```#_``#6`````@`!`!H+```@
-MAP$`)@````(``0`W"P``D`,!`*T````"``$`3`L``)"Z``!-`````@`!`&@+
-M``!PT0``4`````(``0"`"P``X&P!`!L"```"``$`D0L``!"\``#E`````@`!
-M`*T+```@B0$`4P````(``0#3"P``@!(``!L````"``$`[@L``)"[``!W````
-M`@`!`!,,```@M@``%P,```(``0`H#```(,$```(!```"``$`20P``."Q```J
-M`````@`!`&4,``#@#P$`[`8```(``0![#```,%`!`!(!```"``$`D@P``("=
-M`0"5`````@`!`*0,``!@L0``*@````(``0"Z#```()\``&$!```"``$`T0P`
-M`/`^`0"E`@```@`!`.,,``#@*P``[@$```(``0#_#```P*L``#`````"``$`
-M#PT``,#X``!R`````@`!`"T-``#`6@``R@````(``0!*#0``<)(``.<````"
-M``$`:@T``,"%`0`^`0```@`!`'L-``!PM```2`````(``0"4#0``$"0!`*4`
-M```"``$`J`T``##A``!%`````@`!`+\-``#P#0``<`$```(``0#1#0``@!``
-M`%$````"``$`Z`T``%"M`0`[!0```@`!``,.``!PF0``?0````(``0`7#@``
-MT,\``!L!```"``$`*@X``"`$``!5`````@`!`#D.```0/@``JPD```(``0!1
-M#@``0)$``%X````"``$`>PX``/"'`0`D`0```@`!`)X.``#`@P$`20$```(`
-M`0"Y#@``(+\``$P!```"``$`W`X``*`$``!I`````@`!`/`.``"@D```E0``
-M``(``0`6#P```*\``-`````"``$`,`\``'`L`0```@```@`!`$\/``#P;P$`
-MCP````(``0!A#P``X$L!`$4$```"``$`=@\``*!A`0#D"````@`!`),/``"P
-M1`$`$0,```(``0"L#P``(,P!`&@*```"``$`NP\``)`N`0"$"0```@`!`-@/
-M````WP``#@$```(``0#P#P``\*L``#0````"``$`!!```'#B``"*`````@`!
-M`"$0```@X@``2`````(``0`U$```8*H``)@````"``$`1!```""P``#V````
-M`@`!`%80``#@@@$`U@````(``0!Q$```\-$``#`````"``$`A1```+#A```7
-M`````@`!`)L0``"`$0``>P````(``0"]$```H/8``*L!```"``$`TA```!!]
-M`0#P`@```@`!`.@0``"06P``P0````(``0`%$0``4(`!`$<!```"``$`'!$`
-M`$!O`0!2`````@`!`"T1``#@"0``10````(``0!!$0``4,0``/@````"``$`
-M:1$``$"Y`0#-`````@`!`'X1``#PIP``3`````(``0"?$0``0````!P````!
-M``D`L!$``+`[`0`V`P```@`!`,P1``#P`@``1`````(``0#?$0```*L``"P`
-M```"``$`]Q$``,"<``!3`0```@`!`!P2``"@$@``5@````(``0`\$@``$(<!
-M``8````"``$`5!(``,#Y``!9`````@`!`&`2``#`)`$`J0<```(``0!Y$@``
-M$/4``)T````"``$`CQ(``."6```X`0```@`!`+`2``#@_P``P`````(``0#%
-M$@``(%8!`'0+```"``$`X1(```"9`0!H`P```@`!`/@2``!P+@$`&0````(`
-M`0`2$P``X/P``+4!```"``$`+!,``)`#``!?`````@`!`$`3```09```2`0`
-M``(``0!7$P``0/H``#,````"``$`91,``&"M```K`````@`!`'T3``#P^P``
-MZ`````(``0"1$P``4*D```P!```"``$`K!,```#C``!<`0```@`!`,,3``#@
-MN@``H0````(``0#?$P``(`D!`/0"```"``$`_1,``*#%`0#9!0```@`!`!04
-M``"P>P$`7`````(``0`A%```\&L!`#\````"``$`+A0``&"3```J`0```@`!
-M`%(4``!PY@``+@$```(``0!M%```,)@!`,$````"``$`A10``""T``!$````
-M`@`!`*$4``#@^@``)0````(``0"P%```@`0``!<````"``$`PA0``(!@``"(
-M`P```@`!`-T4````$P``(P````(``0#S%```@(<!`#,````"``$`#A4``*#G
-M```-`0```@`!`"(5```@!0$`L`````(``0`V%0``D*```/`````"``$`4Q4`
-M``"=`0!S`````@`!`&$5``!`D`$`I@$```(``0!X%0``@`H``!T````"``$`
-MBA4``/#0``!R`````@`!`)P5``!`G@$`7@````(``0"M%0``0,,```0!```"
-M``$`UQ4``,`+``"1`````@`!`/05``!0^```:`````(``0`1%@``T%```.()
-M```"``$`*!8``-"*`0#V`P```@`!`#X6``!0V@``X@$```(``0!.%@``X`4`
-M`$$````"``$`918``+"^`0#``````@`!`($6```0!0``$0````(``0"8%@``
-M0````"@````!``<`I18``!`?```M`````@`!`,,6``#0!0$`L`````(``0#7
-M%@``8'0!`%<````"``$`YQ8````````$`````0`)`/D6``"PZ```C0````(`
-M`0`B%P``X!```)4````"``$`01<``*#/```F`````@`!`%$7``!`JP``=0``
-M``(``0!J%P``H'H``!,!```"``$`@Q<``&!H``!0!````@`!`)L7``#@U@``
-M:@,```(``0"Y%P``P`P!`!(#```"``$`TQ<``.`5``#I`````@`!`.D7````
-MK@``\@````(``0``&```D$@``#4(```"``$`%A@``&`+``!:`````@`!`"H8
-M``"0K0``9P````(``0`]&```$+H!`'T````"``$`51@``-#E``"9`````@`!
-M`'`8``"0E```60````(``0"7&```H,P``*`````"``$`OA@``)"Q``!$````
-M`@`!`-D8```PP@``#0$```(``0#\&```8'0``#T%```"``$`'1D``("A``"5
-M`````@`!`#P9```@#`$`E`````(``0!0&0``$(4!`+`````"``$`:QD``%!3
-M`0`4`@```@`!`(<9``"@#0``1`````(``0"9&0``4!P!`+0'```"``$`M!D`
-M`,"T``#9`````@`!`,89``#0%P$`>`0```(``0#9&0```)L``+@!```"``$`
-M`AH``!#*``#A`````@`!`"D:```P;`$`HP````(``0!#&@``L)\!`%(````"
-M``$`6QH```"'`0`&`````@`!`',:``!`^0``<@````(``0"1&@``0,T``/4`
-M```"``$`IAH``#"K```"`````@`!`+L:``#@RP``L0````(``0#=&@``4,4`
-M`$L!```"``$``0```$#X`@"7`````@`!`#8````P"0(`=`````(``0``&P``
-MT/L!`&D````"``$`>P```*#P`@`3`````@`!`!8;``!`HP(`*P````(``0`S
-M&P``$+T"`&<#```"``$`RP```"#W`@`<`0```@`!`$T;``"P8P(`K@8```(`
-M`0!M&P``X(\"`'T````"``$`@QL``$!8`P#D"````@`!`*(;```PWP(`C0``
-M``(``0#-&P``,*L"`-D````"``$`)@$``.!S`P!7`````@`!`.$;``#@G0(`
-M<@````(``0``'```T'H#`#X!```"``$`$QP``+"5`P!2`````@`!`"T<``#`
-M3`,`=`L```(``0!+'```8%\"`%`$```"``$`91P``(#9`@!<`0```@`!`*$!
-M```@9@,`2`````(``0#,`0``@(L#`'4````"``$`?AP``!".`P!H`P```@`!
-M`)<<``!PHP(`(0````(``0"S'```T$8#`!(!```"``$`S!P``,#Z`0!?````
-M`@`!`.(<``#@:@(`&P````(``0``'0``H/P!`&,````"``$`(!T``$"F`@!)
-M`````@`!`#,=```03`,`J0````(``0!*'0``@*@"`"X````"``$`:!T``)`!
-M`@`@`````@`!`(H=``!@H@(`-`````(``0"@'0``X(<#`.8"```"``$`@P(`
-M`"#U`@!8`````@`!`+0=``#@?P,`]@,```(``0#,'0```*0"`&<````"``$`
-MX1T``"`%`@!P`0```@`!`,P"``#PBP(`4@$```(``0#M`@``P/$"`*<````"
-M``$`]1T``*`"`P"4`````@`!``,#``!@BP(`@P````(``0`+'@``8'0#`!<`
-M```"``$`'@,``)"4`@#_`````@`!`"8>``#@/@(`R0````(``0!*'@``D`("
-M`%H````"``$`8!X``/!'`P#X`0```@`!`"@$``#@%P``(`````$``P`S!```
-MX/@"`"$!```"``$`=QX``)#(`@#A`````@`!`(\>``!0S0(`:@,```(``0"O
-M'@``8)`"``0!```"``$`TQX``/!)`P`4`@```@`!`/$>``#PW`(`+@$```(`
-M`0")!```0&P#`%<````"``$`#A\``,"?`@`,`0```@`!`"L?```@$`(`"08`
-M``(``0!-'P```+("`'<````"``$`?04``,!U`P`E`````@`!`'0?``#@QP(`
-M4`````(``0".'P``D*H"`$0````"``$`K!\```"+`@!9`````@`!`-4?``"P
-M"0(`&P````(``0#R'P``8`$"`"4````"``$`U`8``.!J`P!7`````@`!`.0&
-M``!@`0``@`````$`"0`*(```L,,"`/X````"``$`(2```!"(`@!>`````@`!
-M`#@@``!@#@,`>`0```(``0!-(```8/T!`$(````"``$`;0<``%#!`P":````
-M`@`!`&,@````?0,`)`$```(``0"((```,),"`%,!```"``$`KR```,"[`@!+
-M`0```@`!`-0@``"04@(`P0````(``0#S(```<*4"`-`````"``$`#R$``&`*
-M`@!I`````@`!`"@A``#0`0(`7P````(``0`^(0``X,L"`&0!```"``$`42$`
-M`##W`0`Z`````@`!`'$A``!`<`(`\P````(``0"]"0``H&4#`#L````"``$`
-MC2$``!"'`@"5`````@`!`+4A``"P!P(`40````(``0#.(0``D'X#`)L````"
-M``$`V0D```#8`@`J`````@`!`/`A``!`*`(`Z`,```(``0`2(@``L'8#`#D!
-M```"``$`,"(``#`L`@#\"````@`!`%(B``"PN0(`!`$```(``0!^(@``D)@"
-M`"H!```"``$`I2(``-`)`@!6`````@`!`,<B``#@M`,`NP,```(``0!("@``
-MD'4#`"$````"``$`Y"(````C`@#N`0```@`!``(C```0"`(`E0````(``0"B
-M"@``$*,"`"L````"``$`(R,``/!W`P#6`````@`!`$`C```P[`(`X0````(`
-M`0!;(P``0`,#`"(#```"``$`V@H``)`&`@`6`0```@`!`'<C```P-0(`JPD`
-M``(``0"1(P``,-@"`!<````"``$`J2,``)!\`P`S`````@`!`,8C``!@G@(`
-M3`````(``0#I(P``(&(#`$T````"``$`^B,``%"L`@!``````@`!`!$D```@
-M<P,`7`````(``0"`"P``@&,#`!L"```"``$`("0``/#8`@"*`````@`!`#\D
-M```0PP(`H`````(``0!H)```T&(#`*,````"``$`A"0``'"[`P#9!0```@`!
-M`)TD``"PT@(`R`(```(``0"Q)```D+4"`$P!```"``$`UB0``/!U`P"W````
-M`@`!`.\D``#`[P(`<@````(``0`/)0``H*,"`"L````"``$`)B4``+`!`@`=
-M`````@`!`#HE``"`]0(`U@````(``0!2)0``\&P#`$@````"``$`9B4``"#[
-M`0`0`````@`!`'DE``"`0@,`100```(``0"0)0``X/D!`#H````"``$`D@P`
-M`)"2`P"5`````@`!`+H,``"0E0(`80$```(``0"@)0``$",#```"```"``$`
-MT0P``)`U`P"E`@```@`!`,$E``!PD0(`N`$```(``0#L)0``4*H"`#@````"
-M``$``B8``&#\`0`S`````@`!`!@F```0^@(`K0````(``0`O)@``0'$"`!,!
-M```"``$`2B8```#]`@"8`@```@`!`%\F``"`R0(`K`$```(``0!T)@``P+H"
-M`/@````"``$`GB8``+#$`@!5`0```@`!`+<F``#0IP(`*@````(``0#/)@``
-M<(@"`&<````"``$`40X``+"'`@!>`````@`!`.XF``#P1P(`R`D```(``0`'
-M)P``<`8#`.P&```"``$`'R<``%#@`@!\"0```@`!`#(G```P?`,`)@````(`
-M`0!1)P``$`$"`$4````"``$`9R<``#`E`P"$"0```@`!`(8G``"@N`(`#0$`
-M``(``0"K)P``H/\"`/0"```"``$`3P\``'!F`P#C`````@`!`,LG``"0I@(`
-M]@````(``0#?)P``T*`"`)@````"``$`K`\``/#!`P!H"@```@`!`/`G``#@
-M$@,`Q`<```(``0`-*```X-H"`+@````"``$`*B@``+#[`0`7`````@`!`#XH
-M``"0U@(`&P$```(``0#8#P``@-4"``X!```"``$`62@````-`@#I`````@`!
-M`'$H``#@J@(`2`````(``0",*```<``"`)L````"``$`HB@``##[`0`>````
-M`@`!`+<H``#0?`,`)P````(``0#5*```,'\#`'$````"``$`^B@``(!T`P`*
-M`0```@`!`!P1``#@90,`.@````(``0`2*0``H-@"`$@````"``$`*"D``."(
-M`@#G`````@`!`$HI``!@<@(`Z`P```(``0!G*0``8!L#`*D'```"``$`@BD`
-M`&#'`@!R`````@`!`)8I```P%@(`+0````(``0!I$0``L*X#`,T````"``$`
-MMBD```!K`@`]!0```@`!`-DI``#0HP(`*P````(``0#S*0``(/H!`$0````"
-M``$`""H``."#`P!N`0```@`!`#@J```PR`(`+0````(``0!1*@``H*$"``(`
-M```"``$`5!(``$#P`@!9`````@`!`&@J``"P/P(`-@@```(``0"/$@``4(T"
-M`#@!```"``$`@"H``"#>`@`-`0```@`!`)8J```@[0(`JP$```(``0"M*@``
-MT`H"`"0"```"``$`L!(``&#V`@#``````@`!`,PJ``!@:@(`?`````(``0#X
-M$@``$"4#`!D````"``$`["H``)#K`@"=`````@`!``0K``!0?P(`10(```(`
-M`0`F*P``T.X"`&@````"``$`12L``%`[`P`1`P```@`!`&`K``"P?P,`*0``
-M``(``0!7$P``P/`"`#,````"``$`A2L``+`(`@![`````@`!`*DK``#P`@(`
-MD0````(``0##$P``4+$"`*$````"``$`R"L``/"7`@"5`````@`!`.DK``!`
-M[P(`<@````(``0`)+```D`,"`#$!```"``$`'RP``!"L`@!``````@`!`#DL
-M``!PP0(`U`````(``0!?+```4/L!`%4````"``$`(10``)!B`P`_`````@`!
-M`'`L``"0IP(`,0````(``0"++```$'P#``8````"``$`I2P``$`X`P`)`P``
-M`@`!`+XL```06P(`2`0```(``0!M%```0(T#`,$````"``$`URP``(!S`P!4
-M`````@`!`.4L```@>@,`L`````(``0"A%```8/$"`"4````"``$``BT``$#\
-M`0`1`````@`!`!LM``#0>`,`20$```(``0`X+0``<*$"`"P````"``$`4BT`
-M``"H`@!$`````@`!`&\M``!@\P(`M0$```(``0"++0``,`("`%H````"``$`
-MH"T``'"D`@#R`````@`!`-T4```P"@(`(P````(``0"Y+0``0&T#`-,%```"
-M``$`RRT``%#<`@"9`````@`!`.@M````L0(`30````(``0`&+@``<#X#``T$
-M```"``$`'RX``)".`@!(`0```@`!`"(5``"@^P(`L`````(``0`V%0```)<"
-M`/`````"``$`4Q4``!"2`P!S`````@`!`$$N``"0K`(`%P,```(``0!8+@``
-M<+,"`)P````"``$`=2X``,#Z`@#8`````@`!`)(N``#`40(`R@````(``0"Q
-M+@``8!8"`)8,```"``$`G!4``%"3`P!>`````@`!`,XN```PH@(`,`````(`
-M`0#@+@``@/<!`%H"```"``$`_2X``##+`@"A`````@`!`!LO```0W`(`.0``
-M``(``0`]+P``L*$"`'4````"``$`6"\``*!L`P!"`````@`!`&TO``!PV`(`
-M+0````(``0`^%@``P-`"`.(!```"``$`AR\``%`R`P`V`P```@`!`&46```@
-MM`,`P`````(``0"E+P``H-L"`&T````"``$`MB\``,#?`@"-`````@`!`-$O
-M``!0V`(`(`````(``0#L+P``T`0"`$0````"``$`PQ8``%#\`@"P`````@`!
-M```P```@``(`1P````(``0`.,```,'X#`%,````"``$`UQ8``$!K`P!7````
-M`@`!`.<6`````0``!`````$`"0!!%P``$,8"`"8````"``$`-C```!#]`0!!
-M`````@`!`$\P``"`5P(`B`,```(``0!L,```T(D"`"H!```"``$`DC```+">
-M`@`&`0```@`!`+$P``"P_0$`80(```(``0#0,```X+8"`*,````"``$`]#``
-M`+#7`@!%`````@`!``TQ``!`=`,`&`````(``0`G,0``@,`"`.$````"``$`
-M4#$``&!3`@!@`P```@`!`&DQ``"@@0(`;04```(``0"`,0``0`$``!P````!
-M``D`DS$``("R`@#E`````@`!`+$Q```@?`,`!@````(``0`]&```@*\#`'T`
-M```"``$`RS$``*"B`@`K`````@`!`.@Q``#`F0(`(`0```(``0`',@``\"0"
-M`$P#```"``$`(3(``$#&`@`;`0```@`!`#8R``!P\@(`Z`````(``0!,,@``
-MD+<"``(!```"``$`;S(``&!\`P`E`````@`!`(PR``!@R`(`,`````(``0"B
-M,@``L!H#`*4````"``$`N#(``,"B`P`[!0```@`!`-4R``!0P@(`L0````(`
-M`0#Y,@``</H!`$L````"``$`"S,``/`.`@`P`0```@`!`"PS``!0A0,`I@$`
-M``(``0!%,P``T*("`#\````"``$`8C,``%"H`@`J`````@`!`(`S```@-`4`
-M50````(``0".,P``$`<$`)H````"``$`GC,``(`7!`!Z#0```@`!`+@S``"P
-M)`4`R@D```(``0#(,P``X"\$`(D````"``$`V#,```@"```$`````0`)`.@S
-M``!`!00`#P````(``0#],P``0"@$`#4"```"``$`$C0``&`>!0!4`````@`!
-M`"HT``!!`@```0````$`!P`Z-```,$($`)P````"``$`2C0``!`6!0`.`0``
-M`@`!`%LT```@%P4`E`````(``0!O-```0!\%`)@"```"``$`A30``%`X!``E
-M`0```@`!`)LT```,`@``!`````$`"0"I-```H!4%`&\````"``$`P30``$#N
-M!`"'`````@`!`-`T```@7P0`00````(``0#B-```D/P#`#T!```"``$`]30`
-M`(`Y!`"D`0```@`!``TU```0[P,`2P````(``0`A-0``@"H$`&X"```"``$`
-M-34``-`F!`!;`````@`!`$,U``#@`P0`J@````(``0!8-0``D`D$`%D````"
-M``$`:34``)`#!`!$`````@`!`(`U```4`@```0````$`"0"4-0``@"T$`%\`
-M```"``$`KS4````E!`#"`0```@`!`,,U``#P+`0`@P````(``0#3-0``8/`#
-M`"0````"``$`W#4``(#M`P"(`````@`!`/@U``#@(04`]P````(``0`.-@``
-M\!,$`!L#```"``$`(38``*`2!0`Z`````@`!`"HV``"`-`4`50````(``0`X
-M-@``,!($`+8!```"``$`5#8``!!>!`#X`````@`!`%\V````8@0`L`````(`
-M`0!U-@```)X$``\!```"``$`AS8``#!A!`#/`````@`!`*`V``!`!P4`2P``
-M``(``0"Q-@``8#,$`$(````"``$`O#8``!`)!0")!````@`!`,TV``"P!00`
-M?`````(``0#B-@``P!0%`-(````"``$`\38``!#U`P#<`````@`!``0W````
-M[0,`$P```!(``0`K-P``&`(```$````1``D`0#<`````````````$````%<W
-M````-`4`$@```!(``0!N-P`````````````0````@3<```#P`P`G````$@`!
-M`),W``#P,@4`.0```!(``0"B-P``T/T#`.8!```2``$`N3<``(#S`P!J````
-M$@`!`-`W`````````````!````#H-P``@#,%`%H````2``$``3@``&#M`P`1
-M````$@`!`!@X````_`,`BP```!(``0`O.``````````````0````2C@``+#Q
-M`P!7````$@`!`%DX`````````````!````!@.```$/(#`,8````2``$`<S@`
-M`*#O`P`E````$@`!`(HX``#@]@,`'````!(``0">.```4``$`%<!```2``$`
-MM#@``,`7!0!:`@``$@`!`-$X```0`@``!````!$`"0#H.```(!H%`#4$```2
-M``$``CD`````````````$````!<Y``#P]0,`20```!(``0`M.0``$`@$`%X`
-M```2``$`2#D``!!?!``*````$@`!`&(Y`````````````!````!T.0``,#,%
-M`%`````2``$`B3D````"```$````$0`)`)DY```P!P4`$````!(``0"R.0``
-M,/$#`'D````2``$`QSD``!D"```!````$0`)`-\Y```0H`$`&````!(``0#Z
-M.0`````````````0````!#H``(`&!0"(````$@`!`!LZ`````````````!``
-M```R.@``\/,#`%@````2``$`13H`````````````$````$\Z```$`@``!```
-M`!$`"0!>.@``X/(#`)@````2``$`=CH``%#T`P#`````$@`!`(<Z````7@0`
-M"P```!(``0"?.@`````````````0````MCH``+!B!``O````$@`!`,8Z```7
-M`@```0```!$`"0#B.@`````````````0````]3H`````````````$`````@[
-M``!#`@```0```!$`!P`<.P``D/8#`"(````2``$`03L````/!0!+`P``$@`!
-M`$\[```0E@,`&````!(``0!L.P``P/8#`!D````2``$`B#L`````````````
-M$````*`[``"@#04`50```!(``0"U.P`````````````0````RSL``,`>!0!_
-M````$@`!`.8[``!0$@4`2@```!(``0#Z.P`````````````0````"CP`````
-M````````$````"$\``#@,P4`$@```!(``0`X/``````````````0````2SP`
-M`$#P`P`4````$@`!`&<\```0[@,`P0```!(``0""/```0`(```$````1``<`
-ME3P``"#M`P`+````$@`!`*T\```5`@```0```!$`"0#(/```@"X%`/<"```2
-M``$`Z#P````R!0`#````$@`!``(]```0$`0`Q0$``!(``0`9/0``P/\#`(\`
-M```2``$`+ST``)#P`P`U````$@`!`$@]`````````````!````!?/0``,.T#
-M`"@````2``$`=ST`````````````$````(L]``#0[P,`+````!(``0"A/0``
-MX#$%`!@````2``$`OST``(#Z`P#5````$@`!`-\]`````````````!````#S
-M/0`````````````0````$#X``##P`P`-````$@`!`"H^`````````````!``
-M```]/@``$`8%`&H````2``$`5#X`````````````$````&\^``#0,04``@``
-M`!(``0""/@``D`<%`%L````2``$`ESX``)`$!`"A````$@`!`*\^``"`,04`
-M3P```!(``0#-/@``X.X#`"H````2``$`^SX``$("```!````$0`'`!<_``"P
-M`00`U@```!(``0`N/P``$`<%`!X````2``$`0S\``$#V`P!)````$@`!`&(_
-M`````````````!````!Y/P``(/D#`%0!```2``$`EC\``-#P`P!;````$@`!
-M`*L_``#@$@4`.0$``!(``0#(/P``%@(```$````1``D`XS\``-!"!`"4````
-M$@`!``!035])<W-U95)E861&86EL3&5D`'(W-3!?5&%G7TEN:70`<C<U,%]5
-M<&1A=&50:'E);F9O`'-A<U]H87-H7V%D9'(`<C<U,%]697)I9GE#;VUM86YD
-M0F5F;W)E4V5N9&EN9P!R-S4P7T-H96-K1&5V:6-E0VAA;F=E`$UA:V5!='1$
-M979);F9O`'(W-3!?1$E30U]#86YC96Q$:7-C;W9E<@!R-S4P7T)E97!/;@!R
-M-S4P7U-#4TE?051!7T9I;&Q$871A1FEE;&0`4$U?5W)I=&5296=3>6YC`'(W
-M-3!?4T-325]-86ME0V%C:&5#;VUM86YD`'(W-3!?0T]215])<W-U95--4%)E
-M<75E<W0`<C<U,%]-5E]:97)O379297%U97-T`&DR8T%?=W)I=&5?8GET97,`
-M<C<U,%]315-?26YT97)N86Q297%#86QL8F%C:P!R-S4P7TES<W5E7U)E<&]R
-M=$=E;F5R86P`<C<U,%]-5E]$=6UP4F5Q=65S=`!R-S4P7TU67TEN:71I86QI
-M>F5487)G971)1%1A8FQE`'-E=%]P;5]F86EL7VQE9`!R-S4P7U!R97!A<F5!
-M;F1396YD0V]M;6%N9`!/9&EN4U!)7U)D<'0`<C<U,%]-5E]-87!4;U-P96-I
-M9FEC5&%R9V5T240`<C<U,%]30U-)7T%405]&:6QL3$)!0V1B,3``<C<U,%]3
-M1U!)3U]7<FET95)E9VES=&5R`'(W-3!?1G)E95-!5$%38W)A=&-H5&]0;V]L
-M`'(W-3!?5&%G7T=E=$]N90!R-S4P7T]D:6Y34$E?26YI=`!R-S4P7T9R965)
-M;G1E<FYA;%)E<51O4&]O;`!W871I;F=?8V%L;&)A8VL`<C<U,%]#;VUP;&5T
-M95)E<75E<W1!;F13;&]T`'(W-3!?0V]R95]'9713=7!P;W)T961#;W5N=',`
-M1&5V:6-E7TUA:V50<FEV871E4V5N9%-E<U)E<75E<W0`4$U?4V5T1F%I;$QE
-M9$-A;&QB86-K`$%S<VEG;D5L96UE;D1E<V-R:7!T;W).86UE`$1E=FEC95]-
-M86ME4V5S16QE;65N=%-T871U<U)E<75E<W14:6UE<@!R-S4P7U-#4TE?051!
-M7U9E<FEF>51R86YS;&%T:6]N`'(W-3!?7U]R96YE=U]T:6UE<@!R-S4P7T1E
-M=FEC95]-86ME4V5S4F-V1&EA9U)E<75E<W0`<C<U,%]30U-)7T%405]3=&%R
-M=%-T;W!4<F%N<VQA=&EO;@!R-S4P7T1E=FEC95]7<FET95-E<T-O;G1R;VQ$
-M:6%G`'(W-3!?4T=024]?4TU04F5Q=65S=%]7<FET90!R-S4P7T9R965$979I
-M8V54;U!O;VP`<C<U,%]0;W)T7T%B;W)T4F5Q=65S=',`<')O9'5C=%]I9`!0
-M35]296%D4F5G4WEN8P!R-S4P7T-O<F5?36]D=6QE4V5N9%)E<75E<W0`<C<U
-M,%]#:&5C:U1A<F=E=$-H86YG90!R-S4P7T9R9650;W)T5&]0;V]L`&DR8T)?
-M=W)I=&5?8GET97,`<C<U,%]#;W)E7TEN=&5R<G5P=%-E<G9I8V52;W5T:6YE
-M`'(W-3!?4T=024]?4F5A9%)E9VES=&5R`'(W-3!?1$E30U]'971.96=O=&EA
-M=&5D3&EN:U)A=&4`<C<U,%]#86QC=6QA=&52;W5T94EN9&5X`'(W-3!?;V1I
-M;E]I;V-T;`!R-S4P7W-E=%]F86EL7VQE9`!R-S4P7U-44%]$979I8V5297-E
-M=`!R-S4P7T=E=$5X<&%N9&5R1G)O;5!O;VP`<C<U,%]3051!7U!-7TAA;F1L
-M941E=FEC955N<&QU9P!497-T7U!I;E]3970`<C<U,%]#;W)E7TEN=&5R;F%L
-M4V5N9%)E<75E<W0`<C<U,%]486=?27-%;7!T>0!R-S4P7TU67TUA<%1A<F=E
-M=$E$`'(W-3!?7U]A9&1?=&EM97(`<C<U,%]I,F-?<F5S970`<C<U,%]M=E]D
-M:7-A8FQE7VAB80!R-S4P7T-O<F5?4F5Q5&EM96]U=`!R-S4P7T9I;F1!<V-I
-M:4YU;6)E<@!R-S4P7VUV7W-E=%]305-!9&1R`'(W-3!?17AP86YD97)?4TU0
-M4F5Q=65S=%]0:'E#;VYT<F]L`'(W-3!?4T-325]-86ME36]D95!A9V5#86-H
-M:6YG`'(W-3!?0V]R95]297-E=$-M9%-L;W0`<C<U,%]296UO=F5$979I8V4`
-M<C<U,%]&:6YD5&=T3F\`<C<U,%]3=&]R95]#;VYF:6=2;W5T94EN9F\`:3)C
-M05]R96%D7V)Y=&5S`&%I;F9O`'(W-3!?0V]R95]-86ME1&5V:6-E4F5S9712
-M97$`<C<U,%]#;W)E7TUO9'5L94EN:71I86QI>F4`<C<U,%]30U-)7T%405]2
-M96%D0V%P86-I='E4<F%N<VQA=&EO;D-A;&QB86-K`'(W-3!?359?4V5T3$)!
-M86YD4V5C=&]R0V]U;G0`;V1I;E]C;W)E7W1I;65R`'(W-3!?<V5T7V9A:6Q?
-M;&5D<P!R-S4P7T9R965#;W)E0V]N=&5X=%1O4&]O;`!R-S4P7V-O<F5?:&%N
-M9&QE7W1A<VMF:6QE7V5R<F]R`'(W-3!?;V1I;E]S971?<W!I;E]U<%]M;V1E
-M`'(W-3!?4&]S=$UA:V5397-%;&5M96YT4W1A='5S4F5Q=65S=`!R-S4P7VUV
-M7V5N86)L95]X;70`<C<U,%],:7-T7T=E=$9I<G-T`'(W-3!?1G)E95-%4U-"
-M5&]0;V]L`'(W-3!?1V5T4$U$979I8V4`<C<U,%]$979I8V5?36%K94UO9&53
-M96QE8W1297%U97-T`'(W-3!?1&ES8V]V97)Y4TT`<C<U,%]3051!7T5R<F]R
-M2&%N9&QI;F<`<C<U,%]3051!7U!O<G1(86YD;&5);G1E<G)U<'0`<C<U,%]'
-M971#;W)E0V]N=&5X=$9R;VU0;V]L`'(W-3!?4T%37TAA;F1L94-O;7!L971E
-M9$-O;6UA;F0`<C<U,%]&<F5E4F5G:7-T97)3970`<C<U,%]3051!7U!O<G1$
-M971E8W0`<C<U,%]0;W)T7TAA;F1L95!L=6=I;@!R-S4P7T%S<VEG;D5L96UE
-M;G13;&]T3G5M8F5R`'(W-3!?1&5V:6-E7TES<W5E4V]F=%)E<V5T`'(W-3!?
-M7U]035]C86YC96Q?=&EM97(`<C<U,%]035]&<F5E4F5G:7-T97)3970`<C<U
-M,%]'97131T)U9F9E<D9R;VU0;V]L`'-E=%]E;5]F86EL7VQE9`!R-S4P7TU6
-M7T-20P!'9713051!-C1+4V-R871C:$9R;VU0;V]L`'(W-3!?4G5N=&EM94ES
-M<W5E4V]F=%)E<V5T`'(W-3!?1V5T1&5V:6-E1G)O;5!O;VP`<C<U,%]30U-)
-M7T%405]3>6YC0V%C:&54<F%N<VQA=&EO;@!497-T7U!I;E]);FET:6%L:7IE
-M`'(W-3!?359?1V5T36%P<&5D240`<C<U,%]&<F5E4TU04V-R871C:%1O4&]O
-M;`!R-S4P7T9I;F1&<F5E4TU00V]N=&5X=`!&<F5E4T%4038T2U-C<F%T8VA4
-M;U!O;VP`<C<U,%]3051!7U!R97!A<F5#;VUM86YD2&5A9&5R`&UV7W!H>5]R
-M97-E=`!R-S4P7U-!5$%?2&%N9&QE1&5V:6-E56YP;'5G`'(W-3!?4$U?27-S
-M=657<FET95)E9P!R-S4P7U-#4TE?051!7T-H96-K0V]N9&ET:6]N`'(W-3!?
-M4$U?27-S=65296%D4F5G`'(W-3!?1V5T26YT97)N86Q297%&<F]M4&]O;`!R
-M-S4P7T9R965%>'!A;F1E<E1O4&]O;`!S971?96U?9F%I;%]L961S`'(W-3!?
-M4G5N=&EM94ES<W5E4F5A9$QO9T5X=`!R-S4P7U-#4TE?051!7U)E861#87!A
-M8VET>51R86YS;&%T:6]N`'(W-3!?9'5M<%]U;F%S<V]C:6%T961?9FES`'(W
-M-3!?1&5V:6-E7TUA:V53=&%R=%-T;W!5;FET4F5Q=65S=`!R-S4P7T-O;7!L
-M971E4F5Q=65S=`!R-S4P7T1E=FEC95]-86ME36]D95-E;G-E4F5Q=65S=`!R
-M-S4P7T=E=%-!5$%38W)A=&-H1G)O;5!O;VP`<C<U,%]#;W)E7TUO9'5L95-T
-M87)T`'(W-3!?1&ES8V]V97)Y0V%L;$)A8VL`9V5T7VED7V9R;VU?96YC260`
-M<C<U,%]'971315-30D9R;VU0;V]L`%-%4U]0<FEV871E4F5Q0V%L;&)A8VL`
-M4T%37U)E<&]R=$QU;E-C86X`<C<U,%]#;W)E7TAA;F1L95=A:71I;F=,:7-T
-M`'(W-3!?4')E16UP='E030!R-S4P7T=E=$UI;DYE9V]T:6%T961,:6YK4F%T
-M90!R-S4P7U-!5$%?2&%N9&QE1&5V:6-E4&QU9VEN`'(W-3!?1FEL;$5N8VQO
-M<W5R945L96UE;G13=&%T=7,`<C<U,%]30U-)7U1O7T9)4P!R-S4P7T-O<F53
-M879E3W)I9VEN86Q#1$(`<C<U,%]3051!7U!O<G1297-E=`!R-S4P7T=E=$]N
-M94-O;6UA;F13;&]T`'(W-3!?;79?<F5S971?<&AY`'(W-3!?5W)I=&5$14Q6
-M7U%?16YT<GD`<C<U,%]O9&EN7W-E=%]I9&QE7W-T86YD8GD`<C<U,%]315-?
-M4V5T1F%I;$QE9`!R-S4P7T=E=%!-1G)O;5!O;VP`<C<U,%]-5E]%<75A;',`
-M<C<U,%](86YD;&5#;VUM86YD475E=64`07-S:6=N4V5S3W1H97)%;&5M96YT
-M3W9E<F%L;$5L96UE;G1.=6UB97(`<C<U,%]30U-)7T%405]296%D5W)I=&54
-M<F%N<VQA=&EO;@!R-S4P7U--4%]31U!)3U]3971?1F%I;&QE9`!R-S4P7U)U
-M;G1I;65)<W-U95-O9G1297-E=$-A;&QB86-K`'(W-3!?4T=486)L95]!<'!E
-M;F0`<C<U,%]!<W-I9VY$979I8V5/=F5R86QL16QE;65N=$YU;6)E<@!R-S4P
-M7U!-7T%S<VEG;E)E9VES=&5R4V5T`'(W-3!?4T%405]034AO='!L=6=297%#
-M86QL8F%C:P!P;W)T7W-E=%]F86EL7VQE9`!R-S4P7U5P9&%T951G=$1E=DUA
-M<`!R-S4P7U-!4U]);G1E<FYA;%)E<4-A;&QB86-K`'(W-3!?57!D871E5&%R
-M9V5T1&5V:6-E<P!O9&EN7V5M7V%C8V5S<P!R-S4P7U-!5$%?1&5V:6-E4W1A
-M=&5-86-H:6YE`$1E=FEC95]297!O<G1,=6Y297%U97-T`'(W-3!?4')E16UP
-M='E$979I8V4`<C<U,%]$25-#7T-H96-K1&ES8V]V97)3=&%T90!R-S4P7T9R
-M965335!#;VYT97AT`'(W-3!?1V5T3D-15&%G`'(W-3!?4T%44V5N<V5$871A
-M`'(W-3!?4T=024]?4TU04F5Q=65S=%]296%D`'(W-3!?7U]C86YC96Q?=&EM
-M97(`<C<U,%]$25-#7T=E=%)E<V]U<F-E`'(W-3!?0V]R95]P87-S7W1H<G5?
-M9FEL;%]T87-K9FEL90!R-S4P7T1)4T-?1&]$:7-C;W9E<@!R-S4P7U-'4$E/
-M7TEN:71I86QI>F4`<C<U,%]0;W)T7TAA;F1L941E=FEC95!L=6=I;@!R-S4P
-M7U-'4$E/7U-E=%]&86EL;&5D`'-E=%]P;5]F86EL7VQE9',`<C<U,%]-5E]#
-M;W!Y4T=486)L90!R-S4P7T1E=FEC95]-86ME4F5A9$-A<&%C:71Y5&%S:U)E
-M<75E<W0`=7!D871E7V1E=FEC95]C;VYF:6<`<C<U,%]#;W)E7TUO9'5L945N
-M86)L941I<V%B;&5)4E$`<C<U,%]M;V1E4&%G94)U9@!R-S4P7U-!4U]$979I
-M8V53=&%T94UA8VAI;F4`<C<U,%]486=?26YI=%]&249/`'(W-3!?0V]R95]&
-M:6QL4V5N<V5$871A`'(W-3!?4&]S=$UA:V5397-#;VYF:6=U<F%T:6]N4F5Q
-M=65S=`!R-S4P7U-!5$%?4$U?2&%N9&QE1&5V:6-E4&QU9VEN`'(W-3!?4T-3
-M25]!5$%?57!P97)7;W)D`$UA:V5$979);F9O`'(W-3!?4T%405]035-T871E
-M36%C:&EN90!R-S4P7T1)4T-?4V5T4F5S;W5R8V4`1&5V:6-E7TUA:V50<FEV
-M871E4F5C=E-E<U)E<75E<W0`4$U?27-S=657<FET949A:6Q,960`<C<U,%]3
-M051!7U!-26YI=%)E<4-A;&QB86-K`'(W-3!?;V1I;E]F;&%S:%]A8V-E<W,`
-M4T%405]035-T871E36%C:&EN95-P:6Y5<`!R-S4P7U-!5$%?4&]R=$1E=FEC
-M95)E861Y`'(W-3!?5&%G7U)E;&5A<V5/;F4`<C<U,%]305-?17)R;W)(86YD
-M;&EN9P!C:&5C:U]387-!9&1R`'(W-3!?1G)E95-'0G5F9F5R5&]0;V]L`'(W
-M-3!?1&5T96-T4&]R=%1Y<&4`<C<U,%]0;W)T7TES4F5Q=65S=%)U;FYI;F<`
-M<C<U,%]$25-#7T=E=%1G=$1E=DUA<`!$979I8V5?5&5S=%5N:71296%D>5)E
-M<75E<W0`<C<U,%]$979I8V5?4&%R<V5)9&5N=&EF>41A=&$`<C<U,%]D979I
-M8V5?<')O8F5?9&]N90!R-S4P7T)E97!/9F8`9V5T7V9I<G-T7W!M`'(W-3!?
-M57!D871E4W1A='5S5G-397-#;VYT<F]L0G5F9F5R`'(W-3!?27-S=65?0V]N
-M9FEG4F]U=&5);F9O`$]D:6Y34$E?4V5C=&]R56YP<F]T96-T`'(W-3!?0V]R
-M95)E<W1O<F5/<FEG:6YA;$-$0@!S8W-I;'5N7W1O7VEN=`!R-S4P7U-'5&%B
-M;&5?26YI=`!R-S4P7U-!5$%?4$U?17)R;W)(86YD;&EN9P!3051!7TAA;F1L
-M95!-7TAO=%!L=6<`<C<U,%]30U-)7T%405]&:6QL3$)!0V1B,38`<C<U,%])
-M<W-U95]$:7-C;W9E<@!'971!='1)9&5N=&EF>49R86UE`%-%4U1I;65R7TEN
-M=&5R;F%L4F5Q0V%L;&)A8VL`9V5T7V5N8U]C;W5N=`!R-S4P7T-A=&5G;W)Y
-M7T-$0E]4>7!E`'(W-3!?3&ES=%]'971,87-T`'(W-3!?1G)E95!-5&]0;V]L
-M`&=E=%]M:6Y?<&U0871H260`<C<U,%]$979I8V5?36%K95)E861#87!A8VET
-M>3$V5&%S:U)E<75E<W0`<C<U,%]M=E]D:7-A8FQE7W)E9VES=&5R7W-E=`!R
-M-S4P7U-!5$%?4&]R=$1E=FEC941E=&5C=&5D`'(W-3!?4&]R=%](86YD;&55
-M;G!L=6<`<C<U,%]!5$%?0T1",E1A<VM&:6QE`%)E;6]V95-!4T1E=FEC90!R
-M-S4P7TU67U)E;6]V951A<F=E=$E$`&]D:6Y?<V5T7VAA<F1?9&ES:U]I9&5N
-M=&EF>0!R-S4P7U-'5&%B;&5?079A:6QA8FQE`%!O<G1-87!?4C<U,`!R-S4P
-M7U-!5$%?4')E<&%R94-O;6UA;F1486)L90!'971$979)9&5N=&EF>49R86UE
-M`&DR8T)?<F5A9%]B>71E<P!S87-?861D<F5S<U]C;W5N=`!R-S4P7TES<W5E
-M7U)E<&]R=$UA;G5F86-T=7)E<DEN9F]R;6%T:6]N`'(W-3!?4')E<&%R941E
-M;&EV97)Y475E=65%;G1R>0!5<&1A=&5(:6U0871H260`<C<U,%]&:6YD4G5N
-M;FEN9U)E<4)Y5&%G`'(W-3!?0V]R95]-;V1U;&53:'5T9&]W;@!R-S4P7U!-
-M7T-O<F5?4F5Q5&EM96]U=`!R-S4P7T5X<&%N9&5R7U--4%)E<5]#86QL8F%C
-M:P!R-S4P7U5P9&%T95=I9&50;W)T4&AY36%P`'(W-3!?4T%37TAA;F1L94)2
-M1$-35`!R-S4P7T%S<VEG;E)E9VES=&5R4V5T`'(W-3!?4V5R=FEC94EN=&5R
-M<G5P=`!R-S4P7VUV7V1I<V%B;&5?>&UT`'(W-3!?4TU04F5S<$QE;F=T:`!U
-M<&1A=&5?9&5V:6-E7V-O;F9I9U]V,@!R-S4P7TES<W5E7U)E<&]R=%)O=71E
-M26YF;P!R-S4P7U!O<W1-86ME4V5S16YC;&]S=7)E4W1A='5S4F5Q=65S=`!R
-M-S4P7T5X<&%N9&5R7U--4%)E<75E<W1?4F5P;W)T1V5N97)A;`!R-S4P7T=E
-M=%--4%-C<F%T8VA&<F]M4&]O;`!R-S4P7T1E=FEC95]-86ME26YQ=6ER>51A
-M<VM297%U97-T`'(W-3!?0V]R95]-;V1U;&5'971297-O=7)C95%U;W1A`'(W
-M-3!?07-S:6=N1&5V:6-E16QE;65N=$YU;6)E<@!R-S4P7U!O<G1?1FEN9%1G
-M=$YO`'(W-3!?4T=024]?4TU04F5Q7T-A;&QB86-K`'(W-3!?4&]R=%]3;V9T
-M4F5S971#86QL8F%C:P!R-S4P7VUV7W)E<V5T7WAM=`!R-S4P7VUV0VAA;FYE
-M;%-T871E36%C:&EN90!R-S4P7U!O<G1?36]N:71O<@!R-S4P7U-!4U]0;W)T
-M4F5S970`<C<U,%]0;W-T36%K95-E<T5L96UE;G1$97-C<FEP=&]R4F5Q=65S
-M=`!R-S4P7T5X<&%N9&5R7U--4%)E<75E<W1?4F5P;W)T4$A94T%400!R-S4P
-M7TDR0U]-;V1U;&5);FET:6%L:7IE`'(W-3!?;V1I;E]R96UO=F5?9&5V:6-E
-M`'(W-3!?4T-325]!5$%?3&]W97)7;W)D`'(W-3!?1V5T36%X3F5G;W1I871E
-M9$QI;FM2871E`'(W-3!?1V5T4&]R=$9R;VU0;V]L`'(W-3!?359?1'5M<%)E
-M9VES=&5R`'(W-3!?17AP86YD97)?4TU04F5Q=65S=%]$:7-C;W9E<@!R-S4P
-M7T1E=FEC95]-86ME4F5Q=65S=%1A<VM297%U97-T`&1C-S(X,%]31U1A8FQE
-M7T%P<&5N9`!D8S<R.#!?1G)E95-!5$%38W)A=&-H5&]0;V]L`&1C-S(X,%]0
-M;W)T7T%B;W)T4F5Q=65S=',`9&,W,C@P7U-!5$%?4&]R=$AA;F1L94EN=&5R
-M<G5P=`!D8S<R.#!?4T537U-E=$9A:6Q,960`9&,W,C@P7U-!4U]);G1E<FYA
-M;%)E<4-A;&QB86-K`&1C-S(X,%])<W-U95]297!O<G1-86YU9F%C='5R97))
-M;F9O<FUA=&EO;@!D8S<R.#!?4&]R=%]-;VYI=&]R`&1C-S(X,%]#;W)E7TUA
-M:V5$979I8V5297-E=%)E<0!D8S<R.#!?4T-325]4;U]&25,`9&,W,C@P7V]D
-M:6Y?<F5M;W9E7V1E=FEC90!D8S<R.#!?4T%405]034EN:71297%#86QL8F%C
-M:P!D8S<R.#!?4$U?0V]R95]297%4:6UE;W5T`&1C-S(X,%]$25-#7T=E=%1G
-M=$1E=DUA<`!D8S<R.#!?;V1I;E]F;&%S:%]A8V-E<W,`9&,W,C@P7T9R9653
-M35!38W)A=&-H5&]0;V]L`&1C-S(X,%]$:7-C;W9E<GE#86QL0F%C:P!D8S<R
-M.#!?5&%G7U)E;&5A<V5/;F4`9&,W,C@P7T-O<F5?36]D=6QE4V5N9%)E<75E
-M<W0`9&,W,C@P7TU67TUA<%1O4W!E8VEF:6-487)G971)1`!D8S<R.#!?1V5T
-M4$U$979I8V4`9&,W,C@P7U-44%]$979I8V5297-E=`!D8S<R.#!?1V5T0V]R
-M94-O;G1E>'1&<F]M4&]O;`!D8S<R.#!?359?26YI=&EA;&EZ951A<F=E=$E$
-M5&%B;&4`9&,W,C@P7U!R945M<'1Y1&5V:6-E`&1C-S(X,%]/9&EN4U!)7TEN
-M:70`9&,W,C@P7T%405]#1$(R5&%S:T9I;&4`9&,W,C@P7U--4%)E<W!,96YG
-M=&@`9&,W,C@P7VUV7W)E<V5T7W!H>0!D8S<R.#!?4&]R=%]&:6YD5&=T3F\`
-M9&,W,C@P7U-'4$E/7U=R:71E4F5G:7-T97(`9&,W,C@P7T-O<F5?26YT97)R
-M=7!T4V5R=FEC95)O=71I;F4`9&,W,C@P7VUV7V1I<V%B;&5?>&UT`&1C-S(X
-M,%]3051!7U!O<G1$971E8W0`9&,W,C@P7T9R965$979I8V54;U!O;VP`9&,W
-M,C@P7T5X<&%N9&5R7U--4%)E<5]#86QL8F%C:P!D8S<R.#!?1&5V:6-E7TUA
-M:V5397-28W9$:6%G4F5Q=65S=`!D8S<R.#!?4&]R=%]3;V9T4F5S971#86QL
-M8F%C:P!D8S<R.#!?27-S=65?0V]N9FEG4F]U=&5);F9O`&1C-S(X,%]0;W)T
-M7TES4F5Q=65S=%)U;FYI;F<`9&,W,C@P7U9E<FEF>4-O;6UA;F1"969O<F53
-M96YD:6YG`&1C-S(X,%]$979I8V5?36%K95-T87)T4W1O<%5N:71297%U97-T
-M`&1C-S(X,%]&<F5E17AP86YD97)4;U!O;VP`9&,W,C@P7T-O<F5297-T;W)E
-M3W)I9VEN86Q#1$(`9&,W,C@P7U!O<W1-86ME4V5S16YC;&]S=7)E4W1A='5S
-M4F5Q=65S=`!D8S<R.#!?9'5M<%]U;F%S<V]C:6%T961?9FES`&1C-S(X,%]-
-M5E]:97)O379297%U97-T`&1C-S(X,%]'9710;W)T1G)O;5!O;VP`9&,W,C@P
-M7T9I;F1!<V-I:4YU;6)E<@!D8S<R.#!?4T%37U!O<G1297-E=`!D8S<R.#!?
-M359?1V5T36%P<&5D240`9&,W,C@P7U-#4TE?051!7U)E8617<FET951R86YS
-M;&%T:6]N`&1C-S(X,%]0;W-T36%K95-E<T-O;F9I9W5R871I;VY297%U97-T
-M`&1C-S(X,%]$979I8V5?36%K95)E<75E<W1487-K4F5Q=65S=`!D8S<R.#!?
-M4&]R=%](86YD;&5$979I8V50;'5G:6X`9&,W,C@P7U!-7T%S<VEG;E)E9VES
-M=&5R4V5T`&1C-S(X,%]#;W)E7U)E<V5T0VUD4VQO=`!D8S<R.#!?;79?9&ES
-M86)L95]H8F$`9&,W,C@P7U]?861D7W1I;65R`&1C-S(X,%]30U-)7TUA:V5-
-M;V1E4&%G94-A8VAI;F<`9&,W,C@P7T-/4D5?27-S=65335!297%U97-T`&1C
-M-S(X,%]!<W-I9VY$979I8V5/=F5R86QL16QE;65N=$YU;6)E<@!D8S<R.#!?
-M5W)I=&5$14Q67U%?16YT<GD`9&,W,C@P7U-#4TE?051!7U9E<FEF>51R86YS
-M;&%T:6]N`&1C-S(X,%]C;W)E7VAA;F1L95]T87-K9FEL95]E<G)O<@!D8S<R
-M.#!?4T=024]?4TU04F5Q=65S=%]7<FET90!D8S<R.#!?4T%37TAA;F1L94-O
-M;7!L971E9$-O;6UA;F0`9&,W,C@P7T1E=FEC95]-86ME4F5A9$-A<&%C:71Y
-M,39487-K4F5Q=65S=`!D8S<R.#!?4&]S=$UA:V5397-%;&5M96YT4W1A='5S
-M4F5Q=65S=`!D8S<R.#!?4T%405]035](86YD;&5$979I8V50;'5G:6X`9&,W
-M,C@P7V]D:6Y?<V5T7W-P:6Y?=7!?;6]D90!D8S<R.#!?0V]R95](86YD;&57
-M86ET:6YG3&ES=`!D8S<R.#!?4')E<&%R941E;&EV97)Y475E=65%;G1R>0!D
-M8S<R.#!?4T=024]?4TU04F5Q=65S=%]296%D`&1C-S(X,%]$25-#7T-A;F-E
-M;$1I<V-O=F5R`&1C-S(X,%]5<&1A=&57:61E4&]R=%!H>4UA<`!D8S<R.#!?
-M2&%N9&QE0V]M;6%N9%%U975E`&1C-S(X,%]$25-#7T=E=%)E<V]U<F-E`&1C
-M-S(X,%]30U-)7T%405]&:6QL3$)!0V1B,38`9&,W,C@P7T-O<F5?36]D=6QE
-M16YA8FQE1&ES86)L94E240!D8S<R.#!?:3)C7W)E<V5T`&1C-S(X,%]&<F5E
-M4F5G:7-T97)3970`9&,W,C@P7T)E97!/9F8`9&,W,C@P7T1)4T-?0VAE8VM$
-M:7-C;W9E<E-T871E`&1C-S(X,%]%>'!A;F1E<E]335!297%U97-T7U)E<&]R
-M=$=E;F5R86P`9&,W,C@P7TDR0U]-;V1U;&5);FET:6%L:7IE`&1C-S(X,%]D
-M979I8V5?<')O8F5?9&]N90!D8S<R.#!?4F5M;W9E1&5V:6-E`&1C-S(X,%]2
-M=6YT:6UE27-S=653;V9T4F5S971#86QL8F%C:P!D8S<R.#!?4T=024]?4V5T
-M7T9A:6QL960`9&,W,C@P7T=E=$UA>$YE9V]T:6%T961,:6YK4F%T90!D8S<R
-M.#!?1G)E95-%4U-"5&]0;V]L`&1C-S(X,%],:7-T7T=E=$QA<W0`9&,W,C@P
-M7U!-7TES<W5E5W)I=&5296<`9&,W,C@P7W-E=%]F86EL7VQE9`!D8S<R.#!?
-M5&%G7TES16UP='D`9&,W,C@P7U5P9&%T951G=$1E=DUA<`!D8S<R.#!?5&%G
-M7TEN:70`9&,W,C@P7U-!5$%?4$U(;W1P;'5G4F5Q0V%L;&)A8VL`9&,W,C@P
-M7U!O<W1-86ME4V5S16QE;65N=$1E<V-R:7!T;W)297%U97-T`&1C-S(X,%]&
-M<F5E4&]R=%1O4&]O;`!D8S<R.#!?359?36%P5&%R9V5T240`9&,W,C@P7U!-
-M7TES<W5E4F5A9%)E9P!D8S<R.#!?0V]R95]-;V1U;&53:'5T9&]W;@!D8S<R
-M.#!?57!D871E4&AY26YF;P!D8S<R.#!?7U]R96YE=U]T:6UE<@!D8S<R.#!?
-M1&5V:6-E7TUA:V5296%D0V%P86-I='E487-K4F5Q=65S=`!D8S<R.#!?1V5T
-M1&5V:6-E1G)O;5!O;VP`9&,W,C@P7T=E=%-%4U-"1G)O;5!O;VP`9&,W,C@P
-M7T%S<VEG;D5L96UE;G13;&]T3G5M8F5R`&1C-S(X,%]0;W)T7TAA;F1L955N
-M<&QU9P!D8S<R.#!?0V]R95]-;V1U;&53=&%R=`!D8S<R.#!?1&ES8V]V97)Y
-M4TT`9&,W,C@P7U-#4TE?051!7T-H96-K0V]N9&ET:6]N`&1C-S(X,%]-5E]#
-M;W!Y4T=486)L90!D8S<R.#!?4T%405]$979I8V53=&%T94UA8VAI;F4`9&,W
-M,C@P7T1E=FEC95]-86ME26YQ=6ER>51A<VM297%U97-T`&1C-S(X,%]$979I
-M8V5?4&%R<V5)9&5N=&EF>41A=&$`9&,W,C@P7U-!5%-E;G-E1&%T80!D8S<R
-M.#!?1V5T3D-15&%G`&1C-S(X,%]M=D-H86YN96Q3=&%T94UA8VAI;F4`9&,W
-M,C@P7U-T;W)E7T-O;F9I9U)O=71E26YF;P!D8S<R.#!?4T=486)L95]);FET
-M`&1C-S(X,%]'971%>'!A;F1E<D9R;VU0;V]L`&1C-S(X,%]305-?2&%N9&QE
-M0E)$0U-4`&1C-S(X,%]#;W)E4V%V94]R:6=I;F%L0T1"`&1C-S(X,%]-5E]$
-M=6UP4F5Q=65S=`!D8S<R.#!?3&ES=%]'971&:7)S=`!D8S<R.#!?4T-325]!
-M5$%?1FEL;$1A=&%&:65L9`!D8S<R.#!?4T-325]!5$%?4WEN8T-A8VAE5')A
-M;G-L871I;VX`9&,W,C@P7U-'4$E/7TEN:71I86QI>F4`9&,W,C@P7T9R9653
-M35!#;VYT97AT`&1C-S(X,%]&:6QL16YC;&]S=7)E16QE;65N=%-T871U<P!D
-M8S<R.#!?0V]R95]-;V1U;&5);FET:6%L:7IE`&1C-S(X,%]3051!7U!-4W1A
-M=&5-86-H:6YE`&1C-S(X,%]&<F5E4$U4;U!O;VP`9&,W,C@P7U-!5$%?4')E
-M<&%R94-O;6UA;F1486)L90!D8S<R.#!?0V]R95]-;V1U;&5'971297-O=7)C
-M95%U;W1A`&1C-S(X,%]&<F5E4T="=69F97)4;U!O;VP`9&,W,C@P7U1A9U])
-M;FET7T9)1D\`9&,W,C@P7U-#4TE?051!7U)E861#87!A8VET>51R86YS;&%T
-M:6]N0V%L;&)A8VL`9&,W,C@P7U]?4$U?8V%N8V5L7W1I;65R`&1C-S(X,%]-
-M5E]$=6UP4F5G:7-T97(`9&,W,C@P7U-E<G9I8V5);G1E<G)U<'0`9&,W,C@P
-M7TES<W5E7T1I<V-O=F5R`&1C-S(X,%]$25-#7T1O1&ES8V]V97(`9&,W,C@P
-M7U-!5$%?2&%N9&QE1&5V:6-E56YP;'5G`&1C-S(X,%]#;W)E7TEN=&5R;F%L
-M4V5N9%)E<75E<W0`9&,W,C@P7T1)4T-?4V5T4F5S;W5R8V4`9&,W,C@P7U-!
-M5$%?4$U?2&%N9&QE1&5V:6-E56YP;'5G`&1C-S(X,%]3051!7U!O<G1$979I
-M8V5$971E8W1E9`!D8S<R.#!?57!D871E5&%R9V5T1&5V:6-E<P!D8S<R.#!?
-M4T-325]!5$%?4W1A<G13=&]P5')A;G-L871I;VX`9&,W,C@P7T-O<F5?<&%S
-M<U]T:')U7V9I;&Q?=&%S:V9I;&4`9&,W,C@P7VUV7V1I<V%B;&5?<F5G:7-T
-M97)?<V5T`&1C-S(X,%]!<W-I9VY$979I8V5%;&5M96YT3G5M8F5R`&1C-S(X
-M,%]'971-:6Y.96=O=&EA=&5D3&EN:U)A=&4`9&,W,C@P7VUV7W-E=%]305-!
-M9&1R`&1C-S(X,%]035]&<F5E4F5G:7-T97)3970`9&,W,C@P7T5X<&%N9&5R
-M7U--4%)E<75E<W1?4&AY0V]N=')O;`!D8S<R.#!?359?17%U86QS`&1C-S(X
-M,%]'97131T)U9F9E<D9R;VU0;V]L`&1C-S(X,%]30U-)7T%405],;W=E<E=O
-M<F0`9&,W,C@P7T-H96-K1&5V:6-E0VAA;F=E`&1C-S(X,%]305-?17)R;W)(
-M86YD;&EN9P!D8S<R.#!?0F5E<$]N`&1C-S(X,%]31U!)3U]335!297%?0V%L
-M;&)A8VL`9&,W,C@P7U-'5&%B;&5?079A:6QA8FQE`&1C-S(X,%]335!?4T=0
-M24]?4V5T7T9A:6QL960`9&,W,C@P7T-O<F5?1FEL;%-E;G-E1&%T80!D8S<R
-M.#!?1V5T4TU04V-R871C:$9R;VU0;V]L`&1C-S(X,%]3051!7U!O<G1$979I
-M8V5296%D>0!D8S<R.#!?;79?96YA8FQE7WAM=`!D8S<R.#!?07-S:6=N4F5G
-M:7-T97)3970`9&,W,C@P7V]D:6Y?:6]C=&P`9&,W,C@P7TES<W5E7U)E<&]R
-M=%)O=71E26YF;P!D8S<R.#!?1V5T26YT97)N86Q297%&<F]M4&]O;`!D8S<R
-M.#!?0VAE8VM487)G971#:&%N9V4`9&,W,C@P7T1E=FEC95]7<FET95-E<T-O
-M;G1R;VQ$:6%G`&1C-S(X,%]#;VUP;&5T95)E<75E<W0`9&,W,C@P7U)U;G1I
-M;65)<W-U95-O9G1297-E=`!D8S<R.#!?1&5V:6-E7TES<W5E4V]F=%)E<V5T
-M`&1C-S(X,%]3051!7TAA;F1L941E=FEC95!L=6=I;@!D8S<R.#!?4')E<&%R
-M94%N9%-E;F1#;VUM86YD`&1C-S(X,%]0<F5%;7!T>5!-`&1C-S(X,%]30U-)
-M7TUA:V5#86-H94-O;6UA;F0`9&,W,C@P7T-O;7!L971E4F5Q=65S=$%N9%-L
-M;W0`9&,W,C@P7T1)4T-?1V5T3F5G;W1I871E9$QI;FM2871E`&1C-S(X,%]&
-M:6YD4G5N;FEN9U)E<4)Y5&%G`&1C-S(X,%]S971?9F%I;%]L961S`&1C-S(X
-M,%]&:6YD1G)E95--4$-O;G1E>'0`9&,W,C@P7U-!4U]$979I8V53=&%T94UA
-M8VAI;F4`9&,W,C@P7T9I;F149W1.;P!D8S<R.#!?27-S=65?4F5P;W)T1V5N
-M97)A;`!D8S<R.#!?0V%L8W5L871E4F]U=&5);F1E>`!D8S<R.#!?;79?<F5S
-M971?>&UT`&1C-S(X,%]-5E]#4D,`9&,W,C@P7U-#4TE?051!7U)E861#87!A
-M8VET>51R86YS;&%T:6]N`&1C-S(X,%]-5E]296UO=F5487)G971)1`!D8S<R
-M.#!?4T%405]035]%<G)O<DAA;F1L:6YG`&1C-S(X,%]5<&1A=&53=&%T=7-6
-M<U-E<T-O;G1R;VQ"=69F97(`9&,W,C@P7T-O<F5?1V5T4W5P<&]R=&5D0V]U
-M;G1S`&1C-S(X,%]-5E]3971,0D%A;F1396-T;W)#;W5N=`!D8S<R.#!?1&5V
-M:6-E7TUA:V5-;V1E4V5L96-T4F5Q=65S=`!D8S<R.#!?1V5T3VYE0V]M;6%N
-M9%-L;W0`9&,W,C@P7U-'4$E/7U)E861296=I<W1E<@!D8S<R.#!?17AP86YD
-M97)?4TU04F5Q=65S=%]297!O<G102%E3051!`&1C-S(X,%]0;W)T7TAA;F1L
-M95!L=6=I;@!D8S<R.#!?0V]R95]297%4:6UE;W5T`&1C-S(X,%]M;V1E4&%G
-M94)U9@!D8S<R.#!?4G5N=&EM94ES<W5E4F5A9$QO9T5X=`!D8S<R.#!?4T-3
-M25]!5$%?57!P97)7;W)D`&1C-S(X,%]&<F5E0V]R94-O;G1E>'14;U!O;VP`
-M9&,W,C@P7U-%4U]);G1E<FYA;%)E<4-A;&QB86-K`&1C-S(X,%]3051!7T5R
-M<F]R2&%N9&QI;F<`9&,W,C@P7T=E=%!-1G)O;5!O;VP`9&,W,C@P7T1E=&5C
-M=%!O<G14>7!E`&1C-S(X,%]$979I8V5?36%K94UO9&5396YS95)E<75E<W0`
-M9&,W,C@P7U-#4TE?051!7T9I;&Q,0D%#9&(Q,`!D8S<R.#!?7U]C86YC96Q?
-M=&EM97(`9&,W,C@P7U-!5$%?4&]R=%)E<V5T`&1C-S(X,%]O9&EN7W-E=%]I
-M9&QE7W-T86YD8GD`9&,W,C@P7T5X<&%N9&5R7U--4%)E<75E<W1?1&ES8V]V
-M97(`9&,W,C@P7U1A9U]'971/;F4`9&,W,C@P7U-!5$%?4')E<&%R94-O;6UA
-M;F1(96%D97(`9&,W,C@P7T-A=&5G;W)Y7T-$0E]4>7!E`&1C-S(X,%]&<F5E
-M26YT97)N86Q297%4;U!O;VP`9&,W,C@P7T=E=%-!5$%38W)A=&-H1G)O;5!O
-M;VP`4W=A<$AP=$UE=&%6,P!L9&U?<W!I;G5P7W9D978`<F%W7V-H96-K7V1I
-M<VM?9&5S8W)I<'1O<@!L9&U?8VAE8VM?87)R87D`;&1M7W)E8VAE8VM?86QL
-M`'9D979?8VQA<W-?;&ES=`!R87=?:61L95]T:6UE<E]R97-E=`!L9&U?9&5L
-M971E7W!A<G1I=&EO;@!L9&U?<WEN8U]C:&%N9V5D7V%R<F%Y<P!G<F5B=6EL
-M9&]N97)R;W(`;&1M7W%U975E7V5V96YT`'1R86YS9F]R;5]N965D960`;&1M
-M7V-H96-K7W1R86YS9F]R;0!L9&U?9FEX=7!?87)R87E?<W1A=&4`8V%L8U]R
-M96)U:6QD7W!R;V=R97-S`'9B=7-?97AT7W-I>F4`<V5T7W1R86YS9F]R;5]S
-M=&5P7VEN9F\`;&1M7VED;&5?=&EM97(`;&1M7V9I;F1?=F1E=E]R87<`;&1M
-M7W)E<')O8F5?9&5V:6-E`&-A;&-?=')A;G-F;W)M7W!R;V=R97-S`&QD;5]F
-M:6YD7W9D979?8VQA<W,`;&1M7V%L;&]C7W!A<G1I=&EO;@!L9&U?:6YI=%]D
-M:7-K`')E9G)E<VA?<F%W7V1E=E]I;F9O`%]D96QE=&5?<F%W7W!A<G0`<F%W
-M7W)E861?=W)I=&5?<V5C=&]R<P!G:61L97-T86YD8GET:6UE;W5T`')A=U]C
-M:&5C:U]A<G)A>5]D97-C<FEP=&]R`&QD;5]C<F5A=&5?=F1E=E]R87<`=6YP
-M;'5G7W)A=U]V9&5V`$-H96-K4W5M`&-O;7!A<F5?<VQO=%]S97%?8GE?<&-I
-M861D<@!L9&U?861D7V1I<VM?=&]?87)R87D`;&1M7W-Y;F-?9&ES:U]I;F9O
-M`&=E=%]B:71S`%-W87!(<'1-971A5C0`<F%W7V-O;G9E<G1?<W!A<F5?=&]?
-M;&5G86-Y`&9.;W1I9GE'54D`;&1M7V9L=7-H7V%L;%]T87)G971S`&QD;5]S
-M=&%R=%]R96)U:6QD`&QD;5]S<&EN9&]W;E]A;&Q?<F%W9&5V<P!?7VQD;5]F
-M:6YI<VA?8VUD`$E$7U1/7U9$158`7U]V9&5V7W%U975E7V-M9`!R87=?:61L
-M95]T:6UE<E]C:&5C:P!G971?<W1R:7!?:6YF;P!L9&U?<F5S=6UE7V%D87!T
-M97(`:'!T;G)?;&1M7W)E9VES=&5R7VAI;5]27S9?-35?-S5?-#9?-C0`:'!T
-M;G)?9T=L;V)A;$YC<49L86<`:'!T;G)?;W-?<F5Q=65S=%]T:6UE<@!H<'1N
-M<E]D;6%P;V]L7V=E=%]P86=E`&AP=&YR7V]S7V=E=%]S=&%M<`!H<'1N<E]L
-M9&U?<W5S<&5N9`!H<'1N<E]L9&U?:61L90!H<'1N<E]L9&U?9V5T7VUE;5]I
-M;F9O`&AP=&YR7VQD;5]R96UO=F5?=&EM97(`:'!T;G)?<&-I8V9G7W)E861?
-M9'=O<F0`:'!T;G)?9&UA<&]O;%]M86ME7V]R9&5R`&AP=&YR7VQD;5]G971?
-M=F)U<U]E>'0`:'!T;G)?;&1M7W)E;&5A<V5?=F1E=@!H<'1N<E]F<F5E;&ES
-M=%]R97-E<G9E7V1M80!H<'1N<E]L9&U?:6YT<@!M96UC<'D`:'!T;G)?;&1M
-M7V]N7W1I;65R`&AP=&YR7VQD;5]G971?8VUD7W-I>F4`:'!T;G)?;&1M7V9R
-M965?8VUD<P!H<'1N<E]L9&U?8W)E871E7W9D978`:'!T;G)?;&1M7V%D9%]S
-M<&%R95]T;U]A<G)A>0!H<'1N<E]G<F5B=6EL9'!R:6]R:71Y`&AP=&YR7VQD
-M;5]S>6YC7V%R<F%Y7VEN9F\`:'!T;G)?;W-?;6%P7W!C:5]B87(`:'!T;G)?
-M7U]L9&U?86QL;V-?8VUD`&AP=&YR7VEN:71?;6]D=6QE7W9D979?<F%W`&AP
-M=&YR7VQD;5]S971?875T;W)E8G5I;&0`:'!T;G)?7U]D=6UM>5]R96<`:'!T
-M;G)?9&UA<&]O;%]A8W1I=F4`:'!T;G)?=F)U<U]L:7-T`&AP=&YR7VQD;5]Q
-M=65U95]V8G5S7V1P8P!H<'1N<E]L9&U?<F5S971?=F)U<P!H<'1N<E]G4T=0
-M24]087)T4W5P<&]R=`!H<'1N<E]I;FET7VUO9'5L95]H:6U?<C<U,`!?7W5M
-M;V1D:3,`:'!T;G)?;&1M7W)E;&5A<V5?;&]C:P!H<'1N<E]O<U]U;FUA<%]P
-M8VE?8F%R`&AP=&YR7VQD;5]S:'5T9&]W;@!?7W5D:79D:3,`:'!T;G)?:&EM
-M7VQI<W0`:'!T;G)?;&1M7W)E<75E<W1?=&EM97(`:'!T;G)?;&1M7W)E<W5M
-M90!H<'1N<E]L9&U?9V5T7V1E=FEC95]I9`!H<'1N<E]O<U]S8VAE9'5L95]T
-M87-K`&AP=&YR7VQD;5]I;V-T;`!H<'1N<E]G4W!I;G5P3VYE1&5V16%C:%1I
-M;64`:'!T;G)?9G)E96QI<W1?<'5T`&AP=&YR7V]S7W-T86QL97AE8P!H<'1N
-M<E]G7VQE9V%C>5]M;V1E`&AP=&YR7VQD;5]A;&QO8U]C;61S7U)?-E\U-5\W
-M-5\T-E\V-`!H<'1N<E]L9&U?<G5N`&AP=&YR7VEN:71?;6]D=6QE7VAI;5]D
-M8S<R.#``:'!T;G)?;&1M7V9R965?8VUD<U]T;U]L:7-T`&AP=&YR7V]S7VUA
-M>%]C86-H95]S:7IE`&AP=&YR7W9D979?<75E=65?8VUD`&AP=&YR7V]S7V=E
-M=%]V8G5S7W-E<0!H<'1N<E]L9&U?<WEN8U]A<G)A>5]S=&%M<`!H<'1N<E]L
-M9&U?<75E=65?8VUD`&AP=&YR7V]S7W!R:6YT:P!H<'1N<E]F<F5E;&ES=%]R
-M97-E<G9E`&AP=&YR7V1M87!O;VQ?<'5T7W!A9V4`:'!T;G)?9G)E96QI<W1?
-M9V5T`&AP=&YR7VQD;5]U;G)E9VES=&5R7V1E=FEC90!H<'1N<E]L9&U?<F5G
-M:7-T97)?861A<'1E<@!H<'1N<E]G875T;W)E8G5I;&0`:'!T;G)?;&1M7V=E
-M=%]V8G5S7W-I>F4`:'!T;G)?9&5L87E?8F5T=V5E;E]S<&EN=7``:'!T;G)?
-M;&1M7V=E;F5R:6-?;65M8F5R7V9A:6QE9`!H<'1N<E]D;6%P;V]L7V=E=%]P
-M86=E7V%T`&AP=&YR7VQD;5]E=F5N=%]N;W1I9GD`:'!T;G)?;&1M7V-R96%T
-M95]V8G5S`&AP=&YR7VAI;5]H86YD;&5?=&]?=F)U<P!H<'1N<E]F<F5E;&ES
-M=%]G971?9&UA`&AP=&YR7VQD;5]G971?;F5X=%]V8G5S`&AP=&YR7V]S7W!C
-M:5]W<FET96P`:'!T;G)?;&1M7V9I;F1?=&%R9V5T`&AP=&YR7V1M87!O;VQ?
-M<F5G:7-T97)?8VQI96YT`&AP=&YR7VQD;5]I;FET:6%L:7IE7W9B=7-?87-Y
-M;F,`:'!T;G)?;W-?<75E<GE?=&EM90!H<'1N<E]O<U]Q=65R>5]R96UO=F5?
-M9&5V:6-E`&AP=&YR7VQD;5]R96=I<W1E<E]D979I8V4`:'!T;G)?;W-?<&-I
-M7W)E861L`&AP=&YR7VQD;5]A8W%U:7)E7VQO8VL`:'!T;G)?;W-?<F5V86QI
-M9&%T95]D979I8V4`:'!T;G)?9&UA<&]O;%]I;FET`&AP=&YR7VQD;5]F:6YI
-M<VA?8VUD`&AP=&YR7VQD;5]I9&5?9FEX<W1R:6YG`&AP=&YR7V1M87!O;VQ?
-M;6%X7V-L87-S7W!A9V5S`&AP=&YR7VQD;5]R96=I<W1E<E]V9&5V7V-L87-S
-M7U)?-E\U-5\W-5\T-E\V-`!H<'1N<E]N=6U?9')I=F5S7W!E<E]S<&EN=7``
-M:'!T;G)?;&1M7W)E;&5A<V5?=F)U<P!H<'1N<E]L9&U?<75E=65?=&%S:P!H
-M<'1N<E]L9&U?86QL;V-?8VUD<U]F<F]M7VQI<W0`:'!T;G)?9G)E96QI<W1?
-M<'5T7V1M80!H<'1N<E]L9&U?=&EM97)?<')O8F5?9&5V:6-E`&AP=&YR7VQD
-M;5]F:6YD7W-T86UP`&AP=&YR7VQD;5]C:&5C:U]A<G)A>5]O;FQI;F4`:'!T
-M;G)?9U!R;V)E26Y);FET:6%L:7II;F<`:'!T;G)?;&]G7W-E8W1O<E]R97!A
-M:7(``)(````"B```J0````*1``"]`````BH``"0!```!`0``.P$```+J``!=
-M`0```JP``&D!```"/```?`$```*D`@"'`0```D```*<!```")P``O@$```)5
-M``#*`0```BH``.<!```"*@``"P(```)4```H`@```IX``'L"```"Z@``F0(`
-M``*L``"X!0```DP``"<)```!`P``S@D```$%``#3"0```J\"`!P*```"A`(`
-M[`H```&0`@`4"P```9`"`'0+```!D`(`_0L```&0`@`X#````9`"`*(,```"
-MI`(`W`P```*D`@`>#0```J0"`%@-```"I`(`O`T```(/`0#(#0```J0"`-0-
-M```"90``2`X```&0`@!6#@```9`"`&<.```"I`(`>@X```&0`@"(#@```9`"
-M`)L.```!D`(`I`X```&0`@#'#@```J0"`-(.```!D`(`\PX```*D`@#^#@``
-M`9`"`!\/```!D`(`.@\```&0`@"##P```9`"`)H/```!D`(`M@\```&0`@#+
-M#P```9`"`.D/```!D`(`]`\```&0`@`A$````J0"`"\0```!D`(`5A````*D
-M`@!D$````9`"`)82```!D`(`ZQ(```+1```;$P```M$``(\3```"+```]1,`
-M``)]`@`(%````O0``"P4```"9@``S!0```(L``#S%````A8```H5```"L```
-M)14```'_``!`%0```04``$45```"KP(`8A4```*Z`@!_%0```KH"`)H5```"
-M.```Q14```&0`@".%@```9,``*\6```"P```C!<```)_``"8%P```BH``(@8
-M```"N@``Q!L```+R``!`'````MX``(,<```"N@``)AT```$#``!.'0```AD`
-M`)(=```"&0``U1T```(9```4'@```AD``%4>```"2P``I1X```('`0`U'P``
-M`IT``&\?```"$@``GQ\```*D`@#V(0```J````\B```"=@``UR(```+Z``!>
-M(P```K\``(@C```"^@``Z20```*"```%)0```@`!`'TE```"@@``LB4```(`
-M`0!K)P```D(``%`H```"A`(`;B@```$#```%*0```A$``!<I```"$0``R2D`
-M``*"``#^*0```@`!`(HJ```"!0$`R2H```*N``#M*@```@4!``,K```"#0$`
-M(RL```(%`0!S*P```J(``),K```!!0``F"L```*O`@`$+````F8``!0L```"
-M;0``I"P```*/```@+0```H\``"XM```"(@``6BT```*/``!S+0```MP``)LM
-M```"30``/RX```)O``!D+@```MP``(HN```"F```MRX```*/``"_+@```I@`
-M`.0N```"W```1B\```(Y``"0+P```E,``+4O```"9@``[R\```*Z`@`/,```
-M`CD``#0P```"0```0#````*D`@",,````K4``)8P```"[```J3````$&``"N
-M,````J\"`.0P```".0``^3````)6```$,0```I@``'TQ```!D`(`HS$```&0
-M`@#4,0```9`"`!LR```!!0``(#(```*O`@!Q,@```KL``.8R```"NP``_#(`
-M``*]```(,P```F\``+HS```"V0``V3,```+<``#_,P```F8``)$T```"V0``
-MJC0```+<``#R-````FL```TV```!D`(`)C8```&0`@`^-@```9`"`)$V```!
-MD`(`K38```&0`@`I-P```MH``(0W```!D`(`H#<```&0`@"\-P```9`"`,@W
-M```"8@``IS@```(0`0#<.````H0"`+,Y```"A`(`+CH```*$`@!6.@```9`"
-M`(8Z```!D`(`PCH```&0`@"A.P```H0"`-$\```"A`(`6CT```*$`@!M/0``
-M`0,``/(]```"I`(`-SX```&0`@!8/@```9`"`'T^```!!@``@CX```*O`@"1
-M/@```@X!`*H^```!D`(`V3X```&0`@!,/P```9`"`,T_```"#@$`X3\```(.
-M`0!70````04``%Q````"KP(`NT````$&``#`0````J\"`-1````"'P``!T$`
-M``$%```,00```J\"`-5!```!!0``VD$```*O`@"!0@```MD``)A"```"W```
-M2D,```(S``"<1````A\``+!$```"+```(44```)N``"&10```MD``))%```"
-M,P``J44```+<``#]10```F8``'I&```";```JT8```)F```V1P```9`"`&)'
-M```"9@``ET<```(L``"G1P```I@``.1'```!D`(`!T@```&0`@`T2````9`"
-M`$A(```"IP``J$@```&0`@`/20```9`"`"U)```!D`(`/TD```*-``!I20``
-M`9`"`'Y)```!D`(`U$D```&0`@#M20```9`"`!9*```"?0(`-DH```+X``!U
-M2@```F8``*M*```"N@(`QTH```(Y``#U2@```H,```%+```"I`(`*$L```$!
-M``!82P```IT"`'I+```!D`(`BDL```&0`@"I2P```9`"`+E+```!D`(`X4L`
-M``&0`@`+3````9`"`#9,```!D`(`3TP```&0`@![3````9`"`*5,```!D`(`
-M]DP```&0`@`230```9`"`"]-```!D`(`2TT```&0`@")30```GT"`,M-```"
-MN@(`XTT```(Y``#T30```D````!.```"I`(`(TX```'L```X3@```IT"`%E.
-M```!D`(`=TX```&0`@"B3@```9`"`,!.```!D`(`"T\```)]`@`G3P```F8`
-M`%=/```"N@(`>T\```$,`0"23P```IT"`+)/```!D`(`ST\```&0`@#K3P``
-M`J0"`/M/```!D`(`%E````&0`@`S4````9`"`$]0```"I`(`7U````&0`@"#
-M4````9`"`#Y1```!D`(`9E$```*D`@"140```9`"`+A1```"I`(`X5$```&0
-M`@`*4@```J0"`%92```"PP``=%(```*$``"$4@```A```+=2```"/@``\5(`
-M``(5```C4P```A```.-3```"I`(`"50```&0`@`G5````J0"`$=4```!D`(`
-M<%0```*D`@"65````9`"`+A4```"I`(`U%0```&0`@#X5````F8``'U5```"
-M.0``P54```(Y``#150```A```!A6```"9@``/E8```)F``!A5@```GT"`'E6
-M```"0```A58```*D`@`V5P```BP``%E7```"%@``<%<```*P``"*5P```08`
-M`(]7```"KP(`K%<```*Z`@#)5P```KH"`.Q7```".```%5@```*)``!)6```
-M`F8``&I8```"0```=E@```*D`@"G6````A8``+Y8```"L```UU@```'_``#R
-M6````04``/=8```"KP(`%%D```*Z`@`Q60```KH"`$Q9```".```:5D```(^
-M``#N60```9`"`!5:```"I`(`,5H```&0`@!16@```9`"`'1:```"I`(`D%H`
-M``&0`@`<6P```O@``"A;```">P``;5L```)S``!^6P```OD``+M;```"I`(`
-MTUL```&0`@#N6P```9`"`!)<```"$```&EP```(+`0!%7````IL``,U<```"
-M#`$`Y%P```)F``!Q70```B$!`*-=```"M0``W%T```+*``#[70```KH"`!M>
-M```"N@(`3%X```*D`@!C7@```9`"`'Q>```!D`(`G%X```(0``"D7@```@L!
-M`.U>```"PP``)E\```)F``"B7P```IL``+1?```"'P$`)&````&0`@!%8```
-M`9`"`&)@```"<0``<V````+Y``#;8````G4``/A@```"W```&F$```*8```_
-M80```H\``$=A```"F```BF$```+<``#180```CD``.9A```"9@``%F(```*Z
-M`@`N8@```CD``#QB```"0```2&(```*D`@!I8@```NP``)5B```"W```QV(`
-M``(Y``#D8@```F8``/QB```"%@``$V,```*P```P8P```KH"`$UC```"N@(`
-M8&,```(X``!Y8P```O0``(YC```!D`(`VV,```(0``#G8P```CX``'!D```!
-MD`(`BV0```(?``"?9````BP``+YD```"'P``QF0```(G`0#E9````0,```1E
-M```"*0$`*&4```(I`0!,90```CD``'ME```"4P``G&4```*A``#&90```CD`
-M`/%E```"4P``$F8```(Y```N9@```J$``%%F```".0``;F8```(Y``"D9@``
-M`D```+!F```"I`(`'&<```*D```[9P```JH``%5G```"%@``;&<```*P``"&
-M9P```08``(MG```"KP(`J&<```*Z`@#%9P```KH"`-AG```".```!&@```)F
-M``!`:````AT!`(YH```"=```K&@```)F````:0```04```5I```"KP(`+VD`
-M``(?``!R:0```04``'=I```"KP(`2FH```$%``!/:@```J\"`))J```!!0``
-MEVH```*O`@`G:P```J<``"]L```"V0``9&P```+K``"<;````04``*%L```"
-MKP(`WFT```*$`@`";@```9`"`"YN```!D`(`:FX```&0`@#?;@```?\``!9O
-M```!!0``&V\```*O`@"!;P```04``(9O```"KP(`X&\```$%``#E;P```J\"
-M`!=P```!!0``''````*O`@!.<````08``%-P```"KP(`RG````$%``#/<```
-M`J\"`!EQ```!!@``'G$```*O`@!1<0```08``%9Q```"KP(`97$```$&``!J
-M<0```J\"`+MQ```""0$`!G(```&0`@`C<@```9`"`$!R```!D`(`8'(```&0
-M`@!W<@```08``'QR```"KP(``',```&0`@`M<P```08``#)S```"KP(`;7,`
-M``$%``!R<P```J\"`(QS```"8@``I',```&0`@`S=````I@``%-T```"2@``
-MV'0```(M``#V=````KX``")U```"L`(`3G4```*P`@!Z=0```K`"`*-U```"
-ML`(`S'4```*P`@``=@```K`"`"5V```"L`(`2W8```*P`@!W=@```K`"`)QV
-M```"L`(`R'8```*P`@#T=@```K`"`!QW```"L`(`1'<```*P`@!L=P```K`"
-M`)1W```"L`(`NW<```*P`@#D=P```K`"``EX```"L`(`.G@```*"`@!G>```
-M`H("`)MX```"@@(`S'@```*"`@#]>````H("`"YY```"@@(`6WD```*"`@"/
-M>0```H("`,5Y```"9@``VGD```*(``!3>@```0$``&9Z```"Z@``=GH```(\
-M```%>P```F8``$%[```"N@(`77L```(Y``!K>P```D```'=[```"I`(`IWL`
-M``)/``!8?0```BT``.Q]```"L@(`(GX```*R`@!??@```K("`)Q^```"L@(`
-MUGX```*R`@#R?@```K("`!!_```"L@(`>G\```*R`@#5?P```K("`#*````"
-ML@(`>X````*R`@#0@````K("`#B!```"L@(`@8$```*R`@"V@0```LL``,6!
-M```"L@(`\X$```(/```"@@```K("`#""```"#P``/X(```*R`@!M@@```@\`
-M`'R"```"L@(`JH(```(/``"Y@@```K("`!V#```"T@``$X8```*]`@`OA@``
-M`KT"`$N&```"O0(`9X8```*]`@"#A@```KT"`)^&```"O0(`VH8```)F```_
-MAP```KT"`'F'```"9@``YX<```*]`@`JB````F8``**(```":```[8@```&0
-M`@`2B0```9`"`"Z)```"^0``<8D```(Y``"$B0```D```)")```"I`(`LHD`
-M``(6``#/B0```KH"`.R)```"N@(``XH```(X```2B@```9`"`&^*```"T0``
-MGXH```*Z`@`)BP```KT``$2+```"9@``FHL```'_``"YBP```04``+Z+```"
-MKP(`$HP```$%```7C````J\"`$R,```"'P``CXP```$%``"4C````J\"`%F-
-M```!!0``7HT```*O`@"0C0```08``)6-```"KP(`'8X```$%```BC@```J\"
-M`.&.```!!@``YHX```*O`@#NC@```J<``/:/```"W```'I````+9``!"D```
-M`MH``(20```":P``;)0```*<``#,E````H0"`."4```"Y0``6I4```*$`@"I
-ME0```H@``+N5```"D0``S94```(J``#VE0```H0"`#B6```!E@``C98```+J
-M``"NE@```JP``+J6```"/```"9<```*(```;EP```I$``"V7```"*@``?I<`
-M``&6``#3EP```NH``/27```"K````)@```(\``!MF````H@``(.8```"D0``
-MF9@```(J``"^F````H0"`/68```!'0``'YD```+J``!`F0```JP``%"9```"
-M/```LID```*<``#=F0```C8``!F:```"B```*YH```*1```]F@```BH``(.:
-M```!'0``KYH```+J``#0F@```JP``-R:```"/```?9L```)1``"\FP```E$`
-M``R<```"<@``()P```(P``!2G````C0``'*<```",```IIP```(P``![G0``
-M`JT``,Z=```"J```!YX```(T``!(G@```H@``%J>```"D0``;)X```(J``"R
-MG@```?```-J>```"Z@``^YX```*L```'GP```CP``.&?```")P``[9\```(J
-M```?H````H0"`&&@```")P``;:````(J```#H0```A,!`!BA```")P``)*$`
-M``(J```_H0```GT"`%.A```!,0``:*$```*=`@#7H0```J8``,2B```"&`$`
-M!*,```(8`0`^HP```C0``'JD```"9```CZ0```+-``"DI````B`!`+FD```"
-M$P$`TZ0```)]`@#GI````3$```&E```"G0(`-*4```)F``"HI0```B$!`,ZE
-M```"M0``]:4```+*``!$I@```F8``(*F```"-```MZ8```(=`0#AI@```B<`
-M`/6F```"*@``,:<```(T``#[IP```9`"`):L```"80``GZT```$#```XK@``
-M`9`"`&BN```!D`(`DZX```&0`@#,K@```9`"`!^O```!D`(`3:\```&0`@!S
-MKP```9`"`*6O```!D`(`9K````$#``![L````0,``(ZP```!`P``G+````$#
-M``"OL````LP``+JP```!`P``/K$```)F``!^L0```F8``*ZQ```"9@``_K$`
-M``)F```NL@```F8``+2R```"9@``$+0```+9``"!M0```A\``,BU```"]P``
-M"+8```+W``#QM@```B<```*W```"@0``"[@```(\```RN````N@``$&X```"
-M80``5K@```+<``#!N````G4``">Y```";P``^+D```(J``!JN@```E4``'BZ
-M```"*@``MKH```)F``#`N@```AL``,BZ```";0``_+H```*(```*NP```I$`
-M`".[```"*@``8;L```&R``!MNP```CP``+"[```"B```Y[L```&R``#SNP``
-M`CP``#&\```"B```0[P```*1``!5O````BH``)R\```!`0``L+P```+J``#1
-MO````JP``-V\```"/```';T```*(``!8O0```:L``&2]```"/```=KT```*D
-M`@"(O0```J0"`&V^```")P``?KX```*!``"*O@```BH``,.^```">@``X;X`
-M``(G``#RO@```H$``/Z^```"*@``_+\```*D`@`(P````BH``#C````">@``
-M2,````*D`@!4P````BH``(S````"B```S\````(9``#?P````BH``//````!
-ML@``_\````(\``!`P0```H@``%K!```"D0``<\$```(J``#-P0```;(``.#!
-M```"Z@``_L$```*L```*P@```CP``%G"```"B```=,(```*1``"-P@```BH`
-M`./"```!L@``]\(```+J```9PP```JP``"7#```"/```8,,```*(``!ZPP``
-M`I$``)/#```"*@``YL,```&R``#^PP```NH``"#$```"K```+,0```(\``!P
-MQ````H@``(K$```"D0``H\0```(J``#NQ````;(```+%```"Z@``),4```*L
-M```PQ0```CP``(_%```"B```1<8```$!``!8Q@```NH``&3&```"/```D<@`
-M``(I`0"NR````E4``/S(```"9@``S\D```*/```SR@```H@``%3*```"%0$`
-M9LH```(J``"ZR@```0H!`,W*```"Z@``V<H```(\```JRP```H@``#S+```"
-M%0$`D<L```$*`0"DRP```NH``+#+```"/```O,L```*D`@`!S````H@```_,
-M```"%0$`6LP```$*`0!MS````NH``'G,```"/```N<P```*(``#'S````A4!
-M``W-```!"@$`(,T```+J```LS0```CP``%W-```"2P``;<T```(H``!=S@``
-M`DL``&W.```"*```U<X```*W``!4SP```I4``+W/```"$0$`[<\```)+``#]
-MSP```B@``&G0```"F0``R-````(&`0`BT0```MD``$+1```"=0``6-$```(&
-M`0"AT0```MD``+?1```"!@$`X-$```)]`@`3T@```GT"`&72```"9P``K=(`
-M``+9``#'T@```F\``-/2```"O0``A-,```)F``"6TP```G0``*W3```!"0$`
-MPM,```*=`@`^U````F8``%#4```"O0``:=0```%0``"$U````IT"`#'5```"
-MV0``/=4```(S``!)U0```H\``._5```!"0$`!-8```*=`@"(U@```5```*/6
-M```"G0(`)-@```)F``")V````G\``)W8```"*@``Y]@```)3```:V0```K4`
-M`$79```"1@``9=D```)F``#DV0```B$!`/_9```"?P``$]H```(J``![V@``
-M`CD``*3:```"0```L-H```*D`@#;V@```J0``/K:```"J@``)]L```(6```^
-MVP```K```%C;```!!@``7=L```*O`@!ZVP```KH"`)?;```"N@(`TML```(X
-M``#TVP```F8``";<```"'0$`9]P```(Y``"8W````D```*3<```"I`(`S]P`
-M``*D``#NW````JH```O=```"%@``)MT```*P``!'W0```?\``&;=```!!0``
-M:]T```*O`@",W0```KH"`!/>```"N@(`=-X```)F``"RW@```KH"`-K>```"
-M.```(-\```*(```RWP```I$``$O?```"*@``N=\```&R``#,WP```NH``.K?
-M```"K```]M\```(\```CX````DL``#/@```"*```#N$```(&`0!'X0```B@`
-M`)[A```"9@``J>,```*$`@!LY0```J8``*3E```"5P``+^8```$!``!=Y@``
-M`AH``#GG```!`0``?.<```(:``!%Z````0$``(OH```"&@``]>@```$!```S
-MZ0```AH``(7I```!`0``P^D```(:``"<Z@```AX``!7K```"!`$`'^P```+N
-M``"S[````FH``#KM```"I@``;>T```)#``"8[0```E@``,SN```"5P``DO``
-M``*Y``#>\````NX``(+Q```":@``^?$```+F``"`\@```FH``$#S```":@``
-M@?,```)7``#\\P```FH``$CT```":@``J?0```)J``#S]````FH``#OX```"
-M:@``D_@```&0`@"K^````9`"`"OZ```"T```F/L```&0`@"S^P```9`"`-/[
-M```"*@``,/P```*D`@`__````9`"`&+\```"I`(`<?P```&0`@!I_0```J0"
-M`'7]```!D`(`A_T```*D`@"._0```9`"`*O]```"I`(`L_T```&0`@#:_0``
-M`J0"`.;]```!D`(`^/T```*D`@#__0```9`"`!S^```"I`(`)/X```&0`@!H
-M_@```J0"`,C^```"I`(`V?X```)````W_P```H@``*/_```!U0``K_\```&O
-M``"^_P```CP```X``0`"B```?``!``$O``"(``$``CP```<!`0`!D`(`*`$!
-M``&0`@"'`0$``M0``)<!`0`"*P``Z@$!``*(```S`@$``2\``#\"`0`"/```
-MQP(!``&0`@#H`@$``9`"`#\#`0`"#@``3P,!``(K``##`P$``H@```H$`0`!
-MU0``%@0!``&O```E!`$``CP``&L$`0`"B```R`0!``$!``#7!`$``CP``/X$
-M`0`!&P$`804!``*D`@!H!0$``9`"`'H%`0`"I`(`@04!``&0`@`1!@$``J0"
-M`!@&`0`!D`(`*@8!``*D`@`Q!@$``9`"`,<&`0`"W0``_`8!``(!`0`$!P$`
-M`M```%D'`0`!D`(`;@<!``&0`@"*!P$``9`"`*\'`0`!D`(``@@!``+O```*
-M"`$``A0``'8(`0`"I`(`B0@!``&0`@"O"`$``J0"`,((`0`!D`(`R0L!``)X
-M``!_#`$``J8``-T-`0`"I@``_0T!``*F``!S#@$``B8!`'T/`0`"I`(`I`\!
-M``*D`@!O$`$``M8``)`0`0`"VP``JA`!``$#`0"X$`$``0,!`#H1`0`!D`(`
-M9A$!``&0`@"6$0$``J0"`*L1`0`!D`(`\A$!``&0`@!0$@$``9`"`+D2`0`!
-MD`(`*A,!``*D`@`\$P$``9`"`%T3`0`"4@``:1,!``)E``!_$P$``J0"`)L3
-M`0`"I`(`MQ,!``*D`@#9$P$``H,``.L3`0`!D`(`/!0!``*D`@!+%`$``9`"
-M`&P4`0`"4@``>!0!``)E``".%`$``J0"`*H4`0`"I`(`QA0!``*D`@#H%`$`
-M`H,``/H4`0`!D`(`*A4!``*D`@`V%0$``A```%05`0`""P$`7Q4!``&0`@!W
-M%0$``9`"`(X5`0`!D`(`8Q8!``&0`@#C%@$``H@``/T6`0`"D0``%A<!``(J
-M``!T%P$``0$``(@7`0`"Z@``J1<!``*L``"U%P$``CP``.\8`0`!!0``]!@!
-M``*O`@"J&0$``04``*\9`0`"KP(`PQD!``(=`0#D&0$``D<``,P:`0`"F@``
-M/!L!``&3``!=&P$``L```'4;`0`">P``]1L!``*:```('`$``B4!`#H<`0`"
-MR@``U1P!``(?`0#D'`$``I\``(H=`0`"'0$`X!T!``)F``!`'@$``B$!`&,>
-M`0`"M0``=!X!``+*```+'P$``N(``)@?`0`"9@``$2`!``+B``"N(`$``KH"
-M`,T@`0`"N@(`_R`!``+B``!K(0$``KH"`+<A`0`"N@(`]2$!``(Y```;(@$`
-M`D```"<B`0`"I`(`4B(!``*D``!Q(@$``JH``(HB`0`"%@``H2(!``*P``"[
-M(@$``08``,`B`0`"KP(`W2(!``*Z`@#V(@$``08``/LB`0`"KP(`&",!``*Z
-M`@!@(P$``KH"`*,C`0`".```QB,!``*Z`@`@)`$``O@``$PD`0`"'0$`920!
-M``)[``"J)`$``G,``.PD`0`!`P``5R4!``+1``!\)0$``H<``*$E`0`"AP``
-MQB4!``*'``#K)0$``H<``!@F`0`"A0``128!``*%``!\)@$``H4``*DF`0`"
-MA0``M28!``*D`@#L)@$``H4``!DG`0`"A0``)2<!``*D`@!*)P$``H<``&\G
-M`0`"AP``E"<!``*'``#!)P$``H4``.8G`0`"AP``+"@!``*D`@"F*`$``9`"
-M`,0H`0`!D`(`VB@!``*D`@#X*`$``K4```DI`0`"I`(`*2D!``*'```U*0$`
-M`J0"`%HI`0`"AP``9BD!``*D`@"=*0$``H4``*DI`0`"I`(`SBD!``*'``#:
-M*0$``J0"`.\I`0`"S@``!"H!``)(```Q*@$``H4``%XJ`0`"A0``BRH!``*%
-M``"X*@$``H4``-TJ`0`"AP``[BH!``*D`@`.*P$``H<``!HK`0`"I`(`1RL!
-M``*%``!L*P$``H<``)DK`0`"A0``K2L!``*?``#2*P$``H<``-XK`0`"I`(`
-M$BP!``*%```>+`$``J0"`$`L`0`"AP``3"P!``*D`@!A+0$``B<``&TM`0`"
-M*@``RRT!``&0`@#J+0$``9`"`!PN`0`!D`(`02X!``(G``!-+@$``BH``%DN
-M`0`"T0``@2X!``+1``#%+P$``G,``-$O`0`"I`(`]R\!``)S```#,`$``J0"
-M`(HP`0`!D`(`HS`!``&0`@#J,`$``J0"``LQ`0`"M0``)S$!``+8```\,0$`
-M`M@``$PQ`0`"I`(`<#$!``&0`@".,0$``9`"`*8Q`0`"I`(`NS$!``$%``#`
-M,0$``J\"`,TQ`0`"B```$C(!``$!```>,@$``CP``#,R`0`!!@``.#(!``*O
-M`@!%,@$``H@``(HR`0`!`0``EC(!``(\``"],@$``H@```DS`0`!`0``&#,!
-M``(\```L,P$``H@``'@S`0`!`0``AS,!``(\``";,P$``H@``.`S`0`!`0``
-M[#,!``(\```&-`$``H@``$LT`0`!`0``5S0!``(\``!K-`$``H@``+@T`0`!
-M`0``Q#0!``(\```!-0$``IH``"DU`0`"5@``C34!``+1``#3-0$``M$``.4U
-M`0`"9@``/#8!``(A`0!H-@$``K4``((V`0`"R@``K#8!``)F```--P$``B$!
-M`#DW`0`"M0``4S<!``+*``"+-P$``F8``+8W`0`"-```V3<!``(=`0`9.0$`
-M`B<``"4Y`0`"*@``ECD!``*D`@#=.0$``E,``/(Y`0`"M0``2#H!``$%``!-
-M.@$``J\"`&@Z`0`"X0``V#H!``*D`@!-.P$``B<``%D[`0`"*@``<3L!``(G
-M``!].P$``BH``(D[`0`"M0``<3P!``(6`0"+/`$``A8!`*4\`0`"C@``MSP!
-M``*V``#)/`$``N```.$\`0`"]@``\SP!``+&```%/0$``I```!D]`0`":0``
-M1#T!``)F``"E/0$``B$!`-(]`0`"M0``[#T!``+*``!&/@$``C0``%@^`0`"
-M9@``?CX!``$&``"#/@$``J\"`),^`0`"-```NCX!``(=`0`80`$``ND``")`
-M`0`!`P``@T`!``)[```<00$``IH``#-!`0`")0$`=D$!``+*```-0@$``F8`
-M`#]"`0`"WP``A4(!``*F```E0P$``KH"`&!#`0`".0``>$,!``)```"$0P$`
-M`J0"`*]#`0`"I```SD,!``*J``#N0P$``A8```E$`0`"L```*D0!``*Z`@!+
-M1`$``KH"`']$`0`".```^40!``+?```010$``A,``,9%`0`"I@``3D<!``(A
-M`0!E1P$``LH``)5'`0`"-```J$<!``)[```22`$``F8``$=(`0`"WP``CT@!
-M``+?``#12`$``M\``.Q(`0`"I@``+TD!``(9`0"%2@$``K,``*M*`0`"9@``
-MR4H!``(Y``#72@$``D```.-*`0`"I`(`!4L!``(6```<2P$``K```#E+`0`"
-MN@(`5DL!``*Z`@""2P$``C@``*)+`0`"B0``!TP!``(]```R3`$``M\``'=,
-M`0`"WP``MDP!``+?``#)3`$``AD!`-U,`0`"1P``%4T!``(9`0"(3@$``GL`
-M`+M/`0`"(0$`S4\!``+*```64`$``AT!`%]0`0`"WP``AE`!``*X``#B4`$`
-M`A4``.I0`0`!DP``"U$!``+````J40$``K$``#91`0`"%0``;E$!``+8``!^
-M40$``J0"`,51`0`".```VE$!``*E```'4@$``M$``"E2`0`"?0(`.%(!``+T
-M``!,4@$``F8``&I2`0`"%@``@5(!``*P``">4@$``KH"`+M2`0`"N@(`TE(!
-M``(X``#S4@$``F8```-3`0`">P``/%,!``*U```!5`$``B<```U4`0`"*@``
-M:50!``$%``!N5`$``J\"`(A4`0`".```E%0!``(J``#)5`$``OD``/I4`0`"
-MI`(`!E4!``(J```B50$``G,``#!5`0`"I`(`/%4!``(J``!(50$``G```*E5
-M`0`"9@``#58!``*U``!V5P$``H4``--7`0`")P``XU<!``(J``#X5P$``M$`
-M`!U8`0`!`P``35@!``&0`@"36`$``9`"`+98`0`!D`(`^U@!``&0`@`:60$`
-M`9`"`&]9`0`!D`(`JED!``(G``"Z60$``BH``,I9`0`"'0$`!EH!``(G```6
-M6@$``BH``"1:`0`!UP``.5H!``*=`@!26@$``J0"`'M:`0`"PP(`IUH!``&0
-M`@#&6@$``9`"`,M:`0`"PP(`.5L!``)F``"/6P$``A8``+1;`0`"L```XUL!
-M``*Z`@!X7`$``?\``)=<`0`!!0``G%P!``*O`@"]7`$``KH"`.1<`0`".```
-M"ET!``&0`@`I70$``9`"`'!=`0`"9@``J%T!``)[``#470$``D```.!=`0`"
-MI`(`%UX!``&0`@`V7@$``9`"`!!?`0`!D`(`+5\!``&0`@"S7P$``HH``-)?
-M`0`"!@$`!V`!``&0`@`C8`$``9`"`%%@`0`!D`(`;6`!``&0`@"W8`$``9`"
-M`-9@`0`!D`(`"&$!``&0`@`U80$``B<``$5A`0`"*@``46$!``+1``!D80$`
-M`D```'!A`0`"I`(`F6(!``(G``"E8@$``BH``.EB`0`")P``]6(!``(J```)
-M8P$``LH``!UD`0`"A`(`<60!``$&``!V9`$``J\"`(MD`0`")P``EV0!``(J
-M``#`9`$``F8``#=E`0`"9@``IF4!``+*``!@9@$``J0"`-YF`0`"I`(`,F<!
-M``*D`@!19P$``B<``%UG`0`"*@``<6<!``+[``"-:`$``J0"`-)H`0`"I`(`
-M\6@!``(G``#]:`$``BH``!%I`0`"^P``4&D!``*D`@"@:0$``J0"`/EI`0`"
-MI`(`*FH!``*7``!1:@$``B<``%UJ`0`"*@``:6H!``+*``"P:@$``9`"`)9M
-M`0`"&```MFT!``(8``#A;0$``A@``)9N`0`"&```MFX!``(8``#C;@$``A@`
-M`#-O`0`"B@``>6\!``+4``");P$``BL``.!O`0`"Q```+G`!``(A``!K<`$`
-M`L,``+AP`0`"I`(`VG4!``$)``#J=0$``0D``/IU`0`"/P``4'8!``)@```V
-M=P$``I0``&-W`0`"\0``=G<!``*4``!+>`$``F8``*5X`0`"TP``RG@!``*$
-M`@#S>`$``BX``'YY`0`"10``O7D!``+#```:>@$``K0``/%Z`0`"I`(`XWL!
-M``$)``#T>P$``0D```1\`0`"/P``.WP!``$)``!,?`$``0D``%Q\`0`"/P``
-MXWP!``&0`@`R?0$``9`"`%-]`0`")@``:WT!``(F``"#?0$``B8``)M]`0`"
-M)@``LWT!``(F``#+?0$``B8``.-]`0`")@``^WT!``(F```3?@$``B8``"M^
-M`0`")@``0WX!``(F``!;?@$``B8``'-^`0`")@``BWX!``(F``"C?@$``B8`
-M`+M^`0`")@``TWX!``(F``#K?@$``B8```-_`0`")@``&W\!``(F```S?P$`
-M`B8``$M_`0`")@``8W\!``(F``![?P$``B8``)-_`0`")@``JW\!``(F```4
-M@`$``9`"`#2``0`!D`(`\8`!``(F```0@0$``B8``"^!`0`")@``3H$!``(F
-M``!M@0$``B8``,N!`0`"B```W8$!``(5`0!N@@$``H0"`*>"`0`"A`(`KH(!
-M``$:`0#!@@$``NH``,V"`0`"/```%(,!``*(```F@P$``A4!`'^#`0`!&@$`
-MDH,!``+J``">@P$``CP``/J#`0`"O```"(0!``)````4A`$``J0"`$Z$`0`"
-M-P``7(0!``)```!HA`$``J0"`)*$`0`"O```I(0!``)```"PA`$``J0"`/V$
-M`0`"-P``EX4!``)_``"CA0$``BH``%*(`0`")0``:(@!``+M``!6B0$``H8`
-M`&N)`0`!70``P(D!``(E``#6B0$``NT``'J*`0`"A@``P8H!``*&``"$BP$`
-M`JD``)V+`0`",@``OHL!``)\```CC`$``0,``(2/`0`"%P``"I`!``(7```F
-MD`$``H0"`!"1`0`"W@``?)(!``&0`@"3D@$``9`"`*.2`0`"I`(`[I(!``$'
-M```VDP$``9`"`&F3`0`!!P``BY,!``$'``#3DP$``9`"`$B4`0`!!P``D)0!
-M``&0`@##E`$``0<``.64`0`!!P``+94!``&0`@"6E0$``0<``*>5`0`!!P``
-M.I8!``&0`@#/E@$``9`"`&*7`0`!D`(`C)<!``*D`@!8F`$``B,``!>;`0`"
-MYP``CYP!``$#``">G`$``0<``*B<`0`!!P``LYP!``$'``"]G`$``0<``!:@
-M`0`!!P``&Z`!``)U`@"AH`$``C\``+&@`0`"I`(`S:`!``("`0#XH`$``08`
-M`/V@`0`"KP(`1:$!``*9`@!?H0$``ID"`'FA`0`"F0(`\:$!``(M```2H@$`
-M`J,"`"^B`0`"HP(`4*(!``*C`@!MH@$``J,"`(ZB`0`"HP(`JZ(!``*C`@#,
-MH@$``J,"`.FB`0`"HP(`)J,!``*C`@`]HP$``J,"`&NC`0`"HP(`B*,!``*C
-M`@"IHP$``J,"`,:C`0`"HP(`YZ,!``*C`@`$I`$``J,"`"6D`0`"HP(`0J0!
-M``*C`@!CI`$``J,"`("D`0`"HP(`H:0!``*C`@"^I`$``J,"`-^D`0`"HP(`
-M_*0!``*C`@`=I0$``J,"`#JE`0`"HP(`6Z4!``*C`@!XI0$``J,"`)FE`0`"
-MHP(`MJ4!``*C`@#7I0$``J,"`/2E`0`"HP(`%:8!``*C`@`RI@$``J,"`%.F
-M`0`"HP(`<*8!``*C`@"1I@$``J,"`*ZF`0`"HP(`XZ8!``+2`@`4IP$``M("
-M`$FG`0`"T@(`>J<!``+2`@"OIP$``M("`."G`0`"T@(`%:@!``+2`@!&J`$`
-M`M("`'NH`0`"T@(`K*@!``+2`@#AJ`$``M("`!*I`0`"T@(`1ZD!``+2`@!X
-MJ0$``M("`*VI`0`"T@(`WJD!``+2`@`1J@$``L@``".J`0`"R```3:H!``(I
-M``!5J@$``I(``&.J`0`"D@``:ZH!``(B`0!WJ@$``J0"`'^J`0`"P0``CZH!
-M``+(``"?J@$``L@``.&J`0`"T0``-*L!``+1``!<JP$``@@!`&^K`0`""`$`
-MC*L!``((`0"?JP$``@@!`+NK`0`"0```#*P!``*(``!JK`$``0$``'JL`0`"
-M/```MZP!``(Y``#+K`$``J0"`->L`0`"0```)JT!``(J``"/K0$``H@```6N
-M`0`!`0``%:X!``(\``!2K@$``CD``&:N`0`"I`(`<JX!``)```"TK@$``I$`
-M`"NO`0`!`0``.Z\!``+J``!@KP$``JP``'2O`0`"/```L:\!``(Y``#%KP$`
-M`J0"`-&O`0`"0```";`!``(G```GL`$``BH``#.P`0`"B```3[`!``(G``!9
-ML0$``0$``&VQ`0`"Z@``EK$!``*L``"JL0$``CP``.>Q`0`".0``^[$!``*D
-M`@`'L@$``D```$FR`0`")P``9;(!``(J``#UL@$``H@``!VS`0`!!@``(K,!
-M``*O`@`PLP$``I$``$RS`0`"*@``B;,!``*Z`@"HLP$``CD``/FS`0`"A`(`
-MW;0!``)>```=M0$``0$``#&U`0`"Z@``6K4!``*L``!UM0$``CP``+>U`0`"
-M.0``R[4!``*D`@#7M0$``D```".V`0`"A`(`5[8!``(G``!PM@$``H$``(2V
-M`0`"*@``K+8!``*Z`@!PMP$``B<``(&W`0`"@0``C;<!``(J``!2N`$``CD`
-M`*"X`0`"(0$`Z+@!``+1``#^N`$``K4``!VY`0`"R@``5[D!``+D``!AN@$`
-M`L<``(.Z`0`"$0$`H[H!``*\`@#7N@$``BD``-^Z`0`"7```Y[H!``)<``#O
-MN@$``I(``/NZ`0`"D@``![L!``(B`0`3NP$``J0"`!N[`0`"P0``+[L!``%?
-M``!*NP$``IT"`%J[`0`"'0$`?+L!``(7`0"*NP$``A<!`*F[`0`!"0``MKL!
-M``$)``#3NP$``0<``-V[`0`!!P``_KL!``%:```,O`$``0<``!*\`0`!6@``
-M&+P!``$'```>O`$``5H``"2\`0`!!P``*KP!``%:```QO`$``5H``$>\`0`!
-M6@``3KP!``%:``!=O`$``5H``&2\`0`!6@``;;P!``%:``!TO`$``5H``(.\
-M`0`!6@``D+P!``$'``"JO`$``5H``+B\`0`!6@``Q[P!``%:``#.O`$``5H`
-M`->\`0`!6@``WKP!``%:``#VO`$``0<```B]`0`!`P``1;T!``$#``!IO0$`
-M`0<``'J]`0`!!P``IKT!``%:``"TO0$``5H``-Z]`0`!6@``!+X!``%:```1
-MO@$``5H``&.^`0`"?@(`=[X!``$#``#OO@$``JH``!6_`0`"I```';\!``+D
-M``!"OP$``K```%R_`0`"L```\;\!``$%``#VOP$``J\"``C``0`"B```-L`!
-M``'_``!1P`$``04``%;``0`"KP(`F,`!``$!``"DP`$``CP``.'``0`".0``
-M]<`!``*D`@#]P`$``D```$'!`0`"B```8\$!``*1``"$P0$``BH``-[!`0`!
-M`0``\L$!``+J```3P@$``JP``"/"`0`"/```8,(!``(Y``!TP@$``J0"`(#"
-M`0`"0```L\(!``+A``#=P@$``B<``.W"`0`"*@``"<,!``(J``!6PP$``0,`
-M`)'#`0`"XP``U<,!``)C```-Q`$``KH"`"C$`0`".0``.L0!``*D`@!"Q`$`
-M`D```'[$`0`"N@(`F<0!``*C``"KQ`$``OT``!+%`0`!_P``+<4!``$%```R
-MQ0$``J\"`&#%`0`"?0(`<<4!``$!``"&Q0$``IT"`/''`0`"J@``&L@!``*D
-M``!(R`$``F8``+3(`0`"9@``"<D!``*Z`@!(R0$``F8``*K)`0`"N@(`\,H!
-M``+C``!&RP$``L<``&'+`0`"L```F<L!``)```#$RP$``AT!`.'+`0`"?0(`
-M]<L!``%?```*S`$``IT"`&7-`0`"Y```QLT!``$#``#ZS0$``CL``&/.`0`"
-M.P``S,X!``([```USP$``CL``'_0`0`!`P``PM`!``([```QT0$``CL``);1
-M`0`".P``^]$!``([``!AT@$``CL``,;2`0`".P``$-,!``*;`@!$TP$``CL`
-M`([3`0`"FP(`PM,!``([```,U`$``IL"`$#4`0`".P``BM0!``*;`@"^U`$`
-M`CL``!35`0`"B@``4M4!``**``"0U0$``HH``,[5`0`"B@``#-8!``**``!'
-MU@$``HH``/#6`0`!"0``^]8!``$)```9V0$``HP"`$+9`0`"C`(`A-D!``$#
-M``"9V0$``0<``*79`0`!!P``L=D!``$'``"ZV0$``0<``,#9`0`!!P``W=D!
-M``$'```=V@$``L8"`%':`0`"OP(`AMH!``%:``"3V@$``5H``+_:`0`!6@``
-MW-H!``%:``#EV@$``5H``.S:`0`!6@``"-L!``%:```6VP$``5H``'3<`0`!
-M_P``B=P!``+D``#SW0$``I0``"'>`0`"\0``-MX!``*4``"UX0$``I0``./A
-M`0`"\0``^.$!``*4``"EY0$``I0``-/E`0`"\0``Z.4!``*4``!EZ0$``I0`
-M`)/I`0`"\0``J.D!``*4``#PZP$``H@``+_M`0`"A`(`$^\!``$!``"![P$`
-M`EX``)'O`0`"Z@``L>\!``*L``#1[P$``NH``.?O`0`"D0``'/`!``*L```Q
-M\`$``GD``&;P`0`"K```I?`!``*$`@`7\0$``H0"`%'Q`0`"/```8_$!``(J
-M``#?\P$``L8"``;T`0`"Q@(`._4!``(A`0"+]0$``F8``-WU`0`"M0``#O8!
-M``+1``!,]@$``H,``''V`0`"R@``G/8!``)F``#W]@$``N(``,+W`0`"!@(`
-MV?<!``)$`@#M]P$``D,"`%3X`0`!`0``:_@!``+#`0"-^`$``BP!`)GX`0`"
-M0P$`K/@!``*D`@"W^`$``E4!`-?X`0`"+@$`[O@!``)U`0#Z^`$``D,"`!?Y
-M`0`"0P(`._D!``)X`0!8^0$``L<!`*OY`0`"PP$`R?D!``(L`0#H_`$``JL!
-M`%<``@`!`P``_@`"``$%```#`0(``J\"`$P!`@`"A`(`'`("``&0`@!$`@(`
-M`9`"`*0"`@`!D`(`+0,"``&0`@!H`P(``9`"`-(#`@`"I`(`#`0"``*D`@!.
-M!`(``J0"`(@$`@`"I`(`[`0"``)6`0#X!`(``J0"``0%`@`"`0(`>`4"``&0
-M`@"&!0(``9`"`)<%`@`"I`(`J@4"``&0`@"X!0(``9`"`,L%`@`!D`(`U`4"
-M``&0`@#W!0(``J0"``(&`@`!D`(`(P8"``*D`@`N!@(``9`"`$\&`@`!D`(`
-M:@8"``&0`@"S!@(``9`"`,H&`@`!D`(`Y@8"``&0`@#[!@(``9`"`!D'`@`!
-MD`(`)`<"``&0`@!1!P(``J0"`%\'`@`!D`(`A@<"``*D`@"4!P(``9`"`,8)
-M`@`!D`(`&PH"``+1`0!+"@(``M$!`+\*`@`"%`(`)0L"``)]`@`X"P(``M(!
-M`%P+`@`"R0$`_`L"``(4`@`C#`(``OD!`#H,`@`"O0$`5@P"``$&``!;#`(`
-M`J\"`'@,`@`"N@(`E0P"``*Z`@"P#`(``EH!`-L,`@`!D`(`K@T"``%!`0#/
-M#0(``M\!`*P.`@`"0`$`N`X"``)#`@"H#P(``K\!`.02`@`"0@(`8!,"``)@
-M`0"C$P(``K\!`$84`@`!`P``;A0"``(3`@"R%`(``A,"`/44`@`"$P(`-!4"
-M``(3`@!U%0(``J(!`,45`@`"%@(`518"``(X`0"/%@(``F$!`+\6`@`"I`(`
-M%AD"``(L`@`O&0(``O0!`/<9`@`"3`$`?AH"``+J`0"H&@(``DP!``D<`@`"
-M00(`)1P"``+3`0"='`(``D$"`-(<`@`"TP$`BQX"``(5`@!P'P(``H0"`(X?
-M`@`!`P``)2`"``(K`0`W(`(``BL!`.D@`@`"00(`'B$"``+3`0"J(0(``H@!
-M`.DA`@`"=`$`#2("``*(`0`C(@(``@("`$,B`@`"B`$`DR("``)\`0"S(@(`
-M`04``+@B`@`"KP(`)","``+)`0`T(P(``D<!`,0C`@`"#`(`0"0"``(,`@!.
-M)`(``A`"`'HD`@`"#`(`DR0"``+6`0"[)`(``G<!`%\E`@`"DP$`A"4"``+6
-M`0"J)0(``H<!`-<E`@`"#`(`WR4"``*'`0`$)@(``M8!`&8F`@`"+P$`L"8"
-M``+Q`0#5)@(``LD!``\G`@`"N@(`+R<"``(O`0!4)P(``E4!`&`G`@`"I`(`
-MK"<"``*Z`0"V)P(``@,"`,DG`@`!!@``SB<"``*O`@`$*`(``B\!`!DH`@`"
-MF@$`)"@"``*'`0"=*`(``9`"`,,H`@`!D`(`]"@"``&0`@`[*0(``04``$`I
-M`@`"KP(`D2D"``*^`0`&*@(``KX!`!PJ`@`"/`(`*"H"``*3`0#:*@(``D(!
-M`/DJ`@`"U@$`'RL"``+)`0"Q*P(``D(!`,HK`@`"U@$`$BP"``(W`@`M+0(`
-M`9`"`$8M`@`!D`(`7BT"``&0`@"Q+0(``9`"`,TM`@`!D`(`22X"``+W`0"D
-M+@(``9`"`,`N`@`!D`(`W"X"``&0`@#H+@(``G\!`,<O`@`"30$`_"\"``*$
-M`@#3,`(``H0"`$XQ`@`"A`(`=C$"``&0`@"F,0(``9`"`.(Q`@`!D`(`P3("
-M``*$`@#Q,P(``H0"`'HT`@`"A`(`C30"``$#```2-0(``J0"`%<U`@`!D`(`
-M>#4"``&0`@"=-0(``08``*(U`@`"KP(`L34"``+<`0#*-0(``9`"`/DU`@`!
-MD`(`;#8"``&0`@#M-@(``MP!``$W`@`"W`$`=S<"``$%``!\-P(``J\"`-LW
-M`@`!!@``X#<"``*O`@#T-P(``L@!`"<X`@`!!0``+#@"``*O`@#U.`(``04`
-M`/HX`@`"KP(`H3D"``)"`0"X.0(``M8!`&HZ`@`"KP$`O#L"``+(`0#0.P(`
-M`A0"`$$\`@`"@0$`ICP"``)"`0"R/`(``J\!`,D\`@`"U@$`'3T"``+)`0":
-M/0(``C$!`,L]`@`"R0$`5CX"``&0`@""/@(``LD!`+<^`@`"%`(`QSX"``*'
-M`0`$/P(``9`"`"<_`@`!D`(`5#\"``&0`@!H/P(``HX!`,@_`@`!D`(`+T`"
-M``&0`@!-0`(``9`"`%]``@`"9P$`B4`"``&0`@">0`(``9`"`/1``@`!D`(`
-M#4$"``&0`@`V00(``GT"`%9!`@`"Y@$`E4$"``+)`0#+00(``KH"`.=!`@`"
-M+P$`%4("``*-`0`A0@(``J0"`$A"`@`!`0``>4("``*=`@":0@(``9`"`*I"
-M`@`!D`(`R4("``&0`@#90@(``9`"``%#`@`!D`(`*T,"``&0`@!60P(``9`"
-M`&]#`@`!D`(`FT,"``&0`@#%0P(``9`"`!9$`@`!D`(`,D0"``&0`@!/1`(`
-M`9`"`&M$`@`!D`(`J40"``)]`@#K1`(``KH"``-%`@`"+P$`%$4"``)5`0`@
-M10(``J0"`$-%`@`!`P(`6$4"``*=`@!Y10(``9`"`)=%`@`!D`(`PD4"``&0
-M`@#@10(``9`"`"I&`@`"?0(`1D8"``+)`0!V1@(``KH"`)I&`@`!Q@$`LT8"
-M``*=`@#31@(``9`"`/!&`@`!D`(`#$<"``*D`@`<1P(``9`"`#='`@`!D`(`
-M5$<"``&0`@!P1P(``J0"`(!'`@`!D`(`I$<"``&0`@!>2`(``9`"`(9(`@`"
-MI`(`L4@"``&0`@#82`(``J0"``%)`@`!D`(`*DD"``*D`@!V20(``IP!`)1)
-M`@`"X`$`I$D"``*N`0#720(``JH!`!%*`@`"BP$`0TH"``*N`0`#2P(``J0"
-M`"E+`@`!D`(`1TL"``*D`@!G2P(``9`"`)!+`@`"I`(`MDL"``&0`@#82P(`
-M`J0"`/1+`@`!D`(`&$P"``+)`0"=3`(``B\!`.%,`@`"+P$`\4P"``*N`0`X
-M30(``LD!`%Y-`@`"R0$`@4T"``)]`@"930(``E4!`*5-`@`"I`(`5DX"``(4
-M`@!Y3@(``OD!`)!.`@`"O0$`JDX"``$&``"O3@(``J\"`,Q.`@`"N@(`Z4X"
-M``*Z`@`,3P(``EH!`#5/`@`"9`$`:4\"``+)`0"*3P(``E4!`)9/`@`"I`(`
-MQT\"``+Y`0#>3P(``KT!`/A/`@`!!@``_4\"``*O`@`:4`(``KH"`#=0`@`"
-MN@(`4E`"``):`0!O4`(``JH!`/10`@`!D`(`&U$"``*D`@`W40(``9`"`%=1
-M`@`!D`(`>E$"``*D`@"640(``9`"`!Q2`@`"Y@$`*%("``*Q`0!M4@(``@X"
-M`'Y2`@`"M0$`NU("``*D`@#34@(``9`"`.Y2`@`!D`(`$E,"``*N`0`:4P(`
-M`HP!`$53`@`"#P(`SE,"``+&`0#D4P(``LD!`'%4`@`"+@(`HU0"``*Z`0#<
-M5`(``AH"`/M4`@`"N@(`&U4"``*Z`@!,50(``J0"`&-5`@`!D`(`?%4"``&0
-M`@"<50(``JX!`*15`@`"C`$`[54"``*<`0`G5@(``LD!`*)6`@`"#P(`M%8"
-M``)M`0`E5P(``9`"`$97`@`!D`(`8U<"``(O`@!T5P(``K4!`-M7`@`"\`$`
-M^%<"``+6`0`:6`(``H<!`#]8`@`"#`(`1U@"``*'`0"*6`(``M8!`-%8`@`"
-M+P$`YE@"``+)`0`660(``KH"`"Y9`@`"+P$`/%D"``)5`0!(60(``J0"`&E9
-M`@`"`P(`E5D"``+6`0#'60(``B\!`.19`@`"R0$`_%D"``+Y`0`36@(``KT!
-M`#!:`@`"N@(`35H"``*Z`@!@6@(``EH!`'E:`@`"T@$`CEH"``&0`@#;6@(`
-M`JX!`.=:`@`"J@$`<%L"``&0`@"+6P(``L@!`)];`@`"%`(`OEL"``+(`0#&
-M6P(``MH!`.5;`@`!`P``!%P"``)R`0`H7`(``G(!`$Q<`@`"+P$`>UP"``+Q
-M`0"<7`(``DX!`,9<`@`"+P$`\5P"``+Q`0`270(``B\!`"Y=`@`"3@$`45T"
-M``(O`0!N70(``B\!`*1=`@`"50$`L%T"``*D`@`<7@(``C(!`#M>`@`"_0$`
-M55X"``+Y`0!L7@(``KT!`(9>`@`!!@``BUX"``*O`@"H7@(``KH"`,5>`@`"
-MN@(`V%X"``):`0`$7P(``LD!`$!?`@`"P0$`CE\"``+9`0"L7P(``LD!``!@
-M`@`!!0``!6`"``*O`@`O8`(``L@!`')@`@`!!0``=V`"``*O`@!*80(``04`
-M`$]A`@`"KP(`DF$"``$%``"780(``J\"`"=B`@`"C@$`+V,"``)"`0!D8P(`
-M`B<"`)QC`@`!!0``H6,"``*O`@#>9`(``H0"``)E`@`!D`(`+F4"``&0`@!J
-M90(``9`"`!YF`@`!!0``(V8"``*O`@!]9@(``04``()F`@`"KP(`K68"``$%
-M``"R9@(``J\"`.1F`@`!!@``Z68"``*O`@!D9P(``04``&EG`@`"KP(`L6<"
-M``$&``"V9P(``J\"`.EG`@`!!@``[F<"``*O`@#]9P(``08```)H`@`"KP(`
-M46@"``([`0"B:`(``9`"`+]H`@`!D`(`W&@"``&0`@#\:`(``9`"`!-I`@`!
-M!@``&&D"``*O`@"<:0(``9`"`,EI`@`!!@``SFD"``*O`@`):@(``04```YJ
-M`@`"KP(`)&H"``)_`0!":@(``9`"`--J`@`"AP$`\VH"``+B`0!X:P(``BD"
-M`)9K`@`"CP$`PFL"``*P`@#N:P(``K`"`!IL`@`"L`(`0VP"``*P`@!L;`(`
-M`K`"`*!L`@`"L`(`Q6P"``*P`@#K;`(``K`"`!=M`@`"L`(`/&T"``*P`@!H
-M;0(``K`"`)1M`@`"L`(`O&T"``*P`@#D;0(``K`"``QN`@`"L`(`-&X"``*P
-M`@!;;@(``K`"`(1N`@`"L`(`J6X"``*P`@#:;@(``H("``=O`@`"@@(`.V\"
-M``*"`@!L;P(``H("`)UO`@`"@@(`SF\"``*"`@#[;P(``H("`"]P`@`"@@(`
-M97`"``+)`0!Z<`(``@8"`/-P`@`!`0``!G$"``+#`0`6<0(``D,!`*5Q`@`"
-MR0$`X7$"``*Z`@#]<0(``B\!``MR`@`"50$`%W("``*D`@!'<@(``G8!`/AS
-M`@`"*0(`C'0"``*R`@#"=`(``K("`/]T`@`"L@(`/'4"``*R`@!V=0(``K("
-M`))U`@`"L@(`L'4"``*R`@`:=@(``K("`'5V`@`"L@(`TG8"``*R`@`;=P(`
-M`K("`'!W`@`"L@(`V'<"``*R`@`A>`(``K("`%9X`@`"UP$`97@"``*R`@"3
-M>`(``J0!`*)X`@`"L@(`T'@"``*D`0#?>`(``K("``UY`@`"I`$`''D"``*R
-M`@!*>0(``J0!`%EY`@`"L@(`O7D"``+D`0#2?`(``KT"`/5\`@`"O0(`&'T"
-M``*]`@`[?0(``KT"`%=]`@`"O0(`<WT"``*]`@"N?0(``LD!`!-^`@`"O0(`
-M37X"``+)`0"[?@(``KT"`/Y^`@`"R0$`<G\"``)%`0"]?P(``9`"`.)_`@`!
-MD`(`_G\"``*U`0!!@`(``B\!`%2``@`"50$`8(`"``*D`@""@`(``OD!`)^`
-M`@`"N@(`O(`"``*Z`@#3@`(``EH!`.*``@`!D`(`/X$"``+1`0!O@0(``KH"
-M`-F!`@`"/`(`%(("``+)`0"+@@(``04``)""`@`"KP(`Q8("``+(`0`(@P(`
-M`04```V#`@`"KP(`TH,"``$%``#7@P(``J\"``F$`@`!!@``#H0"``*O`@"1
-MA`(``04``):$`@`"KP(`684"``$&``!>A0(``J\"`&:%`@`"C@$`;X8"``+6
-M`0"7A@(``D(!`+N&`@`"]P$`_H8"``(W`@#<B@(``L\!`#R+`@`"A`(`4(L"
-M``(H`@#*BP(``H0"`!F,`@`"!@(`*XP"``)$`@`]C`(``D,"`&:,`@`"A`(`
-MJ(P"``&F`0#]C`(``L,!`!Z-`@`"+`$`*HT"``)#`0!YC0(``@8"`(N-`@`"
-M1`(`G8T"``)#`@#NC0(``:8!`$..`@`"PP$`9(X"``(L`0!PC@(``D,!`-V.
-M`@`"!@(`\XX"``)$`@`)CP(``D,"`"Z/`@`"A`(`98\"``$V`@"/CP(``L,!
-M`+"/`@`"+`$`P(\"``)#`0`BD`(``L\!`$V0`@`""`(`B9`"``(&`@";D`(`
-M`D0"`*V0`@`"0P(`\Y`"``$V`@`?D0(``L,!`$"1`@`"+`$`3)$"``)#`0#M
-MD0(``FP!`"R2`@`";`$`?)("``*S`0"0D@(``E(!`,*2`@`"7`$`XI("``)2
-M`0`6DP(``E(!`.N3`@`">P$`/I0"``*T`0!WE`(``EP!`+B4`@`"!@(`RI0"
-M``)$`@#<E`(``D,"`"*5`@`!"@(`2I4"``+#`0!KE0(``BP!`'>5`@`"0P$`
-M498"``(N`0!=E@(``D,"`(^6`@`"A`(`T98"``(N`0#=E@(``D,"`'.7`@`"
-M9@$`B)<"``(N`0"4EP(``D,"`*^7`@`"?0(`PY<"``%4`0#8EP(``IT"`$>8
-M`@`"\@$`-)D"``+M`0!TF0(``NT!`*Z9`@`"7`$`ZIH"``*#`0#_F@(``G$!
-M`!2;`@`"J0$`*9L"``)F`0!#FP(``GT"`%>;`@`!5`$`<9L"``*=`@"DFP(`
-M`LD!`!B<`@`"+@(`/IP"``*Z`0!EG`(``AH"`+2<`@`"R0$`\IP"``)<`0`G
-MG0(``L$!`%&=`@`"+@$`99T"``)#`@"AG0(``EP!`&N>`@`!D`(`!J,"``(U
-M`@`/I`(``0,``*BD`@`!D`(`V*0"``&0`@`#I0(``9`"`#RE`@`!D`(`CZ4"
-M``&0`@"]I0(``9`"`..E`@`!D`(`%:8"``&0`@#6I@(``0,``.NF`@`!`P``
-M_J8"``$#```,IP(``0,``!^G`@`"_@$`*J<"``$#``"NIP(``LD!`.ZG`@`"
-MR0$`'J@"``+)`0!NJ`(``LD!`)ZH`@`"R0$`)*D"``+)`0"`J@(``D(!`/&K
-M`@`"R`$`.*P"``+K`0!XK`(``NL!`&&M`@`"+@$`<JT"``*)`0![K@(``D,!
-M`**N`@`"90$`L:X"``(U`@#&K@(``M8!`#&O`@`"\`$`EZ\"``*3`0!HL`(`
-M`D,"`-JP`@`"=0$`Z+`"``)#`@`FL0(``LD!`#"Q`@`":`$`.+$"``)'`0!L
-ML0(``@8"`'JQ`@`"1`(`D[$"``)#`@#1L0(``3,!`-VQ`@`"0P$`(+("``(&
-M`@!7L@(``3,!`&.R`@`"0P$`H;("``(&`@"SL@(``D0"`,6R`@`"0P(`#+,"
-M``$!```@LP(``L,!`$&S`@`"+`$`3;,"``)#`0"-LP(``@8"`,BS`@`!FP$`
-MU+,"``)#`0#FLP(``J0"`/BS`@`"I`(`W;0"``(N`0#NM`(``HD!`/JT`@`"
-M0P(`,[4"``(-`@!1M0(``BX!`&*U`@`"B0$`;K4"``)#`@!LM@(``J0"`'BV
-M`@`"0P(`J+8"``(-`@"XM@(``J0"`,2V`@`"0P(`_+8"``(&`@`_MP(``A,"
-M`$^W`@`"0P(`8[<"``$S`0!OMP(``D,!`+"W`@`"!@(`RK<"``)$`@#CMP(`
-M`D,"`#VX`@`!,P$`4+@"``+#`0!NN`(``BP!`'JX`@`"0P$`R;@"``(&`@#D
-MN`(``D0"`/VX`@`"0P(`4[D"``$S`0!GN0(``L,!`(FY`@`"+`$`E;D"``)#
-M`0#0N0(``@8"`.JY`@`"1`(``[H"``)#`@!6N@(``3,!`&ZZ`@`"PP$`D+H"
-M``(L`0"<N@(``D,!`."Z`@`"!@(`^KH"``)$`@`3NP(``D,"`%Z[`@`!,P$`
-M<KL"``+#`0"4NP(``BP!`*"[`@`"0P$`_[L"``(&`@"UO`(``0$``,B\`@`"
-MPP$`U+P"``)#`0`!OP(``G(!`!Z_`@`"=0$`;+\"``+)`0`_P`(``@P"`*/`
-M`@`"!@(`Q,`"``+_`0#6P`(``D,"`"K!`@`!6P$`/<$"``+#`0!)P0(``D,!
-M`)K!`@`"!@(`K,$"``+_`0`!P@(``5L!`!3"`@`"PP$`(,("``)#`0`LP@(`
-M`J0"`''"`@`"!@(`?\("``+_`0#*P@(``5L!`-W"`@`"PP$`Z<("``)#`0`I
-MPP(``@8"`#?#`@`"_P$`?<,"``%;`0"0PP(``L,!`)S#`@`"0P$`T<,"``*B
-M`0#APP(``D`"`,W$`@`"H@$`W<0"``)``@!%Q0(``DD!`,3%`@`"L@$`+<8"
-M``(T`@!=Q@(``J(!`&W&`@`"0`(`V<8"``(2`@`XQP(``B4"`)+'`@`"0@$`
-MLL<"``+P`0#(QP(``B4"`!'(`@`"0@$`)\@"``(E`@!0R`(``GT"`(/(`@`"
-M?0(`U<@"``*>`0`=R0(``D(!`#?)`@`"DP$`0\D"``(\`@#TR0(``LD!``;*
-M`@`"V0$`'<H"``$[`0`RR@(``IT"`*[*`@`"R0$`P,H"``(\`@#9R@(``3`"
-M`/3*`@`"G0(`H<L"``)"`0"MRP(``J\!`+G+`@`"#`(`7\P"``$[`0!TS`(`
-M`IT"`/C,`@`!,`(`$\T"``*=`@"4S@(``LD!`/G.`@`"0`$`#<\"``)#`@!7
-MSP(``O$!`(K/`@`"N@$`M<\"``)&`0#5SP(``LD!`%30`@`"+@(`;]`"``)`
-M`0"#T`(``D,"`.O0`@`"+P$`%-$"``)5`0`@T0(``J0"`$O1`@`",@$`:M$"
-M``+]`0"7T0(``OD!`*[1`@`"O0$`R-$"``$&``#-T0(``J\"`.K1`@`"N@(`
-M!]("``*Z`@!"T@(``EH!`&32`@`"R0$`EM("``+!`0#7T@(``B\!``C3`@`"
-M50$`%-,"``*D`@`_TP(``C(!`%[3`@`"_0$`>],"``+Y`0"6TP(``KT!`+#3
-M`@`!!@``M=,"``*O`@#6TP(``KH"`._3`@`!!@``]-,"``*O`@`5U`(``KH"
-M`)S4`@`"N@(`_-0"``+)`0`ZU0(``KH"`%S5`@`"6@$`H-4"``(&`@"RU0(`
-M`D0"`,O5`@`"0P(`.=8"``$S`0!,U@(``L,!`&K6`@`"+`$`=M8"``)#`0"C
-MU@(``J(!`+/6`@`"0`(`CM<"``(E`@#'UP(``D`"`![8`@`"R0$`*=H"``*$
-M`@#LVP(``O(!`"3<`@`"'`(`K]P"``$!``#=W`(``GD!`+G=`@`!`0``_-T"
-M``)Y`0#%W@(``0$```O?`@`">0$`==\"``$!``"SWP(``GD!``7@`@`!`0``
-M0^`"``)Y`0`<X0(``AT"`)7A`@`"-`$`G^("``+>`0`SXP(``K<!`+KC`@`"
-M\@$`[>,"``(>`@`8Y`(``L(!`$SE`@`"'`(`$N<"``+.`0!>YP(``MX!``+H
-M`@`"MP$`>>@"``)>`0``Z0(``K<!`,#I`@`"MP$``>H"``(<`@!\Z@(``K<!
-M`,CJ`@`"MP$`*>L"``*W`0!SZP(``K<!`+ON`@`"MP$`$^\"``&0`@`K[P(`
-M`9`"`*OP`@`"VP$`&/("``&0`@`S\@(``9`"`%/R`@`"0P(`L/("``*D`@"_
-M\@(``9`"`.+R`@`"I`(`\?("``&0`@#I\P(``J0"`/7S`@`!D`(`!_0"``*D
-M`@`.]`(``9`"`"OT`@`"I`(`,_0"``&0`@!:]`(``J0"`&;T`@`!D`(`>/0"
-M``*D`@!_]`(``9`"`)ST`@`"I`(`I/0"``&0`@#H]`(``J0"`$CU`@`"I`(`
-M6?4"``)5`0"W]0(``@8"`"/V`@`!.@$`+_8"``&G`0`^]@(``D,!`([V`@`"
-M!@(`_/8"``%0`0`(]P(``D,!`(?W`@`!D`(`J/<"``&0`@`'^`(``N$!`!?X
-M`@`"2P$`:O@"``(&`@"S^`(``5`!`+_X`@`"0P$`1_D"``&0`@!H^0(``9`"
-M`+_Y`@`"*@$`S_D"``)+`0!#^@(``@8"`(KZ`@`!.@$`EOH"``&G`0"E^@(`
-M`D,!`.OZ`@`"!@(`2/L"``$!``!7^P(``D,!`'[[`@`!70$`X?L"``*D`@#H
-M^P(``9`"`/K[`@`"I`(``?P"``&0`@"1_`(``J0"`)C\`@`!D`(`JOP"``*D
-M`@"Q_`(``9`"`$?]`@`".0(`?/T"``(@`@"$_0(``ML!`-K]`@`!D`(`[_T"
-M``&0`@`+_@(``9`"`##^`@`!D`(`@OX"``()`@"*_@(``BT!`/;^`@`"I`(`
-M"?\"``&0`@`O_P(``J0"`$+_`@`!D`(`20(#``(A`@#_`@,``O(!`&D$`P`"
-M\@$`CP0#``+R`0`#!0,``FL!``T&`P`"I`(`-`8#``*D`@#_!@,``C\!`"`'
-M`P`"Z0$`.@<#``$D`@!(!P,``20"`,H'`P`!D`(`]@<#``&0`@`F"`,``J0"
-M`#L(`P`!D`(`@@@#``&0`@#@"`,``9`"`$D)`P`!D`(`N@D#``*D`@#,"0,`
-M`9`"`.T)`P`"[P$`^0D#``(!`@`/"@,``J0"`"L*`P`"I`(`1PH#``*D`@!I
-M"@,``HT!`'L*`P`!D`(`S`H#``*D`@#;"@,``9`"`/P*`P`"[P$`"`L#``(!
-M`@`>"P,``J0"`#H+`P`"I`(`5@L#``*D`@!X"P,``HT!`(H+`P`!D`(`N@L#
-M``*D`@#&"P,``JX!`.0+`P`"C`$`[PL#``&0`@`'#`,``9`"`!X,`P`!D`(`
-M\PP#``&0`@!S#0,``@8"`(T-`P`"1`(`I@T#``)#`@`$#@,``0$``!@.`P`"
-MPP$`.0X#``(L`0!%#@,``D,!`'\/`P`!!0``A`\#``*O`@`Z$`,``04``#\0
-M`P`"KP(`4Q`#``+!`0!T$`,``L0!`%P1`P`"[@$`S!$#``%!`0#M$0,``M\!
-M``42`P`"L0$`A1(#``+N`0"8$@,``IT!`,H2`P`"&@(`91,#``)M`0!O$P,`
-M`CT"`!L4`P`"P0$`?Q0#``+)`0#?%`,``BX"``(5`P`"N@$`$Q4#``(:`@"K
-M%0,``ID!`#@6`P`"R0$`L18#``*9`0!+%P,``KH"`&H7`P`"N@(`GQ<#``*9
-M`0`(&`,``KH"`%,8`P`"N@(`DA@#``(O`0"X&`,``E4!`,08`P`"I`(`[Q@#
-M``(R`0`.&0,``OT!`"<9`P`"^0$`/AD#``*]`0!8&0,``08``%T9`P`"KP(`
-M>AD#``*Z`@"3&0,``08``)@9`P`"KP(`M1D#``*Z`@#]&0,``KH"`$`:`P`"
-M6@$`8QH#``*Z`@#`&@,``N8!`.P:`P`"P0$`!1L#``*Q`0!*&P,``@X"`(P;
-M`P`!`P``]QL#``+1`0`<'`,``JP!`$$<`P`"K`$`9AP#``*L`0"+'`,``JP!
-M`+@<`P`"H`$`Y1P#``*@`0`<'0,``J`!`$D=`P`"H`$`51T#``*D`@",'0,`
-M`J`!`+D=`P`"H`$`Q1T#``*D`@#J'0,``JP!``\>`P`"K`$`-!X#``*L`0!A
-M'@,``J`!`(8>`P`"K`$`S!X#``*D`@!&'P,``9`"`&0?`P`!D`(`>A\#``*D
-M`@"8'P,``KH!`*D?`P`"I`(`R1\#``*L`0#5'P,``J0"`/H?`P`"K`$`!B`#
-M``*D`@`](`,``J`!`$D@`P`"I`(`;B`#``*L`0!Z(`,``J0"`(\@`P`"A`$`
-MI"`#``+E`0#1(`,``J`!`/X@`P`"H`$`*R$#``*@`0!8(0,``J`!`'TA`P`"
-MK`$`CB$#``*D`@"N(0,``JP!`+HA`P`"I`(`YR$#``*@`0`,(@,``JP!`#DB
-M`P`"H`$`32(#``(]`@!R(@,``JP!`'XB`P`"I`(`LB(#``*@`0"^(@,``J0"
-M`.`B`P`"K`$`["(#``*D`@`!)`,``BX!``TD`P`"0P(`:R0#``&0`@"*)`,`
-M`9`"`+PD`P`!D`(`X20#``(N`0#M)`,``D,"`/DD`P`"T0$`(24#``+1`0!E
-M)@,``@X"`'$F`P`"I`(`ER8#``(.`@"C)@,``J0"`"HG`P`!D`(`0R<#``&0
-M`@"*)P,``J0"`*LG`P`"N@$`QR<#``(``@#<)P,``@`"`.PG`P`"I`(`$"@#
-M``&0`@`N*`,``9`"`$8H`P`"I`(`6R@#``$%``!@*`,``J\"`&TH`P`"!@(`
-MLB@#``$!``"^*`,``D,!`-,H`P`!!@``V"@#``*O`@#E*`,``@8"`"HI`P`!
-M`0``-BD#``)#`0!=*0,``@8"`*DI`P`!`0``N"D#``)#`0#,*0,``@8"`!@J
-M`P`!`0``)RH#``)#`0`[*@,``@8"`(`J`P`!`0``C"H#``)#`0"F*@,``@8"
-M`.LJ`P`!`0``]RH#``)#`0`+*P,``@8"`%@K`P`!`0``9"L#``)#`0"A*P,`
-M`NX!`,DK`P`"F@$`+2P#``+1`0!S+`,``M$!`(4L`P`"R0$`W"P#``(N`@`(
-M+0,``KH!`"(M`P`"&@(`3"T#``+)`0"M+0,``BX"`-DM`P`"N@$`\RT#``(:
-M`@`K+@,``LD!`%8N`P`"7`$`>2X#``+!`0"Y+P,``BX!`,4O`P`"0P(`-C`#
-M``*D`@!],`,``O$!`)(P`P`"N@$`Z#`#``$%``#M,`,``J\"``@Q`P`"O`$`
-M>#$#``*D`@#M,0,``BX!`/DQ`P`"0P(`$3(#``(N`0`=,@,``D,"`"DR`P`"
-MN@$`$3,#``*[`0`K,P,``KL!`$4S`P`"8@$`5S,#``+%`0!I,P,``NP!`($S
-M`P`"@@$`DS,#``*P`0"E,P,``CH"`+DS`P`"*P(`Y#,#``+)`0!%-`,``BX"
-M`'(T`P`"N@$`C#0#``(:`@#F-`,``EP!`/@T`P`"R0$`'C4#``$&```C-0,`
-M`J\"`#,U`P`"7`$`6C4#``+!`0"X-@,``OL!`,(V`P`!`P``(S<#``*Q`0"\
-M-P,``NX!`-,W`P`"G0$`%C@#``(:`@"M.`,``LD!`-\X`P`"/`$`)3D#``+R
-M`0#%.0,``KH"```Z`P`"+P$`&#H#``)5`0`D.@,``J0"`$\Z`P`",@$`;CH#
-M``+]`0"..@,``OD!`*DZ`P`"O0$`RCH#``*Z`@#K.@,``KH"`!\[`P`"6@$`
-MF3L#``(\`0"P.P,``O8!`&8\`P`"\@$`[CT#``(N`@`%/@,``AH"`#4^`P`"
-M7`$`2#X#``*Q`0"R/@,``LD!`.<^`P`"/`$`+S\#``(\`0!Q/P,``CP!`(P_
-M`P`"\@$`SS\#``)1`0`E00,``N<!`$M!`P`"R0$`:4$#``(O`0!W00,``E4!
-M`(-!`P`"I`(`I4$#``+Y`0"\00,``KT!`-E!`P`"N@(`]D$#``*Z`@`B0@,`
-M`EH!`$)"`P`"9`$`IT(#``('`@#20@,``CP!`!=#`P`"/`$`5D,#``(\`0!I
-M0P,``E$!`'U#`P`"Q`$`M4,#``)1`0`H10,``K$!`%M&`P`"+@(`;48#``(:
-M`@"V1@,``L$!`/]&`P`"/`$`)D<#``*6`0""1P,``HL!`(I'`P`!00$`JT<#
-M``+?`0#*1P,``J,!`-9'`P`"BP$`#D@#``(``@`>2`,``J0"`&5(`P`"6@$`
-M>D@#``(X`@"G2`,``M$!`,E(`P`"?0(`V$@#``+2`0#L2`,``LD!``I)`P`"
-M^0$`(4D#``*]`0`^20,``KH"`%M)`P`"N@(`<DD#``):`0"320,``LD!`*-)
-M`P`"L0$`W$D#``*Z`0"A2@,``BX!`*U*`P`"0P(`"4L#``$%```.2P,``J\"
-M`"A+`P`"6@$`-$L#``)#`@!I2P,``K4!`)I+`P`"I`(`IDL#``)#`@#"2P,`
-M`@X"`-!+`P`"I`(`W$L#``)#`@#H2P,``E<!`$E,`P`"R0$`K4P#``*Z`0`6
-M3@,``J`!`'-.`P`"+@$`@TX#``)#`@"83@,``M$!`+U.`P`!`P``[4X#``&0
-M`@`S3P,``9`"`%9/`P`!D`(`K$\#``&0`@#+3P,``9`"`"!0`P`!D`(`6U`#
-M``(N`0!K4`,``D,"`'M0`P`"P0$`MU`#``(N`0#'4`,``D,"`-50`P`!XP$`
-MZE`#``*=`@`#40,``J0"`#-1`P`"PP(`7U$#``&0`@!^40,``9`"`(-1`P`"
-MPP(`\5$#``+)`0!'4@,``OD!`&Q2`P`"O0$`FU(#``*Z`@`M4P,``08``#)3
-M`P`"KP(`4U,#``*Z`@!Z4P,``EH!`*!3`P`!D`(`OU,#``&0`@`&5`,``LD!
-M`$)4`P`"L0$`:U0#``)5`0!W5`,``J0"`*Y4`P`!D`(`S50#``&0`@"P50,`
-M`9`"`,U5`P`!D`(`4U8#``*5`0!R5@,``B4"`*=6`P`!D`(`PU8#``&0`@#Q
-M5@,``9`"``U7`P`!D`(`5U<#``&0`@!V5P,``9`"`*A7`P`!D`(`U5<#``(N
-M`0#E5P,``D,"`/%7`P`"T0$`!%@#``)5`0`06`,``J0"`#E9`P`"+@$`15D#
-M``)#`@")60,``BX!`)59`P`"0P(`J5D#``(:`@"]6@,``H0"`!%;`P`!!@``
-M%EL#``*O`@`K6P,``BX!`#=;`P`"0P(`8%L#``+)`0#76P,``LD!`$9<`P`"
-M&@(``%T#``*D`@!^70,``J0"`-)=`P`"I`(`\5T#``(N`0#]70,``D,"`!%>
-M`P`"&0(`+5\#``*D`@!R7P,``J0"`)%?`P`"+@$`G5\#``)#`@"Q7P,``AD"
-M`/!?`P`"I`(`0&`#``*D`@"98`,``J0"`,I@`P`"J`$`\6`#``(N`0#]8`,`
-M`D,"``EA`P`"&@(`4&$#``&0`@`V9`,``C`!`%9D`P`",`$`@60#``(P`0`V
-M90,``C`!`%9E`P`",`$`@V4#``(P`0#390,``I4!`!)F`P`"X0$`8&8#``+-
-M`0"\9@,``CT!`,1F`P`"A@$`TV8#``$#```?9P,``F,!`#MG`P`"G`$`F&<#
-M``*D`@"Z;`,``0D``,IL`P`!"0``VFP#``)?`0`P;0,``A<"`!IN`P`"I0$`
-M1VX#``(+`@!:;@,``J4!`#%O`P`"R0$`BV\#``+=`0"P;P,``H0"`-EO`P`"
-M3P$`7G`#``*A`0"=<`,``IP!`/IP`P`"P`$`*G(#``*D`@!3<P,``0D``&1S
-M`P`!"0``=',#``)?`0"K<P,``0D``+QS`P`!"0``S',#``)?`0!3=`,``9`"
-M`*)T`P`!D`(`PW0#``)3`0#;=`,``E,!`/-T`P`"4P$`"W4#``)3`0`C=0,`
-M`E,!`#MU`P`"4P$`674#``&0`@"D=0,``9`"`-1U`P`!D`(`?78#``)3`0#;
-M=@,``@8"`.UV`P`"_P$`?G<#``*$`@"W=P,``H0"`+YW`P`!^@$`T7<#``+#
-M`0#==P,``D,!`"1X`P`"!@(`-G@#``+_`0"/>`,``?H!`*)X`P`"PP$`KG@#
-M``)#`0`*>0,``HH!`!AY`P`"50$`)'D#``*D`@!>>0,``H`!`&QY`P`"50$`
-M>'D#``*D`@"B>0,``HH!`+1Y`P`"50$`P'D#``*D`@`->@,``H`!`*=Z`P`"
-M0`$`LWH#``)#`@!B?0,``CL"`'A]`P`"D`$`9GX#``*X`0![?@,``=@!`-!^
-M`P`".P(`YGX#``*0`0"*?P,``K@!`-%_`P`"N`$`E(`#``)P`0"M@`,``GT!
-M`,Z``P`"RP$`,X$#``$#``"4A`,``LH!`!J%`P`"R@$`-H4#``*$`@`@A@,`
-M`F`!`(R'`P`!D`(`HX<#``&0`@"SAP,``J0"`/Z'`P`!!P``1H@#``&0`@!Y
-MB`,``0<``)N(`P`!!P``XX@#``&0`@!8B0,``0<``*")`P`!D`(`TXD#``$'
-M``#UB0,``0<``#V*`P`!D`(`IHH#``$'``"WB@,``0<``$J+`P`!D`(`WXL#
-M``&0`@!RC`,``9`"`)R,`P`"I`(`:(T#``(^`0`GD`,``O@!`)^1`P`!`P``
-MKI$#``$'``"XD0,``0<``,.1`P`!!P``S9$#``$'```6E@,``0<``!N6`P`"
-M=0(`H98#``)?`0"QE@,``J0"`,V6`P`"(P(`^)8#``$&``#]E@,``J\"`$67
-M`P`"F0(`7Y<#``*9`@!YEP,``ID"`/&7`P`"*0(`$I@#``*C`@`OF`,``J,"
-M`%"8`P`"HP(`;9@#``*C`@".F`,``J,"`*N8`P`"HP(`S)@#``*C`@#IF`,`
-M`J,"`":9`P`"HP(`/9D#``*C`@!KF0,``J,"`(B9`P`"HP(`J9D#``*C`@#&
-MF0,``J,"`.>9`P`"HP(`!)H#``*C`@`EF@,``J,"`$*:`P`"HP(`8YH#``*C
-M`@"`F@,``J,"`*&:`P`"HP(`OIH#``*C`@#?F@,``J,"`/R:`P`"HP(`'9L#
-M``*C`@`ZFP,``J,"`%N;`P`"HP(`>)L#``*C`@"9FP,``J,"`+:;`P`"HP(`
-MUYL#``*C`@#TFP,``J,"`!6<`P`"HP(`,IP#``*C`@!3G`,``J,"`'"<`P`"
-MHP(`D9P#``*C`@"NG`,``J,"`..<`P`"T@(`%)T#``+2`@!)G0,``M("`'J=
-M`P`"T@(`KYT#``+2`@#@G0,``M("`!6>`P`"T@(`1IX#``+2`@![G@,``M("
-M`*R>`P`"T@(`X9X#``+2`@`2GP,``M("`$>?`P`"T@(`>)\#``+2`@"MGP,`
-M`M("`-Z?`P`"T@(``Z`#``)*`0`+H`,``K8!`!F@`P`"M@$`(:`#``*8`0`M
-MH`,``J0"`#6@`P`"S`$`1:`#``*1`0!5H`,``I$!`)&@`P`"D0$`HZ`#``*1
-M`0#,H`,``JT!`-^@`P`"K0$`_*`#``*M`0`/H0,``JT!`"NA`P`"50$`?*$#
-M``(&`@#:H0,``0$``.JA`P`"0P$`)Z(#``(O`0`[H@,``J0"`$>B`P`"50$`
-MEJ(#``)#`@#_H@,``@8"`'6C`P`!`0``A:,#``)#`0#"HP,``B\!`-:C`P`"
-MI`(`XJ,#``)5`0`DI`,``D0"`)ND`P`!`0``JZ0#``+#`0#0I`,``BP!`.2D
-M`P`"0P$`(:4#``(O`0`UI0,``J0"`$&E`P`"50$`>:4#``(N`0"7I0,``D,"
-M`*.E`P`"!@(`OZ4#``(N`0#)I@,``0$``-VF`P`"PP$`!J<#``(L`0`:IP,`
-M`D,!`%>G`P`"+P$`:Z<#``*D`@!WIP,``E4!`+FG`P`"+@$`U:<#``)#`@!E
-MJ`,``@8"`(VH`P`!!@``DJ@#``*O`@"@J`,``D0"`+RH`P`"0P(`^:@#``*Z
-M`@`8J0,``B\!`&FI`P`"A`(`3:H#``(J`@"-J@,``0$``*&J`P`"PP$`RJH#
-M``(L`0#EJ@,``D,!`">K`P`"+P$`.ZL#``*D`@!'JP,``E4!`).K`P`"A`(`
-MQZL#``(N`0#@JP,``HD!`/2K`P`"0P(`'*P#``*Z`@#@K`,``BX!`/&L`P`"
-MB0$`_:P#``)#`@#"K0,``B\!`!"N`P`"+@(`6*X#``+1`0!NK@,``KH!`(VN
-M`P`"&@(`QZX#``+S`0#1KP,``M0!`/.O`P`"-`(`$[`#``*\`@!'L`,``DH!
-M`$^P`P`"T`$`5[`#``+0`0!?L`,``K8!`&NP`P`"M@$`=[`#``*8`0"#L`,`
-M`J0"`(NP`P`"S`$`G[`#``%O`0"ZL`,``IT"`,JP`P`"P0$`[+`#``+5`0#Z
-ML`,``M4!`!FQ`P`!"0``)K$#``$)``!#L0,``0<``$VQ`P`!!P``;K$#``%J
-M`0!\L0,``0<``(*Q`P`!:@$`B+$#``$'``".L0,``6H!`)2Q`P`!!P``FK$#
-M``%J`0"AL0,``6H!`+>Q`P`!:@$`OK$#``%J`0#-L0,``6H!`-2Q`P`!:@$`
-MW;$#``%J`0#DL0,``6H!`/.Q`P`!:@$``+(#``$'```:L@,``6H!`"BR`P`!
-M:@$`-[(#``%J`0`^L@,``6H!`$>R`P`!:@$`3K(#``%J`0!FL@,``0<``'BR
-M`P`!`P``M;(#``$#``#9L@,``0<``.JR`P`!!P``%K,#``%J`0`DLP,``6H!
-M`$ZS`P`!:@$`=+,#``%J`0"!LP,``6H!`-.S`P`"?@(`Y[,#``$#``!?M`,`
-M`OT!`(6T`P`",@$`C;0#``+S`0"RM`,``KT!`,RT`P`"O0$`8;4#``$%``!F
-MM0,``J\"`'BU`P`"!@(`O[4#``$%``#$M0,``J\"``:V`P`!`0``$K8#``)#
-M`0!/M@,``B\!`&.V`P`"I`(`:[8#``)5`0"OM@,``@8"`-&V`P`"1`(`\K8#
-M``)#`@!,MP,``0$``&"W`P`"PP$`@;<#``(L`0"1MP,``D,!`,ZW`P`"+P$`
-MXK<#``*D`@#NMP,``E4!`"&X`P`"O`$`2[@#``(N`0!;N`,``D,"`'>X`P`"
-M0P(`QK@#``$#```!N0,``I0!`$6Y`P`"A0$`?;D#``*Z`@"8N0,``B\!`*JY
-M`P`"I`(`LKD#``)5`0#NN0,``KH"``FZ`P`"/@(`&[H#``(;`@#VN@,``04`
-M`/NZ`P`"KP(`+KL#``)]`@`_NP,``0$``%2[`P`"G0(`P;T#``+]`0#JO0,`
-M`C(!`!B^`P`"R0$`A+X#``+)`0#9O@,``KH"`!B_`P`"R0$`>K\#``*Z`@#`
-MP`,``I0!`!;!`P`"U`$`,<$#``*]`0!IP0,``E4!`)3!`P`"P0$`L<$#``)]
-M`@#%P0,``6\!`-K!`P`"G0(`-<,#``+S`0"6PP,``0,``,K#`P`"60$`,\0#
-M``)9`0"<Q`,``ED!``7%`P`"60$`3\8#``$#``"2Q@,``ED!``''`P`"60$`
-M9L<#``)9`0#+QP,``ED!`#'(`P`"60$`EL@#``)9`0#@R`,``IL"`!3)`P`"
-M60$`7LD#``*;`@"2R0,``ED!`-S)`P`"FP(`$,H#``)9`0!:R@,``IL"`([*
-M`P`"60$`Y,H#``*5`0`BRP,``I4!`&#+`P`"E0$`GLL#``*5`0#<RP,``I4!
-M`!?,`P`"E0$`P,P#``$)``#+S`,``0D``.G.`P`"C`(`$L\#``*,`@!4SP,`
-M`0,``&G/`P`!!P``=<\#``$'``"!SP,``0<``(K/`P`!!P``D,\#``$'``"M
-MSP,``0<``.W/`P`"Q@(`(=`#``*_`@!6T`,``6H!`&/0`P`!:@$`C]`#``%J
-M`0"LT`,``6H!`+70`P`!:@$`O-`#``%J`0#8T`,``6H!`.;0`P`!:@$`.=(#
-M``+S`0"STP,``J4!`.'3`P`""P(`]M,#``*E`0!UUP,``J4!`*/7`P`""P(`
-MN-<#``*E`0!EVP,``J4!`)/;`P`""P(`J-L#``*E`0`EWP,``J4!`%/?`P`"
-M"P(`:-\#``*E`0"PX0,``@8"`'_C`P`"A`(`T^0#``$!``!!Y0,``BH"`%'E
-M`P`"PP$`<>4#``(L`0"1Y0,``L,!`*?E`P`"1`(`W.4#``(L`0#QY0,``GX!
-M`";F`P`"+`$`9>8#``*$`@#7Y@,``H0"`!'G`P`"0P$`(^<#``)#`@"IZ0,`
-M`L8"`-#I`P`"Q@(`"^L#``(N`@!;ZP,``LD!`*WK`P`"N@$`WNL#``+1`0`<
-M[`,``HT!`$'L`P`"&@(`;.P#``+)`0#'[`,``ID!``7M`P`!G`(`#NT#``&<
-M`@`A[0,``50"`%+M`P`!D@(`&.X#``&2`@!H[@,``F4"`.7N`P`!2@(`\.X#
-M``%*`@#Y[@,``50"``3O`P`!5`(`&.\#``%*`@"B[P,``4H"`)'P`P`!D@(`
-M0?$#``*G`@!Z\0,``J<"`/?Q`P`"IP(`'/(#``+#`@"&\@,``J<"`+#R`P`"
-M=P(`T/(#``*G`@#L\@,``L,"`,GS`P`"PP(`/O0#``)]`@#*]`,``6`"`-_T
-M`P`"?0(`\_0#``%6`@`%]0,``IT"`(KU`P`!8`(`G_4#``)]`@"S]0,``58"
-M`,7U`P`"G0(`_/4#``*R`@!>]@,``HT"`*KV`P`"T0(`]/8#``*I`@`U]P,`
-M`;4"`&WW`P`"40(`>_@#``+``@"D^`,``F$"`+KX`P`!I0(`RO@#``)J`@#7
-M^`,``E("`.GX`P`"7`(`7_D#``$)``!\^0,``0D``(SY`P`!"0``G/D#``'.
-M`@"\^0,``K("`,OY`P`!`0``UOD#``$)``#W^0,``J,"``OZ`P`!"0``.OH#
-M``&W`@!`^@,``0D``$3Z`P`!TP(`2OH#``$)``!2^@,``0D``&#Z`P`!"0``
-M9?H#``*=`@#)^@,``4H"`!#[`P`"TP(`.OL#``*D`@!"^P,``H4"`)7[`P`"
-M8@(`V_L#``*C`@#U^P,``J,"`%W\`P`"HP(`A?P#``)O`@!0_0,``H$"`%O]
-M`P`"L@(`I/T#``*C`@#$_0,``DP"`#[^`P`"L`(`7OX#``*P`@!I_@,``4H"
-M`*G^`P`"L`(`ROX#``*P`@#L_@,``K`"`!#_`P`"L`(`-_\#``*P`@!:_P,`
-M`H8"`'7_`P`"L`(`>_\#``%*`@#$_P,``9("`,G_`P`"M@(`X_\#``&2`@!)
-M``0``9("`%4`!``!I0(`?@`$``):`@"7``0``K("`*\`!``!"0``N@`$``$)
-M``"A`00``J,"`+@!!``!D@(`^0$$``*!`@`J`@0``J,"`$`"!``!2@(`?0($
-M``&2`@#(\@,``J<"`&#S`P`"=P(`X/,#``)W`@#5]@,``J,"`"[[`P`"IP(`
-MOP($``$!``#8`@0``0<``'P#!``!`0``D`4$``*S`@#S!00``J8"`!L&!``!
-M`0``1`8$``*F`@":!@0``0,``*0&!``!`P``X08$``$!``!7!P0``D8"`(D'
-M!``!`0``V`<$``*'`@#R!P0``I,"`!<(!``!G`(`'0@$``$'```Y"`0``0<`
-M`$T(!``!!P``5@@$``$'``!<"`0``0<``&((!``"S0(`FP@$``*'`@"]"`0`
-M`M`"`!D)!``"T`(`2@D$``*C`@!:"00``0$``'L)!``"T`(`G0D$``$'``"K
-M"00``H`"`/D*!``!!P```PL$``*``@`+"P0``K("`/P+!``!!P``!@P$``*`
-M`@`.#`0``K("`+T,!``!!P``QPP$``*``@#/#`0``K("`%8-!``!!P``8`T$
-M``*``@!H#00``K("`-D-!``!!P``XPT$``*``@#K#00``K("`&@.!``!!P``
-M<@X$``*``@!^#@0``J,"`)X.!``!!P``J`X$``*``@#*#@0``J,"`/$.!``"
-MHP(`-P\$``)K`@!0#P0``K("`&,/!``!`0``H0\$``)&`@#@#P0``0<``.@/
-M!``"@`(`!Q`$``*P`@`W$`0``0,``'P0!``"T`(`JA`$``)K`@"W$`0``KP"
-M`-D0!``"L@(`Z1`$``$!```"$00``M`"``\1!``"O`(`2Q$$``$#``"P$00`
-M`M`"```2!``"HP(`$Q($``$!```8$@0``E@"`#@2!``!I0(`J1($``)?`@#-
-M$@0``0<``-<2!``"@`(`XQ($``*C`@`3$P0``FL"`"P3!``"9`(`R!4$``)D
-M`@`/%@0``E\"`(@6!``"9`(`SA8$``)?`@`:%P0``0<``"07!``"@`(`+!<$
-M``*R`@!N%P0``H$"`),7!``!I0(`TQ<$``)?`@`:&`0``E\"`(P8!``"7P(`
-MKQ@$``)K`@#$&`0``;4"`/@8!``!!P```AD$``*``@`.&00``J,"`%T:!``"
-M9`(`NQH$``&E`@`F&P0``E\"`(@;!``"9`(`DQL$``$%``"G&P0``J\"`.H;
-M!``"9`(`]1L$``$%```)'`0``J\"`%4<!``"7P(`?QP$``)D`@"I'`0``F0"
-M`/$<!``!!@``]AP$``*O`@`_'@0``F0"`(,>!``"7P(`T1X$``)?`@`('P0`
-M`ET"`&(?!``"7P(`E1\$``)D`@"T'P0``H@"`'\@!``"7P(`C"`$``$%``#1
-M(`0``J\"`)LA!``"9`(`VB$$``)?`@`S(@0``E\"`%XB!``!!@``8R($``*O
-M`@"'(@0``F0"`,LB!``"7P(`'R,$``)?`@!K(P0``04``'`C!``"KP(`HB,$
-M``*$`@#C(P0``E\"`/<C!``":0(`,R0$``)?`@!W)`0``E\"`+HD!``"7P(`
-MV"0$``*!`@#Q)`0``F0"`!HE!``"B`(`@B4$``)E`@!<)@0``LL"`(PF!``"
-M1P(`ZB8$``&E`@`C)P0``F<"`%LG!``"8@(`<B<$``&U`@#D)P0``L4"`.XG
-M!``"7`(`"B@$``%)`@`I*`0``M`"`-8H!``"7@(`YB@$``*!`@`R*@0``EX"
-M`%(J!``"7@(`Y"L$``*(`@!V+`0``H$"`.4L!``"70(`2RT$``),`@!5+00`
-M`K,"`)\M!``"2`(`UBT$``),`@#_+00``J,"`#LN!``"80(`5RX$``)1`@`0
-M+P0``K,"`(,O!``"Q0(`H2\$``)J`@#1+P0``E("`/0O!``"L@(`$#`$``$!
-M```^,`0``D8"`%DQ!``"R@(`NC$$``$!``#Z,00``M`"`)`R!``"R@(`LC($
-M``+0`@`V,P0``FL"`"@&!``"JP(`F`<$``*K`@"Q!P0``H<"`.4)!``"HP(`
-MK2<$``)K`@#;)P0``J,"`/8H!``"70(`;RT$``*!`@#.+00``ET"`#@R!``"
-MR@(`9#,$``&2`@`L-`0``9("`.$T!``!D@(`SC4$``&2`@!]-P0``0,``*DX
-M!``"FP(`&#H$``*;`@#@.@0``IL"`(\\!``"<`(`Z#T$``)P`@`C/P0``0,`
-M`+=`!``"<`(`-$$$``)P`@`*0@0``G`"`#-"!``!"0``5D($``$)``!C0@0`
-M`0D``&Q"!``!"0``=4($``$)``!^0@0``0D``(="!``!"0``D$($``$)``"9
-M0@0``0D``*)"!``!"0``JT($``$)``"T0@0``0D``+U"!``!"0``PT($``$)
-M```60P0``D\"`%Q(!``"<`(`G$@$``)P`@#<2`0``G`"`$))!``"<`(`G4D$
-M``)P`@`"2@0``G`"`'%*!``!I0(`DTH$``)P`@"?2@0``G`"`$9+!``"<`(`
-M:4L$``)P`@!F3`0``G`"`(E,!``"<`(`%$T$``)P`@`V300``G`"`)I-!``"
-M<`(`IDT$``)P`@#4300``G`"`/9-!``"<`(`5TX$``)P`@!C3@0``G`"`)E.
-M!``"<`(`NTX$``)P`@`53P0``G`"`"%/!``"<`(`A4\$``)P`@"13P0``G`"
-M`/5/!``"<`(``5`$``)P`@!E4`0``G`"`'%0!``"<`(`U5`$``)P`@#A4`0`
-M`G`"`$51!``"<`(`45$$``)P`@"U400``G`"`,%1!``"<`(`15($``)P`@!1
-M4@0``G`"`+52!``"<`(`P5($``)P`@`L4P0``G`"`#A3!``"<`(`1E,$``)P
-M`@!04P0``G`"`.53!``"<`(`\5,$``)P`@!55`0``G`"`&%4!``"<`(`V50$
-M``)P`@#F5`0``G`"`$E5!``"<`(`5E4$``)P`@!;5@0``G`"`&E6!``"<`(`
-M"U<$``)P`@`95P0``G`"`'57!``"<`(`@5<$``)P`@`(6`0``G`"`!18!``"
-M<`(`F%@$``)P`@"D6`0``G`"`!19!``"<`(`(%D$``)P`@`N6@0``G`"`#Q:
-M!``"<`(`&%L$``)P`@`F6P0``G`"`.!;!``"<`(`[EL$``)P`@`K7`0``0<`
-M`#A<!``!!P``>%T$``$!``!P7@0``D\"`!5?!``!M0(`C%\$``*F`@"Q7P0`
-M`0$``+E?!``"JP(`_E\$``*F`@`(8`0``K("`&U@!``"JP(`M6`$``*F`@#V
-M8`0``0$```-A!``!`0``"V$$``*K`@`5800``J<"`%5A!``"L@(`W&$$``*C
-M`@#T800``08``/EA!``"KP(`)6($``*R`@"-8@0``J,"`*5B!``!!@``JF($
-M``*O`@!.8P0``0$``(QC!``!`0``I6,$``+0`@#,8P0``0$``.5C!``"T`(`
-M#&0$``$!```E9`0``M`"`$QD!``!`0``960$``+0`@",9`0``0$``*5D!``"
-MT`(`S&0$``$!``#E9`0``M`"``QE!``!`0``)64$``+0`@!,900``0$``&5E
-M!``"T`(`C&4$``$!``"E900``M`"`,QE!``!`0``Y64$``+0`@`,9@0``0$`
-M`"5F!``"T`(`3&8$``$!``!E9@0``M`"`(QF!``!`0``I68$``+0`@#,9@0`
-M`0$``.5F!``"T`(`#&<$``$!```E9P0``M`"`$QG!``!`0``96<$``+0`@",
-M9P0``0$``*5G!``"T`(`S&<$``$!``#E9P0``M`"``QH!``!`0``)6@$``+0
-M`@!,:`0``0$``&5H!``"T`(`?6@$``$!``"8:`0``M`"`*UH!``!`0``RV@$
-M``+0`@`.:00``J,"`!AI!``!`0``,VD$``+0`@"K:00``0$``,9I!``"T`(`
-M.VH$``*'`@!5:@0``J8"`'9J!``!`0``RFH$``*C`@"`:P0``04``(EK!``"
-MKP(`F6L$``)K`@"M:P0``J,"`+5K!``"AP(`WFL$``$%``#G:P0``J\"`/=K
-M!``":P(`&VP$``*'`@`B;`0``0$``#YL!``"T`(`J6P$``*C`@"Q;`0``H<"
-M``MM!``!`0``*6T$``+0`@#,;00``G`"`,)N!``"7P(`W&X$``$!``#U;@0`
-M`I,"`'AO!``"7P(`M&\$``)P`@!><`0``E\"`(9P!``!`0``GW`$``*3`@#F
-M<`0``H<"`/!P!``!`0``"7$$``*3`@"W<00``0$``(AR!``!`0``H7($``*3
-M`@!]<P0``0$``(]S!``"DP(`K',$``&2`@!6=`0``0$``')T!``"DP(`EW0$
-M``$)``"A=`0``0D``+-T!``!"0``NW0$``$)``#$=`0``0D``,UT!``!"0``
-MUG0$``$)``#?=`0``0D``.AT!``!"0``\70$``$)``#Z=`0``0D```-U!``!
-M"0``#'4$``$)```F=00``0D``#!U!``!`0``274$``*3`@#%=00``0$``-YU
-M!``"DP(`;W8$``$!``"(=@0``I,"`,UV!``"<`(`%W<$``$!```X=P0``I,"
-M`'UW!``"<`(`MW<$``$!``#8=P0``I,"`!IX!``!D@(`9G@$``$!``"">`0`
-M`I,"`,QX!``!D@(`1GD$``$!``!F>00``I,"`!YZ!``!`0``-WH$``*3`@#Z
-M>@0``0$``!-[!``"DP(`^GL$``$!```3?`0``I,"`.I\!``!`0```WT$``*3
-M`@#:?00``0$``/-]!``"DP(`O'X$``$!``#:?@0``I,"`!E_!``!`0``,G\$
-M``*3`@#4?P0``0$``.U_!``"DP(`*H`$``$!``!(@`0``I,"`&*`!``!!@``
-M@8`$``&U`@"+@`0``0$``*2`!``"DP(`L8`$``$&``#,@`0``8H"`-.`!``!
-M!@``XX`$``$&``#[@`0``0$``""!!``"T`(`*X$$``%.`@`U@00``08``$V!
-M!``!`0``;8$$``$!``"/@00``I,"`/N!!``!`0``$8($``*3`@")@@0``G`"
-M`+N"!``"HP(`PX($``*'`@#U@@0``0$```Z#!``"DP(`CH,$``$!``"M@P0`
-M`M`"`-.#!``"1@(`\(,$``)P`@`0A`0``G`"`#J$!``"<`(`BH0$``)P`@#0
-MA`0``G`"`/N$!``"<`(`BX4$``)P`@"5A00``G`"`-"%!``"<`(`\(4$``)P
-M`@`1A@0``G`"`)*&!``"<`(`TH8$``)P`@`/AP0``G`"`$^'!``"<`(`CX<$
-M``)P`@#/AP0``G`"`/*'!``!!@``G8@$``%@`@#;B`0``GT"`.^(!``!5@(`
-M`8D$``*=`@`=B00``0$``#F)!``"DP(`3(D$``)+`@"TB00``J8"`%**!``!
-M`0``6HH$``*K`@"/B@0``K("`+N*!``"A`(`V8H$``$!``#GB@0``0$```"+
-M!``"DP(`M(L$``$!``#-BP0``I,"`..+!``!`0``_(L$``*3`@`$C`0``H<"
-M`"&,!``"<`(`08P$``)P`@!PC`0``G`"`(.,!``"I@(`O8P$``*$`@#HC`0`
-M`0$``.^,!``!`0``*8T$``$!``!"C00``I,"`(Z-!``!`0``IXT$``*3`@#<
-MC00``:4"`/6-!``!!@``"8X$``$&``!@C@0``4X"`&V.!``!`0``AHX$``*3
-M`@#4C@0``8H"`/2.!``!!@``$8\$``$&``!HCP0``;4"`+B/!``!8`(`KI$$
-M``)?`@`*D@0``E\"`%B2!``"7P(`VY0$``$!``#TE`0``I,"`%N6!``!`0``
-M=)8$``*3`@#2E@0``L@"`.&6!``"I@(`\I8$``$!``#ZE@0``JL"`"&7!``"
-M<`(`*9<$``*M`@`SEP0``0$``$R7!``"DP(`<9<$``*M`@"!EP0``0$``)J7
-M!``"DP(`&9@$``$!``!`F`0``J`"`.&8!``!`0``'YH$``)K`@!-F@0``4X"
-M`&^:!``":P(`BYH$``)K`@"DF@0``4X"`,Z:!``":P(`_YH$``)K`@`TFP0`
-M`FL"`%2;!``":P(`YIL$``$!``#6G00``0$``.V=!``"H`(`7IX$``$!``!U
-MG@0``J`"`(6>!``":P(`T9X$``$!``#HG@0``J`"`/B>!``":P(`)Y\$``)P
-M`@`_GP0``0$``%B?!``"DP(`9Y\$``$#``"9GP0``FL"`#:@!``":`(`5J`$
-M``$!``!_H`0``J`"`(^@!``":P(`M:`$``)K`@`3H00``FL"`!FB!``":`(`
-M4Z($``$!``!JH@0``J`"`'JB!``":P(`EJ($``)K`@!7HP0``FL"`.RC!``"
-M:P(`9*0$``$!``![I`0``J`"`(ND!``":P(`UZ0$``)K`@`FI00``HL"`#:E
-M!``"BP(`B:4$``)K`@#;I00``FL"`.ZE!``"Q0(`^Z4$``*M`@`)I@0``HL"
-M`!FF!``"Q0(`.*8$``)H`@!>I@0``0$``'6F!``"H`(`A:8$``)K`@"=I@0`
-M`GD"`,FF!``":`(``Z<$``$!```:IP0``J`"`"JG!``":P(`6J<$``$!``!Q
-MIP0``J`"`(&G!``":P(`JZ<$``$!``#4IP0``J`"`.2G!``":P(`T*H$``)H
-M`@`7JP0``G`"`'"K!``"K0(`@*L$``$!``"9JP0``I,"`*FK!``"9P(`!:P$
-M``$!```>K`0``I,"`#VL!``"<`(`J*P$``)G`@`,K@0``04``!6N!``"KP(`
-M%:\$``$!```NKP0``I,"`$VO!``"<`(`8Z\$``)G`@#EKP0``G`"`"&P!``"
-M9P(`*[`$``$!``!$L`0``I,"`+RP!``"3`(`"[$$``*!`@`UL00``F,"`&BQ
-M!``"7P(`O+$$``)?`@#)L00``F<"`/JQ!``"3`(`2K($``)P`@"#L@0``0$`
-M`)RR!``"DP(`7[,$``*C`@"5LP0``GD"`!^T!``"<`(`0[0$``$#``!GM`0`
-M`EH"`*:T!``"6@(`\[0$``)P`@",M@0``H@"`.VV!``"<`(`)+<$``);`@!7
-MMP0``DP"`&RW!``"@0(`EK@$``*;`@#DN`0``IL"`!^Y!``"<`(`>KD$``*(
-M`@!WN@0``IL"`*^Z!``"4`(`'[P$``)P`@!?O`0``EL"`.:\!``"L@(`^[P$
-M``)Y`@`3O00``E4"`,2]!``"K0(`T+T$``*+`@`GO@0``0$``#Z^!``"H`(`
-M3KX$``)K`@"PO@0``0$``,>^!``"H`(`U[X$``)K`@`:OP0``L@"`&^_!``"
-M3`(`SK\$``$!``#EOP0``J`"`/F_!``":P(`8L`$``)P`@#&P`0``G`"`-C`
-M!``!`0``\L`$``*+`@`(P00``L4"`$3!!``!`0``6\$$``*@`@!KP00``FL"
-M`'G!!``!`0``H\($``)=`@#CP@0``HL"`/?"!``"R`(`D<,$``)P`@#1PP0`
-M`EL"`&/$!``"3`(`DL0$``);`@#$Q`0``DP"`!?%!``"7@(`(\4$``)=`@!/
-MQ00``0$``(+%!``"<`(`I,4$``$!``#"Q00``I,"`"3&!``"A`(`CL8$``$!
-M``"GQ@0``I,"`.W&!``!`0``!L<$``*3`@`MQP0``H<"`'3'!``"R`(`?,<$
-M``*+`@",QP0``0$``*K'!``"DP(`/<D$``*$`@!-R00``LL"`!?*!``"<`(`
-M<<H$``*L`@"KR@0``0$``,3*!``"DP(`=\L$``)3`@!;S`0``ED"`'_.!``"
-MA`(`C\X$``++`@#_S@0``EP"``_/!``"<`(`*,\$``*S`@`PSP0``EP"`#[/
-M!``!`0``5\\$``*3`@"2SP0``J,"`/_/!``!`0``(=`$``)_`@!@T`0``G`"
-M`,;1!``!`0``^M$$``+'`@`&TP0``I<"`/?3!``"I@(`&]0$``$!``!5U`0`
-M`H<"`'74!``!`0``BM8$``$%``"3U@0``J\"`-;8!``":`(`#=D$``*R`@">
-MV@0``0$``';;!``!`0``Y-L$``*;`@`+W`0``K("`"K<!``"I@(`DMP$``&*
-M`@#9W`0``J,"`.7<!``"AP(`+-T$``*C`@`XW00``H<"`%C=!``"HP(`:=T$
-M``$!``#OW00``0$``!7>!``!`0``L]X$``$!``!ZWP0``G`"`-K?!``"<`(`
-M:N`$``)P`@#YX`0``G`"`%/A!``"<`(`\^$$``)P`@"EX@0``G@"`+?B!``!
-MG`(`+N,$``*Q`@!(XP0``I$"`,;C!``"HP(`U>,$``*'`@#?XP0``0$``/CC
-M!``"DP(`@N0$``*C`@"1Y`0``H<"`)OD!``!`0``M.0$``*3`@`:Y00``FL"
-M`&?E!``"<`(`<^4$``)P`@"GY00``L0"`!7F!``"Q`(`"^<$``)P`@`ZYP0`
-M`L0"`$WG!``!`0``9N<$``*3`@#-YP0``G`"`-7G!``"LP(``^@$``)P`@`L
-MZ`0``0$``$7H!``"DP(`7^@$``)P`@#VZ`0``H<"``#I!``!`0``&>D$``*3
-M`@#;Z00``D<"`"OJ!``!D@(`..H$``&2`@!`Z@0``LP"`)KJ!``"6@(`Z>H$
-M``&2`@`QZP0``0$``$KK!``"DP(`SNL$``$!``#:ZP0``E@"`!OL!``!`0``
-M-.P$``*3`@!9[`0``0$``'CL!``"T`(`S>P$``)B`@#=[`0``;4"`/#L!``"
-M:P(`/NT$``$!``"`[00``J,"`)WM!``"HP(`JNT$``)<`@#?[00``G`"`.GM
-M!``"<`(`]>T$``)F`@#\[00``0$``"+N!``"DP(`2.X$``%@`@!^[@0``6`"
-M`(KN!``"<@(`JNX$``%6`@"\[@0``IT"`!3O!``"A`(`.N\$``$!``!3[P0`
-M`I,"`*;O!``!`0``O^\$``*3`@`G\`0``G`"`'[P!``"K`(`MO`$``$!``#/
-M\`0``I,"`%OQ!``"4P(`/_($``)9`@#W\@0``G`"`%[S!``!`0``=_,$``*3
-M`@#C\P0``E,"`-?T!``"<`(`./4$``$!``!1]00``I,"`+'U!``"4P(`EO8$
-M``&2`@#:]@0``0$``//V!``"DP(`!O<$``)P`@!+]P0``F<"`%3X!``"BP(`
-M<_@$``$#``#>^00``0$```?Z!``"<`(`XOH$``*+`@#L^@0``0$```7[!``"
-MDP(`/OL$``)P`@!V^P0``H0"`)?[!``!`0``M?L$``*3`@`;_`0``J8"`"O\
-M!``!B@(``?T$``$!```(_00``0$``-/]!``"F`(`]_T$``$!```3_@0``I,"
-M`(/^!``!`0``G/X$``+0`@#0_P0``H<"`.?_!``!`0`````%``*3`@"*``4`
-M`H<"`+8`!0`"F`(`+`$%``*'`@#.`04``I@"`.4!!0`"F`(`]@(%``*'`@!1
-M`P4``J,"`'$#!0`"<`(`E`,%``)C`@"K`P4``0$``,0#!0`"DP(`<00%``$!
-M``"*!`4``I,"`)H$!0`":P(`IP0%``$!``#(!`4``I,"`-MB!``"IP(`86,$
-M``*A`@!_:00``JL"`-AI!``"AP(`CFH$``*K`@#>:@0``H<"`*5M!``"JP(`
-M?H,$``*K`@`+C00``JL"`$2<!``"H0(`N,\$``)2`@"?U`0``I,"`)[8!``"
-MJP(`V]H$``)_`@"@VP0``I,"`$K>!``"?P(`1M\$``*K`@"![`0``DD"`''M
-M!``"T`(`,?X$``*K`@!1`04``JL"`&8"!0`"JP(`L`(%``*K`@""!P4``M`"
-M`*8'!0`";P(`VP<%``*8`@"V"@4``0$``"$+!0`"C0(`6PL%``$!``!F"P4`
-M`0$``%@,!0`">0(`80T%``*-`@"\#04``7$"`-4-!0`"QP(`4`X%``*C`@"!
-M$`4``7$"`)H0!0`"QP(`K!`%``)Q`@!3$04``LH"`(,1!0`"T`(`(1(%``*K
-M`@!%$@4``DT"`)02!0`"JP(`/`<%``+0`@`-#`4``JL"`.P-!0`"<0(`?0X%
-M``+*`@#H#@4``JL"`(P2!0`"IP(`'Q,%``)H`@"#%04``G,"`+\5!0`"<P(`
-MVA4%``)S`@"*%@4``E`"`),7!0`"50(`UA@%``*;`@"[&04``FL"`/`9!0`"
-M6P(`CAH%``*+`@!='04``FD"`&T=!0`"9`(`H!T%``)?`@#U'04``E\"`!(>
-M!0`"9P(`I!X%``*+`@#:'@4``GD"`/,>!0`">0(``1\%``)Y`@`1'P4``HL"
-M`!D?!0`"BP(`;!\%``$#``#U'P4``HD"`$P@!0`";0(`G2`%``)2`@`M(04`
-M`HL"`$0B!0`"K0(`IB(%``*;`@"^(@4``EL"`,XB!0`"B0(`_R(%``*(`@`^
-M)04``E\"`(`E!0`"7P(`DR4%``)I`@!')@4``E\"`&`F!0`":0(`B"8%``)D
-M`@"F)@4``F0"`&DJ!0`"U0(`Q"H%``+5`@!G*P4``M4"`$TL!0`"L@(``2T%
-M``)I`@`Y+04``E\"`$$M!0`":0(`4BT%``)I`@"N+04``E\"`+HM!0`":0(`
-M,"X%``)H`@!'+@4``JT"`&8N!0`":`(`\RX%``+5`@#V,`4``K,"`!,Q!0`"
-MK0(`'3$%``*+`@!7,04``HD"`*`7!0`";0(`T!D%``)M`@!8(04``JT"`,8O
-M!0`"LP(`@3$%``%*`@"B,04``:H"`+TQ!0`!J@(`3C,%``$!``!M,P4``M`"
-M`*@S!0`"D0(`[C,%``+2`@`.-`4``KT"```$```!`0``!`0```$!```(!```
-M`0$```P$```!`0``$`0```$!```4!````0$``!@$```!`0``'`0```$!```@
-M!````0$``"0$```!`0``*`0```$!```L!````0$``#`$```!`0``-`0```$!
-M```X!````0$``#P$```!`0``0`0```$!``!$!````0$``$@$```!`0``3`0`
-M``$!``!0!````0$``%0$```!`0``6`0```$!``!<!````0$``&`$```!`0``
-M9`0```$!``!H!````0$``&P$```!`0``<`0```$!``!T!````0$``'@$```!
-M`0``?`0```$!``"`!````0$``(0$```!`0``B`0```$!``",!````0$``)`$
-M```!`0``E`0```$!``"8!````0$``)P$```!`0``H`0```$!``"D!````0$`
-M`*@$```!`0``K`0```$!``"P!````0$``+0$```!`0``N`0```$!``"\!```
-M`0$``,`$```!`0``Q`0```$!``#(!````0$``,P$```!`0``T`0```$!``#4
-M!````0$``-@$```!`0``W`0```$!``#@!````0$``.0$```!`0``Z`0```$!
-M``#L!````0$``/`$```!`0``]`0```$!``#X!````0$``/P$```!`0````4`
-M``$!```$!0```0$```@%```!`0``#`4```$!```0!0```0$``!0%```!`0``
-M&`4```$!```<!0```0$``"`%```!`0``)`4```$!```H!0```0$``"P%```!
-M`0``,`4```$!```T!0```0$``#@%```!`0``/`4```$!``!`!0```0$``$0%
-M```!`0``2`4```$!``!,!0```0$``%`%```!`0``5`4```$!``!8!0```0$`
-M`%P%```!`0``8`4```$!``!D!0```0$``&@%```!`0``;`4```$!``!P!0``
-M`0$``'0%```!`0``>`4```$!``!\!0```0$``(`%```!`0``A`4```$!``"(
-M!0```0$``(P%```!`0``D`4```$!``"4!0```0$``)@%```!`0``G`4```$!
-M``"@!0```0$``*0%```!`0``J`4```$!``"L!0```0$``+`%```!`0``M`4`
-M``$!``"X!0```0$``+P%```!`0``P`4```$!``#$!0```0$``,@%```!`0``
-MS`4```$!``#0!0```0$``-0%```!`0``V`4```$!``#<!0```0$``.`%```!
-M`0``Y`4```$!``#H!0```0$``.P%```!`0``\`4```$!``#T!0```0$``/@%
-M```!`0``_`4```$!````!@```0$```0&```!`0``"`8```$!```,!@```0$`
-M`!`&```!`0``%`8```$!```8!@```0$``!P&```!`0``(`8```$!```D!@``
-M`0$``"@&```!`0``+`8```$!```P!@```0$``#0&```!`0``.`8```$!```\
-M!@```0$``$`&```!`0``1`8```$!``!(!@```0$``$P&```!`0``4`8```$!
-M``!4!@```0$``%@&```!`0``7`8```$!``!@!@```0$``&0&```!`0``:`8`
-M``$!``!L!@```0$``'`&```!`0``=`8```$!``!X!@```0$``'P&```!`0``
-M@`8```$!``"$!@```0$``(@&```!`0``C`8```$!``"0!@```0$``)0&```!
-M`0``F`8```$!``"<!@```0$``*`&```!`0``I`8```$!``"H!@```0$``*P&
-M```!`0``L`8```$!``"T!@```0$``+@&```!`0``O`8```$!``#`!@```0$`
-M`,0&```!`0``R`8```$!``#,!@```0$``-`&```!`0``U`8```$!``#8!@``
-M`0$``-P&```!`0``X`8```$!``#D!@```0$``.@&```!`0``[`8```$!``#P
-M!@```0$``/0&```!`0``^`8```$!``#\!@```0$````'```!`0``!`<```$!
-M```(!P```0$```P'```!`0``$`<```$!```4!P```0$``!@'```!`0``(`<`
-M``$!```D!P```0$``"@'```!`0``+`<```$!```P!P```0$``#0'```!`0``
-M.`<```$!```\!P```0$``$`'```!`0``1`<```$!``!(!P```0$``$P'```!
-M`0``4`<```$!``!4!P```0$``%@'```!`0``7`<```$!``!@!P```0$``&0'
-M```!`0``:`<```$!``!L!P```0$``'`'```!`0``=`<```$!``!X!P```0$`
-M`'P'```!`0````@```$!```$"````0$```@(```!`0``#`@```$!```0"```
-M`0$``!0(```!`0``&`@```$!```<"````0$``"`(```!`0``)`@```$!```H
-M"````0$``"P(```!`0``,`@```$!```T"````0$``#@(```!`0``/`@```$!
-M``!`"````0$``$0(```!`0``2`@```$!``!,"````0$``%`(```!`0``5`@`
-M``$!``!8"````0$``%P(```!`0``8`@```$!``!D"````0$``&@(```!`0``
-M;`@```$!``!P"````0$``'0(```!`0``>`@```$!``!\"````0$``(`(```!
-M`0``A`@```$!``"("````0$``(P(```!`0``D`@```$!``"<"````0$``*`(
+M979I8V4@)7@I`````$1E=FEC92`H4&%T:"`E,#)X('P@5&%R9V5T("4P,G@@
+M?"!%)7@O4R4P,G@I('-P:6X@=7`@;6]D92!N;W0@<W5P<&]R=````%-E="!D
+M979I8V4@*%!A=&@@)3`R>"!\(%1A<F=E="`E,#)X('P@125X+U,E,#)X*2!S
+M<&EN('5P(&UO9&4@)7@`````071T86-H960@9&5V:6-E(&EN9&5X("4P,G@@
+M*%!A=&@@)3`R>"!\(%1A<F=E="`E,#)X('P@125X+U,E,#)X*2`@)7@E>"5X
+M)7@E>"5X)7@E>```0F%C:W5P('-T86UP("5X('-U;2`E>"!B86-K960@)60`
+M````36%S=&5R('-T86UP("5X('-U;2`E>"!B86-K960@)60`````5W)I=&4@
+M87)R87D@;65T82!D871A('1O(&UA<W1E<B`P>"5L;%@M/C!X)6QL6```5W)I
+M=&4@87)R87D@;65T82!D871A('1O(&)A8VMU<"`P>"5L;%@M/C!X)6QL6```
+M6R5D("5D72!D979I8V4@97)A<V4@=6YI="!S=6-C97-S9G5L;'DN`%LE9"`E
+M9%T@9&5V:6-E(&5R87-E('5N:70@9F%I;&5D(&]R(&%B;W)T960N`````&1O
+M7V1I<VM?8W1L7V-M9#H@8W1L(&-O9&4@)7@@=F0])7`L($Q"02`P>"5L;%@@
+M;E-E8W1O<B`P>"5X`%LE,#)D.B4P,F0@4"5D72!'4T-2(&-H86YG960`475E
+M=64@9G5L;"`E>"`E>`!297$@)7`@)7@@)7@`)7,@<F5Q("5P('-L;W1I9"`P
+M>"5X`%LE,#)X.B4P,G@@)3`R9%T@9&ES:R!F86EL960N`$1E=FEC92`E>"\E
+M>"!R96UO=F5D+@!&86EL960@=&\@=F5R:69Y(&-O;G1R;VQL97(`;V1I;B!R
+M96%D('=R:71E(&5X8V5E9',@)7@`;V1I;@!$979I8V4@)7@O)7@@<F5M;W9E
+M9"X`4F5T<GEI;F<@9F%I;&5D+"!D:7-K(&1O=VX_/S\`=V]R:W)O=6YD(&ER
+M<5-T871U<R`](#!X)7@`4F5Q("5P("5X("5X`$]V97)R86QL(%-'(&ET96T@
+M)7@@<VEZ92`E>`!3;&]T(&)U<WDL('-L;W0@)7@H)7@I`$1U;7`@<VQO="!I
+M;F9O.B`E>"`E>"`E>"`E>`!#;&5A;B!U<"!S;&]T("5X`$0R2"!&25,Z("4P
+M.'@@)3`X>"`E,#AX("4P.'@`)3`R>"`E,#1X.B4P-'@Z)3`T>`!$979I8V4@
+M)7@O)7@@<F5M;W9E9"X`1&5V:6-E("5X+R5X(')E;6]V960N`$1E=FEC92`E
+M>"!P;W=E<F5D('5P+@!S=&%R="!315,@9&5V:6-E("5P`$9O=6YD(%-%4R!$
+M979I8V4@)7@`1F%I;&5D('1O('9E<FEF>2!C;VYT<F]L;&5R`&]D:6X@<F5A
+M9"!W<FET92!E>&-E961S("5X`&]D:6X`8V%L;"!L9&U?;VY?=&EM97(@869T
+M97(@,6US`')A=R`E<"!B861?<V5C=&]R("5X`%=R:71E(&)A8VMU<&5D(&UE
+M=&$@9&%T80!&86EL960@=&\@<W!I;F1O=VX@9&5V:6-E<P!&86EL960@=&\@
+M9FQU<V@@=&%R9V5T<P!!=71O(%)E8G5I;&0`4F5B=6EL9"!0<FEO<FET>0!#
+M;VYT:6YU92!296)U:6QD:6YG(&]N($5R<F]R`%-P:6YD;W=N($ED;&4@1&ES
+M:R`H;6EN=71E<RD`4W1A9V=E<F5D('-P:6YU<``````````&!`4!`P)28A4`
+M````````!@0%`0,"V&"?-CD\``````8$!0$#`B!@D%!2```````&!`4!`P+8
+M8)````````````$"`Q`$!08'$0@)"@L2#`T.#Q,4%187)!@9&ALE'!T>'R8@
+M(2(C)P```````````````````````````````+P`````````(0```"#1``"`
+MYP``<-$``-#S``"```$`4.<``!#1``"@T0``8.8``(#1```0`P$`<-(``*#X
+M````````(.4``)#1``"0^@``(.(```#<``!PVP``T-(``,#N``#PT@``T-L`
+M`*#;``#PV@``D-0``+#3`````````````(#2``"0T@``H-(``+#2``#`T@``
+M``````,14`<```````(``````````````0````````````````````8$!0$#
+M`E)B%0`````````&!`4!`P+88)\V.3P`````!@0%`0,"(&"04%(```````8$
+M!0$#`MA@D`````````!/`@```````"$```"PGP(`,+\"``"@`@"`V@(`D/4"
+M``"_`@"@GP(`4*$"`!"^`@`0H`(`,/@"`-"A`@!0WP(``````#"[`@`@H`(`
+M@.\"`!"V`@`@KP(`D*X"`%"C`@#`Q@(`<*,"`/"N`@#`K@(`$*X"`#"E`@!0
+MI`(```````````#@H0(`(.T"`&#I`@!PY0(`D.$"```````#$8!R```````"
+M``````````````$````````````````````!`?\"````````````````````
+M```````````````````````!`````````!@`````````+````!0```!0'@,`
+M\#\#`(`=`P```````````!`1`P`0'0,`T!$#````````````````````````
+M``````````````````````````#_``!P5`,``````."/`P`!`````?\``-!4
+M`P``````D(X#``$````"_P``\%0#``````#0HP,``0````/_``!050,`````
+M`.";`P`!````-?\``'!5`P``````<(T#``$````$_P``4%8#```````@AP,`
+M`0````7_``"P5@,``````$`#!``!````!O\``&!9`P#PE0,`<'8#```````'
+M_P``P/,#`("4`P`P=0,```````K_``!070,``````!"#`P`!````"_\``'!=
+M`P``````8/`#```````,_P``H&`#`&"4`P#P=`,```````W_```080,`0)0#
+M`+!T`P``````#O\``(!A`P#PDP,`<'0#```````/_P``0&(#`&"3`P`P=`,`
+M`````!#_``"P8@,`0),#`/!S`P``````$?\``*!C`P``````<',#```````2
+M_P``$&0#```````P<P,``````!/_```P9`,``````*#Y`P`!````-/\``%!D
+M`P```````/X#``$````8_P``<&0#``````"PF@,``````$+_```@90,`````
+M`)":`P``````&?\``.!=`P``````P.\#```````:_P``4%X#``````!@[P,`
+M`````!W_``#090,``````/!R`P``````'O\``$!F`P``````0/4#``$````?
+M_P``T&8#`-"2`P"P<@,``````"#_``"`6@,`L)4#`#!V`P``````(?\``/!6
+M`P``````8`$$``$````B_P``,&,#``````"P<P,``````"/_``#`7@,`````
+M`-#N`P``````)/\``#!?`P``````0.X#```````E_P``H%\#``````#@[0,`
+M`````"G_``#06P,`,)4#`+!U`P``````*O\``!!@`P``````T-X#```````K
+M_P``8&<#`*"2`P!P<@,``````"S_``#@5P,``````-"%`P`!````+?\``,!8
+M`P`PE@,`L'8#```````N_P``,%<#``````"0_@,``0```"__```050,`````
+M`""B`P`!````2?\``#!5`P``````P(T#``$````W_P``<%<#``````"0V`,`
+M`0```#C_```P6P,`<)4#`/!U`P``````.?\``)!<`P#PE`,`<'4#```````Z
+M_P``0%@#```````@A0,``0```#O_``!0:`,``````-":`P`!````//\``(!6
+M`P``````<(8#``$````]_P``D%4#``````#0C`,``0```#[_``"P50,`````
+M`."+`P`!````0_\``-!5`P``````\(H#``$```!$_P``\%4#````````B@,`
+M`0```$;_```05@,```````")`P`!````1_\``#!6`P``````((@#``$````R
+M_P``D%0#``````!0G`,``0```#/_``"P5`,`<)8#`.".`P``````9/\``,!G
+M`P``````(((#``$````P_P``\&<#``````#0?P,``0```&;_```P6@,`````
+M`."#`P`!````9_\``!!:`P``````H(0#``$```!%_P``4&D#`("2`P`P<@,`
+M`````$C_````:@,`8)(#`/!Q`P``````_____P``````````````````````
+M``````````!'0T,Z("A'3E4I(#0N,BXQ(#(P,#<P.#,Q('!A=&-H960@6T9R
+M965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P,#<P.#,Q('!A=&-H960@6T9R
+M965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P,#<P.#,Q('!A=&-H960@6T9R
+M965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P,#<P.#,Q('!A=&-H960@6T9R
+M965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P,#<P.#,Q('!A=&-H960@6T9R
+M965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P,#<P.#,Q('!A=&-H960@6T9R
+M965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P,#<P.#,Q('!A=&-H960@6T9R
+M965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P,#<P.#,Q('!A=&-H960@6T9R
+M965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P,#<P.#,Q('!A=&-H960@6T9R
+M965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P,#<P.#,Q('!A=&-H960@6T9R
+M965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P,#<P.#,Q('!A=&-H960@6T9R
+M965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P,#<P.#,Q('!A=&-H960@6T9R
+M965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P,#<P.#,Q('!A=&-H960@6T9R
+M965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P,#<P.#,Q('!A=&-H960@6T9R
+M965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P,#<P.#,Q('!A=&-H960@6T9R
+M965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P,#<P.#,Q('!A=&-H960@6T9R
+M965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P,#<P.#,Q('!A=&-H960@6T9R
+M965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P,#<P.#,Q('!A=&-H960@6T9R
+M965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P,#<P.#,Q('!A=&-H960@6T9R
+M965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P,#<P.#,Q('!A=&-H960@6T9R
+M965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P,#<P.#,Q('!A=&-H960@6T9R
+M965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P,#<P.#,Q('!A=&-H960@6T9R
+M965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P,#<P.#,Q('!A=&-H960@6T9R
+M965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P,#<P.#,Q('!A=&-H960@6T9R
+M965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P,#<P.#,Q('!A=&-H960@6T9R
+M965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P,#<P.#,Q('!A=&-H960@6T9R
+M965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P,#<P.#,Q('!A=&-H960@6T9R
+M965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P,#<P.#,Q('!A=&-H960@6T9R
+M965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P,#<P.#,Q('!A=&-H960@6T9R
+M965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P,#<P.#,Q('!A=&-H960@6T9R
+M965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P,#<P.#,Q('!A=&-H960@6T9R
+M965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P,#<P.#,Q('!A=&-H960@6T9R
+M965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P,#<P.#,Q('!A=&-H960@6T9R
+M965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P,#<P.#,Q('!A=&-H960@6T9R
+M965"4T1=``!'0T,Z("A'3E4I(#0N,BXQ(#(P,#<P.#,Q('!A=&-H960@6T9R
+M965"4T1=```N<WEM=&%B`"YS=')T86(`+G-H<W1R=&%B`"YR96PN=&5X=``N
+M<F5L+G)O9&%T80`N<F]D871A+G-T<C$N-``N<F]D871A+G-T<C$N,0`N<F5L
+M+F1A=&$`+F)S<P`N8V]M;65N=```````````````````````````````````
+M```````````````````````?`````0````8`````````0````&5#!```````
+M`````!``````````&P````D``````````````(3/!``0@0``#`````$````$
+M````"````"D````!`````@````````#`0P0`O`X`````````````(```````
+M```E````"0``````````````E%`%`#@3```,`````P````0````(````,0``
+M``$````R`````````'Q2!`#$#``````````````$`````0```$`````!````
+M,@````````!`7P0`.@,``````````````0````$```!3`````0````,`````
+M````@&($`)@'`````````````"``````````3P````D``````````````,QC
+M!0#(!@``#`````<````$````"````%D````(`````P`````````@:@0```4`
+M````````````(`````````!>`````0``````````````(&H$`"<&````````
+M``````$`````````$0````,``````````````$=P!`!G```````````````!
+M``````````$````"``````````````#@<@0`@"8```T````#`@``!````!``
+M```)`````P``````````````8)D$`"(V``````````````$`````````````
+M``````````````````````````````````,``0`````````````````#``(`
+M`````````````````P`#``````````````````,`!``````````````````#
+M``4``````````````````P`&``````````````````,`!P``````````````
+M```#``@``````````````````P`)``````````````````,`"@``````````
+M```````#``L``````````````````P`,``````````````````,`#0`!````
+M`````#H````"``$`#P```#!T``#*`0```@`!`"(```#P#P``=`````(``0`P
+M````T!X``%`!```"``$`4`````"V``!4`````@`!`%P```!PO0``)P````(`
+M`0!X````()H``-`````"``$`B````-`0``!Z`@```@`!`)P````@!P``)0``
+M``(``0"R````8+8``%<````"``$`PP```#`&``"7`````@`!`-<```!0!P``
+M(`````(``0#W````L*L``$@````"``$`!P$``-!M``"J`````@`!`"`!```@
+M(```P`0```(``0`[`0``$,L``'4````"``$`2`$``,`"``!C`````@`!`&8!
+M````O0``)0````(``0"!`0``X+8``!<````"``$`F@$``$!6```K`````@`!
+M`+4!``"0````2P````(``0#%`0``<,<``.8"```"``$`UP$``"!I``!#````
+M`@`!`/(!``!@;P``6`````(``0`"`@``H&(``(D````"``$`'@(``,!3```J
+M`0```@`!`#L"``#`;P``IP````(``0!1`@``\+X``)L````"``$`<0(```!A
+M``"<`0```@`!`(0"```0P```*0````(``0"G`@``0&```+,````"``$`O0(`
+M`#!C``#R`0```@`!`-4"``!@`0``&P````$``P#@`@``D$(``#(````"``$`
+M_`(``)!9```X`````@`!`!`#``"PL0``5P````(``0`A`P``,#0``.L````"
+M``$`0P,``,"V```8`````@`!`%L#``"PL@``[0(```(``0!K`P``8+(``$@`
+M```"``$`?0,``!"Z```C`````@`!`(H#``!``0``$`````(``0";`P``@`(`
+M`#,````"``$`KP,``#!E``!``0```@`!`,`#```0J@``30````(``0#/`P``
+MD`<``$<````"``$`XP,``/!#```9`P```@`!`/@#``!`"0``,0$```(``0`,
+M!```<!```$L````"``$`(P0``'!F``"F`@```@`!`#4$``!0L```5P````(`
+M`0!%!```0````(`````!``D`2P0``!!'``"I"0```@`!`&8$```PQ```;@$`
+M``(``0"4!```P`,``&$"```"``$`L00``##S``":`````@`!`,$$```0L@``
+M0@````(``0#4!````"D``!<!```"``$`]`0``!#K``"P`P```@`!``\%``!P
+MG@``'0````(``0`E!0``X`<``%H````"``$`.`4``%`!```>`````@`!`$L%
+M``!`)@``O`(```(``0!C!0``("H``#@%```"``$`@04``!!:``!``````@`!
+M`)8%``!`GP``]0$```(``0"K!0``H#L```@"```"``$`P@4``"!L``#8````
+M`@`!`-T%``#@7P``+0````(``0#T!0``T%D``$`````"``$`#`8``.!8```Q
+M`````@`!`"4&``"@:0``*@````(``0`_!@``,%T``/4````"``$`5@8``"!9
+M``!F`````@`!`&D&``"0OP``<0````(``0",!@``\+D``!\````"``$`H`8`
+M`(`#```W`````@`!`+0&```05@``*P````(``0#-!@``8`T```\!```"``$`
+M[`8``$`,```6`0```@`!`/D&``!0$P``#@(```(``0`6!P``T+P``"8````"
+M``$`,P<``.!;``!5`````@`!`$\'``"0O@``4P````(``0!U!P``P!````(`
+M```"``$`D`<``%!:``"&`0```@`!`*4'``!P:0``*@````(``0#!!P``P'H`
+M`)L&```"``$`UP<``.`D``!9`0```@`!`/,'``"@50``,`````(``0`#"```
+M$#H``,H````"``$`(`@``)"[```^`0```@`!`#$(``"0G@``I0````(``0!%
+M"```T&D``$4````"``$`7`@``-`*``!P`0```@`!`&X(``!P#@``40````(`
+M`0"%"```L-T``&T!```"``$`H`@``&!>``#U`````@`!`+,(``!P`0``50``
+M``(``0#""```8"\``,,$```"``$`V@@``""C``#_!0```@`!`.\(``"@O0``
+MY`````(``0`2"0``\`$``&D````"``$`)@D``*!6```$`0```@`!`$`)````
+MK```CP````(``0!2"0``((D``+L'```"``$`;PD``-!5```T`````@`!`(,)
+M```08```,`````(``0"7"0``<`\``'L````"``$`N0D```"W``#P`@```@`!
+M`,\)``#@.@``O`````(``0#L"0``0+H``$<!```"``$``PH``'"K```Z````
+M`@`!`!0*``#0!@``10````(``0`H"@``T-$``!L````"``$`/0H``*!3```9
+M`````@`!`%X*``!`````1`````(``0!Q"@``D&H``%D````"``$`?0H``(!K
+M``"1`````@`!`)(*``"@S0``:`,```(``0"I"@``,)X``!D````"``$`PPH`
+M``!V``#+`0```@`!`-T*``#@````7P````(``0#Q"@``<%8``"L````"``$`
+M"0L``(!N``#9`````@`!`!T+````;0``RP````(``0`U"P``<'```&`"```"
+M``$`4PL``&#P``#)`@```@`!`&H+``"@M0``7`````(``0!W"P``@*H``#\`
+M```"``$`A`L``-#,``#!`````@`!`)P+``!0G@``'0````(``0"O"P``T`$`
+M`!<````"``$`P0L``/`<``#<`0```@`!`-P+``!P'```>0````(``0#R"P``
+M,+T``#,````"``$`#0P``-!R``"P`````@`!`"$,``"@Q0``X0````(``0`X
+M#```<`<``!T````"``$`2@P``&!?``!R`````@`!`%P,``"@"```D0````(`
+M`0!Y#```(&H``&@````"``$`E@P``"`U``#D!````@`!`*T,``!`P```X0,`
+M``(``0###```,`,``$$````"``$`V@P``)#J``!Z`````@`!`/8,``!@`@``
+M$0````(``0`-#0``0````"@````!``<`&@T``(!S``"P`````@`!`"X-``"P
+ML```5P````(``0`^#0````````0````!``D`4`T``'"4``"K!0```@`!`&$-
+M``#0#@``E0````(``0"`#0``,%X``"8````"``$`D`T``-!"```3`0```@`!
+M`*D-``#`4```W`(```(``0#!#0``T'<``.@"```"``$`VPT``+!7```F`0``
+M`@`!`/(-``!@%0```0<```(``0`(#@``0`@``%H````"``$`'`X``/#1``!]
+M`````@`!`#0.``!@/@``*P0```(``0!5#@``0*$``-X!```"``$`<0X``(`*
+M``!$`````@`!`(,.``!@@@``O08```(``0">#@``P*H``*,````"``$`N`X`
+M`$#3``!0`````@`!`-`.``!`7```Y0````(``0#E#@``\%0```(````"``$`
+M^@X``/":```[`P```@`!`!,/```@!@(`EP````(``0`B````4!<!`'0````"
+M``$`)P\````*`0!I`````@`!`#T/``"`_@$`$P````(``0!,#P``(+$!`"L`
+M```"``$`:0\``/#*`0!G`P```@`!`(,/````!0(`'`$```(``0"3#P``P'$!
+M`*X&```"``$`LP\``/"=`0!]`````@`!`,D/```@9@(`Y`@```(``0#H#P``
+M$.T!`(T````"``$`$Q```!"Y`0#9`````@`!`+(`````@@(`5P````(``0`G
+M$```\*L!`'(````"``$`1A```/"(`@`^`0```@`!`%D0``#0HP(`4@````(`
+M`0!S$```H%H"`'0+```"``$`D1```'!M`0!0!````@`!`*L0``!@YP$`7`$`
+M``(``0#W`````'0"`$@````"``$`.P$``*"9`@!U`````@`!`,00```PG`(`
+M:`,```(``0#=$```4+$!`"$````"``$`^1```+!4`@`2`0```@`!`!(1``#P
+M"`$`7P````(``0`H$0``\'@!`!L````"``$`1A$``-`*`0!C`````@`!`&81
+M```@M`$`20````(``0!Y$0``\%D"`*D````"``$`D!$``&"V`0`N`````@`!
+M`*X1``#`#P$`(`````(``0#0$0``0+`!`#0````"``$`YA$```"6`@#F`@``
+M`@`!`/(!`````P(`6`````(``0#Z$0```(X"`/8#```"``$`$A(``."Q`0!G
+M`````@`!`"<2``!`$P$`<`$```(``0`[$@```)H!`%(!```"``$`.P(``*#_
+M`0"G`````@`!`%P2``"`$`(`E`````(``0!R$@``<)D!`(,````"``$`C1(`
+M`(""`@`7`````@`!`*@2``"@H@$`_P````(``0#0$@``L$P!`/<````"``$`
+M]!(``+`0`0!:`````@`!``H3``#050(`^`$```(``0#5`@``@`T``"`````!
+M``,`(1,``,`&`@`A`0```@`!`#`3``!PU@$`X0````(``0!($P``,-L!`&H#
+M```"``$`:!,``'">`0`$`0```@`!`(P3``#05P(`%`(```(``0"J$P``T.H!
+M`"X!```"``$`$`,``&!Z`@!7`````@`!`,<3``"@K0$`#`$```(``0#D$P``
+M0!X!``D&```"``$`!A0``."_`0!W`````@`!`'T#``#@@P(`)0````(``0`M
+M%```P-4!`%`````"``$`1Q0``'"X`0!$`````@`!`&44```0F0$`60````(`
+M`0".%```T!<!`!L````"``$`JQ0``)`/`0`E`````@`!`#4$````>0(`5P``
+M``(``0!%!```0`$``(`````!``D`PQ0``)#1`0#^`````@`!`-H4```@E@$`
+M7@````(``0#Q%```0!P"`'@$```"``$`!A4``)`+`0!"`````@`!`+$$``!P
+MSP(`F@````(``0`<%0``((L"`"0!```"``$`014``$"A`0!3`0```@`!`&@5
+M``"@R0$`2P$```(``0"-%0``H&`!`,$````"``$`K!4``%"S`0#0`````@`!
+M`,@5``"`&`$`:0````(``0#A%0```!`!`$<````"``$`]Q4``,#9`0!D`0``
+M`@`!``H6``!@!0$`.@````(``0`J%@``4'X!`/,````"``$`1A8``(!S`@`[
+M`````@`!`%86```@E0$`E0````(``0!^%@``T!4!`%$````"``$`EQ8``+",
+M`@";`````@`!`"4&``#@Y0$`*@````(``0"Y%@``8#8!`.@#```"``$`VQ8`
+M`-"$`@`Y`0```@`!`/D6``!0.@$`_`@```(``0`;%P``D,<!``0!```"``$`
+M1Q<``*"F`0`J`0```@`!`&X7``#P%P$`5@````(``0"0%P```,,"`+L#```"
+M``$`C`8``+"#`@`A`````@`!`*T7```@,0$`[@$```(``0#+%P``,!8!`)4`
+M```"``$`M`8``/"P`0`K`````@`!`.P7```0A@(`U@````(``0`)&```$/H!
+M`.$````"``$`)!@``"`1`@`B`P```@`!`.P&``"P%`$`%@$```(``0!`&```
+M4$,!`%0)```"``$`6A@``!#F`0`7`````@`!`'(8``"PB@(`,P````(``0"/
+M&```<*P!`!D````"``$`LA@```!P`@!-`````@`!`,,8```PN@$`0`````(`
+M`0#:&```0($"`%P````"``$`Z1@``&!Q`@`;`@```@`!`/H8``#0Y@$`B@``
+M``(``0`9&0``\-`!`*`````"``$`0AD``+!P`@"C`````@`!`%X9``"0R0(`
+MV04```(``0!W&0``D.`!`,@"```"``$`BQD``'##`0!,`0```@`!`+`9```0
+MA`(`MP````(``0#)&0``H/T!`'(````"``$`Z1D``("Q`0`K`````@`!```:
+M``#@#P$`'0````(``0`4&@``8`,"`-8````"``$`+!H``!![`@!(`````@`!
+M`$`:``!0"0$`$`````(``0!3&@``8%`"`$4$```"``$`:AH``!`(`0`Z````
+M`@`!`'H:``"PH`(`E0````(``0",&@``H*,!`&$!```"``$`HQH``/`P`@``
+M`@```@`!`,0:``!P0P(`I0(```(``0#6&@``@)\!`+@!```"``$``1L``#"X
+M`0`X`````@`!`!<;``"0"@$`,P````(``0`M&P``\`<"`*T````"``$`1!L`
+M`%!_`0`3`0```@`!`%\;``#@"@(`F`(```(``0!T&P``8-<!`*P!```"``$`
+MB1L``*#(`0#X`````@`!`+,;``"0T@$`50$```(``0#,&P``L+4!`"H````"
+M``$`Y!L``("6`0!G`````@`!``,<``#`E0$`7@````(``0`M'````%8!`,@)
+M```"``$`1AP``%`4`@#L!@```@`!`%X<```P[@$`?`D```(``0!Q'```4(H"
+M`"8````"``$`D!P``$`/`0!%`````@`!`*8<```0,P(`A`D```(``0#%'```
+M@,8!``T!```"``$`ZAP``(`-`@#T`@```@`!`$`)``!0=`(`XP````(``0`*
+M'0``<+0!`/8````"``$`'AT``+"N`0"8`````@`!`"\=```0T`(`:`H```(`
+M`0`^'0``P"`"`,0'```"``$`6QT``,#H`0"X`````@`!`'@=``#@"0$`%P``
+M``(``0",'0``<.0!`!L!```"``$`IQT``&#C`0`.`0```@`!`+\=```@&P$`
+MZ0````(``0#7'0``P+@!`$@````"``$`\AT``*`.`0";`````@`!``@>``!@
+M"0$`'@````(``0`='@``\(H"`"<````"``$`.QX``%"-`@!Q`````@`!`&`>
+M``"@@@(`"@$```(``0`#"@``P',"`#H````"``$`>!X``(#F`0!(`````@`!
+M`(X>``#PE@$`YP````(``0"P'@``<(`!`.@,```"``$`S1X``$`I`@"I!P``
+M`@`!`.@>``!`U0$`<@````(``0#\'@``4"0!`"T````"``$`*`H``,"\`@#-
+M`````@`!`!P?```0>0$`/04```(``0`_'P``L+$!`"L````"``$`61\``%`(
+M`0!$`````@`!`&X?````D@(`;@$```(``0">'P``$-8!`"T````"``$`MQ\`
+M`("O`0`"`````@`!`'$*```@_@$`60````(``0#.'P``L$T!`$D(```"``$`
+MYA\``&";`0`X`0```@`!``<@````[`$`#0$```(``0`=(````/L!`*L!```"
+M``$`-"```/`8`0`D`@```@`!`'T*``!`!`(`P`````(``0!3(```<'@!`'P`
+M```"``$`J0H``/`R`@`9`````@`!`',@``!P^0$`G0````(``0"+(```8(T!
+M`$4"```"``$`K2```+#\`0!H`````@`!`,P@```P20(`$0,```(``0#G(```
+MT(T"`"D````"``$`#"$``*#^`0`S`````@`!`!HA``#0%@$`>P````(``0`^
+M(0``$!$!`)$````"``$`72$``#"_`0"A`````@`!`'DA````I@$`E0````(`
+M`0":(0``(/T!`'(````"``$`NB$``+`1`0`Q`0```@`!`-`A``#PN0$`0```
+M``(``0#J(0``4,\!`-0````"``$`$"(``(`)`0!5`````@`!`'<+``!P<`(`
+M/P````(``0`A(@``<+4!`#$````"``$`/"(``#"*`@`&`````@`!`%8B```@
+M1@(`"0,```(``0!O(@``(&D!`$@$```"``$`A`L``&";`@#!`````@`!`(@B
+M``"@@0(`5`````(``0"6(@``0(@"`+`````"``$`LR(``$#_`0`E`````@`!
+M`,(B``!P"@$`$0````(``0#;(@``\(8"`$D!```"``$`^"(``%"O`0`L````
+M`@`!`!(C``#@M0$`1`````(``0`O(P``0`$"`+4!```"``$`2R,``%`0`0!:
+M`````@`!`&`C``!0L@$`\@````(``0#<"P``4!@!`",````"``$`>2,``&![
+M`@#3!0```@`!`(LC```PZ@$`F0````(``0"H(P``X+X!`$T````"``$`QB,`
+M`%!,`@`-!````@`!`-\C``"@G`$`2`$```(``0`-#```@`D"`+`````"``$`
+M`20``!"E`0#P`````@`!`!XD```PH`(`<P````(``0`L)```<+H!`!<#```"
+M``$`0R0``%#!`0"<`````@`!`&`D``"@"`(`V`````(``0!])```T%\!`,H`
+M```"``$`G"0``(`D`0"6#````@`!`+DD``!PH0(`7@````(``0#*)```$+`!
+M`#`````"``$`W"0``+`%`0!:`@```@`!`/DD```0V0$`H0````(``0`7)0``
+M\.D!`#D````"``$`.24``)"O`0!U`````@`!`%0E``#`>@(`0@````(``0!I
+M)0``4.8!`"T````"``$`@R4``*#>`0#B`0```@`!`),E```P0`(`-@,```(`
+M`0#:#```0,("`,`````"``$`L24``(#I`0!M`````@`!`,(E``"@[0$`C0``
+M``(``0#=)0``,.8!`"`````"``$`^"4``/`2`0!$`````@`!`!H-```P"@(`
+ML`````(``0`,)@``4`X!`$<````"``$`&B8``%",`@!3`````@`!`"X-``!@
+M>0(`5P````(``0`^#0``X`````0````!``D`@`T``/#3`0`F`````@`!`$(F
+M``!`"P$`00````(``0!;)@``D&4!`(@#```"``$`>"8``."7`0`J`0```@`!
+M`)XF``"0K`$`!@$```(``0"])@``X`L!`&$"```"``$`W"8``,#$`0"C````
+M`@`!```G``"0Y0$`10````(``0`9)P``8(("`!@````"``$`,R<``&#.`0#A
+M`````@`!`%PG``!P80$`8`,```(``0!U)P``L(\!`&T%```"``$`C"<``"`!
+M```<`````0`)`)\G``!@P`$`Y0````(``0"])P``0(H"``8````"``$`'`X`
+M`)"]`@!]`````@`!`-<G``"`L`$`*P````(``0#T)P``T*<!`"`$```"``$`
+M$R@``!`S`0!,`P```@`!`"TH```@U`$`&P$```(``0!"*```4``"`.@````"
+M``$`6"@``'#%`0`"`0```@`!`'LH``"`B@(`)0````(``0"8*```0-8!`#``
+M```"``$`KB@``)`H`@"E`````@`!`,0H``#0L`(`.P4```(``0#A*```,-`!
+M`+$````"``$`!2D``*`(`0!+`````@`!`!<I```0'0$`,`$```(``0`X*0``
+M<),"`*8!```"``$`42D``+"P`0`_`````@`!`&XI```PM@$`*@````(``0",
+M*0``L$($`%4````"``$`FBD``)`5`P":`````@`!`*HI````)@,`>@T```(`
+M`0#$*0``0#,$`,H)```"``$`U"D``&`^`P")`````@`!`.0I``#H`0``!```
+M``$`"0#T*0``P!,#``\````"``$`"2H``,`V`P`U`@```@`!`!XJ``#P+`0`
+M5`````(``0`V*@``00(```$````!``<`1BH``+!0`P"<`````@`!`%8J``"@
+M)`0`#@$```(``0!G*@``L"4$`)0````"``$`>RH``-`M!`"8`@```@`!`)$J
+M``#01@,`)0$```(``0"G*@``[`$```0````!``D`M2H``#`D!`!O`````@`!
+M`,TJ``#0_`,`AP````(``0#<*@``H&T#`$$````"``$`[BH``!`+`P`]`0``
+M`@`!``$K````2`,`I`$```(``0`9*P``0/T"`$L````"``$`+2L````Y`P!N
+M`@```@`!`$$K``!0-0,`6P````(``0!/*P``8!(#`*H````"``$`9"L``!`8
+M`P!9`````@`!`'4K```0$@,`1`````(``0",*P``]`$```$````!``D`H"L`
+M```\`P!?`````@`!`+LK``"`,P,`PP$```(``0#/*P``<#L#`(,````"``$`
+MWRL``,#^`@`D`````@`!`.@K``"P^P(`B`````(``0`$+```<#`$`/<````"
+M``$`&BP``'`B`P`;`P```@`!`"TL```P(00`.@````(``0`V+```$$,$`%4`
+M```"``$`1"P``+`@`P"V`0```@`!`&`L``"0;`,`^`````(``0!K+```@'`#
+M`+`````"``$`@2P``+"L`P`/`0```@`!`),L``"P;P,`SP````(``0"L+```
+MT!4$`$L````"``$`O2P``.!!`P!"`````@`!`,@L``"@%P0`B00```(``0#9
+M+```,!0#`'P````"``$`[BP``%`C!`#2`````@`!`/TL``"0`P,`W`````(`
+M`0`0+0``,/L"`!,````2``$`-RT``/@!```!````$0`)`$PM````````````
+M`!````!C+0``D$($`!(````2``$`>BT`````````````$````(TM``!@_@(`
+M)P```!(``0"?+0``@$$$`#D````2``$`KBT``%`,`P#F`0``$@`!`,4M``#@
+M`0,`B0```!(``0#<+0`````````````0````]"T``!!"!`!:````$@`!``TN
+M``"0^P(`$0```!(``0`D+@``@`H#`(L````2``$`.RX`````````````$```
+M`%8N```0``,`5P```!(``0!E+@`````````````0````;"X``'```P#&````
+M$@`!`'\N````_@(`)0```!(``0"6+@``8`4#`!P````2``$`JBX``-`.`P!7
+M`0``$@`!`,`N``!0)@0`6@(``!(``0#=+@``\`$```0````1``D`]"X``+`H
+M!``U!```$@`!``XO`````````````!`````C+P``<`0#`$D````2``$`.2\`
+M`)`6`P!>````$@`!`%0O``"0;0,`"@```!(``0!N+P`````````````0````
+M@"\``,!!!`!0````$@`!`)4O``#@`0``!````!$`"0"E+P``P!4$`!`````2
+M``$`OB\``)#_`@!Y````$@`!`-,O``#Y`0```0```!$`"0#K+P``D-,``!@`
+M```2``$`!C``````````````$````!`P```0%00`B````!(``0`G,```````
+M```````0````/C```'`"`P!8````$@`!`%$P`````````````!````!;,```
+MY`$```0````1``D`:C```$`!`P"8````$@`!`((P``#0`@,`P````!(``0"3
+M,```@&P#``L````2``$`JS``````````````$````,(P```P<0,`+P```!(`
+M`0#2,```]P$```$````1``D`[C``````````````$`````$Q````````````
+M`!`````4,0``0P(```$````1``<`*#$``!`%`P`B````$@`!`$TQ``"0'00`
+M2P,``!(``0!;,0``,*0"`!@````2``$`>#$``$`%`P`9````$@`!`)0Q````
+M`````````!````"L,0``,!P$`%4````2``$`P3$`````````````$````-<Q
+M``!0+00`?P```!(``0#R,0``X"`$`$H````2``$`!C(`````````````$```
+M`!8R`````````````!`````M,@``<$($`!(````2``$`1#(`````````````
+M$````%<R``"@_@(`%````!(``0!S,@``0/P"`,$````2``$`CC(``$`"```!
+M````$0`'`*$R``!0^P(`"P```!(``0"Y,@``]0$```$````1``D`U#(`````
+M````````$````-XR```0/00`]P(``!(``0#^,@``D$`$``,````2``$`&#,`
+M`)`>`P#%`0``$@`!`"\S``!`#@,`CP```!(``0!%,P``\/X"`#4````2``$`
+M7C,`````````````$````'4S``!@^P(`*````!(``0"-,P`````````````0
+M````H3,``##^`@`L````$@`!`+<S`````````````!````#(,P``<$`$`!@`
+M```2``$`YC,````)`P#5````$@`!``8T`````````````!`````:-```````
+M```````0````-S0``)#^`@`-````$@`!`%$T`````````````!````!D-```
+MH!0$`&H````2``$`>S0`````````````$````)8T``!@0`0``@```!(``0"I
+M-```(!8$`%L````2``$`OC0``!`3`P"A````$@`!`-8T```00`0`3P```!(`
+M`0#T-```$/T"`"H````2``$`(C4``$("```!````$0`'`#XU```P$`,`U@``
+M`!(``0!5-0``H!4$`!X````2``$`:C4``,`$`P!)````$@`!`(DU````````
+M`````!````"@-0``H`<#`%0!```2``$`O34``##_`@!;````$@`!`-(U``!P
+M(00`.0$``!(``0#O-0``]@$```$````1``D`"C8``%!1`P"4````$@`!``!R
+M-S4P7U1A9U]);FET`'(W-3!?57!D871E4&AY26YF;P!S87-?:&%S:%]A9&1R
+M`'(W-3!?5F5R:69Y0V]M;6%N9$)E9F]R95-E;F1I;F<`<C<U,%]"965P3VX`
+M<C<U,%]30U-)7T%405]&:6QL1&%T849I96QD`'!M7W-I9U]T:6UE7V]U=`!S
+M871A7W!O<G1?<W1O<F5?<VEG`'(W-3!?359?6F5R;TUV4F5Q=65S=`!I,F-!
+M7W=R:71E7V)Y=&5S`'(W-3!?359?1'5M<%)E<75E<W0`<C<U,%]-5E]);FET
+M:6%L:7IE5&%R9V5T241486)L90!S971?<&U?9F%I;%]L960`<V%T85]M86ME
+M7W-O9G1?<F5S971?<F5Q`'(W-3!?4')E<&%R94%N9%-E;F1#;VUM86YD`$]D
+M:6Y34$E?4F1P=`!R-S4P7TU67TUA<%1O4W!E8VEF:6-487)G971)1`!R-S4P
+M7U-#4TE?051!7T9I;&Q,0D%#9&(Q,`!R-S4P7U-'4$E/7U=R:71E4F5G:7-T
+M97(`<C<U,%]&<F5E4T%405-C<F%T8VA4;U!O;VP`<C<U,%]486=?1V5T3VYE
+M`'(W-3!?3V1I;E-025]);FET`'(W-3!?1G)E94EN=&5R;F%L4F5Q5&]0;V]L
+M`'=A=&EN9U]C86QL8F%C:P!R-S4P7T-O;7!L971E4F5Q=65S=$%N9%-L;W0`
+M<C<U,%]#;W)E7T=E=%-U<'!O<G1E9$-O=6YT<P!035]3971&86EL3&5D0V%L
+M;&)A8VL`<C<U,%]30U-)7T%405]697)I9GE4<F%N<VQA=&EO;@!R-S4P7U]?
+M<F5N97=?=&EM97(`<C<U,%]30U-)7T%405]3=&%R=%-T;W!4<F%N<VQA=&EO
+M;@!R-S4P7T9R965$979I8V54;U!O;VP`<C<U,%]0;W)T7T%B;W)T4F5Q=65S
+M=',`<')O9'5C=%]I9`!R-S4P7T-O<F5?36]D=6QE4V5N9%)E<75E<W0`<C<U
+M,%]&<F5E4&]R=%1O4&]O;`!I,F-"7W=R:71E7V)Y=&5S`'(W-3!?0V]R95])
+M;G1E<G)U<'1397)V:6-E4F]U=&EN90!R-S4P7U-'4$E/7U)E861296=I<W1E
+M<@!R-S4P7V]D:6Y?:6]C=&P`<C<U,%]S971?9F%I;%]L960`5&5S=%]0:6Y?
+M4V5T`'(W-3!?5&%G7TES16UP='D`<C<U,%]-5E]-87!487)G971)1`!R-S4P
+M7U]?861D7W1I;65R`'(W-3!?:3)C7W)E<V5T`'(W-3!?;79?9&ES86)L95]H
+M8F$`<C<U,%]#;W)E7U)E<51I;65O=70`<C<U,%]M=E]S971?4T%3061D<@!R
+M-S4P7T-O<F5?4F5S971#;613;&]T`'(W-3!?4F5M;W9E1&5V:6-E`&DR8T%?
+M<F5A9%]B>71E<P!A:6YF;P!R-S4P7T-O<F5?36]D=6QE26YI=&EA;&EZ90!R
+M-S4P7U-#4TE?051!7U)E861#87!A8VET>51R86YS;&%T:6]N0V%L;&)A8VL`
+M<C<U,%]-5E]3971,0D%A;F1396-T;W)#;W5N=`!O9&EN7V-O<F5?=&EM97(`
+M<C<U,%]S971?9F%I;%]L961S`'(W-3!?8V]R95]H86YD;&5?=&%S:V9I;&5?
+M97)R;W(`<C<U,%]O9&EN7W-E=%]S<&EN7W5P7VUO9&4`<&U?=V%I=%]F;W)?
+M<V]F=')E<V5T`'(W-3!?;79?96YA8FQE7WAM=`!R-S4P7TQI<W1?1V5T1FER
+M<W0`<C<U,%]3051!7T5R<F]R2&%N9&QI;F<`<C<U,%]3051!7U!O<G1(86YD
+M;&5);G1E<G)U<'0`<C<U,%]&<F5E4F5G:7-T97)3970`<C<U,%]3051!7U!O
+M<G1$971E8W0`<C<U,%]0;W)T7TAA;F1L95!L=6=I;@!R-S4P7T1E=FEC95])
+M<W-U95-O9G1297-E=`!R-S4P7U]?4$U?8V%N8V5L7W1I;65R`'(W-3!?4$U?
+M1G)E95)E9VES=&5R4V5T`'(W-3!?1V5T4T="=69F97)&<F]M4&]O;`!'9713
+M051!-C1+4V-R871C:$9R;VU0;V]L`'(W-3!?1V5T1&5V:6-E1G)O;5!O;VP`
+M1G)E94]N94-O;6UA;F13;&]T`'(W-3!?4T-325]!5$%?4WEN8T-A8VAE5')A
+M;G-L871I;VX`5&5S=%]0:6Y?26YI=&EA;&EZ90!R-S4P7TU67T=E=$UA<'!E
+M9$E$`$9R9653051!-C1+4V-R871C:%1O4&]O;`!R-S4P7U-!5$%?4')E<&%R
+M94-O;6UA;F1(96%D97(`;79?<&AY7W)E<V5T`'(W-3!?4T%405](86YD;&5$
+M979I8V55;G!L=6<`<C<U,%]30U-)7T%405]#:&5C:T-O;F1I=&EO;@!R-S4P
+M7T=E=$EN=&5R;F%L4F5Q1G)O;5!O;VP`<C<U,%]30U-)7T%405]296%D0V%P
+M86-I='E4<F%N<VQA=&EO;@!R-S4P7V1U;7!?=6YA<W-O8VEA=&5D7V9I<P!R
+M-S4P7T-O;7!L971E4F5Q=65S=`!R-S4P7T=E=%-!5$%38W)A=&-H1G)O;5!O
+M;VP`<C<U,%]#;W)E7TUO9'5L95-T87)T`'(W-3!?0V]R95](86YD;&5786ET
+M:6YG3&ES=`!R-S4P7U!R945M<'1Y4$T`<C<U,%]3051!7TAA;F1L941E=FEC
+M95!L=6=I;@!R-S4P7U-#4TE?5&]?1DE3`'(W-3!?4T%405]0;W)T4F5S970`
+M<C<U,%]'971/;F5#;VUM86YD4VQO=`!R-S4P7VUV7W)E<V5T7W!H>0!R-S4P
+M7U=R:71E1$5,5E]17T5N=')Y`'(W-3!?;V1I;E]S971?:61L95]S=&%N9&)Y
+M`'(W-3!?1V5T4$U&<F]M4&]O;`!R-S4P7TU67T5Q=6%L<P!R-S4P7TAA;F1L
+M94-O;6UA;F11=65U90!P;5]I;FET7W)E<5]C86QL8F%C:P!R-S4P7U-#4TE?
+M051!7U)E8617<FET951R86YS;&%T:6]N`'(W-3!?4T=486)L95]!<'!E;F0`
+M<C<U,%]035]!<W-I9VY296=I<W1E<E-E=`!P;W)T7W-E=%]F86EL7VQE9`!R
+M-S4P7U-!5$%?1&5V:6-E4W1A=&5-86-H:6YE`'(W-3!?4')E16UP='E$979I
+M8V4`<C<U,%]?7V-A;F-E;%]T:6UE<@!R-S4P7T-O<F5?<&%S<U]T:')U7V9I
+M;&Q?=&%S:V9I;&4`<C<U,%]31U!)3U]);FET:6%L:7IE`'(W-3!?4&]R=%](
+M86YD;&5$979I8V50;'5G:6X`<C<U,%]31U!)3U]3971?1F%I;&QE9`!S971?
+M<&U?9F%I;%]L961S`'(W-3!?359?0V]P>5-'5&%B;&4`=7!D871E7V1E=FEC
+M95]C;VYF:6<`<C<U,%]#;W)E7TUO9'5L945N86)L941I<V%B;&5)4E$`<C<U
+M,%]486=?26YI=%]&249/`$UA:V5$979);F9O`%!-7TES<W5E5W)I=&5&86EL
+M3&5D`'(W-3!?;V1I;E]F;&%S:%]A8V-E<W,`4T%405]035-T871E36%C:&EN
+M95-P:6Y5<`!R-S4P7U-!5$%?4&]R=$1E=FEC95)E861Y`'(W-3!?5&%G7U)E
+M;&5A<V5/;F4`<C<U,%]&<F5E4T="=69F97)4;U!O;VP`<C<U,%]$971E8W10
+M;W)T5'EP90!P;5]M86ME7W!M7W)E9VES=&5R7W)E<0!R-S4P7T1E=FEC95]0
+M87)S94ED96YT:69Y1&%T80!R-S4P7V1E=FEC95]P<F]B95]D;VYE`'(W-3!?
+M0F5E<$]F9@!G971?9FER<W1?<&T`3V1I;E-025]396-T;W)5;G!R;W1E8W0`
+M<&U?=V%I=%]F;W)?<W!I;G5P`'(W-3!?4T=486)L95]);FET`'(W-3!?4T%4
+M05]035]%<G)O<DAA;F1L:6YG`%-!5$%?2&%N9&QE4$U?2&]T4&QU9P!R-S4P
+M7U-#4TE?051!7T9I;&Q,0D%#9&(Q-@!'971!='1)9&5N=&EF>49R86UE`'(W
+M-3!?0V%T96=O<GE?0T1"7U1Y<&4`<C<U,%],:7-T7T=E=$QA<W0`<C<U,%]&
+M<F5E4$U4;U!O;VP`<C<U,%]M=E]D:7-A8FQE7W)E9VES=&5R7W-E=`!R-S4P
+M7U-!5$%?4&]R=$1E=FEC941E=&5C=&5D`'(W-3!?4&]R=%](86YD;&55;G!L
+M=6<`<C<U,%]!5$%?0T1",E1A<VM&:6QE`'(W-3!?359?4F5M;W9E5&%R9V5T
+M240`;V1I;E]S971?:&%R9%]D:7-K7VED96YT:69Y`'(W-3!?4T=486)L95]!
+M=F%I;&%B;&4`4&]R=$UA<%]2-S4P`$=E=$1E=DED96YT:69Y1G)A;64`:3)C
+M0E]R96%D7V)Y=&5S`'-A<U]A9&1R97-S7V-O=6YT`'!M7W-T871E7VUA8VAI
+M;F4`<C<U,%]0<F5P87)E1&5L:79E<GE1=65U945N=')Y`%5P9&%T94AI;5!A
+M=&A)9`!R-S4P7T-O<F5?36]D=6QE4VAU=&1O=VX`<C<U,%]035]#;W)E7U)E
+M<51I;65O=70`<C<U,%]5<&1A=&57:61E4&]R=%!H>4UA<`!R-S4P7T%S<VEG
+M;E)E9VES=&5R4V5T`'(W-3!?4V5R=FEC94EN=&5R<G5P=`!R-S4P7VUV7V1I
+M<V%B;&5?>&UT`'5P9&%T95]D979I8V5?8V]N9FEG7W8R`'(W-3!?0V]R95]-
+M;V1U;&5'971297-O=7)C95%U;W1A`'(W-3!?4&]R=%]3;V9T4F5S971#86QL
+M8F%C:P!R-S4P7VUV7W)E<V5T7WAM=`!R-S4P7VUV0VAA;FYE;%-T871E36%C
+M:&EN90!R-S4P7TDR0U]-;V1U;&5);FET:6%L:7IE`'(W-3!?;V1I;E]R96UO
+M=F5?9&5V:6-E`'(W-3!?1V5T4&]R=$9R;VU0;V]L`'(W-3!?359?1'5M<%)E
+M9VES=&5R`'!M7VAO=%]P;'5G7W)E<5]C86QL8F%C:P!035])<W-U95)E861&
+M86EL3&5D`&1C-S(X,%]31U1A8FQE7T%P<&5N9`!-86ME071T1&5V26YF;P!D
+M8S<R.#!?1G)E95-!5$%38W)A=&-H5&]0;V]L`&1C-S(X,%]0;W)T7T%B;W)T
+M4F5Q=65S=',`4$U?5W)I=&5296=3>6YC`&1C-S(X,%]3051!7U!O<G1(86YD
+M;&5);G1E<G)U<'0`9&,W,C@P7U-%4U]3971&86EL3&5D`&1C-S(X,%]305-?
+M26YT97)N86Q297%#86QL8F%C:P!D8S<R.#!?27-S=65?4F5P;W)T36%N=69A
+M8W1U<F5R26YF;W)M871I;VX`9&,W,C@P7U!O<G1?36]N:71O<@!D8S<R.#!?
+M0V]R95]-86ME1&5V:6-E4F5S971297$`9&,W,C@P7U-#4TE?5&]?1DE3`&1C
+M-S(X,%]O9&EN7W)E;6]V95]D979I8V4`9&,W,C@P7U-!5$%?4$U);FET4F5Q
+M0V%L;&)A8VL`9&,W,C@P7U!-7T-O<F5?4F5Q5&EM96]U=`!D8S<R.#!?1$E3
+M0U]'97149W1$979-87``9&,W,C@P7V]D:6Y?9FQA<VA?86-C97-S`&1C-S(X
+M,%]&<F5E4TU04V-R871C:%1O4&]O;`!D8S<R.#!?1&ES8V]V97)Y0V%L;$)A
+M8VL`9&,W,C@P7U1A9U]296QE87-E3VYE`&1C-S(X,%]#;W)E7TUO9'5L95-E
+M;F1297%U97-T`&1C-S(X,%]-5E]-87!4;U-P96-I9FEC5&%R9V5T240`9&,W
+M,C@P7T=E=%!-1&5V:6-E`&1C-S(X,%]35%!?1&5V:6-E4F5S970`9&,W,C@P
+M7T=E=$-O<F5#;VYT97AT1G)O;5!O;VP`9&,W,C@P7TU67TEN:71I86QI>F54
+M87)G971)1%1A8FQE`&1C-S(X,%]0<F5%;7!T>41E=FEC90!D8S<R.#!?3V1I
+M;E-025]);FET`&1C-S(X,%]!5$%?0T1",E1A<VM&:6QE`&1C-S(X,%]335!2
+M97-P3&5N9W1H`&1C-S(X,%]M=E]R97-E=%]P:'D`1&5V:6-E7TUA:V50<FEV
+M871E4V5N9%-E<U)E<75E<W0`9&,W,C@P7U!O<G1?1FEN9%1G=$YO`$%S<VEG
+M;D5L96UE;D1E<V-R:7!T;W).86UE`&1C-S(X,%]31U!)3U]7<FET95)E9VES
+M=&5R`$1E=FEC95]-86ME4V5S16QE;65N=%-T871U<U)E<75E<W14:6UE<@!D
+M8S<R.#!?0V]R95]);G1E<G)U<'1397)V:6-E4F]U=&EN90!D8S<R.#!?;79?
+M9&ES86)L95]X;70`9&,W,C@P7U-!5$%?4&]R=$1E=&5C=`!035]296%D4F5G
+M4WEN8P!D8S<R.#!?1G)E941E=FEC951O4&]O;`!D8S<R.#!?17AP86YD97)?
+M4TU04F5Q7T-A;&QB86-K`&1C-S(X,%]$979I8V5?36%K95-E<U)C=D1I86=2
+M97%U97-T`&1C-S(X,%]0;W)T7U-O9G1297-E=$-A;&QB86-K`&1C-S(X,%])
+M<W-U95]#;VYF:6=2;W5T94EN9F\`9&,W,C@P7U!O<G1?27-297%U97-T4G5N
+M;FEN9P!D8S<R.#!?5F5R:69Y0V]M;6%N9$)E9F]R95-E;F1I;F<`9&,W,C@P
+M7T1E=FEC95]-86ME4W1A<G13=&]P56YI=%)E<75E<W0`9&,W,C@P7T9R965%
+M>'!A;F1E<E1O4&]O;`!D8S<R.#!?0V]R95)E<W1O<F5/<FEG:6YA;$-$0@!D
+M8S<R.#!?4&]S=$UA:V5397-%;F-L;W-U<F53=&%T=7-297%U97-T`&1C-S(X
+M,%]D=6UP7W5N87-S;V-I871E9%]F:7,`9&,W,C@P7TU67UIE<F]-=E)E<75E
+M<W0`9&,W,C@P7T=E=%!O<G1&<F]M4&]O;`!D8S<R.#!?1FEN9$%S8VEI3G5M
+M8F5R`&1C-S(X,%]305-?4&]R=%)E<V5T`&1C-S(X,%]-5E]'971-87!P961)
+M1`!D8S<R.#!?4T-325]!5$%?4F5A9%=R:71E5')A;G-L871I;VX`9&,W,C@P
+M7U!O<W1-86ME4V5S0V]N9FEG=7)A=&EO;E)E<75E<W0`9&,W,C@P7T1E=FEC
+M95]-86ME4F5Q=65S=%1A<VM297%U97-T`&1C-S(X,%]0;W)T7TAA;F1L941E
+M=FEC95!L=6=I;@!D8S<R.#!?4$U?07-S:6=N4F5G:7-T97)3970`9&,W,C@P
+M7T-O<F5?4F5S971#;613;&]T`&1C-S(X,%]M=E]D:7-A8FQE7VAB80!D8S<R
+M.#!?7U]A9&1?=&EM97(`9&,W,C@P7U-#4TE?36%K94UO9&5086=E0V%C:&EN
+M9P!D8S<R.#!?0T]215])<W-U95--4%)E<75E<W0`<V5T7V5M7V9A:6Q?;&5D
+M`&1C-S(X,%]!<W-I9VY$979I8V5/=F5R86QL16QE;65N=$YU;6)E<@!D8S<R
+M.#!?5W)I=&5$14Q67U%?16YT<GD`9&,W,C@P7U-#4TE?051!7U9E<FEF>51R
+M86YS;&%T:6]N`&1C-S(X,%]C;W)E7VAA;F1L95]T87-K9FEL95]E<G)O<@!D
+M8S<R.#!?4T=024]?4TU04F5Q=65S=%]7<FET90!D8S<R.#!?4T%37TAA;F1L
+M94-O;7!L971E9$-O;6UA;F0`9&,W,C@P7T1E=FEC95]-86ME4F5A9$-A<&%C
+M:71Y,39487-K4F5Q=65S=`!D8S<R.#!?4&]S=$UA:V5397-%;&5M96YT4W1A
+M='5S4F5Q=65S=`!D8S<R.#!?4T%405]035](86YD;&5$979I8V50;'5G:6X`
+M9&,W,C@P7V]D:6Y?<V5T7W-P:6Y?=7!?;6]D90!D8S<R.#!?0V]R95](86YD
+M;&5786ET:6YG3&ES=`!D8S<R.#!?4')E<&%R941E;&EV97)Y475E=65%;G1R
+M>0!D8S<R.#!?4T=024]?4TU04F5Q=65S=%]296%D`&1C-S(X,%]$25-#7T-A
+M;F-E;$1I<V-O=F5R`&1C-S(X,%]5<&1A=&57:61E4&]R=%!H>4UA<`!D8S<R
+M.#!?2&%N9&QE0V]M;6%N9%%U975E`&1C-S(X,%]$25-#7T=E=%)E<V]U<F-E
+M`&1C-S(X,%]30U-)7T%405]&:6QL3$)!0V1B,38`9&,W,C@P7T-O<F5?36]D
+M=6QE16YA8FQE1&ES86)L94E240!D8S<R.#!?:3)C7W)E<V5T`&1C-S(X,%]&
+M<F5E4F5G:7-T97)3970`9&,W,C@P7T)E97!/9F8`<V5T7V5M7V9A:6Q?;&5D
+M<P!D8S<R.#!?1$E30U]#:&5C:T1I<V-O=F5R4W1A=&4`9&,W,C@P7T5X<&%N
+M9&5R7U--4%)E<75E<W1?4F5P;W)T1V5N97)A;`!D8S<R.#!?23)#7TUO9'5L
+M94EN:71I86QI>F4`9&,W,C@P7V1E=FEC95]P<F]B95]D;VYE`&1C-S(X,%]2
+M96UO=F5$979I8V4`9&,W,C@P7U)U;G1I;65)<W-U95-O9G1297-E=$-A;&QB
+M86-K`&1C-S(X,%]31U!)3U]3971?1F%I;&QE9`!D8S<R.#!?1V5T36%X3F5G
+M;W1I871E9$QI;FM2871E`&1C-S(X,%]&<F5E4T534T)4;U!O;VP`9&,W,C@P
+M7TQI<W1?1V5T3&%S=`!D8S<R.#!?4$U?27-S=657<FET95)E9P!D8S<R.#!?
+M<V5T7V9A:6Q?;&5D`&1C-S(X,%]486=?27-%;7!T>0!D8S<R.#!?57!D871E
+M5&=T1&5V36%P`&1C-S(X,%]486=?26YI=`!G971?:61?9G)O;5]E;F-)9`!3
+M15-?4')I=F%T95)E<4-A;&QB86-K`&1C-S(X,%]3051!7U!-2&]T<&QU9U)E
+M<4-A;&QB86-K`%-!4U]297!O<G1,=6Y38V%N`&1C-S(X,%]0;W-T36%K95-E
+M<T5L96UE;G1$97-C<FEP=&]R4F5Q=65S=`!D8S<R.#!?1G)E95!O<G14;U!O
+M;VP`9&,W,C@P7TU67TUA<%1A<F=E=$E$`&1C-S(X,%]035])<W-U95)E8612
+M96<`9&,W,C@P7T-O<F5?36]D=6QE4VAU=&1O=VX`9&,W,C@P7U5P9&%T95!H
+M>4EN9F\`9&,W,C@P7U]?<F5N97=?=&EM97(`9&,W,C@P7T1E=FEC95]-86ME
+M4F5A9$-A<&%C:71Y5&%S:U)E<75E<W0`9&,W,C@P7T=E=$1E=FEC949R;VU0
+M;V]L`&1C-S(X,%]'971315-30D9R;VU0;V]L`&1C-S(X,%]!<W-I9VY%;&5M
+M96YT4VQO=$YU;6)E<@!!<W-I9VY397-/=&AE<D5L96UE;G1/=F5R86QL16QE
+M;65N=$YU;6)E<@!D8S<R.#!?4&]R=%](86YD;&55;G!L=6<`9&,W,C@P7T-O
+M<F5?36]D=6QE4W1A<G0`9&,W,C@P7T1I<V-O=F5R>5--`&1C-S(X,%]30U-)
+M7T%405]#:&5C:T-O;F1I=&EO;@!D8S<R.#!?359?0V]P>5-'5&%B;&4`9&,W
+M,C@P7U-!5$%?1&5V:6-E4W1A=&5-86-H:6YE`&1C-S(X,%]$979I8V5?36%K
+M94EN<75I<GE487-K4F5Q=65S=`!D8S<R.#!?1&5V:6-E7U!A<G-E261E;G1I
+M9GE$871A`&1C-S(X,%]3051396YS941A=&$`9&,W,C@P7T=E=$Y#451A9P!O
+M9&EN7V5M7V%C8V5S<P!D8S<R.#!?;79#:&%N;F5L4W1A=&5-86-H:6YE`&1C
+M-S(X,%]3=&]R95]#;VYF:6=2;W5T94EN9F\`9&,W,C@P7U-'5&%B;&5?26YI
+M=`!D8S<R.#!?1V5T17AP86YD97)&<F]M4&]O;`!$979I8V5?4F5P;W)T3'5N
+M4F5Q=65S=`!D8S<R.#!?4T%37TAA;F1L94)21$-35`!D8S<R.#!?0V]R95-A
+M=F5/<FEG:6YA;$-$0@!D8S<R.#!?359?1'5M<%)E<75E<W0`9&,W,C@P7TQI
+M<W1?1V5T1FER<W0`9&,W,C@P7U-#4TE?051!7T9I;&Q$871A1FEE;&0`9&,W
+M,C@P7U-#4TE?051!7U-Y;F-#86-H951R86YS;&%T:6]N`&1C-S(X,%]31U!)
+M3U]);FET:6%L:7IE`&1C-S(X,%]&<F5E4TU00V]N=&5X=`!D8S<R.#!?1FEL
+M;$5N8VQO<W5R945L96UE;G13=&%T=7,`9&,W,C@P7T-O<F5?36]D=6QE26YI
+M=&EA;&EZ90!D8S<R.#!?4T%405]035-T871E36%C:&EN90!D8S<R.#!?1G)E
+M95!-5&]0;V]L`&1C-S(X,%]3051!7U!R97!A<F5#;VUM86YD5&%B;&4`9&,W
+M,C@P7T-O<F5?36]D=6QE1V5T4F5S;W5R8V51=6]T80!D8S<R.#!?1G)E95-'
+M0G5F9F5R5&]0;V]L`&1C-S(X,%]486=?26YI=%]&249/`&1C-S(X,%]30U-)
+M7T%405]296%D0V%P86-I='E4<F%N<VQA=&EO;D-A;&QB86-K`&1C-S(X,%]?
+M7U!-7V-A;F-E;%]T:6UE<@!D8S<R.#!?359?1'5M<%)E9VES=&5R`&1C-S(X
+M,%]397)V:6-E26YT97)R=7!T`$1E=FEC95]-86ME4')I=F%T95)E8W9397-2
+M97%U97-T`&1C-S(X,%])<W-U95]$:7-C;W9E<@!D8S<R.#!?1$E30U]$;T1I
+M<V-O=F5R`&1C-S(X,%]3051!7TAA;F1L941E=FEC955N<&QU9P!D8S<R.#!?
+M0V]R95]);G1E<FYA;%-E;F1297%U97-T`&1C-S(X,%]$25-#7U-E=%)E<V]U
+M<F-E`&1C-S(X,%]3051!7U!-7TAA;F1L941E=FEC955N<&QU9P!D8S<R.#!?
+M4T%405]0;W)T1&5V:6-E1&5T96-T960`9&,W,C@P7U5P9&%T951A<F=E=$1E
+M=FEC97,`9&,W,C@P7U-#4TE?051!7U-T87)T4W1O<%1R86YS;&%T:6]N`&-H
+M96-K7U-A<T%D9'(`9&,W,C@P7T-O<F5?<&%S<U]T:')U7V9I;&Q?=&%S:V9I
+M;&4`9&,W,C@P7VUV7V1I<V%B;&5?<F5G:7-T97)?<V5T`$1E=FEC95]497-T
+M56YI=%)E861Y4F5Q=65S=`!D8S<R.#!?07-S:6=N1&5V:6-E16QE;65N=$YU
+M;6)E<@!D8S<R.#!?1V5T36EN3F5G;W1I871E9$QI;FM2871E`&1C-S(X,%]M
+M=E]S971?4T%3061D<@!D8S<R.#!?4$U?1G)E95)E9VES=&5R4V5T`&1C-S(X
+M,%]%>'!A;F1E<E]335!297%U97-T7U!H>4-O;G1R;VP`9&,W,C@P7TU67T5Q
+M=6%L<P!D8S<R.#!?1V5T4T="=69F97)&<F]M4&]O;`!D8S<R.#!?4T-325]!
+M5$%?3&]W97)7;W)D`&1C-S(X,%]#:&5C:T1E=FEC94-H86YG90!D8S<R.#!?
+M4T%37T5R<F]R2&%N9&QI;F<`9&,W,C@P7T)E97!/;@!D8S<R.#!?4T=024]?
+M4TU04F5Q7T-A;&QB86-K`'-C<VEL=6Y?=&]?:6YT`&1C-S(X,%]31U1A8FQE
+M7T%V86EL86)L90!D8S<R.#!?4TU07U-'4$E/7U-E=%]&86EL;&5D`&1C-S(X
+M,%]#;W)E7T9I;&Q396YS941A=&$`9&,W,C@P7T=E=%--4%-C<F%T8VA&<F]M
+M4&]O;`!D8S<R.#!?4T%405]0;W)T1&5V:6-E4F5A9'D`9&,W,C@P7VUV7V5N
+M86)L95]X;70`9&,W,C@P7T%S<VEG;E)E9VES=&5R4V5T`&1C-S(X,%]O9&EN
+M7VEO8W1L`&1C-S(X,%])<W-U95]297!O<G12;W5T94EN9F\`9&,W,C@P7T=E
+M=$EN=&5R;F%L4F5Q1G)O;5!O;VP`9&,W,C@P7T-H96-K5&%R9V5T0VAA;F=E
+M`&1C-S(X,%]$979I8V5?5W)I=&5397-#;VYT<F]L1&EA9P!315-4:6UE<E])
+M;G1E<FYA;%)E<4-A;&QB86-K`&=E=%]E;F-?8V]U;G0`9&,W,C@P7T-O;7!L
+M971E4F5Q=65S=`!D8S<R.#!?4G5N=&EM94ES<W5E4V]F=%)E<V5T`&1C-S(X
+M,%]$979I8V5?27-S=653;V9T4F5S970`9&,W,C@P7U-!5$%?2&%N9&QE1&5V
+M:6-E4&QU9VEN`&1C-S(X,%]0<F5P87)E06YD4V5N9$-O;6UA;F0`9V5T7VUI
+M;E]P;5!A=&A)9`!D8S<R.#!?4')E16UP='E030!D8S<R.#!?4T-325]-86ME
+M0V%C:&5#;VUM86YD`&1C-S(X,%]#;VUP;&5T95)E<75E<W1!;F13;&]T`&1C
+M-S(X,%]$25-#7T=E=$YE9V]T:6%T961,:6YK4F%T90!D8S<R.#!?1FEN9%)U
+M;FYI;F=297%">51A9P!D8S<R.#!?<V5T7V9A:6Q?;&5D<P!D8S<R.#!?1FEN
+M9$9R965335!#;VYT97AT`%)E;6]V95-!4T1E=FEC90!D8S<R.#!?4T%37T1E
+M=FEC95-T871E36%C:&EN90!D8S<R.#!?1FEN9%1G=$YO`&1C-S(X,%])<W-U
+M95]297!O<G1'96YE<F%L`&1C-S(X,%]#86QC=6QA=&52;W5T94EN9&5X`&1C
+M-S(X,%]M=E]R97-E=%]X;70`9&,W,C@P7TU67T-20P!D8S<R.#!?4T-325]!
+M5$%?4F5A9$-A<&%C:71Y5')A;G-L871I;VX`9&,W,C@P7TU67U)E;6]V951A
+M<F=E=$E$`&1C-S(X,%]3051!7U!-7T5R<F]R2&%N9&QI;F<`9&,W,C@P7U5P
+M9&%T95-T871U<U9S4V5S0V]N=')O;$)U9F9E<@!D8S<R.#!?0V]R95]'9713
+M=7!P;W)T961#;W5N=',`9&,W,C@P7TU67U-E=$Q"06%N9%-E8W1O<D-O=6YT
+M`&1C-S(X,%]$979I8V5?36%K94UO9&5396QE8W1297%U97-T`&1C-S(X,%]'
+M971/;F5#;VUM86YD4VQO=`!D8S<R.#!?4T=024]?4F5A9%)E9VES=&5R`&1C
+M-S(X,%]%>'!A;F1E<E]335!297%U97-T7U)E<&]R=%!(65-!5$$`9&,W,C@P
+M7U!O<G1?2&%N9&QE4&QU9VEN`&1C-S(X,%]#;W)E7U)E<51I;65O=70`9&,W
+M,C@P7VUO9&5086=E0G5F`&1C-S(X,%]2=6YT:6UE27-S=65296%D3&]G17AT
+M`&1C-S(X,%]30U-)7T%405]5<'!E<E=O<F0`9&,W,C@P7T9R965#;W)E0V]N
+M=&5X=%1O4&]O;`!D8S<R.#!?4T537TEN=&5R;F%L4F5Q0V%L;&)A8VL`9&,W
+M,C@P7U-!5$%?17)R;W)(86YD;&EN9P!D8S<R.#!?1V5T4$U&<F]M4&]O;`!D
+M8S<R.#!?1&5T96-T4&]R=%1Y<&4`9&,W,C@P7T1E=FEC95]-86ME36]D95-E
+M;G-E4F5Q=65S=`!D8S<R.#!?4T-325]!5$%?1FEL;$Q"04-D8C$P`&1C-S(X
+M,%]?7V-A;F-E;%]T:6UE<@!D8S<R.#!?4T%405]0;W)T4F5S970`9&,W,C@P
+M7V]D:6Y?<V5T7VED;&5?<W1A;F1B>0!D8S<R.#!?17AP86YD97)?4TU04F5Q
+M=65S=%]$:7-C;W9E<@!D8S<R.#!?5&%G7T=E=$]N90!D8S<R.#!?4T%405]0
+M<F5P87)E0V]M;6%N9$AE861E<@!D8S<R.#!?0V%T96=O<GE?0T1"7U1Y<&4`
+M9&,W,C@P7T9R965);G1E<FYA;%)E<51O4&]O;`!D8S<R.#!?1V5T4T%405-C
+M<F%T8VA&<F]M4&]O;`!3=V%P2'!T365T858S`&QD;5]S<&EN=7!?=F1E=@!R
+M87=?8VAE8VM?9&ES:U]D97-C<FEP=&]R`&QD;5]C:&5C:U]A<G)A>0!L9&U?
+M<F5C:&5C:U]A;&P`=F1E=E]C;&%S<U]L:7-T`')A=U]I9&QE7W1I;65R7W)E
+M<V5T`&QD;5]D96QE=&5?<&%R=&ET:6]N`&QD;5]S>6YC7V-H86YG961?87)R
+M87ES`&=R96)U:6QD;VYE<G)O<@!L9&U?<75E=65?979E;G0`=')A;G-F;W)M
+M7VYE961E9`!L9&U?8VAE8VM?=')A;G-F;W)M`&QD;5]F:7AU<%]A<G)A>5]S
+M=&%T90!C86QC7W)E8G5I;&1?<')O9W)E<W,`=F)U<U]E>'1?<VEZ90!S971?
+M=')A;G-F;W)M7W-T97!?:6YF;P!L9&U?:61L95]T:6UE<@!L9&U?9FEN9%]V
+M9&5V7W)A=P!L9&U?<F5P<F]B95]D979I8V4`8V%L8U]T<F%N<V9O<FU?<')O
+M9W)E<W,`;&1M7V9I;F1?=F1E=E]C;&%S<P!L9&U?86QL;V-?<&%R=&ET:6]N
+M`&QD;5]I;FET7V1I<VL`<F5F<F5S:%]R87=?9&5V7VEN9F\`7V1E;&5T95]R
+M87=?<&%R=`!R87=?<F5A9%]W<FET95]S96-T;W)S`&=I9&QE<W1A;F1B>71I
+M;65O=70`<F%W7V-H96-K7V%R<F%Y7V1E<V-R:7!T;W(`;&1M7V-R96%T95]V
+M9&5V7W)A=P!U;G!L=6=?<F%W7W9D978`0VAE8VM3=6T`8V]M<&%R95]S;&]T
+M7W-E<5]B>5]P8VEA9&1R`&QD;5]A9&1?9&ES:U]T;U]A<G)A>0!L9&U?<WEN
+M8U]D:7-K7VEN9F\`9V5T7V)I=',`4W=A<$AP=$UE=&%6-`!R87=?8V]N=F5R
+M=%]S<&%R95]T;U]L96=A8WD`9DYO=&EF>4=520!L9&U?9FQU<VA?86QL7W1A
+M<F=E=',`;&1M7W-T87)T7W)E8G5I;&0`;&1M7W-P:6YD;W=N7V%L;%]R87=D
+M979S`%]?;&1M7V9I;FES:%]C;60`241?5$]?5D1%5@!?7W9D979?<75E=65?
+M8VUD`')A=U]I9&QE7W1I;65R7V-H96-K`&=E=%]S=')I<%]I;F9O`&QD;5]R
+M97-U;65?861A<'1E<@!H<'1N<E]L9&U?<F5G:7-T97)?:&EM7U)?-E\U-5\W
+M-5\T-E\V-`!H<'1N<E]G1VQO8F%L3F-Q1FQA9P!H<'1N<E]O<U]R97%U97-T
+M7W1I;65R`&AP=&YR7V1M87!O;VQ?9V5T7W!A9V4`:'!T;G)?;W-?9V5T7W-T
+M86UP`&AP=&YR7VQD;5]S=7-P96YD`&AP=&YR7VQD;5]I9&QE`&AP=&YR7VQD
+M;5]G971?;65M7VEN9F\`:'!T;G)?;&1M7W)E;6]V95]T:6UE<@!H<'1N<E]P
+M8VEC9F=?<F5A9%]D=V]R9`!H<'1N<E]D;6%P;V]L7VUA:V5?;W)D97(`:'!T
+M;G)?;&1M7V=E=%]V8G5S7V5X=`!H<'1N<E]L9&U?<F5L96%S95]V9&5V`&AP
+M=&YR7V9R965L:7-T7W)E<V5R=F5?9&UA`&AP=&YR7VQD;5]I;G1R`&UE;6-P
+M>0!H<'1N<E]L9&U?;VY?=&EM97(`:'!T;G)?;&1M7V=E=%]C;61?<VEZ90!H
+M<'1N<E]L9&U?9G)E95]C;61S`&AP=&YR7VQD;5]C<F5A=&5?=F1E=@!H<'1N
+M<E]L9&U?861D7W-P87)E7W1O7V%R<F%Y`&AP=&YR7V=R96)U:6QD<')I;W)I
+M='D`:'!T;G)?;&1M7W-Y;F-?87)R87E?:6YF;P!H<'1N<E]O<U]M87!?<&-I
+M7V)A<@!H<'1N<E]?7VQD;5]A;&QO8U]C;60`:'!T;G)?:6YI=%]M;V1U;&5?
+M=F1E=E]R87<`:'!T;G)?;&1M7W-E=%]A=71O<F5B=6EL9`!H<'1N<E]?7V1U
+M;6UY7W)E9P!H<'1N<E]D;6%P;V]L7V%C=&EV90!H<'1N<E]V8G5S7VQI<W0`
+M:'!T;G)?;&1M7W%U975E7W9B=7-?9'!C`&AP=&YR7VQD;5]R97-E=%]V8G5S
+M`&AP=&YR7V=31U!)3U!A<G13=7!P;W)T`&AP=&YR7VEN:71?;6]D=6QE7VAI
+M;5]R-S4P`%]?=6UO9&1I,P!H<'1N<E]L9&U?<F5L96%S95]L;V-K`&AP=&YR
+M7V]S7W5N;6%P7W!C:5]B87(`:'!T;G)?;&1M7W-H=71D;W=N`%]?=61I=F1I
+M,P!H<'1N<E]H:6U?;&ES=`!H<'1N<E]L9&U?<F5Q=65S=%]T:6UE<@!H<'1N
+M<E]L9&U?<F5S=6UE`&AP=&YR7VQD;5]G971?9&5V:6-E7VED`&AP=&YR7V]S
+M7W-C:&5D=6QE7W1A<VL`:'!T;G)?;&1M7VEO8W1L`&AP=&YR7V=3<&EN=7!/
+M;F5$979%86-H5&EM90!H<'1N<E]F<F5E;&ES=%]P=70`:'!T;G)?;W-?<W1A
+M;&QE>&5C`&AP=&YR7V=?;&5G86-Y7VUO9&4`:'!T;G)?;&1M7V%L;&]C7V-M
+M9'-?4E\V7S4U7S<U7S0V7S8T`&AP=&YR7VQD;5]R=6X`:'!T;G)?:6YI=%]M
+M;V1U;&5?:&EM7V1C-S(X,`!H<'1N<E]L9&U?9G)E95]C;61S7W1O7VQI<W0`
+M:'!T;G)?;W-?;6%X7V-A8VAE7W-I>F4`:'!T;G)?=F1E=E]Q=65U95]C;60`
+M:'!T;G)?;W-?9V5T7W9B=7-?<V5Q`&AP=&YR7VQD;5]S>6YC7V%R<F%Y7W-T
+M86UP`&AP=&YR7VQD;5]Q=65U95]C;60`:'!T;G)?;W-?<')I;G1K`&AP=&YR
+M7V9R965L:7-T7W)E<V5R=F4`:'!T;G)?9&UA<&]O;%]P=71?<&%G90!H<'1N
+M<E]F<F5E;&ES=%]G970`:'!T;G)?;&1M7W5N<F5G:7-T97)?9&5V:6-E`&AP
+M=&YR7VQD;5]R96=I<W1E<E]A9&%P=&5R`&AP=&YR7V=A=71O<F5B=6EL9`!H
+M<'1N<E]L9&U?9V5T7W9B=7-?<VEZ90!H<'1N<E]D96QA>5]B971W965N7W-P
+M:6YU<`!H<'1N<E]M<VD`:'!T;G)?;&1M7V=E;F5R:6-?;65M8F5R7V9A:6QE
+M9`!H<'1N<E]D;6%P;V]L7V=E=%]P86=E7V%T`&AP=&YR7VQD;5]E=F5N=%]N
+M;W1I9GD`:'!T;G)?;&1M7V-R96%T95]V8G5S`&AP=&YR7VAI;5]H86YD;&5?
+M=&]?=F)U<P!H<'1N<E]F<F5E;&ES=%]G971?9&UA`&AP=&YR7VQD;5]G971?
+M;F5X=%]V8G5S`&AP=&YR7V]S7W!C:5]W<FET96P`:'!T;G)?;&1M7V9I;F1?
+M=&%R9V5T`&AP=&YR7V1E8G5G7V9L86<`:'!T;G)?9&UA<&]O;%]R96=I<W1E
+M<E]C;&EE;G0`:'!T;G)?;&1M7VEN:71I86QI>F5?=F)U<U]A<WEN8P!H<'1N
+M<E]O<U]Q=65R>5]T:6UE`&AP=&YR7V]S7W%U97)Y7W)E;6]V95]D979I8V4`
+M:'!T;G)?;&1M7W)E9VES=&5R7V1E=FEC90!H<'1N<E]O<U]P8VE?<F5A9&P`
+M:'!T;G)?;&1M7V%C<75I<F5?;&]C:P!H<'1N<E]O<U]R979A;&ED871E7V1E
+M=FEC90!H<'1N<E]D;6%P;V]L7VEN:70`:'!T;G)?;&1M7V9I;FES:%]C;60`
+M:'!T;G)?;&1M7VED95]F:7AS=')I;F<`:'!T;G)?9&UA<&]O;%]M87A?8VQA
+M<W-?<&%G97,`:'!T;G)?;&1M7W)E9VES=&5R7W9D979?8VQA<W-?4E\V7S4U
+M7S<U7S0V7S8T`&AP=&YR7VYU;5]D<FEV97-?<&5R7W-P:6YU<`!H<'1N<E]L
+M9&U?<F5L96%S95]V8G5S`&AP=&YR7VQD;5]Q=65U95]T87-K`&AP=&YR7VQD
+M;5]A;&QO8U]C;61S7V9R;VU?;&ES=`!H<'1N<E]F<F5E;&ES=%]P=71?9&UA
+M`&AP=&YR7VQD;5]T:6UE<E]P<F]B95]D979I8V4`:'!T;G)?;&1M7V9I;F1?
+M<W1A;7``:'!T;G)?;&1M7V-H96-K7V%R<F%Y7V]N;&EN90!H<'1N<E]G4')O
+M8F5);DEN:71I86QI>FEN9P!H<'1N<E]L;V=?<V5C=&]R7W)E<&%I<@````@#
+M```".```N@8```$%``"_!@```CT"``P'```"$@(`Q`<```$>`@#T!P```1X"
+M`%0(```!'@(`W0@```$>`@`8"0```1X"`(()```",@(`O`D```(R`@#^"0``
+M`C("`#@*```",@(`G`H```*M``"H"@```C("`+0*```"2@``*`L```$>`@`V
+M"P```1X"`$<+```",@(`6@L```$>`@!H"P```1X"`'L+```!'@(`A`L```$>
+M`@"G"P```C("`+(+```!'@(`TPL```(R`@#>"P```1X"`/\+```!'@(`&@P`
+M``$>`@!C#````1X"`'H,```!'@(`E@P```$>`@"K#````1X"`,D,```!'@(`
+MU`P```$>`@`!#0```C("``\-```!'@(`-@T```(R`@!$#0```1X"`#01```"
+M,@(`1A$```$>`@!P$0```C("`($1```!'@(`GQ$```$%``"D$0```CT"`-81
+M```",@(`Z!$```$>`@`4$@```C("`"42```!'@(`4!(```(R`@!B$@```1X"
+M`(X2```",@(`GQ(```$>`@#5$@```1X"`.X2```!!0``\Q(```(]`@`%$P``
+M`1X"`"(3```!'@(`I1,```(+`@"X$P```ID``-P3```"2P``0!0```(^``!,
+M%````B8``&\4```"$@``AA0```)V``"E%````:$``,`4```!!0``Q10```(]
+M`@#B%````DD"`/\4```"20(`&A4```(L``!%%0```1X"`'@5```!'@(`ZA4`
+M``$>`@`#%@```1X"`"$6```"%0``2Q8```$>`@!@%@```1X"`,46```!'@(`
+MW18```$>`@`%%P```@L"`"47```"FP``9!<```)+``":%P```DD"`+87```"
+M+0``Y!<```)=``#P%P```C("`!88```!`0``01@```(K`@!?&````1X"`&\8
+M```!'@(`DQ@```$>`@"C&````1X"`,L8```!'@(`]1@```$>`@`D&0```1X"
+M`#T9```!'@(`;AD```$%``!S&0```CT"`)$9```!'@(`NQD```$>`@`&&@``
+M`1X"`"(:```!'@(`/QH```$>`@!;&@```1X"`*L:```"20(`T!H```(+`@#>
+M&@```90``/`:```"*P(`%1L```$&```:&P```CT"`#P;```!'@(`61L```$>
+M`@!U&P```C("`(4;```!'@(`I1L```$>`@#"&P```1X"`-X;```",@(`[AL`
+M``$>`@`2'````1X"`$(<```"%0``I1P```(M``#('````BT``-X<```"I0``
+MHAT```(M``#"'0```BT``-\=```"2P``$QX```))`@`K'@```BT``$P>```"
+ME```H!X```(M``#`'@```BT``(X?```!!@``DQ\```(]`@"P'P```I<``.X?
+M```"-P``3R````(1``">(0```FL``&$B```"G0``P"(```)Z``#F(@```IT`
+M`+DC```"7```U2,```)I```H)````G4``$PD```"I@``4B0```%0`@!P)```
+M`JL``)0D```"I@``J"0```)M``##)````04``,@D```"/0(`^B0```)+``!$
+M)0```F,``)$E```"8P``GR4```(<``#*)0```F,``/8E```".0``&2<```(M
+M``".)P```DL``,(G```"20(`_"<```(M```,*````G<``$HH```""P(`8B@`
+M``&4``!]*````BL"`+TH```"+0``UB@```(_``#D*````F8``$`I```">0``
+M3"D```).``!@*0```CX``'0I```"5P``IBD```)+``"X*0```CX``,@I```"
+M5P``!BH```),``#Y*@```5`"`%$K```"$@(`;2L```$>`@"9*P```1X"`-4K
+M```!'@(`^"L```$>`@!Q+````:$``)PL```!!0``H2P```(]`@##+````:$`
+M`.XL```!!0``\RP```(]`@`R+0```04``#<M```"/0(`9"T```$%``!I+0``
+M`CT"`(DM```"/@``MBT```$>`@#>+0```1X"`/0M```!'@(`#2X```$>`@`Z
+M+@```04``#\N```"/0(`X2X```)'``#]+@```1X"`"LO```!'@(`@R\```$>
+M`@"B+P```1X"`,LO```"K```.S````$>`@"],````JP``-$P```"K```/3$`
+M``$%``!",0```CT"`),Q```!!@``F#$```(]`@"J,0```A@``-TQ```!!0``
+MXC$```(]`@"$,@```A@``)`R```")@``^S(```)-```L,P```DL``-8S```"
+M2P```#0```(F```0-````F8``$8T```!'@(`;S0```$>`@"(-````1X"`*@T
+M```!'@(`P30```$>`@#7-````H$``.4T```"<0``\S0```)Q```)-0```H$`
+M`(8U```!'@(`K#4```(R`@#3-0```1X"`/@U```",@(`'38```$>`@!"-@``
+M`C("`)$V```"?0``LS8```)>``##-@```@\``/(V```",```.3<```(M``!)
+M-P```@\``)0W```"2P``N3<```(R``#%-P```C("`/XW```"$@``%3@```)V
+M```N.````:$``$TX```!!0``4C@```(]`@!S.````DD"`)`X```"20(`JS@`
+M``(L``#(.````C```$PY```!'@(`;3D```(R`@"%.0```1X"`*4Y```!'@(`
+MQCD```(R`@#>.0```1X"`&PZ```"FP``>#H```)6``"].@```E$``,XZ```"
+MG```"SL```(R`@`C.P```1X"`#X[```!'@(`8CL```(/``!J.P```JH``)`[
+M```":```]#L```)+``!S/````G<``)(\```"20(`LCP```))`@#=/````C("
+M`/0\```!'@(`##T```$>`@`L/0```@\``#0]```"J@``;CT```)]``":/0``
+M`F@```4^```!'@(`)CX```$>`@!#/@```E```%0^```"G```V#X```(G```$
+M/P```CX"`#`_```"/@(`63\```(^`@""/P```CX"`+8_```"/@(`VS\```(^
+M`@`'0````CX"`"Q````"/@(`6$````(^`@"`0````CX"`*A````"/@(`T$``
+M``(^`@#W0````CX"`"A!```"$`(`54$```(0`@")00```A`"`+I!```"$`(`
+MZT$```(0`@`<0@```A`"`$E"```"$`(`?4(```(0`@"Y0@```F8``#5#```"
+M2P``<4,```))`@"-0P```BT``)M#```",@``IT,```(R`@#70P```CL``!Q$
+M```">0``/$0```)+``"/1````:$``*I$```!!0``KT0```(]`@#J1````:$`
+M``5%```!!0``"D4```(]`@`W10```A@``&E%```!!0``;D4```(]`@#]10``
+M`G$``!!&```!!0``%48```(]`@"*1@```CX``)I&```"5P``_48```),``!J
+M2````B<``/1(```"0`(`,4D```)``@!N20```D`"`*A)```"0`(`Q$D```)`
+M`@#B20```D`"`$]*```"0`(`K$H```)``@#U2@```D`"`$E+```"0`(`?DL`
+M``*"``"-2P```D`"`+M+```"#@``RDL```)``@#X2P```@X```=,```"0`(`
+M-4P```(.``!13@```DP"`'1.```"3`(`D$X```),`@"L3@```DP"`,A.```"
+M3`(`Y$X```),`@`?3P```DL``(1/```"3`(`OD\```)+```L4````DP"`&]0
+M```"2P``[%````)2```(40```DL``%M1```!!0``8%$```(]`@""40```A@`
+M`+11```!!0``N5$```(]`@#]40```04```)2```"/0(`C5(```)Q``"@4@``
+M`04``*52```"/0(``U,```(^```34P```E<``%A3```"DP``BU,```$%``"0
+M4P```CT"`,)6```!'@(`]58```$>`@`B5P```1X"`$U7```!'@(`?5<```$>
+M`@"05P```04``)57```"/0(`ZU<```$>`@`;6````1X"`$I8```!'@(`?%@`
+M``$>`@"N6````1X"`,%8```!!0``QE@```(]`@#^6````DL``')9```"B```
+MP%D```*(``#X60```IH``#A:```"F@``@EH```(A``"36@```EL``(9;```"
+M4P``R5L```).```&7````DL``!!<```"%@``'%P```)4``!=7````C<``&U<
+M```"(@``35T```(W``!=70```B(``,%=```">```35X```*N``!]7@```C<`
+M`(U>```"(@``X5X```)G```O7P```J<``))?```"B```LE\```)3``#(7P``
+M`J<```!@```""P(`,V````(+`@"=8````H@``+U@```"3@``R6````)Y``!T
+M80```DL``(9A```"4@``G6$```&I``"R80```BL"`!YB```"2P``,&(```)Y
+M``!)8@```3P``&1B```"*P(`W&(```$#``#C8@```08``.AB```"/0(`^V(`
+M``)7```-8P```BH``!EC```"8P``\F,```(^``#^8P```B8``$ED```"2P``
+M[V0```)C``"E90```:D``+IE```"*P(`,V8```$\``!.9@```BL"`)=F```"
+M+0``J68```(R``"U9@```C("`-IF```"$@``]68```)V```69P```:$``#5G
+M```!!0``.F<```(]`@!;9P```DD"`.)G```"20(`%V@```&A```V:````08`
+M`#MH```"/0(`E&@```)+``#2:````DD"`/IH```"+```5FD```*)``".:0``
+M`DL``+YI```"2P``YVD```(B``!C:@```1X"`'MJ```!'@(`H&L```)@``#Q
+M:P```2@``/UK```"+P``2VP```)@``"H;````0$``+=L```"+P``WFP```&P
+M```O;0```F```+-M```"+P``^VT```)@``!B;@```B\``,!N```",@(`SVX`
+M``$>`@#R;@```C("``%O```!'@(`B&\```(R`@"9;P```C(``!AP```!'@(`
+M,W````$>`@!3<````B0``!%S```",@(`&',```$>`@`J<P```C("`#%S```!
+M'@(`P7,```(R`@#(<P```1X"`-IS```",@(`X7,```$>`@!I=````HH``)1T
+M```"H@``G'0```*#``#<=````1X"`/%T```!'@(``G4```$>`@`B=0```1X"
+M`'5U```",@(`A'4```$>`@"F=0```C("`+5U```!'@(`B78```(R`@"5=@``
+M`1X"`*=V```",@(`KG8```$>`@#+=@```C("`--V```!'@(`^G8```(R`@`&
+M=P```1X"`!AW```",@(`'W<```$>`@`\=P```C("`$1W```!'@(`B'<```(R
+M`@"X=P```04``+UW```"/0(`XG@```)P```(>0```G```'=Y```"M0``8GH`
+M``(R`@",>@```C("`")[```!I```,'L```&D``"R>P```1X"`-Y[```!'@(`
+M$GP```(R`@`G?````1X"`&Y\```!'@(`S'P```$>`@`U?0```1X"`*=]```"
+M,@(`N7T```$>`@#A?0```CT``/%]```"2@```WX```(R`@`;?@```C("`#-^
+M```",@(`67X```)=``!K?@```1X"`+A^```",@(`QWX```$>`@#O?@```CT`
+M`/]^```"2@``$7\```(R`@`I?P```C("`$%_```",@(`9W\```)=``!Y?P``
+M`1X"`*5_```",@(`M7\```(/``#;?P```JH``.9_```!'@(`_G\```$>`@`5
+M@````1X"`/J````!'@(`<X$```)@``"-@0```F0``*:!```")```!((```$!
+M```8@@```I(``#F"```"=```18(```(O``#=@@```FH``(J#```"L@``U(,`
+M``)+``![A````HT```B%```"2P``@84```*-```>A@```DD"`#V&```"20(`
+M;X8```*-``#;A@```DD"`">'```"20(`98<```(M``!TAP```C(``("'```"
+M,@(`GX<```(2``"VAP```G8``-"'```!!@``U8<```(]`@#RAP```DD"``N(
+M```!!@``$(@```(]`@`MB````DD"`'6(```"20(`N(@```(L``#;B````DD"
+M`%6*```"40``88H```(R`@"'B@```E$``).*```",@(`&HL```$>`@`SBP``
+M`1X"`'J+```",@(`FXL```)W``"WBP```H<``,R+```"AP``W(L```(R`@`!
+MC````1X"`!^,```!'@(`5HP```&A``!QC````04``':,```"/0(`@XP```)@
+M``#,C````0$``-B,```"+P```XT```&A```BC0```04``">-```"/0(`-(T`
+M``)@``!YC0```0$``(6-```"+P``K(T```)@``#XC0```0$```2.```"+P``
+M&(X```)@``!DC@```0$``'".```"+P``A(X```)@``#)C@```0$``-6.```"
+M+P``Z8X```)@```NCP```0$``#J/```"+P``3H\```)@``";CP```0$``*>/
+M```"+P``VX\```(_```,D````J4``"20```"2P``<)````)W``"?D````K(`
+M`!62```!H0``,)(```$%```UD@```CT"`&N2```",@(`S)(```*,``!'DP``
+M`:$``&*3```!!0``9Y,```(]`@"*DP```C("`"V4```"=P``0I0```(A``!.
+ME````B0``(&4```!MP``BY0```%R``"@E````0,``-24```!<@``_)0```*+
+M```.E0```7(``#:5```"BP``2)4```%R``!PE0```HL``(*5```!<@``JI4`
+M``*+``"\E0```7(``.25```"BP``]I4```%R```>E@```HL``#"6```!<@``
+M6)8```*+``!JE@```7(``)*6```"BP``R)8```*+``#DE@```7(```R7```"
+MBP``/Y<```&A``!:EP```04``%^7```"/0(`9Y<```%R``".EP```AL``*"7
+M```!<@``Q)<```(;``#]EP```@L"``N8```!%```(9@```(K`@#!F````J4`
+M`-.8```!MP``^Y@```*+```-F0```;<``#69```"BP``1YD```&W``!OF0``
+M`HL``)^9```"=P``UID```*E```$F@```K(``&V:```!H0``B)H```$%``"-
+MF@```CT"`)^:```"I0``O)H```(+`@#*F@```10``-R:```"*P(``YP```$%
+M```(G````CT"`"Z<```"/P``49P```(A``!AG````B0``("<```"L@``J)P`
+M``$>`@#%G````1X"`.&<```!'@(`_IP```$>`@`#G@```C\``!.>```")```
+M'YX```*E``!!G@```J4``&6>```"I0``A9X```*E``"@G@```IL``,R>```"
+ML@``Y9X```)6```JGP```E$``%Z?```"AP``;I\```(R`@"UGP```BP``,J?
+M```";P``])\```*E```6H````@L"`"6@```"F0``.:````)+``!7H````A(`
+M`&Z@```"=@``BZ````))`@"HH````DD"`+^@```"+```X*````)+``#PH```
+M`E8``"FA```"=P``R*$```(D```DH@```04``"FB```"/0(`0Z(```(L``!/
+MH@```B0``(2B```"G```N*(```(R`@#$H@```B0``."B```"40``[J(```(R
+M`@#ZH@```B0```:C```"3P``%Z0```(A```GI````B0``&BD```!H0``DZ0`
+M``$%``"8I````CT"`*RD```"/P``O*0```*E```.I0```04``!.E```"/0(`
+M.:4```(_``!@I0```K(``)VE```!'@(`NJ4```$>`@#6I0```1X"`/.E```!
+M'@(`":8```$#``#&I@```B$``-:F```")```Y*8```&&``#YI@```BL"`!2G
+M```""P(`)*<```(D```RIP```9$``$2G```"*P(`N:<```(R`@`(J````E8`
+M`"FH```"(0``.:@```(D``"'J````@L"`)6H```!20``IZ@```(K`@#"J```
+M`B$``-*H```")```]Z@```(A```'J0```B0``!.I```"I0``0*D```$>`@"1
+MJP```H0``*&K```")0``\*L```)^```^K````AH``'NL```"?0``R*P```(R
+M`@`JL@```0D``#JR```!"0``2K(```(Q``"@L@```D8``*"S```"-0``W[,`
+M``)]``#CM````C("`-.U```!"0``Y+4```$)``#TM0```C$``"NV```!"0``
+M/+8```$)``!,M@```C$``-.V```!'@(`(K<```$>`@!#MP```B```%NW```"
+M(```<[<```(@``"+MP```B```*.W```"(```N[<```(@``#3MP```B```.NW
+M```"(````[@```(@```;N````B```#.X```"(```2[@```(@``!CN````B``
+M`'NX```"(```D[@```(@``"KN````B```,.X```"(```V[@```(@``#SN```
+M`B````NY```"(```([D```(@```[N0```B```%.Y```"(```:[D```(@``"#
+MN0```B```)NY```"(```!+H```$>`@`DN@```1X"`.&Z```"(````+L```(@
+M```?NP```B```#Z[```"(```7;L```(@``#RO0```A\```B^```"E0``QKX`
+M``)?``#;O@```4,``#"_```"'P``1K\```*5``#JOP```E\``#'````"7P``
+M],````)S```-P0```BD``"[!```"6```D\$```$#``#DQ````A,``&K%```"
+M$P``AL4```(2`@!DQ@```A@``!S'```!'@(`,\<```$>`@!#QP```C("`(['
+M```!!P``UL<```$>`@`)R````0<``"O(```!!P``<\@```$>`@#HR````0<`
+M`##)```!'@(`8\D```$'``"%R0```0<``,W)```!'@(`-LH```$'``!'R@``
+M`0<``-K*```!'@(`;\L```$>`@`"S````1X"`"S,```",@(`^,P```(=``"W
+MSP```I```"_1```!`P``/M$```$'``!(T0```0<``%/1```!!P``7=$```$'
+M``!!T@```H```&/2```"K@``EM,```$'``";TP```@,"`"'4```",0``,=0`
+M``(R`@!-U````J,``'C4```!!@``?=0```(]`@"]U````B<"`-/4```")P(`
+MZ=0```(G`@!=U0```B<``'G5```",0(`D=4```(Q`@"MU0```C$"`,75```"
+M,0(`X=4```(Q`@#YU0```C$"`!76```",0(`+=8```(Q`@!)U@```C$"`&'6
+M```",0(`?=8```(Q`@"5U@```C$"`+'6```",0(`R=8```(Q`@#EU@```C$"
+M`/W6```",0(`&=<```(Q`@`QUP```C$"`$W7```",0(`9=<```(Q`@"!UP``
+M`C$"`)G7```",0(`M=<```(Q`@#-UP```C$"`.G7```",0(``=@```(Q`@`Q
+MV````F("`%W8```"8@(`C=@```)B`@"YV````F("`.G8```"8@(`%=D```)B
+M`@!%V0```F("`''9```"8@(`H=D```)B`@#-V0```F("`/W9```"8@(`*=H`
+M``)B`@!9V@```F("`(7:```"8@(`M=H```)B`@#AV@```F("``/;```"(P``
+M"]L```)E```9VP```F4``"';```"LP``+=L```(R`@`UVP```GL``$7;```"
+M@0``5=L```*!``")VP```H$``*S;```"J```O]L```*H``#<VP```J@``._;
+M```"J```"]P```(R```6W````48"`&S<```"8```QMP```$!``#6W````B\`
+M`!/=```"+0``)]T```(R`@`SW0```C(``(+=```")```Z]T```)@``!9W@``
+M`0$``&7>```"+P``HMX```(M``"VW@```C("`+[>```",@``_-X```(D``"D
+MWP```B$``+O?```"6P``Q]\```(D```"X0```D0``#_A```!`0``4^$```*2
+M``!WX0```G0``([A```"+P``Q.$```(M``#8X0```C("`.3A```",@``A.(`
+M``)@``"DX@```08``*GB```"/0(`N.(```)D``#4X@```B0``!GC```"20(`
+M/.,```(M``#0XP```04``-7C```"/0(`!N0```(2`@!AY````A("`)GD```"
+M(0``LN0```);``#.Y````B0``/KD```"20(`SN4```(M```@Y@```J4``#;F
+M```"=P``<^8```)+`@"GY@```B,``*_F```"0@``M^8```)"``#'Y@```H$`
+M`,_F```"90``V^8```)E``#GY@```K,``//F```",@(`^^8```)[```/YP``
+M`44``"KG```"*P(`.N<```*R``!<YP```J\``&KG```"KP``B><```$)``"6
+MYP```0D``+/G```!!P``O><```$'``#>YP```4$``.SG```!!P``\N<```%!
+M``#XYP```0<``/[G```!00``!.@```$'```*Z````4$``!'H```!00``)^@`
+M``%!```NZ````4$``#WH```!00``1.@```%!``!-Z````4$``%3H```!00``
+M8^@```%!``!PZ````0<``(KH```!00``F.@```%!``"GZ````4$``*[H```!
+M00``M^@```%!``"^Z````4$``-;H```!!P``Z.@```$#```EZ0```0,``$GI
+M```!!P``6ND```$'``"&Z0```4$``)3I```!00``OND```%!``#DZ0```4$`
+M`/'I```!00``0^H```(,`@!7Z@```0,``+?J```"CP``W.H```)V``#VZ@``
+M`G8``(3K```!H0``G^L```$%``"DZP```CT"`+;K```"8```Y.L```&A``#_
+MZP```04```3L```"/0(`0NP```$!``!.[````B\``(OL```"+0``G^P```(R
+M`@"G[````C(``,?L```")```]^P```)@```:[0```F0``#?M```")```D>T`
+M``$!``"E[0```I(``,;M```"=```TNT```(O```/[@```BT``"/N```",@(`
+M*^X```(R``!>[@```HP``(3N```"(0``D.X```(D``#2[@```0,```'O```"
+MC@``1.\```)(``!:[P```FX``'#O```"GP``TN\```&A``#M[P```04``/+O
+M```"/0(`(/````(+`@`Q\````0$``$;P```"*P(`L_(```*.``#^\@```H``
+M`!7S```"=@``2?,```(R``!T\P```K(``)'S```""P(`I?,```%%``"Z\P``
+M`BL"`##T```!"0``._0```$)``!9]@```AH"`(+V```"&@(`Q/8```$#``#9
+M]@```0<``.7V```!!P``\?8```$'``#Z]@```0<```#W```!!P``'?<```$'
+M``!=]P```E8"`)'W```"3@(`QO<```%!``#3]P```4$``/_W```!00``'/@`
+M``%!```E^````4$``"SX```!00``2/@```%!``!6^````4$``+/Y```!H0``
+M^/H```)@``#G_0```0$``%'^```"1```8?X```*2``"!_@```G0``*'^```"
+MD@``M_X```)D``#P_@```G0```7_```"50``/O\```)T``"`_P```A("`/G_
+M```"$@(`+0`!``(O```_``$``B0``+\"`0`"5@(`Y@(!``)6`@`S!`$``DL`
+M`(4$`0`"=P``K@0!``*E``#9!`$``DL``#0%`0`"C0``\@4!``*4`0`)!@$`
+M`M(!`!T&`0`"T0$`A`8!``$!``";!@$``E$!`+T&`0`"N@``R08!``+1``#<
+M!@$``C("`.<&`0`"XP``!P<!``*\```>!P$``@,!`"H'`0`"T0$`1P<!``+1
+M`0!K!P$``@8!`(@'`0`"50$`VP<!``)1`0#Y!P$``KH``!@+`0`".0$`APX!
+M``$#```N#P$``04``#,/`0`"/0(`?`\!``(2`@`T$`$``1X"`&00`0`!'@(`
+MQ!`!``$>`@!-$0$``1X"`(@1`0`!'@(`\A$!``(R`@`L$@$``C("`&X2`0`"
+M,@(`J!(!``(R`@`,$P$``N0``!@3`0`",@(`)!,!``*/`0"8$P$``1X"`*83
+M`0`!'@(`MQ,!``(R`@#*$P$``1X"`-@3`0`!'@(`ZQ,!``$>`@#T$P$``1X"
+M`!<4`0`",@(`(A0!``$>`@!#%`$``C("`$X4`0`!'@(`;Q0!``$>`@"*%`$`
+M`1X"`-,4`0`!'@(`ZA0!``$>`@`&%0$``1X"`!L5`0`!'@(`.14!``$>`@!$
+M%0$``1X"`'$5`0`",@(`?Q4!``$>`@"F%0$``C("`+05`0`!'@(`YA<!``$>
+M`@`[&`$``E\!`&L8`0`"7P$`WQ@!``*B`0!%&0$``@L"`%@9`0`"8`$`?!D!
+M``)7`0`<&@$``J(!`$,:`0`"AP$`6AH!``)+`0!V&@$``08``'L:`0`"/0(`
+MF!H!``))`@"U&@$``DD"`-`:`0`"Z```^QH!``$>`@#.&P$``<\``.\;`0`"
+M;0$`S!P!``+.``#8'`$``M$!`,@=`0`"30$`!"$!``+0`0"`(0$``NX``,,A
+M`0`"30$`9B(!``$#``".(@$``J$!`-(B`0`"H0$`%2,!``*A`0!4(P$``J$!
+M`)4C`0`",`$`Y2,!``*D`0!U)`$``L8``*\D`0`"[P``WR0!``(R`@`V)P$`
+M`KH!`$\G`0`"@@$`%R@!``+:``">*`$``G@!`,@H`0`"V@``*2H!``+/`0!%
+M*@$``F$!`+TJ`0`"SP$`\BH!``)A`0"K+`$``J,!`)`M`0`"$@(`KBT!``$#
+M``!%+@$``KD``%<N`0`"N0``"2\!``+/`0`^+P$``F$!`,HO`0`"%@$`"3`!
+M``("`0`M,`$``A8!`$,P`0`"D`$`8S`!``(6`0"S,`$``@H!`-,P`0`!!0``
+MV#`!``(]`@!$,0$``E<!`%0Q`0`"U0``Y#$!``*:`0!@,@$``IH!`&XR`0`"
+MG@$`FC(!``*:`0"S,@$``F0!`-LR`0`"!0$`?S,!``(A`0"D,P$``F0!`,HS
+M`0`"%0$`]S,!``*:`0#_,P$``A4!`"0T`0`"9`$`AC0!``*]``#0-`$``G\!
+M`/4T`0`"5P$`+S4!``))`@!/-0$``KT``'0U`0`"XP``@#4!``(R`@#,-0$`
+M`D@!`-8U`0`"D0$`Z34!``$&``#N-0$``CT"`"0V`0`"O0``.38!``(H`0!$
+M-@$``A4!`+TV`0`!'@(`XS8!``$>`@`4-P$``1X"`%LW`0`!!0``8#<!``(]
+M`@"Q-P$``DP!`"8X`0`"3`$`/#@!``+*`0!(.`$``B$!`/HX`0`"T```&3D!
+M``)D`0`_.0$``E<!`-$Y`0`"T```ZCD!``)D`0`R.@$``L4!`$T[`0`!'@(`
+M9CL!``$>`@!^.P$``1X"`-$[`0`!'@(`[3L!``$>`@!I/`$``H4!`,0\`0`!
+M'@(`X#P!``$>`@#\/`$``1X"``@]`0`"#0$`YST!``+;```</@$``A("`/,^
+M`0`"$@(`;C\!``(2`@"6/P$``1X"`,8_`0`!'@(``D`!``$>`@#A0`$``A("
+M`!%"`0`"$@(`FD(!``(2`@"M0@$``0,``#)#`0`",@(`=D,!``$>`@"70P$`
+M`1X"`,!#`0`!!@``Q4,!``(]`@#40P$``FH!`$)$`0`!'@(`QT0!``)J`0#;
+M1`$``FH!`$Y%`0`!!0``4T4!``(]`@"X10$``08``+U%`0`"/0(`T44!``)6
+M`0`$1@$``04```E&`0`"/0(`TD8!``$%``#71@$``CT"`(%'`0`"T```F$<!
+M``)D`0!*2`$``CT!`)Q)`0`"5@$`L$D!``*B`0`A2@$``@\!`(9*`0`"T```
+MDDH!``(]`0"I2@$``F0!`/U*`0`"5P$`>DL!``*_``"K2P$``E<!`$M,`0`"
+M5P$`@$P!``*B`0"03`$``A4!`,9,`0`!'@(`[TP!``$>`@`(30$``1X"`"A-
+M`0`!'@(`04T!``$>`@!730$``A\!`&5-`0`"'`$`<TT!``(<`0")30$``A\!
+M`,A-`0`!'@(`.DX!``$>`@!33@$``1X"`&5.`0`"]0``DTX!``$>`@"J3@$`
+M`1X"``!/`0`!'@(`'4\!``$>`@!&3P$``@L"`&9/`0`"=`$`I4\!``)7`0#;
+M3P$``DD"`/=/`0`"O0``)5`!``(;`0`Q4`$``C("`%A0`0`!`0``B5`!``(K
+M`@"J4`$``1X"`+I0`0`!'@(`V5`!``$>`@#I4`$``1X"`!%1`0`!'@(`.U$!
+M``$>`@!F40$``1X"`']1`0`!'@(`JU$!``$>`@#540$``1X"`"92`0`!'@(`
+M0E(!``$>`@!?4@$``1X"`'M2`0`!'@(`N5(!``(+`@#[4@$``DD"`!-3`0`"
+MO0``)%,!``+C```P4P$``C("`%-3`0`!D0$`:%,!``(K`@")4P$``1X"`*=3
+M`0`!'@(`TE,!``$>`@#P4P$``1X"`#I4`0`""P(`5E0!``)7`0"&5`$``DD"
+M`*I4`0`!5`$`PU0!``(K`@#C5`$``1X"``!5`0`!'@(`'%4!``(R`@`L50$`
+M`1X"`$=5`0`!'@(`9%4!``$>`@"`50$``C("`)!5`0`!'@(`M%4!``$>`@!N
+M5@$``1X"`)96`0`",@(`P58!``$>`@#H5@$``C("`!%7`0`!'@(`.E<!``(R
+M`@"&5P$``BH!`*17`0`";@$`M%<!``(\`0#G5P$``C@!`"%8`0`"&0$`4U@!
+M``(\`0`360$``C("`#E9`0`!'@(`5UD!``(R`@!W60$``1X"`*!9`0`",@(`
+MQED!``$>`@#H60$``C("``1:`0`!'@(`*%H!``)7`0"M6@$``KT``/%:`0`"
+MO0```5L!``(\`0!(6P$``E<!`&Y;`0`"5P$`D5L!``(+`@"I6P$``N,``+5;
+M`0`",@(`9EP!``*B`0")7`$``H<!`*!<`0`"2P$`NEP!``$&``"_7`$``CT"
+M`-Q<`0`"20(`^5P!``))`@`<70$``N@``$5=`0`"\@``>5T!``)7`0":70$`
+M`N,``*9=`0`",@(`UUT!``*'`0#N70$``DL!``A>`0`!!@``#5X!``(]`@`J
+M7@$``DD"`$=>`0`"20(`8EX!``+H``!_7@$``C@!``1?`0`!'@(`*U\!``(R
+M`@!'7P$``1X"`&=?`0`!'@(`BE\!``(R`@"F7P$``1X"`"Q@`0`"=`$`.&`!
+M``(_`0!]8`$``IP!`(Y@`0`"0P$`RV`!``(R`@#C8`$``1X"`/Y@`0`!'@(`
+M(F$!``(\`0`J80$``AH!`%5A`0`"G0$`WF$!``)4`0#T80$``E<!`(%B`0`"
+MO`$`LV(!``)(`0#L8@$``J@!``MC`0`"20(`*V,!``))`@!<8P$``C("`'-C
+M`0`!'@(`C&,!``$>`@"L8P$``CP!`+1C`0`"&@$`_6,!``(J`0`W9`$``E<!
+M`+)D`0`"G0$`Q&0!``+[```U90$``1X"`%9E`0`!'@(`<V4!``*]`0"$90$`
+M`D,!`.ME`0`"?@$`"&8!``)D`0`J9@$``A4!`$]F`0`"F@$`5V8!``(5`0":
+M9@$``F0!`.%F`0`"O0``]F8!``)7`0`F9P$``DD"`#YG`0`"O0``3&<!``+C
+M``!89P$``C("`'EG`0`"D0$`I6<!``)D`0#79P$``KT``/1G`0`"5P$`#&@!
+M``*'`0`C:`$``DL!`$!H`0`"20(`76@!``))`@!P:`$``N@``(EH`0`"8`$`
+MGF@!``$>`@#K:`$``CP!`/=H`0`".`$`@&D!``$>`@";:0$``E8!`*]I`0`"
+MH@$`SFD!``)6`0#6:0$``F@!`/5I`0`!`P``%&H!``(``0`X:@$``@`!`%QJ
+M`0`"O0``BVH!``)_`0"L:@$``MP``-9J`0`"O0```6L!``)_`0`B:P$``KT`
+M`#YK`0`"W```86L!``*]``!^:P$``KT``+1K`0`"XP``P&L!``(R`@`L;`$`
+M`L```$ML`0`"BP$`96P!``*'`0!\;`$``DL!`)9L`0`!!@``FVP!``(]`@"X
+M;`$``DD"`-5L`0`"20(`Z&P!``+H```4;0$``E<!`%!M`0`"3P$`GFT!``)G
+M`0"\;0$``E<!`!!N`0`!!0``%6X!``(]`@`_;@$``E8!`()N`0`!!0``AVX!
+M``(]`@!:;P$``04``%]O`0`"/0(`HF\!``$%``"G;P$``CT"`#=P`0`"'`$`
+M/W$!``+0``!T<0$``K4!`*QQ`0`!!0``L7$!``(]`@#N<@$``A("`!)S`0`!
+M'@(`/G,!``$>`@!Z<P$``1X"`"YT`0`!!0``,W0!``(]`@"-=`$``04``))T
+M`0`"/0(`O70!``$%``#"=`$``CT"`/1T`0`!!@``^70!``(]`@!T=0$``04`
+M`'EU`0`"/0(`P74!``$&``#&=0$``CT"`/EU`0`!!@``_G4!``(]`@`-=@$`
+M`08``!)V`0`"/0(`878!``+)``"R=@$``1X"`,]V`0`!'@(`['8!``$>`@`,
+M=P$``1X"`"-W`0`!!@``*'<!``(]`@"L=P$``1X"`-EW`0`!!@``WG<!``(]
+M`@`9>`$``04``!YX`0`"/0(`-'@!``(-`0!2>`$``1X"`.-X`0`"%0$``WD!
+M``)P`0"(>0$``K<!`*9Y`0`"'0$`TGD!``(^`@#^>0$``CX"`"IZ`0`"/@(`
+M4WH!``(^`@!\>@$``CX"`+!Z`0`"/@(`U7H!``(^`@#[>@$``CX"`"=[`0`"
+M/@(`3'L!``(^`@!X>P$``CX"`*1[`0`"/@(`S'L!``(^`@#T>P$``CX"`!Q\
+M`0`"/@(`1'P!``(^`@!K?`$``CX"`)1\`0`"/@(`N7P!``(^`@#J?`$``A`"
+M`!=]`0`"$`(`2WT!``(0`@!\?0$``A`"`*U]`0`"$`(`WGT!``(0`@`+?@$`
+M`A`"`#]^`0`"$`(`=7X!``)7`0"*?@$``I0!``-_`0`!`0``%G\!``)1`0`F
+M?P$``M$``+5_`0`"5P$`\7\!``))`@`-@`$``KT``!N``0`"XP``)X`!``(R
+M`@!7@`$``@0!``B"`0`"MP$`G((!``)``@#2@@$``D`"``^#`0`"0`(`3(,!
+M``)``@"&@P$``D`"`**#`0`"0`(`P(,!``)``@`JA`$``D`"`(6$`0`"0`(`
+MXH0!``)``@`KA0$``D`"`("%`0`"0`(`Z(4!``)``@`QA@$``D`"`&:&`0`"
+M90$`=88!``)``@"CA@$``C(!`+*&`0`"0`(`X(8!``(R`0#OA@$``D`"`!V'
+M`0`",@$`+(<!``)``@!:AP$``C(!`&F'`0`"0`(`S8<!``)R`0#BB@$``DP"
+M``6+`0`"3`(`*(L!``),`@!+BP$``DP"`&>+`0`"3`(`@XL!``),`@"^BP$`
+M`E<!`".,`0`"3`(`78P!``)7`0#+C`$``DP"``Z-`0`"5P$`@HT!``+3``#-
+MC0$``1X"`/*-`0`!'@(`#HX!``)#`0!1C@$``KT``&2.`0`"XP``<(X!``(R
+M`@"2C@$``H<!`*^.`0`"20(`S(X!``))`@#CC@$``N@``/*.`0`!'@(`3X\!
+M``)?`0!_CP$``DD"`.F/`0`"R@$`))`!``)7`0";D`$``04``*"0`0`"/0(`
+MU9`!``)6`0`8D0$``04``!V1`0`"/0(`XI$!``$%``#GD0$``CT"`!F2`0`!
+M!@``'I(!``(]`@"AD@$``04``*:2`0`"/0(`7I,!``(<`0!QDP$``04``':3
+M`0`"/0(`?Y0!``)D`0"GE`$``M```,N4`0`"A0$`#I4!``+%`0#LF`$``ET!
+M`$R9`0`"$@(`8)D!``*V`0#:F0$``A("`"F:`0`"E`$`.YH!``+2`0!-F@$`
+M`M$!`'::`0`"$@(`N)H!``$T`0`-FP$``E$!`"Z;`0`"N@``.IL!``+1``")
+MFP$``I0!`)N;`0`"T@$`K9L!``+1`0#^FP$``30!`%.<`0`"40$`=)P!``*Z
+M``"`G`$``M$``.V<`0`"E`$``YT!``+2`0`9G0$``M$!`#Z=`0`"$@(`=9T!
+M``'$`0"?G0$``E$!`,"=`0`"N@``T)T!``+1```RG@$``ET!`%V>`0`"E@$`
+MF9X!``*4`0"KG@$``M(!`+V>`0`"T0$``Y\!``'$`0`OGP$``E$!`%"?`0`"
+MN@``7)\!``+1``#]GP$``OH``#R@`0`"^@``C*`!``)!`0"@H`$``N```-*@
+M`0`"Z@``\J`!``+@```FH0$``N```/NA`0`""0$`3J(!``)"`0"'H@$``NH`
+M`,BB`0`"E`$`VJ(!``+2`0#LH@$``M$!`#*C`0`!F`$`6J,!``)1`0![HP$`
+M`KH``(>C`0`"T0``8:0!``*\``!MI`$``M$!`)^D`0`"$@(`X:0!``*\``#M
+MI`$``M$!`(.E`0`"]```F*4!``*\``"DI0$``M$!`+^E`0`""P(`TZ4!``'B
+M``#HI0$``BL"`%>F`0`"@`$`1*<!``)[`0"$IP$``GL!`+ZG`0`"Z@``^J@!
+M``(1`0`/J0$``O\``"2I`0`"-P$`.:D!``+T``!3J0$``@L"`&>I`0`!X@``
+M@:D!``(K`@"TJ0$``E<!`"BJ`0`"O`$`3JH!``)(`0!UJ@$``J@!`,2J`0`"
+M5P$``JL!``+J```WJP$``D\!`&&K`0`"O```=:L!``+1`0"QJP$``NH``.:P
+M`0`"PP$`[[$!``$#``"(L@$``1X"`+BR`0`!'@(`X[(!``$>`@`<LP$``1X"
+M`&^S`0`!'@(`G;,!``$>`@##LP$``1X"`/6S`0`!'@(`MK0!``$#``#+M`$`
+M`0,``-ZT`0`!`P``[+0!``$#``#_M`$``HP!``JU`0`!`P``CK4!``)7`0#.
+MM0$``E<!`/ZU`0`"5P$`3K8!``)7`0!^M@$``E<!``2W`0`"5P$`8+@!``+0
+M``#1N0$``E8!`!BZ`0`">0$`6+H!``)Y`0!!NP$``KP``%*[`0`"%P$`6[P!
+M``+1``""O`$``O,``)&\`0`"PP$`IKP!``)D`0`1O0$``GX!`'>]`0`"(0$`
+M2+X!``+1`0"ZO@$``@,!`,B^`0`"T0$`!K\!``)7`0`0OP$``O8``!B_`0`"
+MU0``3+\!``*4`0!:OP$``M(!`'._`0`"T0$`L;\!``'!``"]OP$``M$```#`
+M`0`"E`$`-\`!``'!``!#P`$``M$``('``0`"E`$`D\`!``+2`0"EP`$``M$!
+M`.S``0`!`0```,$!``)1`0`AP0$``KH``"W!`0`"T0``;<$!``*4`0"HP0$`
+M`2D!`+3!`0`"T0``QL$!``(R`@#8P0$``C("`+W"`0`"O```SL(!``(7`0#:
+MP@$``M$!`!/#`0`"FP$`,<,!``*\``!"PP$``A<!`$[#`0`"T0$`3,0!``(R
+M`@!8Q`$``M$!`(C$`0`"FP$`F,0!``(R`@"DQ`$``M$!`-S$`0`"E`$`'\4!
+M``*A`0`OQ0$``M$!`$/%`0`!P0``3\4!``+1``"0Q0$``I0!`*K%`0`"T@$`
+MP\4!``+1`0`=Q@$``<$``##&`0`"40$`3L8!``*Z``!:Q@$``M$``*G&`0`"
+ME`$`Q,8!``+2`0#=Q@$``M$!`#/'`0`!P0``1\<!``)1`0!IQP$``KH``'7'
+M`0`"T0``L,<!``*4`0#*QP$``M(!`./'`0`"T0$`-L@!``'!``!.R`$``E$!
+M`'#(`0`"N@``?,@!``+1``#`R`$``I0!`-K(`0`"T@$`\\@!``+1`0`^R0$`
+M`<$``%+)`0`"40$`=,D!``*Z``"`R0$``M$``-_)`0`"E`$`E<H!``$!``"H
+MR@$``E$!`+3*`0`"T0``X<P!``(``0#^S`$``@,!`$S-`0`"5P$`'\X!``*:
+M`0"#S@$``I0!`*3.`0`"C0$`MLX!``+1`0`*SP$``>D``!W/`0`"40$`*<\!
+M``+1``!ZSP$``I0!`(S/`0`"C0$`X<\!``'I``#TSP$``E$!``#0`0`"T0``
+M#-`!``(R`@!1T`$``I0!`%_0`0`"C0$`JM`!``'I``"]T`$``E$!`,G0`0`"
+MT0``"=$!``*4`0`7T0$``HT!`%W1`0`!Z0``<-$!``)1`0!\T0$``M$``+'1
+M`0`",`$`P=$!``+.`0"MT@$``C`!`+W2`0`"S@$`)=,!``+7``"DTP$``D`!
+M``W4`0`"P@$`/=0!``(P`0!-U`$``LX!`+G4`0`"H`$`&-4!``*S`0!RU0$`
+M`M```)+5`0`"?@$`J-4!``*S`0#QU0$``M````?6`0`"LP$`,-8!``(+`@!C
+MU@$``@L"`+76`0`"+`$`_=8!``+0```7UP$``B$!`"/7`0`"R@$`U-<!``)7
+M`0#FUP$``F<!`/W7`0`!R0``$M@!``(K`@".V`$``E<!`*#8`0`"R@$`N=@!
+M``&^`0#4V`$``BL"`('9`0`"T```C=D!``(]`0"9V0$``IH!`#_:`0`!R0``
+M5-H!``(K`@#8V@$``;X!`//:`0`"*P(`=-P!``)7`0#9W`$``LX``.W<`0`"
+MT0$`-]T!``)_`0!JW0$``D@!`)7=`0`"U```M=T!``)7`0`TW@$``KP!`$_>
+M`0`"S@``8]X!``+1`0#+W@$``KT``/3>`0`"XP```-\!``(R`@`KWP$``L``
+M`$K?`0`"BP$`=]\!``*'`0".WP$``DL!`*C?`0`!!@``K=\!``(]`@#*WP$`
+M`DD"`.??`0`"20(`(N`!``+H``!$X`$``E<!`';@`0`"3P$`M^`!``*]``#H
+MX`$``N,``/3@`0`",@(`'^$!``+````^X0$``HL!`%OA`0`"AP$`=N$!``)+
+M`0"0X0$``08``)7A`0`"/0(`MN$!``))`@#/X0$``08``-3A`0`"/0(`]>$!
+M``))`@!\X@$``DD"`-SB`0`"5P$`&N,!``))`@`\XP$``N@``(#C`0`"E`$`
+MDN,!``+2`0"KXP$``M$!`!GD`0`!P0``+.0!``)1`0!*Y`$``KH``%;D`0`"
+MT0``@^0!``(P`0"3Y`$``LX!`&[E`0`"LP$`I^4!``+.`0#^Y0$``E<!``GH
+M`0`"$@(`S.D!``*``0`$Z@$``JH!`(_J`0`!`0``O>H!``('`0"9ZP$``0$`
+M`-SK`0`"!P$`I>P!``$!``#K[`$``@<!`%7M`0`!`0``D^T!``('`0#E[0$`
+M`0$``"/N`0`"!P$`_.X!``*K`0!U[P$``L(``'_P`0`";`$`$_$!``)%`0":
+M\0$``H`!`,WQ`0`"K`$`^/$!``)0`0`L\P$``JH!`/+T`0`"7`$`/O4!``)L
+M`0#B]0$``D4!`%GV`0`"[```X/8!``)%`0"@]P$``D4!`.'W`0`"J@$`7/@!
+M``)%`0"H^`$``D4!``GY`0`"10$`4_D!``)%`0";_`$``D4!`//\`0`!'@(`
+M"_T!``$>`@"+_@$``FD!`/C_`0`!'@(`$P`"``$>`@`S``(``M$!`)```@`"
+M,@(`GP`"``$>`@#"``(``C("`-$``@`!'@(`R0$"``(R`@#5`0(``1X"`.<!
+M`@`",@(`[@$"``$>`@`+`@(``C("`!,"`@`!'@(`.@("``(R`@!&`@(``1X"
+M`%@"`@`",@(`7P("``$>`@!\`@(``C("`(0"`@`!'@(`R`("``(R`@`H`P(`
+M`C("`#D#`@`"XP``EP,"``*4`0`#!`(``<@```\$`@`!-0$`'@0"``+1``!N
+M!`(``I0!`-P$`@`!W@``Z`0"``+1``!G!0(``1X"`(@%`@`!'@(`YP4"``)O
+M`0#W!0(``MD``$H&`@`"E`$`DP8"``'>``"?!@(``M$``"<'`@`!'@(`2`<"
+M``$>`@"?!P(``K@``*\'`@`"V0``(P@"``*4`0!J"`(``<@``'8(`@`!-0$`
+MA0@"``+1``#+"`(``I0!`"@)`@`!`0``-PD"``+1``!>"0(``>L``,$)`@`"
+M,@(`R`D"``$>`@#:"0(``C("`.$)`@`!'@(`<0H"``(R`@!X"@(``1X"`(H*
+M`@`",@(`D0H"``$>`@`G"P(``L<!`%P+`@`"K@$`9`L"``)I`0"Z"P(``1X"
+M`,\+`@`!'@(`ZPL"``$>`@`0#`(``1X"`&(,`@`"EP$`:@P"``*[``#6#`(`
+M`C("`.D,`@`!'@(`#PT"``(R`@`B#0(``1X"`"D0`@`"KP$`WQ`"``*``0!)
+M$@(``H`!`&\2`@`"@`$`XQ("``+Y``#M$P(``C("`!04`@`",@(`WQ0"``+-
+M````%0(``G<!`!H5`@`!L@$`*!4"``&R`0"J%0(``1X"`-85`@`!'@(`!A8"
+M``(R`@`;%@(``1X"`&(6`@`!'@(`P!8"``$>`@`I%P(``1X"`)H7`@`",@(`
+MK!<"``$>`@#-%P(``GT!`-D7`@`"CP$`[Q<"``(R`@`+&`(``C("`"<8`@`"
+M,@(`21@"``(;`0!;&`(``1X"`*P8`@`",@(`NQ@"``$>`@#<&`(``GT!`.@8
+M`@`"CP$`_A@"``(R`@`:&0(``C("`#89`@`",@(`6!D"``(;`0!J&0(``1X"
+M`)H9`@`",@(`IAD"``(\`0#$&0(``AH!`,\9`@`!'@(`YQD"``$>`@#^&0(`
+M`1X"`-,:`@`!'@(`4QL"``*4`0!M&P(``M(!`(8;`@`"T0$`Y!L"``$!``#X
+M&P(``E$!`!D<`@`"N@``)1P"``+1``!?'0(``04``&0=`@`"/0(`&AX"``$%
+M```?'@(``CT"`#,>`@`"3P$`5!X"``)2`0`\'P(``GP!`*P?`@`!SP``S1\"
+M``)M`0#E'P(``C\!`&4@`@`"?`$`>"`"``(K`0"J(`(``J@!`$4A`@`"^P``
+M3R$"``++`0#[(0(``D\!`%\B`@`"5P$`OR("``*\`0#B(@(``D@!`/,B`@`"
+MJ`$`BR,"``(G`0`8)`(``E<!`)$D`@`")P$`*R4"``))`@!*)0(``DD"`'\E
+M`@`")P$`Z"4"``))`@`S)@(``DD"`'(F`@`"O0``F"8"``+C``"D)@(``C("
+M`,\F`@`"P```[B8"``*+`0`')P(``H<!`!XG`@`"2P$`."<"``$&```])P(`
+M`CT"`%HG`@`"20(`<R<"``$&``!X)P(``CT"`)4G`@`"20(`W2<"``))`@`@
+M*`(``N@``$,H`@`"20(`H"@"``)T`0#,*`(``D\!`.4H`@`"/P$`*BD"``*<
+M`0!L*0(``0,``-<I`@`"7P$`_"D"``(Z`0`A*@(``CH!`$8J`@`".@$`:RH"
+M``(Z`0"8*@(``BX!`,4J`@`"+@$`_"H"``(N`0`I*P(``BX!`#4K`@`",@(`
+M;"L"``(N`0"9*P(``BX!`*4K`@`",@(`RBL"``(Z`0#O*P(``CH!`!0L`@`"
+M.@$`02P"``(N`0!F+`(``CH!`*PL`@`",@(`)BT"``$>`@!$+0(``1X"`%HM
+M`@`",@(`>"T"``)(`0")+0(``C("`*DM`@`".@$`M2T"``(R`@#:+0(``CH!
+M`.8M`@`",@(`'2X"``(N`0`I+@(``C("`$XN`@`".@$`6BX"``(R`@!O+@(`
+M`A(!`(0N`@`"<P$`L2X"``(N`0#>+@(``BX!``LO`@`"+@$`."\"``(N`0!=
+M+P(``CH!`&XO`@`",@(`CB\"``(Z`0":+P(``C("`,<O`@`"+@$`["\"``(Z
+M`0`9,`(``BX!`"TP`@`"RP$`4C`"``(Z`0!>,`(``C("`)(P`@`"+@$`GC`"
+M``(R`@#`,`(``CH!`,PP`@`",@(`X3$"``*\``#M,0(``M$!`$LR`@`!'@(`
+M:C("``$>`@"<,@(``1X"`,$R`@`"O```S3("``+1`0#9,@(``E\!``$S`@`"
+M7P$`130"``*<`0!1-`(``C("`'<T`@`"G`$`@S0"``(R`@`*-0(``1X"`",U
+M`@`!'@(`:C4"``(R`@"+-0(``D@!`*<U`@`"C@$`O#4"``*.`0#,-0(``C("
+M`/`U`@`!'@(`#C8"``$>`@`F-@(``C("`#LV`@`!!0``0#8"``(]`@!--@(`
+M`I0!`)8V`@`!`0``HC8"``+1``"W-@(``08``+PV`@`"/0(`R38"``*4`0`.
+M-P(``0$``!HW`@`"T0``03<"``*4`0"--P(``0$``)PW`@`"T0``L#<"``*4
+M`0#\-P(``0$```LX`@`"T0``'S@"``*4`0!D.`(``0$``'`X`@`"T0``AC@"
+M``*4`0#+.`(``0$``-<X`@`"T0``ZS@"``*4`0`X.0(``0$``$0Y`@`"T0``
+M@3D"``)\`0"I.0(``B@!``TZ`@`"7P$`4SH"``)?`0!E.@(``E<!`+PZ`@`"
+MO`$`Z#H"``)(`0`".P(``J@!`"P[`@`"5P$`C3L"``*\`0"Y.P(``D@!`-,[
+M`@`"J`$`"SP"``)7`0`V/`(``NH``%D\`@`"3P$`F3T"``*\``"E/0(``M$!
+M`!8^`@`",@(`73X"``)_`0!R/@(``D@!`,@^`@`!!0``S3X"``(]`@#H/@(`
+M`DH!`%@_`@`",@(`S3\"``*\``#9/P(``M$!`/$_`@`"O```_3\"``+1`0`)
+M0`(``D@!`/%``@`"20$`"T$"``))`0`E00(``O```#=!`@`"4P$`24$"``)Z
+M`0!A00(``A`!`'-!`@`"/@$`A4$"``+(`0"900(``KD!`,1!`@`"5P$`)4("
+M``*\`0!20@(``D@!`&Q"`@`"J`$`QD("``+J``#80@(``E<!`/Y"`@`!!@``
+M`T,"``(]`@`30P(``NH``#I#`@`"3P$`F$0"``*)`0"B1`(``0,```-%`@`"
+M/P$`G$4"``)\`0"S10(``BL!`/9%`@`"J`$`C48"``)7`0"_1@(``LH```5'
+M`@`"@`$`I4<"``))`@#@1P(``KT``/A'`@`"XP``!$@"``(R`@`O2`(``L``
+M`$Y(`@`"BP$`;D@"``*'`0")2`(``DL!`*I(`@`"20(`RT@"``))`@#_2`(`
+M`N@``'E)`@`"R@``D$D"``*$`0!&2@(``H`!`,Y+`@`"O`$`Y4L"``*H`0`5
+M3`(``NH``"A,`@`"/P$`DDP"``)7`0#'3`(``LH```]-`@`"R@``44T"``+*
+M``!L30(``H`!`*]-`@`"WP``!4\"``)U`0`K3P(``E<!`$E/`@`"O0``5T\"
+M``+C``!C3P(``C("`(5/`@`"AP$`G$\"``)+`0"Y3P(``DD"`-9/`@`"20(`
+M`E`"``+H```B4`(``O(``(=0`@`"E0$`LE`"``+*``#W4`(``LH``#91`@`"
+MR@``25$"``+?``!=40(``E(!`)51`@`"WP``"%,"``(_`0`[5`(``KP!`$U4
+M`@`"J`$`EE0"``)/`0#?5`(``LH```95`@`")`$`8E4"``(9`0!J50(``<\`
+M`(M5`@`";0$`JE4"``(Q`0"V50(``AD!`.Y5`@`"C@$`_E4"``(R`@!%5@(`
+M`N@``%I6`@`"Q@$`AU8"``)?`0"I5@(``@L"`+A6`@`"8`$`S%8"``)7`0#J
+M5@(``H<!``%7`@`"2P$`'E<"``))`@`[5P(``DD"`%)7`@`"Z```<U<"``)7
+M`0"#5P(``C\!`+Q7`@`"2`$`@5@"``*\``"-6`(``M$!`.E8`@`!!0``[E@"
+M``(]`@`(60(``N@``!19`@`"T0$`25D"``)#`0!Z60(``C("`(99`@`"T0$`
+MHED"``*<`0"P60(``C("`+Q9`@`"T0$`R%D"``+E```I6@(``E<!`(U:`@`"
+M2`$`]EL"``(N`0!37`(``KP``&-<`@`"T0$`>%P"``)?`0"=7`(``0,``,U<
+M`@`!'@(`$UT"``$>`@`V70(``1X"`(Q=`@`!'@(`JUT"``$>`@``7@(``1X"
+M`#M>`@`"O```2UX"``+1`0!;7@(``D\!`)=>`@`"O```IUX"``+1`0"U7@(`
+M`7$!`,I>`@`"*P(`XUX"``(R`@`37P(``E,"`#]?`@`!'@(`7E\"``$>`@!C
+M7P(``E,"`-%?`@`"5P$`)V`"``*'`0!,8`(``DL!`'M@`@`"20(`#6$"``$&
+M```280(``CT"`#-A`@`"20(`6F$"``+H``"`80(``1X"`)]A`@`!'@(`YF$"
+M``)7`0`B8@(``C\!`$MB`@`"XP``5V("``(R`@".8@(``1X"`*UB`@`!'@(`
+MD&,"``$>`@"M8P(``1X"`#-D`@`"(P$`4F0"``*S`0"'9`(``1X"`*-D`@`!
+M'@(`T60"``$>`@#M9`(``1X"`#=E`@`!'@(`5F4"``$>`@"(90(``1X"`+5E
+M`@`"O```Q64"``+1`0#190(``E\!`.1E`@`"XP``\&4"``(R`@`99P(``KP`
+M`"5G`@`"T0$`:6<"``*\``!U9P(``M$!`(EG`@`"J`$`G6@"``(2`@#Q:`(`
+M`08``/9H`@`"/0(`"VD"``*\```7:0(``M$!`$!I`@`"5P$`MVD"``)7`0`F
+M:@(``J@!`.!J`@`",@(`7FL"``(R`@"R:P(``C("`-%K`@`"O```W6L"``+1
+M`0#Q:P(``J<!``UM`@`",@(`4FT"``(R`@!Q;0(``KP``'UM`@`"T0$`D6T"
+M``*G`0#0;0(``C("`"!N`@`",@(`>6X"``(R`@"J;@(``C8!`-%N`@`"O```
+MW6X"``+1`0#I;@(``J@!`#!O`@`!'@(`%G("``*^```V<@(``KX``&%R`@`"
+MO@``%G,"``*^```V<P(``KX``&-S`@`"O@``LW,"``(C`0#R<P(``F\!`$!T
+M`@`"6P$`G'0"``++``"D=`(``A0!`+-T`@`!`P``_W0"``+Q```;=0(``BH!
+M`'AU`@`",@(`VGH"``$)``#J>@(``0D``/IZ`@`"[0``4'L"``*E`0`Z?`(`
+M`C,!`&=\`@`"F0$`>GP"``(S`0!1?0(``E<!`*M]`@`":P$`T'T"``(2`@#Y
+M?0(``MT``'Y^`@`"+P$`O7X"``(J`0`:?P(``DX!`$J``@`",@(`<X$"``$)
+M``"$@0(``0D``)2!`@`"[0``RX$"``$)``#<@0(``0D``.R!`@`"[0``<X("
+M``$>`@#"@@(``1X"`.."`@`"X0``^X("``+A```3@P(``N$``"N#`@`"X0``
+M0X,"``+A``!;@P(``N$``'F#`@`!'@(`Q(,"``$>`@#T@P(``1X"`)V$`@`"
+MX0``^X0"``*4`0`-A0(``HT!`)Z%`@`"$@(`UX4"``(2`@#>A0(``8@!`/&%
+M`@`"40$`_84"``+1``!$A@(``I0!`%:&`@`"C0$`KX8"``&(`0#"A@(``E$!
+M`,Z&`@`"T0``*H<"``(8`0`XAP(``N,``$2'`@`",@(`?H<"``(.`0",AP(`
+M`N,``)B'`@`",@(`PH<"``(8`0#4AP(``N,``."'`@`",@(`+8@"``(.`0#'
+MB`(``LX``-.(`@`"T0$`@HL"``+)`0"8BP(``AX!`(:,`@`"1@$`FXP"``%F
+M`0#PC`(``LD!``:-`@`"'@$`JHT"``)&`0#QC0(``D8!`+2.`@`"_@``S8X"
+M``(+`0#NC@(``ED!`%./`@`!`P``M)("``)8`0`ZDP(``E@!`%:3`@`"$@(`
+M0)0"``+N``"LE0(``1X"`,.5`@`!'@(`TY4"``(R`@`>E@(``0<``&:6`@`!
+M'@(`F98"``$'``"[E@(``0<```.7`@`!'@(`>)<"``$'``#`EP(``1X"`/.7
+M`@`!!P``%9@"``$'``!=F`(``1X"`,:8`@`!!P``UY@"``$'``!JF0(``1X"
+M`/^9`@`!'@(`DIH"``$>`@"\F@(``C("`(B;`@`"S```1YX"``*&`0"_GP(`
+M`0,``,Z?`@`!!P``V)\"``$'``#CGP(``0<``.V?`@`!!P``-J0"``$'```[
+MI`(``@,"`,&D`@`"[0``T:0"``(R`@#MI`(``K$!`!BE`@`!!@``':4"``(]
+M`@!EI0(``B<"`'^E`@`")P(`F:4"``(G`@`1I@(``K<!`#*F`@`",0(`3Z8"
+M``(Q`@!PI@(``C$"`(VF`@`",0(`KJ8"``(Q`@#+I@(``C$"`.RF`@`",0(`
+M":<"``(Q`@!&IP(``C$"`%VG`@`",0(`BZ<"``(Q`@"HIP(``C$"`,FG`@`"
+M,0(`YJ<"``(Q`@`'J`(``C$"`"2H`@`",0(`1:@"``(Q`@!BJ`(``C$"`(.H
+M`@`",0(`H*@"``(Q`@#!J`(``C$"`-ZH`@`",0(`_Z@"``(Q`@`<J0(``C$"
+M`#VI`@`",0(`6JD"``(Q`@![J0(``C$"`)BI`@`",0(`N:D"``(Q`@#6J0(`
+M`C$"`/>I`@`",0(`%*H"``(Q`@`UJ@(``C$"`%*J`@`",0(`<ZH"``(Q`@"0
+MJ@(``C$"`+&J`@`",0(`SJH"``(Q`@`#JP(``F("`#2K`@`"8@(`::L"``)B
+M`@":JP(``F("`,^K`@`"8@(``*P"``)B`@`UK`(``F("`&:L`@`"8@(`FZP"
+M``)B`@#,K`(``F("``&M`@`"8@(`,JT"``)B`@!GK0(``F("`)BM`@`"8@(`
+MS:T"``)B`@#^K0(``F("`".N`@`"V```*ZX"``)$`0`YK@(``D0!`$&N`@`"
+M)@$`3:X"``(R`@!5K@(``EH!`&6N`@`"'P$`=:X"``(?`0"IK@(``A\!`,RN
+M`@`".P$`WZX"``([`0#\K@(``CL!``^O`@`".P$`*Z\"``+C```VKP(``48"
+M`(RO`@`"E`$`ZJ\"``$!``#ZKP(``M$``#>P`@`"O0``2[`"``(R`@!7L`(`
+M`N,``*:P`@`"T0$`#[$"``*4`0"%L0(``0$``)6Q`@`"T0``TK$"``*]``#F
+ML0(``C("`/*Q`@`"XP``-+("``+2`0"KL@(``0$``+NR`@`"40$`X+("``*Z
+M``#TL@(``M$``#&S`@`"O0``1;,"``(R`@!1LP(``N,``(FS`@`"O```I[,"
+M``+1`0"SLP(``I0!`,^S`@`"O```V;0"``$!``#MM`(``E$!`!:U`@`"N@``
+M*K4"``+1``!GM0(``KT``'NU`@`",@(`A[4"``+C``#)M0(``KP``.6U`@`"
+MT0$`=;8"``*4`0"=M@(``08``**V`@`"/0(`L+8"``+2`0#,M@(``M$!``FW
+M`@`"20(`*+<"``*]``!YMP(``A("`%VX`@`"N`$`G;@"``$!``"QN`(``E$!
+M`-JX`@`"N@``];@"``+1```WN0(``KT``$NY`@`",@(`5[D"``+C``"CN0(`
+M`A("`->Y`@`"O```\+D"``(7`0`$N@(``M$!`"RZ`@`"20(`\+H"``*\```!
+MNP(``A<!``V[`@`"T0$`TKL"``*]```@O`(``KP!`&B\`@`"7P$`?KP"``)(
+M`0"=O`(``J@!`->\`@`"@0$`X;T"``)B`0`#O@(``L(!`".^`@`"2P(`5[X"
+M``+8``!?O@(``EX!`&>^`@`"7@$`=[X"``(?`0!_O@(``D0!`(N^`@`"1`$`
+ME[X"``(F`0"CO@(``C("`*N^`@`"6@$`O[X"``']``#:O@(``BL"`.J^`@`"
+M3P$`#+\"``)C`0`:OP(``F,!`#F_`@`!"0``1K\"``$)``!COP(``0<``&V_
+M`@`!!P``CK\"``'X``"<OP(``0<``**_`@`!^```J+\"``$'``"NOP(``?@`
+M`+2_`@`!!P``NK\"``'X``#!OP(``?@``->_`@`!^```WK\"``'X``#MOP(`
+M`?@``/2_`@`!^```_;\"``'X```$P`(``?@``!/``@`!^```(,`"``$'```Z
+MP`(``?@``$C``@`!^```5\`"``'X``!>P`(``?@``&?``@`!^```;L`"``'X
+M``"&P`(``0<``)C``@`!`P``U<`"``$#``#YP`(``0<```K!`@`!!P``-L$"
+M``'X``!$P0(``?@``&[!`@`!^```E,$"``'X``"AP0(``?@``//!`@`"#`(`
+M!\("``$#``!_P@(``HL!`*7"`@`"P```K<("``*!`0#2P@(``DL!`.S"`@`"
+M2P$`@<,"``$%``"&PP(``CT"`)C#`@`"E`$`W\,"``$%``#DPP(``CT"`";$
+M`@`!`0``,L0"``+1``!OQ`(``KT``(/$`@`",@(`B\0"``+C``#/Q`(``I0!
+M`/'$`@`"T@$`$L4"``+1`0!LQ0(``0$``(#%`@`"40$`H<4"``*Z``"QQ0(`
+M`M$``.[%`@`"O0```L8"``(R`@`.Q@(``N,``$'&`@`"2@$`:\8"``*\``![
+MQ@(``M$!`)?&`@`"T0$`YL8"``$#```AQP(``B(!`&7'`@`"$P$`G<<"``))
+M`@"XQP(``KT``,K'`@`",@(`TL<"``+C```.R`(``DD"`"G(`@`"S`$`.\@"
+M``*I`0`6R0(``04``!O)`@`"/0(`3LD"``(+`@!?R0(``0$``'3)`@`"*P(`
+MX<L"``*+`0`*S`(``L```#C,`@`"5P$`I,P"``)7`0#YS`(``DD"`#C-`@`"
+M5P$`FLT"``))`@#@S@(``B(!`#;/`@`"8@$`4<\"``)+`0")SP(``N,``+3/
+M`@`"3P$`T<\"``(+`@#ESP(``?T``/K/`@`"*P(`5=$"``*!`0"VT0(``0,`
+M`.K1`@`"YP``4]("``+G``"\T@(``N<``"73`@`"YP``;]0"``$#``"RU`(`
+M`N<``"'5`@`"YP``AM4"``+G``#KU0(``N<``%'6`@`"YP``MM8"``+G````
+MUP(``BD"`#37`@`"YP``?M<"``(I`@"RUP(``N<``/S7`@`"*0(`,-@"``+G
+M``!ZV`(``BD"`*[8`@`"YP``!-D"``(C`0!"V0(``B,!`(#9`@`"(P$`OMD"
+M``(C`0#\V0(``B,!`#?:`@`"(P$`X-H"``$)``#KV@(``0D```G=`@`"&@(`
+M,MT"``(:`@!TW0(``0,``(G=`@`!!P``E=T"``$'``"AW0(``0<``*K=`@`!
+M!P``L-T"``$'``#-W0(``0<```W>`@`"5@(`0=X"``).`@!VW@(``?@``(/>
+M`@`!^```K]X"``'X``#,W@(``?@``-7>`@`!^```W-X"``'X``#XW@(``?@`
+M``;?`@`!^```<.`"``*!`0#CX0(``C,!`!'B`@`"F0$`)N("``(S`0"EY0(`
+M`C,!`-/E`@`"F0$`Z.4"``(S`0"5Z0(``C,!`,/I`@`"F0$`V.D"``(S`0!5
+M[0(``C,!`(/M`@`"F0$`F.T"``(S`0#@[P(``I0!`*_Q`@`"$@(``_,"``$!
+M``!Q\P(``K@!`('S`@`"40$`H?,"``*Z``#!\P(``E$!`-?S`@`"T@$`#/0"
+M``*Z```A]`(``@P!`%;T`@`"N@``E?0"``(2`@`']0(``A("`$'U`@`"T0``
+M4_4"``+1`0#9]P(``E8"``#X`@`"5@(`._D"``*\`0"+^0(``E<!`-WY`@`"
+M2`$`#OH"``)?`0!,^@(``AL!`''Z`@`"J`$`G/H"``)7`0#W^@(``B<!`#7[
+M`@`!*@(`/OL"``$J`@!1^P(``>(!`(+[`@`!(`(`2/P"``$@`@"8_`(``O,!
+M`!7]`@`!V`$`(/T"``'8`0`I_0(``>(!`#3]`@`!X@$`2/T"``'8`0"9_0(`
+M`3,"``+^`@`!V`$`\?X"``$@`@"A_P(``C4"`-K_`@`"-0(`5P`#``(U`@!\
+M``,``E,"`.8``P`"-0(`$`$#``(%`@`P`0,``C4"`$P!`P`"4P(`)@(#``)3
+M`@!9`@,``08``%X"`P`"/0(`O@(#``(+`@!*`P,``>X!`%\#`P`""P(`<P,#
+M``'D`0"%`P,``BL"``H$`P`![@$`'P0#``(+`@`S!`,``>0!`$4$`P`"*P(`
+M?`0#``)``@#>!`,``AL"`"H%`P`"80(`=`4#``(W`@"U!0,``4,"`.T%`P`"
+MWP$`^P8#``)/`@`D!P,``N\!`#H'`P`!,P(`2@<#``+X`0!7!P,``N`!`&D'
+M`P`"Z@$`WP<#``$)``#\!P,``0D```P(`P`!"0``'`@#``%>`@`\"`,``D`"
+M`$L(`P`!`0``5@@#``$)``!W"`,``C$"`(L(`P`!"0``N@@#``%%`@#`"`,`
+M`0D``,0(`P`!8P(`R@@#``$)``#2"`,``0D``.`(`P`!"0``Y0@#``(K`@!)
+M"0,``=@!`)`)`P`"8P(`N@D#``(R`@#""0,``A,"`!4*`P`"\`$`6PH#``(Q
+M`@!U"@,``C$"`-T*`P`",0(`!0L#``+]`0#0"P,``@\"`-L+`P`"0`(`)`P#
+M``(Q`@!$#`,``MH!`+X,`P`"/@(`W@P#``(^`@#I#`,``=@!`"D-`P`"/@(`
+M2@T#``(^`@!L#0,``CX"`)`-`P`"/@(`MPT#``(^`@#:#0,``A0"`/4-`P`"
+M/@(`^PT#``'8`0!$#@,``2`"`$D.`P`"1`(`8PX#``$@`@#)#@,``2`"`-4.
+M`P`!,P(`_@X#``+H`0`7#P,``D`"`"\/`P`!"0``.@\#``$)```A$`,``C$"
+M`#@0`P`!(`(`>1`#``(/`@"J$`,``C$"`,`0`P`!V`$`_1`#``$@`@`H`0,`
+M`C4"`,`!`P`"!0(`3`(#``(%`@!5!0,``C$"`*X)`P`"-0(`/Q$#``$!``!8
+M$0,``0<``/P1`P`!`0``$!0#``)!`@!S%`,``C0"`)L4`P`!`0``Q!0#``(T
+M`@`:%0,``0,``"05`P`!`P``814#``$!``#7%0,``M0!``D6`P`!`0``6!8#
+M``(5`@!R%@,``B$"`)<6`P`!*@(`G18#``$'``"Y%@,``0<``,T6`P`!!P``
+MUA8#``$'``#<%@,``0<``.(6`P`"70(`&Q<#``(5`@`]%P,``F`"`)D7`P`"
+M8`(`RA<#``(Q`@#:%P,``0$``/L7`P`"8`(`'1@#``$'```K&`,``@X"`'D9
+M`P`!!P``@QD#``(.`@"+&0,``D`"`'P:`P`!!P``AAH#``(.`@".&@,``D`"
+M`#T;`P`!!P``1QL#``(.`@!/&P,``D`"`-8;`P`!!P``X!L#``(.`@#H&P,`
+M`D`"`%D<`P`!!P``8QP#``(.`@!K'`,``D`"`.@<`P`!!P``\AP#``(.`@#^
+M'`,``C$"`!X=`P`!!P``*!T#``(.`@!*'0,``C$"`'$=`P`",0(`MQT#``+Y
+M`0#0'0,``D`"`.,=`P`!`0``(1X#``+4`0!@'@,``0<``&@>`P`"#@(`AQX#
+M``(^`@"W'@,``0,``/P>`P`"8`(`*A\#``+Y`0`W'P,``DL"`%D?`P`"0`(`
+M:1\#``$!``""'P,``F`"`(\?`P`"2P(`RQ\#``$#```P(`,``F`"`(`@`P`"
+M,0(`DR`#``$!``"8(`,``N8!`+@@`P`!,P(`*2$#``+M`0!-(0,``0<``%<A
+M`P`"#@(`8R$#``(Q`@"3(0,``OD!`*PA`P`"\@$`2"0#``+R`0"/)`,``NT!
+M``@E`P`"\@$`3B4#``+M`0":)0,``0<``*0E`P`"#@(`K"4#``)``@#N)0,`
+M`@\"`!,F`P`!,P(`4R8#``+M`0":)@,``NT!``PG`P`"[0$`+R<#``+Y`0!$
+M)P,``4,"`'@G`P`!!P``@B<#``(.`@".)P,``C$"`-TH`P`"\@$`.RD#``$S
+M`@"F*0,``NT!``@J`P`"\@$`$RH#``$%```G*@,``CT"`&HJ`P`"\@$`=2H#
+M``$%``")*@,``CT"`-4J`P`"[0$`_RH#``+R`0`I*P,``O(!`'$K`P`!!@``
+M=BL#``(]`@"_+`,``O(!``,M`P`"[0$`42T#``+M`0"(+0,``NL!`.(M`P`"
+M[0$`%2X#``+R`0`T+@,``A8"`/\N`P`"[0$`#"\#``$%``!1+P,``CT"`!LP
+M`P`"\@$`6C`#``+M`0"S,`,``NT!`-XP`P`!!@``XS`#``(]`@`',0,``O(!
+M`$LQ`P`"[0$`GS$#``+M`0#K,0,``04``/`Q`P`"/0(`(C(#``(2`@!C,@,`
+M`NT!`'<R`P`"]P$`LS(#``+M`0#W,@,``NT!`#HS`P`"[0$`6#,#``(/`@!Q
+M,P,``O(!`)HS`P`"%@(``C0#``+S`0#C-`,``EL"`!,U`P`"U0$`:C4#``$S
+M`@"C-0,``O4!`-LU`P`"\`$`\C4#``%#`@!D-@,``E4"`&XV`P`"Z@$`BC8#
+M``'7`0"I-@,``F`"`%8W`P`"[`$`9C<#``(/`@"R.`,``NP!`-(X`P`"[`$`
+M9#H#``(6`@#V.@,``@\"`&4[`P`"ZP$`RSL#``+:`0#5.P,``D$"`!\\`P`"
+MU@$`5CP#``+:`0!_/`,``C$"`+L\`P`"[P$`USP#``+?`0"0/0,``D$"``,^
+M`P`"50(`(3X#``+X`0!1/@,``N`!`'0^`P`"0`(`D#X#``$!``"^/@,``M0!
+M`-D_`P`"6@(`.D`#``$!``!Z0`,``F`"`!!!`P`"6@(`,D$#``)@`@"V00,`
+M`OD!`*@4`P`".0(`&!8#``(Y`@`Q%@,``A4"`&48`P`",0(`+38#``+Y`0!;
+M-@,``C$"`'8W`P`"ZP$`[SL#``(/`@!./`,``NL!`+A``P`"6@(`Y$$#``$@
+M`@"L0@,``2`"`&%#`P`!(`(`3D0#``$@`@#]10,``0,``"E'`P`"*0(`F$@#
+M``(I`@!@20,``BD"``]+`P`"_@$`:$P#``+^`0"C30,``0,``#=/`P`"_@$`
+MM$\#``+^`0"*4`,``OX!`+-0`P`!"0``UE`#``$)``#C4`,``0D``.Q0`P`!
+M"0``]5`#``$)``#^4`,``0D```=1`P`!"0``$%$#``$)```940,``0D``")1
+M`P`!"0``*U$#``$)```T40,``0D``#U1`P`!"0``0U$#``$)``"640,``MT!
+M`-Q6`P`"_@$`'%<#``+^`0!<5P,``OX!`,)7`P`"_@$`'5@#``+^`0""6`,`
+M`OX!`/%8`P`!,P(`$UD#``+^`0`?60,``OX!`,99`P`"_@$`Z5D#``+^`0#F
+M6@,``OX!``E;`P`"_@$`E%L#``+^`0"V6P,``OX!`!I<`P`"_@$`)EP#``+^
+M`0!47`,``OX!`'9<`P`"_@$`UUP#``+^`0#C7`,``OX!`!E=`P`"_@$`.UT#
+M``+^`0"570,``OX!`*%=`P`"_@$`!5X#``+^`0`17@,``OX!`'5>`P`"_@$`
+M@5X#``+^`0#E7@,``OX!`/%>`P`"_@$`55\#``+^`0!A7P,``OX!`,5?`P`"
+M_@$`T5\#``+^`0`U8`,``OX!`$%@`P`"_@$`Q6`#``+^`0#18`,``OX!`#5A
+M`P`"_@$`06$#``+^`0"L80,``OX!`+AA`P`"_@$`QF$#``+^`0#080,``OX!
+M`&5B`P`"_@$`<6(#``+^`0#58@,``OX!`.%B`P`"_@$`66,#``+^`0!F8P,`
+M`OX!`,EC`P`"_@$`UF,#``+^`0#;9`,``OX!`.ED`P`"_@$`BV4#``+^`0"9
+M90,``OX!`/5E`P`"_@$``68#``+^`0"(9@,``OX!`)1F`P`"_@$`&&<#``+^
+M`0`D9P,``OX!`)1G`P`"_@$`H&<#``+^`0"N:`,``OX!`+QH`P`"_@$`F&D#
+M``+^`0"F:0,``OX!`&!J`P`"_@$`;FH#``+^`0"K:@,``0<``+AJ`P`!!P``
+M^&L#``$!``#P;`,``MT!`)5M`P`!0P(`#&X#``(T`@`Q;@,``0$``#EN`P`"
+M.0(`?FX#``(T`@"(;@,``D`"`.UN`P`".0(`-6\#``(T`@!V;P,``0$``(-O
+M`P`!`0``BV\#``(Y`@"5;P,``C4"`-5O`P`"0`(`7'`#``(Q`@!T<`,``08`
+M`'EP`P`"/0(`I7`#``)``@`-<0,``C$"`"5Q`P`!!@``*G$#``(]`@#.<0,`
+M`0$```QR`P`!`0``)7(#``)@`@!,<@,``0$``&5R`P`"8`(`C'(#``$!``"E
+M<@,``F`"`,QR`P`!`0``Y7(#``)@`@`,<P,``0$``"5S`P`"8`(`3',#``$!
+M``!E<P,``F`"`(QS`P`!`0``I7,#``)@`@#,<P,``0$``.5S`P`"8`(`#'0#
+M``$!```E=`,``F`"`$QT`P`!`0``970#``)@`@",=`,``0$``*5T`P`"8`(`
+MS'0#``$!``#E=`,``F`"``QU`P`!`0``)74#``)@`@!,=0,``0$``&5U`P`"
+M8`(`C'4#``$!``"E=0,``F`"`,QU`P`!`0``Y74#``)@`@`,=@,``0$``"5V
+M`P`"8`(`3'8#``$!``!E=@,``F`"`(QV`P`!`0``I78#``)@`@#,=@,``0$`
+M`.5V`P`"8`(`_78#``$!```8=P,``F`"`"UW`P`!`0``2W<#``)@`@".=P,`
+M`C$"`)AW`P`!`0``LW<#``)@`@`K>`,``0$``$9X`P`"8`(`NW@#``(5`@#5
+M>`,``C0"`/9X`P`!`0``2GD#``(Q`@``>@,``04```EZ`P`"/0(`&7H#``+Y
+M`0`M>@,``C$"`#5Z`P`"%0(`7GH#``$%``!G>@,``CT"`'=Z`P`"^0$`FWH#
+M``(5`@"B>@,``0$``+YZ`P`"8`(`*7L#``(Q`@`Q>P,``A4"`(M[`P`!`0``
+MJ7L#``)@`@!,?`,``OX!`$)]`P`"[0$`7'T#``$!``!U?0,``B$"`/A]`P`"
+M[0$`-'X#``+^`0#>?@,``NT!``9_`P`!`0``'W\#``(A`@!F?P,``A4"`'!_
+M`P`!`0``B7\#``(A`@`W@`,``0$```B!`P`!`0``(8$#``(A`@#]@0,``0$`
+M``^"`P`"(0(`+((#``$@`@#6@@,``0$``/*"`P`"(0(`%X,#``$)```A@P,`
+M`0D``#.#`P`!"0``.X,#``$)``!$@P,``0D``$V#`P`!"0``5H,#``$)``!?
+M@P,``0D``&B#`P`!"0``<8,#``$)``!Z@P,``0D``(.#`P`!"0``C(,#``$)
+M``"F@P,``0D``+"#`P`!`0``R8,#``(A`@!%A`,``0$``%Z$`P`"(0(`[X0#
+M``$!```(A0,``B$"`$V%`P`"_@$`EX4#``$!``"XA0,``B$"`/V%`P`"_@$`
+M-X8#``$!``!8A@,``B$"`)J&`P`!(`(`YH8#``$!```"AP,``B$"`$R'`P`!
+M(`(`QH<#``$!``#FAP,``B$"`)Z(`P`!`0``MX@#``(A`@!ZB0,``0$``).)
+M`P`"(0(`>HH#``$!``"3B@,``B$"`&J+`P`!`0``@XL#``(A`@!:C`,``0$`
+M`'.,`P`"(0(`/(T#``$!``!:C0,``B$"`)F-`P`!`0``LHT#``(A`@!4C@,`
+M`0$``&V.`P`"(0(`JHX#``$!``#(C@,``B$"`.*.`P`!!@```8\#``%#`@`+
+MCP,``0$``"2/`P`"(0(`,8\#``$&``!,CP,``1@"`%./`P`!!@``8X\#``$&
+M``![CP,``0$``*"/`P`"8`(`JX\#``'<`0"UCP,``08``,V/`P`!`0``[8\#
+M``$!```/D`,``B$"`'N0`P`!`0``D9`#``(A`@`)D0,``OX!`#N1`P`",0(`
+M0Y$#``(5`@!UD0,``0$``(Z1`P`"(0(`#I(#``$!```MD@,``F`"`%.2`P`"
+MU`$`<)(#``+^`0"0D@,``OX!`+J2`P`"_@$`"I,#``+^`0!0DP,``OX!`'N3
+M`P`"_@$`"Y0#``+^`0`5E`,``OX!`%"4`P`"_@$`<)0#``+^`0"1E`,``OX!
+M`!*5`P`"_@$`4I4#``+^`0"/E0,``OX!`,^5`P`"_@$`#Y8#``+^`0!/E@,`
+M`OX!`'*6`P`!!@``'9<#``'N`0!;EP,``@L"`&^7`P`!Y`$`@9<#``(K`@"=
+MEP,``0$``+F7`P`"(0(`S)<#``+9`0`UF`,``C0"`-.8`P`!`0``WY@#``(Y
+M`@`5F0,``D`"`$&9`P`"$@(`7YD#``$!``!TF0,``0$``(:9`P`"(0(`.YH#
+M``$!``!-F@,``B$"`&J:`P`!`0``?)H#``(A`@"$F@,``A4"`*&:`P`"_@$`
+MP9H#``+^`0#PF@,``OX!``.;`P`"-`(`/9L#``(2`@!HFP,``0$``&^;`P`!
+M`0``J9L#``$!``#"FP,``B$"``Z<`P`!`0``)YP#``(A`@!<G`,``3,"`'6<
+M`P`!!@``B9P#``$&``#@G`,``=P!`.V<`P`!`0``!IT#``(A`@!4G0,``1@"
+M`'2=`P`!!@``D9T#``$&``#HG0,``4,"`#B>`P`![@$`Q9X#``+^`0!HH`,`
+M`NT!`,2@`P`"[0$`$J$#``+M`0"+HP,``0$``*2C`P`"(0(`"Z4#``$!```D
+MI0,``B$"`(*E`P`"6`(`D:4#``(T`@"BI0,``0$``*JE`P`".0(`T:4#``+^
+M`0#9I0,``CL"`..E`P`!`0``_*4#``(A`@`AI@,``CL"`#&F`P`!`0``2J8#
+M``(A`@#)I@,``0$``/"F`P`"+@(`D:<#``$!``#/J`,``OD!`/VH`P`!W`$`
+M'ZD#``+Y`0`[J0,``OD!`%2I`P`!W`$`?JD#``+Y`0"OJ0,``OD!`.2I`P`"
+M^0$`!*H#``+Y`0"6J@,``0$``(:L`P`!`0``G:P#``(N`@`.K0,``0$``"6M
+M`P`"+@(`-:T#``+Y`0"!K0,``0$``)BM`P`"+@(`J*T#``+Y`0#7K0,``OX!
+M`.^M`P`!`0``"*X#``(A`@`7K@,``0,``$FN`P`"^0$`YJX#``+V`0`&KP,`
+M`0$``"^O`P`"+@(`/Z\#``+Y`0!EKP,``OD!`,.O`P`"^0$`R;`#``+V`0`#
+ML0,``0$``!JQ`P`"+@(`*K$#``+Y`0!&L0,``OD!``>R`P`"^0$`G+(#``+Y
+M`0`4LP,``0$``"NS`P`"+@(`.[,#``+Y`0"'LP,``OD!`-:S`P`"&0(`YK,#
+M``(9`@`YM`,``OD!`(NT`P`"^0$`GK0#``)5`@"KM`,``CL"`+FT`P`"&0(`
+MR;0#``)5`@#HM`,``O8!``ZU`P`!`0``);4#``(N`@`UM0,``OD!`$VU`P`"
+M!P(`>;4#``+V`0"SM0,``0$``,JU`P`"+@(`VK4#``+Y`0`*M@,``0$``"&V
+M`P`"+@(`,;8#``+Y`0!;M@,``0$``(2V`P`"+@(`E+8#``+Y`0"`N0,``O8!
+M`,>Y`P`"_@$`(+H#``([`@`PN@,``0$``$FZ`P`"(0(`6;H#``+U`0"UN@,`
+M`0$``,ZZ`P`"(0(`[;H#``+^`0!UNP,``O4!`*6]`P`!`0``OKT#``(A`@#=
+MO0,``OX!`/.]`P`"]0$`=;X#``+^`0"QO@,``O4!`+N^`P`!`0``U+X#``(A
+M`@!,OP,``MH!`)N_`P`"#P(`Q;\#``+Q`0#XOP,``NT!`$S``P`"[0$`6<`#
+M``+U`0"*P`,``MH!`-K``P`"_@$`$\$#``$!```LP0,``B$"`._!`P`",0(`
+M)<(#``('`@"OP@,``OX!`-/"`P`!`P``]\(#``+H`0`VPP,``N@!`(/#`P`"
+M_@$`',4#``(6`@!]Q0,``OX!`+3%`P`"Z0$`Y\4#``+:`0#\Q0,``@\"`";'
+M`P`"*0(`=,<#``(I`@"OQP,``OX!``K(`P`"%@(`!\D#``(I`@`_R0,``MX!
+M`*_*`P`"_@$`[\H#``+I`0!VRP,``D`"`(O+`P`"!P(`H\L#``+C`0!4S`,`
+M`CL"`&#,`P`"&0(`M\P#``$!``#.S`,``BX"`-[,`P`"^0$`0,T#``$!``!7
+MS0,``BX"`&?-`P`"^0$`JLT#``)8`@#_S0,``MH!`%[.`P`!`0``=<X#``(N
+M`@")S@,``OD!`/+.`P`"_@$`5L\#``+^`0!HSP,``0$``(+/`P`"&0(`F,\#
+M``)5`@#4SP,``0$``.O/`P`"+@(`^\\#``+Y`0`)T`,``0$``#/1`P`"ZP$`
+M<]$#``(9`@"'T0,``E@"`"'2`P`"_@$`8=(#``+I`0#ST@,``MH!`"+3`P`"
+MZ0$`5-,#``+:`0"GTP,``NP!`+/3`P`"ZP$`W],#``$!```2U`,``OX!`#34
+M`P`!`0``4M0#``(A`@"TU`,``A("`![5`P`!`0``-]4#``(A`@!]U0,``0$`
+M`);5`P`"(0(`O=4#``(5`@`$U@,``E@"``S6`P`"&0(`'-8#``$!```ZU@,`
+M`B$"`,W7`P`"$@(`W=<#``);`@"GV`,``OX!``'9`P`".@(`.]D#``$!``!4
+MV0,``B$"``?:`P`"X0$`Z]H#``+G`0`/W0,``A("`!_=`P`"6P(`C]T#``+J
+M`0"?W0,``OX!`+C=`P`"00(`P-T#``+J`0#.W0,``0$``.?=`P`"(0(`(MX#
+M``(Q`@"/W@,``0$``+'>`P`"#0(`\-X#``+^`0!6X`,``0$``(K@`P`"5P(`
+MEN$#``(E`@"'X@,``C0"`*OB`P`!`0``Y>(#``(5`@`%XP,``0$``!KE`P`!
+M!0``(^4#``(]`@!FYP,``O8!`)WG`P`"0`(`+ND#``$!```&Z@,``0$``'3J
+M`P`"*0(`F^H#``)``@"ZZ@,``C0"`"+K`P`!&`(`:>L#``(Q`@!UZP,``A4"
+M`+SK`P`",0(`R.L#``(5`@#HZP,``C$"`/GK`P`!`0``?^P#``$!``"E[`,`
+M`0$``$/M`P`!`0``"NX#``+^`0!J[@,``OX!`/KN`P`"_@$`B>\#``+^`0#C
+M[P,``OX!`(/P`P`"_@$`-?$#``(&`@!'\0,``2H"`+[Q`P`"/P(`V/$#``(?
+M`@!6\@,``C$"`&7R`P`"%0(`;_(#``$!``"(\@,``B$"`!+S`P`",0(`(?,#
+M``(5`@`K\P,``0$``$3S`P`"(0(`JO,#``+Y`0#W\P,``OX!``/T`P`"_@$`
+M-_0#``)4`@"E]`,``E0"`)OU`P`"_@$`RO4#``)4`@#=]0,``0$``/;U`P`"
+M(0(`7?8#``+^`0!E]@,``D$"`)/V`P`"_@$`O/8#``$!``#5]@,``B$"`._V
+M`P`"_@$`E?<#``(5`@"?]P,``0$``+CW`P`"(0(`:_@#``+5`0"[^`,``2`"
+M`,CX`P`!(`(`T/@#``)<`@`J^0,``N@!`'GY`P`!(`(`P?D#``$!``#:^0,`
+M`B$"`%[Z`P`!`0``:OH#``+F`0"K^@,``0$``,3Z`P`"(0(`Z?H#``$!```(
+M^P,``F`"`%W[`P`"\`$`;?L#``%#`@"`^P,``OD!`,[[`P`!`0``$/P#``(Q
+M`@`M_`,``C$"`#K\`P`"Z@$`;_P#``+^`0!Y_`,``OX!`(7\`P`"]`$`C/P#
+M``$!``"R_`,``B$"`-C\`P`![@$`#OT#``'N`0`:_0,``@`"`#K]`P`!Y`$`
+M3/T#``(K`@"D_0,``A("`,K]`P`!`0``X_T#``(A`@`V_@,``0$``$_^`P`"
+M(0(`M_X#``+^`0`._P,``CH"`$;_`P`!`0``7_\#``(A`@#K_P,``N$!`,\`
+M!``"YP$`AP$$``+^`0#N`00``0$```<"!``"(0(`<P($``+A`0!G`P0``OX!
+M`,@#!``!`0``X0,$``(A`@!!!`0``N$!`"8%!``!(`(`:@4$``$!``"#!00`
+M`B$"`)8%!``"_@$`VP4$``+U`0#D!@0``AD"``,'!``!`P``;@@$``$!``"7
+M"`0``OX!`'()!``"&0(`?`D$``$!``"5"00``B$"`,X)!``"_@$`!@H$``(2
+M`@`G"@0``0$``$4*!``"(0(`JPH$``(T`@"["@0``1@"`)$+!``!`0``F`L$
+M``$!``!C#`0``B8"`(<,!``!`0``HPP$``(A`@`3#00``0$``"P-!``"8`(`
+M8`X$``(5`@!W#@0``0$``)`.!``"(0(`&@\$``(5`@!&#P0``B8"`+P/!``"
+M%0(`7A`$``(F`@!U$`0``B8"`(81!``"%0(`X1$$``(Q`@`!$@0``OX!`"02
+M!``"\0$`.Q($``$!``!4$@0``B$"``$3!``!`0``&A,$``(A`@`J$P0``OD!
+M`#<3!``!`0``6!,$``(A`@!;<0,``C4"`.%Q`P`"+P(`_W<#``(Y`@!8>`,`
+M`A4"``YY`P`".0(`7GD#``(5`@`E?`,``CD"`/Z1`P`".0(`BYL#``(Y`@#T
+MJ@,``B\"`$C>`P`"X`$`+^,#``(A`@`NYP,``CD"`&OI`P`"#0(`,.H#``(A
+M`@#:[`,``@T"`-;M`P`".0(`$?L#``+7`0`!_`,``F`"`,$,!``".0(`X0\$
+M``(Y`@#V$`0``CD"`$`1!``".0(`$A8$``)@`@`V%@0``OT!`&L6!``")@(`
+M1AD$``$!``"Q&00``AL"`.L9!``!`0``]AD$``$!``#H&@0``@<"`/$;!``"
+M&P(`3!P$``'_`0!E'`0``E<"`.`<!``",0(`$1\$``'_`0`J'P0``E<"`#P?
+M!``"_P$`XQ\$``):`@`3(`0``F`"`+$@!``".0(`U2`$``+;`0`D(00``CD"
+M`,P5!``"8`(`G1H$``(Y`@!\'`0``O\!``T=!``"6@(`>!T$``(Y`@`<(00`
+M`C4"`*\A!``"]@$`$R0$``(!`@!/)`0``@$"`&HD!``"`0(`&B4$``+>`0`C
+M)@0``N,!`&8G!``"*0(`2R@$``+Y`0"`*`0``ND!`!XI!``"&0(`[2L$``+W
+M`0#]*P0``O(!`#`L!``"[0$`A2P$``+M`0"B+`0``O4!`#0M!``"&0(`:BT$
+M``('`@"#+00``@<"`)$M!``"!P(`H2T$``(9`@"I+00``AD"`/PM!``!`P``
+MA2X$``(7`@#<+@0``OL!`"TO!``"X`$`O2\$``(9`@#4,`0``CL"`#8Q!``"
+M*0(`3C$$``+I`0!>,00``A<"`(\Q!``"%@(`SC,$``+M`0`0-`0``NT!`",T
+M!``"]P$`US0$``+M`0#P-`0``O<!`!@U!``"\@$`-C4$``+R`0#Y.`0``F4"
+M`%0Y!``"90(`]SD$``)E`@#=.@0``D`"`)$[!``"]P$`R3L$``+M`0#1.P0`
+M`O<!`.([!``"]P$`/CP$``+M`0!*/`0``O<!`,`\!``"]@$`USP$``([`@#V
+M/`0``O8!`(,]!``"90(`AC\$``)!`@"C/P0``CL"`*T_!``"&0(`YS\$``(7
+M`@`P)@0``OL!`&`H!``"^P$`Z"\$``([`@!6/@0``D$"`!%`!``!V`$`,D`$
+M``$X`@!-0`0``3@"`-Y!!``!`0``_4$$``)@`@`X0@0``A\"`'Y"!``"8@(`
+MGD($``),`@`<`````0$``"`````!`0``)`````$!```H`````0$``"P````!
+M`0``,`````$!```T`````0$``#@````!`0``/`````$!``!``````0$``$0`
+M```!`0``2`````$!``!,`````0$``%`````!`0``5`````$!``!8`````0$`
+M`%P````!`0``8`````$!``!D`````0$``&@````!`0``;`````$!``!P````
+M`0$``'0````!`0``>`````$!``!\`````0$``(`````!`0``A`````$!``"(
+M`````0$``(P````!`0``D`````$!``"4`````0$``)@````!`0``G`````$!
+M``"@`````0$``*0````!`0``J`````$!``"L`````0$``+`````!`0``M```
+M``$!``"X`````0$``+P````!`0``P`````$!``#$`````0$``,@````!`0``
+MS`````$!``#0`````0$``-0````!`0``V`````$!``#<`````0$``.`````!
+M`0``Y`````$!``#H`````0$``.P````!`0``\`````$!``#T`````0$``/@`
+M```!`0``_`````$!`````0```0$```0!```!`0``"`$```$!```,`0```0$`
+M`!`!```!`0``%`$```$!```8`0```0$``!P!```!`0``(`$```$!```D`0``
+M`0$``"@!```!`0``+`$```$!```P`0```0$``#0!```!`0``.`$```$!```\
+M`0```0$``$`!```!`0``1`$```$!``!(`0```0$``$P!```!`0``4`$```$!
+M``!4`0```0$``%@!```!`0``7`$```$!``"`!0```0$``(0%```!`0``B`4`
+M``$!``",!0```0$``)`%```!`0``E`4```$!``"8!0```0$``)P%```!`0``
+MH`4```$!``"D!0```0$``*@%```!`0``K`4```$!``"P!0```0$``+0%```!
+M`0``N`4```$!``"\!0```0$``,`%```!`0``Q`4```$!``#(!0```0$``,P%
+M```!`0``T`4```$!``#4!0```0$``-@%```!`0``W`4```$!``#@!0```0$`
+M`.0%```!`0``Z`4```$!``#L!0```0$``/`%```!`0``]`4```$!``#X!0``
+M`0$``/P%```!`0````8```$!```$!@```0$```@&```!`0``#`8```$!```0
+M!@```0$``!0&```!`0``&`8```$!```<!@```0$``"`&```!`0``)`8```$!
+M```H!@```0$``"P&```!`0``,`8```$!```T!@```0$``#@&```!`0``/`8`
+M``$!``!`!@```0$``$0&```!`0``2`8```$!``!,!@```0$``%`&```!`0``
+M5`8```$!``!8!@```0$``%P&```!`0``8`8```$!``!D!@```0$``&@&```!
+M`0``;`8```$!``!P!@```0$``'0&```!`0``>`8```$!``!\!@```0$``(`&
+M```!`0``A`8```$!``"(!@```0$``(P&```!`0``D`8```$!``"4!@```0$`
+M`)@&```!`0``G`8```$!``"@!@```0$``*0&```!`0``J`8```$!``"L!@``
+M`0$``+`&```!`0``M`8```$!``"X!@```0$``+P&```!`0``P`8```$!``#$
+M!@```0$``,@&```!`0``S`8```$!``#0!@```0$``-0&```!`0``V`8```$!
+M``#<!@```0$``.`&```!`0``Y`8```$!``#H!@```0$``.P&```!`0``\`8`
+M``$!``#T!@```0$``/@&```!`0``_`8```$!````!P```0$```0'```!`0``
+M"`<```$!```,!P```0$``!`'```!`0``%`<```$!```8!P```0$``!P'```!
+M`0``(`<```$!```D!P```0$``"@'```!`0``+`<```$!```P!P```0$``#0'
+M```!`0``.`<```$!```\!P```0$``$`'```!`0``1`<```$!``!(!P```0$`
+M`$P'```!`0``4`<```$!``!4!P```0$``%@'```!`0``7`<```$!``!@!P``
+M`0$``&0'```!`0``:`<```$!``!L!P```0$``'`'```!`0``=`<```$!``!X
+M!P```0$``'P'```!`0``@`<```$!``"$!P```0$``(@'```!`0``C`<```$!
+M``"0!P```0$``)0'```!`0``F`<```$!``"<!P```0$``*`'```!`0``I`<`
+M``$!``"H!P```0$``*P'```!`0``L`<```$!``"T!P```0$``+@'```!`0``
+MO`<```$!``#`!P```0$``,0'```!`0``R`<```$!``#,!P```0$``-`'```!
+M`0``U`<```$!``#8!P```0$``-P'```!`0``X`<```$!``#D!P```0$``.@'
+M```!`0``[`<```$!``#P!P```0$``/0'```!`0``^`<```$!``#\!P```0$`
+M```(```!`0``!`@```$!```("````0$```P(```!`0``$`@```$!```4"```
+M`0$``!@(```!`0``'`@```$!```@"````0$``"0(```!`0``*`@```$!```L
+M"````0$``#`(```!`0``-`@```$!```X"````0$``#P(```!`0``0`@```$!
+M``!$"````0$``$@(```!`0``3`@```$!``!0"````0$``%0(```!`0``6`@`
+M``$!``!<"````0$``&`(```!`0``9`@```$!``!H"````0$``&P(```!`0``
+M<`@```$!``!T"````0$``'@(```!`0``?`@```$!``"`"````0$``(0(```!
+M`0``B`@```$!``","````0$``)`(```!`0``E`@```$!``"8"````0$``*`(
M```!`0``I`@```$!``"H"````0$``*P(```!`0``L`@```$!``"T"````0$`
M`+@(```!`0``O`@```$!``#`"````0$``,0(```!`0``R`@```$!``#,"```
M`0$``-`(```!`0``U`@```$!``#8"````0$``-P(```!`0``X`@```$!``#D
M"````0$``.@(```!`0``[`@```$!``#P"````0$``/0(```!`0``^`@```$!
-M``#\"````0$````)```!`0``!`D```$!```("0```0$```P)```!`0``$`D`
-M``$!```4"0```0$``!@)```!`0``'`D```$!```@"0```0$``"0)```!`0``
-M*`D```$!```L"0```0$``#`)```!`0``-`D```$!```X"0```0$``#P)```!
-M`0``0`D```$!``!$"0```0$``$@)```!`0``3`D```$!``!0"0```0$``%0)
-M```!`0``6`D```$!``!<"0```0$``&`)```!`0``9`D```$!``!H"0```0$`
-M`&P)```!`0``<`D```$!``!T"0```0$``'@)```!`0``?`D```$!``"`"0``
-M`0$``(0)```!`0``B`D```$!``","0```0$``)`)```!`0``E`D```$!``"8
-M"0```0$``)P)```!`0``H`D```$!``"D"0```0$``*@)```!`0``K`D```$!
-M``"P"0```0$``+0)```!`0``N`D```$!``"\"0```0$``,`)```!`0``Q`D`
-M``$!``#("0```0$``,P)```!`0``T`D```$!``#4"0```0$``-@)```!`0``
-MW`D```$!``#@"0```0$``.0)```!`0``Z`D```$!``#L"0```0$``/`)```!
-M`0``]`D```$!``#X"0```0$``/P)```!`0````H```$!```$"@```0$```@*
-M```!`0``#`H```$!```0"@```0$``!0*```!`0``&`H```$!```<"@```0$`
-M`"`*```!`0``)`H```$!```H"@```0$``"P*```!`0``,`H```$!```T"@``
-M`0$``#@*```!`0``/`H```$!``!`"@```0$``$0*```!`0``2`H```$!``!,
-M"@```0$``%`*```!`0``5`H```$!``!8"@```0$``%P*```!`0``8`H```$!
-M``!D"@```0$``&@*```!`0``;`H```$!``!P"@```0$``'0*```!`0``>`H`
-M``$!``!\"@```0$``(`*```!`0``A`H```$!``"("@```0$``(P*```!`0``
-MD`H```$!``"4"@```0$``)@*```!`0``G`H```$!``"@"@```0$``*0*```!
-M`0``J`H```$!``"L"@```0$``+`*```!`0``M`H```$!``"X"@```0$``+P*
-M```!`0``P`H```$!``#$"@```0$``,@*```!`0``S`H```$!``#0"@```0$`
-M`-0*```!`0``V`H```$!``#<"@```0$``.`*```!`0``Y`H```$!``#H"@``
-M`0$``.P*```!`0``\`H```$!``#T"@```0$``/@*```!`0``_`H```$!````
-M"P```0$```0+```!`0``"`L```$!```,"P```0$``!`+```!`0``%`L```$!
-M```8"P```0$``!P+```!`0``(`L```$!```D"P```0$``"@+```!`0``+`L`
-M``$!```P"P```0$``#0+```!`0``.`L```$!```\"P```0$``$`+```!`0``
-M1`L```$!``!("P```0$``$P+```!`0``4`L```$!``!4"P```0$``%@+```!
-M`0``7`L```$!``!@"P```0$``&0+```!`0``:`L```$!``!L"P```0$``'`+
-M```!`0``=`L```$!``!X"P```0$``'P+```!`0``@`L```$!``"$"P```0$`
-M`(@+```!`0``C`L```$!``"0"P```0$``)0+```!`0``F`L```$!``"<"P``
-M`0$``*`+```!`0``I`L```$!``"H"P```0$``*P+```!`0``L`L```$!``#@
-M#P```0$``.0/```!`0``Z`\```$!``#L#P```0$``/`/```!`0``]`\```$!
-M``#X#P```0$``/P/```!`0```!````$!```$$````0$```@0```!`0``#!``
-M``$!```0$````0$``!00```!`0``&!````$!```<$````0$``"`0```!`0``
-M)!````$!```H$````0$``"P0```!`0``,!````$!```T$````0$``#@0```!
-M`0``/!````$!``!`$````0$``$00```!`0``2!````$!``!,$````0$``%`0
-M```!`0``5!````$!``!8$````0$``%P0```!`0``8!````$!``!D$````0$`
-M`&@0```!`0``;!````$!``!P$````0$``'00```!`0``>!````$!``!\$```
-M`0$``(`0```!`0``A!````$!``"($````0$``(P0```!`0``D!````$!``"4
-M$````0$``)@0```!`0``G!````$!``"@$````0$``*00```!`0``J!````$!
-M``"L$````0$``+`0```!`0``M!````$!``"X$````0$``+P0```!`0``P!``
-M``$!``#$$````0$``,@0```!`0``S!````$!``#0$````0$``-00```!`0``
-MV!````$!``#<$````0$``.`0```!`0``Y!````$!``#H$````0$``.P0```!
-M`0``\!````$!``#T$````0$``/@0```!`0``_!````$!````$0```0$```01
-M```!`0``"!$```$!```,$0```0$``!`1```!`0``%!$```$!```8$0```0$`
-M`!P1```!`0``(!$```$!```D$0```0$``"@1```!`0``+!$```$!```P$0``
-M`0$``#01```!`0``.!$```$!```\$0```0$``$`1```!`0``1!$```$!``!(
-M$0```0$``$P1```!`0``4!$```$!``!4$0```0$``%@1```!`0``7!$```$!
-M``!@$0```0$``&01```!`0``:!$```$!``!L$0```0$``'`1```!`0``=!$`
-M``$!``!X$0```0$``'P1```!`0``@!$```$!``"$$0```0$``(@1```!`0``
-MC!$```$!``"0$0```0$``)01```!`0``F!$```$!``"<$0```0$``*`1```!
-M`0``I!$```$!``"H$0```0$``*P1```!`0``L!$```$!``"T$0```0$``+@1
-M```!`0``O!$```$!``#`$0```0$``,01```!`0``R!$```$!``#,$0```0$`
-M`-`1```!`0``U!$```$!``#8$0```0$``-P1```!`0``X!$```$!``#D$0``
-M`0$``.@1```!`0``[!$```$!``#P$0```0$``/01```!`0``^!$```$!``#\
-M$0```0$````2```!`0``!!(```$!```($@```0$```P2```!`0``$!(```$!
-M```4$@```0$``!@2```!`0``'!(```$!```@$@```0$``"02```!`0``*!(`
-M``$!```L$@```0$``#`2```!`0``-!(```$!```X$@```0$``#P2```!`0``
-M0!(```$!``!$$@```0$``$@2```!`0``3!(```$!``!0$@```0$``%02```!
-M`0``6!(```$!``!<$@```0$``&`2```!`0``9!(```$!``!H$@```0$``&P2
-M```!`0``<!(```$!``!T$@```0$``'@2```!`0``?!(```$!``"`$@```0$`
-M`(02```!`0``B!(```$!``",$@```0$``)`2```!`0``E!(```$!``"8$@``
-M`0$``)P2```!`0``H!(```$!``"D$@```0$``*@2```!`0``K!(```$!``"P
-M$@```0$``+02```!`0``N!(```$!``"\$@```0$``,`2```!`0``Q!(```$!
-M``#($@```0$``,P2```!`0``T!(```$!``#4$@```0$``-@2```!`0``W!(`
-M``$!``#@$@```0$``.02```!`0``Z!(```$!``#L$@```0$``/`2```!`0``
-M]!(```$!``#X$@```0$````3```!`0``!!,```$!```($P```0$```P3```!
-M`0``$!,```$!```4$P```0$``!@3```!`0``'!,```$!```@$P```0$``"03
-M```!`0``*!,```$!```L$P```0$``#`3```!`0``-!,```$!```X$P```0$`
-M`#P3```!`0``0!,```$!``!$$P```0$``$@3```!`0``3!,```$!``!0$P``
-M`0$``%03```!`0``6!,```$!``!<$P```0$``.`3```!`0``Y!,```$!``#H
-M$P```0$``.P3```!`0``\!,```$!``#T$P```0$``/@3```!`0``_!,```$!
-M````%````0$```04```!`0``"!0```$!```,%````0$``!`4```!`0``%!0`
-M``$!```8%````0$``!P4```!`0``(!0```$!```D%````0$``"@4```!`0``
-M+!0```$!```P%````0$``#04```!`0``.!0```$!```\%````0$``$`4```!
-M`0``1!0```$!``!(%````0$``$P4```!`0``4!0```$!``!4%````0$``%@4
-M```!`0``7!0```$!``!@%````0$``&04```!`0``:!0```$!``!L%````0$`
-M`'`4```!`0``?!0```$!``"`%````0$``(04```!`0``B!0```$!``",%```
-M`0$``)`4```!`0``E!0```$!``"8%````0$``)P4```!`0``H!0```$!``"D
-M%````0$``*@4```!`0``K!0```$!``"P%````0$``+04```!`0``N!0```$!
-M``"\%````0$``,`4```!`0``Q!0```$!``#(%````0$``,P4```!`0``T!0`
-M``$!``#4%````0$``-@4```!`0``W!0```$!``#@%````0$``.04```!`0``
-MZ!0```$!``#L%````0$``/`4```!`0``]!0```$!``#X%````0$``/P4```!
-M`0```!4```$!```$%0```0$```@5```!`0``#!4```$!```0%0```0$``!05
-M```!`0``&!4```$!```<%0```0$``"`5```!`0``)!4```$!```H%0```0$`
-M`"P5```!`0``,!4```$!```T%0```0$``#@5```!`0``/!4```$!``!`%0``
-M`0$``$05```!`0``2!4```$!``!,%0```0$``%`5```!`0``5!4```$!``!8
-M%0```0$``%P5```!`0``8!4```$!``!D%0```0$``&@5```!`0``;!4```$!
-M``!P%0```0$``'05```!`0``>!4```$!``!\%0```0$``(`5```!`0``A!4`
-M``$!``"(%0```0$``(P5```!`0``D!4```$!``"4%0```0$``)@5```!`0``
-MG!4```$!``"@%0```0$``,`5```!`0``Q!4```$!``#(%0```0$``,P5```!
-M`0``T!4```$!``#4%0```0$``-@5```!`0``W!4```$!``#@%0```0$``.05
-M```!`0``Z!4```$!``#L%0```0$``/`5```!`0``]!4```$!``#X%0```0$`
-M`/P5```!`0```!8```$!```$%@```0$```@6```!`0``#!8```$!```0%@``
-M`0$``!06```!`0``&!8```$!```<%@```0$``"`6```!`0``)!8```$!```H
-M%@```0$``"P6```!`0``,!8```$!```T%@```0$``#@6```!`0``/!8```$!
-M``!`%@```0$``$06```!`0``2!8```$!``!,%@```0$``%`6```!`0``5!8`
-M``$!``!8%@```0$``%P6```!`0``8!8```$!``!D%@```0$``&@6```!`0``
-M;!8```$!``!P%@```0$``'06```!`0``>!8```$!``!\%@```0$``(`6```!
-M`0``A!8```$!``"(%@```0$``(P6```!`0``D!8```$!``"4%@```0$``)@6
-M```!`0``G!8```$!``"@%@```0$``*06```!`0``J!8```$!``"L%@```0$`
-M`+`6```!`0``M!8```$!``"X%@```0$``+P6```!`0``P!8```$!``#$%@``
-M`0$``,@6```!`0``S!8```$!``#0%@```0$``-06```!`0``V!8```$!``#<
-M%@```0$``.`6```!`0``Y!8```$!``#H%@```0$``.P6```!`0``\!8```$!
-M``#T%@```0$``/@6```!`0``_!8```$!````%P```0$```07```!`0``"!<`
-M``$!```,%P```0$``!`7```!`0``%!<```$!```8%P```0$``!P7```!`0``
-M(!<```$!```D%P```0$``"@7```!`0``+!<```$!```P%P```0$``#07```!
-M`0``.!<```$!```\%P```0$``$`7```!`0``1!<```$!``!(%P```0$``$P7
-M```!`0``4!<```$!``!4%P```0$``%@7```!`0``7!<```$!``!@%P```0$`
-M`&07```!`0``:!<```$!``!L%P```0$``'`7```!`0``=!<```$!``!X%P``
-M`0$``'P7```!`0``@!<```$!``"$%P```0$``(@7```!`0``C!<```$!``"0
-M%P```0$``)07```!`0``F!<```$!``"<%P```0$``*`7```!`0``I!<```$!
-M``"H%P```0$``*P7```!`0``L!<```$!``"T%P```0$``+@7```!`0``O!<`
-M``$!``#`%P```0$``,07```!`0``R!<```$!``#,%P```0$```P8```!`0``
-M$!@```$!```4&````0$``!@8```!`0``'!@```$!```@&````0$``"08```!
-M`0``*!@```$!```L&````0$``#`8```!`0``-!@```$!```X&````0$``#P8
-M```!`0``0!@```$!``!$&````0$``$@8```!`0``3!@```$!``!0&````0$`
-M`%08```!`0``6!@```$!``!<&````0$``&`8```!`0``9!@```$!``!H&```
-M`0$``&P8```!`0``<!@```$!``!T&````0$``'@8```!`0``?!@```$!``"`
-M&````0$``(08```!`0``B!@```$!``",&````0$``)`8```!`0``E!@```$!
-M``"8&````0$``)P8```!`0``H!@```$!``"D&````0$``*@8```!`0``K!@`
-M``$!``"P&````0$``+08```!`0``N!@```$!``"\&````0$``,`8```!`0``
-MQ!@```$!``#(&````0$``,P8```!`0``T!@```$!``#4&````0$``-@8```!
-M`0``W!@```$!``#@&````0$``.08```!`0``Z!@```$!``#L&````0$``/`8
-M```!`0``]!@```$!``#X&````0$``/P8```!`0```!D```$!```$&0```0$`
-M``@9```!`0``#!D```$!```0&0```0$``!09```!`0``&!D```$!``"`````
-M`08``(P````!`0``D`````$!``"4`````0$``)@````!`0``G`````$!``"@
-M`````0$``*0````!`0``J`````$!``"L`````0$``+`````!`0``M`````$!
-M``"X`````0$``+P````!`0``P`````$C`0#$`````0$``,@````!`0``S```
-M``$!``#0`````0$``-0````!`0``V`````$!``#<`````0$``.`````!`0``
-MY`````$!``#H`````0$``.P````!`0``\`````$!``#T`````0$``/@````!
-M`0``_`````%$```$`0```0$```@!```!`0``#`$```$!```0`0```0$``!0!
-M```!`0``&`$```'6``"``0```08``(P!```!`0``D`$```$!``"4`0```0$`
-M`)@!```!`0``G`$```$!``"@`0```0$``*0!```!`0``J`$```$!``"L`0``
-M`0$``+`!```!`0``M`$```$!``"X`0```0$``+P!```!`0``P`$```$Y`0#$
-M`0```0$``,@!```!`0``S`$```$!``#0`0```0$``-0!```!`0``V`$```$!
-M``#<`0```0$``.`!```!`0``Y`$```$!``#H`0```0$``.P!```!`0``\`$`
-M``$!``#T`0```0$``/@!```!`0``_`$```$$`@`$`@```0$```@"```!`0``
-M#`(```$!```0`@```0$``!0"```!`0``&`(```$_`0!\`@```0$``(`"```!
-M`0``A`(```$!``"0`@```0$``)0"```!`0``F`(```$!``#$`@```0$``,P"
-M```!`0``V`(```$!``#@`@```0$``.P"```!`0``]`(```$!`````P```0$`
-M``@#```!`0``%`,```$!```<`P```0$``"@#```!`0``,`,```$!```\`P``
-M`0$``$0#```!`0``4`,```$!``!4`P```0$``%@#```!`0``9`,```$!``!H
-M`P```0$``&P#```!`0``>`,```$!``"``P```0$``(P#```!`0``E`,```$!
-M``"@`P```0$``*0#```!`0``J`,```$!``"T`P```0$``+@#```!`0``O`,`
-M``$!``#(`P```0$``,P#```!`0``T`,```$!``#<`P```0$``.`#```!`0``
-MY`,```$!``#P`P```0$``/0#```!`0``^`,```$!```$!````0$```P$```!
-M`0``&`0```$!```@!````0$``"P$```!`0``-`0```$!``!`!````0$``$@$
-M```!`0``5`0```$!``!<!````0$``&@$```!`0``<`0```$!``!\!````0$`
-M`(0$```!`0``D`0```$!``"8!````0$``*0$```!`0``K`0```$!``"X!```
-M`0$``,`$```!`0``S`0```$!``#0!````0$``-0$```!`0``X`0```$!``#D
-M!````0$``.@$```!`0``]`0```$!``#\!````0$```@%```!`0``$`4```$!
-M```<!0```0$``"0%```!`0``,`4```$!```X!0```0$``$0%```!`0``3`4`
-M``$!``!8!0```0$``%P%```!`0``8`4```$!``!L!0```0$``'0%```!`0``
-M@`4```$!``"$!0```0$``(@%```!`0``E`4```$!``"<!0```0$``*@%```!
-M`0``K`4```$!``"P!0```0$``+P%```!`0``Q`4```$!``#0!0```0$``-@%
-M```!`0``Y`4```$!``#L!0```0$``/@%```!`0````8```$!```,!@```0$`
-M`!`&```!`0``%`8```$!```@!@```0$``"0&```!`0``*`8```$!```T!@``
-M`0$``#P&```!`0``2`8```$!``!0!@```0$``%P&```!`0``9`8```$!``!P
-M!@```0$``'@&```!`0``A`8```$!``",!@```0$``)@&```!`0``H`8```$!
-M``"L!@```0$``+0&```!`0``P`8```$!``#(!@```0$``-0&```!`0``W`8`
-M``$!``#H!@```0$``/`&```!`0``_`8```$!````!P```0$```0'```!`0``
-M$`<```$!```8!P```0$``"0'```!`0``+`<```$!```X!P```0$``$`'```!
-M`0``3`<```$!``!4!P```0$``&`'```!`0``9`<```$!``!H!P```0$``'0'
-6```!`0``>`<```$!``!\!P```0$`````
+M``#\"````0$``(`)```!`0``A`D```$!``"("0```0$``(P)```!`0``D`D`
+M``$!``"4"0```0$``)@)```!`0``G`D```$!``"@"0```0$``*0)```!`0``
+MJ`D```$!``"L"0```0$``+`)```!`0``M`D```$!``"X"0```0$``+P)```!
+M`0``P`D```$!``#$"0```0$``,@)```!`0``S`D```$!``#0"0```0$``-0)
+M```!`0``V`D```$!``#<"0```0$``.`)```!`0``Y`D```$!``#H"0```0$`
+M`.P)```!`0``\`D```$!``#T"0```0$``/@)```!`0``_`D```$!````"@``
+M`0$```0*```!`0``"`H```$!```,"@```0$``!`*```!`0``'`H```$!```@
+M"@```0$``"0*```!`0``*`H```$!```L"@```0$``#`*```!`0``-`H```$!
+M```X"@```0$``#P*```!`0``0`H```$!``!$"@```0$``$@*```!`0``3`H`
+M``$!``!0"@```0$``%0*```!`0``6`H```$!``!<"@```0$``&`*```!`0``
+M9`H```$!``!H"@```0$``&P*```!`0``<`H```$!``!T"@```0$``'@*```!
+M`0``?`H```$!``"`"@```0$``(0*```!`0``B`H```$!``","@```0$``)`*
+M```!`0``E`H```$!``"8"@```0$``)P*```!`0``H`H```$!``"D"@```0$`
+M`*@*```!`0``K`H```$!``"P"@```0$``+0*```!`0``N`H```$!``"\"@``
+M`0$``,`*```!`0``Q`H```$!``#("@```0$``,P*```!`0``T`H```$!``#4
+M"@```0$``-@*```!`0``W`H```$!``#@"@```0$``.0*```!`0``Z`H```$!
+M``#L"@```0$``/`*```!`0``]`H```$!``#X"@```0$``/P*```!`0````L`
+M``$!```$"P```0$```@+```!`0``#`L```$!```0"P```0$``!0+```!`0``
+M&`L```$!```<"P```0$``"`+```!`0``)`L```$!```H"P```0$``"P+```!
+M`0``,`L```$!```T"P```0$``#@+```!`0``/`L```$!``!`"P```0$``&`+
+M```!`0``9`L```$!``!H"P```0$``&P+```!`0``<`L```$!``!T"P```0$`
+M`'@+```!`0``?`L```$!``"`"P```0$``(0+```!`0``B`L```$!``","P``
+M`0$``)`+```!`0``E`L```$!``"8"P```0$``)P+```!`0``H`L```$!``"D
+M"P```0$``*@+```!`0``K`L```$!``"P"P```0$``+0+```!`0``N`L```$!
+M``"\"P```0$``,`+```!`0``Q`L```$!``#("P```0$``,P+```!`0``T`L`
+M``$!``#4"P```0$``-@+```!`0``W`L```$!``#@"P```0$``.0+```!`0``
+MZ`L```$!``#L"P```0$``/`+```!`0``]`L```$!``#X"P```0$``/P+```!
+M`0````P```$!```$#````0$```@,```!`0``#`P```$!```0#````0$``!0,
+M```!`0``&`P```$!```<#````0$``"`,```!`0``)`P```$!```H#````0$`
+M`"P,```!`0``,`P```$!```T#````0$``#@,```!`0``/`P```$!``!`#```
+M`0$``$0,```!`0``2`P```$!``!,#````0$``%`,```!`0``5`P```$!``!8
+M#````0$``%P,```!`0``8`P```$!``!D#````0$``&@,```!`0``;`P```$!
+M``!P#````0$``'0,```!`0``>`P```$!``!\#````0$``(`,```!`0``A`P`
+M``$!``"(#````0$``(P,```!`0``D`P```$!``"4#````0$``)@,```!`0``
+MG`P```$!``"@#````0$``*0,```!`0``J`P```$!``"L#````0$``+`,```!
+M`0``M`P```$!``"X#````0$``+P,```!`0``P`P```$!``#$#````0$``,@,
+M```!`0``S`P```$!``#0#````0$``-0,```!`0``V`P```$!``#<#````0$`
+M`.`,```!`0``Y`P```$!``#H#````0$``.P,```!`0``\`P```$!``#T#```
+M`0$``/@,```!`0``_`P```$!````#0```0$```0-```!`0``"`T```$!```,
+M#0```0$``!`-```!`0``%`T```$!```8#0```0$``!P-```!`0``(`T```$!
+M```D#0```0$``"@-```!`0``+`T```$!```P#0```0$``#0-```!`0``.`T`
+M``$!```\#0```0$``$`-```!`0``1`T```$!``!(#0```0$``$P-```!`0``
+M4`T```$!``!4#0```0$``%@-```!`0``7`T```$!``!@#0```0$``&0-```!
+M`0``:`T```$!``!L#0```0$``*P-```!`0``L`T```$!``"T#0```0$``+@-
+M```!`0``O`T```$!``#`#0```0$``,0-```!`0``R`T```$!``#,#0```0$`
+M`-`-```!`0``U`T```$!``#8#0```0$``-P-```!`0``X`T```$!``#D#0``
+M`0$``.@-```!`0``[`T```$!``#P#0```0$``/0-```!`0``^`T```$!``#\
+M#0```0$````.```!`0``!`X```$!```(#@```0$```P.```!`0``$`X```$!
+M```4#@```0$``!@.```!`0``'`X```$!```@#@```0$``"0.```!`0``*`X`
+M``$!```L#@```0$``#`.```!`0``-`X```$!```X#@```0$``#P.```!`0``
+M0`X```$!``!$#@```0$``$@.```!`0``3`X```$!``!0#@```0$``%0.```!
+M`0``6`X```$!``!<#@```0$``&`.```!`0``9`X```$!``!H#@```0$``&P.
+M```!`0``<`X```$!``!T#@```0$``'@.```!`0``?`X```$!``"`#@```0$`
+M`(0.```!`0``B`X```$!``",#@```0$``)`.```!`0``E`X```$!``"8#@``
+M`0$``)P.```!`0``H`X```$!``"D#@```0$``*@.```!`0``K`X```$!``"P
+M#@```0$``+0.```!`0``N`X```$!``"``````08``(P````!`0``D`````$!
+M``"4`````0$``)@````!`0``G`````$!``"@`````0$``*0````!`0``J```
+M``$!``"L`````0$``+`````!`0``M`````$!``"X`````0$``+P````!`0``
+MP`````&T``#$`````0$``,@````!`0``S`````$!``#0`````0$``-0````!
+M`0``V`````$!``#<`````0$``.`````!`0``Y`````$!``#H`````0$``.P`
+M```!`0``\`````$!``#T`````0$``/@````!`0``_`````$T```$`0```0$`
+M``@!```!`0``#`$```$!```0`0```0$``!0!```!`0``&`$```&%``"``0``
+M`08``(P!```!`0``D`$```$!``"4`0```0$``)@!```!`0``G`$```$!``"@
+M`0```0$``*0!```!`0``J`$```$!``"L`0```0$``+`!```!`0``M`$```$!
+M``"X`0```0$``+P!```!`0``P`$```''``#$`0```0$``,@!```!`0``S`$`
+M``$!``#0`0```0$``-0!```!`0``V`$```$!``#<`0```0$``.`!```!`0``
+MY`$```$!``#H`0```0$``.P!```!`0``\`$```$!``#T`0```0$``/@!```!
+M`0``_`$```&2`0`$`@```0$```@"```!`0``#`(```$!```0`@```0$``!0"
+M```!`0``&`(```'-``!\`@```0$``(`"```!`0``A`(```$!``"0`@```0$`
+M`)0"```!`0``F`(```$!``#$`@```0$``,P"```!`0``V`(```$!``#@`@``
+M`0$``.P"```!`0``]`(```$!`````P```0$```@#```!`0``%`,```$!```<
+M`P```0$``"@#```!`0``,`,```$!```\`P```0$``$0#```!`0``4`,```$!
+M``!4`P```0$``%@#```!`0``9`,```$!``!H`P```0$``&P#```!`0``>`,`
+M``$!``"``P```0$``(P#```!`0``E`,```$!``"@`P```0$``*0#```!`0``
+MJ`,```$!``"T`P```0$``+@#```!`0``O`,```$!``#(`P```0$``,P#```!
+M`0``T`,```$!``#<`P```0$``.`#```!`0``Y`,```$!``#P`P```0$``/0#
+M```!`0``^`,```$!```$!````0$```P$```!`0``&`0```$!```@!````0$`
+M`"P$```!`0``-`0```$!``!`!````0$``$@$```!`0``5`0```$!``!<!```
+M`0$``&@$```!`0``<`0```$!``!\!````0$``(0$```!`0``D`0```$!``"8
+M!````0$``*0$```!`0``K`0```$!``"X!````0$``,`$```!`0``S`0```$!
+M``#0!````0$``-0$```!`0``X`0```$!``#D!````0$``.@$```!`0``]`0`
+M``$!``#\!````0$```@%```!`0``$`4```$!```<!0```0$``"0%```!`0``
+M,`4```$!```X!0```0$``$0%```!`0``3`4```$!``!8!0```0$``%P%```!
+M`0``8`4```$!``!L!0```0$``'0%```!`0``@`4```$!``"$!0```0$``(@%
+M```!`0``E`4```$!``"<!0```0$``*@%```!`0``K`4```$!``"P!0```0$`
+M`+P%```!`0``Q`4```$!``#0!0```0$``-@%```!`0``Y`4```$!``#L!0``
+M`0$``/@%```!`0````8```$!```,!@```0$``!`&```!`0``%`8```$!```@
+M!@```0$``"0&```!`0``*`8```$!```T!@```0$``#P&```!`0``2`8```$!
+M``!0!@```0$``%P&```!`0``9`8```$!``!P!@```0$``'@&```!`0``A`8`
+M``$!``",!@```0$``)@&```!`0``H`8```$!``"L!@```0$``+0&```!`0``
+MP`8```$!``#(!@```0$``-0&```!`0``W`8```$!``#H!@```0$``/`&```!
+M`0``_`8```$!````!P```0$```0'```!`0``$`<```$!```8!P```0$``"0'
+M```!`0``+`<```$!```X!P```0$``$`'```!`0``3`<```$!``!4!P```0$`
+M`&`'```!`0``9`<```$!``!H!P```0$``'0'```!`0``>`<```$!``!\!P``
+$`0$`````
`
end
diff --git a/sys/dev/hptnr/ldm.h b/sys/dev/hptnr/ldm.h
index 9a0ee65..f5c6834 100644
--- a/sys/dev/hptnr/ldm.h
+++ b/sys/dev/hptnr/ldm.h
@@ -243,6 +243,7 @@ typedef struct hpt_raw_disk
#endif
__HPT_RAW_LBA real_capacity;
__HPT_RAW_LBA head_position;
+ HPT_U32 logical_sector_size;
HPT_U16 max_sectors_per_cmd;
HPT_U8 max_queue_depth;
diff --git a/sys/dev/hptnr/os_bsd.h b/sys/dev/hptnr/os_bsd.h
index b568eb1..5b41a76 100644
--- a/sys/dev/hptnr/os_bsd.h
+++ b/sys/dev/hptnr/os_bsd.h
@@ -191,7 +191,7 @@ VBUS_EXT, *PVBUS_EXT;
#define hpt_assert_vbus_locked(vbus_ext) mtx_assert(&(vbus_ext)->lock, MA_OWNED)
-#define HPT_OSM_TIMEOUT (20*hz) /* timeout value for OS commands */
+#define HPT_OSM_TIMEOUT (120*hz) /* timeout value for OS commands */
#define HPT_DO_IOCONTROL _IOW('H', 0, HPT_IOCTL_PARAM)
diff --git a/sys/dev/hwpmc/hwpmc_core.c b/sys/dev/hwpmc/hwpmc_core.c
index 67269af..f50dfb6c 100644
--- a/sys/dev/hwpmc/hwpmc_core.c
+++ b/sys/dev/hwpmc/hwpmc_core.c
@@ -410,7 +410,7 @@ iaf_start_pmc(int cpu, int ri)
iafc->pc_resync = 0;
iafc->pc_globalctrl |= (1ULL << (ri + IAF_OFFSET));
msr = rdmsr(IA_GLOBAL_CTRL) & ~IAF_GLOBAL_CTRL_MASK;
- wrmsr(IA_GLOBAL_CTRL, msr | (iafc->pc_globalctrl &
+ wrmsr(IA_GLOBAL_CTRL, msr | (iafc->pc_globalctrl &
IAF_GLOBAL_CTRL_MASK));
} while (iafc->pc_resync != 0);
@@ -487,7 +487,7 @@ iaf_write_pmc(int cpu, int ri, pmc_value_t v)
/* Turn off fixed counters */
msr = rdmsr(IAF_CTRL) & ~IAF_CTRL_MASK;
- wrmsr(IAF_CTRL, msr);
+ wrmsr(IAF_CTRL, msr);
wrmsr(IAF_CTR0 + ri, v & ((1ULL << core_iaf_width) - 1));
@@ -574,7 +574,8 @@ struct iap_event_descr {
#define IAP_F_HW (1 << 10) /* CPU: Haswell */
#define IAP_F_CAS (1 << 11) /* CPU: Atom Silvermont */
#define IAP_F_HWX (1 << 12) /* CPU: Haswell Xeon */
-#define IAP_F_FM (1 << 13) /* Fixed mask */
+#define IAP_F_BW (1 << 13) /* CPU: Broadwell */
+#define IAP_F_FM (1 << 14) /* Fixed mask */
#define IAP_F_ALLCPUSCORE2 \
(IAP_F_CC | IAP_F_CC2 | IAP_F_CC2E | IAP_F_CA)
@@ -704,7 +705,7 @@ static struct iap_event_descr iap_events[] = {
IAPDESCR(0CH_02H, 0x0C, 0x02, IAP_F_FM | IAP_F_CC2),
IAPDESCR(0CH_03H, 0x0C, 0x03, IAP_F_FM | IAP_F_CA),
- IAPDESCR(0DH_03H, 0x0D, 0x03, IAP_F_FM | IAP_F_SB | IAP_F_SBX | IAP_F_HW |
+ IAPDESCR(0DH_03H, 0x0D, 0x03, IAP_F_FM | IAP_F_SB | IAP_F_SBX | IAP_F_HW |
IAP_F_IB | IAP_F_IBX | IAP_F_HWX),
IAPDESCR(0DH_40H, 0x0D, 0x40, IAP_F_FM | IAP_F_SB | IAP_F_SBX),
@@ -1316,7 +1317,7 @@ static struct iap_event_descr iap_events[] = {
IAPDESCR(A6H_01H, 0xA6, 0x01, IAP_F_FM | IAP_F_I7 | IAP_F_WM),
IAPDESCR(A7H_01H, 0xA7, 0x01, IAP_F_FM | IAP_F_I7 | IAP_F_WM),
- IAPDESCR(A8H_01H, 0xA8, 0x01, IAP_F_FM | IAP_F_I7 | IAP_F_WM | IAP_F_IBX |
+ IAPDESCR(A8H_01H, 0xA8, 0x01, IAP_F_FM | IAP_F_I7 | IAP_F_WM | IAP_F_IBX |
IAP_F_IB |IAP_F_SB | IAP_F_SBX | IAP_F_HW | IAP_F_HWX),
IAPDESCR(AAH_01H, 0xAA, 0x01, IAP_F_FM | IAP_F_CC2),
@@ -1466,7 +1467,7 @@ static struct iap_event_descr iap_events[] = {
IAPDESCR(C3H_01H, 0xC3, 0x01, IAP_F_FM | IAP_F_CA | IAP_F_CC2 |
IAP_F_I7 | IAP_F_WM | IAP_F_CAS),
IAPDESCR(C3H_02H, 0xC3, 0x02, IAP_F_FM | IAP_F_I7 | IAP_F_WM |
- IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW |
+ IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW |
IAP_F_CAS | IAP_F_HWX),
IAPDESCR(C3H_04H, 0xC3, 0x04, IAP_F_FM | IAP_F_CA | IAP_F_CC2 |
IAP_F_I7 | IAP_F_WM | IAP_F_SB | IAP_F_IB | IAP_F_SBX |
@@ -1623,10 +1624,10 @@ static struct iap_event_descr iap_events[] = {
IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW | IAP_F_HWX),
IAPDESCR(D1H_04H, 0xD1, 0x04, IAP_F_FM | IAP_F_I7 | IAP_F_WM |
IAP_F_SB | IAP_F_IB | IAP_F_SBX | IAP_F_IBX | IAP_F_HW | IAP_F_HWX),
- IAPDESCR(D1H_08H, 0xD1, 0x08, IAP_F_FM | IAP_F_I7 | IAP_F_WM | IAP_F_IB |
+ IAPDESCR(D1H_08H, 0xD1, 0x08, IAP_F_FM | IAP_F_I7 | IAP_F_WM | IAP_F_IB |
IAP_F_IBX | IAP_F_HW | IAP_F_HWX),
IAPDESCR(D1H_10H, 0xD1, 0x10, IAP_F_HW | IAP_F_IB | IAP_F_IBX | IAP_F_HWX),
- IAPDESCR(D1H_20H, 0xD1, 0x20, IAP_F_FM | IAP_F_SBX | IAP_F_IBX | IAP_F_IB |
+ IAPDESCR(D1H_20H, 0xD1, 0x20, IAP_F_FM | IAP_F_SBX | IAP_F_IBX | IAP_F_IB |
IAP_F_HW | IAP_F_HWX),
IAPDESCR(D1H_40H, 0xD1, 0x40, IAP_F_FM | IAP_F_SB | IAP_F_IB |
IAP_F_SBX | IAP_F_IBX | IAP_F_HW | IAP_F_HWX),
@@ -1716,7 +1717,7 @@ static struct iap_event_descr iap_events[] = {
IAPDESCR(E6H_02H, 0xE6, 0x02, IAP_F_FM | IAP_F_I7 | IAP_F_WM),
IAPDESCR(E6H_08H, 0xE6, 0x08, IAP_F_CAS),
IAPDESCR(E6H_10H, 0xE6, 0x10, IAP_F_CAS),
- IAPDESCR(E6H_1FH, 0xE6, 0x1F, IAP_F_FM | IAP_F_IB |
+ IAPDESCR(E6H_1FH, 0xE6, 0x1F, IAP_F_FM | IAP_F_IB |
IAP_F_IBX | IAP_F_HW | IAP_F_HWX),
IAPDESCR(E7H_01H, 0xE7, 0x01, IAP_F_CAS),
@@ -1876,7 +1877,7 @@ iap_is_event_architectural(enum pmc_event pe, enum pmc_event *map)
return (EV_IS_NOTARCH);
}
- return (((core_architectural_events & (1 << ae)) == 0) ?
+ return (((core_architectural_events & (1 << ae)) == 0) ?
EV_IS_ARCH_NOTSUPP : EV_IS_ARCH_SUPP);
}
@@ -2074,6 +2075,7 @@ iap_allocate_pmc(int cpu, int ri, struct pmc *pm,
if (iap_event_corei7_ok_on_counter(ev, ri) == 0)
return (EINVAL);
break;
+ case PMC_CPU_INTEL_BROADWELL:
case PMC_CPU_INTEL_SANDYBRIDGE:
case PMC_CPU_INTEL_SANDYBRIDGE_XEON:
case PMC_CPU_INTEL_IVYBRIDGE:
@@ -2106,6 +2108,9 @@ iap_allocate_pmc(int cpu, int ri, struct pmc *pm,
case PMC_CPU_INTEL_ATOM_SILVERMONT:
cpuflag = IAP_F_CAS;
break;
+ case PMC_CPU_INTEL_BROADWELL:
+ cpuflag = IAP_F_BW;
+ break;
case PMC_CPU_INTEL_CORE:
cpuflag = IAP_F_CC;
break;
diff --git a/sys/dev/hwpmc/hwpmc_e500.c b/sys/dev/hwpmc/hwpmc_e500.c
new file mode 100644
index 0000000..d81b333
--- /dev/null
+++ b/sys/dev/hwpmc/hwpmc_e500.c
@@ -0,0 +1,660 @@
+/*-
+ * Copyright (c) 2015 Justin Hibbits
+ * Copyright (c) 2005, Joseph Koshy
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/pmc.h>
+#include <sys/pmckern.h>
+#include <sys/systm.h>
+
+#include <machine/pmc_mdep.h>
+#include <machine/cpu.h>
+
+#include <ddb/ddb.h>
+
+#include "hwpmc_powerpc.h"
+
+#define POWERPC_PMC_CAPS (PMC_CAP_INTERRUPT | PMC_CAP_USER | \
+ PMC_CAP_SYSTEM | PMC_CAP_EDGE | \
+ PMC_CAP_THRESHOLD | PMC_CAP_READ | \
+ PMC_CAP_WRITE | PMC_CAP_INVERT | \
+ PMC_CAP_QUALIFIER)
+
+#define E500_PMC_HAS_OVERFLOWED(x) (e500_pmcn_read(x) & (0x1 << 31))
+
+struct e500_event_code_map {
+ enum pmc_event pe_ev; /* enum value */
+ uint8_t pe_counter_mask; /* Which counter this can be counted in. */
+ uint8_t pe_code; /* numeric code */
+ uint8_t pe_cpu; /* e500 core (v1,v2,mc), mask */
+};
+
+#define E500_MAX_PMCS 4
+#define PMC_PPC_MASK0 0
+#define PMC_PPC_MASK1 1
+#define PMC_PPC_MASK2 2
+#define PMC_PPC_MASK3 3
+#define PMC_PPC_MASK_ALL 0x0f
+#define PMC_PPC_E500V1 1
+#define PMC_PPC_E500V2 2
+#define PMC_PPC_E500MC 4
+#define PMC_PPC_E500_ANY 7
+#define PMC_E500_EVENT(id, mask, number, core) \
+ [PMC_EV_E500_##id - PMC_EV_E500_FIRST] = \
+ { .pe_ev = PMC_EV_E500_##id, .pe_counter_mask = mask, \
+ .pe_code = number, .pe_cpu = core }
+#define PMC_E500MC_ONLY(id, number) \
+ PMC_E500_EVENT(id, PMC_PPC_MASK_ALL, number, PMC_PPC_E500MC)
+#define PMC_E500_COMMON(id, number) \
+ PMC_E500_EVENT(id, PMC_PPC_MASK_ALL, number, PMC_PPC_E500_ANY)
+
+static struct e500_event_code_map e500_event_codes[] = {
+ PMC_E500_COMMON(CYCLES, 1),
+ PMC_E500_COMMON(INSTR_COMPLETED, 2),
+ PMC_E500_COMMON(UOPS_COMPLETED, 3),
+ PMC_E500_COMMON(INSTR_FETCHED, 4),
+ PMC_E500_COMMON(UOPS_DECODED, 5),
+ PMC_E500_COMMON(PM_EVENT_TRANSITIONS, 6),
+ PMC_E500_COMMON(PM_EVENT_CYCLES, 7),
+ PMC_E500_COMMON(BRANCH_INSTRS_COMPLETED, 8),
+ PMC_E500_COMMON(LOAD_UOPS_COMPLETED, 9),
+ PMC_E500_COMMON(STORE_UOPS_COMPLETED, 10),
+ PMC_E500_COMMON(CQ_REDIRECTS, 11),
+ PMC_E500_COMMON(BRANCHES_FINISHED, 12),
+ PMC_E500_COMMON(TAKEN_BRANCHES_FINISHED, 13),
+ PMC_E500_COMMON(FINISHED_UNCOND_BRANCHES_MISS_BTB, 14),
+ PMC_E500_COMMON(BRANCH_MISPRED, 15),
+ PMC_E500_COMMON(BTB_BRANCH_MISPRED_FROM_DIRECTION, 16),
+ PMC_E500_COMMON(BTB_HITS_PSEUDO_HITS, 17),
+ PMC_E500_COMMON(CYCLES_DECODE_STALLED, 18),
+ PMC_E500_COMMON(CYCLES_ISSUE_STALLED, 19),
+ PMC_E500_COMMON(CYCLES_BRANCH_ISSUE_STALLED, 20),
+ PMC_E500_COMMON(CYCLES_SU1_SCHED_STALLED, 21),
+ PMC_E500_COMMON(CYCLES_SU2_SCHED_STALLED, 22),
+ PMC_E500_COMMON(CYCLES_MU_SCHED_STALLED, 23),
+ PMC_E500_COMMON(CYCLES_LRU_SCHED_STALLED, 24),
+ PMC_E500_COMMON(CYCLES_BU_SCHED_STALLED, 25),
+ PMC_E500_COMMON(TOTAL_TRANSLATED, 26),
+ PMC_E500_COMMON(LOADS_TRANSLATED, 27),
+ PMC_E500_COMMON(STORES_TRANSLATED, 28),
+ PMC_E500_COMMON(TOUCHES_TRANSLATED, 29),
+ PMC_E500_COMMON(CACHEOPS_TRANSLATED, 30),
+ PMC_E500_COMMON(CACHE_INHIBITED_ACCESS_TRANSLATED, 31),
+ PMC_E500_COMMON(GUARDED_LOADS_TRANSLATED, 32),
+ PMC_E500_COMMON(WRITE_THROUGH_STORES_TRANSLATED, 33),
+ PMC_E500_COMMON(MISALIGNED_LOAD_STORE_ACCESS_TRANSLATED, 34),
+ PMC_E500_COMMON(TOTAL_ALLOCATED_TO_DLFB, 35),
+ PMC_E500_COMMON(LOADS_TRANSLATED_ALLOCATED_TO_DLFB, 36),
+ PMC_E500_COMMON(STORES_COMPLETED_ALLOCATED_TO_DLFB, 37),
+ PMC_E500_COMMON(TOUCHES_TRANSLATED_ALLOCATED_TO_DLFB, 38),
+ PMC_E500_COMMON(STORES_COMPLETED, 39),
+ PMC_E500_COMMON(DATA_L1_CACHE_LOCKS, 40),
+ PMC_E500_COMMON(DATA_L1_CACHE_RELOADS, 41),
+ PMC_E500_COMMON(DATA_L1_CACHE_CASTOUTS, 42),
+ PMC_E500_COMMON(LOAD_MISS_DLFB_FULL, 43),
+ PMC_E500_COMMON(LOAD_MISS_LDQ_FULL, 44),
+ PMC_E500_COMMON(LOAD_GUARDED_MISS, 45),
+ PMC_E500_COMMON(STORE_TRANSLATE_WHEN_QUEUE_FULL, 46),
+ PMC_E500_COMMON(ADDRESS_COLLISION, 47),
+ PMC_E500_COMMON(DATA_MMU_MISS, 48),
+ PMC_E500_COMMON(DATA_MMU_BUSY, 49),
+ PMC_E500_COMMON(PART2_MISALIGNED_CACHE_ACCESS, 50),
+ PMC_E500_COMMON(LOAD_MISS_DLFB_FULL_CYCLES, 51),
+ PMC_E500_COMMON(LOAD_MISS_LDQ_FULL_CYCLES, 52),
+ PMC_E500_COMMON(LOAD_GUARDED_MISS_CYCLES, 53),
+ PMC_E500_COMMON(STORE_TRANSLATE_WHEN_QUEUE_FULL_CYCLES, 54),
+ PMC_E500_COMMON(ADDRESS_COLLISION_CYCLES, 55),
+ PMC_E500_COMMON(DATA_MMU_MISS_CYCLES, 56),
+ PMC_E500_COMMON(DATA_MMU_BUSY_CYCLES, 57),
+ PMC_E500_COMMON(PART2_MISALIGNED_CACHE_ACCESS_CYCLES, 58),
+ PMC_E500_COMMON(INSTR_L1_CACHE_LOCKS, 59),
+ PMC_E500_COMMON(INSTR_L1_CACHE_RELOADS, 60),
+ PMC_E500_COMMON(INSTR_L1_CACHE_FETCHES, 61),
+ PMC_E500_COMMON(INSTR_MMU_TLB4K_RELOADS, 62),
+ PMC_E500_COMMON(INSTR_MMU_VSP_RELOADS, 63),
+ PMC_E500_COMMON(DATA_MMU_TLB4K_RELOADS, 64),
+ PMC_E500_COMMON(DATA_MMU_VSP_RELOADS, 65),
+ PMC_E500_COMMON(L2MMU_MISSES, 66),
+ PMC_E500_COMMON(BIU_MASTER_REQUESTS, 67),
+ PMC_E500_COMMON(BIU_MASTER_INSTR_SIDE_REQUESTS, 68),
+ PMC_E500_COMMON(BIU_MASTER_DATA_SIDE_REQUESTS, 69),
+ PMC_E500_COMMON(BIU_MASTER_DATA_SIDE_CASTOUT_REQUESTS, 70),
+ PMC_E500_COMMON(BIU_MASTER_RETRIES, 71),
+ PMC_E500_COMMON(SNOOP_REQUESTS, 72),
+ PMC_E500_COMMON(SNOOP_HITS, 73),
+ PMC_E500_COMMON(SNOOP_PUSHES, 74),
+ PMC_E500_COMMON(SNOOP_RETRIES, 75),
+ PMC_E500_EVENT(DLFB_LOAD_MISS_CYCLES, PMC_PPC_MASK0|PMC_PPC_MASK1,
+ 76, PMC_PPC_E500_ANY),
+ PMC_E500_EVENT(ILFB_FETCH_MISS_CYCLES, PMC_PPC_MASK0|PMC_PPC_MASK1,
+ 77, PMC_PPC_E500_ANY),
+ PMC_E500_EVENT(EXT_INPU_INTR_LATENCY_CYCLES, PMC_PPC_MASK0|PMC_PPC_MASK1,
+ 78, PMC_PPC_E500_ANY),
+ PMC_E500_EVENT(CRIT_INPUT_INTR_LATENCY_CYCLES, PMC_PPC_MASK0|PMC_PPC_MASK1,
+ 79, PMC_PPC_E500_ANY),
+ PMC_E500_EVENT(EXT_INPUT_INTR_PENDING_LATENCY_CYCLES,
+ PMC_PPC_MASK0|PMC_PPC_MASK1, 80, PMC_PPC_E500_ANY),
+ PMC_E500_EVENT(CRIT_INPUT_INTR_PENDING_LATENCY_CYCLES,
+ PMC_PPC_MASK0|PMC_PPC_MASK1, 81, PMC_PPC_E500_ANY),
+ PMC_E500_COMMON(PMC0_OVERFLOW, 82),
+ PMC_E500_COMMON(PMC1_OVERFLOW, 83),
+ PMC_E500_COMMON(PMC2_OVERFLOW, 84),
+ PMC_E500_COMMON(PMC3_OVERFLOW, 85),
+ PMC_E500_COMMON(INTERRUPTS_TAKEN, 86),
+ PMC_E500_COMMON(EXT_INPUT_INTR_TAKEN, 87),
+ PMC_E500_COMMON(CRIT_INPUT_INTR_TAKEN, 88),
+ PMC_E500_COMMON(SYSCALL_TRAP_INTR, 89),
+ PMC_E500_EVENT(TLB_BIT_TRANSITIONS, PMC_PPC_MASK_ALL, 90,
+ PMC_PPC_E500V2 | PMC_PPC_E500MC),
+ PMC_E500MC_ONLY(L2_LINEFILL_BUFFER, 91),
+ PMC_E500MC_ONLY(LV2_VS, 92),
+ PMC_E500MC_ONLY(CASTOUTS_RELEASED, 93),
+ PMC_E500MC_ONLY(INTV_ALLOCATIONS, 94),
+ PMC_E500MC_ONLY(DLFB_RETRIES_TO_MBAR, 95),
+ PMC_E500MC_ONLY(STORE_RETRIES, 96),
+ PMC_E500MC_ONLY(STASH_L1_HITS, 97),
+ PMC_E500MC_ONLY(STASH_L2_HITS, 98),
+ PMC_E500MC_ONLY(STASH_BUSY_1, 99),
+ PMC_E500MC_ONLY(STASH_BUSY_2, 100),
+ PMC_E500MC_ONLY(STASH_BUSY_3, 101),
+ PMC_E500MC_ONLY(STASH_HITS, 102),
+ PMC_E500MC_ONLY(STASH_HIT_DLFB, 103),
+ PMC_E500MC_ONLY(STASH_REQUESTS, 106),
+ PMC_E500MC_ONLY(STASH_REQUESTS_L1, 107),
+ PMC_E500MC_ONLY(STASH_REQUESTS_L2, 108),
+ PMC_E500MC_ONLY(STALLS_NO_CAQ_OR_COB, 109),
+ PMC_E500MC_ONLY(L2_CACHE_ACCESSES, 110),
+ PMC_E500MC_ONLY(L2_HIT_CACHE_ACCESSES, 111),
+ PMC_E500MC_ONLY(L2_CACHE_DATA_ACCESSES, 112),
+ PMC_E500MC_ONLY(L2_CACHE_DATA_HITS, 113),
+ PMC_E500MC_ONLY(L2_CACHE_INSTR_ACCESSES, 114),
+ PMC_E500MC_ONLY(L2_CACHE_INSTR_HITS, 115),
+ PMC_E500MC_ONLY(L2_CACHE_ALLOCATIONS, 116),
+ PMC_E500MC_ONLY(L2_CACHE_DATA_ALLOCATIONS, 117),
+ PMC_E500MC_ONLY(L2_CACHE_DIRTY_DATA_ALLOCATIONS, 118),
+ PMC_E500MC_ONLY(L2_CACHE_INSTR_ALLOCATIONS, 119),
+ PMC_E500MC_ONLY(L2_CACHE_UPDATES, 120),
+ PMC_E500MC_ONLY(L2_CACHE_CLEAN_UPDATES, 121),
+ PMC_E500MC_ONLY(L2_CACHE_DIRTY_UPDATES, 122),
+ PMC_E500MC_ONLY(L2_CACHE_CLEAN_REDUNDANT_UPDATES, 123),
+ PMC_E500MC_ONLY(L2_CACHE_DIRTY_REDUNDANT_UPDATES, 124),
+ PMC_E500MC_ONLY(L2_CACHE_LOCKS, 125),
+ PMC_E500MC_ONLY(L2_CACHE_CASTOUTS, 126),
+ PMC_E500MC_ONLY(L2_CACHE_DATA_DIRTY_HITS, 127),
+ PMC_E500MC_ONLY(INSTR_LFB_WENT_HIGH_PRIORITY, 128),
+ PMC_E500MC_ONLY(SNOOP_THROTTLING_TURNED_ON, 129),
+ PMC_E500MC_ONLY(L2_CLEAN_LINE_INVALIDATIONS, 130),
+ PMC_E500MC_ONLY(L2_INCOHERENT_LINE_INVALIDATIONS, 131),
+ PMC_E500MC_ONLY(L2_COHERENT_LINE_INVALIDATIONS, 132),
+ PMC_E500MC_ONLY(COHERENT_LOOKUP_MISS_DUE_TO_VALID_BUT_INCOHERENT_MATCHES, 133),
+ PMC_E500MC_ONLY(IAC1S_DETECTED, 140),
+ PMC_E500MC_ONLY(IAC2S_DETECTED, 141),
+ PMC_E500MC_ONLY(DAC1S_DTECTED, 144),
+ PMC_E500MC_ONLY(DAC2S_DTECTED, 145),
+ PMC_E500MC_ONLY(DVT0_DETECTED, 148),
+ PMC_E500MC_ONLY(DVT1_DETECTED, 149),
+ PMC_E500MC_ONLY(DVT2_DETECTED, 150),
+ PMC_E500MC_ONLY(DVT3_DETECTED, 151),
+ PMC_E500MC_ONLY(DVT4_DETECTED, 152),
+ PMC_E500MC_ONLY(DVT5_DETECTED, 153),
+ PMC_E500MC_ONLY(DVT6_DETECTED, 154),
+ PMC_E500MC_ONLY(DVT7_DETECTED, 155),
+ PMC_E500MC_ONLY(CYCLES_COMPLETION_STALLED_NEXUS_FIFO_FULL, 156),
+ PMC_E500MC_ONLY(FPU_DOUBLE_PUMP, 160),
+ PMC_E500MC_ONLY(FPU_FINISH, 161),
+ PMC_E500MC_ONLY(FPU_DIVIDE_CYCLES, 162),
+ PMC_E500MC_ONLY(FPU_DENORM_INPUT_CYCLES, 163),
+ PMC_E500MC_ONLY(FPU_RESULT_STALL_CYCLES, 164),
+ PMC_E500MC_ONLY(FPU_FPSCR_FULL_STALL, 165),
+ PMC_E500MC_ONLY(FPU_PIPE_SYNC_STALLS, 166),
+ PMC_E500MC_ONLY(FPU_INPUT_DATA_STALLS, 167),
+ PMC_E500MC_ONLY(DECORATED_LOADS, 176),
+ PMC_E500MC_ONLY(DECORATED_STORES, 177),
+ PMC_E500MC_ONLY(LOAD_RETRIES, 178),
+ PMC_E500MC_ONLY(STWCX_SUCCESSES, 179),
+ PMC_E500MC_ONLY(STWCX_FAILURES, 180),
+};
+
+const size_t e500_event_codes_size =
+ sizeof(e500_event_codes) / sizeof(e500_event_codes[0]);
+
+static pmc_value_t
+e500_pmcn_read(unsigned int pmc)
+{
+ switch (pmc) {
+ case 0:
+ return mfpmr(PMR_PMC0);
+ break;
+ case 1:
+ return mfpmr(PMR_PMC1);
+ break;
+ case 2:
+ return mfpmr(PMR_PMC2);
+ break;
+ case 3:
+ return mfpmr(PMR_PMC3);
+ break;
+ default:
+ panic("Invalid PMC number: %d\n", pmc);
+ }
+}
+
+static void
+e500_pmcn_write(unsigned int pmc, uint32_t val)
+{
+ switch (pmc) {
+ case 0:
+ mtpmr(PMR_PMC0, val);
+ break;
+ case 1:
+ mtpmr(PMR_PMC1, val);
+ break;
+ case 2:
+ mtpmr(PMR_PMC2, val);
+ break;
+ case 3:
+ mtpmr(PMR_PMC3, val);
+ break;
+ default:
+ panic("Invalid PMC number: %d\n", pmc);
+ }
+}
+
+static int
+e500_read_pmc(int cpu, int ri, pmc_value_t *v)
+{
+ struct pmc *pm;
+ pmc_value_t tmp;
+
+ KASSERT(cpu >= 0 && cpu < pmc_cpu_max(),
+ ("[powerpc,%d] illegal CPU value %d", __LINE__, cpu));
+ KASSERT(ri >= 0 && ri < E500_MAX_PMCS,
+ ("[powerpc,%d] illegal row index %d", __LINE__, ri));
+
+ pm = powerpc_pcpu[cpu]->pc_ppcpmcs[ri].phw_pmc;
+ KASSERT(pm,
+ ("[core,%d] cpu %d ri %d pmc not configured", __LINE__, cpu,
+ ri));
+
+ tmp = e500_pmcn_read(ri);
+ PMCDBG(MDP,REA,2,"ppc-read id=%d -> %jd", ri, tmp);
+ if (PMC_IS_SAMPLING_MODE(PMC_TO_MODE(pm)))
+ *v = POWERPC_PERFCTR_VALUE_TO_RELOAD_COUNT(tmp);
+ else
+ *v = tmp;
+
+ return 0;
+}
+
+static int
+e500_write_pmc(int cpu, int ri, pmc_value_t v)
+{
+ struct pmc *pm;
+
+ KASSERT(cpu >= 0 && cpu < pmc_cpu_max(),
+ ("[powerpc,%d] illegal CPU value %d", __LINE__, cpu));
+ KASSERT(ri >= 0 && ri < E500_MAX_PMCS,
+ ("[powerpc,%d] illegal row-index %d", __LINE__, ri));
+
+ pm = powerpc_pcpu[cpu]->pc_ppcpmcs[ri].phw_pmc;
+
+ if (PMC_IS_SAMPLING_MODE(PMC_TO_MODE(pm)))
+ v = POWERPC_RELOAD_COUNT_TO_PERFCTR_VALUE(v);
+
+ PMCDBG(MDP,WRI,1,"powerpc-write cpu=%d ri=%d v=%jx", cpu, ri, v);
+
+ e500_pmcn_write(ri, v);
+
+ return 0;
+}
+
+static int
+e500_config_pmc(int cpu, int ri, struct pmc *pm)
+{
+ struct pmc_hw *phw;
+
+ PMCDBG(MDP,CFG,1, "cpu=%d ri=%d pm=%p", cpu, ri, pm);
+
+ KASSERT(cpu >= 0 && cpu < pmc_cpu_max(),
+ ("[powerpc,%d] illegal CPU value %d", __LINE__, cpu));
+ KASSERT(ri >= 0 && ri < E500_MAX_PMCS,
+ ("[powerpc,%d] illegal row-index %d", __LINE__, ri));
+
+ phw = &powerpc_pcpu[cpu]->pc_ppcpmcs[ri];
+
+ KASSERT(pm == NULL || phw->phw_pmc == NULL,
+ ("[powerpc,%d] pm=%p phw->pm=%p hwpmc not unconfigured",
+ __LINE__, pm, phw->phw_pmc));
+
+ phw->phw_pmc = pm;
+
+ return 0;
+}
+
+static int
+e500_start_pmc(int cpu, int ri)
+{
+ uint32_t config;
+ struct pmc *pm;
+ struct pmc_hw *phw;
+
+ phw = &powerpc_pcpu[cpu]->pc_ppcpmcs[ri];
+ pm = phw->phw_pmc;
+ config = pm->pm_md.pm_powerpc.pm_powerpc_evsel;
+
+ if (PMC_IS_SAMPLING_MODE(PMC_TO_MODE(pm)))
+ config |= PMLCax_CE;
+
+ /* Enable the PMC. */
+ switch (ri) {
+ case 0:
+ mtpmr(PMR_PMLCa0, config);
+ break;
+ case 1:
+ mtpmr(PMR_PMLCa1, config);
+ break;
+ case 2:
+ mtpmr(PMR_PMLCa2, config);
+ break;
+ case 3:
+ mtpmr(PMR_PMLCa3, config);
+ break;
+ default:
+ break;
+ }
+
+ return 0;
+}
+
+static int
+e500_stop_pmc(int cpu, int ri)
+{
+ struct pmc *pm;
+ struct pmc_hw *phw;
+ register_t pmc_pmlc;
+
+ phw = &powerpc_pcpu[cpu]->pc_ppcpmcs[ri];
+ pm = phw->phw_pmc;
+
+ /*
+ * Disable the PMCs.
+ */
+ switch (ri) {
+ case 0:
+ pmc_pmlc = mfpmr(PMR_PMLCa0);
+ pmc_pmlc |= PMLCax_FC;
+ mtpmr(PMR_PMLCa0, pmc_pmlc);
+ break;
+ case 1:
+ pmc_pmlc = mfpmr(PMR_PMLCa1);
+ pmc_pmlc |= PMLCax_FC;
+ mtpmr(PMR_PMLCa1, pmc_pmlc);
+ break;
+ case 2:
+ pmc_pmlc = mfpmr(PMR_PMLCa2);
+ pmc_pmlc |= PMLCax_FC;
+ mtpmr(PMR_PMLCa2, pmc_pmlc);
+ break;
+ case 3:
+ pmc_pmlc = mfpmr(PMR_PMLCa3);
+ pmc_pmlc |= PMLCax_FC;
+ mtpmr(PMR_PMLCa3, pmc_pmlc);
+ break;
+ default:
+ break;
+ }
+ return 0;
+}
+
+static int
+e500_pcpu_init(struct pmc_mdep *md, int cpu)
+{
+ int first_ri, i;
+ struct pmc_cpu *pc;
+ struct powerpc_cpu *pac;
+ struct pmc_hw *phw;
+
+ KASSERT(cpu >= 0 && cpu < pmc_cpu_max(),
+ ("[powerpc,%d] wrong cpu number %d", __LINE__, cpu));
+ PMCDBG(MDP,INI,1,"powerpc-init cpu=%d", cpu);
+
+ /* Freeze all counters. */
+ mtpmr(PMR_PMGC0, PMGC_FAC | PMGC_PMIE | PMGC_FCECE);
+
+ powerpc_pcpu[cpu] = pac = malloc(sizeof(struct powerpc_cpu), M_PMC,
+ M_WAITOK|M_ZERO);
+ pac->pc_ppcpmcs = malloc(sizeof(struct pmc_hw) * E500_MAX_PMCS,
+ M_PMC, M_WAITOK|M_ZERO);
+ pac->pc_class = PMC_CLASS_E500;
+ pc = pmc_pcpu[cpu];
+ first_ri = md->pmd_classdep[PMC_MDEP_CLASS_INDEX_POWERPC].pcd_ri;
+ KASSERT(pc != NULL, ("[powerpc,%d] NULL per-cpu pointer", __LINE__));
+
+ for (i = 0, phw = pac->pc_ppcpmcs; i < E500_MAX_PMCS; i++, phw++) {
+ phw->phw_state = PMC_PHW_FLAG_IS_ENABLED |
+ PMC_PHW_CPU_TO_STATE(cpu) | PMC_PHW_INDEX_TO_STATE(i);
+ phw->phw_pmc = NULL;
+ pc->pc_hwpmcs[i + first_ri] = phw;
+
+ /* Initialize the PMC to stopped */
+ e500_stop_pmc(cpu, i);
+ }
+ /* Unfreeze global register. */
+ mtpmr(PMR_PMGC0, PMGC_PMIE | PMGC_FCECE);
+
+ return 0;
+}
+
+static int
+e500_pcpu_fini(struct pmc_mdep *md, int cpu)
+{
+ uint32_t pmgc0 = mfpmr(PMR_PMGC0);
+
+ pmgc0 |= PMGC_FAC;
+ mtpmr(PMR_PMGC0, pmgc0);
+ mtmsr(mfmsr() & ~PSL_PMM);
+
+ free(powerpc_pcpu[cpu]->pc_ppcpmcs, M_PMC);
+ free(powerpc_pcpu[cpu], M_PMC);
+
+ return 0;
+}
+
+static int
+e500_allocate_pmc(int cpu, int ri, struct pmc *pm,
+ const struct pmc_op_pmcallocate *a)
+{
+ enum pmc_event pe;
+ uint32_t caps, config, counter;
+ struct e500_event_code_map *ev;
+ uint16_t vers;
+ uint8_t pe_cpu_mask;
+
+ KASSERT(cpu >= 0 && cpu < pmc_cpu_max(),
+ ("[powerpc,%d] illegal CPU value %d", __LINE__, cpu));
+ KASSERT(ri >= 0 && ri < E500_MAX_PMCS,
+ ("[powerpc,%d] illegal row index %d", __LINE__, ri));
+
+ caps = a->pm_caps;
+
+ pe = a->pm_ev;
+ config = PMLCax_FCS | PMLCax_FCU |
+ PMLCax_FCM1 | PMLCax_FCM1;
+ if (pe < PMC_EV_E500_FIRST || pe > PMC_EV_E500_LAST)
+ return (EINVAL);
+
+ ev = &e500_event_codes[pe-PMC_EV_E500_FIRST];
+ if (ev->pe_code == 0)
+ return (EINVAL);
+
+ vers = mfpvr() >> 16;
+ switch (vers) {
+ case FSL_E500v1:
+ pe_cpu_mask = ev->pe_code & PMC_PPC_E500V1;
+ break;
+ case FSL_E500v2:
+ pe_cpu_mask = ev->pe_code & PMC_PPC_E500V2;
+ break;
+ case FSL_E500mc:
+ pe_cpu_mask = ev->pe_code & PMC_PPC_E500MC;
+ break;
+ }
+ if (pe_cpu_mask == 0)
+ return (EINVAL);
+
+ config |= PMLCax_EVENT(ev->pe_code);
+ counter = ev->pe_counter_mask;
+ if ((counter & (1 << ri)) == 0)
+ return (EINVAL);
+
+ if (caps & PMC_CAP_SYSTEM)
+ config &= ~PMLCax_FCS;
+ if (caps & PMC_CAP_USER)
+ config &= ~PMLCax_FCU;
+ if ((caps & (PMC_CAP_USER | PMC_CAP_SYSTEM)) == 0)
+ config &= ~(PMLCax_FCS|PMLCax_FCU);
+
+ pm->pm_md.pm_powerpc.pm_powerpc_evsel = config;
+
+ PMCDBG(MDP,ALL,2,"powerpc-allocate ri=%d -> config=0x%x", ri, config);
+
+ return 0;
+}
+
+static int
+e500_release_pmc(int cpu, int ri, struct pmc *pmc)
+{
+ struct pmc_hw *phw;
+
+ KASSERT(cpu >= 0 && cpu < pmc_cpu_max(),
+ ("[powerpc,%d] illegal CPU value %d", __LINE__, cpu));
+ KASSERT(ri >= 0 && ri < E500_MAX_PMCS,
+ ("[powerpc,%d] illegal row-index %d", __LINE__, ri));
+
+ phw = &powerpc_pcpu[cpu]->pc_ppcpmcs[ri];
+ KASSERT(phw->phw_pmc == NULL,
+ ("[powerpc,%d] PHW pmc %p non-NULL", __LINE__, phw->phw_pmc));
+
+ return 0;
+}
+
+static int
+e500_intr(int cpu, struct trapframe *tf)
+{
+ int i, error, retval;
+ uint32_t config;
+ struct pmc *pm;
+ struct powerpc_cpu *pac;
+
+ KASSERT(cpu >= 0 && cpu < pmc_cpu_max(),
+ ("[powerpc,%d] out of range CPU %d", __LINE__, cpu));
+
+ PMCDBG(MDP,INT,1, "cpu=%d tf=%p um=%d", cpu, (void *) tf,
+ TRAPF_USERMODE(tf));
+
+ retval = 0;
+
+ pac = powerpc_pcpu[cpu];
+
+ config = mfpmr(PMR_PMGC0) & ~PMGC_FAC;
+
+ /*
+ * look for all PMCs that have interrupted:
+ * - look for a running, sampling PMC which has overflowed
+ * and which has a valid 'struct pmc' association
+ *
+ * If found, we call a helper to process the interrupt.
+ */
+
+ for (i = 0; i < E500_MAX_PMCS; i++) {
+ if ((pm = pac->pc_ppcpmcs[i].phw_pmc) == NULL ||
+ !PMC_IS_SAMPLING_MODE(PMC_TO_MODE(pm))) {
+ continue;
+ }
+
+ if (!E500_PMC_HAS_OVERFLOWED(i))
+ continue;
+
+ retval = 1; /* Found an interrupting PMC. */
+
+ if (pm->pm_state != PMC_STATE_RUNNING)
+ continue;
+
+ /* Stop the counter if logging fails. */
+ error = pmc_process_interrupt(cpu, PMC_HR, pm, tf,
+ TRAPF_USERMODE(tf));
+ if (error != 0)
+ e500_stop_pmc(cpu, i);
+
+ /* reload count. */
+ e500_write_pmc(cpu, i, pm->pm_sc.pm_reloadcount);
+ }
+
+ atomic_add_int(retval ? &pmc_stats.pm_intr_processed :
+ &pmc_stats.pm_intr_ignored, 1);
+
+ /* Re-enable PERF exceptions. */
+ if (retval)
+ mtpmr(PMR_PMGC0, config | PMGC_PMIE);
+
+ return (retval);
+}
+
+int
+pmc_e500_initialize(struct pmc_mdep *pmc_mdep)
+{
+ struct pmc_classdep *pcd;
+
+ pmc_mdep->pmd_cputype = PMC_CPU_PPC_E500;
+
+ pcd = &pmc_mdep->pmd_classdep[PMC_MDEP_CLASS_INDEX_POWERPC];
+ pcd->pcd_caps = POWERPC_PMC_CAPS;
+ pcd->pcd_class = PMC_CLASS_E500;
+ pcd->pcd_num = E500_MAX_PMCS;
+ pcd->pcd_ri = pmc_mdep->pmd_npmc;
+ pcd->pcd_width = 32;
+
+ pcd->pcd_allocate_pmc = e500_allocate_pmc;
+ pcd->pcd_config_pmc = e500_config_pmc;
+ pcd->pcd_pcpu_fini = e500_pcpu_fini;
+ pcd->pcd_pcpu_init = e500_pcpu_init;
+ pcd->pcd_describe = powerpc_describe;
+ pcd->pcd_get_config = powerpc_get_config;
+ pcd->pcd_read_pmc = e500_read_pmc;
+ pcd->pcd_release_pmc = e500_release_pmc;
+ pcd->pcd_start_pmc = e500_start_pmc;
+ pcd->pcd_stop_pmc = e500_stop_pmc;
+ pcd->pcd_write_pmc = e500_write_pmc;
+
+ pmc_mdep->pmd_npmc += E500_MAX_PMCS;
+ pmc_mdep->pmd_intr = e500_intr;
+
+ return (0);
+}
diff --git a/sys/dev/hwpmc/hwpmc_intel.c b/sys/dev/hwpmc/hwpmc_intel.c
index 05880c9..486dfa0 100644
--- a/sys/dev/hwpmc/hwpmc_intel.c
+++ b/sys/dev/hwpmc/hwpmc_intel.c
@@ -179,6 +179,10 @@ pmc_intel_initialize(void)
cputype = PMC_CPU_INTEL_IVYBRIDGE_XEON;
nclasses = 3;
break;
+ case 0x3D:
+ cputype = PMC_CPU_INTEL_BROADWELL;
+ nclasses = 3;
+ break;
case 0x3F: /* Per Intel document 325462-045US 09/2014. */
case 0x46: /* Per Intel document 325462-045US 09/2014. */
/* Should 46 be XEON. probably its own? */
@@ -227,6 +231,7 @@ pmc_intel_initialize(void)
*/
case PMC_CPU_INTEL_ATOM:
case PMC_CPU_INTEL_ATOM_SILVERMONT:
+ case PMC_CPU_INTEL_BROADWELL:
case PMC_CPU_INTEL_CORE:
case PMC_CPU_INTEL_CORE2:
case PMC_CPU_INTEL_CORE2EXTREME:
@@ -295,6 +300,7 @@ pmc_intel_initialize(void)
case PMC_CPU_INTEL_HASWELL:
case PMC_CPU_INTEL_SANDYBRIDGE:
case PMC_CPU_INTEL_WESTMERE:
+ case PMC_CPU_INTEL_BROADWELL:
error = pmc_uncore_initialize(pmc_mdep, ncpus);
break;
default:
@@ -319,6 +325,7 @@ pmc_intel_finalize(struct pmc_mdep *md)
#if defined(__i386__) || defined(__amd64__)
case PMC_CPU_INTEL_ATOM:
case PMC_CPU_INTEL_ATOM_SILVERMONT:
+ case PMC_CPU_INTEL_BROADWELL:
case PMC_CPU_INTEL_CORE:
case PMC_CPU_INTEL_CORE2:
case PMC_CPU_INTEL_CORE2EXTREME:
@@ -360,6 +367,7 @@ pmc_intel_finalize(struct pmc_mdep *md)
*/
#if defined(__i386__) || defined(__amd64__)
switch (md->pmd_cputype) {
+ case PMC_CPU_INTEL_BROADWELL:
case PMC_CPU_INTEL_COREI7:
case PMC_CPU_INTEL_HASWELL:
case PMC_CPU_INTEL_SANDYBRIDGE:
diff --git a/sys/dev/hwpmc/hwpmc_mips74k.c b/sys/dev/hwpmc/hwpmc_mips74k.c
new file mode 100644
index 0000000..3a5ff33
--- /dev/null
+++ b/sys/dev/hwpmc/hwpmc_mips74k.c
@@ -0,0 +1,261 @@
+/*-
+ * Copyright (c) 2010 George V. Neville-Neil <gnn@freebsd.org>
+ * Copyright (c) 2015 Adrian Chadd <adrian@freebsd.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/pmc.h>
+#include <sys/pmckern.h>
+
+#include <machine/cpu.h>
+#include <machine/cpufunc.h>
+#include <machine/pmc_mdep.h>
+
+#define MIPS74K_PMC_CAPS (PMC_CAP_INTERRUPT | PMC_CAP_USER | \
+ PMC_CAP_SYSTEM | PMC_CAP_EDGE | \
+ PMC_CAP_THRESHOLD | PMC_CAP_READ | \
+ PMC_CAP_WRITE | PMC_CAP_INVERT | \
+ PMC_CAP_QUALIFIER)
+
+/* 0x1 - Exception_enable */
+#define MIPS74K_PMC_INTERRUPT_ENABLE 0x10 /* Enable interrupts */
+#define MIPS74K_PMC_USER_ENABLE 0x08 /* Count in USER mode */
+#define MIPS74K_PMC_SUPER_ENABLE 0x04 /* Count in SUPERVISOR mode */
+#define MIPS74K_PMC_KERNEL_ENABLE 0x02 /* Count in KERNEL mode */
+#define MIPS74K_PMC_ENABLE (MIPS74K_PMC_USER_ENABLE | \
+ MIPS74K_PMC_SUPER_ENABLE | \
+ MIPS74K_PMC_KERNEL_ENABLE)
+
+#define MIPS74K_PMC_SELECT 5 /* Which bit position the event starts at. */
+
+const struct mips_event_code_map mips_event_codes[] = {
+ { PMC_EV_MIPS74K_CYCLES, MIPS_CTR_ALL, 0 },
+ { PMC_EV_MIPS74K_INSTR_EXECUTED, MIPS_CTR_ALL, 1 },
+ { PMC_EV_MIPS74K_PREDICTED_JR_31, MIPS_CTR_0, 2 },
+ { PMC_EV_MIPS74K_JR_31_MISPREDICTIONS, MIPS_CTR_1, 2 },
+ { PMC_EV_MIPS74K_REDIRECT_STALLS, MIPS_CTR_0, 3 },
+ { PMC_EV_MIPS74K_JR_31_NO_PREDICTIONS, MIPS_CTR_1, 3 },
+ { PMC_EV_MIPS74K_ITLB_ACCESSES, MIPS_CTR_0, 4 },
+ { PMC_EV_MIPS74K_ITLB_MISSES, MIPS_CTR_1, 4 },
+ { PMC_EV_MIPS74K_JTLB_INSN_MISSES, MIPS_CTR_1, 5 },
+ { PMC_EV_MIPS74K_ICACHE_ACCESSES, MIPS_CTR_0, 6 },
+ { PMC_EV_MIPS74K_ICACHE_MISSES, MIPS_CTR_1, 6 },
+ { PMC_EV_MIPS74K_ICACHE_MISS_STALLS, MIPS_CTR_0, 7 },
+ { PMC_EV_MIPS74K_UNCACHED_IFETCH_STALLS, MIPS_CTR_0, 8 },
+ { PMC_EV_MIPS74K_PDTRACE_BACK_STALLS, MIPS_CTR_1, 8 },
+ { PMC_EV_MIPS74K_IFU_REPLAYS, MIPS_CTR_0, 9 },
+ { PMC_EV_MIPS74K_KILLED_FETCH_SLOTS, MIPS_CTR_1, 9 },
+ { PMC_EV_MIPS74K_IFU_IDU_MISS_PRED_UPSTREAM_CYCLES, MIPS_CTR_0, 11 },
+ { PMC_EV_MIPS74K_IFU_IDU_NO_FETCH_CYCLES, MIPS_CTR_1, 11 },
+ { PMC_EV_MIPS74K_IFU_IDU_CLOGED_DOWNSTREAM_CYCLES, MIPS_CTR_0, 12 },
+ { PMC_EV_MIPS74K_DDQ0_FULL_DR_STALLS, MIPS_CTR_0, 13 },
+ { PMC_EV_MIPS74K_DDQ1_FULL_DR_STALLS, MIPS_CTR_1, 13 },
+ { PMC_EV_MIPS74K_ALCB_FULL_DR_STALLS, MIPS_CTR_0, 14 },
+ { PMC_EV_MIPS74K_AGCB_FULL_DR_STALLS, MIPS_CTR_1, 14 },
+ { PMC_EV_MIPS74K_CLDQ_FULL_DR_STALLS, MIPS_CTR_0, 15 },
+ { PMC_EV_MIPS74K_IODQ_FULL_DR_STALLS, MIPS_CTR_1, 15 },
+ { PMC_EV_MIPS74K_ALU_EMPTY_CYCLES, MIPS_CTR_0, 16 },
+ { PMC_EV_MIPS74K_AGEN_EMPTY_CYCLES, MIPS_CTR_1, 16 },
+ { PMC_EV_MIPS74K_ALU_OPERANDS_NOT_READY_CYCLES, MIPS_CTR_0, 17 },
+ { PMC_EV_MIPS74K_AGEN_OPERANDS_NOT_READY_CYCLES, MIPS_CTR_1, 17 },
+ { PMC_EV_MIPS74K_ALU_NO_ISSUES_CYCLES, MIPS_CTR_0, 18 },
+ { PMC_EV_MIPS74K_AGEN_NO_ISSUES_CYCLES, MIPS_CTR_1, 18 },
+ { PMC_EV_MIPS74K_ALU_BUBBLE_CYCLES, MIPS_CTR_0, 19 },
+ { PMC_EV_MIPS74K_AGEN_BUBBLE_CYCLES, MIPS_CTR_1, 19 },
+ { PMC_EV_MIPS74K_SINGLE_ISSUE_CYCLES, MIPS_CTR_0, 20 },
+ { PMC_EV_MIPS74K_DUAL_ISSUE_CYCLES, MIPS_CTR_1, 20 },
+ { PMC_EV_MIPS74K_OOO_ALU_ISSUE_CYCLES, MIPS_CTR_0, 21 },
+ { PMC_EV_MIPS74K_OOO_AGEN_ISSUE_CYCLES, MIPS_CTR_1, 21 },
+ { PMC_EV_MIPS74K_JALR_JALR_HB_INSNS, MIPS_CTR_0, 22 },
+ { PMC_EV_MIPS74K_DCACHE_LINE_REFILL_REQUESTS, MIPS_CTR_1, 22 },
+ { PMC_EV_MIPS74K_DCACHE_LOAD_ACCESSES, MIPS_CTR_0, 23 },
+ { PMC_EV_MIPS74K_DCACHE_ACCESSES, MIPS_CTR_1, 23 },
+ { PMC_EV_MIPS74K_DCACHE_WRITEBACKS, MIPS_CTR_0, 24 },
+ { PMC_EV_MIPS74K_DCACHE_MISSES, MIPS_CTR_1, 24 },
+ { PMC_EV_MIPS74K_JTLB_DATA_ACCESSES, MIPS_CTR_0, 25 },
+ { PMC_EV_MIPS74K_JTLB_DATA_MISSES, MIPS_CTR_1, 25 },
+ { PMC_EV_MIPS74K_LOAD_STORE_REPLAYS, MIPS_CTR_0, 26 },
+ { PMC_EV_MIPS74K_VA_TRANSALTION_CORNER_CASES, MIPS_CTR_1, 26 },
+ { PMC_EV_MIPS74K_LOAD_STORE_BLOCKED_CYCLES, MIPS_CTR_0, 27 },
+ { PMC_EV_MIPS74K_LOAD_STORE_NO_FILL_REQUESTS, MIPS_CTR_1, 27 },
+ { PMC_EV_MIPS74K_L2_CACHE_WRITEBACKS, MIPS_CTR_0, 28 },
+ { PMC_EV_MIPS74K_L2_CACHE_ACCESSES, MIPS_CTR_1, 28 },
+ { PMC_EV_MIPS74K_L2_CACHE_MISSES, MIPS_CTR_0, 29 },
+ { PMC_EV_MIPS74K_L2_CACHE_MISS_CYCLES, MIPS_CTR_1, 29 },
+ { PMC_EV_MIPS74K_FSB_FULL_STALLS, MIPS_CTR_0, 30 },
+ { PMC_EV_MIPS74K_FSB_OVER_50_FULL, MIPS_CTR_1, 30 },
+ { PMC_EV_MIPS74K_LDQ_FULL_STALLS, MIPS_CTR_0, 31 },
+ { PMC_EV_MIPS74K_LDQ_OVER_50_FULL, MIPS_CTR_1, 31 },
+ { PMC_EV_MIPS74K_WBB_FULL_STALLS, MIPS_CTR_0, 32 },
+ { PMC_EV_MIPS74K_WBB_OVER_50_FULL, MIPS_CTR_1, 32 },
+ { PMC_EV_MIPS74K_LOAD_MISS_CONSUMER_REPLAYS, MIPS_CTR_0, 35 },
+ { PMC_EV_MIPS74K_CP1_CP2_LOAD_INSNS, MIPS_CTR_1, 35 },
+ { PMC_EV_MIPS74K_JR_NON_31_INSNS, MIPS_CTR_0, 36 },
+ { PMC_EV_MIPS74K_MISPREDICTED_JR_31_INSNS, MIPS_CTR_1, 36 },
+ { PMC_EV_MIPS74K_BRANCH_INSNS, MIPS_CTR_0, 37 },
+ { PMC_EV_MIPS74K_CP1_CP2_COND_BRANCH_INSNS, MIPS_CTR_1, 37 },
+ { PMC_EV_MIPS74K_BRANCH_LIKELY_INSNS, MIPS_CTR_0, 38 },
+ { PMC_EV_MIPS74K_MISPREDICTED_BRANCH_LIKELY_INSNS, MIPS_CTR_1, 38 },
+ { PMC_EV_MIPS74K_COND_BRANCH_INSNS, MIPS_CTR_0, 39 },
+ { PMC_EV_MIPS74K_MISPREDICTED_BRANCH_INSNS, MIPS_CTR_1, 39 },
+ { PMC_EV_MIPS74K_INTEGER_INSNS, MIPS_CTR_0, 40 },
+ { PMC_EV_MIPS74K_FPU_INSNS, MIPS_CTR_1, 40 },
+ { PMC_EV_MIPS74K_LOAD_INSNS, MIPS_CTR_0, 41 },
+ { PMC_EV_MIPS74K_STORE_INSNS, MIPS_CTR_1, 41 },
+ { PMC_EV_MIPS74K_J_JAL_INSNS, MIPS_CTR_0, 42 },
+ { PMC_EV_MIPS74K_MIPS16_INSNS, MIPS_CTR_1, 42 },
+ { PMC_EV_MIPS74K_NOP_INSNS, MIPS_CTR_0, 43 },
+ { PMC_EV_MIPS74K_NT_MUL_DIV_INSNS, MIPS_CTR_1, 43 },
+ { PMC_EV_MIPS74K_DSP_INSNS, MIPS_CTR_0, 44 },
+ { PMC_EV_MIPS74K_ALU_DSP_SATURATION_INSNS, MIPS_CTR_1, 44 },
+ { PMC_EV_MIPS74K_DSP_BRANCH_INSNS, MIPS_CTR_0, 45 },
+ { PMC_EV_MIPS74K_MDU_DSP_SATURATION_INSNS, MIPS_CTR_1, 45 },
+ { PMC_EV_MIPS74K_UNCACHED_LOAD_INSNS, MIPS_CTR_0, 46 },
+ { PMC_EV_MIPS74K_UNCACHED_STORE_INSNS, MIPS_CTR_1, 46 },
+ { PMC_EV_MIPS74K_EJTAG_INSN_TRIGGERS, MIPS_CTR_0, 49 },
+ { PMC_EV_MIPS74K_CP1_BRANCH_MISPREDICTIONS, MIPS_CTR_0, 50 },
+ { PMC_EV_MIPS74K_SC_INSNS, MIPS_CTR_0, 51 },
+ { PMC_EV_MIPS74K_FAILED_SC_INSNS, MIPS_CTR_1, 51 },
+ { PMC_EV_MIPS74K_PREFETCH_INSNS, MIPS_CTR_0, 52 },
+ { PMC_EV_MIPS74K_CACHE_HIT_PREFETCH_INSNS, MIPS_CTR_1, 52 },
+ { PMC_EV_MIPS74K_NO_INSN_CYCLES, MIPS_CTR_0, 53 },
+ { PMC_EV_MIPS74K_LOAD_MISS_INSNS, MIPS_CTR_1, 53 },
+ { PMC_EV_MIPS74K_ONE_INSN_CYCLES, MIPS_CTR_0, 54 },
+ { PMC_EV_MIPS74K_TWO_INSNS_CYCLES, MIPS_CTR_1, 54 },
+ { PMC_EV_MIPS74K_GFIFO_BLOCKED_CYCLES, MIPS_CTR_0, 55 },
+ { PMC_EV_MIPS74K_CP1_CP2_STORE_INSNS, MIPS_CTR_1, 55 },
+ { PMC_EV_MIPS74K_MISPREDICTION_STALLS, MIPS_CTR_0, 56 },
+ { PMC_EV_MIPS74K_MISPREDICTED_BRANCH_INSNS_CYCLES, MIPS_CTR_0, 57 },
+ { PMC_EV_MIPS74K_EXCEPTIONS_TAKEN, MIPS_CTR_0, 58 },
+ { PMC_EV_MIPS74K_GRADUATION_REPLAYS, MIPS_CTR_1, 58 },
+ { PMC_EV_MIPS74K_COREEXTEND_EVENTS, MIPS_CTR_0, 59 },
+ { PMC_EV_MIPS74K_ISPRAM_EVENTS, MIPS_CTR_0, 62 },
+ { PMC_EV_MIPS74K_DSPRAM_EVENTS, MIPS_CTR_1, 62 },
+ { PMC_EV_MIPS74K_L2_CACHE_SINGLE_BIT_ERRORS, MIPS_CTR_0, 63 },
+ { PMC_EV_MIPS74K_SYSTEM_EVENT_0, MIPS_CTR_0, 64 },
+ { PMC_EV_MIPS74K_SYSTEM_EVENT_1, MIPS_CTR_1, 64 },
+ { PMC_EV_MIPS74K_SYSTEM_EVENT_2, MIPS_CTR_0, 65 },
+ { PMC_EV_MIPS74K_SYSTEM_EVENT_3, MIPS_CTR_1, 65 },
+ { PMC_EV_MIPS74K_SYSTEM_EVENT_4, MIPS_CTR_0, 66 },
+ { PMC_EV_MIPS74K_SYSTEM_EVENT_5, MIPS_CTR_1, 66 },
+ { PMC_EV_MIPS74K_SYSTEM_EVENT_6, MIPS_CTR_0, 67 },
+ { PMC_EV_MIPS74K_SYSTEM_EVENT_7, MIPS_CTR_1, 67 },
+ { PMC_EV_MIPS74K_OCP_ALL_REQUESTS, MIPS_CTR_0, 68 },
+ { PMC_EV_MIPS74K_OCP_ALL_CACHEABLE_REQUESTS, MIPS_CTR_1, 68 },
+ { PMC_EV_MIPS74K_OCP_READ_REQUESTS, MIPS_CTR_0, 69 },
+ { PMC_EV_MIPS74K_OCP_READ_CACHEABLE_REQUESTS, MIPS_CTR_1, 69 },
+ { PMC_EV_MIPS74K_OCP_WRITE_REQUESTS, MIPS_CTR_0, 70 },
+ { PMC_EV_MIPS74K_OCP_WRITE_CACHEABLE_REQUESTS, MIPS_CTR_1, 70 },
+ { PMC_EV_MIPS74K_FSB_LESS_25_FULL, MIPS_CTR_0, 74 },
+ { PMC_EV_MIPS74K_FSB_25_50_FULL, MIPS_CTR_1, 74 },
+ { PMC_EV_MIPS74K_LDQ_LESS_25_FULL, MIPS_CTR_0, 75 },
+ { PMC_EV_MIPS74K_LDQ_25_50_FULL, MIPS_CTR_1, 75 },
+ { PMC_EV_MIPS74K_WBB_LESS_25_FULL, MIPS_CTR_0, 76 },
+ { PMC_EV_MIPS74K_WBB_25_50_FULL, MIPS_CTR_1, 76 },
+};
+
+const int mips_event_codes_size =
+ sizeof(mips_event_codes) / sizeof(mips_event_codes[0]);
+
+struct mips_pmc_spec mips_pmc_spec = {
+ .ps_cpuclass = PMC_CLASS_MIPS74K,
+ .ps_cputype = PMC_CPU_MIPS_74K,
+ .ps_capabilities = MIPS74K_PMC_CAPS,
+ .ps_counter_width = 32
+};
+
+/*
+ * Performance Count Register N
+ */
+uint64_t
+mips_pmcn_read(unsigned int pmc)
+{
+ uint32_t reg = 0;
+
+ KASSERT(pmc < mips_npmcs, ("[mips74k,%d] illegal PMC number %d",
+ __LINE__, pmc));
+
+ /* The counter value is the next value after the control register. */
+ switch (pmc) {
+ case 0:
+ reg = mips_rd_perfcnt1();
+ break;
+ case 1:
+ reg = mips_rd_perfcnt3();
+ break;
+ default:
+ return 0;
+ }
+ return (reg);
+}
+
+uint64_t
+mips_pmcn_write(unsigned int pmc, uint64_t reg)
+{
+
+ KASSERT(pmc < mips_npmcs, ("[mips74k,%d] illegal PMC number %d",
+ __LINE__, pmc));
+
+ switch (pmc) {
+ case 0:
+ mips_wr_perfcnt1(reg);
+ break;
+ case 1:
+ mips_wr_perfcnt3(reg);
+ break;
+ default:
+ return 0;
+ }
+ return (reg);
+}
+
+uint32_t
+mips_get_perfctl(int cpu, int ri, uint32_t event, uint32_t caps)
+{
+ uint32_t config;
+
+ config = event;
+
+ config <<= MIPS74K_PMC_SELECT;
+
+ if (caps & PMC_CAP_SYSTEM)
+ config |= (MIPS74K_PMC_SUPER_ENABLE |
+ MIPS74K_PMC_KERNEL_ENABLE);
+ if (caps & PMC_CAP_USER)
+ config |= MIPS74K_PMC_USER_ENABLE;
+ if ((caps & (PMC_CAP_USER | PMC_CAP_SYSTEM)) == 0)
+ config |= MIPS74K_PMC_ENABLE;
+ if (caps & PMC_CAP_INTERRUPT)
+ config |= MIPS74K_PMC_INTERRUPT_ENABLE;
+
+ PMCDBG(MDP,ALL,2,"mips74k-get_perfctl ri=%d -> config=0x%x", ri, config);
+
+ return (config);
+}
diff --git a/sys/dev/hwpmc/hwpmc_mpc7xxx.c b/sys/dev/hwpmc/hwpmc_mpc7xxx.c
index 171523b..eaa440e 100644
--- a/sys/dev/hwpmc/hwpmc_mpc7xxx.c
+++ b/sys/dev/hwpmc/hwpmc_mpc7xxx.c
@@ -567,7 +567,7 @@ mpc7xxx_pcpu_init(struct pmc_mdep *md, int cpu)
M_PMC, M_WAITOK|M_ZERO);
pac->pc_class = PMC_CLASS_PPC7450;
pc = pmc_pcpu[cpu];
- first_ri = md->pmd_classdep[PMC_MDEP_CLASS_INDEX_PPC7450].pcd_ri;
+ first_ri = md->pmd_classdep[PMC_MDEP_CLASS_INDEX_POWERPC].pcd_ri;
KASSERT(pc != NULL, ("[powerpc,%d] NULL per-cpu pointer", __LINE__));
for (i = 0, phw = pac->pc_ppcpmcs; i < MPC7XXX_MAX_PMCS; i++, phw++) {
@@ -729,7 +729,7 @@ pmc_mpc7xxx_initialize(struct pmc_mdep *pmc_mdep)
pmc_mdep->pmd_cputype = PMC_CPU_PPC_7450;
- pcd = &pmc_mdep->pmd_classdep[PMC_MDEP_CLASS_INDEX_PPC7450];
+ pcd = &pmc_mdep->pmd_classdep[PMC_MDEP_CLASS_INDEX_POWERPC];
pcd->pcd_caps = POWERPC_PMC_CAPS;
pcd->pcd_class = PMC_CLASS_PPC7450;
pcd->pcd_num = MPC7XXX_MAX_PMCS;
diff --git a/sys/dev/hwpmc/hwpmc_powerpc.c b/sys/dev/hwpmc/hwpmc_powerpc.c
index ad251d3..889a5d0 100644
--- a/sys/dev/hwpmc/hwpmc_powerpc.c
+++ b/sys/dev/hwpmc/hwpmc_powerpc.c
@@ -175,6 +175,11 @@ pmc_md_initialize()
case IBM970MP:
error = pmc_ppc970_initialize(pmc_mdep);
break;
+ case FSL_E500v1:
+ case FSL_E500v2:
+ case FSL_E500mc:
+ error = pmc_e500_initialize(pmc_mdep);
+ break;
default:
error = -1;
break;
diff --git a/sys/dev/hwpmc/hwpmc_powerpc.h b/sys/dev/hwpmc/hwpmc_powerpc.h
index 8f0b8ce..66eaa21 100644
--- a/sys/dev/hwpmc/hwpmc_powerpc.h
+++ b/sys/dev/hwpmc/hwpmc_powerpc.h
@@ -51,6 +51,7 @@ struct powerpc_cpu {
extern struct powerpc_cpu **powerpc_pcpu;
+extern int pmc_e500_initialize(struct pmc_mdep *pmc_mdep);
extern int pmc_mpc7xxx_initialize(struct pmc_mdep *pmc_mdep);
extern int pmc_ppc970_initialize(struct pmc_mdep *pmc_mdep);
diff --git a/sys/dev/hwpmc/hwpmc_ppc970.c b/sys/dev/hwpmc/hwpmc_ppc970.c
index c6e8f4c..f477be3 100644
--- a/sys/dev/hwpmc/hwpmc_ppc970.c
+++ b/sys/dev/hwpmc/hwpmc_ppc970.c
@@ -555,7 +555,7 @@ ppc970_pcpu_init(struct pmc_mdep *md, int cpu)
pac->pc_class = PMC_CLASS_PPC970;
pc = pmc_pcpu[cpu];
- first_ri = md->pmd_classdep[PMC_MDEP_CLASS_INDEX_PPC970].pcd_ri;
+ first_ri = md->pmd_classdep[PMC_MDEP_CLASS_INDEX_POWERPC].pcd_ri;
KASSERT(pc != NULL, ("[powerpc,%d] NULL per-cpu pointer", __LINE__));
for (i = 0, phw = pac->pc_ppcpmcs; i < PPC970_MAX_PMCS; i++, phw++) {
@@ -661,7 +661,7 @@ pmc_ppc970_initialize(struct pmc_mdep *pmc_mdep)
pmc_mdep->pmd_cputype = PMC_CPU_PPC_970;
- pcd = &pmc_mdep->pmd_classdep[PMC_MDEP_CLASS_INDEX_PPC970];
+ pcd = &pmc_mdep->pmd_classdep[PMC_MDEP_CLASS_INDEX_POWERPC];
pcd->pcd_caps = POWERPC_PMC_CAPS;
pcd->pcd_class = PMC_CLASS_PPC970;
pcd->pcd_num = PPC970_MAX_PMCS;
diff --git a/sys/dev/hwpmc/pmc_events.h b/sys/dev/hwpmc/pmc_events.h
index 400a394..7f878cb 100644
--- a/sys/dev/hwpmc/pmc_events.h
+++ b/sys/dev/hwpmc/pmc_events.h
@@ -1554,6 +1554,11 @@ __PMC_EV_ALIAS("BACLEARS.RETURN", IAP_EVENT_E6H_08H) \
__PMC_EV_ALIAS("BACLEARS.COND", IAP_EVENT_E6H_10H) \
__PMC_EV_ALIAS("MS_DECODED.MS_ENTRY", IAP_EVENT_E7H_01H)
+/*
+ * Aliases for Broadwell PMC events.
+ */
+#define __PMC_EV_ALIAS_BROADWELL() \
+__PMC_EV_ALIAS_INTEL_ARCHITECTURAL()
/*
* Aliases for Core PMC events.
@@ -4228,6 +4233,11 @@ __PMC_EV(UCP, EVENT_86H_01H)
#define PMC_EV_UCP_FIRST PMC_EV_UCP_EVENT_00H_01H
#define PMC_EV_UCP_LAST PMC_EV_UCP_EVENT_86H_01H
+/*
+ * Aliases for Broadwell uncore PMC events
+ */
+#define __PMC_EV_ALIAS_BROADWELLUC()
+
#define __PMC_EV_ALIAS_COREI7UC() \
__PMC_EV_ALIAS("GQ_CYCLES_FULL.READ_TRACKER", UCP_EVENT_00H_01H) \
__PMC_EV_ALIAS("GQ_CYCLES_FULL.WRITE_TRACKER", UCP_EVENT_00H_02H) \
@@ -4893,6 +4903,138 @@ __PMC_EV_ALIAS("IMPC_C0H_TRK_REQUEST.ALL", UCP_EVENT_84H_01H)
#define PMC_EV_MIPS24K_LAST PMC_EV_MIPS24K_WBB_FULL_PIPELINE_STALLS
/*
+ * MIPS74k events. Similar to MIPS24k, the arrangement
+ * is (0,2) then (1,3) events.
+ */
+#define __PMC_EV_MIPS74K() \
+ __PMC_EV(MIPS74K, CYCLES) \
+ __PMC_EV(MIPS74K, INSTR_EXECUTED) \
+ __PMC_EV(MIPS74K, PREDICTED_JR_31) \
+ __PMC_EV(MIPS74K, JR_31_MISPREDICTIONS) \
+ __PMC_EV(MIPS74K, REDIRECT_STALLS) \
+ __PMC_EV(MIPS74K, JR_31_NO_PREDICTIONS) \
+ __PMC_EV(MIPS74K, ITLB_ACCESSES) \
+ __PMC_EV(MIPS74K, ITLB_MISSES) \
+ __PMC_EV(MIPS74K, JTLB_INSN_MISSES) \
+ __PMC_EV(MIPS74K, ICACHE_ACCESSES) \
+ __PMC_EV(MIPS74K, ICACHE_MISSES) \
+ __PMC_EV(MIPS74K, ICACHE_MISS_STALLS) \
+ __PMC_EV(MIPS74K, UNCACHED_IFETCH_STALLS) \
+ __PMC_EV(MIPS74K, PDTRACE_BACK_STALLS) \
+ __PMC_EV(MIPS74K, IFU_REPLAYS) \
+ __PMC_EV(MIPS74K, KILLED_FETCH_SLOTS) \
+ __PMC_EV(MIPS74K, IFU_IDU_MISS_PRED_UPSTREAM_CYCLES) \
+ __PMC_EV(MIPS74K, IFU_IDU_NO_FETCH_CYCLES) \
+ __PMC_EV(MIPS74K, IFU_IDU_CLOGED_DOWNSTREAM_CYCLES) \
+ __PMC_EV(MIPS74K, DDQ0_FULL_DR_STALLS) \
+ __PMC_EV(MIPS74K, DDQ1_FULL_DR_STALLS) \
+ __PMC_EV(MIPS74K, ALCB_FULL_DR_STALLS) \
+ __PMC_EV(MIPS74K, AGCB_FULL_DR_STALLS) \
+ __PMC_EV(MIPS74K, CLDQ_FULL_DR_STALLS) \
+ __PMC_EV(MIPS74K, IODQ_FULL_DR_STALLS) \
+ __PMC_EV(MIPS74K, ALU_EMPTY_CYCLES) \
+ __PMC_EV(MIPS74K, AGEN_EMPTY_CYCLES) \
+ __PMC_EV(MIPS74K, ALU_OPERANDS_NOT_READY_CYCLES) \
+ __PMC_EV(MIPS74K, AGEN_OPERANDS_NOT_READY_CYCLES) \
+ __PMC_EV(MIPS74K, ALU_NO_ISSUES_CYCLES) \
+ __PMC_EV(MIPS74K, AGEN_NO_ISSUES_CYCLES) \
+ __PMC_EV(MIPS74K, ALU_BUBBLE_CYCLES) \
+ __PMC_EV(MIPS74K, AGEN_BUBBLE_CYCLES) \
+ __PMC_EV(MIPS74K, SINGLE_ISSUE_CYCLES) \
+ __PMC_EV(MIPS74K, DUAL_ISSUE_CYCLES) \
+ __PMC_EV(MIPS74K, OOO_ALU_ISSUE_CYCLES) \
+ __PMC_EV(MIPS74K, OOO_AGEN_ISSUE_CYCLES) \
+ __PMC_EV(MIPS74K, JALR_JALR_HB_INSNS) \
+ __PMC_EV(MIPS74K, DCACHE_LINE_REFILL_REQUESTS) \
+ __PMC_EV(MIPS74K, DCACHE_LOAD_ACCESSES) \
+ __PMC_EV(MIPS74K, DCACHE_ACCESSES) \
+ __PMC_EV(MIPS74K, DCACHE_WRITEBACKS) \
+ __PMC_EV(MIPS74K, DCACHE_MISSES) \
+ __PMC_EV(MIPS74K, JTLB_DATA_ACCESSES) \
+ __PMC_EV(MIPS74K, JTLB_DATA_MISSES) \
+ __PMC_EV(MIPS74K, LOAD_STORE_REPLAYS) \
+ __PMC_EV(MIPS74K, VA_TRANSALTION_CORNER_CASES) \
+ __PMC_EV(MIPS74K, LOAD_STORE_BLOCKED_CYCLES) \
+ __PMC_EV(MIPS74K, LOAD_STORE_NO_FILL_REQUESTS) \
+ __PMC_EV(MIPS74K, L2_CACHE_WRITEBACKS) \
+ __PMC_EV(MIPS74K, L2_CACHE_ACCESSES) \
+ __PMC_EV(MIPS74K, L2_CACHE_MISSES) \
+ __PMC_EV(MIPS74K, L2_CACHE_MISS_CYCLES) \
+ __PMC_EV(MIPS74K, FSB_FULL_STALLS) \
+ __PMC_EV(MIPS74K, FSB_OVER_50_FULL) \
+ __PMC_EV(MIPS74K, LDQ_FULL_STALLS) \
+ __PMC_EV(MIPS74K, LDQ_OVER_50_FULL) \
+ __PMC_EV(MIPS74K, WBB_FULL_STALLS) \
+ __PMC_EV(MIPS74K, WBB_OVER_50_FULL) \
+ __PMC_EV(MIPS74K, LOAD_MISS_CONSUMER_REPLAYS) \
+ __PMC_EV(MIPS74K, CP1_CP2_LOAD_INSNS) \
+ __PMC_EV(MIPS74K, JR_NON_31_INSNS) \
+ __PMC_EV(MIPS74K, MISPREDICTED_JR_31_INSNS) \
+ __PMC_EV(MIPS74K, BRANCH_INSNS) \
+ __PMC_EV(MIPS74K, CP1_CP2_COND_BRANCH_INSNS) \
+ __PMC_EV(MIPS74K, BRANCH_LIKELY_INSNS) \
+ __PMC_EV(MIPS74K, MISPREDICTED_BRANCH_LIKELY_INSNS) \
+ __PMC_EV(MIPS74K, COND_BRANCH_INSNS) \
+ __PMC_EV(MIPS74K, MISPREDICTED_BRANCH_INSNS) \
+ __PMC_EV(MIPS74K, INTEGER_INSNS) \
+ __PMC_EV(MIPS74K, FPU_INSNS) \
+ __PMC_EV(MIPS74K, LOAD_INSNS) \
+ __PMC_EV(MIPS74K, STORE_INSNS) \
+ __PMC_EV(MIPS74K, J_JAL_INSNS) \
+ __PMC_EV(MIPS74K, MIPS16_INSNS) \
+ __PMC_EV(MIPS74K, NOP_INSNS) \
+ __PMC_EV(MIPS74K, NT_MUL_DIV_INSNS) \
+ __PMC_EV(MIPS74K, DSP_INSNS) \
+ __PMC_EV(MIPS74K, ALU_DSP_SATURATION_INSNS) \
+ __PMC_EV(MIPS74K, DSP_BRANCH_INSNS) \
+ __PMC_EV(MIPS74K, MDU_DSP_SATURATION_INSNS) \
+ __PMC_EV(MIPS74K, UNCACHED_LOAD_INSNS) \
+ __PMC_EV(MIPS74K, UNCACHED_STORE_INSNS) \
+ __PMC_EV(MIPS74K, EJTAG_INSN_TRIGGERS) \
+ __PMC_EV(MIPS74K, CP1_BRANCH_MISPREDICTIONS) \
+ __PMC_EV(MIPS74K, SC_INSNS) \
+ __PMC_EV(MIPS74K, FAILED_SC_INSNS) \
+ __PMC_EV(MIPS74K, PREFETCH_INSNS) \
+ __PMC_EV(MIPS74K, CACHE_HIT_PREFETCH_INSNS) \
+ __PMC_EV(MIPS74K, NO_INSN_CYCLES) \
+ __PMC_EV(MIPS74K, LOAD_MISS_INSNS) \
+ __PMC_EV(MIPS74K, ONE_INSN_CYCLES) \
+ __PMC_EV(MIPS74K, TWO_INSNS_CYCLES) \
+ __PMC_EV(MIPS74K, GFIFO_BLOCKED_CYCLES) \
+ __PMC_EV(MIPS74K, CP1_CP2_STORE_INSNS) \
+ __PMC_EV(MIPS74K, MISPREDICTION_STALLS) \
+ __PMC_EV(MIPS74K, MISPREDICTED_BRANCH_INSNS_CYCLES) \
+ __PMC_EV(MIPS74K, EXCEPTIONS_TAKEN) \
+ __PMC_EV(MIPS74K, GRADUATION_REPLAYS) \
+ __PMC_EV(MIPS74K, COREEXTEND_EVENTS) \
+ __PMC_EV(MIPS74K, ISPRAM_EVENTS) \
+ __PMC_EV(MIPS74K, DSPRAM_EVENTS) \
+ __PMC_EV(MIPS74K, L2_CACHE_SINGLE_BIT_ERRORS) \
+ __PMC_EV(MIPS74K, SYSTEM_EVENT_0) \
+ __PMC_EV(MIPS74K, SYSTEM_EVENT_1) \
+ __PMC_EV(MIPS74K, SYSTEM_EVENT_2) \
+ __PMC_EV(MIPS74K, SYSTEM_EVENT_3) \
+ __PMC_EV(MIPS74K, SYSTEM_EVENT_4) \
+ __PMC_EV(MIPS74K, SYSTEM_EVENT_5) \
+ __PMC_EV(MIPS74K, SYSTEM_EVENT_6) \
+ __PMC_EV(MIPS74K, SYSTEM_EVENT_7) \
+ __PMC_EV(MIPS74K, OCP_ALL_REQUESTS) \
+ __PMC_EV(MIPS74K, OCP_ALL_CACHEABLE_REQUESTS) \
+ __PMC_EV(MIPS74K, OCP_READ_REQUESTS) \
+ __PMC_EV(MIPS74K, OCP_READ_CACHEABLE_REQUESTS) \
+ __PMC_EV(MIPS74K, OCP_WRITE_REQUESTS) \
+ __PMC_EV(MIPS74K, OCP_WRITE_CACHEABLE_REQUESTS) \
+ __PMC_EV(MIPS74K, FSB_LESS_25_FULL) \
+ __PMC_EV(MIPS74K, FSB_25_50_FULL) \
+ __PMC_EV(MIPS74K, LDQ_LESS_25_FULL) \
+ __PMC_EV(MIPS74K, LDQ_25_50_FULL) \
+ __PMC_EV(MIPS74K, WBB_LESS_25_FULL) \
+ __PMC_EV(MIPS74K, WBB_25_50_FULL)
+
+#define PMC_EV_MIPS74K_FIRST PMC_EV_MIPS74K_CYCLES
+#define PMC_EV_MIPS74K_LAST PMC_EV_MIPS74K_WBB_25_50_FULL
+
+/*
* Cavium Octeon counters. Obtained from cvmx-core.h
*/
#define __PMC_EV_OCTEON() \
@@ -5237,6 +5379,168 @@ __PMC_EV_ALIAS("IMPC_C0H_TRK_REQUEST.ALL", UCP_EVENT_84H_01H)
#define PMC_EV_PPC970_FIRST PMC_EV_PPC970_INSTR_COMPLETED
#define PMC_EV_PPC970_LAST PMC_EV_PPC970_ADDER
+
+#define __PMC_EV_E500() \
+ __PMC_EV(E500, CYCLES) \
+ __PMC_EV(E500, INSTR_COMPLETED) \
+ __PMC_EV(E500, UOPS_COMPLETED) \
+ __PMC_EV(E500, INSTR_FETCHED) \
+ __PMC_EV(E500, UOPS_DECODED) \
+ __PMC_EV(E500, PM_EVENT_TRANSITIONS) \
+ __PMC_EV(E500, PM_EVENT_CYCLES) \
+ __PMC_EV(E500, BRANCH_INSTRS_COMPLETED) \
+ __PMC_EV(E500, LOAD_UOPS_COMPLETED) \
+ __PMC_EV(E500, STORE_UOPS_COMPLETED) \
+ __PMC_EV(E500, CQ_REDIRECTS) \
+ __PMC_EV(E500, BRANCHES_FINISHED) \
+ __PMC_EV(E500, TAKEN_BRANCHES_FINISHED) \
+ __PMC_EV(E500, FINISHED_UNCOND_BRANCHES_MISS_BTB) \
+ __PMC_EV(E500, BRANCH_MISPRED) \
+ __PMC_EV(E500, BTB_BRANCH_MISPRED_FROM_DIRECTION) \
+ __PMC_EV(E500, BTB_HITS_PSEUDO_HITS) \
+ __PMC_EV(E500, CYCLES_DECODE_STALLED) \
+ __PMC_EV(E500, CYCLES_ISSUE_STALLED) \
+ __PMC_EV(E500, CYCLES_BRANCH_ISSUE_STALLED) \
+ __PMC_EV(E500, CYCLES_SU1_SCHED_STALLED) \
+ __PMC_EV(E500, CYCLES_SU2_SCHED_STALLED) \
+ __PMC_EV(E500, CYCLES_MU_SCHED_STALLED) \
+ __PMC_EV(E500, CYCLES_LRU_SCHED_STALLED) \
+ __PMC_EV(E500, CYCLES_BU_SCHED_STALLED) \
+ __PMC_EV(E500, TOTAL_TRANSLATED) \
+ __PMC_EV(E500, LOADS_TRANSLATED) \
+ __PMC_EV(E500, STORES_TRANSLATED) \
+ __PMC_EV(E500, TOUCHES_TRANSLATED) \
+ __PMC_EV(E500, CACHEOPS_TRANSLATED) \
+ __PMC_EV(E500, CACHE_INHIBITED_ACCESS_TRANSLATED) \
+ __PMC_EV(E500, GUARDED_LOADS_TRANSLATED) \
+ __PMC_EV(E500, WRITE_THROUGH_STORES_TRANSLATED) \
+ __PMC_EV(E500, MISALIGNED_LOAD_STORE_ACCESS_TRANSLATED) \
+ __PMC_EV(E500, TOTAL_ALLOCATED_TO_DLFB) \
+ __PMC_EV(E500, LOADS_TRANSLATED_ALLOCATED_TO_DLFB) \
+ __PMC_EV(E500, STORES_COMPLETED_ALLOCATED_TO_DLFB) \
+ __PMC_EV(E500, TOUCHES_TRANSLATED_ALLOCATED_TO_DLFB) \
+ __PMC_EV(E500, STORES_COMPLETED) \
+ __PMC_EV(E500, DATA_L1_CACHE_LOCKS) \
+ __PMC_EV(E500, DATA_L1_CACHE_RELOADS) \
+ __PMC_EV(E500, DATA_L1_CACHE_CASTOUTS) \
+ __PMC_EV(E500, LOAD_MISS_DLFB_FULL) \
+ __PMC_EV(E500, LOAD_MISS_LDQ_FULL) \
+ __PMC_EV(E500, LOAD_GUARDED_MISS) \
+ __PMC_EV(E500, STORE_TRANSLATE_WHEN_QUEUE_FULL) \
+ __PMC_EV(E500, ADDRESS_COLLISION) \
+ __PMC_EV(E500, DATA_MMU_MISS) \
+ __PMC_EV(E500, DATA_MMU_BUSY) \
+ __PMC_EV(E500, PART2_MISALIGNED_CACHE_ACCESS) \
+ __PMC_EV(E500, LOAD_MISS_DLFB_FULL_CYCLES) \
+ __PMC_EV(E500, LOAD_MISS_LDQ_FULL_CYCLES) \
+ __PMC_EV(E500, LOAD_GUARDED_MISS_CYCLES) \
+ __PMC_EV(E500, STORE_TRANSLATE_WHEN_QUEUE_FULL_CYCLES) \
+ __PMC_EV(E500, ADDRESS_COLLISION_CYCLES) \
+ __PMC_EV(E500, DATA_MMU_MISS_CYCLES) \
+ __PMC_EV(E500, DATA_MMU_BUSY_CYCLES) \
+ __PMC_EV(E500, PART2_MISALIGNED_CACHE_ACCESS_CYCLES) \
+ __PMC_EV(E500, INSTR_L1_CACHE_LOCKS) \
+ __PMC_EV(E500, INSTR_L1_CACHE_RELOADS) \
+ __PMC_EV(E500, INSTR_L1_CACHE_FETCHES) \
+ __PMC_EV(E500, INSTR_MMU_TLB4K_RELOADS) \
+ __PMC_EV(E500, INSTR_MMU_VSP_RELOADS) \
+ __PMC_EV(E500, DATA_MMU_TLB4K_RELOADS) \
+ __PMC_EV(E500, DATA_MMU_VSP_RELOADS) \
+ __PMC_EV(E500, L2MMU_MISSES) \
+ __PMC_EV(E500, BIU_MASTER_REQUESTS) \
+ __PMC_EV(E500, BIU_MASTER_INSTR_SIDE_REQUESTS) \
+ __PMC_EV(E500, BIU_MASTER_DATA_SIDE_REQUESTS) \
+ __PMC_EV(E500, BIU_MASTER_DATA_SIDE_CASTOUT_REQUESTS) \
+ __PMC_EV(E500, BIU_MASTER_RETRIES) \
+ __PMC_EV(E500, SNOOP_REQUESTS) \
+ __PMC_EV(E500, SNOOP_HITS) \
+ __PMC_EV(E500, SNOOP_PUSHES) \
+ __PMC_EV(E500, SNOOP_RETRIES) \
+ __PMC_EV(E500, DLFB_LOAD_MISS_CYCLES) \
+ __PMC_EV(E500, ILFB_FETCH_MISS_CYCLES) \
+ __PMC_EV(E500, EXT_INPU_INTR_LATENCY_CYCLES) \
+ __PMC_EV(E500, CRIT_INPUT_INTR_LATENCY_CYCLES) \
+ __PMC_EV(E500, EXT_INPUT_INTR_PENDING_LATENCY_CYCLES) \
+ __PMC_EV(E500, CRIT_INPUT_INTR_PENDING_LATENCY_CYCLES) \
+ __PMC_EV(E500, PMC0_OVERFLOW) \
+ __PMC_EV(E500, PMC1_OVERFLOW) \
+ __PMC_EV(E500, PMC2_OVERFLOW) \
+ __PMC_EV(E500, PMC3_OVERFLOW) \
+ __PMC_EV(E500, INTERRUPTS_TAKEN) \
+ __PMC_EV(E500, EXT_INPUT_INTR_TAKEN) \
+ __PMC_EV(E500, CRIT_INPUT_INTR_TAKEN) \
+ __PMC_EV(E500, SYSCALL_TRAP_INTR) \
+ __PMC_EV(E500, TLB_BIT_TRANSITIONS) \
+ __PMC_EV(E500, L2_LINEFILL_BUFFER) \
+ __PMC_EV(E500, LV2_VS) \
+ __PMC_EV(E500, CASTOUTS_RELEASED) \
+ __PMC_EV(E500, INTV_ALLOCATIONS) \
+ __PMC_EV(E500, DLFB_RETRIES_TO_MBAR) \
+ __PMC_EV(E500, STORE_RETRIES) \
+ __PMC_EV(E500, STASH_L1_HITS) \
+ __PMC_EV(E500, STASH_L2_HITS) \
+ __PMC_EV(E500, STASH_BUSY_1) \
+ __PMC_EV(E500, STASH_BUSY_2) \
+ __PMC_EV(E500, STASH_BUSY_3) \
+ __PMC_EV(E500, STASH_HITS) \
+ __PMC_EV(E500, STASH_HIT_DLFB) \
+ __PMC_EV(E500, STASH_REQUESTS) \
+ __PMC_EV(E500, STASH_REQUESTS_L1) \
+ __PMC_EV(E500, STASH_REQUESTS_L2) \
+ __PMC_EV(E500, STALLS_NO_CAQ_OR_COB) \
+ __PMC_EV(E500, L2_CACHE_ACCESSES) \
+ __PMC_EV(E500, L2_HIT_CACHE_ACCESSES) \
+ __PMC_EV(E500, L2_CACHE_DATA_ACCESSES) \
+ __PMC_EV(E500, L2_CACHE_DATA_HITS) \
+ __PMC_EV(E500, L2_CACHE_INSTR_ACCESSES) \
+ __PMC_EV(E500, L2_CACHE_INSTR_HITS) \
+ __PMC_EV(E500, L2_CACHE_ALLOCATIONS) \
+ __PMC_EV(E500, L2_CACHE_DATA_ALLOCATIONS) \
+ __PMC_EV(E500, L2_CACHE_DIRTY_DATA_ALLOCATIONS) \
+ __PMC_EV(E500, L2_CACHE_INSTR_ALLOCATIONS) \
+ __PMC_EV(E500, L2_CACHE_UPDATES) \
+ __PMC_EV(E500, L2_CACHE_CLEAN_UPDATES) \
+ __PMC_EV(E500, L2_CACHE_DIRTY_UPDATES) \
+ __PMC_EV(E500, L2_CACHE_CLEAN_REDUNDANT_UPDATES) \
+ __PMC_EV(E500, L2_CACHE_DIRTY_REDUNDANT_UPDATES) \
+ __PMC_EV(E500, L2_CACHE_LOCKS) \
+ __PMC_EV(E500, L2_CACHE_CASTOUTS) \
+ __PMC_EV(E500, L2_CACHE_DATA_DIRTY_HITS) \
+ __PMC_EV(E500, INSTR_LFB_WENT_HIGH_PRIORITY) \
+ __PMC_EV(E500, SNOOP_THROTTLING_TURNED_ON) \
+ __PMC_EV(E500, L2_CLEAN_LINE_INVALIDATIONS) \
+ __PMC_EV(E500, L2_INCOHERENT_LINE_INVALIDATIONS) \
+ __PMC_EV(E500, L2_COHERENT_LINE_INVALIDATIONS) \
+ __PMC_EV(E500, COHERENT_LOOKUP_MISS_DUE_TO_VALID_BUT_INCOHERENT_MATCHES) \
+ __PMC_EV(E500, IAC1S_DETECTED) \
+ __PMC_EV(E500, IAC2S_DETECTED) \
+ __PMC_EV(E500, DAC1S_DTECTED) \
+ __PMC_EV(E500, DAC2S_DTECTED) \
+ __PMC_EV(E500, DVT0_DETECTED) \
+ __PMC_EV(E500, DVT1_DETECTED) \
+ __PMC_EV(E500, DVT2_DETECTED) \
+ __PMC_EV(E500, DVT3_DETECTED) \
+ __PMC_EV(E500, DVT4_DETECTED) \
+ __PMC_EV(E500, DVT5_DETECTED) \
+ __PMC_EV(E500, DVT6_DETECTED) \
+ __PMC_EV(E500, DVT7_DETECTED) \
+ __PMC_EV(E500, CYCLES_COMPLETION_STALLED_NEXUS_FIFO_FULL) \
+ __PMC_EV(E500, FPU_DOUBLE_PUMP) \
+ __PMC_EV(E500, FPU_FINISH) \
+ __PMC_EV(E500, FPU_DIVIDE_CYCLES) \
+ __PMC_EV(E500, FPU_DENORM_INPUT_CYCLES) \
+ __PMC_EV(E500, FPU_RESULT_STALL_CYCLES) \
+ __PMC_EV(E500, FPU_FPSCR_FULL_STALL) \
+ __PMC_EV(E500, FPU_PIPE_SYNC_STALLS) \
+ __PMC_EV(E500, FPU_INPUT_DATA_STALLS) \
+ __PMC_EV(E500, DECORATED_LOADS) \
+ __PMC_EV(E500, DECORATED_STORES) \
+ __PMC_EV(E500, LOAD_RETRIES) \
+ __PMC_EV(E500, STWCX_SUCCESSES) \
+ __PMC_EV(E500, STWCX_FAILURES) \
+
+#define PMC_EV_E500_FIRST PMC_EV_E500_CYCLES
+#define PMC_EV_E500_LAST PMC_EV_E500_STWCX_FAILURES
/*
* All known PMC events.
*
@@ -5256,6 +5560,11 @@ __PMC_EV_ALIAS("IMPC_C0H_TRK_REQUEST.ALL", UCP_EVENT_84H_01H)
* 0x11100 0x0100 INTEL Pentium Pro/P-II/P-III/Pentium-M events
* 0x11200 0x00FF INTEL XScale events
* 0x11300 0x00FF MIPS 24K events
+ * 0x11400 0x00FF Octeon events
+ * 0x11500 0x00FF MIPS 74K events
+ * 0x13000 0x00FF MPC7450 events
+ * 0x13100 0x00FF IBM PPC970 events
+ * 0x13300 0x00FF Freescale e500 events
* 0x14000 0x0100 ARMv7 events
* 0x20000 0x1000 Software events
*/
@@ -5282,6 +5591,8 @@ __PMC_EV_ALIAS("IMPC_C0H_TRK_REQUEST.ALL", UCP_EVENT_84H_01H)
__PMC_EV_MIPS24K() \
__PMC_EV_BLOCK(OCTEON, 0x11400) \
__PMC_EV_OCTEON() \
+ __PMC_EV_BLOCK(MIPS74K, 0x11500) \
+ __PMC_EV_MIPS74K() \
__PMC_EV_BLOCK(UCF, 0x12000) \
__PMC_EV_UCF() \
__PMC_EV_BLOCK(UCP, 0x12080) \
@@ -5290,6 +5601,8 @@ __PMC_EV_ALIAS("IMPC_C0H_TRK_REQUEST.ALL", UCP_EVENT_84H_01H)
__PMC_EV_PPC7450() \
__PMC_EV_BLOCK(PPC970, 0x13100) \
__PMC_EV_PPC970() \
+ __PMC_EV_BLOCK(E500, 0x13300) \
+ __PMC_EV_E500() \
__PMC_EV_BLOCK(ARMV7, 0x14000) \
__PMC_EV_ARMV7() \
diff --git a/sys/dev/hyperv/include/hyperv.h b/sys/dev/hyperv/include/hyperv.h
index 8a45d89..5360b7c 100644
--- a/sys/dev/hyperv/include/hyperv.h
+++ b/sys/dev/hyperv/include/hyperv.h
@@ -46,6 +46,7 @@
#include <sys/systm.h>
#include <sys/lock.h>
#include <sys/sema.h>
+#include <sys/smp.h>
#include <sys/mutex.h>
#include <sys/bus.h>
#include <vm/vm.h>
@@ -63,11 +64,22 @@ typedef uint8_t hv_bool_uint8_t;
#define HV_ERROR_MACHINE_LOCKED 0x800704F7
/*
- * A revision number of vmbus that is used for ensuring both ends on a
- * partition are using compatible versions.
+ * VMBUS version is 32 bit, upper 16 bit for major_number and lower
+ * 16 bit for minor_number.
+ *
+ * 0.13 -- Windows Server 2008
+ * 1.1 -- Windows 7
+ * 2.4 -- Windows 8
+ * 3.0 -- Windows 8.1
*/
+#define HV_VMBUS_VERSION_WS2008 ((0 << 16) | (13))
+#define HV_VMBUS_VERSION_WIN7 ((1 << 16) | (1))
+#define HV_VMBUS_VERSION_WIN8 ((2 << 16) | (4))
+#define HV_VMBUS_VERSION_WIN8_1 ((3 << 16) | (0))
+
+#define HV_VMBUS_VERSION_INVALID -1
-#define HV_VMBUS_REVISION_NUMBER 13
+#define HV_VMBUS_VERSION_CURRENT HV_VMBUS_VERSION_WIN8_1
/*
* Make maximum size of pipe payload of 16K
@@ -112,6 +124,18 @@ typedef struct hv_guid {
unsigned char data[16];
} __packed hv_guid;
+#define HV_NIC_GUID \
+ .data = {0x63, 0x51, 0x61, 0xF8, 0x3E, 0xDF, 0xc5, 0x46, \
+ 0x91, 0x3F, 0xF2, 0xD2, 0xF9, 0x65, 0xED, 0x0E}
+
+#define HV_IDE_GUID \
+ .data = {0x32, 0x26, 0x41, 0x32, 0xcb, 0x86, 0xa2, 0x44, \
+ 0x9b, 0x5c, 0x50, 0xd1, 0x41, 0x73, 0x54, 0xf5}
+
+#define HV_SCSI_GUID \
+ .data = {0xd9, 0x63, 0x61, 0xba, 0xa1, 0x04, 0x29, 0x4d, \
+ 0xb6, 0x05, 0x72, 0xe2, 0xff, 0xb1, 0xdc, 0x7f}
+
/*
* At the center of the Channel Management library is
* the Channel Offer. This struct contains the
@@ -147,7 +171,11 @@ typedef struct hv_vmbus_channel_offer {
} __packed pipe;
} u;
- uint32_t padding;
+ /*
+ * Sub_channel_index, newly added in Win8.
+ */
+ uint16_t sub_channel_index;
+ uint16_t padding;
} __packed hv_vmbus_channel_offer;
@@ -344,7 +372,25 @@ typedef struct {
hv_vmbus_channel_offer offer;
uint32_t child_rel_id;
uint8_t monitor_id;
- hv_bool_uint8_t monitor_allocated;
+ /*
+ * This field has been split into a bit field on Win7
+ * and higher.
+ */
+ uint8_t monitor_allocated:1;
+ uint8_t reserved:7;
+ /*
+ * Following fields were added in win7 and higher.
+ * Make sure to check the version before accessing these fields.
+ *
+ * If "is_dedicated_interrupt" is set, we must not set the
+ * associated bit in the channel bitmap while sending the
+ * interrupt to the host.
+ *
+ * connection_id is used in signaling the host.
+ */
+ uint16_t is_dedicated_interrupt:1;
+ uint16_t reserved1:15;
+ uint32_t connection_id;
} __packed hv_vmbus_channel_offer_channel;
/*
@@ -394,9 +440,11 @@ typedef struct
hv_gpadl_handle ring_buffer_gpadl_handle;
/*
- * GPADL for the channel's server context save area.
+ * Before win8, all incoming channel interrupts are only
+ * delivered on cpu 0. Setting this value to 0 would
+ * preserve the earlier behavior.
*/
- hv_gpadl_handle server_context_area_gpadl_handle;
+ uint32_t target_vcpu;
/*
* The upstream ring buffer begins at offset zero in the memory described
@@ -646,14 +694,42 @@ typedef struct {
} hv_vmbus_ring_buffer_info;
typedef void (*hv_vmbus_pfn_channel_callback)(void *context);
+typedef void (*hv_vmbus_sc_creation_callback)(void *context);
typedef enum {
HV_CHANNEL_OFFER_STATE,
HV_CHANNEL_OPENING_STATE,
HV_CHANNEL_OPEN_STATE,
+ HV_CHANNEL_OPENED_STATE,
HV_CHANNEL_CLOSING_NONDESTRUCTIVE_STATE,
} hv_vmbus_channel_state;
+/*
+ * Connection identifier type
+ */
+typedef union {
+ uint32_t as_uint32_t;
+ struct {
+ uint32_t id:24;
+ uint32_t reserved:8;
+ } u;
+
+} __packed hv_vmbus_connection_id;
+
+/*
+ * Definition of the hv_vmbus_signal_event hypercall input structure
+ */
+typedef struct {
+ hv_vmbus_connection_id connection_id;
+ uint16_t flag_number;
+ uint16_t rsvd_z;
+} __packed hv_vmbus_input_signal_event;
+
+typedef struct {
+ uint64_t align8;
+ hv_vmbus_input_signal_event event;
+} __packed hv_vmbus_input_signal_event_buffer;
+
typedef struct hv_vmbus_channel {
TAILQ_ENTRY(hv_vmbus_channel) list_entry;
struct hv_device* device;
@@ -688,8 +764,82 @@ typedef struct hv_vmbus_channel {
hv_vmbus_pfn_channel_callback on_channel_callback;
void* channel_callback_context;
+ /*
+ * If batched_reading is set to "true", mask the interrupt
+ * and read until the channel is empty.
+ * If batched_reading is set to "false", the channel is not
+ * going to perform batched reading.
+ *
+ * Batched reading is enabled by default; specific
+ * drivers that don't want this behavior can turn it off.
+ */
+ boolean_t batched_reading;
+
+ boolean_t is_dedicated_interrupt;
+
+ /*
+ * Used as an input param for HV_CALL_SIGNAL_EVENT hypercall.
+ */
+ hv_vmbus_input_signal_event_buffer signal_event_buffer;
+ /*
+ * 8-bytes aligned of the buffer above
+ */
+ hv_vmbus_input_signal_event *signal_event_param;
+
+ /*
+ * From Win8, this field specifies the target virtual process
+ * on which to deliver the interupt from the host to guest.
+ * Before Win8, all channel interrupts would only be
+ * delivered on cpu 0. Setting this value to 0 would preserve
+ * the earlier behavior.
+ */
+ uint32_t target_vcpu;
+ /* The corresponding CPUID in the guest */
+ uint32_t target_cpu;
+
+ /*
+ * Support for multi-channels.
+ * The initial offer is considered the primary channel and this
+ * offer message will indicate if the host supports multi-channels.
+ * The guest is free to ask for multi-channels to be offerred and can
+ * open these multi-channels as a normal "primary" channel. However,
+ * all multi-channels will have the same type and instance guids as the
+ * primary channel. Requests sent on a given channel will result in a
+ * response on the same channel.
+ */
+
+ /*
+ * Multi-channel creation callback. This callback will be called in
+ * process context when a Multi-channel offer is received from the host.
+ * The guest can open the Multi-channel in the context of this callback.
+ */
+ hv_vmbus_sc_creation_callback sc_creation_callback;
+
+ struct mtx sc_lock;
+
+ /*
+ * Link list of all the multi-channels if this is a primary channel
+ */
+ TAILQ_HEAD(, hv_vmbus_channel) sc_list_anchor;
+ TAILQ_ENTRY(hv_vmbus_channel) sc_list_entry;
+
+ /*
+ * The primary channel this sub-channle belongs to.
+ * This will be NULL for the primary channel.
+ */
+ struct hv_vmbus_channel *primary_channel;
+ /*
+ * Support per channel state for use by vmbus drivers.
+ */
+ void *per_channel_state;
} hv_vmbus_channel;
+static inline void
+hv_set_channel_read_state(hv_vmbus_channel* channel, boolean_t state)
+{
+ channel->batched_reading = state;
+}
+
typedef struct hv_device {
hv_guid class_id;
hv_guid device_id;
@@ -760,6 +910,8 @@ int hv_vmbus_channel_teardown_gpdal(
hv_vmbus_channel* channel,
uint32_t gpadl_handle);
+struct hv_vmbus_channel* vmbus_select_outgoing_channel(struct hv_vmbus_channel *promary);
+
/*
* Work abstraction defines
*/
@@ -819,6 +971,7 @@ typedef struct hv_vmbus_service {
extern uint8_t* receive_buffer[];
extern hv_vmbus_service service_table[];
+extern uint32_t hv_vmbus_protocal_version;
void hv_kvp_callback(void *context);
int hv_kvp_init(hv_vmbus_service *serv);
diff --git a/sys/dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c b/sys/dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c
index d00d279..f8a871b 100644
--- a/sys/dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c
+++ b/sys/dev/hyperv/storvsc/hv_storvsc_drv_freebsd.c
@@ -38,6 +38,7 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/proc.h>
#include <sys/condvar.h>
+#include <sys/time.h>
#include <sys/systm.h>
#include <sys/sockio.h>
#include <sys/mbuf.h>
@@ -53,8 +54,12 @@ __FBSDID("$FreeBSD$");
#include <sys/callout.h>
#include <vm/vm.h>
#include <vm/pmap.h>
+#include <vm/uma.h>
#include <sys/lock.h>
#include <sys/sema.h>
+#include <sys/sglist.h>
+#include <machine/bus.h>
+#include <sys/bus_dma.h>
#include <cam/cam.h>
#include <cam/cam_ccb.h>
@@ -66,7 +71,6 @@ __FBSDID("$FreeBSD$");
#include <cam/scsi/scsi_all.h>
#include <cam/scsi/scsi_message.h>
-
#include <dev/hyperv/include/hyperv.h>
#include "hv_vstorage.h"
@@ -77,8 +81,29 @@ __FBSDID("$FreeBSD$");
#define BLKVSC_MAX_IO_REQUESTS STORVSC_MAX_IO_REQUESTS
#define STORVSC_MAX_TARGETS (2)
+#define STORVSC_WIN7_MAJOR 4
+#define STORVSC_WIN7_MINOR 2
+
+#define STORVSC_WIN8_MAJOR 5
+#define STORVSC_WIN8_MINOR 1
+
+#define HV_ALIGN(x, a) roundup2(x, a)
+
struct storvsc_softc;
+struct hv_sgl_node {
+ LIST_ENTRY(hv_sgl_node) link;
+ struct sglist *sgl_data;
+};
+
+struct hv_sgl_page_pool{
+ LIST_HEAD(, hv_sgl_node) in_use_sgl_list;
+ LIST_HEAD(, hv_sgl_node) free_sgl_list;
+ boolean_t is_init;
+} g_hv_sgl_page_pool;
+
+#define STORVSC_MAX_SG_PAGE_CNT STORVSC_MAX_IO_REQUESTS * HV_MAX_MULTIPAGE_BUFFER_COUNT
+
enum storvsc_request_type {
WRITE_TYPE,
READ_TYPE,
@@ -96,20 +121,24 @@ struct hv_storvsc_request {
struct storvsc_softc *softc;
struct callout callout;
struct sema synch_sema; /*Synchronize the request/response if needed */
+ struct sglist *bounce_sgl;
+ unsigned int bounce_sgl_count;
+ uint64_t not_aligned_seg_bits;
};
struct storvsc_softc {
struct hv_device *hs_dev;
- LIST_HEAD(, hv_storvsc_request) hs_free_list;
- struct mtx hs_lock;
- struct storvsc_driver_props *hs_drv_props;
- int hs_unit;
- uint32_t hs_frozen;
- struct cam_sim *hs_sim;
- struct cam_path *hs_path;
+ LIST_HEAD(, hv_storvsc_request) hs_free_list;
+ struct mtx hs_lock;
+ struct storvsc_driver_props *hs_drv_props;
+ int hs_unit;
+ uint32_t hs_frozen;
+ struct cam_sim *hs_sim;
+ struct cam_path *hs_path;
uint32_t hs_num_out_reqs;
boolean_t hs_destroy;
boolean_t hs_drain_notify;
+ boolean_t hs_open_multi_channel;
struct sema hs_drain_sema;
struct hv_storvsc_request hs_init_req;
struct hv_storvsc_request hs_reset_req;
@@ -124,7 +153,7 @@ struct storvsc_softc {
* The first can be tested by "sg_senddiag -vv /dev/daX",
* and the second and third can be done by
* "sg_wr_mode -v -p 08 -c 0,1a -m 0,ff /dev/daX".
- */
+ */
#define HVS_TIMEOUT_TEST 0
/*
@@ -138,7 +167,7 @@ struct storvsc_driver_props {
char *drv_name;
char *drv_desc;
uint8_t drv_max_luns_per_target;
- uint8_t drv_max_ios_per_target;
+ uint8_t drv_max_ios_per_target;
uint32_t drv_ringbuffer_size;
};
@@ -150,6 +179,8 @@ enum hv_storage_type {
#define HS_MAX_ADAPTERS 10
+#define HV_STORAGE_SUPPORTS_MULTI_CHANNEL 0x1
+
/* {ba6163d9-04a1-4d29-b605-72e2ffb1dc7f} */
static const hv_guid gStorVscDeviceType={
.data = {0xd9, 0x63, 0x61, 0xba, 0xa1, 0x04, 0x29, 0x4d,
@@ -171,13 +202,16 @@ static struct storvsc_driver_props g_drv_props_table[] = {
STORVSC_RINGBUFFER_SIZE}
};
+static int storvsc_current_major;
+static int storvsc_current_minor;
+
/* static functions */
static int storvsc_probe(device_t dev);
static int storvsc_attach(device_t dev);
static int storvsc_detach(device_t dev);
static void storvsc_poll(struct cam_sim * sim);
static void storvsc_action(struct cam_sim * sim, union ccb * ccb);
-static void create_storvsc_request(union ccb *ccb, struct hv_storvsc_request *reqp);
+static int create_storvsc_request(union ccb *ccb, struct hv_storvsc_request *reqp);
static void storvsc_free_request(struct storvsc_softc *sc, struct hv_storvsc_request *reqp);
static enum hv_storage_type storvsc_get_storage_type(device_t dev);
static void hv_storvsc_on_channel_callback(void *context);
@@ -186,6 +220,14 @@ static void hv_storvsc_on_iocompletion( struct storvsc_softc *sc,
struct hv_storvsc_request *request);
static int hv_storvsc_connect_vsp(struct hv_device *device);
static void storvsc_io_done(struct hv_storvsc_request *reqp);
+static void storvsc_copy_sgl_to_bounce_buf(struct sglist *bounce_sgl,
+ bus_dma_segment_t *orig_sgl,
+ unsigned int orig_sgl_count,
+ uint64_t seg_bits);
+void storvsc_copy_from_bounce_buf_to_sgl(bus_dma_segment_t *dest_sgl,
+ unsigned int dest_sgl_count,
+ struct sglist* src_sgl,
+ uint64_t seg_bits);
static device_method_t storvsc_methods[] = {
/* Device interface */
@@ -207,7 +249,7 @@ MODULE_DEPEND(storvsc, vmbus, 1, 1, 1);
/**
- * The host is capable of sending messages to us that are
+ * The host is capable of sending messages to us that are
* completely unsolicited. So, we need to address the race
* condition where we may be in the process of unloading the
* driver when the host may send us an unsolicited message.
@@ -223,7 +265,7 @@ MODULE_DEPEND(storvsc, vmbus, 1, 1, 1);
* destroyed.
*
* 3. Once the device is marked as being destroyed, we only
- * permit incoming traffic to properly account for
+ * permit incoming traffic to properly account for
* packets already sent out.
*/
static inline struct storvsc_softc *
@@ -260,6 +302,113 @@ get_stor_device(struct hv_device *device,
}
/**
+ * @brief Callback handler, will be invoked when receive mutil-channel offer
+ *
+ * @param context new multi-channel
+ */
+static void
+storvsc_handle_sc_creation(void *context)
+{
+ hv_vmbus_channel *new_channel;
+ struct hv_device *device;
+ struct storvsc_softc *sc;
+ struct vmstor_chan_props props;
+ int ret = 0;
+
+ new_channel = (hv_vmbus_channel *)context;
+ device = new_channel->primary_channel->device;
+ sc = get_stor_device(device, TRUE);
+ if (sc == NULL)
+ return;
+
+ if (FALSE == sc->hs_open_multi_channel)
+ return;
+
+ memset(&props, 0, sizeof(props));
+
+ ret = hv_vmbus_channel_open(new_channel,
+ sc->hs_drv_props->drv_ringbuffer_size,
+ sc->hs_drv_props->drv_ringbuffer_size,
+ (void *)&props,
+ sizeof(struct vmstor_chan_props),
+ hv_storvsc_on_channel_callback,
+ new_channel);
+
+ return;
+}
+
+/**
+ * @brief Send multi-channel creation request to host
+ *
+ * @param device a Hyper-V device pointer
+ * @param max_chans the max channels supported by vmbus
+ */
+static void
+storvsc_send_multichannel_request(struct hv_device *dev, int max_chans)
+{
+ struct storvsc_softc *sc;
+ struct hv_storvsc_request *request;
+ struct vstor_packet *vstor_packet;
+ int request_channels_cnt = 0;
+ int ret;
+
+ /* get multichannels count that need to create */
+ request_channels_cnt = MIN(max_chans, mp_ncpus);
+
+ sc = get_stor_device(dev, TRUE);
+ if (sc == NULL) {
+ printf("Storvsc_error: get sc failed while send mutilchannel "
+ "request\n");
+ return;
+ }
+
+ request = &sc->hs_init_req;
+
+ /* Establish a handler for multi-channel */
+ dev->channel->sc_creation_callback = storvsc_handle_sc_creation;
+
+ /* request the host to create multi-channel */
+ memset(request, 0, sizeof(struct hv_storvsc_request));
+
+ sema_init(&request->synch_sema, 0, ("stor_synch_sema"));
+
+ vstor_packet = &request->vstor_packet;
+
+ vstor_packet->operation = VSTOR_OPERATION_CREATE_MULTI_CHANNELS;
+ vstor_packet->flags = REQUEST_COMPLETION_FLAG;
+ vstor_packet->u.multi_channels_cnt = request_channels_cnt;
+
+ ret = hv_vmbus_channel_send_packet(
+ dev->channel,
+ vstor_packet,
+ sizeof(struct vstor_packet),
+ (uint64_t)(uintptr_t)request,
+ HV_VMBUS_PACKET_TYPE_DATA_IN_BAND,
+ HV_VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED);
+
+ /* wait for 5 seconds */
+ ret = sema_timedwait(&request->synch_sema, 5 * hz);
+ if (ret != 0) {
+ printf("Storvsc_error: create multi-channel timeout, %d\n",
+ ret);
+ return;
+ }
+
+ if (vstor_packet->operation != VSTOR_OPERATION_COMPLETEIO ||
+ vstor_packet->status != 0) {
+ printf("Storvsc_error: create multi-channel invalid operation "
+ "(%d) or statue (%u)\n",
+ vstor_packet->operation, vstor_packet->status);
+ return;
+ }
+
+ sc->hs_open_multi_channel = TRUE;
+
+ if (bootverbose)
+ printf("Storvsc create multi-channel success!\n");
+}
+
+/**
* @brief initialize channel connection to parent partition
*
* @param dev a Hyper-V device pointer
@@ -272,11 +421,15 @@ hv_storvsc_channel_init(struct hv_device *dev)
struct hv_storvsc_request *request;
struct vstor_packet *vstor_packet;
struct storvsc_softc *sc;
+ uint16_t max_chans = 0;
+ boolean_t support_multichannel = FALSE;
+
+ max_chans = 0;
+ support_multichannel = FALSE;
sc = get_stor_device(dev, TRUE);
- if (sc == NULL) {
- return ENODEV;
- }
+ if (sc == NULL)
+ return (ENODEV);
request = &sc->hs_init_req;
memset(request, 0, sizeof(struct hv_storvsc_request));
@@ -300,15 +453,13 @@ hv_storvsc_channel_init(struct hv_device *dev)
HV_VMBUS_PACKET_TYPE_DATA_IN_BAND,
HV_VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED);
- if (ret != 0) {
+ if (ret != 0)
goto cleanup;
- }
-
- ret = sema_timedwait(&request->synch_sema, 500); /* KYS 5 seconds */
- if (ret != 0) {
+ /* wait 5 seconds */
+ ret = sema_timedwait(&request->synch_sema, 5 * hz);
+ if (ret != 0)
goto cleanup;
- }
if (vstor_packet->operation != VSTOR_OPERATION_COMPLETEIO ||
vstor_packet->status != 0) {
@@ -321,7 +472,8 @@ hv_storvsc_channel_init(struct hv_device *dev)
vstor_packet->operation = VSTOR_OPERATION_QUERYPROTOCOLVERSION;
vstor_packet->flags = REQUEST_COMPLETION_FLAG;
- vstor_packet->u.version.major_minor = VMSTOR_PROTOCOL_VERSION_CURRENT;
+ vstor_packet->u.version.major_minor =
+ VMSTOR_PROTOCOL_VERSION(storvsc_current_major, storvsc_current_minor);
/* revision is only significant for Windows guests */
vstor_packet->u.version.revision = 0;
@@ -334,21 +486,19 @@ hv_storvsc_channel_init(struct hv_device *dev)
HV_VMBUS_PACKET_TYPE_DATA_IN_BAND,
HV_VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED);
- if (ret != 0) {
+ if (ret != 0)
goto cleanup;
- }
- ret = sema_timedwait(&request->synch_sema, 500); /* KYS 5 seconds */
+ /* wait 5 seconds */
+ ret = sema_timedwait(&request->synch_sema, 5 * hz);
- if (ret) {
+ if (ret)
goto cleanup;
- }
/* TODO: Check returned version */
if (vstor_packet->operation != VSTOR_OPERATION_COMPLETEIO ||
- vstor_packet->status != 0) {
+ vstor_packet->status != 0)
goto cleanup;
- }
/**
* Query channel properties
@@ -365,22 +515,30 @@ hv_storvsc_channel_init(struct hv_device *dev)
HV_VMBUS_PACKET_TYPE_DATA_IN_BAND,
HV_VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED);
- if ( ret != 0) {
+ if ( ret != 0)
goto cleanup;
- }
- ret = sema_timedwait(&request->synch_sema, 500); /* KYS 5 seconds */
+ /* wait 5 seconds */
+ ret = sema_timedwait(&request->synch_sema, 5 * hz);
- if (ret != 0) {
+ if (ret != 0)
goto cleanup;
- }
/* TODO: Check returned version */
if (vstor_packet->operation != VSTOR_OPERATION_COMPLETEIO ||
- vstor_packet->status != 0) {
+ vstor_packet->status != 0) {
goto cleanup;
}
+ /* multi-channels feature is supported by WIN8 and above version */
+ max_chans = vstor_packet->u.chan_props.max_channel_cnt;
+ if ((hv_vmbus_protocal_version != HV_VMBUS_VERSION_WIN7) &&
+ (hv_vmbus_protocal_version != HV_VMBUS_VERSION_WS2008) &&
+ (vstor_packet->u.chan_props.flags &
+ HV_STORAGE_SUPPORTS_MULTI_CHANNEL)) {
+ support_multichannel = TRUE;
+ }
+
memset(vstor_packet, 0, sizeof(struct vstor_packet));
vstor_packet->operation = VSTOR_OPERATION_ENDINITIALIZATION;
vstor_packet->flags = REQUEST_COMPLETION_FLAG;
@@ -397,16 +555,22 @@ hv_storvsc_channel_init(struct hv_device *dev)
goto cleanup;
}
- ret = sema_timedwait(&request->synch_sema, 500); /* KYS 5 seconds */
+ /* wait 5 seconds */
+ ret = sema_timedwait(&request->synch_sema, 5 * hz);
- if (ret != 0) {
+ if (ret != 0)
goto cleanup;
- }
if (vstor_packet->operation != VSTOR_OPERATION_COMPLETEIO ||
- vstor_packet->status != 0) {
+ vstor_packet->status != 0)
goto cleanup;
- }
+
+ /*
+ * If multi-channel is supported, send multichannel create
+ * request to host.
+ */
+ if (support_multichannel)
+ storvsc_send_multichannel_request(dev, max_chans);
cleanup:
sema_destroy(&request->synch_sema);
@@ -443,8 +607,7 @@ hv_storvsc_connect_vsp(struct hv_device *dev)
(void *)&props,
sizeof(struct vmstor_chan_props),
hv_storvsc_on_channel_callback,
- dev);
-
+ dev->channel);
if (ret != 0) {
return ret;
@@ -490,7 +653,7 @@ hv_storvsc_host_reset(struct hv_device *dev)
goto cleanup;
}
- ret = sema_timedwait(&request->synch_sema, 500); /* KYS 5 seconds */
+ ret = sema_timedwait(&request->synch_sema, 5 * hz); /* KYS 5 seconds */
if (ret) {
goto cleanup;
@@ -498,7 +661,7 @@ hv_storvsc_host_reset(struct hv_device *dev)
/*
- * At this point, all outstanding requests in the adapter
+ * At this point, all outstanding requests in the adapter
* should have been flushed out and return to us
*/
@@ -521,6 +684,7 @@ hv_storvsc_io_request(struct hv_device *device,
{
struct storvsc_softc *sc;
struct vstor_packet *vstor_packet = &request->vstor_packet;
+ struct hv_vmbus_channel* outgoing_channel = NULL;
int ret = 0;
sc = get_stor_device(device, TRUE);
@@ -539,19 +703,20 @@ hv_storvsc_io_request(struct hv_device *device,
vstor_packet->operation = VSTOR_OPERATION_EXECUTESRB;
+ outgoing_channel = vmbus_select_outgoing_channel(device->channel);
mtx_unlock(&request->softc->hs_lock);
if (request->data_buf.length) {
ret = hv_vmbus_channel_send_packet_multipagebuffer(
- device->channel,
+ outgoing_channel,
&request->data_buf,
- vstor_packet,
- sizeof(struct vstor_packet),
+ vstor_packet,
+ sizeof(struct vstor_packet),
(uint64_t)(uintptr_t)request);
} else {
ret = hv_vmbus_channel_send_packet(
- device->channel,
+ outgoing_channel,
vstor_packet,
sizeof(struct vstor_packet),
(uint64_t)(uintptr_t)request,
@@ -610,7 +775,8 @@ static void
hv_storvsc_on_channel_callback(void *context)
{
int ret = 0;
- struct hv_device *device = (struct hv_device *)context;
+ hv_vmbus_channel *channel = (hv_vmbus_channel *)context;
+ struct hv_device *device = NULL;
struct storvsc_softc *sc;
uint32_t bytes_recvd;
uint64_t request_id;
@@ -618,15 +784,22 @@ hv_storvsc_on_channel_callback(void *context)
struct hv_storvsc_request *request;
struct vstor_packet *vstor_packet;
+ if (channel->primary_channel != NULL){
+ device = channel->primary_channel->device;
+ } else {
+ device = channel->device;
+ }
+
+ KASSERT(device, ("device is NULL"));
+
sc = get_stor_device(device, FALSE);
if (sc == NULL) {
+ printf("Storvsc_error: get stor device failed.\n");
return;
}
- KASSERT(device, ("device"));
-
ret = hv_vmbus_channel_recv_packet(
- device->channel,
+ channel,
packet,
roundup2(sizeof(struct vstor_packet), 8),
&bytes_recvd,
@@ -634,21 +807,28 @@ hv_storvsc_on_channel_callback(void *context)
while ((ret == 0) && (bytes_recvd > 0)) {
request = (struct hv_storvsc_request *)(uintptr_t)request_id;
- KASSERT(request, ("request"));
if ((request == &sc->hs_init_req) ||
(request == &sc->hs_reset_req)) {
memcpy(&request->vstor_packet, packet,
sizeof(struct vstor_packet));
- sema_post(&request->synch_sema);
+ sema_post(&request->synch_sema);
} else {
vstor_packet = (struct vstor_packet *)packet;
switch(vstor_packet->operation) {
case VSTOR_OPERATION_COMPLETEIO:
+ if (request == NULL)
+ panic("VMBUS: storvsc received a "
+ "packet with NULL request id in "
+ "COMPLETEIO operation.");
+
hv_storvsc_on_iocompletion(sc,
vstor_packet, request);
break;
case VSTOR_OPERATION_REMOVEDEVICE:
+ case VSTOR_OPERATION_ENUMERATE_BUS:
+ printf("VMBUS: storvsc operation %d not "
+ "implemented.\n", vstor_packet->operation);
/* TODO: implement */
break;
default:
@@ -656,7 +836,7 @@ hv_storvsc_on_channel_callback(void *context)
}
}
ret = hv_vmbus_channel_recv_packet(
- device->channel,
+ channel,
packet,
roundup2(sizeof(struct vstor_packet), 8),
&bytes_recvd,
@@ -680,7 +860,16 @@ storvsc_probe(device_t dev)
{
int ata_disk_enable = 0;
int ret = ENXIO;
-
+
+ if ((HV_VMBUS_VERSION_WIN8 == hv_vmbus_protocal_version) ||
+ (HV_VMBUS_VERSION_WIN8_1 == hv_vmbus_protocal_version)){
+ storvsc_current_major = STORVSC_WIN8_MAJOR;
+ storvsc_current_minor = STORVSC_WIN8_MINOR;
+ } else {
+ storvsc_current_major = STORVSC_WIN7_MAJOR;
+ storvsc_current_minor = STORVSC_WIN7_MINOR;
+ }
+
switch (storvsc_get_storage_type(dev)) {
case DRIVER_BLKVSC:
if(bootverbose)
@@ -721,9 +910,11 @@ storvsc_attach(device_t dev)
enum hv_storage_type stor_type;
struct storvsc_softc *sc;
struct cam_devq *devq;
- int ret, i;
+ int ret, i, j;
struct hv_storvsc_request *reqp;
struct root_hold_token *root_mount_token = NULL;
+ struct hv_sgl_node *sgl_node = NULL;
+ void *tmp_buff = NULL;
/*
* We need to serialize storvsc attach calls.
@@ -764,8 +955,41 @@ storvsc_attach(device_t dev)
LIST_INSERT_HEAD(&sc->hs_free_list, reqp, link);
}
+ /* create sg-list page pool */
+ if (FALSE == g_hv_sgl_page_pool.is_init) {
+ g_hv_sgl_page_pool.is_init = TRUE;
+ LIST_INIT(&g_hv_sgl_page_pool.in_use_sgl_list);
+ LIST_INIT(&g_hv_sgl_page_pool.free_sgl_list);
+
+ /*
+ * Pre-create SG list, each SG list with
+ * HV_MAX_MULTIPAGE_BUFFER_COUNT segments, each
+ * segment has one page buffer
+ */
+ for (i = 0; i < STORVSC_MAX_IO_REQUESTS; i++) {
+ sgl_node = malloc(sizeof(struct hv_sgl_node),
+ M_DEVBUF, M_WAITOK|M_ZERO);
+
+ sgl_node->sgl_data =
+ sglist_alloc(HV_MAX_MULTIPAGE_BUFFER_COUNT,
+ M_WAITOK|M_ZERO);
+
+ for (j = 0; j < HV_MAX_MULTIPAGE_BUFFER_COUNT; j++) {
+ tmp_buff = malloc(PAGE_SIZE,
+ M_DEVBUF, M_WAITOK|M_ZERO);
+
+ sgl_node->sgl_data->sg_segs[j].ss_paddr =
+ (vm_paddr_t)tmp_buff;
+ }
+
+ LIST_INSERT_HEAD(&g_hv_sgl_page_pool.free_sgl_list,
+ sgl_node, link);
+ }
+ }
+
sc->hs_destroy = FALSE;
sc->hs_drain_notify = FALSE;
+ sc->hs_open_multi_channel = FALSE;
sema_init(&sc->hs_drain_sema, 0, "Store Drain Sema");
ret = hv_storvsc_connect_vsp(hv_dev);
@@ -834,6 +1058,20 @@ cleanup:
LIST_REMOVE(reqp, link);
free(reqp, M_DEVBUF);
}
+
+ while (!LIST_EMPTY(&g_hv_sgl_page_pool.free_sgl_list)) {
+ sgl_node = LIST_FIRST(&g_hv_sgl_page_pool.free_sgl_list);
+ LIST_REMOVE(sgl_node, link);
+ for (j = 0; j < HV_MAX_MULTIPAGE_BUFFER_COUNT; j++) {
+ if (NULL !=
+ (void*)sgl_node->sgl_data->sg_segs[j].ss_paddr) {
+ free((void*)sgl_node->sgl_data->sg_segs[j].ss_paddr, M_DEVBUF);
+ }
+ }
+ sglist_free(sgl_node->sgl_data);
+ free(sgl_node, M_DEVBUF);
+ }
+
return (ret);
}
@@ -853,6 +1091,8 @@ storvsc_detach(device_t dev)
struct storvsc_softc *sc = device_get_softc(dev);
struct hv_storvsc_request *reqp = NULL;
struct hv_device *hv_device = vmbus_get_devctx(dev);
+ struct hv_sgl_node *sgl_node = NULL;
+ int j = 0;
mtx_lock(&hv_device->channel->inbound_lock);
sc->hs_destroy = TRUE;
@@ -884,6 +1124,20 @@ storvsc_detach(device_t dev)
free(reqp, M_DEVBUF);
}
mtx_unlock(&sc->hs_lock);
+
+ while (!LIST_EMPTY(&g_hv_sgl_page_pool.free_sgl_list)) {
+ sgl_node = LIST_FIRST(&g_hv_sgl_page_pool.free_sgl_list);
+ LIST_REMOVE(sgl_node, link);
+ for (j = 0; j < HV_MAX_MULTIPAGE_BUFFER_COUNT; j++){
+ if (NULL !=
+ (void*)sgl_node->sgl_data->sg_segs[j].ss_paddr) {
+ free((void*)sgl_node->sgl_data->sg_segs[j].ss_paddr, M_DEVBUF);
+ }
+ }
+ sglist_free(sgl_node->sgl_data);
+ free(sgl_node, M_DEVBUF);
+ }
+
return (0);
}
@@ -939,7 +1193,7 @@ storvsc_timeout_test(struct hv_storvsc_request *reqp,
ticks, __func__, (ret == 0)?
"IO return detected" :
"IO return not detected");
- /*
+ /*
* Now both the timer handler and io done are running
* simultaneously. We want to confirm the io done always
* finishes after the timer handler exits. So reqp used by
@@ -1023,7 +1277,7 @@ storvsc_poll(struct cam_sim *sim)
mtx_assert(&sc->hs_lock, MA_OWNED);
mtx_unlock(&sc->hs_lock);
- hv_storvsc_on_channel_callback(sc->hs_dev);
+ hv_storvsc_on_channel_callback(sc->hs_dev->channel);
mtx_lock(&sc->hs_lock);
}
@@ -1151,9 +1405,13 @@ storvsc_action(struct cam_sim *sim, union ccb *ccb)
bzero(reqp, sizeof(struct hv_storvsc_request));
reqp->softc = sc;
-
- ccb->ccb_h.status |= CAM_SIM_QUEUED;
- create_storvsc_request(ccb, reqp);
+
+ ccb->ccb_h.status |= CAM_SIM_QUEUED;
+ if ((res = create_storvsc_request(ccb, reqp)) != 0) {
+ ccb->ccb_h.status = CAM_REQ_INVALID;
+ xpt_done(ccb);
+ return;
+ }
if (ccb->ccb_h.timeout != CAM_TIME_INFINITY) {
callout_init(&reqp->callout, CALLOUT_MPSAFE);
@@ -1194,6 +1452,212 @@ storvsc_action(struct cam_sim *sim, union ccb *ccb)
}
/**
+ * @brief destroy bounce buffer
+ *
+ * This function is responsible for destroy a Scatter/Gather list
+ * that create by storvsc_create_bounce_buffer()
+ *
+ * @param sgl- the Scatter/Gather need be destroy
+ * @param sg_count- page count of the SG list.
+ *
+ */
+static void
+storvsc_destroy_bounce_buffer(struct sglist *sgl)
+{
+ struct hv_sgl_node *sgl_node = NULL;
+
+ sgl_node = LIST_FIRST(&g_hv_sgl_page_pool.in_use_sgl_list);
+ LIST_REMOVE(sgl_node, link);
+ if (NULL == sgl_node) {
+ printf("storvsc error: not enough in use sgl\n");
+ return;
+ }
+ sgl_node->sgl_data = sgl;
+ LIST_INSERT_HEAD(&g_hv_sgl_page_pool.free_sgl_list, sgl_node, link);
+}
+
+/**
+ * @brief create bounce buffer
+ *
+ * This function is responsible for create a Scatter/Gather list,
+ * which hold several pages that can be aligned with page size.
+ *
+ * @param seg_count- SG-list segments count
+ * @param write - if WRITE_TYPE, set SG list page used size to 0,
+ * otherwise set used size to page size.
+ *
+ * return NULL if create failed
+ */
+static struct sglist *
+storvsc_create_bounce_buffer(uint16_t seg_count, int write)
+{
+ int i = 0;
+ struct sglist *bounce_sgl = NULL;
+ unsigned int buf_len = ((write == WRITE_TYPE) ? 0 : PAGE_SIZE);
+ struct hv_sgl_node *sgl_node = NULL;
+
+ /* get struct sglist from free_sgl_list */
+ sgl_node = LIST_FIRST(&g_hv_sgl_page_pool.free_sgl_list);
+ LIST_REMOVE(sgl_node, link);
+ if (NULL == sgl_node) {
+ printf("storvsc error: not enough free sgl\n");
+ return NULL;
+ }
+ bounce_sgl = sgl_node->sgl_data;
+ LIST_INSERT_HEAD(&g_hv_sgl_page_pool.in_use_sgl_list, sgl_node, link);
+
+ bounce_sgl->sg_maxseg = seg_count;
+
+ if (write == WRITE_TYPE)
+ bounce_sgl->sg_nseg = 0;
+ else
+ bounce_sgl->sg_nseg = seg_count;
+
+ for (i = 0; i < seg_count; i++)
+ bounce_sgl->sg_segs[i].ss_len = buf_len;
+
+ return bounce_sgl;
+}
+
+/**
+ * @brief copy data from SG list to bounce buffer
+ *
+ * This function is responsible for copy data from one SG list's segments
+ * to another SG list which used as bounce buffer.
+ *
+ * @param bounce_sgl - the destination SG list
+ * @param orig_sgl - the segment of the source SG list.
+ * @param orig_sgl_count - the count of segments.
+ * @param orig_sgl_count - indicate which segment need bounce buffer,
+ * set 1 means need.
+ *
+ */
+static void
+storvsc_copy_sgl_to_bounce_buf(struct sglist *bounce_sgl,
+ bus_dma_segment_t *orig_sgl,
+ unsigned int orig_sgl_count,
+ uint64_t seg_bits)
+{
+ int src_sgl_idx = 0;
+
+ for (src_sgl_idx = 0; src_sgl_idx < orig_sgl_count; src_sgl_idx++) {
+ if (seg_bits & (1 << src_sgl_idx)) {
+ memcpy((void*)bounce_sgl->sg_segs[src_sgl_idx].ss_paddr,
+ (void*)orig_sgl[src_sgl_idx].ds_addr,
+ orig_sgl[src_sgl_idx].ds_len);
+
+ bounce_sgl->sg_segs[src_sgl_idx].ss_len =
+ orig_sgl[src_sgl_idx].ds_len;
+ }
+ }
+}
+
+/**
+ * @brief copy data from SG list which used as bounce to another SG list
+ *
+ * This function is responsible for copy data from one SG list with bounce
+ * buffer to another SG list's segments.
+ *
+ * @param dest_sgl - the destination SG list's segments
+ * @param dest_sgl_count - the count of destination SG list's segment.
+ * @param src_sgl - the source SG list.
+ * @param seg_bits - indicate which segment used bounce buffer of src SG-list.
+ *
+ */
+void
+storvsc_copy_from_bounce_buf_to_sgl(bus_dma_segment_t *dest_sgl,
+ unsigned int dest_sgl_count,
+ struct sglist* src_sgl,
+ uint64_t seg_bits)
+{
+ int sgl_idx = 0;
+
+ for (sgl_idx = 0; sgl_idx < dest_sgl_count; sgl_idx++) {
+ if (seg_bits & (1 << sgl_idx)) {
+ memcpy((void*)(dest_sgl[sgl_idx].ds_addr),
+ (void*)(src_sgl->sg_segs[sgl_idx].ss_paddr),
+ src_sgl->sg_segs[sgl_idx].ss_len);
+ }
+ }
+}
+
+/**
+ * @brief check SG list with bounce buffer or not
+ *
+ * This function is responsible for check if need bounce buffer for SG list.
+ *
+ * @param sgl - the SG list's segments
+ * @param sg_count - the count of SG list's segment.
+ * @param bits - segmengs number that need bounce buffer
+ *
+ * return -1 if SG list needless bounce buffer
+ */
+static int
+storvsc_check_bounce_buffer_sgl(bus_dma_segment_t *sgl,
+ unsigned int sg_count,
+ uint64_t *bits)
+{
+ int i = 0;
+ int offset = 0;
+ uint64_t phys_addr = 0;
+ uint64_t tmp_bits = 0;
+ boolean_t found_hole = FALSE;
+ boolean_t pre_aligned = TRUE;
+
+ if (sg_count < 2){
+ return -1;
+ }
+
+ *bits = 0;
+
+ phys_addr = vtophys(sgl[0].ds_addr);
+ offset = phys_addr - trunc_page(phys_addr);
+
+ if (offset != 0) {
+ pre_aligned = FALSE;
+ tmp_bits |= 1;
+ }
+
+ for (i = 1; i < sg_count; i++) {
+ phys_addr = vtophys(sgl[i].ds_addr);
+ offset = phys_addr - trunc_page(phys_addr);
+
+ if (offset == 0) {
+ if (FALSE == pre_aligned){
+ /*
+ * This segment is aligned, if the previous
+ * one is not aligned, find a hole
+ */
+ found_hole = TRUE;
+ }
+ pre_aligned = TRUE;
+ } else {
+ tmp_bits |= 1 << i;
+ if (!pre_aligned) {
+ if (phys_addr != vtophys(sgl[i-1].ds_addr +
+ sgl[i-1].ds_len)) {
+ /*
+ * Check whether connect to previous
+ * segment,if not, find the hole
+ */
+ found_hole = TRUE;
+ }
+ } else {
+ found_hole = TRUE;
+ }
+ pre_aligned = FALSE;
+ }
+ }
+
+ if (!found_hole) {
+ return (-1);
+ } else {
+ *bits = tmp_bits;
+ return 0;
+ }
+}
+
+/**
* @brief Fill in a request structure based on a CAM control block
*
* Fills in a request structure based on the contents of a CAM control
@@ -1203,7 +1667,7 @@ storvsc_action(struct cam_sim *sim, union ccb *ccb)
* @param ccb pointer to a CAM contorl block
* @param reqp pointer to a request structure
*/
-static void
+static int
create_storvsc_request(union ccb *ccb, struct hv_storvsc_request *reqp)
{
struct ccb_scsiio *csio = &ccb->csio;
@@ -1211,6 +1675,7 @@ create_storvsc_request(union ccb *ccb, struct hv_storvsc_request *reqp)
uint32_t bytes_to_copy = 0;
uint32_t pfn_num = 0;
uint32_t pfn;
+ uint64_t not_aligned_seg_bits = 0;
/* refer to struct vmscsi_req for meanings of these two fields */
reqp->vstor_packet.u.vm_srb.port =
@@ -1231,48 +1696,172 @@ create_storvsc_request(union ccb *ccb, struct hv_storvsc_request *reqp)
}
switch (ccb->ccb_h.flags & CAM_DIR_MASK) {
- case CAM_DIR_OUT:
- reqp->vstor_packet.u.vm_srb.data_in = WRITE_TYPE;
- break;
- case CAM_DIR_IN:
- reqp->vstor_packet.u.vm_srb.data_in = READ_TYPE;
- break;
- case CAM_DIR_NONE:
- reqp->vstor_packet.u.vm_srb.data_in = UNKNOWN_TYPE;
- break;
- default:
- reqp->vstor_packet.u.vm_srb.data_in = UNKNOWN_TYPE;
- break;
+ case CAM_DIR_OUT:
+ reqp->vstor_packet.u.vm_srb.data_in = WRITE_TYPE;
+ break;
+ case CAM_DIR_IN:
+ reqp->vstor_packet.u.vm_srb.data_in = READ_TYPE;
+ break;
+ case CAM_DIR_NONE:
+ reqp->vstor_packet.u.vm_srb.data_in = UNKNOWN_TYPE;
+ break;
+ default:
+ reqp->vstor_packet.u.vm_srb.data_in = UNKNOWN_TYPE;
+ break;
}
reqp->sense_data = &csio->sense_data;
reqp->sense_info_len = csio->sense_len;
reqp->ccb = ccb;
- /*
- KASSERT((ccb->ccb_h.flags & CAM_SCATTER_VALID) == 0,
- ("ccb is scatter gather valid\n"));
- */
- if (csio->dxfer_len != 0) {
- reqp->data_buf.length = csio->dxfer_len;
+
+ if (0 == csio->dxfer_len) {
+ return (0);
+ }
+
+ reqp->data_buf.length = csio->dxfer_len;
+
+ switch (ccb->ccb_h.flags & CAM_DATA_MASK) {
+ case CAM_DATA_VADDR:
+ {
bytes_to_copy = csio->dxfer_len;
phys_addr = vtophys(csio->data_ptr);
- reqp->data_buf.offset = phys_addr - trunc_page(phys_addr);
+ reqp->data_buf.offset = phys_addr & PAGE_MASK;
+
+ while (bytes_to_copy != 0) {
+ int bytes, page_offset;
+ phys_addr =
+ vtophys(&csio->data_ptr[reqp->data_buf.length -
+ bytes_to_copy]);
+ pfn = phys_addr >> PAGE_SHIFT;
+ reqp->data_buf.pfn_array[pfn_num] = pfn;
+ page_offset = phys_addr & PAGE_MASK;
+
+ bytes = min(PAGE_SIZE - page_offset, bytes_to_copy);
+
+ bytes_to_copy -= bytes;
+ pfn_num++;
+ }
+ break;
}
- while (bytes_to_copy != 0) {
- int bytes, page_offset;
- phys_addr = vtophys(&csio->data_ptr[reqp->data_buf.length -
- bytes_to_copy]);
- pfn = phys_addr >> PAGE_SHIFT;
- reqp->data_buf.pfn_array[pfn_num] = pfn;
- page_offset = phys_addr - trunc_page(phys_addr);
+ case CAM_DATA_SG:
+ {
+ int i = 0;
+ int offset = 0;
+ int ret;
+
+ bus_dma_segment_t *storvsc_sglist =
+ (bus_dma_segment_t *)ccb->csio.data_ptr;
+ u_int16_t storvsc_sg_count = ccb->csio.sglist_cnt;
+
+ printf("Storvsc: get SG I/O operation, %d\n",
+ reqp->vstor_packet.u.vm_srb.data_in);
+
+ if (storvsc_sg_count > HV_MAX_MULTIPAGE_BUFFER_COUNT){
+ printf("Storvsc: %d segments is too much, "
+ "only support %d segments\n",
+ storvsc_sg_count, HV_MAX_MULTIPAGE_BUFFER_COUNT);
+ return (EINVAL);
+ }
+
+ /*
+ * We create our own bounce buffer function currently. Idealy
+ * we should use BUS_DMA(9) framework. But with current BUS_DMA
+ * code there is no callback API to check the page alignment of
+ * middle segments before busdma can decide if a bounce buffer
+ * is needed for particular segment. There is callback,
+ * "bus_dma_filter_t *filter", but the parrameters are not
+ * sufficient for storvsc driver.
+ * TODO:
+ * Add page alignment check in BUS_DMA(9) callback. Once
+ * this is complete, switch the following code to use
+ * BUS_DMA(9) for storvsc bounce buffer support.
+ */
+ /* check if we need to create bounce buffer */
+ ret = storvsc_check_bounce_buffer_sgl(storvsc_sglist,
+ storvsc_sg_count, &not_aligned_seg_bits);
+ if (ret != -1) {
+ reqp->bounce_sgl =
+ storvsc_create_bounce_buffer(storvsc_sg_count,
+ reqp->vstor_packet.u.vm_srb.data_in);
+ if (NULL == reqp->bounce_sgl) {
+ printf("Storvsc_error: "
+ "create bounce buffer failed.\n");
+ return (ENOMEM);
+ }
+
+ reqp->bounce_sgl_count = storvsc_sg_count;
+ reqp->not_aligned_seg_bits = not_aligned_seg_bits;
+
+ /*
+ * if it is write, we need copy the original data
+ *to bounce buffer
+ */
+ if (WRITE_TYPE == reqp->vstor_packet.u.vm_srb.data_in) {
+ storvsc_copy_sgl_to_bounce_buf(
+ reqp->bounce_sgl,
+ storvsc_sglist,
+ storvsc_sg_count,
+ reqp->not_aligned_seg_bits);
+ }
+
+ /* transfer virtual address to physical frame number */
+ if (reqp->not_aligned_seg_bits & 0x1){
+ phys_addr =
+ vtophys(reqp->bounce_sgl->sg_segs[0].ss_paddr);
+ }else{
+ phys_addr =
+ vtophys(storvsc_sglist[0].ds_addr);
+ }
+ reqp->data_buf.offset = phys_addr & PAGE_MASK;
+
+ pfn = phys_addr >> PAGE_SHIFT;
+ reqp->data_buf.pfn_array[0] = pfn;
+
+ for (i = 1; i < storvsc_sg_count; i++) {
+ if (reqp->not_aligned_seg_bits & (1 << i)) {
+ phys_addr =
+ vtophys(reqp->bounce_sgl->sg_segs[i].ss_paddr);
+ } else {
+ phys_addr =
+ vtophys(storvsc_sglist[i].ds_addr);
+ }
+
+ pfn = phys_addr >> PAGE_SHIFT;
+ reqp->data_buf.pfn_array[i] = pfn;
+ }
+ } else {
+ phys_addr = vtophys(storvsc_sglist[0].ds_addr);
+
+ reqp->data_buf.offset = phys_addr & PAGE_MASK;
- bytes = min(PAGE_SIZE - page_offset, bytes_to_copy);
+ for (i = 0; i < storvsc_sg_count; i++) {
+ phys_addr = vtophys(storvsc_sglist[i].ds_addr);
+ pfn = phys_addr >> PAGE_SHIFT;
+ reqp->data_buf.pfn_array[i] = pfn;
+ }
- bytes_to_copy -= bytes;
- pfn_num++;
+ /* check the last segment cross boundary or not */
+ offset = phys_addr & PAGE_MASK;
+ if (offset) {
+ phys_addr =
+ vtophys(storvsc_sglist[i-1].ds_addr +
+ PAGE_SIZE - offset);
+ pfn = phys_addr >> PAGE_SHIFT;
+ reqp->data_buf.pfn_array[i] = pfn;
+ }
+
+ reqp->bounce_sgl_count = 0;
+ }
+ break;
+ }
+ default:
+ printf("Unknow flags: %d\n", ccb->ccb_h.flags);
+ return(EINVAL);
}
+
+ return(0);
}
/**
@@ -1291,7 +1880,29 @@ storvsc_io_done(struct hv_storvsc_request *reqp)
struct ccb_scsiio *csio = &ccb->csio;
struct storvsc_softc *sc = reqp->softc;
struct vmscsi_req *vm_srb = &reqp->vstor_packet.u.vm_srb;
-
+ bus_dma_segment_t *ori_sglist = NULL;
+ int ori_sg_count = 0;
+
+ /* destroy bounce buffer if it is used */
+ if (reqp->bounce_sgl_count) {
+ ori_sglist = (bus_dma_segment_t *)ccb->csio.data_ptr;
+ ori_sg_count = ccb->csio.sglist_cnt;
+
+ /*
+ * If it is READ operation, we should copy back the data
+ * to original SG list.
+ */
+ if (READ_TYPE == reqp->vstor_packet.u.vm_srb.data_in) {
+ storvsc_copy_from_bounce_buf_to_sgl(ori_sglist,
+ ori_sg_count,
+ reqp->bounce_sgl,
+ reqp->not_aligned_seg_bits);
+ }
+
+ storvsc_destroy_bounce_buffer(reqp->bounce_sgl);
+ reqp->bounce_sgl_count = 0;
+ }
+
if (reqp->retries > 0) {
mtx_lock(&sc->hs_lock);
#if HVS_TIMEOUT_TEST
@@ -1309,7 +1920,7 @@ storvsc_io_done(struct hv_storvsc_request *reqp)
mtx_unlock(&sc->hs_lock);
}
- /*
+ /*
* callout_drain() will wait for the timer handler to finish
* if it is running. So we don't need any lock to synchronize
* between this routine and the timer handler.
diff --git a/sys/dev/hyperv/storvsc/hv_vstorage.h b/sys/dev/hyperv/storvsc/hv_vstorage.h
index 2632676..deb9183 100644
--- a/sys/dev/hyperv/storvsc/hv_vstorage.h
+++ b/sys/dev/hyperv/storvsc/hv_vstorage.h
@@ -53,7 +53,7 @@
* V1 RC > 2008/1/31 2.0
*/
-#define VMSTOR_PROTOCOL_VERSION_CURRENT VMSTOR_PROTOCOL_VERSION(2, 0)
+#define VMSTOR_PROTOCOL_VERSION_CURRENT VMSTOR_PROTOCOL_VERSION(5, 1)
/**
* Packet structure ops describing virtual storage requests.
@@ -69,7 +69,10 @@ enum vstor_packet_ops {
VSTOR_OPERATION_ENDINITIALIZATION = 8,
VSTOR_OPERATION_QUERYPROTOCOLVERSION = 9,
VSTOR_OPERATION_QUERYPROPERTIES = 10,
- VSTOR_OPERATION_MAXIMUM = 10
+ VSTOR_OPERATION_ENUMERATE_BUS = 11,
+ VSTOR_OPERATION_FCHBA_DATA = 12,
+ VSTOR_OPERATION_CREATE_MULTI_CHANNELS = 13,
+ VSTOR_OPERATION_MAXIMUM = 13
};
@@ -123,10 +126,12 @@ struct vmstor_chan_props {
uint8_t path_id;
uint8_t target_id;
+ uint16_t max_channel_cnt;
+
/**
* Note: port number is only really known on the client side
*/
- uint32_t port;
+ uint16_t port;
uint32_t flags;
uint32_t max_transfer_bytes;
@@ -193,6 +198,11 @@ struct vstor_packet {
* Used during version negotiations.
*/
struct vmstor_proto_ver version;
+
+ /**
+ * Number of multichannels to create
+ */
+ uint16_t multi_channels_cnt;
} u;
} __packed;
diff --git a/sys/dev/hyperv/utilities/hv_kvp.c b/sys/dev/hyperv/utilities/hv_kvp.c
index 848d364..4598510 100644
--- a/sys/dev/hyperv/utilities/hv_kvp.c
+++ b/sys/dev/hyperv/utilities/hv_kvp.c
@@ -55,6 +55,7 @@ __FBSDID("$FreeBSD$");
#include <sys/_null.h>
#include <sys/signal.h>
#include <sys/syslog.h>
+#include <sys/systm.h>
#include <sys/mutex.h>
#include <net/if_arp.h>
@@ -232,7 +233,7 @@ hv_kvp_negotiate_version(struct hv_vmbus_icmsg_hdr *icmsghdrp,
*/
if ((icframe_vercnt >= 2) && (negop->icversion_data[1].major == 3)) {
icframe_vercnt = 3;
- if (icmsg_vercnt >= 2)
+ if (icmsg_vercnt > 2)
icmsg_vercnt = 4;
else
icmsg_vercnt = 3;
@@ -734,8 +735,8 @@ hv_kvp_process_request(void *context)
recvlen = 0;
ret = hv_vmbus_channel_recv_packet(channel, kvp_buf, 2 * PAGE_SIZE,
&recvlen, &requestid);
- hv_kvp_log_info("%s: read: context %p, pending_cnt %ju ret =%d, recvlen=%d\n",
- __func__, context, pending_cnt, ret, recvlen);
+ hv_kvp_log_info("%s: read: context %p, pending_cnt %llu ret =%d, recvlen=%d\n",
+ __func__, context, (unsigned long long)pending_cnt, ret, recvlen);
}
}
@@ -813,9 +814,9 @@ static void
hv_kvp_dev_destroy(void)
{
- if (daemon_task != NULL) {
+ if (daemon_task != NULL) {
PROC_LOCK(daemon_task);
- kern_psignal(daemon_task, SIGKILL);
+ kern_psignal(daemon_task, SIGKILL);
PROC_UNLOCK(daemon_task);
}
diff --git a/sys/dev/hyperv/utilities/hv_util.c b/sys/dev/hyperv/utilities/hv_util.c
index 3e545cf..dc4b1e2 100644
--- a/sys/dev/hyperv/utilities/hv_util.c
+++ b/sys/dev/hyperv/utilities/hv_util.c
@@ -408,6 +408,15 @@ hv_util_attach(device_t dev)
}
}
+ /*
+ * These services are not performance critical and do not need
+ * batched reading. Furthermore, some services such as KVP can
+ * only handle one message from the host at a time.
+ * Turn off batched reading for all util drivers before we open the
+ * channel.
+ */
+ hv_set_channel_read_state(hv_dev->channel, FALSE);
+
ret = hv_vmbus_channel_open(hv_dev->channel, 4 * PAGE_SIZE,
4 * PAGE_SIZE, NULL, 0,
service->callback, hv_dev->channel);
diff --git a/sys/dev/hyperv/vmbus/hv_channel.c b/sys/dev/hyperv/vmbus/hv_channel.c
index 103260a..94137fb 100644
--- a/sys/dev/hyperv/vmbus/hv_channel.c
+++ b/sys/dev/hyperv/vmbus/hv_channel.c
@@ -75,7 +75,7 @@ vmbus_channel_set_event(hv_vmbus_channel *channel)
(uint32_t *)&monitor_page->
trigger_group[channel->monitor_group].u.pending);
} else {
- hv_vmbus_set_event(channel->offer_msg.child_rel_id);
+ hv_vmbus_set_event(channel);
}
}
@@ -99,6 +99,18 @@ hv_vmbus_channel_open(
hv_vmbus_channel_open_channel* open_msg;
hv_vmbus_channel_msg_info* open_info;
+ mtx_lock(&new_channel->sc_lock);
+ if (new_channel->state == HV_CHANNEL_OPEN_STATE) {
+ new_channel->state = HV_CHANNEL_OPENING_STATE;
+ } else {
+ mtx_unlock(&new_channel->sc_lock);
+ if(bootverbose)
+ printf("VMBUS: Trying to open channel <%p> which in "
+ "%d state.\n", new_channel, new_channel->state);
+ return (EINVAL);
+ }
+ mtx_unlock(&new_channel->sc_lock);
+
new_channel->on_channel_callback = pfn_on_channel_callback;
new_channel->channel_callback_context = context;
@@ -162,7 +174,7 @@ hv_vmbus_channel_open(
new_channel->ring_buffer_gpadl_handle;
open_msg->downstream_ring_buffer_page_offset = send_ring_buffer_size
>> PAGE_SHIFT;
- open_msg->server_context_area_gpadl_handle = 0;
+ open_msg->target_vcpu = new_channel->target_vcpu;
if (user_data_len)
memcpy(open_msg->user_data, user_data, user_data_len);
@@ -182,10 +194,14 @@ hv_vmbus_channel_open(
ret = sema_timedwait(&open_info->wait_sema, 500); /* KYS 5 seconds */
- if (ret)
+ if (ret) {
+ if(bootverbose)
+ printf("VMBUS: channel <%p> open timeout.\n", new_channel);
goto cleanup;
+ }
if (open_info->response.open_result.status == 0) {
+ new_channel->state = HV_CHANNEL_OPENED_STATE;
if(bootverbose)
printf("VMBUS: channel <%p> open success.\n", new_channel);
} else {
@@ -497,16 +513,20 @@ cleanup:
return (ret);
}
-/**
- * @brief Close the specified channel
- */
-void
-hv_vmbus_channel_close(hv_vmbus_channel *channel)
+static void
+hv_vmbus_channel_close_internal(hv_vmbus_channel *channel)
{
int ret = 0;
hv_vmbus_channel_close_channel* msg;
hv_vmbus_channel_msg_info* info;
+ channel->state = HV_CHANNEL_OPEN_STATE;
+ channel->sc_creation_callback = NULL;
+
+ /*
+ * Grab the lock to prevent race condition when a packet received
+ * and unloading driver is in the process.
+ */
mtx_lock(&channel->inbound_lock);
channel->on_channel_callback = NULL;
mtx_unlock(&channel->inbound_lock);
@@ -545,23 +565,37 @@ hv_vmbus_channel_close(hv_vmbus_channel *channel)
M_DEVBUF);
free(info, M_DEVBUF);
+}
+
+/**
+ * @brief Close the specified channel
+ */
+void
+hv_vmbus_channel_close(hv_vmbus_channel *channel)
+{
+ hv_vmbus_channel* sub_channel;
+
+ if (channel->primary_channel != NULL) {
+ /*
+ * We only close multi-channels when the primary is
+ * closed.
+ */
+ return;
+ }
/*
- * If we are closing the channel during an error path in
- * opening the channel, don't free the channel
- * since the caller will free the channel
+ * Close all multi-channels first.
*/
- if (channel->state == HV_CHANNEL_OPEN_STATE) {
- mtx_lock_spin(&hv_vmbus_g_connection.channel_lock);
- TAILQ_REMOVE(
- &hv_vmbus_g_connection.channel_anchor,
- channel,
- list_entry);
- mtx_unlock_spin(&hv_vmbus_g_connection.channel_lock);
-
- hv_vmbus_free_vmbus_channel(channel);
+ TAILQ_FOREACH(sub_channel, &channel->sc_list_anchor,
+ sc_list_entry) {
+ if (sub_channel->state != HV_CHANNEL_OPENED_STATE)
+ continue;
+ hv_vmbus_channel_close_internal(sub_channel);
}
-
+ /*
+ * Then close the primary channel.
+ */
+ hv_vmbus_channel_close_internal(channel);
}
/**
@@ -581,6 +615,7 @@ hv_vmbus_channel_send_packet(
uint32_t packet_len;
uint64_t aligned_data;
uint32_t packet_len_aligned;
+ boolean_t need_sig;
hv_vmbus_sg_buffer_list buffer_list[3];
packet_len = sizeof(hv_vm_packet_descriptor) + buffer_len;
@@ -604,12 +639,11 @@ hv_vmbus_channel_send_packet(
buffer_list[2].data = &aligned_data;
buffer_list[2].length = packet_len_aligned - packet_len;
- ret = hv_ring_buffer_write(&channel->outbound, buffer_list, 3);
+ ret = hv_ring_buffer_write(&channel->outbound, buffer_list, 3,
+ &need_sig);
/* TODO: We should determine if this is optional */
- if (ret == 0
- && !hv_vmbus_get_ring_buffer_interrupt_mask(
- &channel->outbound)) {
+ if (ret == 0 && need_sig) {
vmbus_channel_set_event(channel);
}
@@ -632,6 +666,7 @@ hv_vmbus_channel_send_packet_pagebuffer(
int ret = 0;
int i = 0;
+ boolean_t need_sig;
uint32_t packet_len;
uint32_t packetLen_aligned;
hv_vmbus_sg_buffer_list buffer_list[3];
@@ -675,11 +710,11 @@ hv_vmbus_channel_send_packet_pagebuffer(
buffer_list[2].data = &alignedData;
buffer_list[2].length = packetLen_aligned - packet_len;
- ret = hv_ring_buffer_write(&channel->outbound, buffer_list, 3);
+ ret = hv_ring_buffer_write(&channel->outbound, buffer_list, 3,
+ &need_sig);
/* TODO: We should determine if this is optional */
- if (ret == 0 &&
- !hv_vmbus_get_ring_buffer_interrupt_mask(&channel->outbound)) {
+ if (ret == 0 && need_sig) {
vmbus_channel_set_event(channel);
}
@@ -700,6 +735,7 @@ hv_vmbus_channel_send_packet_multipagebuffer(
int ret = 0;
uint32_t desc_size;
+ boolean_t need_sig;
uint32_t packet_len;
uint32_t packet_len_aligned;
uint32_t pfn_count;
@@ -750,11 +786,11 @@ hv_vmbus_channel_send_packet_multipagebuffer(
buffer_list[2].data = &aligned_data;
buffer_list[2].length = packet_len_aligned - packet_len;
- ret = hv_ring_buffer_write(&channel->outbound, buffer_list, 3);
+ ret = hv_ring_buffer_write(&channel->outbound, buffer_list, 3,
+ &need_sig);
/* TODO: We should determine if this is optional */
- if (ret == 0 &&
- !hv_vmbus_get_ring_buffer_interrupt_mask(&channel->outbound)) {
+ if (ret == 0 && need_sig) {
vmbus_channel_set_event(channel);
}
diff --git a/sys/dev/hyperv/vmbus/hv_channel_mgmt.c b/sys/dev/hyperv/vmbus/hv_channel_mgmt.c
index 011e305..783f6bc 100644
--- a/sys/dev/hyperv/vmbus/hv_channel_mgmt.c
+++ b/sys/dev/hyperv/vmbus/hv_channel_mgmt.c
@@ -50,6 +50,8 @@ static void vmbus_channel_on_gpadl_torndown(hv_vmbus_channel_msg_header* hdr);
static void vmbus_channel_on_offers_delivered(hv_vmbus_channel_msg_header* hdr);
static void vmbus_channel_on_version_response(hv_vmbus_channel_msg_header* hdr);
static void vmbus_channel_process_offer(void *context);
+struct hv_vmbus_channel*
+ vmbus_select_outgoing_channel(struct hv_vmbus_channel *promary);
/**
* Channel message dispatch table
@@ -233,6 +235,9 @@ hv_vmbus_allocate_channel(void)
return (NULL);
mtx_init(&channel->inbound_lock, "channel inbound", NULL, MTX_DEF);
+ mtx_init(&channel->sc_lock, "vmbus multi channel", NULL, MTX_DEF);
+
+ TAILQ_INIT(&channel->sc_list_anchor);
channel->control_work_queue = hv_work_queue_create("control");
@@ -262,6 +267,7 @@ ReleaseVmbusChannel(void *context)
void
hv_vmbus_free_vmbus_channel(hv_vmbus_channel* channel)
{
+ mtx_destroy(&channel->sc_lock);
mtx_destroy(&channel->inbound_lock);
/*
* We have to release the channel's workqueue/thread in
@@ -279,10 +285,10 @@ hv_vmbus_free_vmbus_channel(hv_vmbus_channel* channel)
static void
vmbus_channel_process_offer(void *context)
{
- int ret;
hv_vmbus_channel* new_channel;
boolean_t f_new;
hv_vmbus_channel* channel;
+ int ret;
new_channel = (hv_vmbus_channel*) context;
f_new = TRUE;
@@ -291,38 +297,76 @@ vmbus_channel_process_offer(void *context)
/*
* Make sure this is a new offer
*/
- mtx_lock_spin(&hv_vmbus_g_connection.channel_lock);
+ mtx_lock(&hv_vmbus_g_connection.channel_lock);
TAILQ_FOREACH(channel, &hv_vmbus_g_connection.channel_anchor,
list_entry)
{
- if (!memcmp(
- &channel->offer_msg.offer.interface_type,
- &new_channel->offer_msg.offer.interface_type,
- sizeof(hv_guid))
- && !memcmp(
- &channel->offer_msg.offer.interface_instance,
+ if (memcmp(&channel->offer_msg.offer.interface_type,
+ &new_channel->offer_msg.offer.interface_type,
+ sizeof(hv_guid)) == 0 &&
+ memcmp(&channel->offer_msg.offer.interface_instance,
&new_channel->offer_msg.offer.interface_instance,
- sizeof(hv_guid))) {
- f_new = FALSE;
- break;
- }
+ sizeof(hv_guid)) == 0) {
+ f_new = FALSE;
+ break;
+ }
}
if (f_new) {
- /* Insert at tail */
- TAILQ_INSERT_TAIL(
- &hv_vmbus_g_connection.channel_anchor,
- new_channel,
- list_entry);
+ /* Insert at tail */
+ TAILQ_INSERT_TAIL(
+ &hv_vmbus_g_connection.channel_anchor,
+ new_channel,
+ list_entry);
}
- mtx_unlock_spin(&hv_vmbus_g_connection.channel_lock);
+ mtx_unlock(&hv_vmbus_g_connection.channel_lock);
+
+ /*XXX add new channel to percpu_list */
if (!f_new) {
+ /*
+ * Check if this is a sub channel.
+ */
+ if (new_channel->offer_msg.offer.sub_channel_index != 0) {
+ /*
+ * It is a sub channel offer, process it.
+ */
+ new_channel->primary_channel = channel;
+ mtx_lock(&channel->sc_lock);
+ TAILQ_INSERT_TAIL(
+ &channel->sc_list_anchor,
+ new_channel,
+ sc_list_entry);
+ mtx_unlock(&channel->sc_lock);
+
+ /* Insert new channel into channel_anchor. */
+ printf("Storvsc get multi-channel offer, rel=%u.\n",
+ new_channel->offer_msg.child_rel_id);
+ mtx_lock(&hv_vmbus_g_connection.channel_lock);
+ TAILQ_INSERT_TAIL(&hv_vmbus_g_connection.channel_anchor,
+ new_channel, list_entry);
+ mtx_unlock(&hv_vmbus_g_connection.channel_lock);
+
+ if(bootverbose)
+ printf("VMBUS: new multi-channel offer <%p>.\n",
+ new_channel);
+
+ /*XXX add it to percpu_list */
+
+ new_channel->state = HV_CHANNEL_OPEN_STATE;
+ if (channel->sc_creation_callback != NULL) {
+ channel->sc_creation_callback(new_channel);
+ }
+ return;
+ }
+
hv_vmbus_free_vmbus_channel(new_channel);
return;
}
+ new_channel->state = HV_CHANNEL_OPEN_STATE;
+
/*
* Start the process of binding this offer to the driver
* (We need to set the device field before calling
@@ -333,35 +377,86 @@ vmbus_channel_process_offer(void *context)
new_channel->offer_msg.offer.interface_instance, new_channel);
/*
- * TODO - the HV_CHANNEL_OPEN_STATE flag should not be set below
- * but in the "open" channel request. The ret != 0 logic below
- * doesn't take into account that a channel
- * may have been opened successfully
- */
-
- /*
* Add the new device to the bus. This will kick off device-driver
* binding which eventually invokes the device driver's AddDevice()
* method.
*/
ret = hv_vmbus_child_device_register(new_channel->device);
if (ret != 0) {
- mtx_lock_spin(&hv_vmbus_g_connection.channel_lock);
- TAILQ_REMOVE(
- &hv_vmbus_g_connection.channel_anchor,
- new_channel,
- list_entry);
- mtx_unlock_spin(&hv_vmbus_g_connection.channel_lock);
- hv_vmbus_free_vmbus_channel(new_channel);
- } else {
- /*
- * This state is used to indicate a successful open
- * so that when we do close the channel normally,
- * we can clean up properly
- */
- new_channel->state = HV_CHANNEL_OPEN_STATE;
+ mtx_lock(&hv_vmbus_g_connection.channel_lock);
+ TAILQ_REMOVE(
+ &hv_vmbus_g_connection.channel_anchor,
+ new_channel,
+ list_entry);
+ mtx_unlock(&hv_vmbus_g_connection.channel_lock);
+ hv_vmbus_free_vmbus_channel(new_channel);
+ }
+}
+
+/**
+ * Array of device guids that are performance critical. We try to distribute
+ * the interrupt load for these devices across all online cpus.
+ */
+static const hv_guid high_perf_devices[] = {
+ {HV_NIC_GUID, },
+ {HV_IDE_GUID, },
+ {HV_SCSI_GUID, },
+};
+
+enum {
+ PERF_CHN_NIC = 0,
+ PERF_CHN_IDE,
+ PERF_CHN_SCSI,
+ MAX_PERF_CHN,
+};
+/*
+ * We use this static number to distribute the channel interrupt load.
+ */
+static uint32_t next_vcpu;
+
+/**
+ * Starting with Win8, we can statically distribute the incoming
+ * channel interrupt load by binding a channel to VCPU. We
+ * implement here a simple round robin scheme for distributing
+ * the interrupt load.
+ * We will bind channels that are not performance critical to cpu 0 and
+ * performance critical channels (IDE, SCSI and Network) will be uniformly
+ * distributed across all available CPUs.
+ */
+static void
+vmbus_channel_select_cpu(hv_vmbus_channel *channel, hv_guid *guid)
+{
+ uint32_t current_cpu;
+ int i;
+ boolean_t is_perf_channel = FALSE;
+
+ for (i = PERF_CHN_NIC; i < MAX_PERF_CHN; i++) {
+ if (memcmp(guid->data, high_perf_devices[i].data,
+ sizeof(hv_guid)) == 0) {
+ is_perf_channel = TRUE;
+ break;
+ }
+ }
+
+ if ((hv_vmbus_protocal_version == HV_VMBUS_VERSION_WS2008) ||
+ (hv_vmbus_protocal_version == HV_VMBUS_VERSION_WIN7) ||
+ (!is_perf_channel)) {
+ /* Host's view of guest cpu */
+ channel->target_vcpu = 0;
+ /* Guest's own view of cpu */
+ channel->target_cpu = 0;
+ return;
}
+ /* mp_ncpus should have the number cpus currently online */
+ current_cpu = (++next_vcpu % mp_ncpus);
+ channel->target_cpu = current_cpu;
+ channel->target_vcpu =
+ hv_vmbus_g_context.hv_vcpu_index[current_cpu];
+ if (bootverbose)
+ printf("VMBUS: Total online cpus %d, assign perf channel %d "
+ "to vcpu %d, cpu %d\n", mp_ncpus, i, channel->target_vcpu,
+ current_cpu);
}
/**
@@ -391,6 +486,38 @@ vmbus_channel_on_offer(hv_vmbus_channel_msg_header* hdr)
if (new_channel == NULL)
return;
+ /*
+ * By default we setup state to enable batched
+ * reading. A specific service can choose to
+ * disable this prior to opening the channel.
+ */
+ new_channel->batched_reading = TRUE;
+
+ new_channel->signal_event_param =
+ (hv_vmbus_input_signal_event *)
+ (HV_ALIGN_UP((unsigned long)
+ &new_channel->signal_event_buffer,
+ HV_HYPERCALL_PARAM_ALIGN));
+
+ new_channel->signal_event_param->connection_id.as_uint32_t = 0;
+ new_channel->signal_event_param->connection_id.u.id =
+ HV_VMBUS_EVENT_CONNECTION_ID;
+ new_channel->signal_event_param->flag_number = 0;
+ new_channel->signal_event_param->rsvd_z = 0;
+
+ if (hv_vmbus_protocal_version != HV_VMBUS_VERSION_WS2008) {
+ new_channel->is_dedicated_interrupt =
+ (offer->is_dedicated_interrupt != 0);
+ new_channel->signal_event_param->connection_id.u.id =
+ offer->connection_id;
+ }
+
+ /*
+ * Bind the channel to a chosen cpu.
+ */
+ vmbus_channel_select_cpu(new_channel,
+ &offer->offer.interface_type);
+
memcpy(&new_channel->offer_msg, offer,
sizeof(hv_vmbus_channel_offer_channel));
new_channel->monitor_group = (uint8_t) offer->monitor_id / 32;
@@ -666,7 +793,7 @@ hv_vmbus_release_unattached_channels(void)
{
hv_vmbus_channel *channel;
- mtx_lock_spin(&hv_vmbus_g_connection.channel_lock);
+ mtx_lock(&hv_vmbus_g_connection.channel_lock);
while (!TAILQ_EMPTY(&hv_vmbus_g_connection.channel_anchor)) {
channel = TAILQ_FIRST(&hv_vmbus_g_connection.channel_anchor);
@@ -676,5 +803,61 @@ hv_vmbus_release_unattached_channels(void)
hv_vmbus_child_device_unregister(channel->device);
hv_vmbus_free_vmbus_channel(channel);
}
- mtx_unlock_spin(&hv_vmbus_g_connection.channel_lock);
+ mtx_unlock(&hv_vmbus_g_connection.channel_lock);
+}
+
+/**
+ * @brief Select the best outgoing channel
+ *
+ * The channel whose vcpu binding is closest to the currect vcpu will
+ * be selected.
+ * If no multi-channel, always select primary channel
+ *
+ * @param primary - primary channel
+ */
+struct hv_vmbus_channel *
+vmbus_select_outgoing_channel(struct hv_vmbus_channel *primary)
+{
+ hv_vmbus_channel *new_channel = NULL;
+ hv_vmbus_channel *outgoing_channel = primary;
+ int old_cpu_distance = 0;
+ int new_cpu_distance = 0;
+ int cur_vcpu = 0;
+ int smp_pro_id = PCPU_GET(cpuid);
+
+ if (TAILQ_EMPTY(&primary->sc_list_anchor)) {
+ return outgoing_channel;
+ }
+
+ if (smp_pro_id >= MAXCPU) {
+ return outgoing_channel;
+ }
+
+ cur_vcpu = hv_vmbus_g_context.hv_vcpu_index[smp_pro_id];
+
+ TAILQ_FOREACH(new_channel, &primary->sc_list_anchor, sc_list_entry) {
+ if (new_channel->state != HV_CHANNEL_OPENED_STATE){
+ continue;
+ }
+
+ if (new_channel->target_vcpu == cur_vcpu){
+ return new_channel;
+ }
+
+ old_cpu_distance = ((outgoing_channel->target_vcpu > cur_vcpu) ?
+ (outgoing_channel->target_vcpu - cur_vcpu) :
+ (cur_vcpu - outgoing_channel->target_vcpu));
+
+ new_cpu_distance = ((new_channel->target_vcpu > cur_vcpu) ?
+ (new_channel->target_vcpu - cur_vcpu) :
+ (cur_vcpu - new_channel->target_vcpu));
+
+ if (old_cpu_distance < new_cpu_distance) {
+ continue;
+ }
+
+ outgoing_channel = new_channel;
+ }
+
+ return(outgoing_channel);
}
diff --git a/sys/dev/hyperv/vmbus/hv_connection.c b/sys/dev/hyperv/vmbus/hv_connection.c
index c8e0b48..0300828 100644
--- a/sys/dev/hyperv/vmbus/hv_connection.c
+++ b/sys/dev/hyperv/vmbus/hv_connection.c
@@ -45,14 +45,113 @@ hv_vmbus_connection hv_vmbus_g_connection =
{ .connect_state = HV_DISCONNECTED,
.next_gpadl_handle = 0xE1E10, };
+uint32_t hv_vmbus_protocal_version = HV_VMBUS_VERSION_WS2008;
+
+static uint32_t
+hv_vmbus_get_next_version(uint32_t current_ver)
+{
+ switch (current_ver) {
+ case (HV_VMBUS_VERSION_WIN7):
+ return(HV_VMBUS_VERSION_WS2008);
+
+ case (HV_VMBUS_VERSION_WIN8):
+ return(HV_VMBUS_VERSION_WIN7);
+
+ case (HV_VMBUS_VERSION_WIN8_1):
+ return(HV_VMBUS_VERSION_WIN8);
+
+ case (HV_VMBUS_VERSION_WS2008):
+ default:
+ return(HV_VMBUS_VERSION_INVALID);
+ }
+}
+
+/**
+ * Negotiate the highest supported hypervisor version.
+ */
+static int
+hv_vmbus_negotiate_version(hv_vmbus_channel_msg_info *msg_info,
+ uint32_t version)
+{
+ int ret = 0;
+ hv_vmbus_channel_initiate_contact *msg;
+
+ sema_init(&msg_info->wait_sema, 0, "Msg Info Sema");
+ msg = (hv_vmbus_channel_initiate_contact*) msg_info->msg;
+
+ msg->header.message_type = HV_CHANNEL_MESSAGE_INITIATED_CONTACT;
+ msg->vmbus_version_requested = version;
+
+ msg->interrupt_page = hv_get_phys_addr(
+ hv_vmbus_g_connection.interrupt_page);
+
+ msg->monitor_page_1 = hv_get_phys_addr(
+ hv_vmbus_g_connection.monitor_pages);
+
+ msg->monitor_page_2 =
+ hv_get_phys_addr(
+ ((uint8_t *) hv_vmbus_g_connection.monitor_pages
+ + PAGE_SIZE));
+
+ /**
+ * Add to list before we send the request since we may receive the
+ * response before returning from this routine
+ */
+ mtx_lock_spin(&hv_vmbus_g_connection.channel_msg_lock);
+
+ TAILQ_INSERT_TAIL(
+ &hv_vmbus_g_connection.channel_msg_anchor,
+ msg_info,
+ msg_list_entry);
+
+ mtx_unlock_spin(&hv_vmbus_g_connection.channel_msg_lock);
+
+ ret = hv_vmbus_post_message(
+ msg,
+ sizeof(hv_vmbus_channel_initiate_contact));
+
+ if (ret != 0) {
+ mtx_lock_spin(&hv_vmbus_g_connection.channel_msg_lock);
+ TAILQ_REMOVE(
+ &hv_vmbus_g_connection.channel_msg_anchor,
+ msg_info,
+ msg_list_entry);
+ mtx_unlock_spin(&hv_vmbus_g_connection.channel_msg_lock);
+ return (ret);
+ }
+
+ /**
+ * Wait for the connection response
+ */
+ ret = sema_timedwait(&msg_info->wait_sema, 500); /* KYS 5 seconds */
+
+ mtx_lock_spin(&hv_vmbus_g_connection.channel_msg_lock);
+ TAILQ_REMOVE(
+ &hv_vmbus_g_connection.channel_msg_anchor,
+ msg_info,
+ msg_list_entry);
+ mtx_unlock_spin(&hv_vmbus_g_connection.channel_msg_lock);
+
+ /**
+ * Check if successful
+ */
+ if (msg_info->response.version_response.version_supported) {
+ hv_vmbus_g_connection.connect_state = HV_CONNECTED;
+ } else {
+ ret = ECONNREFUSED;
+ }
+
+ return (ret);
+}
+
/**
* Send a connect request on the partition service connection
*/
int
hv_vmbus_connect(void) {
int ret = 0;
+ uint32_t version;
hv_vmbus_channel_msg_info* msg_info = NULL;
- hv_vmbus_channel_initiate_contact* msg;
/**
* Make sure we are not connecting or connected
@@ -74,7 +173,7 @@ hv_vmbus_connect(void) {
TAILQ_INIT(&hv_vmbus_g_connection.channel_anchor);
mtx_init(&hv_vmbus_g_connection.channel_lock, "vmbus channel",
- NULL, MTX_SPIN);
+ NULL, MTX_DEF);
/**
* Setup the vmbus event connection for channel interrupt abstraction
@@ -130,71 +229,30 @@ hv_vmbus_connect(void) {
goto cleanup;
}
- sema_init(&msg_info->wait_sema, 0, "Msg Info Sema");
- msg = (hv_vmbus_channel_initiate_contact*) msg_info->msg;
-
- msg->header.message_type = HV_CHANNEL_MESSAGE_INITIATED_CONTACT;
- msg->vmbus_version_requested = HV_VMBUS_REVISION_NUMBER;
-
- msg->interrupt_page = hv_get_phys_addr(
- hv_vmbus_g_connection.interrupt_page);
-
- msg->monitor_page_1 = hv_get_phys_addr(
- hv_vmbus_g_connection.monitor_pages);
-
- msg->monitor_page_2 =
- hv_get_phys_addr(
- ((uint8_t *) hv_vmbus_g_connection.monitor_pages
- + PAGE_SIZE));
-
- /**
- * Add to list before we send the request since we may receive the
- * response before returning from this routine
+ /*
+ * Find the highest vmbus version number we can support.
*/
- mtx_lock_spin(&hv_vmbus_g_connection.channel_msg_lock);
-
- TAILQ_INSERT_TAIL(
- &hv_vmbus_g_connection.channel_msg_anchor,
- msg_info,
- msg_list_entry);
-
- mtx_unlock_spin(&hv_vmbus_g_connection.channel_msg_lock);
-
- ret = hv_vmbus_post_message(
- msg,
- sizeof(hv_vmbus_channel_initiate_contact));
-
- if (ret != 0) {
- mtx_lock_spin(&hv_vmbus_g_connection.channel_msg_lock);
- TAILQ_REMOVE(
- &hv_vmbus_g_connection.channel_msg_anchor,
- msg_info,
- msg_list_entry);
- mtx_unlock_spin(&hv_vmbus_g_connection.channel_msg_lock);
- goto cleanup;
- }
+ version = HV_VMBUS_VERSION_CURRENT;
+
+ do {
+ ret = hv_vmbus_negotiate_version(msg_info, version);
+ if (ret == EWOULDBLOCK) {
+ /*
+ * We timed out.
+ */
+ goto cleanup;
+ }
- /**
- * Wait for the connection response
- */
- ret = sema_timedwait(&msg_info->wait_sema, 500); /* KYS 5 seconds */
+ if (hv_vmbus_g_connection.connect_state == HV_CONNECTED)
+ break;
- mtx_lock_spin(&hv_vmbus_g_connection.channel_msg_lock);
- TAILQ_REMOVE(
- &hv_vmbus_g_connection.channel_msg_anchor,
- msg_info,
- msg_list_entry);
- mtx_unlock_spin(&hv_vmbus_g_connection.channel_msg_lock);
+ version = hv_vmbus_get_next_version(version);
+ } while (version != HV_VMBUS_VERSION_INVALID);
- /**
- * Check if successful
- */
- if (msg_info->response.version_response.version_supported) {
- hv_vmbus_g_connection.connect_state = HV_CONNECTED;
- } else {
- ret = ECONNREFUSED;
- goto cleanup;
- }
+ hv_vmbus_protocal_version = version;
+ if (bootverbose)
+ printf("VMBUS: Portocal Version: %d.%d\n",
+ version >> 16, version & 0xFFFF);
sema_destroy(&msg_info->wait_sema);
free(msg_info, M_DEVBUF);
@@ -286,7 +344,7 @@ hv_vmbus_get_channel_from_rel_id(uint32_t rel_id) {
* and channels are accessed without the need to take this lock or search
* the list.
*/
- mtx_lock_spin(&hv_vmbus_g_connection.channel_lock);
+ mtx_lock(&hv_vmbus_g_connection.channel_lock);
TAILQ_FOREACH(channel,
&hv_vmbus_g_connection.channel_anchor, list_entry) {
@@ -295,7 +353,7 @@ hv_vmbus_get_channel_from_rel_id(uint32_t rel_id) {
break;
}
}
- mtx_unlock_spin(&hv_vmbus_g_connection.channel_lock);
+ mtx_unlock(&hv_vmbus_g_connection.channel_lock);
return (foundChannel);
}
@@ -306,7 +364,10 @@ hv_vmbus_get_channel_from_rel_id(uint32_t rel_id) {
static void
VmbusProcessChannelEvent(uint32_t relid)
{
+ void* arg;
+ uint32_t bytes_to_read;
hv_vmbus_channel* channel;
+ boolean_t is_batched_reading;
/**
* Find the channel based on this relid and invokes
@@ -327,31 +388,98 @@ VmbusProcessChannelEvent(uint32_t relid)
* callback to NULL. This closes the window.
*/
- mtx_lock(&channel->inbound_lock);
+ /*
+ * Disable the lock due to newly added WITNESS check in r277723.
+ * Will seek other way to avoid race condition.
+ * -- whu
+ */
+ // mtx_lock(&channel->inbound_lock);
if (channel->on_channel_callback != NULL) {
- channel->on_channel_callback(channel->channel_callback_context);
+ arg = channel->channel_callback_context;
+ is_batched_reading = channel->batched_reading;
+ /*
+ * Optimize host to guest signaling by ensuring:
+ * 1. While reading the channel, we disable interrupts from
+ * host.
+ * 2. Ensure that we process all posted messages from the host
+ * before returning from this callback.
+ * 3. Once we return, enable signaling from the host. Once this
+ * state is set we check to see if additional packets are
+ * available to read. In this case we repeat the process.
+ */
+ do {
+ if (is_batched_reading)
+ hv_ring_buffer_read_begin(&channel->inbound);
+
+ channel->on_channel_callback(arg);
+
+ if (is_batched_reading)
+ bytes_to_read =
+ hv_ring_buffer_read_end(&channel->inbound);
+ else
+ bytes_to_read = 0;
+ } while (is_batched_reading && (bytes_to_read != 0));
}
- mtx_unlock(&channel->inbound_lock);
+ // mtx_unlock(&channel->inbound_lock);
}
+#ifdef HV_DEBUG_INTR
+extern uint32_t hv_intr_count;
+extern uint32_t hv_vmbus_swintr_event_cpu[MAXCPU];
+extern uint32_t hv_vmbus_intr_cpu[MAXCPU];
+#endif
+
/**
* Handler for events
*/
void
hv_vmbus_on_events(void *arg)
{
- int dword;
int bit;
+ int cpu;
+ int dword;
+ void *page_addr;
+ uint32_t* recv_interrupt_page = NULL;
int rel_id;
- int maxdword = HV_MAX_NUM_CHANNELS_SUPPORTED >> 5;
+ int maxdword;
+ hv_vmbus_synic_event_flags *event;
/* int maxdword = PAGE_SIZE >> 3; */
- /*
- * receive size is 1/2 page and divide that by 4 bytes
- */
-
- uint32_t* recv_interrupt_page =
- hv_vmbus_g_connection.recv_interrupt_page;
+ cpu = (int)(long)arg;
+ KASSERT(cpu <= mp_maxid, ("VMBUS: hv_vmbus_on_events: "
+ "cpu out of range!"));
+
+#ifdef HV_DEBUG_INTR
+ int i;
+ hv_vmbus_swintr_event_cpu[cpu]++;
+ if (hv_intr_count % 10000 == 0) {
+ printf("VMBUS: Total interrupt %d\n", hv_intr_count);
+ for (i = 0; i < mp_ncpus; i++)
+ printf("VMBUS: hw cpu[%d]: %d, event sw intr cpu[%d]: %d\n",
+ i, hv_vmbus_intr_cpu[i], i, hv_vmbus_swintr_event_cpu[i]);
+ }
+#endif
+
+ if ((hv_vmbus_protocal_version == HV_VMBUS_VERSION_WS2008) ||
+ (hv_vmbus_protocal_version == HV_VMBUS_VERSION_WIN7)) {
+ maxdword = HV_MAX_NUM_CHANNELS_SUPPORTED >> 5;
+ /*
+ * receive size is 1/2 page and divide that by 4 bytes
+ */
+ recv_interrupt_page =
+ hv_vmbus_g_connection.recv_interrupt_page;
+ } else {
+ /*
+ * On Host with Win8 or above, the event page can be
+ * checked directly to get the id of the channel
+ * that has the pending interrupt.
+ */
+ maxdword = HV_EVENT_FLAGS_DWORD_COUNT;
+ page_addr = hv_vmbus_g_context.syn_ic_event_page[cpu];
+ event = (hv_vmbus_synic_event_flags *)
+ page_addr + HV_VMBUS_MESSAGE_SINT;
+ recv_interrupt_page = event->flags32;
+ }
/*
* Check events
@@ -416,16 +544,16 @@ int hv_vmbus_post_message(void *buffer, size_t bufferLen) {
* Send an event notification to the parent
*/
int
-hv_vmbus_set_event(uint32_t child_rel_id) {
+hv_vmbus_set_event(hv_vmbus_channel *channel) {
int ret = 0;
+ uint32_t child_rel_id = channel->offer_msg.child_rel_id;
/* Each uint32_t represents 32 channels */
synch_set_bit(child_rel_id & 31,
(((uint32_t *)hv_vmbus_g_connection.send_interrupt_page
+ (child_rel_id >> 5))));
- ret = hv_vmbus_signal_event();
+ ret = hv_vmbus_signal_event(channel->signal_event_param);
return (ret);
}
-
diff --git a/sys/dev/hyperv/vmbus/hv_hv.c b/sys/dev/hyperv/vmbus/hv_hv.c
index 80a1f42..84e2a5e 100644
--- a/sys/dev/hyperv/vmbus/hv_hv.c
+++ b/sys/dev/hyperv/vmbus/hv_hv.c
@@ -67,8 +67,6 @@ static inline void do_cpuid_inline(unsigned int op, unsigned int *eax,
hv_vmbus_context hv_vmbus_g_context = {
.syn_ic_initialized = FALSE,
.hypercall_page = NULL,
- .signal_event_param = NULL,
- .signal_event_buffer = NULL,
};
static struct timecounter hv_timecounter = {
@@ -256,28 +254,6 @@ hv_vmbus_init(void)
hv_vmbus_g_context.hypercall_page = virt_addr;
- /*
- * Setup the global signal event param for the signal event hypercall
- */
- hv_vmbus_g_context.signal_event_buffer =
- malloc(sizeof(hv_vmbus_input_signal_event_buffer), M_DEVBUF,
- M_ZERO | M_NOWAIT);
- KASSERT(hv_vmbus_g_context.signal_event_buffer != NULL,
- ("Error VMBUS: Failed to allocate signal_event_buffer\n"));
- if (hv_vmbus_g_context.signal_event_buffer == NULL)
- goto cleanup;
-
- hv_vmbus_g_context.signal_event_param =
- (hv_vmbus_input_signal_event*)
- (HV_ALIGN_UP((unsigned long)
- hv_vmbus_g_context.signal_event_buffer,
- HV_HYPERCALL_PARAM_ALIGN));
- hv_vmbus_g_context.signal_event_param->connection_id.as_uint32_t = 0;
- hv_vmbus_g_context.signal_event_param->connection_id.u.id =
- HV_VMBUS_EVENT_CONNECTION_ID;
- hv_vmbus_g_context.signal_event_param->flag_number = 0;
- hv_vmbus_g_context.signal_event_param->rsvd_z = 0;
-
tc_init(&hv_timecounter); /* register virtual timecount */
return (0);
@@ -303,12 +279,6 @@ hv_vmbus_cleanup(void)
{
hv_vmbus_x64_msr_hypercall_contents hypercall_msr;
- if (hv_vmbus_g_context.signal_event_buffer != NULL) {
- free(hv_vmbus_g_context.signal_event_buffer, M_DEVBUF);
- hv_vmbus_g_context.signal_event_buffer = NULL;
- hv_vmbus_g_context.signal_event_param = NULL;
- }
-
if (hv_vmbus_g_context.guest_id == HV_FREEBSD_GUEST_ID) {
if (hv_vmbus_g_context.hypercall_page != NULL) {
hypercall_msr.as_uint64_t = 0;
@@ -370,13 +340,13 @@ hv_vmbus_post_msg_via_msg_ipc(
* event IPC. (This involves a hypercall.)
*/
hv_vmbus_status
-hv_vmbus_signal_event()
+hv_vmbus_signal_event(void *con_id)
{
hv_vmbus_status status;
status = hv_vmbus_do_hypercall(
HV_CALL_SIGNAL_EVENT,
- hv_vmbus_g_context.signal_event_param,
+ con_id,
0) & 0xFFFF;
return (status);
@@ -390,6 +360,7 @@ hv_vmbus_synic_init(void *arg)
{
int cpu;
+ uint64_t hv_vcpu_index;
hv_vmbus_synic_simp simp;
hv_vmbus_synic_siefp siefp;
hv_vmbus_synic_scontrol sctrl;
@@ -403,23 +374,14 @@ hv_vmbus_synic_init(void *arg)
return;
/*
- * KYS: Looks like we can only initialize on cpu0; don't we support
- * SMP guests?
- *
- * TODO: Need to add SMP support for FreeBSD V9
- */
-
- if (cpu != 0)
- return;
-
- /*
* TODO: Check the version
*/
version = rdmsr(HV_X64_MSR_SVERSION);
-
- hv_vmbus_g_context.syn_ic_msg_page[cpu] = setup_args->page_buffers[0];
- hv_vmbus_g_context.syn_ic_event_page[cpu] = setup_args->page_buffers[1];
+ hv_vmbus_g_context.syn_ic_msg_page[cpu] =
+ setup_args->page_buffers[2 * cpu];
+ hv_vmbus_g_context.syn_ic_event_page[cpu] =
+ setup_args->page_buffers[2 * cpu + 1];
/*
* Setup the Synic's message page
@@ -443,9 +405,10 @@ hv_vmbus_synic_init(void *arg)
wrmsr(HV_X64_MSR_SIEFP, siefp.as_uint64_t);
/*HV_SHARED_SINT_IDT_VECTOR + 0x20; */
+ shared_sint.as_uint64_t = 0;
shared_sint.u.vector = setup_args->vector;
shared_sint.u.masked = FALSE;
- shared_sint.u.auto_eoi = FALSE;
+ shared_sint.u.auto_eoi = TRUE;
wrmsr(HV_X64_MSR_SINT0 + HV_VMBUS_MESSAGE_SINT,
shared_sint.as_uint64_t);
@@ -458,6 +421,13 @@ hv_vmbus_synic_init(void *arg)
hv_vmbus_g_context.syn_ic_initialized = TRUE;
+ /*
+ * Set up the cpuid mapping from Hyper-V to FreeBSD.
+ * The array is indexed using FreeBSD cpuid.
+ */
+ hv_vcpu_index = rdmsr(HV_X64_MSR_VP_INDEX);
+ hv_vmbus_g_context.hv_vcpu_index[cpu] = (uint32_t)hv_vcpu_index;
+
return;
}
@@ -469,14 +439,10 @@ void hv_vmbus_synic_cleanup(void *arg)
hv_vmbus_synic_sint shared_sint;
hv_vmbus_synic_simp simp;
hv_vmbus_synic_siefp siefp;
- int cpu = PCPU_GET(cpuid);
if (!hv_vmbus_g_context.syn_ic_initialized)
return;
- if (cpu != 0)
- return; /* TODO: XXXKYS: SMP? */
-
shared_sint.as_uint64_t = rdmsr(
HV_X64_MSR_SINT0 + HV_VMBUS_MESSAGE_SINT);
diff --git a/sys/dev/hyperv/vmbus/hv_ring_buffer.c b/sys/dev/hyperv/vmbus/hv_ring_buffer.c
index f7c1965..5e4f52a 100644
--- a/sys/dev/hyperv/vmbus/hv_ring_buffer.c
+++ b/sys/dev/hyperv/vmbus/hv_ring_buffer.c
@@ -144,6 +144,69 @@ get_ring_buffer_indices(hv_vmbus_ring_buffer_info* ring_info)
return (uint64_t) ring_info->ring_buffer->write_index << 32;
}
+void
+hv_ring_buffer_read_begin(
+ hv_vmbus_ring_buffer_info* ring_info)
+{
+ ring_info->ring_buffer->interrupt_mask = 1;
+ mb();
+}
+
+uint32_t
+hv_ring_buffer_read_end(
+ hv_vmbus_ring_buffer_info* ring_info)
+{
+ uint32_t read, write;
+
+ ring_info->ring_buffer->interrupt_mask = 0;
+ mb();
+
+ /*
+ * Now check to see if the ring buffer is still empty.
+ * If it is not, we raced and we need to process new
+ * incoming messages.
+ */
+ get_ring_buffer_avail_bytes(ring_info, &read, &write);
+
+ return (read);
+}
+
+/*
+ * When we write to the ring buffer, check if the host needs to
+ * be signaled. Here is the details of this protocol:
+ *
+ * 1. The host guarantees that while it is draining the
+ * ring buffer, it will set the interrupt_mask to
+ * indicate it does not need to be interrupted when
+ * new data is placed.
+ *
+ * 2. The host guarantees that it will completely drain
+ * the ring buffer before exiting the read loop. Further,
+ * once the ring buffer is empty, it will clear the
+ * interrupt_mask and re-check to see if new data has
+ * arrived.
+ */
+static boolean_t
+hv_ring_buffer_needsig_on_write(
+ uint32_t old_write_location,
+ hv_vmbus_ring_buffer_info* rbi)
+{
+ mb();
+ if (rbi->ring_buffer->interrupt_mask)
+ return (FALSE);
+
+ /* Read memory barrier */
+ rmb();
+ /*
+ * This is the only case we need to signal when the
+ * ring transitions from being empty to non-empty.
+ */
+ if (old_write_location == rbi->ring_buffer->read_index)
+ return (TRUE);
+
+ return (FALSE);
+}
+
static uint32_t copy_to_ring_buffer(
hv_vmbus_ring_buffer_info* ring_info,
uint32_t start_write_offset,
@@ -204,11 +267,13 @@ int
hv_ring_buffer_write(
hv_vmbus_ring_buffer_info* out_ring_info,
hv_vmbus_sg_buffer_list sg_buffers[],
- uint32_t sg_buffer_count)
+ uint32_t sg_buffer_count,
+ boolean_t *need_sig)
{
int i = 0;
uint32_t byte_avail_to_write;
uint32_t byte_avail_to_read;
+ uint32_t old_write_location;
uint32_t total_bytes_to_write = 0;
volatile uint32_t next_write_location;
@@ -242,6 +307,8 @@ hv_ring_buffer_write(
*/
next_write_location = get_next_write_location(out_ring_info);
+ old_write_location = next_write_location;
+
for (i = 0; i < sg_buffer_count; i++) {
next_write_location = copy_to_ring_buffer(out_ring_info,
next_write_location, (char *) sg_buffers[i].data,
@@ -258,9 +325,9 @@ hv_ring_buffer_write(
(char *) &prev_indices, sizeof(uint64_t));
/*
- * Make sure we flush all writes before updating the writeIndex
+ * Full memory barrier before upding the write index.
*/
- wmb();
+ mb();
/*
* Now, update the write location
@@ -269,6 +336,9 @@ hv_ring_buffer_write(
mtx_unlock_spin(&out_ring_info->ring_lock);
+ *need_sig = hv_ring_buffer_needsig_on_write(old_write_location,
+ out_ring_info);
+
return (0);
}
diff --git a/sys/dev/hyperv/vmbus/hv_vmbus_drv_freebsd.c b/sys/dev/hyperv/vmbus/hv_vmbus_drv_freebsd.c
index ca28fd5..f9432c8 100644
--- a/sys/dev/hyperv/vmbus/hv_vmbus_drv_freebsd.c
+++ b/sys/dev/hyperv/vmbus/hv_vmbus_drv_freebsd.c
@@ -53,22 +53,17 @@ __FBSDID("$FreeBSD$");
#include <machine/stdarg.h>
#include <machine/intr_machdep.h>
+#include <machine/md_var.h>
+#include <machine/segments.h>
#include <sys/pcpu.h>
+#include <x86/apicvar.h>
#include "hv_vmbus_priv.h"
#define VMBUS_IRQ 0x5
-static struct intr_event *hv_msg_intr_event;
-static struct intr_event *hv_event_intr_event;
-static void *msg_swintr;
-static void *event_swintr;
static device_t vmbus_devp;
-static void *vmbus_cookiep;
-static int vmbus_rid;
-struct resource *intr_res;
-static int vmbus_irq = VMBUS_IRQ;
static int vmbus_inited;
static hv_setup_args setup_args; /* only CPU 0 supported at this time */
@@ -77,14 +72,17 @@ static hv_setup_args setup_args; /* only CPU 0 supported at this time */
* the hypervisor.
*/
static void
-vmbus_msg_swintr(void *dummy)
+vmbus_msg_swintr(void *arg)
{
int cpu;
void* page_addr;
hv_vmbus_message* msg;
hv_vmbus_message* copied;
- cpu = PCPU_GET(cpuid);
+ cpu = (int)(long)arg;
+ KASSERT(cpu <= mp_maxid, ("VMBUS: vmbus_msg_swintr: "
+ "cpu out of range!"));
+
page_addr = hv_vmbus_g_context.syn_ic_msg_page[cpu];
msg = (hv_vmbus_message*) page_addr + HV_VMBUS_MESSAGE_SINT;
@@ -130,17 +128,8 @@ vmbus_msg_swintr(void *dummy)
*
* The purpose of this routine is to determine the type of VMBUS protocol
* message to process - an event or a channel message.
- * As this is an interrupt filter routine, the function runs in a very
- * restricted envinronment. From the manpage for bus_setup_intr(9)
- *
- * In this restricted environment, care must be taken to account for all
- * races. A careful analysis of races should be done as well. It is gener-
- * ally cheaper to take an extra interrupt, for example, than to protect
- * variables with spinlocks. Read, modify, write cycles of hardware regis-
- * ters need to be carefully analyzed if other threads are accessing the
- * same registers.
*/
-static int
+static inline int
hv_vmbus_isr(void *unused)
{
int cpu;
@@ -149,8 +138,6 @@ hv_vmbus_isr(void *unused)
void* page_addr;
cpu = PCPU_GET(cpuid);
- /* (Temporary limit) */
- KASSERT(cpu == 0, ("hv_vmbus_isr: Interrupt on CPU other than zero"));
/*
* The Windows team has advised that we check for events
@@ -162,9 +149,21 @@ hv_vmbus_isr(void *unused)
event = (hv_vmbus_synic_event_flags*)
page_addr + HV_VMBUS_MESSAGE_SINT;
- /* Since we are a child, we only need to check bit 0 */
- if (synch_test_and_clear_bit(0, &event->flags32[0])) {
- swi_sched(event_swintr, 0);
+ if ((hv_vmbus_protocal_version == HV_VMBUS_VERSION_WS2008) ||
+ (hv_vmbus_protocal_version == HV_VMBUS_VERSION_WIN7)) {
+ /* Since we are a child, we only need to check bit 0 */
+ if (synch_test_and_clear_bit(0, &event->flags32[0])) {
+ swi_sched(hv_vmbus_g_context.event_swintr[cpu], 0);
+ }
+ } else {
+ /*
+ * On host with Win8 or above, we can directly look at
+ * the event page. If bit n is set, we have an interrupt
+ * on the channel with id n.
+ * Directly schedule the event software interrupt on
+ * current cpu.
+ */
+ swi_sched(hv_vmbus_g_context.event_swintr[cpu], 0);
}
/* Check if there are actual msgs to be process */
@@ -172,12 +171,47 @@ hv_vmbus_isr(void *unused)
msg = (hv_vmbus_message*) page_addr + HV_VMBUS_MESSAGE_SINT;
if (msg->header.message_type != HV_MESSAGE_TYPE_NONE) {
- swi_sched(msg_swintr, 0);
+ swi_sched(hv_vmbus_g_context.msg_swintr[cpu], 0);
}
return FILTER_HANDLED;
}
+#ifdef HV_DEBUG_INTR
+uint32_t hv_intr_count = 0;
+#endif
+uint32_t hv_vmbus_swintr_event_cpu[MAXCPU];
+uint32_t hv_vmbus_intr_cpu[MAXCPU];
+
+void
+hv_vector_handler(struct trapframe *trap_frame)
+{
+#ifdef HV_DEBUG_INTR
+ int cpu;
+#endif
+
+ /*
+ * Disable preemption.
+ */
+ critical_enter();
+
+#ifdef HV_DEBUG_INTR
+ /*
+ * Do a little interrupt counting.
+ */
+ cpu = PCPU_GET(cpuid);
+ hv_vmbus_intr_cpu[cpu]++;
+ hv_intr_count++;
+#endif
+
+ hv_vmbus_isr(NULL);
+
+ /*
+ * Enable preemption.
+ */
+ critical_exit();
+}
+
static int
vmbus_read_ivar(
device_t dev,
@@ -316,6 +350,81 @@ vmbus_probe(device_t dev) {
return (BUS_PROBE_NOWILDCARD);
}
+#ifdef HYPERV
+extern inthand_t IDTVEC(rsvd), IDTVEC(hv_vmbus_callback);
+
+/**
+ * @brief Find a free IDT slot and setup the interrupt handler.
+ */
+static int
+vmbus_vector_alloc(void)
+{
+ int vector;
+ uintptr_t func;
+ struct gate_descriptor *ip;
+
+ /*
+ * Search backwards form the highest IDT vector available for use
+ * as vmbus channel callback vector. We install 'hv_vmbus_callback'
+ * handler at that vector and use it to interrupt vcpus.
+ */
+ vector = APIC_SPURIOUS_INT;
+ while (--vector >= APIC_IPI_INTS) {
+ ip = &idt[vector];
+ func = ((long)ip->gd_hioffset << 16 | ip->gd_looffset);
+ if (func == (uintptr_t)&IDTVEC(rsvd)) {
+#ifdef __i386__
+ setidt(vector , IDTVEC(hv_vmbus_callback), SDT_SYS386IGT,
+ SEL_KPL, GSEL(GCODE_SEL, SEL_KPL));
+#else
+ setidt(vector , IDTVEC(hv_vmbus_callback), SDT_SYSIGT,
+ SEL_KPL, 0);
+#endif
+
+ return (vector);
+ }
+ }
+ return (0);
+}
+
+/**
+ * @brief Restore the IDT slot to rsvd.
+ */
+static void
+vmbus_vector_free(int vector)
+{
+ uintptr_t func;
+ struct gate_descriptor *ip;
+
+ if (vector == 0)
+ return;
+
+ KASSERT(vector >= APIC_IPI_INTS && vector < APIC_SPURIOUS_INT,
+ ("invalid vector %d", vector));
+
+ ip = &idt[vector];
+ func = ((long)ip->gd_hioffset << 16 | ip->gd_looffset);
+ KASSERT(func == (uintptr_t)&IDTVEC(hv_vmbus_callback),
+ ("invalid vector %d", vector));
+
+ setidt(vector, IDTVEC(rsvd), SDT_SYSIGT, SEL_KPL, 0);
+}
+
+#else /* HYPERV */
+
+static int
+vmbus_vector_alloc(void)
+{
+ return(0);
+}
+
+static void
+vmbus_vector_free(int vector)
+{
+}
+
+#endif /* HYPERV */
+
/**
* @brief Main vmbus driver initialization routine.
*
@@ -331,22 +440,7 @@ vmbus_probe(device_t dev) {
static int
vmbus_bus_init(void)
{
- struct ioapic_intsrc {
- struct intsrc io_intsrc;
- u_int io_irq;
- u_int io_intpin:8;
- u_int io_vector:8;
- u_int io_cpu:8;
- u_int io_activehi:1;
- u_int io_edgetrigger:1;
- u_int io_masked:1;
- int io_bus:4;
- uint32_t io_lowreg;
- };
- int i, ret;
- unsigned int vector = 0;
- struct intsrc *isrc;
- struct ioapic_intsrc *intpin;
+ int i, j, n, ret;
if (vmbus_inited)
return (0);
@@ -361,80 +455,100 @@ vmbus_bus_init(void)
return (ret);
}
- ret = swi_add(&hv_msg_intr_event, "hv_msg", vmbus_msg_swintr,
- NULL, SWI_CLOCK, 0, &msg_swintr);
-
- if (ret)
- goto cleanup;
-
/*
- * Message SW interrupt handler checks a per-CPU page and
- * thus the thread needs to be bound to CPU-0 - which is where
- * all interrupts are processed.
+ * Find a free IDT slot for vmbus callback.
*/
- ret = intr_event_bind(hv_msg_intr_event, 0);
-
- if (ret)
- goto cleanup1;
+ hv_vmbus_g_context.hv_cb_vector = vmbus_vector_alloc();
- ret = swi_add(&hv_event_intr_event, "hv_event", hv_vmbus_on_events,
- NULL, SWI_CLOCK, 0, &event_swintr);
-
- if (ret)
- goto cleanup1;
+ if (hv_vmbus_g_context.hv_cb_vector == 0) {
+ if(bootverbose)
+ printf("Error VMBUS: Cannot find free IDT slot for "
+ "vmbus callback!\n");
+ goto cleanup;
+ }
- intr_res = bus_alloc_resource(vmbus_devp,
- SYS_RES_IRQ, &vmbus_rid, vmbus_irq, vmbus_irq, 1, RF_ACTIVE);
+ if(bootverbose)
+ printf("VMBUS: vmbus callback vector %d\n",
+ hv_vmbus_g_context.hv_cb_vector);
- if (intr_res == NULL) {
- ret = ENOMEM; /* XXXKYS: Need a better errno */
- goto cleanup2;
+ /*
+ * Notify the hypervisor of our vector.
+ */
+ setup_args.vector = hv_vmbus_g_context.hv_cb_vector;
+
+ CPU_FOREACH(j) {
+ hv_vmbus_intr_cpu[j] = 0;
+ hv_vmbus_swintr_event_cpu[j] = 0;
+ hv_vmbus_g_context.hv_event_intr_event[j] = NULL;
+ hv_vmbus_g_context.hv_msg_intr_event[j] = NULL;
+ hv_vmbus_g_context.event_swintr[j] = NULL;
+ hv_vmbus_g_context.msg_swintr[j] = NULL;
+
+ for (i = 0; i < 2; i++)
+ setup_args.page_buffers[2 * j + i] = NULL;
}
/*
- * Setup interrupt filter handler
+ * Per cpu setup.
*/
- ret = bus_setup_intr(vmbus_devp, intr_res,
- INTR_TYPE_NET | INTR_MPSAFE, hv_vmbus_isr, NULL,
- NULL, &vmbus_cookiep);
-
- if (ret != 0)
- goto cleanup3;
-
- ret = bus_bind_intr(vmbus_devp, intr_res, 0);
- if (ret != 0)
- goto cleanup4;
-
- isrc = intr_lookup_source(vmbus_irq);
- if ((isrc == NULL) || (isrc->is_event == NULL)) {
- ret = EINVAL;
- goto cleanup4;
- }
+ CPU_FOREACH(j) {
+ /*
+ * Setup software interrupt thread and handler for msg handling.
+ */
+ ret = swi_add(&hv_vmbus_g_context.hv_msg_intr_event[j],
+ "hv_msg", vmbus_msg_swintr, (void *)(long)j, SWI_CLOCK, 0,
+ &hv_vmbus_g_context.msg_swintr[j]);
+ if (ret) {
+ if(bootverbose)
+ printf("VMBUS: failed to setup msg swi for "
+ "cpu %d\n", j);
+ goto cleanup1;
+ }
- /* vector = isrc->is_event->ie_vector; */
- intpin = (struct ioapic_intsrc *)isrc;
- vector = intpin->io_vector;
+ /*
+ * Bind the swi thread to the cpu.
+ */
+ ret = intr_event_bind(hv_vmbus_g_context.hv_msg_intr_event[j],
+ j);
+ if (ret) {
+ if(bootverbose)
+ printf("VMBUS: failed to bind msg swi thread "
+ "to cpu %d\n", j);
+ goto cleanup1;
+ }
- if(bootverbose)
- printf("VMBUS: irq 0x%x vector 0x%x\n", vmbus_irq, vector);
+ /*
+ * Setup software interrupt thread and handler for
+ * event handling.
+ */
+ ret = swi_add(&hv_vmbus_g_context.hv_event_intr_event[j],
+ "hv_event", hv_vmbus_on_events, (void *)(long)j,
+ SWI_CLOCK, 0, &hv_vmbus_g_context.event_swintr[j]);
+ if (ret) {
+ if(bootverbose)
+ printf("VMBUS: failed to setup event swi for "
+ "cpu %d\n", j);
+ goto cleanup1;
+ }
- /**
- * Notify the hypervisor of our irq.
- */
- setup_args.vector = vector;
- for(i = 0; i < 2; i++) {
- setup_args.page_buffers[i] =
+ /*
+ * Prepare the per cpu msg and event pages to be called on each cpu.
+ */
+ for(i = 0; i < 2; i++) {
+ setup_args.page_buffers[2 * j + i] =
malloc(PAGE_SIZE, M_DEVBUF, M_NOWAIT | M_ZERO);
- if (setup_args.page_buffers[i] == NULL) {
- KASSERT(setup_args.page_buffers[i] != NULL,
+ if (setup_args.page_buffers[2 * j + i] == NULL) {
+ KASSERT(setup_args.page_buffers[2 * j + i] != NULL,
("Error VMBUS: malloc failed!"));
- if (i > 0)
- free(setup_args.page_buffers[0], M_DEVBUF);
- goto cleanup4;
+ goto cleanup1;
+ }
}
}
- /* only CPU #0 supported at this time */
+ if (bootverbose)
+ printf("VMBUS: Calling smp_rendezvous, smp_started = %d\n",
+ smp_started);
+
smp_rendezvous(NULL, hv_vmbus_synic_init, NULL, &setup_args);
/*
@@ -443,26 +557,32 @@ vmbus_bus_init(void)
ret = hv_vmbus_connect();
if (ret != 0)
- goto cleanup4;
+ goto cleanup1;
hv_vmbus_request_channel_offers();
return (ret);
- cleanup4:
-
+ cleanup1:
/*
- * remove swi, bus and intr resource
+ * Free pages alloc'ed
*/
- bus_teardown_intr(vmbus_devp, intr_res, vmbus_cookiep);
+ for (n = 0; n < 2 * MAXCPU; n++)
+ if (setup_args.page_buffers[n] != NULL)
+ free(setup_args.page_buffers[n], M_DEVBUF);
- cleanup3:
- bus_release_resource(vmbus_devp, SYS_RES_IRQ, vmbus_rid, intr_res);
-
- cleanup2:
- swi_remove(event_swintr);
+ /*
+ * remove swi and vmbus callback vector;
+ */
+ CPU_FOREACH(j) {
+ if (hv_vmbus_g_context.msg_swintr[j] != NULL)
+ swi_remove(hv_vmbus_g_context.msg_swintr[j]);
+ if (hv_vmbus_g_context.event_swintr[j] != NULL)
+ swi_remove(hv_vmbus_g_context.event_swintr[j]);
+ hv_vmbus_g_context.hv_msg_intr_event[j] = NULL;
+ hv_vmbus_g_context.hv_event_intr_event[j] = NULL;
+ }
- cleanup1:
- swi_remove(msg_swintr);
+ vmbus_vector_free(hv_vmbus_g_context.hv_cb_vector);
cleanup:
hv_vmbus_cleanup();
@@ -515,20 +635,24 @@ vmbus_bus_exit(void)
smp_rendezvous(NULL, hv_vmbus_synic_cleanup, NULL, NULL);
- for(i = 0; i < 2; i++) {
+ for(i = 0; i < 2 * MAXCPU; i++) {
if (setup_args.page_buffers[i] != 0)
free(setup_args.page_buffers[i], M_DEVBUF);
}
hv_vmbus_cleanup();
- /* remove swi, bus and intr resource */
- bus_teardown_intr(vmbus_devp, intr_res, vmbus_cookiep);
-
- bus_release_resource(vmbus_devp, SYS_RES_IRQ, vmbus_rid, intr_res);
+ /* remove swi */
+ CPU_FOREACH(i) {
+ if (hv_vmbus_g_context.msg_swintr[i] != NULL)
+ swi_remove(hv_vmbus_g_context.msg_swintr[i]);
+ if (hv_vmbus_g_context.event_swintr[i] != NULL)
+ swi_remove(hv_vmbus_g_context.event_swintr[i]);
+ hv_vmbus_g_context.hv_msg_intr_event[i] = NULL;
+ hv_vmbus_g_context.hv_event_intr_event[i] = NULL;
+ }
- swi_remove(msg_swintr);
- swi_remove(event_swintr);
+ vmbus_vector_free(hv_vmbus_g_context.hv_cb_vector);
return;
}
@@ -603,6 +727,6 @@ devclass_t vmbus_devclass;
DRIVER_MODULE(vmbus, nexus, vmbus_driver, vmbus_devclass, vmbus_modevent, 0);
MODULE_VERSION(vmbus,1);
-/* TODO: We want to be earlier than SI_SUB_VFS */
-SYSINIT(vmb_init, SI_SUB_VFS, SI_ORDER_MIDDLE, vmbus_init, NULL);
+/* We want to be started after SMP is initialized */
+SYSINIT(vmb_init, SI_SUB_SMP + 1, SI_ORDER_FIRST, vmbus_init, NULL);
diff --git a/sys/dev/hyperv/vmbus/hv_vmbus_priv.h b/sys/dev/hyperv/vmbus/hv_vmbus_priv.h
index 6bc875d..faa6dec 100644
--- a/sys/dev/hyperv/vmbus/hv_vmbus_priv.h
+++ b/sys/dev/hyperv/vmbus/hv_vmbus_priv.h
@@ -181,49 +181,30 @@ enum {
#define HV_HYPERCALL_PARAM_ALIGN sizeof(uint64_t)
-/*
- * Connection identifier type
- */
-typedef union {
- uint32_t as_uint32_t;
- struct {
- uint32_t id:24;
- uint32_t reserved:8;
- } u;
-
-} __packed hv_vmbus_connection_id;
-
-/*
- * Definition of the hv_vmbus_signal_event hypercall input structure
- */
-typedef struct {
- hv_vmbus_connection_id connection_id;
- uint16_t flag_number;
- uint16_t rsvd_z;
-} __packed hv_vmbus_input_signal_event;
-
-typedef struct {
- uint64_t align8;
- hv_vmbus_input_signal_event event;
-} __packed hv_vmbus_input_signal_event_buffer;
-
typedef struct {
uint64_t guest_id;
void* hypercall_page;
hv_bool_uint8_t syn_ic_initialized;
+
+ hv_vmbus_handle syn_ic_msg_page[MAXCPU];
+ hv_vmbus_handle syn_ic_event_page[MAXCPU];
/*
- * This is used as an input param to HV_CALL_SIGNAL_EVENT hypercall.
- * The input param is immutable in our usage and
- * must be dynamic mem (vs stack or global).
+ * For FreeBSD cpuid to Hyper-V vcpuid mapping.
*/
- hv_vmbus_input_signal_event_buffer *signal_event_buffer;
+ uint32_t hv_vcpu_index[MAXCPU];
/*
- * 8-bytes aligned of the buffer above
+ * Each cpu has its own software interrupt handler for channel
+ * event and msg handling.
*/
- hv_vmbus_input_signal_event *signal_event_param;
-
- hv_vmbus_handle syn_ic_msg_page[MAXCPU];
- hv_vmbus_handle syn_ic_event_page[MAXCPU];
+ struct intr_event *hv_event_intr_event[MAXCPU];
+ struct intr_event *hv_msg_intr_event[MAXCPU];
+ void *event_swintr[MAXCPU];
+ void *msg_swintr[MAXCPU];
+ /*
+ * Host use this vector to intrrupt guest for vmbus channel
+ * event and msg.
+ */
+ unsigned int hv_cb_vector;
} hv_vmbus_context;
/*
@@ -368,7 +349,8 @@ typedef struct {
TAILQ_HEAD(, hv_vmbus_channel_msg_info) channel_msg_anchor;
struct mtx channel_msg_lock;
/**
- * List of channels
+ * List of primary channels. Sub channels will be linked
+ * under their primary channel.
*/
TAILQ_HEAD(, hv_vmbus_channel) channel_anchor;
struct mtx channel_lock;
@@ -560,6 +542,8 @@ typedef union {
uint32_t flags32[HV_EVENT_FLAGS_DWORD_COUNT];
} hv_vmbus_synic_event_flags;
+/* MSR used to provide vcpu index */
+#define HV_X64_MSR_VP_INDEX (0x40000002)
/*
* Define synthetic interrupt controller model specific registers
@@ -618,7 +602,8 @@ void hv_ring_buffer_cleanup(
int hv_ring_buffer_write(
hv_vmbus_ring_buffer_info *ring_info,
hv_vmbus_sg_buffer_list sg_buffers[],
- uint32_t sg_buff_count);
+ uint32_t sg_buff_count,
+ boolean_t *need_sig);
int hv_ring_buffer_peek(
hv_vmbus_ring_buffer_info *ring_info,
@@ -638,6 +623,12 @@ void hv_vmbus_dump_ring_info(
hv_vmbus_ring_buffer_info *ring_info,
char *prefix);
+void hv_ring_buffer_read_begin(
+ hv_vmbus_ring_buffer_info *ring_info);
+
+uint32_t hv_ring_buffer_read_end(
+ hv_vmbus_ring_buffer_info *ring_info);
+
hv_vmbus_channel* hv_vmbus_allocate_channel(void);
void hv_vmbus_free_vmbus_channel(hv_vmbus_channel *channel);
void hv_vmbus_on_channel_message(void *context);
@@ -652,7 +643,7 @@ uint16_t hv_vmbus_post_msg_via_msg_ipc(
void *payload,
size_t payload_size);
-uint16_t hv_vmbus_signal_event(void);
+uint16_t hv_vmbus_signal_event(void *con_id);
void hv_vmbus_synic_init(void *irq_arg);
void hv_vmbus_synic_cleanup(void *arg);
int hv_vmbus_query_hypervisor_presence(void);
@@ -674,7 +665,7 @@ hv_vmbus_channel* hv_vmbus_get_channel_from_rel_id(uint32_t rel_id);
int hv_vmbus_connect(void);
int hv_vmbus_disconnect(void);
int hv_vmbus_post_message(void *buffer, size_t buf_size);
-int hv_vmbus_set_event(uint32_t child_rel_id);
+int hv_vmbus_set_event(hv_vmbus_channel *channel);
void hv_vmbus_on_events(void *);
@@ -718,7 +709,7 @@ static inline uint64_t hv_generate_guest_id(
typedef struct {
unsigned int vector;
- void *page_buffers[2];
+ void *page_buffers[2 * MAXCPU];
} hv_setup_args;
#endif /* __HYPERV_PRIV_H__ */
diff --git a/sys/dev/ichsmb/ichsmb_pci.c b/sys/dev/ichsmb/ichsmb_pci.c
index de0d074..ae8b179 100644
--- a/sys/dev/ichsmb/ichsmb_pci.c
+++ b/sys/dev/ichsmb/ichsmb_pci.c
@@ -86,9 +86,11 @@ __FBSDID("$FreeBSD$");
#define ID_CPT 0x1c228086
#define ID_PPT 0x1e228086
#define ID_AVOTON 0x1f3c8086
-#define ID_COLETOCRK 0x23B08086
+#define ID_COLETOCRK 0x23B08086
#define ID_LPT 0x8c228086
+#define ID_LPTLP 0x9c228086
#define ID_WCPT 0x8ca28086
+#define ID_WCPTLP 0x9ca28086
#define PCIS_SERIALBUS_SMBUS_PROGIF 0x00
@@ -198,9 +200,15 @@ ichsmb_pci_probe(device_t dev)
case ID_LPT:
device_set_desc(dev, "Intel Lynx Point SMBus controller");
break;
+ case ID_LPTLP:
+ device_set_desc(dev, "Intel Lynx Point-LP SMBus controller");
+ break;
case ID_WCPT:
device_set_desc(dev, "Intel Wildcat Point SMBus controller");
break;
+ case ID_WCPTLP:
+ device_set_desc(dev, "Intel Wildcat Point-LP SMBus controller");
+ break;
case ID_COLETOCRK:
device_set_desc(dev, "Intel Coleto Creek SMBus controller");
break;
diff --git a/sys/dev/iicbus/iic.c b/sys/dev/iicbus/iic.c
index 16d113ee..84e1314 100644
--- a/sys/dev/iicbus/iic.c
+++ b/sys/dev/iicbus/iic.c
@@ -37,6 +37,7 @@
#include <sys/sx.h>
#include <sys/systm.h>
#include <sys/uio.h>
+#include <sys/errno.h>
#include <dev/iicbus/iiconf.h>
#include <dev/iicbus/iicbus.h>
@@ -44,28 +45,32 @@
#include "iicbus_if.h"
-#define BUFSIZE 1024
-
struct iic_softc {
-
device_t sc_dev;
- u_char sc_addr; /* 7 bit address on iicbus */
- int sc_count; /* >0 if device opened */
-
- char sc_buffer[BUFSIZE]; /* output buffer */
- char sc_inbuf[BUFSIZE]; /* input buffer */
-
struct cdev *sc_devnode;
- struct sx sc_lock;
};
-#define IIC_LOCK(sc) sx_xlock(&(sc)->sc_lock)
-#define IIC_UNLOCK(sc) sx_xunlock(&(sc)->sc_lock)
+struct iic_cdevpriv {
+ struct sx lock;
+ struct iic_softc *sc;
+ bool started;
+ uint8_t addr;
+};
+
+
+#define IIC_LOCK(cdp) sx_xlock(&(cdp)->lock)
+#define IIC_UNLOCK(cdp) sx_xunlock(&(cdp)->lock)
+
+static MALLOC_DEFINE(M_IIC, "iic", "I2C device data");
static int iic_probe(device_t);
static int iic_attach(device_t);
static int iic_detach(device_t);
static void iic_identify(driver_t *driver, device_t parent);
+static void iicdtor(void *data);
+static int iicuio_move(struct iic_cdevpriv *priv, struct uio *uio, int last);
+static int iicuio(struct cdev *dev, struct uio *uio, int ioflag);
+static int iicrdwr(struct iic_cdevpriv *priv, struct iic_rdwr_data *d, int flags);
static devclass_t iic_devclass;
@@ -89,18 +94,13 @@ static driver_t iic_driver = {
};
static d_open_t iicopen;
-static d_close_t iicclose;
-static d_write_t iicwrite;
-static d_read_t iicread;
static d_ioctl_t iicioctl;
static struct cdevsw iic_cdevsw = {
.d_version = D_VERSION,
- .d_flags = D_TRACKCLOSE,
.d_open = iicopen,
- .d_close = iicclose,
- .d_read = iicread,
- .d_write = iicwrite,
+ .d_read = iicuio,
+ .d_write = iicuio,
.d_ioctl = iicioctl,
.d_name = "iic",
};
@@ -127,16 +127,15 @@ iic_probe(device_t dev)
static int
iic_attach(device_t dev)
{
- struct iic_softc *sc = (struct iic_softc *)device_get_softc(dev);
+ struct iic_softc *sc;
+ sc = device_get_softc(dev);
sc->sc_dev = dev;
- sx_init(&sc->sc_lock, "iic");
sc->sc_devnode = make_dev(&iic_cdevsw, device_get_unit(dev),
UID_ROOT, GID_WHEEL,
0600, "iic%d", device_get_unit(dev));
if (sc->sc_devnode == NULL) {
device_printf(dev, "failed to create character device\n");
- sx_destroy(&sc->sc_lock);
return (ENXIO);
}
sc->sc_devnode->si_drv1 = sc;
@@ -147,11 +146,12 @@ iic_attach(device_t dev)
static int
iic_detach(device_t dev)
{
- struct iic_softc *sc = (struct iic_softc *)device_get_softc(dev);
+ struct iic_softc *sc;
+
+ sc = device_get_softc(dev);
if (sc->sc_devnode)
destroy_dev(sc->sc_devnode);
- sx_destroy(&sc->sc_lock);
return (0);
}
@@ -159,238 +159,331 @@ iic_detach(device_t dev)
static int
iicopen(struct cdev *dev, int flags, int fmt, struct thread *td)
{
- struct iic_softc *sc = dev->si_drv1;
+ struct iic_cdevpriv *priv;
+ int error;
- IIC_LOCK(sc);
- if (sc->sc_count > 0) {
- IIC_UNLOCK(sc);
- return (EBUSY);
- }
+ priv = malloc(sizeof(*priv), M_IIC, M_WAITOK | M_ZERO);
- sc->sc_count++;
- IIC_UNLOCK(sc);
+ sx_init(&priv->lock, "iic");
+ priv->sc = dev->si_drv1;
- return (0);
+ error = devfs_set_cdevpriv(priv, iicdtor);
+ if (error != 0)
+ free(priv, M_IIC);
+
+ return (error);
}
-static int
-iicclose(struct cdev *dev, int flags, int fmt, struct thread *td)
+static void
+iicdtor(void *data)
{
- struct iic_softc *sc = dev->si_drv1;
+ device_t iicdev, parent;
+ struct iic_cdevpriv *priv;
- IIC_LOCK(sc);
- if (!sc->sc_count) {
- /* XXX: I don't think this can happen. */
- IIC_UNLOCK(sc);
- return (EINVAL);
- }
+ priv = data;
+ KASSERT(priv != NULL, ("iic cdevpriv should not be NULL!"));
- sc->sc_count--;
+ iicdev = priv->sc->sc_dev;
+ parent = device_get_parent(iicdev);
- if (sc->sc_count < 0)
- panic("%s: iic_count < 0!", __func__);
- IIC_UNLOCK(sc);
+ if (priv->started) {
+ iicbus_stop(parent);
+ iicbus_reset(parent, IIC_UNKNOWN, 0, NULL);
+ iicbus_release_bus(parent, iicdev);
+ }
- return (0);
+ sx_destroy(&priv->lock);
+ free(priv, M_IIC);
}
static int
-iicwrite(struct cdev *dev, struct uio * uio, int ioflag)
+iicuio_move(struct iic_cdevpriv *priv, struct uio *uio, int last)
{
- struct iic_softc *sc = dev->si_drv1;
- device_t iicdev = sc->sc_dev;
- int sent, error, count;
-
- IIC_LOCK(sc);
- if (!sc->sc_addr) {
- IIC_UNLOCK(sc);
- return (EINVAL);
+ device_t parent;
+ int error, num_bytes, transferred_bytes, written_bytes;
+ char buffer[128];
+
+ parent = device_get_parent(priv->sc->sc_dev);
+ error = 0;
+
+ /*
+ * We can only transfer up to sizeof(buffer) bytes in 1 shot, so loop until
+ * everything has been transferred.
+ */
+ while ((error == 0) && (uio->uio_resid > 0)) {
+
+ num_bytes = MIN(uio->uio_resid, sizeof(buffer));
+ transferred_bytes = 0;
+
+ if (uio->uio_rw == UIO_WRITE) {
+ error = uiomove(buffer, num_bytes, uio);
+
+ while ((error == 0) && (transferred_bytes < num_bytes)) {
+ written_bytes = 0;
+ error = iicbus_write(parent, &buffer[transferred_bytes],
+ num_bytes - transferred_bytes, &written_bytes, 0);
+ transferred_bytes += written_bytes;
+ }
+
+ } else if (uio->uio_rw == UIO_READ) {
+ error = iicbus_read(parent, buffer,
+ num_bytes, &transferred_bytes,
+ ((uio->uio_resid <= sizeof(buffer)) ? last : 0), 0);
+ if (error == 0)
+ error = uiomove(buffer, transferred_bytes, uio);
+ }
}
- if (sc->sc_count == 0) {
- /* XXX: I don't think this can happen. */
- IIC_UNLOCK(sc);
- return (EINVAL);
- }
+ return (error);
+}
- error = iicbus_request_bus(device_get_parent(iicdev), iicdev,
- IIC_DONTWAIT);
- if (error) {
- IIC_UNLOCK(sc);
+static int
+iicuio(struct cdev *dev, struct uio *uio, int ioflag)
+{
+ device_t parent;
+ struct iic_cdevpriv *priv;
+ int error;
+ uint8_t addr;
+
+ priv = NULL;
+ error = devfs_get_cdevpriv((void**)&priv);
+
+ if (error != 0)
return (error);
+ KASSERT(priv != NULL, ("iic cdevpriv should not be NULL!"));
+
+ IIC_LOCK(priv);
+ if (priv->started || (priv->addr == 0)) {
+ IIC_UNLOCK(priv);
+ return (ENXIO);
}
+ parent = device_get_parent(priv->sc->sc_dev);
- count = min(uio->uio_resid, BUFSIZE);
- error = uiomove(sc->sc_buffer, count, uio);
- if (error) {
- IIC_UNLOCK(sc);
+ error = iicbus_request_bus(parent, priv->sc->sc_dev,
+ (ioflag & O_NONBLOCK) ? IIC_DONTWAIT : (IIC_WAIT | IIC_INTR));
+ if (error != 0) {
+ IIC_UNLOCK(priv);
return (error);
}
- error = iicbus_block_write(device_get_parent(iicdev), sc->sc_addr,
- sc->sc_buffer, count, &sent);
+ if (uio->uio_rw == UIO_READ)
+ addr = priv->addr | LSB;
+ else
+ addr = priv->addr & ~LSB;
+
+ error = iicbus_start(parent, addr, 0);
+ if (error != 0)
+ {
+ iicbus_release_bus(parent, priv->sc->sc_dev);
+ IIC_UNLOCK(priv);
+ return (error);
+ }
- iicbus_release_bus(device_get_parent(iicdev), iicdev);
- IIC_UNLOCK(sc);
+ error = iicuio_move(priv, uio, IIC_LAST_READ);
+ iicbus_stop(parent);
+ iicbus_release_bus(parent, priv->sc->sc_dev);
+ IIC_UNLOCK(priv);
return (error);
}
static int
-iicread(struct cdev *dev, struct uio * uio, int ioflag)
+iicrdwr(struct iic_cdevpriv *priv, struct iic_rdwr_data *d, int flags)
{
- struct iic_softc *sc = dev->si_drv1;
- device_t iicdev = sc->sc_dev;
- int len, error = 0;
- int bufsize;
-
- IIC_LOCK(sc);
- if (!sc->sc_addr) {
- IIC_UNLOCK(sc);
- return (EINVAL);
- }
+ struct iic_msg *buf, *m;
+ void **usrbufs;
+ device_t iicdev, parent;
+ int error, i;
- if (sc->sc_count == 0) {
- /* XXX: I don't think this can happen. */
- IIC_UNLOCK(sc);
- return (EINVAL);
- }
+ iicdev = priv->sc->sc_dev;
+ parent = device_get_parent(iicdev);
+ error = 0;
- error = iicbus_request_bus(device_get_parent(iicdev), iicdev,
- IIC_DONTWAIT);
- if (error) {
- IIC_UNLOCK(sc);
- return (error);
- }
+ buf = malloc(sizeof(*d->msgs) * d->nmsgs, M_IIC, M_WAITOK);
- /* max amount of data to read */
- len = min(uio->uio_resid, BUFSIZE);
+ error = copyin(d->msgs, buf, sizeof(*d->msgs) * d->nmsgs);
- error = iicbus_block_read(device_get_parent(iicdev), sc->sc_addr,
- sc->sc_inbuf, len, &bufsize);
- if (error) {
- IIC_UNLOCK(sc);
- return (error);
+ /* Alloc kernel buffers for userland data, copyin write data */
+ usrbufs = malloc(sizeof(void *) * d->nmsgs, M_IIC, M_WAITOK | M_ZERO);
+
+ for (i = 0; i < d->nmsgs; i++) {
+ m = &(buf[i]);
+ usrbufs[i] = m->buf;
+
+ /*
+ * At least init the buffer to NULL so we can safely free() it later.
+ * If the copyin() to buf failed, don't try to malloc bogus m->len.
+ */
+ m->buf = NULL;
+ if (error != 0)
+ continue;
+ m->buf = malloc(m->len, M_IIC, M_WAITOK);
+ if (!(m->flags & IIC_M_RD))
+ error = copyin(usrbufs[i], m->buf, m->len);
}
- if (bufsize > uio->uio_resid)
- panic("%s: too much data read!", __func__);
+ if (error == 0)
+ error = iicbus_request_bus(parent, iicdev,
+ (flags & O_NONBLOCK) ? IIC_DONTWAIT : (IIC_WAIT | IIC_INTR));
- iicbus_release_bus(device_get_parent(iicdev), iicdev);
+ if (error == 0) {
+ error = iicbus_transfer(iicdev, buf, d->nmsgs);
+ iicbus_release_bus(parent, iicdev);
+ }
+
+ /* Copyout all read segments, free up kernel buffers */
+ for (i = 0; i < d->nmsgs; i++) {
+ m = &(buf[i]);
+ if ((error == 0) && (m->flags & IIC_M_RD))
+ error = copyout(m->buf, usrbufs[i], m->len);
+ free(m->buf, M_IIC);
+ }
- error = uiomove(sc->sc_inbuf, bufsize, uio);
- IIC_UNLOCK(sc);
+ free(usrbufs, M_IIC);
+ free(buf, M_IIC);
return (error);
}
static int
iicioctl(struct cdev *dev, u_long cmd, caddr_t data, int flags, struct thread *td)
{
- struct iic_softc *sc = dev->si_drv1;
- device_t iicdev = sc->sc_dev;
- device_t parent = device_get_parent(iicdev);
- struct iiccmd *s = (struct iiccmd *)data;
- struct iic_rdwr_data *d = (struct iic_rdwr_data *)data;
- struct iic_msg *m;
- int error, count, i;
- char *buf = NULL;
- void **usrbufs = NULL;
-
- if ((error = iicbus_request_bus(parent, iicdev,
- (flags & O_NONBLOCK) ? IIC_DONTWAIT : (IIC_WAIT | IIC_INTR))))
+ device_t parent, iicdev;
+ struct iiccmd *s;
+ struct uio ubuf;
+ struct iovec uvec;
+ struct iic_cdevpriv *priv;
+ int error;
+
+ s = (struct iiccmd *)data;
+ error = devfs_get_cdevpriv((void**)&priv);
+ if (error != 0)
return (error);
+ KASSERT(priv != NULL, ("iic cdevpriv should not be NULL!"));
+
+ iicdev = priv->sc->sc_dev;
+ parent = device_get_parent(iicdev);
+ IIC_LOCK(priv);
+
+
switch (cmd) {
case I2CSTART:
- IIC_LOCK(sc);
- error = iicbus_start(parent, s->slave, 0);
+ if (priv->started) {
+ error = EINVAL;
+ break;
+ }
+ error = iicbus_request_bus(parent, iicdev,
+ (flags & O_NONBLOCK) ? IIC_DONTWAIT : (IIC_WAIT | IIC_INTR));
- /*
- * Implicitly set the chip addr to the slave addr passed as
- * parameter. Consequently, start/stop shall be called before
- * the read or the write of a block.
- */
- if (!error)
- sc->sc_addr = s->slave;
- IIC_UNLOCK(sc);
+ if (error == 0)
+ error = iicbus_start(parent, s->slave, 0);
+
+ if (error == 0) {
+ priv->addr = s->slave;
+ priv->started = true;
+ } else
+ iicbus_release_bus(parent, iicdev);
break;
case I2CSTOP:
- error = iicbus_stop(parent);
+ if (priv->started) {
+ error = iicbus_stop(parent);
+ iicbus_release_bus(parent, iicdev);
+ priv->started = false;
+ }
+
break;
case I2CRSTCARD:
- error = iicbus_reset(parent, IIC_UNKNOWN, 0, NULL);
/*
- * Ignore IIC_ENOADDR as it only means we have a master-only
- * controller.
- */
- if (error == IIC_ENOADDR)
- error = 0;
+ * Bus should be owned before we reset it.
+ * We allow the bus to be already owned as the result of an in-progress
+ * sequence; however, bus reset will always be followed by release
+ * (a new start is presumably needed for I/O anyway). */
+ if (!priv->started)
+ error = iicbus_request_bus(parent, iicdev,
+ (flags & O_NONBLOCK) ? IIC_DONTWAIT : (IIC_WAIT | IIC_INTR));
+
+ if (error == 0) {
+ error = iicbus_reset(parent, IIC_UNKNOWN, 0, NULL);
+ /*
+ * Ignore IIC_ENOADDR as it only means we have a master-only
+ * controller.
+ */
+ if (error == IIC_ENOADDR)
+ error = 0;
+
+ iicbus_release_bus(parent, iicdev);
+ priv->started = false;
+ }
break;
case I2CWRITE:
- if (s->count <= 0) {
+ if (!priv->started) {
error = EINVAL;
break;
}
- buf = malloc((unsigned long)s->count, M_TEMP, M_WAITOK);
- error = copyin(s->buf, buf, s->count);
- if (error)
- break;
- error = iicbus_write(parent, buf, s->count, &count, 10);
+ uvec.iov_base = s->buf;
+ uvec.iov_len = s->count;
+ ubuf.uio_iov = &uvec;
+ ubuf.uio_iovcnt = 1;
+ ubuf.uio_segflg = UIO_USERSPACE;
+ ubuf.uio_td = td;
+ ubuf.uio_resid = s->count;
+ ubuf.uio_offset = 0;
+ ubuf.uio_rw = UIO_WRITE;
+ error = iicuio_move(priv, &ubuf, 0);
break;
case I2CREAD:
- if (s->count <= 0) {
+ if (!priv->started) {
error = EINVAL;
break;
}
- buf = malloc((unsigned long)s->count, M_TEMP, M_WAITOK);
- error = iicbus_read(parent, buf, s->count, &count, s->last, 10);
- if (error)
- break;
- error = copyout(buf, s->buf, s->count);
+ uvec.iov_base = s->buf;
+ uvec.iov_len = s->count;
+ ubuf.uio_iov = &uvec;
+ ubuf.uio_iovcnt = 1;
+ ubuf.uio_segflg = UIO_USERSPACE;
+ ubuf.uio_td = td;
+ ubuf.uio_resid = s->count;
+ ubuf.uio_offset = 0;
+ ubuf.uio_rw = UIO_READ;
+ error = iicuio_move(priv, &ubuf, s->last);
break;
case I2CRDWR:
- buf = malloc(sizeof(*d->msgs) * d->nmsgs, M_TEMP, M_WAITOK);
- error = copyin(d->msgs, buf, sizeof(*d->msgs) * d->nmsgs);
- if (error)
+ /*
+ * The rdwr list should be a self-contained set of
+ * transactions. Fail if another transaction is in progress.
+ */
+ if (priv->started) {
+ error = EINVAL;
break;
- /* Alloc kernel buffers for userland data, copyin write data */
- usrbufs = malloc(sizeof(void *) * d->nmsgs, M_TEMP, M_ZERO | M_WAITOK);
- for (i = 0; i < d->nmsgs; i++) {
- m = &((struct iic_msg *)buf)[i];
- usrbufs[i] = m->buf;
- m->buf = malloc(m->len, M_TEMP, M_WAITOK);
- if (!(m->flags & IIC_M_RD))
- copyin(usrbufs[i], m->buf, m->len);
- }
- error = iicbus_transfer(iicdev, (struct iic_msg *)buf, d->nmsgs);
- /* Copyout all read segments, free up kernel buffers */
- for (i = 0; i < d->nmsgs; i++) {
- m = &((struct iic_msg *)buf)[i];
- if (m->flags & IIC_M_RD)
- copyout(m->buf, usrbufs[i], m->len);
- free(m->buf, M_TEMP);
}
- free(usrbufs, M_TEMP);
+
+ error = iicrdwr(priv, (struct iic_rdwr_data *)data, flags);
+
break;
case I2CRPTSTART:
+ if (!priv->started) {
+ error = EINVAL;
+ break;
+ }
error = iicbus_repeated_start(parent, s->slave, 0);
break;
+ case I2CSADDR:
+ priv->addr = *((uint8_t*)data);
+ break;
+
default:
error = ENOTTY;
}
- iicbus_release_bus(parent, iicdev);
-
- if (buf != NULL)
- free(buf, M_TEMP);
+ IIC_UNLOCK(priv);
return (error);
}
diff --git a/sys/dev/iicbus/iic.h b/sys/dev/iicbus/iic.h
index ab58abf..ba98d28 100644
--- a/sys/dev/iicbus/iic.h
+++ b/sys/dev/iicbus/iic.h
@@ -63,5 +63,6 @@ struct iic_rdwr_data {
#define I2CREAD _IOW('i', 5, struct iiccmd) /* receive data */
#define I2CRDWR _IOW('i', 6, struct iic_rdwr_data) /* General read/write interface */
#define I2CRPTSTART _IOW('i', 7, struct iiccmd) /* repeated start */
+#define I2CSADDR _IOW('i', 8, uint8_t) /* set slave address for future I/O */
#endif
diff --git a/sys/dev/iicbus/iicbus_if.m b/sys/dev/iicbus/iicbus_if.m
index 120b5e7..3f58168 100644
--- a/sys/dev/iicbus/iicbus_if.m
+++ b/sys/dev/iicbus/iicbus_if.m
@@ -51,6 +51,10 @@ METHOD int intr {
#
# iicbus callback
+# Request ownership of bus
+# index: IIC_REQUEST_BUS or IIC_RELEASE_BUS
+# data: pointer to int containing IIC_WAIT or IIC_DONTWAIT and either IIC_INTR or IIC_NOINTR
+# This function is allowed to sleep if *data contains IIC_WAIT.
#
METHOD int callback {
device_t dev;
diff --git a/sys/dev/iicbus/iiconf.c b/sys/dev/iicbus/iiconf.c
index 940760b..09edb39 100644
--- a/sys/dev/iicbus/iiconf.c
+++ b/sys/dev/iicbus/iiconf.c
@@ -71,7 +71,6 @@ iicbus_poll(struct iicbus_softc *sc, int how)
default:
return (EWOULDBLOCK);
- break;
}
return (error);
@@ -90,31 +89,32 @@ iicbus_request_bus(device_t bus, device_t dev, int how)
struct iicbus_softc *sc = (struct iicbus_softc *)device_get_softc(bus);
int error = 0;
- /* first, ask the underlying layers if the request is ok */
IICBUS_LOCK(sc);
- do {
- error = IICBUS_CALLBACK(device_get_parent(bus),
- IIC_REQUEST_BUS, (caddr_t)&how);
- if (error)
- error = iicbus_poll(sc, how);
- } while (error == EWOULDBLOCK);
- while (!error) {
- if (sc->owner && sc->owner != dev) {
-
- error = iicbus_poll(sc, how);
- } else {
- sc->owner = dev;
+ while ((error == 0) && (sc->owner != NULL))
+ error = iicbus_poll(sc, how);
+
+ if (error == 0) {
+ sc->owner = dev;
+ /*
+ * Drop the lock around the call to the bus driver.
+ * This call should be allowed to sleep in the IIC_WAIT case.
+ * Drivers might also need to grab locks that would cause LOR
+ * if our lock is held.
+ */
+ IICBUS_UNLOCK(sc);
+ /* Ask the underlying layers if the request is ok */
+ error = IICBUS_CALLBACK(device_get_parent(bus),
+ IIC_REQUEST_BUS, (caddr_t)&how);
+ IICBUS_LOCK(sc);
- IICBUS_UNLOCK(sc);
- return (0);
+ if (error != 0) {
+ sc->owner = NULL;
+ wakeup_one(sc);
}
-
- /* free any allocated resource */
- if (error)
- IICBUS_CALLBACK(device_get_parent(bus), IIC_RELEASE_BUS,
- (caddr_t)&how);
}
+
+
IICBUS_UNLOCK(sc);
return (error);
@@ -131,12 +131,6 @@ iicbus_release_bus(device_t bus, device_t dev)
struct iicbus_softc *sc = (struct iicbus_softc *)device_get_softc(bus);
int error;
- /* first, ask the underlying layers if the release is ok */
- error = IICBUS_CALLBACK(device_get_parent(bus), IIC_RELEASE_BUS, NULL);
-
- if (error)
- return (error);
-
IICBUS_LOCK(sc);
if (sc->owner != dev) {
@@ -144,13 +138,26 @@ iicbus_release_bus(device_t bus, device_t dev)
return (EACCES);
}
- sc->owner = NULL;
-
- /* wakeup waiting processes */
- wakeup(sc);
+ /*
+ * Drop the lock around the call to the bus driver.
+ * This call should be allowed to sleep in the IIC_WAIT case.
+ * Drivers might also need to grab locks that would cause LOR
+ * if our lock is held.
+ */
IICBUS_UNLOCK(sc);
+ /* Ask the underlying layers if the release is ok */
+ error = IICBUS_CALLBACK(device_get_parent(bus), IIC_RELEASE_BUS, NULL);
- return (0);
+ if (error == 0) {
+ IICBUS_LOCK(sc);
+ sc->owner = NULL;
+
+ /* wakeup a waiting thread */
+ wakeup_one(sc);
+ IICBUS_UNLOCK(sc);
+ }
+
+ return (error);
}
/*
diff --git a/sys/dev/iicbus/pcf8563.c b/sys/dev/iicbus/pcf8563.c
index 88307a5..556943a 100644
--- a/sys/dev/iicbus/pcf8563.c
+++ b/sys/dev/iicbus/pcf8563.c
@@ -1,5 +1,6 @@
/*-
* Copyright (c) 2012 Marius Strobl <marius@FreeBSD.org>
+ * Copyright (c) 2015 Juraj Lutter
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -31,6 +32,8 @@ __FBSDID("$FreeBSD$");
* Driver for NXP PCF8563 real-time clock/calendar
*/
+#include "opt_platform.h"
+
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/bus.h>
@@ -41,6 +44,11 @@ __FBSDID("$FreeBSD$");
#include <dev/iicbus/iicbus.h>
#include <dev/iicbus/iiconf.h>
#include <dev/iicbus/pcf8563reg.h>
+#ifdef FDT
+#include <dev/ofw/openfirm.h>
+#include <dev/ofw/ofw_bus.h>
+#include <dev/ofw/ofw_bus_subr.h>
+#endif
#include "clock_if.h"
#include "iicbus_if.h"
@@ -48,6 +56,7 @@ __FBSDID("$FreeBSD$");
#define PCF8563_NCLOCKREGS (PCF8563_R_YEAR - PCF8563_R_CS1 + 1)
struct pcf8563_softc {
+ struct intr_config_hook enum_hook;
uint32_t sc_flags;
#define PCF8563_CPOL (1 << 0) /* PCF8563_R_MONTH_C means 19xx */
uint16_t sc_addr; /* PCF8563 slave address */
@@ -58,30 +67,62 @@ static device_attach_t pcf8563_attach;
static device_probe_t pcf8563_probe;
static clock_gettime_t pcf8563_gettime;
static clock_settime_t pcf8563_settime;
+static void pcf8563_start(void *);
static int
pcf8563_probe(device_t dev)
{
+#ifdef FDT
+ if (!ofw_bus_status_okay(dev))
+ return (ENXIO);
+ if (!ofw_bus_is_compatible(dev, "nxp,pcf8563") &&
+ !ofw_bus_is_compatible(dev, "philips,pcf8563") &&
+ !ofw_bus_is_compatible(dev, "pcf8563"))
+ return (ENXIO);
+#endif
device_set_desc(dev, "NXP PCF8563 RTC");
- return (BUS_PROBE_NOWILDCARD);
+
+ return (BUS_PROBE_DEFAULT);
}
static int
pcf8563_attach(device_t dev)
{
+ struct pcf8563_softc *sc;
+
+ sc = device_get_softc(dev);
+ sc->sc_addr = iicbus_get_addr(dev);
+ if (sc->sc_addr == 0)
+ sc->sc_addr = PCF8563_ADDR;
+ sc->sc_year0 = 1900;
+ sc->enum_hook.ich_func = pcf8563_start;
+ sc->enum_hook.ich_arg = dev;
+
+ /*
+ * We have to wait until interrupts are enabled. Sometimes I2C read
+ * and write only works when the interrupts are available.
+ */
+ if (config_intrhook_establish(&sc->enum_hook) != 0)
+ return (ENOMEM);
+
+ return (0);
+}
+
+static void
+pcf8563_start(void *xdev)
+{
+ device_t dev;
uint8_t reg = PCF8563_R_SECOND, val;
struct iic_msg msgs[] = {
{ 0, IIC_M_WR, sizeof(reg), &reg },
{ 0, IIC_M_RD, sizeof(val), &val }
};
struct pcf8563_softc *sc;
- int error;
+ dev = (device_t)xdev;
sc = device_get_softc(dev);
- sc->sc_addr = iicbus_get_addr(dev);
- if (sc->sc_addr == 0)
- sc->sc_addr = PCF8563_ADDR;
+ config_intrhook_disestablish(&sc->enum_hook);
/*
* NB: PCF8563_R_SECOND_VL doesn't automatically clear when VDD
@@ -94,18 +135,14 @@ pcf8563_attach(device_t dev)
* as a side-effect.
*/
msgs[0].slave = msgs[1].slave = sc->sc_addr;
- error = iicbus_transfer(device_get_parent(dev), msgs, sizeof(msgs) /
- sizeof(*msgs));
- if (error != 0) {
+ if (iicbus_transfer(dev, msgs, nitems(msgs)) != 0) {
device_printf(dev, "%s: cannot read RTC\n", __func__);
- return (error);
+ return;
}
if ((val & PCF8563_R_SECOND_VL) != 0)
device_printf(dev, "%s: battery low\n", __func__);
- sc->sc_year0 = 1900;
clock_register(dev, 1000000); /* 1 second resolution */
- return (0);
}
static int
@@ -122,8 +159,7 @@ pcf8563_gettime(device_t dev, struct timespec *ts)
sc = device_get_softc(dev);
msgs[0].slave = msgs[1].slave = sc->sc_addr;
- error = iicbus_transfer(device_get_parent(dev), msgs, sizeof(msgs) /
- sizeof(*msgs));
+ error = iicbus_transfer(dev, msgs, nitems(msgs));
if (error != 0) {
device_printf(dev, "%s: cannot read RTC\n", __func__);
return (error);
@@ -145,6 +181,7 @@ pcf8563_gettime(device_t dev, struct timespec *ts)
sc->sc_flags |= PCF8563_CPOL;
} else if (ct.year < 100 + sc->sc_year0)
sc->sc_flags |= PCF8563_CPOL;
+
return (clock_ct_to_ts(&ct, ts));
}
@@ -180,10 +217,10 @@ pcf8563_settime(device_t dev, struct timespec *ts)
val[PCF8563_R_MONTH] |= PCF8563_R_MONTH_C;
msgs[0].slave = sc->sc_addr;
- error = iicbus_transfer(device_get_parent(dev), msgs, sizeof(msgs) /
- sizeof(*msgs));
+ error = iicbus_transfer(dev, msgs, nitems(msgs));
if (error != 0)
device_printf(dev, "%s: cannot write RTC\n", __func__);
+
return (error);
}
diff --git a/sys/dev/ipmi/ipmi.c b/sys/dev/ipmi/ipmi.c
index a1edbf6..8101717 100644
--- a/sys/dev/ipmi/ipmi.c
+++ b/sys/dev/ipmi/ipmi.c
@@ -756,17 +756,22 @@ ipmi_startup(void *arg)
}
device_printf(dev, "Number of channels %d\n", i);
- /* probe for watchdog */
- IPMI_INIT_DRIVER_REQUEST(req, IPMI_ADDR(IPMI_APP_REQUEST, 0),
- IPMI_GET_WDOG, 0, 0);
+ /*
+ * Probe for watchdog, but only for backends which support
+ * polled driver requests.
+ */
+ if (sc->ipmi_driver_requests_polled) {
+ IPMI_INIT_DRIVER_REQUEST(req, IPMI_ADDR(IPMI_APP_REQUEST, 0),
+ IPMI_GET_WDOG, 0, 0);
- ipmi_submit_driver_request(sc, req, 0);
+ ipmi_submit_driver_request(sc, req, 0);
- if (req->ir_compcode == 0x00) {
- device_printf(dev, "Attached watchdog\n");
- /* register the watchdog event handler */
- sc->ipmi_watchdog_tag = EVENTHANDLER_REGISTER(watchdog_list,
- ipmi_wd_event, sc, 0);
+ if (req->ir_compcode == 0x00) {
+ device_printf(dev, "Attached watchdog\n");
+ /* register the watchdog event handler */
+ sc->ipmi_watchdog_tag = EVENTHANDLER_REGISTER(
+ watchdog_list, ipmi_wd_event, sc, 0);
+ }
}
sc->ipmi_cdev = make_dev(&ipmi_cdevsw, device_get_unit(dev),
diff --git a/sys/dev/ipmi/ipmi_kcs.c b/sys/dev/ipmi/ipmi_kcs.c
index 1c58646..864e9a0 100644
--- a/sys/dev/ipmi/ipmi_kcs.c
+++ b/sys/dev/ipmi/ipmi_kcs.c
@@ -520,6 +520,7 @@ ipmi_kcs_attach(struct ipmi_softc *sc)
sc->ipmi_startup = kcs_startup;
sc->ipmi_enqueue_request = ipmi_polled_enqueue_request;
sc->ipmi_driver_request = kcs_driver_request;
+ sc->ipmi_driver_requests_polled = 1;
/* See if we can talk to the controller. */
status = INB(sc, KCS_CTL_STS);
diff --git a/sys/dev/ipmi/ipmi_smic.c b/sys/dev/ipmi/ipmi_smic.c
index 4e26553..92cf14e 100644
--- a/sys/dev/ipmi/ipmi_smic.c
+++ b/sys/dev/ipmi/ipmi_smic.c
@@ -415,6 +415,7 @@ ipmi_smic_attach(struct ipmi_softc *sc)
sc->ipmi_startup = smic_startup;
sc->ipmi_enqueue_request = ipmi_polled_enqueue_request;
sc->ipmi_driver_request = smic_driver_request;
+ sc->ipmi_driver_requests_polled = 1;
/* See if we can talk to the controller. */
flags = INB(sc, SMIC_FLAGS);
diff --git a/sys/dev/ipmi/ipmivars.h b/sys/dev/ipmi/ipmivars.h
index 9d7dc32..9a0b435 100644
--- a/sys/dev/ipmi/ipmivars.h
+++ b/sys/dev/ipmi/ipmivars.h
@@ -105,6 +105,7 @@ struct ipmi_softc {
int ipmi_opened;
struct cdev *ipmi_cdev;
TAILQ_HEAD(,ipmi_request) ipmi_pending_requests;
+ int ipmi_driver_requests_polled;
eventhandler_tag ipmi_watchdog_tag;
int ipmi_watchdog_active;
struct intr_config_hook ipmi_ich;
diff --git a/sys/dev/iscsi/icl_conn_if.m b/sys/dev/iscsi/icl_conn_if.m
index 1a52882..077fabe 100644
--- a/sys/dev/iscsi/icl_conn_if.m
+++ b/sys/dev/iscsi/icl_conn_if.m
@@ -82,10 +82,6 @@ METHOD void close {
struct icl_conn *_ic;
};
-METHOD bool connected {
- struct icl_conn *_ic;
-};
-
METHOD int task_setup {
struct icl_conn *_ic;
struct ccb_scsiio *_csio;
diff --git a/sys/dev/iscsi/icl_soft.c b/sys/dev/iscsi/icl_soft.c
index 2dd5e5c..e31b213 100644
--- a/sys/dev/iscsi/icl_soft.c
+++ b/sys/dev/iscsi/icl_soft.c
@@ -97,7 +97,6 @@ static icl_conn_pdu_queue_t icl_soft_conn_pdu_queue;
static icl_conn_handoff_t icl_soft_conn_handoff;
static icl_conn_free_t icl_soft_conn_free;
static icl_conn_close_t icl_soft_conn_close;
-static icl_conn_connected_t icl_soft_conn_connected;
static icl_conn_task_setup_t icl_soft_conn_task_setup;
static icl_conn_task_done_t icl_soft_conn_task_done;
static icl_conn_transfer_setup_t icl_soft_conn_transfer_setup;
@@ -114,7 +113,6 @@ static kobj_method_t icl_soft_methods[] = {
KOBJMETHOD(icl_conn_handoff, icl_soft_conn_handoff),
KOBJMETHOD(icl_conn_free, icl_soft_conn_free),
KOBJMETHOD(icl_conn_close, icl_soft_conn_close),
- KOBJMETHOD(icl_conn_connected, icl_soft_conn_connected),
KOBJMETHOD(icl_conn_task_setup, icl_soft_conn_task_setup),
KOBJMETHOD(icl_conn_task_done, icl_soft_conn_task_done),
KOBJMETHOD(icl_conn_transfer_setup, icl_soft_conn_transfer_setup),
@@ -1425,24 +1423,6 @@ icl_soft_conn_close(struct icl_conn *ic)
ICL_CONN_UNLOCK(ic);
}
-bool
-icl_soft_conn_connected(struct icl_conn *ic)
-{
- ICL_CONN_LOCK_ASSERT_NOT(ic);
-
- ICL_CONN_LOCK(ic);
- if (ic->ic_socket == NULL) {
- ICL_CONN_UNLOCK(ic);
- return (false);
- }
- if (ic->ic_socket->so_error != 0) {
- ICL_CONN_UNLOCK(ic);
- return (false);
- }
- ICL_CONN_UNLOCK(ic);
- return (true);
-}
-
int
icl_soft_conn_task_setup(struct icl_conn *ic, struct ccb_scsiio *csio,
uint32_t *task_tagp, void **prvp)
diff --git a/sys/dev/iscsi/icl_wrappers.h b/sys/dev/iscsi/icl_wrappers.h
index 2cf7d96..1ed72ae 100644
--- a/sys/dev/iscsi/icl_wrappers.h
+++ b/sys/dev/iscsi/icl_wrappers.h
@@ -105,13 +105,6 @@ icl_conn_close(struct icl_conn *ic)
ICL_CONN_CLOSE(ic);
}
-static inline bool
-icl_conn_connected(struct icl_conn *ic)
-{
-
- return (ICL_CONN_CONNECTED(ic));
-}
-
static inline int
icl_conn_task_setup(struct icl_conn *ic, struct ccb_scsiio *csio,
uint32_t *task_tagp, void **prvp)
diff --git a/sys/dev/iwn/if_iwn.c b/sys/dev/iwn/if_iwn.c
index b287c6c..3733509 100644
--- a/sys/dev/iwn/if_iwn.c
+++ b/sys/dev/iwn/if_iwn.c
@@ -8060,7 +8060,7 @@ iwn_read_firmware_tlv(struct iwn_softc *sc, struct iwn_fw_info *fw,
case IWN_FW_TLV_WOWLAN_INST:
case IWN_FW_TLV_WOWLAN_DATA:
DPRINTF(sc, IWN_DEBUG_RESET,
- "TLV type %d reconized but not handled\n",
+ "TLV type %d recognized but not handled\n",
le16toh(tlv->type));
break;
default:
diff --git a/sys/dev/ixgbe/if_ix.c b/sys/dev/ixgbe/if_ix.c
index a77a3ef..b9bba31 100644
--- a/sys/dev/ixgbe/if_ix.c
+++ b/sys/dev/ixgbe/if_ix.c
@@ -54,7 +54,7 @@ int ixgbe_display_debug_stats = 0;
/*********************************************************************
* Driver version
*********************************************************************/
-char ixgbe_driver_version[] = "2.7.4";
+char ixgbe_driver_version[] = "2.8.3";
/*********************************************************************
* PCI Device ID Table
@@ -117,6 +117,8 @@ static int ixgbe_probe(device_t);
static int ixgbe_attach(device_t);
static int ixgbe_detach(device_t);
static int ixgbe_shutdown(device_t);
+static int ixgbe_suspend(device_t);
+static int ixgbe_resume(device_t);
static int ixgbe_ioctl(struct ifnet *, u_long, caddr_t);
static void ixgbe_init(void *);
static void ixgbe_init_locked(struct adapter *);
@@ -136,7 +138,12 @@ static int ixgbe_setup_msix(struct adapter *);
static void ixgbe_free_pci_resources(struct adapter *);
static void ixgbe_local_timer(void *);
static int ixgbe_setup_interface(device_t, struct adapter *);
+static void ixgbe_config_dmac(struct adapter *);
+static void ixgbe_config_delay_values(struct adapter *);
static void ixgbe_config_link(struct adapter *);
+static void ixgbe_check_eee_support(struct adapter *);
+static void ixgbe_check_wol_support(struct adapter *);
+static int ixgbe_setup_low_power_mode(struct adapter *);
static void ixgbe_rearm_queues(struct adapter *, u64);
static void ixgbe_initialize_transmit_units(struct adapter *);
@@ -150,9 +157,6 @@ static void ixgbe_update_stats_counters(struct adapter *);
static void ixgbe_set_promisc(struct adapter *);
static void ixgbe_set_multi(struct adapter *);
static void ixgbe_update_link_status(struct adapter *);
-static int ixgbe_set_flowcntl(SYSCTL_HANDLER_ARGS);
-static int ixgbe_set_advertise(SYSCTL_HANDLER_ARGS);
-static int ixgbe_set_thermal_test(SYSCTL_HANDLER_ARGS);
static void ixgbe_set_ivar(struct adapter *, u8, u8, s8);
static void ixgbe_configure_ivars(struct adapter *);
static u8 * ixgbe_mc_array_itr(struct ixgbe_hw *, u8 **, u32 *);
@@ -161,7 +165,22 @@ static void ixgbe_setup_vlan_hw_support(struct adapter *);
static void ixgbe_register_vlan(void *, struct ifnet *, u16);
static void ixgbe_unregister_vlan(void *, struct ifnet *, u16);
-static void ixgbe_add_hw_stats(struct adapter *adapter);
+static void ixgbe_add_device_sysctls(struct adapter *);
+static void ixgbe_add_hw_stats(struct adapter *);
+
+/* Sysctl handlers */
+static int ixgbe_set_flowcntl(SYSCTL_HANDLER_ARGS);
+static int ixgbe_set_advertise(SYSCTL_HANDLER_ARGS);
+static int ixgbe_sysctl_thermal_test(SYSCTL_HANDLER_ARGS);
+static int ixgbe_sysctl_dmac(SYSCTL_HANDLER_ARGS);
+static int ixgbe_sysctl_phy_temp(SYSCTL_HANDLER_ARGS);
+static int ixgbe_sysctl_phy_overtemp_occurred(SYSCTL_HANDLER_ARGS);
+static int ixgbe_sysctl_wol_enable(SYSCTL_HANDLER_ARGS);
+static int ixgbe_sysctl_wufc(SYSCTL_HANDLER_ARGS);
+static int ixgbe_sysctl_eee_enable(SYSCTL_HANDLER_ARGS);
+static int ixgbe_sysctl_eee_negotiated(SYSCTL_HANDLER_ARGS);
+static int ixgbe_sysctl_eee_rx_lpi_status(SYSCTL_HANDLER_ARGS);
+static int ixgbe_sysctl_eee_tx_lpi_status(SYSCTL_HANDLER_ARGS);
/* Support for pluggable optic modules */
static bool ixgbe_sfp_probe(struct adapter *);
@@ -179,15 +198,12 @@ static void ixgbe_handle_que(void *, int);
static void ixgbe_handle_link(void *, int);
static void ixgbe_handle_msf(void *, int);
static void ixgbe_handle_mod(void *, int);
+static void ixgbe_handle_phy(void *, int);
#ifdef IXGBE_FDIR
static void ixgbe_reinit_fdir(void *, int);
#endif
-
-/* Missing shared code prototype */
-extern void ixgbe_stop_mac_link_on_d3_82599(struct ixgbe_hw *hw);
-
/*********************************************************************
* FreeBSD Device Interface Entry Points
*********************************************************************/
@@ -198,6 +214,8 @@ static device_method_t ix_methods[] = {
DEVMETHOD(device_attach, ixgbe_attach),
DEVMETHOD(device_detach, ixgbe_detach),
DEVMETHOD(device_shutdown, ixgbe_shutdown),
+ DEVMETHOD(device_suspend, ixgbe_suspend),
+ DEVMETHOD(device_resume, ixgbe_resume),
DEVMETHOD_END
};
@@ -404,32 +422,6 @@ ixgbe_attach(device_t dev)
/* Core Lock Init*/
IXGBE_CORE_LOCK_INIT(adapter, device_get_nameunit(dev));
- /* SYSCTL APIs */
- SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev),
- SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
- OID_AUTO, "fc", CTLTYPE_INT | CTLFLAG_RW,
- adapter, 0, ixgbe_set_flowcntl, "I", IXGBE_SYSCTL_DESC_SET_FC);
-
- SYSCTL_ADD_INT(device_get_sysctl_ctx(dev),
- SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
- OID_AUTO, "enable_aim", CTLFLAG_RW,
- &ixgbe_enable_aim, 1, "Interrupt Moderation");
-
- /*
- ** Allow a kind of speed control by forcing the autoneg
- ** advertised speed list to only a certain value, this
- ** supports 1G on 82599 devices, and 100Mb on x540.
- */
- SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev),
- SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
- OID_AUTO, "advertise_speed", CTLTYPE_INT | CTLFLAG_RW,
- adapter, 0, ixgbe_set_advertise, "I", IXGBE_SYSCTL_DESC_ADV_SPEED);
-
- SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev),
- SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
- OID_AUTO, "ts", CTLTYPE_INT | CTLFLAG_RW, adapter,
- 0, ixgbe_set_thermal_test, "I", "Thermal Test");
-
/* Set up the timer callout */
callout_init_mtx(&adapter->timer, &adapter->core_mtx, 0);
@@ -559,22 +551,26 @@ ixgbe_attach(device_t dev)
adapter->vlan_detach = EVENTHANDLER_REGISTER(vlan_unconfig,
ixgbe_unregister_vlan, adapter, EVENTHANDLER_PRI_FIRST);
- /*
- ** Check PCIE slot type/speed/width
- */
+ /* Check PCIE slot type/speed/width */
ixgbe_get_slot_info(hw);
/* Set an initial default flow control value */
adapter->fc = ixgbe_fc_full;
+ /* Check for certain supported features */
+ ixgbe_check_wol_support(adapter);
+ ixgbe_check_eee_support(adapter);
+
+ /* Add sysctls */
+ ixgbe_add_device_sysctls(adapter);
+ ixgbe_add_hw_stats(adapter);
+
/* let hardware know driver is loaded */
ctrl_ext = IXGBE_READ_REG(hw, IXGBE_CTRL_EXT);
ctrl_ext |= IXGBE_CTRL_EXT_DRV_LOAD;
IXGBE_WRITE_REG(hw, IXGBE_CTRL_EXT, ctrl_ext);
- ixgbe_add_hw_stats(adapter);
-
#ifdef DEV_NETMAP
ixgbe_netmap_attach(adapter);
#endif /* DEV_NETMAP */
@@ -618,8 +614,9 @@ ixgbe_detach(device_t dev)
return (EBUSY);
}
+ /* Stop the adapter */
IXGBE_CORE_LOCK(adapter);
- ixgbe_stop(adapter);
+ ixgbe_setup_low_power_mode(adapter);
IXGBE_CORE_UNLOCK(adapter);
for (int i = 0; i < adapter->num_queues; i++, que++, txr++) {
@@ -637,6 +634,7 @@ ixgbe_detach(device_t dev)
taskqueue_drain(adapter->tq, &adapter->link_task);
taskqueue_drain(adapter->tq, &adapter->mod_task);
taskqueue_drain(adapter->tq, &adapter->msf_task);
+ taskqueue_drain(adapter->tq, &adapter->phy_task);
#ifdef IXGBE_FDIR
taskqueue_drain(adapter->tq, &adapter->fdir_task);
#endif
@@ -681,9 +679,77 @@ static int
ixgbe_shutdown(device_t dev)
{
struct adapter *adapter = device_get_softc(dev);
+ int error = 0;
+
+ INIT_DEBUGOUT("ixgbe_shutdown: begin");
+
IXGBE_CORE_LOCK(adapter);
- ixgbe_stop(adapter);
+ error = ixgbe_setup_low_power_mode(adapter);
+ IXGBE_CORE_UNLOCK(adapter);
+
+ return (error);
+}
+
+/**
+ * Methods for going from:
+ * D0 -> D3: ixgbe_suspend
+ * D3 -> D0: ixgbe_resume
+ */
+static int
+ixgbe_suspend(device_t dev)
+{
+ struct adapter *adapter = device_get_softc(dev);
+ int error = 0;
+
+ INIT_DEBUGOUT("ixgbe_suspend: begin");
+
+ IXGBE_CORE_LOCK(adapter);
+
+ error = ixgbe_setup_low_power_mode(adapter);
+
+ /* Save state and power down */
+ pci_save_state(dev);
+ pci_set_powerstate(dev, PCI_POWERSTATE_D3);
+
+ IXGBE_CORE_UNLOCK(adapter);
+
+ return (error);
+}
+
+static int
+ixgbe_resume(device_t dev)
+{
+ struct adapter *adapter = device_get_softc(dev);
+ struct ifnet *ifp = adapter->ifp;
+ struct ixgbe_hw *hw = &adapter->hw;
+ u32 wus;
+
+ INIT_DEBUGOUT("ixgbe_resume: begin");
+
+ IXGBE_CORE_LOCK(adapter);
+
+ pci_set_powerstate(dev, PCI_POWERSTATE_D0);
+ pci_restore_state(dev);
+
+ /* Read & clear WUS register */
+ wus = IXGBE_READ_REG(hw, IXGBE_WUS);
+ if (wus)
+ device_printf(dev, "Woken up by (WUS): %#010x\n",
+ IXGBE_READ_REG(hw, IXGBE_WUS));
+ IXGBE_WRITE_REG(hw, IXGBE_WUS, 0xffffffff);
+ /* And clear WUFC until next low-power transition */
+ IXGBE_WRITE_REG(hw, IXGBE_WUFC, 0);
+
+ /*
+ * Required after D3->D0 transition;
+ * will re-advertise all previous advertised speeds
+ */
+ if (ifp->if_flags & IFF_UP)
+ ixgbe_init_locked(adapter);
+
IXGBE_CORE_UNLOCK(adapter);
+
+ INIT_DEBUGOUT("ixgbe_resume: end");
return (0);
}
@@ -736,13 +802,13 @@ ixgbe_ioctl(struct ifnet * ifp, u_long command, caddr_t data)
break;
case SIOCSIFMTU:
IOCTL_DEBUGOUT("ioctl: SIOCSIFMTU (Set Interface MTU)");
- if (ifr->ifr_mtu > IXGBE_MAX_FRAME_SIZE - ETHER_HDR_LEN) {
+ if (ifr->ifr_mtu > IXGBE_MAX_MTU) {
error = EINVAL;
} else {
IXGBE_CORE_LOCK(adapter);
ifp->if_mtu = ifr->ifr_mtu;
adapter->max_frame_size =
- ifp->if_mtu + ETHER_HDR_LEN + ETHER_CRC_LEN;
+ ifp->if_mtu + IXGBE_MTU_HDR;
ixgbe_init_locked(adapter);
IXGBE_CORE_UNLOCK(adapter);
}
@@ -891,7 +957,7 @@ ixgbe_init_locked(struct adapter *adapter)
/* Prepare transmit descriptors and buffers */
if (ixgbe_setup_transmit_structures(adapter)) {
- device_printf(dev,"Could not setup transmit structures\n");
+ device_printf(dev, "Could not setup transmit structures\n");
ixgbe_stop(adapter);
return;
}
@@ -917,7 +983,7 @@ ixgbe_init_locked(struct adapter *adapter)
/* Prepare receive descriptors and buffers */
if (ixgbe_setup_receive_structures(adapter)) {
- device_printf(dev,"Could not setup receive structures\n");
+ device_printf(dev, "Could not setup receive structures\n");
ixgbe_stop(adapter);
return;
}
@@ -932,11 +998,16 @@ ixgbe_init_locked(struct adapter *adapter)
/* Add for Module detection */
if (hw->mac.type == ixgbe_mac_82599EB)
- gpie |= IXGBE_SDP2_GPIEN_BY_MAC(hw);
+ gpie |= IXGBE_SDP2_GPIEN;
- /* Thermal Failure Detection */
- if (hw->mac.type == ixgbe_mac_X540)
- gpie |= IXGBE_SDP0_GPIEN_BY_MAC(hw);
+ /*
+ * Thermal Failure Detection (X540)
+ * Link Detection (X552)
+ */
+ if (hw->mac.type == ixgbe_mac_X540 ||
+ hw->device_id == IXGBE_DEV_ID_X550EM_X_SFP ||
+ hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T)
+ gpie |= IXGBE_SDP0_GPIEN_X540;
if (adapter->msix > 1) {
/* Enable Enhanced MSIX mode */
@@ -948,6 +1019,7 @@ ixgbe_init_locked(struct adapter *adapter)
/* Set MTU size */
if (ifp->if_mtu > ETHERMTU) {
+ /* aka IXGBE_MAXFRS on 82599 and newer */
mhadd = IXGBE_READ_REG(hw, IXGBE_MHADD);
mhadd &= ~IXGBE_MHADD_MFS_MASK;
mhadd |= adapter->max_frame_size << IXGBE_MHADD_MFS_SHIFT;
@@ -955,7 +1027,6 @@ ixgbe_init_locked(struct adapter *adapter)
}
/* Now enable all the queues */
-
for (int i = 0; i < adapter->num_queues; i++) {
txdctl = IXGBE_READ_REG(hw, IXGBE_TXDCTL(i));
txdctl |= IXGBE_TXDCTL_ENABLE;
@@ -1072,55 +1143,25 @@ ixgbe_init_locked(struct adapter *adapter)
/* Set moderation on the Link interrupt */
IXGBE_WRITE_REG(hw, IXGBE_EITR(adapter->vector), IXGBE_LINK_ITR);
+ /* Configure Energy Efficient Ethernet for supported devices */
+ if (adapter->eee_support)
+ ixgbe_setup_eee(hw, adapter->eee_enabled);
+
/* Config/Enable Link */
ixgbe_config_link(adapter);
/* Hardware Packet Buffer & Flow Control setup */
- {
- u32 rxpb, frame, size, tmp;
-
- frame = adapter->max_frame_size;
+ ixgbe_config_delay_values(adapter);
- /* Calculate High Water */
- switch (hw->mac.type) {
- case ixgbe_mac_X540:
- case ixgbe_mac_X550:
- case ixgbe_mac_X550EM_a:
- case ixgbe_mac_X550EM_x:
- tmp = IXGBE_DV_X540(frame, frame);
- break;
- default:
- tmp = IXGBE_DV(frame, frame);
- break;
- }
- size = IXGBE_BT2KB(tmp);
- rxpb = IXGBE_READ_REG(hw, IXGBE_RXPBSIZE(0)) >> 10;
- hw->fc.high_water[0] = rxpb - size;
-
- /* Now calculate Low Water */
- switch (hw->mac.type) {
- case ixgbe_mac_X540:
- case ixgbe_mac_X550:
- case ixgbe_mac_X550EM_a:
- case ixgbe_mac_X550EM_x:
- tmp = IXGBE_LOW_DV_X540(frame);
- break;
- default:
- tmp = IXGBE_LOW_DV(frame);
- break;
- }
- hw->fc.low_water[0] = IXGBE_BT2KB(tmp);
-
- hw->fc.requested_mode = adapter->fc;
- hw->fc.pause_time = IXGBE_FC_PAUSE;
- hw->fc.send_xon = TRUE;
- }
/* Initialize the FC settings */
ixgbe_start_hw(hw);
/* Set up VLAN support and filter */
ixgbe_setup_vlan_hw_support(adapter);
+ /* Setup DMA Coalescing */
+ ixgbe_config_dmac(adapter);
+
/* And now turn on interrupts */
ixgbe_enable_intr(adapter);
@@ -1141,6 +1182,46 @@ ixgbe_init(void *arg)
return;
}
+static void
+ixgbe_config_delay_values(struct adapter *adapter)
+{
+ struct ixgbe_hw *hw = &adapter->hw;
+ u32 rxpb, frame, size, tmp;
+
+ frame = adapter->max_frame_size;
+
+ /* Calculate High Water */
+ switch (hw->mac.type) {
+ case ixgbe_mac_X540:
+ case ixgbe_mac_X550:
+ case ixgbe_mac_X550EM_x:
+ tmp = IXGBE_DV_X540(frame, frame);
+ break;
+ default:
+ tmp = IXGBE_DV(frame, frame);
+ break;
+ }
+ size = IXGBE_BT2KB(tmp);
+ rxpb = IXGBE_READ_REG(hw, IXGBE_RXPBSIZE(0)) >> 10;
+ hw->fc.high_water[0] = rxpb - size;
+
+ /* Now calculate Low Water */
+ switch (hw->mac.type) {
+ case ixgbe_mac_X540:
+ case ixgbe_mac_X550:
+ case ixgbe_mac_X550EM_x:
+ tmp = IXGBE_LOW_DV_X540(frame);
+ break;
+ default:
+ tmp = IXGBE_LOW_DV(frame);
+ break;
+ }
+ hw->fc.low_water[0] = IXGBE_BT2KB(tmp);
+
+ hw->fc.requested_mode = adapter->fc;
+ hw->fc.pause_time = IXGBE_FC_PAUSE;
+ hw->fc.send_xon = TRUE;
+}
/*
**
@@ -1271,6 +1352,11 @@ ixgbe_legacy_irq(void *arg)
if (reg_eicr & IXGBE_EICR_LSC)
taskqueue_enqueue(adapter->tq, &adapter->link_task);
+ /* External PHY interrupt */
+ if (hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T &&
+ (reg_eicr & IXGBE_EICR_GPI_SDP0_X540))
+ taskqueue_enqueue(adapter->tq, &adapter->phy_task);
+
if (more)
taskqueue_enqueue(que->tq, &que->que_task);
else
@@ -1379,9 +1465,9 @@ ixgbe_msix_link(void *arg)
{
struct adapter *adapter = arg;
struct ixgbe_hw *hw = &adapter->hw;
- u32 reg_eicr;
+ u32 reg_eicr, mod_mask;
- ++adapter->vector_irq;
+ ++adapter->link_irq;
/* First get the cause */
reg_eicr = IXGBE_READ_REG(hw, IXGBE_EICS);
@@ -1409,42 +1495,46 @@ ixgbe_msix_link(void *arg)
device_printf(adapter->dev, "\nCRITICAL: ECC ERROR!! "
"Please Reboot!!\n");
IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_ECC);
- } else
+ }
- if (ixgbe_is_sfp(hw)) {
- if (reg_eicr & IXGBE_EICR_GPI_SDP1) {
- IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_GPI_SDP1_BY_MAC(hw));
- taskqueue_enqueue(adapter->tq, &adapter->msf_task);
- } else if (reg_eicr & IXGBE_EICR_GPI_SDP2) {
- IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_GPI_SDP2_BY_MAC(hw));
- taskqueue_enqueue(adapter->tq, &adapter->mod_task);
- }
+ /* Check for over temp condition */
+ if (reg_eicr & IXGBE_EICR_TS) {
+ device_printf(adapter->dev, "\nCRITICAL: OVER TEMP!! "
+ "PHY IS SHUT DOWN!!\n");
+ device_printf(adapter->dev, "System shutdown required!\n");
+ IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_TS);
}
- }
+ }
+
+ /* Pluggable optics-related interrupt */
+ if (hw->device_id == IXGBE_DEV_ID_X550EM_X_SFP)
+ mod_mask = IXGBE_EICR_GPI_SDP0_X540;
+ else
+ mod_mask = IXGBE_EICR_GPI_SDP2_BY_MAC(hw);
+
+ if (ixgbe_is_sfp(hw)) {
+ if (reg_eicr & IXGBE_EICR_GPI_SDP1_BY_MAC(hw)) {
+ IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_GPI_SDP1_BY_MAC(hw));
+ taskqueue_enqueue(adapter->tq, &adapter->msf_task);
+ } else if (reg_eicr & mod_mask) {
+ IXGBE_WRITE_REG(hw, IXGBE_EICR, mod_mask);
+ taskqueue_enqueue(adapter->tq, &adapter->mod_task);
+ }
+ }
/* Check for fan failure */
if ((hw->device_id == IXGBE_DEV_ID_82598AT) &&
- (reg_eicr & IXGBE_EICR_GPI_SDP1_BY_MAC(hw))) {
+ (reg_eicr & IXGBE_EICR_GPI_SDP1)) {
+ IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_GPI_SDP1);
device_printf(adapter->dev, "\nCRITICAL: FAN FAILURE!! "
"REPLACE IMMEDIATELY!!\n");
- IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_GPI_SDP1_BY_MAC(hw));
}
- /* Check for over temp condition */
- switch (hw->mac.type) {
- case ixgbe_mac_X540:
- case ixgbe_mac_X550:
- case ixgbe_mac_X550EM_a:
- if (reg_eicr & IXGBE_EICR_TS) {
- device_printf(adapter->dev, "\nCRITICAL: OVER TEMP!! "
- "PHY IS SHUT DOWN!!\n");
- device_printf(adapter->dev, "System shutdown required\n");
- IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_TS);
- }
- break;
- default:
- /* Other MACs have no thermal sensor interrupt */
- break;
+ /* External PHY interrupt */
+ if (hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T &&
+ (reg_eicr & IXGBE_EICR_GPI_SDP0_X540)) {
+ IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_GPI_SDP0_X540);
+ taskqueue_enqueue(adapter->tq, &adapter->phy_task);
}
IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMS, IXGBE_EIMS_OTHER);
@@ -1543,20 +1633,26 @@ ixgbe_media_status(struct ifnet * ifp, struct ifmediareq * ifmr)
if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KR)
switch (adapter->link_speed) {
case IXGBE_LINK_SPEED_10GB_FULL:
- ifmr->ifm_active |= IFM_10_T | IFM_FDX;
+ ifmr->ifm_active |= IFM_10G_SR | IFM_FDX;
+ break;
+ case IXGBE_LINK_SPEED_2_5GB_FULL:
+ ifmr->ifm_active |= IFM_2500_SX | IFM_FDX;
break;
case IXGBE_LINK_SPEED_1GB_FULL:
- ifmr->ifm_active |= IFM_10_5 | IFM_FDX;
+ ifmr->ifm_active |= IFM_1000_CX | IFM_FDX;
break;
}
- if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KX4
+ else if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KX4
|| layer & IXGBE_PHYSICAL_LAYER_1000BASE_KX)
switch (adapter->link_speed) {
case IXGBE_LINK_SPEED_10GB_FULL:
- ifmr->ifm_active |= IFM_10_2 | IFM_FDX;
+ ifmr->ifm_active |= IFM_10G_CX4 | IFM_FDX;
+ break;
+ case IXGBE_LINK_SPEED_2_5GB_FULL:
+ ifmr->ifm_active |= IFM_2500_SX | IFM_FDX;
break;
case IXGBE_LINK_SPEED_1GB_FULL:
- ifmr->ifm_active |= IFM_10_5 | IFM_FDX;
+ ifmr->ifm_active |= IFM_1000_CX | IFM_FDX;
break;
}
@@ -1565,10 +1661,12 @@ ixgbe_media_status(struct ifnet * ifp, struct ifmediareq * ifmr)
ifmr->ifm_active |= IFM_UNKNOWN;
#if __FreeBSD_version >= 900025
- /* Flow control setting */
- if (adapter->fc == ixgbe_fc_rx_pause || adapter->fc == ixgbe_fc_full)
+ /* Display current flow control setting used on link */
+ if (hw->fc.current_mode == ixgbe_fc_rx_pause ||
+ hw->fc.current_mode == ixgbe_fc_full)
ifmr->ifm_active |= IFM_ETH_RXPAUSE;
- if (adapter->fc == ixgbe_fc_tx_pause || adapter->fc == ixgbe_fc_full)
+ if (hw->fc.current_mode == ixgbe_fc_tx_pause ||
+ hw->fc.current_mode == ixgbe_fc_full)
ifmr->ifm_active |= IFM_ETH_TXPAUSE;
#endif
@@ -1598,21 +1696,22 @@ ixgbe_media_change(struct ifnet * ifp)
if (IFM_TYPE(ifm->ifm_media) != IFM_ETHER)
return (EINVAL);
+ if (hw->phy.media_type == ixgbe_media_type_backplane)
+ return (EPERM);
+
/*
** We don't actually need to check against the supported
** media types of the adapter; ifmedia will take care of
** that for us.
- ** NOTE: this relies on falling thru the switch
- ** to get all the values set, it can be confusing.
*/
switch (IFM_SUBTYPE(ifm->ifm_media)) {
case IFM_AUTO:
case IFM_10G_T:
speed |= IXGBE_LINK_SPEED_100_FULL;
case IFM_10G_LRM:
- case IFM_10G_SR: /* KR, too */
+ case IFM_10G_SR: /* KR, too */
case IFM_10G_LR:
- case IFM_10G_CX4: /* KX4 for now */
+ case IFM_10G_CX4: /* KX4 */
speed |= IXGBE_LINK_SPEED_1GB_FULL;
case IFM_10G_TWINAX:
speed |= IXGBE_LINK_SPEED_10GB_FULL;
@@ -1621,7 +1720,7 @@ ixgbe_media_change(struct ifnet * ifp)
speed |= IXGBE_LINK_SPEED_100_FULL;
case IFM_1000_LX:
case IFM_1000_SX:
- case IFM_1000_CX: /* KX until there's real support */
+ case IFM_1000_CX: /* KX */
speed |= IXGBE_LINK_SPEED_1GB_FULL;
break;
case IFM_100_TX:
@@ -1641,7 +1740,7 @@ ixgbe_media_change(struct ifnet * ifp)
return (0);
invalid:
- device_printf(adapter->dev, "Invalid media type\n");
+ device_printf(adapter->dev, "Invalid media type!\n");
return (EINVAL);
}
@@ -1866,7 +1965,6 @@ ixgbe_update_link_status(struct adapter *adapter)
struct ifnet *ifp = adapter->ifp;
device_t dev = adapter->dev;
-
if (adapter->link_up){
if (adapter->link_active == FALSE) {
if (bootverbose)
@@ -1876,6 +1974,8 @@ ixgbe_update_link_status(struct adapter *adapter)
adapter->link_active = TRUE;
/* Update any Flow Control changes */
ixgbe_fc_enable(&adapter->hw);
+ /* Update DMA coalescing config */
+ ixgbe_config_dmac(adapter);
if_link_state_change(ifp, LINK_STATE_UP);
}
} else { /* Link down */
@@ -1962,7 +2062,7 @@ ixgbe_identify_hardware(struct adapter *adapter)
/* We need this here to set the num_segs below */
ixgbe_set_mac_type(hw);
- /* Pick up the 82599 and VF settings */
+ /* Pick up the 82599 settings */
if (hw->mac.type != ixgbe_mac_82598EB) {
hw->phy.smart_speed = ixgbe_smart_speed;
adapter->num_segs = IXGBE_82599_SCATTER;
@@ -2072,6 +2172,7 @@ ixgbe_allocate_legacy(struct adapter *adapter)
TASK_INIT(&adapter->link_task, 0, ixgbe_handle_link, adapter);
TASK_INIT(&adapter->mod_task, 0, ixgbe_handle_mod, adapter);
TASK_INIT(&adapter->msf_task, 0, ixgbe_handle_msf, adapter);
+ TASK_INIT(&adapter->phy_task, 0, ixgbe_handle_phy, adapter);
#ifdef IXGBE_FDIR
TASK_INIT(&adapter->fdir_task, 0, ixgbe_reinit_fdir, adapter);
#endif
@@ -2137,8 +2238,6 @@ ixgbe_allocate_msix(struct adapter *adapter)
}
#endif
-
-
for (int i = 0; i < adapter->num_queues; i++, vector++, que++, txr++) {
rid = vector + 1;
que->res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
@@ -2188,14 +2287,11 @@ ixgbe_allocate_msix(struct adapter *adapter)
"Bound RSS bucket %d to CPU %d\n",
i, cpu_id);
#else
-#if 0 // This is too noisy
- device_printf(dev,
- "Bound queue %d to cpu %d\n",
- i, cpu_id);
+ if (bootverbose)
+ device_printf(dev,
+ "Bound queue %d to cpu %d\n",
+ i, cpu_id);
#endif
-#endif
-
-
#ifndef IXGBE_LEGACY_TX
TASK_INIT(&txr->txq_task, 0, ixgbe_deferred_mq_start, txr);
#endif
@@ -2241,6 +2337,7 @@ ixgbe_allocate_msix(struct adapter *adapter)
TASK_INIT(&adapter->link_task, 0, ixgbe_handle_link, adapter);
TASK_INIT(&adapter->mod_task, 0, ixgbe_handle_mod, adapter);
TASK_INIT(&adapter->msf_task, 0, ixgbe_handle_msf, adapter);
+ TASK_INIT(&adapter->phy_task, 0, ixgbe_handle_phy, adapter);
#ifdef IXGBE_FDIR
TASK_INIT(&adapter->fdir_task, 0, ixgbe_reinit_fdir, adapter);
#endif
@@ -2466,6 +2563,12 @@ ixgbe_setup_interface(device_t dev, struct adapter *adapter)
#if __FreeBSD_version >= 1100036
if_setgetcounterfn(ifp, ixgbe_get_counter);
#endif
+#if __FreeBSD_version >= 1100045
+ /* TSO parameters */
+ ifp->if_hw_tsomax = 65518;
+ ifp->if_hw_tsomaxsegcount = IXGBE_82599_SCATTER;
+ ifp->if_hw_tsomaxsegsize = 2048;
+#endif
#ifndef IXGBE_LEGACY_TX
ifp->if_transmit = ixgbe_mq_start;
ifp->if_qflush = ixgbe_qflush;
@@ -2549,10 +2652,6 @@ ixgbe_add_media_types(struct adapter *adapter)
ifmedia_add(&adapter->media, IFM_ETHER | IFM_10G_CX4, 0, NULL);
if (layer & IXGBE_PHYSICAL_LAYER_1000BASE_SX)
ifmedia_add(&adapter->media, IFM_ETHER | IFM_1000_SX, 0, NULL);
-#if 0
- if (layer & IXGBE_PHYSICAL_LAYER_1000BASE_LX)
- ifmedia_add(&adapter->media, IFM_ETHER | IFM_1000_LX, 0, NULL);
-#endif
/*
** Other (no matching FreeBSD media type):
@@ -2561,25 +2660,24 @@ ixgbe_add_media_types(struct adapter *adapter)
*/
if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KR) {
device_printf(dev, "Media supported: 10GbaseKR\n");
- device_printf(dev, "10GbaseKR mapped to 10baseT\n");
- ifmedia_add(&adapter->media, IFM_ETHER | IFM_10_T, 0, NULL);
+ device_printf(dev, "10GbaseKR mapped to 10GbaseSR\n");
+ ifmedia_add(&adapter->media, IFM_ETHER | IFM_10G_SR, 0, NULL);
}
if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KX4) {
device_printf(dev, "Media supported: 10GbaseKX4\n");
- device_printf(dev, "10GbaseKX4 mapped to 10base2\n");
- ifmedia_add(&adapter->media, IFM_ETHER | IFM_10_2, 0, NULL);
+ device_printf(dev, "10GbaseKX4 mapped to 10GbaseCX4\n");
+ ifmedia_add(&adapter->media, IFM_ETHER | IFM_10G_CX4, 0, NULL);
}
if (layer & IXGBE_PHYSICAL_LAYER_1000BASE_KX) {
device_printf(dev, "Media supported: 1000baseKX\n");
- device_printf(dev, "1000baseKX mapped to 10base5\n");
- ifmedia_add(&adapter->media, IFM_ETHER | IFM_10_5, 0, NULL);
+ device_printf(dev, "1000baseKX mapped to 1000baseCX\n");
+ ifmedia_add(&adapter->media, IFM_ETHER | IFM_1000_CX, 0, NULL);
}
if (layer & IXGBE_PHYSICAL_LAYER_1000BASE_BX) {
/* Someday, someone will care about you... */
device_printf(dev, "Media supported: 1000baseBX\n");
}
- /* Very old */
if (hw->device_id == IXGBE_DEV_ID_82598AT) {
ifmedia_add(&adapter->media,
IFM_ETHER | IFM_1000_T | IFM_FDX, 0, NULL);
@@ -2707,7 +2805,8 @@ ixgbe_initialise_rss_mapping(struct adapter *adapter)
{
struct ixgbe_hw *hw = &adapter->hw;
uint32_t reta;
- int i, j, queue_id;
+ int i, j, queue_id, table_size;
+ int index_mult;
uint32_t rss_key[10];
uint32_t mrqc;
#ifdef RSS
@@ -2725,8 +2824,23 @@ ixgbe_initialise_rss_mapping(struct adapter *adapter)
arc4rand(&rss_key, sizeof(rss_key), 0);
#endif
+ /* Set multiplier for RETA setup and table size based on MAC */
+ index_mult = 0x1;
+ table_size = 128;
+ switch (adapter->hw.mac.type) {
+ case ixgbe_mac_82598EB:
+ index_mult = 0x11;
+ break;
+ case ixgbe_mac_X550:
+ case ixgbe_mac_X550EM_x:
+ table_size = 512;
+ break;
+ default:
+ break;
+ }
+
/* Set up the redirection table */
- for (i = 0, j = 0; i < 128; i++, j++) {
+ for (i = 0, j = 0; i < table_size; i++, j++) {
if (j == adapter->num_queues) j = 0;
#ifdef RSS
/*
@@ -2737,7 +2851,7 @@ ixgbe_initialise_rss_mapping(struct adapter *adapter)
queue_id = rss_get_indirection_to_bucket(i);
queue_id = queue_id % adapter->num_queues;
#else
- queue_id = (j * 0x11);
+ queue_id = (j * index_mult);
#endif
/*
* The low 8 bits are for hash value (n+0);
@@ -2746,7 +2860,10 @@ ixgbe_initialise_rss_mapping(struct adapter *adapter)
reta = reta >> 8;
reta = reta | ( ((uint32_t) queue_id) << 24);
if ((i & 3) == 3) {
- IXGBE_WRITE_REG(hw, IXGBE_RETA(i >> 2), reta);
+ if (i < 128)
+ IXGBE_WRITE_REG(hw, IXGBE_RETA(i >> 2), reta);
+ else
+ IXGBE_WRITE_REG(hw, IXGBE_ERETA((i >> 2) - 32), reta);
reta = 0;
}
}
@@ -2835,8 +2952,10 @@ ixgbe_initialize_receive_units(struct adapter *adapter)
/* Enable broadcasts */
fctrl = IXGBE_READ_REG(hw, IXGBE_FCTRL);
fctrl |= IXGBE_FCTRL_BAM;
- fctrl |= IXGBE_FCTRL_DPF;
- fctrl |= IXGBE_FCTRL_PMCF;
+ if (adapter->hw.mac.type == ixgbe_mac_82598EB) {
+ fctrl |= IXGBE_FCTRL_DPF;
+ fctrl |= IXGBE_FCTRL_PMCF;
+ }
IXGBE_WRITE_REG(hw, IXGBE_FCTRL, fctrl);
/* Set for Jumbo Frames? */
@@ -3046,30 +3165,37 @@ ixgbe_enable_intr(struct adapter *adapter)
mask = (IXGBE_EIMS_ENABLE_MASK & ~IXGBE_EIMS_RTX_QUEUE);
/* Enable Fan Failure detection */
if (hw->device_id == IXGBE_DEV_ID_82598AT)
- mask |= IXGBE_EIMS_GPI_SDP1_BY_MAC(hw);
+ mask |= IXGBE_EIMS_GPI_SDP1;
switch (adapter->hw.mac.type) {
case ixgbe_mac_82599EB:
mask |= IXGBE_EIMS_ECC;
/* Temperature sensor on some adapters */
- mask |= IXGBE_EIMS_GPI_SDP0_BY_MAC(hw);
+ mask |= IXGBE_EIMS_GPI_SDP0;
/* SFP+ (RX_LOS_N & MOD_ABS_N) */
- mask |= IXGBE_EIMS_GPI_SDP1_BY_MAC(hw);
- mask |= IXGBE_EIMS_GPI_SDP2_BY_MAC(hw);
+ mask |= IXGBE_EIMS_GPI_SDP1;
+ mask |= IXGBE_EIMS_GPI_SDP2;
#ifdef IXGBE_FDIR
mask |= IXGBE_EIMS_FLOW_DIR;
#endif
break;
case ixgbe_mac_X540:
- case ixgbe_mac_X550:
- case ixgbe_mac_X550EM_a:
- case ixgbe_mac_X550EM_x:
/* Detect if Thermal Sensor is enabled */
fwsm = IXGBE_READ_REG(hw, IXGBE_FWSM);
if (fwsm & IXGBE_FWSM_TS_ENABLED)
mask |= IXGBE_EIMS_TS;
- /* XXX: Which SFP mode line does this look at? */
- if (hw->device_id == IXGBE_DEV_ID_X550EM_X_SFP)
+ mask |= IXGBE_EIMS_ECC;
+#ifdef IXGBE_FDIR
+ mask |= IXGBE_EIMS_FLOW_DIR;
+#endif
+ break;
+ case ixgbe_mac_X550:
+ case ixgbe_mac_X550EM_x:
+ /* MAC thermal sensor is automatically enabled */
+ mask |= IXGBE_EIMS_TS;
+ /* Some devices use SDP0 for important information */
+ if (hw->device_id == IXGBE_DEV_ID_X550EM_X_SFP ||
+ hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T)
mask |= IXGBE_EIMS_GPI_SDP0_BY_MAC(hw);
mask |= IXGBE_EIMS_ECC;
#ifdef IXGBE_FDIR
@@ -3082,7 +3208,7 @@ ixgbe_enable_intr(struct adapter *adapter)
IXGBE_WRITE_REG(hw, IXGBE_EIMS, mask);
- /* With RSS we use auto clear */
+ /* With MSI-X we use auto clear */
if (adapter->msix_mem) {
mask = IXGBE_EIMS_ENABLE_MASK;
/* Don't autoclear Link */
@@ -3136,10 +3262,12 @@ ixgbe_get_slot_info(struct ixgbe_hw *hw)
if (hw->device_id != IXGBE_DEV_ID_82599_SFP_SF_QP) {
ixgbe_get_bus_info(hw);
/* These devices don't use PCI-E */
- if (hw->mac.type == ixgbe_mac_X550EM_x
- || hw->mac.type == ixgbe_mac_X550EM_a)
+ switch (hw->mac.type) {
+ case ixgbe_mac_X550EM_x:
return;
- goto display;
+ default:
+ goto display;
+ }
}
/*
@@ -3261,7 +3389,6 @@ ixgbe_set_ivar(struct adapter *adapter, u8 entry, u8 vector, s8 type)
case ixgbe_mac_82599EB:
case ixgbe_mac_X540:
case ixgbe_mac_X550:
- case ixgbe_mac_X550EM_a:
case ixgbe_mac_X550EM_x:
if (type == -1) { /* MISC IVAR */
index = (entry & 1) * 8;
@@ -3290,8 +3417,14 @@ ixgbe_configure_ivars(struct adapter *adapter)
if (ixgbe_max_interrupt_rate > 0)
newitr = (4000000 / ixgbe_max_interrupt_rate) & 0x0FF8;
- else
+ else {
+ /*
+ ** Disable DMA coalescing if interrupt moderation is
+ ** disabled.
+ */
+ adapter->dmac = 0;
newitr = 0;
+ }
for (int i = 0; i < adapter->num_queues; i++, que++) {
/* First the RX queue entry */
@@ -3351,7 +3484,7 @@ ixgbe_handle_link(void *context, int pending)
ixgbe_check_link(&adapter->hw,
&adapter->link_speed, &adapter->link_up, 0);
- ixgbe_update_link_status(adapter);
+ ixgbe_update_link_status(adapter);
}
/*
@@ -3411,6 +3544,28 @@ ixgbe_handle_msf(void *context, int pending)
return;
}
+/*
+** Tasklet for handling interrupts from an external PHY
+*/
+static void
+ixgbe_handle_phy(void *context, int pending)
+{
+ struct adapter *adapter = context;
+ struct ixgbe_hw *hw = &adapter->hw;
+ int error;
+
+ error = hw->phy.ops.handle_lasi(hw);
+ if (error == IXGBE_ERR_OVERTEMP)
+ device_printf(adapter->dev,
+ "CRITICAL: EXTERNAL PHY OVER TEMP!! "
+ " PHY will downshift to lower power state!\n");
+ else if (error)
+ device_printf(adapter->dev,
+ "Error handling LASI interrupt: %d\n",
+ error);
+ return;
+}
+
#ifdef IXGBE_FDIR
/*
** Tasklet for reinitializing the Flow Director filter table
@@ -3433,6 +3588,127 @@ ixgbe_reinit_fdir(void *context, int pending)
}
#endif
+/*********************************************************************
+ *
+ * Configure DMA Coalescing
+ *
+ **********************************************************************/
+static void
+ixgbe_config_dmac(struct adapter *adapter)
+{
+ struct ixgbe_hw *hw = &adapter->hw;
+ struct ixgbe_dmac_config *dcfg = &hw->mac.dmac_config;
+
+ if (hw->mac.type < ixgbe_mac_X550 ||
+ !hw->mac.ops.dmac_config)
+ return;
+
+ if (dcfg->watchdog_timer ^ adapter->dmac ||
+ dcfg->link_speed ^ adapter->link_speed) {
+ dcfg->watchdog_timer = adapter->dmac;
+ dcfg->fcoe_en = false;
+ dcfg->link_speed = adapter->link_speed;
+ dcfg->num_tcs = 1;
+
+ INIT_DEBUGOUT2("dmac settings: watchdog %d, link speed %d\n",
+ dcfg->watchdog_timer, dcfg->link_speed);
+
+ hw->mac.ops.dmac_config(hw);
+ }
+}
+
+/*
+ * Checks whether the adapter supports Energy Efficient Ethernet
+ * or not, based on device ID.
+ */
+static void
+ixgbe_check_eee_support(struct adapter *adapter)
+{
+ struct ixgbe_hw *hw = &adapter->hw;
+
+ adapter->eee_support = adapter->eee_enabled =
+ (hw->device_id == IXGBE_DEV_ID_X550T ||
+ hw->device_id == IXGBE_DEV_ID_X550EM_X_KR);
+}
+
+/*
+ * Checks whether the adapter's ports are capable of
+ * Wake On LAN by reading the adapter's NVM.
+ *
+ * Sets each port's hw->wol_enabled value depending
+ * on the value read here.
+ */
+static void
+ixgbe_check_wol_support(struct adapter *adapter)
+{
+ struct ixgbe_hw *hw = &adapter->hw;
+ u16 dev_caps = 0;
+
+ /* Find out WoL support for port */
+ adapter->wol_support = hw->wol_enabled = 0;
+ ixgbe_get_device_caps(hw, &dev_caps);
+ if ((dev_caps & IXGBE_DEVICE_CAPS_WOL_PORT0_1) ||
+ ((dev_caps & IXGBE_DEVICE_CAPS_WOL_PORT0) &&
+ hw->bus.func == 0))
+ adapter->wol_support = hw->wol_enabled = 1;
+
+ /* Save initial wake up filter configuration */
+ adapter->wufc = IXGBE_READ_REG(hw, IXGBE_WUFC);
+
+ return;
+}
+
+/*
+ * Prepare the adapter/port for LPLU and/or WoL
+ */
+static int
+ixgbe_setup_low_power_mode(struct adapter *adapter)
+{
+ struct ixgbe_hw *hw = &adapter->hw;
+ device_t dev = adapter->dev;
+ s32 error = 0;
+
+ mtx_assert(&adapter->core_mtx, MA_OWNED);
+
+ /* Limit power management flow to X550EM baseT */
+ if (hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T
+ && hw->phy.ops.enter_lplu) {
+ /* Turn off support for APM wakeup. (Using ACPI instead) */
+ IXGBE_WRITE_REG(hw, IXGBE_GRC,
+ IXGBE_READ_REG(hw, IXGBE_GRC) & ~(u32)2);
+
+ /*
+ * Clear Wake Up Status register to prevent any previous wakeup
+ * events from waking us up immediately after we suspend.
+ */
+ IXGBE_WRITE_REG(hw, IXGBE_WUS, 0xffffffff);
+
+ /*
+ * Program the Wakeup Filter Control register with user filter
+ * settings
+ */
+ IXGBE_WRITE_REG(hw, IXGBE_WUFC, adapter->wufc);
+
+ /* Enable wakeups and power management in Wakeup Control */
+ IXGBE_WRITE_REG(hw, IXGBE_WUC,
+ IXGBE_WUC_WKEN | IXGBE_WUC_PME_EN);
+
+ /* X550EM baseT adapters need a special LPLU flow */
+ hw->phy.reset_disable = true;
+ ixgbe_stop(adapter);
+ error = hw->phy.ops.enter_lplu(hw);
+ if (error)
+ device_printf(dev,
+ "Error entering LPLU: %d\n", error);
+ hw->phy.reset_disable = false;
+ } else {
+ /* Just stop for other adapters */
+ ixgbe_stop(adapter);
+ }
+
+ return error;
+}
+
/**********************************************************************
*
* Update the board statistics counters.
@@ -3450,42 +3726,6 @@ ixgbe_update_stats_counters(struct adapter *adapter)
adapter->stats.pf.errbc += IXGBE_READ_REG(hw, IXGBE_ERRBC);
adapter->stats.pf.mspdc += IXGBE_READ_REG(hw, IXGBE_MSPDC);
- /*
- ** Note: these are for the 8 possible traffic classes,
- ** which in current implementation is unused,
- ** therefore only 0 should read real data.
- */
- for (int i = 0; i < 8; i++) {
- u32 mp;
- mp = IXGBE_READ_REG(hw, IXGBE_MPC(i));
- /* missed_rx tallies misses for the gprc workaround */
- missed_rx += mp;
- /* global total per queue */
- adapter->stats.pf.mpc[i] += mp;
- /* total for stats display */
- total_missed_rx += adapter->stats.pf.mpc[i];
- if (hw->mac.type == ixgbe_mac_82598EB) {
- adapter->stats.pf.rnbc[i] +=
- IXGBE_READ_REG(hw, IXGBE_RNBC(i));
- adapter->stats.pf.qbtc[i] +=
- IXGBE_READ_REG(hw, IXGBE_QBTC(i));
- adapter->stats.pf.qbrc[i] +=
- IXGBE_READ_REG(hw, IXGBE_QBRC(i));
- adapter->stats.pf.pxonrxc[i] +=
- IXGBE_READ_REG(hw, IXGBE_PXONRXC(i));
- } else
- adapter->stats.pf.pxonrxc[i] +=
- IXGBE_READ_REG(hw, IXGBE_PXONRXCNT(i));
- adapter->stats.pf.pxontxc[i] +=
- IXGBE_READ_REG(hw, IXGBE_PXONTXC(i));
- adapter->stats.pf.pxofftxc[i] +=
- IXGBE_READ_REG(hw, IXGBE_PXOFFTXC(i));
- if (hw->mac.type != ixgbe_mac_X550EM_x)
- adapter->stats.pf.pxoffrxc[i] +=
- IXGBE_READ_REG(hw, IXGBE_PXOFFRXC(i));
- adapter->stats.pf.pxon2offc[i] +=
- IXGBE_READ_REG(hw, IXGBE_PXON2OFFCNT(i));
- }
for (int i = 0; i < 16; i++) {
adapter->stats.pf.qprc[i] += IXGBE_READ_REG(hw, IXGBE_QPRC(i));
adapter->stats.pf.qptc[i] += IXGBE_READ_REG(hw, IXGBE_QPTC(i));
@@ -3593,6 +3833,8 @@ static uint64_t
ixgbe_get_counter(struct ifnet *ifp, ift_counter cnt)
{
struct adapter *adapter;
+ struct tx_ring *txr;
+ uint64_t rv;
adapter = if_getsoftc(ifp);
@@ -3613,6 +3855,12 @@ ixgbe_get_counter(struct ifnet *ifp, ift_counter cnt)
return (0);
case IFCOUNTER_IQDROPS:
return (adapter->iqdrops);
+ case IFCOUNTER_OQDROPS:
+ rv = 0;
+ txr = adapter->tx_rings;
+ for (int i = 0; i < adapter->num_queues; i++, txr++)
+ rv += txr->br->br_drops;
+ return (rv);
case IFCOUNTER_IERRORS:
return (adapter->ierrors);
default:
@@ -3721,6 +3969,108 @@ ixgbe_sysctl_interrupt_rate_handler(SYSCTL_HANDLER_ARGS)
return 0;
}
+static void
+ixgbe_add_device_sysctls(struct adapter *adapter)
+{
+ device_t dev = adapter->dev;
+ struct ixgbe_hw *hw = &adapter->hw;
+ struct sysctl_oid_list *child;
+ struct sysctl_ctx_list *ctx;
+
+ ctx = device_get_sysctl_ctx(dev);
+ child = SYSCTL_CHILDREN(device_get_sysctl_tree(dev));
+
+ /* Sysctls for all devices */
+ SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "fc",
+ CTLTYPE_INT | CTLFLAG_RW, adapter, 0,
+ ixgbe_set_flowcntl, "I", IXGBE_SYSCTL_DESC_SET_FC);
+
+ SYSCTL_ADD_INT(ctx, child, OID_AUTO, "enable_aim",
+ CTLFLAG_RW,
+ &ixgbe_enable_aim, 1, "Interrupt Moderation");
+
+ SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "advertise_speed",
+ CTLTYPE_INT | CTLFLAG_RW, adapter, 0,
+ ixgbe_set_advertise, "I", IXGBE_SYSCTL_DESC_ADV_SPEED);
+
+ SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "thermal_test",
+ CTLTYPE_INT | CTLFLAG_RW, adapter, 0,
+ ixgbe_sysctl_thermal_test, "I", "Thermal Test");
+
+ /* for X550 devices */
+ if (hw->mac.type >= ixgbe_mac_X550)
+ SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "dmac",
+ CTLTYPE_INT | CTLFLAG_RW, adapter, 0,
+ ixgbe_sysctl_dmac, "I", "DMA Coalesce");
+
+ /* for X550T and X550EM backplane devices */
+ if (hw->device_id == IXGBE_DEV_ID_X550T ||
+ hw->device_id == IXGBE_DEV_ID_X550EM_X_KR) {
+ struct sysctl_oid *eee_node;
+ struct sysctl_oid_list *eee_list;
+
+ eee_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, "eee",
+ CTLFLAG_RD, NULL,
+ "Energy Efficient Ethernet sysctls");
+ eee_list = SYSCTL_CHILDREN(eee_node);
+
+ SYSCTL_ADD_PROC(ctx, eee_list, OID_AUTO, "enable",
+ CTLTYPE_INT | CTLFLAG_RW, adapter, 0,
+ ixgbe_sysctl_eee_enable, "I",
+ "Enable or Disable EEE");
+
+ SYSCTL_ADD_PROC(ctx, eee_list, OID_AUTO, "negotiated",
+ CTLTYPE_INT | CTLFLAG_RD, adapter, 0,
+ ixgbe_sysctl_eee_negotiated, "I",
+ "EEE negotiated on link");
+
+ SYSCTL_ADD_PROC(ctx, eee_list, OID_AUTO, "tx_lpi_status",
+ CTLTYPE_INT | CTLFLAG_RD, adapter, 0,
+ ixgbe_sysctl_eee_tx_lpi_status, "I",
+ "Whether or not TX link is in LPI state");
+
+ SYSCTL_ADD_PROC(ctx, eee_list, OID_AUTO, "rx_lpi_status",
+ CTLTYPE_INT | CTLFLAG_RD, adapter, 0,
+ ixgbe_sysctl_eee_rx_lpi_status, "I",
+ "Whether or not RX link is in LPI state");
+ }
+
+ /* for certain 10GBaseT devices */
+ if (hw->device_id == IXGBE_DEV_ID_X550T ||
+ hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T) {
+ SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "wol_enable",
+ CTLTYPE_INT | CTLFLAG_RW, adapter, 0,
+ ixgbe_sysctl_wol_enable, "I",
+ "Enable/Disable Wake on LAN");
+
+ SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "wufc",
+ CTLTYPE_INT | CTLFLAG_RW, adapter, 0,
+ ixgbe_sysctl_wufc, "I",
+ "Enable/Disable Wake Up Filters");
+ }
+
+ /* for X550EM 10GBaseT devices */
+ if (hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T) {
+ struct sysctl_oid *phy_node;
+ struct sysctl_oid_list *phy_list;
+
+ phy_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, "phy",
+ CTLFLAG_RD, NULL,
+ "External PHY sysctls");
+ phy_list = SYSCTL_CHILDREN(phy_node);
+
+ SYSCTL_ADD_PROC(ctx, phy_list, OID_AUTO, "temp",
+ CTLTYPE_INT | CTLFLAG_RD, adapter, 0,
+ ixgbe_sysctl_phy_temp, "I",
+ "Current External PHY Temperature (Celsius)");
+
+ SYSCTL_ADD_PROC(ctx, phy_list, OID_AUTO, "overtemp_occurred",
+ CTLTYPE_INT | CTLFLAG_RD, adapter, 0,
+ ixgbe_sysctl_phy_overtemp_occurred, "I",
+ "External PHY High Temperature Event Occurred");
+ }
+}
+
/*
* Add sysctl variables, one per statistic, to the system.
*/
@@ -3754,7 +4104,7 @@ ixgbe_add_hw_stats(struct adapter *adapter)
CTLFLAG_RD, &adapter->watchdog_events,
"Watchdog timeouts");
SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "link_irq",
- CTLFLAG_RD, &adapter->vector_irq,
+ CTLFLAG_RD, &adapter->link_irq,
"Link MSIX IRQ Handled");
for (int i = 0; i < adapter->num_queues; i++, txr++) {
@@ -3791,6 +4141,9 @@ ixgbe_add_hw_stats(struct adapter *adapter)
SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "tx_packets",
CTLFLAG_RD, &txr->total_packets,
"Queue Packets Transmitted");
+ SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "br_drops",
+ CTLFLAG_RD, &txr->br->br_drops,
+ "Packets dropped in buf_ring");
}
for (int i = 0; i < adapter->num_queues; i++, rxr++) {
@@ -4083,20 +4436,77 @@ ixgbe_set_advertise(SYSCTL_HANDLER_ARGS)
}
/*
-** Thermal Shutdown Trigger
-** - cause a Thermal Overtemp IRQ
-** - this now requires firmware enabling
-*/
+ * The following two sysctls are for X550 BaseT devices;
+ * they deal with the external PHY used in them.
+ */
static int
-ixgbe_set_thermal_test(SYSCTL_HANDLER_ARGS)
+ixgbe_sysctl_phy_temp(SYSCTL_HANDLER_ARGS)
{
- int error, fire = 0;
struct adapter *adapter = (struct adapter *) arg1;
struct ixgbe_hw *hw = &adapter->hw;
+ u16 reg;
+ if (hw->device_id != IXGBE_DEV_ID_X550EM_X_10G_T) {
+ device_printf(adapter->dev,
+ "Device has no supported external thermal sensor.\n");
+ return (ENODEV);
+ }
- if (hw->mac.type < ixgbe_mac_X540)
- return (0);
+ if (hw->phy.ops.read_reg(hw, IXGBE_PHY_CURRENT_TEMP,
+ IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
+ &reg)) {
+ device_printf(adapter->dev,
+ "Error reading from PHY's current temperature register\n");
+ return (EAGAIN);
+ }
+
+ /* Shift temp for output */
+ reg = reg >> 8;
+
+ return (sysctl_handle_int(oidp, NULL, reg, req));
+}
+
+/*
+ * Reports whether the current PHY temperature is over
+ * the overtemp threshold.
+ * - This is reported directly from the PHY
+ */
+static int
+ixgbe_sysctl_phy_overtemp_occurred(SYSCTL_HANDLER_ARGS)
+{
+ struct adapter *adapter = (struct adapter *) arg1;
+ struct ixgbe_hw *hw = &adapter->hw;
+ u16 reg;
+
+ if (hw->device_id != IXGBE_DEV_ID_X550EM_X_10G_T) {
+ device_printf(adapter->dev,
+ "Device has no supported external thermal sensor.\n");
+ return (ENODEV);
+ }
+
+ if (hw->phy.ops.read_reg(hw, IXGBE_PHY_OVERTEMP_STATUS,
+ IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
+ &reg)) {
+ device_printf(adapter->dev,
+ "Error reading from PHY's temperature status register\n");
+ return (EAGAIN);
+ }
+
+ /* Get occurrence bit */
+ reg = !!(reg & 0x4000);
+ return (sysctl_handle_int(oidp, 0, reg, req));
+}
+
+/*
+** Thermal Shutdown Trigger (internal MAC)
+** - Set this to 1 to cause an overtemp event to occur
+*/
+static int
+ixgbe_sysctl_thermal_test(SYSCTL_HANDLER_ARGS)
+{
+ struct adapter *adapter = (struct adapter *) arg1;
+ struct ixgbe_hw *hw = &adapter->hw;
+ int error, fire = 0;
error = sysctl_handle_int(oidp, &fire, 0, req);
if ((error) || (req->newptr == NULL))
@@ -4112,6 +4522,223 @@ ixgbe_set_thermal_test(SYSCTL_HANDLER_ARGS)
}
/*
+** Manage DMA Coalescing.
+** Control values:
+** 0/1 - off / on (use default value of 1000)
+**
+** Legal timer values are:
+** 50,100,250,500,1000,2000,5000,10000
+**
+** Turning off interrupt moderation will also turn this off.
+*/
+static int
+ixgbe_sysctl_dmac(SYSCTL_HANDLER_ARGS)
+{
+ struct adapter *adapter = (struct adapter *) arg1;
+ struct ixgbe_hw *hw = &adapter->hw;
+ struct ifnet *ifp = adapter->ifp;
+ int error;
+ u16 oldval;
+
+ oldval = adapter->dmac;
+ error = sysctl_handle_int(oidp, &adapter->dmac, 0, req);
+ if ((error) || (req->newptr == NULL))
+ return (error);
+
+ switch (hw->mac.type) {
+ case ixgbe_mac_X550:
+ case ixgbe_mac_X550EM_x:
+ break;
+ default:
+ device_printf(adapter->dev,
+ "DMA Coalescing is only supported on X550 devices\n");
+ return (ENODEV);
+ }
+
+ switch (adapter->dmac) {
+ case 0:
+ /* Disabled */
+ break;
+ case 1: /* Enable and use default */
+ adapter->dmac = 1000;
+ break;
+ case 50:
+ case 100:
+ case 250:
+ case 500:
+ case 1000:
+ case 2000:
+ case 5000:
+ case 10000:
+ /* Legal values - allow */
+ break;
+ default:
+ /* Do nothing, illegal value */
+ adapter->dmac = oldval;
+ return (EINVAL);
+ }
+
+ /* Re-initialize hardware if it's already running */
+ if (ifp->if_drv_flags & IFF_DRV_RUNNING)
+ ixgbe_init(adapter);
+
+ return (0);
+}
+
+/*
+ * Sysctl to enable/disable the WoL capability, if supported by the adapter.
+ * Values:
+ * 0 - disabled
+ * 1 - enabled
+ */
+static int
+ixgbe_sysctl_wol_enable(SYSCTL_HANDLER_ARGS)
+{
+ struct adapter *adapter = (struct adapter *) arg1;
+ struct ixgbe_hw *hw = &adapter->hw;
+ int new_wol_enabled;
+ int error = 0;
+
+ new_wol_enabled = hw->wol_enabled;
+ error = sysctl_handle_int(oidp, &new_wol_enabled, 0, req);
+ if ((error) || (req->newptr == NULL))
+ return (error);
+ if (new_wol_enabled == hw->wol_enabled)
+ return (0);
+
+ if (new_wol_enabled > 0 && !adapter->wol_support)
+ return (ENODEV);
+ else
+ hw->wol_enabled = !!(new_wol_enabled);
+
+ return (0);
+}
+
+/*
+ * Sysctl to enable/disable the Energy Efficient Ethernet capability,
+ * if supported by the adapter.
+ * Values:
+ * 0 - disabled
+ * 1 - enabled
+ */
+static int
+ixgbe_sysctl_eee_enable(SYSCTL_HANDLER_ARGS)
+{
+ struct adapter *adapter = (struct adapter *) arg1;
+ struct ifnet *ifp = adapter->ifp;
+ int new_eee_enabled, error = 0;
+
+ new_eee_enabled = adapter->eee_enabled;
+ error = sysctl_handle_int(oidp, &new_eee_enabled, 0, req);
+ if ((error) || (req->newptr == NULL))
+ return (error);
+ if (new_eee_enabled == adapter->eee_enabled)
+ return (0);
+
+ if (new_eee_enabled > 0 && !adapter->eee_support)
+ return (ENODEV);
+ else
+ adapter->eee_enabled = !!(new_eee_enabled);
+
+ /* Re-initialize hardware if it's already running */
+ if (ifp->if_drv_flags & IFF_DRV_RUNNING)
+ ixgbe_init(adapter);
+
+ return (0);
+}
+
+/*
+ * Read-only sysctl indicating whether EEE support was negotiated
+ * on the link.
+ */
+static int
+ixgbe_sysctl_eee_negotiated(SYSCTL_HANDLER_ARGS)
+{
+ struct adapter *adapter = (struct adapter *) arg1;
+ struct ixgbe_hw *hw = &adapter->hw;
+ bool status;
+
+ status = !!(IXGBE_READ_REG(hw, IXGBE_EEE_STAT) & IXGBE_EEE_STAT_NEG);
+
+ return (sysctl_handle_int(oidp, 0, status, req));
+}
+
+/*
+ * Read-only sysctl indicating whether RX Link is in LPI state.
+ */
+static int
+ixgbe_sysctl_eee_rx_lpi_status(SYSCTL_HANDLER_ARGS)
+{
+ struct adapter *adapter = (struct adapter *) arg1;
+ struct ixgbe_hw *hw = &adapter->hw;
+ bool status;
+
+ status = !!(IXGBE_READ_REG(hw, IXGBE_EEE_STAT) &
+ IXGBE_EEE_RX_LPI_STATUS);
+
+ return (sysctl_handle_int(oidp, 0, status, req));
+}
+
+/*
+ * Read-only sysctl indicating whether TX Link is in LPI state.
+ */
+static int
+ixgbe_sysctl_eee_tx_lpi_status(SYSCTL_HANDLER_ARGS)
+{
+ struct adapter *adapter = (struct adapter *) arg1;
+ struct ixgbe_hw *hw = &adapter->hw;
+ bool status;
+
+ status = !!(IXGBE_READ_REG(hw, IXGBE_EEE_STAT) &
+ IXGBE_EEE_TX_LPI_STATUS);
+
+ return (sysctl_handle_int(oidp, 0, status, req));
+}
+
+/*
+ * Sysctl to enable/disable the types of packets that the
+ * adapter will wake up on upon receipt.
+ * WUFC - Wake Up Filter Control
+ * Flags:
+ * 0x1 - Link Status Change
+ * 0x2 - Magic Packet
+ * 0x4 - Direct Exact
+ * 0x8 - Directed Multicast
+ * 0x10 - Broadcast
+ * 0x20 - ARP/IPv4 Request Packet
+ * 0x40 - Direct IPv4 Packet
+ * 0x80 - Direct IPv6 Packet
+ *
+ * Setting another flag will cause the sysctl to return an
+ * error.
+ */
+static int
+ixgbe_sysctl_wufc(SYSCTL_HANDLER_ARGS)
+{
+ struct adapter *adapter = (struct adapter *) arg1;
+ int error = 0;
+ u32 new_wufc;
+
+ new_wufc = adapter->wufc;
+
+ error = sysctl_handle_int(oidp, &new_wufc, 0, req);
+ if ((error) || (req->newptr == NULL))
+ return (error);
+ if (new_wufc == adapter->wufc)
+ return (0);
+
+ if (new_wufc & 0xffffff00)
+ return (EINVAL);
+ else {
+ new_wufc &= 0xff;
+ new_wufc |= (0xffffff & adapter->wufc);
+ adapter->wufc = new_wufc;
+ }
+
+ return (0);
+}
+
+/*
** Enable the hardware to drop packets when the buffer is
** full. This is useful when multiqueue,so that no single
** queue being full stalls the entire RX engine. We only
@@ -4155,6 +4782,7 @@ ixgbe_rearm_queues(struct adapter *adapter, u64 queues)
case ixgbe_mac_82599EB:
case ixgbe_mac_X540:
case ixgbe_mac_X550:
+ case ixgbe_mac_X550EM_x:
mask = (queues & 0xFFFFFFFF);
IXGBE_WRITE_REG(&adapter->hw, IXGBE_EICS_EX(0), mask);
mask = (queues >> 32);
diff --git a/sys/dev/ixgbe/if_ixv.c b/sys/dev/ixgbe/if_ixv.c
index 672077b..a550a85 100644
--- a/sys/dev/ixgbe/if_ixv.c
+++ b/sys/dev/ixgbe/if_ixv.c
@@ -60,7 +60,6 @@ static ixgbe_vendor_info_t ixv_vendor_info_array[] =
{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_VF, 0, 0, 0},
{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X540_VF, 0, 0, 0},
{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550_VF, 0, 0, 0},
- {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_VF, 0, 0, 0},
{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_X_VF, 0, 0, 0},
/* required last entry */
{0, 0, 0, 0, 0}
@@ -882,7 +881,7 @@ ixv_msix_mbx(void *arg)
struct ixgbe_hw *hw = &adapter->hw;
u32 reg;
- ++adapter->vector_irq;
+ ++adapter->link_irq;
/* First get the cause */
reg = IXGBE_READ_REG(hw, IXGBE_VTEICS);
@@ -2034,8 +2033,8 @@ ixv_add_stats_sysctls(struct adapter *adapter)
SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "tx_packets",
CTLFLAG_RD, &(txr->total_packets),
"TX Packets");
- SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "tx_bytes",
- CTLFLAG_RD, &(txr->tx_bytes),
+ SYSCTL_ADD_UINT(ctx, queue_list, OID_AUTO, "tx_bytes",
+ CTLFLAG_RD, &(txr->bytes), 0,
"TX Bytes");
SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "tx_no_desc",
CTLFLAG_RD, &(txr->no_desc_avail),
@@ -2083,7 +2082,7 @@ ixv_print_debug_info(struct adapter *adapter)
}
device_printf(dev,"MBX IRQ Handled: %lu\n",
- (long)adapter->vector_irq);
+ (long)adapter->link_irq);
return;
}
diff --git a/sys/dev/ixgbe/ix_txrx.c b/sys/dev/ixgbe/ix_txrx.c
index 6c9c84a..bfe1607 100644
--- a/sys/dev/ixgbe/ix_txrx.c
+++ b/sys/dev/ixgbe/ix_txrx.c
@@ -1,6 +1,6 @@
/******************************************************************************
- Copyright (c) 2001-2014, Intel Corporation
+ Copyright (c) 2001-2015, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -210,7 +210,11 @@ ixgbe_mq_start(struct ifnet *ifp, struct mbuf *m)
* If everything is setup correctly, it should be the
* same bucket that the current CPU we're on is.
*/
+#if __FreeBSD_version < 1100054
+ if (m->m_flags & M_FLOWID) {
+#else
if (M_HASHTYPE_GET(m) != M_HASHTYPE_NONE) {
+#endif
#ifdef RSS
if (rss_hash2bucket(m->m_pkthdr.flowid,
M_HASHTYPE_GET(m), &bucket_id) == 0)
@@ -276,7 +280,12 @@ ixgbe_mq_start_locked(struct ifnet *ifp, struct tx_ring *txr)
enqueued++;
#if 0 // this is VF-only
#if __FreeBSD_version >= 1100036
- if (next->m_flags & M_MCAST)
+ /*
+ * Since we're looking at the tx ring, we can check
+ * to see if we're a VF by examing our tail register
+ * address.
+ */
+ if (txr->tail < IXGBE_TDT(0) && next->m_flags & M_MCAST)
if_inc_counter(ifp, IFCOUNTER_OMCASTS, 1);
#endif
#endif
@@ -312,8 +321,8 @@ ixgbe_deferred_mq_start(void *arg, int pending)
}
/*
-** Flush all ring buffers
-*/
+ * Flush all ring buffers
+ */
void
ixgbe_qflush(struct ifnet *ifp)
{
@@ -387,6 +396,10 @@ retry:
/* Try it again? - one try */
if (remap == TRUE) {
remap = FALSE;
+ /*
+ * XXX: m_defrag will choke on
+ * non-MCLBYTES-sized clusters
+ */
m = m_defrag(*m_headp, M_NOWAIT);
if (m == NULL) {
adapter->mbuf_defrag_failed++;
@@ -418,9 +431,9 @@ retry:
m_head = *m_headp;
/*
- ** Set up the appropriate offload context
- ** this will consume the first descriptor
- */
+ * Set up the appropriate offload context
+ * this will consume the first descriptor
+ */
error = ixgbe_tx_ctx_setup(txr, m_head, &cmd_type_len, &olinfo_status);
if (__predict_false(error)) {
if (error == ENOBUFS)
@@ -439,7 +452,6 @@ retry:
}
#endif
- olinfo_status |= IXGBE_ADVTXD_CC;
i = txr->next_avail_desc;
for (j = 0; j < nsegs; j++) {
bus_size_t seglen;
@@ -466,11 +478,11 @@ retry:
txbuf->m_head = m_head;
/*
- ** Here we swap the map so the last descriptor,
- ** which gets the completion interrupt has the
- ** real map, and the first descriptor gets the
- ** unused map from this descriptor.
- */
+ * Here we swap the map so the last descriptor,
+ * which gets the completion interrupt has the
+ * real map, and the first descriptor gets the
+ * unused map from this descriptor.
+ */
txr->tx_buffers[first].map = txbuf->map;
txbuf->map = map;
bus_dmamap_sync(txr->txtag, map, BUS_DMASYNC_PREWRITE);
@@ -493,7 +505,6 @@ retry:
txr->busy = 1;
return (0);
-
}
@@ -732,6 +743,7 @@ static int
ixgbe_tx_ctx_setup(struct tx_ring *txr, struct mbuf *mp,
u32 *cmd_type_len, u32 *olinfo_status)
{
+ struct adapter *adapter = txr->adapter;
struct ixgbe_adv_tx_context_desc *TXD;
struct ether_vlan_header *eh;
struct ip *ip;
@@ -766,6 +778,8 @@ ixgbe_tx_ctx_setup(struct tx_ring *txr, struct mbuf *mp,
vtag = htole16(mp->m_pkthdr.ether_vtag);
vlan_macip_lens |= (vtag << IXGBE_ADVTXD_VLAN_SHIFT);
}
+ else if (!IXGBE_IS_X550VF(adapter) && (offload == FALSE))
+ return (0);
/*
* Determine where frame payload starts.
@@ -1727,9 +1741,6 @@ ixgbe_rx_discard(struct rx_ring *rxr, int i)
* the mbufs in the descriptor and sends data which has been
* dma'ed into host memory to upper layer.
*
- * We loop at most count times if count is > 0, or until done if
- * count < 0.
- *
* Return TRUE for more work, FALSE for all clean.
*********************************************************************/
bool
@@ -1792,10 +1803,9 @@ ixgbe_rxeof(struct ix_queue *que)
/* Make sure bad packets are discarded */
if (eop && (staterr & IXGBE_RXDADV_ERR_FRAME_ERR_MASK) != 0) {
-#if 0 // VF-only
#if __FreeBSD_version >= 1100036
- if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
-#endif
+ if (IXGBE_IS_VF(adapter))
+ if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
#endif
rxr->rx_discarded++;
ixgbe_rx_discard(rxr, i);
@@ -1906,6 +1916,9 @@ ixgbe_rxeof(struct ix_queue *que)
#ifdef RSS
sendmp->m_pkthdr.flowid =
le32toh(cur->wb.lower.hi_dword.rss);
+#if __FreeBSD_version < 1100054
+ sendmp->m_flags |= M_FLOWID;
+#endif
switch (pkt_info & IXGBE_RXDADV_RSSTYPE_MASK) {
case IXGBE_RXDADV_RSSTYPE_IPV4_TCP:
M_HASHTYPE_SET(sendmp, M_HASHTYPE_RSS_TCP_IPV4);
@@ -1939,7 +1952,11 @@ ixgbe_rxeof(struct ix_queue *que)
}
#else /* RSS */
sendmp->m_pkthdr.flowid = que->msix;
+#if __FreeBSD_version >= 1100054
M_HASHTYPE_SET(sendmp, M_HASHTYPE_OPAQUE);
+#else
+ sendmp->m_flags |= M_FLOWID;
+#endif
#endif /* RSS */
#endif /* FreeBSD_version */
}
diff --git a/sys/dev/ixgbe/ixgbe.h b/sys/dev/ixgbe/ixgbe.h
index 813ee4f..44e7c3c 100644
--- a/sys/dev/ixgbe/ixgbe.h
+++ b/sys/dev/ixgbe/ixgbe.h
@@ -90,8 +90,11 @@
#include <sys/pcpu.h>
#include <sys/smp.h>
#include <machine/smp.h>
+#include <sys/sbuf.h>
#include "ixgbe_api.h"
+#include "ixgbe_common.h"
+#include "ixgbe_phy.h"
#include "ixgbe_vf.h"
/* Tunables */
@@ -146,7 +149,11 @@
#define IXGBE_TX_CLEANUP_THRESHOLD (adapter->num_tx_desc / 8)
#define IXGBE_TX_OP_THRESHOLD (adapter->num_tx_desc / 32)
-#define IXGBE_MAX_FRAME_SIZE 0x3F00
+/* These defines are used in MTU calculations */
+#define IXGBE_MAX_FRAME_SIZE 9728
+#define IXGBE_MTU_HDR (ETHER_HDR_LEN + ETHER_CRC_LEN + \
+ ETHER_VLAN_ENCAP_LEN)
+#define IXGBE_MAX_MTU (IXGBE_MAX_FRAME_SIZE - IXGBE_MTU_HDR)
/* Flow control constants */
#define IXGBE_FC_PAUSE 0xFFFF
@@ -227,6 +234,17 @@
#define IXGBE_BULK_LATENCY 1200
#define IXGBE_LINK_ITR 2000
+/* MAC type macros */
+#define IXGBE_IS_X550VF(_adapter) \
+ ((_adapter->hw.mac.type == ixgbe_mac_X550_vf) || \
+ (_adapter->hw.mac.type == ixgbe_mac_X550EM_x_vf))
+
+#define IXGBE_IS_VF(_adapter) \
+ (IXGBE_IS_X550VF(_adapter) || \
+ (_adapter->hw.mac.type == ixgbe_mac_X540_vf) || \
+ (_adapter->hw.mac.type == ixgbe_mac_82599_vf))
+
+
/*
*****************************************************************************
* vendor_info_array
@@ -323,8 +341,8 @@ struct tx_ring {
u32 bytes; /* used for AIM */
u32 packets;
/* Soft Stats */
- u64 tx_bytes;
unsigned long tso_tx;
+ unsigned long no_tx_map_avail;
unsigned long no_tx_dma_setup;
u64 no_desc_avail;
u64 total_packets;
@@ -419,6 +437,13 @@ struct adapter {
u32 link_speed;
bool link_up;
u32 vector;
+ u16 dmac;
+ bool eee_support;
+ bool eee_enabled;
+
+ /* Power management-related */
+ bool wol_support;
+ u32 wufc;
/* Mbuf cluster size */
u32 rx_mbuf_sz;
@@ -432,6 +457,7 @@ struct adapter {
int fdir_reinit;
struct task fdir_task;
#endif
+ struct task phy_task; /* PHY intr tasklet */
struct taskqueue *tq;
/*
@@ -467,7 +493,7 @@ struct adapter {
unsigned long mbuf_header_failed;
unsigned long mbuf_packet_failed;
unsigned long watchdog_events;
- unsigned long vector_irq;
+ unsigned long link_irq;
union {
struct ixgbe_hw_stats pf;
struct ixgbevf_hw_stats vf;
@@ -540,12 +566,17 @@ struct adapter {
#define IXGBE_SET_IQDROPS(sc, count) (sc)->ifp->if_iqdrops = (count)
#endif
+/* External PHY register addresses */
+#define IXGBE_PHY_CURRENT_TEMP 0xC820
+#define IXGBE_PHY_OVERTEMP_STATUS 0xC830
+
/* Sysctl help messages; displayed with sysctl -d */
#define IXGBE_SYSCTL_DESC_ADV_SPEED \
"\nControl advertised link speed using these flags:\n" \
"\t0x1 - advertise 100M\n" \
"\t0x2 - advertise 1G\n" \
- "\t0x4 - advertise 10G"
+ "\t0x4 - advertise 10G\n\n" \
+ "\t100M is only supported on certain 10GBaseT adapters.\n"
#define IXGBE_SYSCTL_DESC_SET_FC \
"\nSet flow control mode using these values:\n" \
diff --git a/sys/dev/ixgbe/ixgbe_82598.c b/sys/dev/ixgbe/ixgbe_82598.c
index d9b8985..46e64c5 100644
--- a/sys/dev/ixgbe/ixgbe_82598.c
+++ b/sys/dev/ixgbe/ixgbe_82598.c
@@ -1,6 +1,6 @@
/******************************************************************************
- Copyright (c) 2001-2014, Intel Corporation
+ Copyright (c) 2001-2015, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -260,6 +260,8 @@ s32 ixgbe_start_hw_82598(struct ixgbe_hw *hw)
DEBUGFUNC("ixgbe_start_hw_82598");
ret_val = ixgbe_start_hw_generic(hw);
+ if (ret_val)
+ return ret_val;
/* Disable relaxed ordering */
for (i = 0; ((i < hw->mac.max_tx_queues) &&
@@ -278,8 +280,7 @@ s32 ixgbe_start_hw_82598(struct ixgbe_hw *hw)
}
/* set the completion timeout for interface */
- if (ret_val == IXGBE_SUCCESS)
- ixgbe_set_pcie_completion_timeout(hw);
+ ixgbe_set_pcie_completion_timeout(hw);
return ret_val;
}
diff --git a/sys/dev/ixgbe/ixgbe_82598.h b/sys/dev/ixgbe/ixgbe_82598.h
index 621be41..d2241c7 100644
--- a/sys/dev/ixgbe/ixgbe_82598.h
+++ b/sys/dev/ixgbe/ixgbe_82598.h
@@ -1,6 +1,6 @@
/******************************************************************************
- Copyright (c) 2001-2014, Intel Corporation
+ Copyright (c) 2001-2015, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
diff --git a/sys/dev/ixgbe/ixgbe_82599.c b/sys/dev/ixgbe/ixgbe_82599.c
index d49d851..b38620f 100644
--- a/sys/dev/ixgbe/ixgbe_82599.c
+++ b/sys/dev/ixgbe/ixgbe_82599.c
@@ -1,6 +1,6 @@
/******************************************************************************
- Copyright (c) 2001-2014, Intel Corporation
+ Copyright (c) 2001-2015, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -421,6 +421,8 @@ s32 ixgbe_get_link_capabilities_82599(struct ixgbe_hw *hw,
/* Check if 1G SFP module. */
if (hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core0 ||
hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core1 ||
+ hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core0 ||
+ hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core1 ||
hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core0 ||
hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core1) {
*speed = IXGBE_LINK_SPEED_1GB_FULL;
@@ -1803,7 +1805,6 @@ s32 ixgbe_fdir_set_input_mask_82599(struct ixgbe_hw *hw,
switch (hw->mac.type) {
case ixgbe_mac_X550:
case ixgbe_mac_X550EM_x:
- case ixgbe_mac_X550EM_a:
IXGBE_WRITE_REG(hw, IXGBE_FDIRSCTPM, ~fdirtcpm);
break;
default:
@@ -2465,7 +2466,6 @@ reset_pipeline_out:
return ret_val;
}
-
/**
* ixgbe_read_i2c_byte_82599 - Reads 8 bit word over I2C
* @hw: pointer to hardware structure
diff --git a/sys/dev/ixgbe/ixgbe_82599.h b/sys/dev/ixgbe/ixgbe_82599.h
index 8c973ac..bcfb043 100644
--- a/sys/dev/ixgbe/ixgbe_82599.h
+++ b/sys/dev/ixgbe/ixgbe_82599.h
@@ -1,6 +1,6 @@
/******************************************************************************
- Copyright (c) 2001-2014, Intel Corporation
+ Copyright (c) 2001-2015, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
diff --git a/sys/dev/ixgbe/ixgbe_api.c b/sys/dev/ixgbe/ixgbe_api.c
index 2535664..9784e3c 100644
--- a/sys/dev/ixgbe/ixgbe_api.c
+++ b/sys/dev/ixgbe/ixgbe_api.c
@@ -1,6 +1,6 @@
/******************************************************************************
- Copyright (c) 2001-2014, Intel Corporation
+ Copyright (c) 2001-2015, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -35,6 +35,22 @@
#include "ixgbe_api.h"
#include "ixgbe_common.h"
+static const u32 ixgbe_mvals_base[IXGBE_MVALS_IDX_LIMIT] = {
+ IXGBE_MVALS_INIT()
+};
+
+static const u32 ixgbe_mvals_X540[IXGBE_MVALS_IDX_LIMIT] = {
+ IXGBE_MVALS_INIT(_X540)
+};
+
+static const u32 ixgbe_mvals_X550[IXGBE_MVALS_IDX_LIMIT] = {
+ IXGBE_MVALS_INIT(_X550)
+};
+
+static const u32 ixgbe_mvals_X550EM_x[IXGBE_MVALS_IDX_LIMIT] = {
+ IXGBE_MVALS_INIT(_X550EM_x)
+};
+
/**
* ixgbe_dcb_get_rtrup2tc - read rtrup2tc reg
* @hw: pointer to hardware structure
@@ -81,20 +97,16 @@ s32 ixgbe_init_shared_code(struct ixgbe_hw *hw)
case ixgbe_mac_X540:
status = ixgbe_init_ops_X540(hw);
break;
-#if 0 //JFV temporary disable
case ixgbe_mac_X550:
status = ixgbe_init_ops_X550(hw);
break;
case ixgbe_mac_X550EM_x:
- case ixgbe_mac_X550EM_a:
status = ixgbe_init_ops_X550EM(hw);
break;
-#endif
case ixgbe_mac_82599_vf:
case ixgbe_mac_X540_vf:
case ixgbe_mac_X550_vf:
case ixgbe_mac_X550EM_x_vf:
- case ixgbe_mac_X550EM_a_vf:
status = ixgbe_init_ops_vf(hw);
break;
default:
@@ -124,6 +136,8 @@ s32 ixgbe_set_mac_type(struct ixgbe_hw *hw)
return IXGBE_ERR_DEVICE_NOT_SUPPORTED;
}
+ hw->mvals = ixgbe_mvals_base;
+
switch (hw->device_id) {
case IXGBE_DEV_ID_82598:
case IXGBE_DEV_ID_82598_BX:
@@ -164,14 +178,17 @@ s32 ixgbe_set_mac_type(struct ixgbe_hw *hw)
case IXGBE_DEV_ID_X540_VF:
case IXGBE_DEV_ID_X540_VF_HV:
hw->mac.type = ixgbe_mac_X540_vf;
+ hw->mvals = ixgbe_mvals_X540;
break;
case IXGBE_DEV_ID_X540T:
case IXGBE_DEV_ID_X540T1:
case IXGBE_DEV_ID_X540_BYPASS:
hw->mac.type = ixgbe_mac_X540;
+ hw->mvals = ixgbe_mvals_X540;
break;
case IXGBE_DEV_ID_X550T:
hw->mac.type = ixgbe_mac_X550;
+ hw->mvals = ixgbe_mvals_X550;
break;
case IXGBE_DEV_ID_X550EM_X_KX4:
case IXGBE_DEV_ID_X550EM_X_KR:
@@ -179,21 +196,17 @@ s32 ixgbe_set_mac_type(struct ixgbe_hw *hw)
case IXGBE_DEV_ID_X550EM_X_1G_T:
case IXGBE_DEV_ID_X550EM_X_SFP:
hw->mac.type = ixgbe_mac_X550EM_x;
- break;
- case IXGBE_DEV_ID_X550EM_A_KR:
- hw->mac.type = ixgbe_mac_X550EM_a;
+ hw->mvals = ixgbe_mvals_X550EM_x;
break;
case IXGBE_DEV_ID_X550_VF:
case IXGBE_DEV_ID_X550_VF_HV:
hw->mac.type = ixgbe_mac_X550_vf;
+ hw->mvals = ixgbe_mvals_X550;
break;
case IXGBE_DEV_ID_X550EM_X_VF:
case IXGBE_DEV_ID_X550EM_X_VF_HV:
hw->mac.type = ixgbe_mac_X550EM_x_vf;
- break;
- case IXGBE_DEV_ID_X550EM_A_VF:
- case IXGBE_DEV_ID_X550EM_A_VF_HV:
- hw->mac.type = ixgbe_mac_X550EM_a_vf;
+ hw->mvals = ixgbe_mvals_X550EM_x;
break;
default:
ret_val = IXGBE_ERR_DEVICE_NOT_SUPPORTED;
@@ -1283,6 +1296,23 @@ s32 ixgbe_enter_lplu(struct ixgbe_hw *hw)
}
/**
+ * ixgbe_handle_lasi - Handle external Base T PHY interrupt
+ * @hw: pointer to hardware structure
+ *
+ * Handle external Base T PHY interrupt. If high temperature
+ * failure alarm then return error, else if link status change
+ * then setup internal/external PHY link
+ *
+ * Return IXGBE_ERR_OVERTEMP if interrupt is high temperature
+ * failure alarm, else return PHY access status.
+ */
+s32 ixgbe_handle_lasi(struct ixgbe_hw *hw)
+{
+ return ixgbe_call_func(hw, hw->phy.ops.handle_lasi, (hw),
+ IXGBE_NOT_IMPLEMENTED);
+}
+
+/**
* ixgbe_read_analog_reg8 - Reads 8 bit analog register
* @hw: pointer to hardware structure
* @reg: analog register to read
@@ -1340,6 +1370,23 @@ s32 ixgbe_read_i2c_byte(struct ixgbe_hw *hw, u8 byte_offset, u8 dev_addr,
}
/**
+ * ixgbe_read_i2c_byte_unlocked - Reads 8 bit word via I2C from device address
+ * @hw: pointer to hardware structure
+ * @byte_offset: byte offset to read
+ * @dev_addr: I2C bus address to read from
+ * @data: value read
+ *
+ * Performs byte read operation to SFP module's EEPROM over I2C interface.
+ **/
+s32 ixgbe_read_i2c_byte_unlocked(struct ixgbe_hw *hw, u8 byte_offset,
+ u8 dev_addr, u8 *data)
+{
+ return ixgbe_call_func(hw, hw->phy.ops.read_i2c_byte_unlocked,
+ (hw, byte_offset, dev_addr, data),
+ IXGBE_NOT_IMPLEMENTED);
+}
+
+/**
* ixgbe_read_i2c_combined - Perform I2C read combined operation
* @hw: pointer to the hardware structure
* @addr: I2C bus address to read from
@@ -1355,6 +1402,23 @@ s32 ixgbe_read_i2c_combined(struct ixgbe_hw *hw, u8 addr, u16 reg, u16 *val)
}
/**
+ * ixgbe_read_i2c_combined_unlocked - Perform I2C read combined operation
+ * @hw: pointer to the hardware structure
+ * @addr: I2C bus address to read from
+ * @reg: I2C device register to read from
+ * @val: pointer to location to receive read value
+ *
+ * Returns an error code on error.
+ **/
+s32 ixgbe_read_i2c_combined_unlocked(struct ixgbe_hw *hw, u8 addr, u16 reg,
+ u16 *val)
+{
+ return ixgbe_call_func(hw, hw->phy.ops.read_i2c_combined_unlocked,
+ (hw, addr, reg, val),
+ IXGBE_NOT_IMPLEMENTED);
+}
+
+/**
* ixgbe_write_i2c_byte - Writes 8 bit word over I2C
* @hw: pointer to hardware structure
* @byte_offset: byte offset to write
@@ -1372,6 +1436,24 @@ s32 ixgbe_write_i2c_byte(struct ixgbe_hw *hw, u8 byte_offset, u8 dev_addr,
}
/**
+ * ixgbe_write_i2c_byte_unlocked - Writes 8 bit word over I2C
+ * @hw: pointer to hardware structure
+ * @byte_offset: byte offset to write
+ * @dev_addr: I2C bus address to write to
+ * @data: value to write
+ *
+ * Performs byte write operation to SFP module's EEPROM over I2C interface
+ * at a specified device address.
+ **/
+s32 ixgbe_write_i2c_byte_unlocked(struct ixgbe_hw *hw, u8 byte_offset,
+ u8 dev_addr, u8 data)
+{
+ return ixgbe_call_func(hw, hw->phy.ops.write_i2c_byte_unlocked,
+ (hw, byte_offset, dev_addr, data),
+ IXGBE_NOT_IMPLEMENTED);
+}
+
+/**
* ixgbe_write_i2c_combined - Perform I2C write combined operation
* @hw: pointer to the hardware structure
* @addr: I2C bus address to write to
@@ -1387,6 +1469,22 @@ s32 ixgbe_write_i2c_combined(struct ixgbe_hw *hw, u8 addr, u16 reg, u16 val)
}
/**
+ * ixgbe_write_i2c_combined_unlocked - Perform I2C write combined operation
+ * @hw: pointer to the hardware structure
+ * @addr: I2C bus address to write to
+ * @reg: I2C device register to write to
+ * @val: value to write
+ *
+ * Returns an error code on error.
+ **/
+s32 ixgbe_write_i2c_combined_unlocked(struct ixgbe_hw *hw, u8 addr, u16 reg,
+ u16 val)
+{
+ return ixgbe_call_func(hw, hw->phy.ops.write_i2c_combined_unlocked,
+ (hw, addr, reg, val), IXGBE_NOT_IMPLEMENTED);
+}
+
+/**
* ixgbe_write_i2c_eeprom - Writes 8 bit EEPROM word over I2C interface
* @hw: pointer to hardware structure
* @byte_offset: EEPROM byte offset to write
diff --git a/sys/dev/ixgbe/ixgbe_api.h b/sys/dev/ixgbe/ixgbe_api.h
index 650ae67..8c2c4a8 100644
--- a/sys/dev/ixgbe/ixgbe_api.h
+++ b/sys/dev/ixgbe/ixgbe_api.h
@@ -1,6 +1,6 @@
/******************************************************************************
- Copyright (c) 2001-2014, Intel Corporation
+ Copyright (c) 2001-2015, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -173,10 +173,18 @@ u32 ixgbe_atr_compute_sig_hash_82599(union ixgbe_atr_hash_dword input,
bool ixgbe_verify_lesm_fw_enabled_82599(struct ixgbe_hw *hw);
s32 ixgbe_read_i2c_byte(struct ixgbe_hw *hw, u8 byte_offset, u8 dev_addr,
u8 *data);
+s32 ixgbe_read_i2c_byte_unlocked(struct ixgbe_hw *hw, u8 byte_offset,
+ u8 dev_addr, u8 *data);
s32 ixgbe_read_i2c_combined(struct ixgbe_hw *hw, u8 addr, u16 reg, u16 *val);
+s32 ixgbe_read_i2c_combined_unlocked(struct ixgbe_hw *hw, u8 addr, u16 reg,
+ u16 *val);
s32 ixgbe_write_i2c_byte(struct ixgbe_hw *hw, u8 byte_offset, u8 dev_addr,
u8 data);
+s32 ixgbe_write_i2c_byte_unlocked(struct ixgbe_hw *hw, u8 byte_offset,
+ u8 dev_addr, u8 data);
s32 ixgbe_write_i2c_combined(struct ixgbe_hw *hw, u8 addr, u16 reg, u16 val);
+s32 ixgbe_write_i2c_combined_unlocked(struct ixgbe_hw *hw, u8 addr, u16 reg,
+ u16 val);
s32 ixgbe_write_i2c_eeprom(struct ixgbe_hw *hw, u8 byte_offset, u8 eeprom_data);
s32 ixgbe_get_san_mac_addr(struct ixgbe_hw *hw, u8 *san_mac_addr);
s32 ixgbe_set_san_mac_addr(struct ixgbe_hw *hw, u8 *san_mac_addr);
@@ -203,6 +211,7 @@ void ixgbe_enable_mdd(struct ixgbe_hw *hw);
void ixgbe_mdd_event(struct ixgbe_hw *hw, u32 *vf_bitmap);
void ixgbe_restore_mdd_vf(struct ixgbe_hw *hw, u32 vf);
s32 ixgbe_enter_lplu(struct ixgbe_hw *hw);
+s32 ixgbe_handle_lasi(struct ixgbe_hw *hw);
void ixgbe_set_rate_select_speed(struct ixgbe_hw *hw, ixgbe_link_speed speed);
void ixgbe_disable_rx(struct ixgbe_hw *hw);
void ixgbe_enable_rx(struct ixgbe_hw *hw);
diff --git a/sys/dev/ixgbe/ixgbe_common.c b/sys/dev/ixgbe/ixgbe_common.c
index 57fe1b5..f0a0776 100644
--- a/sys/dev/ixgbe/ixgbe_common.c
+++ b/sys/dev/ixgbe/ixgbe_common.c
@@ -1,6 +1,6 @@
/******************************************************************************
- Copyright (c) 2001-2014, Intel Corporation
+ Copyright (c) 2001-2015, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -188,6 +188,7 @@ bool ixgbe_device_supports_autoneg_fc(struct ixgbe_hw *hw)
case IXGBE_DEV_ID_X540T1:
case IXGBE_DEV_ID_X540_BYPASS:
case IXGBE_DEV_ID_X550T:
+ case IXGBE_DEV_ID_X550EM_X_10G_T:
supported = TRUE;
break;
default:
@@ -1090,7 +1091,7 @@ s32 ixgbe_stop_adapter_generic(struct ixgbe_hw *hw)
msec_delay(2);
/*
- * Prevent the PCI-E bus from from hanging by disabling PCI-E master
+ * Prevent the PCI-E bus from hanging by disabling PCI-E master
* access and verify no pending requests
*/
return ixgbe_disable_pcie_master(hw);
@@ -3573,7 +3574,6 @@ u16 ixgbe_get_pcie_msix_count_generic(struct ixgbe_hw *hw)
case ixgbe_mac_X540:
case ixgbe_mac_X550:
case ixgbe_mac_X550EM_x:
- case ixgbe_mac_X550EM_a:
pcie_offset = IXGBE_PCIE_MSIX_82599_CAPS;
max_msix_count = IXGBE_MAX_MSIX_VECTORS_82599;
break;
diff --git a/sys/dev/ixgbe/ixgbe_common.h b/sys/dev/ixgbe/ixgbe_common.h
index 94c7f97..e685f5b 100644
--- a/sys/dev/ixgbe/ixgbe_common.h
+++ b/sys/dev/ixgbe/ixgbe_common.h
@@ -1,6 +1,6 @@
/******************************************************************************
- Copyright (c) 2001-2014, Intel Corporation
+ Copyright (c) 2001-2015, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
diff --git a/sys/dev/ixgbe/ixgbe_dcb.c b/sys/dev/ixgbe/ixgbe_dcb.c
index 6f848e7..3659d17 100644
--- a/sys/dev/ixgbe/ixgbe_dcb.c
+++ b/sys/dev/ixgbe/ixgbe_dcb.c
@@ -1,6 +1,6 @@
/******************************************************************************
- Copyright (c) 2001-2014, Intel Corporation
+ Copyright (c) 2001-2015, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -396,7 +396,6 @@ s32 ixgbe_dcb_get_tc_stats(struct ixgbe_hw *hw, struct ixgbe_hw_stats *stats,
case ixgbe_mac_X540:
case ixgbe_mac_X550:
case ixgbe_mac_X550EM_x:
- case ixgbe_mac_X550EM_a:
#if !defined(NO_82599_SUPPORT) || !defined(NO_X540_SUPPORT)
ret = ixgbe_dcb_get_tc_stats_82599(hw, stats, tc_count);
break;
@@ -427,7 +426,6 @@ s32 ixgbe_dcb_get_pfc_stats(struct ixgbe_hw *hw, struct ixgbe_hw_stats *stats,
case ixgbe_mac_X540:
case ixgbe_mac_X550:
case ixgbe_mac_X550EM_x:
- case ixgbe_mac_X550EM_a:
#if !defined(NO_82599_SUPPORT) || !defined(NO_X540_SUPPORT)
ret = ixgbe_dcb_get_pfc_stats_82599(hw, stats, tc_count);
break;
@@ -469,7 +467,6 @@ s32 ixgbe_dcb_config_rx_arbiter_cee(struct ixgbe_hw *hw,
case ixgbe_mac_X540:
case ixgbe_mac_X550:
case ixgbe_mac_X550EM_x:
- case ixgbe_mac_X550EM_a:
#if !defined(NO_82599_SUPPORT) || !defined(NO_X540_SUPPORT)
ret = ixgbe_dcb_config_rx_arbiter_82599(hw, refill, max, bwgid,
tsa, map);
@@ -511,7 +508,6 @@ s32 ixgbe_dcb_config_tx_desc_arbiter_cee(struct ixgbe_hw *hw,
case ixgbe_mac_X540:
case ixgbe_mac_X550:
case ixgbe_mac_X550EM_x:
- case ixgbe_mac_X550EM_a:
#if !defined(NO_82599_SUPPORT) || !defined(NO_X540_SUPPORT)
ret = ixgbe_dcb_config_tx_desc_arbiter_82599(hw, refill, max,
bwgid, tsa);
@@ -555,7 +551,6 @@ s32 ixgbe_dcb_config_tx_data_arbiter_cee(struct ixgbe_hw *hw,
case ixgbe_mac_X540:
case ixgbe_mac_X550:
case ixgbe_mac_X550EM_x:
- case ixgbe_mac_X550EM_a:
#if !defined(NO_82599_SUPPORT) || !defined(NO_X540_SUPPORT)
ret = ixgbe_dcb_config_tx_data_arbiter_82599(hw, refill, max,
bwgid, tsa,
@@ -593,7 +588,6 @@ s32 ixgbe_dcb_config_pfc_cee(struct ixgbe_hw *hw,
case ixgbe_mac_X540:
case ixgbe_mac_X550:
case ixgbe_mac_X550EM_x:
- case ixgbe_mac_X550EM_a:
#if !defined(NO_82599_SUPPORT) || !defined(NO_X540_SUPPORT)
ret = ixgbe_dcb_config_pfc_82599(hw, pfc_en, map);
break;
@@ -622,7 +616,6 @@ s32 ixgbe_dcb_config_tc_stats(struct ixgbe_hw *hw)
case ixgbe_mac_X540:
case ixgbe_mac_X550:
case ixgbe_mac_X550EM_x:
- case ixgbe_mac_X550EM_a:
#if !defined(NO_82599_SUPPORT) || !defined(NO_X540_SUPPORT)
ret = ixgbe_dcb_config_tc_stats_82599(hw, NULL);
break;
@@ -670,7 +663,6 @@ s32 ixgbe_dcb_hw_config_cee(struct ixgbe_hw *hw,
case ixgbe_mac_X540:
case ixgbe_mac_X550:
case ixgbe_mac_X550EM_x:
- case ixgbe_mac_X550EM_a:
#if !defined(NO_82599_SUPPORT) || !defined(NO_X540_SUPPORT)
ixgbe_dcb_config_82599(hw, dcb_config);
ret = ixgbe_dcb_hw_config_82599(hw, dcb_config->link_speed,
@@ -705,7 +697,6 @@ s32 ixgbe_dcb_config_pfc(struct ixgbe_hw *hw, u8 pfc_en, u8 *map)
case ixgbe_mac_X540:
case ixgbe_mac_X550:
case ixgbe_mac_X550EM_x:
- case ixgbe_mac_X550EM_a:
#if !defined(NO_82599_SUPPORT) || !defined(NO_X540_SUPPORT)
ret = ixgbe_dcb_config_pfc_82599(hw, pfc_en, map);
break;
@@ -731,7 +722,6 @@ s32 ixgbe_dcb_hw_config(struct ixgbe_hw *hw, u16 *refill, u16 *max,
case ixgbe_mac_X540:
case ixgbe_mac_X550:
case ixgbe_mac_X550EM_x:
- case ixgbe_mac_X550EM_a:
#if !defined(NO_82599_SUPPORT) || !defined(NO_X540_SUPPORT)
ixgbe_dcb_config_rx_arbiter_82599(hw, refill, max, bwg_id,
tsa, map);
diff --git a/sys/dev/ixgbe/ixgbe_dcb.h b/sys/dev/ixgbe/ixgbe_dcb.h
index 878bbf8..871b784 100644
--- a/sys/dev/ixgbe/ixgbe_dcb.h
+++ b/sys/dev/ixgbe/ixgbe_dcb.h
@@ -1,6 +1,6 @@
/******************************************************************************
- Copyright (c) 2001-2014, Intel Corporation
+ Copyright (c) 2001-2015, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
diff --git a/sys/dev/ixgbe/ixgbe_dcb_82598.c b/sys/dev/ixgbe/ixgbe_dcb_82598.c
index a5a090d..fb946c9 100644
--- a/sys/dev/ixgbe/ixgbe_dcb_82598.c
+++ b/sys/dev/ixgbe/ixgbe_dcb_82598.c
@@ -1,6 +1,6 @@
/******************************************************************************
- Copyright (c) 2001-2014, Intel Corporation
+ Copyright (c) 2001-2015, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
diff --git a/sys/dev/ixgbe/ixgbe_dcb_82598.h b/sys/dev/ixgbe/ixgbe_dcb_82598.h
index 47f19f6..35974f7 100644
--- a/sys/dev/ixgbe/ixgbe_dcb_82598.h
+++ b/sys/dev/ixgbe/ixgbe_dcb_82598.h
@@ -1,6 +1,6 @@
/******************************************************************************
- Copyright (c) 2001-2014, Intel Corporation
+ Copyright (c) 2001-2015, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
diff --git a/sys/dev/ixgbe/ixgbe_dcb_82599.c b/sys/dev/ixgbe/ixgbe_dcb_82599.c
index 0232d3c..4443411 100644
--- a/sys/dev/ixgbe/ixgbe_dcb_82599.c
+++ b/sys/dev/ixgbe/ixgbe_dcb_82599.c
@@ -1,6 +1,6 @@
/******************************************************************************
- Copyright (c) 2001-2014, Intel Corporation
+ Copyright (c) 2001-2015, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
diff --git a/sys/dev/ixgbe/ixgbe_dcb_82599.h b/sys/dev/ixgbe/ixgbe_dcb_82599.h
index 7702dc9..bab7628 100644
--- a/sys/dev/ixgbe/ixgbe_dcb_82599.h
+++ b/sys/dev/ixgbe/ixgbe_dcb_82599.h
@@ -1,6 +1,6 @@
/******************************************************************************
- Copyright (c) 2001-2014, Intel Corporation
+ Copyright (c) 2001-2015, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
diff --git a/sys/dev/ixgbe/ixgbe_mbx.c b/sys/dev/ixgbe/ixgbe_mbx.c
index 067bba0..d8ba55a 100644
--- a/sys/dev/ixgbe/ixgbe_mbx.c
+++ b/sys/dev/ixgbe/ixgbe_mbx.c
@@ -1,6 +1,6 @@
/******************************************************************************
- Copyright (c) 2001-2014, Intel Corporation
+ Copyright (c) 2001-2015, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -607,7 +607,6 @@ static s32 ixgbe_check_for_rst_pf(struct ixgbe_hw *hw, u16 vf_number)
break;
case ixgbe_mac_X550:
case ixgbe_mac_X550EM_x:
- case ixgbe_mac_X550EM_a:
case ixgbe_mac_X540:
vflre = IXGBE_READ_REG(hw, IXGBE_VFLREC(reg_offset));
break;
@@ -745,7 +744,6 @@ void ixgbe_init_mbx_params_pf(struct ixgbe_hw *hw)
if (hw->mac.type != ixgbe_mac_82599EB &&
hw->mac.type != ixgbe_mac_X550 &&
hw->mac.type != ixgbe_mac_X550EM_x &&
- hw->mac.type != ixgbe_mac_X550EM_a &&
hw->mac.type != ixgbe_mac_X540)
return;
diff --git a/sys/dev/ixgbe/ixgbe_mbx.h b/sys/dev/ixgbe/ixgbe_mbx.h
index 2cffb8a..ea75cbe 100644
--- a/sys/dev/ixgbe/ixgbe_mbx.h
+++ b/sys/dev/ixgbe/ixgbe_mbx.h
@@ -1,6 +1,6 @@
/******************************************************************************
- Copyright (c) 2001-2014, Intel Corporation
+ Copyright (c) 2001-2015, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
diff --git a/sys/dev/ixgbe/ixgbe_osdep.h b/sys/dev/ixgbe/ixgbe_osdep.h
index ebb55f4..95f6ed5c 100644
--- a/sys/dev/ixgbe/ixgbe_osdep.h
+++ b/sys/dev/ixgbe/ixgbe_osdep.h
@@ -1,6 +1,6 @@
/******************************************************************************
- Copyright (c) 2001-2013, Intel Corporation
+ Copyright (c) 2001-2015, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -108,13 +108,14 @@
#define UNREFERENCED_3PARAMETER(_p, _q, _r)
#define UNREFERENCED_4PARAMETER(_p, _q, _r, _s)
-
#define IXGBE_NTOHL(_i) ntohl(_i)
#define IXGBE_NTOHS(_i) ntohs(_i)
/* XXX these need to be revisited */
-#define IXGBE_CPU_TO_LE32 le32toh
-#define IXGBE_LE32_TO_CPUS le32dec
+#define IXGBE_CPU_TO_LE32 htole32
+#define IXGBE_LE32_TO_CPUS(x)
+#define IXGBE_CPU_TO_BE16 htobe16
+#define IXGBE_CPU_TO_BE32 htobe32
typedef uint8_t u8;
typedef int8_t s8;
diff --git a/sys/dev/ixgbe/ixgbe_phy.c b/sys/dev/ixgbe/ixgbe_phy.c
index 5ac719c..88206c7 100644
--- a/sys/dev/ixgbe/ixgbe_phy.c
+++ b/sys/dev/ixgbe/ixgbe_phy.c
@@ -1,6 +1,6 @@
/******************************************************************************
- Copyright (c) 2001-2014, Intel Corporation
+ Copyright (c) 2001-2015, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -101,16 +101,17 @@ static u8 ixgbe_ones_comp_byte_add(u8 add1, u8 add2)
}
/**
- * ixgbe_read_i2c_combined_generic - Perform I2C read combined operation
+ * ixgbe_read_i2c_combined_generic_int - Perform I2C read combined operation
* @hw: pointer to the hardware structure
* @addr: I2C bus address to read from
* @reg: I2C device register to read from
* @val: pointer to location to receive read value
+ * @lock: TRUE if to take and release semaphore
*
* Returns an error code on error.
*/
-static s32 ixgbe_read_i2c_combined_generic(struct ixgbe_hw *hw, u8 addr,
- u16 reg, u16 *val)
+static s32 ixgbe_read_i2c_combined_generic_int(struct ixgbe_hw *hw, u8 addr,
+ u16 reg, u16 *val, bool lock)
{
u32 swfw_mask = hw->phy.phy_semaphore_mask;
int max_retry = 10;
@@ -121,11 +122,13 @@ static s32 ixgbe_read_i2c_combined_generic(struct ixgbe_hw *hw, u8 addr,
u8 reg_high;
u8 csum;
+ if (hw->mac.type >= ixgbe_mac_X550)
+ max_retry = 3;
reg_high = ((reg >> 7) & 0xFE) | 1; /* Indicate read combined */
csum = ixgbe_ones_comp_byte_add(reg_high, reg & 0xFF);
csum = ~csum;
do {
- if (hw->mac.ops.acquire_swfw_sync(hw, swfw_mask))
+ if (lock && hw->mac.ops.acquire_swfw_sync(hw, swfw_mask))
return IXGBE_ERR_SWFW_SYNC;
ixgbe_i2c_start(hw);
/* Device Address and write indication */
@@ -158,13 +161,15 @@ static s32 ixgbe_read_i2c_combined_generic(struct ixgbe_hw *hw, u8 addr,
if (ixgbe_clock_out_i2c_bit(hw, FALSE))
goto fail;
ixgbe_i2c_stop(hw);
- hw->mac.ops.release_swfw_sync(hw, swfw_mask);
+ if (lock)
+ hw->mac.ops.release_swfw_sync(hw, swfw_mask);
*val = (high_bits << 8) | low_bits;
return 0;
fail:
ixgbe_i2c_bus_clear(hw);
- hw->mac.ops.release_swfw_sync(hw, swfw_mask);
+ if (lock)
+ hw->mac.ops.release_swfw_sync(hw, swfw_mask);
retry++;
if (retry < max_retry)
DEBUGOUT("I2C byte read combined error - Retrying.\n");
@@ -176,17 +181,50 @@ fail:
}
/**
- * ixgbe_write_i2c_combined_generic - Perform I2C write combined operation
+ * ixgbe_read_i2c_combined_generic - Perform I2C read combined operation
+ * @hw: pointer to the hardware structure
+ * @addr: I2C bus address to read from
+ * @reg: I2C device register to read from
+ * @val: pointer to location to receive read value
+ *
+ * Returns an error code on error.
+ **/
+static s32 ixgbe_read_i2c_combined_generic(struct ixgbe_hw *hw, u8 addr,
+ u16 reg, u16 *val)
+{
+ return ixgbe_read_i2c_combined_generic_int(hw, addr, reg, val, TRUE);
+}
+
+/**
+ * ixgbe_read_i2c_combined_generic_unlocked - Do I2C read combined operation
+ * @hw: pointer to the hardware structure
+ * @addr: I2C bus address to read from
+ * @reg: I2C device register to read from
+ * @val: pointer to location to receive read value
+ *
+ * Returns an error code on error.
+ **/
+static s32
+ixgbe_read_i2c_combined_generic_unlocked(struct ixgbe_hw *hw, u8 addr,
+ u16 reg, u16 *val)
+{
+ return ixgbe_read_i2c_combined_generic_int(hw, addr, reg, val, FALSE);
+}
+
+/**
+ * ixgbe_write_i2c_combined_generic_int - Perform I2C write combined operation
* @hw: pointer to the hardware structure
* @addr: I2C bus address to write to
* @reg: I2C device register to write to
* @val: value to write
+ * @lock: TRUE if to take and release semaphore
*
* Returns an error code on error.
*/
-static s32 ixgbe_write_i2c_combined_generic(struct ixgbe_hw *hw,
- u8 addr, u16 reg, u16 val)
+static s32 ixgbe_write_i2c_combined_generic_int(struct ixgbe_hw *hw, u8 addr,
+ u16 reg, u16 val, bool lock)
{
+ u32 swfw_mask = hw->phy.phy_semaphore_mask;
int max_retry = 1;
int retry = 0;
u8 reg_high;
@@ -198,6 +236,8 @@ static s32 ixgbe_write_i2c_combined_generic(struct ixgbe_hw *hw,
csum = ixgbe_ones_comp_byte_add(csum, val & 0xFF);
csum = ~csum;
do {
+ if (lock && hw->mac.ops.acquire_swfw_sync(hw, swfw_mask))
+ return IXGBE_ERR_SWFW_SYNC;
ixgbe_i2c_start(hw);
/* Device Address and write indication */
if (ixgbe_out_i2c_byte_ack(hw, addr))
@@ -218,10 +258,14 @@ static s32 ixgbe_write_i2c_combined_generic(struct ixgbe_hw *hw,
if (ixgbe_out_i2c_byte_ack(hw, csum))
goto fail;
ixgbe_i2c_stop(hw);
+ if (lock)
+ hw->mac.ops.release_swfw_sync(hw, swfw_mask);
return 0;
fail:
ixgbe_i2c_bus_clear(hw);
+ if (lock)
+ hw->mac.ops.release_swfw_sync(hw, swfw_mask);
retry++;
if (retry < max_retry)
DEBUGOUT("I2C byte write combined error - Retrying.\n");
@@ -233,6 +277,37 @@ fail:
}
/**
+ * ixgbe_write_i2c_combined_generic - Perform I2C write combined operation
+ * @hw: pointer to the hardware structure
+ * @addr: I2C bus address to write to
+ * @reg: I2C device register to write to
+ * @val: value to write
+ *
+ * Returns an error code on error.
+ **/
+static s32 ixgbe_write_i2c_combined_generic(struct ixgbe_hw *hw,
+ u8 addr, u16 reg, u16 val)
+{
+ return ixgbe_write_i2c_combined_generic_int(hw, addr, reg, val, TRUE);
+}
+
+/**
+ * ixgbe_write_i2c_combined_generic_unlocked - Do I2C write combined operation
+ * @hw: pointer to the hardware structure
+ * @addr: I2C bus address to write to
+ * @reg: I2C device register to write to
+ * @val: value to write
+ *
+ * Returns an error code on error.
+ **/
+static s32
+ixgbe_write_i2c_combined_generic_unlocked(struct ixgbe_hw *hw,
+ u8 addr, u16 reg, u16 val)
+{
+ return ixgbe_write_i2c_combined_generic_int(hw, addr, reg, val, FALSE);
+}
+
+/**
* ixgbe_init_phy_ops_generic - Inits PHY function ptrs
* @hw: pointer to the hardware structure
*
@@ -265,6 +340,13 @@ s32 ixgbe_init_phy_ops_generic(struct ixgbe_hw *hw)
phy->sfp_type = ixgbe_sfp_type_unknown;
phy->ops.read_i2c_combined = ixgbe_read_i2c_combined_generic;
phy->ops.write_i2c_combined = ixgbe_write_i2c_combined_generic;
+ phy->ops.read_i2c_combined_unlocked =
+ ixgbe_read_i2c_combined_generic_unlocked;
+ phy->ops.write_i2c_combined_unlocked =
+ ixgbe_write_i2c_combined_generic_unlocked;
+ phy->ops.read_i2c_byte_unlocked = ixgbe_read_i2c_byte_generic_unlocked;
+ phy->ops.write_i2c_byte_unlocked =
+ ixgbe_write_i2c_byte_generic_unlocked;
phy->ops.check_overtemp = ixgbe_tn_check_overtemp;
return IXGBE_SUCCESS;
}
@@ -1363,6 +1445,13 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
else
hw->phy.sfp_type =
ixgbe_sfp_type_1g_sx_core1;
+ } else if (comp_codes_1g & IXGBE_SFF_1GBASELX_CAPABLE) {
+ if (hw->bus.lan_id == 0)
+ hw->phy.sfp_type =
+ ixgbe_sfp_type_1g_lx_core0;
+ else
+ hw->phy.sfp_type =
+ ixgbe_sfp_type_1g_lx_core1;
} else {
hw->phy.sfp_type = ixgbe_sfp_type_unknown;
}
@@ -1450,6 +1539,8 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
if (comp_codes_10g == 0 &&
!(hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core1 ||
hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core0 ||
+ hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core0 ||
+ hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core1 ||
hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core0 ||
hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core1)) {
hw->phy.type = ixgbe_phy_sfp_unsupported;
@@ -1467,6 +1558,8 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
if (!(enforce_sfp & IXGBE_DEVICE_CAPS_ALLOW_ANY_SFP) &&
!(hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core0 ||
hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core1 ||
+ hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core0 ||
+ hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core1 ||
hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core0 ||
hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core1)) {
/* Make sure we're a supported PHY type */
@@ -1600,6 +1693,9 @@ s32 ixgbe_identify_qsfp_module_generic(struct ixgbe_hw *hw)
goto out;
}
+ /* LAN ID is needed for I2C access */
+ hw->mac.ops.set_lan_id(hw);
+
status = hw->phy.ops.read_i2c_eeprom(hw, IXGBE_SFF_IDENTIFIER,
&identifier);
@@ -1614,9 +1710,6 @@ s32 ixgbe_identify_qsfp_module_generic(struct ixgbe_hw *hw)
hw->phy.id = identifier;
- /* LAN ID is needed for sfp_type determination */
- hw->mac.ops.set_lan_id(hw);
-
status = hw->phy.ops.read_i2c_eeprom(hw, IXGBE_SFF_QSFP_10GBE_COMP,
&comp_codes_10g);
@@ -1804,10 +1897,12 @@ s32 ixgbe_get_sfp_init_sequence_offsets(struct ixgbe_hw *hw,
* SR modules
*/
if (sfp_type == ixgbe_sfp_type_da_act_lmt_core0 ||
+ sfp_type == ixgbe_sfp_type_1g_lx_core0 ||
sfp_type == ixgbe_sfp_type_1g_cu_core0 ||
sfp_type == ixgbe_sfp_type_1g_sx_core0)
sfp_type = ixgbe_sfp_type_srlr_core0;
else if (sfp_type == ixgbe_sfp_type_da_act_lmt_core1 ||
+ sfp_type == ixgbe_sfp_type_1g_lx_core1 ||
sfp_type == ixgbe_sfp_type_1g_cu_core1 ||
sfp_type == ixgbe_sfp_type_1g_sx_core1)
sfp_type = ixgbe_sfp_type_srlr_core1;
@@ -1932,16 +2027,17 @@ static bool ixgbe_is_sfp_probe(struct ixgbe_hw *hw, u8 offset, u8 addr)
}
/**
- * ixgbe_read_i2c_byte_generic - Reads 8 bit word over I2C
+ * ixgbe_read_i2c_byte_generic_int - Reads 8 bit word over I2C
* @hw: pointer to hardware structure
* @byte_offset: byte offset to read
* @data: value read
+ * @lock: TRUE if to take and release semaphore
*
* Performs byte read operation to SFP module's EEPROM over I2C interface at
* a specified device address.
**/
-s32 ixgbe_read_i2c_byte_generic(struct ixgbe_hw *hw, u8 byte_offset,
- u8 dev_addr, u8 *data)
+static s32 ixgbe_read_i2c_byte_generic_int(struct ixgbe_hw *hw, u8 byte_offset,
+ u8 dev_addr, u8 *data, bool lock)
{
s32 status;
u32 max_retry = 10;
@@ -1952,11 +2048,13 @@ s32 ixgbe_read_i2c_byte_generic(struct ixgbe_hw *hw, u8 byte_offset,
DEBUGFUNC("ixgbe_read_i2c_byte_generic");
+ if (hw->mac.type >= ixgbe_mac_X550)
+ max_retry = 3;
if (ixgbe_is_sfp_probe(hw, byte_offset, dev_addr))
max_retry = IXGBE_SFP_DETECT_RETRIES;
do {
- if (hw->mac.ops.acquire_swfw_sync(hw, swfw_mask))
+ if (lock && hw->mac.ops.acquire_swfw_sync(hw, swfw_mask))
return IXGBE_ERR_SWFW_SYNC;
ixgbe_i2c_start(hw);
@@ -1998,13 +2096,16 @@ s32 ixgbe_read_i2c_byte_generic(struct ixgbe_hw *hw, u8 byte_offset,
goto fail;
ixgbe_i2c_stop(hw);
- hw->mac.ops.release_swfw_sync(hw, swfw_mask);
+ if (lock)
+ hw->mac.ops.release_swfw_sync(hw, swfw_mask);
return IXGBE_SUCCESS;
fail:
ixgbe_i2c_bus_clear(hw);
- hw->mac.ops.release_swfw_sync(hw, swfw_mask);
- msec_delay(100);
+ if (lock) {
+ hw->mac.ops.release_swfw_sync(hw, swfw_mask);
+ msec_delay(100);
+ }
retry++;
if (retry < max_retry)
DEBUGOUT("I2C byte read error - Retrying.\n");
@@ -2017,28 +2118,60 @@ fail:
}
/**
- * ixgbe_write_i2c_byte_generic - Writes 8 bit word over I2C
+ * ixgbe_read_i2c_byte_generic - Reads 8 bit word over I2C
+ * @hw: pointer to hardware structure
+ * @byte_offset: byte offset to read
+ * @data: value read
+ *
+ * Performs byte read operation to SFP module's EEPROM over I2C interface at
+ * a specified device address.
+ **/
+s32 ixgbe_read_i2c_byte_generic(struct ixgbe_hw *hw, u8 byte_offset,
+ u8 dev_addr, u8 *data)
+{
+ return ixgbe_read_i2c_byte_generic_int(hw, byte_offset, dev_addr,
+ data, TRUE);
+}
+
+/**
+ * ixgbe_read_i2c_byte_generic_unlocked - Reads 8 bit word over I2C
+ * @hw: pointer to hardware structure
+ * @byte_offset: byte offset to read
+ * @data: value read
+ *
+ * Performs byte read operation to SFP module's EEPROM over I2C interface at
+ * a specified device address.
+ **/
+s32 ixgbe_read_i2c_byte_generic_unlocked(struct ixgbe_hw *hw, u8 byte_offset,
+ u8 dev_addr, u8 *data)
+{
+ return ixgbe_read_i2c_byte_generic_int(hw, byte_offset, dev_addr,
+ data, FALSE);
+}
+
+/**
+ * ixgbe_write_i2c_byte_generic_int - Writes 8 bit word over I2C
* @hw: pointer to hardware structure
* @byte_offset: byte offset to write
* @data: value to write
+ * @lock: TRUE if to take and release semaphore
*
* Performs byte write operation to SFP module's EEPROM over I2C interface at
* a specified device address.
**/
-s32 ixgbe_write_i2c_byte_generic(struct ixgbe_hw *hw, u8 byte_offset,
- u8 dev_addr, u8 data)
+static s32 ixgbe_write_i2c_byte_generic_int(struct ixgbe_hw *hw, u8 byte_offset,
+ u8 dev_addr, u8 data, bool lock)
{
- s32 status = IXGBE_SUCCESS;
+ s32 status;
u32 max_retry = 1;
u32 retry = 0;
u32 swfw_mask = hw->phy.phy_semaphore_mask;
DEBUGFUNC("ixgbe_write_i2c_byte_generic");
- if (hw->mac.ops.acquire_swfw_sync(hw, swfw_mask) != IXGBE_SUCCESS) {
- status = IXGBE_ERR_SWFW_SYNC;
- goto write_byte_out;
- }
+ if (lock && hw->mac.ops.acquire_swfw_sync(hw, swfw_mask) !=
+ IXGBE_SUCCESS)
+ return IXGBE_ERR_SWFW_SYNC;
do {
ixgbe_i2c_start(hw);
@@ -2068,7 +2201,8 @@ s32 ixgbe_write_i2c_byte_generic(struct ixgbe_hw *hw, u8 byte_offset,
goto fail;
ixgbe_i2c_stop(hw);
- hw->mac.ops.release_swfw_sync(hw, swfw_mask);
+ if (lock)
+ hw->mac.ops.release_swfw_sync(hw, swfw_mask);
return IXGBE_SUCCESS;
fail:
@@ -2080,13 +2214,45 @@ fail:
DEBUGOUT("I2C byte write error.\n");
} while (retry < max_retry);
- hw->mac.ops.release_swfw_sync(hw, swfw_mask);
+ if (lock)
+ hw->mac.ops.release_swfw_sync(hw, swfw_mask);
-write_byte_out:
return status;
}
/**
+ * ixgbe_write_i2c_byte_generic - Writes 8 bit word over I2C
+ * @hw: pointer to hardware structure
+ * @byte_offset: byte offset to write
+ * @data: value to write
+ *
+ * Performs byte write operation to SFP module's EEPROM over I2C interface at
+ * a specified device address.
+ **/
+s32 ixgbe_write_i2c_byte_generic(struct ixgbe_hw *hw, u8 byte_offset,
+ u8 dev_addr, u8 data)
+{
+ return ixgbe_write_i2c_byte_generic_int(hw, byte_offset, dev_addr,
+ data, TRUE);
+}
+
+/**
+ * ixgbe_write_i2c_byte_generic_unlocked - Writes 8 bit word over I2C
+ * @hw: pointer to hardware structure
+ * @byte_offset: byte offset to write
+ * @data: value to write
+ *
+ * Performs byte write operation to SFP module's EEPROM over I2C interface at
+ * a specified device address.
+ **/
+s32 ixgbe_write_i2c_byte_generic_unlocked(struct ixgbe_hw *hw, u8 byte_offset,
+ u8 dev_addr, u8 data)
+{
+ return ixgbe_write_i2c_byte_generic_int(hw, byte_offset, dev_addr,
+ data, FALSE);
+}
+
+/**
* ixgbe_i2c_start - Sets I2C start condition
* @hw: pointer to hardware structure
*
diff --git a/sys/dev/ixgbe/ixgbe_phy.h b/sys/dev/ixgbe/ixgbe_phy.h
index 021d5f0..fad31bd 100644
--- a/sys/dev/ixgbe/ixgbe_phy.h
+++ b/sys/dev/ixgbe/ixgbe_phy.h
@@ -1,6 +1,6 @@
/******************************************************************************
- Copyright (c) 2001-2014, Intel Corporation
+ Copyright (c) 2001-2015, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -89,9 +89,24 @@
#define IXGBE_I2C_EEPROM_STATUS_IN_PROGRESS 0x3
#define IXGBE_CS4227 0xBE /* CS4227 address */
-#define IXGBE_CS4227_SPARE24_LSB 0x12B0 /* Reg to program EDC */
+#define IXGBE_CS4227_GLOBAL_ID_LSB 0
+#define IXGBE_CS4227_SCRATCH 2
+#define IXGBE_CS4227_GLOBAL_ID_VALUE 0x03E5
+#define IXGBE_CS4227_SCRATCH_VALUE 0x5aa5
+#define IXGBE_CS4227_RETRIES 5
+#define IXGBE_CS4227_LINE_SPARE22_MSB 0x12AD /* Reg to program speed */
+#define IXGBE_CS4227_LINE_SPARE24_LSB 0x12B0 /* Reg to program EDC */
+#define IXGBE_CS4227_HOST_SPARE22_MSB 0x1AAD /* Reg to program speed */
+#define IXGBE_CS4227_HOST_SPARE24_LSB 0x1AB0 /* Reg to program EDC */
#define IXGBE_CS4227_EDC_MODE_CX1 0x0002
#define IXGBE_CS4227_EDC_MODE_SR 0x0004
+#define IXGBE_CS4227_RESET_HOLD 500 /* microseconds */
+#define IXGBE_CS4227_RESET_DELAY 500 /* milliseconds */
+#define IXGBE_CS4227_CHECK_DELAY 30 /* milliseconds */
+#define IXGBE_PE 0xE0 /* Port expander address */
+#define IXGBE_PE_OUTPUT 1 /* Output register offset */
+#define IXGBE_PE_CONFIG 3 /* Config register offset */
+#define IXGBE_PE_BIT1 (1 << 1)
/* Flow control defines */
#define IXGBE_TAF_SYM_PAUSE 0x400
@@ -175,8 +190,12 @@ s32 ixgbe_get_sfp_init_sequence_offsets(struct ixgbe_hw *hw,
s32 ixgbe_tn_check_overtemp(struct ixgbe_hw *hw);
s32 ixgbe_read_i2c_byte_generic(struct ixgbe_hw *hw, u8 byte_offset,
u8 dev_addr, u8 *data);
+s32 ixgbe_read_i2c_byte_generic_unlocked(struct ixgbe_hw *hw, u8 byte_offset,
+ u8 dev_addr, u8 *data);
s32 ixgbe_write_i2c_byte_generic(struct ixgbe_hw *hw, u8 byte_offset,
u8 dev_addr, u8 data);
+s32 ixgbe_write_i2c_byte_generic_unlocked(struct ixgbe_hw *hw, u8 byte_offset,
+ u8 dev_addr, u8 data);
s32 ixgbe_read_i2c_eeprom_generic(struct ixgbe_hw *hw, u8 byte_offset,
u8 *eeprom_data);
s32 ixgbe_write_i2c_eeprom_generic(struct ixgbe_hw *hw, u8 byte_offset,
diff --git a/sys/dev/ixgbe/ixgbe_type.h b/sys/dev/ixgbe/ixgbe_type.h
index 24ba046..2a53952 100644
--- a/sys/dev/ixgbe/ixgbe_type.h
+++ b/sys/dev/ixgbe/ixgbe_type.h
@@ -1,6 +1,6 @@
/******************************************************************************
- Copyright (c) 2001-2014, Intel Corporation
+ Copyright (c) 2001-2015, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -111,6 +111,7 @@
#define IXGBE_SUBDEV_ID_82599_LOM_SNAP6 0x2159
#define IXGBE_SUBDEV_ID_82599_SFP_1OCP 0x000D
#define IXGBE_SUBDEV_ID_82599_SFP_2OCP 0x0008
+#define IXGBE_SUBDEV_ID_82599_SFP_LOM 0x06EE
#define IXGBE_DEV_ID_82599_BACKPLANE_FCOE 0x152A
#define IXGBE_DEV_ID_82599_SFP_FCOE 0x1529
#define IXGBE_DEV_ID_82599_SFP_EM 0x1507
@@ -130,8 +131,6 @@
#define IXGBE_DEV_ID_X540_BYPASS 0x155C
#define IXGBE_DEV_ID_X540T1 0x1560
#define IXGBE_DEV_ID_X550T 0x1563
-/* Placeholder value, pending official value. */
-#define IXGBE_DEV_ID_X550EM_A_KR 0xABCD
#define IXGBE_DEV_ID_X550EM_X_KX4 0x15AA
#define IXGBE_DEV_ID_X550EM_X_KR 0x15AB
#define IXGBE_DEV_ID_X550EM_X_SFP 0x15AC
@@ -139,11 +138,13 @@
#define IXGBE_DEV_ID_X550EM_X_1G_T 0x15AE
#define IXGBE_DEV_ID_X550_VF_HV 0x1564
#define IXGBE_DEV_ID_X550_VF 0x1565
-#define IXGBE_DEV_ID_X550EM_A_VF 0x15B3
-#define IXGBE_DEV_ID_X550EM_A_VF_HV 0x15B4
#define IXGBE_DEV_ID_X550EM_X_VF 0x15A8
#define IXGBE_DEV_ID_X550EM_X_VF_HV 0x15A9
+#define IXGBE_CAT(r,m) IXGBE_##r##m
+
+#define IXGBE_BY_MAC(_hw, r) ((_hw)->mvals[IXGBE_CAT(r, _IDX)])
+
/* General Registers */
#define IXGBE_CTRL 0x00000
#define IXGBE_STATUS 0x00008
@@ -151,9 +152,11 @@
#define IXGBE_ESDP 0x00020
#define IXGBE_EODSDP 0x00028
#define IXGBE_I2CCTL_82599 0x00028
+#define IXGBE_I2CCTL IXGBE_I2CCTL_82599
+#define IXGBE_I2CCTL_X540 IXGBE_I2CCTL_82599
#define IXGBE_I2CCTL_X550 0x15F5C
-#define IXGBE_I2CCTL_BY_MAC(_hw) ((((_hw)->mac.type >= ixgbe_mac_X550) ? \
- IXGBE_I2CCTL_X550 : IXGBE_I2CCTL_82599))
+#define IXGBE_I2CCTL_X550EM_x IXGBE_I2CCTL_X550
+#define IXGBE_I2CCTL_BY_MAC(_hw) IXGBE_BY_MAC((_hw), I2CCTL)
#define IXGBE_PHY_GPIO 0x00028
#define IXGBE_MAC_GPIO 0x00030
#define IXGBE_PHYINT_STATUS0 0x00100
@@ -166,18 +169,40 @@
#define IXGBE_EXVET 0x05078
/* NVM Registers */
-#define IXGBE_EEC 0x10010
-#define IXGBE_EERD 0x10014
-#define IXGBE_EEWR 0x10018
-#define IXGBE_FLA 0x1001C
+#define IXGBE_EEC 0x10010
+#define IXGBE_EEC_X540 IXGBE_EEC
+#define IXGBE_EEC_X550 IXGBE_EEC
+#define IXGBE_EEC_X550EM_x IXGBE_EEC
+#define IXGBE_EEC_BY_MAC(_hw) IXGBE_EEC
+
+#define IXGBE_EERD 0x10014
+#define IXGBE_EEWR 0x10018
+
+#define IXGBE_FLA 0x1001C
+#define IXGBE_FLA_X540 IXGBE_FLA
+#define IXGBE_FLA_X550 IXGBE_FLA
+#define IXGBE_FLA_X550EM_x IXGBE_FLA
+#define IXGBE_FLA_BY_MAC(_hw) IXGBE_FLA
+
#define IXGBE_EEMNGCTL 0x10110
#define IXGBE_EEMNGDATA 0x10114
#define IXGBE_FLMNGCTL 0x10118
#define IXGBE_FLMNGDATA 0x1011C
#define IXGBE_FLMNGCNT 0x10120
#define IXGBE_FLOP 0x1013C
-#define IXGBE_GRC 0x10200
-#define IXGBE_SRAMREL 0x10210
+
+#define IXGBE_GRC 0x10200
+#define IXGBE_GRC_X540 IXGBE_GRC
+#define IXGBE_GRC_X550 IXGBE_GRC
+#define IXGBE_GRC_X550EM_x IXGBE_GRC
+#define IXGBE_GRC_BY_MAC(_hw) IXGBE_GRC
+
+#define IXGBE_SRAMREL 0x10210
+#define IXGBE_SRAMREL_X540 IXGBE_SRAMREL
+#define IXGBE_SRAMREL_X550 IXGBE_SRAMREL
+#define IXGBE_SRAMREL_X550EM_x IXGBE_SRAMREL
+#define IXGBE_SRAMREL_BY_MAC(_hw) IXGBE_SRAMREL
+
#define IXGBE_PHYDBG 0x10218
/* General Receive Control */
@@ -188,20 +213,48 @@
#define IXGBE_VPDDIAG1 0x10208
/* I2CCTL Bit Masks */
-#define IXGBE_I2C_CLK_IN_BY_MAC(_hw)(((_hw)->mac.type) >= ixgbe_mac_X550 ? \
- 0x00004000 : 0x00000001)
-#define IXGBE_I2C_CLK_OUT_BY_MAC(_hw)(((_hw)->mac.type) >= ixgbe_mac_X550 ? \
- 0x00000200 : 0x00000002)
-#define IXGBE_I2C_DATA_IN_BY_MAC(_hw)(((_hw)->mac.type) >= ixgbe_mac_X550 ? \
- 0x00001000 : 0x00000004)
-#define IXGBE_I2C_DATA_OUT_BY_MAC(_hw)(((_hw)->mac.type) >= ixgbe_mac_X550 ? \
- 0x00000400 : 0x00000008)
-#define IXGBE_I2C_BB_EN_BY_MAC(hw) ((hw)->mac.type >= ixgbe_mac_X550 ? \
- 0x00000100 : 0)
-#define IXGBE_I2C_DATA_OE_N_EN_BY_MAC(hw) ((hw)->mac.type >= ixgbe_mac_X550 ? \
- 0x00000800 : 0)
-#define IXGBE_I2C_CLK_OE_N_EN_BY_MAC(hw) ((hw)->mac.type >= ixgbe_mac_X550 ? \
- 0x00002000 : 0)
+#define IXGBE_I2C_CLK_IN 0x00000001
+#define IXGBE_I2C_CLK_IN_X540 IXGBE_I2C_CLK_IN
+#define IXGBE_I2C_CLK_IN_X550 0x00004000
+#define IXGBE_I2C_CLK_IN_X550EM_x IXGBE_I2C_CLK_IN_X550
+#define IXGBE_I2C_CLK_IN_BY_MAC(_hw) IXGBE_BY_MAC((_hw), I2C_CLK_IN)
+
+#define IXGBE_I2C_CLK_OUT 0x00000002
+#define IXGBE_I2C_CLK_OUT_X540 IXGBE_I2C_CLK_OUT
+#define IXGBE_I2C_CLK_OUT_X550 0x00000200
+#define IXGBE_I2C_CLK_OUT_X550EM_x IXGBE_I2C_CLK_OUT_X550
+#define IXGBE_I2C_CLK_OUT_BY_MAC(_hw) IXGBE_BY_MAC((_hw), I2C_CLK_OUT)
+
+#define IXGBE_I2C_DATA_IN 0x00000004
+#define IXGBE_I2C_DATA_IN_X540 IXGBE_I2C_DATA_IN
+#define IXGBE_I2C_DATA_IN_X550 0x00001000
+#define IXGBE_I2C_DATA_IN_X550EM_x IXGBE_I2C_DATA_IN_X550
+#define IXGBE_I2C_DATA_IN_BY_MAC(_hw) IXGBE_BY_MAC((_hw), I2C_DATA_IN)
+
+#define IXGBE_I2C_DATA_OUT 0x00000008
+#define IXGBE_I2C_DATA_OUT_X540 IXGBE_I2C_DATA_OUT
+#define IXGBE_I2C_DATA_OUT_X550 0x00000400
+#define IXGBE_I2C_DATA_OUT_X550EM_x IXGBE_I2C_DATA_OUT_X550
+#define IXGBE_I2C_DATA_OUT_BY_MAC(_hw) IXGBE_BY_MAC((_hw), I2C_DATA_OUT)
+
+#define IXGBE_I2C_DATA_OE_N_EN 0
+#define IXGBE_I2C_DATA_OE_N_EN_X540 IXGBE_I2C_DATA_OE_N_EN
+#define IXGBE_I2C_DATA_OE_N_EN_X550 0x00000800
+#define IXGBE_I2C_DATA_OE_N_EN_X550EM_x IXGBE_I2C_DATA_OE_N_EN_X550
+#define IXGBE_I2C_DATA_OE_N_EN_BY_MAC(_hw) IXGBE_BY_MAC((_hw), I2C_DATA_OE_N_EN)
+
+#define IXGBE_I2C_BB_EN 0
+#define IXGBE_I2C_BB_EN_X540 IXGBE_I2C_BB_EN
+#define IXGBE_I2C_BB_EN_X550 0x00000100
+#define IXGBE_I2C_BB_EN_X550EM_x IXGBE_I2C_BB_EN_X550
+
+#define IXGBE_I2C_BB_EN_BY_MAC(_hw) IXGBE_BY_MAC((_hw), I2C_BB_EN)
+
+#define IXGBE_I2C_CLK_OE_N_EN 0
+#define IXGBE_I2C_CLK_OE_N_EN_X540 IXGBE_I2C_CLK_OE_N_EN
+#define IXGBE_I2C_CLK_OE_N_EN_X550 0x00002000
+#define IXGBE_I2C_CLK_OE_N_EN_X550EM_x IXGBE_I2C_CLK_OE_N_EN_X550
+#define IXGBE_I2C_CLK_OE_N_EN_BY_MAC(_hw) IXGBE_BY_MAC((_hw), I2C_CLK_OE_N_EN)
#define IXGBE_I2C_CLOCK_STRETCHING_TIMEOUT 500
@@ -612,6 +665,7 @@ struct ixgbe_dmac_config {
#define IXGBE_EEER 0x043A0 /* EEE register */
#define IXGBE_EEE_STAT 0x04398 /* EEE Status */
#define IXGBE_EEE_SU 0x04380 /* EEE Set up */
+#define IXGBE_EEE_SU_TEEE_DLY_SHIFT 26
#define IXGBE_TLPIC 0x041F4 /* EEE Tx LPI count */
#define IXGBE_RLPIC 0x041F8 /* EEE Rx LPI count */
@@ -989,14 +1043,34 @@ struct ixgbe_dmac_config {
#define IXGBE_GSCN_2 0x11028
#define IXGBE_GSCN_3 0x1102C
#define IXGBE_FACTPS 0x10150
+#define IXGBE_FACTPS_X540 IXGBE_FACTPS
+#define IXGBE_FACTPS_X550 IXGBE_FACTPS
+#define IXGBE_FACTPS_X550EM_x IXGBE_FACTPS
+#define IXGBE_FACTPS_BY_MAC(_hw) IXGBE_FACTPS
+
#define IXGBE_PCIEANACTL 0x11040
#define IXGBE_SWSM 0x10140
+#define IXGBE_SWSM_X540 IXGBE_SWSM
+#define IXGBE_SWSM_X550 IXGBE_SWSM
+#define IXGBE_SWSM_X550EM_x IXGBE_SWSM
+#define IXGBE_SWSM_BY_MAC(_hw) IXGBE_SWSM
+
#define IXGBE_FWSM 0x10148
+#define IXGBE_FWSM_X540 IXGBE_FWSM
+#define IXGBE_FWSM_X550 IXGBE_FWSM
+#define IXGBE_FWSM_X550EM_x IXGBE_FWSM
+#define IXGBE_FWSM_BY_MAC(_hw) IXGBE_FWSM
+
+#define IXGBE_SWFW_SYNC IXGBE_GSSR
+#define IXGBE_SWFW_SYNC_X540 IXGBE_SWFW_SYNC
+#define IXGBE_SWFW_SYNC_X550 IXGBE_SWFW_SYNC
+#define IXGBE_SWFW_SYNC_X550EM_x IXGBE_SWFW_SYNC
+#define IXGBE_SWFW_SYNC_BY_MAC(_hw) IXGBE_SWFW_SYNC
+
#define IXGBE_GSSR 0x10160
#define IXGBE_MREVID 0x11064
#define IXGBE_DCA_ID 0x11070
#define IXGBE_DCA_CTRL 0x11074
-#define IXGBE_SWFW_SYNC IXGBE_GSSR
/* PCI-E registers 82599-Specific */
#define IXGBE_GCR_EXT 0x11050
@@ -1008,14 +1082,18 @@ struct ixgbe_dmac_config {
#define IXGBE_PHYDAT_82599 0x11044
#define IXGBE_PHYCTL_82599 0x11048
#define IXGBE_PBACLR_82599 0x11068
-#define IXGBE_CIAA_82599 0x11088
-#define IXGBE_CIAD_82599 0x1108C
+#define IXGBE_CIAA 0x11088
+#define IXGBE_CIAD 0x1108C
+#define IXGBE_CIAA_82599 IXGBE_CIAA
+#define IXGBE_CIAD_82599 IXGBE_CIAD
+#define IXGBE_CIAA_X540 IXGBE_CIAA
+#define IXGBE_CIAD_X540 IXGBE_CIAD
#define IXGBE_CIAA_X550 0x11508
#define IXGBE_CIAD_X550 0x11510
-#define IXGBE_CIAA_BY_MAC(_hw) ((((_hw)->mac.type >= ixgbe_mac_X550) ? \
- IXGBE_CIAA_X550 : IXGBE_CIAA_82599))
-#define IXGBE_CIAD_BY_MAC(_hw) ((((_hw)->mac.type >= ixgbe_mac_X550) ? \
- IXGBE_CIAD_X550 : IXGBE_CIAD_82599))
+#define IXGBE_CIAA_X550EM_x IXGBE_CIAA_X550
+#define IXGBE_CIAD_X550EM_x IXGBE_CIAD_X550
+#define IXGBE_CIAA_BY_MAC(_hw) IXGBE_BY_MAC((_hw), CIAA)
+#define IXGBE_CIAD_BY_MAC(_hw) IXGBE_BY_MAC((_hw), CIAD)
#define IXGBE_PICAUSE 0x110B0
#define IXGBE_PIENA 0x110B8
#define IXGBE_CDQ_MBR_82599 0x110B4
@@ -1365,6 +1443,8 @@ struct ixgbe_dmac_config {
#define IXGBE_MDIO_AUTO_NEG_STATUS 0x1 /* AUTO_NEG Status Reg */
#define IXGBE_MDIO_AUTO_NEG_VENDOR_STAT 0xC800 /* AUTO_NEG Vendor Status Reg */
#define IXGBE_MDIO_AUTO_NEG_VENDOR_TX_ALARM 0xCC00 /* AUTO_NEG Vendor TX Reg */
+#define IXGBE_MDIO_AUTO_NEG_VENDOR_TX_ALARM2 0xCC01 /* AUTO_NEG Vendor Tx Reg */
+#define IXGBE_MDIO_AUTO_NEG_VEN_LSC 0x1 /* AUTO_NEG Vendor Tx LSC */
#define IXGBE_MDIO_AUTO_NEG_ADVT 0x10 /* AUTO_NEG Advt Reg */
#define IXGBE_MDIO_AUTO_NEG_LP 0x13 /* AUTO_NEG LP Status Reg */
#define IXGBE_MDIO_AUTO_NEG_EEE_ADVT 0x3C /* AUTO_NEG EEE Advt Reg */
@@ -1393,11 +1473,24 @@ struct ixgbe_dmac_config {
#define IXGBE_MDIO_TX_VENDOR_ALARMS_3_RST_MASK 0x3 /* PHY Reset Complete Mask */
#define IXGBE_MDIO_GLOBAL_RES_PR_10 0xC479 /* Global Resv Provisioning 10 Reg */
#define IXGBE_MDIO_POWER_UP_STALL 0x8000 /* Power Up Stall */
-
+#define IXGBE_MDIO_GLOBAL_INT_CHIP_STD_MASK 0xFF00 /* int std mask */
+#define IXGBE_MDIO_GLOBAL_CHIP_STD_INT_FLAG 0xFC00 /* chip std int flag */
+#define IXGBE_MDIO_GLOBAL_INT_CHIP_VEN_MASK 0xFF01 /* int chip-wide mask */
+#define IXGBE_MDIO_GLOBAL_INT_CHIP_VEN_FLAG 0xFC01 /* int chip-wide mask */
+#define IXGBE_MDIO_GLOBAL_ALARM_1 0xCC00 /* Global alarm 1 */
+#define IXGBE_MDIO_GLOBAL_ALM_1_HI_TMP_FAIL 0x4000 /* high temp failure */
+#define IXGBE_MDIO_GLOBAL_INT_MASK 0xD400 /* Global int mask */
+#define IXGBE_MDIO_GLOBAL_AN_VEN_ALM_INT_EN 0x1000 /* autoneg vendor alarm int enable */
+#define IXGBE_MDIO_GLOBAL_ALARM_1_INT 0x4 /* int in Global alarm 1 */
+#define IXGBE_MDIO_GLOBAL_VEN_ALM_INT_EN 0x1 /* vendor alarm int enable */
+#define IXGBE_MDIO_GLOBAL_STD_ALM2_INT 0x200 /* vendor alarm2 int mask */
+#define IXGBE_MDIO_GLOBAL_INT_HI_TEMP_EN 0x4000 /* int high temp enable */
#define IXGBE_MDIO_PMA_PMD_CONTROL_ADDR 0x0000 /* PMA/PMD Control Reg */
#define IXGBE_MDIO_PMA_PMD_SDA_SCL_ADDR 0xC30A /* PHY_XS SDA/SCL Addr Reg */
#define IXGBE_MDIO_PMA_PMD_SDA_SCL_DATA 0xC30B /* PHY_XS SDA/SCL Data Reg */
#define IXGBE_MDIO_PMA_PMD_SDA_SCL_STAT 0xC30C /* PHY_XS SDA/SCL Status Reg */
+#define IXGBE_MDIO_PMA_TX_VEN_LASI_INT_MASK 0xD401 /* PHY TX Vendor LASI */
+#define IXGBE_MDIO_PMA_TX_VEN_LASI_INT_EN 0x1 /* PHY TX Vendor LASI enable */
#define IXGBE_MDIO_PMD_STD_TX_DISABLE_CNTR 0x9 /* Standard Transmit Dis Reg */
#define IXGBE_MDIO_PMD_GLOBAL_TX_DISABLE 0x0001 /* PMD Global Transmit Dis */
@@ -1479,12 +1572,16 @@ struct ixgbe_dmac_config {
#define IXGBE_SDP0_GPIEN_X540 0x00000002 /* SDP0 on X540 and X550 */
#define IXGBE_SDP1_GPIEN_X540 0x00000004 /* SDP1 on X540 and X550 */
#define IXGBE_SDP2_GPIEN_X540 0x00000008 /* SDP2 on X540 and X550 */
-#define IXGBE_SDP0_GPIEN_BY_MAC(_hw) ((_hw)->mac.type >= ixgbe_mac_X540 ? \
- IXGBE_SDP0_GPIEN_X540 : IXGBE_SDP0_GPIEN)
-#define IXGBE_SDP1_GPIEN_BY_MAC(_hw) ((_hw)->mac.type >= ixgbe_mac_X540 ? \
- IXGBE_SDP1_GPIEN_X540 : IXGBE_SDP1_GPIEN)
-#define IXGBE_SDP2_GPIEN_BY_MAC(_hw) ((_hw)->mac.type >= ixgbe_mac_X540 ? \
- IXGBE_SDP2_GPIEN_X540 : IXGBE_SDP2_GPIEN)
+#define IXGBE_SDP0_GPIEN_X550 IXGBE_SDP0_GPIEN_X540
+#define IXGBE_SDP1_GPIEN_X550 IXGBE_SDP1_GPIEN_X540
+#define IXGBE_SDP2_GPIEN_X550 IXGBE_SDP2_GPIEN_X540
+#define IXGBE_SDP0_GPIEN_X550EM_x IXGBE_SDP0_GPIEN_X540
+#define IXGBE_SDP1_GPIEN_X550EM_x IXGBE_SDP1_GPIEN_X540
+#define IXGBE_SDP2_GPIEN_X550EM_x IXGBE_SDP2_GPIEN_X540
+#define IXGBE_SDP0_GPIEN_BY_MAC(_hw) IXGBE_BY_MAC((_hw), SDP0_GPIEN)
+#define IXGBE_SDP1_GPIEN_BY_MAC(_hw) IXGBE_BY_MAC((_hw), SDP1_GPIEN)
+#define IXGBE_SDP2_GPIEN_BY_MAC(_hw) IXGBE_BY_MAC((_hw), SDP2_GPIEN)
+
#define IXGBE_GPIE_MSIX_MODE 0x00000010 /* MSI-X mode */
#define IXGBE_GPIE_OCD 0x00000020 /* Other Clear Disable */
#define IXGBE_GPIE_EIMEN 0x00000040 /* Immediate Interrupt Enable */
@@ -1665,15 +1762,16 @@ enum {
#define IXGBE_EICR_GPI_SDP0_X540 0x02000000 /* Gen Purpose Interrupt on SDP0 */
#define IXGBE_EICR_GPI_SDP1_X540 0x04000000 /* Gen Purpose Interrupt on SDP1 */
#define IXGBE_EICR_GPI_SDP2_X540 0x08000000 /* Gen Purpose Interrupt on SDP2 */
-#define IXGBE_EICR_GPI_SDP0_BY_MAC(_hw) ((_hw)->mac.type >= ixgbe_mac_X540 ? \
- IXGBE_EICR_GPI_SDP0_X540 : \
- IXGBE_EICR_GPI_SDP0)
-#define IXGBE_EICR_GPI_SDP1_BY_MAC(_hw) ((_hw)->mac.type >= ixgbe_mac_X540 ? \
- IXGBE_EICR_GPI_SDP1_X540 : \
- IXGBE_EICR_GPI_SDP1)
-#define IXGBE_EICR_GPI_SDP2_BY_MAC(_hw) ((_hw)->mac.type >= ixgbe_mac_X540 ? \
- IXGBE_EICR_GPI_SDP2_X540 : \
- IXGBE_EICR_GPI_SDP2)
+#define IXGBE_EICR_GPI_SDP0_X550 IXGBE_EICR_GPI_SDP0_X540
+#define IXGBE_EICR_GPI_SDP1_X550 IXGBE_EICR_GPI_SDP1_X540
+#define IXGBE_EICR_GPI_SDP2_X550 IXGBE_EICR_GPI_SDP2_X540
+#define IXGBE_EICR_GPI_SDP0_X550EM_x IXGBE_EICR_GPI_SDP0_X540
+#define IXGBE_EICR_GPI_SDP1_X550EM_x IXGBE_EICR_GPI_SDP1_X540
+#define IXGBE_EICR_GPI_SDP2_X550EM_x IXGBE_EICR_GPI_SDP2_X540
+#define IXGBE_EICR_GPI_SDP0_BY_MAC(_hw) IXGBE_BY_MAC((_hw), EICR_GPI_SDP0)
+#define IXGBE_EICR_GPI_SDP1_BY_MAC(_hw) IXGBE_BY_MAC((_hw), EICR_GPI_SDP1)
+#define IXGBE_EICR_GPI_SDP2_BY_MAC(_hw) IXGBE_BY_MAC((_hw), EICR_GPI_SDP2)
+
#define IXGBE_EICR_PBUR 0x10000000 /* Packet Buffer Handler Error */
#define IXGBE_EICR_DHER 0x20000000 /* Descriptor Handler Error */
#define IXGBE_EICR_TCP_TIMER 0x40000000 /* TCP Timer */
@@ -1901,6 +1999,9 @@ enum {
#define IXGBE_LED_IVRT(_i) IXGBE_LED_OFFSET(IXGBE_LED_IVRT_BASE, _i)
#define IXGBE_LED_BLINK(_i) IXGBE_LED_OFFSET(IXGBE_LED_BLINK_BASE, _i)
#define IXGBE_LED_MODE_MASK(_i) IXGBE_LED_OFFSET(IXGBE_LED_MODE_MASK_BASE, _i)
+#define IXGBE_X557_LED_MANUAL_SET_MASK (1 << 8)
+#define IXGBE_X557_MAX_LED_INDEX 3
+#define IXGBE_X557_LED_PROVISIONING 0xC430
/* LED modes */
#define IXGBE_LED_LINK_UP 0x0
@@ -2784,6 +2885,7 @@ enum ixgbe_fdir_pballoc_type {
#define IXGBE_HI_FLASH_ERASE_TIMEOUT 1000 /* Process Erase command limit */
#define IXGBE_HI_FLASH_UPDATE_TIMEOUT 5000 /* Process Update command limit */
#define IXGBE_HI_FLASH_APPLY_TIMEOUT 0 /* Process Apply command limit */
+#define IXGBE_HI_PHY_MGMT_REQ_TIMEOUT 2000 /* Wait up to 2 seconds */
/* CEM Support */
#define FW_CEM_HDR_LEN 0x4
@@ -2804,6 +2906,7 @@ enum ixgbe_fdir_pballoc_type {
#define FW_MAX_READ_BUFFER_SIZE 1024
#define FW_DISABLE_RXEN_CMD 0xDE
#define FW_DISABLE_RXEN_LEN 0x1
+#define FW_PHY_MGMT_REQ_CMD 0x20
/* Host Interface Command Structures */
struct ixgbe_hic_hdr {
@@ -3200,6 +3303,36 @@ union ixgbe_atr_hash_dword {
};
+#define IXGBE_MVALS_INIT(m) \
+ IXGBE_CAT(EEC, m), \
+ IXGBE_CAT(FLA, m), \
+ IXGBE_CAT(GRC, m), \
+ IXGBE_CAT(SRAMREL, m), \
+ IXGBE_CAT(FACTPS, m), \
+ IXGBE_CAT(SWSM, m), \
+ IXGBE_CAT(FWSM, m), \
+ IXGBE_CAT(SDP0_GPIEN, m), \
+ IXGBE_CAT(SDP1_GPIEN, m), \
+ IXGBE_CAT(SDP2_GPIEN, m), \
+ IXGBE_CAT(EICR_GPI_SDP0, m), \
+ IXGBE_CAT(EICR_GPI_SDP1, m), \
+ IXGBE_CAT(EICR_GPI_SDP2, m), \
+ IXGBE_CAT(CIAA, m), \
+ IXGBE_CAT(CIAD, m), \
+ IXGBE_CAT(I2C_CLK_IN, m), \
+ IXGBE_CAT(I2C_CLK_OUT, m), \
+ IXGBE_CAT(I2C_DATA_IN, m), \
+ IXGBE_CAT(I2C_DATA_OUT, m), \
+ IXGBE_CAT(I2C_DATA_OE_N_EN, m), \
+ IXGBE_CAT(I2C_BB_EN, m), \
+ IXGBE_CAT(I2C_CLK_OE_N_EN, m), \
+ IXGBE_CAT(I2CCTL, m)
+
+enum ixgbe_mvals {
+ IXGBE_MVALS_INIT(_IDX),
+ IXGBE_MVALS_IDX_LIMIT
+};
+
/*
* Unavailable: The FCoE Boot Option ROM is not present in the flash.
* Disabled: Present; boot order is not set for any targets on the port.
@@ -3225,17 +3358,10 @@ enum ixgbe_mac_type {
ixgbe_mac_82599_vf,
ixgbe_mac_X540,
ixgbe_mac_X540_vf,
- /*
- * X550EM MAC type decoder:
- * ixgbe_mac_X550EM_x: "x" = Xeon
- * ixgbe_mac_X550EM_a: "a" = Atom
- */
ixgbe_mac_X550,
ixgbe_mac_X550EM_x,
- ixgbe_mac_X550EM_a,
ixgbe_mac_X550_vf,
ixgbe_mac_X550EM_x_vf,
- ixgbe_mac_X550EM_a_vf,
ixgbe_num_macs
};
@@ -3294,6 +3420,8 @@ enum ixgbe_sfp_type {
ixgbe_sfp_type_1g_cu_core1 = 10,
ixgbe_sfp_type_1g_sx_core0 = 11,
ixgbe_sfp_type_1g_sx_core1 = 12,
+ ixgbe_sfp_type_1g_lx_core0 = 13,
+ ixgbe_sfp_type_1g_lx_core1 = 14,
ixgbe_sfp_type_not_present = 0xFFFE,
ixgbe_sfp_type_unknown = 0xFFFF
};
@@ -3611,6 +3739,15 @@ struct ixgbe_phy_operations {
s32 (*check_overtemp)(struct ixgbe_hw *);
s32 (*set_phy_power)(struct ixgbe_hw *, bool on);
s32 (*enter_lplu)(struct ixgbe_hw *);
+ s32 (*handle_lasi)(struct ixgbe_hw *hw);
+ s32 (*read_i2c_combined_unlocked)(struct ixgbe_hw *, u8 addr, u16 reg,
+ u16 *value);
+ s32 (*write_i2c_combined_unlocked)(struct ixgbe_hw *, u8 addr, u16 reg,
+ u16 value);
+ s32 (*read_i2c_byte_unlocked)(struct ixgbe_hw *, u8 offset, u8 addr,
+ u8 *value);
+ s32 (*write_i2c_byte_unlocked)(struct ixgbe_hw *, u8 offset, u8 addr,
+ u8 value);
};
struct ixgbe_eeprom_info {
@@ -3674,6 +3811,7 @@ struct ixgbe_phy_info {
bool multispeed_fiber;
bool reset_if_overtemp;
bool qsfp_shared_i2c_bus;
+ u32 nw_mng_if_sel;
};
#include "ixgbe_mbx.h"
@@ -3717,6 +3855,7 @@ struct ixgbe_hw {
struct ixgbe_eeprom_info eeprom;
struct ixgbe_bus_info bus;
struct ixgbe_mbx_info mbx;
+ const u32 *mvals;
u16 device_id;
u16 vendor_id;
u16 subsystem_device_id;
@@ -3775,6 +3914,10 @@ struct ixgbe_hw {
#define IXGBE_NOT_IMPLEMENTED 0x7FFFFFFF
+#define IXGBE_FUSES0_GROUP(_i) (0x11158 + ((_i) * 4))
+#define IXGBE_FUSES0_300MHZ (1 << 5)
+#define IXGBE_FUSES0_REV1 (1 << 6)
+
#define IXGBE_KRM_PORT_CAR_GEN_CTRL(P) ((P == 0) ? (0x4010) : (0x8010))
#define IXGBE_KRM_LINK_CTRL_1(P) ((P == 0) ? (0x420C) : (0x820C))
#define IXGBE_KRM_AN_CNTL_1(P) ((P == 0) ? (0x422C) : (0x822C))
@@ -3842,8 +3985,10 @@ struct ixgbe_hw {
#define IXGBE_SB_IOSF_CTRL_BUSY_SHIFT 31
#define IXGBE_SB_IOSF_CTRL_BUSY (1 << IXGBE_SB_IOSF_CTRL_BUSY_SHIFT)
#define IXGBE_SB_IOSF_TARGET_KR_PHY 0
-#define IXGBE_SB_IOSF_TARGET_KX4_UNIPHY 1
-#define IXGBE_SB_IOSF_TARGET_KX4_PCS0 2
-#define IXGBE_SB_IOSF_TARGET_KX4_PCS1 3
+#define IXGBE_SB_IOSF_TARGET_KX4_PHY 1
+#define IXGBE_SB_IOSF_TARGET_KX4_PCS 2
+
+#define IXGBE_NW_MNG_IF_SEL 0x00011178
+#define IXGBE_NW_MNG_IF_SEL_INT_PHY_MODE (1 << 24)
#endif /* _IXGBE_TYPE_H_ */
diff --git a/sys/dev/ixgbe/ixgbe_vf.c b/sys/dev/ixgbe/ixgbe_vf.c
index 964514c..c010cf4 100644
--- a/sys/dev/ixgbe/ixgbe_vf.c
+++ b/sys/dev/ixgbe/ixgbe_vf.c
@@ -1,6 +1,6 @@
/******************************************************************************
- Copyright (c) 2001-2014, Intel Corporation
+ Copyright (c) 2001-2015, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -669,4 +669,3 @@ int ixgbevf_get_queues(struct ixgbe_hw *hw, unsigned int *num_tcs,
UNREFERENCED_3PARAMETER(hw, num_tcs, default_tc);
return IXGBE_SUCCESS;
}
-
diff --git a/sys/dev/ixgbe/ixgbe_vf.h b/sys/dev/ixgbe/ixgbe_vf.h
index 8f4d46e..edc8013 100644
--- a/sys/dev/ixgbe/ixgbe_vf.h
+++ b/sys/dev/ixgbe/ixgbe_vf.h
@@ -1,6 +1,6 @@
/******************************************************************************
- Copyright (c) 2001-2014, Intel Corporation
+ Copyright (c) 2001-2015, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
diff --git a/sys/dev/ixgbe/ixgbe_x540.c b/sys/dev/ixgbe/ixgbe_x540.c
index 93c6ca4..ddf0674 100644
--- a/sys/dev/ixgbe/ixgbe_x540.c
+++ b/sys/dev/ixgbe/ixgbe_x540.c
@@ -1,6 +1,6 @@
/******************************************************************************
- Copyright (c) 2001-2014, Intel Corporation
+ Copyright (c) 2001-2015, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -932,14 +932,14 @@ static void ixgbe_release_swfw_sync_semaphore(struct ixgbe_hw *hw)
/* Release both semaphores by writing 0 to the bits REGSMP and SMBI */
- swsm = IXGBE_READ_REG(hw, IXGBE_SWSM);
- swsm &= ~IXGBE_SWSM_SMBI;
- IXGBE_WRITE_REG(hw, IXGBE_SWSM, swsm);
-
swsm = IXGBE_READ_REG(hw, IXGBE_SWFW_SYNC);
swsm &= ~IXGBE_SWFW_REGSMP;
IXGBE_WRITE_REG(hw, IXGBE_SWFW_SYNC, swsm);
+ swsm = IXGBE_READ_REG(hw, IXGBE_SWSM);
+ swsm &= ~IXGBE_SWSM_SMBI;
+ IXGBE_WRITE_REG(hw, IXGBE_SWSM, swsm);
+
IXGBE_WRITE_FLUSH(hw);
}
@@ -1011,5 +1011,3 @@ s32 ixgbe_blink_led_stop_X540(struct ixgbe_hw *hw, u32 index)
return IXGBE_SUCCESS;
}
-
-
diff --git a/sys/dev/ixgbe/ixgbe_x540.h b/sys/dev/ixgbe/ixgbe_x540.h
index 12da827..efd0d41 100644
--- a/sys/dev/ixgbe/ixgbe_x540.h
+++ b/sys/dev/ixgbe/ixgbe_x540.h
@@ -1,6 +1,6 @@
/******************************************************************************
- Copyright (c) 2001-2014, Intel Corporation
+ Copyright (c) 2001-2015, Intel Corporation
All rights reserved.
Redistribution and use in source and binary forms, with or without
diff --git a/sys/dev/ixgbe/ixgbe_x550.c b/sys/dev/ixgbe/ixgbe_x550.c
new file mode 100644
index 0000000..65daa17
--- /dev/null
+++ b/sys/dev/ixgbe/ixgbe_x550.c
@@ -0,0 +1,3191 @@
+/******************************************************************************
+
+ Copyright (c) 2001-2015, Intel Corporation
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ 3. Neither the name of the Intel Corporation nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+******************************************************************************/
+/*$FreeBSD$*/
+
+#include "ixgbe_x550.h"
+#include "ixgbe_x540.h"
+#include "ixgbe_type.h"
+#include "ixgbe_api.h"
+#include "ixgbe_common.h"
+#include "ixgbe_phy.h"
+
+static s32 ixgbe_setup_ixfi_x550em(struct ixgbe_hw *hw, ixgbe_link_speed *speed);
+
+/**
+ * ixgbe_init_ops_X550 - Inits func ptrs and MAC type
+ * @hw: pointer to hardware structure
+ *
+ * Initialize the function pointers and assign the MAC type for X550.
+ * Does not touch the hardware.
+ **/
+s32 ixgbe_init_ops_X550(struct ixgbe_hw *hw)
+{
+ struct ixgbe_mac_info *mac = &hw->mac;
+ struct ixgbe_eeprom_info *eeprom = &hw->eeprom;
+ s32 ret_val;
+
+ DEBUGFUNC("ixgbe_init_ops_X550");
+
+ ret_val = ixgbe_init_ops_X540(hw);
+ mac->ops.dmac_config = ixgbe_dmac_config_X550;
+ mac->ops.dmac_config_tcs = ixgbe_dmac_config_tcs_X550;
+ mac->ops.dmac_update_tcs = ixgbe_dmac_update_tcs_X550;
+ mac->ops.setup_eee = ixgbe_setup_eee_X550;
+ mac->ops.set_source_address_pruning =
+ ixgbe_set_source_address_pruning_X550;
+ mac->ops.set_ethertype_anti_spoofing =
+ ixgbe_set_ethertype_anti_spoofing_X550;
+
+ mac->ops.get_rtrup2tc = ixgbe_dcb_get_rtrup2tc_generic;
+ eeprom->ops.init_params = ixgbe_init_eeprom_params_X550;
+ eeprom->ops.calc_checksum = ixgbe_calc_eeprom_checksum_X550;
+ eeprom->ops.read = ixgbe_read_ee_hostif_X550;
+ eeprom->ops.read_buffer = ixgbe_read_ee_hostif_buffer_X550;
+ eeprom->ops.write = ixgbe_write_ee_hostif_X550;
+ eeprom->ops.write_buffer = ixgbe_write_ee_hostif_buffer_X550;
+ eeprom->ops.update_checksum = ixgbe_update_eeprom_checksum_X550;
+ eeprom->ops.validate_checksum = ixgbe_validate_eeprom_checksum_X550;
+
+ mac->ops.disable_mdd = ixgbe_disable_mdd_X550;
+ mac->ops.enable_mdd = ixgbe_enable_mdd_X550;
+ mac->ops.mdd_event = ixgbe_mdd_event_X550;
+ mac->ops.restore_mdd_vf = ixgbe_restore_mdd_vf_X550;
+ mac->ops.disable_rx = ixgbe_disable_rx_x550;
+ if (hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T) {
+ hw->mac.ops.led_on = ixgbe_led_on_t_X550em;
+ hw->mac.ops.led_off = ixgbe_led_off_t_X550em;
+ }
+ return ret_val;
+}
+
+/**
+ * ixgbe_read_cs4227 - Read CS4227 register
+ * @hw: pointer to hardware structure
+ * @reg: register number to write
+ * @value: pointer to receive value read
+ *
+ * Returns status code
+ **/
+static s32 ixgbe_read_cs4227(struct ixgbe_hw *hw, u16 reg, u16 *value)
+{
+ return ixgbe_read_i2c_combined_unlocked(hw, IXGBE_CS4227, reg, value);
+}
+
+/**
+ * ixgbe_write_cs4227 - Write CS4227 register
+ * @hw: pointer to hardware structure
+ * @reg: register number to write
+ * @value: value to write to register
+ *
+ * Returns status code
+ **/
+static s32 ixgbe_write_cs4227(struct ixgbe_hw *hw, u16 reg, u16 value)
+{
+ return ixgbe_write_i2c_combined_unlocked(hw, IXGBE_CS4227, reg, value);
+}
+
+/**
+ * ixgbe_get_cs4227_status - Return CS4227 status
+ * @hw: pointer to hardware structure
+ *
+ * Returns error if CS4227 not successfully initialized
+ **/
+static s32 ixgbe_get_cs4227_status(struct ixgbe_hw *hw)
+{
+ s32 status;
+ u16 value = 0;
+ u16 reg_slice, reg_val;
+ u8 retry;
+
+ for (retry = 0; retry < IXGBE_CS4227_RETRIES; ++retry) {
+ status = ixgbe_read_cs4227(hw, IXGBE_CS4227_GLOBAL_ID_LSB,
+ &value);
+ if (status != IXGBE_SUCCESS)
+ return status;
+ if (value == IXGBE_CS4227_GLOBAL_ID_VALUE)
+ break;
+ msec_delay(IXGBE_CS4227_CHECK_DELAY);
+ }
+ if (value != IXGBE_CS4227_GLOBAL_ID_VALUE)
+ return IXGBE_ERR_PHY;
+
+ status = ixgbe_read_cs4227(hw, IXGBE_CS4227_SCRATCH, &value);
+ if (status != IXGBE_SUCCESS)
+ return status;
+
+ /* If this is the first time after power-on, check the ucode.
+ * Otherwise, this will disrupt link on all ports. Because we
+ * can only do this the first time, we must check all ports,
+ * not just our own.
+ */
+ if (value != IXGBE_CS4227_SCRATCH_VALUE) {
+ reg_slice = IXGBE_CS4227_LINE_SPARE24_LSB;
+ reg_val = (IXGBE_CS4227_EDC_MODE_CX1 << 1) | 0x1;
+ status = ixgbe_write_cs4227(hw, reg_slice,
+ reg_val);
+ if (status != IXGBE_SUCCESS)
+ return status;
+
+ reg_slice = IXGBE_CS4227_HOST_SPARE24_LSB;
+ reg_val = (IXGBE_CS4227_EDC_MODE_CX1 << 1) | 0x1;
+ status = ixgbe_write_cs4227(hw, reg_slice,
+ reg_val);
+ if (status != IXGBE_SUCCESS)
+ return status;
+
+ reg_slice = IXGBE_CS4227_LINE_SPARE24_LSB + (1 << 12);
+ reg_val = (IXGBE_CS4227_EDC_MODE_SR << 1) | 0x1;
+ status = ixgbe_write_cs4227(hw, reg_slice,
+ reg_val);
+ if (status != IXGBE_SUCCESS)
+ return status;
+
+ reg_slice = IXGBE_CS4227_HOST_SPARE24_LSB + (1 << 12);
+ reg_val = (IXGBE_CS4227_EDC_MODE_SR << 1) | 0x1;
+ status = ixgbe_write_cs4227(hw, reg_slice,
+ reg_val);
+ if (status != IXGBE_SUCCESS)
+ return status;
+
+ msec_delay(10);
+ }
+
+ /* Verify that the ucode is operational on all ports. */
+ reg_slice = IXGBE_CS4227_LINE_SPARE24_LSB;
+ reg_val = 0xFFFF;
+ status = ixgbe_read_cs4227(hw, reg_slice, &reg_val);
+ if (status != IXGBE_SUCCESS)
+ return status;
+ if (reg_val != 0)
+ return IXGBE_ERR_PHY;
+
+ reg_slice = IXGBE_CS4227_HOST_SPARE24_LSB;
+ reg_val = 0xFFFF;
+ status = ixgbe_read_cs4227(hw, reg_slice, &reg_val);
+ if (status != IXGBE_SUCCESS)
+ return status;
+ if (reg_val != 0)
+ return IXGBE_ERR_PHY;
+
+ reg_slice = IXGBE_CS4227_LINE_SPARE24_LSB + (1 << 12);
+ reg_val = 0xFFFF;
+ status = ixgbe_read_cs4227(hw, reg_slice, &reg_val);
+ if (status != IXGBE_SUCCESS)
+ return status;
+ if (reg_val != 0)
+ return IXGBE_ERR_PHY;
+
+ reg_slice = IXGBE_CS4227_HOST_SPARE24_LSB + (1 << 12);
+ reg_val = 0xFFFF;
+ status = ixgbe_read_cs4227(hw, reg_slice, &reg_val);
+ if (status != IXGBE_SUCCESS)
+ return status;
+ if (reg_val != 0)
+ return IXGBE_ERR_PHY;
+
+ /* Set scratch for next time. */
+ status = ixgbe_write_cs4227(hw, IXGBE_CS4227_SCRATCH,
+ IXGBE_CS4227_SCRATCH_VALUE);
+ if (status != IXGBE_SUCCESS)
+ return status;
+ status = ixgbe_read_cs4227(hw, IXGBE_CS4227_SCRATCH, &value);
+ if (status != IXGBE_SUCCESS)
+ return status;
+ if (value != IXGBE_CS4227_SCRATCH_VALUE)
+ return IXGBE_ERR_PHY;
+
+ return IXGBE_SUCCESS;
+}
+
+/**
+ * ixgbe_read_pe - Read register from port expander
+ * @hw: pointer to hardware structure
+ * @reg: register number to read
+ * @value: pointer to receive read value
+ *
+ * Returns status code
+ **/
+static s32 ixgbe_read_pe(struct ixgbe_hw *hw, u8 reg, u8 *value)
+{
+ s32 status;
+
+ status = ixgbe_read_i2c_byte_unlocked(hw, reg, IXGBE_PE, value);
+ if (status != IXGBE_SUCCESS)
+ ERROR_REPORT2(IXGBE_ERROR_CAUTION,
+ "port expander access failed with %d\n", status);
+ return status;
+}
+
+/**
+ * ixgbe_write_pe - Write register to port expander
+ * @hw: pointer to hardware structure
+ * @reg: register number to write
+ * @value: value to write
+ *
+ * Returns status code
+ **/
+static s32 ixgbe_write_pe(struct ixgbe_hw *hw, u8 reg, u8 value)
+{
+ s32 status;
+
+ status = ixgbe_write_i2c_byte_unlocked(hw, reg, IXGBE_PE, value);
+ if (status != IXGBE_SUCCESS)
+ ERROR_REPORT2(IXGBE_ERROR_CAUTION,
+ "port expander access failed with %d\n", status);
+ return status;
+}
+
+/**
+ * ixgbe_reset_cs4227 - Reset CS4227 using port expander
+ * @hw: pointer to hardware structure
+ *
+ * Returns error code
+ **/
+static s32 ixgbe_reset_cs4227(struct ixgbe_hw *hw)
+{
+ s32 status;
+ u8 reg;
+
+ status = ixgbe_read_pe(hw, IXGBE_PE_OUTPUT, &reg);
+ if (status != IXGBE_SUCCESS)
+ return status;
+ reg |= IXGBE_PE_BIT1;
+ status = ixgbe_write_pe(hw, IXGBE_PE_OUTPUT, reg);
+ if (status != IXGBE_SUCCESS)
+ return status;
+
+ status = ixgbe_read_pe(hw, IXGBE_PE_CONFIG, &reg);
+ if (status != IXGBE_SUCCESS)
+ return status;
+ reg &= ~IXGBE_PE_BIT1;
+ status = ixgbe_write_pe(hw, IXGBE_PE_CONFIG, reg);
+ if (status != IXGBE_SUCCESS)
+ return status;
+
+ status = ixgbe_read_pe(hw, IXGBE_PE_OUTPUT, &reg);
+ if (status != IXGBE_SUCCESS)
+ return status;
+ reg &= ~IXGBE_PE_BIT1;
+ status = ixgbe_write_pe(hw, IXGBE_PE_OUTPUT, reg);
+ if (status != IXGBE_SUCCESS)
+ return status;
+
+ usec_delay(IXGBE_CS4227_RESET_HOLD);
+
+ status = ixgbe_read_pe(hw, IXGBE_PE_OUTPUT, &reg);
+ if (status != IXGBE_SUCCESS)
+ return status;
+ reg |= IXGBE_PE_BIT1;
+ status = ixgbe_write_pe(hw, IXGBE_PE_OUTPUT, reg);
+ if (status != IXGBE_SUCCESS)
+ return status;
+
+ msec_delay(IXGBE_CS4227_RESET_DELAY);
+
+ return IXGBE_SUCCESS;
+}
+
+/**
+ * ixgbe_check_cs4227 - Check CS4227 and reset as needed
+ * @hw: pointer to hardware structure
+ **/
+static void ixgbe_check_cs4227(struct ixgbe_hw *hw)
+{
+ u32 swfw_mask = hw->phy.phy_semaphore_mask;
+ s32 status;
+ u8 retry;
+
+ for (retry = 0; retry < IXGBE_CS4227_RETRIES; retry++) {
+ status = hw->mac.ops.acquire_swfw_sync(hw, swfw_mask);
+ if (status != IXGBE_SUCCESS) {
+ ERROR_REPORT2(IXGBE_ERROR_CAUTION,
+ "semaphore failed with %d\n", status);
+ return;
+ }
+ status = ixgbe_get_cs4227_status(hw);
+ if (status == IXGBE_SUCCESS) {
+ hw->mac.ops.release_swfw_sync(hw, swfw_mask);
+ msec_delay(hw->eeprom.semaphore_delay);
+ return;
+ }
+ ixgbe_reset_cs4227(hw);
+ hw->mac.ops.release_swfw_sync(hw, swfw_mask);
+ msec_delay(hw->eeprom.semaphore_delay);
+ }
+ ERROR_REPORT2(IXGBE_ERROR_CAUTION,
+ "Unable to initialize CS4227, err=%d\n", status);
+}
+
+/**
+ * ixgbe_setup_mux_ctl - Setup ESDP register for I2C mux control
+ * @hw: pointer to hardware structure
+ **/
+static void ixgbe_setup_mux_ctl(struct ixgbe_hw *hw)
+{
+ u32 esdp = IXGBE_READ_REG(hw, IXGBE_ESDP);
+
+ if (hw->bus.lan_id) {
+ esdp &= ~(IXGBE_ESDP_SDP1_NATIVE | IXGBE_ESDP_SDP1);
+ esdp |= IXGBE_ESDP_SDP1_DIR;
+ }
+ esdp &= ~(IXGBE_ESDP_SDP0_NATIVE | IXGBE_ESDP_SDP0_DIR);
+ IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp);
+ IXGBE_WRITE_FLUSH(hw);
+}
+
+/**
+ * ixgbe_identify_phy_x550em - Get PHY type based on device id
+ * @hw: pointer to hardware structure
+ *
+ * Returns error code
+ */
+static s32 ixgbe_identify_phy_x550em(struct ixgbe_hw *hw)
+{
+ switch (hw->device_id) {
+ case IXGBE_DEV_ID_X550EM_X_SFP:
+ /* set up for CS4227 usage */
+ hw->phy.phy_semaphore_mask = IXGBE_GSSR_SHARED_I2C_SM;
+ ixgbe_setup_mux_ctl(hw);
+ ixgbe_check_cs4227(hw);
+
+ return ixgbe_identify_module_generic(hw);
+ break;
+ case IXGBE_DEV_ID_X550EM_X_KX4:
+ hw->phy.type = ixgbe_phy_x550em_kx4;
+ break;
+ case IXGBE_DEV_ID_X550EM_X_KR:
+ hw->phy.type = ixgbe_phy_x550em_kr;
+ break;
+ case IXGBE_DEV_ID_X550EM_X_1G_T:
+ case IXGBE_DEV_ID_X550EM_X_10G_T:
+ return ixgbe_identify_phy_generic(hw);
+ default:
+ break;
+ }
+ return IXGBE_SUCCESS;
+}
+
+static s32 ixgbe_read_phy_reg_x550em(struct ixgbe_hw *hw, u32 reg_addr,
+ u32 device_type, u16 *phy_data)
+{
+ UNREFERENCED_4PARAMETER(*hw, reg_addr, device_type, *phy_data);
+ return IXGBE_NOT_IMPLEMENTED;
+}
+
+static s32 ixgbe_write_phy_reg_x550em(struct ixgbe_hw *hw, u32 reg_addr,
+ u32 device_type, u16 phy_data)
+{
+ UNREFERENCED_4PARAMETER(*hw, reg_addr, device_type, phy_data);
+ return IXGBE_NOT_IMPLEMENTED;
+}
+
+/**
+* ixgbe_init_ops_X550EM - Inits func ptrs and MAC type
+* @hw: pointer to hardware structure
+*
+* Initialize the function pointers and for MAC type X550EM.
+* Does not touch the hardware.
+**/
+s32 ixgbe_init_ops_X550EM(struct ixgbe_hw *hw)
+{
+ struct ixgbe_mac_info *mac = &hw->mac;
+ struct ixgbe_eeprom_info *eeprom = &hw->eeprom;
+ struct ixgbe_phy_info *phy = &hw->phy;
+ s32 ret_val;
+
+ DEBUGFUNC("ixgbe_init_ops_X550EM");
+
+ /* Similar to X550 so start there. */
+ ret_val = ixgbe_init_ops_X550(hw);
+
+ /* Since this function eventually calls
+ * ixgbe_init_ops_540 by design, we are setting
+ * the pointers to NULL explicitly here to overwrite
+ * the values being set in the x540 function.
+ */
+
+ /* FCOE not supported in x550EM */
+ mac->ops.get_san_mac_addr = NULL;
+ mac->ops.set_san_mac_addr = NULL;
+ mac->ops.get_wwn_prefix = NULL;
+ mac->ops.get_fcoe_boot_status = NULL;
+
+ /* IPsec not supported in x550EM */
+ mac->ops.disable_sec_rx_path = NULL;
+ mac->ops.enable_sec_rx_path = NULL;
+
+ /* AUTOC register is not present in x550EM. */
+ mac->ops.prot_autoc_read = NULL;
+ mac->ops.prot_autoc_write = NULL;
+
+ /* X550EM bus type is internal*/
+ hw->bus.type = ixgbe_bus_type_internal;
+ mac->ops.get_bus_info = ixgbe_get_bus_info_X550em;
+
+ mac->ops.read_iosf_sb_reg = ixgbe_read_iosf_sb_reg_x550;
+ mac->ops.write_iosf_sb_reg = ixgbe_write_iosf_sb_reg_x550;
+ mac->ops.get_media_type = ixgbe_get_media_type_X550em;
+ mac->ops.setup_sfp = ixgbe_setup_sfp_modules_X550em;
+ mac->ops.get_link_capabilities = ixgbe_get_link_capabilities_X550em;
+ mac->ops.reset_hw = ixgbe_reset_hw_X550em;
+ mac->ops.get_supported_physical_layer =
+ ixgbe_get_supported_physical_layer_X550em;
+
+ if (mac->ops.get_media_type(hw) == ixgbe_media_type_copper)
+ mac->ops.setup_fc = ixgbe_setup_fc_generic;
+ else
+ mac->ops.setup_fc = ixgbe_setup_fc_X550em;
+
+ mac->ops.acquire_swfw_sync = ixgbe_acquire_swfw_sync_X550em;
+ mac->ops.release_swfw_sync = ixgbe_release_swfw_sync_X550em;
+
+ if (hw->device_id != IXGBE_DEV_ID_X550EM_X_KR)
+ mac->ops.setup_eee = NULL;
+
+ /* PHY */
+ phy->ops.init = ixgbe_init_phy_ops_X550em;
+ phy->ops.identify = ixgbe_identify_phy_x550em;
+ if (mac->ops.get_media_type(hw) != ixgbe_media_type_copper)
+ phy->ops.set_phy_power = NULL;
+
+
+ /* EEPROM */
+ eeprom->ops.init_params = ixgbe_init_eeprom_params_X540;
+ eeprom->ops.read = ixgbe_read_ee_hostif_X550;
+ eeprom->ops.read_buffer = ixgbe_read_ee_hostif_buffer_X550;
+ eeprom->ops.write = ixgbe_write_ee_hostif_X550;
+ eeprom->ops.write_buffer = ixgbe_write_ee_hostif_buffer_X550;
+ eeprom->ops.update_checksum = ixgbe_update_eeprom_checksum_X550;
+ eeprom->ops.validate_checksum = ixgbe_validate_eeprom_checksum_X550;
+ eeprom->ops.calc_checksum = ixgbe_calc_eeprom_checksum_X550;
+
+ return ret_val;
+}
+
+/**
+ * ixgbe_dmac_config_X550
+ * @hw: pointer to hardware structure
+ *
+ * Configure DMA coalescing. If enabling dmac, dmac is activated.
+ * When disabling dmac, dmac enable dmac bit is cleared.
+ **/
+s32 ixgbe_dmac_config_X550(struct ixgbe_hw *hw)
+{
+ u32 reg, high_pri_tc;
+
+ DEBUGFUNC("ixgbe_dmac_config_X550");
+
+ /* Disable DMA coalescing before configuring */
+ reg = IXGBE_READ_REG(hw, IXGBE_DMACR);
+ reg &= ~IXGBE_DMACR_DMAC_EN;
+ IXGBE_WRITE_REG(hw, IXGBE_DMACR, reg);
+
+ /* Disable DMA Coalescing if the watchdog timer is 0 */
+ if (!hw->mac.dmac_config.watchdog_timer)
+ goto out;
+
+ ixgbe_dmac_config_tcs_X550(hw);
+
+ /* Configure DMA Coalescing Control Register */
+ reg = IXGBE_READ_REG(hw, IXGBE_DMACR);
+
+ /* Set the watchdog timer in units of 40.96 usec */
+ reg &= ~IXGBE_DMACR_DMACWT_MASK;
+ reg |= (hw->mac.dmac_config.watchdog_timer * 100) / 4096;
+
+ reg &= ~IXGBE_DMACR_HIGH_PRI_TC_MASK;
+ /* If fcoe is enabled, set high priority traffic class */
+ if (hw->mac.dmac_config.fcoe_en) {
+ high_pri_tc = 1 << hw->mac.dmac_config.fcoe_tc;
+ reg |= ((high_pri_tc << IXGBE_DMACR_HIGH_PRI_TC_SHIFT) &
+ IXGBE_DMACR_HIGH_PRI_TC_MASK);
+ }
+ reg |= IXGBE_DMACR_EN_MNG_IND;
+
+ /* Enable DMA coalescing after configuration */
+ reg |= IXGBE_DMACR_DMAC_EN;
+ IXGBE_WRITE_REG(hw, IXGBE_DMACR, reg);
+
+out:
+ return IXGBE_SUCCESS;
+}
+
+/**
+ * ixgbe_dmac_config_tcs_X550
+ * @hw: pointer to hardware structure
+ *
+ * Configure DMA coalescing threshold per TC. The dmac enable bit must
+ * be cleared before configuring.
+ **/
+s32 ixgbe_dmac_config_tcs_X550(struct ixgbe_hw *hw)
+{
+ u32 tc, reg, pb_headroom, rx_pb_size, maxframe_size_kb;
+
+ DEBUGFUNC("ixgbe_dmac_config_tcs_X550");
+
+ /* Configure DMA coalescing enabled */
+ switch (hw->mac.dmac_config.link_speed) {
+ case IXGBE_LINK_SPEED_100_FULL:
+ pb_headroom = IXGBE_DMACRXT_100M;
+ break;
+ case IXGBE_LINK_SPEED_1GB_FULL:
+ pb_headroom = IXGBE_DMACRXT_1G;
+ break;
+ default:
+ pb_headroom = IXGBE_DMACRXT_10G;
+ break;
+ }
+
+ maxframe_size_kb = ((IXGBE_READ_REG(hw, IXGBE_MAXFRS) >>
+ IXGBE_MHADD_MFS_SHIFT) / 1024);
+
+ /* Set the per Rx packet buffer receive threshold */
+ for (tc = 0; tc < IXGBE_DCB_MAX_TRAFFIC_CLASS; tc++) {
+ reg = IXGBE_READ_REG(hw, IXGBE_DMCTH(tc));
+ reg &= ~IXGBE_DMCTH_DMACRXT_MASK;
+
+ if (tc < hw->mac.dmac_config.num_tcs) {
+ /* Get Rx PB size */
+ rx_pb_size = IXGBE_READ_REG(hw, IXGBE_RXPBSIZE(tc));
+ rx_pb_size = (rx_pb_size & IXGBE_RXPBSIZE_MASK) >>
+ IXGBE_RXPBSIZE_SHIFT;
+
+ /* Calculate receive buffer threshold in kilobytes */
+ if (rx_pb_size > pb_headroom)
+ rx_pb_size = rx_pb_size - pb_headroom;
+ else
+ rx_pb_size = 0;
+
+ /* Minimum of MFS shall be set for DMCTH */
+ reg |= (rx_pb_size > maxframe_size_kb) ?
+ rx_pb_size : maxframe_size_kb;
+ }
+ IXGBE_WRITE_REG(hw, IXGBE_DMCTH(tc), reg);
+ }
+ return IXGBE_SUCCESS;
+}
+
+/**
+ * ixgbe_dmac_update_tcs_X550
+ * @hw: pointer to hardware structure
+ *
+ * Disables dmac, updates per TC settings, and then enables dmac.
+ **/
+s32 ixgbe_dmac_update_tcs_X550(struct ixgbe_hw *hw)
+{
+ u32 reg;
+
+ DEBUGFUNC("ixgbe_dmac_update_tcs_X550");
+
+ /* Disable DMA coalescing before configuring */
+ reg = IXGBE_READ_REG(hw, IXGBE_DMACR);
+ reg &= ~IXGBE_DMACR_DMAC_EN;
+ IXGBE_WRITE_REG(hw, IXGBE_DMACR, reg);
+
+ ixgbe_dmac_config_tcs_X550(hw);
+
+ /* Enable DMA coalescing after configuration */
+ reg = IXGBE_READ_REG(hw, IXGBE_DMACR);
+ reg |= IXGBE_DMACR_DMAC_EN;
+ IXGBE_WRITE_REG(hw, IXGBE_DMACR, reg);
+
+ return IXGBE_SUCCESS;
+}
+
+/**
+ * ixgbe_init_eeprom_params_X550 - Initialize EEPROM params
+ * @hw: pointer to hardware structure
+ *
+ * Initializes the EEPROM parameters ixgbe_eeprom_info within the
+ * ixgbe_hw struct in order to set up EEPROM access.
+ **/
+s32 ixgbe_init_eeprom_params_X550(struct ixgbe_hw *hw)
+{
+ struct ixgbe_eeprom_info *eeprom = &hw->eeprom;
+ u32 eec;
+ u16 eeprom_size;
+
+ DEBUGFUNC("ixgbe_init_eeprom_params_X550");
+
+ if (eeprom->type == ixgbe_eeprom_uninitialized) {
+ eeprom->semaphore_delay = 10;
+ eeprom->type = ixgbe_flash;
+
+ eec = IXGBE_READ_REG(hw, IXGBE_EEC);
+ eeprom_size = (u16)((eec & IXGBE_EEC_SIZE) >>
+ IXGBE_EEC_SIZE_SHIFT);
+ eeprom->word_size = 1 << (eeprom_size +
+ IXGBE_EEPROM_WORD_SIZE_SHIFT);
+
+ DEBUGOUT2("Eeprom params: type = %d, size = %d\n",
+ eeprom->type, eeprom->word_size);
+ }
+
+ return IXGBE_SUCCESS;
+}
+
+/**
+ * ixgbe_setup_eee_X550 - Enable/disable EEE support
+ * @hw: pointer to the HW structure
+ * @enable_eee: boolean flag to enable EEE
+ *
+ * Enable/disable EEE based on enable_eee flag.
+ * Auto-negotiation must be started after BASE-T EEE bits in PHY register 7.3C
+ * are modified.
+ *
+ **/
+s32 ixgbe_setup_eee_X550(struct ixgbe_hw *hw, bool enable_eee)
+{
+ u32 eeer;
+ u16 autoneg_eee_reg;
+ u32 link_reg;
+ s32 status;
+ u32 fuse;
+
+ DEBUGFUNC("ixgbe_setup_eee_X550");
+
+ eeer = IXGBE_READ_REG(hw, IXGBE_EEER);
+ /* Enable or disable EEE per flag */
+ if (enable_eee) {
+ eeer |= (IXGBE_EEER_TX_LPI_EN | IXGBE_EEER_RX_LPI_EN);
+
+ if (hw->device_id == IXGBE_DEV_ID_X550T) {
+ /* Advertise EEE capability */
+ hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_EEE_ADVT,
+ IXGBE_MDIO_AUTO_NEG_DEV_TYPE, &autoneg_eee_reg);
+
+ autoneg_eee_reg |= (IXGBE_AUTO_NEG_10GBASE_EEE_ADVT |
+ IXGBE_AUTO_NEG_1000BASE_EEE_ADVT |
+ IXGBE_AUTO_NEG_100BASE_EEE_ADVT);
+
+ hw->phy.ops.write_reg(hw, IXGBE_MDIO_AUTO_NEG_EEE_ADVT,
+ IXGBE_MDIO_AUTO_NEG_DEV_TYPE, autoneg_eee_reg);
+ } else if (hw->device_id == IXGBE_DEV_ID_X550EM_X_KR) {
+ /* Not supported on first revision. */
+ fuse = IXGBE_READ_REG(hw, IXGBE_FUSES0_GROUP(0));
+ if (!(fuse & IXGBE_FUSES0_REV1))
+ return IXGBE_SUCCESS;
+
+ status = ixgbe_read_iosf_sb_reg_x550(hw,
+ IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
+ IXGBE_SB_IOSF_TARGET_KR_PHY, &link_reg);
+ if (status != IXGBE_SUCCESS)
+ return status;
+
+ link_reg |= IXGBE_KRM_LINK_CTRL_1_TETH_EEE_CAP_KR |
+ IXGBE_KRM_LINK_CTRL_1_TETH_EEE_CAP_KX;
+
+ /* Don't advertise FEC capability when EEE enabled. */
+ link_reg &= ~IXGBE_KRM_LINK_CTRL_1_TETH_AN_CAP_FEC;
+
+ status = ixgbe_write_iosf_sb_reg_x550(hw,
+ IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
+ IXGBE_SB_IOSF_TARGET_KR_PHY, link_reg);
+ if (status != IXGBE_SUCCESS)
+ return status;
+ }
+ } else {
+ eeer &= ~(IXGBE_EEER_TX_LPI_EN | IXGBE_EEER_RX_LPI_EN);
+
+ if (hw->device_id == IXGBE_DEV_ID_X550T) {
+ /* Disable advertised EEE capability */
+ hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_EEE_ADVT,
+ IXGBE_MDIO_AUTO_NEG_DEV_TYPE, &autoneg_eee_reg);
+
+ autoneg_eee_reg &= ~(IXGBE_AUTO_NEG_10GBASE_EEE_ADVT |
+ IXGBE_AUTO_NEG_1000BASE_EEE_ADVT |
+ IXGBE_AUTO_NEG_100BASE_EEE_ADVT);
+
+ hw->phy.ops.write_reg(hw, IXGBE_MDIO_AUTO_NEG_EEE_ADVT,
+ IXGBE_MDIO_AUTO_NEG_DEV_TYPE, autoneg_eee_reg);
+ } else if (hw->device_id == IXGBE_DEV_ID_X550EM_X_KR) {
+ status = ixgbe_read_iosf_sb_reg_x550(hw,
+ IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
+ IXGBE_SB_IOSF_TARGET_KR_PHY, &link_reg);
+ if (status != IXGBE_SUCCESS)
+ return status;
+
+ link_reg &= ~(IXGBE_KRM_LINK_CTRL_1_TETH_EEE_CAP_KR |
+ IXGBE_KRM_LINK_CTRL_1_TETH_EEE_CAP_KX);
+
+ /* Advertise FEC capability when EEE is disabled. */
+ link_reg |= IXGBE_KRM_LINK_CTRL_1_TETH_AN_CAP_FEC;
+
+ status = ixgbe_write_iosf_sb_reg_x550(hw,
+ IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
+ IXGBE_SB_IOSF_TARGET_KR_PHY, link_reg);
+ if (status != IXGBE_SUCCESS)
+ return status;
+ }
+ }
+ IXGBE_WRITE_REG(hw, IXGBE_EEER, eeer);
+
+ return IXGBE_SUCCESS;
+}
+
+/**
+ * ixgbe_set_source_address_pruning_X550 - Enable/Disbale source address pruning
+ * @hw: pointer to hardware structure
+ * @enable: enable or disable source address pruning
+ * @pool: Rx pool to set source address pruning for
+ **/
+void ixgbe_set_source_address_pruning_X550(struct ixgbe_hw *hw, bool enable,
+ unsigned int pool)
+{
+ u64 pfflp;
+
+ /* max rx pool is 63 */
+ if (pool > 63)
+ return;
+
+ pfflp = (u64)IXGBE_READ_REG(hw, IXGBE_PFFLPL);
+ pfflp |= (u64)IXGBE_READ_REG(hw, IXGBE_PFFLPH) << 32;
+
+ if (enable)
+ pfflp |= (1ULL << pool);
+ else
+ pfflp &= ~(1ULL << pool);
+
+ IXGBE_WRITE_REG(hw, IXGBE_PFFLPL, (u32)pfflp);
+ IXGBE_WRITE_REG(hw, IXGBE_PFFLPH, (u32)(pfflp >> 32));
+}
+
+/**
+ * ixgbe_set_ethertype_anti_spoofing_X550 - Enable/Disable Ethertype anti-spoofing
+ * @hw: pointer to hardware structure
+ * @enable: enable or disable switch for Ethertype anti-spoofing
+ * @vf: Virtual Function pool - VF Pool to set for Ethertype anti-spoofing
+ *
+ **/
+void ixgbe_set_ethertype_anti_spoofing_X550(struct ixgbe_hw *hw,
+ bool enable, int vf)
+{
+ int vf_target_reg = vf >> 3;
+ int vf_target_shift = vf % 8 + IXGBE_SPOOF_ETHERTYPEAS_SHIFT;
+ u32 pfvfspoof;
+
+ DEBUGFUNC("ixgbe_set_ethertype_anti_spoofing_X550");
+
+ pfvfspoof = IXGBE_READ_REG(hw, IXGBE_PFVFSPOOF(vf_target_reg));
+ if (enable)
+ pfvfspoof |= (1 << vf_target_shift);
+ else
+ pfvfspoof &= ~(1 << vf_target_shift);
+
+ IXGBE_WRITE_REG(hw, IXGBE_PFVFSPOOF(vf_target_reg), pfvfspoof);
+}
+
+/**
+ * ixgbe_iosf_wait - Wait for IOSF command completion
+ * @hw: pointer to hardware structure
+ * @ctrl: pointer to location to receive final IOSF control value
+ *
+ * Returns failing status on timeout
+ *
+ * Note: ctrl can be NULL if the IOSF control register value is not needed
+ **/
+static s32 ixgbe_iosf_wait(struct ixgbe_hw *hw, u32 *ctrl)
+{
+ u32 i, command;
+
+ /* Check every 10 usec to see if the address cycle completed.
+ * The SB IOSF BUSY bit will clear when the operation is
+ * complete
+ */
+ for (i = 0; i < IXGBE_MDIO_COMMAND_TIMEOUT; i++) {
+ command = IXGBE_READ_REG(hw, IXGBE_SB_IOSF_INDIRECT_CTRL);
+ if ((command & IXGBE_SB_IOSF_CTRL_BUSY) == 0)
+ break;
+ usec_delay(10);
+ }
+ if (ctrl)
+ *ctrl = command;
+ if (i == IXGBE_MDIO_COMMAND_TIMEOUT) {
+ ERROR_REPORT1(IXGBE_ERROR_POLLING, "Wait timed out\n");
+ return IXGBE_ERR_PHY;
+ }
+
+ return IXGBE_SUCCESS;
+}
+
+/**
+ * ixgbe_write_iosf_sb_reg_x550 - Writes a value to specified register of the IOSF
+ * device
+ * @hw: pointer to hardware structure
+ * @reg_addr: 32 bit PHY register to write
+ * @device_type: 3 bit device type
+ * @data: Data to write to the register
+ **/
+s32 ixgbe_write_iosf_sb_reg_x550(struct ixgbe_hw *hw, u32 reg_addr,
+ u32 device_type, u32 data)
+{
+ u32 gssr = IXGBE_GSSR_PHY1_SM | IXGBE_GSSR_PHY0_SM;
+ u32 command, error;
+ s32 ret;
+
+ ret = ixgbe_acquire_swfw_semaphore(hw, gssr);
+ if (ret != IXGBE_SUCCESS)
+ return ret;
+
+ ret = ixgbe_iosf_wait(hw, NULL);
+ if (ret != IXGBE_SUCCESS)
+ goto out;
+
+ command = ((reg_addr << IXGBE_SB_IOSF_CTRL_ADDR_SHIFT) |
+ (device_type << IXGBE_SB_IOSF_CTRL_TARGET_SELECT_SHIFT));
+
+ /* Write IOSF control register */
+ IXGBE_WRITE_REG(hw, IXGBE_SB_IOSF_INDIRECT_CTRL, command);
+
+ /* Write IOSF data register */
+ IXGBE_WRITE_REG(hw, IXGBE_SB_IOSF_INDIRECT_DATA, data);
+
+ ret = ixgbe_iosf_wait(hw, &command);
+
+ if ((command & IXGBE_SB_IOSF_CTRL_RESP_STAT_MASK) != 0) {
+ error = (command & IXGBE_SB_IOSF_CTRL_CMPL_ERR_MASK) >>
+ IXGBE_SB_IOSF_CTRL_CMPL_ERR_SHIFT;
+ ERROR_REPORT2(IXGBE_ERROR_POLLING,
+ "Failed to write, error %x\n", error);
+ ret = IXGBE_ERR_PHY;
+ }
+
+out:
+ ixgbe_release_swfw_semaphore(hw, gssr);
+ return ret;
+}
+
+/**
+ * ixgbe_read_iosf_sb_reg_x550 - Writes a value to specified register of the IOSF
+ * device
+ * @hw: pointer to hardware structure
+ * @reg_addr: 32 bit PHY register to write
+ * @device_type: 3 bit device type
+ * @phy_data: Pointer to read data from the register
+ **/
+s32 ixgbe_read_iosf_sb_reg_x550(struct ixgbe_hw *hw, u32 reg_addr,
+ u32 device_type, u32 *data)
+{
+ u32 gssr = IXGBE_GSSR_PHY1_SM | IXGBE_GSSR_PHY0_SM;
+ u32 command, error;
+ s32 ret;
+
+ ret = ixgbe_acquire_swfw_semaphore(hw, gssr);
+ if (ret != IXGBE_SUCCESS)
+ return ret;
+
+ ret = ixgbe_iosf_wait(hw, NULL);
+ if (ret != IXGBE_SUCCESS)
+ goto out;
+
+ command = ((reg_addr << IXGBE_SB_IOSF_CTRL_ADDR_SHIFT) |
+ (device_type << IXGBE_SB_IOSF_CTRL_TARGET_SELECT_SHIFT));
+
+ /* Write IOSF control register */
+ IXGBE_WRITE_REG(hw, IXGBE_SB_IOSF_INDIRECT_CTRL, command);
+
+ ret = ixgbe_iosf_wait(hw, &command);
+
+ if ((command & IXGBE_SB_IOSF_CTRL_RESP_STAT_MASK) != 0) {
+ error = (command & IXGBE_SB_IOSF_CTRL_CMPL_ERR_MASK) >>
+ IXGBE_SB_IOSF_CTRL_CMPL_ERR_SHIFT;
+ ERROR_REPORT2(IXGBE_ERROR_POLLING,
+ "Failed to read, error %x\n", error);
+ ret = IXGBE_ERR_PHY;
+ }
+
+ if (ret == IXGBE_SUCCESS)
+ *data = IXGBE_READ_REG(hw, IXGBE_SB_IOSF_INDIRECT_DATA);
+
+out:
+ ixgbe_release_swfw_semaphore(hw, gssr);
+ return ret;
+}
+
+/**
+ * ixgbe_disable_mdd_X550
+ * @hw: pointer to hardware structure
+ *
+ * Disable malicious driver detection
+ **/
+void ixgbe_disable_mdd_X550(struct ixgbe_hw *hw)
+{
+ u32 reg;
+
+ DEBUGFUNC("ixgbe_disable_mdd_X550");
+
+ /* Disable MDD for TX DMA and interrupt */
+ reg = IXGBE_READ_REG(hw, IXGBE_DMATXCTL);
+ reg &= ~(IXGBE_DMATXCTL_MDP_EN | IXGBE_DMATXCTL_MBINTEN);
+ IXGBE_WRITE_REG(hw, IXGBE_DMATXCTL, reg);
+
+ /* Disable MDD for RX and interrupt */
+ reg = IXGBE_READ_REG(hw, IXGBE_RDRXCTL);
+ reg &= ~(IXGBE_RDRXCTL_MDP_EN | IXGBE_RDRXCTL_MBINTEN);
+ IXGBE_WRITE_REG(hw, IXGBE_RDRXCTL, reg);
+}
+
+/**
+ * ixgbe_enable_mdd_X550
+ * @hw: pointer to hardware structure
+ *
+ * Enable malicious driver detection
+ **/
+void ixgbe_enable_mdd_X550(struct ixgbe_hw *hw)
+{
+ u32 reg;
+
+ DEBUGFUNC("ixgbe_enable_mdd_X550");
+
+ /* Enable MDD for TX DMA and interrupt */
+ reg = IXGBE_READ_REG(hw, IXGBE_DMATXCTL);
+ reg |= (IXGBE_DMATXCTL_MDP_EN | IXGBE_DMATXCTL_MBINTEN);
+ IXGBE_WRITE_REG(hw, IXGBE_DMATXCTL, reg);
+
+ /* Enable MDD for RX and interrupt */
+ reg = IXGBE_READ_REG(hw, IXGBE_RDRXCTL);
+ reg |= (IXGBE_RDRXCTL_MDP_EN | IXGBE_RDRXCTL_MBINTEN);
+ IXGBE_WRITE_REG(hw, IXGBE_RDRXCTL, reg);
+}
+
+/**
+ * ixgbe_restore_mdd_vf_X550
+ * @hw: pointer to hardware structure
+ * @vf: vf index
+ *
+ * Restore VF that was disabled during malicious driver detection event
+ **/
+void ixgbe_restore_mdd_vf_X550(struct ixgbe_hw *hw, u32 vf)
+{
+ u32 idx, reg, num_qs, start_q, bitmask;
+
+ DEBUGFUNC("ixgbe_restore_mdd_vf_X550");
+
+ /* Map VF to queues */
+ reg = IXGBE_READ_REG(hw, IXGBE_MRQC);
+ switch (reg & IXGBE_MRQC_MRQE_MASK) {
+ case IXGBE_MRQC_VMDQRT8TCEN:
+ num_qs = 8; /* 16 VFs / pools */
+ bitmask = 0x000000FF;
+ break;
+ case IXGBE_MRQC_VMDQRSS32EN:
+ case IXGBE_MRQC_VMDQRT4TCEN:
+ num_qs = 4; /* 32 VFs / pools */
+ bitmask = 0x0000000F;
+ break;
+ default: /* 64 VFs / pools */
+ num_qs = 2;
+ bitmask = 0x00000003;
+ break;
+ }
+ start_q = vf * num_qs;
+
+ /* Release vf's queues by clearing WQBR_TX and WQBR_RX (RW1C) */
+ idx = start_q / 32;
+ reg = 0;
+ reg |= (bitmask << (start_q % 32));
+ IXGBE_WRITE_REG(hw, IXGBE_WQBR_TX(idx), reg);
+ IXGBE_WRITE_REG(hw, IXGBE_WQBR_RX(idx), reg);
+}
+
+/**
+ * ixgbe_mdd_event_X550
+ * @hw: pointer to hardware structure
+ * @vf_bitmap: vf bitmap of malicious vfs
+ *
+ * Handle malicious driver detection event.
+ **/
+void ixgbe_mdd_event_X550(struct ixgbe_hw *hw, u32 *vf_bitmap)
+{
+ u32 wqbr;
+ u32 i, j, reg, q, shift, vf, idx;
+
+ DEBUGFUNC("ixgbe_mdd_event_X550");
+
+ /* figure out pool size for mapping to vf's */
+ reg = IXGBE_READ_REG(hw, IXGBE_MRQC);
+ switch (reg & IXGBE_MRQC_MRQE_MASK) {
+ case IXGBE_MRQC_VMDQRT8TCEN:
+ shift = 3; /* 16 VFs / pools */
+ break;
+ case IXGBE_MRQC_VMDQRSS32EN:
+ case IXGBE_MRQC_VMDQRT4TCEN:
+ shift = 2; /* 32 VFs / pools */
+ break;
+ default:
+ shift = 1; /* 64 VFs / pools */
+ break;
+ }
+
+ /* Read WQBR_TX and WQBR_RX and check for malicious queues */
+ for (i = 0; i < 4; i++) {
+ wqbr = IXGBE_READ_REG(hw, IXGBE_WQBR_TX(i));
+ wqbr |= IXGBE_READ_REG(hw, IXGBE_WQBR_RX(i));
+
+ if (!wqbr)
+ continue;
+
+ /* Get malicious queue */
+ for (j = 0; j < 32 && wqbr; j++) {
+
+ if (!(wqbr & (1 << j)))
+ continue;
+
+ /* Get queue from bitmask */
+ q = j + (i * 32);
+
+ /* Map queue to vf */
+ vf = (q >> shift);
+
+ /* Set vf bit in vf_bitmap */
+ idx = vf / 32;
+ vf_bitmap[idx] |= (1 << (vf % 32));
+ wqbr &= ~(1 << j);
+ }
+ }
+}
+
+/**
+ * ixgbe_get_media_type_X550em - Get media type
+ * @hw: pointer to hardware structure
+ *
+ * Returns the media type (fiber, copper, backplane)
+ */
+enum ixgbe_media_type ixgbe_get_media_type_X550em(struct ixgbe_hw *hw)
+{
+ enum ixgbe_media_type media_type;
+
+ DEBUGFUNC("ixgbe_get_media_type_X550em");
+
+ /* Detect if there is a copper PHY attached. */
+ switch (hw->device_id) {
+ case IXGBE_DEV_ID_X550EM_X_KR:
+ case IXGBE_DEV_ID_X550EM_X_KX4:
+ media_type = ixgbe_media_type_backplane;
+ break;
+ case IXGBE_DEV_ID_X550EM_X_SFP:
+ media_type = ixgbe_media_type_fiber;
+ break;
+ case IXGBE_DEV_ID_X550EM_X_1G_T:
+ case IXGBE_DEV_ID_X550EM_X_10G_T:
+ media_type = ixgbe_media_type_copper;
+ break;
+ default:
+ media_type = ixgbe_media_type_unknown;
+ break;
+ }
+ return media_type;
+}
+
+/**
+ * ixgbe_supported_sfp_modules_X550em - Check if SFP module type is supported
+ * @hw: pointer to hardware structure
+ * @linear: TRUE if SFP module is linear
+ */
+static s32 ixgbe_supported_sfp_modules_X550em(struct ixgbe_hw *hw, bool *linear)
+{
+ DEBUGFUNC("ixgbe_supported_sfp_modules_X550em");
+
+ switch (hw->phy.sfp_type) {
+ case ixgbe_sfp_type_not_present:
+ return IXGBE_ERR_SFP_NOT_PRESENT;
+ case ixgbe_sfp_type_da_cu_core0:
+ case ixgbe_sfp_type_da_cu_core1:
+ *linear = TRUE;
+ break;
+ case ixgbe_sfp_type_srlr_core0:
+ case ixgbe_sfp_type_srlr_core1:
+ case ixgbe_sfp_type_da_act_lmt_core0:
+ case ixgbe_sfp_type_da_act_lmt_core1:
+ case ixgbe_sfp_type_1g_sx_core0:
+ case ixgbe_sfp_type_1g_sx_core1:
+ case ixgbe_sfp_type_1g_lx_core0:
+ case ixgbe_sfp_type_1g_lx_core1:
+ *linear = FALSE;
+ break;
+ case ixgbe_sfp_type_unknown:
+ case ixgbe_sfp_type_1g_cu_core0:
+ case ixgbe_sfp_type_1g_cu_core1:
+ default:
+ return IXGBE_ERR_SFP_NOT_SUPPORTED;
+ }
+
+ return IXGBE_SUCCESS;
+}
+
+/**
+ * ixgbe_identify_sfp_module_X550em - Identifies SFP modules
+ * @hw: pointer to hardware structure
+ *
+ * Searches for and identifies the SFP module and assigns appropriate PHY type.
+ **/
+s32 ixgbe_identify_sfp_module_X550em(struct ixgbe_hw *hw)
+{
+ s32 status;
+ bool linear;
+
+ DEBUGFUNC("ixgbe_identify_sfp_module_X550em");
+
+ status = ixgbe_identify_module_generic(hw);
+
+ if (status != IXGBE_SUCCESS)
+ return status;
+
+ /* Check if SFP module is supported */
+ status = ixgbe_supported_sfp_modules_X550em(hw, &linear);
+
+ return status;
+}
+
+/**
+ * ixgbe_setup_sfp_modules_X550em - Setup MAC link ops
+ * @hw: pointer to hardware structure
+ */
+s32 ixgbe_setup_sfp_modules_X550em(struct ixgbe_hw *hw)
+{
+ s32 status;
+ bool linear;
+
+ DEBUGFUNC("ixgbe_setup_sfp_modules_X550em");
+
+ /* Check if SFP module is supported */
+ status = ixgbe_supported_sfp_modules_X550em(hw, &linear);
+
+ if (status != IXGBE_SUCCESS)
+ return status;
+
+ ixgbe_init_mac_link_ops_X550em(hw);
+ hw->phy.ops.reset = NULL;
+
+ return IXGBE_SUCCESS;
+}
+
+/**
+ * ixgbe_init_mac_link_ops_X550em - init mac link function pointers
+ * @hw: pointer to hardware structure
+ */
+void ixgbe_init_mac_link_ops_X550em(struct ixgbe_hw *hw)
+{
+ struct ixgbe_mac_info *mac = &hw->mac;
+
+ DEBUGFUNC("ixgbe_init_mac_link_ops_X550em");
+
+ switch (hw->mac.ops.get_media_type(hw)) {
+ case ixgbe_media_type_fiber:
+ /* CS4227 does not support autoneg, so disable the laser control
+ * functions for SFP+ fiber
+ */
+ mac->ops.disable_tx_laser = NULL;
+ mac->ops.enable_tx_laser = NULL;
+ mac->ops.flap_tx_laser = NULL;
+ mac->ops.setup_link = ixgbe_setup_mac_link_multispeed_fiber;
+ mac->ops.setup_mac_link = ixgbe_setup_mac_link_sfp_x550em;
+ mac->ops.set_rate_select_speed =
+ ixgbe_set_soft_rate_select_speed;
+ break;
+ case ixgbe_media_type_copper:
+ mac->ops.setup_link = ixgbe_setup_mac_link_t_X550em;
+ mac->ops.check_link = ixgbe_check_link_t_X550em;
+ break;
+ default:
+ break;
+ }
+}
+
+/**
+ * ixgbe_get_link_capabilities_x550em - Determines link capabilities
+ * @hw: pointer to hardware structure
+ * @speed: pointer to link speed
+ * @autoneg: TRUE when autoneg or autotry is enabled
+ */
+s32 ixgbe_get_link_capabilities_X550em(struct ixgbe_hw *hw,
+ ixgbe_link_speed *speed,
+ bool *autoneg)
+{
+ DEBUGFUNC("ixgbe_get_link_capabilities_X550em");
+
+ /* SFP */
+ if (hw->phy.media_type == ixgbe_media_type_fiber) {
+
+ /* CS4227 SFP must not enable auto-negotiation */
+ *autoneg = FALSE;
+
+ /* Check if 1G SFP module. */
+ if (hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core0 ||
+ hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core1
+ || hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core0 ||
+ hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core1) {
+ *speed = IXGBE_LINK_SPEED_1GB_FULL;
+ return IXGBE_SUCCESS;
+ }
+
+ /* Link capabilities are based on SFP */
+ if (hw->phy.multispeed_fiber)
+ *speed = IXGBE_LINK_SPEED_10GB_FULL |
+ IXGBE_LINK_SPEED_1GB_FULL;
+ else
+ *speed = IXGBE_LINK_SPEED_10GB_FULL;
+ } else {
+ *speed = IXGBE_LINK_SPEED_10GB_FULL |
+ IXGBE_LINK_SPEED_1GB_FULL;
+ *autoneg = TRUE;
+ }
+
+ return IXGBE_SUCCESS;
+}
+
+/**
+ * ixgbe_get_lasi_ext_t_x550em - Determime external Base T PHY interrupt cause
+ * @hw: pointer to hardware structure
+ * @lsc: pointer to boolean flag which indicates whether external Base T
+ * PHY interrupt is lsc
+ *
+ * Determime if external Base T PHY interrupt cause is high temperature
+ * failure alarm or link status change.
+ *
+ * Return IXGBE_ERR_OVERTEMP if interrupt is high temperature
+ * failure alarm, else return PHY access status.
+ */
+static s32 ixgbe_get_lasi_ext_t_x550em(struct ixgbe_hw *hw, bool *lsc)
+{
+ u32 status;
+ u16 reg;
+
+ *lsc = FALSE;
+
+ /* Vendor alarm triggered */
+ status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_GLOBAL_CHIP_STD_INT_FLAG,
+ IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
+ &reg);
+
+ if (status != IXGBE_SUCCESS ||
+ !(reg & IXGBE_MDIO_GLOBAL_VEN_ALM_INT_EN))
+ return status;
+
+ /* Vendor Auto-Neg alarm triggered or Global alarm 1 triggered */
+ status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_GLOBAL_INT_CHIP_VEN_FLAG,
+ IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
+ &reg);
+
+ if (status != IXGBE_SUCCESS ||
+ !(reg & (IXGBE_MDIO_GLOBAL_AN_VEN_ALM_INT_EN |
+ IXGBE_MDIO_GLOBAL_ALARM_1_INT)))
+ return status;
+
+ /* High temperature failure alarm triggered */
+ status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_GLOBAL_ALARM_1,
+ IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
+ &reg);
+
+ if (status != IXGBE_SUCCESS)
+ return status;
+
+ /* If high temperature failure, then return over temp error and exit */
+ if (reg & IXGBE_MDIO_GLOBAL_ALM_1_HI_TMP_FAIL) {
+ /* power down the PHY in case the PHY FW didn't already */
+ ixgbe_set_copper_phy_power(hw, FALSE);
+ return IXGBE_ERR_OVERTEMP;
+ }
+
+ /* Vendor alarm 2 triggered */
+ status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_GLOBAL_CHIP_STD_INT_FLAG,
+ IXGBE_MDIO_AUTO_NEG_DEV_TYPE, &reg);
+
+ if (status != IXGBE_SUCCESS ||
+ !(reg & IXGBE_MDIO_GLOBAL_STD_ALM2_INT))
+ return status;
+
+ /* link connect/disconnect event occurred */
+ status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_VENDOR_TX_ALARM2,
+ IXGBE_MDIO_AUTO_NEG_DEV_TYPE, &reg);
+
+ if (status != IXGBE_SUCCESS)
+ return status;
+
+ /* Indicate LSC */
+ if (reg & IXGBE_MDIO_AUTO_NEG_VEN_LSC)
+ *lsc = TRUE;
+
+ return IXGBE_SUCCESS;
+}
+
+/**
+ * ixgbe_enable_lasi_ext_t_x550em - Enable external Base T PHY interrupts
+ * @hw: pointer to hardware structure
+ *
+ * Enable link status change and temperature failure alarm for the external
+ * Base T PHY
+ *
+ * Returns PHY access status
+ */
+static s32 ixgbe_enable_lasi_ext_t_x550em(struct ixgbe_hw *hw)
+{
+ u32 status;
+ u16 reg;
+ bool lsc;
+
+ /* Clear interrupt flags */
+ status = ixgbe_get_lasi_ext_t_x550em(hw, &lsc);
+
+ /* Enable link status change alarm */
+ status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_PMA_TX_VEN_LASI_INT_MASK,
+ IXGBE_MDIO_AUTO_NEG_DEV_TYPE, &reg);
+
+ if (status != IXGBE_SUCCESS)
+ return status;
+
+ reg |= IXGBE_MDIO_PMA_TX_VEN_LASI_INT_EN;
+
+ status = hw->phy.ops.write_reg(hw, IXGBE_MDIO_PMA_TX_VEN_LASI_INT_MASK,
+ IXGBE_MDIO_AUTO_NEG_DEV_TYPE, reg);
+
+ if (status != IXGBE_SUCCESS)
+ return status;
+
+ /* Enables high temperature failure alarm */
+ status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_GLOBAL_INT_MASK,
+ IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
+ &reg);
+
+ if (status != IXGBE_SUCCESS)
+ return status;
+
+ reg |= IXGBE_MDIO_GLOBAL_INT_HI_TEMP_EN;
+
+ status = hw->phy.ops.write_reg(hw, IXGBE_MDIO_GLOBAL_INT_MASK,
+ IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
+ reg);
+
+ if (status != IXGBE_SUCCESS)
+ return status;
+
+ /* Enable vendor Auto-Neg alarm and Global Interrupt Mask 1 alarm */
+ status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_GLOBAL_INT_CHIP_VEN_MASK,
+ IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
+ &reg);
+
+ if (status != IXGBE_SUCCESS)
+ return status;
+
+ reg |= (IXGBE_MDIO_GLOBAL_AN_VEN_ALM_INT_EN |
+ IXGBE_MDIO_GLOBAL_ALARM_1_INT);
+
+ status = hw->phy.ops.write_reg(hw, IXGBE_MDIO_GLOBAL_INT_CHIP_VEN_MASK,
+ IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
+ reg);
+
+ if (status != IXGBE_SUCCESS)
+ return status;
+
+ /* Enable chip-wide vendor alarm */
+ status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_GLOBAL_INT_CHIP_STD_MASK,
+ IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
+ &reg);
+
+ if (status != IXGBE_SUCCESS)
+ return status;
+
+ reg |= IXGBE_MDIO_GLOBAL_VEN_ALM_INT_EN;
+
+ status = hw->phy.ops.write_reg(hw, IXGBE_MDIO_GLOBAL_INT_CHIP_STD_MASK,
+ IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
+ reg);
+
+ return status;
+}
+
+/**
+ * ixgbe_setup_kr_speed_x550em - Configure the KR PHY for link speed.
+ * @hw: pointer to hardware structure
+ * @speed: link speed
+ *
+ * Configures the integrated KR PHY.
+ **/
+static s32 ixgbe_setup_kr_speed_x550em(struct ixgbe_hw *hw,
+ ixgbe_link_speed speed)
+{
+ s32 status;
+ u32 reg_val;
+
+ status = ixgbe_read_iosf_sb_reg_x550(hw,
+ IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
+ IXGBE_SB_IOSF_TARGET_KR_PHY, &reg_val);
+ if (status)
+ return status;
+
+ reg_val |= IXGBE_KRM_LINK_CTRL_1_TETH_AN_ENABLE;
+ reg_val &= ~(IXGBE_KRM_LINK_CTRL_1_TETH_AN_FEC_REQ |
+ IXGBE_KRM_LINK_CTRL_1_TETH_AN_CAP_FEC);
+ reg_val &= ~(IXGBE_KRM_LINK_CTRL_1_TETH_AN_CAP_KR |
+ IXGBE_KRM_LINK_CTRL_1_TETH_AN_CAP_KX);
+
+ /* Advertise 10G support. */
+ if (speed & IXGBE_LINK_SPEED_10GB_FULL)
+ reg_val |= IXGBE_KRM_LINK_CTRL_1_TETH_AN_CAP_KR;
+
+ /* Advertise 1G support. */
+ if (speed & IXGBE_LINK_SPEED_1GB_FULL)
+ reg_val |= IXGBE_KRM_LINK_CTRL_1_TETH_AN_CAP_KX;
+
+ /* Restart auto-negotiation. */
+ reg_val |= IXGBE_KRM_LINK_CTRL_1_TETH_AN_RESTART;
+ status = ixgbe_write_iosf_sb_reg_x550(hw,
+ IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
+ IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
+
+ return status;
+}
+
+/**
+ * ixgbe_init_phy_ops_X550em - PHY/SFP specific init
+ * @hw: pointer to hardware structure
+ *
+ * Initialize any function pointers that were not able to be
+ * set during init_shared_code because the PHY/SFP type was
+ * not known. Perform the SFP init if necessary.
+ */
+s32 ixgbe_init_phy_ops_X550em(struct ixgbe_hw *hw)
+{
+ struct ixgbe_phy_info *phy = &hw->phy;
+ ixgbe_link_speed speed;
+ s32 ret_val;
+
+ DEBUGFUNC("ixgbe_init_phy_ops_X550em");
+
+ hw->mac.ops.set_lan_id(hw);
+
+ if (hw->mac.ops.get_media_type(hw) == ixgbe_media_type_fiber) {
+ phy->phy_semaphore_mask = IXGBE_GSSR_SHARED_I2C_SM;
+ ixgbe_setup_mux_ctl(hw);
+
+ /* Save NW management interface connected on board. This is used
+ * to determine internal PHY mode.
+ */
+ phy->nw_mng_if_sel = IXGBE_READ_REG(hw, IXGBE_NW_MNG_IF_SEL);
+
+ /* If internal PHY mode is KR, then initialize KR link */
+ if (phy->nw_mng_if_sel & IXGBE_NW_MNG_IF_SEL_INT_PHY_MODE) {
+ speed = IXGBE_LINK_SPEED_10GB_FULL |
+ IXGBE_LINK_SPEED_1GB_FULL;
+ ret_val = ixgbe_setup_kr_speed_x550em(hw, speed);
+ }
+
+ phy->ops.identify_sfp = ixgbe_identify_sfp_module_X550em;
+ }
+
+ /* Identify the PHY or SFP module */
+ ret_val = phy->ops.identify(hw);
+ if (ret_val == IXGBE_ERR_SFP_NOT_SUPPORTED)
+ return ret_val;
+
+ /* Setup function pointers based on detected hardware */
+ ixgbe_init_mac_link_ops_X550em(hw);
+ if (phy->sfp_type != ixgbe_sfp_type_unknown)
+ phy->ops.reset = NULL;
+
+ /* Set functions pointers based on phy type */
+ switch (hw->phy.type) {
+ case ixgbe_phy_x550em_kx4:
+ phy->ops.setup_link = ixgbe_setup_kx4_x550em;
+ phy->ops.read_reg = ixgbe_read_phy_reg_x550em;
+ phy->ops.write_reg = ixgbe_write_phy_reg_x550em;
+ break;
+ case ixgbe_phy_x550em_kr:
+ phy->ops.setup_link = ixgbe_setup_kr_x550em;
+ phy->ops.read_reg = ixgbe_read_phy_reg_x550em;
+ phy->ops.write_reg = ixgbe_write_phy_reg_x550em;
+ break;
+ case ixgbe_phy_x550em_ext_t:
+ /* Save NW management interface connected on board. This is used
+ * to determine internal PHY mode
+ */
+ phy->nw_mng_if_sel = IXGBE_READ_REG(hw, IXGBE_NW_MNG_IF_SEL);
+
+ /* If internal link mode is XFI, then setup iXFI internal link,
+ * else setup KR now.
+ */
+ if (!(phy->nw_mng_if_sel & IXGBE_NW_MNG_IF_SEL_INT_PHY_MODE)) {
+ phy->ops.setup_internal_link =
+ ixgbe_setup_internal_phy_t_x550em;
+ } else {
+ speed = IXGBE_LINK_SPEED_10GB_FULL |
+ IXGBE_LINK_SPEED_1GB_FULL;
+ ret_val = ixgbe_setup_kr_speed_x550em(hw, speed);
+ }
+
+ phy->ops.enter_lplu = ixgbe_enter_lplu_t_x550em;
+ phy->ops.handle_lasi = ixgbe_handle_lasi_ext_t_x550em;
+ phy->ops.reset = ixgbe_reset_phy_t_X550em;
+ break;
+ default:
+ break;
+ }
+ return ret_val;
+}
+
+/**
+ * ixgbe_reset_hw_X550em - Perform hardware reset
+ * @hw: pointer to hardware structure
+ *
+ * Resets the hardware by resetting the transmit and receive units, masks
+ * and clears all interrupts, perform a PHY reset, and perform a link (MAC)
+ * reset.
+ */
+s32 ixgbe_reset_hw_X550em(struct ixgbe_hw *hw)
+{
+ ixgbe_link_speed link_speed;
+ s32 status;
+ u32 ctrl = 0;
+ u32 i;
+ u32 hlreg0;
+ bool link_up = FALSE;
+
+ DEBUGFUNC("ixgbe_reset_hw_X550em");
+
+ /* Call adapter stop to disable Tx/Rx and clear interrupts */
+ status = hw->mac.ops.stop_adapter(hw);
+ if (status != IXGBE_SUCCESS)
+ return status;
+
+ /* flush pending Tx transactions */
+ ixgbe_clear_tx_pending(hw);
+
+ /* PHY ops must be identified and initialized prior to reset */
+
+ /* Identify PHY and related function pointers */
+ status = hw->phy.ops.init(hw);
+
+ if (status == IXGBE_ERR_SFP_NOT_SUPPORTED)
+ return status;
+
+ /* start the external PHY */
+ if (hw->phy.type == ixgbe_phy_x550em_ext_t) {
+ status = ixgbe_init_ext_t_x550em(hw);
+ if (status)
+ return status;
+ }
+
+ /* Setup SFP module if there is one present. */
+ if (hw->phy.sfp_setup_needed) {
+ status = hw->mac.ops.setup_sfp(hw);
+ hw->phy.sfp_setup_needed = FALSE;
+ }
+
+ if (status == IXGBE_ERR_SFP_NOT_SUPPORTED)
+ return status;
+
+ /* Reset PHY */
+ if (!hw->phy.reset_disable && hw->phy.ops.reset)
+ hw->phy.ops.reset(hw);
+
+mac_reset_top:
+ /* Issue global reset to the MAC. Needs to be SW reset if link is up.
+ * If link reset is used when link is up, it might reset the PHY when
+ * mng is using it. If link is down or the flag to force full link
+ * reset is set, then perform link reset.
+ */
+ ctrl = IXGBE_CTRL_LNK_RST;
+ if (!hw->force_full_reset) {
+ hw->mac.ops.check_link(hw, &link_speed, &link_up, FALSE);
+ if (link_up)
+ ctrl = IXGBE_CTRL_RST;
+ }
+
+ ctrl |= IXGBE_READ_REG(hw, IXGBE_CTRL);
+ IXGBE_WRITE_REG(hw, IXGBE_CTRL, ctrl);
+ IXGBE_WRITE_FLUSH(hw);
+
+ /* Poll for reset bit to self-clear meaning reset is complete */
+ for (i = 0; i < 10; i++) {
+ usec_delay(1);
+ ctrl = IXGBE_READ_REG(hw, IXGBE_CTRL);
+ if (!(ctrl & IXGBE_CTRL_RST_MASK))
+ break;
+ }
+
+ if (ctrl & IXGBE_CTRL_RST_MASK) {
+ status = IXGBE_ERR_RESET_FAILED;
+ DEBUGOUT("Reset polling failed to complete.\n");
+ }
+
+ msec_delay(50);
+
+ /* Double resets are required for recovery from certain error
+ * conditions. Between resets, it is necessary to stall to
+ * allow time for any pending HW events to complete.
+ */
+ if (hw->mac.flags & IXGBE_FLAGS_DOUBLE_RESET_REQUIRED) {
+ hw->mac.flags &= ~IXGBE_FLAGS_DOUBLE_RESET_REQUIRED;
+ goto mac_reset_top;
+ }
+
+ /* Store the permanent mac address */
+ hw->mac.ops.get_mac_addr(hw, hw->mac.perm_addr);
+
+ /* Store MAC address from RAR0, clear receive address registers, and
+ * clear the multicast table. Also reset num_rar_entries to 128,
+ * since we modify this value when programming the SAN MAC address.
+ */
+ hw->mac.num_rar_entries = 128;
+ hw->mac.ops.init_rx_addrs(hw);
+
+ if (hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T) {
+ /* Config MDIO clock speed. */
+ hlreg0 = IXGBE_READ_REG(hw, IXGBE_HLREG0);
+ hlreg0 &= ~IXGBE_HLREG0_MDCSPD;
+ IXGBE_WRITE_REG(hw, IXGBE_HLREG0, hlreg0);
+ }
+
+ if (hw->device_id == IXGBE_DEV_ID_X550EM_X_SFP)
+ ixgbe_setup_mux_ctl(hw);
+
+ return status;
+}
+
+/**
+ * ixgbe_init_ext_t_x550em - Start (unstall) the external Base T PHY.
+ * @hw: pointer to hardware structure
+ */
+s32 ixgbe_init_ext_t_x550em(struct ixgbe_hw *hw)
+{
+ u32 status;
+ u16 reg;
+
+ status = hw->phy.ops.read_reg(hw,
+ IXGBE_MDIO_TX_VENDOR_ALARMS_3,
+ IXGBE_MDIO_PMA_PMD_DEV_TYPE,
+ &reg);
+
+ if (status != IXGBE_SUCCESS)
+ return status;
+
+ /* If PHY FW reset completed bit is set then this is the first
+ * SW instance after a power on so the PHY FW must be un-stalled.
+ */
+ if (reg & IXGBE_MDIO_TX_VENDOR_ALARMS_3_RST_MASK) {
+ status = hw->phy.ops.read_reg(hw,
+ IXGBE_MDIO_GLOBAL_RES_PR_10,
+ IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
+ &reg);
+
+ if (status != IXGBE_SUCCESS)
+ return status;
+
+ reg &= ~IXGBE_MDIO_POWER_UP_STALL;
+
+ status = hw->phy.ops.write_reg(hw,
+ IXGBE_MDIO_GLOBAL_RES_PR_10,
+ IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
+ reg);
+
+ if (status != IXGBE_SUCCESS)
+ return status;
+ }
+
+ return status;
+}
+
+/**
+ * ixgbe_setup_kr_x550em - Configure the KR PHY.
+ * @hw: pointer to hardware structure
+ *
+ * Configures the integrated KR PHY.
+ **/
+s32 ixgbe_setup_kr_x550em(struct ixgbe_hw *hw)
+{
+ return ixgbe_setup_kr_speed_x550em(hw, hw->phy.autoneg_advertised);
+}
+
+/**
+ * ixgbe_setup_kx4_x550em - Configure the KX4 PHY.
+ * @hw: pointer to hardware structure
+ *
+ * Configures the integrated KX4 PHY.
+ **/
+s32 ixgbe_setup_kx4_x550em(struct ixgbe_hw *hw)
+{
+ s32 status;
+ u32 reg_val;
+
+ status = ixgbe_read_iosf_sb_reg_x550(hw, IXGBE_KX4_LINK_CNTL_1,
+ IXGBE_SB_IOSF_TARGET_KX4_PCS, &reg_val);
+ if (status)
+ return status;
+
+ reg_val &= ~(IXGBE_KX4_LINK_CNTL_1_TETH_AN_CAP_KX4 |
+ IXGBE_KX4_LINK_CNTL_1_TETH_AN_CAP_KX);
+
+ reg_val |= IXGBE_KX4_LINK_CNTL_1_TETH_AN_ENABLE;
+
+ /* Advertise 10G support. */
+ if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_10GB_FULL)
+ reg_val |= IXGBE_KX4_LINK_CNTL_1_TETH_AN_CAP_KX4;
+
+ /* Advertise 1G support. */
+ if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_1GB_FULL)
+ reg_val |= IXGBE_KX4_LINK_CNTL_1_TETH_AN_CAP_KX;
+
+ /* Restart auto-negotiation. */
+ reg_val |= IXGBE_KX4_LINK_CNTL_1_TETH_AN_RESTART;
+ status = ixgbe_write_iosf_sb_reg_x550(hw, IXGBE_KX4_LINK_CNTL_1,
+ IXGBE_SB_IOSF_TARGET_KX4_PCS, reg_val);
+
+ return status;
+}
+
+/**
+ * ixgbe_setup_mac_link_sfp_x550em - Setup internal/external the PHY for SFP
+ * @hw: pointer to hardware structure
+ *
+ * Configure the external PHY and the integrated KR PHY for SFP support.
+ **/
+s32 ixgbe_setup_mac_link_sfp_x550em(struct ixgbe_hw *hw,
+ ixgbe_link_speed speed,
+ bool autoneg_wait_to_complete)
+{
+ s32 ret_val;
+ u16 reg_slice, reg_val;
+ bool setup_linear = FALSE;
+ UNREFERENCED_1PARAMETER(autoneg_wait_to_complete);
+
+ /* Check if SFP module is supported and linear */
+ ret_val = ixgbe_supported_sfp_modules_X550em(hw, &setup_linear);
+
+ /* If no SFP module present, then return success. Return success since
+ * there is no reason to configure CS4227 and SFP not present error is
+ * not excepted in the setup MAC link flow.
+ */
+ if (ret_val == IXGBE_ERR_SFP_NOT_PRESENT)
+ return IXGBE_SUCCESS;
+
+ if (ret_val != IXGBE_SUCCESS)
+ return ret_val;
+
+ /* Configure CS4227 for LINE connection rate then type. */
+ reg_slice = IXGBE_CS4227_LINE_SPARE22_MSB + (hw->bus.lan_id << 12);
+ reg_val = (speed & IXGBE_LINK_SPEED_10GB_FULL) ? 0 : 0x8000;
+ ret_val = ixgbe_write_i2c_combined(hw, IXGBE_CS4227, reg_slice,
+ reg_val);
+
+ reg_slice = IXGBE_CS4227_LINE_SPARE24_LSB + (hw->bus.lan_id << 12);
+ if (setup_linear)
+ reg_val = (IXGBE_CS4227_EDC_MODE_CX1 << 1) | 0x1;
+ else
+ reg_val = (IXGBE_CS4227_EDC_MODE_SR << 1) | 0x1;
+ ret_val = ixgbe_write_i2c_combined(hw, IXGBE_CS4227, reg_slice,
+ reg_val);
+
+ /* Configure CS4227 for HOST connection rate then type. */
+ reg_slice = IXGBE_CS4227_HOST_SPARE22_MSB + (hw->bus.lan_id << 12);
+ reg_val = (speed & IXGBE_LINK_SPEED_10GB_FULL) ? 0 : 0x8000;
+ ret_val = ixgbe_write_i2c_combined(hw, IXGBE_CS4227, reg_slice,
+ reg_val);
+
+ reg_slice = IXGBE_CS4227_HOST_SPARE24_LSB + (hw->bus.lan_id << 12);
+ if (setup_linear)
+ reg_val = (IXGBE_CS4227_EDC_MODE_CX1 << 1) | 0x1;
+ else
+ reg_val = (IXGBE_CS4227_EDC_MODE_SR << 1) | 0x1;
+ ret_val = ixgbe_write_i2c_combined(hw, IXGBE_CS4227, reg_slice,
+ reg_val);
+
+ /* If internal link mode is XFI, then setup XFI internal link. */
+ if (!(hw->phy.nw_mng_if_sel & IXGBE_NW_MNG_IF_SEL_INT_PHY_MODE))
+ ret_val = ixgbe_setup_ixfi_x550em(hw, &speed);
+
+ return ret_val;
+}
+
+/**
+ * ixgbe_setup_ixfi_x550em - Configure the KR PHY for iXFI mode.
+ * @hw: pointer to hardware structure
+ * @speed: the link speed to force
+ *
+ * Configures the integrated KR PHY to use iXFI mode. Used to connect an
+ * internal and external PHY at a specific speed, without autonegotiation.
+ **/
+static s32 ixgbe_setup_ixfi_x550em(struct ixgbe_hw *hw, ixgbe_link_speed *speed)
+{
+ s32 status;
+ u32 reg_val;
+
+ /* Disable AN and force speed to 10G Serial. */
+ status = ixgbe_read_iosf_sb_reg_x550(hw,
+ IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
+ IXGBE_SB_IOSF_TARGET_KR_PHY, &reg_val);
+ if (status != IXGBE_SUCCESS)
+ return status;
+
+ reg_val &= ~IXGBE_KRM_LINK_CTRL_1_TETH_AN_ENABLE;
+ reg_val &= ~IXGBE_KRM_LINK_CTRL_1_TETH_FORCE_SPEED_MASK;
+
+ /* Select forced link speed for internal PHY. */
+ switch (*speed) {
+ case IXGBE_LINK_SPEED_10GB_FULL:
+ reg_val |= IXGBE_KRM_LINK_CTRL_1_TETH_FORCE_SPEED_10G;
+ break;
+ case IXGBE_LINK_SPEED_1GB_FULL:
+ reg_val |= IXGBE_KRM_LINK_CTRL_1_TETH_FORCE_SPEED_1G;
+ break;
+ default:
+ /* Other link speeds are not supported by internal KR PHY. */
+ return IXGBE_ERR_LINK_SETUP;
+ }
+
+ status = ixgbe_write_iosf_sb_reg_x550(hw,
+ IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
+ IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
+ if (status != IXGBE_SUCCESS)
+ return status;
+
+ /* Disable training protocol FSM. */
+ status = ixgbe_read_iosf_sb_reg_x550(hw,
+ IXGBE_KRM_RX_TRN_LINKUP_CTRL(hw->bus.lan_id),
+ IXGBE_SB_IOSF_TARGET_KR_PHY, &reg_val);
+ if (status != IXGBE_SUCCESS)
+ return status;
+ reg_val |= IXGBE_KRM_RX_TRN_LINKUP_CTRL_CONV_WO_PROTOCOL;
+ status = ixgbe_write_iosf_sb_reg_x550(hw,
+ IXGBE_KRM_RX_TRN_LINKUP_CTRL(hw->bus.lan_id),
+ IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
+ if (status != IXGBE_SUCCESS)
+ return status;
+
+ /* Disable Flex from training TXFFE. */
+ status = ixgbe_read_iosf_sb_reg_x550(hw,
+ IXGBE_KRM_DSP_TXFFE_STATE_4(hw->bus.lan_id),
+ IXGBE_SB_IOSF_TARGET_KR_PHY, &reg_val);
+ if (status != IXGBE_SUCCESS)
+ return status;
+ reg_val &= ~IXGBE_KRM_DSP_TXFFE_STATE_C0_EN;
+ reg_val &= ~IXGBE_KRM_DSP_TXFFE_STATE_CP1_CN1_EN;
+ reg_val &= ~IXGBE_KRM_DSP_TXFFE_STATE_CO_ADAPT_EN;
+ status = ixgbe_write_iosf_sb_reg_x550(hw,
+ IXGBE_KRM_DSP_TXFFE_STATE_4(hw->bus.lan_id),
+ IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
+ if (status != IXGBE_SUCCESS)
+ return status;
+ status = ixgbe_read_iosf_sb_reg_x550(hw,
+ IXGBE_KRM_DSP_TXFFE_STATE_5(hw->bus.lan_id),
+ IXGBE_SB_IOSF_TARGET_KR_PHY, &reg_val);
+ if (status != IXGBE_SUCCESS)
+ return status;
+ reg_val &= ~IXGBE_KRM_DSP_TXFFE_STATE_C0_EN;
+ reg_val &= ~IXGBE_KRM_DSP_TXFFE_STATE_CP1_CN1_EN;
+ reg_val &= ~IXGBE_KRM_DSP_TXFFE_STATE_CO_ADAPT_EN;
+ status = ixgbe_write_iosf_sb_reg_x550(hw,
+ IXGBE_KRM_DSP_TXFFE_STATE_5(hw->bus.lan_id),
+ IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
+ if (status != IXGBE_SUCCESS)
+ return status;
+
+ /* Enable override for coefficients. */
+ status = ixgbe_read_iosf_sb_reg_x550(hw,
+ IXGBE_KRM_TX_COEFF_CTRL_1(hw->bus.lan_id),
+ IXGBE_SB_IOSF_TARGET_KR_PHY, &reg_val);
+ if (status != IXGBE_SUCCESS)
+ return status;
+ reg_val |= IXGBE_KRM_TX_COEFF_CTRL_1_OVRRD_EN;
+ reg_val |= IXGBE_KRM_TX_COEFF_CTRL_1_CZERO_EN;
+ reg_val |= IXGBE_KRM_TX_COEFF_CTRL_1_CPLUS1_OVRRD_EN;
+ reg_val |= IXGBE_KRM_TX_COEFF_CTRL_1_CMINUS1_OVRRD_EN;
+ status = ixgbe_write_iosf_sb_reg_x550(hw,
+ IXGBE_KRM_TX_COEFF_CTRL_1(hw->bus.lan_id),
+ IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
+ if (status != IXGBE_SUCCESS)
+ return status;
+
+ /* Toggle port SW reset by AN reset. */
+ status = ixgbe_read_iosf_sb_reg_x550(hw,
+ IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
+ IXGBE_SB_IOSF_TARGET_KR_PHY, &reg_val);
+ if (status != IXGBE_SUCCESS)
+ return status;
+ reg_val |= IXGBE_KRM_LINK_CTRL_1_TETH_AN_RESTART;
+ status = ixgbe_write_iosf_sb_reg_x550(hw,
+ IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
+ IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
+
+ return status;
+}
+
+/**
+ * ixgbe_ext_phy_t_x550em_get_link - Get ext phy link status
+ * @hw: address of hardware structure
+ * @link_up: address of boolean to indicate link status
+ *
+ * Returns error code if unable to get link status.
+ */
+static s32 ixgbe_ext_phy_t_x550em_get_link(struct ixgbe_hw *hw, bool *link_up)
+{
+ u32 ret;
+ u16 autoneg_status;
+
+ *link_up = FALSE;
+
+ /* read this twice back to back to indicate current status */
+ ret = hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_STATUS,
+ IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
+ &autoneg_status);
+ if (ret != IXGBE_SUCCESS)
+ return ret;
+
+ ret = hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_STATUS,
+ IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
+ &autoneg_status);
+ if (ret != IXGBE_SUCCESS)
+ return ret;
+
+ *link_up = !!(autoneg_status & IXGBE_MDIO_AUTO_NEG_LINK_STATUS);
+
+ return IXGBE_SUCCESS;
+}
+
+/**
+ * ixgbe_setup_internal_phy_t_x550em - Configure KR PHY to X557 link
+ * @hw: point to hardware structure
+ *
+ * Configures the link between the integrated KR PHY and the external X557 PHY
+ * The driver will call this function when it gets a link status change
+ * interrupt from the X557 PHY. This function configures the link speed
+ * between the PHYs to match the link speed of the BASE-T link.
+ *
+ * A return of a non-zero value indicates an error, and the base driver should
+ * not report link up.
+ */
+s32 ixgbe_setup_internal_phy_t_x550em(struct ixgbe_hw *hw)
+{
+ ixgbe_link_speed force_speed;
+ bool link_up;
+ u32 status;
+ u16 speed;
+
+ if (hw->mac.ops.get_media_type(hw) != ixgbe_media_type_copper)
+ return IXGBE_ERR_CONFIG;
+
+ /* If link is not up, then there is no setup necessary so return */
+ status = ixgbe_ext_phy_t_x550em_get_link(hw, &link_up);
+ if (status != IXGBE_SUCCESS)
+ return status;
+
+ if (!link_up)
+ return IXGBE_SUCCESS;
+
+ status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_VENDOR_STAT,
+ IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
+ &speed);
+ if (status != IXGBE_SUCCESS)
+ return status;
+
+ /* If link is not still up, then no setup is necessary so return */
+ status = ixgbe_ext_phy_t_x550em_get_link(hw, &link_up);
+ if (status != IXGBE_SUCCESS)
+ return status;
+ if (!link_up)
+ return IXGBE_SUCCESS;
+
+ /* clear everything but the speed and duplex bits */
+ speed &= IXGBE_MDIO_AUTO_NEG_VENDOR_STATUS_MASK;
+
+ switch (speed) {
+ case IXGBE_MDIO_AUTO_NEG_VENDOR_STATUS_10GB_FULL:
+ force_speed = IXGBE_LINK_SPEED_10GB_FULL;
+ break;
+ case IXGBE_MDIO_AUTO_NEG_VENDOR_STATUS_1GB_FULL:
+ force_speed = IXGBE_LINK_SPEED_1GB_FULL;
+ break;
+ default:
+ /* Internal PHY does not support anything else */
+ return IXGBE_ERR_INVALID_LINK_SETTINGS;
+ }
+
+ return ixgbe_setup_ixfi_x550em(hw, &force_speed);
+}
+
+/**
+ * ixgbe_setup_phy_loopback_x550em - Configure the KR PHY for loopback.
+ * @hw: pointer to hardware structure
+ *
+ * Configures the integrated KR PHY to use internal loopback mode.
+ **/
+s32 ixgbe_setup_phy_loopback_x550em(struct ixgbe_hw *hw)
+{
+ s32 status;
+ u32 reg_val;
+
+ /* Disable AN and force speed to 10G Serial. */
+ status = ixgbe_read_iosf_sb_reg_x550(hw,
+ IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
+ IXGBE_SB_IOSF_TARGET_KR_PHY, &reg_val);
+ if (status != IXGBE_SUCCESS)
+ return status;
+ reg_val &= ~IXGBE_KRM_LINK_CTRL_1_TETH_AN_ENABLE;
+ reg_val &= ~IXGBE_KRM_LINK_CTRL_1_TETH_FORCE_SPEED_MASK;
+ reg_val |= IXGBE_KRM_LINK_CTRL_1_TETH_FORCE_SPEED_10G;
+ status = ixgbe_write_iosf_sb_reg_x550(hw,
+ IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
+ IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
+ if (status != IXGBE_SUCCESS)
+ return status;
+
+ /* Set near-end loopback clocks. */
+ status = ixgbe_read_iosf_sb_reg_x550(hw,
+ IXGBE_KRM_PORT_CAR_GEN_CTRL(hw->bus.lan_id),
+ IXGBE_SB_IOSF_TARGET_KR_PHY, &reg_val);
+ if (status != IXGBE_SUCCESS)
+ return status;
+ reg_val |= IXGBE_KRM_PORT_CAR_GEN_CTRL_NELB_32B;
+ reg_val |= IXGBE_KRM_PORT_CAR_GEN_CTRL_NELB_KRPCS;
+ status = ixgbe_write_iosf_sb_reg_x550(hw,
+ IXGBE_KRM_PORT_CAR_GEN_CTRL(hw->bus.lan_id),
+ IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
+ if (status != IXGBE_SUCCESS)
+ return status;
+
+ /* Set loopback enable. */
+ status = ixgbe_read_iosf_sb_reg_x550(hw,
+ IXGBE_KRM_PMD_DFX_BURNIN(hw->bus.lan_id),
+ IXGBE_SB_IOSF_TARGET_KR_PHY, &reg_val);
+ if (status != IXGBE_SUCCESS)
+ return status;
+ reg_val |= IXGBE_KRM_PMD_DFX_BURNIN_TX_RX_KR_LB_MASK;
+ status = ixgbe_write_iosf_sb_reg_x550(hw,
+ IXGBE_KRM_PMD_DFX_BURNIN(hw->bus.lan_id),
+ IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
+ if (status != IXGBE_SUCCESS)
+ return status;
+
+ /* Training bypass. */
+ status = ixgbe_read_iosf_sb_reg_x550(hw,
+ IXGBE_KRM_RX_TRN_LINKUP_CTRL(hw->bus.lan_id),
+ IXGBE_SB_IOSF_TARGET_KR_PHY, &reg_val);
+ if (status != IXGBE_SUCCESS)
+ return status;
+ reg_val |= IXGBE_KRM_RX_TRN_LINKUP_CTRL_PROTOCOL_BYPASS;
+ status = ixgbe_write_iosf_sb_reg_x550(hw,
+ IXGBE_KRM_RX_TRN_LINKUP_CTRL(hw->bus.lan_id),
+ IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
+
+ return status;
+}
+
+/**
+ * ixgbe_read_ee_hostif_X550 - Read EEPROM word using a host interface command
+ * assuming that the semaphore is already obtained.
+ * @hw: pointer to hardware structure
+ * @offset: offset of word in the EEPROM to read
+ * @data: word read from the EEPROM
+ *
+ * Reads a 16 bit word from the EEPROM using the hostif.
+ **/
+s32 ixgbe_read_ee_hostif_data_X550(struct ixgbe_hw *hw, u16 offset,
+ u16 *data)
+{
+ s32 status;
+ struct ixgbe_hic_read_shadow_ram buffer;
+
+ DEBUGFUNC("ixgbe_read_ee_hostif_data_X550");
+ buffer.hdr.req.cmd = FW_READ_SHADOW_RAM_CMD;
+ buffer.hdr.req.buf_lenh = 0;
+ buffer.hdr.req.buf_lenl = FW_READ_SHADOW_RAM_LEN;
+ buffer.hdr.req.checksum = FW_DEFAULT_CHECKSUM;
+
+ /* convert offset from words to bytes */
+ buffer.address = IXGBE_CPU_TO_BE32(offset * 2);
+ /* one word */
+ buffer.length = IXGBE_CPU_TO_BE16(sizeof(u16));
+
+ status = ixgbe_host_interface_command(hw, (u32 *)&buffer,
+ sizeof(buffer),
+ IXGBE_HI_COMMAND_TIMEOUT, FALSE);
+
+ if (status)
+ return status;
+
+ *data = (u16)IXGBE_READ_REG_ARRAY(hw, IXGBE_FLEX_MNG,
+ FW_NVM_DATA_OFFSET);
+
+ return 0;
+}
+
+/**
+ * ixgbe_read_ee_hostif_X550 - Read EEPROM word using a host interface command
+ * @hw: pointer to hardware structure
+ * @offset: offset of word in the EEPROM to read
+ * @data: word read from the EEPROM
+ *
+ * Reads a 16 bit word from the EEPROM using the hostif.
+ **/
+s32 ixgbe_read_ee_hostif_X550(struct ixgbe_hw *hw, u16 offset,
+ u16 *data)
+{
+ s32 status = IXGBE_SUCCESS;
+
+ DEBUGFUNC("ixgbe_read_ee_hostif_X550");
+
+ if (hw->mac.ops.acquire_swfw_sync(hw, IXGBE_GSSR_EEP_SM) ==
+ IXGBE_SUCCESS) {
+ status = ixgbe_read_ee_hostif_data_X550(hw, offset, data);
+ hw->mac.ops.release_swfw_sync(hw, IXGBE_GSSR_EEP_SM);
+ } else {
+ status = IXGBE_ERR_SWFW_SYNC;
+ }
+
+ return status;
+}
+
+/**
+ * ixgbe_read_ee_hostif_buffer_X550- Read EEPROM word(s) using hostif
+ * @hw: pointer to hardware structure
+ * @offset: offset of word in the EEPROM to read
+ * @words: number of words
+ * @data: word(s) read from the EEPROM
+ *
+ * Reads a 16 bit word(s) from the EEPROM using the hostif.
+ **/
+s32 ixgbe_read_ee_hostif_buffer_X550(struct ixgbe_hw *hw,
+ u16 offset, u16 words, u16 *data)
+{
+ struct ixgbe_hic_read_shadow_ram buffer;
+ u32 current_word = 0;
+ u16 words_to_read;
+ s32 status;
+ u32 i;
+
+ DEBUGFUNC("ixgbe_read_ee_hostif_buffer_X550");
+
+ /* Take semaphore for the entire operation. */
+ status = hw->mac.ops.acquire_swfw_sync(hw, IXGBE_GSSR_EEP_SM);
+ if (status) {
+ DEBUGOUT("EEPROM read buffer - semaphore failed\n");
+ return status;
+ }
+ while (words) {
+ if (words > FW_MAX_READ_BUFFER_SIZE / 2)
+ words_to_read = FW_MAX_READ_BUFFER_SIZE / 2;
+ else
+ words_to_read = words;
+
+ buffer.hdr.req.cmd = FW_READ_SHADOW_RAM_CMD;
+ buffer.hdr.req.buf_lenh = 0;
+ buffer.hdr.req.buf_lenl = FW_READ_SHADOW_RAM_LEN;
+ buffer.hdr.req.checksum = FW_DEFAULT_CHECKSUM;
+
+ /* convert offset from words to bytes */
+ buffer.address = IXGBE_CPU_TO_BE32((offset + current_word) * 2);
+ buffer.length = IXGBE_CPU_TO_BE16(words_to_read * 2);
+
+ status = ixgbe_host_interface_command(hw, (u32 *)&buffer,
+ sizeof(buffer),
+ IXGBE_HI_COMMAND_TIMEOUT,
+ FALSE);
+
+ if (status) {
+ DEBUGOUT("Host interface command failed\n");
+ goto out;
+ }
+
+ for (i = 0; i < words_to_read; i++) {
+ u32 reg = IXGBE_FLEX_MNG + (FW_NVM_DATA_OFFSET << 2) +
+ 2 * i;
+ u32 value = IXGBE_READ_REG(hw, reg);
+
+ data[current_word] = (u16)(value & 0xffff);
+ current_word++;
+ i++;
+ if (i < words_to_read) {
+ value >>= 16;
+ data[current_word] = (u16)(value & 0xffff);
+ current_word++;
+ }
+ }
+ words -= words_to_read;
+ }
+
+out:
+ hw->mac.ops.release_swfw_sync(hw, IXGBE_GSSR_EEP_SM);
+ return status;
+}
+
+/**
+ * ixgbe_write_ee_hostif_X550 - Write EEPROM word using hostif
+ * @hw: pointer to hardware structure
+ * @offset: offset of word in the EEPROM to write
+ * @data: word write to the EEPROM
+ *
+ * Write a 16 bit word to the EEPROM using the hostif.
+ **/
+s32 ixgbe_write_ee_hostif_data_X550(struct ixgbe_hw *hw, u16 offset,
+ u16 data)
+{
+ s32 status;
+ struct ixgbe_hic_write_shadow_ram buffer;
+
+ DEBUGFUNC("ixgbe_write_ee_hostif_data_X550");
+
+ buffer.hdr.req.cmd = FW_WRITE_SHADOW_RAM_CMD;
+ buffer.hdr.req.buf_lenh = 0;
+ buffer.hdr.req.buf_lenl = FW_WRITE_SHADOW_RAM_LEN;
+ buffer.hdr.req.checksum = FW_DEFAULT_CHECKSUM;
+
+ /* one word */
+ buffer.length = IXGBE_CPU_TO_BE16(sizeof(u16));
+ buffer.data = data;
+ buffer.address = IXGBE_CPU_TO_BE32(offset * 2);
+
+ status = ixgbe_host_interface_command(hw, (u32 *)&buffer,
+ sizeof(buffer),
+ IXGBE_HI_COMMAND_TIMEOUT, FALSE);
+
+ return status;
+}
+
+/**
+ * ixgbe_write_ee_hostif_X550 - Write EEPROM word using hostif
+ * @hw: pointer to hardware structure
+ * @offset: offset of word in the EEPROM to write
+ * @data: word write to the EEPROM
+ *
+ * Write a 16 bit word to the EEPROM using the hostif.
+ **/
+s32 ixgbe_write_ee_hostif_X550(struct ixgbe_hw *hw, u16 offset,
+ u16 data)
+{
+ s32 status = IXGBE_SUCCESS;
+
+ DEBUGFUNC("ixgbe_write_ee_hostif_X550");
+
+ if (hw->mac.ops.acquire_swfw_sync(hw, IXGBE_GSSR_EEP_SM) ==
+ IXGBE_SUCCESS) {
+ status = ixgbe_write_ee_hostif_data_X550(hw, offset, data);
+ hw->mac.ops.release_swfw_sync(hw, IXGBE_GSSR_EEP_SM);
+ } else {
+ DEBUGOUT("write ee hostif failed to get semaphore");
+ status = IXGBE_ERR_SWFW_SYNC;
+ }
+
+ return status;
+}
+
+/**
+ * ixgbe_write_ee_hostif_buffer_X550 - Write EEPROM word(s) using hostif
+ * @hw: pointer to hardware structure
+ * @offset: offset of word in the EEPROM to write
+ * @words: number of words
+ * @data: word(s) write to the EEPROM
+ *
+ * Write a 16 bit word(s) to the EEPROM using the hostif.
+ **/
+s32 ixgbe_write_ee_hostif_buffer_X550(struct ixgbe_hw *hw,
+ u16 offset, u16 words, u16 *data)
+{
+ s32 status = IXGBE_SUCCESS;
+ u32 i = 0;
+
+ DEBUGFUNC("ixgbe_write_ee_hostif_buffer_X550");
+
+ /* Take semaphore for the entire operation. */
+ status = hw->mac.ops.acquire_swfw_sync(hw, IXGBE_GSSR_EEP_SM);
+ if (status != IXGBE_SUCCESS) {
+ DEBUGOUT("EEPROM write buffer - semaphore failed\n");
+ goto out;
+ }
+
+ for (i = 0; i < words; i++) {
+ status = ixgbe_write_ee_hostif_data_X550(hw, offset + i,
+ data[i]);
+
+ if (status != IXGBE_SUCCESS) {
+ DEBUGOUT("Eeprom buffered write failed\n");
+ break;
+ }
+ }
+
+ hw->mac.ops.release_swfw_sync(hw, IXGBE_GSSR_EEP_SM);
+out:
+
+ return status;
+}
+
+/**
+ * ixgbe_checksum_ptr_x550 - Checksum one pointer region
+ * @hw: pointer to hardware structure
+ * @ptr: pointer offset in eeprom
+ * @size: size of section pointed by ptr, if 0 first word will be used as size
+ * @csum: address of checksum to update
+ *
+ * Returns error status for any failure
+ */
+static s32 ixgbe_checksum_ptr_x550(struct ixgbe_hw *hw, u16 ptr,
+ u16 size, u16 *csum, u16 *buffer,
+ u32 buffer_size)
+{
+ u16 buf[256];
+ s32 status;
+ u16 length, bufsz, i, start;
+ u16 *local_buffer;
+
+ bufsz = sizeof(buf) / sizeof(buf[0]);
+
+ /* Read a chunk at the pointer location */
+ if (!buffer) {
+ status = ixgbe_read_ee_hostif_buffer_X550(hw, ptr, bufsz, buf);
+ if (status) {
+ DEBUGOUT("Failed to read EEPROM image\n");
+ return status;
+ }
+ local_buffer = buf;
+ } else {
+ if (buffer_size < ptr)
+ return IXGBE_ERR_PARAM;
+ local_buffer = &buffer[ptr];
+ }
+
+ if (size) {
+ start = 0;
+ length = size;
+ } else {
+ start = 1;
+ length = local_buffer[0];
+
+ /* Skip pointer section if length is invalid. */
+ if (length == 0xFFFF || length == 0 ||
+ (ptr + length) >= hw->eeprom.word_size)
+ return IXGBE_SUCCESS;
+ }
+
+ if (buffer && ((u32)start + (u32)length > buffer_size))
+ return IXGBE_ERR_PARAM;
+
+ for (i = start; length; i++, length--) {
+ if (i == bufsz && !buffer) {
+ ptr += bufsz;
+ i = 0;
+ if (length < bufsz)
+ bufsz = length;
+
+ /* Read a chunk at the pointer location */
+ status = ixgbe_read_ee_hostif_buffer_X550(hw, ptr,
+ bufsz, buf);
+ if (status) {
+ DEBUGOUT("Failed to read EEPROM image\n");
+ return status;
+ }
+ }
+ *csum += local_buffer[i];
+ }
+ return IXGBE_SUCCESS;
+}
+
+/**
+ * ixgbe_calc_checksum_X550 - Calculates and returns the checksum
+ * @hw: pointer to hardware structure
+ * @buffer: pointer to buffer containing calculated checksum
+ * @buffer_size: size of buffer
+ *
+ * Returns a negative error code on error, or the 16-bit checksum
+ **/
+s32 ixgbe_calc_checksum_X550(struct ixgbe_hw *hw, u16 *buffer, u32 buffer_size)
+{
+ u16 eeprom_ptrs[IXGBE_EEPROM_LAST_WORD + 1];
+ u16 *local_buffer;
+ s32 status;
+ u16 checksum = 0;
+ u16 pointer, i, size;
+
+ DEBUGFUNC("ixgbe_calc_eeprom_checksum_X550");
+
+ hw->eeprom.ops.init_params(hw);
+
+ if (!buffer) {
+ /* Read pointer area */
+ status = ixgbe_read_ee_hostif_buffer_X550(hw, 0,
+ IXGBE_EEPROM_LAST_WORD + 1,
+ eeprom_ptrs);
+ if (status) {
+ DEBUGOUT("Failed to read EEPROM image\n");
+ return status;
+ }
+ local_buffer = eeprom_ptrs;
+ } else {
+ if (buffer_size < IXGBE_EEPROM_LAST_WORD)
+ return IXGBE_ERR_PARAM;
+ local_buffer = buffer;
+ }
+
+ /*
+ * For X550 hardware include 0x0-0x41 in the checksum, skip the
+ * checksum word itself
+ */
+ for (i = 0; i <= IXGBE_EEPROM_LAST_WORD; i++)
+ if (i != IXGBE_EEPROM_CHECKSUM)
+ checksum += local_buffer[i];
+
+ /*
+ * Include all data from pointers 0x3, 0x6-0xE. This excludes the
+ * FW, PHY module, and PCIe Expansion/Option ROM pointers.
+ */
+ for (i = IXGBE_PCIE_ANALOG_PTR_X550; i < IXGBE_FW_PTR; i++) {
+ if (i == IXGBE_PHY_PTR || i == IXGBE_OPTION_ROM_PTR)
+ continue;
+
+ pointer = local_buffer[i];
+
+ /* Skip pointer section if the pointer is invalid. */
+ if (pointer == 0xFFFF || pointer == 0 ||
+ pointer >= hw->eeprom.word_size)
+ continue;
+
+ switch (i) {
+ case IXGBE_PCIE_GENERAL_PTR:
+ size = IXGBE_IXGBE_PCIE_GENERAL_SIZE;
+ break;
+ case IXGBE_PCIE_CONFIG0_PTR:
+ case IXGBE_PCIE_CONFIG1_PTR:
+ size = IXGBE_PCIE_CONFIG_SIZE;
+ break;
+ default:
+ size = 0;
+ break;
+ }
+
+ status = ixgbe_checksum_ptr_x550(hw, pointer, size, &checksum,
+ buffer, buffer_size);
+ if (status)
+ return status;
+ }
+
+ checksum = (u16)IXGBE_EEPROM_SUM - checksum;
+
+ return (s32)checksum;
+}
+
+/**
+ * ixgbe_calc_eeprom_checksum_X550 - Calculates and returns the checksum
+ * @hw: pointer to hardware structure
+ *
+ * Returns a negative error code on error, or the 16-bit checksum
+ **/
+s32 ixgbe_calc_eeprom_checksum_X550(struct ixgbe_hw *hw)
+{
+ return ixgbe_calc_checksum_X550(hw, NULL, 0);
+}
+
+/**
+ * ixgbe_validate_eeprom_checksum_X550 - Validate EEPROM checksum
+ * @hw: pointer to hardware structure
+ * @checksum_val: calculated checksum
+ *
+ * Performs checksum calculation and validates the EEPROM checksum. If the
+ * caller does not need checksum_val, the value can be NULL.
+ **/
+s32 ixgbe_validate_eeprom_checksum_X550(struct ixgbe_hw *hw, u16 *checksum_val)
+{
+ s32 status;
+ u16 checksum;
+ u16 read_checksum = 0;
+
+ DEBUGFUNC("ixgbe_validate_eeprom_checksum_X550");
+
+ /* Read the first word from the EEPROM. If this times out or fails, do
+ * not continue or we could be in for a very long wait while every
+ * EEPROM read fails
+ */
+ status = hw->eeprom.ops.read(hw, 0, &checksum);
+ if (status) {
+ DEBUGOUT("EEPROM read failed\n");
+ return status;
+ }
+
+ status = hw->eeprom.ops.calc_checksum(hw);
+ if (status < 0)
+ return status;
+
+ checksum = (u16)(status & 0xffff);
+
+ status = ixgbe_read_ee_hostif_X550(hw, IXGBE_EEPROM_CHECKSUM,
+ &read_checksum);
+ if (status)
+ return status;
+
+ /* Verify read checksum from EEPROM is the same as
+ * calculated checksum
+ */
+ if (read_checksum != checksum) {
+ status = IXGBE_ERR_EEPROM_CHECKSUM;
+ ERROR_REPORT1(IXGBE_ERROR_INVALID_STATE,
+ "Invalid EEPROM checksum");
+ }
+
+ /* If the user cares, return the calculated checksum */
+ if (checksum_val)
+ *checksum_val = checksum;
+
+ return status;
+}
+
+/**
+ * ixgbe_update_eeprom_checksum_X550 - Updates the EEPROM checksum and flash
+ * @hw: pointer to hardware structure
+ *
+ * After writing EEPROM to shadow RAM using EEWR register, software calculates
+ * checksum and updates the EEPROM and instructs the hardware to update
+ * the flash.
+ **/
+s32 ixgbe_update_eeprom_checksum_X550(struct ixgbe_hw *hw)
+{
+ s32 status;
+ u16 checksum = 0;
+
+ DEBUGFUNC("ixgbe_update_eeprom_checksum_X550");
+
+ /* Read the first word from the EEPROM. If this times out or fails, do
+ * not continue or we could be in for a very long wait while every
+ * EEPROM read fails
+ */
+ status = ixgbe_read_ee_hostif_X550(hw, 0, &checksum);
+ if (status) {
+ DEBUGOUT("EEPROM read failed\n");
+ return status;
+ }
+
+ status = ixgbe_calc_eeprom_checksum_X550(hw);
+ if (status < 0)
+ return status;
+
+ checksum = (u16)(status & 0xffff);
+
+ status = ixgbe_write_ee_hostif_X550(hw, IXGBE_EEPROM_CHECKSUM,
+ checksum);
+ if (status)
+ return status;
+
+ status = ixgbe_update_flash_X550(hw);
+
+ return status;
+}
+
+/**
+ * ixgbe_update_flash_X550 - Instruct HW to copy EEPROM to Flash device
+ * @hw: pointer to hardware structure
+ *
+ * Issue a shadow RAM dump to FW to copy EEPROM from shadow RAM to the flash.
+ **/
+s32 ixgbe_update_flash_X550(struct ixgbe_hw *hw)
+{
+ s32 status = IXGBE_SUCCESS;
+ union ixgbe_hic_hdr2 buffer;
+
+ DEBUGFUNC("ixgbe_update_flash_X550");
+
+ buffer.req.cmd = FW_SHADOW_RAM_DUMP_CMD;
+ buffer.req.buf_lenh = 0;
+ buffer.req.buf_lenl = FW_SHADOW_RAM_DUMP_LEN;
+ buffer.req.checksum = FW_DEFAULT_CHECKSUM;
+
+ status = ixgbe_host_interface_command(hw, (u32 *)&buffer,
+ sizeof(buffer),
+ IXGBE_HI_COMMAND_TIMEOUT, FALSE);
+
+ return status;
+}
+
+/**
+ * ixgbe_get_supported_physical_layer_X550em - Returns physical layer type
+ * @hw: pointer to hardware structure
+ *
+ * Determines physical layer capabilities of the current configuration.
+ **/
+u32 ixgbe_get_supported_physical_layer_X550em(struct ixgbe_hw *hw)
+{
+ u32 physical_layer = IXGBE_PHYSICAL_LAYER_UNKNOWN;
+ u16 ext_ability = 0;
+
+ DEBUGFUNC("ixgbe_get_supported_physical_layer_X550em");
+
+ hw->phy.ops.identify(hw);
+
+ switch (hw->phy.type) {
+ case ixgbe_phy_x550em_kr:
+ physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_KR |
+ IXGBE_PHYSICAL_LAYER_1000BASE_KX;
+ break;
+ case ixgbe_phy_x550em_kx4:
+ physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_KX4 |
+ IXGBE_PHYSICAL_LAYER_1000BASE_KX;
+ break;
+ case ixgbe_phy_x550em_ext_t:
+ hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_EXT_ABILITY,
+ IXGBE_MDIO_PMA_PMD_DEV_TYPE,
+ &ext_ability);
+ if (ext_ability & IXGBE_MDIO_PHY_10GBASET_ABILITY)
+ physical_layer |= IXGBE_PHYSICAL_LAYER_10GBASE_T;
+ if (ext_ability & IXGBE_MDIO_PHY_1000BASET_ABILITY)
+ physical_layer |= IXGBE_PHYSICAL_LAYER_1000BASE_T;
+ break;
+ default:
+ break;
+ }
+
+ if (hw->mac.ops.get_media_type(hw) == ixgbe_media_type_fiber)
+ physical_layer = ixgbe_get_supported_phy_sfp_layer_generic(hw);
+
+ return physical_layer;
+}
+
+/**
+ * ixgbe_get_bus_info_x550em - Set PCI bus info
+ * @hw: pointer to hardware structure
+ *
+ * Sets bus link width and speed to unknown because X550em is
+ * not a PCI device.
+ **/
+s32 ixgbe_get_bus_info_X550em(struct ixgbe_hw *hw)
+{
+
+ DEBUGFUNC("ixgbe_get_bus_info_x550em");
+
+ hw->bus.width = ixgbe_bus_width_unknown;
+ hw->bus.speed = ixgbe_bus_speed_unknown;
+
+ hw->mac.ops.set_lan_id(hw);
+
+ return IXGBE_SUCCESS;
+}
+
+/**
+ * ixgbe_disable_rx_x550 - Disable RX unit
+ *
+ * Enables the Rx DMA unit for x550
+ **/
+void ixgbe_disable_rx_x550(struct ixgbe_hw *hw)
+{
+ u32 rxctrl, pfdtxgswc;
+ s32 status;
+ struct ixgbe_hic_disable_rxen fw_cmd;
+
+ DEBUGFUNC("ixgbe_enable_rx_dma_x550");
+
+ rxctrl = IXGBE_READ_REG(hw, IXGBE_RXCTRL);
+ if (rxctrl & IXGBE_RXCTRL_RXEN) {
+ pfdtxgswc = IXGBE_READ_REG(hw, IXGBE_PFDTXGSWC);
+ if (pfdtxgswc & IXGBE_PFDTXGSWC_VT_LBEN) {
+ pfdtxgswc &= ~IXGBE_PFDTXGSWC_VT_LBEN;
+ IXGBE_WRITE_REG(hw, IXGBE_PFDTXGSWC, pfdtxgswc);
+ hw->mac.set_lben = TRUE;
+ } else {
+ hw->mac.set_lben = FALSE;
+ }
+
+ fw_cmd.hdr.cmd = FW_DISABLE_RXEN_CMD;
+ fw_cmd.hdr.buf_len = FW_DISABLE_RXEN_LEN;
+ fw_cmd.hdr.checksum = FW_DEFAULT_CHECKSUM;
+ fw_cmd.port_number = (u8)hw->bus.lan_id;
+
+ status = ixgbe_host_interface_command(hw, (u32 *)&fw_cmd,
+ sizeof(struct ixgbe_hic_disable_rxen),
+ IXGBE_HI_COMMAND_TIMEOUT, TRUE);
+
+ /* If we fail - disable RX using register write */
+ if (status) {
+ rxctrl = IXGBE_READ_REG(hw, IXGBE_RXCTRL);
+ if (rxctrl & IXGBE_RXCTRL_RXEN) {
+ rxctrl &= ~IXGBE_RXCTRL_RXEN;
+ IXGBE_WRITE_REG(hw, IXGBE_RXCTRL, rxctrl);
+ }
+ }
+ }
+}
+
+/**
+ * ixgbe_enter_lplu_x550em - Transition to low power states
+ * @hw: pointer to hardware structure
+ *
+ * Configures Low Power Link Up on transition to low power states
+ * (from D0 to non-D0). Link is required to enter LPLU so avoid resetting the
+ * X557 PHY immediately prior to entering LPLU.
+ **/
+s32 ixgbe_enter_lplu_t_x550em(struct ixgbe_hw *hw)
+{
+ u16 an_10g_cntl_reg, autoneg_reg, speed;
+ s32 status;
+ ixgbe_link_speed lcd_speed;
+ u32 save_autoneg;
+ bool link_up;
+
+ /* If blocked by MNG FW, then don't restart AN */
+ if (ixgbe_check_reset_blocked(hw))
+ return IXGBE_SUCCESS;
+
+ status = ixgbe_ext_phy_t_x550em_get_link(hw, &link_up);
+ if (status != IXGBE_SUCCESS)
+ return status;
+
+ status = ixgbe_read_eeprom(hw, NVM_INIT_CTRL_3, &hw->eeprom.ctrl_word_3);
+
+ if (status != IXGBE_SUCCESS)
+ return status;
+
+ /* If link is down, LPLU disabled in NVM, WoL disabled, or manageability
+ * disabled, then force link down by entering low power mode.
+ */
+ if (!link_up || !(hw->eeprom.ctrl_word_3 & NVM_INIT_CTRL_3_LPLU) ||
+ !(hw->wol_enabled || ixgbe_mng_present(hw)))
+ return ixgbe_set_copper_phy_power(hw, FALSE);
+
+ /* Determine LCD */
+ status = ixgbe_get_lcd_t_x550em(hw, &lcd_speed);
+
+ if (status != IXGBE_SUCCESS)
+ return status;
+
+ /* If no valid LCD link speed, then force link down and exit. */
+ if (lcd_speed == IXGBE_LINK_SPEED_UNKNOWN)
+ return ixgbe_set_copper_phy_power(hw, FALSE);
+
+ status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_VENDOR_STAT,
+ IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
+ &speed);
+
+ if (status != IXGBE_SUCCESS)
+ return status;
+
+ /* If no link now, speed is invalid so take link down */
+ status = ixgbe_ext_phy_t_x550em_get_link(hw, &link_up);
+ if (status != IXGBE_SUCCESS)
+ return ixgbe_set_copper_phy_power(hw, FALSE);
+
+ /* clear everything but the speed bits */
+ speed &= IXGBE_MDIO_AUTO_NEG_VEN_STAT_SPEED_MASK;
+
+ /* If current speed is already LCD, then exit. */
+ if (((speed == IXGBE_MDIO_AUTO_NEG_VENDOR_STATUS_1GB) &&
+ (lcd_speed == IXGBE_LINK_SPEED_1GB_FULL)) ||
+ ((speed == IXGBE_MDIO_AUTO_NEG_VENDOR_STATUS_10GB) &&
+ (lcd_speed == IXGBE_LINK_SPEED_10GB_FULL)))
+ return status;
+
+ /* Clear AN completed indication */
+ status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_VENDOR_TX_ALARM,
+ IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
+ &autoneg_reg);
+
+ if (status != IXGBE_SUCCESS)
+ return status;
+
+ status = hw->phy.ops.read_reg(hw, IXGBE_MII_10GBASE_T_AUTONEG_CTRL_REG,
+ IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
+ &an_10g_cntl_reg);
+
+ if (status != IXGBE_SUCCESS)
+ return status;
+
+ status = hw->phy.ops.read_reg(hw,
+ IXGBE_MII_AUTONEG_VENDOR_PROVISION_1_REG,
+ IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
+ &autoneg_reg);
+
+ if (status != IXGBE_SUCCESS)
+ return status;
+
+ save_autoneg = hw->phy.autoneg_advertised;
+
+ /* Setup link at least common link speed */
+ status = hw->mac.ops.setup_link(hw, lcd_speed, FALSE);
+
+ /* restore autoneg from before setting lplu speed */
+ hw->phy.autoneg_advertised = save_autoneg;
+
+ return status;
+}
+
+/**
+ * ixgbe_get_lcd_x550em - Determine lowest common denominator
+ * @hw: pointer to hardware structure
+ * @lcd_speed: pointer to lowest common link speed
+ *
+ * Determine lowest common link speed with link partner.
+ **/
+s32 ixgbe_get_lcd_t_x550em(struct ixgbe_hw *hw, ixgbe_link_speed *lcd_speed)
+{
+ u16 an_lp_status;
+ s32 status;
+ u16 word = hw->eeprom.ctrl_word_3;
+
+ *lcd_speed = IXGBE_LINK_SPEED_UNKNOWN;
+
+ status = hw->phy.ops.read_reg(hw, IXGBE_AUTO_NEG_LP_STATUS,
+ IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
+ &an_lp_status);
+
+ if (status != IXGBE_SUCCESS)
+ return status;
+
+ /* If link partner advertised 1G, return 1G */
+ if (an_lp_status & IXGBE_AUTO_NEG_LP_1000BASE_CAP) {
+ *lcd_speed = IXGBE_LINK_SPEED_1GB_FULL;
+ return status;
+ }
+
+ /* If 10G disabled for LPLU via NVM D10GMP, then return no valid LCD */
+ if ((hw->bus.lan_id && (word & NVM_INIT_CTRL_3_D10GMP_PORT1)) ||
+ (word & NVM_INIT_CTRL_3_D10GMP_PORT0))
+ return status;
+
+ /* Link partner not capable of lower speeds, return 10G */
+ *lcd_speed = IXGBE_LINK_SPEED_10GB_FULL;
+ return status;
+}
+
+/**
+ * ixgbe_setup_fc_X550em - Set up flow control
+ * @hw: pointer to hardware structure
+ *
+ * Called at init time to set up flow control.
+ **/
+s32 ixgbe_setup_fc_X550em(struct ixgbe_hw *hw)
+{
+ s32 ret_val = IXGBE_SUCCESS;
+ u32 pause, asm_dir, reg_val;
+
+ DEBUGFUNC("ixgbe_setup_fc_X550em");
+
+ /* Validate the requested mode */
+ if (hw->fc.strict_ieee && hw->fc.requested_mode == ixgbe_fc_rx_pause) {
+ ERROR_REPORT1(IXGBE_ERROR_UNSUPPORTED,
+ "ixgbe_fc_rx_pause not valid in strict IEEE mode\n");
+ ret_val = IXGBE_ERR_INVALID_LINK_SETTINGS;
+ goto out;
+ }
+
+ /* 10gig parts do not have a word in the EEPROM to determine the
+ * default flow control setting, so we explicitly set it to full.
+ */
+ if (hw->fc.requested_mode == ixgbe_fc_default)
+ hw->fc.requested_mode = ixgbe_fc_full;
+
+ /* Determine PAUSE and ASM_DIR bits. */
+ switch (hw->fc.requested_mode) {
+ case ixgbe_fc_none:
+ pause = 0;
+ asm_dir = 0;
+ break;
+ case ixgbe_fc_tx_pause:
+ pause = 0;
+ asm_dir = 1;
+ break;
+ case ixgbe_fc_rx_pause:
+ /* Rx Flow control is enabled and Tx Flow control is
+ * disabled by software override. Since there really
+ * isn't a way to advertise that we are capable of RX
+ * Pause ONLY, we will advertise that we support both
+ * symmetric and asymmetric Rx PAUSE, as such we fall
+ * through to the fc_full statement. Later, we will
+ * disable the adapter's ability to send PAUSE frames.
+ */
+ case ixgbe_fc_full:
+ pause = 1;
+ asm_dir = 1;
+ break;
+ default:
+ ERROR_REPORT1(IXGBE_ERROR_ARGUMENT,
+ "Flow control param set incorrectly\n");
+ ret_val = IXGBE_ERR_CONFIG;
+ goto out;
+ }
+
+ if (hw->phy.media_type == ixgbe_media_type_backplane) {
+ ret_val = ixgbe_read_iosf_sb_reg_x550(hw,
+ IXGBE_KRM_AN_CNTL_1(hw->bus.lan_id),
+ IXGBE_SB_IOSF_TARGET_KR_PHY, &reg_val);
+ if (ret_val != IXGBE_SUCCESS)
+ goto out;
+ reg_val &= ~(IXGBE_KRM_AN_CNTL_1_SYM_PAUSE |
+ IXGBE_KRM_AN_CNTL_1_ASM_PAUSE);
+ if (pause)
+ reg_val |= IXGBE_KRM_AN_CNTL_1_SYM_PAUSE;
+ if (asm_dir)
+ reg_val |= IXGBE_KRM_AN_CNTL_1_ASM_PAUSE;
+ ret_val = ixgbe_write_iosf_sb_reg_x550(hw,
+ IXGBE_KRM_AN_CNTL_1(hw->bus.lan_id),
+ IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
+
+ /* Not all devices fully support AN. */
+ if (hw->device_id == IXGBE_DEV_ID_X550EM_X_KR)
+ hw->fc.disable_fc_autoneg = TRUE;
+ }
+
+out:
+ return ret_val;
+}
+
+/**
+ * ixgbe_set_mux - Set mux for port 1 access with CS4227
+ * @hw: pointer to hardware structure
+ * @state: set mux if 1, clear if 0
+ */
+static void ixgbe_set_mux(struct ixgbe_hw *hw, u8 state)
+{
+ u32 esdp;
+
+ if (!hw->bus.lan_id)
+ return;
+ esdp = IXGBE_READ_REG(hw, IXGBE_ESDP);
+ if (state)
+ esdp |= IXGBE_ESDP_SDP1;
+ else
+ esdp &= ~IXGBE_ESDP_SDP1;
+ IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp);
+ IXGBE_WRITE_FLUSH(hw);
+}
+
+/**
+ * ixgbe_acquire_swfw_sync_X550em - Acquire SWFW semaphore
+ * @hw: pointer to hardware structure
+ * @mask: Mask to specify which semaphore to acquire
+ *
+ * Acquires the SWFW semaphore and sets the I2C MUX
+ **/
+s32 ixgbe_acquire_swfw_sync_X550em(struct ixgbe_hw *hw, u32 mask)
+{
+ s32 status;
+
+ DEBUGFUNC("ixgbe_acquire_swfw_sync_X550em");
+
+ status = ixgbe_acquire_swfw_sync_X540(hw, mask);
+ if (status)
+ return status;
+
+ if (mask & IXGBE_GSSR_I2C_MASK)
+ ixgbe_set_mux(hw, 1);
+
+ return IXGBE_SUCCESS;
+}
+
+/**
+ * ixgbe_release_swfw_sync_X550em - Release SWFW semaphore
+ * @hw: pointer to hardware structure
+ * @mask: Mask to specify which semaphore to release
+ *
+ * Releases the SWFW semaphore and sets the I2C MUX
+ **/
+void ixgbe_release_swfw_sync_X550em(struct ixgbe_hw *hw, u32 mask)
+{
+ DEBUGFUNC("ixgbe_release_swfw_sync_X550em");
+
+ if (mask & IXGBE_GSSR_I2C_MASK)
+ ixgbe_set_mux(hw, 0);
+
+ ixgbe_release_swfw_sync_X540(hw, mask);
+}
+
+/**
+ * ixgbe_handle_lasi_ext_t_x550em - Handle external Base T PHY interrupt
+ * @hw: pointer to hardware structure
+ *
+ * Handle external Base T PHY interrupt. If high temperature
+ * failure alarm then return error, else if link status change
+ * then setup internal/external PHY link
+ *
+ * Return IXGBE_ERR_OVERTEMP if interrupt is high temperature
+ * failure alarm, else return PHY access status.
+ */
+s32 ixgbe_handle_lasi_ext_t_x550em(struct ixgbe_hw *hw)
+{
+ bool lsc;
+ u32 status;
+
+ status = ixgbe_get_lasi_ext_t_x550em(hw, &lsc);
+
+ if (status != IXGBE_SUCCESS)
+ return status;
+
+ if (lsc)
+ return ixgbe_setup_internal_phy(hw);
+
+ return IXGBE_SUCCESS;
+}
+
+/**
+ * ixgbe_setup_mac_link_t_X550em - Sets the auto advertised link speed
+ * @hw: pointer to hardware structure
+ * @speed: new link speed
+ * @autoneg_wait_to_complete: TRUE when waiting for completion is needed
+ *
+ * Setup internal/external PHY link speed based on link speed, then set
+ * external PHY auto advertised link speed.
+ *
+ * Returns error status for any failure
+ **/
+s32 ixgbe_setup_mac_link_t_X550em(struct ixgbe_hw *hw,
+ ixgbe_link_speed speed,
+ bool autoneg_wait_to_complete)
+{
+ s32 status;
+ ixgbe_link_speed force_speed;
+
+ DEBUGFUNC("ixgbe_setup_mac_link_t_X550em");
+
+ /* Setup internal/external PHY link speed to iXFI (10G), unless
+ * only 1G is auto advertised then setup KX link.
+ */
+ if (speed & IXGBE_LINK_SPEED_10GB_FULL)
+ force_speed = IXGBE_LINK_SPEED_10GB_FULL;
+ else
+ force_speed = IXGBE_LINK_SPEED_1GB_FULL;
+
+ /* If internal link mode is XFI, then setup XFI internal link. */
+ if (!(hw->phy.nw_mng_if_sel & IXGBE_NW_MNG_IF_SEL_INT_PHY_MODE)) {
+ status = ixgbe_setup_ixfi_x550em(hw, &force_speed);
+
+ if (status != IXGBE_SUCCESS)
+ return status;
+ }
+
+ return hw->phy.ops.setup_link_speed(hw, speed, autoneg_wait_to_complete);
+}
+
+/**
+ * ixgbe_check_link_t_X550em - Determine link and speed status
+ * @hw: pointer to hardware structure
+ * @speed: pointer to link speed
+ * @link_up: TRUE when link is up
+ * @link_up_wait_to_complete: bool used to wait for link up or not
+ *
+ * Check that both the MAC and X557 external PHY have link.
+ **/
+s32 ixgbe_check_link_t_X550em(struct ixgbe_hw *hw, ixgbe_link_speed *speed,
+ bool *link_up, bool link_up_wait_to_complete)
+{
+ u32 status;
+ u16 autoneg_status;
+
+ if (hw->mac.ops.get_media_type(hw) != ixgbe_media_type_copper)
+ return IXGBE_ERR_CONFIG;
+
+ status = ixgbe_check_mac_link_generic(hw, speed, link_up,
+ link_up_wait_to_complete);
+
+ /* If check link fails or MAC link is not up, then return */
+ if (status != IXGBE_SUCCESS || !(*link_up))
+ return status;
+
+ /* MAC link is up, so check external PHY link.
+ * Read this twice back to back to indicate current status.
+ */
+ status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_STATUS,
+ IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
+ &autoneg_status);
+
+ if (status != IXGBE_SUCCESS)
+ return status;
+
+ status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_STATUS,
+ IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
+ &autoneg_status);
+
+ if (status != IXGBE_SUCCESS)
+ return status;
+
+ /* If external PHY link is not up, then indicate link not up */
+ if (!(autoneg_status & IXGBE_MDIO_AUTO_NEG_LINK_STATUS))
+ *link_up = FALSE;
+
+ return IXGBE_SUCCESS;
+}
+
+/**
+ * ixgbe_reset_phy_t_X550em - Performs X557 PHY reset and enables LASI
+ * @hw: pointer to hardware structure
+ **/
+s32 ixgbe_reset_phy_t_X550em(struct ixgbe_hw *hw)
+{
+ s32 status;
+
+ status = ixgbe_reset_phy_generic(hw);
+
+ if (status != IXGBE_SUCCESS)
+ return status;
+
+ /* Configure Link Status Alarm and Temperature Threshold interrupts */
+ return ixgbe_enable_lasi_ext_t_x550em(hw);
+}
+
+/**
+ * ixgbe_led_on_t_X550em - Turns on the software controllable LEDs.
+ * @hw: pointer to hardware structure
+ * @led_idx: led number to turn on
+ **/
+s32 ixgbe_led_on_t_X550em(struct ixgbe_hw *hw, u32 led_idx)
+{
+ u16 phy_data;
+
+ DEBUGFUNC("ixgbe_led_on_t_X550em");
+
+ if (led_idx >= IXGBE_X557_MAX_LED_INDEX)
+ return IXGBE_ERR_PARAM;
+
+ /* To turn on the LED, set mode to ON. */
+ ixgbe_read_phy_reg(hw, IXGBE_X557_LED_PROVISIONING + led_idx,
+ IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, &phy_data);
+ phy_data |= IXGBE_X557_LED_MANUAL_SET_MASK;
+ ixgbe_write_phy_reg(hw, IXGBE_X557_LED_PROVISIONING + led_idx,
+ IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, phy_data);
+
+ return IXGBE_SUCCESS;
+}
+
+/**
+ * ixgbe_led_off_t_X550em - Turns off the software controllable LEDs.
+ * @hw: pointer to hardware structure
+ * @led_idx: led number to turn off
+ **/
+s32 ixgbe_led_off_t_X550em(struct ixgbe_hw *hw, u32 led_idx)
+{
+ u16 phy_data;
+
+ DEBUGFUNC("ixgbe_led_off_t_X550em");
+
+ if (led_idx >= IXGBE_X557_MAX_LED_INDEX)
+ return IXGBE_ERR_PARAM;
+
+ /* To turn on the LED, set mode to ON. */
+ ixgbe_read_phy_reg(hw, IXGBE_X557_LED_PROVISIONING + led_idx,
+ IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, &phy_data);
+ phy_data &= ~IXGBE_X557_LED_MANUAL_SET_MASK;
+ ixgbe_write_phy_reg(hw, IXGBE_X557_LED_PROVISIONING + led_idx,
+ IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, phy_data);
+
+ return IXGBE_SUCCESS;
+}
+
diff --git a/sys/dev/ixgbe/ixgbe_x550.h b/sys/dev/ixgbe/ixgbe_x550.h
new file mode 100644
index 0000000..8a544ec
--- /dev/null
+++ b/sys/dev/ixgbe/ixgbe_x550.h
@@ -0,0 +1,109 @@
+/******************************************************************************
+
+ Copyright (c) 2001-2015, Intel Corporation
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ 3. Neither the name of the Intel Corporation nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+******************************************************************************/
+/*$FreeBSD$*/
+
+#ifndef _IXGBE_X550_H_
+#define _IXGBE_X550_H_
+
+#include "ixgbe_type.h"
+
+s32 ixgbe_dmac_config_X550(struct ixgbe_hw *hw);
+s32 ixgbe_dmac_config_tcs_X550(struct ixgbe_hw *hw);
+s32 ixgbe_dmac_update_tcs_X550(struct ixgbe_hw *hw);
+
+s32 ixgbe_get_bus_info_X550em(struct ixgbe_hw *hw);
+s32 ixgbe_init_eeprom_params_X550(struct ixgbe_hw *hw);
+s32 ixgbe_update_eeprom_checksum_X550(struct ixgbe_hw *hw);
+s32 ixgbe_calc_eeprom_checksum_X550(struct ixgbe_hw *hw);
+s32 ixgbe_calc_checksum_X550(struct ixgbe_hw *hw, u16 *buffer, u32 buffer_size);
+s32 ixgbe_validate_eeprom_checksum_X550(struct ixgbe_hw *hw, u16 *checksum_val);
+s32 ixgbe_update_flash_X550(struct ixgbe_hw *hw);
+s32 ixgbe_write_ee_hostif_buffer_X550(struct ixgbe_hw *hw,
+ u16 offset, u16 words, u16 *data);
+s32 ixgbe_write_ee_hostif_X550(struct ixgbe_hw *hw, u16 offset,
+ u16 data);
+s32 ixgbe_read_ee_hostif_buffer_X550(struct ixgbe_hw *hw,
+ u16 offset, u16 words, u16 *data);
+s32 ixgbe_read_ee_hostif_X550(struct ixgbe_hw *hw, u16 offset,
+u16 *data);
+s32 ixgbe_read_ee_hostif_data_X550(struct ixgbe_hw *hw, u16 offset,
+ u16 *data);
+s32 ixgbe_write_ee_hostif_data_X550(struct ixgbe_hw *hw, u16 offset,
+ u16 data);
+s32 ixgbe_set_eee_X550(struct ixgbe_hw *hw, bool enable_eee);
+s32 ixgbe_setup_eee_X550(struct ixgbe_hw *hw, bool enable_eee);
+void ixgbe_set_source_address_pruning_X550(struct ixgbe_hw *hw, bool enable,
+ unsigned int pool);
+void ixgbe_set_ethertype_anti_spoofing_X550(struct ixgbe_hw *hw,
+ bool enable, int vf);
+s32 ixgbe_write_iosf_sb_reg_x550(struct ixgbe_hw *hw, u32 reg_addr,
+ u32 device_type, u32 data);
+s32 ixgbe_read_iosf_sb_reg_x550(struct ixgbe_hw *hw, u32 reg_addr,
+ u32 device_type, u32 *data);
+void ixgbe_disable_mdd_X550(struct ixgbe_hw *hw);
+void ixgbe_enable_mdd_X550(struct ixgbe_hw *hw);
+void ixgbe_mdd_event_X550(struct ixgbe_hw *hw, u32 *vf_bitmap);
+void ixgbe_restore_mdd_vf_X550(struct ixgbe_hw *hw, u32 vf);
+enum ixgbe_media_type ixgbe_get_media_type_X550em(struct ixgbe_hw *hw);
+s32 ixgbe_setup_sfp_modules_X550em(struct ixgbe_hw *hw);
+s32 ixgbe_get_link_capabilities_X550em(struct ixgbe_hw *hw,
+ ixgbe_link_speed *speed, bool *autoneg);
+void ixgbe_init_mac_link_ops_X550em(struct ixgbe_hw *hw);
+s32 ixgbe_reset_hw_X550em(struct ixgbe_hw *hw);
+s32 ixgbe_init_phy_ops_X550em(struct ixgbe_hw *hw);
+s32 ixgbe_setup_kr_x550em(struct ixgbe_hw *hw);
+s32 ixgbe_setup_kx4_x550em(struct ixgbe_hw *hw);
+s32 ixgbe_init_ext_t_x550em(struct ixgbe_hw *hw);
+s32 ixgbe_setup_internal_phy_t_x550em(struct ixgbe_hw *hw);
+s32 ixgbe_setup_phy_loopback_x550em(struct ixgbe_hw *hw);
+u32 ixgbe_get_supported_physical_layer_X550em(struct ixgbe_hw *hw);
+void ixgbe_disable_rx_x550(struct ixgbe_hw *hw);
+s32 ixgbe_get_lcd_t_x550em(struct ixgbe_hw *hw, ixgbe_link_speed *lcd_speed);
+s32 ixgbe_enter_lplu_t_x550em(struct ixgbe_hw *hw);
+s32 ixgbe_acquire_swfw_sync_X550em(struct ixgbe_hw *hw, u32 mask);
+void ixgbe_release_swfw_sync_X550em(struct ixgbe_hw *hw, u32 mask);
+s32 ixgbe_setup_fc_X550em(struct ixgbe_hw *hw);
+s32 ixgbe_setup_mac_link_sfp_x550em(struct ixgbe_hw *hw,
+ ixgbe_link_speed speed,
+ bool autoneg_wait_to_complete);
+s32 ixgbe_handle_lasi_ext_t_x550em(struct ixgbe_hw *hw);
+s32 ixgbe_setup_mac_link_t_X550em(struct ixgbe_hw *hw,
+ ixgbe_link_speed speed,
+ bool autoneg_wait_to_complete);
+s32 ixgbe_check_link_t_X550em(struct ixgbe_hw *hw, ixgbe_link_speed *speed,
+ bool *link_up, bool link_up_wait_to_complete);
+s32 ixgbe_reset_phy_t_X550em(struct ixgbe_hw *hw);
+s32 ixgbe_identify_sfp_module_X550em(struct ixgbe_hw *hw);
+s32 ixgbe_led_on_t_X550em(struct ixgbe_hw *hw, u32 led_idx);
+s32 ixgbe_led_off_t_X550em(struct ixgbe_hw *hw, u32 led_idx);
+#endif /* _IXGBE_X550_H_ */
diff --git a/sys/dev/ixl/ixl.h b/sys/dev/ixl/ixl.h
index df8f04f..1ddfbca3 100644
--- a/sys/dev/ixl/ixl.h
+++ b/sys/dev/ixl/ixl.h
@@ -324,7 +324,7 @@
#define IXL_SET_IMCASTS(vsi, count) (vsi)->imcasts = (count)
#define IXL_SET_OMCASTS(vsi, count) (vsi)->omcasts = (count)
#define IXL_SET_IQDROPS(vsi, count) (vsi)->iqdrops = (count)
-#define IXL_SET_OQDROPS(vsi, count) (vsi)->iqdrops = (count)
+#define IXL_SET_OQDROPS(vsi, count) (vsi)->oqdrops = (count)
#define IXL_SET_NOPROTO(vsi, count) (vsi)->noproto = (count)
#else
#define IXL_SET_IPACKETS(vsi, count) (vsi)->ifp->if_ipackets = (count)
diff --git a/sys/dev/mii/acphy.c b/sys/dev/mii/acphy.c
index edb5221..6eb58ce 100644
--- a/sys/dev/mii/acphy.c
+++ b/sys/dev/mii/acphy.c
@@ -139,14 +139,12 @@ acphy_attach(device_t dev)
sc->mii_capabilities = PHY_READ(sc, MII_BMSR) & sc->mii_capmask;
device_printf(dev, " ");
-#define ADD(m, c) ifmedia_add(&sc->mii_pdata->mii_media, (m), (c), NULL)
+#define ADD(m) ifmedia_add(&sc->mii_pdata->mii_media, (m), 0, NULL)
if ((PHY_READ(sc, MII_ACPHY_MCTL) & AC_MCTL_FX_SEL) != 0) {
sc->mii_flags |= MIIF_HAVEFIBER;
- ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_FX, 0, sc->mii_inst),
- MII_MEDIA_100_TX);
+ ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_FX, 0, sc->mii_inst));
printf("100baseFX, ");
- ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_FX, IFM_FDX, sc->mii_inst),
- MII_MEDIA_100_TX_FDX);
+ ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_FX, IFM_FDX, sc->mii_inst));
printf("100baseFX-FDX, ");
}
#undef ADD
diff --git a/sys/dev/mii/brgphy.c b/sys/dev/mii/brgphy.c
index 54beed4..32914a3 100644
--- a/sys/dev/mii/brgphy.c
+++ b/sys/dev/mii/brgphy.c
@@ -160,25 +160,33 @@ static const struct mii_phy_funcs brgphy_funcs = {
brgphy_reset
};
-#define HS21_PRODUCT_ID "IBM eServer BladeCenter HS21"
-#define HS21_BCM_CHIPID 0x57081021
+static const struct hs21_type {
+ const uint32_t id;
+ const char *prod;
+} hs21_type_lists[] = {
+ { 0x57081021, "IBM eServer BladeCenter HS21" },
+ { 0x57081011, "IBM eServer BladeCenter HS21 -[8853PAU]-" },
+};
static int
detect_hs21(struct bce_softc *bce_sc)
{
char *sysenv;
- int found;
+ int found, i;
found = 0;
- if (bce_sc->bce_chipid == HS21_BCM_CHIPID) {
- sysenv = kern_getenv("smbios.system.product");
- if (sysenv != NULL) {
- if (strncmp(sysenv, HS21_PRODUCT_ID,
- strlen(HS21_PRODUCT_ID)) == 0)
- found = 1;
- freeenv(sysenv);
+ sysenv = kern_getenv("smbios.system.product");
+ if (sysenv == NULL)
+ return (found);
+ for (i = 0; i < nitems(hs21_type_lists); i++) {
+ if (bce_sc->bce_chipid == hs21_type_lists[i].id &&
+ strncmp(sysenv, hs21_type_lists[i].prod,
+ strlen(hs21_type_lists[i].prod)) == 0) {
+ found++;
+ break;
}
}
+ freeenv(sysenv);
return (found);
}
@@ -266,20 +274,25 @@ brgphy_attach(device_t dev)
sc->mii_extcapabilities = PHY_READ(sc, MII_EXTSR);
device_printf(dev, " ");
-#define ADD(m, c) ifmedia_add(&sc->mii_pdata->mii_media, (m), (c), NULL)
-
/* Add the supported media types */
if ((sc->mii_flags & MIIF_HAVEFIBER) == 0) {
mii_phy_add_media(sc);
printf("\n");
} else {
sc->mii_anegticks = MII_ANEGTICKS_GIGE;
- ADD(IFM_MAKEWORD(IFM_ETHER, IFM_1000_SX, IFM_FDX, sc->mii_inst),
- BRGPHY_S1000 | BRGPHY_BMCR_FDX);
+ ifmedia_add(&sc->mii_pdata->mii_media,
+ IFM_MAKEWORD(IFM_ETHER, IFM_1000_SX, IFM_FDX, sc->mii_inst),
+ 0, NULL);
printf("1000baseSX-FDX, ");
- /* 2.5G support is a software enabled feature on the 5708S and 5709S. */
- if (bce_sc && (bce_sc->bce_phy_flags & BCE_PHY_2_5G_CAPABLE_FLAG)) {
- ADD(IFM_MAKEWORD(IFM_ETHER, IFM_2500_SX, IFM_FDX, sc->mii_inst), 0);
+ /*
+ * 2.5G support is a software enabled feature
+ * on the 5708S and 5709S.
+ */
+ if (bce_sc && (bce_sc->bce_phy_flags &
+ BCE_PHY_2_5G_CAPABLE_FLAG)) {
+ ifmedia_add(&sc->mii_pdata->mii_media,
+ IFM_MAKEWORD(IFM_ETHER, IFM_2500_SX, IFM_FDX,
+ sc->mii_inst), 0, NULL);
printf("2500baseSX-FDX, ");
} else if ((bsc->serdes_flags & BRGPHY_5708S) && bce_sc &&
(detect_hs21(bce_sc) != 0)) {
@@ -295,11 +308,11 @@ brgphy_attach(device_t dev)
printf("auto-neg workaround, ");
bsc->serdes_flags |= BRGPHY_NOANWAIT;
}
- ADD(IFM_MAKEWORD(IFM_ETHER, IFM_AUTO, 0, sc->mii_inst), 0);
+ ifmedia_add(&sc->mii_pdata->mii_media, IFM_MAKEWORD(IFM_ETHER,
+ IFM_AUTO, 0, sc->mii_inst), 0, NULL);
printf("auto\n");
}
-#undef ADD
MIIBUS_MEDIAINIT(sc->mii_dev);
return (0);
}
diff --git a/sys/dev/mii/lxtphy.c b/sys/dev/mii/lxtphy.c
index d673f2c..a796b11 100644
--- a/sys/dev/mii/lxtphy.c
+++ b/sys/dev/mii/lxtphy.c
@@ -142,12 +142,10 @@ lxtphy_attach(device_t dev)
sc->mii_capabilities = PHY_READ(sc, MII_BMSR) & sc->mii_capmask;
device_printf(dev, " ");
-#define ADD(m, c) ifmedia_add(&sc->mii_pdata->mii_media, (m), (c), NULL)
- ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_FX, 0, sc->mii_inst),
- MII_MEDIA_100_TX);
+#define ADD(m) ifmedia_add(&sc->mii_pdata->mii_media, (m), 0, NULL)
+ ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_FX, 0, sc->mii_inst));
printf("100baseFX, ");
- ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_FX, IFM_FDX, sc->mii_inst),
- MII_MEDIA_100_TX_FDX);
+ ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_FX, IFM_FDX, sc->mii_inst));
printf("100baseFX-FDX, ");
#undef ADD
diff --git a/sys/dev/mii/mii_physubr.c b/sys/dev/mii/mii_physubr.c
index 43e7a10..84f4f44 100644
--- a/sys/dev/mii/mii_physubr.c
+++ b/sys/dev/mii/mii_physubr.c
@@ -54,9 +54,28 @@ __FBSDID("$FreeBSD$");
#include "miibus_if.h"
/*
- * Media to register setting conversion table. Order matters.
+ *
+ * An array of structures to map MII media types to BMCR/ANAR settings.
*/
-static const struct mii_media mii_media_table[MII_NMEDIA] = {
+enum {
+ MII_MEDIA_NONE = 0,
+ MII_MEDIA_10_T,
+ MII_MEDIA_10_T_FDX,
+ MII_MEDIA_100_T4,
+ MII_MEDIA_100_TX,
+ MII_MEDIA_100_TX_FDX,
+ MII_MEDIA_1000_X,
+ MII_MEDIA_1000_X_FDX,
+ MII_MEDIA_1000_T,
+ MII_MEDIA_1000_T_FDX,
+ MII_NMEDIA,
+};
+
+static const struct mii_media {
+ u_int mm_bmcr; /* BMCR settings for this media */
+ u_int mm_anar; /* ANAR settings for this media */
+ u_int mm_gtcr; /* 100base-T2 or 1000base-T CR */
+} mii_media_table[MII_NMEDIA] = {
/* None */
{ BMCR_ISO, ANAR_CSMA,
0, },
@@ -104,8 +123,10 @@ mii_phy_setmedia(struct mii_softc *sc)
struct mii_data *mii = sc->mii_pdata;
struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
int bmcr, anar, gtcr;
+ int index = -1;
- if (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO) {
+ switch (IFM_SUBTYPE(ife->ifm_media)) {
+ case IFM_AUTO:
/*
* Force renegotiation if MIIF_DOPAUSE or MIIF_FORCEANEG.
* The former is necessary as we might switch from flow-
@@ -115,19 +136,78 @@ mii_phy_setmedia(struct mii_softc *sc)
(sc->mii_flags & (MIIF_DOPAUSE | MIIF_FORCEANEG)) != 0)
(void)mii_phy_auto(sc);
return;
- }
- /*
- * Table index is stored in the media entry.
- */
+ case IFM_NONE:
+ index = MII_MEDIA_NONE;
+ break;
+
+ case IFM_HPNA_1:
+ index = MII_MEDIA_10_T;
+ break;
+
+ case IFM_10_T:
+ switch (IFM_OPTIONS(ife->ifm_media)) {
+ case 0:
+ index = MII_MEDIA_10_T;
+ break;
+ case IFM_FDX:
+ case (IFM_FDX | IFM_FLOW):
+ index = MII_MEDIA_10_T_FDX;
+ break;
+ };
+ break;
+
+ case IFM_100_TX:
+ case IFM_100_FX:
+ switch (IFM_OPTIONS(ife->ifm_media)) {
+ case 0:
+ index = MII_MEDIA_100_TX;
+ break;
+ case IFM_FDX:
+ case (IFM_FDX | IFM_FLOW):
+ index = MII_MEDIA_100_TX_FDX;
+ break;
+ }
+ break;
+
+ case IFM_100_T4:
+ index = MII_MEDIA_100_T4;
+ break;
+
+ case IFM_1000_SX:
+ switch (IFM_OPTIONS(ife->ifm_media)) {
+ case 0:
+ index = MII_MEDIA_1000_X;
+ break;
+ case IFM_FDX:
+ case (IFM_FDX | IFM_FLOW):
+ index = MII_MEDIA_1000_X_FDX;
+ break;
+ }
+ break;
+
+ case IFM_1000_T:
+ switch (IFM_OPTIONS(ife->ifm_media)) {
+ case 0:
+ case IFM_ETH_MASTER:
+ index = MII_MEDIA_1000_T;
+ break;
+ case IFM_FDX:
+ case (IFM_FDX | IFM_ETH_MASTER):
+ case (IFM_FDX | IFM_FLOW):
+ case (IFM_FDX | IFM_FLOW | IFM_ETH_MASTER):
+ index = MII_MEDIA_1000_T_FDX;
+ break;
+ }
+ break;
+ }
- KASSERT(ife->ifm_data >=0 && ife->ifm_data < MII_NMEDIA,
- ("invalid ife->ifm_data (0x%x) in mii_phy_setmedia",
- ife->ifm_data));
+ KASSERT(index != -1, ("%s: failed to map media word %d",
+ __func__, ife->ifm_media));
- anar = mii_media_table[ife->ifm_data].mm_anar;
- bmcr = mii_media_table[ife->ifm_data].mm_bmcr;
- gtcr = mii_media_table[ife->ifm_data].mm_gtcr;
+ anar = mii_media_table[index].mm_anar;
+ bmcr = mii_media_table[index].mm_bmcr;
+ gtcr = mii_media_table[index].mm_gtcr;
if (IFM_SUBTYPE(ife->ifm_media) == IFM_1000_T) {
gtcr |= GTCR_MAN_MS;
@@ -318,12 +398,11 @@ mii_phy_add_media(struct mii_softc *sc)
*/
sc->mii_anegticks = MII_ANEGTICKS;
-#define ADD(m, c) ifmedia_add(&mii->mii_media, (m), (c), NULL)
+#define ADD(m) ifmedia_add(&mii->mii_media, (m), 0, NULL)
#define PRINT(s) printf("%s%s", sep, s); sep = ", "
if ((sc->mii_flags & MIIF_NOISOLATE) == 0) {
- ADD(IFM_MAKEWORD(IFM_ETHER, IFM_NONE, 0, sc->mii_inst),
- MII_MEDIA_NONE);
+ ADD(IFM_MAKEWORD(IFM_ETHER, IFM_NONE, 0, sc->mii_inst));
PRINT("none");
}
@@ -335,51 +414,44 @@ mii_phy_add_media(struct mii_softc *sc)
if ((sc->mii_flags & MIIF_IS_HPNA) != 0) {
if ((sc->mii_capabilities & BMSR_10THDX) != 0) {
ADD(IFM_MAKEWORD(IFM_ETHER, IFM_HPNA_1, 0,
- sc->mii_inst), MII_MEDIA_10_T);
+ sc->mii_inst));
PRINT("HomePNA1");
}
return;
}
if ((sc->mii_capabilities & BMSR_10THDX) != 0) {
- ADD(IFM_MAKEWORD(IFM_ETHER, IFM_10_T, 0, sc->mii_inst),
- MII_MEDIA_10_T);
+ ADD(IFM_MAKEWORD(IFM_ETHER, IFM_10_T, 0, sc->mii_inst));
PRINT("10baseT");
}
if ((sc->mii_capabilities & BMSR_10TFDX) != 0) {
- ADD(IFM_MAKEWORD(IFM_ETHER, IFM_10_T, IFM_FDX, sc->mii_inst),
- MII_MEDIA_10_T_FDX);
+ ADD(IFM_MAKEWORD(IFM_ETHER, IFM_10_T, IFM_FDX, sc->mii_inst));
PRINT("10baseT-FDX");
if ((sc->mii_flags & MIIF_DOPAUSE) != 0 &&
(sc->mii_flags & MIIF_NOMANPAUSE) == 0) {
ADD(IFM_MAKEWORD(IFM_ETHER, IFM_10_T,
- IFM_FDX | IFM_FLOW, sc->mii_inst),
- MII_MEDIA_10_T_FDX);
+ IFM_FDX | IFM_FLOW, sc->mii_inst));
PRINT("10baseT-FDX-flow");
}
fdx = 1;
}
if ((sc->mii_capabilities & BMSR_100TXHDX) != 0) {
- ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_TX, 0, sc->mii_inst),
- MII_MEDIA_100_TX);
+ ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_TX, 0, sc->mii_inst));
PRINT("100baseTX");
}
if ((sc->mii_capabilities & BMSR_100TXFDX) != 0) {
- ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_TX, IFM_FDX, sc->mii_inst),
- MII_MEDIA_100_TX_FDX);
+ ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_TX, IFM_FDX, sc->mii_inst));
PRINT("100baseTX-FDX");
if ((sc->mii_flags & MIIF_DOPAUSE) != 0 &&
(sc->mii_flags & MIIF_NOMANPAUSE) == 0) {
ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_TX,
- IFM_FDX | IFM_FLOW, sc->mii_inst),
- MII_MEDIA_100_TX_FDX);
+ IFM_FDX | IFM_FLOW, sc->mii_inst));
PRINT("100baseTX-FDX-flow");
}
fdx = 1;
}
if ((sc->mii_capabilities & BMSR_100T4) != 0) {
- ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_T4, 0, sc->mii_inst),
- MII_MEDIA_100_T4);
+ ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_T4, 0, sc->mii_inst));
PRINT("100baseT4");
}
@@ -392,20 +464,19 @@ mii_phy_add_media(struct mii_softc *sc)
sc->mii_anegticks = MII_ANEGTICKS_GIGE;
sc->mii_flags |= MIIF_IS_1000X;
ADD(IFM_MAKEWORD(IFM_ETHER, IFM_1000_SX, 0,
- sc->mii_inst), MII_MEDIA_1000_X);
+ sc->mii_inst));
PRINT("1000baseSX");
}
if ((sc->mii_extcapabilities & EXTSR_1000XFDX) != 0) {
sc->mii_anegticks = MII_ANEGTICKS_GIGE;
sc->mii_flags |= MIIF_IS_1000X;
ADD(IFM_MAKEWORD(IFM_ETHER, IFM_1000_SX, IFM_FDX,
- sc->mii_inst), MII_MEDIA_1000_X_FDX);
+ sc->mii_inst));
PRINT("1000baseSX-FDX");
if ((sc->mii_flags & MIIF_DOPAUSE) != 0 &&
(sc->mii_flags & MIIF_NOMANPAUSE) == 0) {
ADD(IFM_MAKEWORD(IFM_ETHER, IFM_1000_SX,
- IFM_FDX | IFM_FLOW, sc->mii_inst),
- MII_MEDIA_1000_X_FDX);
+ IFM_FDX | IFM_FLOW, sc->mii_inst));
PRINT("1000baseSX-FDX-flow");
}
fdx = 1;
@@ -421,31 +492,29 @@ mii_phy_add_media(struct mii_softc *sc)
sc->mii_anegticks = MII_ANEGTICKS_GIGE;
sc->mii_flags |= MIIF_HAVE_GTCR;
ADD(IFM_MAKEWORD(IFM_ETHER, IFM_1000_T, 0,
- sc->mii_inst), MII_MEDIA_1000_T);
+ sc->mii_inst));
PRINT("1000baseT");
ADD(IFM_MAKEWORD(IFM_ETHER, IFM_1000_T,
- IFM_ETH_MASTER, sc->mii_inst), MII_MEDIA_1000_T);
+ IFM_ETH_MASTER, sc->mii_inst));
PRINT("1000baseT-master");
}
if ((sc->mii_extcapabilities & EXTSR_1000TFDX) != 0) {
sc->mii_anegticks = MII_ANEGTICKS_GIGE;
sc->mii_flags |= MIIF_HAVE_GTCR;
ADD(IFM_MAKEWORD(IFM_ETHER, IFM_1000_T, IFM_FDX,
- sc->mii_inst), MII_MEDIA_1000_T_FDX);
+ sc->mii_inst));
PRINT("1000baseT-FDX");
ADD(IFM_MAKEWORD(IFM_ETHER, IFM_1000_T,
- IFM_FDX | IFM_ETH_MASTER, sc->mii_inst),
- MII_MEDIA_1000_T_FDX);
+ IFM_FDX | IFM_ETH_MASTER, sc->mii_inst));
PRINT("1000baseT-FDX-master");
if ((sc->mii_flags & MIIF_DOPAUSE) != 0 &&
(sc->mii_flags & MIIF_NOMANPAUSE) == 0) {
ADD(IFM_MAKEWORD(IFM_ETHER, IFM_1000_T,
- IFM_FDX | IFM_FLOW, sc->mii_inst),
- MII_MEDIA_1000_T_FDX);
+ IFM_FDX | IFM_FLOW, sc->mii_inst));
PRINT("1000baseT-FDX-flow");
ADD(IFM_MAKEWORD(IFM_ETHER, IFM_1000_T,
IFM_FDX | IFM_FLOW | IFM_ETH_MASTER,
- sc->mii_inst), MII_MEDIA_1000_T_FDX);
+ sc->mii_inst));
PRINT("1000baseT-FDX-flow-master");
}
fdx = 1;
@@ -454,12 +523,11 @@ mii_phy_add_media(struct mii_softc *sc)
if ((sc->mii_capabilities & BMSR_ANEG) != 0) {
/* intentionally invalid index */
- ADD(IFM_MAKEWORD(IFM_ETHER, IFM_AUTO, 0, sc->mii_inst),
- MII_NMEDIA);
+ ADD(IFM_MAKEWORD(IFM_ETHER, IFM_AUTO, 0, sc->mii_inst));
PRINT("auto");
if (fdx != 0 && (sc->mii_flags & MIIF_DOPAUSE) != 0) {
ADD(IFM_MAKEWORD(IFM_ETHER, IFM_AUTO, IFM_FLOW,
- sc->mii_inst), MII_NMEDIA);
+ sc->mii_inst));
PRINT("auto-flow");
}
}
diff --git a/sys/dev/mii/miivar.h b/sys/dev/mii/miivar.h
index bc2a91c..498e720 100644
--- a/sys/dev/mii/miivar.h
+++ b/sys/dev/mii/miivar.h
@@ -180,27 +180,6 @@ struct mii_phydesc {
MII_STR_ ## a ## _ ## b }
#define MII_PHY_END { 0, 0, NULL }
-/*
- * An array of these structures map MII media types to BMCR/ANAR settings.
- */
-struct mii_media {
- u_int mm_bmcr; /* BMCR settings for this media */
- u_int mm_anar; /* ANAR settings for this media */
- u_int mm_gtcr; /* 100base-T2 or 1000base-T CR */
-};
-
-#define MII_MEDIA_NONE 0
-#define MII_MEDIA_10_T 1
-#define MII_MEDIA_10_T_FDX 2
-#define MII_MEDIA_100_T4 3
-#define MII_MEDIA_100_TX 4
-#define MII_MEDIA_100_TX_FDX 5
-#define MII_MEDIA_1000_X 6
-#define MII_MEDIA_1000_X_FDX 7
-#define MII_MEDIA_1000_T 8
-#define MII_MEDIA_1000_T_FDX 9
-#define MII_NMEDIA 10
-
#ifdef _KERNEL
#define PHY_READ(p, r) \
diff --git a/sys/dev/mii/mlphy.c b/sys/dev/mii/mlphy.c
index fbb3481..89b4f2c 100644
--- a/sys/dev/mii/mlphy.c
+++ b/sys/dev/mii/mlphy.c
@@ -220,29 +220,11 @@ mlphy_service(xsc, mii, cmd)
msc->ml_linked = 0;
return (0);
case IFM_10_T:
- /*
- * For 10baseT modes, reset and program the
- * companion PHY (of any), then program ourselves
- * to match. This will put us in pass-through
- * mode and let the companion PHY do all the
- * work.
- *
- * BMCR data is stored in the ifmedia entry.
- */
- if (other != NULL) {
- PHY_RESET(other);
- PHY_WRITE(other, MII_BMCR, ife->ifm_data);
- }
- mii_phy_setmedia(sc);
- msc->ml_state = 0;
- break;
case IFM_100_TX:
/*
- * For 100baseTX modes, reset and isolate the
- * companion PHY (if any), then program ourselves
+ * For 10baseT and 100baseTX modes, reset and isolate
+ * the companion PHY (if any), then program ourselves
* accordingly.
- *
- * BMCR data is stored in the ifmedia entry.
*/
if (other != NULL) {
PHY_RESET(other);
diff --git a/sys/dev/mii/xmphy.c b/sys/dev/mii/xmphy.c
index 2e2fff9..8c35aa5 100644
--- a/sys/dev/mii/xmphy.c
+++ b/sys/dev/mii/xmphy.c
@@ -116,16 +116,15 @@ xmphy_attach(device_t dev)
PHY_RESET(sc);
-#define ADD(m, c) ifmedia_add(&sc->mii_pdata->mii_media, (m), (c), NULL)
+#define ADD(m) ifmedia_add(&sc->mii_pdata->mii_media, (m), 0, NULL)
#define PRINT(s) printf("%s%s", sep, s); sep = ", "
device_printf(dev, " ");
- ADD(IFM_MAKEWORD(IFM_ETHER, IFM_1000_SX, 0, sc->mii_inst),
- XMPHY_BMCR_FDX);
+ ADD(IFM_MAKEWORD(IFM_ETHER, IFM_1000_SX, 0, sc->mii_inst));
PRINT("1000baseSX");
- ADD(IFM_MAKEWORD(IFM_ETHER, IFM_1000_SX, IFM_FDX, sc->mii_inst), 0);
+ ADD(IFM_MAKEWORD(IFM_ETHER, IFM_1000_SX, IFM_FDX, sc->mii_inst));
PRINT("1000baseSX-FDX");
- ADD(IFM_MAKEWORD(IFM_ETHER, IFM_AUTO, 0, sc->mii_inst), 0);
+ ADD(IFM_MAKEWORD(IFM_ETHER, IFM_AUTO, 0, sc->mii_inst));
PRINT("auto");
printf("\n");
diff --git a/sys/dev/mxge/if_mxge.c b/sys/dev/mxge/if_mxge.c
index fe8c08a..983caa3 100644
--- a/sys/dev/mxge/if_mxge.c
+++ b/sys/dev/mxge/if_mxge.c
@@ -46,6 +46,7 @@ __FBSDID("$FreeBSD$");
#include <sys/sysctl.h>
#include <sys/sx.h>
#include <sys/taskqueue.h>
+#include <sys/zlib.h>
#include <net/if.h>
#include <net/if_var.h>
@@ -58,7 +59,6 @@ __FBSDID("$FreeBSD$");
#include <net/if_types.h>
#include <net/if_vlan_var.h>
-#include <net/zlib.h>
#include <netinet/in_systm.h>
#include <netinet/in.h>
diff --git a/sys/dev/netmap/netmap.c b/sys/dev/netmap/netmap.c
index 5401df3..11229cc 100644
--- a/sys/dev/netmap/netmap.c
+++ b/sys/dev/netmap/netmap.c
@@ -2710,11 +2710,17 @@ netmap_attach(struct netmap_adapter *arg)
}
#endif /* linux */
+#ifdef __FreeBSD__
+ if_printf(ifp, "netmap queues/slots: TX %d/%d, RX %d/%d\n",
+ hwna->up.num_tx_rings, hwna->up.num_tx_desc,
+ hwna->up.num_rx_rings, hwna->up.num_rx_desc);
+#else
D("success for %s tx %d/%d rx %d/%d queues/slots",
hwna->up.name,
hwna->up.num_tx_rings, hwna->up.num_tx_desc,
hwna->up.num_rx_rings, hwna->up.num_rx_desc
);
+#endif
return 0;
fail:
diff --git a/sys/dev/nvme/nvme.c b/sys/dev/nvme/nvme.c
index 464d851..329c5e5 100644
--- a/sys/dev/nvme/nvme.c
+++ b/sys/dev/nvme/nvme.c
@@ -81,27 +81,54 @@ MODULE_VERSION(nvme, 1);
static struct _pcsid
{
- u_int32_t type;
- const char *desc;
+ uint32_t devid;
+ int match_subdevice;
+ uint16_t subdevice;
+ const char *desc;
} pci_ids[] = {
- { 0x01118086, "NVMe Controller" },
- { CHATHAM_PCI_ID, "Chatham Prototype NVMe Controller" },
- { IDT32_PCI_ID, "IDT NVMe Controller (32 channel)" },
- { IDT8_PCI_ID, "IDT NVMe Controller (8 channel)" },
- { 0x00000000, NULL }
+ { 0x01118086, 0, 0, "NVMe Controller" },
+ { IDT32_PCI_ID, 0, 0, "IDT NVMe Controller (32 channel)" },
+ { IDT8_PCI_ID, 0, 0, "IDT NVMe Controller (8 channel)" },
+ { 0x09538086, 1, 0x3702, "DC P3700 SSD" },
+ { 0x09538086, 1, 0x3703, "DC P3700 SSD [2.5\" SFF]" },
+ { 0x09538086, 1, 0x3704, "DC P3500 SSD [Add-in Card]" },
+ { 0x09538086, 1, 0x3705, "DC P3500 SSD [2.5\" SFF]" },
+ { 0x09538086, 1, 0x3709, "DC P3600 SSD [Add-in Card]" },
+ { 0x09538086, 1, 0x370a, "DC P3600 SSD [2.5\" SFF]" },
+ { 0x00000000, 0, 0, NULL }
};
static int
+nvme_match(uint32_t devid, uint16_t subdevice, struct _pcsid *ep)
+{
+ if (devid != ep->devid)
+ return 0;
+
+ if (!ep->match_subdevice)
+ return 1;
+
+ if (subdevice == ep->subdevice)
+ return 1;
+ else
+ return 0;
+}
+
+static int
nvme_probe (device_t device)
{
struct _pcsid *ep;
- u_int32_t type;
+ uint32_t devid;
+ uint16_t subdevice;
- type = pci_get_devid(device);
+ devid = pci_get_devid(device);
+ subdevice = pci_get_subdevice(device);
ep = pci_ids;
- while (ep->type && ep->type != type)
+ while (ep->devid) {
+ if (nvme_match(devid, subdevice, ep))
+ break;
++ep;
+ }
if (ep->desc) {
device_set_desc(device, ep->desc);
diff --git a/sys/dev/nvme/nvme_ctrlr.c b/sys/dev/nvme/nvme_ctrlr.c
index cf3b3b2..00dc92a 100644
--- a/sys/dev/nvme/nvme_ctrlr.c
+++ b/sys/dev/nvme/nvme_ctrlr.c
@@ -49,11 +49,7 @@ static int
nvme_ctrlr_allocate_bar(struct nvme_controller *ctrlr)
{
- /* Chatham puts the NVMe MMRs behind BAR 2/3, not BAR 0/1. */
- if (pci_get_devid(ctrlr->dev) == CHATHAM_PCI_ID)
- ctrlr->resource_id = PCIR_BAR(2);
- else
- ctrlr->resource_id = PCIR_BAR(0);
+ ctrlr->resource_id = PCIR_BAR(0);
ctrlr->resource = bus_alloc_resource(ctrlr->dev, SYS_RES_MEMORY,
&ctrlr->resource_id, 0, ~0, 1, RF_ACTIVE);
@@ -81,117 +77,6 @@ nvme_ctrlr_allocate_bar(struct nvme_controller *ctrlr)
return (0);
}
-#ifdef CHATHAM2
-static int
-nvme_ctrlr_allocate_chatham_bar(struct nvme_controller *ctrlr)
-{
-
- ctrlr->chatham_resource_id = PCIR_BAR(CHATHAM_CONTROL_BAR);
- ctrlr->chatham_resource = bus_alloc_resource(ctrlr->dev,
- SYS_RES_MEMORY, &ctrlr->chatham_resource_id, 0, ~0, 1,
- RF_ACTIVE);
-
- if(ctrlr->chatham_resource == NULL) {
- nvme_printf(ctrlr, "unable to alloc pci resource\n");
- return (ENOMEM);
- }
-
- ctrlr->chatham_bus_tag = rman_get_bustag(ctrlr->chatham_resource);
- ctrlr->chatham_bus_handle =
- rman_get_bushandle(ctrlr->chatham_resource);
-
- return (0);
-}
-
-static void
-nvme_ctrlr_setup_chatham(struct nvme_controller *ctrlr)
-{
- uint64_t reg1, reg2, reg3;
- uint64_t temp1, temp2;
- uint32_t temp3;
- uint32_t use_flash_timings = 0;
-
- DELAY(10000);
-
- temp3 = chatham_read_4(ctrlr, 0x8080);
-
- device_printf(ctrlr->dev, "Chatham version: 0x%x\n", temp3);
-
- ctrlr->chatham_lbas = chatham_read_4(ctrlr, 0x8068) - 0x110;
- ctrlr->chatham_size = ctrlr->chatham_lbas * 512;
-
- device_printf(ctrlr->dev, "Chatham size: %jd\n",
- (intmax_t)ctrlr->chatham_size);
-
- reg1 = reg2 = reg3 = ctrlr->chatham_size - 1;
-
- TUNABLE_INT_FETCH("hw.nvme.use_flash_timings", &use_flash_timings);
- if (use_flash_timings) {
- device_printf(ctrlr->dev, "Chatham: using flash timings\n");
- temp1 = 0x00001b58000007d0LL;
- temp2 = 0x000000cb00000131LL;
- } else {
- device_printf(ctrlr->dev, "Chatham: using DDR timings\n");
- temp1 = temp2 = 0x0LL;
- }
-
- chatham_write_8(ctrlr, 0x8000, reg1);
- chatham_write_8(ctrlr, 0x8008, reg2);
- chatham_write_8(ctrlr, 0x8010, reg3);
-
- chatham_write_8(ctrlr, 0x8020, temp1);
- temp3 = chatham_read_4(ctrlr, 0x8020);
-
- chatham_write_8(ctrlr, 0x8028, temp2);
- temp3 = chatham_read_4(ctrlr, 0x8028);
-
- chatham_write_8(ctrlr, 0x8030, temp1);
- chatham_write_8(ctrlr, 0x8038, temp2);
- chatham_write_8(ctrlr, 0x8040, temp1);
- chatham_write_8(ctrlr, 0x8048, temp2);
- chatham_write_8(ctrlr, 0x8050, temp1);
- chatham_write_8(ctrlr, 0x8058, temp2);
-
- DELAY(10000);
-}
-
-static void
-nvme_chatham_populate_cdata(struct nvme_controller *ctrlr)
-{
- struct nvme_controller_data *cdata;
-
- cdata = &ctrlr->cdata;
-
- cdata->vid = 0x8086;
- cdata->ssvid = 0x2011;
-
- /*
- * Chatham2 puts garbage data in these fields when we
- * invoke IDENTIFY_CONTROLLER, so we need to re-zero
- * the fields before calling bcopy().
- */
- memset(cdata->sn, 0, sizeof(cdata->sn));
- memcpy(cdata->sn, "2012", strlen("2012"));
- memset(cdata->mn, 0, sizeof(cdata->mn));
- memcpy(cdata->mn, "CHATHAM2", strlen("CHATHAM2"));
- memset(cdata->fr, 0, sizeof(cdata->fr));
- memcpy(cdata->fr, "0", strlen("0"));
- cdata->rab = 8;
- cdata->aerl = 3;
- cdata->lpa.ns_smart = 1;
- cdata->sqes.min = 6;
- cdata->sqes.max = 6;
- cdata->cqes.min = 4;
- cdata->cqes.max = 4;
- cdata->nn = 1;
-
- /* Chatham2 doesn't support DSM command */
- cdata->oncs.dsm = 0;
-
- cdata->vwc.present = 1;
-}
-#endif /* CHATHAM2 */
-
static void
nvme_ctrlr_construct_admin_qpair(struct nvme_controller *ctrlr)
{
@@ -461,11 +346,6 @@ nvme_ctrlr_identify(struct nvme_controller *ctrlr)
return (ENXIO);
}
-#ifdef CHATHAM2
- if (pci_get_devid(ctrlr->dev) == CHATHAM_PCI_ID)
- nvme_chatham_populate_cdata(ctrlr);
-#endif
-
/*
* Use MDTS to ensure our default max_xfer_size doesn't exceed what the
* controller supports.
@@ -779,10 +659,6 @@ nvme_ctrlr_configure_aer(struct nvme_controller *ctrlr)
/* aerl is a zero-based value, so we need to add 1 here. */
ctrlr->num_aers = min(NVME_MAX_ASYNC_EVENTS, (ctrlr->cdata.aerl+1));
- /* Chatham doesn't support AERs. */
- if (pci_get_devid(ctrlr->dev) == CHATHAM_PCI_ID)
- ctrlr->num_aers = 0;
-
for (i = 0; i < ctrlr->num_aers; i++) {
aer = &ctrlr->aer[i];
nvme_ctrlr_construct_and_submit_aer(ctrlr, aer);
@@ -1034,27 +910,6 @@ nvme_ctrlr_ioctl(struct cdev *cdev, u_long cmd, caddr_t arg, int flag,
break;
case NVME_PASSTHROUGH_CMD:
pt = (struct nvme_pt_command *)arg;
-#ifdef CHATHAM2
- /*
- * Chatham IDENTIFY data is spoofed, so copy the spoofed data
- * rather than issuing the command to the Chatham controller.
- */
- if (pci_get_devid(ctrlr->dev) == CHATHAM_PCI_ID &&
- pt->cmd.opc == NVME_OPC_IDENTIFY) {
- if (pt->cmd.cdw10 == 1) {
- if (pt->len != sizeof(ctrlr->cdata))
- return (EINVAL);
- return (copyout(&ctrlr->cdata, pt->buf,
- pt->len));
- } else {
- if (pt->len != sizeof(ctrlr->ns[0].data) ||
- pt->cmd.nsid != 1)
- return (EINVAL);
- return (copyout(&ctrlr->ns[0].data, pt->buf,
- pt->len));
- }
- }
-#endif
return (nvme_ctrlr_passthrough_cmd(ctrlr, pt, pt->cmd.nsid,
1 /* is_user_buffer */, 1 /* is_admin_cmd */));
default:
@@ -1087,15 +942,6 @@ nvme_ctrlr_construct(struct nvme_controller *ctrlr, device_t dev)
if (status != 0)
return (status);
-#ifdef CHATHAM2
- if (pci_get_devid(dev) == CHATHAM_PCI_ID) {
- status = nvme_ctrlr_allocate_chatham_bar(ctrlr);
- if (status != 0)
- return (status);
- nvme_ctrlr_setup_chatham(ctrlr);
- }
-#endif
-
/*
* Software emulators may set the doorbell stride to something
* other than zero, but this driver is not set up to handle that.
@@ -1144,9 +990,17 @@ nvme_ctrlr_construct(struct nvme_controller *ctrlr, device_t dev)
/* One vector per IO queue, plus one vector for admin queue. */
num_vectors = ctrlr->num_io_queues + 1;
- if (pci_msix_count(dev) < num_vectors) {
+ /*
+ * If we cannot even allocate 2 vectors (one for admin, one for
+ * I/O), then revert to INTx.
+ */
+ if (pci_msix_count(dev) < 2) {
ctrlr->msix_enabled = 0;
goto intx;
+ } else if (pci_msix_count(dev) < num_vectors) {
+ ctrlr->per_cpu_io_queues = FALSE;
+ ctrlr->num_io_queues = 1;
+ num_vectors = 2; /* one for admin, one for I/O */
}
if (pci_alloc_msix(dev, &num_vectors) != 0) {
@@ -1236,14 +1090,8 @@ nvme_ctrlr_destruct(struct nvme_controller *ctrlr, device_t dev)
* during shutdown). This ensures the controller receives a
* shutdown notification in case the system is shutdown before
* reloading the driver.
- *
- * Chatham does not let you re-enable the controller after shutdown
- * notification has been received, so do not send it in this case.
- * This is OK because Chatham does not depend on the shutdown
- * notification anyways.
*/
- if (pci_get_devid(ctrlr->dev) != CHATHAM_PCI_ID)
- nvme_ctrlr_shutdown(ctrlr);
+ nvme_ctrlr_shutdown(ctrlr);
nvme_ctrlr_disable(ctrlr);
taskqueue_free(ctrlr->taskqueue);
@@ -1272,13 +1120,6 @@ nvme_ctrlr_destruct(struct nvme_controller *ctrlr, device_t dev)
ctrlr->bar4_resource_id, ctrlr->bar4_resource);
}
-#ifdef CHATHAM2
- if (ctrlr->chatham_resource != NULL) {
- bus_release_resource(dev, SYS_RES_MEMORY,
- ctrlr->chatham_resource_id, ctrlr->chatham_resource);
- }
-#endif
-
if (ctrlr->tag)
bus_teardown_intr(ctrlr->dev, ctrlr->res, ctrlr->tag);
diff --git a/sys/dev/nvme/nvme_ns.c b/sys/dev/nvme/nvme_ns.c
index ed2214d..84a1980 100644
--- a/sys/dev/nvme/nvme_ns.c
+++ b/sys/dev/nvme/nvme_ns.c
@@ -465,28 +465,6 @@ nvme_ns_bio_process(struct nvme_namespace *ns, struct bio *bp,
return (err);
}
-#ifdef CHATHAM2
-static void
-nvme_ns_populate_chatham_data(struct nvme_namespace *ns)
-{
- struct nvme_controller *ctrlr;
- struct nvme_namespace_data *nsdata;
-
- ctrlr = ns->ctrlr;
- nsdata = &ns->data;
-
- nsdata->nsze = ctrlr->chatham_lbas;
- nsdata->ncap = ctrlr->chatham_lbas;
- nsdata->nuse = ctrlr->chatham_lbas;
-
- /* Chatham2 doesn't support thin provisioning. */
- nsdata->nsfeat.thin_prov = 0;
-
- /* Set LBA size to 512 bytes. */
- nsdata->lbaf[0].lbads = 9;
-}
-#endif /* CHATHAM2 */
-
int
nvme_ns_construct(struct nvme_namespace *ns, uint16_t id,
struct nvme_controller *ctrlr)
@@ -513,23 +491,15 @@ nvme_ns_construct(struct nvme_namespace *ns, uint16_t id,
if (!mtx_initialized(&ns->lock))
mtx_init(&ns->lock, "nvme ns lock", NULL, MTX_DEF);
-#ifdef CHATHAM2
- if (pci_get_devid(ctrlr->dev) == CHATHAM_PCI_ID)
- nvme_ns_populate_chatham_data(ns);
- else {
-#endif
- status.done = FALSE;
- nvme_ctrlr_cmd_identify_namespace(ctrlr, id, &ns->data,
- nvme_completion_poll_cb, &status);
- while (status.done == FALSE)
- DELAY(5);
- if (nvme_completion_is_error(&status.cpl)) {
- nvme_printf(ctrlr, "nvme_identify_namespace failed\n");
- return (ENXIO);
- }
-#ifdef CHATHAM2
+ status.done = FALSE;
+ nvme_ctrlr_cmd_identify_namespace(ctrlr, id, &ns->data,
+ nvme_completion_poll_cb, &status);
+ while (status.done == FALSE)
+ DELAY(5);
+ if (nvme_completion_is_error(&status.cpl)) {
+ nvme_printf(ctrlr, "nvme_identify_namespace failed\n");
+ return (ENXIO);
}
-#endif
/*
* Note: format is a 0-based value, so > is appropriate here,
diff --git a/sys/dev/nvme/nvme_private.h b/sys/dev/nvme/nvme_private.h
index fa9cb80..6137b41 100644
--- a/sys/dev/nvme/nvme_private.h
+++ b/sys/dev/nvme/nvme_private.h
@@ -50,13 +50,6 @@
MALLOC_DECLARE(M_NVME);
-#define CHATHAM2
-
-#ifdef CHATHAM2
-#define CHATHAM_PCI_ID 0x20118086
-#define CHATHAM_CONTROL_BAR 0
-#endif
-
#define IDT32_PCI_ID 0x80d0111d /* 32 channel board */
#define IDT8_PCI_ID 0x80d2111d /* 8 channel board */
@@ -211,6 +204,7 @@ struct nvme_qpair {
struct nvme_completion *cpl;
bus_dma_tag_t dma_tag;
+ bus_dma_tag_t dma_tag_payload;
bus_dmamap_t cmd_dma_map;
uint64_t cmd_bus_addr;
@@ -266,13 +260,6 @@ struct nvme_controller {
int bar4_resource_id;
struct resource *bar4_resource;
-#ifdef CHATHAM2
- bus_space_tag_t chatham_bus_tag;
- bus_space_handle_t chatham_bus_handle;
- int chatham_resource_id;
- struct resource *chatham_resource;
-#endif
-
uint32_t msix_enabled;
uint32_t force_intx;
uint32_t enable_aborts;
@@ -338,11 +325,6 @@ struct nvme_controller {
boolean_t is_failed;
STAILQ_HEAD(, nvme_request) fail_req;
-
-#ifdef CHATHAM2
- uint64_t chatham_size;
- uint64_t chatham_lbas;
-#endif
};
#define nvme_mmio_offsetof(reg) \
@@ -365,22 +347,6 @@ struct nvme_controller {
(val & 0xFFFFFFFF00000000UL) >> 32); \
} while (0);
-#ifdef CHATHAM2
-#define chatham_read_4(softc, reg) \
- bus_space_read_4((softc)->chatham_bus_tag, \
- (softc)->chatham_bus_handle, reg)
-
-#define chatham_write_8(sc, reg, val) \
- do { \
- bus_space_write_4((sc)->chatham_bus_tag, \
- (sc)->chatham_bus_handle, reg, val & 0xffffffff); \
- bus_space_write_4((sc)->chatham_bus_tag, \
- (sc)->chatham_bus_handle, reg+4, \
- (val & 0xFFFFFFFF00000000UL) >> 32); \
- } while (0);
-
-#endif /* CHATHAM2 */
-
#if __FreeBSD_version < 800054
#define wmb() __asm volatile("sfence" ::: "memory")
#define mb() __asm volatile("mfence" ::: "memory")
@@ -491,6 +457,8 @@ nvme_single_map(void *arg, bus_dma_segment_t *seg, int nseg, int error)
{
uint64_t *bus_addr = (uint64_t *)arg;
+ if (error != 0)
+ printf("nvme_single_map err %d\n", error);
*bus_addr = seg[0].ds_addr;
}
diff --git a/sys/dev/nvme/nvme_qpair.c b/sys/dev/nvme/nvme_qpair.c
index e54adf7..d0cb8c6 100644
--- a/sys/dev/nvme/nvme_qpair.c
+++ b/sys/dev/nvme/nvme_qpair.c
@@ -294,7 +294,7 @@ nvme_qpair_construct_tracker(struct nvme_qpair *qpair, struct nvme_tracker *tr,
uint16_t cid)
{
- bus_dmamap_create(qpair->dma_tag, 0, &tr->payload_dma_map);
+ bus_dmamap_create(qpair->dma_tag_payload, 0, &tr->payload_dma_map);
bus_dmamap_create(qpair->dma_tag, 0, &tr->prp_dma_map);
bus_dmamap_load(qpair->dma_tag, tr->prp_dma_map, tr->prp,
@@ -337,7 +337,7 @@ nvme_qpair_complete_tracker(struct nvme_qpair *qpair, struct nvme_tracker *tr,
nvme_qpair_submit_tracker(qpair, tr);
} else {
if (req->type != NVME_REQUEST_NULL)
- bus_dmamap_unload(qpair->dma_tag,
+ bus_dmamap_unload(qpair->dma_tag_payload,
tr->payload_dma_map);
nvme_free_request(req);
@@ -464,19 +464,11 @@ nvme_qpair_construct(struct nvme_qpair *qpair, uint32_t id,
{
struct nvme_tracker *tr;
uint32_t i;
+ int err;
qpair->id = id;
qpair->vector = vector;
qpair->num_entries = num_entries;
-#ifdef CHATHAM2
- /*
- * Chatham prototype board starts having issues at higher queue
- * depths. So use a conservative estimate here of no more than 64
- * outstanding I/O per queue at any one point.
- */
- if (pci_get_devid(ctrlr->dev) == CHATHAM_PCI_ID)
- num_trackers = min(num_trackers, 64);
-#endif
qpair->num_trackers = num_trackers;
qpair->ctrlr = ctrlr;
@@ -497,11 +489,20 @@ nvme_qpair_construct(struct nvme_qpair *qpair, uint32_t id,
mtx_init(&qpair->lock, "nvme qpair lock", NULL, MTX_DEF);
/* Note: NVMe PRP format is restricted to 4-byte alignment. */
- bus_dma_tag_create(bus_get_dma_tag(ctrlr->dev),
+ err = bus_dma_tag_create(bus_get_dma_tag(ctrlr->dev),
4, PAGE_SIZE, BUS_SPACE_MAXADDR,
BUS_SPACE_MAXADDR, NULL, NULL, NVME_MAX_XFER_SIZE,
(NVME_MAX_XFER_SIZE/PAGE_SIZE)+1, PAGE_SIZE, 0,
+ NULL, NULL, &qpair->dma_tag_payload);
+ if (err != 0)
+ nvme_printf(ctrlr, "payload tag create failed %d\n", err);
+
+ err = bus_dma_tag_create(bus_get_dma_tag(ctrlr->dev),
+ 4, 0, BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR, NULL, NULL,
+ BUS_SPACE_MAXSIZE, 1, BUS_SPACE_MAXSIZE, 0,
NULL, NULL, &qpair->dma_tag);
+ if (err != 0)
+ nvme_printf(ctrlr, "tag create failed %d\n", err);
qpair->num_cmds = 0;
qpair->num_intr_handler_calls = 0;
@@ -513,8 +514,13 @@ nvme_qpair_construct(struct nvme_qpair *qpair, uint32_t id,
sizeof(struct nvme_completion), M_NVME, M_ZERO,
0, BUS_SPACE_MAXADDR, PAGE_SIZE, 0);
- bus_dmamap_create(qpair->dma_tag, 0, &qpair->cmd_dma_map);
- bus_dmamap_create(qpair->dma_tag, 0, &qpair->cpl_dma_map);
+ err = bus_dmamap_create(qpair->dma_tag, 0, &qpair->cmd_dma_map);
+ if (err != 0)
+ nvme_printf(ctrlr, "cmd_dma_map create failed %d\n", err);
+
+ err = bus_dmamap_create(qpair->dma_tag, 0, &qpair->cpl_dma_map);
+ if (err != 0)
+ nvme_printf(ctrlr, "cpl_dma_map create failed %d\n", err);
bus_dmamap_load(qpair->dma_tag, qpair->cmd_dma_map,
qpair->cmd, qpair->num_entries * sizeof(struct nvme_command),
@@ -570,6 +576,9 @@ nvme_qpair_destroy(struct nvme_qpair *qpair)
if (qpair->dma_tag)
bus_dma_tag_destroy(qpair->dma_tag);
+ if (qpair->dma_tag_payload)
+ bus_dma_tag_destroy(qpair->dma_tag_payload);
+
if (qpair->act_tr)
free(qpair->act_tr, M_NVME);
@@ -707,8 +716,11 @@ nvme_payload_map(void *arg, bus_dma_segment_t *seg, int nseg, int error)
* is responsible for detecting the error status and failing the
* tracker manually.
*/
- if (error != 0)
+ if (error != 0) {
+ nvme_printf(tr->qpair->ctrlr,
+ "nvme_payload_map err %d\n", error);
return;
+ }
/*
* Note that we specified PAGE_SIZE for alignment and max
@@ -728,6 +740,13 @@ nvme_payload_map(void *arg, bus_dma_segment_t *seg, int nseg, int error)
(uint64_t)seg[cur_nseg].ds_addr;
cur_nseg++;
}
+ } else {
+ /*
+ * prp2 should not be used by the controller
+ * since there is only one segment, but set
+ * to 0 just to be safe.
+ */
+ tr->req->cmd.prp2 = 0;
}
nvme_qpair_submit_tracker(tr->qpair, tr);
@@ -780,8 +799,9 @@ _nvme_qpair_submit_request(struct nvme_qpair *qpair, struct nvme_request *req)
KASSERT(req->payload_size <= qpair->ctrlr->max_xfer_size,
("payload_size (%d) exceeds max_xfer_size (%d)\n",
req->payload_size, qpair->ctrlr->max_xfer_size));
- err = bus_dmamap_load(tr->qpair->dma_tag, tr->payload_dma_map,
- req->u.payload, req->payload_size, nvme_payload_map, tr, 0);
+ err = bus_dmamap_load(tr->qpair->dma_tag_payload,
+ tr->payload_dma_map, req->u.payload, req->payload_size,
+ nvme_payload_map, tr, 0);
if (err != 0)
nvme_printf(qpair->ctrlr,
"bus_dmamap_load returned 0x%x!\n", err);
@@ -795,7 +815,7 @@ _nvme_qpair_submit_request(struct nvme_qpair *qpair, struct nvme_request *req)
("bio->bio_bcount (%jd) exceeds max_xfer_size (%d)\n",
(intmax_t)req->u.bio->bio_bcount,
qpair->ctrlr->max_xfer_size));
- err = bus_dmamap_load_bio(tr->qpair->dma_tag,
+ err = bus_dmamap_load_bio(tr->qpair->dma_tag_payload,
tr->payload_dma_map, req->u.bio, nvme_payload_map, tr, 0);
if (err != 0)
nvme_printf(qpair->ctrlr,
diff --git a/sys/dev/pccbb/pccbb_pci.c b/sys/dev/pccbb/pccbb_pci.c
index d4f1baa..7dca418 100644
--- a/sys/dev/pccbb/pccbb_pci.c
+++ b/sys/dev/pccbb/pccbb_pci.c
@@ -259,32 +259,6 @@ cbb_pci_probe(device_t brdev)
}
/*
- * Still need this because the pci code only does power for type 0
- * header devices.
- */
-static void
-cbb_powerstate_d0(device_t dev)
-{
- u_int32_t membase, irq;
-
- if (pci_get_powerstate(dev) != PCI_POWERSTATE_D0) {
- /* Save important PCI config data. */
- membase = pci_read_config(dev, CBBR_SOCKBASE, 4);
- irq = pci_read_config(dev, PCIR_INTLINE, 4);
-
- /* Reset the power state. */
- device_printf(dev, "chip is in D%d power mode "
- "-- setting to D0\n", pci_get_powerstate(dev));
-
- pci_set_powerstate(dev, PCI_POWERSTATE_D0);
-
- /* Restore PCI config data. */
- pci_write_config(dev, CBBR_SOCKBASE, membase, 4);
- pci_write_config(dev, PCIR_INTLINE, irq, 4);
- }
-}
-
-/*
* Print out the config space
*/
static void
@@ -321,15 +295,15 @@ cbb_pci_attach(device_t brdev)
sc->cbdev = NULL;
sc->exca[0].pccarddev = NULL;
sc->domain = pci_get_domain(brdev);
- sc->bus.sec = pci_read_config(brdev, PCIR_SECBUS_2, 1);
- sc->bus.sub = pci_read_config(brdev, PCIR_SUBBUS_2, 1);
sc->pribus = pcib_get_bus(parent);
#if defined(NEW_PCIB) && defined(PCI_RES_BUS)
pci_write_config(brdev, PCIR_PRIBUS_2, sc->pribus, 1);
pcib_setup_secbus(brdev, &sc->bus, 1);
+#else
+ sc->bus.sec = pci_read_config(brdev, PCIR_SECBUS_2, 1);
+ sc->bus.sub = pci_read_config(brdev, PCIR_SUBBUS_2, 1);
#endif
SLIST_INIT(&sc->rl);
- cbb_powerstate_d0(brdev);
rid = CBBR_SOCKBASE;
sc->base_res = bus_alloc_resource_any(brdev, SYS_RES_MEMORY, &rid,
@@ -467,18 +441,13 @@ cbb_chipinit(struct cbb_softc *sc)
uint32_t mux, sysctrl, reg;
/* Set CardBus latency timer */
- if (pci_read_config(sc->dev, PCIR_SECLAT_1, 1) < 0x20)
- pci_write_config(sc->dev, PCIR_SECLAT_1, 0x20, 1);
+ if (pci_read_config(sc->dev, PCIR_SECLAT_2, 1) < 0x20)
+ pci_write_config(sc->dev, PCIR_SECLAT_2, 0x20, 1);
/* Set PCI latency timer */
if (pci_read_config(sc->dev, PCIR_LATTIMER, 1) < 0x20)
pci_write_config(sc->dev, PCIR_LATTIMER, 0x20, 1);
- /* Restore bus configuration */
- pci_write_config(sc->dev, PCIR_PRIBUS_2, sc->pribus, 1);
- pci_write_config(sc->dev, PCIR_SECBUS_2, sc->bus.sec, 1);
- pci_write_config(sc->dev, PCIR_SUBBUS_2, sc->bus.sub, 1);
-
/* Enable DMA, memory access for this card and I/O acces for children */
pci_enable_busmaster(sc->dev);
pci_enable_io(sc->dev, SYS_RES_IOPORT);
@@ -906,15 +875,10 @@ cbb_pci_resume(device_t brdev)
* from D0 and back to D0 cause the bridge to lose its config space, so
* all the bus mappings and such are preserved.
*
- * For most drivers, the PCI layer handles this saving. However, since
- * there's much black magic and arcane art hidden in these few lines of
- * code that would be difficult to transition into the PCI
- * layer. chipinit was several years of trial and error to write.
+ * The PCI layer handles standard PCI registers like the
+ * command register and BARs, but cbb-specific registers are
+ * handled here.
*/
- pci_write_config(brdev, CBBR_SOCKBASE, rman_get_start(sc->base_res), 4);
- DEVPRINTF((brdev, "PCI Memory allocated: %08lx\n",
- rman_get_start(sc->base_res)));
-
sc->chipinit(sc);
/* reset interrupt -- Do we really need to do this? */
diff --git a/sys/dev/pci/pci.c b/sys/dev/pci/pci.c
index 3fab486..b4c6151 100644
--- a/sys/dev/pci/pci.c
+++ b/sys/dev/pci/pci.c
@@ -583,12 +583,24 @@ pci_hdrtypedata(device_t pcib, int b, int s, int f, pcicfgregs *cfg)
case PCIM_HDRTYPE_NORMAL:
cfg->subvendor = REG(PCIR_SUBVEND_0, 2);
cfg->subdevice = REG(PCIR_SUBDEV_0, 2);
+ cfg->mingnt = REG(PCIR_MINGNT, 1);
+ cfg->maxlat = REG(PCIR_MAXLAT, 1);
cfg->nummaps = PCI_MAXMAPS_0;
break;
case PCIM_HDRTYPE_BRIDGE:
+ cfg->bridge.br_seclat = REG(PCIR_SECLAT_1, 1);
+ cfg->bridge.br_subbus = REG(PCIR_SUBBUS_1, 1);
+ cfg->bridge.br_secbus = REG(PCIR_SECBUS_1, 1);
+ cfg->bridge.br_pribus = REG(PCIR_PRIBUS_1, 1);
+ cfg->bridge.br_control = REG(PCIR_BRIDGECTL_1, 2);
cfg->nummaps = PCI_MAXMAPS_1;
break;
case PCIM_HDRTYPE_CARDBUS:
+ cfg->bridge.br_seclat = REG(PCIR_SECLAT_2, 1);
+ cfg->bridge.br_subbus = REG(PCIR_SUBBUS_2, 1);
+ cfg->bridge.br_secbus = REG(PCIR_SECBUS_2, 1);
+ cfg->bridge.br_pribus = REG(PCIR_PRIBUS_2, 1);
+ cfg->bridge.br_control = REG(PCIR_BRIDGECTL_2, 2);
cfg->subvendor = REG(PCIR_SUBVEND_2, 2);
cfg->subdevice = REG(PCIR_SUBDEV_2, 2);
cfg->nummaps = PCI_MAXMAPS_2;
@@ -641,9 +653,6 @@ pci_fill_devinfo(device_t pcib, int d, int b, int s, int f, uint16_t vid,
cfg->intpin = REG(PCIR_INTPIN, 1);
cfg->intline = REG(PCIR_INTLINE, 1);
- cfg->mingnt = REG(PCIR_MINGNT, 1);
- cfg->maxlat = REG(PCIR_MAXLAT, 1);
-
cfg->mfdev = (cfg->hdrtype & PCIM_MFDEV) != 0;
cfg->hdrtype &= ~PCIM_MFDEV;
STAILQ_INIT(&cfg->maps);
@@ -4425,9 +4434,17 @@ pci_read_ivar(device_t dev, device_t child, int which, uintptr_t *result)
*result = cfg->cachelnsz;
break;
case PCI_IVAR_MINGNT:
+ if (cfg->hdrtype != PCIM_HDRTYPE_NORMAL) {
+ *result = -1;
+ return (EINVAL);
+ }
*result = cfg->mingnt;
break;
case PCI_IVAR_MAXLAT:
+ if (cfg->hdrtype != PCIM_HDRTYPE_NORMAL) {
+ *result = -1;
+ return (EINVAL);
+ }
*result = cfg->maxlat;
break;
case PCI_IVAR_LATTIMER:
@@ -5125,16 +5142,6 @@ pci_cfg_restore(device_t dev, struct pci_devinfo *dinfo)
{
/*
- * Only do header type 0 devices. Type 1 devices are bridges,
- * which we know need special treatment. Type 2 devices are
- * cardbus bridges which also require special treatment.
- * Other types are unknown, and we err on the side of safety
- * by ignoring them.
- */
- if ((dinfo->cfg.hdrtype & PCIM_HDRTYPE) != PCIM_HDRTYPE_NORMAL)
- return;
-
- /*
* Restore the device to full power mode. We must do this
* before we restore the registers because moving from D3 to
* D0 will cause the chip's BARs and some other registers to
@@ -5144,16 +5151,44 @@ pci_cfg_restore(device_t dev, struct pci_devinfo *dinfo)
*/
if (pci_get_powerstate(dev) != PCI_POWERSTATE_D0)
pci_set_powerstate(dev, PCI_POWERSTATE_D0);
- pci_restore_bars(dev);
pci_write_config(dev, PCIR_COMMAND, dinfo->cfg.cmdreg, 2);
pci_write_config(dev, PCIR_INTLINE, dinfo->cfg.intline, 1);
pci_write_config(dev, PCIR_INTPIN, dinfo->cfg.intpin, 1);
- pci_write_config(dev, PCIR_MINGNT, dinfo->cfg.mingnt, 1);
- pci_write_config(dev, PCIR_MAXLAT, dinfo->cfg.maxlat, 1);
pci_write_config(dev, PCIR_CACHELNSZ, dinfo->cfg.cachelnsz, 1);
pci_write_config(dev, PCIR_LATTIMER, dinfo->cfg.lattimer, 1);
pci_write_config(dev, PCIR_PROGIF, dinfo->cfg.progif, 1);
pci_write_config(dev, PCIR_REVID, dinfo->cfg.revid, 1);
+ switch (dinfo->cfg.hdrtype & PCIM_HDRTYPE) {
+ case PCIM_HDRTYPE_NORMAL:
+ pci_write_config(dev, PCIR_MINGNT, dinfo->cfg.mingnt, 1);
+ pci_write_config(dev, PCIR_MAXLAT, dinfo->cfg.maxlat, 1);
+ break;
+ case PCIM_HDRTYPE_BRIDGE:
+ pci_write_config(dev, PCIR_SECLAT_1,
+ dinfo->cfg.bridge.br_seclat, 1);
+ pci_write_config(dev, PCIR_SUBBUS_1,
+ dinfo->cfg.bridge.br_subbus, 1);
+ pci_write_config(dev, PCIR_SECBUS_1,
+ dinfo->cfg.bridge.br_secbus, 1);
+ pci_write_config(dev, PCIR_PRIBUS_1,
+ dinfo->cfg.bridge.br_pribus, 1);
+ pci_write_config(dev, PCIR_BRIDGECTL_1,
+ dinfo->cfg.bridge.br_control, 2);
+ break;
+ case PCIM_HDRTYPE_CARDBUS:
+ pci_write_config(dev, PCIR_SECLAT_2,
+ dinfo->cfg.bridge.br_seclat, 1);
+ pci_write_config(dev, PCIR_SUBBUS_2,
+ dinfo->cfg.bridge.br_subbus, 1);
+ pci_write_config(dev, PCIR_SECBUS_2,
+ dinfo->cfg.bridge.br_secbus, 1);
+ pci_write_config(dev, PCIR_PRIBUS_2,
+ dinfo->cfg.bridge.br_pribus, 1);
+ pci_write_config(dev, PCIR_BRIDGECTL_2,
+ dinfo->cfg.bridge.br_control, 2);
+ break;
+ }
+ pci_restore_bars(dev);
/*
* Restore extended capabilities for PCI-Express and PCI-X
@@ -5222,40 +5257,57 @@ pci_cfg_save(device_t dev, struct pci_devinfo *dinfo, int setstate)
int ps;
/*
- * Only do header type 0 devices. Type 1 devices are bridges, which
- * we know need special treatment. Type 2 devices are cardbus bridges
- * which also require special treatment. Other types are unknown, and
- * we err on the side of safety by ignoring them. Powering down
- * bridges should not be undertaken lightly.
- */
- if ((dinfo->cfg.hdrtype & PCIM_HDRTYPE) != PCIM_HDRTYPE_NORMAL)
- return;
-
- /*
* Some drivers apparently write to these registers w/o updating our
* cached copy. No harm happens if we update the copy, so do so here
* so we can restore them. The COMMAND register is modified by the
* bus w/o updating the cache. This should represent the normally
- * writable portion of the 'defined' part of type 0 headers. In
- * theory we also need to save/restore the PCI capability structures
- * we know about, but apart from power we don't know any that are
- * writable.
+ * writable portion of the 'defined' part of type 0/1/2 headers.
*/
- dinfo->cfg.subvendor = pci_read_config(dev, PCIR_SUBVEND_0, 2);
- dinfo->cfg.subdevice = pci_read_config(dev, PCIR_SUBDEV_0, 2);
dinfo->cfg.vendor = pci_read_config(dev, PCIR_VENDOR, 2);
dinfo->cfg.device = pci_read_config(dev, PCIR_DEVICE, 2);
dinfo->cfg.cmdreg = pci_read_config(dev, PCIR_COMMAND, 2);
dinfo->cfg.intline = pci_read_config(dev, PCIR_INTLINE, 1);
dinfo->cfg.intpin = pci_read_config(dev, PCIR_INTPIN, 1);
- dinfo->cfg.mingnt = pci_read_config(dev, PCIR_MINGNT, 1);
- dinfo->cfg.maxlat = pci_read_config(dev, PCIR_MAXLAT, 1);
dinfo->cfg.cachelnsz = pci_read_config(dev, PCIR_CACHELNSZ, 1);
dinfo->cfg.lattimer = pci_read_config(dev, PCIR_LATTIMER, 1);
dinfo->cfg.baseclass = pci_read_config(dev, PCIR_CLASS, 1);
dinfo->cfg.subclass = pci_read_config(dev, PCIR_SUBCLASS, 1);
dinfo->cfg.progif = pci_read_config(dev, PCIR_PROGIF, 1);
dinfo->cfg.revid = pci_read_config(dev, PCIR_REVID, 1);
+ switch (dinfo->cfg.hdrtype & PCIM_HDRTYPE) {
+ case PCIM_HDRTYPE_NORMAL:
+ dinfo->cfg.subvendor = pci_read_config(dev, PCIR_SUBVEND_0, 2);
+ dinfo->cfg.subdevice = pci_read_config(dev, PCIR_SUBDEV_0, 2);
+ dinfo->cfg.mingnt = pci_read_config(dev, PCIR_MINGNT, 1);
+ dinfo->cfg.maxlat = pci_read_config(dev, PCIR_MAXLAT, 1);
+ break;
+ case PCIM_HDRTYPE_BRIDGE:
+ dinfo->cfg.bridge.br_seclat = pci_read_config(dev,
+ PCIR_SECLAT_1, 1);
+ dinfo->cfg.bridge.br_subbus = pci_read_config(dev,
+ PCIR_SUBBUS_1, 1);
+ dinfo->cfg.bridge.br_secbus = pci_read_config(dev,
+ PCIR_SECBUS_1, 1);
+ dinfo->cfg.bridge.br_pribus = pci_read_config(dev,
+ PCIR_PRIBUS_1, 1);
+ dinfo->cfg.bridge.br_control = pci_read_config(dev,
+ PCIR_BRIDGECTL_1, 2);
+ break;
+ case PCIM_HDRTYPE_CARDBUS:
+ dinfo->cfg.bridge.br_seclat = pci_read_config(dev,
+ PCIR_SECLAT_2, 1);
+ dinfo->cfg.bridge.br_subbus = pci_read_config(dev,
+ PCIR_SUBBUS_2, 1);
+ dinfo->cfg.bridge.br_secbus = pci_read_config(dev,
+ PCIR_SECBUS_2, 1);
+ dinfo->cfg.bridge.br_pribus = pci_read_config(dev,
+ PCIR_PRIBUS_2, 1);
+ dinfo->cfg.bridge.br_control = pci_read_config(dev,
+ PCIR_BRIDGECTL_2, 2);
+ dinfo->cfg.subvendor = pci_read_config(dev, PCIR_SUBVEND_2, 2);
+ dinfo->cfg.subdevice = pci_read_config(dev, PCIR_SUBDEV_2, 2);
+ break;
+ }
if (dinfo->cfg.pcie.pcie_location != 0)
pci_cfg_save_pcie(dev, dinfo);
diff --git a/sys/dev/pci/pci_iov.c b/sys/dev/pci/pci_iov.c
index e256a5d..4672e55 100644
--- a/sys/dev/pci/pci_iov.c
+++ b/sys/dev/pci/pci_iov.c
@@ -386,7 +386,7 @@ pci_iov_parse_config(struct pcicfg_iov *iov, struct pci_iov_arg *arg,
if (error != 0)
goto out;
- config = nvlist_unpack(packed_config, arg->len);
+ config = nvlist_unpack(packed_config, arg->len, NV_FLAG_IGNORE_CASE);
if (config == NULL) {
error = EINVAL;
goto out;
diff --git a/sys/dev/pci/pci_pci.c b/sys/dev/pci/pci_pci.c
index d0d8fb7..789a918 100644
--- a/sys/dev/pci/pci_pci.c
+++ b/sys/dev/pci/pci_pci.c
@@ -553,18 +553,22 @@ void
pcib_setup_secbus(device_t dev, struct pcib_secbus *bus, int min_count)
{
char buf[64];
- int error, rid;
+ int error, rid, sec_reg;
switch (pci_read_config(dev, PCIR_HDRTYPE, 1) & PCIM_HDRTYPE) {
case PCIM_HDRTYPE_BRIDGE:
+ sec_reg = PCIR_SECBUS_1;
bus->sub_reg = PCIR_SUBBUS_1;
break;
case PCIM_HDRTYPE_CARDBUS:
+ sec_reg = PCIR_SECBUS_2;
bus->sub_reg = PCIR_SUBBUS_2;
break;
default:
panic("not a PCI bridge");
}
+ bus->sec = pci_read_config(dev, sec_reg, 1);
+ bus->sub = pci_read_config(dev, bus->sub_reg, 1);
bus->dev = dev;
bus->rman.rm_start = 0;
bus->rman.rm_end = PCI_BUSMAX;
@@ -849,20 +853,16 @@ pcib_set_mem_decode(struct pcib_softc *sc)
static void
pcib_cfg_save(struct pcib_softc *sc)
{
+#ifndef NEW_PCIB
device_t dev;
+ uint16_t command;
dev = sc->dev;
- sc->command = pci_read_config(dev, PCIR_COMMAND, 2);
- sc->pribus = pci_read_config(dev, PCIR_PRIBUS_1, 1);
- sc->bus.sec = pci_read_config(dev, PCIR_SECBUS_1, 1);
- sc->bus.sub = pci_read_config(dev, PCIR_SUBBUS_1, 1);
- sc->bridgectl = pci_read_config(dev, PCIR_BRIDGECTL_1, 2);
- sc->seclat = pci_read_config(dev, PCIR_SECLAT_1, 1);
-#ifndef NEW_PCIB
- if (sc->command & PCIM_CMD_PORTEN)
+ command = pci_read_config(dev, PCIR_COMMAND, 2);
+ if (command & PCIM_CMD_PORTEN)
pcib_get_io_decode(sc);
- if (sc->command & PCIM_CMD_MEMEN)
+ if (command & PCIM_CMD_MEMEN)
pcib_get_mem_decode(sc);
#endif
}
@@ -874,21 +874,18 @@ static void
pcib_cfg_restore(struct pcib_softc *sc)
{
device_t dev;
-
+#ifndef NEW_PCIB
+ uint16_t command;
+#endif
dev = sc->dev;
- pci_write_config(dev, PCIR_COMMAND, sc->command, 2);
- pci_write_config(dev, PCIR_PRIBUS_1, sc->pribus, 1);
- pci_write_config(dev, PCIR_SECBUS_1, sc->bus.sec, 1);
- pci_write_config(dev, PCIR_SUBBUS_1, sc->bus.sub, 1);
- pci_write_config(dev, PCIR_BRIDGECTL_1, sc->bridgectl, 2);
- pci_write_config(dev, PCIR_SECLAT_1, sc->seclat, 1);
#ifdef NEW_PCIB
pcib_write_windows(sc, WIN_IO | WIN_MEM | WIN_PMEM);
#else
- if (sc->command & PCIM_CMD_PORTEN)
+ command = pci_read_config(dev, PCIR_COMMAND, 2);
+ if (command & PCIM_CMD_PORTEN)
pcib_set_io_decode(sc);
- if (sc->command & PCIM_CMD_MEMEN)
+ if (command & PCIM_CMD_MEMEN)
pcib_set_mem_decode(sc);
#endif
}
@@ -922,7 +919,11 @@ pcib_attach_common(device_t dev)
* Get current bridge configuration.
*/
sc->domain = pci_get_domain(dev);
- sc->secstat = pci_read_config(dev, PCIR_SECSTAT_1, 2);
+#if !(defined(NEW_PCIB) && defined(PCI_RES_BUS))
+ sc->bus.sec = pci_read_config(dev, PCIR_SECBUS_1, 1);
+ sc->bus.sub = pci_read_config(dev, PCIR_SUBBUS_1, 1);
+#endif
+ sc->bridgectl = pci_read_config(dev, PCIR_BRIDGECTL_1, 2);
pcib_cfg_save(sc);
/*
@@ -950,7 +951,7 @@ pcib_attach_common(device_t dev)
* Quirk handling.
*/
switch (pci_get_devid(dev)) {
-#if !defined(NEW_PCIB) && !defined(PCI_RES_BUS)
+#if !(defined(NEW_PCIB) && defined(PCI_RES_BUS))
case 0x12258086: /* Intel 82454KX/GX (Orion) */
{
uint8_t supbus;
@@ -976,7 +977,7 @@ pcib_attach_common(device_t dev)
sc->flags |= PCIB_SUBTRACTIVE;
break;
-#if !defined(NEW_PCIB) && !defined(PCI_RES_BUS)
+#if !(defined(NEW_PCIB) && defined(PCI_RES_BUS))
/* Compaq R3000 BIOS sets wrong subordinate bus number. */
case 0x00dd10de:
{
@@ -1101,32 +1102,15 @@ pcib_attach(device_t dev)
int
pcib_suspend(device_t dev)
{
- device_t pcib;
- int dstate, error;
pcib_cfg_save(device_get_softc(dev));
- error = bus_generic_suspend(dev);
- if (error == 0 && pci_do_power_suspend) {
- dstate = PCI_POWERSTATE_D3;
- pcib = device_get_parent(device_get_parent(dev));
- if (PCIB_POWER_FOR_SLEEP(pcib, dev, &dstate) == 0)
- pci_set_powerstate(dev, dstate);
- }
- return (error);
+ return (bus_generic_suspend(dev));
}
int
pcib_resume(device_t dev)
{
- device_t pcib;
- int dstate;
-
- if (pci_do_power_resume) {
- pcib = device_get_parent(device_get_parent(dev));
- dstate = PCI_POWERSTATE_D0;
- if (PCIB_POWER_FOR_SLEEP(pcib, dev, &dstate) == 0)
- pci_set_powerstate(dev, dstate);
- }
+
pcib_cfg_restore(device_get_softc(dev));
return (bus_generic_resume(dev));
}
diff --git a/sys/dev/pci/pci_subr.c b/sys/dev/pci/pci_subr.c
index 5d0db36..03bcdc0 100644
--- a/sys/dev/pci/pci_subr.c
+++ b/sys/dev/pci/pci_subr.c
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2011 Advanced Computing Technologies LLC
+ * Copyright (c) 2011 Hudson River Trading LLC
* Written by: John H. Baldwin <jhb@FreeBSD.org>
* All rights reserved.
*
diff --git a/sys/dev/pci/pcib_private.h b/sys/dev/pci/pcib_private.h
index d8d82b6..20cb014 100644
--- a/sys/dev/pci/pcib_private.h
+++ b/sys/dev/pci/pcib_private.h
@@ -106,7 +106,6 @@ struct pcib_softc
#define PCIB_DISABLE_MSI 0x2
#define PCIB_DISABLE_MSIX 0x4
#define PCIB_ENABLE_ARI 0x8
- uint16_t command; /* command register */
u_int domain; /* domain number */
u_int pribus; /* primary bus number */
struct pcib_secbus bus; /* secondary bus numbers */
@@ -122,9 +121,7 @@ struct pcib_softc
uint32_t iobase; /* base address of port window */
uint32_t iolimit; /* topmost address of port window */
#endif
- uint16_t secstat; /* secondary bus status register */
uint16_t bridgectl; /* bridge control register */
- uint8_t seclat; /* secondary bus latency timer */
};
#define PCIB_SUPPORTED_ARI_VER 1
diff --git a/sys/dev/pci/pcivar.h b/sys/dev/pci/pcivar.h
index 478c98e..2fd76b6 100644
--- a/sys/dev/pci/pcivar.h
+++ b/sys/dev/pci/pcivar.h
@@ -41,6 +41,15 @@ typedef uint64_t pci_addr_t;
struct nvlist;
+/* Config registers for PCI-PCI and PCI-Cardbus bridges. */
+struct pcicfg_bridge {
+ uint8_t br_seclat;
+ uint8_t br_subbus;
+ uint8_t br_secbus;
+ uint8_t br_pribus;
+ uint16_t br_control;
+};
+
/* Interesting values for PCI power management */
struct pcicfg_pp {
uint16_t pp_cap; /* PCI power management capabilities */
@@ -190,6 +199,7 @@ typedef struct pcicfg {
uint32_t flags; /* flags defined above */
size_t devinfo_size; /* Size of devinfo for this bus type. */
+ struct pcicfg_bridge bridge; /* Bridges */
struct pcicfg_pp pp; /* Power management */
struct pcicfg_vpd vpd; /* Vital product data */
struct pcicfg_msi msi; /* PCI MSI */
diff --git a/sys/dev/psci/psci.c b/sys/dev/psci/psci.c
new file mode 100644
index 0000000..67f700a
--- /dev/null
+++ b/sys/dev/psci/psci.c
@@ -0,0 +1,286 @@
+/*-
+ * Copyright (c) 2014 Robin Randhawa
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+/*
+ * This implements support for ARM's Power State Co-ordination Interface
+ * [PSCI]. The implementation adheres to version 0.2 of the PSCI specification
+ * but also supports v0.1. PSCI standardizes operations such as system reset, CPU
+ * on/off/suspend. PSCI requires a compliant firmware implementation.
+ *
+ * The PSCI specification used for this implementation is available at:
+ *
+ * <http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.den0022b/index.html>.
+ *
+ * TODO:
+ * - Add support for remaining PSCI calls [this implementation only
+ * supports get_version, system_reset and cpu_on].
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/bus.h>
+#include <sys/eventhandler.h>
+#include <sys/kernel.h>
+#include <sys/module.h>
+#include <sys/reboot.h>
+
+#include <machine/bus.h>
+
+#include <dev/fdt/fdt_common.h>
+#include <dev/ofw/openfirm.h>
+#include <dev/ofw/ofw_bus.h>
+#include <dev/ofw/ofw_bus_subr.h>
+
+#include <dev/psci/psci.h>
+
+struct psci_softc {
+ device_t dev;
+
+ psci_callfn_t psci_call;
+ uint32_t psci_fnids[PSCI_FN_MAX];
+};
+
+static int psci_v0_1_init(device_t dev);
+static int psci_v0_2_init(device_t dev);
+
+struct psci_softc *psci_softc = NULL;
+
+static struct ofw_compat_data compat_data[] = {
+ {"arm,psci-0.2", (uintptr_t)psci_v0_2_init},
+ {"arm,psci", (uintptr_t)psci_v0_1_init},
+ {NULL, 0}
+};
+
+static int psci_probe(device_t dev);
+static int psci_attach(device_t dev);
+static void psci_shutdown(void *, int);
+
+static device_method_t psci_methods[] = {
+ DEVMETHOD(device_probe, psci_probe),
+ DEVMETHOD(device_attach, psci_attach),
+
+ DEVMETHOD_END
+};
+
+static driver_t psci_driver = {
+ "psci",
+ psci_methods,
+ sizeof(struct psci_softc),
+};
+
+static devclass_t psci_devclass;
+
+EARLY_DRIVER_MODULE(psci, simplebus, psci_driver, psci_devclass, 0, 0,
+ BUS_PASS_CPU + BUS_PASS_ORDER_FIRST);
+EARLY_DRIVER_MODULE(psci, ofwbus, psci_driver, psci_devclass, 0, 0,
+ BUS_PASS_CPU + BUS_PASS_ORDER_FIRST);
+
+static int
+psci_probe(device_t dev)
+{
+ const struct ofw_compat_data *ocd;
+
+ if (!ofw_bus_status_okay(dev))
+ return (ENXIO);
+
+ ocd = ofw_bus_search_compatible(dev, compat_data);
+ if (ocd->ocd_str == NULL)
+ return (ENXIO);
+
+ device_set_desc(dev, "ARM Power State Co-ordination Interface Driver");
+
+ return (BUS_PROBE_SPECIFIC);
+}
+
+static int
+psci_attach(device_t dev)
+{
+ struct psci_softc *sc = device_get_softc(dev);
+ const struct ofw_compat_data *ocd;
+ psci_initfn_t psci_init;
+ phandle_t node;
+ char method[16];
+
+ if (psci_softc != NULL)
+ return (ENXIO);
+
+ ocd = ofw_bus_search_compatible(dev, compat_data);
+ psci_init = (psci_initfn_t)ocd->ocd_data;
+ KASSERT(psci_init != NULL, ("PSCI init function cannot be NULL"));
+
+ node = ofw_bus_get_node(dev);
+ if ((OF_getprop(node, "method", method, sizeof(method))) > 0) {
+ if (strcmp(method, "hvc") == 0)
+ sc->psci_call = psci_hvc_despatch;
+ else if (strcmp(method, "smc") == 0)
+ sc->psci_call = psci_smc_despatch;
+ else {
+ device_printf(dev,
+ "psci_attach: PSCI conduit \"%s\" invalid\n",
+ method);
+ return (ENXIO);
+ }
+ } else {
+ device_printf(dev,
+ "psci_attach: PSCI conduit not supplied in the DT\n");
+ return (ENXIO);
+ }
+
+ if (psci_init(dev))
+ return (ENXIO);
+
+ psci_softc = sc;
+
+ return (0);
+}
+
+static int
+psci_get_version(struct psci_softc *sc)
+{
+ uint32_t fnid;
+
+ /* PSCI version wasn't supported in v0.1. */
+ fnid = sc->psci_fnids[PSCI_FN_VERSION];
+ if (fnid)
+ return (sc->psci_call(fnid, 0, 0, 0));
+
+ return (PSCI_RETVAL_NOT_SUPPORTED);
+}
+
+int
+psci_cpu_on(unsigned long cpu, unsigned long entry, unsigned long context_id)
+{
+
+ /* PSCI v0.1 and v0.2 both support cpu_on. */
+ return(psci_softc->psci_call(psci_softc->psci_fnids[PSCI_FN_CPU_ON], cpu,
+ entry, context_id));
+}
+
+static void
+psci_shutdown(void *xsc, int howto)
+{
+ uint32_t fn = 0;
+
+ /* PSCI system_off and system_reset werent't supported in v0.1. */
+ if ((howto & RB_POWEROFF) != 0)
+ fn = psci_softc->psci_fnids[PSCI_FN_SYSTEM_OFF];
+ else if ((howto & RB_HALT) == 0)
+ fn = psci_softc->psci_fnids[PSCI_FN_SYSTEM_RESET];
+
+ if (fn)
+ psci_softc->psci_call(fn, 0, 0, 0);
+
+ /* System reset and off do not return. */
+}
+
+static int
+psci_v0_1_init(device_t dev)
+{
+ struct psci_softc *sc = device_get_softc(dev);
+ int psci_fn;
+ uint32_t psci_fnid;
+ phandle_t node;
+ int len;
+
+
+ /* Zero out the function ID table - Is this needed ? */
+ for (psci_fn = PSCI_FN_VERSION, psci_fnid = PSCI_FNID_VERSION;
+ psci_fn < PSCI_FN_MAX; psci_fn++, psci_fnid++)
+ sc->psci_fnids[psci_fn] = 0;
+
+ /* PSCI v0.1 doesn't specify function IDs. Get them from DT */
+ node = ofw_bus_get_node(dev);
+
+ if ((len = OF_getproplen(node, "cpu_suspend")) > 0) {
+ OF_getencprop(node, "cpu_suspend", &psci_fnid, len);
+ sc->psci_fnids[PSCI_FN_CPU_SUSPEND] = psci_fnid;
+ }
+
+ if ((len = OF_getproplen(node, "cpu_on")) > 0) {
+ OF_getencprop(node, "cpu_on", &psci_fnid, len);
+ sc->psci_fnids[PSCI_FN_CPU_ON] = psci_fnid;
+ }
+
+ if ((len = OF_getproplen(node, "cpu_off")) > 0) {
+ OF_getencprop(node, "cpu_off", &psci_fnid, len);
+ sc->psci_fnids[PSCI_FN_CPU_OFF] = psci_fnid;
+ }
+
+ if ((len = OF_getproplen(node, "migrate")) > 0) {
+ OF_getencprop(node, "migrate", &psci_fnid, len);
+ sc->psci_fnids[PSCI_FN_MIGRATE] = psci_fnid;
+ }
+
+ if (bootverbose)
+ device_printf(dev, "PSCI version 0.1 available\n");
+
+ return(0);
+}
+
+static int
+psci_v0_2_init(device_t dev)
+{
+ struct psci_softc *sc = device_get_softc(dev);
+ int version;
+
+ /* PSCI v0.2 specifies explicit function IDs. */
+ sc->psci_fnids[PSCI_FN_VERSION] = PSCI_FNID_VERSION;
+ sc->psci_fnids[PSCI_FN_CPU_SUSPEND] = PSCI_FNID_CPU_SUSPEND;
+ sc->psci_fnids[PSCI_FN_CPU_OFF] = PSCI_FNID_CPU_OFF;
+ sc->psci_fnids[PSCI_FN_CPU_ON] = PSCI_FNID_CPU_ON;
+ sc->psci_fnids[PSCI_FN_AFFINITY_INFO] = PSCI_FNID_AFFINITY_INFO;
+ sc->psci_fnids[PSCI_FN_MIGRATE] = PSCI_FNID_MIGRATE;
+ sc->psci_fnids[PSCI_FN_MIGRATE_INFO_TYPE] = PSCI_FNID_MIGRATE_INFO_TYPE;
+ sc->psci_fnids[PSCI_FN_MIGRATE_INFO_UP_CPU] = PSCI_FNID_MIGRATE_INFO_UP_CPU;
+ sc->psci_fnids[PSCI_FN_SYSTEM_OFF] = PSCI_FNID_SYSTEM_OFF;
+ sc->psci_fnids[PSCI_FN_SYSTEM_RESET] = PSCI_FNID_SYSTEM_RESET;
+
+ version = psci_get_version(sc);
+
+ if (version == PSCI_RETVAL_NOT_SUPPORTED)
+ return (1);
+
+ if ((PSCI_VER_MAJOR(version) != 0) && (PSCI_VER_MINOR(version) != 2)) {
+ device_printf(dev, "PSCI version number mismatched with DT\n");
+ return (1);
+ }
+
+ if (bootverbose)
+ device_printf(dev, "PSCI version 0.2 available\n");
+
+ /*
+ * We only register this for v0.2 since v0.1 doesn't support
+ * system_reset.
+ */
+ EVENTHANDLER_REGISTER(shutdown_final, psci_shutdown, sc,
+ SHUTDOWN_PRI_LAST);
+
+ return (0);
+}
diff --git a/sys/dev/psci/psci.h b/sys/dev/psci/psci.h
new file mode 100644
index 0000000..58f1e79
--- /dev/null
+++ b/sys/dev/psci/psci.h
@@ -0,0 +1,102 @@
+/*-
+ * Copyright (c) 2013, 2014 Robin Randhawa
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _MACHINE_PSCI_H_
+#define _MACHINE_PSCI_H_
+
+#include <sys/types.h>
+
+typedef int (*psci_initfn_t)(device_t dev);
+typedef int (*psci_callfn_t)(register_t, register_t, register_t, register_t);
+
+extern int psci_present;
+
+void psci_system_reset(void);
+int psci_cpu_on(unsigned long, unsigned long, unsigned long);
+int psci_hvc_despatch(register_t, register_t, register_t, register_t);
+int psci_smc_despatch(register_t, register_t, register_t, register_t);
+
+
+/*
+ * PSCI return codes.
+ */
+#define PSCI_RETVAL_SUCCESS 0
+#define PSCI_RETVAL_NOT_SUPPORTED -1
+#define PSCI_RETVAL_INVALID_PARAMS -2
+#define PSCI_RETVAL_DENIED -3
+#define PSCI_RETVAL_ALREADY_ON -4
+#define PSCI_RETVAL_ON_PENDING -5
+#define PSCI_RETVAL_INTERNAL_FAILURE -6
+#define PSCI_RETVAL_NOT_PRESENT -7
+#define PSCI_RETVAL_DISABLED -8
+
+/*
+ * PSCI function codes (as per PSCI v0.2).
+ */
+#ifdef __aarch64__
+#define PSCI_FNID_VERSION 0x84000000
+#define PSCI_FNID_CPU_SUSPEND 0xc4000001
+#define PSCI_FNID_CPU_OFF 0x84000002
+#define PSCI_FNID_CPU_ON 0xc4000003
+#define PSCI_FNID_AFFINITY_INFO 0xc4000004
+#define PSCI_FNID_MIGRATE 0xc4000005
+#define PSCI_FNID_MIGRATE_INFO_TYPE 0x84000006
+#define PSCI_FNID_MIGRATE_INFO_UP_CPU 0xc4000007
+#define PSCI_FNID_SYSTEM_OFF 0x84000008
+#define PSCI_FNID_SYSTEM_RESET 0x84000009
+#else
+#define PSCI_FNID_VERSION 0x84000000
+#define PSCI_FNID_CPU_SUSPEND 0x84000001
+#define PSCI_FNID_CPU_OFF 0x84000002
+#define PSCI_FNID_CPU_ON 0x84000003
+#define PSCI_FNID_AFFINITY_INFO 0x84000004
+#define PSCI_FNID_MIGRATE 0x84000005
+#define PSCI_FNID_MIGRATE_INFO_TYPE 0x84000006
+#define PSCI_FNID_MIGRATE_INFO_UP_CPU 0x84000007
+#define PSCI_FNID_SYSTEM_OFF 0x84000008
+#define PSCI_FNID_SYSTEM_RESET 0x84000009
+#endif
+
+#define PSCI_VER_MAJOR(v) (((v) >> 16) & 0xFF)
+#define PSCI_VER_MINOR(v) ((v) & 0xFF)
+
+enum psci_fn {
+ PSCI_FN_VERSION,
+ PSCI_FN_CPU_SUSPEND,
+ PSCI_FN_CPU_OFF,
+ PSCI_FN_CPU_ON,
+ PSCI_FN_AFFINITY_INFO,
+ PSCI_FN_MIGRATE,
+ PSCI_FN_MIGRATE_INFO_TYPE,
+ PSCI_FN_MIGRATE_INFO_UP_CPU,
+ PSCI_FN_SYSTEM_OFF,
+ PSCI_FN_SYSTEM_RESET,
+ PSCI_FN_MAX
+};
+
+#endif /* _MACHINE_PSCI_H_ */
diff --git a/sys/dev/psci/psci_arm.S b/sys/dev/psci/psci_arm.S
new file mode 100644
index 0000000..987e3d1
--- /dev/null
+++ b/sys/dev/psci/psci_arm.S
@@ -0,0 +1,47 @@
+/*-
+ * Copyright (c) 2015 Andrew Turner
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+#include <machine/asm.h>
+__FBSDID("$FreeBSD$");
+
+.arch_extension virt /* For hvc */
+
+/*
+ * int psci_hvc_despatch(register_t psci_fnid, register_t...)
+ */
+ENTRY(psci_hvc_despatch)
+ hvc #0
+ RET
+END(psci_hvc_despatch)
+
+/*
+ * int psci_smc_despatch(register_t psci_fnid, register_t...)
+ */
+ENTRY(psci_smc_despatch)
+ smc #0
+ RET
+END(psci_hvc_despatch)
diff --git a/sys/dev/psci/psci_arm64.S b/sys/dev/psci/psci_arm64.S
new file mode 100644
index 0000000..039ba1f
--- /dev/null
+++ b/sys/dev/psci/psci_arm64.S
@@ -0,0 +1,49 @@
+/*-
+ * Copyright (c) 2013, 2014 Robin Randhawa
+ * Copyright (c) 2015 The FreeBSD Foundation
+ * All rights reserved.
+ *
+ * This software was developed by Andrew Turner under
+ * sponsorship from the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+#include <machine/asm.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * uint64_t psci_hvc_despatch(uint64_t psci_fnid, uint64_t, uint64_t, uint64_t)
+ */
+ENTRY(psci_hvc_despatch)
+ hvc #0
+ ret
+END(psci_hvc_despatch)
+
+/*
+ * uint64_t psci_smc_despatch(uint64_t psci_fnid, uint64_t, uint64_t, uint64_t)
+ */
+ENTRY(psci_smc_despatch)
+ smc #0
+ ret
+END(psci_hvc_despatch)
diff --git a/sys/dev/re/if_re.c b/sys/dev/re/if_re.c
index e27a812..a67d367 100644
--- a/sys/dev/re/if_re.c
+++ b/sys/dev/re/if_re.c
@@ -3196,11 +3196,6 @@ re_init_locked(struct rl_softc *sc)
~0x00080000);
/*
- * Enable transmit and receive.
- */
- CSR_WRITE_1(sc, RL_COMMAND, RL_CMD_TX_ENB|RL_CMD_RX_ENB);
-
- /*
* Set the initial TX configuration.
*/
if (sc->rl_testmode) {
@@ -3226,6 +3221,11 @@ re_init_locked(struct rl_softc *sc)
CSR_WRITE_2(sc, RL_INTRMOD, 0x5100);
}
+ /*
+ * Enable transmit and receive.
+ */
+ CSR_WRITE_1(sc, RL_COMMAND, RL_CMD_TX_ENB | RL_CMD_RX_ENB);
+
#ifdef DEVICE_POLLING
/*
* Disable interrupts if we are polling.
@@ -3249,10 +3249,6 @@ re_init_locked(struct rl_softc *sc)
/* Start RX/TX process. */
CSR_WRITE_4(sc, RL_MISSEDPKT, 0);
-#ifdef notdef
- /* Enable receiver and transmitter. */
- CSR_WRITE_1(sc, RL_COMMAND, RL_CMD_TX_ENB|RL_CMD_RX_ENB);
-#endif
/*
* Initialize the timer interrupt register so that
diff --git a/sys/dev/smbus/smb.c b/sys/dev/smbus/smb.c
index 579204d..e842441 100644
--- a/sys/dev/smbus/smb.c
+++ b/sys/dev/smbus/smb.c
@@ -26,10 +26,6 @@
* $FreeBSD$
*/
-#ifdef HAVE_KERNEL_OPTION_HEADERS
-#include "opt_compat.h"
-#endif
-
#include <sys/param.h>
#include <sys/kernel.h>
#include <sys/systm.h>
@@ -104,19 +100,24 @@ smb_identify(driver_t *driver, device_t parent)
static int
smb_probe(device_t dev)
{
- device_set_desc(dev, "SMBus generic I/O");
+ if (smbus_get_addr(dev) != -1)
+ return (ENXIO);
- return (0);
+ device_set_desc(dev, "SMBus generic I/O");
+ return (BUS_PROBE_NOWILDCARD);
}
static int
smb_attach(device_t dev)
{
struct smb_softc *sc = device_get_softc(dev);
-
+ int unit;
+
+ unit = device_get_unit(dev);
sc->sc_dev = dev;
- sc->sc_devnode = make_dev(&smb_cdevsw, device_get_unit(dev),
- UID_ROOT, GID_WHEEL, 0600, "smb%d", device_get_unit(dev));
+
+ sc->sc_devnode = make_dev(&smb_cdevsw, unit, UID_ROOT, GID_WHEEL,
+ 0600, "smb%d", unit);
sc->sc_devnode->si_drv1 = sc;
mtx_init(&sc->sc_lock, device_get_nameunit(dev), NULL, MTX_DEF);
@@ -174,9 +175,16 @@ smbioctl(struct cdev *dev, u_long cmd, caddr_t data, int flags, struct thread *t
struct smb_softc *sc = dev->si_drv1;
device_t smbdev = sc->sc_dev;
int error;
- short w;
- u_char count;
- char c;
+ int unit;
+ u_char bcount;
+
+ /*
+ * If a specific slave device is being used, override any passed-in
+ * slave.
+ */
+ unit = dev2unit(dev);
+ if (unit & 0x0400)
+ s->slave = unit & 0x03ff;
parent = device_get_parent(smbdev);
@@ -208,77 +216,101 @@ smbioctl(struct cdev *dev, u_long cmd, caddr_t data, int flags, struct thread *t
case SMB_WRITEB:
error = smbus_error(smbus_writeb(parent, s->slave, s->cmd,
- s->data.byte));
+ s->wdata.byte));
break;
case SMB_WRITEW:
error = smbus_error(smbus_writew(parent, s->slave,
- s->cmd, s->data.word));
+ s->cmd, s->wdata.word));
break;
case SMB_READB:
- if (s->data.byte_ptr) {
- error = smbus_error(smbus_readb(parent, s->slave,
- s->cmd, &c));
- if (error)
- break;
- error = copyout(&c, s->data.byte_ptr,
- sizeof(*(s->data.byte_ptr)));
+ error = smbus_error(smbus_readb(parent, s->slave, s->cmd,
+ &s->rdata.byte));
+ if (error)
+ break;
+ if (s->rbuf && s->rcount >= 1) {
+ error = copyout(&s->rdata.byte, s->rbuf, 1);
+ s->rcount = 1;
}
break;
case SMB_READW:
- if (s->data.word_ptr) {
- error = smbus_error(smbus_readw(parent, s->slave,
- s->cmd, &w));
- if (error == 0) {
- error = copyout(&w, s->data.word_ptr,
- sizeof(*(s->data.word_ptr)));
- }
+ error = smbus_error(smbus_readw(parent, s->slave, s->cmd,
+ &s->rdata.word));
+ if (error)
+ break;
+ if (s->rbuf && s->rcount >= 2) {
+ buf[0] = (u_char)s->rdata.word;
+ buf[1] = (u_char)(s->rdata.word >> 8);
+ error = copyout(buf, s->rbuf, 2);
+ s->rcount = 2;
}
break;
case SMB_PCALL:
- if (s->data.process.rdata) {
-
- error = smbus_error(smbus_pcall(parent, s->slave, s->cmd,
- s->data.process.sdata, &w));
- if (error)
- break;
- error = copyout(&w, s->data.process.rdata,
- sizeof(*(s->data.process.rdata)));
+ error = smbus_error(smbus_pcall(parent, s->slave, s->cmd,
+ s->wdata.word, &s->rdata.word));
+ if (error)
+ break;
+ if (s->rbuf && s->rcount >= 2) {
+ buf[0] = (u_char)s->rdata.word;
+ buf[1] = (u_char)(s->rdata.word >> 8);
+ error = copyout(buf, s->rbuf, 2);
+ s->rcount = 2;
}
-
+
break;
case SMB_BWRITE:
- if (s->count && s->data.byte_ptr) {
- if (s->count > SMB_MAXBLOCKSIZE)
- s->count = SMB_MAXBLOCKSIZE;
- error = copyin(s->data.byte_ptr, buf, s->count);
- if (error)
- break;
- error = smbus_error(smbus_bwrite(parent, s->slave,
- s->cmd, s->count, buf));
+ if (s->wcount < 0) {
+ error = EINVAL;
+ break;
}
+ if (s->wcount > SMB_MAXBLOCKSIZE)
+ s->wcount = SMB_MAXBLOCKSIZE;
+ if (s->wcount)
+ error = copyin(s->wbuf, buf, s->wcount);
+ if (error)
+ break;
+ error = smbus_error(smbus_bwrite(parent, s->slave, s->cmd,
+ s->wcount, buf));
break;
-#if defined(COMPAT_FREEBSD4) || defined(COMPAT_FREEBSD5) || defined(COMPAT_FREEBSD6)
- case SMB_OLD_BREAD:
-#endif
case SMB_BREAD:
- if (s->count && s->data.byte_ptr) {
- count = min(s->count, SMB_MAXBLOCKSIZE);
- error = smbus_error(smbus_bread(parent, s->slave,
- s->cmd, &count, buf));
- if (error)
- break;
- error = copyout(buf, s->data.byte_ptr,
- min(count, s->count));
- s->count = count;
+ if (s->rcount < 0) {
+ error = EINVAL;
+ break;
+ }
+ if (s->rcount > SMB_MAXBLOCKSIZE)
+ s->rcount = SMB_MAXBLOCKSIZE;
+ error = smbus_error(smbus_bread(parent, s->slave, s->cmd,
+ &bcount, buf));
+ if (error)
+ break;
+ if (s->rcount > bcount)
+ s->rcount = bcount;
+ error = copyout(buf, s->rbuf, s->rcount);
+ break;
+
+ case SMB_TRANS:
+ if (s->rcount < 0 || s->wcount < 0) {
+ error = EINVAL;
+ break;
}
+ if (s->rcount > SMB_MAXBLOCKSIZE)
+ s->rcount = SMB_MAXBLOCKSIZE;
+ if (s->wcount > SMB_MAXBLOCKSIZE)
+ s->wcount = SMB_MAXBLOCKSIZE;
+ if (s->wcount)
+ error = copyin(s->wbuf, buf, s->wcount);
+ if (error)
+ break;
+ error = smbus_error(smbus_trans(parent, s->slave, s->cmd,
+ s->op, buf, s->wcount, buf, s->rcount, &s->rcount));
+ if (error == 0)
+ error = copyout(buf, s->rbuf, s->rcount);
break;
-
default:
error = ENOTTY;
}
diff --git a/sys/dev/smbus/smb.h b/sys/dev/smbus/smb.h
index 32347f8..8007653 100644
--- a/sys/dev/smbus/smb.h
+++ b/sys/dev/smbus/smb.h
@@ -32,27 +32,33 @@
#include <sys/ioccom.h>
struct smbcmd {
- char cmd;
- int count;
- u_char slave;
+ u_char cmd;
+ u_char reserved;
+ u_short op;
union {
- char byte;
- short word;
-
- char *byte_ptr;
- short *word_ptr;
-
- struct {
- short sdata;
- short *rdata;
- } process;
- } data;
+ char byte;
+ char buf[2];
+ short word;
+ } wdata;
+ union {
+ char byte;
+ char buf[2];
+ short word;
+ } rdata;
+ int slave;
+ char *wbuf; /* use wdata if NULL */
+ int wcount;
+ char *rbuf; /* use rdata if NULL */
+ int rcount;
};
/*
* SMBus spec 2.0 says block transfers may be at most 32 bytes.
+ * We use SMBus for i2c as well, make the size limit something more
+ * reasonable. Keep in mind that a char buf array is declared on the
+ * kernel stack.
*/
-#define SMB_MAXBLOCKSIZE 32
+#define SMB_MAXBLOCKSIZE 1024
#define SMB_QUICK_WRITE _IOW('i', 1, struct smbcmd)
#define SMB_QUICK_READ _IOW('i', 2, struct smbcmd)
@@ -66,5 +72,6 @@ struct smbcmd {
#define SMB_BWRITE _IOW('i', 10, struct smbcmd)
#define SMB_OLD_BREAD _IOW('i', 11, struct smbcmd)
#define SMB_BREAD _IOWR('i', 11, struct smbcmd)
+#define SMB_TRANS _IOWR('i', 12, struct smbcmd)
#endif
diff --git a/sys/dev/smbus/smbconf.h b/sys/dev/smbus/smbconf.h
index a3d403d..f39c442 100644
--- a/sys/dev/smbus/smbconf.h
+++ b/sys/dev/smbus/smbconf.h
@@ -68,9 +68,30 @@
#define SMB_QREAD 0x1
/*
+ * smbus transction op with pass-thru capabilities
+ *
+ * This smbus function is capable of doing a smbus command transaction
+ * (read or write), and can be flagged to not issue the 'cmd' and/or
+ * issue or expect a count field as well as flagged for chaining (no STOP),
+ * which gives it an i2c pass-through capability.
+ *
+ * NOSTOP- Caller chaining transactions, do not issue STOP
+ * NOCMD- Do not transmit the command field
+ * NOCNT- Do not transmit (wr) or expect (rd) the count field
+ */
+#define SMB_TRANS_NOSTOP 0x0001 /* do not send STOP at end */
+#define SMB_TRANS_NOCMD 0x0002 /* ignore cmd field (do not tx) */
+#define SMB_TRANS_NOCNT 0x0004 /* do not tx or rx count field */
+#define SMB_TRANS_7BIT 0x0008 /* change address mode to 7-bit */
+#define SMB_TRANS_10BIT 0x0010 /* change address mode to 10-bit */
+#define SMB_TRANS_NOREPORT 0x0020 /* do not report errors */
+
+/*
* ivars codes
*/
-#define SMBUS_IVAR_ADDR 0x1 /* slave address of the device */
+enum smbus_ivars {
+ SMBUS_IVAR_ADDR, /* slave address of the device */
+};
int smbus_request_bus(device_t, device_t, int);
int smbus_release_bus(device_t, device_t);
@@ -79,7 +100,12 @@ int smbus_error(int error);
void smbus_intr(device_t, u_char, char low, char high, int error);
-u_char smbus_get_addr(device_t);
+#define SMBUS_ACCESSOR(var, ivar, type) \
+ __BUS_ACCESSOR(smbus, var, SMBUS, ivar, type)
+
+SMBUS_ACCESSOR(addr, ADDR, int)
+
+#undef SMBUS_ACCESSOR
extern driver_t smbus_driver;
extern devclass_t smbus_devclass;
@@ -104,6 +130,9 @@ extern devclass_t smbus_devclass;
(SMBUS_BWRITE(device_get_parent(bus), slave, cmd, count, buf))
#define smbus_bread(bus,slave,cmd,count,buf) \
(SMBUS_BREAD(device_get_parent(bus), slave, cmd, count, buf))
+#define smbus_trans(bus,slave,cmd,op,wbuf,wcount,rbuf,rcount,actualp) \
+ (SMBUS_TRANS(device_get_parent(bus), slave, cmd, op, \
+ wbuf, wcount, rbuf, rcount, actualp))
#define SMBUS_MODVER 1
#define SMBUS_MINVER 1
diff --git a/sys/dev/smbus/smbus.c b/sys/dev/smbus/smbus.c
index a111332..389efac 100644
--- a/sys/dev/smbus/smbus.c
+++ b/sys/dev/smbus/smbus.c
@@ -33,11 +33,15 @@ __FBSDID("$FreeBSD$");
#include <sys/lock.h>
#include <sys/module.h>
#include <sys/mutex.h>
-#include <sys/bus.h>
+#include <sys/bus.h>
#include <dev/smbus/smbconf.h>
#include <dev/smbus/smbus.h>
+#include "smbus_if.h"
+#include "bus_if.h"
+
+
/*
* Autoconfiguration and support routines for System Management bus
*/
@@ -49,6 +53,13 @@ static int smbus_probe(device_t);
static int smbus_attach(device_t);
static int smbus_detach(device_t);
+static int smbus_child_location_str(device_t parent, device_t child,
+ char *buf, size_t buflen);
+static int smbus_print_child(device_t parent, device_t child);
+static void smbus_probe_device(device_t dev, u_char* addr);
+static int smbus_read_ivar(device_t parent, device_t child, int which,
+ uintptr_t *result);
+
static device_method_t smbus_methods[] = {
/* device interface */
DEVMETHOD(device_probe, smbus_probe),
@@ -57,6 +68,10 @@ static device_method_t smbus_methods[] = {
/* bus interface */
DEVMETHOD(bus_add_child, bus_generic_add_child),
+ DEVMETHOD(bus_child_location_str, smbus_child_location_str),
+ DEVMETHOD(bus_driver_added, bus_generic_driver_added),
+ DEVMETHOD(bus_print_child, smbus_print_child),
+ DEVMETHOD(bus_read_ivar, smbus_read_ivar),
DEVMETHOD_END
};
@@ -87,9 +102,14 @@ static int
smbus_attach(device_t dev)
{
struct smbus_softc *sc = device_get_softc(dev);
+ unsigned char addr;
mtx_init(&sc->lock, device_get_nameunit(dev), "smbus", MTX_DEF);
bus_generic_probe(dev);
+ for (addr = SMBUS_ADDR_MIN; addr < SMBUS_ADDR_MAX; ++addr) {
+ sc->addrs[addr] = addr;
+ smbus_probe_device(dev, &sc->addrs[addr]);
+ }
bus_generic_attach(dev);
return (0);
@@ -114,4 +134,70 @@ smbus_generic_intr(device_t dev, u_char devaddr, char low, char high, int err)
{
}
+static void
+smbus_probe_device(device_t dev, u_char* addr)
+{
+ device_t child;
+ int error;
+ u_char cmd;
+ u_char buf[2];
+
+ cmd = 0x01;
+ error = smbus_trans(dev, *addr, cmd,
+ SMB_TRANS_NOCNT | SMB_TRANS_NOREPORT,
+ NULL, 0, buf, 1, NULL);
+ if (error == 0) {
+ if (bootverbose)
+ device_printf(dev, "Probed address 0x%02x\n", *addr);
+ child = device_add_child(dev, NULL, -1);
+ device_set_ivars(child, addr);
+ }
+}
+
+static int
+smbus_child_location_str(device_t parent, device_t child, char *buf,
+ size_t buflen)
+{
+ unsigned char *addr;
+
+ addr = device_get_ivars(child);
+ if (addr)
+ snprintf(buf, buflen, "addr=0x%x", *addr);
+ else if (buflen)
+ buf[0] = 0;
+ return (0);
+}
+
+static int
+smbus_print_child(device_t parent, device_t child)
+{
+ unsigned char *addr;
+ int retval;
+
+ addr = device_get_ivars(child);
+ retval = bus_print_child_header(parent, child);
+ if (addr)
+ retval += printf(" at addr 0x%x", *addr);
+ retval += bus_print_child_footer(parent, child);
+
+ return (retval);
+}
+
+static int
+smbus_read_ivar(device_t parent, device_t child, int which,
+ uintptr_t *result)
+{
+ unsigned char *addr;
+
+ addr = device_get_ivars(child);
+ switch (which) {
+ case SMBUS_IVAR_ADDR:
+ *result = (addr == NULL) ? -1 : *addr;
+ break;
+ default:
+ return (ENOENT);
+ }
+ return (0);
+}
+
MODULE_VERSION(smbus, SMBUS_MODVER);
diff --git a/sys/dev/smbus/smbus.h b/sys/dev/smbus/smbus.h
index 5626835..2093aa0 100644
--- a/sys/dev/smbus/smbus.h
+++ b/sys/dev/smbus/smbus.h
@@ -29,9 +29,13 @@
#ifndef __SMBUS_H
#define __SMBUS_H
+#define SMBUS_ADDR_MIN 0x10
+#define SMBUS_ADDR_MAX 0x70
+
struct smbus_softc {
device_t owner; /* smbus owner device structure */
struct mtx lock;
+ unsigned char addrs[SMBUS_ADDR_MAX];
};
void smbus_generic_intr(device_t dev, u_char devaddr, char low, char high, int err);
diff --git a/sys/dev/smbus/smbus_if.m b/sys/dev/smbus/smbus_if.m
index d969e25..6a5acf5 100644
--- a/sys/dev/smbus/smbus_if.m
+++ b/sys/dev/smbus/smbus_if.m
@@ -149,3 +149,20 @@ METHOD int bread {
u_char *count;
char *buf;
};
+
+#
+# SMB roll-up transaction with flags that also allow it to be
+# used for (mostly) i2c pass-through and with 10-bit addresses.
+# This function can be used to roll-up all of the above functions.
+#
+METHOD int trans {
+ device_t dev;
+ int slave;
+ char cmd;
+ int op;
+ char *wbuf;
+ int wcount;
+ char *rbuf;
+ int rcount;
+ int *actualp;
+};
diff --git a/sys/dev/sound/pci/hda/hdaa_patches.c b/sys/dev/sound/pci/hda/hdaa_patches.c
index 44b7242..8852215 100644
--- a/sys/dev/sound/pci/hda/hdaa_patches.c
+++ b/sys/dev/sound/pci/hda/hdaa_patches.c
@@ -401,6 +401,13 @@ hdac_pin_patch(struct hdaa_widget *w)
patch = "as=1 seq=15";
break;
}
+ } else if (id == HDA_CODEC_ALC292 &&
+ subid == LENOVO_X120BS_SUBVENDOR) {
+ switch (nid) {
+ case 21:
+ patch = "as=1 seq=15";
+ break;
+ }
}
if (patch != NULL)
diff --git a/sys/dev/sound/pci/hda/hdac.c b/sys/dev/sound/pci/hda/hdac.c
index 925ff3f..1e173c6 100644
--- a/sys/dev/sound/pci/hda/hdac.c
+++ b/sys/dev/sound/pci/hda/hdac.c
@@ -81,6 +81,8 @@ static const struct {
{ HDA_INTEL_HSW1, "Intel Haswell", 0, 0 },
{ HDA_INTEL_HSW2, "Intel Haswell", 0, 0 },
{ HDA_INTEL_HSW3, "Intel Haswell", 0, 0 },
+ { HDA_INTEL_BDW1, "Intel Broadwell", 0, 0 },
+ { HDA_INTEL_BDW2, "Intel Broadwell", 0, 0 },
{ HDA_INTEL_CPT, "Intel Cougar Point", 0, 0 },
{ HDA_INTEL_PATSBURG,"Intel Patsburg", 0, 0 },
{ HDA_INTEL_PPT1, "Intel Panther Point", 0, 0 },
diff --git a/sys/dev/sound/pci/hda/hdac.h b/sys/dev/sound/pci/hda/hdac.h
index 153426d..9538b307 100644
--- a/sys/dev/sound/pci/hda/hdac.h
+++ b/sys/dev/sound/pci/hda/hdac.h
@@ -46,6 +46,7 @@
#define HDA_INTEL_HSW1 HDA_MODEL_CONSTRUCT(INTEL, 0x0a0c)
#define HDA_INTEL_HSW2 HDA_MODEL_CONSTRUCT(INTEL, 0x0c0c)
#define HDA_INTEL_HSW3 HDA_MODEL_CONSTRUCT(INTEL, 0x0d0c)
+#define HDA_INTEL_BDW1 HDA_MODEL_CONSTRUCT(INTEL, 0x160c)
#define HDA_INTEL_CPT HDA_MODEL_CONSTRUCT(INTEL, 0x1c20)
#define HDA_INTEL_PATSBURG HDA_MODEL_CONSTRUCT(INTEL, 0x1d20)
#define HDA_INTEL_PPT1 HDA_MODEL_CONSTRUCT(INTEL, 0x1e20)
@@ -67,6 +68,7 @@
#define HDA_INTEL_WELLS2 HDA_MODEL_CONSTRUCT(INTEL, 0x8d21)
#define HDA_INTEL_LPTLP1 HDA_MODEL_CONSTRUCT(INTEL, 0x9c20)
#define HDA_INTEL_LPTLP2 HDA_MODEL_CONSTRUCT(INTEL, 0x9c21)
+#define HDA_INTEL_BDW2 HDA_MODEL_CONSTRUCT(INTEL, 0x9ca0)
#define HDA_INTEL_ALL HDA_MODEL_CONSTRUCT(INTEL, 0xffff)
/* Nvidia */
@@ -235,6 +237,7 @@
#define LENOVO_TCA55_SUBVENDOR HDA_MODEL_CONSTRUCT(LENOVO, 0x1015)
#define LENOVO_X1_SUBVENDOR HDA_MODEL_CONSTRUCT(LENOVO, 0x21e8)
#define LENOVO_X1CRBN_SUBVENDOR HDA_MODEL_CONSTRUCT(LENOVO, 0x21f9)
+#define LENOVO_X120BS_SUBVENDOR HDA_MODEL_CONSTRUCT(LENOVO, 0x2227)
#define LENOVO_X220_SUBVENDOR HDA_MODEL_CONSTRUCT(LENOVO, 0x21da)
#define LENOVO_X300_SUBVENDOR HDA_MODEL_CONSTRUCT(LENOVO, 0x20ac)
#define LENOVO_T400_SUBVENDOR HDA_MODEL_CONSTRUCT(LENOVO, 0x20f2)
@@ -338,6 +341,7 @@
#define HDA_CODEC_ALC273 HDA_CODEC_CONSTRUCT(REALTEK, 0x0273)
#define HDA_CODEC_ALC275 HDA_CODEC_CONSTRUCT(REALTEK, 0x0275)
#define HDA_CODEC_ALC276 HDA_CODEC_CONSTRUCT(REALTEK, 0x0276)
+#define HDA_CODEC_ALC292 HDA_CODEC_CONSTRUCT(REALTEK, 0x0292)
#define HDA_CODEC_ALC660 HDA_CODEC_CONSTRUCT(REALTEK, 0x0660)
#define HDA_CODEC_ALC662 HDA_CODEC_CONSTRUCT(REALTEK, 0x0662)
#define HDA_CODEC_ALC663 HDA_CODEC_CONSTRUCT(REALTEK, 0x0663)
@@ -622,6 +626,7 @@
#define HDA_CODEC_INTELCPT HDA_CODEC_CONSTRUCT(INTEL, 0x2805)
#define HDA_CODEC_INTELPPT HDA_CODEC_CONSTRUCT(INTEL, 0x2806)
#define HDA_CODEC_INTELHSW HDA_CODEC_CONSTRUCT(INTEL, 0x2807)
+#define HDA_CODEC_INTELBDW HDA_CODEC_CONSTRUCT(INTEL, 0x2808)
#define HDA_CODEC_INTELCL HDA_CODEC_CONSTRUCT(INTEL, 0x29fb)
#define HDA_CODEC_INTELXXXX HDA_CODEC_CONSTRUCT(INTEL, 0xffff)
diff --git a/sys/dev/sound/pci/hda/hdacc.c b/sys/dev/sound/pci/hda/hdacc.c
index fcecf33..5b785a8 100644
--- a/sys/dev/sound/pci/hda/hdacc.c
+++ b/sys/dev/sound/pci/hda/hdacc.c
@@ -87,6 +87,7 @@ static const struct {
{ HDA_CODEC_ALC273, 0, "Realtek ALC273" },
{ HDA_CODEC_ALC275, 0, "Realtek ALC275" },
{ HDA_CODEC_ALC276, 0, "Realtek ALC276" },
+ { HDA_CODEC_ALC292, 0, "Realtek ALC292" },
{ HDA_CODEC_ALC660, 0, "Realtek ALC660-VD" },
{ HDA_CODEC_ALC662, 0x0002, "Realtek ALC662 rev2" },
{ HDA_CODEC_ALC662, 0, "Realtek ALC662" },
@@ -319,6 +320,7 @@ static const struct {
{ HDA_CODEC_INTELCPT, 0, "Intel Cougar Point" },
{ HDA_CODEC_INTELPPT, 0, "Intel Panther Point" },
{ HDA_CODEC_INTELHSW, 0, "Intel Haswell" },
+ { HDA_CODEC_INTELBDW, 0, "Intel Broadwell" },
{ HDA_CODEC_INTELCL, 0, "Intel Crestline" },
{ HDA_CODEC_SII1390, 0, "Silicon Image SiI1390" },
{ HDA_CODEC_SII1392, 0, "Silicon Image SiI1392" },
diff --git a/sys/dev/sound/pcm/dsp.c b/sys/dev/sound/pcm/dsp.c
index 68204ff..5b92963 100644
--- a/sys/dev/sound/pcm/dsp.c
+++ b/sys/dev/sound/pcm/dsp.c
@@ -48,6 +48,11 @@ SYSCTL_INT(_hw_snd, OID_AUTO, compat_linux_mmap, CTLFLAG_RWTUN,
&dsp_mmap_allow_prot_exec, 0,
"linux mmap compatibility (-1=force disable 0=auto 1=force enable)");
+static int dsp_basename_clone = 1;
+SYSCTL_INT(_hw_snd, OID_AUTO, basename_clone, CTLFLAG_RWTUN,
+ &dsp_basename_clone, 0,
+ "DSP basename cloning (0: Disable; 1: Enabled)");
+
struct dsp_cdevinfo {
struct pcm_channel *rdch, *wrch;
struct pcm_channel *volch;
@@ -2357,9 +2362,10 @@ dsp_clone(void *arg,
devname = devcmp;
devhw = dsp_cdevs[i].hw;
devcmax = dsp_cdevs[i].max - 1;
- if (strcmp(name, devcmp) == 0)
- unit = snd_unit;
- else if (dsp_stdclone(name, devcmp, devsep,
+ if (strcmp(name, devcmp) == 0) {
+ if (dsp_basename_clone != 0)
+ unit = snd_unit;
+ } else if (dsp_stdclone(name, devcmp, devsep,
dsp_cdevs[i].use_sep, &unit, &cunit) != 0) {
unit = -1;
cunit = -1;
diff --git a/sys/dev/streams/streams.c b/sys/dev/streams/streams.c
index 6a9219e..032d10c 100644
--- a/sys/dev/streams/streams.c
+++ b/sys/dev/streams/streams.c
@@ -180,7 +180,6 @@ MODULE_VERSION(streams, 1);
static int
streamsopen(struct cdev *dev, int oflags, int devtype, struct thread *td)
{
- struct filedesc *fdp;
struct svr4_strm *st;
struct socket *so;
struct file *fp;
@@ -236,14 +235,13 @@ streamsopen(struct cdev *dev, int oflags, int devtype, struct thread *td)
return EOPNOTSUPP;
}
- fdp = td->td_proc->p_fd;
if ((error = falloc(td, &fp, &fd, 0)) != 0)
return error;
/* An extra reference on `fp' has been held for us by falloc(). */
error = socreate(family, &so, type, protocol, td->td_ucred, td);
if (error) {
- fdclose(fdp, fp, fd, td);
+ fdclose(td, fp, fd);
fdrop(fp, td);
return error;
}
diff --git a/sys/dev/uart/uart_bus.h b/sys/dev/uart/uart_bus.h
index 322e9a8..7394651 100644
--- a/sys/dev/uart/uart_bus.h
+++ b/sys/dev/uart/uart_bus.h
@@ -70,6 +70,7 @@ struct uart_class {
struct uart_ops *uc_ops; /* Low-level console operations. */
u_int uc_range; /* Bus space address range. */
u_int uc_rclk; /* Default rclk for this device. */
+ u_int uc_rshift; /* Default regshift for this device. */
};
struct uart_softc {
diff --git a/sys/dev/uart/uart_bus_fdt.c b/sys/dev/uart/uart_bus_fdt.c
index 3c68d95..1498eb8 100644
--- a/sys/dev/uart/uart_bus_fdt.c
+++ b/sys/dev/uart/uart_bus_fdt.c
@@ -63,37 +63,29 @@ static driver_t uart_fdt_driver = {
sizeof(struct uart_softc),
};
-static int
+int
uart_fdt_get_clock(phandle_t node, pcell_t *cell)
{
- pcell_t clock;
-
- /*
- * clock-frequency is a FreeBSD-specific hack. Make its presence optional.
- */
- if ((OF_getprop(node, "clock-frequency", &clock,
- sizeof(clock))) <= 0)
- clock = 0;
- if (clock == 0)
+ /* clock-frequency is a FreeBSD-only extention. */
+ if ((OF_getencprop(node, "clock-frequency", cell,
+ sizeof(*cell))) <= 0) {
/* Try to retrieve parent 'bus-frequency' */
/* XXX this should go to simple-bus fixup or so */
- if ((OF_getprop(OF_parent(node), "bus-frequency", &clock,
- sizeof(clock))) <= 0)
- clock = 0;
+ if ((OF_getencprop(OF_parent(node), "bus-frequency", cell,
+ sizeof(*cell))) <= 0)
+ *cell = 0;
+ }
- *cell = fdt32_to_cpu(clock);
return (0);
}
-static int
+int
uart_fdt_get_shift(phandle_t node, pcell_t *cell)
{
- pcell_t shift;
- if ((OF_getprop(node, "reg-shift", &shift, sizeof(shift))) <= 0)
- shift = 0;
- *cell = fdt32_to_cpu(shift);
+ if ((OF_getencprop(node, "reg-shift", cell, sizeof(*cell))) <= 0)
+ return (-1);
return (0);
}
@@ -132,7 +124,8 @@ uart_fdt_probe(device_t dev)
if ((err = uart_fdt_get_clock(node, &clock)) != 0)
return (err);
- uart_fdt_get_shift(node, &shift);
+ if (uart_fdt_get_shift(node, &shift) != 0)
+ shift = uart_getregshift(sc->sc_class);
return (uart_bus_probe(dev, (int)shift, (int)clock, 0, 0));
}
diff --git a/sys/dev/uart/uart_core.c b/sys/dev/uart/uart_core.c
index eea2d8c..bbb06ff 100644
--- a/sys/dev/uart/uart_core.c
+++ b/sys/dev/uart/uart_core.c
@@ -88,6 +88,12 @@ uart_getrange(struct uart_class *uc)
return ((uc != NULL) ? uc->uc_range : 0);
}
+u_int
+uart_getregshift(struct uart_class *uc)
+{
+ return ((uc != NULL) ? uc->uc_rshift : 0);
+}
+
/*
* Schedule a soft interrupt. We do this on the 0 to !0 transition
* of the TTY pending interrupt status.
diff --git a/sys/dev/uart/uart_cpu.h b/sys/dev/uart/uart_cpu.h
index 2db0412..d9e5410 100644
--- a/sys/dev/uart/uart_cpu.h
+++ b/sys/dev/uart/uart_cpu.h
@@ -79,6 +79,7 @@ int uart_getenv(int, struct uart_devinfo *, struct uart_class *);
const char *uart_getname(struct uart_class *);
struct uart_ops *uart_getops(struct uart_class *);
int uart_getrange(struct uart_class *);
+u_int uart_getregshift(struct uart_class *);
void uart_add_sysdev(struct uart_devinfo *);
diff --git a/sys/dev/uart/uart_cpu_fdt.c b/sys/dev/uart/uart_cpu_fdt.c
index 8dfdb3c..344aad5 100644
--- a/sys/dev/uart/uart_cpu_fdt.c
+++ b/sys/dev/uart/uart_cpu_fdt.c
@@ -42,7 +42,9 @@ __FBSDID("$FreeBSD$");
#include <vm/pmap.h>
#include <machine/bus.h>
+#ifndef __aarch64__
#include <machine/fdt.h>
+#endif
#include <dev/fdt/fdt_common.h>
#include <dev/ofw/ofw_bus.h>
@@ -52,44 +54,16 @@ __FBSDID("$FreeBSD$");
#include <dev/uart/uart_cpu.h>
#include <dev/uart/uart_cpu_fdt.h>
+#ifdef __aarch64__
+extern bus_space_tag_t fdtbus_bs_tag;
+#endif
+
/*
* UART console routines.
*/
bus_space_tag_t uart_bus_space_io;
bus_space_tag_t uart_bus_space_mem;
-static int
-uart_fdt_get_clock(phandle_t node, pcell_t *cell)
-{
- pcell_t clock;
-
- /* clock-frequency is a FreeBSD-only extention. */
- if ((OF_getprop(node, "clock-frequency", &clock,
- sizeof(clock))) <= 0)
- clock = 0;
-
- if (clock == 0)
- /* Try to retrieve parent 'bus-frequency' */
- /* XXX this should go to simple-bus fixup or so */
- if ((OF_getprop(OF_parent(node), "bus-frequency", &clock,
- sizeof(clock))) <= 0)
- clock = 0;
-
- *cell = fdt32_to_cpu(clock);
- return (0);
-}
-
-static int
-uart_fdt_get_shift(phandle_t node, pcell_t *cell)
-{
- pcell_t shift;
-
- if ((OF_getprop(node, "reg-shift", &shift, sizeof(shift))) <= 0)
- shift = 0;
- *cell = fdt32_to_cpu(shift);
- return (0);
-}
-
int
uart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2)
{
@@ -191,15 +165,6 @@ uart_cpu_getdev(int devtype, struct uart_devinfo *di)
return (ENXIO);
/*
- * Retrieve serial attributes.
- */
- uart_fdt_get_shift(node, &shift);
- if (OF_getprop(node, "current-speed", &br, sizeof(br)) <= 0)
- br = 0;
- else
- br = fdt32_to_cpu(br);
-
- /*
* Check old style of UART definition first. Unfortunately, the common
* FDT processing is not possible if we have clock, power domains and
* pinmux stuff.
@@ -218,6 +183,17 @@ uart_cpu_getdev(int devtype, struct uart_devinfo *di)
}
/*
+ * Retrieve serial attributes.
+ */
+ if (uart_fdt_get_shift(node, &shift) != 0)
+ shift = uart_getregshift(class);
+
+ if (OF_getprop(node, "current-speed", &br, sizeof(br)) <= 0)
+ br = 0;
+ else
+ br = fdt32_to_cpu(br);
+
+ /*
* Finalize configuration.
*/
di->bas.chan = 0;
diff --git a/sys/dev/uart/uart_cpu_fdt.h b/sys/dev/uart/uart_cpu_fdt.h
index e7aaecd..b2f2920 100644
--- a/sys/dev/uart/uart_cpu_fdt.h
+++ b/sys/dev/uart/uart_cpu_fdt.h
@@ -50,5 +50,7 @@ SET_DECLARE(uart_fdt_class_set, struct ofw_compat_data );
#define UART_FDT_CLASS(data) \
DATA_SET(uart_fdt_class_set, data)
+int uart_fdt_get_clock(phandle_t node, pcell_t *cell);
+int uart_fdt_get_shift(phandle_t node, pcell_t *cell);
#endif /* _DEV_UART_CPU_FDT_H_ */
diff --git a/sys/dev/uart/uart_dev_imx.c b/sys/dev/uart/uart_dev_imx.c
index 9e34473..bc25df3 100644
--- a/sys/dev/uart/uart_dev_imx.c
+++ b/sys/dev/uart/uart_dev_imx.c
@@ -298,7 +298,8 @@ static struct uart_class uart_imx_class = {
sizeof(struct imx_uart_softc),
.uc_ops = &uart_imx_uart_ops,
.uc_range = 0x100,
- .uc_rclk = 24000000 /* TODO: get value from CCM */
+ .uc_rclk = 24000000, /* TODO: get value from CCM */
+ .uc_rshift = 0
};
static struct ofw_compat_data compat_data[] = {
diff --git a/sys/dev/uart/uart_dev_lpc.c b/sys/dev/uart/uart_dev_lpc.c
index 992e890..6cd10f1 100644
--- a/sys/dev/uart/uart_dev_lpc.c
+++ b/sys/dev/uart/uart_dev_lpc.c
@@ -428,7 +428,8 @@ static struct uart_class uart_lpc_class = {
sizeof(struct lpc_ns8250_softc),
.uc_ops = &uart_lpc_ns8250_ops,
.uc_range = 8,
- .uc_rclk = DEFAULT_RCLK
+ .uc_rclk = DEFAULT_RCLK,
+ .uc_rshift = 0
};
static struct ofw_compat_data compat_data[] = {
diff --git a/sys/dev/uart/uart_dev_msm.c b/sys/dev/uart/uart_dev_msm.c
index 114a415..7ba46ac 100644
--- a/sys/dev/uart/uart_dev_msm.c
+++ b/sys/dev/uart/uart_dev_msm.c
@@ -566,6 +566,7 @@ static struct uart_class uart_msm_class = {
.uc_ops = &uart_msm_ops,
.uc_range = 8,
.uc_rclk = DEF_CLK,
+ .uc_rshift = 0
};
static struct ofw_compat_data compat_data[] = {
diff --git a/sys/dev/uart/uart_dev_ns8250.c b/sys/dev/uart/uart_dev_ns8250.c
index 190ee29..9ff295a 100644
--- a/sys/dev/uart/uart_dev_ns8250.c
+++ b/sys/dev/uart/uart_dev_ns8250.c
@@ -378,7 +378,8 @@ struct uart_class uart_ns8250_class = {
sizeof(struct ns8250_softc),
.uc_ops = &uart_ns8250_ops,
.uc_range = 8,
- .uc_rclk = DEFAULT_RCLK
+ .uc_rclk = DEFAULT_RCLK,
+ .uc_rshift = 0
};
#ifdef FDT
diff --git a/sys/dev/uart/uart_dev_pl011.c b/sys/dev/uart/uart_dev_pl011.c
index 8443adb..e90e7f8 100644
--- a/sys/dev/uart/uart_dev_pl011.c
+++ b/sys/dev/uart/uart_dev_pl011.c
@@ -273,7 +273,8 @@ static struct uart_class uart_pl011_class = {
sizeof(struct uart_pl011_softc),
.uc_ops = &uart_pl011_ops,
.uc_range = 0x48,
- .uc_rclk = 0
+ .uc_rclk = 0,
+ .uc_rshift = 2
};
static struct ofw_compat_data compat_data[] = {
diff --git a/sys/dev/uart/uart_dev_quicc.c b/sys/dev/uart/uart_dev_quicc.c
index bbbc3bd..0237d64 100644
--- a/sys/dev/uart/uart_dev_quicc.c
+++ b/sys/dev/uart/uart_dev_quicc.c
@@ -271,7 +271,8 @@ struct uart_class uart_quicc_class = {
sizeof(struct quicc_softc),
.uc_ops = &uart_quicc_ops,
.uc_range = 2,
- .uc_rclk = DEFAULT_RCLK
+ .uc_rclk = DEFAULT_RCLK,
+ .uc_rshift = 0
};
#define SIGCHG(c, i, s, d) \
diff --git a/sys/dev/uart/uart_dev_sab82532.c b/sys/dev/uart/uart_dev_sab82532.c
index 8caa7a7..59a9639 100644
--- a/sys/dev/uart/uart_dev_sab82532.c
+++ b/sys/dev/uart/uart_dev_sab82532.c
@@ -391,7 +391,8 @@ struct uart_class uart_sab82532_class = {
sizeof(struct sab82532_softc),
.uc_ops = &uart_sab82532_ops,
.uc_range = 64,
- .uc_rclk = DEFAULT_RCLK
+ .uc_rclk = DEFAULT_RCLK,
+ .uc_rshift = 0
};
#define SIGCHG(c, i, s, d) \
diff --git a/sys/dev/uart/uart_dev_ti8250.c b/sys/dev/uart/uart_dev_ti8250.c
index daddbb7..373dc74 100644
--- a/sys/dev/uart/uart_dev_ti8250.c
+++ b/sys/dev/uart/uart_dev_ti8250.c
@@ -137,7 +137,8 @@ static struct uart_class uart_ti8250_class = {
sizeof(struct ti8250_softc),
.uc_ops = &uart_ns8250_ops,
.uc_range = 0x88,
- .uc_rclk = 48000000
+ .uc_rclk = 48000000,
+ .uc_rshift = 0
};
static struct ofw_compat_data compat_data[] = {
{"ti,ns16550", (uintptr_t)&uart_ti8250_class},
diff --git a/sys/dev/uart/uart_dev_z8530.c b/sys/dev/uart/uart_dev_z8530.c
index 5cc24a8..5bacd40 100644
--- a/sys/dev/uart/uart_dev_z8530.c
+++ b/sys/dev/uart/uart_dev_z8530.c
@@ -307,7 +307,8 @@ struct uart_class uart_z8530_class = {
sizeof(struct z8530_softc),
.uc_ops = &uart_z8530_ops,
.uc_range = 2,
- .uc_rclk = DEFAULT_RCLK
+ .uc_rclk = DEFAULT_RCLK,
+ .uc_rshift = 0
};
#define SIGCHG(c, i, s, d) \
diff --git a/sys/dev/usb/controller/dwc_otg.c b/sys/dev/usb/controller/dwc_otg.c
index 05d2f71..37b5333 100644
--- a/sys/dev/usb/controller/dwc_otg.c
+++ b/sys/dev/usb/controller/dwc_otg.c
@@ -3876,20 +3876,18 @@ dwc_otg_init(struct dwc_otg_softc *sc)
if (temp & GHWCFG2_MPI) {
uint8_t x;
- DPRINTF("Multi Process Interrupts\n");
+ DPRINTF("Disable Multi Process Interrupts\n");
for (x = 0; x != sc->sc_dev_in_ep_max; x++) {
- DWC_OTG_WRITE_4(sc, DOTG_DIEPEACHINTMSK(x),
- DIEPMSK_XFERCOMPLMSK);
+ DWC_OTG_WRITE_4(sc, DOTG_DIEPEACHINTMSK(x), 0);
DWC_OTG_WRITE_4(sc, DOTG_DOEPEACHINTMSK(x), 0);
}
- DWC_OTG_WRITE_4(sc, DOTG_DEACHINTMSK, 0xFFFF);
- } else {
- DWC_OTG_WRITE_4(sc, DOTG_DIEPMSK,
- DIEPMSK_XFERCOMPLMSK);
- DWC_OTG_WRITE_4(sc, DOTG_DOEPMSK, 0);
- DWC_OTG_WRITE_4(sc, DOTG_DAINTMSK, 0xFFFF);
+ DWC_OTG_WRITE_4(sc, DOTG_DEACHINTMSK, 0);
}
+ DWC_OTG_WRITE_4(sc, DOTG_DIEPMSK,
+ DIEPMSK_XFERCOMPLMSK);
+ DWC_OTG_WRITE_4(sc, DOTG_DOEPMSK, 0);
+ DWC_OTG_WRITE_4(sc, DOTG_DAINTMSK, 0xFFFF);
}
if (sc->sc_mode == DWC_MODE_OTG || sc->sc_mode == DWC_MODE_HOST) {
diff --git a/sys/dev/usb/controller/ehci_pci.c b/sys/dev/usb/controller/ehci_pci.c
index b71fb41..9b862a5 100644
--- a/sys/dev/usb/controller/ehci_pci.c
+++ b/sys/dev/usb/controller/ehci_pci.c
@@ -220,7 +220,7 @@ ehci_pci_probe(device_t self)
if (desc) {
device_set_desc(self, desc);
- return (0);
+ return (BUS_PROBE_DEFAULT);
} else {
return (ENXIO);
}
diff --git a/sys/dev/usb/controller/uhci_pci.c b/sys/dev/usb/controller/uhci_pci.c
index 4ac0d54..89fc983 100644
--- a/sys/dev/usb/controller/uhci_pci.c
+++ b/sys/dev/usb/controller/uhci_pci.c
@@ -244,7 +244,7 @@ uhci_pci_probe(device_t self)
if (desc) {
device_set_desc(self, desc);
- return (0);
+ return (BUS_PROBE_DEFAULT);
} else {
return (ENXIO);
}
diff --git a/sys/dev/usb/controller/xhci_pci.c b/sys/dev/usb/controller/xhci_pci.c
index c2367f4..0e2c632 100644
--- a/sys/dev/usb/controller/xhci_pci.c
+++ b/sys/dev/usb/controller/xhci_pci.c
@@ -131,7 +131,7 @@ xhci_pci_probe(device_t self)
if (desc) {
device_set_desc(self, desc);
- return (0);
+ return (BUS_PROBE_DEFAULT);
} else {
return (ENXIO);
}
diff --git a/sys/dev/usb/net/if_axge.c b/sys/dev/usb/net/if_axge.c
index f21b67e..2c695cd 100644
--- a/sys/dev/usb/net/if_axge.c
+++ b/sys/dev/usb/net/if_axge.c
@@ -67,6 +67,7 @@ static const STRUCT_USB_HOST_ID axge_devs[] = {
AXGE_DEV(ASIX, AX88178A),
AXGE_DEV(ASIX, AX88179),
AXGE_DEV(DLINK, DUB1312),
+ AXGE_DEV(LENOVO, GIGALAN),
AXGE_DEV(SITECOMEU, LN032),
#undef AXGE_DEV
};
diff --git a/sys/dev/usb/serial/uftdi.c b/sys/dev/usb/serial/uftdi.c
index a08ce48..0159520 100644
--- a/sys/dev/usb/serial/uftdi.c
+++ b/sys/dev/usb/serial/uftdi.c
@@ -1701,7 +1701,7 @@ uftdi_get_bitmode(struct ucom_softc *ucom, uint8_t *iomask)
struct uftdi_softc *sc = ucom->sc_parent;
usb_device_request_t req;
- req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
+ req.bmRequestType = UT_READ_VENDOR_DEVICE;
req.bRequest = FTDI_SIO_GET_BITMODE;
USETW(req.wIndex, sc->sc_ucom.sc_portno);
@@ -1738,7 +1738,7 @@ uftdi_get_latency(struct ucom_softc *ucom, int *latency)
usb_error_t err;
uint8_t buf;
- req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
+ req.bmRequestType = UT_READ_VENDOR_DEVICE;
req.bRequest = FTDI_SIO_GET_LATENCY;
USETW(req.wIndex, sc->sc_ucom.sc_portno);
diff --git a/sys/dev/usb/usbdevs b/sys/dev/usb/usbdevs
index 7959cb4..d972bdc 100644
--- a/sys/dev/usb/usbdevs
+++ b/sys/dev/usb/usbdevs
@@ -2627,6 +2627,7 @@ product LARSENBRUSGAARD ALTITRACK 0x0001 FTDI compatible adapter
product LEADTEK 9531 0x2101 9531 GPS
/* Lenovo products */
+product LENOVO GIGALAN 0x304b USB 3.0 Ethernet
product LENOVO ETHERNET 0x7203 USB 2.0 Ethernet
/* Lexar products */
@@ -3016,11 +3017,12 @@ product MELCO WLRUCG 0x0116 WLR-UC-G
product MELCO WLRUCGAOSS 0x0119 WLR-UC-G-AOSS
product MELCO WLIUCAG300N 0x012e WLI-UC-AG300N
product MELCO WLIUCG 0x0137 WLI-UC-G
-product MELCO RT2870_1 0x0148 RT2870
+product MELCO WLIUCG300HP 0x0148 WLI-UC-G300HP
product MELCO RT2870_2 0x0150 RT2870
product MELCO WLIUCGN 0x015d WLI-UC-GN
product MELCO WLIUCG301N 0x016f WLI-UC-G301N
product MELCO WLIUCGNM 0x01a2 WLI-UC-GNM
+product MELCO WLIUCG300HPV1 0x01a8 WLI-UC-G300HP-V1
product MELCO WLIUCGNM2 0x01ee WLI-UC-GNM2
/* Merlin products */
@@ -3753,6 +3755,7 @@ product REALTEK RTL8188CU_1 0x817a RTL8188CU
product REALTEK RTL8188CU_2 0x817b RTL8188CU
product REALTEK RTL8187 0x8187 RTL8187 Wireless Adapter
product REALTEK RTL8187B_0 0x8189 RTL8187B Wireless Adapter
+product REALTEK RTL8188CU_3 0x8191 RTL8188CU
product REALTEK RTL8196EU 0x8196 RTL8196EU
product REALTEK RTL8187B_1 0x8197 RTL8187B Wireless Adapter
product REALTEK RTL8187B_2 0x8198 RTL8187B Wireless Adapter
diff --git a/sys/dev/usb/video/udl.c b/sys/dev/usb/video/udl.c
index 10762e1..69e2429 100644
--- a/sys/dev/usb/video/udl.c
+++ b/sys/dev/usb/video/udl.c
@@ -76,6 +76,11 @@ static int udl_fps = 25;
SYSCTL_INT(_hw_usb_udl, OID_AUTO, fps, CTLFLAG_RWTUN,
&udl_fps, 0, "Frames Per Second, 1-60");
+static struct mtx udl_buffer_mtx;
+static struct udl_buffer_head udl_buffer_head;
+
+MALLOC_DEFINE(M_USB_DL, "USB", "USB DisplayLink");
+
/*
* Prototypes.
*/
@@ -175,6 +180,56 @@ static const STRUCT_USB_HOST_ID udl_devs[] = {
{USB_VPI(USB_VENDOR_DISPLAYLINK, USB_PRODUCT_DISPLAYLINK_LT1421, DLUNK)}
};
+static void
+udl_buffer_init(void *arg)
+{
+ mtx_init(&udl_buffer_mtx, "USB", "UDL", MTX_DEF);
+ TAILQ_INIT(&udl_buffer_head);
+}
+SYSINIT(udl_buffer_init, SI_SUB_LOCK, SI_ORDER_FIRST, udl_buffer_init, NULL);
+
+CTASSERT(sizeof(struct udl_buffer) < PAGE_SIZE);
+
+static void *
+udl_buffer_alloc(uint32_t size)
+{
+ struct udl_buffer *buf;
+ mtx_lock(&udl_buffer_mtx);
+ TAILQ_FOREACH(buf, &udl_buffer_head, entry) {
+ if (buf->size == size) {
+ TAILQ_REMOVE(&udl_buffer_head, buf, entry);
+ break;
+ }
+ }
+ mtx_unlock(&udl_buffer_mtx);
+ if (buf != NULL) {
+ /* wipe and recycle buffer */
+ memset(buf, 0, size);
+ return (buf);
+ }
+ /* allocate new buffer */
+ return (malloc(size, M_USB_DL, M_WAITOK | M_ZERO));
+}
+
+static void
+udl_buffer_free(void *_buf, uint32_t size)
+{
+ struct udl_buffer *buf;
+
+ buf = (struct udl_buffer *)_buf;
+ if (buf == NULL)
+ return;
+
+ /*
+ * Memory mapped buffers should never be freed.
+ * Put display buffer into a recycle list.
+ */
+ mtx_lock(&udl_buffer_mtx);
+ buf->size = size;
+ TAILQ_INSERT_TAIL(&udl_buffer_head, buf, entry);
+ mtx_unlock(&udl_buffer_mtx);
+}
+
static uint32_t
udl_get_fb_size(struct udl_softc *sc)
{
@@ -403,11 +458,11 @@ udl_detach(device_t dev)
mtx_destroy(&sc->sc_mtx);
cv_destroy(&sc->sc_cv);
- /*
- * Free framebuffer memory, if any.
- */
- free(sc->sc_fb_addr, M_DEVBUF);
- free(sc->sc_fb_copy, M_DEVBUF);
+ /* put main framebuffer into a recycle list, if any */
+ udl_buffer_free(sc->sc_fb_addr, sc->sc_fb_size);
+
+ /* free shadow framebuffer memory, if any */
+ free(sc->sc_fb_copy, M_USB_DL);
return (0);
}
@@ -782,13 +837,15 @@ udl_fbmem_alloc(struct udl_softc *sc)
size = udl_get_fb_size(sc);
size = round_page(size);
-
+ /* check for zero size */
+ if (size == 0)
+ size = PAGE_SIZE;
/*
* It is assumed that allocations above PAGE_SIZE bytes will
* be PAGE_SIZE aligned for use with mmap()
*/
- sc->sc_fb_addr = malloc(size, M_DEVBUF, M_WAITOK | M_ZERO);
- sc->sc_fb_copy = malloc(size, M_DEVBUF, M_WAITOK | M_ZERO);
+ sc->sc_fb_addr = udl_buffer_alloc(size);
+ sc->sc_fb_copy = malloc(size, M_USB_DL, M_WAITOK | M_ZERO);
sc->sc_fb_size = size;
}
@@ -1025,8 +1082,7 @@ udl_select_mode(struct udl_softc *sc)
}
if (index == UDL_MAX_MODES) {
- DPRINTF("no mode line found for %dx%d @ %dHz!\n",
- mode.hdisplay, mode.vdisplay, mode.hz);
+ DPRINTF("no mode line found\n");
i = 0;
while (i < sc->sc_edid_info.edid_nmodes) {
diff --git a/sys/dev/usb/video/udl.h b/sys/dev/usb/video/udl.h
index 1fdae7a..a7d5069 100644
--- a/sys/dev/usb/video/udl.h
+++ b/sys/dev/usb/video/udl.h
@@ -34,6 +34,15 @@
#define UDL_FONT_HEIGHT 16 /* pixels */
#define UDL_MAX_MODES 25 /* units */
+MALLOC_DECLARE(M_USB_DL);
+
+struct udl_buffer {
+ TAILQ_ENTRY(udl_buffer) entry;
+ uint32_t size;
+};
+
+TAILQ_HEAD(udl_buffer_head, udl_buffer);
+
struct udl_cmd_buf {
TAILQ_ENTRY(udl_cmd_buf) entry;
uint32_t off;
diff --git a/sys/dev/usb/wlan/if_run.c b/sys/dev/usb/wlan/if_run.c
index 3112ce5..22cc180 100644
--- a/sys/dev/usb/wlan/if_run.c
+++ b/sys/dev/usb/wlan/if_run.c
@@ -225,13 +225,14 @@ static const STRUCT_USB_HOST_ID run_devs[] = {
RUN_DEV(LOGITEC, LANW300NU2),
RUN_DEV(LOGITEC, LANW150NU2),
RUN_DEV(LOGITEC, LANW300NU2S),
- RUN_DEV(MELCO, RT2870_1),
+ RUN_DEV(MELCO, WLIUCG300HP),
RUN_DEV(MELCO, RT2870_2),
RUN_DEV(MELCO, WLIUCAG300N),
RUN_DEV(MELCO, WLIUCG300N),
RUN_DEV(MELCO, WLIUCG301N),
RUN_DEV(MELCO, WLIUCGN),
RUN_DEV(MELCO, WLIUCGNM),
+ RUN_DEV(MELCO, WLIUCG300HPV1),
RUN_DEV(MELCO, WLIUCGNM2),
RUN_DEV(MOTOROLA4, RT2770),
RUN_DEV(MOTOROLA4, RT3070),
diff --git a/sys/dev/usb/wlan/if_urtwn.c b/sys/dev/usb/wlan/if_urtwn.c
index 38fbef4..72004d9 100644
--- a/sys/dev/usb/wlan/if_urtwn.c
+++ b/sys/dev/usb/wlan/if_urtwn.c
@@ -137,6 +137,7 @@ static const STRUCT_USB_HOST_ID urtwn_devs[] = {
URTWN_DEV(REALTEK, RTL8188CU_0),
URTWN_DEV(REALTEK, RTL8188CU_1),
URTWN_DEV(REALTEK, RTL8188CU_2),
+ URTWN_DEV(REALTEK, RTL8188CU_3),
URTWN_DEV(REALTEK, RTL8188CU_COMBO),
URTWN_DEV(REALTEK, RTL8188CUS),
URTWN_DEV(REALTEK, RTL8188RU_1),
@@ -145,7 +146,6 @@ static const STRUCT_USB_HOST_ID urtwn_devs[] = {
URTWN_DEV(REALTEK, RTL8191CU),
URTWN_DEV(REALTEK, RTL8192CE),
URTWN_DEV(REALTEK, RTL8192CU),
- URTWN_DEV(REALTEK, RTL8188CU_0),
URTWN_DEV(SITECOMEU, RTL8188CU_1),
URTWN_DEV(SITECOMEU, RTL8188CU_2),
URTWN_DEV(SITECOMEU, RTL8192CU),
@@ -176,12 +176,12 @@ static struct ieee80211vap *urtwn_vap_create(struct ieee80211com *,
const uint8_t [IEEE80211_ADDR_LEN],
const uint8_t [IEEE80211_ADDR_LEN]);
static void urtwn_vap_delete(struct ieee80211vap *);
-static struct mbuf * urtwn_rx_frame(struct urtwn_softc *, uint8_t *, int,
+static struct mbuf * urtwn_rx_frame(struct urtwn_softc *, uint8_t *, int,
int *);
-static struct mbuf * urtwn_rxeof(struct usb_xfer *, struct urtwn_data *,
+static struct mbuf * urtwn_rxeof(struct usb_xfer *, struct urtwn_data *,
int *, int8_t *);
static void urtwn_txeof(struct usb_xfer *, struct urtwn_data *);
-static int urtwn_alloc_list(struct urtwn_softc *,
+static int urtwn_alloc_list(struct urtwn_softc *,
struct urtwn_data[], int, int);
static int urtwn_alloc_rx_list(struct urtwn_softc *);
static int urtwn_alloc_tx_list(struct urtwn_softc *);
@@ -191,24 +191,24 @@ static void urtwn_free_list(struct urtwn_softc *,
struct urtwn_data data[], int);
static struct urtwn_data * _urtwn_getbuf(struct urtwn_softc *);
static struct urtwn_data * urtwn_getbuf(struct urtwn_softc *);
-static int urtwn_write_region_1(struct urtwn_softc *, uint16_t,
+static int urtwn_write_region_1(struct urtwn_softc *, uint16_t,
uint8_t *, int);
static void urtwn_write_1(struct urtwn_softc *, uint16_t, uint8_t);
static void urtwn_write_2(struct urtwn_softc *, uint16_t, uint16_t);
static void urtwn_write_4(struct urtwn_softc *, uint16_t, uint32_t);
-static int urtwn_read_region_1(struct urtwn_softc *, uint16_t,
+static int urtwn_read_region_1(struct urtwn_softc *, uint16_t,
uint8_t *, int);
static uint8_t urtwn_read_1(struct urtwn_softc *, uint16_t);
static uint16_t urtwn_read_2(struct urtwn_softc *, uint16_t);
static uint32_t urtwn_read_4(struct urtwn_softc *, uint16_t);
-static int urtwn_fw_cmd(struct urtwn_softc *, uint8_t,
+static int urtwn_fw_cmd(struct urtwn_softc *, uint8_t,
const void *, int);
static void urtwn_r92c_rf_write(struct urtwn_softc *, int,
uint8_t, uint32_t);
-static void urtwn_r88e_rf_write(struct urtwn_softc *, int,
+static void urtwn_r88e_rf_write(struct urtwn_softc *, int,
uint8_t, uint32_t);
static uint32_t urtwn_rf_read(struct urtwn_softc *, int, uint8_t);
-static int urtwn_llt_write(struct urtwn_softc *, uint32_t,
+static int urtwn_llt_write(struct urtwn_softc *, uint32_t,
uint32_t);
static uint8_t urtwn_efuse_read_1(struct urtwn_softc *, uint16_t);
static void urtwn_efuse_read(struct urtwn_softc *);
@@ -219,7 +219,7 @@ static void urtwn_r88e_read_rom(struct urtwn_softc *);
static int urtwn_ra_init(struct urtwn_softc *);
static void urtwn_tsf_sync_enable(struct urtwn_softc *);
static void urtwn_set_led(struct urtwn_softc *, int, int);
-static int urtwn_newstate(struct ieee80211vap *,
+static int urtwn_newstate(struct ieee80211vap *,
enum ieee80211_state, int);
static void urtwn_watchdog(void *);
static void urtwn_update_avgrssi(struct urtwn_softc *, int, int8_t);
@@ -237,7 +237,7 @@ static int urtwn_r88e_power_on(struct urtwn_softc *);
static int urtwn_llt_init(struct urtwn_softc *);
static void urtwn_fw_reset(struct urtwn_softc *);
static void urtwn_r88e_fw_reset(struct urtwn_softc *);
-static int urtwn_fw_loadpage(struct urtwn_softc *, int,
+static int urtwn_fw_loadpage(struct urtwn_softc *, int,
const uint8_t *, int);
static int urtwn_load_firmware(struct urtwn_softc *);
static int urtwn_r92c_dma_init(struct urtwn_softc *);
@@ -249,22 +249,22 @@ static void urtwn_cam_init(struct urtwn_softc *);
static void urtwn_pa_bias_init(struct urtwn_softc *);
static void urtwn_rxfilter_init(struct urtwn_softc *);
static void urtwn_edca_init(struct urtwn_softc *);
-static void urtwn_write_txpower(struct urtwn_softc *, int,
+static void urtwn_write_txpower(struct urtwn_softc *, int,
uint16_t[]);
static void urtwn_get_txpower(struct urtwn_softc *, int,
- struct ieee80211_channel *,
+ struct ieee80211_channel *,
struct ieee80211_channel *, uint16_t[]);
static void urtwn_r88e_get_txpower(struct urtwn_softc *, int,
- struct ieee80211_channel *,
+ struct ieee80211_channel *,
struct ieee80211_channel *, uint16_t[]);
static void urtwn_set_txpower(struct urtwn_softc *,
- struct ieee80211_channel *,
+ struct ieee80211_channel *,
struct ieee80211_channel *);
static void urtwn_scan_start(struct ieee80211com *);
static void urtwn_scan_end(struct ieee80211com *);
static void urtwn_set_channel(struct ieee80211com *);
static void urtwn_set_chan(struct urtwn_softc *,
- struct ieee80211_channel *,
+ struct ieee80211_channel *,
struct ieee80211_channel *);
static void urtwn_update_mcast(struct ifnet *);
static void urtwn_iq_calib(struct urtwn_softc *);
@@ -470,7 +470,7 @@ urtwn_attach(device_t self)
ic->ic_vap_delete = urtwn_vap_delete;
ic->ic_update_mcast = urtwn_update_mcast;
- ieee80211_radiotap_attach(ic, &sc->sc_txtap.wt_ihdr,
+ ieee80211_radiotap_attach(ic, &sc->sc_txtap.wt_ihdr,
sizeof(sc->sc_txtap), URTWN_TX_RADIOTAP_PRESENT,
&sc->sc_rxtap.wr_ihdr, sizeof(sc->sc_rxtap),
URTWN_RX_RADIOTAP_PRESENT);
@@ -492,7 +492,7 @@ urtwn_detach(device_t self)
struct ifnet *ifp = sc->sc_ifp;
struct ieee80211com *ic = ifp->if_l2com;
unsigned int x;
-
+
/* Prevent further ioctls. */
URTWN_LOCK(sc);
sc->sc_flags |= URTWN_DETACHED;
@@ -604,7 +604,7 @@ urtwn_vap_create(struct ieee80211com *ic, const char name[IFNAMSIZ], int unit,
vap = &uvp->vap;
/* enable s/w bmiss handling for sta mode */
- if (ieee80211_vap_setup(ic, vap, name, unit, opmode,
+ if (ieee80211_vap_setup(ic, vap, name, unit, opmode,
flags | IEEE80211_CLONE_NOBEACONS, bssid, mac) != 0) {
/* out of memory */
free(uvp, M_80211_VAP);
@@ -673,7 +673,7 @@ urtwn_rx_frame(struct urtwn_softc *sc, uint8_t *buf, int pktlen, int *rssi_p)
/* Get RSSI from PHY status descriptor if present. */
if (infosz != 0 && (rxdw0 & R92C_RXDW0_PHYST)) {
- if (sc->chip & URTWN_CHIP_88E)
+ if (sc->chip & URTWN_CHIP_88E)
rssi = urtwn_r88e_get_rssi(sc, rate, &stat[1]);
else
rssi = urtwn_get_rssi(sc, rate, &stat[1]);
@@ -1184,7 +1184,7 @@ urtwn_efuse_read_1(struct urtwn_softc *sc, uint16_t addr)
return (MS(reg, R92C_EFUSE_CTRL_DATA));
urtwn_ms_delay(sc);
}
- device_printf(sc->sc_dev,
+ device_printf(sc->sc_dev,
"could not read efuse byte at address 0x%x\n", addr);
return (0xff);
}
@@ -1195,7 +1195,7 @@ urtwn_efuse_read(struct urtwn_softc *sc)
uint8_t *rom = (uint8_t *)&sc->rom;
uint16_t addr = 0;
uint32_t reg;
- uint8_t off, msk;
+ uint8_t off, msk, vol;
int i;
urtwn_efuse_switch_power(sc);
@@ -1228,12 +1228,19 @@ urtwn_efuse_read(struct urtwn_softc *sc)
printf("\n");
}
#endif
+ /* Disable LDO 2.5V. */
+ vol = urtwn_read_1(sc, R92C_EFUSE_TEST + 3);
+ urtwn_write_1(sc, R92C_EFUSE_TEST + 3, vol & ~(0x80));
+
}
static void
urtwn_efuse_switch_power(struct urtwn_softc *sc)
{
uint32_t reg;
+ if (sc->chip & URTWN_CHIP_88E)
+ urtwn_write_1(sc, R92C_EFUSE_ACCESS, R92C_EFUSE_ACCESS_ON);
+
reg = urtwn_read_2(sc, R92C_SYS_ISO_CTRL);
if (!(reg & R92C_SYS_ISO_CTRL_PWC_EV12V)) {
urtwn_write_2(sc, R92C_SYS_ISO_CTRL,
@@ -1250,6 +1257,16 @@ urtwn_efuse_switch_power(struct urtwn_softc *sc)
urtwn_write_2(sc, R92C_SYS_CLKR,
reg | R92C_SYS_CLKR_LOADER_EN | R92C_SYS_CLKR_ANA8M);
}
+
+ if (!(sc->chip & URTWN_CHIP_88E)) {
+ uint8_t vol;
+
+ /* Enable LDO 2.5V. */
+ vol = urtwn_read_1(sc, R92C_EFUSE_TEST + 3);
+ vol &= 0x0f;
+ vol |= 0x30;
+ urtwn_write_1(sc, R92C_EFUSE_TEST + 3, (vol | 0x80));
+ }
}
static int
@@ -1317,7 +1334,7 @@ urtwn_r88e_read_rom(struct urtwn_softc *sc)
/* Read full ROM image. */
memset(&sc->r88e_rom, 0xff, sizeof(sc->r88e_rom));
- while (addr < 1024) {
+ while (addr < 512) {
reg = urtwn_efuse_read_1(sc, addr);
if (reg == 0xff)
break;
@@ -1343,6 +1360,8 @@ urtwn_r88e_read_rom(struct urtwn_softc *sc)
}
}
+ urtwn_write_1(sc, R92C_EFUSE_ACCESS, R92C_EFUSE_ACCESS_OFF);
+
addr = 0x10;
for (i = 0; i < 6; i++)
sc->cck_tx_pwr[i] = sc->r88e_rom[addr++];
@@ -1477,7 +1496,7 @@ static void
urtwn_set_led(struct urtwn_softc *sc, int led, int on)
{
uint8_t reg;
-
+
if (led == URTWN_LED_LINK) {
if (sc->chip & URTWN_CHIP_88E) {
reg = urtwn_read_1(sc, R92C_LEDCFG2) & 0xf0;
@@ -1568,14 +1587,9 @@ urtwn_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg)
urtwn_bb_write(sc, R92C_OFDM0_AGCCORE1(1), reg);
}
}
- /* Make link LED blink during scan. */
- urtwn_set_led(sc, URTWN_LED_LINK, !sc->ledlink);
-
/* Pause AC Tx queues. */
urtwn_write_1(sc, R92C_TXPAUSE,
urtwn_read_1(sc, R92C_TXPAUSE) | 0x0f);
-
- urtwn_set_chan(sc, ic->ic_curchan, NULL);
break;
case IEEE80211_S_AUTH:
/* Set initial gain under link. */
@@ -1643,7 +1657,7 @@ urtwn_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg)
if (sc->chip & URTWN_CHIP_88E)
ni->ni_txrate =
ni->ni_rates.rs_rates[ni->ni_rates.rs_nrates-1];
- else
+ else
urtwn_ra_init(sc);
/* Turn link LED on. */
urtwn_set_led(sc, URTWN_LED_LINK, 1);
@@ -1754,7 +1768,7 @@ urtwn_r88e_get_rssi(struct urtwn_softc *sc, int rate, void *physt)
cck = (struct r88e_rx_cck *)physt;
cck_agc_rpt = cck->agc_rpt;
lna_idx = (cck_agc_rpt & 0xe0) >> 5;
- vga_idx = cck_agc_rpt & 0x1f;
+ vga_idx = cck_agc_rpt & 0x1f;
switch (lna_idx) {
case 7:
if (vga_idx <= 27)
@@ -1794,7 +1808,7 @@ urtwn_r88e_get_rssi(struct urtwn_softc *sc, int rate, void *physt)
static int
-urtwn_tx_start(struct urtwn_softc *sc, struct ieee80211_node *ni,
+urtwn_tx_start(struct urtwn_softc *sc, struct ieee80211_node *ni,
struct mbuf *m0, struct urtwn_data *data)
{
struct ifnet *ifp = sc->sc_ifp;
@@ -1835,7 +1849,7 @@ urtwn_tx_start(struct urtwn_softc *sc, struct ieee80211_node *ni,
/* in case packet header moved, reset pointer */
wh = mtod(m0, struct ieee80211_frame *);
}
-
+
switch (type) {
case IEEE80211_FC0_TYPE_CTL:
case IEEE80211_FC0_TYPE_MGT:
@@ -1847,7 +1861,7 @@ urtwn_tx_start(struct urtwn_softc *sc, struct ieee80211_node *ni,
xfer = urtwn_pipes[M_WME_GETAC(m0)];
break;
}
-
+
hasqos = 0;
/* Fill Tx descriptor. */
@@ -2187,14 +2201,12 @@ urtwn_r92c_power_on(struct urtwn_softc *sc)
static int
urtwn_r88e_power_on(struct urtwn_softc *sc)
{
- uint8_t val;
uint32_t reg;
int ntries;
/* Wait for power ready bit. */
for (ntries = 0; ntries < 5000; ntries++) {
- val = urtwn_read_1(sc, 0x6) & 0x2;
- if (val == 0x2)
+ if (urtwn_read_4(sc, R92C_APS_FSMCO) & R92C_APS_FSMCO_SUS_HOST)
break;
urtwn_ms_delay(sc);
}
@@ -2209,17 +2221,23 @@ urtwn_r88e_power_on(struct urtwn_softc *sc)
urtwn_read_1(sc, R92C_SYS_FUNC_EN) & ~(R92C_SYS_FUNC_EN_BBRSTB |
R92C_SYS_FUNC_EN_BB_GLB_RST));
- urtwn_write_1(sc, 0x26, urtwn_read_1(sc, 0x26) | 0x80);
+ urtwn_write_1(sc, R92C_AFE_XTAL_CTRL + 2,
+ urtwn_read_1(sc, R92C_AFE_XTAL_CTRL + 2) | 0x80);
/* Disable HWPDN. */
- urtwn_write_1(sc, 0x5, urtwn_read_1(sc, 0x5) & ~0x80);
+ urtwn_write_2(sc, R92C_APS_FSMCO,
+ urtwn_read_2(sc, R92C_APS_FSMCO) & ~R92C_APS_FSMCO_APDM_HPDN);
/* Disable WL suspend. */
- urtwn_write_1(sc, 0x5, urtwn_read_1(sc, 0x5) & ~0x18);
+ urtwn_write_2(sc, R92C_APS_FSMCO,
+ urtwn_read_2(sc, R92C_APS_FSMCO) &
+ ~(R92C_APS_FSMCO_AFSM_HSUS | R92C_APS_FSMCO_AFSM_PCIE));
- urtwn_write_1(sc, 0x5, urtwn_read_1(sc, 0x5) | 0x1);
+ urtwn_write_2(sc, R92C_APS_FSMCO,
+ urtwn_read_2(sc, R92C_APS_FSMCO) | R92C_APS_FSMCO_APFM_ONMAC);
for (ntries = 0; ntries < 5000; ntries++) {
- if (!(urtwn_read_1(sc, 0x5) & 0x1))
+ if (!(urtwn_read_2(sc, R92C_APS_FSMCO) &
+ R92C_APS_FSMCO_APFM_ONMAC))
break;
urtwn_ms_delay(sc);
}
@@ -2227,7 +2245,8 @@ urtwn_r88e_power_on(struct urtwn_softc *sc)
return (ETIMEDOUT);
/* Enable LDO normal mode. */
- urtwn_write_1(sc, 0x23, urtwn_read_1(sc, 0x23) & ~0x10);
+ urtwn_write_1(sc, R92C_LPLDO_CTRL,
+ urtwn_read_1(sc, R92C_LPLDO_CTRL) & ~0x10);
/* Enable MAC DMA/WMAC/SCHEDULE/SEC blocks. */
urtwn_write_2(sc, R92C_CR, 0);
@@ -2320,7 +2339,7 @@ urtwn_fw_loadpage(struct urtwn_softc *sc, int page, const uint8_t *buf, int len)
else
mlen = 1;
/* XXX fix this deconst */
- error = urtwn_write_region_1(sc, off,
+ error = urtwn_write_region_1(sc, off,
__DECONST(uint8_t *, buf), mlen);
if (error != 0)
break;
@@ -2455,7 +2474,7 @@ fail:
static __inline int
urtwn_dma_init(struct urtwn_softc *sc)
{
-
+
return sc->sc_dma_init(sc);
}
@@ -2559,7 +2578,6 @@ urtwn_r88e_dma_init(struct urtwn_softc *sc)
return (EIO);
/* Set number of pages for normal priority queue. */
- urtwn_write_2(sc, R92C_RQPN_NPQ, 0);
urtwn_write_2(sc, R92C_RQPN_NPQ, 0x000d);
urtwn_write_4(sc, R92C_RQPN, 0x808e000d);
@@ -3131,8 +3149,13 @@ static void
urtwn_set_channel(struct ieee80211com *ic)
{
struct urtwn_softc *sc = ic->ic_ifp->if_softc;
+ struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
URTWN_LOCK(sc);
+ if (vap->iv_state == IEEE80211_S_SCAN) {
+ /* Make link LED blink during scan. */
+ urtwn_set_led(sc, URTWN_LED_LINK, !sc->ledlink);
+ }
urtwn_set_chan(sc, ic->ic_curchan, NULL);
URTWN_UNLOCK(sc);
}
@@ -3219,10 +3242,10 @@ urtwn_set_chan(struct urtwn_softc *sc, struct ieee80211_channel *c,
urtwn_bb_read(sc, R92C_FPGA0_ANAPARAM2) |
R92C_FPGA0_ANAPARAM2_CBW20);
}
-
+
/* Select 20MHz bandwidth. */
urtwn_rf_write(sc, 0, R92C_RF_CHNLBW,
- (sc->rf_chnlbw[0] & ~0xfff) | chan |
+ (sc->rf_chnlbw[0] & ~0xfff) | chan |
((sc->chip & URTWN_CHIP_88E) ? R88E_RF_CHNLBW_BW20 :
R92C_RF_CHNLBW_BW20));
}
@@ -3297,7 +3320,7 @@ urtwn_init_locked(void *arg)
error = urtwn_alloc_rx_list(sc);
if (error != 0)
goto fail;
-
+
error = urtwn_alloc_tx_list(sc);
if (error != 0)
goto fail;
@@ -3373,16 +3396,17 @@ urtwn_init_locked(void *arg)
urtwn_write_1(sc, R92C_TRXDMA_CTRL,
urtwn_read_1(sc, R92C_TRXDMA_CTRL) |
R92C_TRXDMA_CTRL_RXDMA_AGG_EN);
- urtwn_write_1(sc, R92C_USB_SPECIAL_OPTION,
- urtwn_read_1(sc, R92C_USB_SPECIAL_OPTION) |
- R92C_USB_SPECIAL_OPTION_AGG_EN);
urtwn_write_1(sc, R92C_RXDMA_AGG_PG_TH, 48);
if (sc->chip & URTWN_CHIP_88E)
urtwn_write_1(sc, R92C_RXDMA_AGG_PG_TH + 1, 4);
- else
+ else {
urtwn_write_1(sc, R92C_USB_DMA_AGG_TO, 4);
- urtwn_write_1(sc, R92C_USB_AGG_TH, 8);
- urtwn_write_1(sc, R92C_USB_AGG_TO, 6);
+ urtwn_write_1(sc, R92C_USB_SPECIAL_OPTION,
+ urtwn_read_1(sc, R92C_USB_SPECIAL_OPTION) |
+ R92C_USB_SPECIAL_OPTION_AGG_EN);
+ urtwn_write_1(sc, R92C_USB_AGG_TH, 8);
+ urtwn_write_1(sc, R92C_USB_AGG_TO, 6);
+ }
/* Initialize beacon parameters. */
urtwn_write_2(sc, R92C_BCN_CTRL, 0x1010);
diff --git a/sys/dev/virtio/block/virtio_blk.c b/sys/dev/virtio/block/virtio_blk.c
index 28a363b..0cfebf1 100644
--- a/sys/dev/virtio/block/virtio_blk.c
+++ b/sys/dev/virtio/block/virtio_blk.c
@@ -710,7 +710,8 @@ vtblk_alloc_disk(struct vtblk_softc *sc, struct virtio_blk_config *blkcfg)
dp->d_fwheads = blkcfg->geometry.heads;
}
- if (virtio_with_feature(dev, VIRTIO_BLK_F_TOPOLOGY)) {
+ if (virtio_with_feature(dev, VIRTIO_BLK_F_TOPOLOGY) &&
+ blkcfg->topology.physical_block_exp > 0) {
dp->d_stripesize = dp->d_sectorsize *
(1 << blkcfg->topology.physical_block_exp);
dp->d_stripeoffset = (dp->d_stripesize -
diff --git a/sys/dev/virtio/network/if_vtnet.c b/sys/dev/virtio/network/if_vtnet.c
index 39fc28d..704a3d9 100644
--- a/sys/dev/virtio/network/if_vtnet.c
+++ b/sys/dev/virtio/network/if_vtnet.c
@@ -2745,6 +2745,11 @@ vtnet_drain_rxtx_queues(struct vtnet_softc *sc)
struct vtnet_txq *txq;
int i;
+#ifdef DEV_NETMAP
+ if (nm_native_on(NA(sc->vtnet_ifp)))
+ return;
+#endif /* DEV_NETMAP */
+
for (i = 0; i < sc->vtnet_act_vq_pairs; i++) {
rxq = &sc->vtnet_rxqs[i];
vtnet_rxq_free_mbufs(rxq);
diff --git a/sys/dev/vt/hw/fb/vt_fb.c b/sys/dev/vt/hw/fb/vt_fb.c
index 40f56fc..b2babd1 100644
--- a/sys/dev/vt/hw/fb/vt_fb.c
+++ b/sys/dev/vt/hw/fb/vt_fb.c
@@ -264,46 +264,40 @@ vt_fb_bitblt_bitmap(struct vt_device *vd, const struct vt_window *vw,
{
struct fb_info *info;
uint32_t fgc, bgc, cc, o;
- int c, l, bpp, bpl;
- u_long line;
- uint8_t b, m;
- const uint8_t *ch;
+ int bpp, bpl, xi, yi;
+ int bit, byte;
info = vd->vd_softc;
bpp = FBTYPE_GET_BYTESPP(info);
fgc = info->fb_cmap[fg];
bgc = info->fb_cmap[bg];
- b = m = 0;
- bpl = (width + 7) >> 3; /* Bytes per source line. */
+ bpl = (width + 7) / 8; /* Bytes per source line. */
if (info->fb_flags & FB_FLAG_NOWRITE)
return;
KASSERT((info->fb_vbase != 0), ("Unmapped framebuffer"));
- line = (info->fb_stride * y) + (x * bpp);
- for (l = 0;
- l < height && y + l < vw->vw_draw_area.tr_end.tp_row;
- l++) {
- ch = pattern;
- for (c = 0;
- c < width && x + c < vw->vw_draw_area.tr_end.tp_col;
- c++) {
- if (c % 8 == 0)
- b = *ch++;
- else
- b <<= 1;
- if (mask != NULL) {
- if (c % 8 == 0)
- m = *mask++;
- else
- m <<= 1;
- /* Skip pixel write, if mask has no bit set. */
- if ((m & 0x80) == 0)
- continue;
- }
- o = line + (c * bpp);
- cc = b & 0x80 ? fgc : bgc;
+ /* Bound by right and bottom edges. */
+ if (y + height > vw->vw_draw_area.tr_end.tp_row) {
+ if (y >= vw->vw_draw_area.tr_end.tp_row)
+ return;
+ height = vw->vw_draw_area.tr_end.tp_row - y;
+ }
+ if (x + width > vw->vw_draw_area.tr_end.tp_col) {
+ if (x >= vw->vw_draw_area.tr_end.tp_col)
+ return;
+ width = vw->vw_draw_area.tr_end.tp_col - x;
+ }
+ for (yi = 0; yi < height; yi++) {
+ for (xi = 0; xi < width; xi++) {
+ byte = yi * bpl + xi / 8;
+ bit = 0x80 >> (xi % 8);
+ /* Skip pixel write, if mask bit not set. */
+ if (mask != NULL && (mask[byte] & bit) == 0)
+ continue;
+ o = (y + yi) * info->fb_stride + (x + xi) * bpp;
+ cc = pattern[byte] & bit ? fgc : bgc;
switch(bpp) {
case 1:
@@ -326,8 +320,6 @@ vt_fb_bitblt_bitmap(struct vt_device *vd, const struct vt_window *vw,
break;
}
}
- line += info->fb_stride;
- pattern += bpl;
}
}
diff --git a/sys/dev/vt/hw/vga/vt_vga.c b/sys/dev/vt/hw/vga/vt_vga.c
index e939fdd..689692e 100644
--- a/sys/dev/vt/hw/vga/vt_vga.c
+++ b/sys/dev/vt/hw/vga/vt_vga.c
@@ -1035,11 +1035,12 @@ vga_initialize_graphics(struct vt_device *vd)
REG_WRITE1(sc, VGA_GC_DATA, 0xff);
}
-static void
+static int
vga_initialize(struct vt_device *vd, int textmode)
{
struct vga_softc *sc = vd->vd_softc;
uint8_t x;
+ int timeout;
/* Make sure the VGA adapter is not in monochrome emulation mode. */
x = REG_READ1(sc, VGA_GEN_MISC_OUTPUT_R);
@@ -1060,10 +1061,16 @@ vga_initialize(struct vt_device *vd, int textmode)
* code therefore also removes that guarantee and appropriate measures
* need to be taken.
*/
+ timeout = 10000;
do {
+ DELAY(10);
x = REG_READ1(sc, VGA_GEN_INPUT_STAT_1);
x &= VGA_GEN_IS1_VR | VGA_GEN_IS1_DE;
- } while (x != (VGA_GEN_IS1_VR | VGA_GEN_IS1_DE));
+ } while (x != (VGA_GEN_IS1_VR | VGA_GEN_IS1_DE) && --timeout != 0);
+ if (timeout == 0) {
+ printf("Timeout initializing vt_vga\n");
+ return (ENXIO);
+ }
/* Now, disable the sync. signals. */
REG_WRITE1(sc, VGA_CRTC_ADDRESS, VGA_CRTC_MODE_CONTROL);
@@ -1194,6 +1201,8 @@ vga_initialize(struct vt_device *vd, int textmode)
*/
sc->vga_curfg = sc->vga_curbg = 0xff;
}
+
+ return (0);
}
static int
@@ -1235,7 +1244,8 @@ vga_init(struct vt_device *vd)
vd->vd_width = VT_VGA_WIDTH;
vd->vd_height = VT_VGA_HEIGHT;
}
- vga_initialize(vd, textmode);
+ if (vga_initialize(vd, textmode) != 0)
+ return (CN_DEAD);
sc->vga_enabled = true;
return (CN_INTERNAL);
diff --git a/sys/dev/vt/vt_core.c b/sys/dev/vt/vt_core.c
index 1f8731e..a637055 100644
--- a/sys/dev/vt/vt_core.c
+++ b/sys/dev/vt/vt_core.c
@@ -1029,7 +1029,7 @@ vt_determine_colors(term_char_t c, int cursor,
int
vt_is_cursor_in_area(const struct vt_device *vd, const term_rect_t *area)
{
- unsigned int mx, my, x1, y1, x2, y2;
+ unsigned int mx, my;
/*
* We use the cursor position saved during the current refresh,
@@ -1038,18 +1038,12 @@ vt_is_cursor_in_area(const struct vt_device *vd, const term_rect_t *area)
mx = vd->vd_mx_drawn + vd->vd_curwindow->vw_draw_area.tr_begin.tp_col;
my = vd->vd_my_drawn + vd->vd_curwindow->vw_draw_area.tr_begin.tp_row;
- x1 = area->tr_begin.tp_col;
- y1 = area->tr_begin.tp_row;
- x2 = area->tr_end.tp_col;
- y2 = area->tr_end.tp_row;
-
- if (((mx >= x1 && x2 - 1 >= mx) ||
- (mx < x1 && mx + vd->vd_mcursor->width >= x1)) &&
- ((my >= y1 && y2 - 1 >= my) ||
- (my < y1 && my + vd->vd_mcursor->height >= y1)))
- return (1);
-
- return (0);
+ if (mx >= area->tr_end.tp_col ||
+ mx + vd->vd_mcursor->width <= area->tr_begin.tp_col ||
+ my >= area->tr_end.tp_row ||
+ my + vd->vd_mcursor->height <= area->tr_begin.tp_row)
+ return (0);
+ return (1);
}
static void
diff --git a/sys/dev/vt/vt_font.c b/sys/dev/vt/vt_font.c
index b98115f..4c369c6 100644
--- a/sys/dev/vt/vt_font.c
+++ b/sys/dev/vt/vt_font.c
@@ -41,8 +41,8 @@ __FBSDID("$FreeBSD$");
static MALLOC_DEFINE(M_VTFONT, "vtfont", "vt font");
/* Some limits to prevent abnormal fonts from being loaded. */
-#define VTFONT_MAXMAPPINGS 8192
-#define VTFONT_MAXGLYPHSIZE 1048576
+#define VTFONT_MAXMAPPINGS 65536
+#define VTFONT_MAXGLYPHSIZE 2097152
#define VTFONT_MAXDIMENSION 128
static uint16_t
diff --git a/sys/dev/wpi/if_wpi.c b/sys/dev/wpi/if_wpi.c
index ab382b6..9579c61 100644
--- a/sys/dev/wpi/if_wpi.c
+++ b/sys/dev/wpi/if_wpi.c
@@ -218,7 +218,7 @@ static int wpi_set_timing(struct wpi_softc *, struct ieee80211_node *);
static void wpi_power_calibration(struct wpi_softc *);
static int wpi_set_txpower(struct wpi_softc *, int);
static int wpi_get_power_index(struct wpi_softc *,
- struct wpi_power_group *, struct ieee80211_channel *, int);
+ struct wpi_power_group *, uint8_t, int, int);
static int wpi_set_pslevel(struct wpi_softc *, uint8_t, int, int);
static int wpi_send_btcoex(struct wpi_softc *);
static int wpi_send_rxon(struct wpi_softc *, int, int);
@@ -3455,19 +3455,17 @@ wpi_power_calibration(struct wpi_softc *sc)
static int
wpi_set_txpower(struct wpi_softc *sc, int async)
{
- struct ieee80211com *ic = sc->sc_ifp->if_l2com;
- struct ieee80211_channel *ch;
struct wpi_power_group *group;
struct wpi_cmd_txpower cmd;
uint8_t chan;
- int idx, i;
+ int idx, is_chan_5ghz, i;
/* Retrieve current channel from last RXON. */
chan = sc->rxon.chan;
- ch = &ic->ic_channels[chan];
+ is_chan_5ghz = (sc->rxon.flags & htole32(WPI_RXON_24GHZ)) == 0;
/* Find the TX power group to which this channel belongs. */
- if (IEEE80211_IS_CHAN_5GHZ(ch)) {
+ if (is_chan_5ghz) {
for (group = &sc->groups[1]; group < &sc->groups[4]; group++)
if (chan <= group->chan)
break;
@@ -3475,17 +3473,17 @@ wpi_set_txpower(struct wpi_softc *sc, int async)
group = &sc->groups[0];
memset(&cmd, 0, sizeof cmd);
- cmd.band = IEEE80211_IS_CHAN_5GHZ(ch) ? 0 : 1;
+ cmd.band = is_chan_5ghz ? WPI_BAND_5GHZ : WPI_BAND_2GHZ;
cmd.chan = htole16(chan);
/* Set TX power for all OFDM and CCK rates. */
for (i = 0; i <= WPI_RIDX_MAX ; i++) {
/* Retrieve TX power for this channel/rate. */
- idx = wpi_get_power_index(sc, group, ch, i);
+ idx = wpi_get_power_index(sc, group, chan, is_chan_5ghz, i);
cmd.rates[i].plcp = wpi_ridx_to_plcp[i];
- if (IEEE80211_IS_CHAN_5GHZ(ch)) {
+ if (is_chan_5ghz) {
cmd.rates[i].rf_gain = wpi_rf_gain_5ghz[idx];
cmd.rates[i].dsp_gain = wpi_dsp_gain_5ghz[idx];
} else {
@@ -3506,7 +3504,7 @@ wpi_set_txpower(struct wpi_softc *sc, int async)
*/
static int
wpi_get_power_index(struct wpi_softc *sc, struct wpi_power_group *group,
- struct ieee80211_channel *c, int ridx)
+ uint8_t chan, int is_chan_5ghz, int ridx)
{
/* Fixed-point arithmetic division using a n-bit fractional part. */
#define fdivround(a, b, n) \
@@ -3516,13 +3514,8 @@ wpi_get_power_index(struct wpi_softc *sc, struct wpi_power_group *group,
#define interpolate(x, x1, y1, x2, y2, n) \
((y1) + fdivround(((x) - (x1)) * ((y2) - (y1)), (x2) - (x1), n))
- struct ieee80211com *ic = sc->sc_ifp->if_l2com;
struct wpi_power_sample *sample;
int pwr, idx;
- u_int chan;
-
- /* Get channel number. */
- chan = ieee80211_chan2ieee(ic, c);
/* Default TX power is group maximum TX power minus 3dB. */
pwr = group->maxpwr / 2;
@@ -3530,13 +3523,13 @@ wpi_get_power_index(struct wpi_softc *sc, struct wpi_power_group *group,
/* Decrease TX power for highest OFDM rates to reduce distortion. */
switch (ridx) {
case WPI_RIDX_OFDM36:
- pwr -= IEEE80211_IS_CHAN_2GHZ(c) ? 0 : 5;
+ pwr -= is_chan_5ghz ? 5 : 0;
break;
case WPI_RIDX_OFDM48:
- pwr -= IEEE80211_IS_CHAN_2GHZ(c) ? 7 : 10;
+ pwr -= is_chan_5ghz ? 10 : 7;
break;
case WPI_RIDX_OFDM54:
- pwr -= IEEE80211_IS_CHAN_2GHZ(c) ? 9 : 12;
+ pwr -= is_chan_5ghz ? 12 : 9;
break;
}
@@ -4912,10 +4905,6 @@ wpi_apm_init(struct wpi_softc *sc)
/* Set FH wait threshold to max (HW bug under stress workaround). */
WPI_SETBITS(sc, WPI_DBG_HPET_MEM, 0xffff0000);
- /* Cleanup. */
- wpi_prph_write(sc, WPI_APMG_CLK_DIS, 0x00000400);
- wpi_prph_clrbits(sc, WPI_APMG_PS, 0x00000E00);
-
/* Retrieve PCIe Active State Power Management (ASPM). */
reg = pci_read_config(sc->sc_dev, sc->sc_cap_off + 0x10, 1);
/* Workaround for HW instability in PCIe L0->L0s->L1 transition. */
@@ -4932,6 +4921,10 @@ wpi_apm_init(struct wpi_softc *sc)
if ((error = wpi_nic_lock(sc)) != 0)
return error;
+ /* Cleanup. */
+ wpi_prph_write(sc, WPI_APMG_CLK_DIS, 0x00000400);
+ wpi_prph_clrbits(sc, WPI_APMG_PS, 0x00000200);
+
/* Enable DMA and BSM (Bootstrap State Machine). */
wpi_prph_write(sc, WPI_APMG_CLK_EN,
WPI_APMG_CLK_CTRL_DMA_CLK_RQT | WPI_APMG_CLK_CTRL_BSM_CLK_RQT);
diff --git a/sys/dev/xen/balloon/balloon.c b/sys/dev/xen/balloon/balloon.c
index e113e2c..a6036d8 100644
--- a/sys/dev/xen/balloon/balloon.c
+++ b/sys/dev/xen/balloon/balloon.c
@@ -118,11 +118,6 @@ current_target(void)
static unsigned long
minimum_target(void)
{
-#ifdef XENHVM
-#define max_pfn realmem
-#else
-#define max_pfn HYPERVISOR_shared_info->arch.max_pfn
-#endif
unsigned long min_pages, curr_pages = current_target();
#define MB2PAGES(mb) ((mb) << (20 - PAGE_SHIFT))
@@ -139,16 +134,15 @@ minimum_target(void)
* 32768 1320
* 131072 4392
*/
- if (max_pfn < MB2PAGES(128))
- min_pages = MB2PAGES(8) + (max_pfn >> 1);
- else if (max_pfn < MB2PAGES(512))
- min_pages = MB2PAGES(40) + (max_pfn >> 2);
- else if (max_pfn < MB2PAGES(2048))
- min_pages = MB2PAGES(104) + (max_pfn >> 3);
+ if (realmem < MB2PAGES(128))
+ min_pages = MB2PAGES(8) + (realmem >> 1);
+ else if (realmem < MB2PAGES(512))
+ min_pages = MB2PAGES(40) + (realmem >> 2);
+ else if (realmem < MB2PAGES(2048))
+ min_pages = MB2PAGES(104) + (realmem >> 3);
else
- min_pages = MB2PAGES(296) + (max_pfn >> 5);
+ min_pages = MB2PAGES(296) + (realmem >> 5);
#undef MB2PAGES
-#undef max_pfn
/* Don't enforce growth */
return (min(min_pages, curr_pages));
@@ -204,12 +198,9 @@ increase_reservation(unsigned long nr_pages)
bs.balloon_low--;
pfn = (VM_PAGE_TO_PHYS(page) >> PAGE_SHIFT);
- KASSERT((xen_feature(XENFEAT_auto_translated_physmap) ||
- !phys_to_machine_mapping_valid(pfn)),
+ KASSERT(xen_feature(XENFEAT_auto_translated_physmap),
("auto translated physmap but mapping is valid"));
- set_phys_to_machine(pfn, frame_list[i]);
-
vm_page_free(page);
}
@@ -258,9 +249,8 @@ decrease_reservation(unsigned long nr_pages)
}
pfn = (VM_PAGE_TO_PHYS(page) >> PAGE_SHIFT);
- frame_list[i] = PFNTOMFN(pfn);
+ frame_list[i] = pfn;
- set_phys_to_machine(pfn, INVALID_P2M_ENTRY);
TAILQ_INSERT_HEAD(&ballooned_pages, page, plinks.q);
bs.balloon_low++;
}
@@ -393,21 +383,11 @@ static int
xenballoon_attach(device_t dev)
{
int err;
-#ifndef XENHVM
- vm_page_t page;
- unsigned long pfn;
-
-#define max_pfn HYPERVISOR_shared_info->arch.max_pfn
-#endif
mtx_init(&balloon_mutex, "balloon_mutex", NULL, MTX_DEF);
-#ifndef XENHVM
- bs.current_pages = min(xen_start_info->nr_pages, max_pfn);
-#else
bs.current_pages = xen_pv_domain() ?
HYPERVISOR_start_info->nr_pages : realmem;
-#endif
bs.target_pages = bs.current_pages;
bs.balloon_low = 0;
bs.balloon_high = 0;
@@ -416,16 +396,6 @@ xenballoon_attach(device_t dev)
kproc_create(balloon_process, NULL, NULL, 0, 0, "balloon");
-#ifndef XENHVM
- /* Initialise the balloon with excess memory space. */
- for (pfn = xen_start_info->nr_pages; pfn < max_pfn; pfn++) {
- page = PHYS_TO_VM_PAGE(pfn << PAGE_SHIFT);
- TAILQ_INSERT_HEAD(&ballooned_pages, page, plinks.q);
- bs.balloon_low++;
- }
-#undef max_pfn
-#endif
-
target_watch.callback = watch_target;
err = xs_register_watch(&target_watch);
diff --git a/sys/dev/xen/blkback/blkback.c b/sys/dev/xen/blkback/blkback.c
index 1273961..b647fec 100644
--- a/sys/dev/xen/blkback/blkback.c
+++ b/sys/dev/xen/blkback/blkback.c
@@ -742,7 +742,6 @@ struct xbb_softc {
/** Mutex protecting per-instance data. */
struct mtx lock;
-#ifdef XENHVM
/**
* Resource representing allocated physical address space
* associated with our per-instance kva region.
@@ -751,7 +750,6 @@ struct xbb_softc {
/** Resource id for allocated physical address space. */
int pseudo_phys_res_id;
-#endif
/**
* I/O statistics from BlockBack dispatch down. These are
@@ -2818,16 +2816,12 @@ static void
xbb_free_communication_mem(struct xbb_softc *xbb)
{
if (xbb->kva != 0) {
-#ifndef XENHVM
- kva_free(xbb->kva, xbb->kva_size);
-#else
if (xbb->pseudo_phys_res != NULL) {
bus_release_resource(xbb->dev, SYS_RES_MEMORY,
xbb->pseudo_phys_res_id,
xbb->pseudo_phys_res);
xbb->pseudo_phys_res = NULL;
}
-#endif
}
xbb->kva = 0;
xbb->gnt_base_addr = 0;
@@ -3055,12 +3049,6 @@ xbb_alloc_communication_mem(struct xbb_softc *xbb)
DPRINTF("%s: kva_size = %d, reqlist_kva_size = %d\n",
device_get_nameunit(xbb->dev), xbb->kva_size,
xbb->reqlist_kva_size);
-#ifndef XENHVM
- xbb->kva = kva_alloc(xbb->kva_size);
- if (xbb->kva == 0)
- return (ENOMEM);
- xbb->gnt_base_addr = xbb->kva;
-#else /* XENHVM */
/*
* Reserve a range of pseudo physical memory that we can map
* into kva. These pages will only be backed by machine
@@ -3078,7 +3066,6 @@ xbb_alloc_communication_mem(struct xbb_softc *xbb)
}
xbb->kva = (vm_offset_t)rman_get_virtual(xbb->pseudo_phys_res);
xbb->gnt_base_addr = rman_get_start(xbb->pseudo_phys_res);
-#endif /* XENHVM */
DPRINTF("%s: kva: %#jx, gnt_base_addr: %#jx\n",
device_get_nameunit(xbb->dev), (uintmax_t)xbb->kva,
diff --git a/sys/dev/xen/control/control.c b/sys/dev/xen/control/control.c
index 665a5ac..2a0d459 100644
--- a/sys/dev/xen/control/control.c
+++ b/sys/dev/xen/control/control.c
@@ -138,9 +138,7 @@ __FBSDID("$FreeBSD$");
#include <xen/gnttab.h>
#include <xen/xen_intr.h>
-#ifdef XENHVM
#include <xen/hvm.h>
-#endif
#include <xen/interface/event_channel.h>
#include <xen/interface/grant_table.h>
@@ -192,133 +190,6 @@ xctrl_reboot()
shutdown_nice(0);
}
-#ifndef XENHVM
-extern void xencons_suspend(void);
-extern void xencons_resume(void);
-
-/* Full PV mode suspension. */
-static void
-xctrl_suspend()
-{
- int i, j, k, fpp, suspend_cancelled;
- unsigned long max_pfn, start_info_mfn;
-
- EVENTHANDLER_INVOKE(power_suspend);
-
-#ifdef SMP
- struct thread *td;
- cpuset_t map;
- u_int cpuid;
-
- /*
- * Bind us to CPU 0 and stop any other VCPUs.
- */
- td = curthread;
- thread_lock(td);
- sched_bind(td, 0);
- thread_unlock(td);
- cpuid = PCPU_GET(cpuid);
- KASSERT(cpuid == 0, ("xen_suspend: not running on cpu 0"));
-
- map = all_cpus;
- CPU_CLR(cpuid, &map);
- CPU_NAND(&map, &stopped_cpus);
- if (!CPU_EMPTY(&map))
- stop_cpus(map);
-#endif
-
- /*
- * Be sure to hold Giant across DEVICE_SUSPEND/RESUME since non-MPSAFE
- * drivers need this.
- */
- mtx_lock(&Giant);
- if (DEVICE_SUSPEND(root_bus) != 0) {
- mtx_unlock(&Giant);
- printf("%s: device_suspend failed\n", __func__);
-#ifdef SMP
- if (!CPU_EMPTY(&map))
- restart_cpus(map);
-#endif
- return;
- }
- mtx_unlock(&Giant);
-
- local_irq_disable();
-
- xencons_suspend();
- gnttab_suspend();
- intr_suspend();
-
- max_pfn = HYPERVISOR_shared_info->arch.max_pfn;
-
- void *shared_info = HYPERVISOR_shared_info;
- HYPERVISOR_shared_info = NULL;
- pmap_kremove((vm_offset_t) shared_info);
- PT_UPDATES_FLUSH();
-
- xen_start_info->store_mfn = MFNTOPFN(xen_start_info->store_mfn);
- xen_start_info->console.domU.mfn = MFNTOPFN(xen_start_info->console.domU.mfn);
-
- /*
- * We'll stop somewhere inside this hypercall. When it returns,
- * we'll start resuming after the restore.
- */
- start_info_mfn = VTOMFN(xen_start_info);
- pmap_suspend();
- suspend_cancelled = HYPERVISOR_suspend(start_info_mfn);
- pmap_resume();
-
- pmap_kenter_ma((vm_offset_t) shared_info, xen_start_info->shared_info);
- HYPERVISOR_shared_info = shared_info;
-
- HYPERVISOR_shared_info->arch.pfn_to_mfn_frame_list_list =
- VTOMFN(xen_pfn_to_mfn_frame_list_list);
-
- fpp = PAGE_SIZE/sizeof(unsigned long);
- for (i = 0, j = 0, k = -1; i < max_pfn; i += fpp, j++) {
- if ((j % fpp) == 0) {
- k++;
- xen_pfn_to_mfn_frame_list_list[k] =
- VTOMFN(xen_pfn_to_mfn_frame_list[k]);
- j = 0;
- }
- xen_pfn_to_mfn_frame_list[k][j] =
- VTOMFN(&xen_phys_machine[i]);
- }
- HYPERVISOR_shared_info->arch.max_pfn = max_pfn;
-
- gnttab_resume(NULL);
- intr_resume(suspend_cancelled != 0);
- local_irq_enable();
- xencons_resume();
-
-#ifdef CONFIG_SMP
- for_each_cpu(i)
- vcpu_prepare(i);
-
-#endif
-
- /*
- * Only resume xenbus /after/ we've prepared our VCPUs; otherwise
- * the VCPU hotplug callback can race with our vcpu_prepare
- */
- mtx_lock(&Giant);
- DEVICE_RESUME(root_bus);
- mtx_unlock(&Giant);
-
-#ifdef SMP
- thread_lock(curthread);
- sched_unbind(curthread);
- thread_unlock(curthread);
- if (!CPU_EMPTY(&map))
- restart_cpus(map);
-#endif
- EVENTHANDLER_INVOKE(power_resume);
-}
-
-#else
-
-/* HVM mode suspension. */
static void
xctrl_suspend()
{
@@ -417,7 +288,6 @@ xctrl_suspend()
printf("System resumed after suspension\n");
}
-#endif
static void
xctrl_crash()
diff --git a/sys/dev/xen/grant_table/grant_table.c b/sys/dev/xen/grant_table/grant_table.c
index 2511657..ad65fe0 100644
--- a/sys/dev/xen/grant_table/grant_table.c
+++ b/sys/dev/xen/grant_table/grant_table.c
@@ -53,7 +53,6 @@ static int gnttab_free_count;
static grant_ref_t gnttab_free_head;
static struct mtx gnttab_list_lock;
-#ifdef XENHVM
/*
* Resource representing allocated physical address space
* for the grant table metainfo
@@ -62,7 +61,6 @@ static struct resource *gnttab_pseudo_phys_res;
/* Resource id for allocated physical address space. */
static int gnttab_pseudo_phys_res_id;
-#endif
static grant_entry_t *shared;
@@ -510,72 +508,6 @@ unmap_pte_fn(pte_t *pte, struct page *pmd_page,
}
#endif
-#ifndef XENHVM
-
-static int
-gnttab_map(unsigned int start_idx, unsigned int end_idx)
-{
- struct gnttab_setup_table setup;
- u_long *frames;
-
- unsigned int nr_gframes = end_idx + 1;
- int i, rc;
-
- frames = malloc(nr_gframes * sizeof(unsigned long), M_DEVBUF, M_NOWAIT);
- if (!frames)
- return (ENOMEM);
-
- setup.dom = DOMID_SELF;
- setup.nr_frames = nr_gframes;
- set_xen_guest_handle(setup.frame_list, frames);
-
- rc = HYPERVISOR_grant_table_op(GNTTABOP_setup_table, &setup, 1);
- if (rc == -ENOSYS) {
- free(frames, M_DEVBUF);
- return (ENOSYS);
- }
- KASSERT(!(rc || setup.status),
- ("unexpected result from grant_table_op"));
-
- if (shared == NULL) {
- vm_offset_t area;
-
- area = kva_alloc(PAGE_SIZE * max_nr_grant_frames());
- KASSERT(area, ("can't allocate VM space for grant table"));
- shared = (grant_entry_t *)area;
- }
-
- for (i = 0; i < nr_gframes; i++)
- PT_SET_MA(((caddr_t)shared) + i*PAGE_SIZE,
- ((vm_paddr_t)frames[i]) << PAGE_SHIFT | PG_RW | PG_V);
-
- free(frames, M_DEVBUF);
-
- return (0);
-}
-
-int
-gnttab_resume(device_t dev)
-{
-
- if (max_nr_grant_frames() < nr_grant_frames)
- return (ENOSYS);
- return (gnttab_map(0, nr_grant_frames - 1));
-}
-
-int
-gnttab_suspend(void)
-{
- int i;
-
- for (i = 0; i < nr_grant_frames; i++)
- pmap_kremove((vm_offset_t) shared + i * PAGE_SIZE);
-
- return (0);
-}
-
-#else /* XENHVM */
-
static vm_paddr_t resume_frames;
static int
@@ -638,8 +570,6 @@ gnttab_resume(device_t dev)
return (gnttab_map(0, nr_gframes - 1));
}
-#endif
-
static int
gnttab_expand(unsigned int req_entries)
{
diff --git a/sys/dev/xen/netback/netback.c b/sys/dev/xen/netback/netback.c
index 63337ad..b5c1c13 100644
--- a/sys/dev/xen/netback/netback.c
+++ b/sys/dev/xen/netback/netback.c
@@ -473,7 +473,6 @@ struct xnb_softc {
*/
gnttab_copy_table tx_gnttab;
-#ifdef XENHVM
/**
* Resource representing allocated physical address space
* associated with our per-instance kva region.
@@ -482,7 +481,6 @@ struct xnb_softc {
/** Resource id for allocated physical address space. */
int pseudo_phys_res_id;
-#endif
/** Ring mapping and interrupt configuration data. */
struct xnb_ring_config ring_configs[XNB_NUM_RING_TYPES];
@@ -626,16 +624,12 @@ static void
xnb_free_communication_mem(struct xnb_softc *xnb)
{
if (xnb->kva != 0) {
-#ifndef XENHVM
- kva_free(xnb->kva, xnb->kva_size);
-#else
if (xnb->pseudo_phys_res != NULL) {
bus_release_resource(xnb->dev, SYS_RES_MEMORY,
xnb->pseudo_phys_res_id,
xnb->pseudo_phys_res);
xnb->pseudo_phys_res = NULL;
}
-#endif /* XENHVM */
}
xnb->kva = 0;
xnb->gnt_base_addr = 0;
@@ -816,12 +810,7 @@ xnb_alloc_communication_mem(struct xnb_softc *xnb)
for (i=0; i < XNB_NUM_RING_TYPES; i++) {
xnb->kva_size += xnb->ring_configs[i].ring_pages * PAGE_SIZE;
}
-#ifndef XENHVM
- xnb->kva = kva_alloc(xnb->kva_size);
- if (xnb->kva == 0)
- return (ENOMEM);
- xnb->gnt_base_addr = xnb->kva;
-#else /* defined XENHVM */
+
/*
* Reserve a range of pseudo physical memory that we can map
* into kva. These pages will only be backed by machine
@@ -840,7 +829,6 @@ xnb_alloc_communication_mem(struct xnb_softc *xnb)
}
xnb->kva = (vm_offset_t)rman_get_virtual(xnb->pseudo_phys_res);
xnb->gnt_base_addr = rman_get_start(xnb->pseudo_phys_res);
-#endif /* !defined XENHVM */
return (0);
}
diff --git a/sys/dev/xen/netfront/netfront.c b/sys/dev/xen/netfront/netfront.c
index f65e29c..3c1f952 100644
--- a/sys/dev/xen/netfront/netfront.c
+++ b/sys/dev/xen/netfront/netfront.c
@@ -879,12 +879,11 @@ refill:
if (sc->copying_receiver == 0) {
gnttab_grant_foreign_transfer_ref(ref,
otherend_id, pfn);
- sc->rx_pfn_array[nr_flips] = PFNTOMFN(pfn);
+ sc->rx_pfn_array[nr_flips] = pfn;
if (!xen_feature(XENFEAT_auto_translated_physmap)) {
/* Remove this page before passing
* back to Xen.
*/
- set_phys_to_machine(pfn, INVALID_P2M_ENTRY);
MULTI_update_va_mapping(&sc->rx_mcl[i],
vaddr, 0, 0);
}
@@ -892,7 +891,7 @@ refill:
} else {
gnttab_grant_foreign_access_ref(ref,
otherend_id,
- PFNTOMFN(pfn), 0);
+ pfn, 0);
}
req->id = id;
req->gref = ref;
@@ -907,7 +906,6 @@ refill:
* We may have allocated buffers which have entries outstanding
* in the page * update queue -- make sure we flush those first!
*/
- PT_UPDATES_FLUSH();
if (nr_flips != 0) {
#ifdef notyet
/* Tell the ballon driver what is going on. */
@@ -1361,8 +1359,6 @@ xennet_get_responses(struct netfront_info *np,
mmu->ptr = ((vm_paddr_t)mfn << PAGE_SHIFT) |
MMU_MACHPHYS_UPDATE;
mmu->val = pfn;
-
- set_phys_to_machine(pfn, mfn);
}
pages_flipped++;
} else {
@@ -1472,7 +1468,6 @@ xn_assemble_tx_request(struct netfront_info *sc, struct mbuf *m_head)
struct ifnet *ifp;
struct mbuf *m;
u_int nfrags;
- netif_extra_info_t *extra;
int otherend_id;
ifp = sc->xn_ifp;
@@ -1546,7 +1541,6 @@ xn_assemble_tx_request(struct netfront_info *sc, struct mbuf *m_head)
* of fragments or hit the end of the mbuf chain.
*/
m = m_head;
- extra = NULL;
otherend_id = xenbus_get_otherend_id(sc->xbdev);
for (m = m_head; m; m = m->m_next) {
netif_tx_request_t *tx;
@@ -1929,7 +1923,7 @@ network_connect(struct netfront_info *np)
} else {
gnttab_grant_foreign_access_ref(ref,
xenbus_get_otherend_id(np->xbdev),
- PFNTOMFN(pfn), 0);
+ pfn, 0);
}
req->gref = ref;
req->id = requeue_idx;
diff --git a/sys/fs/ext2fs/ext2_dir.h b/sys/fs/ext2fs/ext2_dir.h
index 8d92882..1138b86 100644
--- a/sys/fs/ext2fs/ext2_dir.h
+++ b/sys/fs/ext2fs/ext2_dir.h
@@ -40,21 +40,6 @@ struct ext2fs_direct {
uint16_t e2d_namlen; /* length of string in e2d_name */
char e2d_name[EXT2FS_MAXNAMLEN];/* name with length<=EXT2FS_MAXNAMLEN */
};
-
-enum slotstatus {
- NONE,
- COMPACT,
- FOUND
-};
-
-struct ext2fs_searchslot {
- enum slotstatus slotstatus;
- doff_t slotoffset; /* offset of area with free space */
- int slotsize; /* size of area at slotoffset */
- int slotfreespace; /* amount of space free in slot */
- int slotneeded; /* sizeof the entry we are seeking */
-};
-
/*
* The new version of the directory entry. Since EXT2 structures are
* stored in intel byte order, and the name_len field could never be
diff --git a/sys/fs/ext2fs/ext2_extern.h b/sys/fs/ext2fs/ext2_extern.h
index 93bd3f7..f7b7657 100644
--- a/sys/fs/ext2fs/ext2_extern.h
+++ b/sys/fs/ext2fs/ext2_extern.h
@@ -40,15 +40,12 @@
#define _FS_EXT2FS_EXT2_EXTERN_H_
struct ext2fs_dinode;
-struct ext2fs_direct_2;
-struct ext2fs_searchslot;
struct indir;
struct inode;
struct mount;
struct vfsconf;
struct vnode;
-int ext2_add_entry(struct vnode *, struct ext2fs_direct_2 *);
int ext2_alloc(struct inode *, daddr_t, e4fs_daddr_t, int,
struct ucred *, e4fs_daddr_t *);
int ext2_balloc(struct inode *,
@@ -86,18 +83,6 @@ int ext2_dirempty(struct inode *, ino_t, struct ucred *);
int ext2_checkpath(struct inode *, struct inode *, struct ucred *);
int cg_has_sb(int i);
int ext2_inactive(struct vop_inactive_args *);
-int ext2_htree_add_entry(struct vnode *, struct ext2fs_direct_2 *,
- struct componentname *);
-int ext2_htree_create_index(struct vnode *, struct componentname *,
- struct ext2fs_direct_2 *);
-int ext2_htree_has_idx(struct inode *);
-int ext2_htree_hash(const char *, int, uint32_t *, int, uint32_t *,
- uint32_t *);
-int ext2_htree_lookup(struct inode *, const char *, int, struct buf **,
- int *, doff_t *, doff_t *, doff_t *, struct ext2fs_searchslot *);
-int ext2_search_dirblock(struct inode *, void *, int *, const char *, int,
- int *, doff_t *, doff_t *, doff_t *, struct ext2fs_searchslot *);
-
/* Flags to low-level allocation routines.
* The low 16-bits are reserved for IO_ flags from vnode.h.
diff --git a/sys/fs/ext2fs/ext2_hash.c b/sys/fs/ext2fs/ext2_hash.c
deleted file mode 100644
index 663a2df..0000000
--- a/sys/fs/ext2fs/ext2_hash.c
+++ /dev/null
@@ -1,316 +0,0 @@
-/*-
- * Copyright (c) 2010, 2013 Zheng Liu <lz@freebsd.org>
- * Copyright (c) 2012, Vyacheslav Matyushin
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-/*
- * The following notice applies to the code in ext2_half_md4():
- *
- * Copyright (C) 1990-2, RSA Data Security, Inc. All rights reserved.
- *
- * License to copy and use this software is granted provided that it
- * is identified as the "RSA Data Security, Inc. MD4 Message-Digest
- * Algorithm" in all material mentioning or referencing this software
- * or this function.
- *
- * License is also granted to make and use derivative works provided
- * that such works are identified as "derived from the RSA Data
- * Security, Inc. MD4 Message-Digest Algorithm" in all material
- * mentioning or referencing the derived work.
- *
- * RSA Data Security, Inc. makes no representations concerning either
- * the merchantability of this software or the suitability of this
- * software for any particular purpose. It is provided "as is"
- * without express or implied warranty of any kind.
- *
- * These notices must be retained in any copies of any part of this
- * documentation and/or software.
- */
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/conf.h>
-#include <sys/vnode.h>
-#include <sys/stat.h>
-#include <sys/mount.h>
-
-#include <fs/ext2fs/htree.h>
-#include <fs/ext2fs/inode.h>
-#include <fs/ext2fs/ext2_mount.h>
-#include <fs/ext2fs/ext2_extern.h>
-
-/* F, G, and H are MD4 functions */
-#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
-#define G(x, y, z) (((x) & (y)) | ((x) & (z)) | ((y) & (z)))
-#define H(x, y, z) ((x) ^ (y) ^ (z))
-
-/* ROTATE_LEFT rotates x left n bits */
-#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n))))
-
-/*
- * FF, GG, and HH are transformations for rounds 1, 2, and 3.
- * Rotation is separated from addition to prevent recomputation.
- */
-#define FF(a, b, c, d, x, s) { \
- (a) += F ((b), (c), (d)) + (x); \
- (a) = ROTATE_LEFT ((a), (s)); \
-}
-
-#define GG(a, b, c, d, x, s) { \
- (a) += G ((b), (c), (d)) + (x) + (uint32_t)0x5A827999; \
- (a) = ROTATE_LEFT ((a), (s)); \
-}
-
-#define HH(a, b, c, d, x, s) { \
- (a) += H ((b), (c), (d)) + (x) + (uint32_t)0x6ED9EBA1; \
- (a) = ROTATE_LEFT ((a), (s)); \
-}
-
-/*
- * MD4 basic transformation. It transforms state based on block.
- *
- * This is a half md4 algorithm since Linux uses this algorithm for dir
- * index. This function is derived from the RSA Data Security, Inc. MD4
- * Message-Digest Algorithm and was modified as necessary.
- *
- * The return value of this function is uint32_t in Linux, but actually we don't
- * need to check this value, so in our version this function doesn't return any
- * value.
- */
-static void
-ext2_half_md4(uint32_t hash[4], uint32_t data[8])
-{
- uint32_t a = hash[0], b = hash[1], c = hash[2], d = hash[3];
-
- /* Round 1 */
- FF(a, b, c, d, data[0], 3);
- FF(d, a, b, c, data[1], 7);
- FF(c, d, a, b, data[2], 11);
- FF(b, c, d, a, data[3], 19);
- FF(a, b, c, d, data[4], 3);
- FF(d, a, b, c, data[5], 7);
- FF(c, d, a, b, data[6], 11);
- FF(b, c, d, a, data[7], 19);
-
- /* Round 2 */
- GG(a, b, c, d, data[1], 3);
- GG(d, a, b, c, data[3], 5);
- GG(c, d, a, b, data[5], 9);
- GG(b, c, d, a, data[7], 13);
- GG(a, b, c, d, data[0], 3);
- GG(d, a, b, c, data[2], 5);
- GG(c, d, a, b, data[4], 9);
- GG(b, c, d, a, data[6], 13);
-
- /* Round 3 */
- HH(a, b, c, d, data[3], 3);
- HH(d, a, b, c, data[7], 9);
- HH(c, d, a, b, data[2], 11);
- HH(b, c, d, a, data[6], 15);
- HH(a, b, c, d, data[1], 3);
- HH(d, a, b, c, data[5], 9);
- HH(c, d, a, b, data[0], 11);
- HH(b, c, d, a, data[4], 15);
-
- hash[0] += a;
- hash[1] += b;
- hash[2] += c;
- hash[3] += d;
-}
-
-/*
- * Tiny Encryption Algorithm.
- */
-static void
-ext2_tea(uint32_t hash[4], uint32_t data[8])
-{
- uint32_t tea_delta = 0x9E3779B9;
- uint32_t sum;
- uint32_t x = hash[0], y = hash[1];
- int n = 16;
- int i = 1;
-
- while (n-- > 0) {
- sum = i * tea_delta;
- x += ((y << 4) + data[0]) ^ (y + sum) ^ ((y >> 5) + data[1]);
- y += ((x << 4) + data[2]) ^ (x + sum) ^ ((x >> 5) + data[3]);
- i++;
- }
-
- hash[0] += x;
- hash[1] += y;
-}
-
-static uint32_t
-ext2_legacy_hash(const char *name, int len, int unsigned_char)
-{
- uint32_t h0, h1 = 0x12A3FE2D, h2 = 0x37ABE8F9;
- uint32_t multi = 0x6D22F5;
- const unsigned char *uname = (const unsigned char *)name;
- const signed char *sname = (const signed char *)name;
- int val, i;
-
- for (i = 0; i < len; i++) {
- if (unsigned_char)
- val = (u_int)*uname++;
- else
- val = (int)*sname++;
-
- h0 = h2 + (h1 ^ (val * multi));
- if (h0 & 0x80000000)
- h0 -= 0x7FFFFFFF;
- h2 = h1;
- h1 = h0;
- }
-
- return (h1 << 1);
-}
-
-static void
-ext2_prep_hashbuf(const char *src, int slen, uint32_t *dst, int dlen,
- int unsigned_char)
-{
- uint32_t padding = slen | (slen << 8) | (slen << 16) | (slen << 24);
- uint32_t buf_val;
- const unsigned char *ubuf = (const unsigned char *)src;
- const signed char *sbuf = (const signed char *)src;
- int len, i;
- int buf_byte;
-
- if (slen > dlen)
- len = dlen;
- else
- len = slen;
-
- buf_val = padding;
-
- for (i = 0; i < len; i++) {
- if (unsigned_char)
- buf_byte = (u_int)ubuf[i];
- else
- buf_byte = (int)sbuf[i];
-
- if ((i % 4) == 0)
- buf_val = padding;
-
- buf_val <<= 8;
- buf_val += buf_byte;
-
- if ((i % 4) == 3) {
- *dst++ = buf_val;
- dlen -= sizeof(uint32_t);
- buf_val = padding;
- }
- }
-
- dlen -= sizeof(uint32_t);
- if (dlen >= 0)
- *dst++ = buf_val;
-
- dlen -= sizeof(uint32_t);
- while (dlen >= 0) {
- *dst++ = padding;
- dlen -= sizeof(uint32_t);
- }
-}
-
-int
-ext2_htree_hash(const char *name, int len,
- uint32_t *hash_seed, int hash_version,
- uint32_t *hash_major, uint32_t *hash_minor)
-{
- uint32_t hash[4];
- uint32_t data[8];
- uint32_t major = 0, minor = 0;
- int unsigned_char = 0;
-
- if (!name || !hash_major)
- return (-1);
-
- if (len < 1 || len > 255)
- goto error;
-
- hash[0] = 0x67452301;
- hash[1] = 0xEFCDAB89;
- hash[2] = 0x98BADCFE;
- hash[3] = 0x10325476;
-
- if (hash_seed)
- memcpy(hash, hash_seed, sizeof(hash));
-
- switch (hash_version) {
- case EXT2_HTREE_TEA_UNSIGNED:
- unsigned_char = 1;
- /* FALLTHROUGH */
- case EXT2_HTREE_TEA:
- while (len > 0) {
- ext2_prep_hashbuf(name, len, data, 16, unsigned_char);
- ext2_tea(hash, data);
- len -= 16;
- name += 16;
- }
- major = hash[0];
- minor = hash[1];
- break;
- case EXT2_HTREE_LEGACY_UNSIGNED:
- unsigned_char = 1;
- /* FALLTHROUGH */
- case EXT2_HTREE_LEGACY:
- major = ext2_legacy_hash(name, len, unsigned_char);
- break;
- case EXT2_HTREE_HALF_MD4_UNSIGNED:
- unsigned_char = 1;
- /* FALLTHROUGH */
- case EXT2_HTREE_HALF_MD4:
- while (len > 0) {
- ext2_prep_hashbuf(name, len, data, 32, unsigned_char);
- ext2_half_md4(hash, data);
- len -= 32;
- name += 32;
- }
- major = hash[1];
- minor = hash[2];
- break;
- default:
- goto error;
- }
-
- major &= ~1;
- if (major == (EXT2_HTREE_EOF << 1))
- major = (EXT2_HTREE_EOF - 1) << 1;
- *hash_major = major;
- if (hash_minor)
- *hash_minor = minor;
-
- return (0);
-
-error:
- *hash_major = 0;
- if (hash_minor)
- *hash_minor = 0;
- return (-1);
-}
diff --git a/sys/fs/ext2fs/ext2_htree.c b/sys/fs/ext2fs/ext2_htree.c
deleted file mode 100644
index c847aa4..0000000
--- a/sys/fs/ext2fs/ext2_htree.c
+++ /dev/null
@@ -1,899 +0,0 @@
-/*-
- * Copyright (c) 2010, 2012 Zheng Liu <lz@freebsd.org>
- * Copyright (c) 2012, Vyacheslav Matyushin
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#include <sys/param.h>
-#include <sys/endian.h>
-#include <sys/systm.h>
-#include <sys/namei.h>
-#include <sys/bio.h>
-#include <sys/buf.h>
-#include <sys/endian.h>
-#include <sys/mount.h>
-#include <sys/vnode.h>
-#include <sys/malloc.h>
-#include <sys/dirent.h>
-#include <sys/sysctl.h>
-
-#include <ufs/ufs/dir.h>
-
-#include <fs/ext2fs/inode.h>
-#include <fs/ext2fs/ext2_mount.h>
-#include <fs/ext2fs/ext2fs.h>
-#include <fs/ext2fs/fs.h>
-#include <fs/ext2fs/ext2_extern.h>
-#include <fs/ext2fs/ext2_dinode.h>
-#include <fs/ext2fs/ext2_dir.h>
-#include <fs/ext2fs/htree.h>
-
-static void ext2_append_entry(char *block, uint32_t blksize,
- struct ext2fs_direct_2 *last_entry,
- struct ext2fs_direct_2 *new_entry);
-static int ext2_htree_append_block(struct vnode *vp, char *data,
- struct componentname *cnp, uint32_t blksize);
-static int ext2_htree_check_next(struct inode *ip, uint32_t hash,
- const char *name, struct ext2fs_htree_lookup_info *info);
-static int ext2_htree_cmp_sort_entry(const void *e1, const void *e2);
-static int ext2_htree_find_leaf(struct inode *ip, const char *name,
- int namelen, uint32_t *hash, uint8_t *hash_version,
- struct ext2fs_htree_lookup_info *info);
-static uint32_t ext2_htree_get_block(struct ext2fs_htree_entry *ep);
-static uint16_t ext2_htree_get_count(struct ext2fs_htree_entry *ep);
-static uint32_t ext2_htree_get_hash(struct ext2fs_htree_entry *ep);
-static uint16_t ext2_htree_get_limit(struct ext2fs_htree_entry *ep);
-static void ext2_htree_insert_entry_to_level(struct ext2fs_htree_lookup_level *level,
- uint32_t hash, uint32_t blk);
-static void ext2_htree_insert_entry(struct ext2fs_htree_lookup_info *info,
- uint32_t hash, uint32_t blk);
-static uint32_t ext2_htree_node_limit(struct inode *ip);
-static void ext2_htree_set_block(struct ext2fs_htree_entry *ep,
- uint32_t blk);
-static void ext2_htree_set_count(struct ext2fs_htree_entry *ep,
- uint16_t cnt);
-static void ext2_htree_set_hash(struct ext2fs_htree_entry *ep,
- uint32_t hash);
-static void ext2_htree_set_limit(struct ext2fs_htree_entry *ep,
- uint16_t limit);
-static int ext2_htree_split_dirblock(char *block1, char *block2,
- uint32_t blksize, uint32_t *hash_seed, uint8_t hash_version,
- uint32_t *split_hash, struct ext2fs_direct_2 *entry);
-static void ext2_htree_release(struct ext2fs_htree_lookup_info *info);
-static uint32_t ext2_htree_root_limit(struct inode *ip, int len);
-static int ext2_htree_writebuf(struct ext2fs_htree_lookup_info *info);
-
-int
-ext2_htree_has_idx(struct inode *ip)
-{
- if (EXT2_HAS_COMPAT_FEATURE(ip->i_e2fs, EXT2F_COMPAT_DIRHASHINDEX) &&
- ip->i_flag & IN_E4INDEX)
- return (1);
- else
- return (0);
-}
-
-static int
-ext2_htree_check_next(struct inode *ip, uint32_t hash, const char *name,
- struct ext2fs_htree_lookup_info *info)
-{
- struct vnode *vp = ITOV(ip);
- struct ext2fs_htree_lookup_level *level;
- struct buf *bp;
- uint32_t next_hash;
- int idx = info->h_levels_num - 1;
- int levels = 0;
-
- do {
- level = &info->h_levels[idx];
- level->h_entry++;
- if (level->h_entry < level->h_entries +
- ext2_htree_get_count(level->h_entries))
- break;
- if (idx == 0)
- return (0);
- idx--;
- levels++;
- } while (1);
-
- next_hash = ext2_htree_get_hash(level->h_entry);
- if ((hash & 1) == 0) {
- if (hash != (next_hash & ~1))
- return (0);
- }
-
- while (levels > 0) {
- levels--;
- if (ext2_blkatoff(vp, ext2_htree_get_block(level->h_entry) *
- ip->i_e2fs->e2fs_bsize, NULL, &bp) != 0)
- return (0);
- level = &info->h_levels[idx + 1];
- brelse(level->h_bp);
- level->h_bp = bp;
- level->h_entry = level->h_entries =
- ((struct ext2fs_htree_node *)bp->b_data)->h_entries;
- }
-
- return (1);
-}
-
-static uint32_t
-ext2_htree_get_block(struct ext2fs_htree_entry *ep)
-{
- return (ep->h_blk & 0x00FFFFFF);
-}
-
-static void
-ext2_htree_set_block(struct ext2fs_htree_entry *ep, uint32_t blk)
-{
- ep->h_blk = blk;
-}
-
-static uint16_t
-ext2_htree_get_count(struct ext2fs_htree_entry *ep)
-{
- return (((struct ext2fs_htree_count *)(ep))->h_entries_num);
-}
-
-static void
-ext2_htree_set_count(struct ext2fs_htree_entry *ep, uint16_t cnt)
-{
- ((struct ext2fs_htree_count *)(ep))->h_entries_num = cnt;
-}
-
-static uint32_t
-ext2_htree_get_hash(struct ext2fs_htree_entry *ep)
-{
- return (ep->h_hash);
-}
-
-static uint16_t
-ext2_htree_get_limit(struct ext2fs_htree_entry *ep)
-{
- return (((struct ext2fs_htree_count *)(ep))->h_entries_max);
-}
-
-static void
-ext2_htree_set_hash(struct ext2fs_htree_entry *ep, uint32_t hash)
-{
- ep->h_hash = hash;
-}
-
-static void
-ext2_htree_set_limit(struct ext2fs_htree_entry *ep, uint16_t limit)
-{
- ((struct ext2fs_htree_count *)(ep))->h_entries_max = limit;
-}
-
-static void
-ext2_htree_release(struct ext2fs_htree_lookup_info *info)
-{
- int i;
-
- for (i = 0; i < info->h_levels_num; i++) {
- struct buf *bp = info->h_levels[i].h_bp;
- if (bp != NULL)
- brelse(bp);
- }
-}
-
-static uint32_t
-ext2_htree_root_limit(struct inode *ip, int len)
-{
- uint32_t space;
-
- space = ip->i_e2fs->e2fs_bsize - EXT2_DIR_REC_LEN(1) -
- EXT2_DIR_REC_LEN(2) - len;
- return (space / sizeof(struct ext2fs_htree_entry));
-}
-
-static uint32_t
-ext2_htree_node_limit(struct inode *ip)
-{
- struct m_ext2fs *fs;
- uint32_t space;
-
- fs = ip->i_e2fs;
- space = fs->e2fs_bsize - EXT2_DIR_REC_LEN(0);
-
- return (space / sizeof(struct ext2fs_htree_entry));
-}
-
-static int
-ext2_htree_find_leaf(struct inode *ip, const char *name, int namelen,
- uint32_t *hash, uint8_t *hash_ver,
- struct ext2fs_htree_lookup_info *info)
-{
- struct vnode *vp;
- struct ext2fs *fs;
- struct m_ext2fs *m_fs;
- struct buf *bp = NULL;
- struct ext2fs_htree_root *rootp;
- struct ext2fs_htree_entry *entp, *start, *end, *middle, *found;
- struct ext2fs_htree_lookup_level *level_info;
- uint32_t hash_major = 0, hash_minor = 0;
- uint32_t levels, cnt;
- uint8_t hash_version;
-
- if (name == NULL || info == NULL)
- return (-1);
-
- vp = ITOV(ip);
- fs = ip->i_e2fs->e2fs;
- m_fs = ip->i_e2fs;
-
- if (ext2_blkatoff(vp, 0, NULL, &bp) != 0)
- return (-1);
-
- info->h_levels_num = 1;
- info->h_levels[0].h_bp = bp;
- rootp = (struct ext2fs_htree_root *)bp->b_data;
- if (rootp->h_info.h_hash_version != EXT2_HTREE_LEGACY &&
- rootp->h_info.h_hash_version != EXT2_HTREE_HALF_MD4 &&
- rootp->h_info.h_hash_version != EXT2_HTREE_TEA)
- goto error;
-
- hash_version = rootp->h_info.h_hash_version;
- if (hash_version <= EXT2_HTREE_TEA)
- hash_version += m_fs->e2fs_uhash;
- *hash_ver = hash_version;
-
- ext2_htree_hash(name, namelen, fs->e3fs_hash_seed,
- hash_version, &hash_major, &hash_minor);
- *hash = hash_major;
-
- if ((levels = rootp->h_info.h_ind_levels) > 1)
- goto error;
-
- entp = (struct ext2fs_htree_entry *)(((char *)&rootp->h_info) +
- rootp->h_info.h_info_len);
-
- if (ext2_htree_get_limit(entp) !=
- ext2_htree_root_limit(ip, rootp->h_info.h_info_len))
- goto error;
-
- while (1) {
- cnt = ext2_htree_get_count(entp);
- if (cnt == 0 || cnt > ext2_htree_get_limit(entp))
- goto error;
-
- start = entp + 1;
- end = entp + cnt - 1;
- while (start <= end) {
- middle = start + (end - start) / 2;
- if (ext2_htree_get_hash(middle) > hash_major)
- end = middle - 1;
- else
- start = middle + 1;
- }
- found = start - 1;
-
- level_info = &(info->h_levels[info->h_levels_num - 1]);
- level_info->h_bp = bp;
- level_info->h_entries = entp;
- level_info->h_entry = found;
- if (levels == 0)
- return (0);
- levels--;
- if (ext2_blkatoff(vp,
- ext2_htree_get_block(found) * m_fs->e2fs_bsize,
- NULL, &bp) != 0)
- goto error;
- entp = ((struct ext2fs_htree_node *)bp->b_data)->h_entries;
- info->h_levels_num++;
- info->h_levels[info->h_levels_num - 1].h_bp = bp;
- }
-
-error:
- ext2_htree_release(info);
- return (-1);
-}
-
-/*
- * Try to lookup a directory entry in HTree index
- */
-int
-ext2_htree_lookup(struct inode *ip, const char *name, int namelen,
- struct buf **bpp, int *entryoffp, doff_t *offp,
- doff_t *prevoffp, doff_t *endusefulp,
- struct ext2fs_searchslot *ss)
-{
- struct vnode *vp;
- struct ext2fs_htree_lookup_info info;
- struct ext2fs_htree_entry *leaf_node;
- struct m_ext2fs *m_fs;
- struct buf *bp;
- uint32_t blk;
- uint32_t dirhash;
- uint32_t bsize;
- uint8_t hash_version;
- int search_next;
- int found = 0;
-
- m_fs = ip->i_e2fs;
- bsize = m_fs->e2fs_bsize;
- vp = ITOV(ip);
-
- /* TODO: print error msg because we don't lookup '.' and '..' */
-
- memset(&info, 0, sizeof(info));
- if (ext2_htree_find_leaf(ip, name, namelen, &dirhash,
- &hash_version, &info))
- return (-1);
-
- do {
- leaf_node = info.h_levels[info.h_levels_num - 1].h_entry;
- blk = ext2_htree_get_block(leaf_node);
- if (ext2_blkatoff(vp, blk * bsize, NULL, &bp) != 0) {
- ext2_htree_release(&info);
- return (-1);
- }
-
- *offp = blk * bsize;
- *entryoffp = 0;
- *prevoffp = blk * bsize;
- *endusefulp = blk * bsize;
-
- if (ss->slotstatus == NONE) {
- ss->slotoffset = -1;
- ss->slotfreespace = 0;
- }
-
- if (ext2_search_dirblock(ip, bp->b_data, &found,
- name, namelen, entryoffp, offp, prevoffp,
- endusefulp, ss) != 0) {
- brelse(bp);
- ext2_htree_release(&info);
- return (-1);
- }
-
- if (found) {
- *bpp = bp;
- ext2_htree_release(&info);
- return (0);
- }
-
- brelse(bp);
- search_next = ext2_htree_check_next(ip, dirhash, name, &info);
- } while (search_next);
-
- ext2_htree_release(&info);
- return (ENOENT);
-}
-
-static int
-ext2_htree_append_block(struct vnode *vp, char *data,
- struct componentname *cnp, uint32_t blksize)
-{
- struct iovec aiov;
- struct uio auio;
- struct inode *dp = VTOI(vp);
- uint64_t cursize, newsize;
- int error;
-
- cursize = roundup(dp->i_size, blksize);
- newsize = cursize + blksize;
-
- auio.uio_offset = cursize;
- auio.uio_resid = blksize;
- aiov.iov_len = blksize;
- aiov.iov_base = data;
- auio.uio_iov = &aiov;
- auio.uio_iovcnt = 1;
- auio.uio_rw = UIO_WRITE;
- auio.uio_segflg = UIO_SYSSPACE;
- error = VOP_WRITE(vp, &auio, IO_SYNC, cnp->cn_cred);
- if (!error)
- dp->i_size = newsize;
-
- return (error);
-}
-
-static int
-ext2_htree_writebuf(struct ext2fs_htree_lookup_info *info)
-{
- int i, error;
-
- for (i = 0; i < info->h_levels_num; i++) {
- struct buf *bp = info->h_levels[i].h_bp;
- error = bwrite(bp);
- if (error)
- return (error);
- }
-
- return (0);
-}
-
-static void
-ext2_htree_insert_entry_to_level(struct ext2fs_htree_lookup_level *level,
- uint32_t hash, uint32_t blk)
-{
- struct ext2fs_htree_entry *target;
- int entries_num;
-
- target = level->h_entry + 1;
- entries_num = ext2_htree_get_count(level->h_entries);
-
- memmove(target + 1, target, (char *)(level->h_entries + entries_num) -
- (char *)target);
- ext2_htree_set_block(target, blk);
- ext2_htree_set_hash(target, hash);
- ext2_htree_set_count(level->h_entries, entries_num + 1);
-}
-
-/*
- * Insert an index entry to the index node.
- */
-static void
-ext2_htree_insert_entry(struct ext2fs_htree_lookup_info *info,
- uint32_t hash, uint32_t blk)
-{
- struct ext2fs_htree_lookup_level *level;
-
- level = &info->h_levels[info->h_levels_num - 1];
- ext2_htree_insert_entry_to_level(level, hash, blk);
-}
-
-/*
- * Compare two entry sort descriptors by name hash value.
- * This is used together with qsort.
- */
-static int
-ext2_htree_cmp_sort_entry(const void *e1, const void *e2)
-{
- const struct ext2fs_htree_sort_entry *entry1, *entry2;
-
- entry1 = (const struct ext2fs_htree_sort_entry *)e1;
- entry2 = (const struct ext2fs_htree_sort_entry *)e2;
-
- if (entry1->h_hash < entry2->h_hash)
- return (-1);
- if (entry1->h_hash > entry2->h_hash)
- return (1);
- return (0);
-}
-
-/*
- * Append an entry to the end of the directory block.
- */
-static void
-ext2_append_entry(char *block, uint32_t blksize,
- struct ext2fs_direct_2 *last_entry,
- struct ext2fs_direct_2 *new_entry)
-{
- uint16_t entry_len;
-
- entry_len = EXT2_DIR_REC_LEN(last_entry->e2d_namlen);
- last_entry->e2d_reclen = entry_len;
- last_entry = (struct ext2fs_direct_2 *)((char *)last_entry + entry_len);
- new_entry->e2d_reclen = block + blksize - (char *)last_entry;
- memcpy(last_entry, new_entry, EXT2_DIR_REC_LEN(new_entry->e2d_namlen));
-}
-
-/*
- * Move half of entries from the old directory block to the new one.
- */
-static int
-ext2_htree_split_dirblock(char *block1, char *block2, uint32_t blksize,
- uint32_t *hash_seed, uint8_t hash_version,
- uint32_t *split_hash, struct ext2fs_direct_2 *entry)
-{
- int entry_cnt = 0;
- int size = 0;
- int i, k;
- uint32_t offset;
- uint16_t entry_len = 0;
- uint32_t entry_hash;
- struct ext2fs_direct_2 *ep, *last;
- char *dest;
- struct ext2fs_htree_sort_entry *sort_info;
-
- ep = (struct ext2fs_direct_2 *)block1;
- dest = block2;
- sort_info = (struct ext2fs_htree_sort_entry *)
- ((char *)block2 + blksize);
-
- /*
- * Calculate name hash value for the entry which is to be added.
- */
- ext2_htree_hash(entry->e2d_name, entry->e2d_namlen, hash_seed,
- hash_version, &entry_hash, NULL);
-
- /*
- * Fill in directory entry sort descriptors.
- */
- while ((char *)ep < block1 + blksize) {
- if (ep->e2d_ino && ep->e2d_namlen) {
- entry_cnt++;
- sort_info--;
- sort_info->h_size = ep->e2d_reclen;
- sort_info->h_offset = (char *)ep - block1;
- ext2_htree_hash(ep->e2d_name, ep->e2d_namlen,
- hash_seed, hash_version,
- &sort_info->h_hash, NULL);
- }
- ep = (struct ext2fs_direct_2 *)
- ((char *)ep + ep->e2d_reclen);
- }
-
- /*
- * Sort directory entry descriptors by name hash value.
- */
- qsort(sort_info, entry_cnt, sizeof(struct ext2fs_htree_sort_entry),
- ext2_htree_cmp_sort_entry);
-
- /*
- * Count the number of entries to move to directory block 2.
- */
- for (i = entry_cnt - 1; i >= 0; i--) {
- if (sort_info[i].h_size + size > blksize / 2)
- break;
- size += sort_info[i].h_size;
- }
-
- *split_hash = sort_info[i + 1].h_hash;
-
- /*
- * Set collision bit.
- */
- if (*split_hash == sort_info[i].h_hash)
- *split_hash += 1;
-
- /*
- * Move half of directory entries from block 1 to block 2.
- */
- for (k = i + 1; k < entry_cnt; k++) {
- ep = (struct ext2fs_direct_2 *)((char *)block1 +
- sort_info[k].h_offset);
- entry_len = EXT2_DIR_REC_LEN(ep->e2d_namlen);
- memcpy(dest, ep, entry_len);
- ((struct ext2fs_direct_2 *)dest)->e2d_reclen = entry_len;
- /* Mark directory entry as unused. */
- ep->e2d_ino = 0;
- dest += entry_len;
- }
- dest -= entry_len;
-
- /* Shrink directory entries in block 1. */
- last = (struct ext2fs_direct_2 *)block1;
- entry_len = EXT2_DIR_REC_LEN(last->e2d_namlen);
- for (offset = last->e2d_reclen; offset < blksize; ) {
- ep = (struct ext2fs_direct_2 *)(block1 + offset);
- offset += ep->e2d_reclen;
- if (last->e2d_ino) {
- /* Trim the existing slot */
- last->e2d_reclen = entry_len;
- last = (struct ext2fs_direct_2 *)
- ((char *)last + entry_len);
- }
- entry_len = EXT2_DIR_REC_LEN(ep->e2d_namlen);
- memcpy((void *)last, (void *)ep, entry_len);
- }
-
- if (entry_hash >= *split_hash) {
- /* Add entry to block 2. */
- ext2_append_entry(block2, blksize,
- (struct ext2fs_direct_2 *)dest, entry);
-
- /* Adjust length field of last entry of block 1. */
- last->e2d_reclen = block1 + blksize - (char *)last;
- } else {
- /* Add entry to block 1. */
- ext2_append_entry(block1, blksize, last, entry);
-
- /* Adjust length field of last entry of block 2. */
- ((struct ext2fs_direct_2 *)dest)->e2d_reclen =
- block2 + blksize - dest;
- }
-
- return (0);
-}
-
-/*
- * Create an HTree index for a directory
- */
-int
-ext2_htree_create_index(struct vnode *vp, struct componentname *cnp,
- struct ext2fs_direct_2 *new_entry)
-{
- struct buf *bp = NULL;
- struct inode *dp;
- struct ext2fs *fs;
- struct m_ext2fs *m_fs;
- struct ext2fs_direct_2 *ep, *dotdot;
- struct ext2fs_htree_root *root;
- struct ext2fs_htree_lookup_info info;
- uint32_t blksize, dirlen, split_hash;
- uint8_t hash_version;
- char *buf1 = NULL;
- char *buf2 = NULL;
- int error = 0;
-
- dp = VTOI(vp);
- fs = dp->i_e2fs->e2fs;
- m_fs = dp->i_e2fs;
- blksize = m_fs->e2fs_bsize;
-
- buf1 = malloc(blksize, M_TEMP, M_WAITOK | M_ZERO);
- buf2 = malloc(blksize, M_TEMP, M_WAITOK | M_ZERO);
-
- if ((error = ext2_blkatoff(vp, 0, NULL, &bp)) != 0)
- goto out;
-
- root = (struct ext2fs_htree_root *)bp->b_data;
- dotdot = (struct ext2fs_direct_2 *)((char *)&(root->h_dotdot));
- ep = (struct ext2fs_direct_2 *)((char *)dotdot + dotdot->e2d_reclen);
- dirlen = (char *)root + blksize - (char *)ep;
- memcpy(buf1, ep, dirlen);
- ep = (struct ext2fs_direct_2 *)buf1;
- while ((char *)ep < buf1 + dirlen)
- ep = (struct ext2fs_direct_2 *)
- ((char *)ep + ep->e2d_reclen);
- ep->e2d_reclen = buf1 + blksize - (char *)ep;
-
- dp->i_flag |= IN_E4INDEX;
-
- /*
- * Initialize index root.
- */
- dotdot->e2d_reclen = blksize - EXT2_DIR_REC_LEN(1);
- memset(&root->h_info, 0, sizeof(root->h_info));
- root->h_info.h_hash_version = fs->e3fs_def_hash_version;
- root->h_info.h_info_len = sizeof(root->h_info);
- ext2_htree_set_block(root->h_entries, 1);
- ext2_htree_set_count(root->h_entries, 1);
- ext2_htree_set_limit(root->h_entries,
- ext2_htree_root_limit(dp, sizeof(root->h_info)));
-
- memset(&info, 0, sizeof(info));
- info.h_levels_num = 1;
- info.h_levels[0].h_entries = root->h_entries;
- info.h_levels[0].h_entry = root->h_entries;
-
- hash_version = root->h_info.h_hash_version;
- if (hash_version <= EXT2_HTREE_TEA)
- hash_version += m_fs->e2fs_uhash;
- ext2_htree_split_dirblock(buf1, buf2, blksize, fs->e3fs_hash_seed,
- hash_version, &split_hash, new_entry);
- ext2_htree_insert_entry(&info, split_hash, 2);
-
- /*
- * Write directory block 0.
- */
- if (DOINGASYNC(vp)) {
- bdwrite(bp);
- error = 0;
- } else {
- error = bwrite(bp);
- }
- dp->i_flag |= IN_CHANGE | IN_UPDATE;
- if (error)
- goto out;
-
- /*
- * Write directory block 1.
- */
- error = ext2_htree_append_block(vp, buf1, cnp, blksize);
- if (error)
- goto out1;
-
- /*
- * Write directory block 2.
- */
- error = ext2_htree_append_block(vp, buf2, cnp, blksize);
-
- free(buf1, M_TEMP);
- free(buf2, M_TEMP);
- return (error);
-out:
- if (bp != NULL)
- brelse(bp);
-out1:
- free(buf1, M_TEMP);
- free(buf2, M_TEMP);
- return (error);
-}
-
-/*
- * Add an entry to the directory using htree index.
- */
-int
-ext2_htree_add_entry(struct vnode *dvp, struct ext2fs_direct_2 *entry,
- struct componentname *cnp)
-{
- struct ext2fs_htree_entry *entries, *leaf_node;
- struct ext2fs_htree_lookup_info info;
- struct buf *bp = NULL;
- struct ext2fs *fs;
- struct m_ext2fs *m_fs;
- struct inode *ip;
- uint16_t ent_num;
- uint32_t dirhash, split_hash;
- uint32_t blksize, blknum;
- uint64_t cursize, dirsize;
- uint8_t hash_version;
- char *newdirblock = NULL;
- char *newidxblock = NULL;
- struct ext2fs_htree_node *dst_node;
- struct ext2fs_htree_entry *dst_entries;
- struct ext2fs_htree_entry *root_entires;
- struct buf *dst_bp = NULL;
- int error, write_bp = 0, write_dst_bp = 0, write_info = 0;
-
- ip = VTOI(dvp);
- m_fs = ip->i_e2fs;
- fs = m_fs->e2fs;
- blksize = m_fs->e2fs_bsize;
-
- if (ip->i_count != 0)
- return ext2_add_entry(dvp, entry);
-
- /* Target directory block is full, split it */
- memset(&info, 0, sizeof(info));
- error = ext2_htree_find_leaf(ip, entry->e2d_name, entry->e2d_namlen,
- &dirhash, &hash_version, &info);
- if (error)
- return (error);
-
- entries = info.h_levels[info.h_levels_num - 1].h_entries;
- ent_num = ext2_htree_get_count(entries);
- if (ent_num == ext2_htree_get_limit(entries)) {
- /* Split the index node. */
- root_entires = info.h_levels[0].h_entries;
- newidxblock = malloc(blksize, M_TEMP, M_WAITOK | M_ZERO);
- dst_node = (struct ext2fs_htree_node *)newidxblock;
- dst_entries = dst_node->h_entries;
- memset(&dst_node->h_fake_dirent, 0,
- sizeof(dst_node->h_fake_dirent));
- dst_node->h_fake_dirent.e2d_reclen = blksize;
-
- cursize = roundup(ip->i_size, blksize);
- dirsize = cursize + blksize;
- blknum = dirsize / blksize - 1;
-
- error = ext2_htree_append_block(dvp, newidxblock,
- cnp, blksize);
- if (error)
- goto finish;
- error = ext2_blkatoff(dvp, cursize, NULL, &dst_bp);
- if (error)
- goto finish;
- dst_node = (struct ext2fs_htree_node *)dst_bp->b_data;
- dst_entries = dst_node->h_entries;
-
- if (info.h_levels_num == 2) {
- uint16_t src_ent_num, dst_ent_num;
-
- if (ext2_htree_get_count(root_entires) ==
- ext2_htree_get_limit(root_entires)) {
- /* Directory index is full */
- error = EIO;
- goto finish;
- }
-
- src_ent_num = ent_num / 2;
- dst_ent_num = ent_num - src_ent_num;
- split_hash = ext2_htree_get_hash(entries + src_ent_num);
-
- /* Move half of index entries to the new index node */
- memcpy(dst_entries, entries + src_ent_num,
- dst_ent_num * sizeof(struct ext2fs_htree_entry));
- ext2_htree_set_count(entries, src_ent_num);
- ext2_htree_set_count(dst_entries, dst_ent_num);
- ext2_htree_set_limit(dst_entries,
- ext2_htree_node_limit(ip));
-
- if (info.h_levels[1].h_entry >= entries + src_ent_num) {
- struct buf *tmp = info.h_levels[1].h_bp;
- info.h_levels[1].h_bp = dst_bp;
- dst_bp = tmp;
-
- info.h_levels[1].h_entry =
- info.h_levels[1].h_entry -
- (entries + src_ent_num) +
- dst_entries;
- info.h_levels[1].h_entries = dst_entries;
- }
- ext2_htree_insert_entry_to_level(&info.h_levels[0],
- split_hash, blknum);
-
- /* Write new index node to disk */
- error = bwrite(dst_bp);
- ip->i_flag |= IN_CHANGE | IN_UPDATE;
- if (error)
- goto finish;
- write_dst_bp = 1;
- } else {
- /* Create second level for htree index */
- struct ext2fs_htree_root *idx_root;
-
- memcpy(dst_entries, entries,
- ent_num * sizeof(struct ext2fs_htree_entry));
- ext2_htree_set_limit(dst_entries,
- ext2_htree_node_limit(ip));
-
- idx_root = (struct ext2fs_htree_root *)
- info.h_levels[0].h_bp->b_data;
- idx_root->h_info.h_ind_levels = 1;
-
- ext2_htree_set_count(entries, 1);
- ext2_htree_set_block(entries, blknum);
-
- info.h_levels_num = 2;
- info.h_levels[1].h_entries = dst_entries;
- info.h_levels[1].h_entry = info.h_levels[0].h_entry -
- info.h_levels[0].h_entries + dst_entries;
- info.h_levels[1].h_bp = dst_bp;
- }
- }
-
- leaf_node = info.h_levels[info.h_levels_num - 1].h_entry;
- blknum = ext2_htree_get_block(leaf_node);
- error = ext2_blkatoff(dvp, blknum * blksize, NULL, &bp);
- if (error)
- goto finish;
-
- /* Split target directory block */
- newdirblock = malloc(blksize, M_TEMP, M_WAITOK | M_ZERO);
- ext2_htree_split_dirblock((char *)bp->b_data, newdirblock, blksize,
- fs->e3fs_hash_seed, hash_version, &split_hash, entry);
- cursize = roundup(ip->i_size, blksize);
- dirsize = cursize + blksize;
- blknum = dirsize / blksize - 1;
-
- /* Add index entry for the new directory block */
- ext2_htree_insert_entry(&info, split_hash, blknum);
-
- /* Write the new directory block to the end of the directory */
- error = ext2_htree_append_block(dvp, newdirblock, cnp, blksize);
- if (error)
- goto finish;
-
- /* Write the target directory block */
- error = bwrite(bp);
- ip->i_flag |= IN_CHANGE | IN_UPDATE;
- if (error)
- goto finish;
- write_bp = 1;
-
- /* Write the index block */
- error = ext2_htree_writebuf(&info);
- if (!error)
- write_info = 1;
-
-finish:
- if (dst_bp != NULL && !write_dst_bp)
- brelse(dst_bp);
- if (bp != NULL && !write_bp)
- brelse(bp);
- if (newdirblock != NULL)
- free(newdirblock, M_TEMP);
- if (newidxblock != NULL)
- free(newidxblock, M_TEMP);
- if (!write_info)
- ext2_htree_release(&info);
- return (error);
-}
diff --git a/sys/fs/ext2fs/ext2_lookup.c b/sys/fs/ext2fs/ext2_lookup.c
index f9845bd..379eb44 100644
--- a/sys/fs/ext2fs/ext2_lookup.c
+++ b/sys/fs/ext2fs/ext2_lookup.c
@@ -113,19 +113,9 @@ static u_char dt_to_ext2_ft[] = {
static int ext2_dirbadentry(struct vnode *dp, struct ext2fs_direct_2 *de,
int entryoffsetinblock);
-static int ext2_is_dot_entry(struct componentname *cnp);
static int ext2_lookup_ino(struct vnode *vdp, struct vnode **vpp,
struct componentname *cnp, ino_t *dd_ino);
-static int
-ext2_is_dot_entry(struct componentname *cnp)
-{
- if (cnp->cn_namelen <= 2 && cnp->cn_nameptr[0] == '.' &&
- (cnp->cn_nameptr[1] == '.' || cnp->cn_nameptr[1] == '0'))
- return (1);
- return (0);
-}
-
/*
* Vnode op for reading directories.
*/
@@ -306,9 +296,13 @@ ext2_lookup_ino(struct vnode *vdp, struct vnode **vpp, struct componentname *cnp
struct buf *bp; /* a buffer of directory entries */
struct ext2fs_direct_2 *ep; /* the current directory entry */
int entryoffsetinblock; /* offset of ep in bp's buffer */
- struct ext2fs_searchslot ss;
+ enum {NONE, COMPACT, FOUND} slotstatus;
+ doff_t slotoffset; /* offset of area with free space */
doff_t i_diroff; /* cached i_diroff value */
doff_t i_offset; /* cached i_offset value */
+ int slotsize; /* size of area at slotoffset */
+ int slotfreespace; /* amount of space free in slot */
+ int slotneeded; /* size of the entry we're seeking */
int numdirpasses; /* strategy for directory search */
doff_t endsearch; /* offset to end directory search */
doff_t prevoff; /* prev entry dp->i_offset */
@@ -316,13 +310,12 @@ ext2_lookup_ino(struct vnode *vdp, struct vnode **vpp, struct componentname *cnp
struct vnode *tdp; /* returned by VFS_VGET */
doff_t enduseful; /* pointer past last used dir slot */
u_long bmask; /* block offset mask */
- int error;
+ int namlen, error;
struct ucred *cred = cnp->cn_cred;
int flags = cnp->cn_flags;
int nameiop = cnp->cn_nameiop;
ino_t ino, ino1;
int ltype;
- int entry_found = 0;
int DIRBLKSIZ = VTOI(vdp)->i_e2fs->e2fs_bsize;
@@ -333,57 +326,31 @@ ext2_lookup_ino(struct vnode *vdp, struct vnode **vpp, struct componentname *cnp
bmask = VFSTOEXT2(vdp->v_mount)->um_mountp->mnt_stat.f_iosize - 1;
restart:
bp = NULL;
- ss.slotoffset = -1;
+ slotoffset = -1;
/*
* We now have a segment name to search for, and a directory to search.
- *
+ */
+
+ /*
* Suppress search for slots unless creating
* file and at end of pathname, in which case
* we watch for a place to put the new file in
* case it doesn't already exist.
*/
i_diroff = dp->i_diroff;
- ss.slotstatus = FOUND;
- ss.slotfreespace = ss.slotsize = ss.slotneeded = 0;
+ slotstatus = FOUND;
+ slotfreespace = slotsize = slotneeded = 0;
if ((nameiop == CREATE || nameiop == RENAME) &&
(flags & ISLASTCN)) {
- ss.slotstatus = NONE;
- ss.slotneeded = EXT2_DIR_REC_LEN(cnp->cn_namelen);
+ slotstatus = NONE;
+ slotneeded = EXT2_DIR_REC_LEN(cnp->cn_namelen);
/* was
- ss.slotneeded = (sizeof(struct direct) - MAXNAMLEN +
+ slotneeded = (sizeof(struct direct) - MAXNAMLEN +
cnp->cn_namelen + 3) &~ 3; */
}
/*
- * Try to lookup dir entry using htree directory index.
- *
- * If we got an error or we want to find '.' or '..' entry,
- * we will fall back to linear search.
- */
- if (!ext2_is_dot_entry(cnp) && ext2_htree_has_idx(dp)) {
- numdirpasses = 1;
- entryoffsetinblock = 0;
- switch (ext2_htree_lookup(dp, cnp->cn_nameptr, cnp->cn_namelen,
- &bp, &entryoffsetinblock, &i_offset, &prevoff,
- &enduseful, &ss)) {
- case 0:
- ep = (struct ext2fs_direct_2 *)((char *)bp->b_data +
- (i_offset & bmask));
- goto foundentry;
- case ENOENT:
- i_offset = roundup2(dp->i_size, DIRBLKSIZ);
- goto notfound;
- default:
- /*
- * Something failed; just fallback to do a linear
- * search.
- */
- break;
- }
- }
-
- /*
* If there is cached information on a previous search of
* this directory, pick up where we last left off.
* We cache only lookups as these are the most common
@@ -417,38 +384,96 @@ searchloop:
/*
* If necessary, get the next directory block.
*/
- if (bp != NULL)
- brelse(bp);
- error = ext2_blkatoff(vdp, (off_t)i_offset, NULL, &bp);
- if (error != 0)
- return (error);
- entryoffsetinblock = 0;
+ if ((i_offset & bmask) == 0) {
+ if (bp != NULL)
+ brelse(bp);
+ if ((error =
+ ext2_blkatoff(vdp, (off_t)i_offset, NULL,
+ &bp)) != 0)
+ return (error);
+ entryoffsetinblock = 0;
+ }
/*
* If still looking for a slot, and at a DIRBLKSIZE
* boundary, have to start looking for free space again.
*/
- if (ss.slotstatus == NONE &&
+ if (slotstatus == NONE &&
(entryoffsetinblock & (DIRBLKSIZ - 1)) == 0) {
- ss.slotoffset = -1;
- ss.slotfreespace = 0;
+ slotoffset = -1;
+ slotfreespace = 0;
}
- error = ext2_search_dirblock(dp, bp->b_data, &entry_found,
- cnp->cn_nameptr, cnp->cn_namelen,
- &entryoffsetinblock, &i_offset, &prevoff,
- &enduseful, &ss);
- if (error != 0) {
- brelse(bp);
- return (error);
+ /*
+ * Get pointer to next entry.
+ * Full validation checks are slow, so we only check
+ * enough to insure forward progress through the
+ * directory. Complete checks can be run by setting
+ * "vfs.e2fs.dirchk" to be true.
+ */
+ ep = (struct ext2fs_direct_2 *)
+ ((char *)bp->b_data + entryoffsetinblock);
+ if (ep->e2d_reclen == 0 ||
+ (dirchk && ext2_dirbadentry(vdp, ep, entryoffsetinblock))) {
+ int i;
+ ext2_dirbad(dp, i_offset, "mangled entry");
+ i = DIRBLKSIZ - (entryoffsetinblock & (DIRBLKSIZ - 1));
+ i_offset += i;
+ entryoffsetinblock += i;
+ continue;
+ }
+
+ /*
+ * If an appropriate sized slot has not yet been found,
+ * check to see if one is available. Also accumulate space
+ * in the current block so that we can determine if
+ * compaction is viable.
+ */
+ if (slotstatus != FOUND) {
+ int size = ep->e2d_reclen;
+
+ if (ep->e2d_ino != 0)
+ size -= EXT2_DIR_REC_LEN(ep->e2d_namlen);
+ if (size > 0) {
+ if (size >= slotneeded) {
+ slotstatus = FOUND;
+ slotoffset = i_offset;
+ slotsize = ep->e2d_reclen;
+ } else if (slotstatus == NONE) {
+ slotfreespace += size;
+ if (slotoffset == -1)
+ slotoffset = i_offset;
+ if (slotfreespace >= slotneeded) {
+ slotstatus = COMPACT;
+ slotsize = i_offset +
+ ep->e2d_reclen - slotoffset;
+ }
+ }
+ }
}
- if (entry_found) {
- ep = (struct ext2fs_direct_2 *)((char *)bp->b_data +
- (entryoffsetinblock & bmask));
-foundentry:
- ino = ep->e2d_ino;
- goto found;
+
+ /*
+ * Check for a name match.
+ */
+ if (ep->e2d_ino) {
+ namlen = ep->e2d_namlen;
+ if (namlen == cnp->cn_namelen &&
+ !bcmp(cnp->cn_nameptr, ep->e2d_name,
+ (unsigned)namlen)) {
+ /*
+ * Save directory entry's inode number and
+ * reclen in ndp->ni_ufs area, and release
+ * directory buffer.
+ */
+ ino = ep->e2d_ino;
+ goto found;
+ }
}
+ prevoff = i_offset;
+ i_offset += ep->e2d_reclen;
+ entryoffsetinblock += ep->e2d_reclen;
+ if (ep->e2d_ino)
+ enduseful = i_offset;
}
-notfound:
+/* notfound: */
/*
* If we started in the middle of the directory and failed
* to find our target, we must check the beginning as well.
@@ -483,15 +508,15 @@ notfound:
* can be put in the range from dp->i_offset to
* dp->i_offset + dp->i_count.
*/
- if (ss.slotstatus == NONE) {
+ if (slotstatus == NONE) {
dp->i_offset = roundup2(dp->i_size, DIRBLKSIZ);
dp->i_count = 0;
enduseful = dp->i_offset;
} else {
- dp->i_offset = ss.slotoffset;
- dp->i_count = ss.slotsize;
- if (enduseful < ss.slotoffset + ss.slotsize)
- enduseful = ss.slotoffset + ss.slotsize;
+ dp->i_offset = slotoffset;
+ dp->i_count = slotsize;
+ if (enduseful < slotoffset + slotsize)
+ enduseful = slotoffset + slotsize;
}
dp->i_endoff = roundup2(enduseful, DIRBLKSIZ);
/*
@@ -697,102 +722,6 @@ found:
return (0);
}
-int
-ext2_search_dirblock(struct inode *ip, void *data, int *foundp,
- const char *name, int namelen, int *entryoffsetinblockp,
- doff_t *offp, doff_t *prevoffp, doff_t *endusefulp,
- struct ext2fs_searchslot *ssp)
-{
- struct vnode *vdp;
- struct ext2fs_direct_2 *ep, *top;
- uint32_t bsize = ip->i_e2fs->e2fs_bsize;
- int offset = *entryoffsetinblockp;
- int namlen;
-
- vdp = ITOV(ip);
-
- ep = (struct ext2fs_direct_2 *)((char *)data + offset);
- top = (struct ext2fs_direct_2 *)((char *)data +
- bsize - EXT2_DIR_REC_LEN(0));
-
- while (ep < top) {
- /*
- * Full validation checks are slow, so we only check
- * enough to insure forward progress through the
- * directory. Complete checks can be run by setting
- * "vfs.e2fs.dirchk" to be true.
- */
- if (ep->e2d_reclen == 0 ||
- (dirchk && ext2_dirbadentry(vdp, ep, offset))) {
- int i;
- ext2_dirbad(ip, *offp, "mangled entry");
- i = bsize - (offset & (bsize - 1));
- *offp += i;
- offset += i;
- continue;
- }
-
- /*
- * If an appropriate sized slot has not yet been found,
- * check to see if one is available. Also accumulate space
- * in the current block so that we can determine if
- * compaction is viable.
- */
- if (ssp->slotstatus != FOUND) {
- int size = ep->e2d_reclen;
-
- if (ep->e2d_ino != 0)
- size -= EXT2_DIR_REC_LEN(ep->e2d_namlen);
- if (size > 0) {
- if (size >= ssp->slotneeded) {
- ssp->slotstatus = FOUND;
- ssp->slotoffset = *offp;
- ssp->slotsize = ep->e2d_reclen;
- } else if (ssp->slotstatus == NONE) {
- ssp->slotfreespace += size;
- if (ssp->slotoffset == -1)
- ssp->slotoffset = *offp;
- if (ssp->slotfreespace >= ssp->slotneeded) {
- ssp->slotstatus = COMPACT;
- ssp->slotsize = *offp +
- ep->e2d_reclen -
- ssp->slotoffset;
- }
- }
- }
- }
-
- /*
- * Check for a name match.
- */
- if (ep->e2d_ino) {
- namlen = ep->e2d_namlen;
- if (namlen == namelen &&
- !bcmp(name, ep->e2d_name, (unsigned)namlen)) {
- /*
- * Save directory entry's inode number and
- * reclen in ndp->ni_ufs area, and release
- * directory buffer.
- */
- *foundp = 1;
- return (0);
- }
- }
- *prevoffp = *offp;
- *offp += ep->e2d_reclen;
- offset += ep->e2d_reclen;
- *entryoffsetinblockp = offset;
- if (ep->e2d_ino)
- *endusefulp = *offp;
- /*
- * Get pointer to the next entry.
- */
- ep = (struct ext2fs_direct_2 *)((char *)data + offset);
- }
-
- return (0);
-}
-
void
ext2_dirbad(struct inode *ip, doff_t offset, char *how)
{
@@ -862,12 +791,16 @@ ext2_dirbadentry(struct vnode *dp, struct ext2fs_direct_2 *de,
int
ext2_direnter(struct inode *ip, struct vnode *dvp, struct componentname *cnp)
{
+ struct ext2fs_direct_2 *ep, *nep;
struct inode *dp;
+ struct buf *bp;
struct ext2fs_direct_2 newdir;
struct iovec aiov;
struct uio auio;
- int error, newentrysize;
- int DIRBLKSIZ = ip->i_e2fs->e2fs_bsize;
+ u_int dsize;
+ int error, loc, newentrysize, spacefree;
+ char *dirbuf;
+ int DIRBLKSIZ = ip->i_e2fs->e2fs_bsize;
#ifdef INVARIANTS
@@ -884,28 +817,6 @@ ext2_direnter(struct inode *ip, struct vnode *dvp, struct componentname *cnp)
newdir.e2d_type = EXT2_FT_UNKNOWN;
bcopy(cnp->cn_nameptr, newdir.e2d_name, (unsigned)cnp->cn_namelen + 1);
newentrysize = EXT2_DIR_REC_LEN(newdir.e2d_namlen);
-
- if (ext2_htree_has_idx(dp)) {
- error = ext2_htree_add_entry(dvp, &newdir, cnp);
- if (error) {
- dp->i_flag &= ~IN_E4INDEX;
- dp->i_flag |= IN_CHANGE | IN_UPDATE;
- }
- return (error);
- }
-
- if (EXT2_HAS_COMPAT_FEATURE(ip->i_e2fs, EXT2F_COMPAT_DIRHASHINDEX) &&
- !ext2_htree_has_idx(dp)) {
- if ((dp->i_size / DIRBLKSIZ) == 1 &&
- dp->i_offset == DIRBLKSIZ) {
- /*
- * Making indexed directory when one block is not
- * enough to save all entries.
- */
- return ext2_htree_create_index(dvp, cnp, &newdir);
- }
- }
-
if (dp->i_count == 0) {
/*
* If dp->i_count is 0, then namei could find no
@@ -937,29 +848,6 @@ ext2_direnter(struct inode *ip, struct vnode *dvp, struct componentname *cnp)
return (error);
}
- error = ext2_add_entry(dvp, &newdir);
- if (!error && dp->i_endoff && dp->i_endoff < dp->i_size)
- error = ext2_truncate(dvp, (off_t)dp->i_endoff, IO_SYNC,
- cnp->cn_cred, cnp->cn_thread);
- return (error);
-}
-
-/*
- * Insert an entry into the directory block.
- * Compact the contents.
- */
-int
-ext2_add_entry(struct vnode *dvp, struct ext2fs_direct_2 *entry)
-{
- struct ext2fs_direct_2 *ep, *nep;
- struct inode *dp;
- struct buf *bp;
- u_int dsize;
- int error, loc, newentrysize, spacefree;
- char *dirbuf;
-
- dp = VTOI(dvp);
-
/*
* If dp->i_count is non-zero, then namei found space
* for the new entry in the range dp->i_offset to
@@ -991,7 +879,6 @@ ext2_add_entry(struct vnode *dvp, struct ext2fs_direct_2 *entry)
* dp->i_offset + dp->i_count would yield the
* space.
*/
- newentrysize = EXT2_DIR_REC_LEN(entry->e2d_namlen);
ep = (struct ext2fs_direct_2 *)dirbuf;
dsize = EXT2_DIR_REC_LEN(ep->e2d_namlen);
spacefree = ep->e2d_reclen - dsize;
@@ -1017,15 +904,15 @@ ext2_add_entry(struct vnode *dvp, struct ext2fs_direct_2 *entry)
if (ep->e2d_ino == 0) {
if (spacefree + dsize < newentrysize)
panic("ext2_direnter: compact1");
- entry->e2d_reclen = spacefree + dsize;
+ newdir.e2d_reclen = spacefree + dsize;
} else {
if (spacefree < newentrysize)
panic("ext2_direnter: compact2");
- entry->e2d_reclen = spacefree;
+ newdir.e2d_reclen = spacefree;
ep->e2d_reclen = dsize;
ep = (struct ext2fs_direct_2 *)((char *)ep + dsize);
}
- bcopy((caddr_t)entry, (caddr_t)ep, (u_int)newentrysize);
+ bcopy((caddr_t)&newdir, (caddr_t)ep, (u_int)newentrysize);
if (DOINGASYNC(dvp)) {
bdwrite(bp);
error = 0;
@@ -1033,6 +920,9 @@ ext2_add_entry(struct vnode *dvp, struct ext2fs_direct_2 *entry)
error = bwrite(bp);
}
dp->i_flag |= IN_CHANGE | IN_UPDATE;
+ if (!error && dp->i_endoff && dp->i_endoff < dp->i_size)
+ error = ext2_truncate(dvp, (off_t)dp->i_endoff, IO_SYNC,
+ cnp->cn_cred, cnp->cn_thread);
return (error);
}
diff --git a/sys/fs/ext2fs/ext2_vfsops.c b/sys/fs/ext2fs/ext2_vfsops.c
index b82a41e..ce943ea 100644
--- a/sys/fs/ext2fs/ext2_vfsops.c
+++ b/sys/fs/ext2fs/ext2_vfsops.c
@@ -399,22 +399,8 @@ compute_sb_data(struct vnode *devvp, struct ext2fs *es,
if (es->e2fs_rev == E2FS_REV0 ||
!EXT2_HAS_RO_COMPAT_FEATURE(fs, EXT2F_ROCOMPAT_LARGEFILE))
fs->e2fs_maxfilesize = 0x7fffffff;
- else {
- fs->e2fs_maxfilesize = 0xffffffffffff;
- if (EXT2_HAS_RO_COMPAT_FEATURE(fs, EXT2F_ROCOMPAT_HUGE_FILE))
- fs->e2fs_maxfilesize = 0x7fffffffffffffff;
- }
- if (es->e4fs_flags & E2FS_UNSIGNED_HASH) {
- fs->e2fs_uhash = 3;
- } else if ((es->e4fs_flags & E2FS_SIGNED_HASH) == 0) {
-#ifdef __CHAR_UNSIGNED__
- es->e4fs_flags |= E2FS_UNSIGNED_HASH;
- fs->e2fs_uhash = 3;
-#else
- es->e4fs_flags |= E2FS_SIGNED_HASH;
-#endif
- }
-
+ else
+ fs->e2fs_maxfilesize = 0x7fffffffffffffff;
return (0);
}
@@ -675,7 +661,8 @@ ext2_mountfs(struct vnode *devvp, struct mount *mp)
* Initialize filesystem stat information in mount struct.
*/
MNT_ILOCK(mp);
- mp->mnt_kern_flag |= MNTK_LOOKUP_SHARED | MNTK_EXTENDED_SHARED;
+ mp->mnt_kern_flag |= MNTK_LOOKUP_SHARED | MNTK_EXTENDED_SHARED |
+ MNTK_USES_BCACHE;
MNT_IUNLOCK(mp);
return (0);
out:
diff --git a/sys/fs/ext2fs/ext2fs.h b/sys/fs/ext2fs/ext2fs.h
index 6e3a945..ec19300 100644
--- a/sys/fs/ext2fs/ext2fs.h
+++ b/sys/fs/ext2fs/ext2fs.h
@@ -147,7 +147,6 @@ struct m_ext2fs {
int32_t e2fs_contigsumsize; /* size of cluster summary array */
int32_t *e2fs_maxcluster; /* max cluster in each cyl group */
struct csum *e2fs_clustersum; /* cluster summary in each cyl group */
- int32_t e2fs_uhash; /* 3 if hash should be signed, 0 if not */
};
/* cluster summary information */
@@ -212,7 +211,6 @@ struct csum {
* - EXT2F_INCOMPAT_FLEX_BG
* - EXT2F_INCOMPAT_META_BG
*/
-#define EXT2F_COMPAT_SUPP EXT2F_COMPAT_DIRHASHINDEX
#define EXT2F_ROCOMPAT_SUPP (EXT2F_ROCOMPAT_SPARSESUPER | \
EXT2F_ROCOMPAT_LARGEFILE | \
EXT2F_ROCOMPAT_EXTRA_ISIZE)
@@ -242,12 +240,6 @@ struct csum {
#define E2FS_ISCLEAN 0x0001 /* Unmounted cleanly */
#define E2FS_ERRORS 0x0002 /* Errors detected */
-/*
- * Filesystem miscellaneous flags
- */
-#define E2FS_SIGNED_HASH 0x0001
-#define E2FS_UNSIGNED_HASH 0x0002
-
/* ext2 file system block group descriptor */
struct ext2_gd {
diff --git a/sys/fs/fuse/fuse_vfsops.c b/sys/fs/fuse/fuse_vfsops.c
index c00a96c..0a33373 100644
--- a/sys/fs/fuse/fuse_vfsops.c
+++ b/sys/fs/fuse/fuse_vfsops.c
@@ -337,6 +337,7 @@ fuse_vfsop_mount(struct mount *mp)
MNT_ILOCK(mp);
mp->mnt_data = data;
mp->mnt_flag |= MNT_LOCAL;
+ mp->mnt_kern_flag |= MNTK_USES_BCACHE;
MNT_IUNLOCK(mp);
/* We need this here as this slot is used by getnewvnode() */
mp->mnt_stat.f_iosize = PAGE_SIZE;
diff --git a/sys/fs/msdosfs/msdosfs_fat.c b/sys/fs/msdosfs/msdosfs_fat.c
index 3c17f00..cf03e00 100644
--- a/sys/fs/msdosfs/msdosfs_fat.c
+++ b/sys/fs/msdosfs/msdosfs_fat.c
@@ -380,6 +380,8 @@ usemap_alloc(struct msdosfsmount *pmp, u_long cn)
MSDOSFS_ASSERT_MP_LOCKED(pmp);
+ KASSERT((pmp->pm_flags & MSDOSFSMNT_RONLY) == 0,
+ ("usemap_alloc on ro msdosfs mount"));
KASSERT((pmp->pm_inusemap[cn / N_INUSEBITS] & (1 << (cn % N_INUSEBITS)))
== 0, ("Allocating used sector %ld %ld %x", cn, cn % N_INUSEBITS,
(unsigned)pmp->pm_inusemap[cn / N_INUSEBITS]));
@@ -394,6 +396,8 @@ usemap_free(struct msdosfsmount *pmp, u_long cn)
{
MSDOSFS_ASSERT_MP_LOCKED(pmp);
+ KASSERT((pmp->pm_flags & MSDOSFSMNT_RONLY) == 0,
+ ("usemap_free on ro msdosfs mount"));
pmp->pm_freeclustercount++;
pmp->pm_flags |= MSDOSFS_FSIMOD;
KASSERT((pmp->pm_inusemap[cn / N_INUSEBITS] & (1 << (cn % N_INUSEBITS)))
@@ -675,6 +679,8 @@ chainalloc(struct msdosfsmount *pmp, u_long start, u_long count,
u_long cl, n;
MSDOSFS_ASSERT_MP_LOCKED(pmp);
+ KASSERT((pmp->pm_flags & MSDOSFSMNT_RONLY) == 0,
+ ("chainalloc on ro msdosfs mount"));
for (cl = start, n = count; n-- > 0;)
usemap_alloc(pmp, cl++);
diff --git a/sys/fs/msdosfs/msdosfs_vfsops.c b/sys/fs/msdosfs/msdosfs_vfsops.c
index d14cdef..7c6d3ed 100644
--- a/sys/fs/msdosfs/msdosfs_vfsops.c
+++ b/sys/fs/msdosfs/msdosfs_vfsops.c
@@ -759,6 +759,7 @@ mountmsdosfs(struct vnode *devvp, struct mount *mp)
mp->mnt_stat.f_fsid.val[1] = mp->mnt_vfc->vfc_typenum;
MNT_ILOCK(mp);
mp->mnt_flag |= MNT_LOCAL;
+ mp->mnt_kern_flag |= MNTK_USES_BCACHE;
MNT_IUNLOCK(mp);
if (pmp->pm_flags & MSDOSFS_LARGEFS)
@@ -796,17 +797,17 @@ msdosfs_unmount(struct mount *mp, int mntflags)
struct msdosfsmount *pmp;
int error, flags;
- flags = 0;
- error = msdosfs_sync(mp, MNT_WAIT);
- if ((mntflags & MNT_FORCE) != 0) {
+ error = flags = 0;
+ pmp = VFSTOMSDOSFS(mp);
+ if ((pmp->pm_flags & MSDOSFSMNT_RONLY) == 0)
+ error = msdosfs_sync(mp, MNT_WAIT);
+ if ((mntflags & MNT_FORCE) != 0)
flags |= FORCECLOSE;
- } else if (error != 0) {
+ else if (error != 0)
return (error);
- }
error = vflush(mp, 0, flags, curthread);
if (error != 0 && error != ENXIO)
return (error);
- pmp = VFSTOMSDOSFS(mp);
if ((pmp->pm_flags & MSDOSFSMNT_RONLY) == 0) {
error = markvoldirty(pmp, 0);
if (error && error != ENXIO) {
diff --git a/sys/fs/nandfs/nandfs_vfsops.c b/sys/fs/nandfs/nandfs_vfsops.c
index eb07d4f..7132635 100644
--- a/sys/fs/nandfs/nandfs_vfsops.c
+++ b/sys/fs/nandfs/nandfs_vfsops.c
@@ -1391,6 +1391,7 @@ nandfs_mountfs(struct vnode *devvp, struct mount *mp)
nmp->nm_ronly = ronly;
MNT_ILOCK(mp);
mp->mnt_flag |= MNT_LOCAL;
+ mp->mnt_kern_flag |= MNTK_USES_BCACHE;
MNT_IUNLOCK(mp);
nmp->nm_nandfsdev = nandfsdev;
/* Add our mountpoint */
diff --git a/sys/fs/nfs/nfs.h b/sys/fs/nfs/nfs.h
index 6106de9..2ee9145 100644
--- a/sys/fs/nfs/nfs.h
+++ b/sys/fs/nfs/nfs.h
@@ -159,7 +159,7 @@
(t).tv_sec = time.tv_sec; (t).tv_nsec = 1000 * time.tv_usec; } while (0)
#define NFS_SRVMAXDATA(n) \
(((n)->nd_flag & (ND_NFSV3 | ND_NFSV4)) ? \
- NFS_MAXDATA : NFS_V2MAXDATA)
+ NFS_SRVMAXIO : NFS_V2MAXDATA)
#define NFS64BITSSET 0xffffffffffffffffull
#define NFS64BITSMINUS1 0xfffffffffffffffeull
diff --git a/sys/fs/nfs/nfs_commonport.c b/sys/fs/nfs/nfs_commonport.c
index 27aca26..eea146a 100644
--- a/sys/fs/nfs/nfs_commonport.c
+++ b/sys/fs/nfs/nfs_commonport.c
@@ -69,7 +69,7 @@ void (*ncl_call_invalcaches)(struct vnode *) = NULL;
static int nfs_realign_test;
static int nfs_realign_count;
-SYSCTL_NODE(_vfs, OID_AUTO, nfs, CTLFLAG_RW, 0, "New NFS filesystem");
+SYSCTL_NODE(_vfs, OID_AUTO, nfs, CTLFLAG_RW, 0, "NFS filesystem");
SYSCTL_INT(_vfs_nfs, OID_AUTO, realign_test, CTLFLAG_RW, &nfs_realign_test,
0, "Number of realign tests done");
SYSCTL_INT(_vfs_nfs, OID_AUTO, realign_count, CTLFLAG_RW, &nfs_realign_count,
@@ -78,7 +78,7 @@ SYSCTL_STRING(_vfs_nfs, OID_AUTO, callback_addr, CTLFLAG_RW,
nfsv4_callbackaddr, sizeof(nfsv4_callbackaddr),
"NFSv4 callback addr for server to use");
SYSCTL_INT(_vfs_nfs, OID_AUTO, debuglevel, CTLFLAG_RW, &nfscl_debuglevel,
- 0, "Debug level for new nfs client");
+ 0, "Debug level for NFS client");
/*
* Defines for malloc
@@ -100,12 +100,12 @@ MALLOC_DEFINE(M_NEWNFSCLDELEG, "NFSCL deleg", "NFSCL Delegation");
MALLOC_DEFINE(M_NEWNFSCLCLIENT, "NFSCL client", "NFSCL Client");
MALLOC_DEFINE(M_NEWNFSCLLOCKOWNER, "NFSCL lckown", "NFSCL Lock Owner");
MALLOC_DEFINE(M_NEWNFSCLLOCK, "NFSCL lck", "NFSCL Lock");
-MALLOC_DEFINE(M_NEWNFSV4NODE, "NEWNFSnode", "New nfs vnode");
-MALLOC_DEFINE(M_NEWNFSDIRECTIO, "NEWdirectio", "New nfs Direct IO buffer");
+MALLOC_DEFINE(M_NEWNFSV4NODE, "NEWNFSnode", "NFS vnode");
+MALLOC_DEFINE(M_NEWNFSDIRECTIO, "NEWdirectio", "NFS Direct IO buffer");
MALLOC_DEFINE(M_NEWNFSDIROFF, "NFSCL diroffdiroff",
- "New NFS directory offset data");
+ "NFS directory offset data");
MALLOC_DEFINE(M_NEWNFSDROLLBACK, "NFSD rollback",
- "New NFS local lock rollback");
+ "NFS local lock rollback");
MALLOC_DEFINE(M_NEWNFSLAYOUT, "NFSCL layout", "NFSv4.1 Layout");
MALLOC_DEFINE(M_NEWNFSFLAYOUT, "NFSCL flayout", "NFSv4.1 File Layout");
MALLOC_DEFINE(M_NEWNFSDEVINFO, "NFSCL devinfo", "NFSv4.1 Device Info");
@@ -281,11 +281,11 @@ nfsvno_getfs(struct nfsfsinfo *sip, int isdgram)
if (isdgram)
pref = NFS_MAXDGRAMDATA;
else
- pref = NFS_MAXDATA;
- sip->fs_rtmax = NFS_MAXDATA;
+ pref = NFS_SRVMAXIO;
+ sip->fs_rtmax = NFS_SRVMAXIO;
sip->fs_rtpref = pref;
sip->fs_rtmult = NFS_FABLKSIZE;
- sip->fs_wtmax = NFS_MAXDATA;
+ sip->fs_wtmax = NFS_SRVMAXIO;
sip->fs_wtpref = pref;
sip->fs_wtmult = NFS_FABLKSIZE;
sip->fs_dtpref = pref;
diff --git a/sys/fs/nfs/nfsport.h b/sys/fs/nfs/nfsport.h
index 9f08854..42a7f94 100644
--- a/sys/fs/nfs/nfsport.h
+++ b/sys/fs/nfs/nfsport.h
@@ -950,7 +950,7 @@ struct nfsreq {
};
#ifndef NFS_MAXBSIZE
-#define NFS_MAXBSIZE MAXBSIZE
+#define NFS_MAXBSIZE MAXBCACHEBUF
#endif
/*
diff --git a/sys/fs/nfs/nfsproto.h b/sys/fs/nfs/nfsproto.h
index 768dfcb..08e7b24 100644
--- a/sys/fs/nfs/nfsproto.h
+++ b/sys/fs/nfs/nfsproto.h
@@ -54,11 +54,10 @@
#define NFS_VER4 4
#define NFS_V2MAXDATA 8192
#define NFS_MAXDGRAMDATA 16384
-#define NFS_MAXDATA NFS_MAXBSIZE
#define NFS_MAXPATHLEN 1024
#define NFS_MAXNAMLEN 255
#define NFS_MAXPKTHDR 404
-#define NFS_MAXPACKET (NFS_MAXDATA + 2048)
+#define NFS_MAXPACKET (NFS_SRVMAXIO + 2048)
#define NFS_MINPACKET 20
#define NFS_FABLKSIZE 512 /* Size in bytes of a block wrt fa_blocks */
#define NFSV4_MINORVERSION 0 /* V4 Minor version */
@@ -67,6 +66,18 @@
#define NFSV41_CBVERS 4 /* V4.1 CB Version */
#define NFSV4_SMALLSTR 50 /* Strings small enough for stack */
+/*
+ * This value isn't a fixed value in the RFCs.
+ * It is the maximum data size supported by NFSv3 or NFSv4 over TCP for
+ * the server. It should be set to the I/O size preferred by ZFS or
+ * MAXBSIZE, whichever is greater.
+ * ZFS currently prefers 128K.
+ * It used to be called NFS_MAXDATA, but has been renamed to clarify that
+ * it refers to server side only and doesn't conflict with the NFS_MAXDATA
+ * defined in rpcsvc/nfs_prot.h for userland.
+ */
+#define NFS_SRVMAXIO (128 * 1024)
+
/* Stat numbers for rpc returns (version 2, 3 and 4) */
/*
* These numbers are hard-wired in the RFCs, so they can't be changed.
diff --git a/sys/fs/nfsclient/nfs_clrpcops.c b/sys/fs/nfsclient/nfs_clrpcops.c
index e1bfa29..7968353 100644
--- a/sys/fs/nfsclient/nfs_clrpcops.c
+++ b/sys/fs/nfsclient/nfs_clrpcops.c
@@ -537,8 +537,10 @@ nfsrpc_openrpc(struct nfsmount *nmp, vnode_t vp, u_int8_t *nfhp, int fhlen,
(void) nfs_catnap(PZERO, ret, "nfs_open2");
} while (ret == NFSERR_DELAY);
if (ret) {
- if (ndp != NULL)
+ if (ndp != NULL) {
FREE((caddr_t)ndp, M_NFSCLDELEG);
+ ndp = NULL;
+ }
if (ret == NFSERR_STALECLIENTID ||
ret == NFSERR_STALEDONTRECOVER ||
ret == NFSERR_BADSESSION)
@@ -2153,8 +2155,10 @@ nfsrpc_createv4(vnode_t dvp, char *name, int namelen, struct vattr *vap,
(void) nfs_catnap(PZERO, ret, "nfs_crt2");
} while (ret == NFSERR_DELAY);
if (ret) {
- if (dp != NULL)
+ if (dp != NULL) {
FREE((caddr_t)dp, M_NFSCLDELEG);
+ dp = NULL;
+ }
if (ret == NFSERR_STALECLIENTID ||
ret == NFSERR_STALEDONTRECOVER ||
ret == NFSERR_BADSESSION)
diff --git a/sys/fs/nfsclient/nfs_clvfsops.c b/sys/fs/nfsclient/nfs_clvfsops.c
index 9758b4c..73c6eb6 100644
--- a/sys/fs/nfsclient/nfs_clvfsops.c
+++ b/sys/fs/nfsclient/nfs_clvfsops.c
@@ -86,8 +86,8 @@ extern struct nfsmount *ncl_iodmount[NFS_MAXASYNCDAEMON];
extern struct mtx ncl_iod_mutex;
NFSCLSTATEMUTEX;
-MALLOC_DEFINE(M_NEWNFSREQ, "newnfsclient_req", "New NFS request header");
-MALLOC_DEFINE(M_NEWNFSMNT, "newnfsmnt", "New NFS mount struct");
+MALLOC_DEFINE(M_NEWNFSREQ, "newnfsclient_req", "NFS request header");
+MALLOC_DEFINE(M_NEWNFSMNT, "newnfsmnt", "NFS mount struct");
SYSCTL_DECL(_vfs_nfs);
static int nfs_ip_paranoia = 1;
@@ -201,16 +201,16 @@ newnfs_iosize(struct nfsmount *nmp)
}
if (nmp->nm_rsize > maxio || nmp->nm_rsize == 0)
nmp->nm_rsize = maxio;
- if (nmp->nm_rsize > MAXBSIZE)
- nmp->nm_rsize = MAXBSIZE;
+ if (nmp->nm_rsize > NFS_MAXBSIZE)
+ nmp->nm_rsize = NFS_MAXBSIZE;
if (nmp->nm_readdirsize > maxio || nmp->nm_readdirsize == 0)
nmp->nm_readdirsize = maxio;
if (nmp->nm_readdirsize > nmp->nm_rsize)
nmp->nm_readdirsize = nmp->nm_rsize;
if (nmp->nm_wsize > maxio || nmp->nm_wsize == 0)
nmp->nm_wsize = maxio;
- if (nmp->nm_wsize > MAXBSIZE)
- nmp->nm_wsize = MAXBSIZE;
+ if (nmp->nm_wsize > NFS_MAXBSIZE)
+ nmp->nm_wsize = NFS_MAXBSIZE;
/*
* Calculate the size used for io buffers. Use the larger
@@ -1198,7 +1198,8 @@ nfs_mount(struct mount *mp)
out:
if (!error) {
MNT_ILOCK(mp);
- mp->mnt_kern_flag |= MNTK_LOOKUP_SHARED | MNTK_NO_IOPF;
+ mp->mnt_kern_flag |= MNTK_LOOKUP_SHARED | MNTK_NO_IOPF |
+ MNTK_USES_BCACHE;
MNT_IUNLOCK(mp);
}
return (error);
@@ -1323,10 +1324,13 @@ mountnfs(struct nfs_args *argp, struct mount *mp, struct sockaddr *nam,
nmp->nm_timeo = NFS_TIMEO;
nmp->nm_retry = NFS_RETRANS;
nmp->nm_readahead = NFS_DEFRAHEAD;
- if (desiredvnodes >= 11000)
- nmp->nm_wcommitsize = hibufspace / (desiredvnodes / 1000);
- else
- nmp->nm_wcommitsize = hibufspace / 10;
+
+ /* This is empirical approximation of sqrt(hibufspace) * 256. */
+ nmp->nm_wcommitsize = NFS_MAXBSIZE / 256;
+ while ((long)nmp->nm_wcommitsize * nmp->nm_wcommitsize < hibufspace)
+ nmp->nm_wcommitsize *= 2;
+ nmp->nm_wcommitsize *= 256;
+
if ((argp->flags & NFSMNT_NFSV4) != 0)
nmp->nm_minorvers = minvers;
else
diff --git a/sys/fs/nfsserver/nfs_nfsdkrpc.c b/sys/fs/nfsserver/nfs_nfsdkrpc.c
index 4fb9c93..f9b8eb8 100644
--- a/sys/fs/nfsserver/nfs_nfsdkrpc.c
+++ b/sys/fs/nfsserver/nfs_nfsdkrpc.c
@@ -117,7 +117,8 @@ nfssvc_program(struct svc_req *rqst, SVCXPRT *xprt)
memset(&nd, 0, sizeof(nd));
if (rqst->rq_vers == NFS_VER2) {
- if (rqst->rq_proc > NFSV2PROC_STATFS) {
+ if (rqst->rq_proc > NFSV2PROC_STATFS ||
+ newnfs_nfsv3_procid[rqst->rq_proc] == NFSPROC_NOOP) {
svcerr_noproc(rqst);
svc_freereq(rqst);
goto out;
diff --git a/sys/fs/nfsserver/nfs_nfsdport.c b/sys/fs/nfsserver/nfs_nfsdport.c
index 0ea48cd..94475d9 100644
--- a/sys/fs/nfsserver/nfs_nfsdport.c
+++ b/sys/fs/nfsserver/nfs_nfsdport.c
@@ -84,7 +84,7 @@ extern int nfsrv_issuedelegs;
extern int nfsrv_dolocallocks;
extern int nfsd_enable_stringtouid;
-SYSCTL_NODE(_vfs, OID_AUTO, nfsd, CTLFLAG_RW, 0, "New NFS server");
+SYSCTL_NODE(_vfs, OID_AUTO, nfsd, CTLFLAG_RW, 0, "NFS server");
SYSCTL_INT(_vfs_nfsd, OID_AUTO, mirrormnt, CTLFLAG_RW,
&nfsrv_enable_crossmntpt, 0, "Enable nfsd to cross mount points");
SYSCTL_INT(_vfs_nfsd, OID_AUTO, commit_blks, CTLFLAG_RW, &nfs_commit_blks,
@@ -96,7 +96,7 @@ SYSCTL_INT(_vfs_nfsd, OID_AUTO, issue_delegations, CTLFLAG_RW,
SYSCTL_INT(_vfs_nfsd, OID_AUTO, enable_locallocks, CTLFLAG_RW,
&nfsrv_dolocallocks, 0, "Enable nfsd to acquire local locks on files");
SYSCTL_INT(_vfs_nfsd, OID_AUTO, debuglevel, CTLFLAG_RW, &nfsd_debuglevel,
- 0, "Debug level for new nfs server");
+ 0, "Debug level for NFS server");
SYSCTL_INT(_vfs_nfsd, OID_AUTO, enable_stringtouid, CTLFLAG_RW,
&nfsd_enable_stringtouid, 0, "Enable nfsd to accept numeric owner_names");
@@ -1270,8 +1270,11 @@ nfsvno_fsync(struct vnode *vp, u_int64_t off, int cnt, struct ucred *cred,
* file is done. At this time VOP_FSYNC does not accept offset and
* byte count parameters so call VOP_FSYNC the whole file for now.
* The same is true for NFSv4: RFC 3530 Sec. 14.2.3.
+ * File systems that do not use the buffer cache (as indicated
+ * by MNTK_USES_BCACHE not being set) must use VOP_FSYNC().
*/
- if (cnt == 0 || cnt > MAX_COMMIT_COUNT) {
+ if (cnt == 0 || cnt > MAX_COMMIT_COUNT ||
+ (vp->v_mount->mnt_kern_flag & MNTK_USES_BCACHE) == 0) {
/*
* Give up and do the whole thing
*/
diff --git a/sys/fs/nfsserver/nfs_nfsdserv.c b/sys/fs/nfsserver/nfs_nfsdserv.c
index e6e02d7..bd0c2da 100644
--- a/sys/fs/nfsserver/nfs_nfsdserv.c
+++ b/sys/fs/nfsserver/nfs_nfsdserv.c
@@ -881,7 +881,7 @@ nfsrvd_write(struct nfsrv_descript *nd, __unused int isdgram,
i = mbuf_len(mp);
}
- if (retlen > NFS_MAXDATA || retlen < 0)
+ if (retlen > NFS_SRVMAXIO || retlen < 0)
nd->nd_repstat = EIO;
if (vnode_vtype(vp) != VREG && !nd->nd_repstat) {
if (nd->nd_flag & ND_NFSV3)
diff --git a/sys/fs/nullfs/null_vfsops.c b/sys/fs/nullfs/null_vfsops.c
index fd3d385..618090b 100644
--- a/sys/fs/nullfs/null_vfsops.c
+++ b/sys/fs/nullfs/null_vfsops.c
@@ -199,7 +199,7 @@ nullfs_mount(struct mount *mp)
}
mp->mnt_kern_flag |= MNTK_LOOKUP_EXCL_DOTDOT;
mp->mnt_kern_flag |= lowerrootvp->v_mount->mnt_kern_flag &
- MNTK_SUSPENDABLE;
+ (MNTK_SUSPENDABLE | MNTK_USES_BCACHE);
MNT_IUNLOCK(mp);
mp->mnt_data = xmp;
vfs_getnewfsid(mp);
diff --git a/sys/fs/tmpfs/tmpfs_vnops.c b/sys/fs/tmpfs/tmpfs_vnops.c
index 885f84c..9bdb1e9 100644
--- a/sys/fs/tmpfs/tmpfs_vnops.c
+++ b/sys/fs/tmpfs/tmpfs_vnops.c
@@ -342,7 +342,7 @@ tmpfs_getattr(struct vop_getattr_args *v)
{
struct vnode *vp = v->a_vp;
struct vattr *vap = v->a_vap;
-
+ vm_object_t obj;
struct tmpfs_node *node;
node = VP_TO_TMPFS_NODE(vp);
@@ -366,7 +366,11 @@ tmpfs_getattr(struct vop_getattr_args *v)
vap->va_flags = node->tn_flags;
vap->va_rdev = (vp->v_type == VBLK || vp->v_type == VCHR) ?
node->tn_rdev : NODEV;
- vap->va_bytes = round_page(node->tn_size);
+ if (vp->v_type == VREG) {
+ obj = node->tn_reg.tn_aobj;
+ vap->va_bytes = (u_quad_t)obj->resident_page_count * PAGE_SIZE;
+ } else
+ vap->va_bytes = node->tn_size;
vap->va_filerev = 0;
return 0;
diff --git a/sys/geom/geom_dev.c b/sys/geom/geom_dev.c
index decbbe0..2539e1b 100644
--- a/sys/geom/geom_dev.c
+++ b/sys/geom/geom_dev.c
@@ -572,7 +572,7 @@ g_dev_done(struct bio *bp2)
}
mtx_unlock(&sc->sc_mtx);
if (destroy)
- g_post_event(g_dev_destroy, cp, M_WAITOK, NULL);
+ g_post_event(g_dev_destroy, cp, M_NOWAIT, NULL);
biodone(bp);
}
diff --git a/sys/geom/multipath/g_multipath.c b/sys/geom/multipath/g_multipath.c
index 7593cca..0953d18 100644
--- a/sys/geom/multipath/g_multipath.c
+++ b/sys/geom/multipath/g_multipath.c
@@ -369,9 +369,9 @@ g_multipath_done(struct bio *bp)
mtx_lock(&sc->sc_mtx);
(*cnt)--;
if (*cnt == 0 && (cp->index & MP_LOST)) {
- cp->index |= MP_POSTED;
+ if (g_post_event(g_mpd, cp, M_NOWAIT, NULL) == 0)
+ cp->index |= MP_POSTED;
mtx_unlock(&sc->sc_mtx);
- g_post_event(g_mpd, cp, M_WAITOK, NULL);
} else
mtx_unlock(&sc->sc_mtx);
g_std_done(bp);
diff --git a/sys/geom/uncompress/g_uncompress.c b/sys/geom/uncompress/g_uncompress.c
index 5bc8d30..8c2d5cb 100644
--- a/sys/geom/uncompress/g_uncompress.c
+++ b/sys/geom/uncompress/g_uncompress.c
@@ -45,10 +45,10 @@ __FBSDID("$FreeBSD$");
#include <sys/mutex.h>
#include <sys/malloc.h>
#include <sys/systm.h>
+#include <sys/zlib.h>
#include <geom/geom.h>
-#include <net/zlib.h>
#include <contrib/xz-embedded/linux/include/linux/xz.h>
#ifdef GEOM_UNCOMPRESS_DEBUG
@@ -571,6 +571,7 @@ g_uncompress_taste(struct g_class *mp, struct g_provider *pp, int flags)
(buf+sizeof(struct cloop_header)))[i]);
}
free(buf, M_GEOM);
+ buf = NULL;
DPRINTF(("%s: done reading offsets\n", gp->name));
mtx_init(&sc->last_mtx, "geom_uncompress cache", NULL, MTX_DEF);
sc->last_blk = -1;
diff --git a/sys/geom/uzip/g_uzip.c b/sys/geom/uzip/g_uzip.c
index c2ed64b..732de9d 100644
--- a/sys/geom/uzip/g_uzip.c
+++ b/sys/geom/uzip/g_uzip.c
@@ -38,9 +38,9 @@ __FBSDID("$FreeBSD$");
#include <sys/malloc.h>
#include <sys/sysctl.h>
#include <sys/systm.h>
+#include <sys/zlib.h>
#include <geom/geom.h>
-#include <net/zlib.h>
FEATURE(geom_uzip, "GEOM uzip read-only compressed disks support");
diff --git a/sys/gnu/dts/arm/meson.dtsi b/sys/gnu/dts/arm/meson.dtsi
index b67ede5..5260cb0 100644
--- a/sys/gnu/dts/arm/meson.dtsi
+++ b/sys/gnu/dts/arm/meson.dtsi
@@ -67,7 +67,7 @@
timer@c1109940 {
compatible = "amlogic,meson6-timer";
- reg = <0xc1109940 0x14>;
+ reg = <0xc1109940 0x18>;
interrupts = <0 10 1>;
};
@@ -80,36 +80,37 @@
wdt: watchdog@c1109900 {
compatible = "amlogic,meson6-wdt";
reg = <0xc1109900 0x8>;
+ interrupts = <0 0 1>;
};
uart_AO: serial@c81004c0 {
compatible = "amlogic,meson-uart";
- reg = <0xc81004c0 0x14>;
+ reg = <0xc81004c0 0x18>;
interrupts = <0 90 1>;
clocks = <&clk81>;
status = "disabled";
};
- uart_A: serial@c81084c0 {
+ uart_A: serial@c11084c0 {
compatible = "amlogic,meson-uart";
- reg = <0xc81084c0 0x14>;
- interrupts = <0 90 1>;
+ reg = <0xc11084c0 0x18>;
+ interrupts = <0 26 1>;
clocks = <&clk81>;
status = "disabled";
};
- uart_B: serial@c81084dc {
+ uart_B: serial@c11084dc {
compatible = "amlogic,meson-uart";
- reg = <0xc81084dc 0x14>;
- interrupts = <0 90 1>;
+ reg = <0xc11084dc 0x18>;
+ interrupts = <0 75 1>;
clocks = <&clk81>;
status = "disabled";
};
- uart_C: serial@c8108700 {
+ uart_C: serial@c1108700 {
compatible = "amlogic,meson-uart";
- reg = <0xc8108700 0x14>;
- interrupts = <0 90 1>;
+ reg = <0xc1108700 0x18>;
+ interrupts = <0 93 1>;
clocks = <&clk81>;
status = "disabled";
};
diff --git a/sys/gnu/dts/arm/meson6.dtsi b/sys/gnu/dts/arm/meson6.dtsi
index 8b33be1..7bfbb35 100644
--- a/sys/gnu/dts/arm/meson6.dtsi
+++ b/sys/gnu/dts/arm/meson6.dtsi
@@ -78,3 +78,7 @@
clock-frequency = <200000000>;
};
}; /* end of / */
+
+&L2 {
+ interrupts = <0 61 1>;
+};
diff --git a/sys/gnu/dts/arm/meson8.dtsi b/sys/gnu/dts/arm/meson8.dtsi
index 1f442a7..819a979 100644
--- a/sys/gnu/dts/arm/meson8.dtsi
+++ b/sys/gnu/dts/arm/meson8.dtsi
@@ -90,3 +90,7 @@
clock-frequency = <141666666>;
};
}; /* end of / */
+
+&L2 {
+ interrupts = <0 143 1>;
+};
diff --git a/sys/i386/conf/DEFAULTS b/sys/i386/conf/DEFAULTS
index 78d807c..d5bdb1d 100644
--- a/sys/i386/conf/DEFAULTS
+++ b/sys/i386/conf/DEFAULTS
@@ -26,7 +26,6 @@ options GEOM_PART_EBR_COMPAT
options GEOM_PART_MBR
# enable support for native hardware
-options NATIVE
device atpic
options NEW_PCIB
diff --git a/sys/i386/conf/GENERIC b/sys/i386/conf/GENERIC
index 086844a..b1740f3 100644
--- a/sys/i386/conf/GENERIC
+++ b/sys/i386/conf/GENERIC
@@ -358,7 +358,9 @@ device virtio_blk # VirtIO Block device
device virtio_scsi # VirtIO SCSI device
device virtio_balloon # VirtIO Memory Balloon device
-# HyperV drivers
+# HyperV drivers and enchancement support
+# NOTE: HYPERV depends on hyperv. They must be added or removed together.
+options HYPERV # Hyper-V kernel infrastructure
device hyperv # HyperV drivers
# Xen HVM Guest Optimizations
diff --git a/sys/i386/conf/XEN b/sys/i386/conf/XEN
deleted file mode 100644
index dd83670..0000000
--- a/sys/i386/conf/XEN
+++ /dev/null
@@ -1,96 +0,0 @@
-#
-# XEN -- Kernel configuration for i386 XEN DomU
-#
-# $FreeBSD$
-
-cpu I686_CPU
-ident XEN
-
-makeoptions DEBUG=-g # Build kernel with gdb(1) debug symbols
-
-# The following drivers don't build with PAE or XEN enabled.
-makeoptions WITHOUT_MODULES="ctl dpt drm drm2 hptmv ida"
-
-# The following drivers don't work with PAE enabled.
-makeoptions WITHOUT_MODULES+="ncr pst"
-
-options SCHED_ULE # ULE scheduler
-options PREEMPTION # Enable kernel thread preemption
-
-options INET # InterNETworking
-options INET6 # IPv6 communications protocols
-options SCTP # Stream Control Transmission Protocol
-options FFS # Berkeley Fast Filesystem
-options SOFTUPDATES # Enable FFS soft updates support
-options UFS_ACL # Support for access control lists
-options UFS_DIRHASH # Improve performance on big directories
-options UFS_GJOURNAL # Enable gjournal-based UFS journaling
-options NFSCL # Network Filesystem Client
-options NFSD # Network Filesystem Server
-options NFSLOCKD # Network Lock Manager
-options NFS_ROOT # NFS usable as /, requires NFSCL
-options MSDOSFS # MSDOS Filesystem
-options CD9660 # ISO 9660 Filesystem
-options PROCFS # Process filesystem (requires PSEUDOFS)
-options PSEUDOFS # Pseudo-filesystem framework
-options GEOM_PART_GPT # GUID Partition Tables.
-options GEOM_LABEL # Provides labelization
-options COMPAT_FREEBSD4 # Compatible with FreeBSD4
-options COMPAT_FREEBSD5 # Compatible with FreeBSD5
-options COMPAT_FREEBSD6 # Compatible with FreeBSD6
-options COMPAT_FREEBSD7 # Compatible with FreeBSD7
-options COMPAT_FREEBSD9 # Compatible with FreeBSD9
-options COMPAT_FREEBSD10 # Compatible with FreeBSD10
-options KTRACE # ktrace(1) support
-options STACK # stack(9) support
-options SYSVSHM # SYSV-style shared memory
-options SYSVMSG # SYSV-style message queues
-options SYSVSEM # SYSV-style semaphores
-options _KPOSIX_PRIORITY_SCHEDULING # POSIX P1003_1B real-time extensions
-options KBD_INSTALL_CDEV # install a CDEV entry in /dev
-options AUDIT # Security event auditing
-
-# Debugging for use in -current
-options KDB # Enable kernel debugger support.
-options DDB # Support DDB.
-options GDB # Support remote GDB.
-options DEADLKRES # Enable the deadlock resolver
-options INVARIANTS # Enable calls of extra sanity checking
-options INVARIANT_SUPPORT # Extra sanity checks of internal structures, required by INVARIANTS
-options WITNESS # Enable checks to detect deadlocks and cycles
-options WITNESS_SKIPSPIN # Don't run witness on spinlocks for speed
-
-options PAE
-nooption NATIVE
-option XEN
-nodevice atpic
-nodevice isa
-options MCLSHIFT=12
-
-# To make an SMP kernel, the next two lines are needed
-options SMP # Symmetric MultiProcessor Kernel
-device apic # I/O APIC
-
-#device atkbdc # AT keyboard controller
-#device atkbd # AT keyboard
-device psm # PS/2 mouse
-device pci
-
-#device kbdmux # keyboard multiplexer
-
-# Pseudo devices.
-device loop # Network loopback
-device random # Entropy device
-device ether # Ethernet support
-device tun # Packet tunnel.
-device md # Memory "disks"
-device gif # IPv6 and IPv4 tunneling
-
-# Wireless cards
-options IEEE80211_SUPPORT_MESH
-options AH_SUPPORT_AR5416
-
-# The `bpf' device enables the Berkeley Packet Filter.
-# Be aware of the administrative consequences of enabling this!
-# Note that 'bpf' is required for DHCP.
-device bpf # Berkeley packet filter
diff --git a/sys/i386/i386/apic_vector.s b/sys/i386/i386/apic_vector.s
index 7cae220..18b3c5d 100644
--- a/sys/i386/i386/apic_vector.s
+++ b/sys/i386/i386/apic_vector.s
@@ -181,6 +181,25 @@ IDTVEC(xen_intr_upcall)
jmp doreti
#endif
+#ifdef HYPERV
+/*
+ * This is the Hyper-V vmbus channel direct callback interrupt.
+ * Only used when it is running on Hyper-V.
+ */
+ .text
+ SUPERALIGN_TEXT
+IDTVEC(hv_vmbus_callback)
+ PUSH_FRAME
+ SET_KERNEL_SREGS
+ cld
+ FAKE_MCOUNT(TF_EIP(%esp))
+ pushl %esp
+ call hv_vector_handler
+ add $4, %esp
+ MEXITCOUNT
+ jmp doreti
+#endif
+
#ifdef SMP
/*
* Global address space TLB shootdown.
@@ -247,7 +266,6 @@ IDTVEC(invlcache)
/*
* Handler for IPIs sent via the per-cpu IPI bitmap.
*/
-#ifndef XEN
.text
SUPERALIGN_TEXT
IDTVEC(ipi_intr_bitmap_handler)
@@ -262,7 +280,7 @@ IDTVEC(ipi_intr_bitmap_handler)
call ipi_bitmap_handler
MEXITCOUNT
jmp doreti
-#endif
+
/*
* Executed by a CPU when it receives an IPI_STOP from another CPU.
*/
@@ -282,7 +300,6 @@ IDTVEC(cpustop)
/*
* Executed by a CPU when it receives an IPI_SUSPEND from another CPU.
*/
-#ifndef XEN
.text
SUPERALIGN_TEXT
IDTVEC(cpususpend)
@@ -295,7 +312,6 @@ IDTVEC(cpususpend)
POP_FRAME
jmp doreti_iret
-#endif
/*
* Executed by a CPU when it receives a RENDEZVOUS IPI from another CPU.
@@ -320,19 +336,4 @@ IDTVEC(rendezvous)
POP_FRAME
iret
-/*
- * Clean up when we lose out on the lazy context switch optimization.
- * ie: when we are about to release a PTD but a cpu is still borrowing it.
- */
- SUPERALIGN_TEXT
-IDTVEC(lazypmap)
- PUSH_FRAME
- SET_KERNEL_SREGS
- cld
-
- call pmap_lazyfix_action
-
- call as_lapic_eoi
- POP_FRAME
- iret
#endif /* SMP */
diff --git a/sys/i386/i386/bios.c b/sys/i386/i386/bios.c
index 1bce11c..6502749 100644
--- a/sys/i386/i386/bios.c
+++ b/sys/i386/i386/bios.c
@@ -389,7 +389,7 @@ bios16(struct bios_args *args, char *fmt, ...)
args->seg.code32.limit = 0xffff;
ptd = (pd_entry_t *)rcr3();
-#ifdef PAE
+#if defined(PAE) || defined(PAE_TABLES)
if (ptd == IdlePDPT)
#else
if (ptd == IdlePTD)
diff --git a/sys/i386/i386/db_trace.c b/sys/i386/i386/db_trace.c
index 822cc56..f797656 100644
--- a/sys/i386/i386/db_trace.c
+++ b/sys/i386/i386/db_trace.c
@@ -316,8 +316,7 @@ db_nextframe(struct i386_frame **fp, db_addr_t *ip, struct thread *td)
frame_type = TRAP_TIMERINT;
else if (strcmp(name, "Xcpustop") == 0 ||
strcmp(name, "Xrendezvous") == 0 ||
- strcmp(name, "Xipi_intr_bitmap_handler") == 0 ||
- strcmp(name, "Xlazypmap") == 0)
+ strcmp(name, "Xipi_intr_bitmap_handler") == 0)
frame_type = TRAP_INTERRUPT;
}
diff --git a/sys/i386/i386/genassym.c b/sys/i386/i386/genassym.c
index 97e2e97..7a00740 100644
--- a/sys/i386/i386/genassym.c
+++ b/sys/i386/i386/genassym.c
@@ -238,11 +238,6 @@ ASSYM(BUS_SPACE_HANDLE_BASE, offsetof(struct bus_space_handle, bsh_base));
ASSYM(BUS_SPACE_HANDLE_IAT, offsetof(struct bus_space_handle, bsh_iat));
#endif
-#ifdef XEN
-ASSYM(PC_CR3, offsetof(struct pcpu, pc_cr3));
-ASSYM(XEN_HYPERVISOR_VIRT_START, HYPERVISOR_VIRT_START);
-#endif
-
#ifdef HWPMC_HOOKS
ASSYM(PMC_FN_USER_CALLCHAIN, PMC_FN_USER_CALLCHAIN);
#endif
diff --git a/sys/i386/i386/initcpu.c b/sys/i386/i386/initcpu.c
index 291f3fc..9d8c265 100644
--- a/sys/i386/i386/initcpu.c
+++ b/sys/i386/i386/initcpu.c
@@ -784,7 +784,7 @@ initializecpu(void)
init_transmeta();
break;
}
-#ifdef PAE
+#if defined(PAE) || defined(PAE_TABLES)
if ((amd_feature & AMDID_NX) != 0) {
uint64_t msr;
diff --git a/sys/i386/i386/locore.s b/sys/i386/i386/locore.s
index 34acbf6..5bf7944 100644
--- a/sys/i386/i386/locore.s
+++ b/sys/i386/i386/locore.s
@@ -99,7 +99,7 @@ physfree: .long 0 /* phys addr of next free page */
.globl IdlePTD
IdlePTD: .long 0 /* phys addr of kernel PTD */
-#ifdef PAE
+#if defined(PAE) || defined(PAE_TABLES)
.globl IdlePDPT
IdlePDPT: .long 0 /* phys addr of kernel PDPT */
#endif
@@ -281,7 +281,7 @@ NON_GPROF_ENTRY(btext)
1:
/* Now enable paging */
-#ifdef PAE
+#if defined(PAE) || defined(PAE_TABLES)
movl R(IdlePDPT), %eax
movl %eax, %cr3
movl %cr4, %eax
@@ -722,7 +722,7 @@ no_kernend:
movl %esi,R(KPTmap)
/* Allocate Page Table Directory */
-#ifdef PAE
+#if defined(PAE) || defined(PAE_TABLES)
/* XXX only need 32 bytes (easier for now) */
ALLOCPAGES(1)
movl %esi,R(IdlePDPT)
@@ -788,7 +788,7 @@ no_kernend:
fillkptphys($PG_RW)
/* Map page directory. */
-#ifdef PAE
+#if defined(PAE) || defined(PAE_TABLES)
movl R(IdlePDPT), %eax
movl $1, %ecx
fillkptphys($PG_RW)
@@ -890,7 +890,7 @@ done_pde:
movl $NPGPTD,%ecx
fillkpt(R(IdlePTD), $PG_RW)
-#ifdef PAE
+#if defined(PAE) || defined(PAE_TABLES)
movl R(IdlePTD), %eax
xorl %ebx, %ebx
movl $NPGPTD, %ecx
diff --git a/sys/i386/i386/machdep.c b/sys/i386/i386/machdep.c
index 33d22de..a5867c4 100644
--- a/sys/i386/i386/machdep.c
+++ b/sys/i386/i386/machdep.c
@@ -160,24 +160,6 @@ int arch_i386_is_xbox = 0;
uint32_t arch_i386_xbox_memsize = 0;
#endif
-#ifdef XEN
-/* XEN includes */
-#include <xen/xen-os.h>
-#include <xen/hypervisor.h>
-#include <machine/xen/xenvar.h>
-#include <machine/xen/xenfunc.h>
-#include <xen/xen_intr.h>
-
-void Xhypervisor_callback(void);
-void failsafe_callback(void);
-
-extern trap_info_t trap_table[];
-struct proc_ldt default_proc_ldt;
-extern int init_first;
-int running_xen = 1;
-extern unsigned long physfree;
-#endif /* XEN */
-
/* Sanity check for __curthread() */
CTASSERT(offsetof(struct pcpu, pc_curthread) == 0);
@@ -356,9 +338,7 @@ cpu_startup(dummy)
*/
bufinit();
vm_pager_bufferinit();
-#ifndef XEN
cpu_setregs();
-#endif
}
/*
@@ -1176,436 +1156,6 @@ sys_sigreturn(td, uap)
}
/*
- * Machine dependent boot() routine
- *
- * I haven't seen anything to put here yet
- * Possibly some stuff might be grafted back here from boot()
- */
-void
-cpu_boot(int howto)
-{
-}
-
-/*
- * Flush the D-cache for non-DMA I/O so that the I-cache can
- * be made coherent later.
- */
-void
-cpu_flush_dcache(void *ptr, size_t len)
-{
- /* Not applicable */
-}
-
-/* Get current clock frequency for the given cpu id. */
-int
-cpu_est_clockrate(int cpu_id, uint64_t *rate)
-{
- uint64_t tsc1, tsc2;
- uint64_t acnt, mcnt, perf;
- register_t reg;
-
- if (pcpu_find(cpu_id) == NULL || rate == NULL)
- return (EINVAL);
- if ((cpu_feature & CPUID_TSC) == 0)
- return (EOPNOTSUPP);
-
- /*
- * If TSC is P-state invariant and APERF/MPERF MSRs do not exist,
- * DELAY(9) based logic fails.
- */
- if (tsc_is_invariant && !tsc_perf_stat)
- return (EOPNOTSUPP);
-
-#ifdef SMP
- if (smp_cpus > 1) {
- /* Schedule ourselves on the indicated cpu. */
- thread_lock(curthread);
- sched_bind(curthread, cpu_id);
- thread_unlock(curthread);
- }
-#endif
-
- /* Calibrate by measuring a short delay. */
- reg = intr_disable();
- if (tsc_is_invariant) {
- wrmsr(MSR_MPERF, 0);
- wrmsr(MSR_APERF, 0);
- tsc1 = rdtsc();
- DELAY(1000);
- mcnt = rdmsr(MSR_MPERF);
- acnt = rdmsr(MSR_APERF);
- tsc2 = rdtsc();
- intr_restore(reg);
- perf = 1000 * acnt / mcnt;
- *rate = (tsc2 - tsc1) * perf;
- } else {
- tsc1 = rdtsc();
- DELAY(1000);
- tsc2 = rdtsc();
- intr_restore(reg);
- *rate = (tsc2 - tsc1) * 1000;
- }
-
-#ifdef SMP
- if (smp_cpus > 1) {
- thread_lock(curthread);
- sched_unbind(curthread);
- thread_unlock(curthread);
- }
-#endif
-
- return (0);
-}
-
-#ifdef XEN
-
-static void
-idle_block(void)
-{
-
- HYPERVISOR_sched_op(SCHEDOP_block, 0);
-}
-
-void
-cpu_halt(void)
-{
- HYPERVISOR_shutdown(SHUTDOWN_poweroff);
-}
-
-int scheduler_running;
-
-static void
-cpu_idle_hlt(sbintime_t sbt)
-{
-
- scheduler_running = 1;
- enable_intr();
- idle_block();
-}
-
-#else
-/*
- * Shutdown the CPU as much as possible
- */
-void
-cpu_halt(void)
-{
- for (;;)
- halt();
-}
-
-#endif
-
-void (*cpu_idle_hook)(sbintime_t) = NULL; /* ACPI idle hook. */
-static int cpu_ident_amdc1e = 0; /* AMD C1E supported. */
-static int idle_mwait = 1; /* Use MONITOR/MWAIT for short idle. */
-SYSCTL_INT(_machdep, OID_AUTO, idle_mwait, CTLFLAG_RWTUN, &idle_mwait,
- 0, "Use MONITOR/MWAIT for short idle");
-
-#define STATE_RUNNING 0x0
-#define STATE_MWAIT 0x1
-#define STATE_SLEEPING 0x2
-
-#ifndef PC98
-static void
-cpu_idle_acpi(sbintime_t sbt)
-{
- int *state;
-
- state = (int *)PCPU_PTR(monitorbuf);
- *state = STATE_SLEEPING;
-
- /* See comments in cpu_idle_hlt(). */
- disable_intr();
- if (sched_runnable())
- enable_intr();
- else if (cpu_idle_hook)
- cpu_idle_hook(sbt);
- else
- __asm __volatile("sti; hlt");
- *state = STATE_RUNNING;
-}
-#endif /* !PC98 */
-
-#ifndef XEN
-static void
-cpu_idle_hlt(sbintime_t sbt)
-{
- int *state;
-
- state = (int *)PCPU_PTR(monitorbuf);
- *state = STATE_SLEEPING;
-
- /*
- * Since we may be in a critical section from cpu_idle(), if
- * an interrupt fires during that critical section we may have
- * a pending preemption. If the CPU halts, then that thread
- * may not execute until a later interrupt awakens the CPU.
- * To handle this race, check for a runnable thread after
- * disabling interrupts and immediately return if one is
- * found. Also, we must absolutely guarentee that hlt is
- * the next instruction after sti. This ensures that any
- * interrupt that fires after the call to disable_intr() will
- * immediately awaken the CPU from hlt. Finally, please note
- * that on x86 this works fine because of interrupts enabled only
- * after the instruction following sti takes place, while IF is set
- * to 1 immediately, allowing hlt instruction to acknowledge the
- * interrupt.
- */
- disable_intr();
- if (sched_runnable())
- enable_intr();
- else
- __asm __volatile("sti; hlt");
- *state = STATE_RUNNING;
-}
-#endif
-
-/*
- * MWAIT cpu power states. Lower 4 bits are sub-states.
- */
-#define MWAIT_C0 0xf0
-#define MWAIT_C1 0x00
-#define MWAIT_C2 0x10
-#define MWAIT_C3 0x20
-#define MWAIT_C4 0x30
-
-static void
-cpu_idle_mwait(sbintime_t sbt)
-{
- int *state;
-
- state = (int *)PCPU_PTR(monitorbuf);
- *state = STATE_MWAIT;
-
- /* See comments in cpu_idle_hlt(). */
- disable_intr();
- if (sched_runnable()) {
- enable_intr();
- *state = STATE_RUNNING;
- return;
- }
- cpu_monitor(state, 0, 0);
- if (*state == STATE_MWAIT)
- __asm __volatile("sti; mwait" : : "a" (MWAIT_C1), "c" (0));
- else
- enable_intr();
- *state = STATE_RUNNING;
-}
-
-static void
-cpu_idle_spin(sbintime_t sbt)
-{
- int *state;
- int i;
-
- state = (int *)PCPU_PTR(monitorbuf);
- *state = STATE_RUNNING;
-
- /*
- * The sched_runnable() call is racy but as long as there is
- * a loop missing it one time will have just a little impact if any
- * (and it is much better than missing the check at all).
- */
- for (i = 0; i < 1000; i++) {
- if (sched_runnable())
- return;
- cpu_spinwait();
- }
-}
-
-/*
- * C1E renders the local APIC timer dead, so we disable it by
- * reading the Interrupt Pending Message register and clearing
- * both C1eOnCmpHalt (bit 28) and SmiOnCmpHalt (bit 27).
- *
- * Reference:
- * "BIOS and Kernel Developer's Guide for AMD NPT Family 0Fh Processors"
- * #32559 revision 3.00+
- */
-#define MSR_AMDK8_IPM 0xc0010055
-#define AMDK8_SMIONCMPHALT (1ULL << 27)
-#define AMDK8_C1EONCMPHALT (1ULL << 28)
-#define AMDK8_CMPHALT (AMDK8_SMIONCMPHALT | AMDK8_C1EONCMPHALT)
-
-static void
-cpu_probe_amdc1e(void)
-{
-
- /*
- * Detect the presence of C1E capability mostly on latest
- * dual-cores (or future) k8 family.
- */
- if (cpu_vendor_id == CPU_VENDOR_AMD &&
- (cpu_id & 0x00000f00) == 0x00000f00 &&
- (cpu_id & 0x0fff0000) >= 0x00040000) {
- cpu_ident_amdc1e = 1;
- }
-}
-
-#if defined(PC98) || defined(XEN)
-void (*cpu_idle_fn)(sbintime_t) = cpu_idle_hlt;
-#else
-void (*cpu_idle_fn)(sbintime_t) = cpu_idle_acpi;
-#endif
-
-void
-cpu_idle(int busy)
-{
-#ifndef XEN
- uint64_t msr;
-#endif
- sbintime_t sbt = -1;
-
- CTR2(KTR_SPARE2, "cpu_idle(%d) at %d",
- busy, curcpu);
-#if defined(MP_WATCHDOG) && !defined(XEN)
- ap_watchdog(PCPU_GET(cpuid));
-#endif
-#ifndef XEN
- /* If we are busy - try to use fast methods. */
- if (busy) {
- if ((cpu_feature2 & CPUID2_MON) && idle_mwait) {
- cpu_idle_mwait(busy);
- goto out;
- }
- }
-#endif
-
- /* If we have time - switch timers into idle mode. */
- if (!busy) {
- critical_enter();
- sbt = cpu_idleclock();
- }
-
-#ifndef XEN
- /* Apply AMD APIC timer C1E workaround. */
- if (cpu_ident_amdc1e && cpu_disable_c3_sleep) {
- msr = rdmsr(MSR_AMDK8_IPM);
- if (msr & AMDK8_CMPHALT)
- wrmsr(MSR_AMDK8_IPM, msr & ~AMDK8_CMPHALT);
- }
-#endif
-
- /* Call main idle method. */
- cpu_idle_fn(sbt);
-
- /* Switch timers back into active mode. */
- if (!busy) {
- cpu_activeclock();
- critical_exit();
- }
-#ifndef XEN
-out:
-#endif
- CTR2(KTR_SPARE2, "cpu_idle(%d) at %d done",
- busy, curcpu);
-}
-
-int
-cpu_idle_wakeup(int cpu)
-{
- struct pcpu *pcpu;
- int *state;
-
- pcpu = pcpu_find(cpu);
- state = (int *)pcpu->pc_monitorbuf;
- /*
- * This doesn't need to be atomic since missing the race will
- * simply result in unnecessary IPIs.
- */
- if (*state == STATE_SLEEPING)
- return (0);
- if (*state == STATE_MWAIT)
- *state = STATE_RUNNING;
- return (1);
-}
-
-/*
- * Ordered by speed/power consumption.
- */
-struct {
- void *id_fn;
- char *id_name;
-} idle_tbl[] = {
- { cpu_idle_spin, "spin" },
- { cpu_idle_mwait, "mwait" },
- { cpu_idle_hlt, "hlt" },
-#ifndef PC98
- { cpu_idle_acpi, "acpi" },
-#endif
- { NULL, NULL }
-};
-
-static int
-idle_sysctl_available(SYSCTL_HANDLER_ARGS)
-{
- char *avail, *p;
- int error;
- int i;
-
- avail = malloc(256, M_TEMP, M_WAITOK);
- p = avail;
- for (i = 0; idle_tbl[i].id_name != NULL; i++) {
- if (strstr(idle_tbl[i].id_name, "mwait") &&
- (cpu_feature2 & CPUID2_MON) == 0)
- continue;
-#ifndef PC98
- if (strcmp(idle_tbl[i].id_name, "acpi") == 0 &&
- cpu_idle_hook == NULL)
- continue;
-#endif
- p += sprintf(p, "%s%s", p != avail ? ", " : "",
- idle_tbl[i].id_name);
- }
- error = sysctl_handle_string(oidp, avail, 0, req);
- free(avail, M_TEMP);
- return (error);
-}
-
-SYSCTL_PROC(_machdep, OID_AUTO, idle_available, CTLTYPE_STRING | CTLFLAG_RD,
- 0, 0, idle_sysctl_available, "A", "list of available idle functions");
-
-static int
-idle_sysctl(SYSCTL_HANDLER_ARGS)
-{
- char buf[16];
- int error;
- char *p;
- int i;
-
- p = "unknown";
- for (i = 0; idle_tbl[i].id_name != NULL; i++) {
- if (idle_tbl[i].id_fn == cpu_idle_fn) {
- p = idle_tbl[i].id_name;
- break;
- }
- }
- strncpy(buf, p, sizeof(buf));
- error = sysctl_handle_string(oidp, buf, sizeof(buf), req);
- if (error != 0 || req->newptr == NULL)
- return (error);
- for (i = 0; idle_tbl[i].id_name != NULL; i++) {
- if (strstr(idle_tbl[i].id_name, "mwait") &&
- (cpu_feature2 & CPUID2_MON) == 0)
- continue;
-#ifndef PC98
- if (strcmp(idle_tbl[i].id_name, "acpi") == 0 &&
- cpu_idle_hook == NULL)
- continue;
-#endif
- if (strcmp(idle_tbl[i].id_name, buf))
- continue;
- cpu_idle_fn = idle_tbl[i].id_fn;
- return (0);
- }
- return (EINVAL);
-}
-
-SYSCTL_PROC(_machdep, OID_AUTO, idle, CTLTYPE_STRING | CTLFLAG_RW, 0, 0,
- idle_sysctl, "A", "currently selected idle function");
-
-/*
* Reset registers to default values on exec.
*/
void
@@ -1721,13 +1271,8 @@ SYSCTL_STRING(_machdep, OID_AUTO, bootmethod, CTLFLAG_RD, bootmethod, 0,
int _default_ldt;
-#ifdef XEN
-union descriptor *gdt;
-union descriptor *ldt;
-#else
union descriptor gdt[NGDT * MAXCPU]; /* global descriptor table */
union descriptor ldt[NLDT]; /* local descriptor table */
-#endif
static struct gate_descriptor idt0[NIDT];
struct gate_descriptor *idt = &idt0[0]; /* interrupt descriptor table */
struct region_descriptor r_gdt, r_idt; /* table descriptors */
@@ -1827,7 +1372,6 @@ struct soft_segment_descriptor gdt_segs[] = {
.ssd_xx = 0, .ssd_xx1 = 0,
.ssd_def32 = 1,
.ssd_gran = 1 },
-#ifndef XEN
/* GPROC0_SEL 9 Proc 0 Tss Descriptor */
{
.ssd_base = 0x0,
@@ -1919,7 +1463,6 @@ struct soft_segment_descriptor gdt_segs[] = {
.ssd_xx = 0, .ssd_xx1 = 0,
.ssd_def32 = 0,
.ssd_gran = 0 },
-#endif /* !XEN */
};
static struct soft_segment_descriptor ldt_segs[] = {
@@ -2071,7 +1614,7 @@ sdtossd(sd, ssd)
ssd->ssd_gran = sd->sd_gran;
}
-#if !defined(PC98) && !defined(XEN)
+#if !defined(PC98)
static int
add_physmap_entry(uint64_t base, uint64_t length, vm_paddr_t *physmap,
int *physmap_idxp)
@@ -2178,9 +1721,8 @@ add_smap_entries(struct bios_smap *smapbase, vm_paddr_t *physmap,
if (!add_smap_entry(smap, physmap, physmap_idxp))
break;
}
-#endif /* !PC98 && !XEN */
+#endif /* !PC98 */
-#ifndef XEN
static void
basemem_setup(void)
{
@@ -2228,7 +1770,6 @@ basemem_setup(void)
for (i = basemem / 4; i < 160; i++)
pte[i] = (i << PAGE_SHIFT) | PG_V | PG_RW | PG_U;
}
-#endif /* !XEN */
/*
* Populate the (physmap) array with base/bound pairs describing the
@@ -2504,8 +2045,6 @@ do_next:
for (off = 0; off < round_page(msgbufsize); off += PAGE_SIZE)
pmap_kenter((vm_offset_t)msgbufp + off, phys_avail[pa_indx] +
off);
-
- PT_UPDATES_FLUSH();
}
#else /* PC98 */
static void
@@ -2516,7 +2055,6 @@ getmemsize(int first)
vm_paddr_t physmap[PHYSMAP_SIZE];
pt_entry_t *pte;
quad_t dcons_addr, dcons_size, physmem_tunable;
-#ifndef XEN
int hasbrokenint12, i, res;
u_int extmem;
struct vm86frame vmf;
@@ -2524,17 +2062,8 @@ getmemsize(int first)
vm_paddr_t pa;
struct bios_smap *smap, *smapbase;
caddr_t kmdp;
-#endif
has_smap = 0;
-#if defined(XEN)
- Maxmem = xen_start_info->nr_pages - init_first;
- physmem = Maxmem;
- basemem = 0;
- physmap[0] = init_first << PAGE_SHIFT;
- physmap[1] = ptoa(Maxmem) - round_page(msgbufsize);
- physmap_idx = 0;
-#else
#ifdef XBOX
if (arch_i386_is_xbox) {
/*
@@ -2677,7 +2206,6 @@ have_smap:
physmap[physmap_idx + 1] = physmap[physmap_idx] + extmem * 1024;
physmap_done:
-#endif
/*
* Now, physmap contains a map of physical memory.
*/
@@ -2751,7 +2279,6 @@ physmap_done:
getenv_quad("dcons.size", &dcons_size) == 0)
dcons_addr = 0;
-#ifndef XEN
/*
* physmap is in bytes, so when converting to page boundaries,
* round up the start address and round down the end address.
@@ -2872,13 +2399,6 @@ do_next:
}
*pte = 0;
invltlb();
-#else
- phys_avail[0] = physfree;
- phys_avail[1] = xen_start_info->nr_pages*PAGE_SIZE;
- dump_avail[0] = 0;
- dump_avail[1] = xen_start_info->nr_pages*PAGE_SIZE;
-
-#endif
/*
* XXX
@@ -2902,272 +2422,9 @@ do_next:
for (off = 0; off < round_page(msgbufsize); off += PAGE_SIZE)
pmap_kenter((vm_offset_t)msgbufp + off, phys_avail[pa_indx] +
off);
-
- PT_UPDATES_FLUSH();
}
#endif /* PC98 */
-#ifdef XEN
-#define MTOPSIZE (1<<(14 + PAGE_SHIFT))
-
-register_t
-init386(first)
- int first;
-{
- unsigned long gdtmachpfn;
- int error, gsel_tss, metadata_missing, x, pa;
- struct pcpu *pc;
-#ifdef CPU_ENABLE_SSE
- struct xstate_hdr *xhdr;
-#endif
- struct callback_register event = {
- .type = CALLBACKTYPE_event,
- .address = {GSEL(GCODE_SEL, SEL_KPL), (unsigned long)Xhypervisor_callback },
- };
- struct callback_register failsafe = {
- .type = CALLBACKTYPE_failsafe,
- .address = {GSEL(GCODE_SEL, SEL_KPL), (unsigned long)failsafe_callback },
- };
-
- thread0.td_kstack = proc0kstack;
- thread0.td_kstack_pages = KSTACK_PAGES;
-
- /*
- * This may be done better later if it gets more high level
- * components in it. If so just link td->td_proc here.
- */
- proc_linkup0(&proc0, &thread0);
-
- metadata_missing = 0;
- if (xen_start_info->mod_start) {
- preload_metadata = (caddr_t)xen_start_info->mod_start;
- preload_bootstrap_relocate(KERNBASE);
- } else {
- metadata_missing = 1;
- }
- if (envmode == 1)
- kern_envp = static_env;
- else if ((caddr_t)xen_start_info->cmd_line)
- kern_envp = xen_setbootenv((caddr_t)xen_start_info->cmd_line);
-
- boothowto |= xen_boothowto(kern_envp);
-
- /* Init basic tunables, hz etc */
- init_param1();
-
- /*
- * XEN occupies a portion of the upper virtual address space
- * At its base it manages an array mapping machine page frames
- * to physical page frames - hence we need to be able to
- * access 4GB - (64MB - 4MB + 64k)
- */
- gdt_segs[GPRIV_SEL].ssd_limit = atop(HYPERVISOR_VIRT_START + MTOPSIZE);
- gdt_segs[GUFS_SEL].ssd_limit = atop(HYPERVISOR_VIRT_START + MTOPSIZE);
- gdt_segs[GUGS_SEL].ssd_limit = atop(HYPERVISOR_VIRT_START + MTOPSIZE);
- gdt_segs[GCODE_SEL].ssd_limit = atop(HYPERVISOR_VIRT_START + MTOPSIZE);
- gdt_segs[GDATA_SEL].ssd_limit = atop(HYPERVISOR_VIRT_START + MTOPSIZE);
- gdt_segs[GUCODE_SEL].ssd_limit = atop(HYPERVISOR_VIRT_START + MTOPSIZE);
- gdt_segs[GUDATA_SEL].ssd_limit = atop(HYPERVISOR_VIRT_START + MTOPSIZE);
- gdt_segs[GBIOSLOWMEM_SEL].ssd_limit = atop(HYPERVISOR_VIRT_START + MTOPSIZE);
-
- pc = &__pcpu[0];
- gdt_segs[GPRIV_SEL].ssd_base = (int) pc;
- gdt_segs[GPROC0_SEL].ssd_base = (int) &pc->pc_common_tss;
-
- PT_SET_MA(gdt, xpmap_ptom(VTOP(gdt)) | PG_V | PG_RW);
- bzero(gdt, PAGE_SIZE);
- for (x = 0; x < NGDT; x++)
- ssdtosd(&gdt_segs[x], &gdt[x].sd);
-
- mtx_init(&dt_lock, "descriptor tables", NULL, MTX_SPIN);
-
- gdtmachpfn = vtomach(gdt) >> PAGE_SHIFT;
- PT_SET_MA(gdt, xpmap_ptom(VTOP(gdt)) | PG_V);
- PANIC_IF(HYPERVISOR_set_gdt(&gdtmachpfn, 512) != 0);
- lgdt(&r_gdt);
- gdtset = 1;
-
- if ((error = HYPERVISOR_set_trap_table(trap_table)) != 0) {
- panic("set_trap_table failed - error %d\n", error);
- }
-
- error = HYPERVISOR_callback_op(CALLBACKOP_register, &event);
- if (error == 0)
- error = HYPERVISOR_callback_op(CALLBACKOP_register, &failsafe);
-#if CONFIG_XEN_COMPAT <= 0x030002
- if (error == -ENOXENSYS)
- HYPERVISOR_set_callbacks(GSEL(GCODE_SEL, SEL_KPL),
- (unsigned long)Xhypervisor_callback,
- GSEL(GCODE_SEL, SEL_KPL), (unsigned long)failsafe_callback);
-#endif
- pcpu_init(pc, 0, sizeof(struct pcpu));
- for (pa = first; pa < first + DPCPU_SIZE; pa += PAGE_SIZE)
- pmap_kenter(pa + KERNBASE, pa);
- dpcpu_init((void *)(first + KERNBASE), 0);
- first += DPCPU_SIZE;
- physfree += DPCPU_SIZE;
- init_first += DPCPU_SIZE / PAGE_SIZE;
-
- PCPU_SET(prvspace, pc);
- PCPU_SET(curthread, &thread0);
-
- /*
- * Initialize mutexes.
- *
- * icu_lock: in order to allow an interrupt to occur in a critical
- * section, to set pcpu->ipending (etc...) properly, we
- * must be able to get the icu lock, so it can't be
- * under witness.
- */
- mutex_init();
- mtx_init(&icu_lock, "icu", NULL, MTX_SPIN | MTX_NOWITNESS | MTX_NOPROFILE);
-
- /* make ldt memory segments */
- PT_SET_MA(ldt, xpmap_ptom(VTOP(ldt)) | PG_V | PG_RW);
- bzero(ldt, PAGE_SIZE);
- ldt_segs[LUCODE_SEL].ssd_limit = atop(0 - 1);
- ldt_segs[LUDATA_SEL].ssd_limit = atop(0 - 1);
- for (x = 0; x < sizeof ldt_segs / sizeof ldt_segs[0]; x++)
- ssdtosd(&ldt_segs[x], &ldt[x].sd);
-
- default_proc_ldt.ldt_base = (caddr_t)ldt;
- default_proc_ldt.ldt_len = 6;
- _default_ldt = (int)&default_proc_ldt;
- PCPU_SET(currentldt, _default_ldt);
- PT_SET_MA(ldt, *vtopte((unsigned long)ldt) & ~PG_RW);
- xen_set_ldt((unsigned long) ldt, (sizeof ldt_segs / sizeof ldt_segs[0]));
-
-#if defined(XEN_PRIVILEGED)
- /*
- * Initialize the i8254 before the console so that console
- * initialization can use DELAY().
- */
- i8254_init();
-#endif
-
- /*
- * Initialize the console before we print anything out.
- */
- cninit();
-
- if (metadata_missing)
- printf("WARNING: loader(8) metadata is missing!\n");
-
-#ifdef DEV_ISA
-#ifdef DEV_ATPIC
- elcr_probe();
- atpic_startup();
-#else
- /* Reset and mask the atpics and leave them shut down. */
- atpic_reset();
-
- /*
- * Point the ICU spurious interrupt vectors at the APIC spurious
- * interrupt handler.
- */
- setidt(IDT_IO_INTS + 7, IDTVEC(spuriousint), SDT_SYS386IGT, SEL_KPL,
- GSEL(GCODE_SEL, SEL_KPL));
- setidt(IDT_IO_INTS + 15, IDTVEC(spuriousint), SDT_SYS386IGT, SEL_KPL,
- GSEL(GCODE_SEL, SEL_KPL));
-#endif
-#endif
-
-#ifdef DDB
- db_fetch_ksymtab(bootinfo.bi_symtab, bootinfo.bi_esymtab);
-#endif
-
- kdb_init();
-
-#ifdef KDB
- if (boothowto & RB_KDB)
- kdb_enter(KDB_WHY_BOOTFLAGS, "Boot flags requested debugger");
-#endif
-
- finishidentcpu(); /* Final stage of CPU initialization */
- setidt(IDT_UD, &IDTVEC(ill), SDT_SYS386TGT, SEL_KPL,
- GSEL(GCODE_SEL, SEL_KPL));
- setidt(IDT_GP, &IDTVEC(prot), SDT_SYS386TGT, SEL_KPL,
- GSEL(GCODE_SEL, SEL_KPL));
- initializecpu(); /* Initialize CPU registers */
- initializecpucache();
-
- /* pointer to selector slot for %fs/%gs */
- PCPU_SET(fsgs_gdt, &gdt[GUFS_SEL].sd);
-
- dblfault_tss.tss_esp = dblfault_tss.tss_esp0 = dblfault_tss.tss_esp1 =
- dblfault_tss.tss_esp2 = (int)&dblfault_stack[sizeof(dblfault_stack)];
- dblfault_tss.tss_ss = dblfault_tss.tss_ss0 = dblfault_tss.tss_ss1 =
- dblfault_tss.tss_ss2 = GSEL(GDATA_SEL, SEL_KPL);
-#ifdef PAE
- dblfault_tss.tss_cr3 = (int)IdlePDPT;
-#else
- dblfault_tss.tss_cr3 = (int)IdlePTD;
-#endif
- dblfault_tss.tss_eip = (int)dblfault_handler;
- dblfault_tss.tss_eflags = PSL_KERNEL;
- dblfault_tss.tss_ds = dblfault_tss.tss_es =
- dblfault_tss.tss_gs = GSEL(GDATA_SEL, SEL_KPL);
- dblfault_tss.tss_fs = GSEL(GPRIV_SEL, SEL_KPL);
- dblfault_tss.tss_cs = GSEL(GCODE_SEL, SEL_KPL);
- dblfault_tss.tss_ldt = GSEL(GLDT_SEL, SEL_KPL);
-
- vm86_initialize();
- getmemsize(first);
- init_param2(physmem);
-
- /* now running on new page tables, configured,and u/iom is accessible */
-
- msgbufinit(msgbufp, msgbufsize);
-#ifdef DEV_NPX
- npxinit(true);
-#endif
- /*
- * Set up thread0 pcb after npxinit calculated pcb + fpu save
- * area size. Zero out the extended state header in fpu save
- * area.
- */
- thread0.td_pcb = get_pcb_td(&thread0);
- bzero(get_pcb_user_save_td(&thread0), cpu_max_ext_state_size);
-#ifdef CPU_ENABLE_SSE
- if (use_xsave) {
- xhdr = (struct xstate_hdr *)(get_pcb_user_save_td(&thread0) +
- 1);
- xhdr->xstate_bv = xsave_mask;
- }
-#endif
- PCPU_SET(curpcb, thread0.td_pcb);
- /* make an initial tss so cpu can get interrupt stack on syscall! */
- /* Note: -16 is so we can grow the trapframe if we came from vm86 */
- PCPU_SET(common_tss.tss_esp0, (vm_offset_t)thread0.td_pcb - 16);
- PCPU_SET(common_tss.tss_ss0, GSEL(GDATA_SEL, SEL_KPL));
- gsel_tss = GSEL(GPROC0_SEL, SEL_KPL);
- HYPERVISOR_stack_switch(GSEL(GDATA_SEL, SEL_KPL),
- PCPU_GET(common_tss.tss_esp0));
-
- /* transfer to user mode */
-
- _ucodesel = GSEL(GUCODE_SEL, SEL_UPL);
- _udatasel = GSEL(GUDATA_SEL, SEL_UPL);
-
- /* setup proc 0's pcb */
- thread0.td_pcb->pcb_flags = 0;
-#ifdef PAE
- thread0.td_pcb->pcb_cr3 = (int)IdlePDPT;
-#else
- thread0.td_pcb->pcb_cr3 = (int)IdlePTD;
-#endif
- thread0.td_pcb->pcb_ext = 0;
- thread0.td_frame = &proc0_tf;
- thread0.td_pcb->pcb_fsd = PCPU_GET(fsgs_gdt)[0];
- thread0.td_pcb->pcb_gsd = PCPU_GET(fsgs_gdt)[1];
-
- cpu_probe_amdc1e();
-
- /* Location of kernel stack for locore */
- return ((register_t)thread0.td_pcb);
-}
-
-#else
register_t
init386(first)
int first;
@@ -3402,7 +2659,7 @@ init386(first)
dblfault_tss.tss_esp2 = (int)&dblfault_stack[sizeof(dblfault_stack)];
dblfault_tss.tss_ss = dblfault_tss.tss_ss0 = dblfault_tss.tss_ss1 =
dblfault_tss.tss_ss2 = GSEL(GDATA_SEL, SEL_KPL);
-#ifdef PAE
+#if defined(PAE) || defined(PAE_TABLES)
dblfault_tss.tss_cr3 = (int)IdlePDPT;
#else
dblfault_tss.tss_cr3 = (int)IdlePTD;
@@ -3474,7 +2731,7 @@ init386(first)
/* setup proc 0's pcb */
thread0.td_pcb->pcb_flags = 0;
-#ifdef PAE
+#if defined(PAE) || defined(PAE_TABLES)
thread0.td_pcb->pcb_cr3 = (int)IdlePDPT;
#else
thread0.td_pcb->pcb_cr3 = (int)IdlePTD;
@@ -3491,7 +2748,6 @@ init386(first)
/* Location of kernel stack for locore */
return ((register_t)thread0.td_pcb);
}
-#endif
void
cpu_pcpu_init(struct pcpu *pcpu, int cpuid, size_t size)
diff --git a/sys/i386/i386/minidump_machdep.c b/sys/i386/i386/minidump_machdep.c
index dd3490b..8f78abc 100644
--- a/sys/i386/i386/minidump_machdep.c
+++ b/sys/i386/i386/minidump_machdep.c
@@ -68,10 +68,6 @@ static void *dump_va;
static uint64_t counter, progress;
CTASSERT(sizeof(*vm_page_dump) == 4);
-#ifndef XEN
-#define xpmap_mtop(x) (x)
-#define xpmap_ptom(x) (x)
-#endif
static int
@@ -205,7 +201,7 @@ minidumpsys(struct dumperinfo *di)
j = va >> PDRSHIFT;
if ((pd[j] & (PG_PS | PG_V)) == (PG_PS | PG_V)) {
/* This is an entire 2M page. */
- pa = xpmap_mtop(pd[j] & PG_PS_FRAME);
+ pa = pd[j] & PG_PS_FRAME;
for (k = 0; k < NPTEPG; k++) {
if (is_dumpable(pa))
dump_add_page(pa);
@@ -215,10 +211,10 @@ minidumpsys(struct dumperinfo *di)
}
if ((pd[j] & PG_V) == PG_V) {
/* set bit for each valid page in this 2MB block */
- pt = pmap_kenter_temporary(xpmap_mtop(pd[j] & PG_FRAME), 0);
+ pt = pmap_kenter_temporary(pd[j] & PG_FRAME, 0);
for (k = 0; k < NPTEPG; k++) {
if ((pt[k] & PG_V) == PG_V) {
- pa = xpmap_mtop(pt[k] & PG_FRAME);
+ pa = pt[k] & PG_FRAME;
if (is_dumpable(pa))
dump_add_page(pa);
}
@@ -265,7 +261,7 @@ minidumpsys(struct dumperinfo *di)
mdhdr.bitmapsize = vm_page_dump_size;
mdhdr.ptesize = ptesize;
mdhdr.kernbase = KERNBASE;
-#ifdef PAE
+#if defined(PAE) || defined(PAE_TABLES)
mdhdr.paemode = 1;
#endif
@@ -318,24 +314,8 @@ minidumpsys(struct dumperinfo *di)
continue;
}
if ((pd[j] & PG_V) == PG_V) {
- pa = xpmap_mtop(pd[j] & PG_FRAME);
-#ifndef XEN
+ pa = pd[j] & PG_FRAME;
error = blk_write(di, 0, pa, PAGE_SIZE);
-#else
- pt = pmap_kenter_temporary(pa, 0);
- memcpy(fakept, pt, PAGE_SIZE);
- for (i = 0; i < NPTEPG; i++)
- fakept[i] = xpmap_mtop(fakept[i]);
- error = blk_write(di, (char *)&fakept, 0, PAGE_SIZE);
- if (error)
- goto fail;
- /* flush, in case we reuse fakept in the same block */
- error = blk_flush(di);
- if (error)
- goto fail;
- bzero(fakept, sizeof(fakept));
-#endif
-
if (error)
goto fail;
} else {
diff --git a/sys/i386/i386/mp_machdep.c b/sys/i386/i386/mp_machdep.c
index 083b283..bad69ee 100644
--- a/sys/i386/i386/mp_machdep.c
+++ b/sys/i386/i386/mp_machdep.c
@@ -130,332 +130,23 @@ __FBSDID("$FreeBSD$");
#endif /* CHECK_POINTS */
-/* lock region used by kernel profiling */
-int mcount_lock;
-
-int mp_naps; /* # of Applications processors */
-int boot_cpu_id = -1; /* designated BSP */
-
extern struct pcpu __pcpu[];
-/* AP uses this during bootstrap. Do not staticize. */
-char *bootSTK;
-static int bootAP;
-
-/* Free these after use */
-void *bootstacks[MAXCPU];
-static void *dpcpu;
-
-struct pcb stoppcbs[MAXCPU];
-struct susppcb **susppcbs;
-
/* Variables needed for SMP tlb shootdown. */
vm_offset_t smp_tlb_addr1;
vm_offset_t smp_tlb_addr2;
volatile int smp_tlb_wait;
-#ifdef COUNT_IPIS
-/* Interrupt counts. */
-static u_long *ipi_preempt_counts[MAXCPU];
-static u_long *ipi_ast_counts[MAXCPU];
-u_long *ipi_invltlb_counts[MAXCPU];
-u_long *ipi_invlrng_counts[MAXCPU];
-u_long *ipi_invlpg_counts[MAXCPU];
-u_long *ipi_invlcache_counts[MAXCPU];
-u_long *ipi_rendezvous_counts[MAXCPU];
-u_long *ipi_lazypmap_counts[MAXCPU];
-static u_long *ipi_hardclock_counts[MAXCPU];
-#endif
-
-/* Default cpu_ops implementation. */
-struct cpu_ops cpu_ops;
-
/*
* Local data and functions.
*/
-static volatile cpuset_t ipi_nmi_pending;
-
-/* used to hold the AP's until we are ready to release them */
-static struct mtx ap_boot_mtx;
-
-/* Set to 1 once we're ready to let the APs out of the pen. */
-static volatile int aps_ready = 0;
-
-/*
- * Store data from cpu_add() until later in the boot when we actually setup
- * the APs.
- */
-struct cpu_info {
- int cpu_present:1;
- int cpu_bsp:1;
- int cpu_disabled:1;
- int cpu_hyperthread:1;
-} static cpu_info[MAX_APIC_ID + 1];
-int cpu_apic_ids[MAXCPU];
-int apic_cpuids[MAX_APIC_ID + 1];
-
-/* Holds pending bitmap based IPIs per CPU */
-volatile u_int cpu_ipi_pending[MAXCPU];
-
-static u_int boot_address;
-static int cpu_logical; /* logical cpus per core */
-static int cpu_cores; /* cores per package */
-
-static void assign_cpu_ids(void);
static void install_ap_tramp(void);
-static void set_interrupt_apic_ids(void);
static int start_all_aps(void);
static int start_ap(int apic_id);
static void release_aps(void *dummy);
-static u_int hyperthreading_cpus; /* logical cpus sharing L1 cache */
-static int hyperthreading_allowed = 1;
-
-static void
-mem_range_AP_init(void)
-{
- if (mem_range_softc.mr_op && mem_range_softc.mr_op->initAP)
- mem_range_softc.mr_op->initAP(&mem_range_softc);
-}
-
-static void
-topo_probe_amd(void)
-{
- int core_id_bits;
- int id;
-
- /* AMD processors do not support HTT. */
- cpu_logical = 1;
-
- if ((amd_feature2 & AMDID2_CMP) == 0) {
- cpu_cores = 1;
- return;
- }
-
- core_id_bits = (cpu_procinfo2 & AMDID_COREID_SIZE) >>
- AMDID_COREID_SIZE_SHIFT;
- if (core_id_bits == 0) {
- cpu_cores = (cpu_procinfo2 & AMDID_CMP_CORES) + 1;
- return;
- }
-
- /* Fam 10h and newer should get here. */
- for (id = 0; id <= MAX_APIC_ID; id++) {
- /* Check logical CPU availability. */
- if (!cpu_info[id].cpu_present || cpu_info[id].cpu_disabled)
- continue;
- /* Check if logical CPU has the same package ID. */
- if ((id >> core_id_bits) != (boot_cpu_id >> core_id_bits))
- continue;
- cpu_cores++;
- }
-}
-
-/*
- * Round up to the next power of two, if necessary, and then
- * take log2.
- * Returns -1 if argument is zero.
- */
-static __inline int
-mask_width(u_int x)
-{
-
- return (fls(x << (1 - powerof2(x))) - 1);
-}
-
-static void
-topo_probe_0x4(void)
-{
- u_int p[4];
- int pkg_id_bits;
- int core_id_bits;
- int max_cores;
- int max_logical;
- int id;
-
- /* Both zero and one here mean one logical processor per package. */
- max_logical = (cpu_feature & CPUID_HTT) != 0 ?
- (cpu_procinfo & CPUID_HTT_CORES) >> 16 : 1;
- if (max_logical <= 1)
- return;
-
- /*
- * Because of uniformity assumption we examine only
- * those logical processors that belong to the same
- * package as BSP. Further, we count number of
- * logical processors that belong to the same core
- * as BSP thus deducing number of threads per core.
- */
- if (cpu_high >= 0x4) {
- cpuid_count(0x04, 0, p);
- max_cores = ((p[0] >> 26) & 0x3f) + 1;
- } else
- max_cores = 1;
- core_id_bits = mask_width(max_logical/max_cores);
- if (core_id_bits < 0)
- return;
- pkg_id_bits = core_id_bits + mask_width(max_cores);
-
- for (id = 0; id <= MAX_APIC_ID; id++) {
- /* Check logical CPU availability. */
- if (!cpu_info[id].cpu_present || cpu_info[id].cpu_disabled)
- continue;
- /* Check if logical CPU has the same package ID. */
- if ((id >> pkg_id_bits) != (boot_cpu_id >> pkg_id_bits))
- continue;
- cpu_cores++;
- /* Check if logical CPU has the same package and core IDs. */
- if ((id >> core_id_bits) == (boot_cpu_id >> core_id_bits))
- cpu_logical++;
- }
-
- KASSERT(cpu_cores >= 1 && cpu_logical >= 1,
- ("topo_probe_0x4 couldn't find BSP"));
-
- cpu_cores /= cpu_logical;
- hyperthreading_cpus = cpu_logical;
-}
-
-static void
-topo_probe_0xb(void)
-{
- u_int p[4];
- int bits;
- int cnt;
- int i;
- int logical;
- int type;
- int x;
-
- /* We only support three levels for now. */
- for (i = 0; i < 3; i++) {
- cpuid_count(0x0b, i, p);
-
- /* Fall back if CPU leaf 11 doesn't really exist. */
- if (i == 0 && p[1] == 0) {
- topo_probe_0x4();
- return;
- }
-
- bits = p[0] & 0x1f;
- logical = p[1] &= 0xffff;
- type = (p[2] >> 8) & 0xff;
- if (type == 0 || logical == 0)
- break;
- /*
- * Because of uniformity assumption we examine only
- * those logical processors that belong to the same
- * package as BSP.
- */
- for (cnt = 0, x = 0; x <= MAX_APIC_ID; x++) {
- if (!cpu_info[x].cpu_present ||
- cpu_info[x].cpu_disabled)
- continue;
- if (x >> bits == boot_cpu_id >> bits)
- cnt++;
- }
- if (type == CPUID_TYPE_SMT)
- cpu_logical = cnt;
- else if (type == CPUID_TYPE_CORE)
- cpu_cores = cnt;
- }
- if (cpu_logical == 0)
- cpu_logical = 1;
- cpu_cores /= cpu_logical;
-}
-
-/*
- * Both topology discovery code and code that consumes topology
- * information assume top-down uniformity of the topology.
- * That is, all physical packages must be identical and each
- * core in a package must have the same number of threads.
- * Topology information is queried only on BSP, on which this
- * code runs and for which it can query CPUID information.
- * Then topology is extrapolated on all packages using the
- * uniformity assumption.
- */
-static void
-topo_probe(void)
-{
- static int cpu_topo_probed = 0;
-
- if (cpu_topo_probed)
- return;
-
- CPU_ZERO(&logical_cpus_mask);
- if (mp_ncpus <= 1)
- cpu_cores = cpu_logical = 1;
- else if (cpu_vendor_id == CPU_VENDOR_AMD)
- topo_probe_amd();
- else if (cpu_vendor_id == CPU_VENDOR_INTEL) {
- /*
- * See Intel(R) 64 Architecture Processor
- * Topology Enumeration article for details.
- *
- * Note that 0x1 <= cpu_high < 4 case should be
- * compatible with topo_probe_0x4() logic when
- * CPUID.1:EBX[23:16] > 0 (cpu_cores will be 1)
- * or it should trigger the fallback otherwise.
- */
- if (cpu_high >= 0xb)
- topo_probe_0xb();
- else if (cpu_high >= 0x1)
- topo_probe_0x4();
- }
-
- /*
- * Fallback: assume each logical CPU is in separate
- * physical package. That is, no multi-core, no SMT.
- */
- if (cpu_cores == 0 || cpu_logical == 0)
- cpu_cores = cpu_logical = 1;
- cpu_topo_probed = 1;
-}
-
-struct cpu_group *
-cpu_topo(void)
-{
- int cg_flags;
-
- /*
- * Determine whether any threading flags are
- * necessry.
- */
- topo_probe();
- if (cpu_logical > 1 && hyperthreading_cpus)
- cg_flags = CG_FLAG_HTT;
- else if (cpu_logical > 1)
- cg_flags = CG_FLAG_SMT;
- else
- cg_flags = 0;
- if (mp_ncpus % (cpu_cores * cpu_logical) != 0) {
- printf("WARNING: Non-uniform processors.\n");
- printf("WARNING: Using suboptimal topology.\n");
- return (smp_topo_none());
- }
- /*
- * No multi-core or hyper-threaded.
- */
- if (cpu_logical * cpu_cores == 1)
- return (smp_topo_none());
- /*
- * Only HTT no multi-core.
- */
- if (cpu_logical > 1 && cpu_cores == 1)
- return (smp_topo_1level(CG_SHARE_L1, cpu_logical, cg_flags));
- /*
- * Only multi-core no HTT.
- */
- if (cpu_cores > 1 && cpu_logical == 1)
- return (smp_topo_1level(CG_SHARE_L2, cpu_cores, cg_flags));
- /*
- * Both HTT and multi-core.
- */
- return (smp_topo_2level(CG_SHARE_L2, cpu_cores,
- CG_SHARE_L1, cpu_logical, cg_flags));
-}
-
+static u_int boot_address;
/*
* Calculate usable address in base memory for AP trampoline code.
@@ -471,85 +162,6 @@ mp_bootaddress(u_int basemem)
return boot_address;
}
-void
-cpu_add(u_int apic_id, char boot_cpu)
-{
-
- if (apic_id > MAX_APIC_ID) {
- panic("SMP: APIC ID %d too high", apic_id);
- return;
- }
- KASSERT(cpu_info[apic_id].cpu_present == 0, ("CPU %d added twice",
- apic_id));
- cpu_info[apic_id].cpu_present = 1;
- if (boot_cpu) {
- KASSERT(boot_cpu_id == -1,
- ("CPU %d claims to be BSP, but CPU %d already is", apic_id,
- boot_cpu_id));
- boot_cpu_id = apic_id;
- cpu_info[apic_id].cpu_bsp = 1;
- }
- if (mp_ncpus < MAXCPU) {
- mp_ncpus++;
- mp_maxid = mp_ncpus - 1;
- }
- if (bootverbose)
- printf("SMP: Added CPU %d (%s)\n", apic_id, boot_cpu ? "BSP" :
- "AP");
-}
-
-void
-cpu_mp_setmaxid(void)
-{
-
- /*
- * mp_maxid should be already set by calls to cpu_add().
- * Just sanity check its value here.
- */
- if (mp_ncpus == 0)
- KASSERT(mp_maxid == 0,
- ("%s: mp_ncpus is zero, but mp_maxid is not", __func__));
- else if (mp_ncpus == 1)
- mp_maxid = 0;
- else
- KASSERT(mp_maxid >= mp_ncpus - 1,
- ("%s: counters out of sync: max %d, count %d", __func__,
- mp_maxid, mp_ncpus));
-}
-
-int
-cpu_mp_probe(void)
-{
-
- /*
- * Always record BSP in CPU map so that the mbuf init code works
- * correctly.
- */
- CPU_SETOF(0, &all_cpus);
- if (mp_ncpus == 0) {
- /*
- * No CPUs were found, so this must be a UP system. Setup
- * the variables to represent a system with a single CPU
- * with an id of 0.
- */
- mp_ncpus = 1;
- return (0);
- }
-
- /* At least one CPU was found. */
- if (mp_ncpus == 1) {
- /*
- * One CPU was found, so this must be a UP system with
- * an I/O APIC.
- */
- mp_maxid = 0;
- return (0);
- }
-
- /* At least two CPUs were found. */
- return (1);
-}
-
/*
* Initialize the IPI handlers and start up the AP's.
*/
@@ -576,10 +188,6 @@ cpu_mp_start(void)
setidt(IPI_INVLCACHE, IDTVEC(invlcache),
SDT_SYS386IGT, SEL_KPL, GSEL(GCODE_SEL, SEL_KPL));
- /* Install an inter-CPU IPI for lazy pmap release */
- setidt(IPI_LAZYPMAP, IDTVEC(lazypmap),
- SDT_SYS386IGT, SEL_KPL, GSEL(GCODE_SEL, SEL_KPL));
-
/* Install an inter-CPU IPI for all-CPU rendezvous */
setidt(IPI_RENDEZVOUS, IDTVEC(rendezvous),
SDT_SYS386IGT, SEL_KPL, GSEL(GCODE_SEL, SEL_KPL));
@@ -615,48 +223,6 @@ cpu_mp_start(void)
set_interrupt_apic_ids();
}
-
-/*
- * Print various information about the SMP system hardware and setup.
- */
-void
-cpu_mp_announce(void)
-{
- const char *hyperthread;
- int i;
-
- printf("FreeBSD/SMP: %d package(s) x %d core(s)",
- mp_ncpus / (cpu_cores * cpu_logical), cpu_cores);
- if (hyperthreading_cpus > 1)
- printf(" x %d HTT threads", cpu_logical);
- else if (cpu_logical > 1)
- printf(" x %d SMT threads", cpu_logical);
- printf("\n");
-
- /* List active CPUs first. */
- printf(" cpu0 (BSP): APIC ID: %2d\n", boot_cpu_id);
- for (i = 1; i < mp_ncpus; i++) {
- if (cpu_info[cpu_apic_ids[i]].cpu_hyperthread)
- hyperthread = "/HT";
- else
- hyperthread = "";
- printf(" cpu%d (AP%s): APIC ID: %2d\n", i, hyperthread,
- cpu_apic_ids[i]);
- }
-
- /* List disabled CPUs last. */
- for (i = 0; i <= MAX_APIC_ID; i++) {
- if (!cpu_info[i].cpu_present || !cpu_info[i].cpu_disabled)
- continue;
- if (cpu_info[i].cpu_hyperthread)
- hyperthread = "/HT";
- else
- hyperthread = "";
- printf(" cpu (AP%s): APIC ID: %2d (disabled)\n", hyperthread,
- i);
- }
-}
-
/*
* AP CPU's call this to initialize themselves.
*/
@@ -667,7 +233,7 @@ init_secondary(void)
vm_offset_t addr;
int gsel_tss;
int x, myid;
- u_int cpuid, cr0;
+ u_int cr0;
/* bootAP is set in start_ap() to our ID. */
myid = bootAP;
@@ -736,84 +302,7 @@ init_secondary(void)
lidt(&r_idt);
#endif
- /*
- * On real hardware, switch to x2apic mode if possible. Do it
- * after aps_ready was signalled, to avoid manipulating the
- * mode while BSP might still want to send some IPI to us
- * (second startup IPI is ignored on modern hardware etc).
- */
- lapic_xapic_mode();
-
- /* Initialize the PAT MSR if present. */
- pmap_init_pat();
-
- /* set up CPU registers and state */
- cpu_setregs();
-
- /* set up SSE/NX */
- initializecpu();
-
- /* set up FPU state on the AP */
- npxinit(false);
-
- if (cpu_ops.cpu_init)
- cpu_ops.cpu_init();
-
- /* A quick check from sanity claus */
- cpuid = PCPU_GET(cpuid);
- if (PCPU_GET(apic_id) != lapic_id()) {
- printf("SMP: cpuid = %d\n", cpuid);
- printf("SMP: actual apic_id = %d\n", lapic_id());
- printf("SMP: correct apic_id = %d\n", PCPU_GET(apic_id));
- panic("cpuid mismatch! boom!!");
- }
-
- /* Initialize curthread. */
- KASSERT(PCPU_GET(idlethread) != NULL, ("no idle thread"));
- PCPU_SET(curthread, PCPU_GET(idlethread));
-
- mca_init();
-
- mtx_lock_spin(&ap_boot_mtx);
-
- /* Init local apic for irq's */
- lapic_setup(1);
-
- /* Set memory range attributes for this CPU to match the BSP */
- mem_range_AP_init();
-
- smp_cpus++;
-
- CTR1(KTR_SMP, "SMP: AP CPU #%d Launched", cpuid);
- printf("SMP: AP CPU #%d Launched!\n", cpuid);
-
- /* Determine if we are a logical CPU. */
- /* XXX Calculation depends on cpu_logical being a power of 2, e.g. 2 */
- if (cpu_logical > 1 && PCPU_GET(apic_id) % cpu_logical != 0)
- CPU_SET(cpuid, &logical_cpus_mask);
-
- if (bootverbose)
- lapic_dump("AP");
-
- if (smp_cpus == mp_ncpus) {
- /* enable IPI's, tlb shootdown, freezes etc */
- atomic_store_rel_int(&smp_started, 1);
- }
-
- mtx_unlock_spin(&ap_boot_mtx);
-
- /* Wait until all the AP's are up. */
- while (smp_started == 0)
- ia32_pause();
-
- /* Start per-CPU event timers. */
- cpu_initclocks_ap();
-
- /* Enter the scheduler. */
- sched_throw(NULL);
-
- panic("scheduler returned us to %s", __func__);
- /* NOTREACHED */
+ init_secondary_tail();
}
/*******************************************************************
@@ -821,108 +310,6 @@ init_secondary(void)
*/
/*
- * We tell the I/O APIC code about all the CPUs we want to receive
- * interrupts. If we don't want certain CPUs to receive IRQs we
- * can simply not tell the I/O APIC code about them in this function.
- * We also do not tell it about the BSP since it tells itself about
- * the BSP internally to work with UP kernels and on UP machines.
- */
-static void
-set_interrupt_apic_ids(void)
-{
- u_int i, apic_id;
-
- for (i = 0; i < MAXCPU; i++) {
- apic_id = cpu_apic_ids[i];
- if (apic_id == -1)
- continue;
- if (cpu_info[apic_id].cpu_bsp)
- continue;
- if (cpu_info[apic_id].cpu_disabled)
- continue;
-
- /* Don't let hyperthreads service interrupts. */
- if (cpu_logical > 1 &&
- apic_id % cpu_logical != 0)
- continue;
-
- intr_add_cpu(i);
- }
-}
-
-/*
- * Assign logical CPU IDs to local APICs.
- */
-static void
-assign_cpu_ids(void)
-{
- u_int i;
-
- TUNABLE_INT_FETCH("machdep.hyperthreading_allowed",
- &hyperthreading_allowed);
-
- /* Check for explicitly disabled CPUs. */
- for (i = 0; i <= MAX_APIC_ID; i++) {
- if (!cpu_info[i].cpu_present || cpu_info[i].cpu_bsp)
- continue;
-
- if (hyperthreading_cpus > 1 && i % hyperthreading_cpus != 0) {
- cpu_info[i].cpu_hyperthread = 1;
-
- /*
- * Don't use HT CPU if it has been disabled by a
- * tunable.
- */
- if (hyperthreading_allowed == 0) {
- cpu_info[i].cpu_disabled = 1;
- continue;
- }
- }
-
- /* Don't use this CPU if it has been disabled by a tunable. */
- if (resource_disabled("lapic", i)) {
- cpu_info[i].cpu_disabled = 1;
- continue;
- }
- }
-
- if (hyperthreading_allowed == 0 && hyperthreading_cpus > 1) {
- hyperthreading_cpus = 0;
- cpu_logical = 1;
- }
-
- /*
- * Assign CPU IDs to local APIC IDs and disable any CPUs
- * beyond MAXCPU. CPU 0 is always assigned to the BSP.
- *
- * To minimize confusion for userland, we attempt to number
- * CPUs such that all threads and cores in a package are
- * grouped together. For now we assume that the BSP is always
- * the first thread in a package and just start adding APs
- * starting with the BSP's APIC ID.
- */
- mp_ncpus = 1;
- cpu_apic_ids[0] = boot_cpu_id;
- apic_cpuids[boot_cpu_id] = 0;
- for (i = boot_cpu_id + 1; i != boot_cpu_id;
- i == MAX_APIC_ID ? i = 0 : i++) {
- if (!cpu_info[i].cpu_present || cpu_info[i].cpu_bsp ||
- cpu_info[i].cpu_disabled)
- continue;
-
- if (mp_ncpus < MAXCPU) {
- cpu_apic_ids[mp_ncpus] = i;
- apic_cpuids[i] = mp_ncpus;
- mp_ncpus++;
- } else
- cpu_info[i].cpu_disabled = 1;
- }
- KASSERT(mp_maxid >= mp_ncpus - 1,
- ("%s: counters out of sync: max %d, count %d", __func__, mp_maxid,
- mp_ncpus));
-}
-
-/*
* start each AP in our list
*/
/* Lowest 1MB is already mapped: don't touch*/
@@ -1099,129 +486,6 @@ start_ap(int apic_id)
return 0; /* return FAILURE */
}
-#ifdef COUNT_XINVLTLB_HITS
-u_int xhits_gbl[MAXCPU];
-u_int xhits_pg[MAXCPU];
-u_int xhits_rng[MAXCPU];
-static SYSCTL_NODE(_debug, OID_AUTO, xhits, CTLFLAG_RW, 0, "");
-SYSCTL_OPAQUE(_debug_xhits, OID_AUTO, global, CTLFLAG_RW, &xhits_gbl,
- sizeof(xhits_gbl), "IU", "");
-SYSCTL_OPAQUE(_debug_xhits, OID_AUTO, page, CTLFLAG_RW, &xhits_pg,
- sizeof(xhits_pg), "IU", "");
-SYSCTL_OPAQUE(_debug_xhits, OID_AUTO, range, CTLFLAG_RW, &xhits_rng,
- sizeof(xhits_rng), "IU", "");
-
-u_int ipi_global;
-u_int ipi_page;
-u_int ipi_range;
-u_int ipi_range_size;
-SYSCTL_INT(_debug_xhits, OID_AUTO, ipi_global, CTLFLAG_RW, &ipi_global, 0, "");
-SYSCTL_INT(_debug_xhits, OID_AUTO, ipi_page, CTLFLAG_RW, &ipi_page, 0, "");
-SYSCTL_INT(_debug_xhits, OID_AUTO, ipi_range, CTLFLAG_RW, &ipi_range, 0, "");
-SYSCTL_INT(_debug_xhits, OID_AUTO, ipi_range_size, CTLFLAG_RW, &ipi_range_size,
- 0, "");
-
-u_int ipi_masked_global;
-u_int ipi_masked_page;
-u_int ipi_masked_range;
-u_int ipi_masked_range_size;
-SYSCTL_INT(_debug_xhits, OID_AUTO, ipi_masked_global, CTLFLAG_RW,
- &ipi_masked_global, 0, "");
-SYSCTL_INT(_debug_xhits, OID_AUTO, ipi_masked_page, CTLFLAG_RW,
- &ipi_masked_page, 0, "");
-SYSCTL_INT(_debug_xhits, OID_AUTO, ipi_masked_range, CTLFLAG_RW,
- &ipi_masked_range, 0, "");
-SYSCTL_INT(_debug_xhits, OID_AUTO, ipi_masked_range_size, CTLFLAG_RW,
- &ipi_masked_range_size, 0, "");
-#endif /* COUNT_XINVLTLB_HITS */
-
-/*
- * Init and startup IPI.
- */
-void
-ipi_startup(int apic_id, int vector)
-{
-
- /*
- * This attempts to follow the algorithm described in the
- * Intel Multiprocessor Specification v1.4 in section B.4.
- * For each IPI, we allow the local APIC ~20us to deliver the
- * IPI. If that times out, we panic.
- */
-
- /*
- * first we do an INIT IPI: this INIT IPI might be run, resetting
- * and running the target CPU. OR this INIT IPI might be latched (P5
- * bug), CPU waiting for STARTUP IPI. OR this INIT IPI might be
- * ignored.
- */
- lapic_ipi_raw(APIC_DEST_DESTFLD | APIC_TRIGMOD_LEVEL |
- APIC_LEVEL_ASSERT | APIC_DESTMODE_PHY | APIC_DELMODE_INIT, apic_id);
- lapic_ipi_wait(100);
-
- /* Explicitly deassert the INIT IPI. */
- lapic_ipi_raw(APIC_DEST_DESTFLD | APIC_TRIGMOD_LEVEL |
- APIC_LEVEL_DEASSERT | APIC_DESTMODE_PHY | APIC_DELMODE_INIT,
- apic_id);
-
- DELAY(10000); /* wait ~10mS */
-
- /*
- * next we do a STARTUP IPI: the previous INIT IPI might still be
- * latched, (P5 bug) this 1st STARTUP would then terminate
- * immediately, and the previously started INIT IPI would continue. OR
- * the previous INIT IPI has already run. and this STARTUP IPI will
- * run. OR the previous INIT IPI was ignored. and this STARTUP IPI
- * will run.
- */
- lapic_ipi_raw(APIC_DEST_DESTFLD | APIC_TRIGMOD_EDGE |
- APIC_LEVEL_ASSERT | APIC_DESTMODE_PHY | APIC_DELMODE_STARTUP |
- vector, apic_id);
- if (!lapic_ipi_wait(100))
- panic("Failed to deliver first STARTUP IPI to APIC %d",
- apic_id);
- DELAY(200); /* wait ~200uS */
-
- /*
- * finally we do a 2nd STARTUP IPI: this 2nd STARTUP IPI should run IF
- * the previous STARTUP IPI was cancelled by a latched INIT IPI. OR
- * this STARTUP IPI will be ignored, as only ONE STARTUP IPI is
- * recognized after hardware RESET or INIT IPI.
- */
- lapic_ipi_raw(APIC_DEST_DESTFLD | APIC_TRIGMOD_EDGE |
- APIC_LEVEL_ASSERT | APIC_DESTMODE_PHY | APIC_DELMODE_STARTUP |
- vector, apic_id);
- if (!lapic_ipi_wait(100))
- panic("Failed to deliver second STARTUP IPI to APIC %d",
- apic_id);
-
- DELAY(200); /* wait ~200uS */
-}
-
-/*
- * Send an IPI to specified CPU handling the bitmap logic.
- */
-static void
-ipi_send_cpu(int cpu, u_int ipi)
-{
- u_int bitmap, old_pending, new_pending;
-
- KASSERT(cpu_apic_ids[cpu] != -1, ("IPI to non-existent CPU %d", cpu));
-
- if (IPI_IS_BITMAPED(ipi)) {
- bitmap = 1 << ipi;
- ipi = IPI_BITMAP_VECTOR;
- do {
- old_pending = cpu_ipi_pending[cpu];
- new_pending = old_pending | bitmap;
- } while (!atomic_cmpset_int(&cpu_ipi_pending[cpu],
- old_pending, new_pending));
- if (old_pending)
- return;
- }
- lapic_ipi_vectored(ipi, cpu_apic_ids[cpu]);
-}
-
/*
* Flush the TLB on all other CPU's
*/
@@ -1285,14 +549,6 @@ smp_targeted_tlb_shootdown(cpuset_t mask, u_int vector, vm_offset_t addr1, vm_of
}
void
-smp_cache_flush(void)
-{
-
- if (smp_started)
- smp_tlb_shootdown(IPI_INVLCACHE, 0, 0);
-}
-
-void
smp_invltlb(void)
{
@@ -1367,203 +623,11 @@ smp_masked_invlpg_range(cpuset_t mask, vm_offset_t addr1, vm_offset_t addr2)
}
void
-ipi_bitmap_handler(struct trapframe frame)
-{
- struct trapframe *oldframe;
- struct thread *td;
- int cpu = PCPU_GET(cpuid);
- u_int ipi_bitmap;
-
- critical_enter();
- td = curthread;
- td->td_intr_nesting_level++;
- oldframe = td->td_intr_frame;
- td->td_intr_frame = &frame;
- ipi_bitmap = atomic_readandclear_int(&cpu_ipi_pending[cpu]);
- if (ipi_bitmap & (1 << IPI_PREEMPT)) {
-#ifdef COUNT_IPIS
- (*ipi_preempt_counts[cpu])++;
-#endif
- sched_preempt(td);
- }
- if (ipi_bitmap & (1 << IPI_AST)) {
-#ifdef COUNT_IPIS
- (*ipi_ast_counts[cpu])++;
-#endif
- /* Nothing to do for AST */
- }
- if (ipi_bitmap & (1 << IPI_HARDCLOCK)) {
-#ifdef COUNT_IPIS
- (*ipi_hardclock_counts[cpu])++;
-#endif
- hardclockintr();
- }
- td->td_intr_frame = oldframe;
- td->td_intr_nesting_level--;
- critical_exit();
-}
-
-/*
- * send an IPI to a set of cpus.
- */
-void
-ipi_selected(cpuset_t cpus, u_int ipi)
-{
- int cpu;
-
- /*
- * IPI_STOP_HARD maps to a NMI and the trap handler needs a bit
- * of help in order to understand what is the source.
- * Set the mask of receiving CPUs for this purpose.
- */
- if (ipi == IPI_STOP_HARD)
- CPU_OR_ATOMIC(&ipi_nmi_pending, &cpus);
-
- while ((cpu = CPU_FFS(&cpus)) != 0) {
- cpu--;
- CPU_CLR(cpu, &cpus);
- CTR3(KTR_SMP, "%s: cpu: %d ipi: %x", __func__, cpu, ipi);
- ipi_send_cpu(cpu, ipi);
- }
-}
-
-/*
- * send an IPI to a specific CPU.
- */
-void
-ipi_cpu(int cpu, u_int ipi)
-{
-
- /*
- * IPI_STOP_HARD maps to a NMI and the trap handler needs a bit
- * of help in order to understand what is the source.
- * Set the mask of receiving CPUs for this purpose.
- */
- if (ipi == IPI_STOP_HARD)
- CPU_SET_ATOMIC(cpu, &ipi_nmi_pending);
-
- CTR3(KTR_SMP, "%s: cpu: %d ipi: %x", __func__, cpu, ipi);
- ipi_send_cpu(cpu, ipi);
-}
-
-/*
- * send an IPI to all CPUs EXCEPT myself
- */
-void
-ipi_all_but_self(u_int ipi)
-{
- cpuset_t other_cpus;
-
- other_cpus = all_cpus;
- CPU_CLR(PCPU_GET(cpuid), &other_cpus);
- if (IPI_IS_BITMAPED(ipi)) {
- ipi_selected(other_cpus, ipi);
- return;
- }
-
- /*
- * IPI_STOP_HARD maps to a NMI and the trap handler needs a bit
- * of help in order to understand what is the source.
- * Set the mask of receiving CPUs for this purpose.
- */
- if (ipi == IPI_STOP_HARD)
- CPU_OR_ATOMIC(&ipi_nmi_pending, &other_cpus);
-
- CTR2(KTR_SMP, "%s: ipi: %x", __func__, ipi);
- lapic_ipi_vectored(ipi, APIC_IPI_DEST_OTHERS);
-}
-
-int
-ipi_nmi_handler()
-{
- u_int cpuid;
-
- /*
- * As long as there is not a simple way to know about a NMI's
- * source, if the bitmask for the current CPU is present in
- * the global pending bitword an IPI_STOP_HARD has been issued
- * and should be handled.
- */
- cpuid = PCPU_GET(cpuid);
- if (!CPU_ISSET(cpuid, &ipi_nmi_pending))
- return (1);
-
- CPU_CLR_ATOMIC(cpuid, &ipi_nmi_pending);
- cpustop_handler();
- return (0);
-}
-
-/*
- * Handle an IPI_STOP by saving our current context and spinning until we
- * are resumed.
- */
-void
-cpustop_handler(void)
-{
- u_int cpu;
-
- cpu = PCPU_GET(cpuid);
-
- savectx(&stoppcbs[cpu]);
-
- /* Indicate that we are stopped */
- CPU_SET_ATOMIC(cpu, &stopped_cpus);
-
- /* Wait for restart */
- while (!CPU_ISSET(cpu, &started_cpus))
- ia32_pause();
-
- CPU_CLR_ATOMIC(cpu, &started_cpus);
- CPU_CLR_ATOMIC(cpu, &stopped_cpus);
-
- if (cpu == 0 && cpustop_restartfunc != NULL) {
- cpustop_restartfunc();
- cpustop_restartfunc = NULL;
- }
-}
-
-/*
- * Handle an IPI_SUSPEND by saving our current context and spinning until we
- * are resumed.
- */
-void
-cpususpend_handler(void)
+smp_cache_flush(void)
{
- u_int cpu;
-
- mtx_assert(&smp_ipi_mtx, MA_NOTOWNED);
-
- cpu = PCPU_GET(cpuid);
- if (savectx(&susppcbs[cpu]->sp_pcb)) {
- npxsuspend(susppcbs[cpu]->sp_fpususpend);
- wbinvd();
- CPU_SET_ATOMIC(cpu, &suspended_cpus);
- } else {
- npxresume(susppcbs[cpu]->sp_fpususpend);
- pmap_init_pat();
- initializecpu();
- PCPU_SET(switchtime, 0);
- PCPU_SET(switchticks, ticks);
-
- /* Indicate that we are resumed */
- CPU_CLR_ATOMIC(cpu, &suspended_cpus);
- }
-
- /* Wait for resume */
- while (!CPU_ISSET(cpu, &started_cpus))
- ia32_pause();
-
- if (cpu_ops.cpu_resume)
- cpu_ops.cpu_resume();
- /* Resume MCA and local APIC */
- lapic_xapic_mode();
- mca_resume();
- lapic_setup(0);
-
- /* Indicate that we are resumed */
- CPU_CLR_ATOMIC(cpu, &suspended_cpus);
- CPU_CLR_ATOMIC(cpu, &started_cpus);
+ if (smp_started)
+ smp_tlb_shootdown(IPI_INVLCACHE, 0, 0);
}
/*
@@ -1619,64 +683,3 @@ invlrng_handler(void)
atomic_add_int(&smp_tlb_wait, 1);
}
-
-void
-invlcache_handler(void)
-{
-#ifdef COUNT_IPIS
- (*ipi_invlcache_counts[PCPU_GET(cpuid)])++;
-#endif /* COUNT_IPIS */
-
- wbinvd();
- atomic_add_int(&smp_tlb_wait, 1);
-}
-
-/*
- * This is called once the rest of the system is up and running and we're
- * ready to let the AP's out of the pen.
- */
-static void
-release_aps(void *dummy __unused)
-{
-
- if (mp_ncpus == 1)
- return;
- atomic_store_rel_int(&aps_ready, 1);
- while (smp_started == 0)
- ia32_pause();
-}
-SYSINIT(start_aps, SI_SUB_SMP, SI_ORDER_FIRST, release_aps, NULL);
-
-#ifdef COUNT_IPIS
-/*
- * Setup interrupt counters for IPI handlers.
- */
-static void
-mp_ipi_intrcnt(void *dummy)
-{
- char buf[64];
- int i;
-
- CPU_FOREACH(i) {
- snprintf(buf, sizeof(buf), "cpu%d:invltlb", i);
- intrcnt_add(buf, &ipi_invltlb_counts[i]);
- snprintf(buf, sizeof(buf), "cpu%d:invlrng", i);
- intrcnt_add(buf, &ipi_invlrng_counts[i]);
- snprintf(buf, sizeof(buf), "cpu%d:invlpg", i);
- intrcnt_add(buf, &ipi_invlpg_counts[i]);
- snprintf(buf, sizeof(buf), "cpu%d:invlcache", i);
- intrcnt_add(buf, &ipi_invlcache_counts[i]);
- snprintf(buf, sizeof(buf), "cpu%d:preempt", i);
- intrcnt_add(buf, &ipi_preempt_counts[i]);
- snprintf(buf, sizeof(buf), "cpu%d:ast", i);
- intrcnt_add(buf, &ipi_ast_counts[i]);
- snprintf(buf, sizeof(buf), "cpu%d:rendezvous", i);
- intrcnt_add(buf, &ipi_rendezvous_counts[i]);
- snprintf(buf, sizeof(buf), "cpu%d:lazypmap", i);
- intrcnt_add(buf, &ipi_lazypmap_counts[i]);
- snprintf(buf, sizeof(buf), "cpu%d:hardclock", i);
- intrcnt_add(buf, &ipi_hardclock_counts[i]);
- }
-}
-SYSINIT(mp_ipi_intrcnt, SI_SUB_INTR, SI_ORDER_MIDDLE, mp_ipi_intrcnt, NULL);
-#endif
diff --git a/sys/i386/i386/mpboot.s b/sys/i386/i386/mpboot.s
index a3ef283..8f5098d 100644
--- a/sys/i386/i386/mpboot.s
+++ b/sys/i386/i386/mpboot.s
@@ -99,7 +99,7 @@ NON_GPROF_ENTRY(MPentry)
movl %eax,%cr4
/* Now enable paging mode */
-#ifdef PAE
+#if defined(PAE) || defined(PAE_TABLES)
movl R(IdlePDPT), %eax
movl %eax, %cr3
movl %cr4, %eax
diff --git a/sys/i386/i386/pmap.c b/sys/i386/i386/pmap.c
index 2d2be0f..029a277 100644
--- a/sys/i386/i386/pmap.c
+++ b/sys/i386/i386/pmap.c
@@ -214,7 +214,7 @@ vm_offset_t kernel_vm_end = KERNBASE + NKPT * NBPDR;
extern u_int32_t KERNend;
extern u_int32_t KPTphys;
-#ifdef PAE
+#if defined(PAE) || defined(PAE_TABLES)
pt_entry_t pg_nx;
static uma_zone_t pdptzone;
#endif
@@ -339,7 +339,7 @@ static void _pmap_unwire_ptp(pmap_t pmap, vm_page_t m, struct spglist *free);
static pt_entry_t *pmap_pte_quick(pmap_t pmap, vm_offset_t va);
static void pmap_pte_release(pt_entry_t *pte);
static int pmap_unuse_pt(pmap_t, vm_offset_t, struct spglist *);
-#ifdef PAE
+#if defined(PAE) || defined(PAE_TABLES)
static void *pmap_pdpt_allocf(uma_zone_t zone, vm_size_t bytes, uint8_t *flags,
int wait);
#endif
@@ -400,7 +400,7 @@ pmap_bootstrap(vm_paddr_t firstaddr)
*/
PMAP_LOCK_INIT(kernel_pmap);
kernel_pmap->pm_pdir = (pd_entry_t *) (KERNBASE + (u_int)IdlePTD);
-#ifdef PAE
+#if defined(PAE) || defined(PAE_TABLES)
kernel_pmap->pm_pdpt = (pdpt_entry_t *) (KERNBASE + (u_int)IdlePDPT);
#endif
CPU_FILL(&kernel_pmap->pm_active); /* don't allow deactivation */
@@ -657,7 +657,7 @@ pmap_page_init(vm_page_t m)
m->md.pat_mode = PAT_WRITE_BACK;
}
-#ifdef PAE
+#if defined(PAE) || defined(PAE_TABLES)
static void *
pmap_pdpt_allocf(uma_zone_t zone, vm_size_t bytes, uint8_t *flags, int wait)
{
@@ -670,7 +670,7 @@ pmap_pdpt_allocf(uma_zone_t zone, vm_size_t bytes, uint8_t *flags, int wait)
#endif
/*
- * ABuse the pte nodes for unmapped kva to thread a kva freelist through.
+ * Abuse the pte nodes for unmapped kva to thread a kva freelist through.
* Requirements:
* - Must deal with pages in order to ensure that none of the PG_* bits
* are ever set, PG_V in particular.
@@ -809,7 +809,7 @@ pmap_init(void)
if (pv_chunkbase == NULL)
panic("pmap_init: not enough kvm for pv chunks");
pmap_ptelist_init(&pv_vafree, pv_chunkbase, pv_maxchunks);
-#ifdef PAE
+#if defined(PAE) || defined(PAE_TABLES)
pdptzone = uma_zcreate("PDPT", NPGPTD * sizeof(pdpt_entry_t), NULL,
NULL, NULL, NULL, (NPGPTD * sizeof(pdpt_entry_t)) - 1,
UMA_ZONE_VM | UMA_ZONE_NOFREE);
@@ -1248,18 +1248,14 @@ pmap_invalidate_cache_pages(vm_page_t *pages, int count)
}
/*
- * Are we current address space or kernel? N.B. We return FALSE when
- * a pmap's page table is in use because a kernel thread is borrowing
- * it. The borrowed page table can change spontaneously, making any
- * dependence on its continued use subject to a race condition.
+ * Are we current address space or kernel?
*/
static __inline int
pmap_is_current(pmap_t pmap)
{
- return (pmap == kernel_pmap ||
- (pmap == vmspace_pmap(curthread->td_proc->p_vmspace) &&
- (pmap->pm_pdir[PTDPTDI] & PG_FRAME) == (PTDpde[0] & PG_FRAME)));
+ return (pmap == kernel_pmap || pmap ==
+ vmspace_pmap(curthread->td_proc->p_vmspace));
}
/*
@@ -1744,7 +1740,7 @@ pmap_pinit0(pmap_t pmap)
* not need to be inserted into that list.
*/
pmap->pm_pdir = (pd_entry_t *)(KERNBASE + (vm_offset_t)IdlePTD);
-#ifdef PAE
+#if defined(PAE) || defined(PAE_TABLES)
pmap->pm_pdpt = (pdpt_entry_t *)(KERNBASE + (vm_offset_t)IdlePDPT);
#endif
pmap->pm_root.rt_root = 0;
@@ -1773,7 +1769,7 @@ pmap_pinit(pmap_t pmap)
pmap->pm_pdir = (pd_entry_t *)kva_alloc(NBPTD);
if (pmap->pm_pdir == NULL)
return (0);
-#ifdef PAE
+#if defined(PAE) || defined(PAE_TABLES)
pmap->pm_pdpt = uma_zalloc(pdptzone, M_WAITOK | M_ZERO);
KASSERT(((vm_offset_t)pmap->pm_pdpt &
((NPGPTD * sizeof(pdpt_entry_t)) - 1)) == 0,
@@ -1815,7 +1811,7 @@ pmap_pinit(pmap_t pmap)
for (i = 0; i < NPGPTD; i++) {
pa = VM_PAGE_TO_PHYS(ptdpg[i]);
pmap->pm_pdir[PTDPTDI + i] = pa | PG_V | PG_RW | PG_A | PG_M;
-#ifdef PAE
+#if defined(PAE) || defined(PAE_TABLES)
pmap->pm_pdpt[i] = pa | PG_V;
#endif
}
@@ -1923,108 +1919,6 @@ retry:
* Pmap allocation/deallocation routines.
***************************************************/
-#ifdef SMP
-/*
- * Deal with a SMP shootdown of other users of the pmap that we are
- * trying to dispose of. This can be a bit hairy.
- */
-static cpuset_t *lazymask;
-static u_int lazyptd;
-static volatile u_int lazywait;
-
-void pmap_lazyfix_action(void);
-
-void
-pmap_lazyfix_action(void)
-{
-
-#ifdef COUNT_IPIS
- (*ipi_lazypmap_counts[PCPU_GET(cpuid)])++;
-#endif
- if (rcr3() == lazyptd)
- load_cr3(curpcb->pcb_cr3);
- CPU_CLR_ATOMIC(PCPU_GET(cpuid), lazymask);
- atomic_store_rel_int(&lazywait, 1);
-}
-
-static void
-pmap_lazyfix_self(u_int cpuid)
-{
-
- if (rcr3() == lazyptd)
- load_cr3(curpcb->pcb_cr3);
- CPU_CLR_ATOMIC(cpuid, lazymask);
-}
-
-
-static void
-pmap_lazyfix(pmap_t pmap)
-{
- cpuset_t mymask, mask;
- u_int cpuid, spins;
- int lsb;
-
- mask = pmap->pm_active;
- while (!CPU_EMPTY(&mask)) {
- spins = 50000000;
-
- /* Find least significant set bit. */
- lsb = CPU_FFS(&mask);
- MPASS(lsb != 0);
- lsb--;
- CPU_SETOF(lsb, &mask);
- mtx_lock_spin(&smp_ipi_mtx);
-#ifdef PAE
- lazyptd = vtophys(pmap->pm_pdpt);
-#else
- lazyptd = vtophys(pmap->pm_pdir);
-#endif
- cpuid = PCPU_GET(cpuid);
-
- /* Use a cpuset just for having an easy check. */
- CPU_SETOF(cpuid, &mymask);
- if (!CPU_CMP(&mask, &mymask)) {
- lazymask = &pmap->pm_active;
- pmap_lazyfix_self(cpuid);
- } else {
- atomic_store_rel_int((u_int *)&lazymask,
- (u_int)&pmap->pm_active);
- atomic_store_rel_int(&lazywait, 0);
- ipi_selected(mask, IPI_LAZYPMAP);
- while (lazywait == 0) {
- ia32_pause();
- if (--spins == 0)
- break;
- }
- }
- mtx_unlock_spin(&smp_ipi_mtx);
- if (spins == 0)
- printf("pmap_lazyfix: spun for 50000000\n");
- mask = pmap->pm_active;
- }
-}
-
-#else /* SMP */
-
-/*
- * Cleaning up on uniprocessor is easy. For various reasons, we're
- * unlikely to have to even execute this code, including the fact
- * that the cleanup is deferred until the parent does a wait(2), which
- * means that another userland process has run.
- */
-static void
-pmap_lazyfix(pmap_t pmap)
-{
- u_int cr3;
-
- cr3 = vtophys(pmap->pm_pdir);
- if (cr3 == rcr3()) {
- load_cr3(curpcb->pcb_cr3);
- CPU_CLR(PCPU_GET(cpuid), &pmap->pm_active);
- }
-}
-#endif /* SMP */
-
/*
* Release any resources held by the given physical map.
* Called when a pmap initialized by pmap_pinit is being released.
@@ -2041,8 +1935,9 @@ pmap_release(pmap_t pmap)
pmap->pm_stats.resident_count));
KASSERT(vm_radix_is_empty(&pmap->pm_root),
("pmap_release: pmap has reserved page table page(s)"));
+ KASSERT(CPU_EMPTY(&pmap->pm_active),
+ ("releasing active pmap %p", pmap));
- pmap_lazyfix(pmap);
mtx_lock_spin(&allpmaps_lock);
LIST_REMOVE(pmap, pm_list);
mtx_unlock_spin(&allpmaps_lock);
@@ -2058,7 +1953,7 @@ pmap_release(pmap_t pmap)
for (i = 0; i < NPGPTD; i++) {
m = ptdpg[i];
-#ifdef PAE
+#if defined(PAE) || defined(PAE_TABLES)
KASSERT(VM_PAGE_TO_PHYS(m) == (pmap->pm_pdpt[i] & PG_FRAME),
("pmap_release: got wrong ptd page"));
#endif
@@ -3150,7 +3045,7 @@ retry:
}
if ((prot & VM_PROT_WRITE) == 0)
newpde &= ~(PG_RW | PG_M);
-#ifdef PAE
+#if defined(PAE) || defined(PAE_TABLES)
if ((prot & VM_PROT_EXECUTE) == 0)
newpde |= pg_nx;
#endif
@@ -3183,7 +3078,7 @@ pmap_protect(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot)
return;
}
-#ifdef PAE
+#if defined(PAE) || defined(PAE_TABLES)
if ((prot & (VM_PROT_WRITE|VM_PROT_EXECUTE)) ==
(VM_PROT_WRITE|VM_PROT_EXECUTE))
return;
@@ -3286,13 +3181,13 @@ retry:
}
pbits &= ~(PG_RW | PG_M);
}
-#ifdef PAE
+#if defined(PAE) || defined(PAE_TABLES)
if ((prot & VM_PROT_EXECUTE) == 0)
pbits |= pg_nx;
#endif
if (pbits != obits) {
-#ifdef PAE
+#if defined(PAE) || defined(PAE_TABLES)
if (!atomic_cmpset_64(pte, obits, pbits))
goto retry;
#else
@@ -3606,7 +3501,7 @@ validate:
if ((newpte & PG_MANAGED) != 0)
vm_page_aflag_set(m, PGA_WRITEABLE);
}
-#ifdef PAE
+#if defined(PAE) || defined(PAE_TABLES)
if ((prot & VM_PROT_EXECUTE) == 0)
newpte |= pg_nx;
#endif
@@ -3633,7 +3528,7 @@ validate:
vm_page_aflag_set(om, PGA_REFERENCED);
if (opa != VM_PAGE_TO_PHYS(m))
invlva = TRUE;
-#ifdef PAE
+#if defined(PAE) || defined(PAE_TABLES)
if ((origpte & PG_NX) == 0 &&
(newpte & PG_NX) != 0)
invlva = TRUE;
@@ -3704,7 +3599,7 @@ pmap_enter_pde(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot)
return (FALSE);
}
}
-#ifdef PAE
+#if defined(PAE) || defined(PAE_TABLES)
if ((prot & VM_PROT_EXECUTE) == 0)
newpde |= pg_nx;
#endif
@@ -3881,7 +3776,7 @@ pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va, vm_page_t m,
pmap->pm_stats.resident_count++;
pa = VM_PAGE_TO_PHYS(m) | pmap_cache_bits(m->md.pat_mode, 0);
-#ifdef PAE
+#if defined(PAE) || defined(PAE_TABLES)
if ((prot & VM_PROT_EXECUTE) == 0)
pa |= pg_nx;
#endif
@@ -5461,7 +5356,7 @@ pmap_activate(struct thread *td)
CPU_CLR(cpuid, &oldpmap->pm_active);
CPU_SET(cpuid, &pmap->pm_active);
#endif
-#ifdef PAE
+#if defined(PAE) || defined(PAE_TABLES)
cr3 = vtophys(pmap->pm_pdpt);
#else
cr3 = vtophys(pmap->pm_pdir);
diff --git a/sys/i386/i386/support.s b/sys/i386/i386/support.s
index 0a08012..78d76ef 100644
--- a/sys/i386/i386/support.s
+++ b/sys/i386/i386/support.s
@@ -695,11 +695,9 @@ END(bcmp)
*/
/* void lgdt(struct region_descriptor *rdp); */
ENTRY(lgdt)
-#ifndef XEN
/* reload the descriptor table */
movl 4(%esp),%eax
lgdt (%eax)
-#endif
/* flush the prefetch q */
jmp 1f
diff --git a/sys/i386/i386/swtch.s b/sys/i386/i386/swtch.s
index e810434..6bedb48 100644
--- a/sys/i386/i386/swtch.s
+++ b/sys/i386/i386/swtch.s
@@ -88,7 +88,7 @@ ENTRY(cpu_throw)
movl 8(%esp),%ecx /* New thread */
movl TD_PCB(%ecx),%edx
movl PCB_CR3(%edx),%eax
- LOAD_CR3(%eax)
+ movl %eax,%cr3
/* set bit in new pm_active */
movl TD_PROC(%ecx),%eax
movl P_VMSPACE(%eax), %ebx
@@ -174,16 +174,10 @@ ENTRY(cpu_switch)
/* switch address space */
movl PCB_CR3(%edx),%eax
-#ifdef PAE
- cmpl %eax,IdlePDPT /* Kernel address space? */
-#else
- cmpl %eax,IdlePTD /* Kernel address space? */
-#endif
- je sw0
- READ_CR3(%ebx) /* The same address space? */
+ movl %cr3,%ebx /* The same address space? */
cmpl %ebx,%eax
je sw0
- LOAD_CR3(%eax) /* new address space */
+ movl %eax,%cr3 /* new address space */
movl %esi,%eax
movl PCPU(CPUID),%esi
SETOP %eax,TD_LOCK(%edi) /* Switchout td_lock */
@@ -210,18 +204,6 @@ sw0:
SETOP %esi,TD_LOCK(%edi) /* Switchout td_lock */
sw1:
BLOCK_SPIN(%ecx)
-#ifdef XEN
- pushl %eax
- pushl %ecx
- pushl %edx
- call xen_handle_thread_switch
- popl %edx
- popl %ecx
- popl %eax
- /*
- * XXX set IOPL
- */
-#else
/*
* At this point, we've switched address spaces and are ready
* to load up the rest of the next context.
@@ -270,7 +252,7 @@ sw1:
movl 12(%esi), %ebx
movl %eax, 8(%edi)
movl %ebx, 12(%edi)
-#endif
+
/* Restore context. */
movl PCB_EBX(%edx),%ebx
movl PCB_ESP(%edx),%esp
@@ -296,7 +278,7 @@ sw1:
movl _default_ldt,%eax
cmpl PCPU(CURRENTLDT),%eax
je 2f
- LLDT(_default_ldt)
+ lldt _default_ldt
movl %eax,PCPU(CURRENTLDT)
jmp 2f
1:
diff --git a/sys/i386/i386/sys_machdep.c b/sys/i386/i386/sys_machdep.c
index 9518862..9044d19 100644
--- a/sys/i386/i386/sys_machdep.c
+++ b/sys/i386/i386/sys_machdep.c
@@ -59,20 +59,6 @@ __FBSDID("$FreeBSD$");
#include <security/audit/audit.h>
-#ifdef XEN
-#include <machine/xen/xenfunc.h>
-
-void i386_reset_ldt(struct proc_ldt *pldt);
-
-void
-i386_reset_ldt(struct proc_ldt *pldt)
-{
- xen_set_ldt((vm_offset_t)pldt->ldt_base, pldt->ldt_len);
-}
-#else
-#define i386_reset_ldt(x)
-#endif
-
#include <vm/vm_kern.h> /* for kernel_map */
#define MAX_LD 8192
@@ -211,12 +197,7 @@ sysarch(td, uap)
*/
sd.sd_lobase = base & 0xffffff;
sd.sd_hibase = (base >> 24) & 0xff;
-#ifdef XEN
- /* need to do nosegneg like Linux */
- sd.sd_lolimit = (HYPERVISOR_VIRT_START >> 12) & 0xffff;
-#else
sd.sd_lolimit = 0xffff; /* 4GB limit, wraps around */
-#endif
sd.sd_hilimit = 0xf;
sd.sd_type = SDT_MEMRWA;
sd.sd_dpl = SEL_UPL;
@@ -226,12 +207,7 @@ sysarch(td, uap)
sd.sd_gran = 1;
critical_enter();
td->td_pcb->pcb_fsd = sd;
-#ifdef XEN
- HYPERVISOR_update_descriptor(vtomach(&PCPU_GET(fsgs_gdt)[0]),
- *(uint64_t *)&sd);
-#else
PCPU_GET(fsgs_gdt)[0] = sd;
-#endif
critical_exit();
td->td_frame->tf_fs = GSEL(GUFS_SEL, SEL_UPL);
}
@@ -252,12 +228,7 @@ sysarch(td, uap)
sd.sd_lobase = base & 0xffffff;
sd.sd_hibase = (base >> 24) & 0xff;
-#ifdef XEN
- /* need to do nosegneg like Linux */
- sd.sd_lolimit = (HYPERVISOR_VIRT_START >> 12) & 0xffff;
-#else
sd.sd_lolimit = 0xffff; /* 4GB limit, wraps around */
-#endif
sd.sd_hilimit = 0xf;
sd.sd_type = SDT_MEMRWA;
sd.sd_dpl = SEL_UPL;
@@ -267,12 +238,7 @@ sysarch(td, uap)
sd.sd_gran = 1;
critical_enter();
td->td_pcb->pcb_gsd = sd;
-#ifdef XEN
- HYPERVISOR_update_descriptor(vtomach(&PCPU_GET(fsgs_gdt)[1]),
- *(uint64_t *)&sd);
-#else
PCPU_GET(fsgs_gdt)[1] = sd;
-#endif
critical_exit();
load_gs(GSEL(GUGS_SEL, SEL_UPL));
}
@@ -434,10 +400,6 @@ set_user_ldt(struct mdproc *mdp)
}
pldt = mdp->md_ldt;
-#ifdef XEN
- i386_reset_ldt(pldt);
- PCPU_SET(currentldt, (int)pldt);
-#else
#ifdef SMP
gdt[PCPU_GET(cpuid) * NGDT + GUSERLDT_SEL].sd = pldt->ldt_sd;
#else
@@ -445,7 +407,6 @@ set_user_ldt(struct mdproc *mdp)
#endif
lldt(GSEL(GUSERLDT_SEL, SEL_KPL));
PCPU_SET(currentldt, GSEL(GUSERLDT_SEL, SEL_KPL));
-#endif /* XEN */
if (dtlocked)
mtx_unlock_spin(&dt_lock);
}
@@ -464,43 +425,6 @@ set_user_ldt_rv(struct vmspace *vmsp)
}
#endif
-#ifdef XEN
-
-/*
- * dt_lock must be held. Returns with dt_lock held.
- */
-struct proc_ldt *
-user_ldt_alloc(struct mdproc *mdp, int len)
-{
- struct proc_ldt *pldt, *new_ldt;
-
- mtx_assert(&dt_lock, MA_OWNED);
- mtx_unlock_spin(&dt_lock);
- new_ldt = malloc(sizeof(struct proc_ldt),
- M_SUBPROC, M_WAITOK);
-
- new_ldt->ldt_len = len = NEW_MAX_LD(len);
- new_ldt->ldt_base = (caddr_t)kmem_malloc(kernel_arena,
- round_page(len * sizeof(union descriptor)), M_WAITOK);
- new_ldt->ldt_refcnt = 1;
- new_ldt->ldt_active = 0;
-
- mtx_lock_spin(&dt_lock);
- if ((pldt = mdp->md_ldt)) {
- if (len > pldt->ldt_len)
- len = pldt->ldt_len;
- bcopy(pldt->ldt_base, new_ldt->ldt_base,
- len * sizeof(union descriptor));
- } else {
- bcopy(ldt, new_ldt->ldt_base, PAGE_SIZE);
- }
- mtx_unlock_spin(&dt_lock); /* XXX kill once pmap locking fixed. */
- pmap_map_readonly(kernel_pmap, (vm_offset_t)new_ldt->ldt_base,
- new_ldt->ldt_len*sizeof(union descriptor));
- mtx_lock_spin(&dt_lock); /* XXX kill once pmap locking fixed. */
- return (new_ldt);
-}
-#else
/*
* dt_lock must be held. Returns with dt_lock held.
*/
@@ -535,7 +459,6 @@ user_ldt_alloc(struct mdproc *mdp, int len)
return (new_ldt);
}
-#endif /* !XEN */
/*
* Must be called with dt_lock held. Returns with dt_lock unheld.
@@ -553,13 +476,8 @@ user_ldt_free(struct thread *td)
}
if (td == curthread) {
-#ifdef XEN
- i386_reset_ldt(&default_proc_ldt);
- PCPU_SET(currentldt, (int)&default_proc_ldt);
-#else
lldt(_default_ldt);
PCPU_SET(currentldt, _default_ldt);
-#endif
}
mdp->md_ldt = NULL;
@@ -785,27 +703,7 @@ again:
td->td_retval[0] = uap->start;
return (error);
}
-#ifdef XEN
-static int
-i386_set_ldt_data(struct thread *td, int start, int num,
- union descriptor *descs)
-{
- struct mdproc *mdp = &td->td_proc->p_md;
- struct proc_ldt *pldt = mdp->md_ldt;
- mtx_assert(&dt_lock, MA_OWNED);
-
- while (num) {
- xen_update_descriptor(
- &((union descriptor *)(pldt->ldt_base))[start],
- descs);
- num--;
- start++;
- descs++;
- }
- return (0);
-}
-#else
static int
i386_set_ldt_data(struct thread *td, int start, int num,
union descriptor *descs)
@@ -821,7 +719,6 @@ i386_set_ldt_data(struct thread *td, int start, int num,
num * sizeof(union descriptor));
return (0);
}
-#endif /* !XEN */
static int
i386_ldt_grow(struct thread *td, int len)
diff --git a/sys/i386/i386/trap.c b/sys/i386/i386/trap.c
index 6d35c3a..d783a2b 100644
--- a/sys/i386/i386/trap.c
+++ b/sys/i386/i386/trap.c
@@ -881,7 +881,7 @@ trap_pfault(frame, usermode, eva)
*/
if (frame->tf_err & PGEX_W)
ftype = VM_PROT_WRITE;
-#ifdef PAE
+#if defined(PAE) || defined(PAE_TABLES)
else if ((frame->tf_err & PGEX_I) && pg_nx != 0)
ftype = VM_PROT_EXECUTE;
#endif
diff --git a/sys/i386/i386/vm86bios.s b/sys/i386/i386/vm86bios.s
index 450374e..f81b784 100644
--- a/sys/i386/i386/vm86bios.s
+++ b/sys/i386/i386/vm86bios.s
@@ -120,7 +120,7 @@ ENTRY(vm86_bioscall)
movl SCR_NEWPTD(%edx),%eax /* mapping for vm86 page table */
movl %eax,0(%ebx) /* ... install as PTD entry 0 */
-#ifdef PAE
+#if defined(PAE) || defined(PAE_TABLES)
movl IdlePDPT,%ecx
#endif
movl %ecx,%cr3 /* new page tables */
diff --git a/sys/i386/i386/vm_machdep.c b/sys/i386/i386/vm_machdep.c
index ebd177a..5671dc9 100644
--- a/sys/i386/i386/vm_machdep.c
+++ b/sys/i386/i386/vm_machdep.c
@@ -89,9 +89,6 @@ __FBSDID("$FreeBSD$");
#include <vm/vm_map.h>
#include <vm/vm_param.h>
-#ifdef XEN
-#include <xen/hypervisor.h>
-#endif
#ifdef PC98
#include <pc98/cbus/cbus.h>
#else
@@ -262,7 +259,7 @@ cpu_fork(td1, p2, td2, flags)
* Set registers for trampoline to user mode. Leave space for the
* return address on stack. These are the kernel mode register values.
*/
-#ifdef PAE
+#if defined(PAE) || defined(PAE_TABLES)
pcb2->pcb_cr3 = vtophys(vmspace_pmap(p2->p_vmspace)->pm_pdpt);
#else
pcb2->pcb_cr3 = vtophys(vmspace_pmap(p2->p_vmspace)->pm_pdir);
@@ -304,10 +301,8 @@ cpu_fork(td1, p2, td2, flags)
/* Setup to release spin count in fork_exit(). */
td2->td_md.md_spinlock_count = 1;
- /*
- * XXX XEN need to check on PSL_USER is handled
- */
td2->td_md.md_saved_flags = PSL_KERNEL | PSL_I;
+
/*
* Now, cpu_switch() can schedule the new process.
* pcb_esp is loaded pointing to the cpu_switch() stack frame
@@ -698,12 +693,6 @@ cpu_reset_real()
#endif
disable_intr();
-#ifdef XEN
- if (smp_processor_id() == 0)
- HYPERVISOR_shutdown(SHUTDOWN_reboot);
- else
- HYPERVISOR_shutdown(SHUTDOWN_poweroff);
-#endif
#ifdef CPU_ELAN
if (elan_mmcr != NULL)
elan_mmcr->RESCFG = 1;
@@ -797,13 +786,8 @@ sf_buf_map(struct sf_buf *sf, int flags)
*/
ptep = vtopte(sf->kva);
opte = *ptep;
-#ifdef XEN
- PT_SET_MA(sf->kva, xpmap_ptom(VM_PAGE_TO_PHYS(sf->m)) | pgeflag
- | PG_RW | PG_V | pmap_cache_bits(sf->m->md.pat_mode, 0));
-#else
*ptep = VM_PAGE_TO_PHYS(sf->m) | pgeflag | PG_RW | PG_V |
pmap_cache_bits(sf->m->md.pat_mode, 0);
-#endif
/*
* Avoid unnecessary TLB invalidations: If the sf_buf's old
@@ -854,15 +838,8 @@ sf_buf_shootdown(struct sf_buf *sf, int flags)
int
sf_buf_unmap(struct sf_buf *sf)
{
-#ifdef XEN
- /*
- * Xen doesn't like having dangling R/W mappings
- */
- pmap_qremove(sf->kva, 1);
- return (1);
-#else
+
return (0);
-#endif
}
static void
diff --git a/sys/i386/include/asmacros.h b/sys/i386/include/asmacros.h
index c1c3f64..716915c 100644
--- a/sys/i386/include/asmacros.h
+++ b/sys/i386/include/asmacros.h
@@ -176,37 +176,6 @@
movl $KPSEL, %eax ; /* reload with per-CPU data segment */ \
movl %eax, %fs
-#ifdef XEN
-#define LOAD_CR3(reg) \
- movl reg,PCPU(CR3); \
- pushl %ecx ; \
- pushl %edx ; \
- pushl %esi ; \
- pushl reg ; \
- call xen_load_cr3 ; \
- addl $4,%esp ; \
- popl %esi ; \
- popl %edx ; \
- popl %ecx ; \
-
-#define READ_CR3(reg) movl PCPU(CR3),reg;
-#define LLDT(arg) \
- pushl %edx ; \
- pushl %eax ; \
- xorl %eax,%eax ; \
- movl %eax,%gs ; \
- call i386_reset_ldt ; \
- popl %eax ; \
- popl %edx
-#define CLI call ni_cli
-#else
-#define LOAD_CR3(reg) movl reg,%cr3;
-#define READ_CR3(reg) movl %cr3,reg;
-#define LLDT(arg) lldt arg;
-#define CLI cli
-#endif /* !XEN */
-
-
#endif /* LOCORE */
#ifdef __STDC__
diff --git a/sys/i386/include/cpufunc.h b/sys/i386/include/cpufunc.h
index f80a898..3bc25d4 100644
--- a/sys/i386/include/cpufunc.h
+++ b/sys/i386/include/cpufunc.h
@@ -42,17 +42,6 @@
#error this file needs sys/cdefs.h as a prerequisite
#endif
-#ifdef XEN
-extern void xen_cli(void);
-extern void xen_sti(void);
-extern u_int xen_rcr2(void);
-extern void xen_load_cr3(u_int data);
-extern void xen_tlb_flush(void);
-extern void xen_invlpg(u_int addr);
-extern void write_eflags(u_int eflags);
-extern u_int read_eflags(void);
-#endif
-
struct region_descriptor;
#define readb(va) (*(volatile uint8_t *) (va))
@@ -106,11 +95,8 @@ clts(void)
static __inline void
disable_intr(void)
{
-#ifdef XEN
- xen_cli();
-#else
+
__asm __volatile("cli" : : : "memory");
-#endif
}
static __inline void
@@ -132,11 +118,8 @@ cpuid_count(u_int ax, u_int cx, u_int *p)
static __inline void
enable_intr(void)
{
-#ifdef XEN
- xen_sti();
-#else
+
__asm __volatile("sti");
-#endif
}
static __inline void
@@ -325,11 +308,7 @@ ia32_pause(void)
}
static __inline u_int
-#ifdef XEN
-_read_eflags(void)
-#else
read_eflags(void)
-#endif
{
u_int ef;
@@ -389,11 +368,7 @@ wbinvd(void)
}
static __inline void
-#ifdef XEN
-_write_eflags(u_int ef)
-#else
write_eflags(u_int ef)
-#endif
{
__asm __volatile("pushl %0; popfl" : : "r" (ef));
}
@@ -425,9 +400,6 @@ rcr2(void)
{
u_int data;
-#ifdef XEN
- return (xen_rcr2());
-#endif
__asm __volatile("movl %%cr2,%0" : "=r" (data));
return (data);
}
@@ -435,11 +407,8 @@ rcr2(void)
static __inline void
load_cr3(u_int data)
{
-#ifdef XEN
- xen_load_cr3(data);
-#else
+
__asm __volatile("movl %0,%%cr3" : : "r" (data) : "memory");
-#endif
}
static __inline u_int
@@ -491,11 +460,8 @@ load_xcr(u_int reg, uint64_t val)
static __inline void
invltlb(void)
{
-#ifdef XEN
- xen_tlb_flush();
-#else
+
load_cr3(rcr3());
-#endif
}
/*
@@ -506,11 +472,7 @@ static __inline void
invlpg(u_int addr)
{
-#ifdef XEN
- xen_invlpg(addr);
-#else
__asm __volatile("invlpg %0" : : "m" (*(char *)addr) : "memory");
-#endif
}
static __inline u_short
diff --git a/sys/i386/include/intr_machdep.h b/sys/i386/include/intr_machdep.h
index 082b649..96ac06a 100644
--- a/sys/i386/include/intr_machdep.h
+++ b/sys/i386/include/intr_machdep.h
@@ -58,13 +58,7 @@
(FIRST_MSI_INT + NUM_MSI_INTS)
#define LAST_EVTCHN_INT \
(FIRST_EVTCHN_INT + NUM_EVTCHN_INTS - 1)
-#elif defined(XEN)
-#include <xen/xen-os.h>
-#define NUM_EVTCHN_INTS NR_EVENT_CHANNELS
-#define FIRST_EVTCHN_INT 0
-#define LAST_EVTCHN_INT \
- (FIRST_EVTCHN_INT + NUM_EVTCHN_INTS - 1)
-#else /* !XEN && !XENHVM */
+#else /* !XENHVM */
#define NUM_EVTCHN_INTS 0
#endif
#define NUM_IO_INTS (FIRST_MSI_INT + NUM_MSI_INTS + NUM_EVTCHN_INTS)
diff --git a/sys/i386/include/md_var.h b/sys/i386/include/md_var.h
index 339dff3..bffdd57 100644
--- a/sys/i386/include/md_var.h
+++ b/sys/i386/include/md_var.h
@@ -97,6 +97,7 @@ struct dumperinfo;
void *alloc_fpusave(int flags);
void bcopyb(const void *from, void *to, size_t len);
void busdma_swi(void);
+void cpu_probe_amdc1e(void);
void cpu_setregs(void);
void cpu_switch_load_gs(void) __asm(__STRING(cpu_switch_load_gs));
void doreti_iret(void) __asm(__STRING(doreti_iret));
diff --git a/sys/i386/include/param.h b/sys/i386/include/param.h
index d7148ae..54477c1 100644
--- a/sys/i386/include/param.h
+++ b/sys/i386/include/param.h
@@ -90,7 +90,7 @@
#define PAGE_MASK (PAGE_SIZE-1)
#define NPTEPG (PAGE_SIZE/(sizeof (pt_entry_t)))
-#ifdef PAE
+#if defined(PAE) || defined(PAE_TABLES)
#define NPGPTD 4
#define PDRSHIFT 21 /* LOG2(NBPDR) */
#define NPGPTD_SHIFT 9
diff --git a/sys/i386/include/pcpu.h b/sys/i386/include/pcpu.h
index dc29b6d..231f80f 100644
--- a/sys/i386/include/pcpu.h
+++ b/sys/i386/include/pcpu.h
@@ -44,34 +44,6 @@
* other processors"
*/
-#if defined(XEN)
-
-/* These are peridically updated in shared_info, and then copied here. */
-struct shadow_time_info {
- uint64_t tsc_timestamp; /* TSC at last update of time vals. */
- uint64_t system_timestamp; /* Time, in nanosecs, since boot. */
- uint32_t tsc_to_nsec_mul;
- uint32_t tsc_to_usec_mul;
- int tsc_shift;
- uint32_t version;
-};
-
-#define PCPU_XEN_FIELDS \
- ; \
- u_int pc_cr3; /* track cr3 for R1/R3*/ \
- vm_paddr_t *pc_pdir_shadow; \
- uint64_t pc_processed_system_time; \
- struct shadow_time_info pc_shadow_time; \
- char __pad[185]
-
-#else /* !XEN */
-
-#define PCPU_XEN_FIELDS \
- ; \
- char __pad[233]
-
-#endif
-
#define PCPU_MD_FIELDS \
char pc_monitorbuf[128] __aligned(128); /* cache line */ \
struct pcpu *pc_prvspace; /* Self-reference */ \
@@ -85,8 +57,8 @@ struct shadow_time_info {
u_int pc_apic_id; \
int pc_private_tss; /* Flag indicating private tss*/\
u_int pc_cmci_mask; /* MCx banks for CMCI */ \
- u_int pc_vcpu_id /* Xen vCPU ID */ \
- PCPU_XEN_FIELDS
+ u_int pc_vcpu_id; /* Xen vCPU ID */ \
+ char __pad[233]
#ifdef _KERNEL
diff --git a/sys/i386/include/pmap.h b/sys/i386/include/pmap.h
index 05656cd..76822b1 100644
--- a/sys/i386/include/pmap.h
+++ b/sys/i386/include/pmap.h
@@ -63,7 +63,7 @@
#define PG_AVAIL2 0x400 /* < programmers use */
#define PG_AVAIL3 0x800 /* \ */
#define PG_PDE_PAT 0x1000 /* PAT PAT index */
-#ifdef PAE
+#if defined(PAE) || defined(PAE_TABLES)
#define PG_NX (1ull<<63) /* No-execute */
#endif
@@ -71,7 +71,7 @@
/* Our various interpretations of the above */
#define PG_W PG_AVAIL1 /* "Wired" pseudoflag */
#define PG_MANAGED PG_AVAIL2
-#ifdef PAE
+#if defined(PAE) || defined(PAE_TABLES)
#define PG_FRAME (0x000ffffffffff000ull)
#define PG_PS_FRAME (0x000fffffffe00000ull)
#else
@@ -110,7 +110,7 @@
* is 1 Gigabyte. Double everything. It must be a multiple of 8 for PAE.
*/
#ifndef KVA_PAGES
-#ifdef PAE
+#if defined(PAE) || defined(PAE_TABLES)
#define KVA_PAGES 512
#else
#define KVA_PAGES 256
@@ -122,13 +122,21 @@
*/
#define VADDR(pdi, pti) ((vm_offset_t)(((pdi)<<PDRSHIFT)|((pti)<<PAGE_SHIFT)))
-/* Initial number of kernel page tables. */
+/*
+ * The initial number of kernel page table pages that are constructed
+ * by locore must be sufficient to map vm_page_array. That number can
+ * be calculated as follows:
+ * max_phys / PAGE_SIZE * sizeof(struct vm_page) / NBPDR
+ * PAE: max_phys 16G, sizeof(vm_page) 76, NBPDR 2M, 152 page table pages.
+ * PAE_TABLES: max_phys 4G, sizeof(vm_page) 68, NBPDR 2M, 36 page table pages.
+ * Non-PAE: max_phys 4G, sizeof(vm_page) 68, NBPDR 4M, 18 page table pages.
+ */
#ifndef NKPT
-#ifdef PAE
-/* 152 page tables needed to map 16G (76B "struct vm_page", 2M page tables). */
+#if defined(PAE)
#define NKPT 240
+#elif defined(PAE_TABLES)
+#define NKPT 60
#else
-/* 18 page tables needed to map 4G (72B "struct vm_page", 4M page tables). */
#define NKPT 30
#endif
#endif
@@ -161,7 +169,7 @@
#include <vm/_vm_radix.h>
-#ifdef PAE
+#if defined(PAE) || defined(PAE_TABLES)
typedef uint64_t pdpt_entry_t;
typedef uint64_t pd_entry_t;
@@ -188,7 +196,7 @@ extern pt_entry_t PTmap[];
extern pd_entry_t PTD[];
extern pd_entry_t PTDpde[];
-#ifdef PAE
+#if defined(PAE) || defined(PAE_TABLES)
extern pdpt_entry_t *IdlePDPT;
#endif
extern pd_entry_t *IdlePTD; /* physical address of "Idle" state directory */
@@ -211,76 +219,6 @@ extern pd_entry_t *IdlePTD; /* physical address of "Idle" state directory */
*/
#define vtophys(va) pmap_kextract((vm_offset_t)(va))
-#if defined(XEN)
-#include <sys/param.h>
-
-#include <xen/xen-os.h>
-
-#include <machine/xen/xenvar.h>
-#include <machine/xen/xenpmap.h>
-
-extern pt_entry_t pg_nx;
-
-#define PG_KERNEL (PG_V | PG_A | PG_RW | PG_M)
-
-#define MACH_TO_VM_PAGE(ma) PHYS_TO_VM_PAGE(xpmap_mtop((ma)))
-#define VM_PAGE_TO_MACH(m) xpmap_ptom(VM_PAGE_TO_PHYS((m)))
-
-#define VTOM(va) xpmap_ptom(VTOP(va))
-
-static __inline vm_paddr_t
-pmap_kextract_ma(vm_offset_t va)
-{
- vm_paddr_t ma;
- if ((ma = PTD[va >> PDRSHIFT]) & PG_PS) {
- ma = (ma & ~(NBPDR - 1)) | (va & (NBPDR - 1));
- } else {
- ma = (*vtopte(va) & PG_FRAME) | (va & PAGE_MASK);
- }
- return ma;
-}
-
-static __inline vm_paddr_t
-pmap_kextract(vm_offset_t va)
-{
- return xpmap_mtop(pmap_kextract_ma(va));
-}
-#define vtomach(va) pmap_kextract_ma(((vm_offset_t) (va)))
-
-vm_paddr_t pmap_extract_ma(struct pmap *pmap, vm_offset_t va);
-
-void pmap_kenter_ma(vm_offset_t va, vm_paddr_t pa);
-void pmap_map_readonly(struct pmap *pmap, vm_offset_t va, int len);
-void pmap_map_readwrite(struct pmap *pmap, vm_offset_t va, int len);
-
-static __inline pt_entry_t
-pte_load_store(pt_entry_t *ptep, pt_entry_t v)
-{
- pt_entry_t r;
-
- r = *ptep;
- PT_SET_VA(ptep, v, TRUE);
- return (r);
-}
-
-static __inline pt_entry_t
-pte_load_store_ma(pt_entry_t *ptep, pt_entry_t v)
-{
- pt_entry_t r;
-
- r = *ptep;
- PT_SET_VA_MA(ptep, v, TRUE);
- return (r);
-}
-
-#define pte_load_clear(ptep) pte_load_store((ptep), (pt_entry_t)0ULL)
-
-#define pte_store(ptep, pte) pte_load_store((ptep), (pt_entry_t)pte)
-#define pte_store_ma(ptep, pte) pte_load_store_ma((ptep), (pt_entry_t)pte)
-#define pde_store_ma(ptep, pte) pte_load_store_ma((ptep), (pt_entry_t)pte)
-
-#elif !defined(XEN)
-
/*
* KPTmap is a linear mapping of the kernel page table. It differs from the
* recursive mapping in two ways: (1) it only provides access to kernel page
@@ -320,13 +258,8 @@ pmap_kextract(vm_offset_t va)
}
return (pa);
}
-#endif
-
-#if !defined(XEN)
-#define PT_UPDATES_FLUSH()
-#endif
-#if defined(PAE) && !defined(XEN)
+#if (defined(PAE) || defined(PAE_TABLES))
#define pde_cmpset(pdep, old, new) atomic_cmpset_64_i586(pdep, old, new)
#define pte_load_store(ptep, pte) atomic_swap_64_i586(ptep, pte)
@@ -335,7 +268,7 @@ pmap_kextract(vm_offset_t va)
extern pt_entry_t pg_nx;
-#elif !defined(PAE) && !defined(XEN)
+#else /* !(PAE || PAE_TABLES) */
#define pde_cmpset(pdep, old, new) atomic_cmpset_int(pdep, old, new)
#define pte_load_store(ptep, pte) atomic_swap_int(ptep, pte)
@@ -344,7 +277,7 @@ extern pt_entry_t pg_nx;
*(u_int *)(ptep) = (u_int)(pte); \
} while (0)
-#endif /* PAE */
+#endif /* !(PAE || PAE_TABLES) */
#define pte_clear(ptep) pte_store(ptep, 0)
@@ -370,8 +303,8 @@ struct pmap {
cpuset_t pm_active; /* active on cpus */
struct pmap_statistics pm_stats; /* pmap statistics */
LIST_ENTRY(pmap) pm_list; /* List of all pmaps */
-#ifdef PAE
- pdpt_entry_t *pm_pdpt; /* KVA of page director pointer
+#if defined(PAE) || defined(PAE_TABLES)
+ pdpt_entry_t *pm_pdpt; /* KVA of page directory pointer
table */
#endif
struct vm_radix pm_root; /* spare page table pages */
diff --git a/sys/i386/include/segments.h b/sys/i386/include/segments.h
index d67f2e0..635dffc 100644
--- a/sys/i386/include/segments.h
+++ b/sys/i386/include/segments.h
@@ -82,14 +82,8 @@ struct region_descriptor {
#ifdef _KERNEL
extern int _default_ldt;
-#ifdef XEN
-extern struct proc_ldt default_proc_ldt;
-extern union descriptor *gdt;
-extern union descriptor *ldt;
-#else
extern union descriptor gdt[];
extern union descriptor ldt[NLDT];
-#endif
extern struct soft_segment_descriptor gdt_segs[];
extern struct gate_descriptor *idt;
extern struct region_descriptor r_gdt, r_idt;
diff --git a/sys/i386/include/smp.h b/sys/i386/include/smp.h
index cc9a8ea..71c830e 100644
--- a/sys/i386/include/smp.h
+++ b/sys/i386/include/smp.h
@@ -36,13 +36,43 @@ extern int mp_naps;
extern int boot_cpu_id;
extern struct pcb stoppcbs[];
extern int cpu_apic_ids[];
+extern int bootAP;
+extern void *dpcpu;
+extern char *bootSTK;
+extern int bootAP;
+extern void *bootstacks[];
+extern volatile u_int cpu_ipi_pending[];
+extern volatile int aps_ready;
+extern struct mtx ap_boot_mtx;
+extern int cpu_logical;
+extern int cpu_cores;
+extern volatile int smp_tlb_wait;
+extern u_int xhits_gbl[];
+extern u_int xhits_pg[];
+extern u_int xhits_rng[];
+extern u_int ipi_global;
+extern u_int ipi_page;
+extern u_int ipi_range;
+extern u_int ipi_range_size;
+extern u_int ipi_masked_global;
+extern u_int ipi_masked_page;
+extern u_int ipi_masked_range;
+extern u_int ipi_masked_range_size;
+
+struct cpu_info {
+ int cpu_present:1;
+ int cpu_bsp:1;
+ int cpu_disabled:1;
+ int cpu_hyperthread:1;
+};
+extern struct cpu_info cpu_info[];
+
#ifdef COUNT_IPIS
extern u_long *ipi_invltlb_counts[MAXCPU];
extern u_long *ipi_invlrng_counts[MAXCPU];
extern u_long *ipi_invlpg_counts[MAXCPU];
extern u_long *ipi_invlcache_counts[MAXCPU];
extern u_long *ipi_rendezvous_counts[MAXCPU];
-extern u_long *ipi_lazypmap_counts[MAXCPU];
#endif
/* IPI handlers */
@@ -54,15 +84,14 @@ inthand_t
IDTVEC(ipi_intr_bitmap_handler), /* Bitmap based IPIs */
IDTVEC(cpustop), /* CPU stops & waits to be restarted */
IDTVEC(cpususpend), /* CPU suspends & waits to be resumed */
- IDTVEC(rendezvous), /* handle CPU rendezvous */
- IDTVEC(lazypmap); /* handle lazy pmap release */
+ IDTVEC(rendezvous); /* handle CPU rendezvous */
/* functions in mp_machdep.c */
+void assign_cpu_ids(void);
void cpu_add(u_int apic_id, char boot_cpu);
void cpustop_handler(void);
-#ifndef XEN
void cpususpend_handler(void);
-#endif
+void init_secondary_tail(void);
void invltlb_handler(void);
void invlpg_handler(void);
void invlrng_handler(void);
@@ -70,13 +99,12 @@ void invlcache_handler(void);
void init_secondary(void);
void ipi_startup(int apic_id, int vector);
void ipi_all_but_self(u_int ipi);
-#ifndef XEN
void ipi_bitmap_handler(struct trapframe frame);
-#endif
void ipi_cpu(int cpu, u_int ipi);
int ipi_nmi_handler(void);
void ipi_selected(cpuset_t cpus, u_int ipi);
u_int mp_bootaddress(u_int);
+void set_interrupt_apic_ids(void);
void smp_cache_flush(void);
void smp_invlpg(vm_offset_t addr);
void smp_masked_invlpg(cpuset_t mask, vm_offset_t addr);
@@ -85,10 +113,10 @@ void smp_masked_invlpg_range(cpuset_t mask, vm_offset_t startva,
vm_offset_t endva);
void smp_invltlb(void);
void smp_masked_invltlb(cpuset_t mask);
+void mem_range_AP_init(void);
+void topo_probe(void);
+void ipi_send_cpu(int cpu, u_int ipi);
-#ifdef XEN
-void ipi_to_irq_init(void);
-#endif
#endif /* !LOCORE */
#endif /* SMP */
diff --git a/sys/i386/include/vm.h b/sys/i386/include/vm.h
index 6573e37..22d2eca 100644
--- a/sys/i386/include/vm.h
+++ b/sys/i386/include/vm.h
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2009 Advanced Computing Technologies LLC
+ * Copyright (c) 2009 Hudson River Trading LLC
* Written by: John H. Baldwin <jhb@FreeBSD.org>
* All rights reserved.
*
diff --git a/sys/i386/include/vmparam.h b/sys/i386/include/vmparam.h
index 5dc5669..cb23b05 100644
--- a/sys/i386/include/vmparam.h
+++ b/sys/i386/include/vmparam.h
@@ -120,11 +120,11 @@
#endif
/*
- * Level 0 reservations consist of 512 pages under PAE and 1024 pages
- * otherwise.
+ * Level 0 reservations consist of 512 pages when PAE pagetables are
+ * used, and 1024 pages otherwise.
*/
#ifndef VM_LEVEL_0_ORDER
-#ifdef PAE
+#if defined(PAE) || defined(PAE_TABLES)
#define VM_LEVEL_0_ORDER 9
#else
#define VM_LEVEL_0_ORDER 10
@@ -135,11 +135,7 @@
* Kernel physical load address.
*/
#ifndef KERNLOAD
-#if defined(XEN) && !defined(XEN_PRIVILEGED_GUEST)
-#define KERNLOAD 0
-#else
#define KERNLOAD (1 << PDRSHIFT)
-#endif
#endif /* !defined(KERNLOAD) */
/*
@@ -149,11 +145,7 @@
* messy at times, but hey, we'll do anything to save a page :-)
*/
-#ifdef XEN
-#define VM_MAX_KERNEL_ADDRESS HYPERVISOR_VIRT_START
-#else
#define VM_MAX_KERNEL_ADDRESS VADDR(KPTDI+NKPDE-1, NPTEPG-1)
-#endif
#define VM_MIN_KERNEL_ADDRESS VADDR(PTDPTDI, PTDPTDI)
diff --git a/sys/i386/include/xen/features.h b/sys/i386/include/xen/features.h
deleted file mode 100644
index fb4f680..0000000
--- a/sys/i386/include/xen/features.h
+++ /dev/null
@@ -1,22 +0,0 @@
-/******************************************************************************
- * features.h
- *
- * Query the features reported by Xen.
- *
- * Copyright (c) 2006, Ian Campbell
- *
- * $FreeBSD$
- */
-
-#ifndef __ASM_XEN_FEATURES_H__
-#define __ASM_XEN_FEATURES_H__
-
-#include <xen/interface/version.h>
-
-extern void setup_xen_features(void);
-
-extern uint8_t xen_features[XENFEAT_NR_SUBMAPS * 32];
-
-#define xen_feature(flag) (xen_features[flag])
-
-#endif /* __ASM_XEN_FEATURES_H__ */
diff --git a/sys/i386/include/xen/hypercall.h b/sys/i386/include/xen/hypercall.h
index c7e2a00..1c4d529 100644
--- a/sys/i386/include/xen/hypercall.h
+++ b/sys/i386/include/xen/hypercall.h
@@ -246,14 +246,8 @@ HYPERVISOR_memory_op(
return _hypercall2(int, memory_op, cmd, arg);
}
-#if defined(XEN)
-int HYPERVISOR_multicall(multicall_entry_t *, int);
-static inline int
-_HYPERVISOR_multicall(
-#else /* XENHVM */
static inline int
HYPERVISOR_multicall(
-#endif
void *call_list, int nr_calls)
{
return _hypercall2(int, multicall, call_list, nr_calls);
diff --git a/sys/i386/include/xen/xen-os.h b/sys/i386/include/xen/xen-os.h
index 3d1ef04..9b9b63f 100644
--- a/sys/i386/include/xen/xen-os.h
+++ b/sys/i386/include/xen/xen-os.h
@@ -44,105 +44,6 @@ static inline void rep_nop(void)
}
#define cpu_relax() rep_nop()
-#ifndef XENHVM
-
-#ifdef SMP
-extern int gdtset;
-
-#include <sys/time.h> /* XXX for pcpu.h */
-#include <sys/pcpu.h> /* XXX for PCPU_GET */
-static inline int
-smp_processor_id(void)
-{
- if (__predict_true(gdtset))
- return PCPU_GET(cpuid);
- return 0;
-}
-
-#else
-#define smp_processor_id() 0
-#endif
-
-#ifndef PANIC_IF
-#define PANIC_IF(exp) if (__predict_false(exp)) {printf("panic - %s: %s:%d\n",#exp, __FILE__, __LINE__); panic("%s: %s:%d", #exp, __FILE__, __LINE__);}
-#endif
-
-/*
- * Crude memory allocator for memory allocation early in boot.
- */
-void *bootmem_alloc(unsigned int size);
-void bootmem_free(void *ptr, unsigned int size);
-
-/*
- * STI/CLI equivalents. These basically set and clear the virtual
- * event_enable flag in the shared_info structure. Note that when
- * the enable bit is set, there may be pending events to be handled.
- * We may therefore call into do_hypervisor_callback() directly.
- */
-
-#define __cli() \
-do { \
- vcpu_info_t *_vcpu; \
- _vcpu = &HYPERVISOR_shared_info->vcpu_info[smp_processor_id()]; \
- _vcpu->evtchn_upcall_mask = 1; \
- barrier(); \
-} while (0)
-
-#define __sti() \
-do { \
- vcpu_info_t *_vcpu; \
- barrier(); \
- _vcpu = &HYPERVISOR_shared_info->vcpu_info[smp_processor_id()]; \
- _vcpu->evtchn_upcall_mask = 0; \
- barrier(); /* unmask then check (avoid races) */ \
- if (__predict_false(_vcpu->evtchn_upcall_pending)) \
- force_evtchn_callback(); \
-} while (0)
-
-#define __restore_flags(x) \
-do { \
- vcpu_info_t *_vcpu; \
- barrier(); \
- _vcpu = &HYPERVISOR_shared_info->vcpu_info[smp_processor_id()]; \
- if ((_vcpu->evtchn_upcall_mask = (x)) == 0) { \
- barrier(); /* unmask then check (avoid races) */ \
- if (__predict_false(_vcpu->evtchn_upcall_pending)) \
- force_evtchn_callback(); \
- } \
-} while (0)
-
-/*
- * Add critical_{enter, exit}?
- *
- */
-#define __save_and_cli(x) \
-do { \
- vcpu_info_t *_vcpu; \
- _vcpu = &HYPERVISOR_shared_info->vcpu_info[smp_processor_id()]; \
- (x) = _vcpu->evtchn_upcall_mask; \
- _vcpu->evtchn_upcall_mask = 1; \
- barrier(); \
-} while (0)
-
-
-#define cli() __cli()
-#define sti() __sti()
-#define save_flags(x) __save_flags(x)
-#define restore_flags(x) __restore_flags(x)
-#define save_and_cli(x) __save_and_cli(x)
-
-#define local_irq_save(x) __save_and_cli(x)
-#define local_irq_restore(x) __restore_flags(x)
-#define local_irq_disable() __cli()
-#define local_irq_enable() __sti()
-
-#define mtx_lock_irqsave(lock, x) {local_irq_save((x)); mtx_lock_spin((lock));}
-#define mtx_unlock_irqrestore(lock, x) {mtx_unlock_spin((lock)); local_irq_restore((x)); }
-#define spin_lock_irqsave mtx_lock_irqsave
-#define spin_unlock_irqrestore mtx_unlock_irqrestore
-
-#endif /* !XENHVM */
-
/* This is a barrier for the compiler only, NOT the processor! */
#define barrier() __asm__ __volatile__("": : :"memory")
diff --git a/sys/i386/include/xen/xenfunc.h b/sys/i386/include/xen/xenfunc.h
index f02ee12..f48b1f1 100644
--- a/sys/i386/include/xen/xenfunc.h
+++ b/sys/i386/include/xen/xenfunc.h
@@ -34,7 +34,6 @@
#include <vm/pmap.h>
-#include <machine/xen/xenpmap.h>
#include <machine/segments.h>
#include <sys/pcpu.h>
diff --git a/sys/i386/include/xen/xenpmap.h b/sys/i386/include/xen/xenpmap.h
deleted file mode 100644
index 8287e72..0000000
--- a/sys/i386/include/xen/xenpmap.h
+++ /dev/null
@@ -1,237 +0,0 @@
-/*
- *
- * Copyright (c) 2004 Christian Limpach.
- * Copyright (c) 2004,2005 Kip Macy
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Christian Limpach.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *
- * $FreeBSD$
- */
-
-#ifndef _XEN_XENPMAP_H_
-#define _XEN_XENPMAP_H_
-
-#if defined(XEN)
-void _xen_queue_pt_update(vm_paddr_t, vm_paddr_t, char *, int);
-void xen_pt_switch(vm_paddr_t);
-void xen_set_ldt(vm_paddr_t, unsigned long);
-void xen_pgdpt_pin(vm_paddr_t);
-void xen_pgd_pin(vm_paddr_t);
-void xen_pgd_unpin(vm_paddr_t);
-void xen_pt_pin(vm_paddr_t);
-void xen_pt_unpin(vm_paddr_t);
-void xen_flush_queue(void);
-void pmap_ref(pt_entry_t *pte, vm_paddr_t ma);
-void pmap_suspend(void);
-void pmap_resume(void);
-void xen_check_queue(void);
-
-#ifdef INVARIANTS
-#define xen_queue_pt_update(a, b) _xen_queue_pt_update((a), (b), __FILE__, __LINE__)
-#else
-#define xen_queue_pt_update(a, b) _xen_queue_pt_update((a), (b), NULL, 0)
-#endif
-
-
-#include <sys/param.h>
-#include <sys/pcpu.h>
-
-#ifdef PMAP_DEBUG
-#define PMAP_REF pmap_ref
-#define PMAP_DEC_REF_PAGE pmap_dec_ref_page
-#define PMAP_MARK_PRIV pmap_mark_privileged
-#define PMAP_MARK_UNPRIV pmap_mark_unprivileged
-#else
-#define PMAP_MARK_PRIV(a)
-#define PMAP_MARK_UNPRIV(a)
-#define PMAP_REF(a, b)
-#define PMAP_DEC_REF_PAGE(a)
-#endif
-
-#define ALWAYS_SYNC 0
-
-#ifdef PT_DEBUG
-#define PT_LOG() printk("WP PT_SET %s:%d\n", __FILE__, __LINE__)
-#else
-#define PT_LOG()
-#endif
-
-#define INVALID_P2M_ENTRY (~0UL)
-
-#define pmap_valid_entry(E) ((E) & PG_V) /* is PDE or PTE valid? */
-
-#define SH_PD_SET_VA 1
-#define SH_PD_SET_VA_MA 2
-#define SH_PD_SET_VA_CLEAR 3
-
-struct pmap;
-void pd_set(struct pmap *pmap, int ptepindex, vm_paddr_t val, int type);
-#ifdef notyet
-static vm_paddr_t
-vptetomachpte(vm_paddr_t *pte)
-{
- vm_offset_t offset, ppte;
- vm_paddr_t pgoffset, retval, *pdir_shadow_ptr;
- int pgindex;
-
- ppte = (vm_offset_t)pte;
- pgoffset = (ppte & PAGE_MASK);
- offset = ppte - (vm_offset_t)PTmap;
- pgindex = ppte >> PDRSHIFT;
-
- pdir_shadow_ptr = (vm_paddr_t *)PCPU_GET(pdir_shadow);
- retval = (pdir_shadow_ptr[pgindex] & ~PAGE_MASK) + pgoffset;
- return (retval);
-}
-#endif
-#define PT_GET(_ptp) \
- (pmap_valid_entry(*(_ptp)) ? xpmap_mtop(*(_ptp)) : (0))
-
-#ifdef WRITABLE_PAGETABLES
-
-#define PT_SET_VA(_ptp,_npte,sync) do { \
- PMAP_REF((_ptp), xpmap_ptom(_npte)); \
- PT_LOG(); \
- *(_ptp) = xpmap_ptom((_npte)); \
-} while (/*CONSTCOND*/0)
-#define PT_SET_VA_MA(_ptp,_npte,sync) do { \
- PMAP_REF((_ptp), (_npte)); \
- PT_LOG(); \
- *(_ptp) = (_npte); \
-} while (/*CONSTCOND*/0)
-#define PT_CLEAR_VA(_ptp, sync) do { \
- PMAP_REF((pt_entry_t *)(_ptp), 0); \
- PT_LOG(); \
- *(_ptp) = 0; \
-} while (/*CONSTCOND*/0)
-
-#define PD_SET_VA(_pmap, _ptp, _npte, sync) do { \
- PMAP_REF((_ptp), xpmap_ptom(_npte)); \
- pd_set((_pmap),(_ptp),(_npte), SH_PD_SET_VA); \
- if (sync || ALWAYS_SYNC) xen_flush_queue(); \
-} while (/*CONSTCOND*/0)
-#define PD_SET_VA_MA(_pmap, _ptp, _npte, sync) do { \
- PMAP_REF((_ptp), (_npte)); \
- pd_set((_pmap),(_ptp),(_npte), SH_PD_SET_VA_MA); \
- if (sync || ALWAYS_SYNC) xen_flush_queue(); \
-} while (/*CONSTCOND*/0)
-#define PD_CLEAR_VA(_pmap, _ptp, sync) do { \
- PMAP_REF((pt_entry_t *)(_ptp), 0); \
- pd_set((_pmap),(_ptp), 0, SH_PD_SET_VA_CLEAR); \
- if (sync || ALWAYS_SYNC) xen_flush_queue(); \
-} while (/*CONSTCOND*/0)
-
-#else /* !WRITABLE_PAGETABLES */
-
-#define PT_SET_VA(_ptp,_npte,sync) do { \
- PMAP_REF((_ptp), xpmap_ptom(_npte)); \
- xen_queue_pt_update(vtomach(_ptp), \
- xpmap_ptom(_npte)); \
- if (sync || ALWAYS_SYNC) xen_flush_queue(); \
-} while (/*CONSTCOND*/0)
-#define PT_SET_VA_MA(_ptp,_npte,sync) do { \
- PMAP_REF((_ptp), (_npte)); \
- xen_queue_pt_update(vtomach(_ptp), _npte); \
- if (sync || ALWAYS_SYNC) xen_flush_queue(); \
-} while (/*CONSTCOND*/0)
-#define PT_CLEAR_VA(_ptp, sync) do { \
- PMAP_REF((pt_entry_t *)(_ptp), 0); \
- xen_queue_pt_update(vtomach(_ptp), 0); \
- if (sync || ALWAYS_SYNC) \
- xen_flush_queue(); \
-} while (/*CONSTCOND*/0)
-
-#define PD_SET_VA(_pmap, _ptepindex,_npte,sync) do { \
- PMAP_REF((_ptp), xpmap_ptom(_npte)); \
- pd_set((_pmap),(_ptepindex),(_npte), SH_PD_SET_VA); \
- if (sync || ALWAYS_SYNC) xen_flush_queue(); \
-} while (/*CONSTCOND*/0)
-#define PD_SET_VA_MA(_pmap, _ptepindex,_npte,sync) do { \
- PMAP_REF((_ptp), (_npte)); \
- pd_set((_pmap),(_ptepindex),(_npte), SH_PD_SET_VA_MA); \
- if (sync || ALWAYS_SYNC) xen_flush_queue(); \
-} while (/*CONSTCOND*/0)
-#define PD_CLEAR_VA(_pmap, _ptepindex, sync) do { \
- PMAP_REF((pt_entry_t *)(_ptp), 0); \
- pd_set((_pmap),(_ptepindex), 0, SH_PD_SET_VA_CLEAR); \
- if (sync || ALWAYS_SYNC) xen_flush_queue(); \
-} while (/*CONSTCOND*/0)
-
-#endif
-
-#define PT_SET_MA(_va, _ma) \
-do { \
- PANIC_IF(HYPERVISOR_update_va_mapping(((unsigned long)(_va)),\
- (_ma), \
- UVMF_INVLPG| UVMF_ALL) < 0); \
-} while (/*CONSTCOND*/0)
-
-#define PT_UPDATES_FLUSH() do { \
- xen_flush_queue(); \
-} while (/*CONSTCOND*/0)
-
-static __inline vm_paddr_t
-xpmap_mtop(vm_paddr_t mpa)
-{
- vm_paddr_t tmp = (mpa & PG_FRAME);
-
- return machtophys(tmp) | (mpa & ~PG_FRAME);
-}
-
-static __inline vm_paddr_t
-xpmap_ptom(vm_paddr_t ppa)
-{
- vm_paddr_t tmp = (ppa & PG_FRAME);
-
- return phystomach(tmp) | (ppa & ~PG_FRAME);
-}
-
-static __inline void
-set_phys_to_machine(unsigned long pfn, unsigned long mfn)
-{
-#ifdef notyet
- PANIC_IF(max_mapnr && pfn >= max_mapnr);
-#endif
- if (xen_feature(XENFEAT_auto_translated_physmap)) {
-#ifdef notyet
- PANIC_IF((pfn != mfn && mfn != INVALID_P2M_ENTRY));
-#endif
- return;
- }
- xen_phys_machine[pfn] = mfn;
-}
-
-static __inline int
-phys_to_machine_mapping_valid(unsigned long pfn)
-{
- return xen_phys_machine[pfn] != INVALID_P2M_ENTRY;
-}
-
-#endif /* !XEN */
-
-#endif /* _XEN_XENPMAP_H_ */
diff --git a/sys/i386/include/xen/xenstored.h b/sys/i386/include/xen/xenstored.h
deleted file mode 100644
index e584fa5..0000000
--- a/sys/i386/include/xen/xenstored.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Simple prototyle Xen Store Daemon providing simple tree-like database.
- * Copyright (C) 2005 Rusty Russell IBM Corporation
- *
- * This file may be distributed separately from the Linux kernel, or
- * incorporated into other software packages, subject to the following license:
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this source file (the "Software"), to deal in the Software without
- * restriction, including without limitation the rights to use, copy, modify,
- * merge, publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
-
-#ifndef _XENSTORED_H
-#define _XENSTORED_H
-
-enum xsd_sockmsg_type
-{
- XS_DEBUG,
- XS_SHUTDOWN,
- XS_DIRECTORY,
- XS_READ,
- XS_GET_PERMS,
- XS_WATCH,
- XS_WATCH_ACK,
- XS_UNWATCH,
- XS_TRANSACTION_START,
- XS_TRANSACTION_END,
- XS_OP_READ_ONLY = XS_TRANSACTION_END,
- XS_INTRODUCE,
- XS_RELEASE,
- XS_GETDOMAINPATH,
- XS_WRITE,
- XS_MKDIR,
- XS_RM,
- XS_SET_PERMS,
- XS_WATCH_EVENT,
- XS_ERROR,
-};
-
-#define XS_WRITE_NONE "NONE"
-#define XS_WRITE_CREATE "CREATE"
-#define XS_WRITE_CREATE_EXCL "CREATE|EXCL"
-
-/* We hand errors as strings, for portability. */
-struct xsd_errors
-{
- int errnum;
- const char *errstring;
-};
-#define XSD_ERROR(x) { x, #x }
-static struct xsd_errors xsd_errors[] __attribute__((unused)) = {
- XSD_ERROR(EINVAL),
- XSD_ERROR(EACCES),
- XSD_ERROR(EEXIST),
- XSD_ERROR(EISDIR),
- XSD_ERROR(ENOENT),
- XSD_ERROR(ENOMEM),
- XSD_ERROR(ENOSPC),
- XSD_ERROR(EIO),
- XSD_ERROR(ENOTEMPTY),
- XSD_ERROR(ENOSYS),
- XSD_ERROR(EROFS),
- XSD_ERROR(EBUSY),
- XSD_ERROR(ETIMEDOUT),
- XSD_ERROR(EISCONN),
-};
-struct xsd_sockmsg
-{
- uint32_t type;
- uint32_t len; /* Length of data following this. */
-
- /* Generally followed by nul-terminated string(s). */
-};
-
-#endif /* _XENSTORED_H */
diff --git a/sys/i386/include/xen/xenvar.h b/sys/i386/include/xen/xenvar.h
index 5694607..484c279 100644
--- a/sys/i386/include/xen/xenvar.h
+++ b/sys/i386/include/xen/xenvar.h
@@ -29,91 +29,8 @@
#ifndef XENVAR_H_
#define XENVAR_H_
-#include <machine/xen/features.h>
-
-#if defined(XEN)
-
-#define XBOOTUP 0x1
-#define XPMAP 0x2
-extern int xendebug_flags;
-#ifndef NOXENDEBUG
-/* Print directly to the Xen console during debugging. */
-#define XENPRINTF xc_printf
-#else
-#define XENPRINTF printf
-#endif
-
-extern xen_pfn_t *xen_phys_machine;
-extern xen_pfn_t *xen_pfn_to_mfn_frame_list[16];
-extern xen_pfn_t *xen_pfn_to_mfn_frame_list_list;
-
-#if 0
-#define TRACE_ENTER XENPRINTF("(file=%s, line=%d) entered %s\n", __FILE__, __LINE__, __FUNCTION__)
-#define TRACE_EXIT XENPRINTF("(file=%s, line=%d) exiting %s\n", __FILE__, __LINE__, __FUNCTION__)
-#define TRACE_DEBUG(argflags, _f, _a...) \
-if (xendebug_flags & argflags) XENPRINTF("(file=%s, line=%d) " _f "\n", __FILE__, __LINE__, ## _a);
-#else
-#define TRACE_ENTER
-#define TRACE_EXIT
-#define TRACE_DEBUG(argflags, _f, _a...)
-#endif
-
-extern xen_pfn_t *xen_machine_phys;
-/* Xen starts physical pages after the 4MB ISA hole -
- * FreeBSD doesn't
- */
-
-
-#undef ADD_ISA_HOLE /* XXX */
-
-#ifdef ADD_ISA_HOLE
-#define ISA_INDEX_OFFSET 1024
-#define ISA_PDR_OFFSET 1
-#else
-#define ISA_INDEX_OFFSET 0
-#define ISA_PDR_OFFSET 0
-#endif
-
-
-#define PFNTOMFN(i) (xen_phys_machine[(i)])
-#define MFNTOPFN(i) ((vm_paddr_t)xen_machine_phys[(i)])
-
-#define VTOP(x) ((((uintptr_t)(x))) - KERNBASE)
-#define PTOV(x) (((uintptr_t)(x)) + KERNBASE)
-
-#define VTOPFN(x) (VTOP(x) >> PAGE_SHIFT)
-#define PFNTOV(x) PTOV((vm_paddr_t)(x) << PAGE_SHIFT)
-
-#define VTOMFN(va) (vtomach(va) >> PAGE_SHIFT)
-#define PFN_UP(x) (((x) + PAGE_SIZE-1) >> PAGE_SHIFT)
-
-#define phystomach(pa) (((vm_paddr_t)(PFNTOMFN((pa) >> PAGE_SHIFT))) << PAGE_SHIFT)
-#define machtophys(ma) (((vm_paddr_t)(MFNTOPFN((ma) >> PAGE_SHIFT))) << PAGE_SHIFT)
-
-
-void xpq_init(void);
-
-#define BITS_PER_LONG 32
-#define NR_CPUS XEN_LEGACY_MAX_VCPUS
-
-#define BITS_TO_LONGS(bits) \
- (((bits)+BITS_PER_LONG-1)/BITS_PER_LONG)
-#define DECLARE_BITMAP(name,bits) \
- unsigned long name[BITS_TO_LONGS(bits)]
-
-int xen_create_contiguous_region(vm_page_t pages, int npages);
-
-void xen_destroy_contiguous_region(void * addr, int npages);
-
-#elif defined(XENHVM)
+#include <xen/features.h>
#define vtomach(va) pmap_kextract((vm_offset_t) (va))
-#define PFNTOMFN(pa) (pa)
-#define MFNTOPFN(ma) (ma)
-
-#define set_phys_to_machine(pfn, mfn) ((void)0)
-#define phys_to_machine_mapping_valid(pfn) (TRUE)
-
-#endif /* !XEN && !XENHVM */
#endif
diff --git a/sys/i386/isa/npx.c b/sys/i386/isa/npx.c
index b0ea4e7..a7113e2 100644
--- a/sys/i386/isa/npx.c
+++ b/sys/i386/isa/npx.c
@@ -69,10 +69,6 @@ __FBSDID("$FreeBSD$");
#include <machine/ucontext.h>
#include <machine/intr_machdep.h>
-#ifdef XEN
-#include <xen/xen-os.h>
-#include <xen/hypervisor.h>
-#endif
#ifdef DEV_ISA
#include <isa/isavar.h>
@@ -157,13 +153,8 @@ void xsaveopt(char *addr, uint64_t mask);
#endif /* __GNUCLIKE_ASM && !lint */
-#ifdef XEN
-#define start_emulating() (HYPERVISOR_fpu_taskswitch(1))
-#define stop_emulating() (HYPERVISOR_fpu_taskswitch(0))
-#else
#define start_emulating() load_cr0(rcr0() | CR0_TS)
#define stop_emulating() clts()
-#endif
#ifdef CPU_ENABLE_SSE
#define GET_FPU_CW(thread) \
diff --git a/sys/i386/pci/pci_cfgreg.c b/sys/i386/pci/pci_cfgreg.c
index 5d57e89..2716a7a 100644
--- a/sys/i386/pci/pci_cfgreg.c
+++ b/sys/i386/pci/pci_cfgreg.c
@@ -93,9 +93,7 @@ static uint32_t pci_docfgregread(int bus, int slot, int func, int reg,
int bytes);
static int pcireg_cfgread(int bus, int slot, int func, int reg, int bytes);
static void pcireg_cfgwrite(int bus, int slot, int func, int reg, int data, int bytes);
-#ifndef XEN
static int pcireg_cfgopen(void);
-#endif
static int pciereg_cfgread(int bus, unsigned slot, unsigned func,
unsigned reg, unsigned bytes);
static void pciereg_cfgwrite(int bus, unsigned slot, unsigned func,
@@ -116,7 +114,6 @@ pci_i386_map_intline(int line)
return (line);
}
-#ifndef XEN
static u_int16_t
pcibios_get_version(void)
{
@@ -137,7 +134,6 @@ pcibios_get_version(void)
}
return (args.ebx & 0xffff);
}
-#endif
/*
* Initialise access to PCI configuration space
@@ -145,9 +141,6 @@ pcibios_get_version(void)
int
pci_cfgregopen(void)
{
-#ifdef XEN
- return (0);
-#else
static int opened = 0;
uint64_t pciebar;
u_int16_t vid, did;
@@ -202,7 +195,6 @@ pci_cfgregopen(void)
}
return(1);
-#endif
}
static uint32_t
@@ -390,7 +382,6 @@ pcireg_cfgwrite(int bus, int slot, int func, int reg, int data, int bytes)
mtx_unlock_spin(&pcicfg_mtx);
}
-#ifndef XEN
/* check whether the configuration mechanism has been correctly identified */
static int
pci_cfgcheck(int maxdev)
@@ -607,7 +598,6 @@ pcie_cfgregopen(uint64_t base, uint8_t minbus, uint8_t maxbus)
return (1);
}
-#endif /* !XEN */
#define PCIE_PADDR(base, reg, bus, slot, func) \
((base) + \
diff --git a/sys/i386/pci/pci_pir.c b/sys/i386/pci/pci_pir.c
index 0d64cab..6aeaae3 100644
--- a/sys/i386/pci/pci_pir.c
+++ b/sys/i386/pci/pci_pir.c
@@ -137,9 +137,6 @@ pci_pir_open(void)
int i;
uint8_t ck, *cv;
-#ifdef XEN
- return;
-#else
/* Don't try if we've already found a table. */
if (pci_route_table != NULL)
return;
@@ -150,7 +147,7 @@ pci_pir_open(void)
sigaddr = bios_sigsearch(0, "_PIR", 4, 16, 0);
if (sigaddr == 0)
return;
-#endif
+
/* If we found something, check the checksum and length. */
/* XXX - Use pmap_mapdev()? */
pt = (struct PIR_table *)(uintptr_t)BIOS_PADDRTOVADDR(sigaddr);
@@ -481,11 +478,7 @@ pci_pir_biosroute(int bus, int device, int func, int pin, int irq)
args.eax = PCIBIOS_ROUTE_INTERRUPT;
args.ebx = (bus << 8) | (device << 3) | func;
args.ecx = (irq << 8) | (0xa + pin);
-#ifdef XEN
- return (0);
-#else
return (bios32(&args, PCIbios.ventry, GSEL(GCODE_SEL, SEL_KPL)));
-#endif
}
diff --git a/sys/i386/xen/clock.c b/sys/i386/xen/clock.c
deleted file mode 100644
index ffb436e..0000000
--- a/sys/i386/xen/clock.c
+++ /dev/null
@@ -1,570 +0,0 @@
-/*-
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * William Jolitz and Don Ahn.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * from: @(#)clock.c 7.2 (Berkeley) 5/12/91
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/* #define DELAYDEBUG */
-/*
- * Routines to handle clock hardware.
- */
-
-#include "opt_ddb.h"
-#include "opt_clock.h"
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/bus.h>
-#include <sys/clock.h>
-#include <sys/lock.h>
-#include <sys/mutex.h>
-#include <sys/proc.h>
-#include <sys/time.h>
-#include <sys/timeet.h>
-#include <sys/timetc.h>
-#include <sys/kernel.h>
-#include <sys/limits.h>
-#include <sys/sysctl.h>
-#include <sys/cons.h>
-#include <sys/power.h>
-
-#include <machine/clock.h>
-#include <machine/cputypes.h>
-#include <machine/frame.h>
-#include <machine/intr_machdep.h>
-#include <machine/md_var.h>
-#include <machine/psl.h>
-#include <machine/pvclock.h>
-#if defined(SMP)
-#include <machine/smp.h>
-#endif
-#include <machine/specialreg.h>
-#include <machine/timerreg.h>
-
-#include <x86/isa/icu.h>
-#include <isa/isareg.h>
-#include <isa/rtc.h>
-
-#include <vm/vm.h>
-#include <vm/pmap.h>
-#include <machine/pmap.h>
-#include <xen/hypervisor.h>
-#include <xen/xen-os.h>
-#include <machine/xen/xenfunc.h>
-#include <xen/interface/vcpu.h>
-#include <machine/cpu.h>
-#include <xen/xen_intr.h>
-
-/*
- * 32-bit time_t's can't reach leap years before 1904 or after 2036, so we
- * can use a simple formula for leap years.
- */
-#define LEAPYEAR(y) (!((y) % 4))
-#define DAYSPERYEAR (28+30*4+31*7)
-
-#ifndef TIMER_FREQ
-#define TIMER_FREQ 1193182
-#endif
-
-#ifdef CYC2NS_SCALE_FACTOR
-#undef CYC2NS_SCALE_FACTOR
-#endif
-#define CYC2NS_SCALE_FACTOR 10
-
-/* Values for timerX_state: */
-#define RELEASED 0
-#define RELEASE_PENDING 1
-#define ACQUIRED 2
-#define ACQUIRE_PENDING 3
-
-struct mtx clock_lock;
-#define RTC_LOCK_INIT \
- mtx_init(&clock_lock, "clk", NULL, MTX_SPIN | MTX_NOPROFILE)
-#define RTC_LOCK mtx_lock_spin(&clock_lock)
-#define RTC_UNLOCK mtx_unlock_spin(&clock_lock)
-#define NS_PER_TICK (1000000000ULL/hz)
-
-int adjkerntz; /* local offset from UTC in seconds */
-int clkintr_pending;
-int pscnt = 1;
-int psdiv = 1;
-int wall_cmos_clock;
-u_int timer_freq = TIMER_FREQ;
-static u_long cyc2ns_scale;
-static uint64_t processed_system_time; /* stime (ns) at last processing. */
-
-#define do_div(n,base) ({ \
- unsigned long __upper, __low, __high, __mod, __base; \
- __base = (base); \
- __asm("":"=a" (__low), "=d" (__high):"A" (n)); \
- __upper = __high; \
- if (__high) { \
- __upper = __high % (__base); \
- __high = __high / (__base); \
- } \
- __asm("divl %2":"=a" (__low), "=d" (__mod):"rm" (__base), "0" (__low), "1" (__upper)); \
- __asm("":"=A" (n):"a" (__low),"d" (__high)); \
- __mod; \
-})
-
-
-/* convert from cycles(64bits) => nanoseconds (64bits)
- * basic equation:
- * ns = cycles / (freq / ns_per_sec)
- * ns = cycles * (ns_per_sec / freq)
- * ns = cycles * (10^9 / (cpu_mhz * 10^6))
- * ns = cycles * (10^3 / cpu_mhz)
- *
- * Then we use scaling math (suggested by george@mvista.com) to get:
- * ns = cycles * (10^3 * SC / cpu_mhz) / SC
- * ns = cycles * cyc2ns_scale / SC
- *
- * And since SC is a constant power of two, we can convert the div
- * into a shift.
- * -johnstul@us.ibm.com "math is hard, lets go shopping!"
- */
-static inline void set_cyc2ns_scale(unsigned long cpu_mhz)
-{
- cyc2ns_scale = (1000 << CYC2NS_SCALE_FACTOR)/cpu_mhz;
-}
-
-static inline unsigned long long cycles_2_ns(unsigned long long cyc)
-{
- return ((cyc * cyc2ns_scale) >> CYC2NS_SCALE_FACTOR);
-}
-
-static uint32_t
-getit(void)
-{
- return (pvclock_get_last_cycles());
-}
-
-
-/*
- * XXX: timer needs more SMP work.
- */
-void
-i8254_init(void)
-{
-
- RTC_LOCK_INIT;
-}
-
-/*
- * Wait "n" microseconds.
- * Relies on timer 1 counting down from (timer_freq / hz)
- * Note: timer had better have been programmed before this is first used!
- */
-void
-i8254_delay(int n)
-{
- int delta, ticks_left;
- uint32_t tick, prev_tick;
-#ifdef DELAYDEBUG
- int getit_calls = 1;
- int n1;
- static int state = 0;
-
- if (state == 0) {
- state = 1;
- for (n1 = 1; n1 <= 10000000; n1 *= 10)
- DELAY(n1);
- state = 2;
- }
- if (state == 1)
- printf("DELAY(%d)...", n);
-#endif
- /*
- * Read the counter first, so that the rest of the setup overhead is
- * counted. Guess the initial overhead is 20 usec (on most systems it
- * takes about 1.5 usec for each of the i/o's in getit(). The loop
- * takes about 6 usec on a 486/33 and 13 usec on a 386/20. The
- * multiplications and divisions to scale the count take a while).
- *
- * However, if ddb is active then use a fake counter since reading
- * the i8254 counter involves acquiring a lock. ddb must not go
- * locking for many reasons, but it calls here for at least atkbd
- * input.
- */
- prev_tick = getit();
-
- n -= 0; /* XXX actually guess no initial overhead */
- /*
- * Calculate (n * (timer_freq / 1e6)) without using floating point
- * and without any avoidable overflows.
- */
- if (n <= 0)
- ticks_left = 0;
- else if (n < 256)
- /*
- * Use fixed point to avoid a slow division by 1000000.
- * 39099 = 1193182 * 2^15 / 10^6 rounded to nearest.
- * 2^15 is the first power of 2 that gives exact results
- * for n between 0 and 256.
- */
- ticks_left = ((u_int)n * 39099 + (1 << 15) - 1) >> 15;
- else
- /*
- * Don't bother using fixed point, although gcc-2.7.2
- * generates particularly poor code for the long long
- * division, since even the slow way will complete long
- * before the delay is up (unless we're interrupted).
- */
- ticks_left = ((u_int)n * (long long)timer_freq + 999999)
- / 1000000;
-
- while (ticks_left > 0) {
- tick = getit();
-#ifdef DELAYDEBUG
- ++getit_calls;
-#endif
- delta = tick - prev_tick;
- prev_tick = tick;
- if (delta < 0) {
- /*
- * Guard against timer0_max_count being wrong.
- * This shouldn't happen in normal operation,
- * but it may happen if set_timer_freq() is
- * traced.
- */
- /* delta += timer0_max_count; ??? */
- if (delta < 0)
- delta = 0;
- }
- ticks_left -= delta;
- }
-#ifdef DELAYDEBUG
- if (state == 1)
- printf(" %d calls to getit() at %d usec each\n",
- getit_calls, (n + 5) / getit_calls);
-#endif
-}
-
-void
-startrtclock()
-{
- uint64_t __cpu_khz;
- uint32_t cpu_khz;
- struct vcpu_time_info *info;
-
- __cpu_khz = 1000000ULL << 32;
- info = &HYPERVISOR_shared_info->vcpu_info[0].time;
-
- (void)do_div(__cpu_khz, info->tsc_to_system_mul);
- if ( info->tsc_shift < 0 )
- cpu_khz = __cpu_khz << -info->tsc_shift;
- else
- cpu_khz = __cpu_khz >> info->tsc_shift;
-
- printf("Xen reported: %u.%03u MHz processor.\n",
- cpu_khz / 1000, cpu_khz % 1000);
-
- /* (10^6 * 2^32) / cpu_hz = (10^3 * 2^32) / cpu_khz =
- (2^32 * 1 / (clocks/us)) */
-
- set_cyc2ns_scale(cpu_khz/1000);
- tsc_freq = cpu_khz * 1000;
-}
-
-/*
- * RTC support routines
- */
-
-
-static __inline int
-readrtc(int port)
-{
- return(bcd2bin(rtcin(port)));
-}
-
-
-#ifdef XEN_PRIVILEGED_GUEST
-
-/*
- * Initialize the time of day register, based on the time base which is, e.g.
- * from a filesystem.
- */
-static void
-domu_inittodr(time_t base)
-{
- unsigned long sec;
- int s, y;
- struct timespec ts;
-
- update_wallclock();
- add_uptime_to_wallclock();
-
- RTC_LOCK;
-
- if (base) {
- ts.tv_sec = base;
- ts.tv_nsec = 0;
- tc_setclock(&ts);
- }
-
- sec += tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0);
-
- y = time_second - shadow_tv.tv_sec;
- if (y <= -2 || y >= 2) {
- /* badly off, adjust it */
- tc_setclock(&shadow_tv);
- }
- RTC_UNLOCK;
-}
-
-/*
- * Write system time back to RTC.
- */
-static void
-domu_resettodr(void)
-{
- unsigned long tm;
- int s;
- dom0_op_t op;
- struct shadow_time_info *shadow;
- struct pcpu *pc;
-
- pc = pcpu_find(smp_processor_id());
- shadow = &pc->pc_shadow_time;
- if (xen_disable_rtc_set)
- return;
-
- s = splclock();
- tm = time_second;
- splx(s);
-
- tm -= tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0);
-
- if ((xen_start_info->flags & SIF_INITDOMAIN) &&
- !independent_wallclock)
- {
- op.cmd = DOM0_SETTIME;
- op.u.settime.secs = tm;
- op.u.settime.nsecs = 0;
- op.u.settime.system_time = shadow->system_timestamp;
- HYPERVISOR_dom0_op(&op);
- update_wallclock();
- add_uptime_to_wallclock();
- } else if (independent_wallclock) {
- /* notyet */
- ;
- }
-}
-
-/*
- * Initialize the time of day register, based on the time base which is, e.g.
- * from a filesystem.
- */
-void
-inittodr(time_t base)
-{
- unsigned long sec, days;
- int year, month;
- int y, m, s;
- struct timespec ts;
-
- if (!(xen_start_info->flags & SIF_INITDOMAIN)) {
- domu_inittodr(base);
- return;
- }
-
- if (base) {
- s = splclock();
- ts.tv_sec = base;
- ts.tv_nsec = 0;
- tc_setclock(&ts);
- splx(s);
- }
-
- /* Look if we have a RTC present and the time is valid */
- if (!(rtcin(RTC_STATUSD) & RTCSD_PWR))
- goto wrong_time;
-
- /* wait for time update to complete */
- /* If RTCSA_TUP is zero, we have at least 244us before next update */
- s = splhigh();
- while (rtcin(RTC_STATUSA) & RTCSA_TUP) {
- splx(s);
- s = splhigh();
- }
-
- days = 0;
-#ifdef USE_RTC_CENTURY
- year = readrtc(RTC_YEAR) + readrtc(RTC_CENTURY) * 100;
-#else
- year = readrtc(RTC_YEAR) + 1900;
- if (year < 1970)
- year += 100;
-#endif
- if (year < 1970) {
- splx(s);
- goto wrong_time;
- }
- month = readrtc(RTC_MONTH);
- for (m = 1; m < month; m++)
- days += daysinmonth[m-1];
- if ((month > 2) && LEAPYEAR(year))
- days ++;
- days += readrtc(RTC_DAY) - 1;
- for (y = 1970; y < year; y++)
- days += DAYSPERYEAR + LEAPYEAR(y);
- sec = ((( days * 24 +
- readrtc(RTC_HRS)) * 60 +
- readrtc(RTC_MIN)) * 60 +
- readrtc(RTC_SEC));
- /* sec now contains the number of seconds, since Jan 1 1970,
- in the local time zone */
-
- sec += tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0);
-
- y = time_second - sec;
- if (y <= -2 || y >= 2) {
- /* badly off, adjust it */
- ts.tv_sec = sec;
- ts.tv_nsec = 0;
- tc_setclock(&ts);
- }
- splx(s);
- return;
-
- wrong_time:
- printf("Invalid time in real time clock.\n");
- printf("Check and reset the date immediately!\n");
-}
-
-
-/*
- * Write system time back to RTC
- */
-void
-resettodr()
-{
- unsigned long tm;
- int y, m, s;
-
- if (!(xen_start_info->flags & SIF_INITDOMAIN)) {
- domu_resettodr();
- return;
- }
-
- if (xen_disable_rtc_set)
- return;
-
- s = splclock();
- tm = time_second;
- splx(s);
-
- /* Disable RTC updates and interrupts. */
- writertc(RTC_STATUSB, RTCSB_HALT | RTCSB_24HR);
-
- /* Calculate local time to put in RTC */
-
- tm -= tz_minuteswest * 60 + (wall_cmos_clock ? adjkerntz : 0);
-
- writertc(RTC_SEC, bin2bcd(tm%60)); tm /= 60; /* Write back Seconds */
- writertc(RTC_MIN, bin2bcd(tm%60)); tm /= 60; /* Write back Minutes */
- writertc(RTC_HRS, bin2bcd(tm%24)); tm /= 24; /* Write back Hours */
-
- /* We have now the days since 01-01-1970 in tm */
- writertc(RTC_WDAY, (tm + 4) % 7 + 1); /* Write back Weekday */
- for (y = 1970, m = DAYSPERYEAR + LEAPYEAR(y);
- tm >= m;
- y++, m = DAYSPERYEAR + LEAPYEAR(y))
- tm -= m;
-
- /* Now we have the years in y and the day-of-the-year in tm */
- writertc(RTC_YEAR, bin2bcd(y%100)); /* Write back Year */
-#ifdef USE_RTC_CENTURY
- writertc(RTC_CENTURY, bin2bcd(y/100)); /* ... and Century */
-#endif
- for (m = 0; ; m++) {
- int ml;
-
- ml = daysinmonth[m];
- if (m == 1 && LEAPYEAR(y))
- ml++;
- if (tm < ml)
- break;
- tm -= ml;
- }
-
- writertc(RTC_MONTH, bin2bcd(m + 1)); /* Write back Month */
- writertc(RTC_DAY, bin2bcd(tm + 1)); /* Write back Month Day */
-
- /* Reenable RTC updates and interrupts. */
- writertc(RTC_STATUSB, RTCSB_24HR);
- rtcin(RTC_INTR);
-}
-#endif
-
-/*
- * Start clocks running.
- */
-void
-cpu_initclocks(void)
-{
- cpu_initclocks_bsp();
-}
-
-/* Return system time offset by ticks */
-uint64_t
-get_system_time(int ticks)
-{
- return (processed_system_time + (ticks * NS_PER_TICK));
-}
-
-int
-timer_spkr_acquire(void)
-{
-
- return (0);
-}
-
-int
-timer_spkr_release(void)
-{
-
- return (0);
-}
-
-void
-timer_spkr_setfreq(int freq)
-{
-
-}
-
diff --git a/sys/i386/xen/exception.s b/sys/i386/xen/exception.s
deleted file mode 100644
index 95f1c0e..0000000
--- a/sys/i386/xen/exception.s
+++ /dev/null
@@ -1,494 +0,0 @@
-/*-
- * Copyright (c) 1989, 1990 William F. Jolitz.
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#include "opt_apic.h"
-#include "opt_npx.h"
-
-#include <machine/asmacros.h>
-#include <machine/psl.h>
-#include <machine/trap.h>
-
-#include "assym.s"
-
-#define SEL_RPL_MASK 0x0002
-#define __HYPERVISOR_iret 23
-
-/* Offsets into shared_info_t. */
-
-#define evtchn_upcall_pending /* 0 */
-#define evtchn_upcall_mask 1
-
-#define sizeof_vcpu_shift 6
-
-
-#ifdef SMP
-#define GET_VCPU_INFO(reg) movl PCPU(CPUID),reg ; \
- shl $sizeof_vcpu_shift,reg ; \
- addl HYPERVISOR_shared_info,reg
-#else
-#define GET_VCPU_INFO(reg) movl HYPERVISOR_shared_info,reg
-#endif
-
-#define __DISABLE_INTERRUPTS(reg) movb $1,evtchn_upcall_mask(reg)
-#define __ENABLE_INTERRUPTS(reg) movb $0,evtchn_upcall_mask(reg)
-#define DISABLE_INTERRUPTS(reg) GET_VCPU_INFO(reg) ; \
- __DISABLE_INTERRUPTS(reg)
-#define ENABLE_INTERRUPTS(reg) GET_VCPU_INFO(reg) ; \
- __ENABLE_INTERRUPTS(reg)
-#define __TEST_PENDING(reg) testb $0xFF,evtchn_upcall_pending(reg)
-
-#define POPA \
- popl %edi; \
- popl %esi; \
- popl %ebp; \
- popl %ebx; \
- popl %ebx; \
- popl %edx; \
- popl %ecx; \
- popl %eax;
-
- .text
-
-/*****************************************************************************/
-/* Trap handling */
-/*****************************************************************************/
-/*
- * Trap and fault vector routines.
- *
- * Most traps are 'trap gates', SDT_SYS386TGT. A trap gate pushes state on
- * the stack that mostly looks like an interrupt, but does not disable
- * interrupts. A few of the traps we are use are interrupt gates,
- * SDT_SYS386IGT, which are nearly the same thing except interrupts are
- * disabled on entry.
- *
- * The cpu will push a certain amount of state onto the kernel stack for
- * the current process. The amount of state depends on the type of trap
- * and whether the trap crossed rings or not. See i386/include/frame.h.
- * At the very least the current EFLAGS (status register, which includes
- * the interrupt disable state prior to the trap), the code segment register,
- * and the return instruction pointer are pushed by the cpu. The cpu
- * will also push an 'error' code for certain traps. We push a dummy
- * error code for those traps where the cpu doesn't in order to maintain
- * a consistent frame. We also push a contrived 'trap number'.
- *
- * The cpu does not push the general registers, we must do that, and we
- * must restore them prior to calling 'iret'. The cpu adjusts the %cs and
- * %ss segment registers, but does not mess with %ds, %es, or %fs. Thus we
- * must load them with appropriate values for supervisor mode operation.
- */
-
-MCOUNT_LABEL(user)
-MCOUNT_LABEL(btrap)
-
-#define TRAP(a) pushl $(a) ; jmp alltraps
-
-IDTVEC(div)
- pushl $0; TRAP(T_DIVIDE)
-IDTVEC(dbg)
- pushl $0; TRAP(T_TRCTRAP)
-IDTVEC(nmi)
- pushl $0; TRAP(T_NMI)
-IDTVEC(bpt)
- pushl $0; TRAP(T_BPTFLT)
-IDTVEC(ofl)
- pushl $0; TRAP(T_OFLOW)
-IDTVEC(bnd)
- pushl $0; TRAP(T_BOUND)
-IDTVEC(ill)
- pushl $0; TRAP(T_PRIVINFLT)
-IDTVEC(dna)
- pushl $0; TRAP(T_DNA)
-IDTVEC(fpusegm)
- pushl $0; TRAP(T_FPOPFLT)
-IDTVEC(tss)
- TRAP(T_TSSFLT)
-IDTVEC(missing)
- TRAP(T_SEGNPFLT)
-IDTVEC(stk)
- TRAP(T_STKFLT)
-IDTVEC(prot)
- TRAP(T_PROTFLT)
-IDTVEC(page)
- TRAP(T_PAGEFLT)
-IDTVEC(mchk)
- pushl $0; TRAP(T_MCHK)
-IDTVEC(rsvd)
- pushl $0; TRAP(T_RESERVED)
-IDTVEC(fpu)
- pushl $0; TRAP(T_ARITHTRAP)
-IDTVEC(align)
- TRAP(T_ALIGNFLT)
-IDTVEC(xmm)
- pushl $0; TRAP(T_XMMFLT)
-
-IDTVEC(hypervisor_callback)
- pushl $0;
- pushl $0;
- pushal
- pushl %ds
- pushl %es
- pushl %fs
-upcall_with_regs_pushed:
- SET_KERNEL_SREGS
- FAKE_MCOUNT(TF_EIP(%esp))
-call_evtchn_upcall:
- movl TF_EIP(%esp),%eax
- cmpl $scrit,%eax
- jb 10f
- cmpl $ecrit,%eax
- jb critical_region_fixup
-
-10: pushl %esp
- call xen_intr_handle_upcall
- addl $4,%esp
-
- /*
- * Return via doreti to handle ASTs.
- */
- MEXITCOUNT
- jmp doreti
-
-
-hypervisor_callback_pending:
- DISABLE_INTERRUPTS(%esi) /* cli */
- jmp 10b
- /*
- * alltraps entry point. Interrupts are enabled if this was a trap
- * gate (TGT), else disabled if this was an interrupt gate (IGT).
- * Note that int0x80_syscall is a trap gate. Only page faults
- * use an interrupt gate.
- */
- SUPERALIGN_TEXT
- .globl alltraps
- .type alltraps,@function
-alltraps:
- pushal
- pushl %ds
- pushl %es
- pushl %fs
-
-alltraps_with_regs_pushed:
- SET_KERNEL_SREGS
- FAKE_MCOUNT(TF_EIP(%esp))
-
-calltrap:
- push %esp
- call trap
- add $4, %esp
-
- /*
- * Return via doreti to handle ASTs.
- */
- MEXITCOUNT
- jmp doreti
-
-/*
- * SYSCALL CALL GATE (old entry point for a.out binaries)
- *
- * The intersegment call has been set up to specify one dummy parameter.
- *
- * This leaves a place to put eflags so that the call frame can be
- * converted to a trap frame. Note that the eflags is (semi-)bogusly
- * pushed into (what will be) tf_err and then copied later into the
- * final spot. It has to be done this way because esp can't be just
- * temporarily altered for the pushfl - an interrupt might come in
- * and clobber the saved cs/eip.
- */
- SUPERALIGN_TEXT
-IDTVEC(lcall_syscall)
- pushfl /* save eflags */
- popl 8(%esp) /* shuffle into tf_eflags */
- pushl $7 /* sizeof "lcall 7,0" */
- subl $4,%esp /* skip over tf_trapno */
- pushal
- pushl %ds
- pushl %es
- pushl %fs
- SET_KERNEL_SREGS
- FAKE_MCOUNT(TF_EIP(%esp))
- pushl %esp
- call syscall
- add $4, %esp
- MEXITCOUNT
- jmp doreti
-
-/*
- * Call gate entry for FreeBSD ELF and Linux/NetBSD syscall (int 0x80)
- *
- * Even though the name says 'int0x80', this is actually a TGT (trap gate)
- * rather then an IGT (interrupt gate). Thus interrupts are enabled on
- * entry just as they are for a normal syscall.
- */
- SUPERALIGN_TEXT
-IDTVEC(int0x80_syscall)
- pushl $2 /* sizeof "int 0x80" */
- pushl $0xBEEF /* for debug */
- pushal
- pushl %ds
- pushl %es
- pushl %fs
- SET_KERNEL_SREGS
- FAKE_MCOUNT(TF_EIP(%esp))
- pushl %esp
- call syscall
- add $4, %esp
- MEXITCOUNT
- jmp doreti
-
-ENTRY(fork_trampoline)
- pushl %esp /* trapframe pointer */
- pushl %ebx /* arg1 */
- pushl %esi /* function */
- call fork_exit
- addl $12,%esp
- /* cut from syscall */
-
- /*
- * Return via doreti to handle ASTs.
- */
- MEXITCOUNT
- jmp doreti
-
-
-/*
- * To efficiently implement classification of trap and interrupt handlers
- * for profiling, there must be only trap handlers between the labels btrap
- * and bintr, and only interrupt handlers between the labels bintr and
- * eintr. This is implemented (partly) by including files that contain
- * some of the handlers. Before including the files, set up a normal asm
- * environment so that the included files doen't need to know that they are
- * included.
- */
-
- .data
- .p2align 4
- .text
- SUPERALIGN_TEXT
-MCOUNT_LABEL(bintr)
-
-#ifdef DEV_APIC
- .data
- .p2align 4
- .text
- SUPERALIGN_TEXT
-
-#include <i386/i386/apic_vector.s>
-#endif
-
- .data
- .p2align 4
- .text
- SUPERALIGN_TEXT
-#include <i386/i386/vm86bios.s>
-
- .text
-MCOUNT_LABEL(eintr)
-
-/*
- * void doreti(struct trapframe)
- *
- * Handle return from interrupts, traps and syscalls.
- */
- .text
- SUPERALIGN_TEXT
- .type doreti,@function
-doreti:
- FAKE_MCOUNT($bintr) /* init "from" bintr -> doreti */
-doreti_next:
-#ifdef notyet
- /*
- * Check if ASTs can be handled now. PSL_VM must be checked first
- * since segment registers only have an RPL in non-VM86 mode.
- */
- testl $PSL_VM,TF_EFLAGS(%esp) /* are we in vm86 mode? */
- jz doreti_notvm86
- movl PCPU(CURPCB),%ecx
- testl $PCB_VM86CALL,PCB_FLAGS(%ecx) /* are we in a vm86 call? */
- jz doreti_ast /* can handle ASTS now if not */
- jmp doreti_exit
-
-doreti_notvm86:
-#endif
- testb $SEL_RPL_MASK,TF_CS(%esp) /* are we returning to user mode? */
- jz doreti_exit /* can't handle ASTs now if not */
-
-doreti_ast:
- /*
- * Check for ASTs atomically with returning. Disabling CPU
- * interrupts provides sufficient locking even in the SMP case,
- * since we will be informed of any new ASTs by an IPI.
- */
- DISABLE_INTERRUPTS(%esi) /* cli */
- movl PCPU(CURTHREAD),%eax
- testl $TDF_ASTPENDING | TDF_NEEDRESCHED,TD_FLAGS(%eax)
- je doreti_exit
- ENABLE_INTERRUPTS(%esi) /* sti */
- pushl %esp /* pass a pointer to the trapframe */
- call ast
- add $4,%esp
- jmp doreti_ast
-
- /*
- * doreti_exit: pop registers, iret.
- *
- * The segment register pop is a special case, since it may
- * fault if (for example) a sigreturn specifies bad segment
- * registers. The fault is handled in trap.c.
- */
-doreti_exit:
- ENABLE_INTERRUPTS(%esi) # reenable event callbacks (sti)
-
- .globl scrit
-scrit:
- __TEST_PENDING(%esi)
- jnz hypervisor_callback_pending /* More to go */
-
- MEXITCOUNT
-
- .globl doreti_popl_fs
-doreti_popl_fs:
- popl %fs
- .globl doreti_popl_es
-doreti_popl_es:
- popl %es
- .globl doreti_popl_ds
-doreti_popl_ds:
- popl %ds
-
- /*
- * This is important: as nothing is atomic over here (we can get
- * interrupted any time), we use the critical_region_fixup() in
- * order to figure out where out stack is. Therefore, do NOT use
- * 'popal' here without fixing up the table!
- */
- POPA
- addl $8,%esp
- .globl doreti_iret
-doreti_iret:
- jmp hypercall_page + (__HYPERVISOR_iret * 32)
- .globl ecrit
-ecrit:
- /*
- * doreti_iret_fault and friends. Alternative return code for
- * the case where we get a fault in the doreti_exit code
- * above. trap() (i386/i386/trap.c) catches this specific
- * case, sends the process a signal and continues in the
- * corresponding place in the code below.
- */
- ALIGN_TEXT
- .globl doreti_iret_fault
-doreti_iret_fault:
- subl $8,%esp
- pushal
- pushl %ds
- .globl doreti_popl_ds_fault
-doreti_popl_ds_fault:
- pushl %es
- .globl doreti_popl_es_fault
-doreti_popl_es_fault:
- pushl %fs
- .globl doreti_popl_fs_fault
-doreti_popl_fs_fault:
- movl $0,TF_ERR(%esp) /* XXX should be the error code */
- movl $T_PROTFLT,TF_TRAPNO(%esp)
- jmp alltraps_with_regs_pushed
-
- /*
-# [How we do the fixup]. We want to merge the current stack frame with the
-# just-interrupted frame. How we do this depends on where in the critical
-# region the interrupted handler was executing, and so how many saved
-# registers are in each frame. We do this quickly using the lookup table
-# 'critical_fixup_table'. For each byte offset in the critical region, it
-# provides the number of bytes which have already been popped from the
-# interrupted stack frame.
-*/
-
-.globl critical_region_fixup
-critical_region_fixup:
- addl $critical_fixup_table-scrit,%eax
- movzbl (%eax),%eax # %eax contains num bytes popped
- movl %esp,%esi
- add %eax,%esi # %esi points at end of src region
- movl %esp,%edi
- add $0x40,%edi # %edi points at end of dst region
- movl %eax,%ecx
- shr $2,%ecx # convert bytes to words
- je 16f # skip loop if nothing to copy
-15: subl $4,%esi # pre-decrementing copy loop
- subl $4,%edi
- movl (%esi),%eax
- movl %eax,(%edi)
- loop 15b
-16: movl %edi,%esp # final %edi is top of merged stack
- jmp hypervisor_callback_pending
-
-
-critical_fixup_table:
-.byte 0x0,0x0,0x0 #testb $0x1,(%esi)
-.byte 0x0,0x0,0x0,0x0,0x0,0x0 #jne ea
-.byte 0x0,0x0 #pop %fs
-.byte 0x04 #pop %es
-.byte 0x08 #pop %ds
-.byte 0x0c #pop %edi
-.byte 0x10 #pop %esi
-.byte 0x14 #pop %ebp
-.byte 0x18 #pop %ebx
-.byte 0x1c #pop %ebx
-.byte 0x20 #pop %edx
-.byte 0x24 #pop %ecx
-.byte 0x28 #pop %eax
-.byte 0x2c,0x2c,0x2c #add $0x8,%esp
-#if 0
- .byte 0x34 #iret
-#endif
-.byte 0x34,0x34,0x34,0x34,0x34 #HYPERVISOR_iret
-
-
-/* # Hypervisor uses this for application faults while it executes.*/
-ENTRY(failsafe_callback)
- pushal
- call xen_failsafe_handler
-/*# call install_safe_pf_handler */
- movl 28(%esp),%ebx
-1: movl %ebx,%ds
- movl 32(%esp),%ebx
-2: movl %ebx,%es
- movl 36(%esp),%ebx
-3: movl %ebx,%fs
- movl 40(%esp),%ebx
-4: movl %ebx,%gs
-/*# call install_normal_pf_handler */
- popal
- addl $12,%esp
- iret
-
-
diff --git a/sys/i386/xen/locore.s b/sys/i386/xen/locore.s
deleted file mode 100644
index 7e67684..0000000
--- a/sys/i386/xen/locore.s
+++ /dev/null
@@ -1,360 +0,0 @@
-/*-
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * William Jolitz.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * from: @(#)locore.s 7.3 (Berkeley) 5/13/91
- * $FreeBSD$
- *
- * originally from: locore.s, by William F. Jolitz
- *
- * Substantially rewritten by David Greenman, Rod Grimes,
- * Bruce Evans, Wolfgang Solfrank, Poul-Henning Kamp
- * and many others.
- */
-
-#include "opt_bootp.h"
-#include "opt_compat.h"
-#include "opt_nfsroot.h"
-#include "opt_pmap.h"
-
-#include <sys/syscall.h>
-#include <sys/reboot.h>
-
-#include <machine/asmacros.h>
-#include <machine/cputypes.h>
-#include <machine/psl.h>
-#include <machine/pmap.h>
-#include <machine/specialreg.h>
-
-#define __ASSEMBLY__
-#include <xen/interface/elfnote.h>
-
-/* The defines below have been lifted out of <machine/xen-public/arch-x86_32.h> */
-#define FLAT_RING1_CS 0xe019 /* GDT index 259 */
-#define FLAT_RING1_DS 0xe021 /* GDT index 260 */
-#define KERNEL_CS FLAT_RING1_CS
-#define KERNEL_DS FLAT_RING1_DS
-
-#include "assym.s"
-
-.section __xen_guest
- .ascii "LOADER=generic,GUEST_OS=freebsd,GUEST_VER=7.0,XEN_VER=xen-3.0,BSD_SYMTAB,VIRT_BASE=0xc0000000"
- .byte 0
-
- ELFNOTE(Xen, XEN_ELFNOTE_GUEST_OS, .asciz, "FreeBSD")
- ELFNOTE(Xen, XEN_ELFNOTE_GUEST_VERSION, .asciz, "HEAD")
- ELFNOTE(Xen, XEN_ELFNOTE_XEN_VERSION, .asciz, "xen-3.0")
- ELFNOTE(Xen, XEN_ELFNOTE_VIRT_BASE, .long, KERNBASE)
- ELFNOTE(Xen, XEN_ELFNOTE_PADDR_OFFSET, .long, KERNBASE)
- ELFNOTE(Xen, XEN_ELFNOTE_ENTRY, .long, btext)
- ELFNOTE(Xen, XEN_ELFNOTE_HYPERCALL_PAGE, .long, hypercall_page)
- ELFNOTE(Xen, XEN_ELFNOTE_HV_START_LOW, .long, XEN_HYPERVISOR_VIRT_START)
-#if 0
- ELFNOTE(Xen, XEN_ELFNOTE_FEATURES, .asciz, "writable_page_tables|writable_descriptor_tables|auto_translated_physmap|pae_pgdir_above_4gb|supervisor_mode_kernel")
-#endif
- ELFNOTE(Xen, XEN_ELFNOTE_FEATURES, .asciz, "writable_page_tables|supervisor_mode_kernel|writable_descriptor_tables")
-
-#ifdef PAE
- ELFNOTE(Xen, XEN_ELFNOTE_PAE_MODE, .asciz, "yes")
- ELFNOTE(Xen, XEN_ELFNOTE_L1_MFN_VALID, .long, PG_V, PG_V)
-#else
- ELFNOTE(Xen, XEN_ELFNOTE_PAE_MODE, .asciz, "no")
- ELFNOTE(Xen, XEN_ELFNOTE_L1_MFN_VALID, .long, PG_V, PG_V)
-#endif
- ELFNOTE(Xen, XEN_ELFNOTE_LOADER, .asciz, "generic")
- ELFNOTE(Xen, XEN_ELFNOTE_SUSPEND_CANCEL, .long, 1)
-
-
-
-/*
- * XXX
- *
- * Note: This version greatly munged to avoid various assembler errors
- * that may be fixed in newer versions of gas. Perhaps newer versions
- * will have more pleasant appearance.
- */
-
-/*
- * PTmap is recursive pagemap at top of virtual address space.
- * Within PTmap, the page directory can be found (third indirection).
- */
- .globl PTmap,PTD,PTDpde
- .set PTmap,(PTDPTDI << PDRSHIFT)
- .set PTD,PTmap + (PTDPTDI * PAGE_SIZE)
- .set PTDpde,PTD + (PTDPTDI * PDESIZE)
-
-/*
- * Compiled KERNBASE location and the kernel load address
- */
- .globl kernbase
- .set kernbase,KERNBASE
- .globl kernload
- .set kernload,KERNLOAD
-
-/*
- * Globals
- */
- .data
- ALIGN_DATA /* just to be sure */
-
- .space 0x2000 /* space for tmpstk - temporary stack */
-tmpstk:
-
- .globl bootinfo
-bootinfo: .space BOOTINFO_SIZE /* bootinfo that we can handle */
-
- .globl KERNend
-KERNend: .long 0 /* phys addr end of kernel (just after bss) */
- .globl physfree
-physfree: .long 0 /* phys addr of next free page */
-
- .globl IdlePTD
-IdlePTD: .long 0 /* phys addr of kernel PTD */
-
-#ifdef PAE
- .globl IdlePDPT
-IdlePDPT: .long 0 /* phys addr of kernel PDPT */
-#endif
-
-#ifdef SMP
- .globl KPTphys
-#endif
-KPTphys: .long 0 /* phys addr of kernel page tables */
- .globl gdtset
-gdtset: .long 0 /* GDT is valid */
-
- .globl proc0kstack
-proc0kstack: .long 0 /* address of proc 0 kstack space */
-p0kpa: .long 0 /* phys addr of proc0's STACK */
-
-vm86phystk: .long 0 /* PA of vm86/bios stack */
-
- .globl vm86paddr, vm86pa
-vm86paddr: .long 0 /* address of vm86 region */
-vm86pa: .long 0 /* phys addr of vm86 region */
-
-#ifdef PC98
- .globl pc98_system_parameter
-pc98_system_parameter:
- .space 0x240
-#endif
-
- .globl avail_space
-avail_space: .long 0
-
-/**********************************************************************
- *
- * Some handy macros
- *
- */
-
-/*
- * We're already in protected mode, so no remapping is needed.
- */
-#define R(foo) (foo)
-
-#define ALLOCPAGES(foo) \
- movl R(physfree), %esi ; \
- movl $((foo)*PAGE_SIZE), %eax ; \
- addl %esi, %eax ; \
- movl %eax, R(physfree) ; \
- movl %esi, %edi ; \
- movl $((foo)*PAGE_SIZE),%ecx ; \
- xorl %eax,%eax ; \
- cld ; \
- rep ; \
- stosb
-
-/*
- * fillkpt
- * eax = page frame address
- * ebx = index into page table
- * ecx = how many pages to map
- * base = base address of page dir/table
- * prot = protection bits
- */
-#define fillkpt(base, prot) \
- shll $PTESHIFT,%ebx ; \
- addl base,%ebx ; \
- orl $PG_V,%eax ; \
- orl prot,%eax ; \
-1: movl %eax,(%ebx) ; \
- addl $PAGE_SIZE,%eax ; /* increment physical address */ \
- addl $PTESIZE,%ebx ; /* next pte */ \
- loop 1b
-
-/*
- * fillkptphys(prot)
- * eax = physical address
- * ecx = how many pages to map
- * prot = protection bits
- */
-#define fillkptphys(prot) \
- movl %eax, %ebx ; \
- shrl $PAGE_SHIFT, %ebx ; \
- fillkpt(R(KPTphys), prot)
-
-/* Temporary stack */
-.space 8192
-tmpstack:
- .long tmpstack, KERNEL_DS
-
- .text
-
-.p2align 12, 0x90
-
-#define HYPERCALL_PAGE_OFFSET 0x1000
-.org HYPERCALL_PAGE_OFFSET
-ENTRY(hypercall_page)
- .cfi_startproc
- .skip 0x1000
- .cfi_endproc
-
-/**********************************************************************
- *
- * This is where the bootblocks start us, set the ball rolling...
- *
- */
-NON_GPROF_ENTRY(btext)
- /* At the end of our stack, we shall have free space - so store it */
- movl %esp,%ebx
- movl %ebx,R(avail_space)
-
- lss tmpstack,%esp
-
- pushl %esi
- call initvalues
- popl %esi
-
- /* Store the CPUID information */
- xorl %eax,%eax
- cpuid # cpuid 0
- movl %eax,R(cpu_high) # highest capability
- movl %ebx,R(cpu_vendor) # store vendor string
- movl %edx,R(cpu_vendor+4)
- movl %ecx,R(cpu_vendor+8)
- movb $0,R(cpu_vendor+12)
-
- movl $1,%eax
- cpuid # cpuid 1
- movl %eax,R(cpu_id) # store cpu_id
- movl %ebx,R(cpu_procinfo) # store cpu_procinfo
- movl %edx,R(cpu_feature) # store cpu_feature
- movl %ecx,R(cpu_feature2) # store cpu_feature2
- rorl $8,%eax # extract family type
- andl $15,%eax
- cmpl $5,%eax
- movl $CPU_686,R(cpu)
-
- movl proc0kstack,%eax
- leal (KSTACK_PAGES*PAGE_SIZE-PCB_SIZE)(%eax),%esp
- xorl %ebp,%ebp /* mark end of frames */
-#ifdef PAE
- movl IdlePDPT,%esi
-#else
- movl IdlePTD,%esi
-#endif
- movl %esi,(KSTACK_PAGES*PAGE_SIZE-PCB_SIZE+PCB_CR3)(%eax)
- pushl physfree
- call init386
- addl $4, %esp
- call mi_startup
- /* NOTREACHED */
- int $3
-
-/*
- * Signal trampoline, copied to top of user stack
- */
-NON_GPROF_ENTRY(sigcode)
- calll *SIGF_HANDLER(%esp)
- leal SIGF_UC(%esp),%eax /* get ucontext */
- pushl %eax
- testl $PSL_VM,UC_EFLAGS(%eax)
- jne 1f
- mov UC_GS(%eax), %gs /* restore %gs */
-1:
- movl $SYS_sigreturn,%eax
- pushl %eax /* junk to fake return addr. */
- int $0x80 /* enter kernel with args */
- /* on stack */
-1:
- jmp 1b
-
-#ifdef COMPAT_FREEBSD4
- ALIGN_TEXT
-freebsd4_sigcode:
- calll *SIGF_HANDLER(%esp)
- leal SIGF_UC4(%esp),%eax /* get ucontext */
- pushl %eax
- testl $PSL_VM,UC4_EFLAGS(%eax)
- jne 1f
- mov UC4_GS(%eax),%gs /* restore %gs */
-1:
- movl $344,%eax /* 4.x SYS_sigreturn */
- pushl %eax /* junk to fake return addr. */
- int $0x80 /* enter kernel with args */
- /* on stack */
-1:
- jmp 1b
-#endif
-
-#ifdef COMPAT_43
- ALIGN_TEXT
-osigcode:
- call *SIGF_HANDLER(%esp) /* call signal handler */
- lea SIGF_SC(%esp),%eax /* get sigcontext */
- pushl %eax
- testl $PSL_VM,SC_PS(%eax)
- jne 9f
- movl SC_GS(%eax),%gs /* restore %gs */
-9:
- movl $103,%eax /* 3.x SYS_sigreturn */
- pushl %eax /* junk to fake return addr. */
- int $0x80 /* enter kernel with args */
-0: jmp 0b
-#endif /* COMPAT_43 */
-
- ALIGN_TEXT
-esigcode:
-
- .data
- .globl szsigcode
-szsigcode:
- .long esigcode-sigcode
-#ifdef COMPAT_FREEBSD4
- .globl szfreebsd4_sigcode
-szfreebsd4_sigcode:
- .long esigcode-freebsd4_sigcode
-#endif
-#ifdef COMPAT_43
- .globl szosigcode
-szosigcode:
- .long esigcode-osigcode
-#endif
diff --git a/sys/i386/xen/mp_machdep.c b/sys/i386/xen/mp_machdep.c
deleted file mode 100644
index e391981..0000000
--- a/sys/i386/xen/mp_machdep.c
+++ /dev/null
@@ -1,1309 +0,0 @@
-/*-
- * Copyright (c) 1996, by Steve Passe
- * Copyright (c) 2008, by Kip Macy
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. The name of the developer may NOT be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include "opt_apic.h"
-#include "opt_cpu.h"
-#include "opt_kstack_pages.h"
-#include "opt_mp_watchdog.h"
-#include "opt_pmap.h"
-#include "opt_sched.h"
-#include "opt_smp.h"
-
-#if !defined(lint)
-#if !defined(SMP)
-#error How did you get here?
-#endif
-
-#ifndef DEV_APIC
-#error The apic device is required for SMP, add "device apic" to your config file.
-#endif
-#if defined(CPU_DISABLE_CMPXCHG) && !defined(COMPILING_LINT)
-#error SMP not supported with CPU_DISABLE_CMPXCHG
-#endif
-#endif /* not lint */
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/bus.h>
-#include <sys/cons.h> /* cngetc() */
-#include <sys/cpuset.h>
-#ifdef GPROF
-#include <sys/gmon.h>
-#endif
-#include <sys/kernel.h>
-#include <sys/ktr.h>
-#include <sys/lock.h>
-#include <sys/malloc.h>
-#include <sys/memrange.h>
-#include <sys/mutex.h>
-#include <sys/pcpu.h>
-#include <sys/proc.h>
-#include <sys/rwlock.h>
-#include <sys/sched.h>
-#include <sys/smp.h>
-#include <sys/sysctl.h>
-
-#include <vm/vm.h>
-#include <vm/vm_param.h>
-#include <vm/pmap.h>
-#include <vm/vm_kern.h>
-#include <vm/vm_extern.h>
-#include <vm/vm_page.h>
-
-#include <x86/apicreg.h>
-#include <machine/md_var.h>
-#include <machine/mp_watchdog.h>
-#include <machine/pcb.h>
-#include <machine/psl.h>
-#include <machine/smp.h>
-#include <machine/specialreg.h>
-#include <machine/pcpu.h>
-
-#include <xen/xen-os.h>
-#include <xen/evtchn.h>
-#include <xen/xen_intr.h>
-#include <xen/hypervisor.h>
-#include <xen/interface/vcpu.h>
-
-/*---------------------------- Extern Declarations ---------------------------*/
-extern struct pcpu __pcpu[];
-
-extern void Xhypervisor_callback(void);
-extern void failsafe_callback(void);
-extern void pmap_lazyfix_action(void);
-
-/*--------------------------- Forward Declarations ---------------------------*/
-static driver_filter_t smp_reschedule_interrupt;
-static driver_filter_t smp_call_function_interrupt;
-static void assign_cpu_ids(void);
-static void set_interrupt_apic_ids(void);
-static int start_all_aps(void);
-static int start_ap(int apic_id);
-static void release_aps(void *dummy);
-
-/*---------------------------------- Macros ----------------------------------*/
-#define IPI_TO_IDX(ipi) ((ipi) - APIC_IPI_INTS)
-
-/*-------------------------------- Local Types -------------------------------*/
-typedef void call_data_func_t(uintptr_t , uintptr_t);
-
-struct cpu_info {
- int cpu_present:1;
- int cpu_bsp:1;
- int cpu_disabled:1;
-};
-
-struct xen_ipi_handler
-{
- driver_filter_t *filter;
- const char *description;
-};
-
-enum {
- RESCHEDULE_VECTOR,
- CALL_FUNCTION_VECTOR,
-};
-
-/*-------------------------------- Global Data -------------------------------*/
-static u_int hyperthreading_cpus;
-static cpuset_t hyperthreading_cpus_mask;
-
-int mp_naps; /* # of Applications processors */
-int boot_cpu_id = -1; /* designated BSP */
-
-static int bootAP;
-static union descriptor *bootAPgdt;
-
-/* Free these after use */
-void *bootstacks[MAXCPU];
-
-struct pcb stoppcbs[MAXCPU];
-
-/* Variables needed for SMP tlb shootdown. */
-vm_offset_t smp_tlb_addr1;
-vm_offset_t smp_tlb_addr2;
-volatile int smp_tlb_wait;
-
-static u_int logical_cpus;
-static volatile cpuset_t ipi_nmi_pending;
-
-/* used to hold the AP's until we are ready to release them */
-static struct mtx ap_boot_mtx;
-
-/* Set to 1 once we're ready to let the APs out of the pen. */
-static volatile int aps_ready = 0;
-
-/*
- * Store data from cpu_add() until later in the boot when we actually setup
- * the APs.
- */
-static struct cpu_info cpu_info[MAX_APIC_ID + 1];
-int cpu_apic_ids[MAXCPU];
-int apic_cpuids[MAX_APIC_ID + 1];
-
-/* Holds pending bitmap based IPIs per CPU */
-static volatile u_int cpu_ipi_pending[MAXCPU];
-
-static int cpu_logical;
-static int cpu_cores;
-
-static const struct xen_ipi_handler xen_ipis[] =
-{
- [RESCHEDULE_VECTOR] = { smp_reschedule_interrupt, "resched" },
- [CALL_FUNCTION_VECTOR] = { smp_call_function_interrupt,"callfunc" }
-};
-
-/*------------------------------- Per-CPU Data -------------------------------*/
-DPCPU_DEFINE(xen_intr_handle_t, ipi_handle[nitems(xen_ipis)]);
-DPCPU_DEFINE(struct vcpu_info *, vcpu_info);
-
-/*------------------------------ Implementation ------------------------------*/
-struct cpu_group *
-cpu_topo(void)
-{
- if (cpu_cores == 0)
- cpu_cores = 1;
- if (cpu_logical == 0)
- cpu_logical = 1;
- if (mp_ncpus % (cpu_cores * cpu_logical) != 0) {
- printf("WARNING: Non-uniform processors.\n");
- printf("WARNING: Using suboptimal topology.\n");
- return (smp_topo_none());
- }
- /*
- * No multi-core or hyper-threaded.
- */
- if (cpu_logical * cpu_cores == 1)
- return (smp_topo_none());
- /*
- * Only HTT no multi-core.
- */
- if (cpu_logical > 1 && cpu_cores == 1)
- return (smp_topo_1level(CG_SHARE_L1, cpu_logical, CG_FLAG_HTT));
- /*
- * Only multi-core no HTT.
- */
- if (cpu_cores > 1 && cpu_logical == 1)
- return (smp_topo_1level(CG_SHARE_NONE, cpu_cores, 0));
- /*
- * Both HTT and multi-core.
- */
- return (smp_topo_2level(CG_SHARE_NONE, cpu_cores,
- CG_SHARE_L1, cpu_logical, CG_FLAG_HTT));
-}
-
-/*
- * Calculate usable address in base memory for AP trampoline code.
- */
-u_int
-mp_bootaddress(u_int basemem)
-{
-
- return (basemem);
-}
-
-void
-cpu_add(u_int apic_id, char boot_cpu)
-{
-
- if (apic_id > MAX_APIC_ID) {
- panic("SMP: APIC ID %d too high", apic_id);
- return;
- }
- KASSERT(cpu_info[apic_id].cpu_present == 0, ("CPU %d added twice",
- apic_id));
- cpu_info[apic_id].cpu_present = 1;
- if (boot_cpu) {
- KASSERT(boot_cpu_id == -1,
- ("CPU %d claims to be BSP, but CPU %d already is", apic_id,
- boot_cpu_id));
- boot_cpu_id = apic_id;
- cpu_info[apic_id].cpu_bsp = 1;
- }
- if (mp_ncpus < MAXCPU)
- mp_ncpus++;
- if (bootverbose)
- printf("SMP: Added CPU %d (%s)\n", apic_id, boot_cpu ? "BSP" :
- "AP");
-}
-
-void
-cpu_mp_setmaxid(void)
-{
-
- mp_maxid = MAXCPU - 1;
-}
-
-int
-cpu_mp_probe(void)
-{
-
- /*
- * Always record BSP in CPU map so that the mbuf init code works
- * correctly.
- */
- CPU_SETOF(0, &all_cpus);
- if (mp_ncpus == 0) {
- /*
- * No CPUs were found, so this must be a UP system. Setup
- * the variables to represent a system with a single CPU
- * with an id of 0.
- */
- mp_ncpus = 1;
- return (0);
- }
-
- /* At least one CPU was found. */
- if (mp_ncpus == 1) {
- /*
- * One CPU was found, so this must be a UP system with
- * an I/O APIC.
- */
- return (0);
- }
-
- /* At least two CPUs were found. */
- return (1);
-}
-
-/*
- * Initialize the IPI handlers and start up the AP's.
- */
-void
-cpu_mp_start(void)
-{
- int i;
-
- /* Initialize the logical ID to APIC ID table. */
- for (i = 0; i < MAXCPU; i++) {
- cpu_apic_ids[i] = -1;
- cpu_ipi_pending[i] = 0;
- }
-
- /* Set boot_cpu_id if needed. */
- if (boot_cpu_id == -1) {
- boot_cpu_id = PCPU_GET(apic_id);
- cpu_info[boot_cpu_id].cpu_bsp = 1;
- } else
- KASSERT(boot_cpu_id == PCPU_GET(apic_id),
- ("BSP's APIC ID doesn't match boot_cpu_id"));
- cpu_apic_ids[0] = boot_cpu_id;
- apic_cpuids[boot_cpu_id] = 0;
-
- assign_cpu_ids();
-
- /* Start each Application Processor */
- start_all_aps();
-
- /* Setup the initial logical CPUs info. */
- logical_cpus = 0;
- CPU_ZERO(&logical_cpus_mask);
- if (cpu_feature & CPUID_HTT)
- logical_cpus = (cpu_procinfo & CPUID_HTT_CORES) >> 16;
-
- set_interrupt_apic_ids();
-}
-
-
-static void
-iv_rendezvous(uintptr_t a, uintptr_t b)
-{
- smp_rendezvous_action();
-}
-
-static void
-iv_invltlb(uintptr_t a, uintptr_t b)
-{
- xen_tlb_flush();
-}
-
-static void
-iv_invlpg(uintptr_t a, uintptr_t b)
-{
- xen_invlpg(a);
-}
-
-static void
-iv_invlrng(uintptr_t a, uintptr_t b)
-{
- vm_offset_t start = (vm_offset_t)a;
- vm_offset_t end = (vm_offset_t)b;
-
- while (start < end) {
- xen_invlpg(start);
- start += PAGE_SIZE;
- }
-}
-
-
-static void
-iv_invlcache(uintptr_t a, uintptr_t b)
-{
-
- wbinvd();
- atomic_add_int(&smp_tlb_wait, 1);
-}
-
-static void
-iv_lazypmap(uintptr_t a, uintptr_t b)
-{
- pmap_lazyfix_action();
- atomic_add_int(&smp_tlb_wait, 1);
-}
-
-/*
- * These start from "IPI offset" APIC_IPI_INTS
- */
-static call_data_func_t *ipi_vectors[6] =
-{
- iv_rendezvous,
- iv_invltlb,
- iv_invlpg,
- iv_invlrng,
- iv_invlcache,
- iv_lazypmap,
-};
-
-/*
- * Reschedule call back. Nothing to do,
- * all the work is done automatically when
- * we return from the interrupt.
- */
-static int
-smp_reschedule_interrupt(void *unused)
-{
- int cpu = PCPU_GET(cpuid);
- u_int ipi_bitmap;
-
- ipi_bitmap = atomic_readandclear_int(&cpu_ipi_pending[cpu]);
-
- if (ipi_bitmap & (1 << IPI_PREEMPT)) {
-#ifdef COUNT_IPIS
- (*ipi_preempt_counts[cpu])++;
-#endif
- sched_preempt(curthread);
- }
-
- if (ipi_bitmap & (1 << IPI_AST)) {
-#ifdef COUNT_IPIS
- (*ipi_ast_counts[cpu])++;
-#endif
- /* Nothing to do for AST */
- }
- return (FILTER_HANDLED);
-}
-
-struct _call_data {
- uint16_t func_id;
- uint16_t wait;
- uintptr_t arg1;
- uintptr_t arg2;
- atomic_t started;
- atomic_t finished;
-};
-
-static struct _call_data *call_data;
-
-static int
-smp_call_function_interrupt(void *unused)
-{
- call_data_func_t *func;
- uintptr_t arg1 = call_data->arg1;
- uintptr_t arg2 = call_data->arg2;
- int wait = call_data->wait;
- atomic_t *started = &call_data->started;
- atomic_t *finished = &call_data->finished;
-
- /* We only handle function IPIs, not bitmap IPIs */
- if (call_data->func_id < APIC_IPI_INTS ||
- call_data->func_id > IPI_BITMAP_VECTOR)
- panic("invalid function id %u", call_data->func_id);
-
- func = ipi_vectors[IPI_TO_IDX(call_data->func_id)];
- /*
- * Notify initiating CPU that I've grabbed the data and am
- * about to execute the function
- */
- mb();
- atomic_inc(started);
- /*
- * At this point the info structure may be out of scope unless wait==1
- */
- (*func)(arg1, arg2);
-
- if (wait) {
- mb();
- atomic_inc(finished);
- }
- atomic_add_int(&smp_tlb_wait, 1);
- return (FILTER_HANDLED);
-}
-
-/*
- * Print various information about the SMP system hardware and setup.
- */
-void
-cpu_mp_announce(void)
-{
- int i, x;
-
- /* List CPUs */
- printf(" cpu0 (BSP): APIC ID: %2d\n", boot_cpu_id);
- for (i = 1, x = 0; x <= MAX_APIC_ID; x++) {
- if (!cpu_info[x].cpu_present || cpu_info[x].cpu_bsp)
- continue;
- if (cpu_info[x].cpu_disabled)
- printf(" cpu (AP): APIC ID: %2d (disabled)\n", x);
- else {
- KASSERT(i < mp_ncpus,
- ("mp_ncpus and actual cpus are out of whack"));
- printf(" cpu%d (AP): APIC ID: %2d\n", i++, x);
- }
- }
-}
-
-static int
-xen_smp_cpu_init(unsigned int cpu)
-{
- xen_intr_handle_t *ipi_handle;
- const struct xen_ipi_handler *ipi;
- int idx, rc;
-
- ipi_handle = DPCPU_ID_GET(cpu, ipi_handle);
- for (ipi = xen_ipis, idx = 0; idx < nitems(xen_ipis); ipi++, idx++) {
-
- /*
- * The PCPU variable pc_device is not initialized on i386 PV,
- * so we have to use the root_bus device in order to setup
- * the IPIs.
- */
- rc = xen_intr_alloc_and_bind_ipi(root_bus, cpu,
- ipi->filter, INTR_TYPE_TTY, &ipi_handle[idx]);
- if (rc != 0) {
- printf("Unable to allocate a XEN IPI port. "
- "Error %d\n", rc);
- break;
- }
- xen_intr_describe(ipi_handle[idx], "%s", ipi->description);
- }
-
- for (;idx < nitems(xen_ipis); idx++)
- ipi_handle[idx] = NULL;
-
- if (rc == 0)
- return (0);
-
- /* Either all are successfully mapped, or none at all. */
- for (idx = 0; idx < nitems(xen_ipis); idx++) {
- if (ipi_handle[idx] == NULL)
- continue;
-
- xen_intr_unbind(ipi_handle[idx]);
- ipi_handle[idx] = NULL;
- }
-
- return (rc);
-}
-
-static void
-xen_smp_intr_init_cpus(void *unused)
-{
- int i;
-
- for (i = 0; i < mp_ncpus; i++)
- xen_smp_cpu_init(i);
-}
-
-static void
-xen_smp_intr_setup_cpus(void *unused)
-{
- int i;
-
- for (i = 0; i < mp_ncpus; i++)
- DPCPU_ID_SET(i, vcpu_info,
- &HYPERVISOR_shared_info->vcpu_info[i]);
-}
-
-#define MTOPSIZE (1<<(14 + PAGE_SHIFT))
-
-/*
- * AP CPU's call this to initialize themselves.
- */
-void
-init_secondary(void)
-{
- vm_offset_t addr;
- u_int cpuid;
- int gsel_tss;
-
-
- /* bootAP is set in start_ap() to our ID. */
- PCPU_SET(currentldt, _default_ldt);
- gsel_tss = GSEL(GPROC0_SEL, SEL_KPL);
-#if 0
- gdt[bootAP * NGDT + GPROC0_SEL].sd.sd_type = SDT_SYS386TSS;
-#endif
- PCPU_SET(common_tss.tss_esp0, 0); /* not used until after switch */
- PCPU_SET(common_tss.tss_ss0, GSEL(GDATA_SEL, SEL_KPL));
- PCPU_SET(common_tss.tss_ioopt, (sizeof (struct i386tss)) << 16);
-#if 0
- PCPU_SET(tss_gdt, &gdt[bootAP * NGDT + GPROC0_SEL].sd);
-
- PCPU_SET(common_tssd, *PCPU_GET(tss_gdt));
-#endif
- PCPU_SET(fsgs_gdt, &gdt[GUFS_SEL].sd);
-
- /*
- * Set to a known state:
- * Set by mpboot.s: CR0_PG, CR0_PE
- * Set by cpu_setregs: CR0_NE, CR0_MP, CR0_TS, CR0_WP, CR0_AM
- */
- /*
- * signal our startup to the BSP.
- */
- mp_naps++;
-
- /* Spin until the BSP releases the AP's. */
- while (!aps_ready)
- ia32_pause();
-
- /* BSP may have changed PTD while we were waiting */
- invltlb();
- for (addr = 0; addr < NKPT * NBPDR - 1; addr += PAGE_SIZE)
- invlpg(addr);
-
-#if 0
- /* set up SSE/NX */
- initializecpu();
-#endif
-
- /* set up FPU state on the AP */
- npxinit(false);
-#if 0
- /* A quick check from sanity claus */
- if (PCPU_GET(apic_id) != lapic_id()) {
- printf("SMP: cpuid = %d\n", PCPU_GET(cpuid));
- printf("SMP: actual apic_id = %d\n", lapic_id());
- printf("SMP: correct apic_id = %d\n", PCPU_GET(apic_id));
- panic("cpuid mismatch! boom!!");
- }
-#endif
-
- /* Initialize curthread. */
- KASSERT(PCPU_GET(idlethread) != NULL, ("no idle thread"));
- PCPU_SET(curthread, PCPU_GET(idlethread));
-
- mtx_lock_spin(&ap_boot_mtx);
-#if 0
-
- /* Init local apic for irq's */
- lapic_setup(1);
-#endif
- smp_cpus++;
-
- cpuid = PCPU_GET(cpuid);
- CTR1(KTR_SMP, "SMP: AP CPU #%d Launched", cpuid);
- printf("SMP: AP CPU #%d Launched!\n", cpuid);
-
- /* Determine if we are a logical CPU. */
- if (logical_cpus > 1 && PCPU_GET(apic_id) % logical_cpus != 0)
- CPU_SET(cpuid, &logical_cpus_mask);
-
- /* Determine if we are a hyperthread. */
- if (hyperthreading_cpus > 1 &&
- PCPU_GET(apic_id) % hyperthreading_cpus != 0)
- CPU_SET(cpuid, &hyperthreading_cpus_mask);
-#if 0
- if (bootverbose)
- lapic_dump("AP");
-#endif
- if (smp_cpus == mp_ncpus) {
- /* enable IPI's, tlb shootdown, freezes etc */
- atomic_store_rel_int(&smp_started, 1);
- }
-
- mtx_unlock_spin(&ap_boot_mtx);
-
- /* wait until all the AP's are up */
- while (smp_started == 0)
- ia32_pause();
-
- PCPU_SET(curthread, PCPU_GET(idlethread));
-
- /* Start per-CPU event timers. */
- cpu_initclocks_ap();
-
- /* enter the scheduler */
- sched_throw(NULL);
-
- panic("scheduler returned us to %s", __func__);
- /* NOTREACHED */
-}
-
-/*******************************************************************
- * local functions and data
- */
-
-/*
- * We tell the I/O APIC code about all the CPUs we want to receive
- * interrupts. If we don't want certain CPUs to receive IRQs we
- * can simply not tell the I/O APIC code about them in this function.
- * We also do not tell it about the BSP since it tells itself about
- * the BSP internally to work with UP kernels and on UP machines.
- */
-static void
-set_interrupt_apic_ids(void)
-{
- u_int i, apic_id;
-
- for (i = 0; i < MAXCPU; i++) {
- apic_id = cpu_apic_ids[i];
- if (apic_id == -1)
- continue;
- if (cpu_info[apic_id].cpu_bsp)
- continue;
- if (cpu_info[apic_id].cpu_disabled)
- continue;
-
- /* Don't let hyperthreads service interrupts. */
- if (hyperthreading_cpus > 1 &&
- apic_id % hyperthreading_cpus != 0)
- continue;
-
- intr_add_cpu(i);
- }
-}
-
-/*
- * Assign logical CPU IDs to local APICs.
- */
-static void
-assign_cpu_ids(void)
-{
- u_int i;
-
- /* Check for explicitly disabled CPUs. */
- for (i = 0; i <= MAX_APIC_ID; i++) {
- if (!cpu_info[i].cpu_present || cpu_info[i].cpu_bsp)
- continue;
-
- /* Don't use this CPU if it has been disabled by a tunable. */
- if (resource_disabled("lapic", i)) {
- cpu_info[i].cpu_disabled = 1;
- continue;
- }
- }
-
- /*
- * Assign CPU IDs to local APIC IDs and disable any CPUs
- * beyond MAXCPU. CPU 0 has already been assigned to the BSP,
- * so we only have to assign IDs for APs.
- */
- mp_ncpus = 1;
- for (i = 0; i <= MAX_APIC_ID; i++) {
- if (!cpu_info[i].cpu_present || cpu_info[i].cpu_bsp ||
- cpu_info[i].cpu_disabled)
- continue;
-
- if (mp_ncpus < MAXCPU) {
- cpu_apic_ids[mp_ncpus] = i;
- apic_cpuids[i] = mp_ncpus;
- mp_ncpus++;
- } else
- cpu_info[i].cpu_disabled = 1;
- }
- KASSERT(mp_maxid >= mp_ncpus - 1,
- ("%s: counters out of sync: max %d, count %d", __func__, mp_maxid,
- mp_ncpus));
-}
-
-/*
- * start each AP in our list
- */
-/* Lowest 1MB is already mapped: don't touch*/
-#define TMPMAP_START 1
-int
-start_all_aps(void)
-{
- int x,apic_id, cpu;
- struct pcpu *pc;
-
- mtx_init(&ap_boot_mtx, "ap boot", NULL, MTX_SPIN);
-
- /* set up temporary P==V mapping for AP boot */
- /* XXX this is a hack, we should boot the AP on its own stack/PTD */
-
- /* start each AP */
- for (cpu = 1; cpu < mp_ncpus; cpu++) {
- apic_id = cpu_apic_ids[cpu];
-
-
- bootAP = cpu;
- bootAPgdt = gdt + (512*cpu);
-
- /* Get per-cpu data */
- pc = &__pcpu[bootAP];
- pcpu_init(pc, bootAP, sizeof(struct pcpu));
- dpcpu_init((void *)kmem_malloc(kernel_arena, DPCPU_SIZE,
- M_WAITOK | M_ZERO), bootAP);
- pc->pc_apic_id = cpu_apic_ids[bootAP];
- pc->pc_vcpu_id = cpu_apic_ids[bootAP];
- pc->pc_prvspace = pc;
- pc->pc_curthread = 0;
-
- gdt_segs[GPRIV_SEL].ssd_base = (int) pc;
- gdt_segs[GPROC0_SEL].ssd_base = (int) &pc->pc_common_tss;
-
- PT_SET_MA(bootAPgdt, VTOM(bootAPgdt) | PG_V | PG_RW);
- bzero(bootAPgdt, PAGE_SIZE);
- for (x = 0; x < NGDT; x++)
- ssdtosd(&gdt_segs[x], &bootAPgdt[x].sd);
- PT_SET_MA(bootAPgdt, vtomach(bootAPgdt) | PG_V);
-#ifdef notyet
-
- if (HYPERVISOR_vcpu_op(VCPUOP_get_physid, cpu, &cpu_id) == 0) {
- apicid = xen_vcpu_physid_to_x86_apicid(cpu_id.phys_id);
- acpiid = xen_vcpu_physid_to_x86_acpiid(cpu_id.phys_id);
-#ifdef CONFIG_ACPI
- if (acpiid != 0xff)
- x86_acpiid_to_apicid[acpiid] = apicid;
-#endif
- }
-#endif
-
- /* attempt to start the Application Processor */
- if (!start_ap(cpu)) {
- printf("AP #%d (PHY# %d) failed!\n", cpu, apic_id);
- /* better panic as the AP may be running loose */
- printf("panic y/n? [y] ");
- if (cngetc() != 'n')
- panic("bye-bye");
- }
-
- CPU_SET(cpu, &all_cpus); /* record AP in CPU map */
- }
-
-
- pmap_invalidate_range(kernel_pmap, 0, NKPT * NBPDR - 1);
-
- /* number of APs actually started */
- return (mp_naps);
-}
-
-extern uint8_t *pcpu_boot_stack;
-extern trap_info_t trap_table[];
-
-static void
-smp_trap_init(trap_info_t *trap_ctxt)
-{
- const trap_info_t *t = trap_table;
-
- for (t = trap_table; t->address; t++) {
- trap_ctxt[t->vector].flags = t->flags;
- trap_ctxt[t->vector].cs = t->cs;
- trap_ctxt[t->vector].address = t->address;
- }
-}
-
-extern struct rwlock pvh_global_lock;
-extern int nkpt;
-static void
-cpu_initialize_context(unsigned int cpu)
-{
- /* vcpu_guest_context_t is too large to allocate on the stack.
- * Hence we allocate statically and protect it with a lock */
- vm_page_t m[NPGPTD + 2];
- static vcpu_guest_context_t ctxt;
- vm_offset_t boot_stack;
- vm_offset_t newPTD;
- vm_paddr_t ma[NPGPTD];
- int i;
-
- /*
- * Page 0,[0-3] PTD
- * Page 1, [4] boot stack
- * Page [5] PDPT
- *
- */
- for (i = 0; i < NPGPTD + 2; i++) {
- m[i] = vm_page_alloc(NULL, 0,
- VM_ALLOC_NORMAL | VM_ALLOC_NOOBJ | VM_ALLOC_WIRED |
- VM_ALLOC_ZERO);
-
- pmap_zero_page(m[i]);
-
- }
- boot_stack = kva_alloc(PAGE_SIZE);
- newPTD = kva_alloc(NPGPTD * PAGE_SIZE);
- ma[0] = VM_PAGE_TO_MACH(m[0])|PG_V;
-
-#ifdef PAE
- pmap_kenter(boot_stack, VM_PAGE_TO_PHYS(m[NPGPTD + 1]));
- for (i = 0; i < NPGPTD; i++) {
- ((vm_paddr_t *)boot_stack)[i] =
- ma[i] = VM_PAGE_TO_MACH(m[i])|PG_V;
- }
-#endif
-
- /*
- * Copy cpu0 IdlePTD to new IdlePTD - copying only
- * kernel mappings
- */
- pmap_qenter(newPTD, m, 4);
-
- memcpy((uint8_t *)newPTD + KPTDI*sizeof(vm_paddr_t),
- (uint8_t *)PTOV(IdlePTD) + KPTDI*sizeof(vm_paddr_t),
- nkpt*sizeof(vm_paddr_t));
-
- pmap_qremove(newPTD, 4);
- kva_free(newPTD, 4 * PAGE_SIZE);
- /*
- * map actual idle stack to boot_stack
- */
- pmap_kenter(boot_stack, VM_PAGE_TO_PHYS(m[NPGPTD]));
-
-
- xen_pgdpt_pin(VM_PAGE_TO_MACH(m[NPGPTD + 1]));
- rw_wlock(&pvh_global_lock);
- for (i = 0; i < 4; i++) {
- int pdir = (PTDPTDI + i) / NPDEPG;
- int curoffset = (PTDPTDI + i) % NPDEPG;
-
- xen_queue_pt_update((vm_paddr_t)
- ((ma[pdir] & ~PG_V) + (curoffset*sizeof(vm_paddr_t))),
- ma[i]);
- }
- PT_UPDATES_FLUSH();
- rw_wunlock(&pvh_global_lock);
-
- memset(&ctxt, 0, sizeof(ctxt));
- ctxt.flags = VGCF_IN_KERNEL;
- ctxt.user_regs.ds = GSEL(GDATA_SEL, SEL_KPL);
- ctxt.user_regs.es = GSEL(GDATA_SEL, SEL_KPL);
- ctxt.user_regs.fs = GSEL(GPRIV_SEL, SEL_KPL);
- ctxt.user_regs.gs = GSEL(GDATA_SEL, SEL_KPL);
- ctxt.user_regs.cs = GSEL(GCODE_SEL, SEL_KPL);
- ctxt.user_regs.ss = GSEL(GDATA_SEL, SEL_KPL);
- ctxt.user_regs.eip = (unsigned long)init_secondary;
- ctxt.user_regs.eflags = PSL_KERNEL | 0x1000; /* IOPL_RING1 */
-
- memset(&ctxt.fpu_ctxt, 0, sizeof(ctxt.fpu_ctxt));
-
- smp_trap_init(ctxt.trap_ctxt);
-
- ctxt.ldt_ents = 0;
- ctxt.gdt_frames[0] =
- (uint32_t)((uint64_t)vtomach(bootAPgdt) >> PAGE_SHIFT);
- ctxt.gdt_ents = 512;
-
-#ifdef __i386__
- ctxt.user_regs.esp = boot_stack + PAGE_SIZE;
-
- ctxt.kernel_ss = GSEL(GDATA_SEL, SEL_KPL);
- ctxt.kernel_sp = boot_stack + PAGE_SIZE;
-
- ctxt.event_callback_cs = GSEL(GCODE_SEL, SEL_KPL);
- ctxt.event_callback_eip = (unsigned long)Xhypervisor_callback;
- ctxt.failsafe_callback_cs = GSEL(GCODE_SEL, SEL_KPL);
- ctxt.failsafe_callback_eip = (unsigned long)failsafe_callback;
-
- ctxt.ctrlreg[3] = VM_PAGE_TO_MACH(m[NPGPTD + 1]);
-#else /* __x86_64__ */
- ctxt.user_regs.esp = idle->thread.rsp0 - sizeof(struct pt_regs);
- ctxt.kernel_ss = GSEL(GDATA_SEL, SEL_KPL);
- ctxt.kernel_sp = idle->thread.rsp0;
-
- ctxt.event_callback_eip = (unsigned long)hypervisor_callback;
- ctxt.failsafe_callback_eip = (unsigned long)failsafe_callback;
- ctxt.syscall_callback_eip = (unsigned long)system_call;
-
- ctxt.ctrlreg[3] = xen_pfn_to_cr3(virt_to_mfn(init_level4_pgt));
-
- ctxt.gs_base_kernel = (unsigned long)(cpu_pda(cpu));
-#endif
-
- printf("gdtpfn=%lx pdptpfn=%lx\n",
- ctxt.gdt_frames[0],
- ctxt.ctrlreg[3] >> PAGE_SHIFT);
-
- PANIC_IF(HYPERVISOR_vcpu_op(VCPUOP_initialise, cpu, &ctxt));
- DELAY(3000);
- PANIC_IF(HYPERVISOR_vcpu_op(VCPUOP_up, cpu, NULL));
-}
-
-/*
- * This function starts the AP (application processor) identified
- * by the APIC ID 'physicalCpu'. It does quite a "song and dance"
- * to accomplish this. This is necessary because of the nuances
- * of the different hardware we might encounter. It isn't pretty,
- * but it seems to work.
- */
-
-int cpus;
-static int
-start_ap(int apic_id)
-{
- int ms;
-
- /* used as a watchpoint to signal AP startup */
- cpus = mp_naps;
-
- cpu_initialize_context(apic_id);
-
- /* Wait up to 5 seconds for it to start. */
- for (ms = 0; ms < 5000; ms++) {
- if (mp_naps > cpus)
- return (1); /* return SUCCESS */
- DELAY(1000);
- }
- return (0); /* return FAILURE */
-}
-
-static void
-ipi_pcpu(int cpu, u_int ipi)
-{
- KASSERT((ipi <= nitems(xen_ipis)), ("invalid IPI"));
- xen_intr_signal(DPCPU_ID_GET(cpu, ipi_handle[ipi]));
-}
-
-/*
- * send an IPI to a specific CPU.
- */
-static void
-ipi_send_cpu(int cpu, u_int ipi)
-{
- u_int bitmap, old_pending, new_pending;
-
- if (IPI_IS_BITMAPED(ipi)) {
- bitmap = 1 << ipi;
- ipi = IPI_BITMAP_VECTOR;
- do {
- old_pending = cpu_ipi_pending[cpu];
- new_pending = old_pending | bitmap;
- } while (!atomic_cmpset_int(&cpu_ipi_pending[cpu],
- old_pending, new_pending));
- if (!old_pending)
- ipi_pcpu(cpu, RESCHEDULE_VECTOR);
- } else {
- KASSERT(call_data != NULL, ("call_data not set"));
- ipi_pcpu(cpu, CALL_FUNCTION_VECTOR);
- }
-}
-
-/*
- * Flush the TLB on all other CPU's
- */
-static void
-smp_tlb_shootdown(u_int vector, vm_offset_t addr1, vm_offset_t addr2)
-{
- u_int ncpu;
- struct _call_data data;
-
- ncpu = mp_ncpus - 1; /* does not shootdown self */
- if (ncpu < 1)
- return; /* no other cpus */
- if (!(read_eflags() & PSL_I))
- panic("%s: interrupts disabled", __func__);
- mtx_lock_spin(&smp_ipi_mtx);
- KASSERT(call_data == NULL, ("call_data isn't null?!"));
- call_data = &data;
- call_data->func_id = vector;
- call_data->arg1 = addr1;
- call_data->arg2 = addr2;
- atomic_store_rel_int(&smp_tlb_wait, 0);
- ipi_all_but_self(vector);
- while (smp_tlb_wait < ncpu)
- ia32_pause();
- call_data = NULL;
- mtx_unlock_spin(&smp_ipi_mtx);
-}
-
-static void
-smp_targeted_tlb_shootdown(cpuset_t mask, u_int vector, vm_offset_t addr1,
- vm_offset_t addr2)
-{
- int cpu, ncpu, othercpus;
- struct _call_data data;
-
- othercpus = mp_ncpus - 1;
- if (CPU_ISFULLSET(&mask)) {
- if (othercpus < 1)
- return;
- } else {
- CPU_CLR(PCPU_GET(cpuid), &mask);
- if (CPU_EMPTY(&mask))
- return;
- }
- if (!(read_eflags() & PSL_I))
- panic("%s: interrupts disabled", __func__);
- mtx_lock_spin(&smp_ipi_mtx);
- KASSERT(call_data == NULL, ("call_data isn't null?!"));
- call_data = &data;
- call_data->func_id = vector;
- call_data->arg1 = addr1;
- call_data->arg2 = addr2;
- atomic_store_rel_int(&smp_tlb_wait, 0);
- if (CPU_ISFULLSET(&mask)) {
- ncpu = othercpus;
- ipi_all_but_self(vector);
- } else {
- ncpu = 0;
- while ((cpu = CPU_FFS(&mask)) != 0) {
- cpu--;
- CPU_CLR(cpu, &mask);
- CTR3(KTR_SMP, "%s: cpu: %d ipi: %x", __func__, cpu,
- vector);
- ipi_send_cpu(cpu, vector);
- ncpu++;
- }
- }
- while (smp_tlb_wait < ncpu)
- ia32_pause();
- call_data = NULL;
- mtx_unlock_spin(&smp_ipi_mtx);
-}
-
-void
-smp_cache_flush(void)
-{
-
- if (smp_started)
- smp_tlb_shootdown(IPI_INVLCACHE, 0, 0);
-}
-
-void
-smp_invltlb(void)
-{
-
- if (smp_started) {
- smp_tlb_shootdown(IPI_INVLTLB, 0, 0);
- }
-}
-
-void
-smp_invlpg(vm_offset_t addr)
-{
-
- if (smp_started) {
- smp_tlb_shootdown(IPI_INVLPG, addr, 0);
- }
-}
-
-void
-smp_invlpg_range(vm_offset_t addr1, vm_offset_t addr2)
-{
-
- if (smp_started) {
- smp_tlb_shootdown(IPI_INVLRNG, addr1, addr2);
- }
-}
-
-void
-smp_masked_invltlb(cpuset_t mask)
-{
-
- if (smp_started) {
- smp_targeted_tlb_shootdown(mask, IPI_INVLTLB, 0, 0);
- }
-}
-
-void
-smp_masked_invlpg(cpuset_t mask, vm_offset_t addr)
-{
-
- if (smp_started) {
- smp_targeted_tlb_shootdown(mask, IPI_INVLPG, addr, 0);
- }
-}
-
-void
-smp_masked_invlpg_range(cpuset_t mask, vm_offset_t addr1, vm_offset_t addr2)
-{
-
- if (smp_started) {
- smp_targeted_tlb_shootdown(mask, IPI_INVLRNG, addr1, addr2);
- }
-}
-
-/*
- * send an IPI to a set of cpus.
- */
-void
-ipi_selected(cpuset_t cpus, u_int ipi)
-{
- int cpu;
-
- /*
- * IPI_STOP_HARD maps to a NMI and the trap handler needs a bit
- * of help in order to understand what is the source.
- * Set the mask of receiving CPUs for this purpose.
- */
- if (ipi == IPI_STOP_HARD)
- CPU_OR_ATOMIC(&ipi_nmi_pending, &cpus);
-
- while ((cpu = CPU_FFS(&cpus)) != 0) {
- cpu--;
- CPU_CLR(cpu, &cpus);
- CTR3(KTR_SMP, "%s: cpu: %d ipi: %x", __func__, cpu, ipi);
- ipi_send_cpu(cpu, ipi);
- }
-}
-
-/*
- * send an IPI to a specific CPU.
- */
-void
-ipi_cpu(int cpu, u_int ipi)
-{
-
- /*
- * IPI_STOP_HARD maps to a NMI and the trap handler needs a bit
- * of help in order to understand what is the source.
- * Set the mask of receiving CPUs for this purpose.
- */
- if (ipi == IPI_STOP_HARD)
- CPU_SET_ATOMIC(cpu, &ipi_nmi_pending);
-
- CTR3(KTR_SMP, "%s: cpu: %d ipi: %x", __func__, cpu, ipi);
- ipi_send_cpu(cpu, ipi);
-}
-
-/*
- * send an IPI to all CPUs EXCEPT myself
- */
-void
-ipi_all_but_self(u_int ipi)
-{
- cpuset_t other_cpus;
-
- /*
- * IPI_STOP_HARD maps to a NMI and the trap handler needs a bit
- * of help in order to understand what is the source.
- * Set the mask of receiving CPUs for this purpose.
- */
- other_cpus = all_cpus;
- CPU_CLR(PCPU_GET(cpuid), &other_cpus);
- if (ipi == IPI_STOP_HARD)
- CPU_OR_ATOMIC(&ipi_nmi_pending, &other_cpus);
-
- CTR2(KTR_SMP, "%s: ipi: %x", __func__, ipi);
- ipi_selected(other_cpus, ipi);
-}
-
-int
-ipi_nmi_handler()
-{
- u_int cpuid;
-
- /*
- * As long as there is not a simple way to know about a NMI's
- * source, if the bitmask for the current CPU is present in
- * the global pending bitword an IPI_STOP_HARD has been issued
- * and should be handled.
- */
- cpuid = PCPU_GET(cpuid);
- if (!CPU_ISSET(cpuid, &ipi_nmi_pending))
- return (1);
-
- CPU_CLR_ATOMIC(cpuid, &ipi_nmi_pending);
- cpustop_handler();
- return (0);
-}
-
-/*
- * Handle an IPI_STOP by saving our current context and spinning until we
- * are resumed.
- */
-void
-cpustop_handler(void)
-{
- int cpu;
-
- cpu = PCPU_GET(cpuid);
-
- savectx(&stoppcbs[cpu]);
-
- /* Indicate that we are stopped */
- CPU_SET_ATOMIC(cpu, &stopped_cpus);
-
- /* Wait for restart */
- while (!CPU_ISSET(cpu, &started_cpus))
- ia32_pause();
-
- CPU_CLR_ATOMIC(cpu, &started_cpus);
- CPU_CLR_ATOMIC(cpu, &stopped_cpus);
-
- if (cpu == 0 && cpustop_restartfunc != NULL) {
- cpustop_restartfunc();
- cpustop_restartfunc = NULL;
- }
-}
-
-/*
- * Handlers for TLB related IPIs
- *
- * On i386 Xen PV this are no-ops since this port doesn't support SMP.
- */
-void
-invltlb_handler(void)
-{
-}
-
-void
-invlpg_handler(void)
-{
-}
-
-void
-invlrng_handler(void)
-{
-}
-
-void
-invlcache_handler(void)
-{
-}
-
-/*
- * This is called once the rest of the system is up and running and we're
- * ready to let the AP's out of the pen.
- */
-static void
-release_aps(void *dummy __unused)
-{
-
- if (mp_ncpus == 1)
- return;
- atomic_store_rel_int(&aps_ready, 1);
- while (smp_started == 0)
- ia32_pause();
-}
-SYSINIT(start_aps, SI_SUB_SMP, SI_ORDER_FIRST, release_aps, NULL);
-SYSINIT(start_ipis, SI_SUB_SMP, SI_ORDER_ANY, xen_smp_intr_init_cpus, NULL);
-SYSINIT(start_cpu, SI_SUB_INTR, SI_ORDER_ANY, xen_smp_intr_setup_cpus, NULL);
diff --git a/sys/i386/xen/mptable.c b/sys/i386/xen/mptable.c
deleted file mode 100644
index 81d7c1b..0000000
--- a/sys/i386/xen/mptable.c
+++ /dev/null
@@ -1,109 +0,0 @@
-/*-
- * Copyright (c) 2003 John Baldwin <jhb@FreeBSD.org>
- * Copyright (c) 1996, by Steve Passe
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. The name of the developer may NOT be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/bus.h>
-#include <sys/kernel.h>
-
-#include <vm/vm.h>
-#include <vm/vm_param.h>
-#include <vm/pmap.h>
-
-#include <machine/frame.h>
-#include <machine/intr_machdep.h>
-#include <x86/apicvar.h>
-
-#include <xen/hypervisor.h>
-#include <xen/xen-os.h>
-#include <machine/smp.h>
-#include <xen/interface/vcpu.h>
-
-
-static int mptable_probe(void);
-static int mptable_probe_cpus(void);
-static void mptable_register(void *dummy);
-static int mptable_setup_local(void);
-static int mptable_setup_io(void);
-
-static struct apic_enumerator mptable_enumerator = {
- "MPTable",
- mptable_probe,
- mptable_probe_cpus,
- mptable_setup_local,
- mptable_setup_io
-};
-
-static int
-mptable_probe(void)
-{
-
- return (-100);
-}
-
-static int
-mptable_probe_cpus(void)
-{
- int i, rc;
-
- for (i = 0; i < MAXCPU; i++) {
- rc = HYPERVISOR_vcpu_op(VCPUOP_is_up, i, NULL);
- if (rc >= 0)
- cpu_add(i, (i == 0));
- }
-
- return (0);
-}
-
-/*
- * Initialize the local APIC on the BSP.
- */
-static int
-mptable_setup_local(void)
-{
-
- PCPU_SET(apic_id, 0);
- PCPU_SET(vcpu_id, 0);
- return (0);
-}
-
-static int
-mptable_setup_io(void)
-{
-
- return (0);
-}
-
-static void
-mptable_register(void *dummy __unused)
-{
-
- apic_register_enumerator(&mptable_enumerator);
-}
-SYSINIT(mptable_register, SI_SUB_TUNABLES - 1, SI_ORDER_FIRST, mptable_register,
- NULL);
diff --git a/sys/i386/xen/pmap.c b/sys/i386/xen/pmap.c
deleted file mode 100644
index 1dc50b2..0000000
--- a/sys/i386/xen/pmap.c
+++ /dev/null
@@ -1,4520 +0,0 @@
-/*-
- * Copyright (c) 1991 Regents of the University of California.
- * All rights reserved.
- * Copyright (c) 1994 John S. Dyson
- * All rights reserved.
- * Copyright (c) 1994 David Greenman
- * All rights reserved.
- * Copyright (c) 2005 Alan L. Cox <alc@cs.rice.edu>
- * All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * the Systems Programming Group of the University of Utah Computer
- * Science Department and William Jolitz of UUNET Technologies Inc.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * from: @(#)pmap.c 7.7 (Berkeley) 5/12/91
- */
-/*-
- * Copyright (c) 2003 Networks Associates Technology, Inc.
- * All rights reserved.
- *
- * This software was developed for the FreeBSD Project by Jake Burkholder,
- * Safeport Network Services, and Network Associates Laboratories, the
- * Security Research Division of Network Associates, Inc. under
- * DARPA/SPAWAR contract N66001-01-C-8035 ("CBOSS"), as part of the DARPA
- * CHATS research program.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * Manages physical address maps.
- *
- * Since the information managed by this module is
- * also stored by the logical address mapping module,
- * this module may throw away valid virtual-to-physical
- * mappings at almost any time. However, invalidations
- * of virtual-to-physical mappings must be done as
- * requested.
- *
- * In order to cope with hardware architectures which
- * make virtual-to-physical map invalidates expensive,
- * this module may delay invalidate or reduced protection
- * operations until such time as they are actually
- * necessary. This module is given full information as
- * to which processors are currently using which maps,
- * and to when physical maps must be made correct.
- */
-
-#include "opt_cpu.h"
-#include "opt_pmap.h"
-#include "opt_smp.h"
-#include "opt_xbox.h"
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/kernel.h>
-#include <sys/ktr.h>
-#include <sys/lock.h>
-#include <sys/malloc.h>
-#include <sys/mman.h>
-#include <sys/msgbuf.h>
-#include <sys/mutex.h>
-#include <sys/proc.h>
-#include <sys/rwlock.h>
-#include <sys/sf_buf.h>
-#include <sys/sx.h>
-#include <sys/vmmeter.h>
-#include <sys/sched.h>
-#include <sys/sysctl.h>
-#ifdef SMP
-#include <sys/smp.h>
-#else
-#include <sys/cpuset.h>
-#endif
-
-#include <vm/vm.h>
-#include <vm/vm_param.h>
-#include <vm/vm_kern.h>
-#include <vm/vm_page.h>
-#include <vm/vm_map.h>
-#include <vm/vm_object.h>
-#include <vm/vm_extern.h>
-#include <vm/vm_pageout.h>
-#include <vm/vm_pager.h>
-#include <vm/uma.h>
-
-#include <machine/cpu.h>
-#include <machine/cputypes.h>
-#include <machine/md_var.h>
-#include <machine/pcb.h>
-#include <machine/specialreg.h>
-#ifdef SMP
-#include <machine/smp.h>
-#endif
-
-#ifdef XBOX
-#include <machine/xbox.h>
-#endif
-
-#include <xen/interface/xen.h>
-#include <xen/hypervisor.h>
-#include <machine/xen/hypercall.h>
-#include <machine/xen/xenvar.h>
-#include <machine/xen/xenfunc.h>
-
-#if !defined(CPU_DISABLE_SSE) && defined(I686_CPU)
-#define CPU_ENABLE_SSE
-#endif
-
-#ifndef PMAP_SHPGPERPROC
-#define PMAP_SHPGPERPROC 200
-#endif
-
-#define DIAGNOSTIC
-
-#if !defined(DIAGNOSTIC)
-#ifdef __GNUC_GNU_INLINE__
-#define PMAP_INLINE __attribute__((__gnu_inline__)) inline
-#else
-#define PMAP_INLINE extern inline
-#endif
-#else
-#define PMAP_INLINE
-#endif
-
-#ifdef PV_STATS
-#define PV_STAT(x) do { x ; } while (0)
-#else
-#define PV_STAT(x) do { } while (0)
-#endif
-
-/*
- * Get PDEs and PTEs for user/kernel address space
- */
-#define pmap_pde(m, v) (&((m)->pm_pdir[(vm_offset_t)(v) >> PDRSHIFT]))
-#define pdir_pde(m, v) (m[(vm_offset_t)(v) >> PDRSHIFT])
-
-#define pmap_pde_v(pte) ((*(int *)pte & PG_V) != 0)
-#define pmap_pte_w(pte) ((*(int *)pte & PG_W) != 0)
-#define pmap_pte_m(pte) ((*(int *)pte & PG_M) != 0)
-#define pmap_pte_u(pte) ((*(int *)pte & PG_A) != 0)
-#define pmap_pte_v(pte) ((*(int *)pte & PG_V) != 0)
-
-#define pmap_pte_set_prot(pte, v) ((*(int *)pte &= ~PG_PROT), (*(int *)pte |= (v)))
-
-#define HAMFISTED_LOCKING
-#ifdef HAMFISTED_LOCKING
-static struct mtx createdelete_lock;
-#endif
-
-struct pmap kernel_pmap_store;
-LIST_HEAD(pmaplist, pmap);
-static struct pmaplist allpmaps;
-static struct mtx allpmaps_lock;
-
-vm_offset_t virtual_avail; /* VA of first avail page (after kernel bss) */
-vm_offset_t virtual_end; /* VA of last avail page (end of kernel AS) */
-int pgeflag = 0; /* PG_G or-in */
-int pseflag = 0; /* PG_PS or-in */
-
-int nkpt;
-vm_offset_t kernel_vm_end;
-extern u_int32_t KERNend;
-
-#ifdef PAE
-pt_entry_t pg_nx;
-#endif
-
-static SYSCTL_NODE(_vm, OID_AUTO, pmap, CTLFLAG_RD, 0, "VM/pmap parameters");
-
-static int pat_works; /* Is page attribute table sane? */
-
-/*
- * This lock is defined as static in other pmap implementations. It cannot,
- * however, be defined as static here, because it is (ab)used to serialize
- * queued page table changes in other sources files.
- */
-struct rwlock pvh_global_lock;
-
-/*
- * Data for the pv entry allocation mechanism
- */
-static TAILQ_HEAD(pch, pv_chunk) pv_chunks = TAILQ_HEAD_INITIALIZER(pv_chunks);
-static int pv_entry_count = 0, pv_entry_max = 0, pv_entry_high_water = 0;
-static int shpgperproc = PMAP_SHPGPERPROC;
-
-struct pv_chunk *pv_chunkbase; /* KVA block for pv_chunks */
-int pv_maxchunks; /* How many chunks we have KVA for */
-vm_offset_t pv_vafree; /* freelist stored in the PTE */
-
-/*
- * All those kernel PT submaps that BSD is so fond of
- */
-struct sysmaps {
- struct mtx lock;
- pt_entry_t *CMAP1;
- pt_entry_t *CMAP2;
- caddr_t CADDR1;
- caddr_t CADDR2;
-};
-static struct sysmaps sysmaps_pcpu[MAXCPU];
-pt_entry_t *CMAP3;
-caddr_t ptvmmap = 0;
-caddr_t CADDR3;
-struct msgbuf *msgbufp = 0;
-
-/*
- * Crashdump maps.
- */
-static caddr_t crashdumpmap;
-
-static pt_entry_t *PMAP1 = 0, *PMAP2;
-static pt_entry_t *PADDR1 = 0, *PADDR2;
-#ifdef SMP
-static int PMAP1cpu;
-static int PMAP1changedcpu;
-SYSCTL_INT(_debug, OID_AUTO, PMAP1changedcpu, CTLFLAG_RD,
- &PMAP1changedcpu, 0,
- "Number of times pmap_pte_quick changed CPU with same PMAP1");
-#endif
-static int PMAP1changed;
-SYSCTL_INT(_debug, OID_AUTO, PMAP1changed, CTLFLAG_RD,
- &PMAP1changed, 0,
- "Number of times pmap_pte_quick changed PMAP1");
-static int PMAP1unchanged;
-SYSCTL_INT(_debug, OID_AUTO, PMAP1unchanged, CTLFLAG_RD,
- &PMAP1unchanged, 0,
- "Number of times pmap_pte_quick didn't change PMAP1");
-static struct mtx PMAP2mutex;
-
-static void free_pv_chunk(struct pv_chunk *pc);
-static void free_pv_entry(pmap_t pmap, pv_entry_t pv);
-static pv_entry_t get_pv_entry(pmap_t pmap, boolean_t try);
-static void pmap_pvh_free(struct md_page *pvh, pmap_t pmap, vm_offset_t va);
-static pv_entry_t pmap_pvh_remove(struct md_page *pvh, pmap_t pmap,
- vm_offset_t va);
-
-static vm_page_t pmap_enter_quick_locked(multicall_entry_t **mcl, int *count, pmap_t pmap, vm_offset_t va,
- vm_page_t m, vm_prot_t prot, vm_page_t mpte);
-static void pmap_flush_page(vm_page_t m);
-static void pmap_kenter_attr(vm_offset_t va, vm_paddr_t pa, int mode);
-static int pmap_remove_pte(pmap_t pmap, pt_entry_t *ptq, vm_offset_t sva,
- vm_page_t *free);
-static void pmap_remove_page(struct pmap *pmap, vm_offset_t va,
- vm_page_t *free);
-static void pmap_remove_entry(struct pmap *pmap, vm_page_t m,
- vm_offset_t va);
-static boolean_t pmap_try_insert_pv_entry(pmap_t pmap, vm_offset_t va,
- vm_page_t m);
-
-static vm_page_t pmap_allocpte(pmap_t pmap, vm_offset_t va, u_int flags);
-
-static vm_page_t _pmap_allocpte(pmap_t pmap, u_int ptepindex, u_int flags);
-static void _pmap_unwire_ptp(pmap_t pmap, vm_page_t m, vm_page_t *free);
-static pt_entry_t *pmap_pte_quick(pmap_t pmap, vm_offset_t va);
-static void pmap_pte_release(pt_entry_t *pte);
-static int pmap_unuse_pt(pmap_t, vm_offset_t, vm_page_t *);
-static boolean_t pmap_is_prefaultable_locked(pmap_t pmap, vm_offset_t addr);
-
-static __inline void pagezero(void *page);
-
-CTASSERT(1 << PDESHIFT == sizeof(pd_entry_t));
-CTASSERT(1 << PTESHIFT == sizeof(pt_entry_t));
-
-/*
- * If you get an error here, then you set KVA_PAGES wrong! See the
- * description of KVA_PAGES in sys/i386/include/pmap.h. It must be
- * multiple of 4 for a normal kernel, or a multiple of 8 for a PAE.
- */
-CTASSERT(KERNBASE % (1 << 24) == 0);
-
-void
-pd_set(struct pmap *pmap, int ptepindex, vm_paddr_t val, int type)
-{
- vm_paddr_t pdir_ma = vtomach(&pmap->pm_pdir[ptepindex]);
-
- switch (type) {
- case SH_PD_SET_VA:
-#if 0
- xen_queue_pt_update(shadow_pdir_ma,
- xpmap_ptom(val & ~(PG_RW)));
-#endif
- xen_queue_pt_update(pdir_ma,
- xpmap_ptom(val));
- break;
- case SH_PD_SET_VA_MA:
-#if 0
- xen_queue_pt_update(shadow_pdir_ma,
- val & ~(PG_RW));
-#endif
- xen_queue_pt_update(pdir_ma, val);
- break;
- case SH_PD_SET_VA_CLEAR:
-#if 0
- xen_queue_pt_update(shadow_pdir_ma, 0);
-#endif
- xen_queue_pt_update(pdir_ma, 0);
- break;
- }
-}
-
-/*
- * Bootstrap the system enough to run with virtual memory.
- *
- * On the i386 this is called after mapping has already been enabled
- * and just syncs the pmap module with what has already been done.
- * [We can't call it easily with mapping off since the kernel is not
- * mapped with PA == VA, hence we would have to relocate every address
- * from the linked base (virtual) address "KERNBASE" to the actual
- * (physical) address starting relative to 0]
- */
-void
-pmap_bootstrap(vm_paddr_t firstaddr)
-{
- vm_offset_t va;
- pt_entry_t *pte, *unused;
- struct sysmaps *sysmaps;
- int i;
-
- /*
- * Initialize the first available kernel virtual address. However,
- * using "firstaddr" may waste a few pages of the kernel virtual
- * address space, because locore may not have mapped every physical
- * page that it allocated. Preferably, locore would provide a first
- * unused virtual address in addition to "firstaddr".
- */
- virtual_avail = (vm_offset_t) KERNBASE + firstaddr;
-
- virtual_end = VM_MAX_KERNEL_ADDRESS;
-
- /*
- * Initialize the kernel pmap (which is statically allocated).
- */
- PMAP_LOCK_INIT(kernel_pmap);
- kernel_pmap->pm_pdir = (pd_entry_t *) (KERNBASE + (u_int)IdlePTD);
-#ifdef PAE
- kernel_pmap->pm_pdpt = (pdpt_entry_t *) (KERNBASE + (u_int)IdlePDPT);
-#endif
- CPU_FILL(&kernel_pmap->pm_active); /* don't allow deactivation */
- TAILQ_INIT(&kernel_pmap->pm_pvchunk);
-
- /*
- * Initialize the global pv list lock.
- */
- rw_init_flags(&pvh_global_lock, "pmap pv global", RW_RECURSE);
-
- LIST_INIT(&allpmaps);
- mtx_init(&allpmaps_lock, "allpmaps", NULL, MTX_SPIN);
- mtx_lock_spin(&allpmaps_lock);
- LIST_INSERT_HEAD(&allpmaps, kernel_pmap, pm_list);
- mtx_unlock_spin(&allpmaps_lock);
- if (nkpt == 0)
- nkpt = NKPT;
-
- /*
- * Reserve some special page table entries/VA space for temporary
- * mapping of pages.
- */
-#define SYSMAP(c, p, v, n) \
- v = (c)va; va += ((n)*PAGE_SIZE); p = pte; pte += (n);
-
- va = virtual_avail;
- pte = vtopte(va);
-
- /*
- * CMAP1/CMAP2 are used for zeroing and copying pages.
- * CMAP3 is used for the idle process page zeroing.
- */
- for (i = 0; i < MAXCPU; i++) {
- sysmaps = &sysmaps_pcpu[i];
- mtx_init(&sysmaps->lock, "SYSMAPS", NULL, MTX_DEF);
- SYSMAP(caddr_t, sysmaps->CMAP1, sysmaps->CADDR1, 1)
- SYSMAP(caddr_t, sysmaps->CMAP2, sysmaps->CADDR2, 1)
- PT_SET_MA(sysmaps->CADDR1, 0);
- PT_SET_MA(sysmaps->CADDR2, 0);
- }
- SYSMAP(caddr_t, CMAP3, CADDR3, 1)
- PT_SET_MA(CADDR3, 0);
-
- /*
- * Crashdump maps.
- */
- SYSMAP(caddr_t, unused, crashdumpmap, MAXDUMPPGS)
-
- /*
- * ptvmmap is used for reading arbitrary physical pages via /dev/mem.
- */
- SYSMAP(caddr_t, unused, ptvmmap, 1)
-
- /*
- * msgbufp is used to map the system message buffer.
- */
- SYSMAP(struct msgbuf *, unused, msgbufp, atop(round_page(msgbufsize)))
-
- /*
- * PADDR1 and PADDR2 are used by pmap_pte_quick() and pmap_pte(),
- * respectively.
- */
- SYSMAP(pt_entry_t *, PMAP1, PADDR1, 1)
- SYSMAP(pt_entry_t *, PMAP2, PADDR2, 1)
-
- mtx_init(&PMAP2mutex, "PMAP2", NULL, MTX_DEF);
-
- virtual_avail = va;
-
- /*
- * Leave in place an identity mapping (virt == phys) for the low 1 MB
- * physical memory region that is used by the ACPI wakeup code. This
- * mapping must not have PG_G set.
- */
-#ifndef XEN
- /*
- * leave here deliberately to show that this is not supported
- */
-#ifdef XBOX
- /* FIXME: This is gross, but needed for the XBOX. Since we are in such
- * an early stadium, we cannot yet neatly map video memory ... :-(
- * Better fixes are very welcome! */
- if (!arch_i386_is_xbox)
-#endif
- for (i = 1; i < NKPT; i++)
- PTD[i] = 0;
-
- /* Initialize the PAT MSR if present. */
- pmap_init_pat();
-
- /* Turn on PG_G on kernel page(s) */
- pmap_set_pg();
-#endif
-
-#ifdef HAMFISTED_LOCKING
- mtx_init(&createdelete_lock, "pmap create/delete", NULL, MTX_DEF);
-#endif
-}
-
-/*
- * Setup the PAT MSR.
- */
-void
-pmap_init_pat(void)
-{
- uint64_t pat_msr;
-
- /* Bail if this CPU doesn't implement PAT. */
- if (!(cpu_feature & CPUID_PAT))
- return;
-
- if (cpu_vendor_id != CPU_VENDOR_INTEL ||
- (CPUID_TO_FAMILY(cpu_id) == 6 && CPUID_TO_MODEL(cpu_id) >= 0xe)) {
- /*
- * Leave the indices 0-3 at the default of WB, WT, UC, and UC-.
- * Program 4 and 5 as WP and WC.
- * Leave 6 and 7 as UC and UC-.
- */
- pat_msr = rdmsr(MSR_PAT);
- pat_msr &= ~(PAT_MASK(4) | PAT_MASK(5));
- pat_msr |= PAT_VALUE(4, PAT_WRITE_PROTECTED) |
- PAT_VALUE(5, PAT_WRITE_COMBINING);
- pat_works = 1;
- } else {
- /*
- * Due to some Intel errata, we can only safely use the lower 4
- * PAT entries. Thus, just replace PAT Index 2 with WC instead
- * of UC-.
- *
- * Intel Pentium III Processor Specification Update
- * Errata E.27 (Upper Four PAT Entries Not Usable With Mode B
- * or Mode C Paging)
- *
- * Intel Pentium IV Processor Specification Update
- * Errata N46 (PAT Index MSB May Be Calculated Incorrectly)
- */
- pat_msr = rdmsr(MSR_PAT);
- pat_msr &= ~PAT_MASK(2);
- pat_msr |= PAT_VALUE(2, PAT_WRITE_COMBINING);
- pat_works = 0;
- }
- wrmsr(MSR_PAT, pat_msr);
-}
-
-/*
- * Initialize a vm_page's machine-dependent fields.
- */
-void
-pmap_page_init(vm_page_t m)
-{
-
- TAILQ_INIT(&m->md.pv_list);
- m->md.pat_mode = PAT_WRITE_BACK;
-}
-
-/*
- * ABuse the pte nodes for unmapped kva to thread a kva freelist through.
- * Requirements:
- * - Must deal with pages in order to ensure that none of the PG_* bits
- * are ever set, PG_V in particular.
- * - Assumes we can write to ptes without pte_store() atomic ops, even
- * on PAE systems. This should be ok.
- * - Assumes nothing will ever test these addresses for 0 to indicate
- * no mapping instead of correctly checking PG_V.
- * - Assumes a vm_offset_t will fit in a pte (true for i386).
- * Because PG_V is never set, there can be no mappings to invalidate.
- */
-static int ptelist_count = 0;
-static vm_offset_t
-pmap_ptelist_alloc(vm_offset_t *head)
-{
- vm_offset_t va;
- vm_offset_t *phead = (vm_offset_t *)*head;
-
- if (ptelist_count == 0) {
- printf("out of memory!!!!!!\n");
- return (0); /* Out of memory */
- }
- ptelist_count--;
- va = phead[ptelist_count];
- return (va);
-}
-
-static void
-pmap_ptelist_free(vm_offset_t *head, vm_offset_t va)
-{
- vm_offset_t *phead = (vm_offset_t *)*head;
-
- phead[ptelist_count++] = va;
-}
-
-static void
-pmap_ptelist_init(vm_offset_t *head, void *base, int npages)
-{
- int i, nstackpages;
- vm_offset_t va;
- vm_page_t m;
-
- nstackpages = (npages + PAGE_SIZE/sizeof(vm_offset_t) - 1)/ (PAGE_SIZE/sizeof(vm_offset_t));
- for (i = 0; i < nstackpages; i++) {
- va = (vm_offset_t)base + i * PAGE_SIZE;
- m = vm_page_alloc(NULL, i,
- VM_ALLOC_NORMAL | VM_ALLOC_NOOBJ | VM_ALLOC_WIRED |
- VM_ALLOC_ZERO);
- pmap_qenter(va, &m, 1);
- }
-
- *head = (vm_offset_t)base;
- for (i = npages - 1; i >= nstackpages; i--) {
- va = (vm_offset_t)base + i * PAGE_SIZE;
- pmap_ptelist_free(head, va);
- }
-}
-
-
-/*
- * Initialize the pmap module.
- * Called by vm_init, to initialize any structures that the pmap
- * system needs to map virtual memory.
- */
-void
-pmap_init(void)
-{
-
- /*
- * Initialize the address space (zone) for the pv entries. Set a
- * high water mark so that the system can recover from excessive
- * numbers of pv entries.
- */
- TUNABLE_INT_FETCH("vm.pmap.shpgperproc", &shpgperproc);
- pv_entry_max = shpgperproc * maxproc + vm_cnt.v_page_count;
- TUNABLE_INT_FETCH("vm.pmap.pv_entries", &pv_entry_max);
- pv_entry_max = roundup(pv_entry_max, _NPCPV);
- pv_entry_high_water = 9 * (pv_entry_max / 10);
-
- pv_maxchunks = MAX(pv_entry_max / _NPCPV, maxproc);
- pv_chunkbase = (struct pv_chunk *)kva_alloc(PAGE_SIZE * pv_maxchunks);
- if (pv_chunkbase == NULL)
- panic("pmap_init: not enough kvm for pv chunks");
- pmap_ptelist_init(&pv_vafree, pv_chunkbase, pv_maxchunks);
-}
-
-
-SYSCTL_INT(_vm_pmap, OID_AUTO, pv_entry_max, CTLFLAG_RD, &pv_entry_max, 0,
- "Max number of PV entries");
-SYSCTL_INT(_vm_pmap, OID_AUTO, shpgperproc, CTLFLAG_RD, &shpgperproc, 0,
- "Page share factor per proc");
-
-static SYSCTL_NODE(_vm_pmap, OID_AUTO, pde, CTLFLAG_RD, 0,
- "2/4MB page mapping counters");
-
-static u_long pmap_pde_mappings;
-SYSCTL_ULONG(_vm_pmap_pde, OID_AUTO, mappings, CTLFLAG_RD,
- &pmap_pde_mappings, 0, "2/4MB page mappings");
-
-/***************************************************
- * Low level helper routines.....
- ***************************************************/
-
-/*
- * Determine the appropriate bits to set in a PTE or PDE for a specified
- * caching mode.
- */
-int
-pmap_cache_bits(int mode, boolean_t is_pde)
-{
- int pat_flag, pat_index, cache_bits;
-
- /* The PAT bit is different for PTE's and PDE's. */
- pat_flag = is_pde ? PG_PDE_PAT : PG_PTE_PAT;
-
- /* If we don't support PAT, map extended modes to older ones. */
- if (!(cpu_feature & CPUID_PAT)) {
- switch (mode) {
- case PAT_UNCACHEABLE:
- case PAT_WRITE_THROUGH:
- case PAT_WRITE_BACK:
- break;
- case PAT_UNCACHED:
- case PAT_WRITE_COMBINING:
- case PAT_WRITE_PROTECTED:
- mode = PAT_UNCACHEABLE;
- break;
- }
- }
-
- /* Map the caching mode to a PAT index. */
- if (pat_works) {
- switch (mode) {
- case PAT_UNCACHEABLE:
- pat_index = 3;
- break;
- case PAT_WRITE_THROUGH:
- pat_index = 1;
- break;
- case PAT_WRITE_BACK:
- pat_index = 0;
- break;
- case PAT_UNCACHED:
- pat_index = 2;
- break;
- case PAT_WRITE_COMBINING:
- pat_index = 5;
- break;
- case PAT_WRITE_PROTECTED:
- pat_index = 4;
- break;
- default:
- panic("Unknown caching mode %d\n", mode);
- }
- } else {
- switch (mode) {
- case PAT_UNCACHED:
- case PAT_UNCACHEABLE:
- case PAT_WRITE_PROTECTED:
- pat_index = 3;
- break;
- case PAT_WRITE_THROUGH:
- pat_index = 1;
- break;
- case PAT_WRITE_BACK:
- pat_index = 0;
- break;
- case PAT_WRITE_COMBINING:
- pat_index = 2;
- break;
- default:
- panic("Unknown caching mode %d\n", mode);
- }
- }
-
- /* Map the 3-bit index value into the PAT, PCD, and PWT bits. */
- cache_bits = 0;
- if (pat_index & 0x4)
- cache_bits |= pat_flag;
- if (pat_index & 0x2)
- cache_bits |= PG_NC_PCD;
- if (pat_index & 0x1)
- cache_bits |= PG_NC_PWT;
- return (cache_bits);
-}
-#ifdef SMP
-/*
- * For SMP, these functions have to use the IPI mechanism for coherence.
- *
- * N.B.: Before calling any of the following TLB invalidation functions,
- * the calling processor must ensure that all stores updating a non-
- * kernel page table are globally performed. Otherwise, another
- * processor could cache an old, pre-update entry without being
- * invalidated. This can happen one of two ways: (1) The pmap becomes
- * active on another processor after its pm_active field is checked by
- * one of the following functions but before a store updating the page
- * table is globally performed. (2) The pmap becomes active on another
- * processor before its pm_active field is checked but due to
- * speculative loads one of the following functions stills reads the
- * pmap as inactive on the other processor.
- *
- * The kernel page table is exempt because its pm_active field is
- * immutable. The kernel page table is always active on every
- * processor.
- */
-void
-pmap_invalidate_page(pmap_t pmap, vm_offset_t va)
-{
- cpuset_t other_cpus;
- u_int cpuid;
-
- CTR2(KTR_PMAP, "pmap_invalidate_page: pmap=%p va=0x%x",
- pmap, va);
-
- sched_pin();
- if (pmap == kernel_pmap || !CPU_CMP(&pmap->pm_active, &all_cpus)) {
- invlpg(va);
- smp_invlpg(va);
- } else {
- cpuid = PCPU_GET(cpuid);
- other_cpus = all_cpus;
- CPU_CLR(cpuid, &other_cpus);
- if (CPU_ISSET(cpuid, &pmap->pm_active))
- invlpg(va);
- CPU_AND(&other_cpus, &pmap->pm_active);
- if (!CPU_EMPTY(&other_cpus))
- smp_masked_invlpg(other_cpus, va);
- }
- sched_unpin();
- PT_UPDATES_FLUSH();
-}
-
-void
-pmap_invalidate_range(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
-{
- cpuset_t other_cpus;
- vm_offset_t addr;
- u_int cpuid;
-
- CTR3(KTR_PMAP, "pmap_invalidate_page: pmap=%p eva=0x%x sva=0x%x",
- pmap, sva, eva);
-
- sched_pin();
- if (pmap == kernel_pmap || !CPU_CMP(&pmap->pm_active, &all_cpus)) {
- for (addr = sva; addr < eva; addr += PAGE_SIZE)
- invlpg(addr);
- smp_invlpg_range(sva, eva);
- } else {
- cpuid = PCPU_GET(cpuid);
- other_cpus = all_cpus;
- CPU_CLR(cpuid, &other_cpus);
- if (CPU_ISSET(cpuid, &pmap->pm_active))
- for (addr = sva; addr < eva; addr += PAGE_SIZE)
- invlpg(addr);
- CPU_AND(&other_cpus, &pmap->pm_active);
- if (!CPU_EMPTY(&other_cpus))
- smp_masked_invlpg_range(other_cpus, sva, eva);
- }
- sched_unpin();
- PT_UPDATES_FLUSH();
-}
-
-void
-pmap_invalidate_all(pmap_t pmap)
-{
- cpuset_t other_cpus;
- u_int cpuid;
-
- CTR1(KTR_PMAP, "pmap_invalidate_page: pmap=%p", pmap);
-
- sched_pin();
- if (pmap == kernel_pmap || !CPU_CMP(&pmap->pm_active, &all_cpus)) {
- invltlb();
- smp_invltlb();
- } else {
- cpuid = PCPU_GET(cpuid);
- other_cpus = all_cpus;
- CPU_CLR(cpuid, &other_cpus);
- if (CPU_ISSET(cpuid, &pmap->pm_active))
- invltlb();
- CPU_AND(&other_cpus, &pmap->pm_active);
- if (!CPU_EMPTY(&other_cpus))
- smp_masked_invltlb(other_cpus);
- }
- sched_unpin();
-}
-
-void
-pmap_invalidate_cache(void)
-{
-
- sched_pin();
- wbinvd();
- smp_cache_flush();
- sched_unpin();
-}
-#else /* !SMP */
-/*
- * Normal, non-SMP, 486+ invalidation functions.
- * We inline these within pmap.c for speed.
- */
-PMAP_INLINE void
-pmap_invalidate_page(pmap_t pmap, vm_offset_t va)
-{
- CTR2(KTR_PMAP, "pmap_invalidate_page: pmap=%p va=0x%x",
- pmap, va);
-
- if (pmap == kernel_pmap || !CPU_EMPTY(&pmap->pm_active))
- invlpg(va);
- PT_UPDATES_FLUSH();
-}
-
-PMAP_INLINE void
-pmap_invalidate_range(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
-{
- vm_offset_t addr;
-
- if (eva - sva > PAGE_SIZE)
- CTR3(KTR_PMAP, "pmap_invalidate_range: pmap=%p sva=0x%x eva=0x%x",
- pmap, sva, eva);
-
- if (pmap == kernel_pmap || !CPU_EMPTY(&pmap->pm_active))
- for (addr = sva; addr < eva; addr += PAGE_SIZE)
- invlpg(addr);
- PT_UPDATES_FLUSH();
-}
-
-PMAP_INLINE void
-pmap_invalidate_all(pmap_t pmap)
-{
-
- CTR1(KTR_PMAP, "pmap_invalidate_all: pmap=%p", pmap);
-
- if (pmap == kernel_pmap || !CPU_EMPTY(&pmap->pm_active))
- invltlb();
-}
-
-PMAP_INLINE void
-pmap_invalidate_cache(void)
-{
-
- wbinvd();
-}
-#endif /* !SMP */
-
-#define PMAP_CLFLUSH_THRESHOLD (2 * 1024 * 1024)
-
-void
-pmap_invalidate_cache_range(vm_offset_t sva, vm_offset_t eva, boolean_t force)
-{
-
- if (force) {
- sva &= ~(vm_offset_t)cpu_clflush_line_size;
- } else {
- KASSERT((sva & PAGE_MASK) == 0,
- ("pmap_invalidate_cache_range: sva not page-aligned"));
- KASSERT((eva & PAGE_MASK) == 0,
- ("pmap_invalidate_cache_range: eva not page-aligned"));
- }
-
- if ((cpu_feature & CPUID_SS) != 0 && !force)
- ; /* If "Self Snoop" is supported, do nothing. */
- else if ((cpu_feature & CPUID_CLFSH) != 0 &&
- eva - sva < PMAP_CLFLUSH_THRESHOLD) {
-
- /*
- * Otherwise, do per-cache line flush. Use the mfence
- * instruction to insure that previous stores are
- * included in the write-back. The processor
- * propagates flush to other processors in the cache
- * coherence domain.
- */
- mfence();
- for (; sva < eva; sva += cpu_clflush_line_size)
- clflush(sva);
- mfence();
- } else {
-
- /*
- * No targeted cache flush methods are supported by CPU,
- * or the supplied range is bigger than 2MB.
- * Globally invalidate cache.
- */
- pmap_invalidate_cache();
- }
-}
-
-void
-pmap_invalidate_cache_pages(vm_page_t *pages, int count)
-{
- int i;
-
- if (count >= PMAP_CLFLUSH_THRESHOLD / PAGE_SIZE ||
- (cpu_feature & CPUID_CLFSH) == 0) {
- pmap_invalidate_cache();
- } else {
- for (i = 0; i < count; i++)
- pmap_flush_page(pages[i]);
- }
-}
-
-/*
- * Are we current address space or kernel? N.B. We return FALSE when
- * a pmap's page table is in use because a kernel thread is borrowing
- * it. The borrowed page table can change spontaneously, making any
- * dependence on its continued use subject to a race condition.
- */
-static __inline int
-pmap_is_current(pmap_t pmap)
-{
-
- return (pmap == kernel_pmap ||
- (pmap == vmspace_pmap(curthread->td_proc->p_vmspace) &&
- (pmap->pm_pdir[PTDPTDI] & PG_FRAME) == (PTDpde[0] & PG_FRAME)));
-}
-
-/*
- * If the given pmap is not the current or kernel pmap, the returned pte must
- * be released by passing it to pmap_pte_release().
- */
-pt_entry_t *
-pmap_pte(pmap_t pmap, vm_offset_t va)
-{
- pd_entry_t newpf;
- pd_entry_t *pde;
-
- pde = pmap_pde(pmap, va);
- if (*pde & PG_PS)
- return (pde);
- if (*pde != 0) {
- /* are we current address space or kernel? */
- if (pmap_is_current(pmap))
- return (vtopte(va));
- mtx_lock(&PMAP2mutex);
- newpf = *pde & PG_FRAME;
- if ((*PMAP2 & PG_FRAME) != newpf) {
- PT_SET_MA(PADDR2, newpf | PG_V | PG_A | PG_M);
- CTR3(KTR_PMAP, "pmap_pte: pmap=%p va=0x%x newpte=0x%08x",
- pmap, va, (*PMAP2 & 0xffffffff));
- }
- return (PADDR2 + (i386_btop(va) & (NPTEPG - 1)));
- }
- return (NULL);
-}
-
-/*
- * Releases a pte that was obtained from pmap_pte(). Be prepared for the pte
- * being NULL.
- */
-static __inline void
-pmap_pte_release(pt_entry_t *pte)
-{
-
- if ((pt_entry_t *)((vm_offset_t)pte & ~PAGE_MASK) == PADDR2) {
- CTR1(KTR_PMAP, "pmap_pte_release: pte=0x%jx",
- *PMAP2);
- rw_wlock(&pvh_global_lock);
- PT_SET_VA(PMAP2, 0, TRUE);
- rw_wunlock(&pvh_global_lock);
- mtx_unlock(&PMAP2mutex);
- }
-}
-
-static __inline void
-invlcaddr(void *caddr)
-{
-
- invlpg((u_int)caddr);
- PT_UPDATES_FLUSH();
-}
-
-/*
- * Super fast pmap_pte routine best used when scanning
- * the pv lists. This eliminates many coarse-grained
- * invltlb calls. Note that many of the pv list
- * scans are across different pmaps. It is very wasteful
- * to do an entire invltlb for checking a single mapping.
- *
- * If the given pmap is not the current pmap, pvh_global_lock
- * must be held and curthread pinned to a CPU.
- */
-static pt_entry_t *
-pmap_pte_quick(pmap_t pmap, vm_offset_t va)
-{
- pd_entry_t newpf;
- pd_entry_t *pde;
-
- pde = pmap_pde(pmap, va);
- if (*pde & PG_PS)
- return (pde);
- if (*pde != 0) {
- /* are we current address space or kernel? */
- if (pmap_is_current(pmap))
- return (vtopte(va));
- rw_assert(&pvh_global_lock, RA_WLOCKED);
- KASSERT(curthread->td_pinned > 0, ("curthread not pinned"));
- newpf = *pde & PG_FRAME;
- if ((*PMAP1 & PG_FRAME) != newpf) {
- PT_SET_MA(PADDR1, newpf | PG_V | PG_A | PG_M);
- CTR3(KTR_PMAP, "pmap_pte_quick: pmap=%p va=0x%x newpte=0x%08x",
- pmap, va, (u_long)*PMAP1);
-
-#ifdef SMP
- PMAP1cpu = PCPU_GET(cpuid);
-#endif
- PMAP1changed++;
- } else
-#ifdef SMP
- if (PMAP1cpu != PCPU_GET(cpuid)) {
- PMAP1cpu = PCPU_GET(cpuid);
- invlcaddr(PADDR1);
- PMAP1changedcpu++;
- } else
-#endif
- PMAP1unchanged++;
- return (PADDR1 + (i386_btop(va) & (NPTEPG - 1)));
- }
- return (0);
-}
-
-/*
- * Routine: pmap_extract
- * Function:
- * Extract the physical page address associated
- * with the given map/virtual_address pair.
- */
-vm_paddr_t
-pmap_extract(pmap_t pmap, vm_offset_t va)
-{
- vm_paddr_t rtval;
- pt_entry_t *pte;
- pd_entry_t pde;
- pt_entry_t pteval;
-
- rtval = 0;
- PMAP_LOCK(pmap);
- pde = pmap->pm_pdir[va >> PDRSHIFT];
- if (pde != 0) {
- if ((pde & PG_PS) != 0) {
- rtval = xpmap_mtop(pde & PG_PS_FRAME) | (va & PDRMASK);
- PMAP_UNLOCK(pmap);
- return rtval;
- }
- pte = pmap_pte(pmap, va);
- pteval = *pte ? xpmap_mtop(*pte) : 0;
- rtval = (pteval & PG_FRAME) | (va & PAGE_MASK);
- pmap_pte_release(pte);
- }
- PMAP_UNLOCK(pmap);
- return (rtval);
-}
-
-/*
- * Routine: pmap_extract_ma
- * Function:
- * Like pmap_extract, but returns machine address
- */
-vm_paddr_t
-pmap_extract_ma(pmap_t pmap, vm_offset_t va)
-{
- vm_paddr_t rtval;
- pt_entry_t *pte;
- pd_entry_t pde;
-
- rtval = 0;
- PMAP_LOCK(pmap);
- pde = pmap->pm_pdir[va >> PDRSHIFT];
- if (pde != 0) {
- if ((pde & PG_PS) != 0) {
- rtval = (pde & ~PDRMASK) | (va & PDRMASK);
- PMAP_UNLOCK(pmap);
- return rtval;
- }
- pte = pmap_pte(pmap, va);
- rtval = (*pte & PG_FRAME) | (va & PAGE_MASK);
- pmap_pte_release(pte);
- }
- PMAP_UNLOCK(pmap);
- return (rtval);
-}
-
-/*
- * Routine: pmap_extract_and_hold
- * Function:
- * Atomically extract and hold the physical page
- * with the given pmap and virtual address pair
- * if that mapping permits the given protection.
- */
-vm_page_t
-pmap_extract_and_hold(pmap_t pmap, vm_offset_t va, vm_prot_t prot)
-{
- pd_entry_t pde;
- pt_entry_t pte, *ptep;
- vm_page_t m;
- vm_paddr_t pa;
-
- pa = 0;
- m = NULL;
- PMAP_LOCK(pmap);
-retry:
- pde = PT_GET(pmap_pde(pmap, va));
- if (pde != 0) {
- if (pde & PG_PS) {
- if ((pde & PG_RW) || (prot & VM_PROT_WRITE) == 0) {
- if (vm_page_pa_tryrelock(pmap, (pde &
- PG_PS_FRAME) | (va & PDRMASK), &pa))
- goto retry;
- m = PHYS_TO_VM_PAGE((pde & PG_PS_FRAME) |
- (va & PDRMASK));
- vm_page_hold(m);
- }
- } else {
- ptep = pmap_pte(pmap, va);
- pte = PT_GET(ptep);
- pmap_pte_release(ptep);
- if (pte != 0 &&
- ((pte & PG_RW) || (prot & VM_PROT_WRITE) == 0)) {
- if (vm_page_pa_tryrelock(pmap, pte & PG_FRAME,
- &pa))
- goto retry;
- m = PHYS_TO_VM_PAGE(pte & PG_FRAME);
- vm_page_hold(m);
- }
- }
- }
- PA_UNLOCK_COND(pa);
- PMAP_UNLOCK(pmap);
- return (m);
-}
-
-/***************************************************
- * Low level mapping routines.....
- ***************************************************/
-
-/*
- * Add a wired page to the kva.
- * Note: not SMP coherent.
- *
- * This function may be used before pmap_bootstrap() is called.
- */
-void
-pmap_kenter(vm_offset_t va, vm_paddr_t pa)
-{
-
- PT_SET_MA(va, xpmap_ptom(pa)| PG_RW | PG_V | pgeflag);
-}
-
-void
-pmap_kenter_ma(vm_offset_t va, vm_paddr_t ma)
-{
- pt_entry_t *pte;
-
- pte = vtopte(va);
- pte_store_ma(pte, ma | PG_RW | PG_V | pgeflag);
-}
-
-static __inline void
-pmap_kenter_attr(vm_offset_t va, vm_paddr_t pa, int mode)
-{
-
- PT_SET_MA(va, pa | PG_RW | PG_V | pgeflag | pmap_cache_bits(mode, 0));
-}
-
-/*
- * Remove a page from the kernel pagetables.
- * Note: not SMP coherent.
- *
- * This function may be used before pmap_bootstrap() is called.
- */
-PMAP_INLINE void
-pmap_kremove(vm_offset_t va)
-{
- pt_entry_t *pte;
-
- pte = vtopte(va);
- PT_CLEAR_VA(pte, FALSE);
-}
-
-/*
- * Used to map a range of physical addresses into kernel
- * virtual address space.
- *
- * The value passed in '*virt' is a suggested virtual address for
- * the mapping. Architectures which can support a direct-mapped
- * physical to virtual region can return the appropriate address
- * within that region, leaving '*virt' unchanged. Other
- * architectures should map the pages starting at '*virt' and
- * update '*virt' with the first usable address after the mapped
- * region.
- */
-vm_offset_t
-pmap_map(vm_offset_t *virt, vm_paddr_t start, vm_paddr_t end, int prot)
-{
- vm_offset_t va, sva;
-
- va = sva = *virt;
- CTR4(KTR_PMAP, "pmap_map: va=0x%x start=0x%jx end=0x%jx prot=0x%x",
- va, start, end, prot);
- while (start < end) {
- pmap_kenter(va, start);
- va += PAGE_SIZE;
- start += PAGE_SIZE;
- }
- pmap_invalidate_range(kernel_pmap, sva, va);
- *virt = va;
- return (sva);
-}
-
-
-/*
- * Add a list of wired pages to the kva
- * this routine is only used for temporary
- * kernel mappings that do not need to have
- * page modification or references recorded.
- * Note that old mappings are simply written
- * over. The page *must* be wired.
- * Note: SMP coherent. Uses a ranged shootdown IPI.
- */
-void
-pmap_qenter(vm_offset_t sva, vm_page_t *ma, int count)
-{
- pt_entry_t *endpte, *pte;
- vm_paddr_t pa;
- vm_offset_t va = sva;
- int mclcount = 0;
- multicall_entry_t mcl[16];
- multicall_entry_t *mclp = mcl;
- int error;
-
- CTR2(KTR_PMAP, "pmap_qenter:sva=0x%x count=%d", va, count);
- pte = vtopte(sva);
- endpte = pte + count;
- while (pte < endpte) {
- pa = VM_PAGE_TO_MACH(*ma) | pgeflag | PG_RW | PG_V | PG_M | PG_A;
-
- mclp->op = __HYPERVISOR_update_va_mapping;
- mclp->args[0] = va;
- mclp->args[1] = (uint32_t)(pa & 0xffffffff);
- mclp->args[2] = (uint32_t)(pa >> 32);
- mclp->args[3] = (*pte & PG_V) ? UVMF_INVLPG|UVMF_ALL : 0;
-
- va += PAGE_SIZE;
- pte++;
- ma++;
- mclp++;
- mclcount++;
- if (mclcount == 16) {
- error = HYPERVISOR_multicall(mcl, mclcount);
- mclp = mcl;
- mclcount = 0;
- KASSERT(error == 0, ("bad multicall %d", error));
- }
- }
- if (mclcount) {
- error = HYPERVISOR_multicall(mcl, mclcount);
- KASSERT(error == 0, ("bad multicall %d", error));
- }
-
-#ifdef INVARIANTS
- for (pte = vtopte(sva), mclcount = 0; mclcount < count; mclcount++, pte++)
- KASSERT(*pte, ("pte not set for va=0x%x", sva + mclcount*PAGE_SIZE));
-#endif
-}
-
-/*
- * This routine tears out page mappings from the
- * kernel -- it is meant only for temporary mappings.
- * Note: SMP coherent. Uses a ranged shootdown IPI.
- */
-void
-pmap_qremove(vm_offset_t sva, int count)
-{
- vm_offset_t va;
-
- CTR2(KTR_PMAP, "pmap_qremove: sva=0x%x count=%d", sva, count);
- va = sva;
- rw_wlock(&pvh_global_lock);
- critical_enter();
- while (count-- > 0) {
- pmap_kremove(va);
- va += PAGE_SIZE;
- }
- PT_UPDATES_FLUSH();
- pmap_invalidate_range(kernel_pmap, sva, va);
- critical_exit();
- rw_wunlock(&pvh_global_lock);
-}
-
-/***************************************************
- * Page table page management routines.....
- ***************************************************/
-static __inline void
-pmap_free_zero_pages(vm_page_t free)
-{
- vm_page_t m;
-
- while (free != NULL) {
- m = free;
- free = (void *)m->object;
- m->object = NULL;
- vm_page_free_zero(m);
- }
-}
-
-/*
- * Decrements a page table page's wire count, which is used to record the
- * number of valid page table entries within the page. If the wire count
- * drops to zero, then the page table page is unmapped. Returns TRUE if the
- * page table page was unmapped and FALSE otherwise.
- */
-static inline boolean_t
-pmap_unwire_ptp(pmap_t pmap, vm_page_t m, vm_page_t *free)
-{
-
- --m->wire_count;
- if (m->wire_count == 0) {
- _pmap_unwire_ptp(pmap, m, free);
- return (TRUE);
- } else
- return (FALSE);
-}
-
-static void
-_pmap_unwire_ptp(pmap_t pmap, vm_page_t m, vm_page_t *free)
-{
- vm_offset_t pteva;
-
- PT_UPDATES_FLUSH();
- /*
- * unmap the page table page
- */
- xen_pt_unpin(pmap->pm_pdir[m->pindex]);
- /*
- * page *might* contain residual mapping :-/
- */
- PD_CLEAR_VA(pmap, m->pindex, TRUE);
- pmap_zero_page(m);
- --pmap->pm_stats.resident_count;
-
- /*
- * This is a release store so that the ordinary store unmapping
- * the page table page is globally performed before TLB shoot-
- * down is begun.
- */
- atomic_subtract_rel_int(&vm_cnt.v_wire_count, 1);
-
- /*
- * Do an invltlb to make the invalidated mapping
- * take effect immediately.
- */
- pteva = VM_MAXUSER_ADDRESS + i386_ptob(m->pindex);
- pmap_invalidate_page(pmap, pteva);
-
- /*
- * Put page on a list so that it is released after
- * *ALL* TLB shootdown is done
- */
- m->object = (void *)*free;
- *free = m;
-}
-
-/*
- * After removing a page table entry, this routine is used to
- * conditionally free the page, and manage the hold/wire counts.
- */
-static int
-pmap_unuse_pt(pmap_t pmap, vm_offset_t va, vm_page_t *free)
-{
- pd_entry_t ptepde;
- vm_page_t mpte;
-
- if (va >= VM_MAXUSER_ADDRESS)
- return (0);
- ptepde = PT_GET(pmap_pde(pmap, va));
- mpte = PHYS_TO_VM_PAGE(ptepde & PG_FRAME);
- return (pmap_unwire_ptp(pmap, mpte, free));
-}
-
-/*
- * Initialize the pmap for the swapper process.
- */
-void
-pmap_pinit0(pmap_t pmap)
-{
-
- PMAP_LOCK_INIT(pmap);
- /*
- * Since the page table directory is shared with the kernel pmap,
- * which is already included in the list "allpmaps", this pmap does
- * not need to be inserted into that list.
- */
- pmap->pm_pdir = (pd_entry_t *)(KERNBASE + (vm_offset_t)IdlePTD);
-#ifdef PAE
- pmap->pm_pdpt = (pdpt_entry_t *)(KERNBASE + (vm_offset_t)IdlePDPT);
-#endif
- CPU_ZERO(&pmap->pm_active);
- PCPU_SET(curpmap, pmap);
- TAILQ_INIT(&pmap->pm_pvchunk);
- bzero(&pmap->pm_stats, sizeof pmap->pm_stats);
-}
-
-/*
- * Initialize a preallocated and zeroed pmap structure,
- * such as one in a vmspace structure.
- */
-int
-pmap_pinit(pmap_t pmap)
-{
- vm_page_t m, ptdpg[NPGPTD + 1];
- int npgptd = NPGPTD + 1;
- int i;
-
-#ifdef HAMFISTED_LOCKING
- mtx_lock(&createdelete_lock);
-#endif
-
- /*
- * No need to allocate page table space yet but we do need a valid
- * page directory table.
- */
- if (pmap->pm_pdir == NULL) {
- pmap->pm_pdir = (pd_entry_t *)kva_alloc(NBPTD);
- if (pmap->pm_pdir == NULL) {
-#ifdef HAMFISTED_LOCKING
- mtx_unlock(&createdelete_lock);
-#endif
- return (0);
- }
-#ifdef PAE
- pmap->pm_pdpt = (pd_entry_t *)kva_alloc(1);
-#endif
- }
-
- /*
- * allocate the page directory page(s)
- */
- for (i = 0; i < npgptd;) {
- m = vm_page_alloc(NULL, 0, VM_ALLOC_NORMAL | VM_ALLOC_NOOBJ |
- VM_ALLOC_WIRED | VM_ALLOC_ZERO);
- if (m == NULL)
- VM_WAIT;
- else {
- ptdpg[i++] = m;
- }
- }
-
- pmap_qenter((vm_offset_t)pmap->pm_pdir, ptdpg, NPGPTD);
-
- for (i = 0; i < NPGPTD; i++)
- if ((ptdpg[i]->flags & PG_ZERO) == 0)
- pagezero(pmap->pm_pdir + (i * NPDEPG));
-
- mtx_lock_spin(&allpmaps_lock);
- LIST_INSERT_HEAD(&allpmaps, pmap, pm_list);
- /* Copy the kernel page table directory entries. */
- bcopy(PTD + KPTDI, pmap->pm_pdir + KPTDI, nkpt * sizeof(pd_entry_t));
- mtx_unlock_spin(&allpmaps_lock);
-
-#ifdef PAE
- pmap_qenter((vm_offset_t)pmap->pm_pdpt, &ptdpg[NPGPTD], 1);
- if ((ptdpg[NPGPTD]->flags & PG_ZERO) == 0)
- bzero(pmap->pm_pdpt, PAGE_SIZE);
- for (i = 0; i < NPGPTD; i++) {
- vm_paddr_t ma;
-
- ma = VM_PAGE_TO_MACH(ptdpg[i]);
- pmap->pm_pdpt[i] = ma | PG_V;
-
- }
-#endif
- for (i = 0; i < NPGPTD; i++) {
- pt_entry_t *pd;
- vm_paddr_t ma;
-
- ma = VM_PAGE_TO_MACH(ptdpg[i]);
- pd = pmap->pm_pdir + (i * NPDEPG);
- PT_SET_MA(pd, *vtopte((vm_offset_t)pd) & ~(PG_M|PG_A|PG_U|PG_RW));
-#if 0
- xen_pgd_pin(ma);
-#endif
- }
-
-#ifdef PAE
- PT_SET_MA(pmap->pm_pdpt, *vtopte((vm_offset_t)pmap->pm_pdpt) & ~PG_RW);
-#endif
- rw_wlock(&pvh_global_lock);
- xen_flush_queue();
- xen_pgdpt_pin(VM_PAGE_TO_MACH(ptdpg[NPGPTD]));
- for (i = 0; i < NPGPTD; i++) {
- vm_paddr_t ma = VM_PAGE_TO_MACH(ptdpg[i]);
- PT_SET_VA_MA(&pmap->pm_pdir[PTDPTDI + i], ma | PG_V | PG_A, FALSE);
- }
- xen_flush_queue();
- rw_wunlock(&pvh_global_lock);
- CPU_ZERO(&pmap->pm_active);
- TAILQ_INIT(&pmap->pm_pvchunk);
- bzero(&pmap->pm_stats, sizeof pmap->pm_stats);
-
-#ifdef HAMFISTED_LOCKING
- mtx_unlock(&createdelete_lock);
-#endif
- return (1);
-}
-
-/*
- * this routine is called if the page table page is not
- * mapped correctly.
- */
-static vm_page_t
-_pmap_allocpte(pmap_t pmap, u_int ptepindex, u_int flags)
-{
- vm_paddr_t ptema;
- vm_page_t m;
-
- /*
- * Allocate a page table page.
- */
- if ((m = vm_page_alloc(NULL, ptepindex, VM_ALLOC_NOOBJ |
- VM_ALLOC_WIRED | VM_ALLOC_ZERO)) == NULL) {
- if ((flags & PMAP_ENTER_NOSLEEP) == 0) {
- PMAP_UNLOCK(pmap);
- rw_wunlock(&pvh_global_lock);
- VM_WAIT;
- rw_wlock(&pvh_global_lock);
- PMAP_LOCK(pmap);
- }
-
- /*
- * Indicate the need to retry. While waiting, the page table
- * page may have been allocated.
- */
- return (NULL);
- }
- if ((m->flags & PG_ZERO) == 0)
- pmap_zero_page(m);
-
- /*
- * Map the pagetable page into the process address space, if
- * it isn't already there.
- */
-
- pmap->pm_stats.resident_count++;
-
- ptema = VM_PAGE_TO_MACH(m);
- xen_pt_pin(ptema);
- PT_SET_VA_MA(&pmap->pm_pdir[ptepindex],
- (ptema | PG_U | PG_RW | PG_V | PG_A | PG_M), TRUE);
-
- KASSERT(pmap->pm_pdir[ptepindex],
- ("_pmap_allocpte: ptepindex=%d did not get mapped", ptepindex));
- return (m);
-}
-
-static vm_page_t
-pmap_allocpte(pmap_t pmap, vm_offset_t va, u_int flags)
-{
- u_int ptepindex;
- pd_entry_t ptema;
- vm_page_t m;
-
- /*
- * Calculate pagetable page index
- */
- ptepindex = va >> PDRSHIFT;
-retry:
- /*
- * Get the page directory entry
- */
- ptema = pmap->pm_pdir[ptepindex];
-
- /*
- * This supports switching from a 4MB page to a
- * normal 4K page.
- */
- if (ptema & PG_PS) {
- /*
- * XXX
- */
- pmap->pm_pdir[ptepindex] = 0;
- ptema = 0;
- pmap->pm_stats.resident_count -= NBPDR / PAGE_SIZE;
- pmap_invalidate_all(kernel_pmap);
- }
-
- /*
- * If the page table page is mapped, we just increment the
- * hold count, and activate it.
- */
- if (ptema & PG_V) {
- m = PHYS_TO_VM_PAGE(xpmap_mtop(ptema) & PG_FRAME);
- m->wire_count++;
- } else {
- /*
- * Here if the pte page isn't mapped, or if it has
- * been deallocated.
- */
- CTR3(KTR_PMAP, "pmap_allocpte: pmap=%p va=0x%08x flags=0x%x",
- pmap, va, flags);
- m = _pmap_allocpte(pmap, ptepindex, flags);
- if (m == NULL && (flags & PMAP_ENTER_NOSLEEP) == 0)
- goto retry;
-
- KASSERT(pmap->pm_pdir[ptepindex], ("ptepindex=%d did not get mapped", ptepindex));
- }
- return (m);
-}
-
-
-/***************************************************
-* Pmap allocation/deallocation routines.
- ***************************************************/
-
-#ifdef SMP
-/*
- * Deal with a SMP shootdown of other users of the pmap that we are
- * trying to dispose of. This can be a bit hairy.
- */
-static cpuset_t *lazymask;
-static u_int lazyptd;
-static volatile u_int lazywait;
-
-void pmap_lazyfix_action(void);
-
-void
-pmap_lazyfix_action(void)
-{
-
-#ifdef COUNT_IPIS
- (*ipi_lazypmap_counts[PCPU_GET(cpuid)])++;
-#endif
- if (rcr3() == lazyptd)
- load_cr3(PCPU_GET(curpcb)->pcb_cr3);
- CPU_CLR_ATOMIC(PCPU_GET(cpuid), lazymask);
- atomic_store_rel_int(&lazywait, 1);
-}
-
-static void
-pmap_lazyfix_self(u_int cpuid)
-{
-
- if (rcr3() == lazyptd)
- load_cr3(PCPU_GET(curpcb)->pcb_cr3);
- CPU_CLR_ATOMIC(cpuid, lazymask);
-}
-
-
-static void
-pmap_lazyfix(pmap_t pmap)
-{
- cpuset_t mymask, mask;
- u_int cpuid, spins;
- int lsb;
-
- mask = pmap->pm_active;
- while (!CPU_EMPTY(&mask)) {
- spins = 50000000;
-
- /* Find least significant set bit. */
- lsb = CPU_FFS(&mask);
- MPASS(lsb != 0);
- lsb--;
- CPU_SETOF(lsb, &mask);
- mtx_lock_spin(&smp_ipi_mtx);
-#ifdef PAE
- lazyptd = vtophys(pmap->pm_pdpt);
-#else
- lazyptd = vtophys(pmap->pm_pdir);
-#endif
- cpuid = PCPU_GET(cpuid);
-
- /* Use a cpuset just for having an easy check. */
- CPU_SETOF(cpuid, &mymask);
- if (!CPU_CMP(&mask, &mymask)) {
- lazymask = &pmap->pm_active;
- pmap_lazyfix_self(cpuid);
- } else {
- atomic_store_rel_int((u_int *)&lazymask,
- (u_int)&pmap->pm_active);
- atomic_store_rel_int(&lazywait, 0);
- ipi_selected(mask, IPI_LAZYPMAP);
- while (lazywait == 0) {
- ia32_pause();
- if (--spins == 0)
- break;
- }
- }
- mtx_unlock_spin(&smp_ipi_mtx);
- if (spins == 0)
- printf("pmap_lazyfix: spun for 50000000\n");
- mask = pmap->pm_active;
- }
-}
-
-#else /* SMP */
-
-/*
- * Cleaning up on uniprocessor is easy. For various reasons, we're
- * unlikely to have to even execute this code, including the fact
- * that the cleanup is deferred until the parent does a wait(2), which
- * means that another userland process has run.
- */
-static void
-pmap_lazyfix(pmap_t pmap)
-{
- u_int cr3;
-
- cr3 = vtophys(pmap->pm_pdir);
- if (cr3 == rcr3()) {
- load_cr3(PCPU_GET(curpcb)->pcb_cr3);
- CPU_CLR(PCPU_GET(cpuid), &pmap->pm_active);
- }
-}
-#endif /* SMP */
-
-/*
- * Release any resources held by the given physical map.
- * Called when a pmap initialized by pmap_pinit is being released.
- * Should only be called if the map contains no valid mappings.
- */
-void
-pmap_release(pmap_t pmap)
-{
- vm_page_t m, ptdpg[2*NPGPTD+1];
- vm_paddr_t ma;
- int i;
-#ifdef PAE
- int npgptd = NPGPTD + 1;
-#else
- int npgptd = NPGPTD;
-#endif
-
- KASSERT(pmap->pm_stats.resident_count == 0,
- ("pmap_release: pmap resident count %ld != 0",
- pmap->pm_stats.resident_count));
- PT_UPDATES_FLUSH();
-
-#ifdef HAMFISTED_LOCKING
- mtx_lock(&createdelete_lock);
-#endif
-
- pmap_lazyfix(pmap);
- mtx_lock_spin(&allpmaps_lock);
- LIST_REMOVE(pmap, pm_list);
- mtx_unlock_spin(&allpmaps_lock);
-
- for (i = 0; i < NPGPTD; i++)
- ptdpg[i] = PHYS_TO_VM_PAGE(vtophys(pmap->pm_pdir + (i*NPDEPG)) & PG_FRAME);
- pmap_qremove((vm_offset_t)pmap->pm_pdir, NPGPTD);
-#ifdef PAE
- ptdpg[NPGPTD] = PHYS_TO_VM_PAGE(vtophys(pmap->pm_pdpt));
-#endif
-
- for (i = 0; i < npgptd; i++) {
- m = ptdpg[i];
- ma = VM_PAGE_TO_MACH(m);
- /* unpinning L1 and L2 treated the same */
-#if 0
- xen_pgd_unpin(ma);
-#else
- if (i == NPGPTD)
- xen_pgd_unpin(ma);
-#endif
-#ifdef PAE
- if (i < NPGPTD)
- KASSERT(VM_PAGE_TO_MACH(m) == (pmap->pm_pdpt[i] & PG_FRAME),
- ("pmap_release: got wrong ptd page"));
-#endif
- m->wire_count--;
- atomic_subtract_int(&vm_cnt.v_wire_count, 1);
- vm_page_free(m);
- }
-#ifdef PAE
- pmap_qremove((vm_offset_t)pmap->pm_pdpt, 1);
-#endif
-
-#ifdef HAMFISTED_LOCKING
- mtx_unlock(&createdelete_lock);
-#endif
-}
-
-static int
-kvm_size(SYSCTL_HANDLER_ARGS)
-{
- unsigned long ksize = VM_MAX_KERNEL_ADDRESS - KERNBASE;
-
- return (sysctl_handle_long(oidp, &ksize, 0, req));
-}
-SYSCTL_PROC(_vm, OID_AUTO, kvm_size, CTLTYPE_LONG|CTLFLAG_RD,
- 0, 0, kvm_size, "IU", "Size of KVM");
-
-static int
-kvm_free(SYSCTL_HANDLER_ARGS)
-{
- unsigned long kfree = VM_MAX_KERNEL_ADDRESS - kernel_vm_end;
-
- return (sysctl_handle_long(oidp, &kfree, 0, req));
-}
-SYSCTL_PROC(_vm, OID_AUTO, kvm_free, CTLTYPE_LONG|CTLFLAG_RD,
- 0, 0, kvm_free, "IU", "Amount of KVM free");
-
-/*
- * grow the number of kernel page table entries, if needed
- */
-void
-pmap_growkernel(vm_offset_t addr)
-{
- struct pmap *pmap;
- vm_paddr_t ptppaddr;
- vm_page_t nkpg;
- pd_entry_t newpdir;
-
- mtx_assert(&kernel_map->system_mtx, MA_OWNED);
- if (kernel_vm_end == 0) {
- kernel_vm_end = KERNBASE;
- nkpt = 0;
- while (pdir_pde(PTD, kernel_vm_end)) {
- kernel_vm_end = (kernel_vm_end + PAGE_SIZE * NPTEPG) & ~(PAGE_SIZE * NPTEPG - 1);
- nkpt++;
- if (kernel_vm_end - 1 >= kernel_map->max_offset) {
- kernel_vm_end = kernel_map->max_offset;
- break;
- }
- }
- }
- addr = roundup2(addr, NBPDR);
- if (addr - 1 >= kernel_map->max_offset)
- addr = kernel_map->max_offset;
- while (kernel_vm_end < addr) {
- if (pdir_pde(PTD, kernel_vm_end)) {
- kernel_vm_end = (kernel_vm_end + NBPDR) & ~PDRMASK;
- if (kernel_vm_end - 1 >= kernel_map->max_offset) {
- kernel_vm_end = kernel_map->max_offset;
- break;
- }
- continue;
- }
-
- nkpg = vm_page_alloc(NULL, kernel_vm_end >> PDRSHIFT,
- VM_ALLOC_INTERRUPT | VM_ALLOC_NOOBJ | VM_ALLOC_WIRED |
- VM_ALLOC_ZERO);
- if (nkpg == NULL)
- panic("pmap_growkernel: no memory to grow kernel");
-
- nkpt++;
-
- if ((nkpg->flags & PG_ZERO) == 0)
- pmap_zero_page(nkpg);
- ptppaddr = VM_PAGE_TO_PHYS(nkpg);
- newpdir = (pd_entry_t) (ptppaddr | PG_V | PG_RW | PG_A | PG_M);
- rw_wlock(&pvh_global_lock);
- PD_SET_VA(kernel_pmap, (kernel_vm_end >> PDRSHIFT), newpdir, TRUE);
- mtx_lock_spin(&allpmaps_lock);
- LIST_FOREACH(pmap, &allpmaps, pm_list)
- PD_SET_VA(pmap, (kernel_vm_end >> PDRSHIFT), newpdir, TRUE);
-
- mtx_unlock_spin(&allpmaps_lock);
- rw_wunlock(&pvh_global_lock);
-
- kernel_vm_end = (kernel_vm_end + NBPDR) & ~PDRMASK;
- if (kernel_vm_end - 1 >= kernel_map->max_offset) {
- kernel_vm_end = kernel_map->max_offset;
- break;
- }
- }
-}
-
-
-/***************************************************
- * page management routines.
- ***************************************************/
-
-CTASSERT(sizeof(struct pv_chunk) == PAGE_SIZE);
-CTASSERT(_NPCM == 11);
-CTASSERT(_NPCPV == 336);
-
-static __inline struct pv_chunk *
-pv_to_chunk(pv_entry_t pv)
-{
-
- return ((struct pv_chunk *)((uintptr_t)pv & ~(uintptr_t)PAGE_MASK));
-}
-
-#define PV_PMAP(pv) (pv_to_chunk(pv)->pc_pmap)
-
-#define PC_FREE0_9 0xfffffffful /* Free values for index 0 through 9 */
-#define PC_FREE10 0x0000fffful /* Free values for index 10 */
-
-static const uint32_t pc_freemask[_NPCM] = {
- PC_FREE0_9, PC_FREE0_9, PC_FREE0_9,
- PC_FREE0_9, PC_FREE0_9, PC_FREE0_9,
- PC_FREE0_9, PC_FREE0_9, PC_FREE0_9,
- PC_FREE0_9, PC_FREE10
-};
-
-SYSCTL_INT(_vm_pmap, OID_AUTO, pv_entry_count, CTLFLAG_RD, &pv_entry_count, 0,
- "Current number of pv entries");
-
-#ifdef PV_STATS
-static int pc_chunk_count, pc_chunk_allocs, pc_chunk_frees, pc_chunk_tryfail;
-
-SYSCTL_INT(_vm_pmap, OID_AUTO, pc_chunk_count, CTLFLAG_RD, &pc_chunk_count, 0,
- "Current number of pv entry chunks");
-SYSCTL_INT(_vm_pmap, OID_AUTO, pc_chunk_allocs, CTLFLAG_RD, &pc_chunk_allocs, 0,
- "Current number of pv entry chunks allocated");
-SYSCTL_INT(_vm_pmap, OID_AUTO, pc_chunk_frees, CTLFLAG_RD, &pc_chunk_frees, 0,
- "Current number of pv entry chunks frees");
-SYSCTL_INT(_vm_pmap, OID_AUTO, pc_chunk_tryfail, CTLFLAG_RD, &pc_chunk_tryfail, 0,
- "Number of times tried to get a chunk page but failed.");
-
-static long pv_entry_frees, pv_entry_allocs;
-static int pv_entry_spare;
-
-SYSCTL_LONG(_vm_pmap, OID_AUTO, pv_entry_frees, CTLFLAG_RD, &pv_entry_frees, 0,
- "Current number of pv entry frees");
-SYSCTL_LONG(_vm_pmap, OID_AUTO, pv_entry_allocs, CTLFLAG_RD, &pv_entry_allocs, 0,
- "Current number of pv entry allocs");
-SYSCTL_INT(_vm_pmap, OID_AUTO, pv_entry_spare, CTLFLAG_RD, &pv_entry_spare, 0,
- "Current number of spare pv entries");
-#endif
-
-/*
- * We are in a serious low memory condition. Resort to
- * drastic measures to free some pages so we can allocate
- * another pv entry chunk.
- */
-static vm_page_t
-pmap_pv_reclaim(pmap_t locked_pmap)
-{
- struct pch newtail;
- struct pv_chunk *pc;
- pmap_t pmap;
- pt_entry_t *pte, tpte;
- pv_entry_t pv;
- vm_offset_t va;
- vm_page_t free, m, m_pc;
- uint32_t inuse;
- int bit, field, freed;
-
- PMAP_LOCK_ASSERT(locked_pmap, MA_OWNED);
- pmap = NULL;
- free = m_pc = NULL;
- TAILQ_INIT(&newtail);
- while ((pc = TAILQ_FIRST(&pv_chunks)) != NULL && (pv_vafree == 0 ||
- free == NULL)) {
- TAILQ_REMOVE(&pv_chunks, pc, pc_lru);
- if (pmap != pc->pc_pmap) {
- if (pmap != NULL) {
- pmap_invalidate_all(pmap);
- if (pmap != locked_pmap)
- PMAP_UNLOCK(pmap);
- }
- pmap = pc->pc_pmap;
- /* Avoid deadlock and lock recursion. */
- if (pmap > locked_pmap)
- PMAP_LOCK(pmap);
- else if (pmap != locked_pmap && !PMAP_TRYLOCK(pmap)) {
- pmap = NULL;
- TAILQ_INSERT_TAIL(&newtail, pc, pc_lru);
- continue;
- }
- }
-
- /*
- * Destroy every non-wired, 4 KB page mapping in the chunk.
- */
- freed = 0;
- for (field = 0; field < _NPCM; field++) {
- for (inuse = ~pc->pc_map[field] & pc_freemask[field];
- inuse != 0; inuse &= ~(1UL << bit)) {
- bit = bsfl(inuse);
- pv = &pc->pc_pventry[field * 32 + bit];
- va = pv->pv_va;
- pte = pmap_pte(pmap, va);
- tpte = *pte;
- if ((tpte & PG_W) == 0)
- tpte = pte_load_clear(pte);
- pmap_pte_release(pte);
- if ((tpte & PG_W) != 0)
- continue;
- KASSERT(tpte != 0,
- ("pmap_pv_reclaim: pmap %p va %x zero pte",
- pmap, va));
- if ((tpte & PG_G) != 0)
- pmap_invalidate_page(pmap, va);
- m = PHYS_TO_VM_PAGE(tpte & PG_FRAME);
- if ((tpte & (PG_M | PG_RW)) == (PG_M | PG_RW))
- vm_page_dirty(m);
- if ((tpte & PG_A) != 0)
- vm_page_aflag_set(m, PGA_REFERENCED);
- TAILQ_REMOVE(&m->md.pv_list, pv, pv_next);
- if (TAILQ_EMPTY(&m->md.pv_list))
- vm_page_aflag_clear(m, PGA_WRITEABLE);
- pc->pc_map[field] |= 1UL << bit;
- pmap_unuse_pt(pmap, va, &free);
- freed++;
- }
- }
- if (freed == 0) {
- TAILQ_INSERT_TAIL(&newtail, pc, pc_lru);
- continue;
- }
- /* Every freed mapping is for a 4 KB page. */
- pmap->pm_stats.resident_count -= freed;
- PV_STAT(pv_entry_frees += freed);
- PV_STAT(pv_entry_spare += freed);
- pv_entry_count -= freed;
- TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
- for (field = 0; field < _NPCM; field++)
- if (pc->pc_map[field] != pc_freemask[field]) {
- TAILQ_INSERT_HEAD(&pmap->pm_pvchunk, pc,
- pc_list);
- TAILQ_INSERT_TAIL(&newtail, pc, pc_lru);
-
- /*
- * One freed pv entry in locked_pmap is
- * sufficient.
- */
- if (pmap == locked_pmap)
- goto out;
- break;
- }
- if (field == _NPCM) {
- PV_STAT(pv_entry_spare -= _NPCPV);
- PV_STAT(pc_chunk_count--);
- PV_STAT(pc_chunk_frees++);
- /* Entire chunk is free; return it. */
- m_pc = PHYS_TO_VM_PAGE(pmap_kextract((vm_offset_t)pc));
- pmap_qremove((vm_offset_t)pc, 1);
- pmap_ptelist_free(&pv_vafree, (vm_offset_t)pc);
- break;
- }
- }
-out:
- TAILQ_CONCAT(&pv_chunks, &newtail, pc_lru);
- if (pmap != NULL) {
- pmap_invalidate_all(pmap);
- if (pmap != locked_pmap)
- PMAP_UNLOCK(pmap);
- }
- if (m_pc == NULL && pv_vafree != 0 && free != NULL) {
- m_pc = free;
- free = (void *)m_pc->object;
- /* Recycle a freed page table page. */
- m_pc->wire_count = 1;
- atomic_add_int(&vm_cnt.v_wire_count, 1);
- }
- pmap_free_zero_pages(free);
- return (m_pc);
-}
-
-/*
- * free the pv_entry back to the free list
- */
-static void
-free_pv_entry(pmap_t pmap, pv_entry_t pv)
-{
- struct pv_chunk *pc;
- int idx, field, bit;
-
- rw_assert(&pvh_global_lock, RA_WLOCKED);
- PMAP_LOCK_ASSERT(pmap, MA_OWNED);
- PV_STAT(pv_entry_frees++);
- PV_STAT(pv_entry_spare++);
- pv_entry_count--;
- pc = pv_to_chunk(pv);
- idx = pv - &pc->pc_pventry[0];
- field = idx / 32;
- bit = idx % 32;
- pc->pc_map[field] |= 1ul << bit;
- for (idx = 0; idx < _NPCM; idx++)
- if (pc->pc_map[idx] != pc_freemask[idx]) {
- /*
- * 98% of the time, pc is already at the head of the
- * list. If it isn't already, move it to the head.
- */
- if (__predict_false(TAILQ_FIRST(&pmap->pm_pvchunk) !=
- pc)) {
- TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
- TAILQ_INSERT_HEAD(&pmap->pm_pvchunk, pc,
- pc_list);
- }
- return;
- }
- TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
- free_pv_chunk(pc);
-}
-
-static void
-free_pv_chunk(struct pv_chunk *pc)
-{
- vm_page_t m;
-
- TAILQ_REMOVE(&pv_chunks, pc, pc_lru);
- PV_STAT(pv_entry_spare -= _NPCPV);
- PV_STAT(pc_chunk_count--);
- PV_STAT(pc_chunk_frees++);
- /* entire chunk is free, return it */
- m = PHYS_TO_VM_PAGE(pmap_kextract((vm_offset_t)pc));
- pmap_qremove((vm_offset_t)pc, 1);
- vm_page_unwire(m, PQ_INACTIVE);
- vm_page_free(m);
- pmap_ptelist_free(&pv_vafree, (vm_offset_t)pc);
-}
-
-/*
- * get a new pv_entry, allocating a block from the system
- * when needed.
- */
-static pv_entry_t
-get_pv_entry(pmap_t pmap, boolean_t try)
-{
- static const struct timeval printinterval = { 60, 0 };
- static struct timeval lastprint;
- int bit, field;
- pv_entry_t pv;
- struct pv_chunk *pc;
- vm_page_t m;
-
- PMAP_LOCK_ASSERT(pmap, MA_OWNED);
- rw_assert(&pvh_global_lock, RA_WLOCKED);
- PV_STAT(pv_entry_allocs++);
- pv_entry_count++;
- if (pv_entry_count > pv_entry_high_water)
- if (ratecheck(&lastprint, &printinterval))
- printf("Approaching the limit on PV entries, consider "
- "increasing either the vm.pmap.shpgperproc or the "
- "vm.pmap.pv_entry_max tunable.\n");
-retry:
- pc = TAILQ_FIRST(&pmap->pm_pvchunk);
- if (pc != NULL) {
- for (field = 0; field < _NPCM; field++) {
- if (pc->pc_map[field]) {
- bit = bsfl(pc->pc_map[field]);
- break;
- }
- }
- if (field < _NPCM) {
- pv = &pc->pc_pventry[field * 32 + bit];
- pc->pc_map[field] &= ~(1ul << bit);
- /* If this was the last item, move it to tail */
- for (field = 0; field < _NPCM; field++)
- if (pc->pc_map[field] != 0) {
- PV_STAT(pv_entry_spare--);
- return (pv); /* not full, return */
- }
- TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
- TAILQ_INSERT_TAIL(&pmap->pm_pvchunk, pc, pc_list);
- PV_STAT(pv_entry_spare--);
- return (pv);
- }
- }
- /*
- * Access to the ptelist "pv_vafree" is synchronized by the page
- * queues lock. If "pv_vafree" is currently non-empty, it will
- * remain non-empty until pmap_ptelist_alloc() completes.
- */
- if (pv_vafree == 0 || (m = vm_page_alloc(NULL, 0, VM_ALLOC_NORMAL |
- VM_ALLOC_NOOBJ | VM_ALLOC_WIRED)) == NULL) {
- if (try) {
- pv_entry_count--;
- PV_STAT(pc_chunk_tryfail++);
- return (NULL);
- }
- m = pmap_pv_reclaim(pmap);
- if (m == NULL)
- goto retry;
- }
- PV_STAT(pc_chunk_count++);
- PV_STAT(pc_chunk_allocs++);
- pc = (struct pv_chunk *)pmap_ptelist_alloc(&pv_vafree);
- pmap_qenter((vm_offset_t)pc, &m, 1);
- if ((m->flags & PG_ZERO) == 0)
- pagezero(pc);
- pc->pc_pmap = pmap;
- pc->pc_map[0] = pc_freemask[0] & ~1ul; /* preallocated bit 0 */
- for (field = 1; field < _NPCM; field++)
- pc->pc_map[field] = pc_freemask[field];
- TAILQ_INSERT_TAIL(&pv_chunks, pc, pc_lru);
- pv = &pc->pc_pventry[0];
- TAILQ_INSERT_HEAD(&pmap->pm_pvchunk, pc, pc_list);
- PV_STAT(pv_entry_spare += _NPCPV - 1);
- return (pv);
-}
-
-static __inline pv_entry_t
-pmap_pvh_remove(struct md_page *pvh, pmap_t pmap, vm_offset_t va)
-{
- pv_entry_t pv;
-
- rw_assert(&pvh_global_lock, RA_WLOCKED);
- TAILQ_FOREACH(pv, &pvh->pv_list, pv_next) {
- if (pmap == PV_PMAP(pv) && va == pv->pv_va) {
- TAILQ_REMOVE(&pvh->pv_list, pv, pv_next);
- break;
- }
- }
- return (pv);
-}
-
-static void
-pmap_pvh_free(struct md_page *pvh, pmap_t pmap, vm_offset_t va)
-{
- pv_entry_t pv;
-
- pv = pmap_pvh_remove(pvh, pmap, va);
- KASSERT(pv != NULL, ("pmap_pvh_free: pv not found"));
- free_pv_entry(pmap, pv);
-}
-
-static void
-pmap_remove_entry(pmap_t pmap, vm_page_t m, vm_offset_t va)
-{
-
- rw_assert(&pvh_global_lock, RA_WLOCKED);
- pmap_pvh_free(&m->md, pmap, va);
- if (TAILQ_EMPTY(&m->md.pv_list))
- vm_page_aflag_clear(m, PGA_WRITEABLE);
-}
-
-/*
- * Conditionally create a pv entry.
- */
-static boolean_t
-pmap_try_insert_pv_entry(pmap_t pmap, vm_offset_t va, vm_page_t m)
-{
- pv_entry_t pv;
-
- PMAP_LOCK_ASSERT(pmap, MA_OWNED);
- rw_assert(&pvh_global_lock, RA_WLOCKED);
- if (pv_entry_count < pv_entry_high_water &&
- (pv = get_pv_entry(pmap, TRUE)) != NULL) {
- pv->pv_va = va;
- TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_next);
- return (TRUE);
- } else
- return (FALSE);
-}
-
-/*
- * pmap_remove_pte: do the things to unmap a page in a process
- */
-static int
-pmap_remove_pte(pmap_t pmap, pt_entry_t *ptq, vm_offset_t va, vm_page_t *free)
-{
- pt_entry_t oldpte;
- vm_page_t m;
-
- CTR3(KTR_PMAP, "pmap_remove_pte: pmap=%p *ptq=0x%x va=0x%x",
- pmap, (u_long)*ptq, va);
-
- rw_assert(&pvh_global_lock, RA_WLOCKED);
- PMAP_LOCK_ASSERT(pmap, MA_OWNED);
- oldpte = *ptq;
- PT_SET_VA_MA(ptq, 0, TRUE);
- KASSERT(oldpte != 0,
- ("pmap_remove_pte: pmap %p va %x zero pte", pmap, va));
- if (oldpte & PG_W)
- pmap->pm_stats.wired_count -= 1;
- /*
- * Machines that don't support invlpg, also don't support
- * PG_G.
- */
- if (oldpte & PG_G)
- pmap_invalidate_page(kernel_pmap, va);
- pmap->pm_stats.resident_count -= 1;
- if (oldpte & PG_MANAGED) {
- m = PHYS_TO_VM_PAGE(xpmap_mtop(oldpte) & PG_FRAME);
- if ((oldpte & (PG_M | PG_RW)) == (PG_M | PG_RW))
- vm_page_dirty(m);
- if (oldpte & PG_A)
- vm_page_aflag_set(m, PGA_REFERENCED);
- pmap_remove_entry(pmap, m, va);
- }
- return (pmap_unuse_pt(pmap, va, free));
-}
-
-/*
- * Remove a single page from a process address space
- */
-static void
-pmap_remove_page(pmap_t pmap, vm_offset_t va, vm_page_t *free)
-{
- pt_entry_t *pte;
-
- CTR2(KTR_PMAP, "pmap_remove_page: pmap=%p va=0x%x",
- pmap, va);
-
- rw_assert(&pvh_global_lock, RA_WLOCKED);
- KASSERT(curthread->td_pinned > 0, ("curthread not pinned"));
- PMAP_LOCK_ASSERT(pmap, MA_OWNED);
- if ((pte = pmap_pte_quick(pmap, va)) == NULL || (*pte & PG_V) == 0)
- return;
- pmap_remove_pte(pmap, pte, va, free);
- pmap_invalidate_page(pmap, va);
- if (*PMAP1)
- PT_SET_MA(PADDR1, 0);
-
-}
-
-/*
- * Remove the given range of addresses from the specified map.
- *
- * It is assumed that the start and end are properly
- * rounded to the page size.
- */
-void
-pmap_remove(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
-{
- vm_offset_t pdnxt;
- pd_entry_t ptpaddr;
- pt_entry_t *pte;
- vm_page_t free = NULL;
- int anyvalid;
-
- CTR3(KTR_PMAP, "pmap_remove: pmap=%p sva=0x%x eva=0x%x",
- pmap, sva, eva);
-
- /*
- * Perform an unsynchronized read. This is, however, safe.
- */
- if (pmap->pm_stats.resident_count == 0)
- return;
-
- anyvalid = 0;
-
- rw_wlock(&pvh_global_lock);
- sched_pin();
- PMAP_LOCK(pmap);
-
- /*
- * special handling of removing one page. a very
- * common operation and easy to short circuit some
- * code.
- */
- if ((sva + PAGE_SIZE == eva) &&
- ((pmap->pm_pdir[(sva >> PDRSHIFT)] & PG_PS) == 0)) {
- pmap_remove_page(pmap, sva, &free);
- goto out;
- }
-
- for (; sva < eva; sva = pdnxt) {
- u_int pdirindex;
-
- /*
- * Calculate index for next page table.
- */
- pdnxt = (sva + NBPDR) & ~PDRMASK;
- if (pdnxt < sva)
- pdnxt = eva;
- if (pmap->pm_stats.resident_count == 0)
- break;
-
- pdirindex = sva >> PDRSHIFT;
- ptpaddr = pmap->pm_pdir[pdirindex];
-
- /*
- * Weed out invalid mappings. Note: we assume that the page
- * directory table is always allocated, and in kernel virtual.
- */
- if (ptpaddr == 0)
- continue;
-
- /*
- * Check for large page.
- */
- if ((ptpaddr & PG_PS) != 0) {
- PD_CLEAR_VA(pmap, pdirindex, TRUE);
- pmap->pm_stats.resident_count -= NBPDR / PAGE_SIZE;
- anyvalid = 1;
- continue;
- }
-
- /*
- * Limit our scan to either the end of the va represented
- * by the current page table page, or to the end of the
- * range being removed.
- */
- if (pdnxt > eva)
- pdnxt = eva;
-
- for (pte = pmap_pte_quick(pmap, sva); sva != pdnxt; pte++,
- sva += PAGE_SIZE) {
- if ((*pte & PG_V) == 0)
- continue;
-
- /*
- * The TLB entry for a PG_G mapping is invalidated
- * by pmap_remove_pte().
- */
- if ((*pte & PG_G) == 0)
- anyvalid = 1;
- if (pmap_remove_pte(pmap, pte, sva, &free))
- break;
- }
- }
- PT_UPDATES_FLUSH();
- if (*PMAP1)
- PT_SET_VA_MA(PMAP1, 0, TRUE);
-out:
- if (anyvalid)
- pmap_invalidate_all(pmap);
- sched_unpin();
- rw_wunlock(&pvh_global_lock);
- PMAP_UNLOCK(pmap);
- pmap_free_zero_pages(free);
-}
-
-/*
- * Routine: pmap_remove_all
- * Function:
- * Removes this physical page from
- * all physical maps in which it resides.
- * Reflects back modify bits to the pager.
- *
- * Notes:
- * Original versions of this routine were very
- * inefficient because they iteratively called
- * pmap_remove (slow...)
- */
-
-void
-pmap_remove_all(vm_page_t m)
-{
- pv_entry_t pv;
- pmap_t pmap;
- pt_entry_t *pte, tpte;
- vm_page_t free;
-
- KASSERT((m->oflags & VPO_UNMANAGED) == 0,
- ("pmap_remove_all: page %p is not managed", m));
- free = NULL;
- rw_wlock(&pvh_global_lock);
- sched_pin();
- while ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) {
- pmap = PV_PMAP(pv);
- PMAP_LOCK(pmap);
- pmap->pm_stats.resident_count--;
- pte = pmap_pte_quick(pmap, pv->pv_va);
- tpte = *pte;
- PT_SET_VA_MA(pte, 0, TRUE);
- KASSERT(tpte != 0, ("pmap_remove_all: pmap %p va %x zero pte",
- pmap, pv->pv_va));
- if (tpte & PG_W)
- pmap->pm_stats.wired_count--;
- if (tpte & PG_A)
- vm_page_aflag_set(m, PGA_REFERENCED);
-
- /*
- * Update the vm_page_t clean and reference bits.
- */
- if ((tpte & (PG_M | PG_RW)) == (PG_M | PG_RW))
- vm_page_dirty(m);
- pmap_unuse_pt(pmap, pv->pv_va, &free);
- pmap_invalidate_page(pmap, pv->pv_va);
- TAILQ_REMOVE(&m->md.pv_list, pv, pv_next);
- free_pv_entry(pmap, pv);
- PMAP_UNLOCK(pmap);
- }
- vm_page_aflag_clear(m, PGA_WRITEABLE);
- PT_UPDATES_FLUSH();
- if (*PMAP1)
- PT_SET_MA(PADDR1, 0);
- sched_unpin();
- rw_wunlock(&pvh_global_lock);
- pmap_free_zero_pages(free);
-}
-
-/*
- * Set the physical protection on the
- * specified range of this map as requested.
- */
-void
-pmap_protect(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot)
-{
- vm_offset_t pdnxt;
- pd_entry_t ptpaddr;
- pt_entry_t *pte;
- int anychanged;
-
- CTR4(KTR_PMAP, "pmap_protect: pmap=%p sva=0x%x eva=0x%x prot=0x%x",
- pmap, sva, eva, prot);
-
- if ((prot & VM_PROT_READ) == VM_PROT_NONE) {
- pmap_remove(pmap, sva, eva);
- return;
- }
-
-#ifdef PAE
- if ((prot & (VM_PROT_WRITE|VM_PROT_EXECUTE)) ==
- (VM_PROT_WRITE|VM_PROT_EXECUTE))
- return;
-#else
- if (prot & VM_PROT_WRITE)
- return;
-#endif
-
- anychanged = 0;
-
- rw_wlock(&pvh_global_lock);
- sched_pin();
- PMAP_LOCK(pmap);
- for (; sva < eva; sva = pdnxt) {
- pt_entry_t obits, pbits;
- u_int pdirindex;
-
- pdnxt = (sva + NBPDR) & ~PDRMASK;
- if (pdnxt < sva)
- pdnxt = eva;
-
- pdirindex = sva >> PDRSHIFT;
- ptpaddr = pmap->pm_pdir[pdirindex];
-
- /*
- * Weed out invalid mappings. Note: we assume that the page
- * directory table is always allocated, and in kernel virtual.
- */
- if (ptpaddr == 0)
- continue;
-
- /*
- * Check for large page.
- */
- if ((ptpaddr & PG_PS) != 0) {
- if ((prot & VM_PROT_WRITE) == 0)
- pmap->pm_pdir[pdirindex] &= ~(PG_M|PG_RW);
-#ifdef PAE
- if ((prot & VM_PROT_EXECUTE) == 0)
- pmap->pm_pdir[pdirindex] |= pg_nx;
-#endif
- anychanged = 1;
- continue;
- }
-
- if (pdnxt > eva)
- pdnxt = eva;
-
- for (pte = pmap_pte_quick(pmap, sva); sva != pdnxt; pte++,
- sva += PAGE_SIZE) {
- vm_page_t m;
-
-retry:
- /*
- * Regardless of whether a pte is 32 or 64 bits in
- * size, PG_RW, PG_A, and PG_M are among the least
- * significant 32 bits.
- */
- obits = pbits = *pte;
- if ((pbits & PG_V) == 0)
- continue;
-
- if ((prot & VM_PROT_WRITE) == 0) {
- if ((pbits & (PG_MANAGED | PG_M | PG_RW)) ==
- (PG_MANAGED | PG_M | PG_RW)) {
- m = PHYS_TO_VM_PAGE(xpmap_mtop(pbits) &
- PG_FRAME);
- vm_page_dirty(m);
- }
- pbits &= ~(PG_RW | PG_M);
- }
-#ifdef PAE
- if ((prot & VM_PROT_EXECUTE) == 0)
- pbits |= pg_nx;
-#endif
-
- if (pbits != obits) {
- obits = *pte;
- PT_SET_VA_MA(pte, pbits, TRUE);
- if (*pte != pbits)
- goto retry;
- if (obits & PG_G)
- pmap_invalidate_page(pmap, sva);
- else
- anychanged = 1;
- }
- }
- }
- PT_UPDATES_FLUSH();
- if (*PMAP1)
- PT_SET_VA_MA(PMAP1, 0, TRUE);
- if (anychanged)
- pmap_invalidate_all(pmap);
- sched_unpin();
- rw_wunlock(&pvh_global_lock);
- PMAP_UNLOCK(pmap);
-}
-
-/*
- * Insert the given physical page (p) at
- * the specified virtual address (v) in the
- * target physical map with the protection requested.
- *
- * If specified, the page will be wired down, meaning
- * that the related pte can not be reclaimed.
- *
- * NB: This is the only routine which MAY NOT lazy-evaluate
- * or lose information. That is, this routine must actually
- * insert this page into the given map NOW.
- */
-int
-pmap_enter(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot,
- u_int flags, int8_t psind __unused)
-{
- pd_entry_t *pde;
- pt_entry_t *pte;
- pt_entry_t newpte, origpte;
- pv_entry_t pv;
- vm_paddr_t opa, pa;
- vm_page_t mpte, om;
- boolean_t invlva, wired;
-
- CTR5(KTR_PMAP,
- "pmap_enter: pmap=%08p va=0x%08x ma=0x%08x prot=0x%x flags=0x%x",
- pmap, va, VM_PAGE_TO_MACH(m), prot, flags);
- va = trunc_page(va);
- KASSERT(va <= VM_MAX_KERNEL_ADDRESS, ("pmap_enter: toobig"));
- KASSERT(va < UPT_MIN_ADDRESS || va >= UPT_MAX_ADDRESS,
- ("pmap_enter: invalid to pmap_enter page table pages (va: 0x%x)",
- va));
- if ((m->oflags & VPO_UNMANAGED) == 0 && !vm_page_xbusied(m))
- VM_OBJECT_ASSERT_LOCKED(m->object);
-
- mpte = NULL;
- wired = (flags & PMAP_ENTER_WIRED) != 0;
-
- rw_wlock(&pvh_global_lock);
- PMAP_LOCK(pmap);
- sched_pin();
-
- /*
- * In the case that a page table page is not
- * resident, we are creating it here.
- */
- if (va < VM_MAXUSER_ADDRESS) {
- mpte = pmap_allocpte(pmap, va, flags);
- if (mpte == NULL) {
- KASSERT((flags & PMAP_ENTER_NOSLEEP) != 0,
- ("pmap_allocpte failed with sleep allowed"));
- sched_unpin();
- rw_wunlock(&pvh_global_lock);
- PMAP_UNLOCK(pmap);
- return (KERN_RESOURCE_SHORTAGE);
- }
- }
-
- pde = pmap_pde(pmap, va);
- if ((*pde & PG_PS) != 0)
- panic("pmap_enter: attempted pmap_enter on 4MB page");
- pte = pmap_pte_quick(pmap, va);
-
- /*
- * Page Directory table entry not valid, we need a new PT page
- */
- if (pte == NULL) {
- panic("pmap_enter: invalid page directory pdir=%#jx, va=%#x",
- (uintmax_t)pmap->pm_pdir[va >> PDRSHIFT], va);
- }
-
- pa = VM_PAGE_TO_PHYS(m);
- om = NULL;
- opa = origpte = 0;
-
-#if 0
- KASSERT((*pte & PG_V) || (*pte == 0), ("address set but not valid pte=%p *pte=0x%016jx",
- pte, *pte));
-#endif
- origpte = *pte;
- if (origpte)
- origpte = xpmap_mtop(origpte);
- opa = origpte & PG_FRAME;
-
- /*
- * Mapping has not changed, must be protection or wiring change.
- */
- if (origpte && (opa == pa)) {
- /*
- * Wiring change, just update stats. We don't worry about
- * wiring PT pages as they remain resident as long as there
- * are valid mappings in them. Hence, if a user page is wired,
- * the PT page will be also.
- */
- if (wired && ((origpte & PG_W) == 0))
- pmap->pm_stats.wired_count++;
- else if (!wired && (origpte & PG_W))
- pmap->pm_stats.wired_count--;
-
- /*
- * Remove extra pte reference
- */
- if (mpte)
- mpte->wire_count--;
-
- if (origpte & PG_MANAGED) {
- om = m;
- pa |= PG_MANAGED;
- }
- goto validate;
- }
-
- pv = NULL;
-
- /*
- * Mapping has changed, invalidate old range and fall through to
- * handle validating new mapping.
- */
- if (opa) {
- if (origpte & PG_W)
- pmap->pm_stats.wired_count--;
- if (origpte & PG_MANAGED) {
- om = PHYS_TO_VM_PAGE(opa);
- pv = pmap_pvh_remove(&om->md, pmap, va);
- } else if (va < VM_MAXUSER_ADDRESS)
- printf("va=0x%x is unmanaged :-( \n", va);
-
- if (mpte != NULL) {
- mpte->wire_count--;
- KASSERT(mpte->wire_count > 0,
- ("pmap_enter: missing reference to page table page,"
- " va: 0x%x", va));
- }
- } else
- pmap->pm_stats.resident_count++;
-
- /*
- * Enter on the PV list if part of our managed memory.
- */
- if ((m->oflags & VPO_UNMANAGED) == 0) {
- KASSERT(va < kmi.clean_sva || va >= kmi.clean_eva,
- ("pmap_enter: managed mapping within the clean submap"));
- if (pv == NULL)
- pv = get_pv_entry(pmap, FALSE);
- pv->pv_va = va;
- TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_next);
- pa |= PG_MANAGED;
- } else if (pv != NULL)
- free_pv_entry(pmap, pv);
-
- /*
- * Increment counters
- */
- if (wired)
- pmap->pm_stats.wired_count++;
-
-validate:
- /*
- * Now validate mapping with desired protection/wiring.
- */
- newpte = (pt_entry_t)(pa | PG_V);
- if ((prot & VM_PROT_WRITE) != 0) {
- newpte |= PG_RW;
- if ((newpte & PG_MANAGED) != 0)
- vm_page_aflag_set(m, PGA_WRITEABLE);
- }
-#ifdef PAE
- if ((prot & VM_PROT_EXECUTE) == 0)
- newpte |= pg_nx;
-#endif
- if (wired)
- newpte |= PG_W;
- if (va < VM_MAXUSER_ADDRESS)
- newpte |= PG_U;
- if (pmap == kernel_pmap)
- newpte |= pgeflag;
-
- critical_enter();
- /*
- * if the mapping or permission bits are different, we need
- * to update the pte.
- */
- if ((origpte & ~(PG_M|PG_A)) != newpte) {
- if (origpte) {
- invlva = FALSE;
- origpte = *pte;
- PT_SET_VA(pte, newpte | PG_A, FALSE);
- if (origpte & PG_A) {
- if (origpte & PG_MANAGED)
- vm_page_aflag_set(om, PGA_REFERENCED);
- if (opa != VM_PAGE_TO_PHYS(m))
- invlva = TRUE;
-#ifdef PAE
- if ((origpte & PG_NX) == 0 &&
- (newpte & PG_NX) != 0)
- invlva = TRUE;
-#endif
- }
- if ((origpte & (PG_M | PG_RW)) == (PG_M | PG_RW)) {
- if ((origpte & PG_MANAGED) != 0)
- vm_page_dirty(om);
- if ((prot & VM_PROT_WRITE) == 0)
- invlva = TRUE;
- }
- if ((origpte & PG_MANAGED) != 0 &&
- TAILQ_EMPTY(&om->md.pv_list))
- vm_page_aflag_clear(om, PGA_WRITEABLE);
- if (invlva)
- pmap_invalidate_page(pmap, va);
- } else{
- PT_SET_VA(pte, newpte | PG_A, FALSE);
- }
-
- }
- PT_UPDATES_FLUSH();
- critical_exit();
- if (*PMAP1)
- PT_SET_VA_MA(PMAP1, 0, TRUE);
- sched_unpin();
- rw_wunlock(&pvh_global_lock);
- PMAP_UNLOCK(pmap);
- return (KERN_SUCCESS);
-}
-
-/*
- * Maps a sequence of resident pages belonging to the same object.
- * The sequence begins with the given page m_start. This page is
- * mapped at the given virtual address start. Each subsequent page is
- * mapped at a virtual address that is offset from start by the same
- * amount as the page is offset from m_start within the object. The
- * last page in the sequence is the page with the largest offset from
- * m_start that can be mapped at a virtual address less than the given
- * virtual address end. Not every virtual page between start and end
- * is mapped; only those for which a resident page exists with the
- * corresponding offset from m_start are mapped.
- */
-void
-pmap_enter_object(pmap_t pmap, vm_offset_t start, vm_offset_t end,
- vm_page_t m_start, vm_prot_t prot)
-{
- vm_page_t m, mpte;
- vm_pindex_t diff, psize;
- multicall_entry_t mcl[16];
- multicall_entry_t *mclp = mcl;
- int error, count = 0;
-
- VM_OBJECT_ASSERT_LOCKED(m_start->object);
-
- psize = atop(end - start);
- mpte = NULL;
- m = m_start;
- rw_wlock(&pvh_global_lock);
- PMAP_LOCK(pmap);
- while (m != NULL && (diff = m->pindex - m_start->pindex) < psize) {
- mpte = pmap_enter_quick_locked(&mclp, &count, pmap, start + ptoa(diff), m,
- prot, mpte);
- m = TAILQ_NEXT(m, listq);
- if (count == 16) {
- error = HYPERVISOR_multicall(mcl, count);
- KASSERT(error == 0, ("bad multicall %d", error));
- mclp = mcl;
- count = 0;
- }
- }
- if (count) {
- error = HYPERVISOR_multicall(mcl, count);
- KASSERT(error == 0, ("bad multicall %d", error));
- }
- rw_wunlock(&pvh_global_lock);
- PMAP_UNLOCK(pmap);
-}
-
-/*
- * this code makes some *MAJOR* assumptions:
- * 1. Current pmap & pmap exists.
- * 2. Not wired.
- * 3. Read access.
- * 4. No page table pages.
- * but is *MUCH* faster than pmap_enter...
- */
-
-void
-pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot)
-{
- multicall_entry_t mcl, *mclp;
- int count = 0;
- mclp = &mcl;
-
- CTR4(KTR_PMAP, "pmap_enter_quick: pmap=%p va=0x%x m=%p prot=0x%x",
- pmap, va, m, prot);
-
- rw_wlock(&pvh_global_lock);
- PMAP_LOCK(pmap);
- (void)pmap_enter_quick_locked(&mclp, &count, pmap, va, m, prot, NULL);
- if (count)
- HYPERVISOR_multicall(&mcl, count);
- rw_wunlock(&pvh_global_lock);
- PMAP_UNLOCK(pmap);
-}
-
-#ifdef notyet
-void
-pmap_enter_quick_range(pmap_t pmap, vm_offset_t *addrs, vm_page_t *pages, vm_prot_t *prots, int count)
-{
- int i, error, index = 0;
- multicall_entry_t mcl[16];
- multicall_entry_t *mclp = mcl;
-
- PMAP_LOCK(pmap);
- for (i = 0; i < count; i++, addrs++, pages++, prots++) {
- if (!pmap_is_prefaultable_locked(pmap, *addrs))
- continue;
-
- (void) pmap_enter_quick_locked(&mclp, &index, pmap, *addrs, *pages, *prots, NULL);
- if (index == 16) {
- error = HYPERVISOR_multicall(mcl, index);
- mclp = mcl;
- index = 0;
- KASSERT(error == 0, ("bad multicall %d", error));
- }
- }
- if (index) {
- error = HYPERVISOR_multicall(mcl, index);
- KASSERT(error == 0, ("bad multicall %d", error));
- }
-
- PMAP_UNLOCK(pmap);
-}
-#endif
-
-static vm_page_t
-pmap_enter_quick_locked(multicall_entry_t **mclpp, int *count, pmap_t pmap, vm_offset_t va, vm_page_t m,
- vm_prot_t prot, vm_page_t mpte)
-{
- pt_entry_t *pte;
- vm_paddr_t pa;
- vm_page_t free;
- multicall_entry_t *mcl = *mclpp;
-
- KASSERT(va < kmi.clean_sva || va >= kmi.clean_eva ||
- (m->oflags & VPO_UNMANAGED) != 0,
- ("pmap_enter_quick_locked: managed mapping within the clean submap"));
- rw_assert(&pvh_global_lock, RA_WLOCKED);
- PMAP_LOCK_ASSERT(pmap, MA_OWNED);
-
- /*
- * In the case that a page table page is not
- * resident, we are creating it here.
- */
- if (va < VM_MAXUSER_ADDRESS) {
- u_int ptepindex;
- pd_entry_t ptema;
-
- /*
- * Calculate pagetable page index
- */
- ptepindex = va >> PDRSHIFT;
- if (mpte && (mpte->pindex == ptepindex)) {
- mpte->wire_count++;
- } else {
- /*
- * Get the page directory entry
- */
- ptema = pmap->pm_pdir[ptepindex];
-
- /*
- * If the page table page is mapped, we just increment
- * the hold count, and activate it.
- */
- if (ptema & PG_V) {
- if (ptema & PG_PS)
- panic("pmap_enter_quick: unexpected mapping into 4MB page");
- mpte = PHYS_TO_VM_PAGE(xpmap_mtop(ptema) & PG_FRAME);
- mpte->wire_count++;
- } else {
- mpte = _pmap_allocpte(pmap, ptepindex,
- PMAP_ENTER_NOSLEEP);
- if (mpte == NULL)
- return (mpte);
- }
- }
- } else {
- mpte = NULL;
- }
-
- /*
- * This call to vtopte makes the assumption that we are
- * entering the page into the current pmap. In order to support
- * quick entry into any pmap, one would likely use pmap_pte_quick.
- * But that isn't as quick as vtopte.
- */
- KASSERT(pmap_is_current(pmap), ("entering pages in non-current pmap"));
- pte = vtopte(va);
- if (*pte & PG_V) {
- if (mpte != NULL) {
- mpte->wire_count--;
- mpte = NULL;
- }
- return (mpte);
- }
-
- /*
- * Enter on the PV list if part of our managed memory.
- */
- if ((m->oflags & VPO_UNMANAGED) == 0 &&
- !pmap_try_insert_pv_entry(pmap, va, m)) {
- if (mpte != NULL) {
- free = NULL;
- if (pmap_unwire_ptp(pmap, mpte, &free)) {
- pmap_invalidate_page(pmap, va);
- pmap_free_zero_pages(free);
- }
-
- mpte = NULL;
- }
- return (mpte);
- }
-
- /*
- * Increment counters
- */
- pmap->pm_stats.resident_count++;
-
- pa = VM_PAGE_TO_PHYS(m);
-#ifdef PAE
- if ((prot & VM_PROT_EXECUTE) == 0)
- pa |= pg_nx;
-#endif
-
-#if 0
- /*
- * Now validate mapping with RO protection
- */
- if ((m->oflags & VPO_UNMANAGED) != 0)
- pte_store(pte, pa | PG_V | PG_U);
- else
- pte_store(pte, pa | PG_V | PG_U | PG_MANAGED);
-#else
- /*
- * Now validate mapping with RO protection
- */
- if ((m->oflags & VPO_UNMANAGED) != 0)
- pa = xpmap_ptom(pa | PG_V | PG_U);
- else
- pa = xpmap_ptom(pa | PG_V | PG_U | PG_MANAGED);
-
- mcl->op = __HYPERVISOR_update_va_mapping;
- mcl->args[0] = va;
- mcl->args[1] = (uint32_t)(pa & 0xffffffff);
- mcl->args[2] = (uint32_t)(pa >> 32);
- mcl->args[3] = 0;
- *mclpp = mcl + 1;
- *count = *count + 1;
-#endif
- return (mpte);
-}
-
-/*
- * Make a temporary mapping for a physical address. This is only intended
- * to be used for panic dumps.
- */
-void *
-pmap_kenter_temporary(vm_paddr_t pa, int i)
-{
- vm_offset_t va;
- vm_paddr_t ma = xpmap_ptom(pa);
-
- va = (vm_offset_t)crashdumpmap + (i * PAGE_SIZE);
- PT_SET_MA(va, (ma & ~PAGE_MASK) | PG_V | pgeflag);
- invlpg(va);
- return ((void *)crashdumpmap);
-}
-
-/*
- * This code maps large physical mmap regions into the
- * processor address space. Note that some shortcuts
- * are taken, but the code works.
- */
-void
-pmap_object_init_pt(pmap_t pmap, vm_offset_t addr, vm_object_t object,
- vm_pindex_t pindex, vm_size_t size)
-{
- pd_entry_t *pde;
- vm_paddr_t pa, ptepa;
- vm_page_t p;
- int pat_mode;
-
- VM_OBJECT_ASSERT_WLOCKED(object);
- KASSERT(object->type == OBJT_DEVICE || object->type == OBJT_SG,
- ("pmap_object_init_pt: non-device object"));
- if (pseflag &&
- (addr & (NBPDR - 1)) == 0 && (size & (NBPDR - 1)) == 0) {
- if (!vm_object_populate(object, pindex, pindex + atop(size)))
- return;
- p = vm_page_lookup(object, pindex);
- KASSERT(p->valid == VM_PAGE_BITS_ALL,
- ("pmap_object_init_pt: invalid page %p", p));
- pat_mode = p->md.pat_mode;
-
- /*
- * Abort the mapping if the first page is not physically
- * aligned to a 2/4MB page boundary.
- */
- ptepa = VM_PAGE_TO_PHYS(p);
- if (ptepa & (NBPDR - 1))
- return;
-
- /*
- * Skip the first page. Abort the mapping if the rest of
- * the pages are not physically contiguous or have differing
- * memory attributes.
- */
- p = TAILQ_NEXT(p, listq);
- for (pa = ptepa + PAGE_SIZE; pa < ptepa + size;
- pa += PAGE_SIZE) {
- KASSERT(p->valid == VM_PAGE_BITS_ALL,
- ("pmap_object_init_pt: invalid page %p", p));
- if (pa != VM_PAGE_TO_PHYS(p) ||
- pat_mode != p->md.pat_mode)
- return;
- p = TAILQ_NEXT(p, listq);
- }
-
- /*
- * Map using 2/4MB pages. Since "ptepa" is 2/4M aligned and
- * "size" is a multiple of 2/4M, adding the PAT setting to
- * "pa" will not affect the termination of this loop.
- */
- PMAP_LOCK(pmap);
- for (pa = ptepa | pmap_cache_bits(pat_mode, 1); pa < ptepa +
- size; pa += NBPDR) {
- pde = pmap_pde(pmap, addr);
- if (*pde == 0) {
- pde_store(pde, pa | PG_PS | PG_M | PG_A |
- PG_U | PG_RW | PG_V);
- pmap->pm_stats.resident_count += NBPDR /
- PAGE_SIZE;
- pmap_pde_mappings++;
- }
- /* Else continue on if the PDE is already valid. */
- addr += NBPDR;
- }
- PMAP_UNLOCK(pmap);
- }
-}
-
-/*
- * Clear the wired attribute from the mappings for the specified range of
- * addresses in the given pmap. Every valid mapping within that range
- * must have the wired attribute set. In contrast, invalid mappings
- * cannot have the wired attribute set, so they are ignored.
- *
- * The wired attribute of the page table entry is not a hardware feature,
- * so there is no need to invalidate any TLB entries.
- */
-void
-pmap_unwire(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
-{
- vm_offset_t pdnxt;
- pd_entry_t *pde;
- pt_entry_t *pte;
-
- CTR3(KTR_PMAP, "pmap_unwire: pmap=%p sva=0x%x eva=0x%x", pmap, sva,
- eva);
- rw_wlock(&pvh_global_lock);
- sched_pin();
- PMAP_LOCK(pmap);
- for (; sva < eva; sva = pdnxt) {
- pdnxt = (sva + NBPDR) & ~PDRMASK;
- if (pdnxt < sva)
- pdnxt = eva;
- pde = pmap_pde(pmap, sva);
- if ((*pde & PG_V) == 0)
- continue;
- if ((*pde & PG_PS) != 0)
- panic("pmap_unwire: unexpected PG_PS in pde %#jx",
- (uintmax_t)*pde);
- if (pdnxt > eva)
- pdnxt = eva;
- for (pte = pmap_pte_quick(pmap, sva); sva != pdnxt; pte++,
- sva += PAGE_SIZE) {
- if ((*pte & PG_V) == 0)
- continue;
- if ((*pte & PG_W) == 0)
- panic("pmap_unwire: pte %#jx is missing PG_W",
- (uintmax_t)*pte);
- PT_SET_VA_MA(pte, *pte & ~PG_W, FALSE);
- pmap->pm_stats.wired_count--;
- }
- }
- if (*PMAP1)
- PT_CLEAR_VA(PMAP1, FALSE);
- PT_UPDATES_FLUSH();
- sched_unpin();
- rw_wunlock(&pvh_global_lock);
- PMAP_UNLOCK(pmap);
-}
-
-
-/*
- * Copy the range specified by src_addr/len
- * from the source map to the range dst_addr/len
- * in the destination map.
- *
- * This routine is only advisory and need not do anything.
- */
-
-void
-pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vm_offset_t dst_addr, vm_size_t len,
- vm_offset_t src_addr)
-{
- vm_page_t free;
- vm_offset_t addr;
- vm_offset_t end_addr = src_addr + len;
- vm_offset_t pdnxt;
-
- if (dst_addr != src_addr)
- return;
-
- if (!pmap_is_current(src_pmap)) {
- CTR2(KTR_PMAP,
- "pmap_copy, skipping: pdir[PTDPTDI]=0x%jx PTDpde[0]=0x%jx",
- (src_pmap->pm_pdir[PTDPTDI] & PG_FRAME), (PTDpde[0] & PG_FRAME));
-
- return;
- }
- CTR5(KTR_PMAP, "pmap_copy: dst_pmap=%p src_pmap=%p dst_addr=0x%x len=%d src_addr=0x%x",
- dst_pmap, src_pmap, dst_addr, len, src_addr);
-
-#ifdef HAMFISTED_LOCKING
- mtx_lock(&createdelete_lock);
-#endif
-
- rw_wlock(&pvh_global_lock);
- if (dst_pmap < src_pmap) {
- PMAP_LOCK(dst_pmap);
- PMAP_LOCK(src_pmap);
- } else {
- PMAP_LOCK(src_pmap);
- PMAP_LOCK(dst_pmap);
- }
- sched_pin();
- for (addr = src_addr; addr < end_addr; addr = pdnxt) {
- pt_entry_t *src_pte, *dst_pte;
- vm_page_t dstmpte, srcmpte;
- pd_entry_t srcptepaddr;
- u_int ptepindex;
-
- KASSERT(addr < UPT_MIN_ADDRESS,
- ("pmap_copy: invalid to pmap_copy page tables"));
-
- pdnxt = (addr + NBPDR) & ~PDRMASK;
- if (pdnxt < addr)
- pdnxt = end_addr;
- ptepindex = addr >> PDRSHIFT;
-
- srcptepaddr = PT_GET(&src_pmap->pm_pdir[ptepindex]);
- if (srcptepaddr == 0)
- continue;
-
- if (srcptepaddr & PG_PS) {
- if (dst_pmap->pm_pdir[ptepindex] == 0) {
- PD_SET_VA(dst_pmap, ptepindex, srcptepaddr & ~PG_W, TRUE);
- dst_pmap->pm_stats.resident_count +=
- NBPDR / PAGE_SIZE;
- }
- continue;
- }
-
- srcmpte = PHYS_TO_VM_PAGE(srcptepaddr & PG_FRAME);
- KASSERT(srcmpte->wire_count > 0,
- ("pmap_copy: source page table page is unused"));
-
- if (pdnxt > end_addr)
- pdnxt = end_addr;
-
- src_pte = vtopte(addr);
- while (addr < pdnxt) {
- pt_entry_t ptetemp;
- ptetemp = *src_pte;
- /*
- * we only virtual copy managed pages
- */
- if ((ptetemp & PG_MANAGED) != 0) {
- dstmpte = pmap_allocpte(dst_pmap, addr,
- PMAP_ENTER_NOSLEEP);
- if (dstmpte == NULL)
- goto out;
- dst_pte = pmap_pte_quick(dst_pmap, addr);
- if (*dst_pte == 0 &&
- pmap_try_insert_pv_entry(dst_pmap, addr,
- PHYS_TO_VM_PAGE(xpmap_mtop(ptetemp) & PG_FRAME))) {
- /*
- * Clear the wired, modified, and
- * accessed (referenced) bits
- * during the copy.
- */
- KASSERT(ptetemp != 0, ("src_pte not set"));
- PT_SET_VA_MA(dst_pte, ptetemp & ~(PG_W | PG_M | PG_A), TRUE /* XXX debug */);
- KASSERT(*dst_pte == (ptetemp & ~(PG_W | PG_M | PG_A)),
- ("no pmap copy expected: 0x%jx saw: 0x%jx",
- ptetemp & ~(PG_W | PG_M | PG_A), *dst_pte));
- dst_pmap->pm_stats.resident_count++;
- } else {
- free = NULL;
- if (pmap_unwire_ptp(dst_pmap, dstmpte,
- &free)) {
- pmap_invalidate_page(dst_pmap,
- addr);
- pmap_free_zero_pages(free);
- }
- goto out;
- }
- if (dstmpte->wire_count >= srcmpte->wire_count)
- break;
- }
- addr += PAGE_SIZE;
- src_pte++;
- }
- }
-out:
- PT_UPDATES_FLUSH();
- sched_unpin();
- rw_wunlock(&pvh_global_lock);
- PMAP_UNLOCK(src_pmap);
- PMAP_UNLOCK(dst_pmap);
-
-#ifdef HAMFISTED_LOCKING
- mtx_unlock(&createdelete_lock);
-#endif
-}
-
-static __inline void
-pagezero(void *page)
-{
-#if defined(I686_CPU)
- if (cpu_class == CPUCLASS_686) {
-#if defined(CPU_ENABLE_SSE)
- if (cpu_feature & CPUID_SSE2)
- sse2_pagezero(page);
- else
-#endif
- i686_pagezero(page);
- } else
-#endif
- bzero(page, PAGE_SIZE);
-}
-
-/*
- * pmap_zero_page zeros the specified hardware page by mapping
- * the page into KVM and using bzero to clear its contents.
- */
-void
-pmap_zero_page(vm_page_t m)
-{
- struct sysmaps *sysmaps;
-
- sysmaps = &sysmaps_pcpu[PCPU_GET(cpuid)];
- mtx_lock(&sysmaps->lock);
- if (*sysmaps->CMAP2)
- panic("pmap_zero_page: CMAP2 busy");
- sched_pin();
- PT_SET_MA(sysmaps->CADDR2, PG_V | PG_RW | VM_PAGE_TO_MACH(m) | PG_A | PG_M);
- pagezero(sysmaps->CADDR2);
- PT_SET_MA(sysmaps->CADDR2, 0);
- sched_unpin();
- mtx_unlock(&sysmaps->lock);
-}
-
-/*
- * pmap_zero_page_area zeros the specified hardware page by mapping
- * the page into KVM and using bzero to clear its contents.
- *
- * off and size may not cover an area beyond a single hardware page.
- */
-void
-pmap_zero_page_area(vm_page_t m, int off, int size)
-{
- struct sysmaps *sysmaps;
-
- sysmaps = &sysmaps_pcpu[PCPU_GET(cpuid)];
- mtx_lock(&sysmaps->lock);
- if (*sysmaps->CMAP2)
- panic("pmap_zero_page_area: CMAP2 busy");
- sched_pin();
- PT_SET_MA(sysmaps->CADDR2, PG_V | PG_RW | VM_PAGE_TO_MACH(m) | PG_A | PG_M);
-
- if (off == 0 && size == PAGE_SIZE)
- pagezero(sysmaps->CADDR2);
- else
- bzero((char *)sysmaps->CADDR2 + off, size);
- PT_SET_MA(sysmaps->CADDR2, 0);
- sched_unpin();
- mtx_unlock(&sysmaps->lock);
-}
-
-/*
- * pmap_zero_page_idle zeros the specified hardware page by mapping
- * the page into KVM and using bzero to clear its contents. This
- * is intended to be called from the vm_pagezero process only and
- * outside of Giant.
- */
-void
-pmap_zero_page_idle(vm_page_t m)
-{
-
- if (*CMAP3)
- panic("pmap_zero_page_idle: CMAP3 busy");
- sched_pin();
- PT_SET_MA(CADDR3, PG_V | PG_RW | VM_PAGE_TO_MACH(m) | PG_A | PG_M);
- pagezero(CADDR3);
- PT_SET_MA(CADDR3, 0);
- sched_unpin();
-}
-
-/*
- * pmap_copy_page copies the specified (machine independent)
- * page by mapping the page into virtual memory and using
- * bcopy to copy the page, one machine dependent page at a
- * time.
- */
-void
-pmap_copy_page(vm_page_t src, vm_page_t dst)
-{
- struct sysmaps *sysmaps;
-
- sysmaps = &sysmaps_pcpu[PCPU_GET(cpuid)];
- mtx_lock(&sysmaps->lock);
- if (*sysmaps->CMAP1)
- panic("pmap_copy_page: CMAP1 busy");
- if (*sysmaps->CMAP2)
- panic("pmap_copy_page: CMAP2 busy");
- sched_pin();
- PT_SET_MA(sysmaps->CADDR1, PG_V | VM_PAGE_TO_MACH(src) | PG_A);
- PT_SET_MA(sysmaps->CADDR2, PG_V | PG_RW | VM_PAGE_TO_MACH(dst) | PG_A | PG_M);
- bcopy(sysmaps->CADDR1, sysmaps->CADDR2, PAGE_SIZE);
- PT_SET_MA(sysmaps->CADDR1, 0);
- PT_SET_MA(sysmaps->CADDR2, 0);
- sched_unpin();
- mtx_unlock(&sysmaps->lock);
-}
-
-int unmapped_buf_allowed = 1;
-
-void
-pmap_copy_pages(vm_page_t ma[], vm_offset_t a_offset, vm_page_t mb[],
- vm_offset_t b_offset, int xfersize)
-{
- struct sysmaps *sysmaps;
- vm_page_t a_pg, b_pg;
- char *a_cp, *b_cp;
- vm_offset_t a_pg_offset, b_pg_offset;
- int cnt;
-
- sysmaps = &sysmaps_pcpu[PCPU_GET(cpuid)];
- mtx_lock(&sysmaps->lock);
- if (*sysmaps->CMAP1 != 0)
- panic("pmap_copy_pages: CMAP1 busy");
- if (*sysmaps->CMAP2 != 0)
- panic("pmap_copy_pages: CMAP2 busy");
- sched_pin();
- while (xfersize > 0) {
- a_pg = ma[a_offset >> PAGE_SHIFT];
- a_pg_offset = a_offset & PAGE_MASK;
- cnt = min(xfersize, PAGE_SIZE - a_pg_offset);
- b_pg = mb[b_offset >> PAGE_SHIFT];
- b_pg_offset = b_offset & PAGE_MASK;
- cnt = min(cnt, PAGE_SIZE - b_pg_offset);
- PT_SET_MA(sysmaps->CADDR1, PG_V | VM_PAGE_TO_MACH(a_pg) | PG_A);
- PT_SET_MA(sysmaps->CADDR2, PG_V | PG_RW |
- VM_PAGE_TO_MACH(b_pg) | PG_A | PG_M);
- a_cp = sysmaps->CADDR1 + a_pg_offset;
- b_cp = sysmaps->CADDR2 + b_pg_offset;
- bcopy(a_cp, b_cp, cnt);
- a_offset += cnt;
- b_offset += cnt;
- xfersize -= cnt;
- }
- PT_SET_MA(sysmaps->CADDR1, 0);
- PT_SET_MA(sysmaps->CADDR2, 0);
- sched_unpin();
- mtx_unlock(&sysmaps->lock);
-}
-
-/*
- * Returns true if the pmap's pv is one of the first
- * 16 pvs linked to from this page. This count may
- * be changed upwards or downwards in the future; it
- * is only necessary that true be returned for a small
- * subset of pmaps for proper page aging.
- */
-boolean_t
-pmap_page_exists_quick(pmap_t pmap, vm_page_t m)
-{
- pv_entry_t pv;
- int loops = 0;
- boolean_t rv;
-
- KASSERT((m->oflags & VPO_UNMANAGED) == 0,
- ("pmap_page_exists_quick: page %p is not managed", m));
- rv = FALSE;
- rw_wlock(&pvh_global_lock);
- TAILQ_FOREACH(pv, &m->md.pv_list, pv_next) {
- if (PV_PMAP(pv) == pmap) {
- rv = TRUE;
- break;
- }
- loops++;
- if (loops >= 16)
- break;
- }
- rw_wunlock(&pvh_global_lock);
- return (rv);
-}
-
-/*
- * pmap_page_wired_mappings:
- *
- * Return the number of managed mappings to the given physical page
- * that are wired.
- */
-int
-pmap_page_wired_mappings(vm_page_t m)
-{
- pv_entry_t pv;
- pt_entry_t *pte;
- pmap_t pmap;
- int count;
-
- count = 0;
- if ((m->oflags & VPO_UNMANAGED) != 0)
- return (count);
- rw_wlock(&pvh_global_lock);
- sched_pin();
- TAILQ_FOREACH(pv, &m->md.pv_list, pv_next) {
- pmap = PV_PMAP(pv);
- PMAP_LOCK(pmap);
- pte = pmap_pte_quick(pmap, pv->pv_va);
- if ((*pte & PG_W) != 0)
- count++;
- PMAP_UNLOCK(pmap);
- }
- sched_unpin();
- rw_wunlock(&pvh_global_lock);
- return (count);
-}
-
-/*
- * Returns TRUE if the given page is mapped. Otherwise, returns FALSE.
- */
-boolean_t
-pmap_page_is_mapped(vm_page_t m)
-{
-
- if ((m->oflags & VPO_UNMANAGED) != 0)
- return (FALSE);
- return (!TAILQ_EMPTY(&m->md.pv_list));
-}
-
-/*
- * Remove all pages from specified address space
- * this aids process exit speeds. Also, this code
- * is special cased for current process only, but
- * can have the more generic (and slightly slower)
- * mode enabled. This is much faster than pmap_remove
- * in the case of running down an entire address space.
- */
-void
-pmap_remove_pages(pmap_t pmap)
-{
- pt_entry_t *pte, tpte;
- vm_page_t m, free = NULL;
- pv_entry_t pv;
- struct pv_chunk *pc, *npc;
- int field, idx;
- int32_t bit;
- uint32_t inuse, bitmask;
- int allfree;
-
- CTR1(KTR_PMAP, "pmap_remove_pages: pmap=%p", pmap);
-
- if (pmap != vmspace_pmap(curthread->td_proc->p_vmspace)) {
- printf("warning: pmap_remove_pages called with non-current pmap\n");
- return;
- }
- rw_wlock(&pvh_global_lock);
- KASSERT(pmap_is_current(pmap), ("removing pages from non-current pmap"));
- PMAP_LOCK(pmap);
- sched_pin();
- TAILQ_FOREACH_SAFE(pc, &pmap->pm_pvchunk, pc_list, npc) {
- KASSERT(pc->pc_pmap == pmap, ("Wrong pmap %p %p", pmap,
- pc->pc_pmap));
- allfree = 1;
- for (field = 0; field < _NPCM; field++) {
- inuse = ~pc->pc_map[field] & pc_freemask[field];
- while (inuse != 0) {
- bit = bsfl(inuse);
- bitmask = 1UL << bit;
- idx = field * 32 + bit;
- pv = &pc->pc_pventry[idx];
- inuse &= ~bitmask;
-
- pte = vtopte(pv->pv_va);
- tpte = *pte ? xpmap_mtop(*pte) : 0;
-
- if (tpte == 0) {
- printf(
- "TPTE at %p IS ZERO @ VA %08x\n",
- pte, pv->pv_va);
- panic("bad pte");
- }
-
-/*
- * We cannot remove wired pages from a process' mapping at this time
- */
- if (tpte & PG_W) {
- allfree = 0;
- continue;
- }
-
- m = PHYS_TO_VM_PAGE(tpte & PG_FRAME);
- KASSERT(m->phys_addr == (tpte & PG_FRAME),
- ("vm_page_t %p phys_addr mismatch %016jx %016jx",
- m, (uintmax_t)m->phys_addr,
- (uintmax_t)tpte));
-
- KASSERT(m < &vm_page_array[vm_page_array_size],
- ("pmap_remove_pages: bad tpte %#jx",
- (uintmax_t)tpte));
-
-
- PT_CLEAR_VA(pte, FALSE);
-
- /*
- * Update the vm_page_t clean/reference bits.
- */
- if (tpte & PG_M)
- vm_page_dirty(m);
-
- TAILQ_REMOVE(&m->md.pv_list, pv, pv_next);
- if (TAILQ_EMPTY(&m->md.pv_list))
- vm_page_aflag_clear(m, PGA_WRITEABLE);
-
- pmap_unuse_pt(pmap, pv->pv_va, &free);
-
- /* Mark free */
- PV_STAT(pv_entry_frees++);
- PV_STAT(pv_entry_spare++);
- pv_entry_count--;
- pc->pc_map[field] |= bitmask;
- pmap->pm_stats.resident_count--;
- }
- }
- PT_UPDATES_FLUSH();
- if (allfree) {
- TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
- free_pv_chunk(pc);
- }
- }
- PT_UPDATES_FLUSH();
- if (*PMAP1)
- PT_SET_MA(PADDR1, 0);
-
- sched_unpin();
- pmap_invalidate_all(pmap);
- rw_wunlock(&pvh_global_lock);
- PMAP_UNLOCK(pmap);
- pmap_free_zero_pages(free);
-}
-
-/*
- * pmap_is_modified:
- *
- * Return whether or not the specified physical page was modified
- * in any physical maps.
- */
-boolean_t
-pmap_is_modified(vm_page_t m)
-{
- pv_entry_t pv;
- pt_entry_t *pte;
- pmap_t pmap;
- boolean_t rv;
-
- KASSERT((m->oflags & VPO_UNMANAGED) == 0,
- ("pmap_is_modified: page %p is not managed", m));
- rv = FALSE;
-
- /*
- * If the page is not exclusive busied, then PGA_WRITEABLE cannot be
- * concurrently set while the object is locked. Thus, if PGA_WRITEABLE
- * is clear, no PTEs can have PG_M set.
- */
- VM_OBJECT_ASSERT_WLOCKED(m->object);
- if (!vm_page_xbusied(m) && (m->aflags & PGA_WRITEABLE) == 0)
- return (rv);
- rw_wlock(&pvh_global_lock);
- sched_pin();
- TAILQ_FOREACH(pv, &m->md.pv_list, pv_next) {
- pmap = PV_PMAP(pv);
- PMAP_LOCK(pmap);
- pte = pmap_pte_quick(pmap, pv->pv_va);
- rv = (*pte & PG_M) != 0;
- PMAP_UNLOCK(pmap);
- if (rv)
- break;
- }
- if (*PMAP1)
- PT_SET_MA(PADDR1, 0);
- sched_unpin();
- rw_wunlock(&pvh_global_lock);
- return (rv);
-}
-
-/*
- * pmap_is_prefaultable:
- *
- * Return whether or not the specified virtual address is elgible
- * for prefault.
- */
-static boolean_t
-pmap_is_prefaultable_locked(pmap_t pmap, vm_offset_t addr)
-{
- pt_entry_t *pte;
- boolean_t rv = FALSE;
-
- return (rv);
-
- if (pmap_is_current(pmap) && *pmap_pde(pmap, addr)) {
- pte = vtopte(addr);
- rv = (*pte == 0);
- }
- return (rv);
-}
-
-boolean_t
-pmap_is_prefaultable(pmap_t pmap, vm_offset_t addr)
-{
- boolean_t rv;
-
- PMAP_LOCK(pmap);
- rv = pmap_is_prefaultable_locked(pmap, addr);
- PMAP_UNLOCK(pmap);
- return (rv);
-}
-
-boolean_t
-pmap_is_referenced(vm_page_t m)
-{
- pv_entry_t pv;
- pt_entry_t *pte;
- pmap_t pmap;
- boolean_t rv;
-
- KASSERT((m->oflags & VPO_UNMANAGED) == 0,
- ("pmap_is_referenced: page %p is not managed", m));
- rv = FALSE;
- rw_wlock(&pvh_global_lock);
- sched_pin();
- TAILQ_FOREACH(pv, &m->md.pv_list, pv_next) {
- pmap = PV_PMAP(pv);
- PMAP_LOCK(pmap);
- pte = pmap_pte_quick(pmap, pv->pv_va);
- rv = (*pte & (PG_A | PG_V)) == (PG_A | PG_V);
- PMAP_UNLOCK(pmap);
- if (rv)
- break;
- }
- if (*PMAP1)
- PT_SET_MA(PADDR1, 0);
- sched_unpin();
- rw_wunlock(&pvh_global_lock);
- return (rv);
-}
-
-void
-pmap_map_readonly(pmap_t pmap, vm_offset_t va, int len)
-{
- int i, npages = round_page(len) >> PAGE_SHIFT;
- for (i = 0; i < npages; i++) {
- pt_entry_t *pte;
- pte = pmap_pte(pmap, (vm_offset_t)(va + i*PAGE_SIZE));
- rw_wlock(&pvh_global_lock);
- pte_store(pte, xpmap_mtop(*pte & ~(PG_RW|PG_M)));
- rw_wunlock(&pvh_global_lock);
- PMAP_MARK_PRIV(xpmap_mtop(*pte));
- pmap_pte_release(pte);
- }
-}
-
-void
-pmap_map_readwrite(pmap_t pmap, vm_offset_t va, int len)
-{
- int i, npages = round_page(len) >> PAGE_SHIFT;
- for (i = 0; i < npages; i++) {
- pt_entry_t *pte;
- pte = pmap_pte(pmap, (vm_offset_t)(va + i*PAGE_SIZE));
- PMAP_MARK_UNPRIV(xpmap_mtop(*pte));
- rw_wlock(&pvh_global_lock);
- pte_store(pte, xpmap_mtop(*pte) | (PG_RW|PG_M));
- rw_wunlock(&pvh_global_lock);
- pmap_pte_release(pte);
- }
-}
-
-/*
- * Clear the write and modified bits in each of the given page's mappings.
- */
-void
-pmap_remove_write(vm_page_t m)
-{
- pv_entry_t pv;
- pmap_t pmap;
- pt_entry_t oldpte, *pte;
-
- KASSERT((m->oflags & VPO_UNMANAGED) == 0,
- ("pmap_remove_write: page %p is not managed", m));
-
- /*
- * If the page is not exclusive busied, then PGA_WRITEABLE cannot be
- * set by another thread while the object is locked. Thus,
- * if PGA_WRITEABLE is clear, no page table entries need updating.
- */
- VM_OBJECT_ASSERT_WLOCKED(m->object);
- if (!vm_page_xbusied(m) && (m->aflags & PGA_WRITEABLE) == 0)
- return;
- rw_wlock(&pvh_global_lock);
- sched_pin();
- TAILQ_FOREACH(pv, &m->md.pv_list, pv_next) {
- pmap = PV_PMAP(pv);
- PMAP_LOCK(pmap);
- pte = pmap_pte_quick(pmap, pv->pv_va);
-retry:
- oldpte = *pte;
- if ((oldpte & PG_RW) != 0) {
- vm_paddr_t newpte = oldpte & ~(PG_RW | PG_M);
-
- /*
- * Regardless of whether a pte is 32 or 64 bits
- * in size, PG_RW and PG_M are among the least
- * significant 32 bits.
- */
- PT_SET_VA_MA(pte, newpte, TRUE);
- if (*pte != newpte)
- goto retry;
-
- if ((oldpte & PG_M) != 0)
- vm_page_dirty(m);
- pmap_invalidate_page(pmap, pv->pv_va);
- }
- PMAP_UNLOCK(pmap);
- }
- vm_page_aflag_clear(m, PGA_WRITEABLE);
- PT_UPDATES_FLUSH();
- if (*PMAP1)
- PT_SET_MA(PADDR1, 0);
- sched_unpin();
- rw_wunlock(&pvh_global_lock);
-}
-
-/*
- * pmap_ts_referenced:
- *
- * Return a count of reference bits for a page, clearing those bits.
- * It is not necessary for every reference bit to be cleared, but it
- * is necessary that 0 only be returned when there are truly no
- * reference bits set.
- *
- * XXX: The exact number of bits to check and clear is a matter that
- * should be tested and standardized at some point in the future for
- * optimal aging of shared pages.
- */
-int
-pmap_ts_referenced(vm_page_t m)
-{
- pv_entry_t pv, pvf, pvn;
- pmap_t pmap;
- pt_entry_t *pte;
- int rtval = 0;
-
- KASSERT((m->oflags & VPO_UNMANAGED) == 0,
- ("pmap_ts_referenced: page %p is not managed", m));
- rw_wlock(&pvh_global_lock);
- sched_pin();
- if ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) {
- pvf = pv;
- do {
- pvn = TAILQ_NEXT(pv, pv_next);
- TAILQ_REMOVE(&m->md.pv_list, pv, pv_next);
- TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_next);
- pmap = PV_PMAP(pv);
- PMAP_LOCK(pmap);
- pte = pmap_pte_quick(pmap, pv->pv_va);
- if ((*pte & PG_A) != 0) {
- PT_SET_VA_MA(pte, *pte & ~PG_A, FALSE);
- pmap_invalidate_page(pmap, pv->pv_va);
- rtval++;
- if (rtval > 4)
- pvn = NULL;
- }
- PMAP_UNLOCK(pmap);
- } while ((pv = pvn) != NULL && pv != pvf);
- }
- PT_UPDATES_FLUSH();
- if (*PMAP1)
- PT_SET_MA(PADDR1, 0);
- sched_unpin();
- rw_wunlock(&pvh_global_lock);
- return (rtval);
-}
-
-/*
- * Apply the given advice to the specified range of addresses within the
- * given pmap. Depending on the advice, clear the referenced and/or
- * modified flags in each mapping and set the mapped page's dirty field.
- */
-void
-pmap_advise(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, int advice)
-{
- pd_entry_t oldpde;
- pt_entry_t *pte;
- vm_offset_t pdnxt;
- vm_page_t m;
- boolean_t anychanged;
-
- if (advice != MADV_DONTNEED && advice != MADV_FREE)
- return;
- anychanged = FALSE;
- rw_wlock(&pvh_global_lock);
- sched_pin();
- PMAP_LOCK(pmap);
- for (; sva < eva; sva = pdnxt) {
- pdnxt = (sva + NBPDR) & ~PDRMASK;
- if (pdnxt < sva)
- pdnxt = eva;
- oldpde = pmap->pm_pdir[sva >> PDRSHIFT];
- if ((oldpde & (PG_PS | PG_V)) != PG_V)
- continue;
- if (pdnxt > eva)
- pdnxt = eva;
- for (pte = pmap_pte_quick(pmap, sva); sva != pdnxt; pte++,
- sva += PAGE_SIZE) {
- if ((*pte & (PG_MANAGED | PG_V)) != (PG_MANAGED |
- PG_V))
- continue;
- else if ((*pte & (PG_M | PG_RW)) == (PG_M | PG_RW)) {
- if (advice == MADV_DONTNEED) {
- /*
- * Future calls to pmap_is_modified()
- * can be avoided by making the page
- * dirty now.
- */
- m = PHYS_TO_VM_PAGE(xpmap_mtop(*pte) &
- PG_FRAME);
- vm_page_dirty(m);
- }
- PT_SET_VA_MA(pte, *pte & ~(PG_M | PG_A), TRUE);
- } else if ((*pte & PG_A) != 0)
- PT_SET_VA_MA(pte, *pte & ~PG_A, TRUE);
- else
- continue;
- if ((*pte & PG_G) != 0)
- pmap_invalidate_page(pmap, sva);
- else
- anychanged = TRUE;
- }
- }
- PT_UPDATES_FLUSH();
- if (*PMAP1)
- PT_SET_VA_MA(PMAP1, 0, TRUE);
- if (anychanged)
- pmap_invalidate_all(pmap);
- sched_unpin();
- rw_wunlock(&pvh_global_lock);
- PMAP_UNLOCK(pmap);
-}
-
-/*
- * Clear the modify bits on the specified physical page.
- */
-void
-pmap_clear_modify(vm_page_t m)
-{
- pv_entry_t pv;
- pmap_t pmap;
- pt_entry_t *pte;
-
- KASSERT((m->oflags & VPO_UNMANAGED) == 0,
- ("pmap_clear_modify: page %p is not managed", m));
- VM_OBJECT_ASSERT_WLOCKED(m->object);
- KASSERT(!vm_page_xbusied(m),
- ("pmap_clear_modify: page %p is exclusive busied", m));
-
- /*
- * If the page is not PGA_WRITEABLE, then no PTEs can have PG_M set.
- * If the object containing the page is locked and the page is not
- * exclusive busied, then PGA_WRITEABLE cannot be concurrently set.
- */
- if ((m->aflags & PGA_WRITEABLE) == 0)
- return;
- rw_wlock(&pvh_global_lock);
- sched_pin();
- TAILQ_FOREACH(pv, &m->md.pv_list, pv_next) {
- pmap = PV_PMAP(pv);
- PMAP_LOCK(pmap);
- pte = pmap_pte_quick(pmap, pv->pv_va);
- if ((*pte & (PG_M | PG_RW)) == (PG_M | PG_RW)) {
- /*
- * Regardless of whether a pte is 32 or 64 bits
- * in size, PG_M is among the least significant
- * 32 bits.
- */
- PT_SET_VA_MA(pte, *pte & ~PG_M, FALSE);
- pmap_invalidate_page(pmap, pv->pv_va);
- }
- PMAP_UNLOCK(pmap);
- }
- sched_unpin();
- rw_wunlock(&pvh_global_lock);
-}
-
-/*
- * Miscellaneous support routines follow
- */
-
-/*
- * Map a set of physical memory pages into the kernel virtual
- * address space. Return a pointer to where it is mapped. This
- * routine is intended to be used for mapping device memory,
- * NOT real memory.
- */
-void *
-pmap_mapdev_attr(vm_paddr_t pa, vm_size_t size, int mode)
-{
- vm_offset_t va, offset;
- vm_size_t tmpsize;
-
- offset = pa & PAGE_MASK;
- size = round_page(offset + size);
- pa = pa & PG_FRAME;
-
- if (pa < KERNLOAD && pa + size <= KERNLOAD)
- va = KERNBASE + pa;
- else
- va = kva_alloc(size);
- if (!va)
- panic("pmap_mapdev: Couldn't alloc kernel virtual memory");
-
- for (tmpsize = 0; tmpsize < size; tmpsize += PAGE_SIZE)
- pmap_kenter_attr(va + tmpsize, pa + tmpsize, mode);
- pmap_invalidate_range(kernel_pmap, va, va + tmpsize);
- pmap_invalidate_cache_range(va, va + size, FALSE);
- return ((void *)(va + offset));
-}
-
-void *
-pmap_mapdev(vm_paddr_t pa, vm_size_t size)
-{
-
- return (pmap_mapdev_attr(pa, size, PAT_UNCACHEABLE));
-}
-
-void *
-pmap_mapbios(vm_paddr_t pa, vm_size_t size)
-{
-
- return (pmap_mapdev_attr(pa, size, PAT_WRITE_BACK));
-}
-
-void
-pmap_unmapdev(vm_offset_t va, vm_size_t size)
-{
- vm_offset_t base, offset;
-
- if (va >= KERNBASE && va + size <= KERNBASE + KERNLOAD)
- return;
- base = trunc_page(va);
- offset = va & PAGE_MASK;
- size = round_page(offset + size);
- kva_free(base, size);
-}
-
-/*
- * Sets the memory attribute for the specified page.
- */
-void
-pmap_page_set_memattr(vm_page_t m, vm_memattr_t ma)
-{
-
- m->md.pat_mode = ma;
- if ((m->flags & PG_FICTITIOUS) != 0)
- return;
-
- /*
- * If "m" is a normal page, flush it from the cache.
- * See pmap_invalidate_cache_range().
- *
- * First, try to find an existing mapping of the page by sf
- * buffer. sf_buf_invalidate_cache() modifies mapping and
- * flushes the cache.
- */
- if (sf_buf_invalidate_cache(m))
- return;
-
- /*
- * If page is not mapped by sf buffer, but CPU does not
- * support self snoop, map the page transient and do
- * invalidation. In the worst case, whole cache is flushed by
- * pmap_invalidate_cache_range().
- */
- if ((cpu_feature & CPUID_SS) == 0)
- pmap_flush_page(m);
-}
-
-static void
-pmap_flush_page(vm_page_t m)
-{
- struct sysmaps *sysmaps;
- vm_offset_t sva, eva;
-
- if ((cpu_feature & CPUID_CLFSH) != 0) {
- sysmaps = &sysmaps_pcpu[PCPU_GET(cpuid)];
- mtx_lock(&sysmaps->lock);
- if (*sysmaps->CMAP2)
- panic("pmap_flush_page: CMAP2 busy");
- sched_pin();
- PT_SET_MA(sysmaps->CADDR2, PG_V | PG_RW |
- VM_PAGE_TO_MACH(m) | PG_A | PG_M |
- pmap_cache_bits(m->md.pat_mode, 0));
- invlcaddr(sysmaps->CADDR2);
- sva = (vm_offset_t)sysmaps->CADDR2;
- eva = sva + PAGE_SIZE;
-
- /*
- * Use mfence despite the ordering implied by
- * mtx_{un,}lock() because clflush is not guaranteed
- * to be ordered by any other instruction.
- */
- mfence();
- for (; sva < eva; sva += cpu_clflush_line_size)
- clflush(sva);
- mfence();
- PT_SET_MA(sysmaps->CADDR2, 0);
- sched_unpin();
- mtx_unlock(&sysmaps->lock);
- } else
- pmap_invalidate_cache();
-}
-
-/*
- * Changes the specified virtual address range's memory type to that given by
- * the parameter "mode". The specified virtual address range must be
- * completely contained within either the kernel map.
- *
- * Returns zero if the change completed successfully, and either EINVAL or
- * ENOMEM if the change failed. Specifically, EINVAL is returned if some part
- * of the virtual address range was not mapped, and ENOMEM is returned if
- * there was insufficient memory available to complete the change.
- */
-int
-pmap_change_attr(vm_offset_t va, vm_size_t size, int mode)
-{
- vm_offset_t base, offset, tmpva;
- pt_entry_t *pte;
- u_int opte, npte;
- pd_entry_t *pde;
- boolean_t changed;
-
- base = trunc_page(va);
- offset = va & PAGE_MASK;
- size = round_page(offset + size);
-
- /* Only supported on kernel virtual addresses. */
- if (base <= VM_MAXUSER_ADDRESS)
- return (EINVAL);
-
- /* 4MB pages and pages that aren't mapped aren't supported. */
- for (tmpva = base; tmpva < (base + size); tmpva += PAGE_SIZE) {
- pde = pmap_pde(kernel_pmap, tmpva);
- if (*pde & PG_PS)
- return (EINVAL);
- if ((*pde & PG_V) == 0)
- return (EINVAL);
- pte = vtopte(va);
- if ((*pte & PG_V) == 0)
- return (EINVAL);
- }
-
- changed = FALSE;
-
- /*
- * Ok, all the pages exist and are 4k, so run through them updating
- * their cache mode.
- */
- for (tmpva = base; size > 0; ) {
- pte = vtopte(tmpva);
-
- /*
- * The cache mode bits are all in the low 32-bits of the
- * PTE, so we can just spin on updating the low 32-bits.
- */
- do {
- opte = *(u_int *)pte;
- npte = opte & ~(PG_PTE_PAT | PG_NC_PCD | PG_NC_PWT);
- npte |= pmap_cache_bits(mode, 0);
- PT_SET_VA_MA(pte, npte, TRUE);
- } while (npte != opte && (*pte != npte));
- if (npte != opte)
- changed = TRUE;
- tmpva += PAGE_SIZE;
- size -= PAGE_SIZE;
- }
-
- /*
- * Flush CPU caches to make sure any data isn't cached that
- * shouldn't be, etc.
- */
- if (changed) {
- pmap_invalidate_range(kernel_pmap, base, tmpva);
- pmap_invalidate_cache_range(base, tmpva, FALSE);
- }
- return (0);
-}
-
-/*
- * perform the pmap work for mincore
- */
-int
-pmap_mincore(pmap_t pmap, vm_offset_t addr, vm_paddr_t *locked_pa)
-{
- pt_entry_t *ptep, pte;
- vm_paddr_t pa;
- int val;
-
- PMAP_LOCK(pmap);
-retry:
- ptep = pmap_pte(pmap, addr);
- pte = (ptep != NULL) ? PT_GET(ptep) : 0;
- pmap_pte_release(ptep);
- val = 0;
- if ((pte & PG_V) != 0) {
- val |= MINCORE_INCORE;
- if ((pte & (PG_M | PG_RW)) == (PG_M | PG_RW))
- val |= MINCORE_MODIFIED | MINCORE_MODIFIED_OTHER;
- if ((pte & PG_A) != 0)
- val |= MINCORE_REFERENCED | MINCORE_REFERENCED_OTHER;
- }
- if ((val & (MINCORE_MODIFIED_OTHER | MINCORE_REFERENCED_OTHER)) !=
- (MINCORE_MODIFIED_OTHER | MINCORE_REFERENCED_OTHER) &&
- (pte & (PG_MANAGED | PG_V)) == (PG_MANAGED | PG_V)) {
- pa = pte & PG_FRAME;
- /* Ensure that "PHYS_TO_VM_PAGE(pa)->object" doesn't change. */
- if (vm_page_pa_tryrelock(pmap, pa, locked_pa))
- goto retry;
- } else
- PA_UNLOCK_COND(*locked_pa);
- PMAP_UNLOCK(pmap);
- return (val);
-}
-
-void
-pmap_activate(struct thread *td)
-{
- pmap_t pmap, oldpmap;
- u_int cpuid;
- u_int32_t cr3;
-
- critical_enter();
- pmap = vmspace_pmap(td->td_proc->p_vmspace);
- oldpmap = PCPU_GET(curpmap);
- cpuid = PCPU_GET(cpuid);
-#if defined(SMP)
- CPU_CLR_ATOMIC(cpuid, &oldpmap->pm_active);
- CPU_SET_ATOMIC(cpuid, &pmap->pm_active);
-#else
- CPU_CLR(cpuid, &oldpmap->pm_active);
- CPU_SET(cpuid, &pmap->pm_active);
-#endif
-#ifdef PAE
- cr3 = vtophys(pmap->pm_pdpt);
-#else
- cr3 = vtophys(pmap->pm_pdir);
-#endif
- /*
- * pmap_activate is for the current thread on the current cpu
- */
- td->td_pcb->pcb_cr3 = cr3;
- PT_UPDATES_FLUSH();
- load_cr3(cr3);
- PCPU_SET(curpmap, pmap);
- critical_exit();
-}
-
-void
-pmap_sync_icache(pmap_t pm, vm_offset_t va, vm_size_t sz)
-{
-}
-
-/*
- * Increase the starting virtual address of the given mapping if a
- * different alignment might result in more superpage mappings.
- */
-void
-pmap_align_superpage(vm_object_t object, vm_ooffset_t offset,
- vm_offset_t *addr, vm_size_t size)
-{
- vm_offset_t superpage_offset;
-
- if (size < NBPDR)
- return;
- if (object != NULL && (object->flags & OBJ_COLORED) != 0)
- offset += ptoa(object->pg_color);
- superpage_offset = offset & PDRMASK;
- if (size - ((NBPDR - superpage_offset) & PDRMASK) < NBPDR ||
- (*addr & PDRMASK) == superpage_offset)
- return;
- if ((*addr & PDRMASK) < superpage_offset)
- *addr = (*addr & ~PDRMASK) + superpage_offset;
- else
- *addr = ((*addr + PDRMASK) & ~PDRMASK) + superpage_offset;
-}
-
-void
-pmap_suspend()
-{
- pmap_t pmap;
- int i, pdir, offset;
- vm_paddr_t pdirma;
- mmu_update_t mu[4];
-
- /*
- * We need to remove the recursive mapping structure from all
- * our pmaps so that Xen doesn't get confused when it restores
- * the page tables. The recursive map lives at page directory
- * index PTDPTDI. We assume that the suspend code has stopped
- * the other vcpus (if any).
- */
- LIST_FOREACH(pmap, &allpmaps, pm_list) {
- for (i = 0; i < 4; i++) {
- /*
- * Figure out which page directory (L2) page
- * contains this bit of the recursive map and
- * the offset within that page of the map
- * entry
- */
- pdir = (PTDPTDI + i) / NPDEPG;
- offset = (PTDPTDI + i) % NPDEPG;
- pdirma = pmap->pm_pdpt[pdir] & PG_FRAME;
- mu[i].ptr = pdirma + offset * sizeof(pd_entry_t);
- mu[i].val = 0;
- }
- HYPERVISOR_mmu_update(mu, 4, NULL, DOMID_SELF);
- }
-}
-
-void
-pmap_resume()
-{
- pmap_t pmap;
- int i, pdir, offset;
- vm_paddr_t pdirma;
- mmu_update_t mu[4];
-
- /*
- * Restore the recursive map that we removed on suspend.
- */
- LIST_FOREACH(pmap, &allpmaps, pm_list) {
- for (i = 0; i < 4; i++) {
- /*
- * Figure out which page directory (L2) page
- * contains this bit of the recursive map and
- * the offset within that page of the map
- * entry
- */
- pdir = (PTDPTDI + i) / NPDEPG;
- offset = (PTDPTDI + i) % NPDEPG;
- pdirma = pmap->pm_pdpt[pdir] & PG_FRAME;
- mu[i].ptr = pdirma + offset * sizeof(pd_entry_t);
- mu[i].val = (pmap->pm_pdpt[i] & PG_FRAME) | PG_V;
- }
- HYPERVISOR_mmu_update(mu, 4, NULL, DOMID_SELF);
- }
-}
-
-#if defined(PMAP_DEBUG)
-pmap_pid_dump(int pid)
-{
- pmap_t pmap;
- struct proc *p;
- int npte = 0;
- int index;
-
- sx_slock(&allproc_lock);
- FOREACH_PROC_IN_SYSTEM(p) {
- if (p->p_pid != pid)
- continue;
-
- if (p->p_vmspace) {
- int i,j;
- index = 0;
- pmap = vmspace_pmap(p->p_vmspace);
- for (i = 0; i < NPDEPTD; i++) {
- pd_entry_t *pde;
- pt_entry_t *pte;
- vm_offset_t base = i << PDRSHIFT;
-
- pde = &pmap->pm_pdir[i];
- if (pde && pmap_pde_v(pde)) {
- for (j = 0; j < NPTEPG; j++) {
- vm_offset_t va = base + (j << PAGE_SHIFT);
- if (va >= (vm_offset_t) VM_MIN_KERNEL_ADDRESS) {
- if (index) {
- index = 0;
- printf("\n");
- }
- sx_sunlock(&allproc_lock);
- return (npte);
- }
- pte = pmap_pte(pmap, va);
- if (pte && pmap_pte_v(pte)) {
- pt_entry_t pa;
- vm_page_t m;
- pa = PT_GET(pte);
- m = PHYS_TO_VM_PAGE(pa & PG_FRAME);
- printf("va: 0x%x, pt: 0x%x, h: %d, w: %d, f: 0x%x",
- va, pa, m->hold_count, m->wire_count, m->flags);
- npte++;
- index++;
- if (index >= 2) {
- index = 0;
- printf("\n");
- } else {
- printf(" ");
- }
- }
- }
- }
- }
- }
- }
- sx_sunlock(&allproc_lock);
- return (npte);
-}
-#endif
-
-#if defined(DEBUG)
-
-static void pads(pmap_t pm);
-void pmap_pvdump(vm_paddr_t pa);
-
-/* print address space of pmap*/
-static void
-pads(pmap_t pm)
-{
- int i, j;
- vm_paddr_t va;
- pt_entry_t *ptep;
-
- if (pm == kernel_pmap)
- return;
- for (i = 0; i < NPDEPTD; i++)
- if (pm->pm_pdir[i])
- for (j = 0; j < NPTEPG; j++) {
- va = (i << PDRSHIFT) + (j << PAGE_SHIFT);
- if (pm == kernel_pmap && va < KERNBASE)
- continue;
- if (pm != kernel_pmap && va > UPT_MAX_ADDRESS)
- continue;
- ptep = pmap_pte(pm, va);
- if (pmap_pte_v(ptep))
- printf("%x:%x ", va, *ptep);
- };
-
-}
-
-void
-pmap_pvdump(vm_paddr_t pa)
-{
- pv_entry_t pv;
- pmap_t pmap;
- vm_page_t m;
-
- printf("pa %x", pa);
- m = PHYS_TO_VM_PAGE(pa);
- TAILQ_FOREACH(pv, &m->md.pv_list, pv_next) {
- pmap = PV_PMAP(pv);
- printf(" -> pmap %p, va %x", (void *)pmap, pv->pv_va);
- pads(pmap);
- }
- printf(" ");
-}
-#endif
diff --git a/sys/i386/xen/xen_machdep.c b/sys/i386/xen/xen_machdep.c
deleted file mode 100644
index dbaa7ad..0000000
--- a/sys/i386/xen/xen_machdep.c
+++ /dev/null
@@ -1,1236 +0,0 @@
-/*
- *
- * Copyright (c) 2004 Christian Limpach.
- * Copyright (c) 2004-2006,2008 Kip Macy
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Christian Limpach.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/bus.h>
-#include <sys/ktr.h>
-#include <sys/lock.h>
-#include <sys/mount.h>
-#include <sys/malloc.h>
-#include <sys/mutex.h>
-#include <sys/kernel.h>
-#include <sys/proc.h>
-#include <sys/reboot.h>
-#include <sys/rwlock.h>
-#include <sys/sysproto.h>
-#include <sys/boot.h>
-
-#include <xen/xen-os.h>
-
-#include <vm/vm.h>
-#include <vm/pmap.h>
-#include <machine/segments.h>
-#include <machine/pcb.h>
-#include <machine/stdarg.h>
-#include <machine/vmparam.h>
-#include <machine/cpu.h>
-#include <machine/intr_machdep.h>
-#include <machine/md_var.h>
-#include <machine/asmacros.h>
-
-
-
-#include <xen/hypervisor.h>
-#include <xen/xenstore/xenstorevar.h>
-#include <machine/xen/xenvar.h>
-#include <machine/xen/xenfunc.h>
-#include <machine/xen/xenpmap.h>
-#include <machine/xen/xenfunc.h>
-#include <xen/interface/memory.h>
-#include <machine/xen/features.h>
-#ifdef SMP
-#include <machine/privatespace.h>
-#endif
-
-
-#include <vm/vm_page.h>
-
-
-#define IDTVEC(name) __CONCAT(X,name)
-
-extern inthand_t
-IDTVEC(div), IDTVEC(dbg), IDTVEC(nmi), IDTVEC(bpt), IDTVEC(ofl),
- IDTVEC(bnd), IDTVEC(ill), IDTVEC(dna), IDTVEC(fpusegm),
- IDTVEC(tss), IDTVEC(missing), IDTVEC(stk), IDTVEC(prot),
- IDTVEC(page), IDTVEC(mchk), IDTVEC(rsvd), IDTVEC(fpu), IDTVEC(align),
- IDTVEC(xmm), IDTVEC(lcall_syscall), IDTVEC(int0x80_syscall);
-
-
-int xendebug_flags;
-start_info_t *xen_start_info;
-start_info_t *HYPERVISOR_start_info;
-shared_info_t *HYPERVISOR_shared_info;
-xen_pfn_t *xen_machine_phys = machine_to_phys_mapping;
-xen_pfn_t *xen_phys_machine;
-xen_pfn_t *xen_pfn_to_mfn_frame_list[16];
-xen_pfn_t *xen_pfn_to_mfn_frame_list_list;
-int preemptable, init_first;
-extern unsigned int avail_space;
-int xen_vector_callback_enabled = 0;
-enum xen_domain_type xen_domain_type = XEN_PV_DOMAIN;
-
-void ni_cli(void);
-void ni_sti(void);
-
-
-void
-ni_cli(void)
-{
- CTR0(KTR_SPARE2, "ni_cli disabling interrupts");
- __asm__("pushl %edx;"
- "pushl %eax;"
- );
- __cli();
- __asm__("popl %eax;"
- "popl %edx;"
- );
-}
-
-
-void
-ni_sti(void)
-{
- __asm__("pushl %edx;"
- "pushl %esi;"
- "pushl %eax;"
- );
- __sti();
- __asm__("popl %eax;"
- "popl %esi;"
- "popl %edx;"
- );
-}
-
-void
-force_evtchn_callback(void)
-{
- (void)HYPERVISOR_xen_version(0, NULL);
-}
-
-/*
- * Modify the cmd_line by converting ',' to NULLs so that it is in a format
- * suitable for the static env vars.
- */
-char *
-xen_setbootenv(char *cmd_line)
-{
- char *cmd_line_next;
-
- /* Skip leading spaces */
- for (; *cmd_line == ' '; cmd_line++);
-
- xc_printf("xen_setbootenv(): cmd_line='%s'\n", cmd_line);
-
- for (cmd_line_next = cmd_line; strsep(&cmd_line_next, ",") != NULL;);
- return cmd_line;
-}
-
-int
-xen_boothowto(char *envp)
-{
- int i, howto = 0;
-
- /* get equivalents from the environment */
- for (i = 0; howto_names[i].ev != NULL; i++)
- if (kern_getenv(howto_names[i].ev) != NULL)
- howto |= howto_names[i].mask;
- return howto;
-}
-
-
-#define XPQUEUE_SIZE 128
-
-struct mmu_log {
- char *file;
- int line;
-};
-
-#ifdef SMP
-/* per-cpu queues and indices */
-#ifdef INVARIANTS
-static struct mmu_log xpq_queue_log[XEN_LEGACY_MAX_VCPUS][XPQUEUE_SIZE];
-#endif
-
-static int xpq_idx[XEN_LEGACY_MAX_VCPUS];
-static mmu_update_t xpq_queue[XEN_LEGACY_MAX_VCPUS][XPQUEUE_SIZE];
-
-#define XPQ_QUEUE_LOG xpq_queue_log[vcpu]
-#define XPQ_QUEUE xpq_queue[vcpu]
-#define XPQ_IDX xpq_idx[vcpu]
-#define SET_VCPU() int vcpu = smp_processor_id()
-#else
-
-static mmu_update_t xpq_queue[XPQUEUE_SIZE];
-#ifdef INVARIANTS
-static struct mmu_log xpq_queue_log[XPQUEUE_SIZE];
-#endif
-static int xpq_idx = 0;
-
-#define XPQ_QUEUE_LOG xpq_queue_log
-#define XPQ_QUEUE xpq_queue
-#define XPQ_IDX xpq_idx
-#define SET_VCPU()
-#endif /* !SMP */
-
-#define XPQ_IDX_INC atomic_add_int(&XPQ_IDX, 1);
-
-#if 0
-static void
-xen_dump_queue(void)
-{
- int _xpq_idx = XPQ_IDX;
- int i;
-
- if (_xpq_idx <= 1)
- return;
-
- xc_printf("xen_dump_queue(): %u entries\n", _xpq_idx);
- for (i = 0; i < _xpq_idx; i++) {
- xc_printf(" val: %llx ptr: %llx\n", XPQ_QUEUE[i].val,
- XPQ_QUEUE[i].ptr);
- }
-}
-#endif
-
-
-static __inline void
-_xen_flush_queue(void)
-{
- SET_VCPU();
- int _xpq_idx = XPQ_IDX;
- int error, i;
-
-#ifdef INVARIANTS
- if (__predict_true(gdtset))
- CRITICAL_ASSERT(curthread);
-#endif
-
- XPQ_IDX = 0;
- /* Make sure index is cleared first to avoid double updates. */
- error = HYPERVISOR_mmu_update((mmu_update_t *)&XPQ_QUEUE,
- _xpq_idx, NULL, DOMID_SELF);
-
-#if 0
- if (__predict_true(gdtset))
- for (i = _xpq_idx; i > 0;) {
- if (i >= 3) {
- CTR6(KTR_PMAP, "mmu:val: %lx ptr: %lx val: %lx "
- "ptr: %lx val: %lx ptr: %lx",
- (XPQ_QUEUE[i-1].val & 0xffffffff),
- (XPQ_QUEUE[i-1].ptr & 0xffffffff),
- (XPQ_QUEUE[i-2].val & 0xffffffff),
- (XPQ_QUEUE[i-2].ptr & 0xffffffff),
- (XPQ_QUEUE[i-3].val & 0xffffffff),
- (XPQ_QUEUE[i-3].ptr & 0xffffffff));
- i -= 3;
- } else if (i == 2) {
- CTR4(KTR_PMAP, "mmu: val: %lx ptr: %lx val: %lx ptr: %lx",
- (XPQ_QUEUE[i-1].val & 0xffffffff),
- (XPQ_QUEUE[i-1].ptr & 0xffffffff),
- (XPQ_QUEUE[i-2].val & 0xffffffff),
- (XPQ_QUEUE[i-2].ptr & 0xffffffff));
- i = 0;
- } else {
- CTR2(KTR_PMAP, "mmu: val: %lx ptr: %lx",
- (XPQ_QUEUE[i-1].val & 0xffffffff),
- (XPQ_QUEUE[i-1].ptr & 0xffffffff));
- i = 0;
- }
- }
-#endif
- if (__predict_false(error < 0)) {
- for (i = 0; i < _xpq_idx; i++)
- printf("val: %llx ptr: %llx\n",
- XPQ_QUEUE[i].val, XPQ_QUEUE[i].ptr);
- panic("Failed to execute MMU updates: %d", error);
- }
-
-}
-
-void
-xen_flush_queue(void)
-{
- SET_VCPU();
-
- if (__predict_true(gdtset))
- critical_enter();
- if (XPQ_IDX != 0) _xen_flush_queue();
- if (__predict_true(gdtset))
- critical_exit();
-}
-
-static __inline void
-xen_increment_idx(void)
-{
- SET_VCPU();
-
- XPQ_IDX++;
- if (__predict_false(XPQ_IDX == XPQUEUE_SIZE))
- xen_flush_queue();
-}
-
-void
-xen_check_queue(void)
-{
-#ifdef INVARIANTS
- SET_VCPU();
-
- KASSERT(XPQ_IDX == 0, ("pending operations XPQ_IDX=%d", XPQ_IDX));
-#endif
-}
-
-void
-xen_invlpg(vm_offset_t va)
-{
- struct mmuext_op op;
- op.cmd = MMUEXT_INVLPG_ALL;
- op.arg1.linear_addr = va & ~PAGE_MASK;
- PANIC_IF(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
-}
-
-void
-xen_load_cr3(u_int val)
-{
- struct mmuext_op op;
-#ifdef INVARIANTS
- SET_VCPU();
-
- KASSERT(XPQ_IDX == 0, ("pending operations XPQ_IDX=%d", XPQ_IDX));
-#endif
- op.cmd = MMUEXT_NEW_BASEPTR;
- op.arg1.mfn = xpmap_ptom(val) >> PAGE_SHIFT;
- PANIC_IF(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
-}
-
-#ifdef KTR
-static __inline u_int
-rebp(void)
-{
- u_int data;
-
- __asm __volatile("movl 4(%%ebp),%0" : "=r" (data));
- return (data);
-}
-#endif
-
-u_int
-read_eflags(void)
-{
- vcpu_info_t *_vcpu;
- u_int eflags;
-
- eflags = _read_eflags();
- _vcpu = &HYPERVISOR_shared_info->vcpu_info[smp_processor_id()];
- if (_vcpu->evtchn_upcall_mask)
- eflags &= ~PSL_I;
-
- return (eflags);
-}
-
-void
-write_eflags(u_int eflags)
-{
- u_int intr;
-
- CTR2(KTR_SPARE2, "%x xen_restore_flags eflags %x", rebp(), eflags);
- intr = ((eflags & PSL_I) == 0);
- __restore_flags(intr);
- _write_eflags(eflags);
-}
-
-void
-xen_cli(void)
-{
- CTR1(KTR_SPARE2, "%x xen_cli disabling interrupts", rebp());
- __cli();
-}
-
-void
-xen_sti(void)
-{
- CTR1(KTR_SPARE2, "%x xen_sti enabling interrupts", rebp());
- __sti();
-}
-
-u_int
-xen_rcr2(void)
-{
-
- return (HYPERVISOR_shared_info->vcpu_info[curcpu].arch.cr2);
-}
-
-void
-_xen_machphys_update(vm_paddr_t mfn, vm_paddr_t pfn, char *file, int line)
-{
- SET_VCPU();
-
- if (__predict_true(gdtset))
- critical_enter();
- XPQ_QUEUE[XPQ_IDX].ptr = (mfn << PAGE_SHIFT) | MMU_MACHPHYS_UPDATE;
- XPQ_QUEUE[XPQ_IDX].val = pfn;
-#ifdef INVARIANTS
- XPQ_QUEUE_LOG[XPQ_IDX].file = file;
- XPQ_QUEUE_LOG[XPQ_IDX].line = line;
-#endif
- xen_increment_idx();
- if (__predict_true(gdtset))
- critical_exit();
-}
-
-extern struct rwlock pvh_global_lock;
-
-void
-_xen_queue_pt_update(vm_paddr_t ptr, vm_paddr_t val, char *file, int line)
-{
- SET_VCPU();
-
- if (__predict_true(gdtset))
- rw_assert(&pvh_global_lock, RA_WLOCKED);
-
- KASSERT((ptr & 7) == 0, ("misaligned update"));
-
- if (__predict_true(gdtset))
- critical_enter();
-
- XPQ_QUEUE[XPQ_IDX].ptr = ((uint64_t)ptr) | MMU_NORMAL_PT_UPDATE;
- XPQ_QUEUE[XPQ_IDX].val = (uint64_t)val;
-#ifdef INVARIANTS
- XPQ_QUEUE_LOG[XPQ_IDX].file = file;
- XPQ_QUEUE_LOG[XPQ_IDX].line = line;
-#endif
- xen_increment_idx();
- if (__predict_true(gdtset))
- critical_exit();
-}
-
-void
-xen_pgdpt_pin(vm_paddr_t ma)
-{
- struct mmuext_op op;
- op.cmd = MMUEXT_PIN_L3_TABLE;
- op.arg1.mfn = ma >> PAGE_SHIFT;
- xen_flush_queue();
- PANIC_IF(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
-}
-
-void
-xen_pgd_pin(vm_paddr_t ma)
-{
- struct mmuext_op op;
- op.cmd = MMUEXT_PIN_L2_TABLE;
- op.arg1.mfn = ma >> PAGE_SHIFT;
- xen_flush_queue();
- PANIC_IF(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
-}
-
-void
-xen_pgd_unpin(vm_paddr_t ma)
-{
- struct mmuext_op op;
- op.cmd = MMUEXT_UNPIN_TABLE;
- op.arg1.mfn = ma >> PAGE_SHIFT;
- xen_flush_queue();
- PANIC_IF(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
-}
-
-void
-xen_pt_pin(vm_paddr_t ma)
-{
- struct mmuext_op op;
- op.cmd = MMUEXT_PIN_L1_TABLE;
- op.arg1.mfn = ma >> PAGE_SHIFT;
- xen_flush_queue();
- PANIC_IF(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
-}
-
-void
-xen_pt_unpin(vm_paddr_t ma)
-{
- struct mmuext_op op;
- op.cmd = MMUEXT_UNPIN_TABLE;
- op.arg1.mfn = ma >> PAGE_SHIFT;
- xen_flush_queue();
- PANIC_IF(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
-}
-
-void
-xen_set_ldt(vm_paddr_t ptr, unsigned long len)
-{
- struct mmuext_op op;
- op.cmd = MMUEXT_SET_LDT;
- op.arg1.linear_addr = ptr;
- op.arg2.nr_ents = len;
- xen_flush_queue();
- PANIC_IF(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
-}
-
-void xen_tlb_flush(void)
-{
- struct mmuext_op op;
- op.cmd = MMUEXT_TLB_FLUSH_LOCAL;
- xen_flush_queue();
- PANIC_IF(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
-}
-
-void
-xen_update_descriptor(union descriptor *table, union descriptor *entry)
-{
- vm_paddr_t pa;
- pt_entry_t *ptp;
-
- ptp = vtopte((vm_offset_t)table);
- pa = (*ptp & PG_FRAME) | ((vm_offset_t)table & PAGE_MASK);
- if (HYPERVISOR_update_descriptor(pa, *(uint64_t *)entry))
- panic("HYPERVISOR_update_descriptor failed\n");
-}
-
-
-#if 0
-/*
- * Bitmap is indexed by page number. If bit is set, the page is part of a
- * xen_create_contiguous_region() area of memory.
- */
-unsigned long *contiguous_bitmap;
-
-static void
-contiguous_bitmap_set(unsigned long first_page, unsigned long nr_pages)
-{
- unsigned long start_off, end_off, curr_idx, end_idx;
-
- curr_idx = first_page / BITS_PER_LONG;
- start_off = first_page & (BITS_PER_LONG-1);
- end_idx = (first_page + nr_pages) / BITS_PER_LONG;
- end_off = (first_page + nr_pages) & (BITS_PER_LONG-1);
-
- if (curr_idx == end_idx) {
- contiguous_bitmap[curr_idx] |=
- ((1UL<<end_off)-1) & -(1UL<<start_off);
- } else {
- contiguous_bitmap[curr_idx] |= -(1UL<<start_off);
- while ( ++curr_idx < end_idx )
- contiguous_bitmap[curr_idx] = ~0UL;
- contiguous_bitmap[curr_idx] |= (1UL<<end_off)-1;
- }
-}
-
-static void
-contiguous_bitmap_clear(unsigned long first_page, unsigned long nr_pages)
-{
- unsigned long start_off, end_off, curr_idx, end_idx;
-
- curr_idx = first_page / BITS_PER_LONG;
- start_off = first_page & (BITS_PER_LONG-1);
- end_idx = (first_page + nr_pages) / BITS_PER_LONG;
- end_off = (first_page + nr_pages) & (BITS_PER_LONG-1);
-
- if (curr_idx == end_idx) {
- contiguous_bitmap[curr_idx] &=
- -(1UL<<end_off) | ((1UL<<start_off)-1);
- } else {
- contiguous_bitmap[curr_idx] &= (1UL<<start_off)-1;
- while ( ++curr_idx != end_idx )
- contiguous_bitmap[curr_idx] = 0;
- contiguous_bitmap[curr_idx] &= -(1UL<<end_off);
- }
-}
-#endif
-
-/* Ensure multi-page extents are contiguous in machine memory. */
-int
-xen_create_contiguous_region(vm_page_t pages, int npages)
-{
- unsigned long mfn, i, flags;
- int order;
- struct xen_memory_reservation reservation = {
- .nr_extents = 1,
- .extent_order = 0,
- .domid = DOMID_SELF
- };
- set_xen_guest_handle(reservation.extent_start, &mfn);
-
- balloon_lock(flags);
-
- /* can currently only handle power of two allocation */
- PANIC_IF(ffs(npages) != fls(npages));
-
- /* 0. determine order */
- order = (ffs(npages) == fls(npages)) ? fls(npages) - 1 : fls(npages);
-
- /* 1. give away machine pages. */
- for (i = 0; i < (1 << order); i++) {
- int pfn;
- pfn = VM_PAGE_TO_PHYS(&pages[i]) >> PAGE_SHIFT;
- mfn = PFNTOMFN(pfn);
- PFNTOMFN(pfn) = INVALID_P2M_ENTRY;
- PANIC_IF(HYPERVISOR_memory_op(XENMEM_decrease_reservation, &reservation) != 1);
- }
-
-
- /* 2. Get a new contiguous memory extent. */
- reservation.extent_order = order;
- /* xenlinux hardcodes this because of aacraid - maybe set to 0 if we're not
- * running with a broxen driver XXXEN
- */
- reservation.address_bits = 31;
- if (HYPERVISOR_memory_op(XENMEM_increase_reservation, &reservation) != 1)
- goto fail;
-
- /* 3. Map the new extent in place of old pages. */
- for (i = 0; i < (1 << order); i++) {
- int pfn;
- pfn = VM_PAGE_TO_PHYS(&pages[i]) >> PAGE_SHIFT;
- xen_machphys_update(mfn+i, pfn);
- PFNTOMFN(pfn) = mfn+i;
- }
-
- xen_tlb_flush();
-
-#if 0
- contiguous_bitmap_set(VM_PAGE_TO_PHYS(&pages[0]) >> PAGE_SHIFT, 1UL << order);
-#endif
-
- balloon_unlock(flags);
-
- return 0;
-
- fail:
- reservation.extent_order = 0;
- reservation.address_bits = 0;
-
- for (i = 0; i < (1 << order); i++) {
- int pfn;
- pfn = VM_PAGE_TO_PHYS(&pages[i]) >> PAGE_SHIFT;
- PANIC_IF(HYPERVISOR_memory_op(
- XENMEM_increase_reservation, &reservation) != 1);
- xen_machphys_update(mfn, pfn);
- PFNTOMFN(pfn) = mfn;
- }
-
- xen_tlb_flush();
-
- balloon_unlock(flags);
-
- return ENOMEM;
-}
-
-void
-xen_destroy_contiguous_region(void *addr, int npages)
-{
- unsigned long mfn, i, flags, order, pfn0;
- struct xen_memory_reservation reservation = {
- .nr_extents = 1,
- .extent_order = 0,
- .domid = DOMID_SELF
- };
- set_xen_guest_handle(reservation.extent_start, &mfn);
-
- pfn0 = vtophys(addr) >> PAGE_SHIFT;
-#if 0
- scrub_pages(vstart, 1 << order);
-#endif
- /* can currently only handle power of two allocation */
- PANIC_IF(ffs(npages) != fls(npages));
-
- /* 0. determine order */
- order = (ffs(npages) == fls(npages)) ? fls(npages) - 1 : fls(npages);
-
- balloon_lock(flags);
-
-#if 0
- contiguous_bitmap_clear(vtophys(addr) >> PAGE_SHIFT, 1UL << order);
-#endif
-
- /* 1. Zap current PTEs, giving away the underlying pages. */
- for (i = 0; i < (1 << order); i++) {
- int pfn;
- uint64_t new_val = 0;
- pfn = vtomach((char *)addr + i*PAGE_SIZE) >> PAGE_SHIFT;
-
- PANIC_IF(HYPERVISOR_update_va_mapping((vm_offset_t)((char *)addr + (i * PAGE_SIZE)), new_val, 0));
- PFNTOMFN(pfn) = INVALID_P2M_ENTRY;
- PANIC_IF(HYPERVISOR_memory_op(
- XENMEM_decrease_reservation, &reservation) != 1);
- }
-
- /* 2. Map new pages in place of old pages. */
- for (i = 0; i < (1 << order); i++) {
- int pfn;
- uint64_t new_val;
- pfn = pfn0 + i;
- PANIC_IF(HYPERVISOR_memory_op(XENMEM_increase_reservation, &reservation) != 1);
-
- new_val = mfn << PAGE_SHIFT;
- PANIC_IF(HYPERVISOR_update_va_mapping((vm_offset_t)addr + (i * PAGE_SIZE),
- new_val, PG_KERNEL));
- xen_machphys_update(mfn, pfn);
- PFNTOMFN(pfn) = mfn;
- }
-
- xen_tlb_flush();
-
- balloon_unlock(flags);
-}
-
-extern vm_offset_t proc0kstack;
-extern int vm86paddr, vm86phystk;
-char *bootmem_start, *bootmem_current, *bootmem_end;
-
-pteinfo_t *pteinfo_list;
-void initvalues(start_info_t *startinfo);
-
-void *
-bootmem_alloc(unsigned int size)
-{
- char *retptr;
-
- retptr = bootmem_current;
- PANIC_IF(retptr + size > bootmem_end);
- bootmem_current += size;
-
- return retptr;
-}
-
-void
-bootmem_free(void *ptr, unsigned int size)
-{
- char *tptr;
-
- tptr = ptr;
- PANIC_IF(tptr != bootmem_current - size ||
- bootmem_current - size < bootmem_start);
-
- bootmem_current -= size;
-}
-
-#if 0
-static vm_paddr_t
-xpmap_mtop2(vm_paddr_t mpa)
-{
- return ((machine_to_phys_mapping[mpa >> PAGE_SHIFT] << PAGE_SHIFT)
- ) | (mpa & ~PG_FRAME);
-}
-
-static pd_entry_t
-xpmap_get_bootpde(vm_paddr_t va)
-{
-
- return ((pd_entry_t *)xen_start_info->pt_base)[va >> 22];
-}
-
-static pd_entry_t
-xpmap_get_vbootpde(vm_paddr_t va)
-{
- pd_entry_t pde;
-
- pde = xpmap_get_bootpde(va);
- if ((pde & PG_V) == 0)
- return (pde & ~PG_FRAME);
- return (pde & ~PG_FRAME) |
- (xpmap_mtop2(pde & PG_FRAME) + KERNBASE);
-}
-
-static pt_entry_t 8*
-xpmap_get_bootptep(vm_paddr_t va)
-{
- pd_entry_t pde;
-
- pde = xpmap_get_vbootpde(va);
- if ((pde & PG_V) == 0)
- return (void *)-1;
-#define PT_MASK 0x003ff000 /* page table address bits */
- return &(((pt_entry_t *)(pde & PG_FRAME))[(va & PT_MASK) >> PAGE_SHIFT]);
-}
-
-static pt_entry_t
-xpmap_get_bootpte(vm_paddr_t va)
-{
-
- return xpmap_get_bootptep(va)[0];
-}
-#endif
-
-
-#ifdef ADD_ISA_HOLE
-static void
-shift_phys_machine(unsigned long *phys_machine, int nr_pages)
-{
-
- unsigned long *tmp_page, *current_page, *next_page;
- int i;
-
- tmp_page = bootmem_alloc(PAGE_SIZE);
- current_page = phys_machine + nr_pages - (PAGE_SIZE/sizeof(unsigned long));
- next_page = current_page - (PAGE_SIZE/sizeof(unsigned long));
- bcopy(phys_machine, tmp_page, PAGE_SIZE);
-
- while (current_page > phys_machine) {
- /* save next page */
- bcopy(next_page, tmp_page, PAGE_SIZE);
- /* shift down page */
- bcopy(current_page, next_page, PAGE_SIZE);
- /* finish swap */
- bcopy(tmp_page, current_page, PAGE_SIZE);
-
- current_page -= (PAGE_SIZE/sizeof(unsigned long));
- next_page -= (PAGE_SIZE/sizeof(unsigned long));
- }
- bootmem_free(tmp_page, PAGE_SIZE);
-
- for (i = 0; i < nr_pages; i++) {
- xen_machphys_update(phys_machine[i], i);
- }
- memset(phys_machine, INVALID_P2M_ENTRY, PAGE_SIZE);
-
-}
-#endif /* ADD_ISA_HOLE */
-
-/*
- * Build a directory of the pages that make up our Physical to Machine
- * mapping table. The Xen suspend/restore code uses this to find our
- * mapping table.
- */
-static void
-init_frame_list_list(void *arg)
-{
- unsigned long nr_pages = xen_start_info->nr_pages;
-#define FPP (PAGE_SIZE/sizeof(xen_pfn_t))
- int i, j, k;
-
- xen_pfn_to_mfn_frame_list_list = malloc(PAGE_SIZE, M_DEVBUF, M_WAITOK);
- for (i = 0, j = 0, k = -1; i < nr_pages;
- i += FPP, j++) {
- if ((j & (FPP - 1)) == 0) {
- k++;
- xen_pfn_to_mfn_frame_list[k] =
- malloc(PAGE_SIZE, M_DEVBUF, M_WAITOK);
- xen_pfn_to_mfn_frame_list_list[k] =
- VTOMFN(xen_pfn_to_mfn_frame_list[k]);
- j = 0;
- }
- xen_pfn_to_mfn_frame_list[k][j] =
- VTOMFN(&xen_phys_machine[i]);
- }
-
- HYPERVISOR_shared_info->arch.max_pfn = nr_pages;
- HYPERVISOR_shared_info->arch.pfn_to_mfn_frame_list_list
- = VTOMFN(xen_pfn_to_mfn_frame_list_list);
-}
-SYSINIT(init_fll, SI_SUB_DEVFS, SI_ORDER_ANY, init_frame_list_list, NULL);
-
-extern unsigned long physfree;
-
-int pdir, curoffset;
-extern int nkpt;
-
-extern uint32_t kernbase;
-
-void
-initvalues(start_info_t *startinfo)
-{
- vm_offset_t cur_space, cur_space_pt;
- struct physdev_set_iopl set_iopl;
-
- int l3_pages, l2_pages, l1_pages, offset;
- vm_paddr_t console_page_ma, xen_store_ma;
- vm_offset_t tmpva;
- vm_paddr_t shinfo;
-#ifdef PAE
- vm_paddr_t IdlePDPTma, IdlePDPTnewma;
- vm_paddr_t IdlePTDnewma[4];
- pd_entry_t *IdlePDPTnew, *IdlePTDnew;
- vm_paddr_t IdlePTDma[4];
-#else
- vm_paddr_t IdlePTDma[1];
-#endif
- unsigned long i;
- int ncpus = MAXCPU;
-
- nkpt = min(
- min(
- max((startinfo->nr_pages >> NPGPTD_SHIFT), nkpt),
- NPGPTD*NPDEPG - KPTDI),
- (HYPERVISOR_VIRT_START - KERNBASE) >> PDRSHIFT);
-
- HYPERVISOR_vm_assist(VMASST_CMD_enable, VMASST_TYPE_4gb_segments);
-#ifdef notyet
- /*
- * need to install handler
- */
- HYPERVISOR_vm_assist(VMASST_CMD_enable, VMASST_TYPE_4gb_segments_notify);
-#endif
- xen_start_info = startinfo;
- HYPERVISOR_start_info = startinfo;
- xen_phys_machine = (xen_pfn_t *)startinfo->mfn_list;
-
- IdlePTD = (pd_entry_t *)((uint8_t *)startinfo->pt_base + PAGE_SIZE);
- l1_pages = 0;
-
-#ifdef PAE
- l3_pages = 1;
- l2_pages = 0;
- IdlePDPT = (pd_entry_t *)startinfo->pt_base;
- IdlePDPTma = VTOM(startinfo->pt_base);
- for (i = (KERNBASE >> 30);
- (i < 4) && (IdlePDPT[i] != 0); i++)
- l2_pages++;
- /*
- * Note that only one page directory has been allocated at this point.
- * Thus, if KERNBASE
- */
- for (i = 0; i < l2_pages; i++)
- IdlePTDma[i] = VTOM(IdlePTD + i*PAGE_SIZE);
-
- l2_pages = (l2_pages == 0) ? 1 : l2_pages;
-#else
- l3_pages = 0;
- l2_pages = 1;
-#endif
- for (i = (((KERNBASE>>18) & PAGE_MASK)>>PAGE_SHIFT);
- (i<l2_pages*NPDEPG) && (i<(VM_MAX_KERNEL_ADDRESS>>PDRSHIFT)); i++) {
-
- if (IdlePTD[i] == 0)
- break;
- l1_pages++;
- }
-
- /* number of pages allocated after the pts + 1*/;
- cur_space = xen_start_info->pt_base +
- (l3_pages + l2_pages + l1_pages + 1)*PAGE_SIZE;
-
- xc_printf("initvalues(): wooh - availmem=%x,%x\n", avail_space,
- cur_space);
-
- xc_printf("KERNBASE=%x,pt_base=%lx, VTOPFN(base)=%x, nr_pt_frames=%lx\n",
- KERNBASE,xen_start_info->pt_base, VTOPFN(xen_start_info->pt_base),
- xen_start_info->nr_pt_frames);
- xendebug_flags = 0; /* 0xffffffff; */
-
-#ifdef ADD_ISA_HOLE
- shift_phys_machine(xen_phys_machine, xen_start_info->nr_pages);
-#endif
- XENPRINTF("IdlePTD %p\n", IdlePTD);
- XENPRINTF("nr_pages: %ld shared_info: 0x%lx flags: 0x%x pt_base: 0x%lx "
- "mod_start: 0x%lx mod_len: 0x%lx\n",
- xen_start_info->nr_pages, xen_start_info->shared_info,
- xen_start_info->flags, xen_start_info->pt_base,
- xen_start_info->mod_start, xen_start_info->mod_len);
-
-#ifdef PAE
- IdlePDPTnew = (pd_entry_t *)cur_space; cur_space += PAGE_SIZE;
- bzero(IdlePDPTnew, PAGE_SIZE);
-
- IdlePDPTnewma = VTOM(IdlePDPTnew);
- IdlePTDnew = (pd_entry_t *)cur_space; cur_space += 4*PAGE_SIZE;
- bzero(IdlePTDnew, 4*PAGE_SIZE);
-
- for (i = 0; i < 4; i++)
- IdlePTDnewma[i] = VTOM((uint8_t *)IdlePTDnew + i*PAGE_SIZE);
- /*
- * L3
- *
- * Copy the 4 machine addresses of the new PTDs in to the PDPT
- *
- */
- for (i = 0; i < 4; i++)
- IdlePDPTnew[i] = IdlePTDnewma[i] | PG_V;
-
- __asm__("nop;");
- /*
- *
- * re-map the new PDPT read-only
- */
- PT_SET_MA(IdlePDPTnew, IdlePDPTnewma | PG_V);
- /*
- *
- * Unpin the current PDPT
- */
- xen_pt_unpin(IdlePDPTma);
-
-#endif /* PAE */
-
- /* Map proc0's KSTACK */
- proc0kstack = cur_space; cur_space += (KSTACK_PAGES * PAGE_SIZE);
- xc_printf("proc0kstack=%u\n", proc0kstack);
-
- /* vm86/bios stack */
- cur_space += PAGE_SIZE;
-
- /* Map space for the vm86 region */
- vm86paddr = (vm_offset_t)cur_space;
- cur_space += (PAGE_SIZE * 3);
-
- /* allocate 4 pages for bootmem allocator */
- bootmem_start = bootmem_current = (char *)cur_space;
- cur_space += (4 * PAGE_SIZE);
- bootmem_end = (char *)cur_space;
-
- /* allocate pages for gdt */
- gdt = (union descriptor *)cur_space;
- cur_space += PAGE_SIZE*ncpus;
-
- /* allocate page for ldt */
- ldt = (union descriptor *)cur_space; cur_space += PAGE_SIZE;
- cur_space += PAGE_SIZE;
-
- /* unmap remaining pages from initial chunk
- *
- */
- for (tmpva = cur_space; tmpva < (((uint32_t)&kernbase) + (l1_pages<<PDRSHIFT));
- tmpva += PAGE_SIZE) {
- bzero((char *)tmpva, PAGE_SIZE);
- PT_SET_MA(tmpva, (vm_paddr_t)0);
- }
-
- PT_UPDATES_FLUSH();
-
- memcpy(((uint8_t *)IdlePTDnew) + ((unsigned int)(KERNBASE >> 18)),
- ((uint8_t *)IdlePTD) + ((KERNBASE >> 18) & PAGE_MASK),
- l1_pages*sizeof(pt_entry_t));
-
- for (i = 0; i < 4; i++) {
- PT_SET_MA((uint8_t *)IdlePTDnew + i*PAGE_SIZE,
- IdlePTDnewma[i] | PG_V);
- }
- xen_load_cr3(VTOP(IdlePDPTnew));
- xen_pgdpt_pin(VTOM(IdlePDPTnew));
-
- /* allocate remainder of nkpt pages */
- cur_space_pt = cur_space;
- for (offset = (KERNBASE >> PDRSHIFT), i = l1_pages; i < nkpt;
- i++, cur_space += PAGE_SIZE) {
- pdir = (offset + i) / NPDEPG;
- curoffset = ((offset + i) % NPDEPG);
- if (((offset + i) << PDRSHIFT) == VM_MAX_KERNEL_ADDRESS)
- break;
-
- /*
- * make sure that all the initial page table pages
- * have been zeroed
- */
- PT_SET_MA(cur_space, VTOM(cur_space) | PG_V | PG_RW);
- bzero((char *)cur_space, PAGE_SIZE);
- PT_SET_MA(cur_space, (vm_paddr_t)0);
- xen_pt_pin(VTOM(cur_space));
- xen_queue_pt_update((vm_paddr_t)(IdlePTDnewma[pdir] +
- curoffset*sizeof(vm_paddr_t)),
- VTOM(cur_space) | PG_KERNEL);
- PT_UPDATES_FLUSH();
- }
-
- for (i = 0; i < 4; i++) {
- pdir = (PTDPTDI + i) / NPDEPG;
- curoffset = (PTDPTDI + i) % NPDEPG;
-
- xen_queue_pt_update((vm_paddr_t)(IdlePTDnewma[pdir] +
- curoffset*sizeof(vm_paddr_t)),
- IdlePTDnewma[i] | PG_V);
- }
-
- PT_UPDATES_FLUSH();
-
- IdlePTD = IdlePTDnew;
- IdlePDPT = IdlePDPTnew;
- IdlePDPTma = IdlePDPTnewma;
-
- HYPERVISOR_shared_info = (shared_info_t *)cur_space;
- cur_space += PAGE_SIZE;
-
- xen_store = (struct xenstore_domain_interface *)cur_space;
- cur_space += PAGE_SIZE;
-
- console_page = (char *)cur_space;
- cur_space += PAGE_SIZE;
-
- /*
- * shared_info is an unsigned long so this will randomly break if
- * it is allocated above 4GB - I guess people are used to that
- * sort of thing with Xen ... sigh
- */
- shinfo = xen_start_info->shared_info;
- PT_SET_MA(HYPERVISOR_shared_info, shinfo | PG_KERNEL);
-
- xc_printf("#4\n");
-
- xen_store_ma = (((vm_paddr_t)xen_start_info->store_mfn) << PAGE_SHIFT);
- PT_SET_MA(xen_store, xen_store_ma | PG_KERNEL);
- console_page_ma = (((vm_paddr_t)xen_start_info->console.domU.mfn) << PAGE_SHIFT);
- PT_SET_MA(console_page, console_page_ma | PG_KERNEL);
-
- xc_printf("#5\n");
-
- set_iopl.iopl = 1;
- PANIC_IF(HYPERVISOR_physdev_op(PHYSDEVOP_SET_IOPL, &set_iopl));
- xc_printf("#6\n");
-#if 0
- /* add page table for KERNBASE */
- xen_queue_pt_update(IdlePTDma + KPTDI*sizeof(vm_paddr_t),
- VTOM(cur_space) | PG_KERNEL);
- xen_flush_queue();
-#ifdef PAE
- xen_queue_pt_update(pdir_shadow_ma[3] + KPTDI*sizeof(vm_paddr_t),
- VTOM(cur_space) | PG_V | PG_A);
-#else
- xen_queue_pt_update(pdir_shadow_ma + KPTDI*sizeof(vm_paddr_t),
- VTOM(cur_space) | PG_V | PG_A);
-#endif
- xen_flush_queue();
- cur_space += PAGE_SIZE;
- xc_printf("#6\n");
-#endif /* 0 */
-#ifdef notyet
- if (xen_start_info->flags & SIF_INITDOMAIN) {
- /* Map first megabyte */
- for (i = 0; i < (256 << PAGE_SHIFT); i += PAGE_SIZE)
- PT_SET_MA(KERNBASE + i, i | PG_KERNEL | PG_NC_PCD);
- xen_flush_queue();
- }
-#endif
- /*
- * re-map kernel text read-only
- *
- */
- for (i = (((vm_offset_t)&btext) & ~PAGE_MASK);
- i < (((vm_offset_t)&etext) & ~PAGE_MASK); i += PAGE_SIZE)
- PT_SET_MA(i, VTOM(i) | PG_V | PG_A);
-
- xc_printf("#7\n");
- physfree = VTOP(cur_space);
- init_first = physfree >> PAGE_SHIFT;
- IdlePTD = (pd_entry_t *)VTOP(IdlePTD);
- IdlePDPT = (pd_entry_t *)VTOP(IdlePDPT);
- setup_xen_features();
- xc_printf("#8, proc0kstack=%u\n", proc0kstack);
-}
-
-
-trap_info_t trap_table[] = {
- { 0, 0, GSEL(GCODE_SEL, SEL_KPL), (unsigned long) &IDTVEC(div)},
- { 1, 0|4, GSEL(GCODE_SEL, SEL_KPL), (unsigned long) &IDTVEC(dbg)},
- { 3, 3|4, GSEL(GCODE_SEL, SEL_KPL), (unsigned long) &IDTVEC(bpt)},
- { 4, 3, GSEL(GCODE_SEL, SEL_KPL), (unsigned long) &IDTVEC(ofl)},
- /* This is UPL on Linux and KPL on BSD */
- { 5, 3, GSEL(GCODE_SEL, SEL_KPL), (unsigned long) &IDTVEC(bnd)},
- { 6, 0, GSEL(GCODE_SEL, SEL_KPL), (unsigned long) &IDTVEC(ill)},
- { 7, 0|4, GSEL(GCODE_SEL, SEL_KPL), (unsigned long) &IDTVEC(dna)},
- /*
- * { 8, 0, GSEL(GCODE_SEL, SEL_KPL), (unsigned long) &IDTVEC(XXX)},
- * no handler for double fault
- */
- { 9, 0, GSEL(GCODE_SEL, SEL_KPL), (unsigned long) &IDTVEC(fpusegm)},
- {10, 0, GSEL(GCODE_SEL, SEL_KPL), (unsigned long) &IDTVEC(tss)},
- {11, 0, GSEL(GCODE_SEL, SEL_KPL), (unsigned long) &IDTVEC(missing)},
- {12, 0, GSEL(GCODE_SEL, SEL_KPL), (unsigned long) &IDTVEC(stk)},
- {13, 0, GSEL(GCODE_SEL, SEL_KPL), (unsigned long) &IDTVEC(prot)},
- {14, 0|4, GSEL(GCODE_SEL, SEL_KPL), (unsigned long) &IDTVEC(page)},
- {15, 0, GSEL(GCODE_SEL, SEL_KPL), (unsigned long) &IDTVEC(rsvd)},
- {16, 0, GSEL(GCODE_SEL, SEL_KPL), (unsigned long) &IDTVEC(fpu)},
- {17, 0, GSEL(GCODE_SEL, SEL_KPL), (unsigned long) &IDTVEC(align)},
- {18, 0, GSEL(GCODE_SEL, SEL_KPL), (unsigned long) &IDTVEC(mchk)},
- {19, 0, GSEL(GCODE_SEL, SEL_KPL), (unsigned long) &IDTVEC(xmm)},
- {0x80, 3, GSEL(GCODE_SEL, SEL_KPL), (unsigned long) &IDTVEC(int0x80_syscall)},
- { 0, 0, 0, 0 }
-};
-
-/* Perform a multicall and check that individual calls succeeded. */
-int
-HYPERVISOR_multicall(struct multicall_entry * call_list, int nr_calls)
-{
- int ret = 0;
- int i;
-
- /* Perform the multicall. */
- PANIC_IF(_HYPERVISOR_multicall(call_list, nr_calls));
-
- /* Check the results of individual hypercalls. */
- for (i = 0; i < nr_calls; i++)
- if (__predict_false(call_list[i].result < 0))
- ret++;
- if (__predict_false(ret > 0))
- panic("%d multicall(s) failed: cpu %d\n",
- ret, smp_processor_id());
-
- /* If we didn't panic already, everything succeeded. */
- return (0);
-}
-
-/********** CODE WORTH KEEPING ABOVE HERE *****************/
-
-void xen_failsafe_handler(void);
-
-void
-xen_failsafe_handler(void)
-{
-
- panic("xen_failsafe_handler called!\n");
-}
-
-void xen_handle_thread_switch(struct pcb *pcb);
-
-/* This is called by cpu_switch() when switching threads. */
-/* The pcb arg refers to the process control block of the */
-/* next thread which is to run */
-void
-xen_handle_thread_switch(struct pcb *pcb)
-{
- uint32_t *a = (uint32_t *)&PCPU_GET(fsgs_gdt)[0];
- uint32_t *b = (uint32_t *)&pcb->pcb_fsd;
- multicall_entry_t mcl[3];
- int i = 0;
-
- /* Notify Xen of task switch */
- mcl[i].op = __HYPERVISOR_stack_switch;
- mcl[i].args[0] = GSEL(GDATA_SEL, SEL_KPL);
- mcl[i++].args[1] = (unsigned long)pcb;
-
- /* Check for update of fsd */
- if (*a != *b || *(a+1) != *(b+1)) {
- mcl[i].op = __HYPERVISOR_update_descriptor;
- *(uint64_t *)&mcl[i].args[0] = vtomach((vm_offset_t)a);
- *(uint64_t *)&mcl[i++].args[2] = *(uint64_t *)b;
- }
-
- a += 2;
- b += 2;
-
- /* Check for update of gsd */
- if (*a != *b || *(a+1) != *(b+1)) {
- mcl[i].op = __HYPERVISOR_update_descriptor;
- *(uint64_t *)&mcl[i].args[0] = vtomach((vm_offset_t)a);
- *(uint64_t *)&mcl[i++].args[2] = *(uint64_t *)b;
- }
-
- (void)HYPERVISOR_multicall(mcl, i);
-}
diff --git a/sys/kern/imgact_elf.c b/sys/kern/imgact_elf.c
index 0a8b79a..3ff3440 100644
--- a/sys/kern/imgact_elf.c
+++ b/sys/kern/imgact_elf.c
@@ -782,6 +782,7 @@ __CONCAT(exec_, __elfN(imgact))(struct image_params *imgp)
if (__elfN(nxstack))
imgp->stack_prot =
__elfN(trans_prot)(phdr[i].p_flags);
+ imgp->stack_sz = phdr[i].p_memsz;
break;
}
}
@@ -1237,12 +1238,14 @@ __elfN(coredump)(struct thread *td, struct vnode *vp, off_t limit, int flags)
coresize = round_page(hdrsize + notesz) + seginfo.size;
#ifdef RACCT
- PROC_LOCK(td->td_proc);
- error = racct_add(td->td_proc, RACCT_CORE, coresize);
- PROC_UNLOCK(td->td_proc);
- if (error != 0) {
- error = EFAULT;
- goto done;
+ if (racct_enable) {
+ PROC_LOCK(td->td_proc);
+ error = racct_add(td->td_proc, RACCT_CORE, coresize);
+ PROC_UNLOCK(td->td_proc);
+ if (error != 0) {
+ error = EFAULT;
+ goto done;
+ }
}
#endif
if (coresize >= limit) {
diff --git a/sys/kern/init_main.c b/sys/kern/init_main.c
index 88cd44c..b77b788 100644
--- a/sys/kern/init_main.c
+++ b/sys/kern/init_main.c
@@ -710,6 +710,9 @@ start_init(void *dummy)
vfs_mountroot();
+ /* Wipe GELI passphrase from the environment. */
+ kern_unsetenv("kern.geom.eli.passphrase");
+
/*
* Need just enough stack to hold the faked-up "execve()" arguments.
*/
diff --git a/sys/kern/init_sysent.c b/sys/kern/init_sysent.c
index 8aefa3f..14e8281 100644
--- a/sys/kern/init_sysent.c
+++ b/sys/kern/init_sysent.c
@@ -3,7 +3,7 @@
*
* DO NOT EDIT-- this file is automatically generated.
* $FreeBSD$
- * created from FreeBSD: head/sys/kern/syscalls.master 277610 2015-01-23 21:07:08Z jilles
+ * created from FreeBSD: head/sys/kern/syscalls.master 281714 2015-04-18 21:50:13Z kib
*/
#include "opt_compat.h"
@@ -26,6 +26,12 @@
#define compat4(n, name) 0, (sy_call_t *)nosys
#endif
+#ifdef COMPAT_FREEBSD6
+#define compat6(n, name) n, (sy_call_t *)__CONCAT(freebsd6_,name)
+#else
+#define compat6(n, name) 0, (sy_call_t *)nosys
+#endif
+
#ifdef COMPAT_FREEBSD7
#define compat7(n, name) n, (sy_call_t *)__CONCAT(freebsd7_,name)
#else
@@ -207,8 +213,8 @@ struct sysent sysent[] = {
{ AS(msgsys_args), (sy_call_t *)lkmressys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT }, /* 170 = msgsys */
{ AS(shmsys_args), (sy_call_t *)lkmressys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT }, /* 171 = shmsys */
{ 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT }, /* 172 = nosys */
- { AS(freebsd6_pread_args), (sy_call_t *)freebsd6_pread, AUE_PREAD, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 173 = freebsd6_pread */
- { AS(freebsd6_pwrite_args), (sy_call_t *)freebsd6_pwrite, AUE_PWRITE, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 174 = freebsd6_pwrite */
+ { compat6(AS(freebsd6_pread_args),pread), AUE_PREAD, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 173 = freebsd6 pread */
+ { compat6(AS(freebsd6_pwrite_args),pwrite), AUE_PWRITE, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 174 = freebsd6 pwrite */
{ AS(setfib_args), (sy_call_t *)sys_setfib, AUE_NULL, NULL, 0, 0, 0, SY_THR_STATIC }, /* 175 = setfib */
{ AS(ntp_adjtime_args), (sy_call_t *)sys_ntp_adjtime, AUE_NTP_ADJTIME, NULL, 0, 0, 0, SY_THR_STATIC }, /* 176 = ntp_adjtime */
{ 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0, SY_THR_ABSENT }, /* 177 = sfork */
@@ -231,11 +237,11 @@ struct sysent sysent[] = {
{ AS(__getrlimit_args), (sy_call_t *)sys_getrlimit, AUE_GETRLIMIT, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 194 = getrlimit */
{ AS(__setrlimit_args), (sy_call_t *)sys_setrlimit, AUE_SETRLIMIT, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 195 = setrlimit */
{ AS(getdirentries_args), (sy_call_t *)sys_getdirentries, AUE_GETDIRENTRIES, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 196 = getdirentries */
- { AS(freebsd6_mmap_args), (sy_call_t *)freebsd6_mmap, AUE_MMAP, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 197 = freebsd6_mmap */
+ { compat6(AS(freebsd6_mmap_args),mmap), AUE_MMAP, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 197 = freebsd6 mmap */
{ 0, (sy_call_t *)nosys, AUE_NULL, NULL, 0, 0, 0, SY_THR_STATIC }, /* 198 = __syscall */
- { AS(freebsd6_lseek_args), (sy_call_t *)freebsd6_lseek, AUE_LSEEK, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 199 = freebsd6_lseek */
- { AS(freebsd6_truncate_args), (sy_call_t *)freebsd6_truncate, AUE_TRUNCATE, NULL, 0, 0, 0, SY_THR_STATIC }, /* 200 = freebsd6_truncate */
- { AS(freebsd6_ftruncate_args), (sy_call_t *)freebsd6_ftruncate, AUE_FTRUNCATE, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 201 = freebsd6_ftruncate */
+ { compat6(AS(freebsd6_lseek_args),lseek), AUE_LSEEK, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 199 = freebsd6 lseek */
+ { compat6(AS(freebsd6_truncate_args),truncate), AUE_TRUNCATE, NULL, 0, 0, 0, SY_THR_STATIC }, /* 200 = freebsd6 truncate */
+ { compat6(AS(freebsd6_ftruncate_args),ftruncate), AUE_FTRUNCATE, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 201 = freebsd6 ftruncate */
{ AS(sysctl_args), (sy_call_t *)sys___sysctl, AUE_SYSCTL, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 202 = __sysctl */
{ AS(mlock_args), (sy_call_t *)sys_mlock, AUE_MLOCK, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 203 = mlock */
{ AS(munlock_args), (sy_call_t *)sys_munlock, AUE_MUNLOCK, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC }, /* 204 = munlock */
diff --git a/sys/kern/kern_descrip.c b/sys/kern/kern_descrip.c
index 4041353..329f418 100644
--- a/sys/kern/kern_descrip.c
+++ b/sys/kern/kern_descrip.c
@@ -857,13 +857,15 @@ do_dup(struct thread *td, int flags, int old, int new)
* the limit on the size of the file descriptor table.
*/
#ifdef RACCT
- PROC_LOCK(p);
- error = racct_set(p, RACCT_NOFILE, new + 1);
- PROC_UNLOCK(p);
- if (error != 0) {
- FILEDESC_XUNLOCK(fdp);
- fdrop(fp, td);
- return (EMFILE);
+ if (racct_enable) {
+ PROC_LOCK(p);
+ error = racct_set(p, RACCT_NOFILE, new + 1);
+ PROC_UNLOCK(p);
+ if (error != 0) {
+ FILEDESC_XUNLOCK(fdp);
+ fdrop(fp, td);
+ return (EMFILE);
+ }
}
#endif
fdgrowtable_exp(fdp, new + 1);
@@ -1609,7 +1611,7 @@ fdalloc(struct thread *td, int minfd, int *result)
{
struct proc *p = td->td_proc;
struct filedesc *fdp = p->p_fd;
- int fd = -1, maxfd, allocfd;
+ int fd, maxfd, allocfd;
#ifdef RACCT
int error;
#endif
@@ -1631,11 +1633,13 @@ fdalloc(struct thread *td, int minfd, int *result)
if (fd >= fdp->fd_nfiles) {
allocfd = min(fd * 2, maxfd);
#ifdef RACCT
- PROC_LOCK(p);
- error = racct_set(p, RACCT_NOFILE, allocfd);
- PROC_UNLOCK(p);
- if (error != 0)
- return (EMFILE);
+ if (racct_enable) {
+ PROC_LOCK(p);
+ error = racct_set(p, RACCT_NOFILE, allocfd);
+ PROC_UNLOCK(p);
+ if (error != 0)
+ return (EMFILE);
+ }
#endif
/*
* fd is already equal to first free descriptor >= minfd, so
@@ -2042,9 +2046,11 @@ fdescfree(struct thread *td)
MPASS(fdp != NULL);
#ifdef RACCT
- PROC_LOCK(td->td_proc);
- racct_set(td->td_proc, RACCT_NOFILE, 0);
- PROC_UNLOCK(td->td_proc);
+ if (racct_enable) {
+ PROC_LOCK(td->td_proc);
+ racct_set(td->td_proc, RACCT_NOFILE, 0);
+ PROC_UNLOCK(td->td_proc);
+ }
#endif
if (td->td_proc->p_fdtol != NULL)
@@ -2155,8 +2161,9 @@ fdsetugidsafety(struct thread *td)
* file descriptor out from under the thread creating the file object.
*/
void
-fdclose(struct filedesc *fdp, struct file *fp, int idx, struct thread *td)
+fdclose(struct thread *td, struct file *fp, int idx)
{
+ struct filedesc *fdp = td->td_proc->p_fd;
FILEDESC_XLOCK(fdp);
if (fdp->fd_ofiles[idx].fde_file == fp) {
diff --git a/sys/kern/kern_exec.c b/sys/kern/kern_exec.c
index 388ed19..9d893f8 100644
--- a/sys/kern/kern_exec.c
+++ b/sys/kern/kern_exec.c
@@ -1009,6 +1009,7 @@ exec_new_vmspace(imgp, sv)
struct proc *p = imgp->proc;
struct vmspace *vmspace = p->p_vmspace;
vm_object_t obj;
+ struct rlimit rlim_stack;
vm_offset_t sv_minuser, stack_addr;
vm_map_t map;
u_long ssiz;
@@ -1058,10 +1059,22 @@ exec_new_vmspace(imgp, sv)
}
/* Allocate a new stack */
- if (sv->sv_maxssiz != NULL)
+ if (imgp->stack_sz != 0) {
+ ssiz = trunc_page(imgp->stack_sz);
+ PROC_LOCK(p);
+ lim_rlimit(p, RLIMIT_STACK, &rlim_stack);
+ PROC_UNLOCK(p);
+ if (ssiz > rlim_stack.rlim_max)
+ ssiz = rlim_stack.rlim_max;
+ if (ssiz > rlim_stack.rlim_cur) {
+ rlim_stack.rlim_cur = ssiz;
+ kern_setrlimit(curthread, RLIMIT_STACK, &rlim_stack);
+ }
+ } else if (sv->sv_maxssiz != NULL) {
ssiz = *sv->sv_maxssiz;
- else
+ } else {
ssiz = maxssiz;
+ }
stack_addr = sv->sv_usrstack - ssiz;
error = vm_map_stack(map, stack_addr, (vm_size_t)ssiz,
obj != NULL && imgp->stack_prot != 0 ? imgp->stack_prot :
diff --git a/sys/kern/kern_exit.c b/sys/kern/kern_exit.c
index 4d23fc0..0a601a1 100644
--- a/sys/kern/kern_exit.c
+++ b/sys/kern/kern_exit.c
@@ -907,9 +907,11 @@ proc_reap(struct thread *td, struct proc *p, int *status, int options)
* Destroy resource accounting information associated with the process.
*/
#ifdef RACCT
- PROC_LOCK(p);
- racct_sub(p, RACCT_NPROC, 1);
- PROC_UNLOCK(p);
+ if (racct_enable) {
+ PROC_LOCK(p);
+ racct_sub(p, RACCT_NPROC, 1);
+ PROC_UNLOCK(p);
+ }
#endif
racct_proc_exit(p);
diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c
index a3a70b8..c3dd792 100644
--- a/sys/kern/kern_fork.c
+++ b/sys/kern/kern_fork.c
@@ -949,7 +949,7 @@ fail2:
vmspace_free(vm2);
uma_zfree(proc_zone, newproc);
if ((flags & RFPROCDESC) != 0 && fp_procdesc != NULL) {
- fdclose(td->td_proc->p_fd, fp_procdesc, *procdescp, td);
+ fdclose(td, fp_procdesc, *procdescp);
fdrop(fp_procdesc, td);
}
pause("fork", hz / 2);
diff --git a/sys/kern/kern_gzio.c b/sys/kern/kern_gzio.c
index a4974a7..cee21f0 100644
--- a/sys/kern/kern_gzio.c
+++ b/sys/kern/kern_gzio.c
@@ -32,8 +32,7 @@ __FBSDID("$FreeBSD$");
#include <sys/gzio.h>
#include <sys/kernel.h>
#include <sys/malloc.h>
-
-#include <net/zutil.h>
+#include <sys/zutil.h>
#define KERN_GZ_HDRLEN 10 /* gzip header length */
#define KERN_GZ_TRAILERLEN 8 /* gzip trailer length */
diff --git a/sys/kern/kern_intr.c b/sys/kern/kern_intr.c
index 7a5d936..a84019a 100644
--- a/sys/kern/kern_intr.c
+++ b/sys/kern/kern_intr.c
@@ -1455,12 +1455,7 @@ intr_event_handle(struct intr_event *ie, struct trapframe *frame)
/* Schedule the ithread if needed. */
if (thread) {
error = intr_event_schedule_thread(ie);
-#ifndef XEN
KASSERT(error == 0, ("bad stray interrupt"));
-#else
- if (error != 0)
- log(LOG_WARNING, "bad stray interrupt");
-#endif
}
critical_exit();
td->td_intr_nesting_level--;
diff --git a/sys/kern/kern_jail.c b/sys/kern/kern_jail.c
index 5b23129..c87c4e2 100644
--- a/sys/kern/kern_jail.c
+++ b/sys/kern/kern_jail.c
@@ -1778,7 +1778,7 @@ kern_jail_set(struct thread *td, struct uio *optuio, int flags)
mtx_unlock(&pr->pr_mtx);
#ifdef RACCT
- if (created)
+ if (racct_enable && created)
prison_racct_attach(pr);
#endif
@@ -1862,7 +1862,7 @@ kern_jail_set(struct thread *td, struct uio *optuio, int flags)
}
#ifdef RACCT
- if (!created) {
+ if (racct_enable && !created) {
if (!(flags & JAIL_ATTACH))
sx_sunlock(&allprison_lock);
prison_racct_modify(pr);
@@ -2652,7 +2652,8 @@ prison_deref(struct prison *pr, int flags)
cpuset_rel(pr->pr_cpuset);
osd_jail_exit(pr);
#ifdef RACCT
- prison_racct_detach(pr);
+ if (racct_enable)
+ prison_racct_detach(pr);
#endif
free(pr, M_PRISON);
@@ -4460,12 +4461,15 @@ SYSCTL_JAIL_PARAM(_allow_mount, tmpfs, CTLTYPE_INT | CTLFLAG_RW,
SYSCTL_JAIL_PARAM(_allow_mount, zfs, CTLTYPE_INT | CTLFLAG_RW,
"B", "Jail may mount the zfs file system");
+#ifdef RACCT
void
prison_racct_foreach(void (*callback)(struct racct *racct,
void *arg2, void *arg3), void *arg2, void *arg3)
{
struct prison_racct *prr;
+ ASSERT_RACCT_ENABLED();
+
sx_slock(&allprison_lock);
LIST_FOREACH(prr, &allprison_racct, prr_next)
(callback)(prr->prr_racct, arg2, arg3);
@@ -4477,6 +4481,7 @@ prison_racct_find_locked(const char *name)
{
struct prison_racct *prr;
+ ASSERT_RACCT_ENABLED();
sx_assert(&allprison_lock, SA_XLOCKED);
if (name[0] == '\0' || strlen(name) >= MAXHOSTNAMELEN)
@@ -4507,6 +4512,8 @@ prison_racct_find(const char *name)
{
struct prison_racct *prr;
+ ASSERT_RACCT_ENABLED();
+
sx_xlock(&allprison_lock);
prr = prison_racct_find_locked(name);
sx_xunlock(&allprison_lock);
@@ -4517,6 +4524,8 @@ void
prison_racct_hold(struct prison_racct *prr)
{
+ ASSERT_RACCT_ENABLED();
+
refcount_acquire(&prr->prr_refcount);
}
@@ -4524,6 +4533,7 @@ static void
prison_racct_free_locked(struct prison_racct *prr)
{
+ ASSERT_RACCT_ENABLED();
sx_assert(&allprison_lock, SA_XLOCKED);
if (refcount_release(&prr->prr_refcount)) {
@@ -4538,6 +4548,7 @@ prison_racct_free(struct prison_racct *prr)
{
int old;
+ ASSERT_RACCT_ENABLED();
sx_assert(&allprison_lock, SA_UNLOCKED);
old = prr->prr_refcount;
@@ -4549,12 +4560,12 @@ prison_racct_free(struct prison_racct *prr)
sx_xunlock(&allprison_lock);
}
-#ifdef RACCT
static void
prison_racct_attach(struct prison *pr)
{
struct prison_racct *prr;
+ ASSERT_RACCT_ENABLED();
sx_assert(&allprison_lock, SA_XLOCKED);
prr = prison_racct_find_locked(pr->pr_name);
@@ -4574,6 +4585,8 @@ prison_racct_modify(struct prison *pr)
struct ucred *cred;
struct prison_racct *oldprr;
+ ASSERT_RACCT_ENABLED();
+
sx_slock(&allproc_lock);
sx_xlock(&allprison_lock);
@@ -4613,6 +4626,7 @@ static void
prison_racct_detach(struct prison *pr)
{
+ ASSERT_RACCT_ENABLED();
sx_assert(&allprison_lock, SA_UNLOCKED);
if (pr->pr_prison_racct == NULL)
diff --git a/sys/kern/kern_physio.c b/sys/kern/kern_physio.c
index b37b9f3..71cfded 100644
--- a/sys/kern/kern_physio.c
+++ b/sys/kern/kern_physio.c
@@ -25,27 +25,26 @@ __FBSDID("$FreeBSD$");
#include <sys/bio.h>
#include <sys/buf.h>
#include <sys/conf.h>
+#include <sys/malloc.h>
#include <sys/proc.h>
#include <sys/uio.h>
+#include <geom/geom.h>
#include <vm/vm.h>
+#include <vm/vm_page.h>
#include <vm/vm_extern.h>
+#include <vm/vm_map.h>
int
physio(struct cdev *dev, struct uio *uio, int ioflag)
{
- struct buf *bp;
- struct cdevsw *csw;
+ struct buf *pbuf;
+ struct bio *bp;
+ struct vm_page **pages;
caddr_t sa;
- u_int iolen;
- int error, i, mapped;
-
- /* Keep the process UPAGES from being swapped. XXX: why ? */
- PHOLD(curproc);
-
- bp = getpbuf(NULL);
- sa = bp->b_data;
- error = 0;
+ u_int iolen, poff;
+ int error, i, npages, maxpages;
+ vm_prot_t prot;
/* XXX: sanity check */
if(dev->si_iosize_max < PAGE_SIZE) {
@@ -76,95 +75,128 @@ physio(struct cdev *dev, struct uio *uio, int ioflag)
uprintf("%s: request vectors=%d > 1; "
"cannot split request\n", devtoname(dev),
uio->uio_iovcnt);
-
- error = EFBIG;
- goto doerror;
+ return (EFBIG);
}
+ /*
+ * Keep the process UPAGES from being swapped. Processes swapped
+ * out while holding pbufs, used by swapper, may lead to deadlock.
+ */
+ PHOLD(curproc);
+
+ bp = g_alloc_bio();
+ if (uio->uio_segflg != UIO_USERSPACE) {
+ pbuf = NULL;
+ pages = NULL;
+ } else if ((dev->si_flags & SI_UNMAPPED) && unmapped_buf_allowed) {
+ pbuf = NULL;
+ maxpages = btoc(MIN(uio->uio_resid, MAXPHYS)) + 1;
+ pages = malloc(sizeof(*pages) * maxpages, M_DEVBUF, M_WAITOK);
+ } else {
+ pbuf = getpbuf(NULL);
+ sa = pbuf->b_data;
+ maxpages = btoc(MAXPHYS);
+ pages = pbuf->b_pages;
+ }
+ prot = VM_PROT_READ;
+ if (uio->uio_rw == UIO_READ)
+ prot |= VM_PROT_WRITE; /* Less backwards than it looks */
+ error = 0;
for (i = 0; i < uio->uio_iovcnt; i++) {
while (uio->uio_iov[i].iov_len) {
- bp->b_flags = 0;
+ bzero(bp, sizeof(*bp));
if (uio->uio_rw == UIO_READ) {
- bp->b_iocmd = BIO_READ;
+ bp->bio_cmd = BIO_READ;
curthread->td_ru.ru_inblock++;
} else {
- bp->b_iocmd = BIO_WRITE;
+ bp->bio_cmd = BIO_WRITE;
curthread->td_ru.ru_oublock++;
}
- bp->b_iodone = bdone;
- bp->b_data = uio->uio_iov[i].iov_base;
- bp->b_bcount = uio->uio_iov[i].iov_len;
- bp->b_offset = uio->uio_offset;
- bp->b_iooffset = uio->uio_offset;
- bp->b_saveaddr = sa;
-
- /* Don't exceed drivers iosize limit */
- if (bp->b_bcount > dev->si_iosize_max)
- bp->b_bcount = dev->si_iosize_max;
-
- /*
- * Make sure the pbuf can map the request
- * XXX: The pbuf has kvasize = MAXPHYS so a request
- * XXX: larger than MAXPHYS - PAGE_SIZE must be
- * XXX: page aligned or it will be fragmented.
+ bp->bio_offset = uio->uio_offset;
+ bp->bio_data = uio->uio_iov[i].iov_base;
+ bp->bio_length = uio->uio_iov[i].iov_len;
+ if (bp->bio_length > dev->si_iosize_max)
+ bp->bio_length = dev->si_iosize_max;
+ if (bp->bio_length > MAXPHYS)
+ bp->bio_length = MAXPHYS;
+
+ /*
+ * Make sure the pbuf can map the request.
+ * The pbuf has kvasize = MAXPHYS, so a request
+ * larger than MAXPHYS - PAGE_SIZE must be
+ * page aligned or it will be fragmented.
*/
- iolen = ((vm_offset_t) bp->b_data) & PAGE_MASK;
- if ((bp->b_bcount + iolen) > bp->b_kvasize) {
- /*
- * This device does not want I/O to be split.
- */
+ poff = (vm_offset_t)bp->bio_data & PAGE_MASK;
+ if (pbuf && bp->bio_length + poff > pbuf->b_kvasize) {
if (dev->si_flags & SI_NOSPLIT) {
uprintf("%s: request ptr %p is not "
"on a page boundary; cannot split "
"request\n", devtoname(dev),
- bp->b_data);
+ bp->bio_data);
error = EFBIG;
goto doerror;
}
- bp->b_bcount = bp->b_kvasize;
- if (iolen != 0)
- bp->b_bcount -= PAGE_SIZE;
+ bp->bio_length = pbuf->b_kvasize;
+ if (poff != 0)
+ bp->bio_length -= PAGE_SIZE;
}
- bp->b_bufsize = bp->b_bcount;
- bp->b_blkno = btodb(bp->b_offset);
+ bp->bio_bcount = bp->bio_length;
+ bp->bio_dev = dev;
- csw = dev->si_devsw;
- if (uio->uio_segflg == UIO_USERSPACE) {
- if (dev->si_flags & SI_UNMAPPED)
- mapped = 0;
- else
- mapped = 1;
- if (vmapbuf(bp, mapped) < 0) {
+ if (pages) {
+ if ((npages = vm_fault_quick_hold_pages(
+ &curproc->p_vmspace->vm_map,
+ (vm_offset_t)bp->bio_data, bp->bio_length,
+ prot, pages, maxpages)) < 0) {
error = EFAULT;
goto doerror;
}
+ if (pbuf) {
+ pmap_qenter((vm_offset_t)sa,
+ pages, npages);
+ bp->bio_data = sa + poff;
+ } else {
+ bp->bio_ma = pages;
+ bp->bio_ma_n = npages;
+ bp->bio_ma_offset = poff;
+ bp->bio_data = unmapped_buf;
+ bp->bio_flags |= BIO_UNMAPPED;
+ }
}
- dev_strategy_csw(dev, csw, bp);
+ dev->si_devsw->d_strategy(bp);
if (uio->uio_rw == UIO_READ)
- bwait(bp, PRIBIO, "physrd");
+ biowait(bp, "physrd");
else
- bwait(bp, PRIBIO, "physwr");
+ biowait(bp, "physwr");
+
+ if (pages) {
+ if (pbuf)
+ pmap_qremove((vm_offset_t)sa, npages);
+ vm_page_unhold_pages(pages, npages);
+ }
- if (uio->uio_segflg == UIO_USERSPACE)
- vunmapbuf(bp);
- iolen = bp->b_bcount - bp->b_resid;
- if (iolen == 0 && !(bp->b_ioflags & BIO_ERROR))
+ iolen = bp->bio_length - bp->bio_resid;
+ if (iolen == 0 && !(bp->bio_flags & BIO_ERROR))
goto doerror; /* EOF */
uio->uio_iov[i].iov_len -= iolen;
uio->uio_iov[i].iov_base =
(char *)uio->uio_iov[i].iov_base + iolen;
uio->uio_resid -= iolen;
uio->uio_offset += iolen;
- if( bp->b_ioflags & BIO_ERROR) {
- error = bp->b_error;
+ if (bp->bio_flags & BIO_ERROR) {
+ error = bp->bio_error;
goto doerror;
}
}
}
doerror:
- relpbuf(bp, NULL);
+ if (pbuf)
+ relpbuf(pbuf, NULL);
+ else if (pages)
+ free(pages, M_DEVBUF);
+ g_destroy_bio(bp);
PRELE(curproc);
return (error);
}
diff --git a/sys/kern/kern_poll.c b/sys/kern/kern_poll.c
index 04b4e79..5aa12f0 100644
--- a/sys/kern/kern_poll.c
+++ b/sys/kern/kern_poll.c
@@ -367,6 +367,9 @@ netisr_pollmore()
struct timeval t;
int kern_load;
+ if (poll_handlers == 0)
+ return;
+
mtx_lock(&poll_mtx);
if (!netisr_pollmore_scheduled) {
mtx_unlock(&poll_mtx);
@@ -424,6 +427,9 @@ netisr_poll(void)
int i, cycles;
enum poll_cmd arg = POLL_ONLY;
+ if (poll_handlers == 0)
+ return;
+
mtx_lock(&poll_mtx);
if (!netisr_poll_scheduled) {
mtx_unlock(&poll_mtx);
diff --git a/sys/kern/kern_proc.c b/sys/kern/kern_proc.c
index 505521d..6618c08 100644
--- a/sys/kern/kern_proc.c
+++ b/sys/kern/kern_proc.c
@@ -2822,7 +2822,7 @@ static SYSCTL_NODE(_kern_proc, KERN_PROC_PROC, proc, CTLFLAG_RD | CTLFLAG_MPSAFE
sysctl_kern_proc, "Return process table, no threads");
static SYSCTL_NODE(_kern_proc, KERN_PROC_ARGS, args,
- CTLFLAG_RW | CTLFLAG_ANYBODY | CTLFLAG_MPSAFE,
+ CTLFLAG_RW | CTLFLAG_CAPWR | CTLFLAG_ANYBODY | CTLFLAG_MPSAFE,
sysctl_kern_proc_args, "Process argument list");
static SYSCTL_NODE(_kern_proc, KERN_PROC_ENV, env, CTLFLAG_RD | CTLFLAG_MPSAFE,
diff --git a/sys/kern/kern_racct.c b/sys/kern/kern_racct.c
index 05becea..5cee140 100644
--- a/sys/kern/kern_racct.c
+++ b/sys/kern/kern_racct.c
@@ -70,8 +70,15 @@ FEATURE(racct, "Resource Accounting");
* Do not block processes that have their %cpu usage <= pcpu_threshold.
*/
static int pcpu_threshold = 1;
+#ifdef RACCT_DISABLED
+int racct_enable = 0;
+#else
+int racct_enable = 1;
+#endif
SYSCTL_NODE(_kern, OID_AUTO, racct, CTLFLAG_RW, 0, "Resource Accounting");
+SYSCTL_UINT(_kern_racct, OID_AUTO, enable, CTLFLAG_RDTUN, &racct_enable,
+ 0, "Enable RACCT/RCTL");
SYSCTL_UINT(_kern_racct, OID_AUTO, pcpu_threshold, CTLFLAG_RW, &pcpu_threshold,
0, "Processes with higher %cpu usage than this value can be throttled.");
@@ -313,6 +320,8 @@ racct_getpcpu(struct proc *p, u_int pcpu)
fixpt_t p_pctcpu;
struct thread *td;
+ ASSERT_RACCT_ENABLED();
+
/*
* If the process is swapped out, we count its %cpu usage as zero.
* This behaviour is consistent with the userland ps(1) tool.
@@ -377,6 +386,7 @@ racct_add_racct(struct racct *dest, const struct racct *src)
{
int i;
+ ASSERT_RACCT_ENABLED();
mtx_assert(&racct_lock, MA_OWNED);
/*
@@ -398,6 +408,7 @@ racct_sub_racct(struct racct *dest, const struct racct *src)
{
int i;
+ ASSERT_RACCT_ENABLED();
mtx_assert(&racct_lock, MA_OWNED);
/*
@@ -431,6 +442,9 @@ void
racct_create(struct racct **racctp)
{
+ if (!racct_enable)
+ return;
+
SDT_PROBE(racct, kernel, racct, create, racctp, 0, 0, 0, 0);
KASSERT(*racctp == NULL, ("racct already allocated"));
@@ -444,6 +458,8 @@ racct_destroy_locked(struct racct **racctp)
int i;
struct racct *racct;
+ ASSERT_RACCT_ENABLED();
+
SDT_PROBE(racct, kernel, racct, destroy, racctp, 0, 0, 0, 0);
mtx_assert(&racct_lock, MA_OWNED);
@@ -470,6 +486,9 @@ void
racct_destroy(struct racct **racct)
{
+ if (!racct_enable)
+ return;
+
mtx_lock(&racct_lock);
racct_destroy_locked(racct);
mtx_unlock(&racct_lock);
@@ -485,6 +504,7 @@ racct_alloc_resource(struct racct *racct, int resource,
uint64_t amount)
{
+ ASSERT_RACCT_ENABLED();
mtx_assert(&racct_lock, MA_OWNED);
KASSERT(racct != NULL, ("NULL racct"));
@@ -516,6 +536,8 @@ racct_add_locked(struct proc *p, int resource, uint64_t amount)
int error;
#endif
+ ASSERT_RACCT_ENABLED();
+
SDT_PROBE(racct, kernel, rusage, add, p, resource, amount, 0, 0);
/*
@@ -546,6 +568,9 @@ racct_add(struct proc *p, int resource, uint64_t amount)
{
int error;
+ if (!racct_enable)
+ return (0);
+
mtx_lock(&racct_lock);
error = racct_add_locked(p, resource, amount);
mtx_unlock(&racct_lock);
@@ -557,6 +582,8 @@ racct_add_cred_locked(struct ucred *cred, int resource, uint64_t amount)
{
struct prison *pr;
+ ASSERT_RACCT_ENABLED();
+
SDT_PROBE(racct, kernel, rusage, add__cred, cred, resource, amount,
0, 0);
@@ -577,6 +604,9 @@ void
racct_add_cred(struct ucred *cred, int resource, uint64_t amount)
{
+ if (!racct_enable)
+ return;
+
mtx_lock(&racct_lock);
racct_add_cred_locked(cred, resource, amount);
mtx_unlock(&racct_lock);
@@ -590,6 +620,9 @@ void
racct_add_force(struct proc *p, int resource, uint64_t amount)
{
+ if (!racct_enable)
+ return;
+
SDT_PROBE(racct, kernel, rusage, add__force, p, resource, amount, 0, 0);
/*
@@ -612,6 +645,8 @@ racct_set_locked(struct proc *p, int resource, uint64_t amount)
int error;
#endif
+ ASSERT_RACCT_ENABLED();
+
SDT_PROBE(racct, kernel, rusage, set, p, resource, amount, 0, 0);
/*
@@ -671,6 +706,9 @@ racct_set(struct proc *p, int resource, uint64_t amount)
{
int error;
+ if (!racct_enable)
+ return (0);
+
mtx_lock(&racct_lock);
error = racct_set_locked(p, resource, amount);
mtx_unlock(&racct_lock);
@@ -683,6 +721,8 @@ racct_set_force_locked(struct proc *p, int resource, uint64_t amount)
int64_t old_amount, decayed_amount;
int64_t diff_proc, diff_cred;
+ ASSERT_RACCT_ENABLED();
+
SDT_PROBE(racct, kernel, rusage, set, p, resource, amount, 0, 0);
/*
@@ -717,6 +757,10 @@ racct_set_force_locked(struct proc *p, int resource, uint64_t amount)
void
racct_set_force(struct proc *p, int resource, uint64_t amount)
{
+
+ if (!racct_enable)
+ return;
+
mtx_lock(&racct_lock);
racct_set_force_locked(p, resource, amount);
mtx_unlock(&racct_lock);
@@ -732,6 +776,9 @@ uint64_t
racct_get_limit(struct proc *p, int resource)
{
+ if (!racct_enable)
+ return (UINT64_MAX);
+
#ifdef RCTL
return (rctl_get_limit(p, resource));
#else
@@ -749,6 +796,9 @@ uint64_t
racct_get_available(struct proc *p, int resource)
{
+ if (!racct_enable)
+ return (UINT64_MAX);
+
#ifdef RCTL
return (rctl_get_available(p, resource));
#else
@@ -765,6 +815,8 @@ static int64_t
racct_pcpu_available(struct proc *p)
{
+ ASSERT_RACCT_ENABLED();
+
#ifdef RCTL
return (rctl_pcpu_available(p));
#else
@@ -779,6 +831,9 @@ void
racct_sub(struct proc *p, int resource, uint64_t amount)
{
+ if (!racct_enable)
+ return;
+
SDT_PROBE(racct, kernel, rusage, sub, p, resource, amount, 0, 0);
/*
@@ -804,6 +859,8 @@ racct_sub_cred_locked(struct ucred *cred, int resource, uint64_t amount)
{
struct prison *pr;
+ ASSERT_RACCT_ENABLED();
+
SDT_PROBE(racct, kernel, rusage, sub__cred, cred, resource, amount,
0, 0);
@@ -827,6 +884,9 @@ void
racct_sub_cred(struct ucred *cred, int resource, uint64_t amount)
{
+ if (!racct_enable)
+ return;
+
mtx_lock(&racct_lock);
racct_sub_cred_locked(cred, resource, amount);
mtx_unlock(&racct_lock);
@@ -840,6 +900,9 @@ racct_proc_fork(struct proc *parent, struct proc *child)
{
int i, error = 0;
+ if (!racct_enable)
+ return (0);
+
/*
* Create racct for the child process.
*/
@@ -896,6 +959,9 @@ racct_proc_fork_done(struct proc *child)
{
#ifdef RCTL
+ if (!racct_enable)
+ return;
+
PROC_LOCK(child);
mtx_lock(&racct_lock);
rctl_enforce(child, RACCT_NPROC, 0);
@@ -913,6 +979,9 @@ racct_proc_exit(struct proc *p)
struct timeval wallclock;
uint64_t pct_estimate, pct;
+ if (!racct_enable)
+ return;
+
PROC_LOCK(p);
/*
* We don't need to calculate rux, proc_reap() has already done this.
@@ -967,6 +1036,9 @@ racct_proc_ucred_changed(struct proc *p, struct ucred *oldcred,
struct loginclass *oldlc, *newlc;
struct prison *oldpr, *newpr, *pr;
+ if (!racct_enable)
+ return;
+
PROC_LOCK_ASSERT(p, MA_NOTOWNED);
newuip = newcred->cr_ruidinfo;
@@ -1004,6 +1076,8 @@ void
racct_move(struct racct *dest, struct racct *src)
{
+ ASSERT_RACCT_ENABLED();
+
mtx_lock(&racct_lock);
racct_add_racct(dest, src);
@@ -1020,6 +1094,7 @@ racct_proc_throttle(struct proc *p)
int cpuid;
#endif
+ ASSERT_RACCT_ENABLED();
PROC_LOCK_ASSERT(p, MA_OWNED);
/*
@@ -1065,6 +1140,9 @@ racct_proc_throttle(struct proc *p)
static void
racct_proc_wakeup(struct proc *p)
{
+
+ ASSERT_RACCT_ENABLED();
+
PROC_LOCK_ASSERT(p, MA_OWNED);
if (p->p_throttled) {
@@ -1079,6 +1157,8 @@ racct_decay_resource(struct racct *racct, void * res, void* dummy)
int resource;
int64_t r_old, r_new;
+ ASSERT_RACCT_ENABLED();
+
resource = *(int *)res;
r_old = racct->r_resources[resource];
@@ -1095,6 +1175,9 @@ racct_decay_resource(struct racct *racct, void * res, void* dummy)
static void
racct_decay(int resource)
{
+
+ ASSERT_RACCT_ENABLED();
+
ui_racct_foreach(racct_decay_resource, &resource, NULL);
loginclass_racct_foreach(racct_decay_resource, &resource, NULL);
prison_racct_foreach(racct_decay_resource, &resource, NULL);
@@ -1109,6 +1192,8 @@ racctd(void)
uint64_t runtime;
uint64_t pct, pct_estimate;
+ ASSERT_RACCT_ENABLED();
+
for (;;) {
racct_decay(RACCT_PCTCPU);
@@ -1188,11 +1273,22 @@ static struct kproc_desc racctd_kp = {
racctd,
NULL
};
-SYSINIT(racctd, SI_SUB_RACCTD, SI_ORDER_FIRST, kproc_start, &racctd_kp);
+
+static void
+racctd_init(void)
+{
+ if (!racct_enable)
+ return;
+
+ kproc_start(&racctd_kp);
+}
+SYSINIT(racctd, SI_SUB_RACCTD, SI_ORDER_FIRST, racctd_init, NULL);
static void
racct_init(void)
{
+ if (!racct_enable)
+ return;
racct_zone = uma_zcreate("racct", sizeof(struct racct),
NULL, NULL, NULL, NULL, UMA_ALIGN_PTR, UMA_ZONE_NOFREE);
diff --git a/sys/kern/kern_rctl.c b/sys/kern/kern_rctl.c
index 934327a..c43b83d 100644
--- a/sys/kern/kern_rctl.c
+++ b/sys/kern/kern_rctl.c
@@ -225,6 +225,7 @@ rctl_available_resource(const struct proc *p, const struct rctl_rule *rule)
int64_t available = INT64_MAX;
struct ucred *cred = p->p_ucred;
+ ASSERT_RACCT_ENABLED();
rw_assert(&rctl_lock, RA_LOCKED);
resource = rule->rr_resource;
@@ -264,6 +265,8 @@ rctl_would_exceed(const struct proc *p, const struct rctl_rule *rule,
{
int64_t available;
+ ASSERT_RACCT_ENABLED();
+
rw_assert(&rctl_lock, RA_LOCKED);
available = rctl_available_resource(p, rule);
@@ -283,6 +286,8 @@ rctl_pcpu_available(const struct proc *p) {
struct rctl_rule_link *link;
int64_t available, minavailable, limit;
+ ASSERT_RACCT_ENABLED();
+
minavailable = INT64_MAX;
limit = 0;
@@ -334,6 +339,8 @@ rctl_enforce(struct proc *p, int resource, uint64_t amount)
static int curtime = 0;
static struct timeval lasttime;
+ ASSERT_RACCT_ENABLED();
+
rw_rlock(&rctl_lock);
/*
@@ -457,6 +464,8 @@ rctl_get_limit(struct proc *p, int resource)
struct rctl_rule_link *link;
uint64_t amount = UINT64_MAX;
+ ASSERT_RACCT_ENABLED();
+
rw_rlock(&rctl_lock);
/*
@@ -487,6 +496,8 @@ rctl_get_available(struct proc *p, int resource)
minavailable = INT64_MAX;
+ ASSERT_RACCT_ENABLED();
+
rw_rlock(&rctl_lock);
/*
@@ -521,6 +532,8 @@ static int
rctl_rule_matches(const struct rctl_rule *rule, const struct rctl_rule *filter)
{
+ ASSERT_RACCT_ENABLED();
+
if (filter->rr_subject_type != RCTL_SUBJECT_TYPE_UNDEFINED) {
if (rule->rr_subject_type != filter->rr_subject_type)
return (0);
@@ -635,6 +648,7 @@ rctl_racct_add_rule(struct racct *racct, struct rctl_rule *rule)
{
struct rctl_rule_link *link;
+ ASSERT_RACCT_ENABLED();
KASSERT(rctl_rule_fully_specified(rule), ("rule not fully specified"));
rctl_rule_acquire(rule);
@@ -652,6 +666,7 @@ rctl_racct_add_rule_locked(struct racct *racct, struct rctl_rule *rule)
{
struct rctl_rule_link *link;
+ ASSERT_RACCT_ENABLED();
KASSERT(rctl_rule_fully_specified(rule), ("rule not fully specified"));
rw_assert(&rctl_lock, RA_WLOCKED);
@@ -678,6 +693,7 @@ rctl_racct_remove_rules(struct racct *racct,
int removed = 0;
struct rctl_rule_link *link, *linktmp;
+ ASSERT_RACCT_ENABLED();
rw_assert(&rctl_lock, RA_WLOCKED);
LIST_FOREACH_SAFE(link, &racct->r_rule_links, rrl_next, linktmp) {
@@ -696,6 +712,8 @@ static void
rctl_rule_acquire_subject(struct rctl_rule *rule)
{
+ ASSERT_RACCT_ENABLED();
+
switch (rule->rr_subject_type) {
case RCTL_SUBJECT_TYPE_UNDEFINED:
case RCTL_SUBJECT_TYPE_PROCESS:
@@ -722,6 +740,8 @@ static void
rctl_rule_release_subject(struct rctl_rule *rule)
{
+ ASSERT_RACCT_ENABLED();
+
switch (rule->rr_subject_type) {
case RCTL_SUBJECT_TYPE_UNDEFINED:
case RCTL_SUBJECT_TYPE_PROCESS:
@@ -749,6 +769,8 @@ rctl_rule_alloc(int flags)
{
struct rctl_rule *rule;
+ ASSERT_RACCT_ENABLED();
+
rule = uma_zalloc(rctl_rule_zone, flags);
if (rule == NULL)
return (NULL);
@@ -771,6 +793,8 @@ rctl_rule_duplicate(const struct rctl_rule *rule, int flags)
{
struct rctl_rule *copy;
+ ASSERT_RACCT_ENABLED();
+
copy = uma_zalloc(rctl_rule_zone, flags);
if (copy == NULL)
return (NULL);
@@ -793,6 +817,7 @@ void
rctl_rule_acquire(struct rctl_rule *rule)
{
+ ASSERT_RACCT_ENABLED();
KASSERT(rule->rr_refcount > 0, ("rule->rr_refcount <= 0"));
refcount_acquire(&rule->rr_refcount);
@@ -805,6 +830,7 @@ rctl_rule_free(void *context, int pending)
rule = (struct rctl_rule *)context;
+ ASSERT_RACCT_ENABLED();
KASSERT(rule->rr_refcount == 0, ("rule->rr_refcount != 0"));
/*
@@ -819,6 +845,7 @@ void
rctl_rule_release(struct rctl_rule *rule)
{
+ ASSERT_RACCT_ENABLED();
KASSERT(rule->rr_refcount > 0, ("rule->rr_refcount <= 0"));
if (refcount_release(&rule->rr_refcount)) {
@@ -838,6 +865,8 @@ static int
rctl_rule_fully_specified(const struct rctl_rule *rule)
{
+ ASSERT_RACCT_ENABLED();
+
switch (rule->rr_subject_type) {
case RCTL_SUBJECT_TYPE_UNDEFINED:
return (0);
@@ -882,6 +911,8 @@ rctl_string_to_rule(char *rulestr, struct rctl_rule **rulep)
struct rctl_rule *rule;
id_t id;
+ ASSERT_RACCT_ENABLED();
+
rule = rctl_rule_alloc(M_WAITOK);
subjectstr = strsep(&rulestr, ":");
@@ -1008,6 +1039,7 @@ rctl_rule_add(struct rctl_rule *rule)
struct rctl_rule *rule2;
int match;
+ ASSERT_RACCT_ENABLED();
KASSERT(rctl_rule_fully_specified(rule), ("rule not fully specified"));
/*
@@ -1118,6 +1150,8 @@ rctl_rule_remove_callback(struct racct *racct, void *arg2, void *arg3)
struct rctl_rule *filter = (struct rctl_rule *)arg2;
int found = 0;
+ ASSERT_RACCT_ENABLED();
+
rw_wlock(&rctl_lock);
found += rctl_racct_remove_rules(racct, filter);
rw_wunlock(&rctl_lock);
@@ -1134,6 +1168,8 @@ rctl_rule_remove(struct rctl_rule *filter)
int found = 0;
struct proc *p;
+ ASSERT_RACCT_ENABLED();
+
if (filter->rr_subject_type == RCTL_SUBJECT_TYPE_PROCESS &&
filter->rr_subject.rs_proc != NULL) {
p = filter->rr_subject.rs_proc;
@@ -1172,6 +1208,8 @@ rctl_rule_to_sbuf(struct sbuf *sb, const struct rctl_rule *rule)
{
int64_t amount;
+ ASSERT_RACCT_ENABLED();
+
sbuf_printf(sb, "%s:", rctl_subject_type_name(rule->rr_subject_type));
switch (rule->rr_subject_type) {
@@ -1231,6 +1269,8 @@ rctl_read_inbuf(char **inputstr, const char *inbufp, size_t inbuflen)
int error;
char *str;
+ ASSERT_RACCT_ENABLED();
+
if (inbuflen <= 0)
return (EINVAL);
if (inbuflen > RCTL_MAX_INBUFLEN)
@@ -1256,6 +1296,8 @@ rctl_write_outbuf(struct sbuf *outputsbuf, char *outbufp, size_t outbuflen)
{
int error;
+ ASSERT_RACCT_ENABLED();
+
if (outputsbuf == NULL)
return (0);
@@ -1277,6 +1319,8 @@ rctl_racct_to_sbuf(struct racct *racct, int sloppy)
int64_t amount;
struct sbuf *sb;
+ ASSERT_RACCT_ENABLED();
+
sb = sbuf_new_auto();
for (i = 0; i <= RACCT_MAX; i++) {
if (sloppy == 0 && RACCT_IS_SLOPPY(i))
@@ -1302,6 +1346,9 @@ sys_rctl_get_racct(struct thread *td, struct rctl_get_racct_args *uap)
struct loginclass *lc;
struct prison_racct *prr;
+ if (!racct_enable)
+ return (ENOSYS);
+
error = priv_check(td, PRIV_RCTL_GET_RACCT);
if (error != 0)
return (error);
@@ -1372,6 +1419,8 @@ rctl_get_rules_callback(struct racct *racct, void *arg2, void *arg3)
struct rctl_rule_link *link;
struct sbuf *sb = (struct sbuf *)arg3;
+ ASSERT_RACCT_ENABLED();
+
rw_rlock(&rctl_lock);
LIST_FOREACH(link, &racct->r_rule_links, rrl_next) {
if (!rctl_rule_matches(link->rrl_rule, filter))
@@ -1393,6 +1442,9 @@ sys_rctl_get_rules(struct thread *td, struct rctl_get_rules_args *uap)
struct rctl_rule_link *link;
struct proc *p;
+ if (!racct_enable)
+ return (ENOSYS);
+
error = priv_check(td, PRIV_RCTL_GET_RULES);
if (error != 0)
return (error);
@@ -1467,6 +1519,9 @@ sys_rctl_get_limits(struct thread *td, struct rctl_get_limits_args *uap)
struct rctl_rule *filter;
struct rctl_rule_link *link;
+ if (!racct_enable)
+ return (ENOSYS);
+
error = priv_check(td, PRIV_RCTL_GET_LIMITS);
if (error != 0)
return (error);
@@ -1538,6 +1593,9 @@ sys_rctl_add_rule(struct thread *td, struct rctl_add_rule_args *uap)
struct rctl_rule *rule;
char *inputstr;
+ if (!racct_enable)
+ return (ENOSYS);
+
error = priv_check(td, PRIV_RCTL_ADD_RULE);
if (error != 0)
return (error);
@@ -1580,6 +1638,9 @@ sys_rctl_remove_rule(struct thread *td, struct rctl_remove_rule_args *uap)
struct rctl_rule *filter;
char *inputstr;
+ if (!racct_enable)
+ return (ENOSYS);
+
error = priv_check(td, PRIV_RCTL_REMOVE_RULE);
if (error != 0)
return (error);
@@ -1616,6 +1677,8 @@ rctl_proc_ucred_changed(struct proc *p, struct ucred *newcred)
struct prison_racct *newprr;
LIST_HEAD(, rctl_rule_link) newrules;
+ ASSERT_RACCT_ENABLED();
+
newuip = newcred->cr_ruidinfo;
newlc = newcred->cr_loginclass;
newprr = newcred->cr_prison->pr_prison_racct;
@@ -1756,6 +1819,7 @@ rctl_proc_fork(struct proc *parent, struct proc *child)
LIST_INIT(&child->p_racct->r_rule_links);
+ ASSERT_RACCT_ENABLED();
KASSERT(parent->p_racct != NULL, ("process without racct; p = %p", parent));
rw_wlock(&rctl_lock);
@@ -1809,6 +1873,8 @@ rctl_racct_release(struct racct *racct)
{
struct rctl_rule_link *link;
+ ASSERT_RACCT_ENABLED();
+
rw_wlock(&rctl_lock);
while (!LIST_EMPTY(&racct->r_rule_links)) {
link = LIST_FIRST(&racct->r_rule_links);
@@ -1823,6 +1889,9 @@ static void
rctl_init(void)
{
+ if (!racct_enable)
+ return;
+
rctl_rule_link_zone = uma_zcreate("rctl_rule_link",
sizeof(struct rctl_rule_link), NULL, NULL, NULL, NULL,
UMA_ALIGN_PTR, UMA_ZONE_NOFREE);
diff --git a/sys/kern/kern_resource.c b/sys/kern/kern_resource.c
index 56b598f..dac49cd 100644
--- a/sys/kern/kern_resource.c
+++ b/sys/kern/kern_resource.c
@@ -745,7 +745,12 @@ kern_proc_setrlimit(struct thread *td, struct proc *p, u_int which,
if (newlim != NULL)
lim_free(oldlim);
- if (which == RLIMIT_STACK) {
+ if (which == RLIMIT_STACK &&
+ /*
+ * Skip calls from exec_new_vmspace(), done when stack is
+ * not mapped yet.
+ */
+ (td != curthread || (p->p_flag & P_INEXEC) == 0)) {
/*
* Stack is allocated to the max at exec time with only
* "rlim_cur" bytes accessible. If stack limit is going
diff --git a/sys/kern/kern_shutdown.c b/sys/kern/kern_shutdown.c
index e547c5f..5125480 100644
--- a/sys/kern/kern_shutdown.c
+++ b/sys/kern/kern_shutdown.c
@@ -154,7 +154,6 @@ static void poweroff_wait(void *, int);
static void shutdown_halt(void *junk, int howto);
static void shutdown_panic(void *junk, int howto);
static void shutdown_reset(void *junk, int howto);
-static void vpanic(const char *fmt, va_list ap) __dead2;
/* register various local shutdown events */
static void
@@ -676,7 +675,7 @@ panic(const char *fmt, ...)
vpanic(fmt, ap);
}
-static void
+void
vpanic(const char *fmt, va_list ap)
{
#ifdef SMP
@@ -701,10 +700,8 @@ vpanic(const char *fmt, va_list ap)
}
/*
- * We set stop_scheduler here and not in the block above,
- * because we want to ensure that if panic has been called and
- * stop_scheduler_on_panic is true, then stop_scheduler will
- * always be set. Even if panic has been entered from kdb.
+ * Ensure that the scheduler is stopped while panicking, even if panic
+ * has been entered from kdb.
*/
td->td_stopsched = 1;
#endif
diff --git a/sys/kern/kern_synch.c b/sys/kern/kern_synch.c
index 9501ba2..a238a09 100644
--- a/sys/kern/kern_synch.c
+++ b/sys/kern/kern_synch.c
@@ -66,12 +66,6 @@ __FBSDID("$FreeBSD$");
#include <machine/cpu.h>
-#ifdef XEN
-#include <vm/vm.h>
-#include <vm/vm_param.h>
-#include <vm/pmap.h>
-#endif
-
#define KTDSTATE(td) \
(((td)->td_inhibitors & TDI_SLEEPING) != 0 ? "sleep" : \
((td)->td_inhibitors & TDI_SUSPENDED) != 0 ? "suspended" : \
@@ -108,17 +102,6 @@ static void loadav(void *arg);
SDT_PROVIDER_DECLARE(sched);
SDT_PROBE_DEFINE(sched, , , preempt);
-/*
- * These probes reference Solaris features that are not implemented in FreeBSD.
- * Create the probes anyway for compatibility with existing D scripts; they'll
- * just never fire.
- */
-SDT_PROBE_DEFINE(sched, , , cpucaps__sleep);
-SDT_PROBE_DEFINE(sched, , , cpucaps__wakeup);
-SDT_PROBE_DEFINE(sched, , , schedctl__nopreempt);
-SDT_PROBE_DEFINE(sched, , , schedctl__preempt);
-SDT_PROBE_DEFINE(sched, , , schedctl__yield);
-
static void
sleepinit(void *unused)
{
@@ -486,9 +469,6 @@ mi_switch(int flags, struct thread *newtd)
"lockname:\"%s\"", td->td_lockname);
#endif
SDT_PROBE0(sched, , , preempt);
-#ifdef XEN
- PT_UPDATES_FLUSH();
-#endif
sched_switch(td, newtd, flags);
KTR_STATE1(KTR_SCHED, "thread", sched_tdname(td), "running",
"prio:%d", td->td_priority);
diff --git a/sys/kern/kern_thr.c b/sys/kern/kern_thr.c
index 280bc0b..6911bb97 100644
--- a/sys/kern/kern_thr.c
+++ b/sys/kern/kern_thr.c
@@ -187,11 +187,13 @@ create_thread(struct thread *td, mcontext_t *ctx,
}
#ifdef RACCT
- PROC_LOCK(td->td_proc);
- error = racct_add(p, RACCT_NTHR, 1);
- PROC_UNLOCK(td->td_proc);
- if (error != 0)
- return (EPROCLIM);
+ if (racct_enable) {
+ PROC_LOCK(p);
+ error = racct_add(p, RACCT_NTHR, 1);
+ PROC_UNLOCK(p);
+ if (error != 0)
+ return (EPROCLIM);
+ }
#endif
/* Initialize our td */
@@ -250,9 +252,9 @@ create_thread(struct thread *td, mcontext_t *ctx,
}
}
- PROC_LOCK(td->td_proc);
- td->td_proc->p_flag |= P_HADTHREADS;
- thread_link(newtd, p);
+ PROC_LOCK(p);
+ p->p_flag |= P_HADTHREADS;
+ thread_link(newtd, p);
bcopy(p->p_comm, newtd->td_name, sizeof(newtd->td_name));
thread_lock(td);
/* let the scheduler know about these things. */
@@ -280,9 +282,11 @@ create_thread(struct thread *td, mcontext_t *ctx,
fail:
#ifdef RACCT
- PROC_LOCK(p);
- racct_sub(p, RACCT_NTHR, 1);
- PROC_UNLOCK(p);
+ if (racct_enable) {
+ PROC_LOCK(p);
+ racct_sub(p, RACCT_NTHR, 1);
+ PROC_UNLOCK(p);
+ }
#endif
return (error);
}
diff --git a/sys/kern/kern_thread.c b/sys/kern/kern_thread.c
index dd11e5c..0a93dbd 100644
--- a/sys/kern/kern_thread.c
+++ b/sys/kern/kern_thread.c
@@ -209,6 +209,7 @@ thread_init(void *mem, int size, int flags)
td->td_sched = (struct td_sched *)&td[1];
umtx_thread_init(td);
td->td_kstack = 0;
+ td->td_sel = NULL;
return (0);
}
diff --git a/sys/kern/kern_timeout.c b/sys/kern/kern_timeout.c
index 45892dc..01da596 100644
--- a/sys/kern/kern_timeout.c
+++ b/sys/kern/kern_timeout.c
@@ -591,6 +591,8 @@ callout_cc_add(struct callout *c, struct callout_cpu *cc,
c->c_iflags |= CALLOUT_PENDING;
c->c_iflags &= ~CALLOUT_PROCESSED;
c->c_flags |= CALLOUT_ACTIVE;
+ if (flags & C_DIRECT_EXEC)
+ c->c_iflags |= CALLOUT_DIRECT;
c->c_func = func;
c->c_time = sbt;
c->c_precision = precision;
diff --git a/sys/kern/link_elf.c b/sys/kern/link_elf.c
index 65c8276..26be035 100644
--- a/sys/kern/link_elf.c
+++ b/sys/kern/link_elf.c
@@ -66,7 +66,7 @@ __FBSDID("$FreeBSD$");
#include <sys/link_elf.h>
#ifdef DDB_CTF
-#include <net/zlib.h>
+#include <sys/zlib.h>
#endif
#include "linker_if.h"
diff --git a/sys/kern/link_elf_obj.c b/sys/kern/link_elf_obj.c
index 5c107fe..021381d 100644
--- a/sys/kern/link_elf_obj.c
+++ b/sys/kern/link_elf_obj.c
@@ -60,7 +60,7 @@ __FBSDID("$FreeBSD$");
#include <sys/link_elf.h>
#ifdef DDB_CTF
-#include <net/zlib.h>
+#include <sys/zlib.h>
#endif
#include "linker_if.h"
diff --git a/sys/kern/sched_4bsd.c b/sys/kern/sched_4bsd.c
index 3e39d55..59bd387 100644
--- a/sys/kern/sched_4bsd.c
+++ b/sys/kern/sched_4bsd.c
@@ -1585,7 +1585,7 @@ sched_pctcpu(struct thread *td)
return (ts->ts_pctcpu);
}
-#ifdef RACCT
+#ifdef RACCT
/*
* Calculates the contribution to the thread cpu usage for the latest
* (unfinished) second.
diff --git a/sys/kern/subr_bus.c b/sys/kern/subr_bus.c
index fdb92e3..0dde5a5 100644
--- a/sys/kern/subr_bus.c
+++ b/sys/kern/subr_bus.c
@@ -2113,6 +2113,16 @@ device_probe_child(device_t dev, device_t child)
}
/*
+ * Probes that return BUS_PROBE_NOWILDCARD or lower
+ * only match on devices whose driver was explicitly
+ * specified.
+ */
+ if (result <= BUS_PROBE_NOWILDCARD &&
+ !(child->flags & DF_FIXEDCLASS)) {
+ result = ENXIO;
+ }
+
+ /*
* The driver returned an error so it
* certainly doesn't match.
*/
@@ -2127,14 +2137,6 @@ device_probe_child(device_t dev, device_t child)
* of pri for the first match.
*/
if (best == NULL || result > pri) {
- /*
- * Probes that return BUS_PROBE_NOWILDCARD
- * or lower only match on devices whose
- * driver was explicitly specified.
- */
- if (result <= BUS_PROBE_NOWILDCARD &&
- !(child->flags & DF_FIXEDCLASS))
- continue;
best = dl;
pri = result;
continue;
diff --git a/sys/kern/subr_dnvlist.c b/sys/kern/subr_dnvlist.c
index fe17684..9058520 100644
--- a/sys/kern/subr_dnvlist.c
+++ b/sys/kern/subr_dnvlist.c
@@ -89,89 +89,6 @@ dnvlist_get_binary(const nvlist_t *nvl, const char *name, size_t *sizep,
return (value);
}
-#ifndef _KERNEL
-#define DNVLIST_GETF(ftype, type) \
-ftype \
-dnvlist_getf_##type(const nvlist_t *nvl, ftype defval, \
- const char *namefmt, ...) \
-{ \
- va_list nameap; \
- ftype value; \
- \
- va_start(nameap, namefmt); \
- value = dnvlist_getv_##type(nvl, defval, namefmt, nameap); \
- va_end(nameap); \
- \
- return (value); \
-}
-
-DNVLIST_GETF(bool, bool)
-DNVLIST_GETF(uint64_t, number)
-DNVLIST_GETF(const char *, string)
-DNVLIST_GETF(const nvlist_t *, nvlist)
-DNVLIST_GETF(int, descriptor)
-
-#undef DNVLIST_GETF
-
-const void *
-dnvlist_getf_binary(const nvlist_t *nvl, size_t *sizep, const void *defval,
- size_t defsize, const char *namefmt, ...)
-{
- va_list nameap;
- const void *value;
-
- va_start(nameap, namefmt);
- value = dnvlist_getv_binary(nvl, sizep, defval, defsize, namefmt,
- nameap);
- va_end(nameap);
-
- return (value);
-}
-
-#define DNVLIST_GETV(ftype, type) \
-ftype \
-dnvlist_getv_##type(const nvlist_t *nvl, ftype defval, \
- const char *namefmt, va_list nameap) \
-{ \
- char *name; \
- ftype value; \
- \
- vasprintf(&name, namefmt, nameap); \
- if (name == NULL) \
- return (defval); \
- value = dnvlist_get_##type(nvl, name, defval); \
- free(name); \
- return (value); \
-}
-
-DNVLIST_GETV(bool, bool)
-DNVLIST_GETV(uint64_t, number)
-DNVLIST_GETV(const char *, string)
-DNVLIST_GETV(const nvlist_t *, nvlist)
-DNVLIST_GETV(int, descriptor)
-
-#undef DNVLIST_GETV
-
-const void *
-dnvlist_getv_binary(const nvlist_t *nvl, size_t *sizep, const void *defval,
- size_t defsize, const char *namefmt, va_list nameap)
-{
- char *name;
- const void *value;
-
- nv_vasprintf(&name, namefmt, nameap);
- if (name != NULL) {
- value = dnvlist_get_binary(nvl, name, sizep, defval, defsize);
- nv_free(name);
- } else {
- if (sizep != NULL)
- *sizep = defsize;
- value = defval;
- }
- return (value);
-}
-#endif
-
#define DNVLIST_TAKE(ftype, type) \
ftype \
dnvlist_take_##type(nvlist_t *nvl, const char *name, ftype defval) \
@@ -209,86 +126,3 @@ dnvlist_take_binary(nvlist_t *nvl, const char *name, size_t *sizep,
return (value);
}
-#ifndef _KERNEL
-#define DNVLIST_TAKEF(ftype, type) \
-ftype \
-dnvlist_takef_##type(nvlist_t *nvl, ftype defval, \
- const char *namefmt, ...) \
-{ \
- va_list nameap; \
- ftype value; \
- \
- va_start(nameap, namefmt); \
- value = dnvlist_takev_##type(nvl, defval, namefmt, nameap); \
- va_end(nameap); \
- \
- return (value); \
-}
-
-DNVLIST_TAKEF(bool, bool)
-DNVLIST_TAKEF(uint64_t, number)
-DNVLIST_TAKEF(char *, string)
-DNVLIST_TAKEF(nvlist_t *, nvlist)
-DNVLIST_TAKEF(int, descriptor)
-
-#undef DNVLIST_TAKEF
-
-void *
-dnvlist_takef_binary(nvlist_t *nvl, size_t *sizep, void *defval,
- size_t defsize, const char *namefmt, ...)
-{
- va_list nameap;
- void *value;
-
- va_start(nameap, namefmt);
- value = dnvlist_takev_binary(nvl, sizep, defval, defsize, namefmt,
- nameap);
- va_end(nameap);
-
- return (value);
-}
-
-#define DNVLIST_TAKEV(ftype, type) \
-ftype \
-dnvlist_takev_##type(nvlist_t *nvl, ftype defval, const char *namefmt, \
- va_list nameap) \
-{ \
- char *name; \
- ftype value; \
- \
- vasprintf(&name, namefmt, nameap); \
- if (name == NULL) \
- return (defval); \
- value = dnvlist_take_##type(nvl, name, defval); \
- free(name); \
- return (value); \
-}
-
-DNVLIST_TAKEV(bool, bool)
-DNVLIST_TAKEV(uint64_t, number)
-DNVLIST_TAKEV(char *, string)
-DNVLIST_TAKEV(nvlist_t *, nvlist)
-DNVLIST_TAKEV(int, descriptor)
-
-#undef DNVLIST_TAKEV
-
-void *
-dnvlist_takev_binary(nvlist_t *nvl, size_t *sizep, void *defval,
- size_t defsize, const char *namefmt, va_list nameap)
-{
- char *name;
- void *value;
-
- nv_vasprintf(&name, namefmt, nameap);
- if (name != NULL) {
- value = dnvlist_take_binary(nvl, name, sizep, defval, defsize);
- nv_free(name);
- } else {
- if (sizep != NULL)
- *sizep = defsize;
- value = defval;
- }
-
- return (value);
-}
-#endif
diff --git a/sys/kern/subr_nvlist.c b/sys/kern/subr_nvlist.c
index f352c62..40e49ff 100644
--- a/sys/kern/subr_nvlist.c
+++ b/sys/kern/subr_nvlist.c
@@ -88,7 +88,7 @@ __FBSDID("$FreeBSD$");
#endif
#define NV_FLAG_PRIVATE_MASK (NV_FLAG_BIG_ENDIAN)
-#define NV_FLAG_PUBLIC_MASK (NV_FLAG_IGNORE_CASE)
+#define NV_FLAG_PUBLIC_MASK (NV_FLAG_IGNORE_CASE | NV_FLAG_NO_UNIQUE)
#define NV_FLAG_ALL_MASK (NV_FLAG_PRIVATE_MASK | NV_FLAG_PUBLIC_MASK)
#define NVLIST_MAGIC 0x6e766c /* "nvl" */
@@ -129,6 +129,8 @@ nvlist_create(int flags)
PJDLOG_ASSERT((flags & ~(NV_FLAG_PUBLIC_MASK)) == 0);
nvl = nv_malloc(sizeof(*nvl));
+ if (nvl == NULL)
+ return (NULL);
nvl->nvl_error = 0;
nvl->nvl_flags = flags;
nvl->nvl_parent = NULL;
@@ -142,12 +144,11 @@ void
nvlist_destroy(nvlist_t *nvl)
{
nvpair_t *nvp;
- int serrno;
if (nvl == NULL)
return;
- SAVE_ERRNO(serrno);
+ ERRNO_SAVE();
NVLIST_ASSERT(nvl);
@@ -158,7 +159,7 @@ nvlist_destroy(nvlist_t *nvl)
nvl->nvl_magic = 0;
nv_free(nvl);
- RESTORE_ERRNO(serrno);
+ ERRNO_RESTORE();
}
void
@@ -231,6 +232,17 @@ nvlist_empty(const nvlist_t *nvl)
return (nvlist_first_nvpair(nvl) == NULL);
}
+int
+nvlist_flags(const nvlist_t *nvl)
+{
+
+ NVLIST_ASSERT(nvl);
+ PJDLOG_ASSERT(nvl->nvl_error == 0);
+ PJDLOG_ASSERT((nvl->nvl_flags & ~(NV_FLAG_PUBLIC_MASK)) == 0);
+
+ return (nvl->nvl_flags);
+}
+
static void
nvlist_report_missing(int type, const char *name)
{
@@ -264,7 +276,7 @@ nvlist_find(const nvlist_t *nvl, int type, const char *name)
}
if (nvp == NULL)
- RESTORE_ERRNO(ENOENT);
+ ERRNO_SET(ENOENT);
return (nvp);
}
@@ -281,37 +293,6 @@ nvlist_exists_type(const nvlist_t *nvl, const char *name, int type)
return (nvlist_find(nvl, type, name) != NULL);
}
-#ifndef _KERNEL
-bool
-nvlist_existsf_type(const nvlist_t *nvl, int type, const char *namefmt, ...)
-{
- va_list nameap;
- bool ret;
-
- va_start(nameap, namefmt);
- ret = nvlist_existsv_type(nvl, type, namefmt, nameap);
- va_end(nameap);
-
- return (ret);
-}
-
-bool
-nvlist_existsv_type(const nvlist_t *nvl, int type, const char *namefmt,
- va_list nameap)
-{
- char *name;
- bool exists;
-
- nv_vasprintf(&name, namefmt, nameap);
- if (name == NULL)
- return (false);
-
- exists = nvlist_exists_type(nvl, name, type);
- nv_free(name);
- return (exists);
-}
-#endif
-
void
nvlist_free_type(nvlist_t *nvl, const char *name, int type)
{
@@ -329,30 +310,6 @@ nvlist_free_type(nvlist_t *nvl, const char *name, int type)
nvlist_report_missing(type, name);
}
-#ifndef _KERNEL
-void
-nvlist_freef_type(nvlist_t *nvl, int type, const char *namefmt, ...)
-{
- va_list nameap;
-
- va_start(nameap, namefmt);
- nvlist_freev_type(nvl, type, namefmt, nameap);
- va_end(nameap);
-}
-
-void
-nvlist_freev_type(nvlist_t *nvl, int type, const char *namefmt, va_list nameap)
-{
- char *name;
-
- nv_vasprintf(&name, namefmt, nameap);
- if (name == NULL)
- nvlist_report_missing(type, "<unknown>");
- nvlist_free_type(nvl, name, type);
- nv_free(name);
-}
-#endif
-
nvlist_t *
nvlist_clone(const nvlist_t *nvl)
{
@@ -362,7 +319,7 @@ nvlist_clone(const nvlist_t *nvl)
NVLIST_ASSERT(nvl);
if (nvl->nvl_error != 0) {
- RESTORE_ERRNO(nvl->nvl_error);
+ ERRNO_SET(nvl->nvl_error);
return (NULL);
}
@@ -533,27 +490,30 @@ out:
#ifndef _KERNEL
static int *
-nvlist_xdescriptors(const nvlist_t *nvl, int *descs, int level)
+nvlist_xdescriptors(const nvlist_t *nvl, int *descs)
{
- const nvpair_t *nvp;
+ nvpair_t *nvp;
+ const char *name;
+ int type;
NVLIST_ASSERT(nvl);
PJDLOG_ASSERT(nvl->nvl_error == 0);
- PJDLOG_ASSERT(level < 3);
- for (nvp = nvlist_first_nvpair(nvl); nvp != NULL;
- nvp = nvlist_next_nvpair(nvl, nvp)) {
- switch (nvpair_type(nvp)) {
- case NV_TYPE_DESCRIPTOR:
- *descs = nvpair_get_descriptor(nvp);
- descs++;
- break;
- case NV_TYPE_NVLIST:
- descs = nvlist_xdescriptors(nvpair_get_nvlist(nvp),
- descs, level + 1);
- break;
+ nvp = NULL;
+ do {
+ while ((name = nvlist_next(nvl, &type, (void**)&nvp)) != NULL) {
+ switch (type) {
+ case NV_TYPE_DESCRIPTOR:
+ *descs = nvpair_get_descriptor(nvp);
+ descs++;
+ break;
+ case NV_TYPE_NVLIST:
+ nvl = nvpair_get_nvlist(nvp);
+ nvp = NULL;
+ break;
+ }
}
- }
+ } while ((nvl = nvlist_get_parent(nvl, (void**)&nvp)) != NULL);
return (descs);
}
@@ -571,7 +531,7 @@ nvlist_descriptors(const nvlist_t *nvl, size_t *nitemsp)
if (fds == NULL)
return (NULL);
if (nitems > 0)
- nvlist_xdescriptors(nvl, fds, 0);
+ nvlist_xdescriptors(nvl, fds);
fds[nitems] = -1;
if (nitemsp != NULL)
*nitemsp = nitems;
@@ -579,30 +539,33 @@ nvlist_descriptors(const nvlist_t *nvl, size_t *nitemsp)
}
#endif
-static size_t
-nvlist_xndescriptors(const nvlist_t *nvl, int level)
+size_t
+nvlist_ndescriptors(const nvlist_t *nvl)
{
#ifndef _KERNEL
- const nvpair_t *nvp;
+ nvpair_t *nvp;
+ const char *name;
size_t ndescs;
+ int type;
NVLIST_ASSERT(nvl);
PJDLOG_ASSERT(nvl->nvl_error == 0);
- PJDLOG_ASSERT(level < 3);
ndescs = 0;
- for (nvp = nvlist_first_nvpair(nvl); nvp != NULL;
- nvp = nvlist_next_nvpair(nvl, nvp)) {
- switch (nvpair_type(nvp)) {
- case NV_TYPE_DESCRIPTOR:
- ndescs++;
- break;
- case NV_TYPE_NVLIST:
- ndescs += nvlist_xndescriptors(nvpair_get_nvlist(nvp),
- level + 1);
- break;
+ nvp = NULL;
+ do {
+ while ((name = nvlist_next(nvl, &type, (void**)&nvp)) != NULL) {
+ switch (type) {
+ case NV_TYPE_DESCRIPTOR:
+ ndescs++;
+ break;
+ case NV_TYPE_NVLIST:
+ nvl = nvpair_get_nvlist(nvp);
+ nvp = NULL;
+ break;
+ }
}
- }
+ } while ((nvl = nvlist_get_parent(nvl, (void**)&nvp)) != NULL);
return (ndescs);
#else
@@ -610,13 +573,6 @@ nvlist_xndescriptors(const nvlist_t *nvl, int level)
#endif
}
-size_t
-nvlist_ndescriptors(const nvlist_t *nvl)
-{
-
- return (nvlist_xndescriptors(nvl, 0));
-}
-
static unsigned char *
nvlist_pack_header(const nvlist_t *nvl, unsigned char *ptr, size_t *leftp)
{
@@ -640,7 +596,7 @@ nvlist_pack_header(const nvlist_t *nvl, unsigned char *ptr, size_t *leftp)
return (ptr);
}
-void *
+static void *
nvlist_xpack(const nvlist_t *nvl, int64_t *fdidxp, size_t *sizep)
{
unsigned char *buf, *ptr;
@@ -652,7 +608,7 @@ nvlist_xpack(const nvlist_t *nvl, int64_t *fdidxp, size_t *sizep)
NVLIST_ASSERT(nvl);
if (nvl->nvl_error != 0) {
- RESTORE_ERRNO(nvl->nvl_error);
+ ERRNO_SET(nvl->nvl_error);
return (NULL);
}
@@ -742,12 +698,12 @@ nvlist_pack(const nvlist_t *nvl, size_t *sizep)
NVLIST_ASSERT(nvl);
if (nvl->nvl_error != 0) {
- RESTORE_ERRNO(nvl->nvl_error);
+ ERRNO_SET(nvl->nvl_error);
return (NULL);
}
if (nvlist_ndescriptors(nvl) > 0) {
- RESTORE_ERRNO(EOPNOTSUPP);
+ ERRNO_SET(EOPNOTSUPP);
return (NULL);
}
@@ -759,11 +715,11 @@ nvlist_check_header(struct nvlist_header *nvlhdrp)
{
if (nvlhdrp->nvlh_magic != NVLIST_HEADER_MAGIC) {
- RESTORE_ERRNO(EINVAL);
+ ERRNO_SET(EINVAL);
return (false);
}
if ((nvlhdrp->nvlh_flags & ~NV_FLAG_ALL_MASK) != 0) {
- RESTORE_ERRNO(EINVAL);
+ ERRNO_SET(EINVAL);
return (false);
}
#if BYTE_ORDER == BIG_ENDIAN
@@ -815,12 +771,13 @@ nvlist_unpack_header(nvlist_t *nvl, const unsigned char *ptr, size_t nfds,
return (ptr);
failed:
- RESTORE_ERRNO(EINVAL);
+ ERRNO_SET(EINVAL);
return (NULL);
}
-nvlist_t *
-nvlist_xunpack(const void *buf, size_t size, const int *fds, size_t nfds)
+static nvlist_t *
+nvlist_xunpack(const void *buf, size_t size, const int *fds, size_t nfds,
+ int flags)
{
const unsigned char *ptr;
nvlist_t *nvl, *retnvl, *tmpnvl;
@@ -828,6 +785,8 @@ nvlist_xunpack(const void *buf, size_t size, const int *fds, size_t nfds)
size_t left;
bool isbe;
+ PJDLOG_ASSERT((flags & ~(NV_FLAG_PUBLIC_MASK)) == 0);
+
left = size;
ptr = buf;
@@ -839,6 +798,10 @@ nvlist_xunpack(const void *buf, size_t size, const int *fds, size_t nfds)
ptr = nvlist_unpack_header(nvl, ptr, nfds, &isbe, &left);
if (ptr == NULL)
goto failed;
+ if (nvl->nvl_flags != flags) {
+ ERRNO_SET(EILSEQ);
+ goto failed;
+ }
while (left > 0) {
ptr = nvpair_unpack(isbe, ptr, &left, &nvp);
@@ -895,10 +858,10 @@ failed:
}
nvlist_t *
-nvlist_unpack(const void *buf, size_t size)
+nvlist_unpack(const void *buf, size_t size, int flags)
{
- return (nvlist_xunpack(buf, size, NULL, 0));
+ return (nvlist_xunpack(buf, size, NULL, 0, flags));
}
#ifndef _KERNEL
@@ -909,10 +872,10 @@ nvlist_send(int sock, const nvlist_t *nvl)
int *fds;
void *data;
int64_t fdidx;
- int serrno, ret;
+ int ret;
if (nvlist_error(nvl) != 0) {
- errno = nvlist_error(nvl);
+ ERRNO_SET(nvlist_error(nvl));
return (-1);
}
@@ -938,21 +901,21 @@ nvlist_send(int sock, const nvlist_t *nvl)
ret = 0;
out:
- serrno = errno;
+ ERRNO_SAVE();
free(fds);
free(data);
- errno = serrno;
+ ERRNO_RESTORE();
return (ret);
}
nvlist_t *
-nvlist_recv(int sock)
+nvlist_recv(int sock, int flags)
{
struct nvlist_header nvlhdr;
nvlist_t *nvl, *ret;
unsigned char *buf;
size_t nfds, size, i;
- int serrno, *fds;
+ int *fds;
if (buf_recv(sock, &nvlhdr, sizeof(nvlhdr)) == -1)
return (NULL);
@@ -963,7 +926,7 @@ nvlist_recv(int sock)
nfds = (size_t)nvlhdr.nvlh_descriptors;
size = sizeof(nvlhdr) + (size_t)nvlhdr.nvlh_size;
- buf = malloc(size);
+ buf = nv_malloc(size);
if (buf == NULL)
return (NULL);
@@ -976,32 +939,34 @@ nvlist_recv(int sock)
goto out;
if (nfds > 0) {
- fds = malloc(nfds * sizeof(fds[0]));
+ fds = nv_malloc(nfds * sizeof(fds[0]));
if (fds == NULL)
goto out;
if (fd_recv(sock, fds, nfds) == -1)
goto out;
}
- nvl = nvlist_xunpack(buf, size, fds, nfds);
+ nvl = nvlist_xunpack(buf, size, fds, nfds, flags);
if (nvl == NULL) {
+ ERRNO_SAVE();
for (i = 0; i < nfds; i++)
close(fds[i]);
+ ERRNO_RESTORE();
goto out;
}
ret = nvl;
out:
- serrno = errno;
+ ERRNO_SAVE();
free(buf);
free(fds);
- errno = serrno;
+ ERRNO_RESTORE();
return (ret);
}
nvlist_t *
-nvlist_xfer(int sock, nvlist_t *nvl)
+nvlist_xfer(int sock, nvlist_t *nvl, int flags)
{
if (nvlist_send(sock, nvl) < 0) {
@@ -1009,7 +974,7 @@ nvlist_xfer(int sock, nvlist_t *nvl)
return (NULL);
}
nvlist_destroy(nvl);
- return (nvlist_recv(sock));
+ return (nvlist_recv(sock, flags));
}
#endif
@@ -1100,86 +1065,6 @@ NVLIST_EXISTS(binary, BINARY)
#undef NVLIST_EXISTS
-#ifndef _KERNEL
-bool
-nvlist_existsf(const nvlist_t *nvl, const char *namefmt, ...)
-{
- va_list nameap;
- bool ret;
-
- va_start(nameap, namefmt);
- ret = nvlist_existsv(nvl, namefmt, nameap);
- va_end(nameap);
- return (ret);
-}
-
-#define NVLIST_EXISTSF(type) \
-bool \
-nvlist_existsf_##type(const nvlist_t *nvl, const char *namefmt, ...) \
-{ \
- va_list nameap; \
- bool ret; \
- \
- va_start(nameap, namefmt); \
- ret = nvlist_existsv_##type(nvl, namefmt, nameap); \
- va_end(nameap); \
- return (ret); \
-}
-
-NVLIST_EXISTSF(null)
-NVLIST_EXISTSF(bool)
-NVLIST_EXISTSF(number)
-NVLIST_EXISTSF(string)
-NVLIST_EXISTSF(nvlist)
-#ifndef _KERNEL
-NVLIST_EXISTSF(descriptor)
-#endif
-NVLIST_EXISTSF(binary)
-
-#undef NVLIST_EXISTSF
-
-bool
-nvlist_existsv(const nvlist_t *nvl, const char *namefmt, va_list nameap)
-{
- char *name;
- bool exists;
-
- nv_vasprintf(&name, namefmt, nameap);
- if (name == NULL)
- return (false);
-
- exists = nvlist_exists(nvl, name);
- nv_free(name);
- return (exists);
-}
-
-#define NVLIST_EXISTSV(type) \
-bool \
-nvlist_existsv_##type(const nvlist_t *nvl, const char *namefmt, \
- va_list nameap) \
-{ \
- char *name; \
- bool exists; \
- \
- vasprintf(&name, namefmt, nameap); \
- if (name == NULL) \
- return (false); \
- exists = nvlist_exists_##type(nvl, name); \
- free(name); \
- return (exists); \
-}
-
-NVLIST_EXISTSV(null)
-NVLIST_EXISTSV(bool)
-NVLIST_EXISTSV(number)
-NVLIST_EXISTSV(string)
-NVLIST_EXISTSV(nvlist)
-NVLIST_EXISTSV(descriptor)
-NVLIST_EXISTSV(binary)
-
-#undef NVLIST_EXISTSV
-#endif
-
void
nvlist_add_nvpair(nvlist_t *nvl, const nvpair_t *nvp)
{
@@ -1188,19 +1073,21 @@ nvlist_add_nvpair(nvlist_t *nvl, const nvpair_t *nvp)
NVPAIR_ASSERT(nvp);
if (nvlist_error(nvl) != 0) {
- RESTORE_ERRNO(nvlist_error(nvl));
+ ERRNO_SET(nvlist_error(nvl));
return;
}
- if (nvlist_exists(nvl, nvpair_name(nvp))) {
- nvl->nvl_error = EEXIST;
- RESTORE_ERRNO(nvlist_error(nvl));
- return;
+ if ((nvl->nvl_flags & NV_FLAG_NO_UNIQUE) == 0) {
+ if (nvlist_exists(nvl, nvpair_name(nvp))) {
+ nvl->nvl_error = EEXIST;
+ ERRNO_SET(nvlist_error(nvl));
+ return;
+ }
}
newnvp = nvpair_clone(nvp);
if (newnvp == NULL) {
nvl->nvl_error = ERRNO_OR_DEFAULT(ENOMEM);
- RESTORE_ERRNO(nvlist_error(nvl));
+ ERRNO_SET(nvlist_error(nvl));
return;
}
@@ -1208,34 +1095,6 @@ nvlist_add_nvpair(nvlist_t *nvl, const nvpair_t *nvp)
}
void
-nvlist_add_null(nvlist_t *nvl, const char *name)
-{
-
- nvlist_addf_null(nvl, "%s", name);
-}
-
-void
-nvlist_add_bool(nvlist_t *nvl, const char *name, bool value)
-{
-
- nvlist_addf_bool(nvl, value, "%s", name);
-}
-
-void
-nvlist_add_number(nvlist_t *nvl, const char *name, uint64_t value)
-{
-
- nvlist_addf_number(nvl, value, "%s", name);
-}
-
-void
-nvlist_add_string(nvlist_t *nvl, const char *name, const char *value)
-{
-
- nvlist_addf_string(nvl, value, "%s", name);
-}
-
-void
nvlist_add_stringf(nvlist_t *nvl, const char *name, const char *valuefmt, ...)
{
va_list valueap;
@@ -1252,247 +1111,88 @@ nvlist_add_stringv(nvlist_t *nvl, const char *name, const char *valuefmt,
nvpair_t *nvp;
if (nvlist_error(nvl) != 0) {
- RESTORE_ERRNO(nvlist_error(nvl));
+ ERRNO_SET(nvlist_error(nvl));
return;
}
nvp = nvpair_create_stringv(name, valuefmt, valueap);
if (nvp == NULL) {
nvl->nvl_error = ERRNO_OR_DEFAULT(ENOMEM);
- RESTORE_ERRNO(nvl->nvl_error);
- } else
+ ERRNO_SET(nvl->nvl_error);
+ } else {
nvlist_move_nvpair(nvl, nvp);
-}
-
-void
-nvlist_add_nvlist(nvlist_t *nvl, const char *name, const nvlist_t *value)
-{
-
- nvlist_addf_nvlist(nvl, value, "%s", name);
-}
-
-#ifndef _KERNEL
-void
-nvlist_add_descriptor(nvlist_t *nvl, const char *name, int value)
-{
-
- nvlist_addf_descriptor(nvl, value, "%s", name);
-}
-#endif
-
-void
-nvlist_add_binary(nvlist_t *nvl, const char *name, const void *value,
- size_t size)
-{
-
- nvlist_addf_binary(nvl, value, size, "%s", name);
-}
-
-void
-nvlist_addf_null(nvlist_t *nvl, const char *namefmt, ...)
-{
- va_list nameap;
-
- va_start(nameap, namefmt);
- nvlist_addv_null(nvl, namefmt, nameap);
- va_end(nameap);
-}
-
-void
-nvlist_addf_bool(nvlist_t *nvl, bool value, const char *namefmt, ...)
-{
- va_list nameap;
-
- va_start(nameap, namefmt);
- nvlist_addv_bool(nvl, value, namefmt, nameap);
- va_end(nameap);
-}
-
-void
-nvlist_addf_number(nvlist_t *nvl, uint64_t value, const char *namefmt, ...)
-{
- va_list nameap;
-
- va_start(nameap, namefmt);
- nvlist_addv_number(nvl, value, namefmt, nameap);
- va_end(nameap);
-}
-
-void
-nvlist_addf_string(nvlist_t *nvl, const char *value, const char *namefmt, ...)
-{
- va_list nameap;
-
- va_start(nameap, namefmt);
- nvlist_addv_string(nvl, value, namefmt, nameap);
- va_end(nameap);
-}
-
-void
-nvlist_addf_nvlist(nvlist_t *nvl, const nvlist_t *value, const char *namefmt,
- ...)
-{
- va_list nameap;
-
- va_start(nameap, namefmt);
- nvlist_addv_nvlist(nvl, value, namefmt, nameap);
- va_end(nameap);
-}
-
-#ifndef _KERNEL
-void
-nvlist_addf_descriptor(nvlist_t *nvl, int value, const char *namefmt, ...)
-{
- va_list nameap;
-
- va_start(nameap, namefmt);
- nvlist_addv_descriptor(nvl, value, namefmt, nameap);
- va_end(nameap);
-}
-#endif
-
-void
-nvlist_addf_binary(nvlist_t *nvl, const void *value, size_t size,
- const char *namefmt, ...)
-{
- va_list nameap;
-
- va_start(nameap, namefmt);
- nvlist_addv_binary(nvl, value, size, namefmt, nameap);
- va_end(nameap);
-}
-
-void
-nvlist_addv_null(nvlist_t *nvl, const char *namefmt, va_list nameap)
-{
- nvpair_t *nvp;
-
- if (nvlist_error(nvl) != 0) {
- RESTORE_ERRNO(nvlist_error(nvl));
- return;
}
-
- nvp = nvpair_createv_null(namefmt, nameap);
- if (nvp == NULL) {
- nvl->nvl_error = ERRNO_OR_DEFAULT(ENOMEM);
- RESTORE_ERRNO(nvl->nvl_error);
- } else
- nvlist_move_nvpair(nvl, nvp);
}
void
-nvlist_addv_bool(nvlist_t *nvl, bool value, const char *namefmt, va_list nameap)
+nvlist_add_null(nvlist_t *nvl, const char *name)
{
nvpair_t *nvp;
if (nvlist_error(nvl) != 0) {
- RESTORE_ERRNO(nvlist_error(nvl));
+ ERRNO_SET(nvlist_error(nvl));
return;
}
- nvp = nvpair_createv_bool(value, namefmt, nameap);
+ nvp = nvpair_create_null(name);
if (nvp == NULL) {
nvl->nvl_error = ERRNO_OR_DEFAULT(ENOMEM);
- RESTORE_ERRNO(nvl->nvl_error);
- } else
+ ERRNO_SET(nvl->nvl_error);
+ } else {
nvlist_move_nvpair(nvl, nvp);
-}
-
-void
-nvlist_addv_number(nvlist_t *nvl, uint64_t value, const char *namefmt,
- va_list nameap)
-{
- nvpair_t *nvp;
-
- if (nvlist_error(nvl) != 0) {
- RESTORE_ERRNO(nvlist_error(nvl));
- return;
}
-
- nvp = nvpair_createv_number(value, namefmt, nameap);
- if (nvp == NULL) {
- nvl->nvl_error = ERRNO_OR_DEFAULT(ENOMEM);
- RESTORE_ERRNO(nvl->nvl_error);
- } else
- nvlist_move_nvpair(nvl, nvp);
}
void
-nvlist_addv_string(nvlist_t *nvl, const char *value, const char *namefmt,
- va_list nameap)
+nvlist_add_binary(nvlist_t *nvl, const char *name, const void *value,
+ size_t size)
{
nvpair_t *nvp;
if (nvlist_error(nvl) != 0) {
- RESTORE_ERRNO(nvlist_error(nvl));
+ ERRNO_SET(nvlist_error(nvl));
return;
}
- nvp = nvpair_createv_string(value, namefmt, nameap);
+ nvp = nvpair_create_binary(name, value, size);
if (nvp == NULL) {
nvl->nvl_error = ERRNO_OR_DEFAULT(ENOMEM);
- RESTORE_ERRNO(nvl->nvl_error);
- } else
+ ERRNO_SET(nvl->nvl_error);
+ } else {
nvlist_move_nvpair(nvl, nvp);
-}
-
-void
-nvlist_addv_nvlist(nvlist_t *nvl, const nvlist_t *value, const char *namefmt,
- va_list nameap)
-{
- nvpair_t *nvp;
-
- if (nvlist_error(nvl) != 0) {
- RESTORE_ERRNO(nvlist_error(nvl));
- return;
}
-
- nvp = nvpair_createv_nvlist(value, namefmt, nameap);
- if (nvp == NULL) {
- nvl->nvl_error = ERRNO_OR_DEFAULT(ENOMEM);
- RESTORE_ERRNO(nvl->nvl_error);
- } else
- nvlist_move_nvpair(nvl, nvp);
}
-#ifndef _KERNEL
-void
-nvlist_addv_descriptor(nvlist_t *nvl, int value, const char *namefmt,
- va_list nameap)
-{
- nvpair_t *nvp;
-
- if (nvlist_error(nvl) != 0) {
- errno = nvlist_error(nvl);
- return;
- }
- nvp = nvpair_createv_descriptor(value, namefmt, nameap);
- if (nvp == NULL)
- nvl->nvl_error = errno = (errno != 0 ? errno : ENOMEM);
- else
- nvlist_move_nvpair(nvl, nvp);
-}
+#define NVLIST_ADD(vtype, type) \
+void \
+nvlist_add_##type(nvlist_t *nvl, const char *name, vtype value) \
+{ \
+ nvpair_t *nvp; \
+ \
+ if (nvlist_error(nvl) != 0) { \
+ ERRNO_SET(nvlist_error(nvl)); \
+ return; \
+ } \
+ \
+ nvp = nvpair_create_##type(name, value); \
+ if (nvp == NULL) { \
+ nvl->nvl_error = ERRNO_OR_DEFAULT(ENOMEM); \
+ ERRNO_SET(nvl->nvl_error); \
+ } else { \
+ nvlist_move_nvpair(nvl, nvp); \
+ } \
+}
+
+NVLIST_ADD(bool, bool)
+NVLIST_ADD(uint64_t, number)
+NVLIST_ADD(const char *, string)
+NVLIST_ADD(const nvlist_t *, nvlist)
+#ifndef _KERNEL
+NVLIST_ADD(int, descriptor);
#endif
-void
-nvlist_addv_binary(nvlist_t *nvl, const void *value, size_t size,
- const char *namefmt, va_list nameap)
-{
- nvpair_t *nvp;
-
- if (nvlist_error(nvl) != 0) {
- RESTORE_ERRNO(nvlist_error(nvl));
- return;
- }
-
- nvp = nvpair_createv_binary(value, size, namefmt, nameap);
- if (nvp == NULL) {
- nvl->nvl_error = ERRNO_OR_DEFAULT(ENOMEM);
- RESTORE_ERRNO(nvl->nvl_error);
- } else
- nvlist_move_nvpair(nvl, nvp);
-}
+#undef NVLIST_ADD
void
nvlist_move_nvpair(nvlist_t *nvl, nvpair_t *nvp)
@@ -1503,153 +1203,102 @@ nvlist_move_nvpair(nvlist_t *nvl, nvpair_t *nvp)
if (nvlist_error(nvl) != 0) {
nvpair_free(nvp);
- RESTORE_ERRNO(nvlist_error(nvl));
+ ERRNO_SET(nvlist_error(nvl));
return;
}
- if (nvlist_exists(nvl, nvpair_name(nvp))) {
- nvpair_free(nvp);
- nvl->nvl_error = EEXIST;
- RESTORE_ERRNO(nvl->nvl_error);
- return;
+ if ((nvl->nvl_flags & NV_FLAG_NO_UNIQUE) == 0) {
+ if (nvlist_exists(nvl, nvpair_name(nvp))) {
+ nvpair_free(nvp);
+ nvl->nvl_error = EEXIST;
+ ERRNO_SET(nvl->nvl_error);
+ return;
+ }
}
nvpair_insert(&nvl->nvl_head, nvp, nvl);
}
-#define NVLIST_MOVE(vtype, type) \
-void \
-nvlist_move_##type(nvlist_t *nvl, const char *name, vtype value) \
-{ \
- \
- nvlist_movef_##type(nvl, value, "%s", name); \
-}
-
-NVLIST_MOVE(char *, string)
-NVLIST_MOVE(nvlist_t *, nvlist)
-#ifndef _KERNEL
-NVLIST_MOVE(int, descriptor)
-#endif
-
-#undef NVLIST_MOVE
-
void
-nvlist_move_binary(nvlist_t *nvl, const char *name, void *value, size_t size)
-{
-
- nvlist_movef_binary(nvl, value, size, "%s", name);
-}
-
-#define NVLIST_MOVEF(vtype, type) \
-void \
-nvlist_movef_##type(nvlist_t *nvl, vtype value, const char *namefmt, \
- ...) \
-{ \
- va_list nameap; \
- \
- va_start(nameap, namefmt); \
- nvlist_movev_##type(nvl, value, namefmt, nameap); \
- va_end(nameap); \
-}
-
-NVLIST_MOVEF(char *, string)
-NVLIST_MOVEF(nvlist_t *, nvlist)
-#ifndef _KERNEL
-NVLIST_MOVEF(int, descriptor)
-#endif
-
-#undef NVLIST_MOVEF
-
-void
-nvlist_movef_binary(nvlist_t *nvl, void *value, size_t size,
- const char *namefmt, ...)
-{
- va_list nameap;
-
- va_start(nameap, namefmt);
- nvlist_movev_binary(nvl, value, size, namefmt, nameap);
- va_end(nameap);
-}
-
-void
-nvlist_movev_string(nvlist_t *nvl, char *value, const char *namefmt,
- va_list nameap)
+nvlist_move_string(nvlist_t *nvl, const char *name, char *value)
{
nvpair_t *nvp;
if (nvlist_error(nvl) != 0) {
nv_free(value);
- RESTORE_ERRNO(nvlist_error(nvl));
+ ERRNO_SET(nvlist_error(nvl));
return;
}
- nvp = nvpair_movev_string(value, namefmt, nameap);
+ nvp = nvpair_move_string(name, value);
if (nvp == NULL) {
nvl->nvl_error = ERRNO_OR_DEFAULT(ENOMEM);
- RESTORE_ERRNO(nvl->nvl_error);
- } else
+ ERRNO_SET(nvl->nvl_error);
+ } else {
nvlist_move_nvpair(nvl, nvp);
+ }
}
void
-nvlist_movev_nvlist(nvlist_t *nvl, nvlist_t *value, const char *namefmt,
- va_list nameap)
+nvlist_move_nvlist(nvlist_t *nvl, const char *name, nvlist_t *value)
{
nvpair_t *nvp;
if (nvlist_error(nvl) != 0) {
if (value != NULL && nvlist_get_nvpair_parent(value) != NULL)
nvlist_destroy(value);
- RESTORE_ERRNO(nvlist_error(nvl));
+ ERRNO_SET(nvlist_error(nvl));
return;
}
- nvp = nvpair_movev_nvlist(value, namefmt, nameap);
+ nvp = nvpair_move_nvlist(name, value);
if (nvp == NULL) {
nvl->nvl_error = ERRNO_OR_DEFAULT(ENOMEM);
- RESTORE_ERRNO(nvl->nvl_error);
- } else
+ ERRNO_SET(nvl->nvl_error);
+ } else {
nvlist_move_nvpair(nvl, nvp);
+ }
}
#ifndef _KERNEL
void
-nvlist_movev_descriptor(nvlist_t *nvl, int value, const char *namefmt,
- va_list nameap)
+nvlist_move_descriptor(nvlist_t *nvl, const char *name, int value)
{
nvpair_t *nvp;
if (nvlist_error(nvl) != 0) {
close(value);
- errno = nvlist_error(nvl);
+ ERRNO_SET(nvlist_error(nvl));
return;
}
- nvp = nvpair_movev_descriptor(value, namefmt, nameap);
- if (nvp == NULL)
- nvl->nvl_error = errno = (errno != 0 ? errno : ENOMEM);
- else
+ nvp = nvpair_move_descriptor(name, value);
+ if (nvp == NULL) {
+ nvl->nvl_error = ERRNO_OR_DEFAULT(ENOMEM);
+ ERRNO_SET(nvl->nvl_error);
+ } else {
nvlist_move_nvpair(nvl, nvp);
+ }
}
#endif
void
-nvlist_movev_binary(nvlist_t *nvl, void *value, size_t size,
- const char *namefmt, va_list nameap)
+nvlist_move_binary(nvlist_t *nvl, const char *name, void *value, size_t size)
{
nvpair_t *nvp;
if (nvlist_error(nvl) != 0) {
nv_free(value);
- RESTORE_ERRNO(nvlist_error(nvl));
+ ERRNO_SET(nvlist_error(nvl));
return;
}
- nvp = nvpair_movev_binary(value, size, namefmt, nameap);
+ nvp = nvpair_move_binary(name, value, size);
if (nvp == NULL) {
nvl->nvl_error = ERRNO_OR_DEFAULT(ENOMEM);
- RESTORE_ERRNO(nvl->nvl_error);
- } else
+ ERRNO_SET(nvl->nvl_error);
+ } else {
nvlist_move_nvpair(nvl, nvp);
+ }
}
const nvpair_t *
@@ -1693,84 +1342,6 @@ nvlist_get_binary(const nvlist_t *nvl, const char *name, size_t *sizep)
return (nvpair_get_binary(nvp, sizep));
}
-#define NVLIST_GETF(ftype, type) \
-ftype \
-nvlist_getf_##type(const nvlist_t *nvl, const char *namefmt, ...) \
-{ \
- va_list nameap; \
- ftype value; \
- \
- va_start(nameap, namefmt); \
- value = nvlist_getv_##type(nvl, namefmt, nameap); \
- va_end(nameap); \
- \
- return (value); \
-}
-
-#ifndef _KERNEL
-NVLIST_GETF(bool, bool)
-NVLIST_GETF(uint64_t, number)
-NVLIST_GETF(const char *, string)
-NVLIST_GETF(const nvlist_t *, nvlist)
-NVLIST_GETF(int, descriptor)
-
-#undef NVLIST_GETF
-
-const void *
-nvlist_getf_binary(const nvlist_t *nvl, size_t *sizep, const char *namefmt, ...)
-{
- va_list nameap;
- const void *value;
-
- va_start(nameap, namefmt);
- value = nvlist_getv_binary(nvl, sizep, namefmt, nameap);
- va_end(nameap);
-
- return (value);
-}
-
-#define NVLIST_GETV(ftype, type, TYPE) \
-ftype \
-nvlist_getv_##type(const nvlist_t *nvl, const char *namefmt, \
- va_list nameap) \
-{ \
- char *name; \
- ftype value; \
- \
- vasprintf(&name, namefmt, nameap); \
- if (name == NULL) \
- nvlist_report_missing(NV_TYPE_##TYPE, "<unknown>"); \
- value = nvlist_get_##type(nvl, name); \
- free(name); \
- \
- return (value); \
-}
-
-NVLIST_GETV(bool, bool, BOOL)
-NVLIST_GETV(uint64_t, number, NUMBER)
-NVLIST_GETV(const char *, string, STRING)
-NVLIST_GETV(const nvlist_t *, nvlist, NVLIST)
-NVLIST_GETV(int, descriptor, DESCRIPTOR)
-
-#undef NVLIST_GETV
-
-const void *
-nvlist_getv_binary(const nvlist_t *nvl, size_t *sizep, const char *namefmt,
- va_list nameap)
-{
- char *name;
- const void *binary;
-
- nv_vasprintf(&name, namefmt, nameap);
- if (name == NULL)
- nvlist_report_missing(NV_TYPE_BINARY, "<unknown>");
-
- binary = nvlist_get_binary(nvl, name, sizep);
- nv_free(name);
- return (binary);
-}
-#endif
-
#define NVLIST_TAKE(ftype, type, TYPE) \
ftype \
nvlist_take_##type(nvlist_t *nvl, const char *name) \
@@ -1813,82 +1384,6 @@ nvlist_take_binary(nvlist_t *nvl, const char *name, size_t *sizep)
return (value);
}
-#define NVLIST_TAKEF(ftype, type) \
-ftype \
-nvlist_takef_##type(nvlist_t *nvl, const char *namefmt, ...) \
-{ \
- va_list nameap; \
- ftype value; \
- \
- va_start(nameap, namefmt); \
- value = nvlist_takev_##type(nvl, namefmt, nameap); \
- va_end(nameap); \
- \
- return (value); \
-}
-
-#ifndef _KERNEL
-NVLIST_TAKEF(bool, bool)
-NVLIST_TAKEF(uint64_t, number)
-NVLIST_TAKEF(char *, string)
-NVLIST_TAKEF(nvlist_t *, nvlist)
-NVLIST_TAKEF(int, descriptor)
-
-#undef NVLIST_TAKEF
-
-void *
-nvlist_takef_binary(nvlist_t *nvl, size_t *sizep, const char *namefmt, ...)
-{
- va_list nameap;
- void *value;
-
- va_start(nameap, namefmt);
- value = nvlist_takev_binary(nvl, sizep, namefmt, nameap);
- va_end(nameap);
-
- return (value);
-}
-
-#define NVLIST_TAKEV(ftype, type, TYPE) \
-ftype \
-nvlist_takev_##type(nvlist_t *nvl, const char *namefmt, va_list nameap) \
-{ \
- char *name; \
- ftype value; \
- \
- vasprintf(&name, namefmt, nameap); \
- if (name == NULL) \
- nvlist_report_missing(NV_TYPE_##TYPE, "<unknown>"); \
- value = nvlist_take_##type(nvl, name); \
- free(name); \
- return (value); \
-}
-
-NVLIST_TAKEV(bool, bool, BOOL)
-NVLIST_TAKEV(uint64_t, number, NUMBER)
-NVLIST_TAKEV(char *, string, STRING)
-NVLIST_TAKEV(nvlist_t *, nvlist, NVLIST)
-NVLIST_TAKEV(int, descriptor, DESCRIPTOR)
-
-#undef NVLIST_TAKEV
-
-void *
-nvlist_takev_binary(nvlist_t *nvl, size_t *sizep, const char *namefmt,
- va_list nameap)
-{
- char *name;
- void *binary;
-
- nv_vasprintf(&name, namefmt, nameap);
- if (name == NULL)
- nvlist_report_missing(NV_TYPE_BINARY, "<unknown>");
-
- binary = nvlist_take_binary(nvl, name, sizep);
- nv_free(name);
- return (binary);
-}
-#endif
-
void
nvlist_remove_nvpair(nvlist_t *nvl, nvpair_t *nvp)
{
@@ -1927,68 +1422,6 @@ NVLIST_FREE(binary, BINARY)
#undef NVLIST_FREE
-#ifndef _KERNEL
-void
-nvlist_freef(nvlist_t *nvl, const char *namefmt, ...)
-{
- va_list nameap;
-
- va_start(nameap, namefmt);
- nvlist_freev(nvl, namefmt, nameap);
- va_end(nameap);
-}
-
-#define NVLIST_FREEF(type) \
-void \
-nvlist_freef_##type(nvlist_t *nvl, const char *namefmt, ...) \
-{ \
- va_list nameap; \
- \
- va_start(nameap, namefmt); \
- nvlist_freev_##type(nvl, namefmt, nameap); \
- va_end(nameap); \
-}
-
-NVLIST_FREEF(null)
-NVLIST_FREEF(bool)
-NVLIST_FREEF(number)
-NVLIST_FREEF(string)
-NVLIST_FREEF(nvlist)
-NVLIST_FREEF(descriptor)
-NVLIST_FREEF(binary)
-
-#undef NVLIST_FREEF
-
-void
-nvlist_freev(nvlist_t *nvl, const char *namefmt, va_list nameap)
-{
-
- nvlist_freev_type(nvl, NV_TYPE_NONE, namefmt, nameap);
-}
-
-#define NVLIST_FREEV(type, TYPE) \
-void \
-nvlist_freev_##type(nvlist_t *nvl, const char *namefmt, va_list nameap) \
-{ \
- char *name; \
- \
- vasprintf(&name, namefmt, nameap); \
- if (name == NULL) \
- nvlist_report_missing(NV_TYPE_##TYPE, "<unknown>"); \
- nvlist_free_##type(nvl, name); \
- free(name); \
-}
-
-NVLIST_FREEV(null, NULL)
-NVLIST_FREEV(bool, BOOL)
-NVLIST_FREEV(number, NUMBER)
-NVLIST_FREEV(string, STRING)
-NVLIST_FREEV(nvlist, NVLIST)
-NVLIST_FREEV(descriptor, DESCRIPTOR)
-NVLIST_FREEV(binary, BINARY)
-#undef NVLIST_FREEV
-#endif
-
void
nvlist_free_nvpair(nvlist_t *nvl, nvpair_t *nvp)
{
@@ -2000,3 +1433,4 @@ nvlist_free_nvpair(nvlist_t *nvl, nvpair_t *nvp)
nvlist_remove_nvpair(nvl, nvp);
nvpair_free(nvp);
}
+
diff --git a/sys/kern/subr_nvpair.c b/sys/kern/subr_nvpair.c
index 7b88e42..cde08e6 100644
--- a/sys/kern/subr_nvpair.c
+++ b/sys/kern/subr_nvpair.c
@@ -143,7 +143,8 @@ nvpair_insert(struct nvl_head *head, nvpair_t *nvp, nvlist_t *nvl)
NVPAIR_ASSERT(nvp);
PJDLOG_ASSERT(nvp->nvp_list == NULL);
- PJDLOG_ASSERT(!nvlist_exists(nvl, nvpair_name(nvp)));
+ PJDLOG_ASSERT((nvlist_flags(nvl) & NV_FLAG_NO_UNIQUE) != 0 ||
+ !nvlist_exists(nvl, nvpair_name(nvp)));
TAILQ_INSERT_TAIL(head, nvp, nvp_next);
nvp->nvp_list = nvl;
@@ -468,7 +469,7 @@ nvpair_unpack_header(bool isbe, nvpair_t *nvp, const unsigned char *ptr,
return (ptr);
failed:
- RESTORE_ERRNO(EINVAL);
+ ERRNO_SET(EINVAL);
return (NULL);
}
@@ -480,7 +481,7 @@ nvpair_unpack_null(bool isbe __unused, nvpair_t *nvp, const unsigned char *ptr,
PJDLOG_ASSERT(nvp->nvp_type == NV_TYPE_NULL);
if (nvp->nvp_datasize != 0) {
- RESTORE_ERRNO(EINVAL);
+ ERRNO_SET(EINVAL);
return (NULL);
}
@@ -496,11 +497,11 @@ nvpair_unpack_bool(bool isbe __unused, nvpair_t *nvp, const unsigned char *ptr,
PJDLOG_ASSERT(nvp->nvp_type == NV_TYPE_BOOL);
if (nvp->nvp_datasize != sizeof(value)) {
- RESTORE_ERRNO(EINVAL);
+ ERRNO_SET(EINVAL);
return (NULL);
}
if (*leftp < sizeof(value)) {
- RESTORE_ERRNO(EINVAL);
+ ERRNO_SET(EINVAL);
return (NULL);
}
@@ -509,7 +510,7 @@ nvpair_unpack_bool(bool isbe __unused, nvpair_t *nvp, const unsigned char *ptr,
*leftp -= sizeof(value);
if (value != 0 && value != 1) {
- RESTORE_ERRNO(EINVAL);
+ ERRNO_SET(EINVAL);
return (NULL);
}
@@ -526,11 +527,11 @@ nvpair_unpack_number(bool isbe, nvpair_t *nvp, const unsigned char *ptr,
PJDLOG_ASSERT(nvp->nvp_type == NV_TYPE_NUMBER);
if (nvp->nvp_datasize != sizeof(uint64_t)) {
- RESTORE_ERRNO(EINVAL);
+ ERRNO_SET(EINVAL);
return (NULL);
}
if (*leftp < sizeof(uint64_t)) {
- RESTORE_ERRNO(EINVAL);
+ ERRNO_SET(EINVAL);
return (NULL);
}
@@ -552,13 +553,13 @@ nvpair_unpack_string(bool isbe __unused, nvpair_t *nvp,
PJDLOG_ASSERT(nvp->nvp_type == NV_TYPE_STRING);
if (*leftp < nvp->nvp_datasize || nvp->nvp_datasize == 0) {
- RESTORE_ERRNO(EINVAL);
+ ERRNO_SET(EINVAL);
return (NULL);
}
if (strnlen((const char *)ptr, nvp->nvp_datasize) !=
nvp->nvp_datasize - 1) {
- RESTORE_ERRNO(EINVAL);
+ ERRNO_SET(EINVAL);
return (NULL);
}
@@ -581,7 +582,7 @@ nvpair_unpack_nvlist(bool isbe __unused, nvpair_t *nvp,
PJDLOG_ASSERT(nvp->nvp_type == NV_TYPE_NVLIST);
if (*leftp < nvp->nvp_datasize || nvp->nvp_datasize == 0) {
- RESTORE_ERRNO(EINVAL);
+ ERRNO_SET(EINVAL);
return (NULL);
}
@@ -609,11 +610,11 @@ nvpair_unpack_descriptor(bool isbe, nvpair_t *nvp, const unsigned char *ptr,
PJDLOG_ASSERT(nvp->nvp_type == NV_TYPE_DESCRIPTOR);
if (nvp->nvp_datasize != sizeof(idx)) {
- errno = EINVAL;
+ ERRNO_SET(EINVAL);
return (NULL);
}
if (*leftp < sizeof(idx)) {
- errno = EINVAL;
+ ERRNO_SET(EINVAL);
return (NULL);
}
@@ -623,12 +624,12 @@ nvpair_unpack_descriptor(bool isbe, nvpair_t *nvp, const unsigned char *ptr,
idx = le64dec(ptr);
if (idx < 0) {
- errno = EINVAL;
+ ERRNO_SET(EINVAL);
return (NULL);
}
if ((size_t)idx >= nfds) {
- errno = EINVAL;
+ ERRNO_SET(EINVAL);
return (NULL);
}
@@ -650,7 +651,7 @@ nvpair_unpack_binary(bool isbe __unused, nvpair_t *nvp,
PJDLOG_ASSERT(nvp->nvp_type == NV_TYPE_BINARY);
if (*leftp < nvp->nvp_datasize || nvp->nvp_datasize == 0) {
- RESTORE_ERRNO(EINVAL);
+ ERRNO_SET(EINVAL);
return (NULL);
}
@@ -716,69 +717,34 @@ nvpair_name(const nvpair_t *nvp)
}
static nvpair_t *
-nvpair_allocv(int type, uint64_t data, size_t datasize, const char *namefmt,
- va_list nameap)
+nvpair_allocv(const char *name, int type, uint64_t data, size_t datasize)
{
nvpair_t *nvp;
- char *name;
- int namelen;
+ size_t namelen;
PJDLOG_ASSERT(type >= NV_TYPE_FIRST && type <= NV_TYPE_LAST);
- namelen = nv_vasprintf(&name, namefmt, nameap);
- if (namelen < 0)
- return (NULL);
-
- PJDLOG_ASSERT(namelen > 0);
+ namelen = strlen(name);
if (namelen >= NV_NAME_MAX) {
- nv_free(name);
- RESTORE_ERRNO(ENAMETOOLONG);
+ ERRNO_SET(ENAMETOOLONG);
return (NULL);
}
nvp = nv_calloc(1, sizeof(*nvp) + namelen + 1);
if (nvp != NULL) {
nvp->nvp_name = (char *)(nvp + 1);
- memcpy(nvp->nvp_name, name, namelen + 1);
+ memcpy(nvp->nvp_name, name, namelen);
+ nvp->nvp_name[namelen] = '\0';
nvp->nvp_type = type;
nvp->nvp_data = data;
nvp->nvp_datasize = datasize;
nvp->nvp_magic = NVPAIR_MAGIC;
}
- nv_free(name);
return (nvp);
};
nvpair_t *
-nvpair_create_null(const char *name)
-{
-
- return (nvpair_createf_null("%s", name));
-}
-
-nvpair_t *
-nvpair_create_bool(const char *name, bool value)
-{
-
- return (nvpair_createf_bool(value, "%s", name));
-}
-
-nvpair_t *
-nvpair_create_number(const char *name, uint64_t value)
-{
-
- return (nvpair_createf_number(value, "%s", name));
-}
-
-nvpair_t *
-nvpair_create_string(const char *name, const char *value)
-{
-
- return (nvpair_createf_string(value, "%s", name));
-}
-
-nvpair_t *
nvpair_create_stringf(const char *name, const char *valuefmt, ...)
{
va_list valueap;
@@ -808,153 +774,36 @@ nvpair_create_stringv(const char *name, const char *valuefmt, va_list valueap)
}
nvpair_t *
-nvpair_create_nvlist(const char *name, const nvlist_t *value)
-{
-
- return (nvpair_createf_nvlist(value, "%s", name));
-}
-
-#ifndef _KERNEL
-nvpair_t *
-nvpair_create_descriptor(const char *name, int value)
-{
-
- return (nvpair_createf_descriptor(value, "%s", name));
-}
-#endif
-
-nvpair_t *
-nvpair_create_binary(const char *name, const void *value, size_t size)
-{
-
- return (nvpair_createf_binary(value, size, "%s", name));
-}
-
-nvpair_t *
-nvpair_createf_null(const char *namefmt, ...)
-{
- va_list nameap;
- nvpair_t *nvp;
-
- va_start(nameap, namefmt);
- nvp = nvpair_createv_null(namefmt, nameap);
- va_end(nameap);
-
- return (nvp);
-}
-
-nvpair_t *
-nvpair_createf_bool(bool value, const char *namefmt, ...)
-{
- va_list nameap;
- nvpair_t *nvp;
-
- va_start(nameap, namefmt);
- nvp = nvpair_createv_bool(value, namefmt, nameap);
- va_end(nameap);
-
- return (nvp);
-}
-
-nvpair_t *
-nvpair_createf_number(uint64_t value, const char *namefmt, ...)
-{
- va_list nameap;
- nvpair_t *nvp;
-
- va_start(nameap, namefmt);
- nvp = nvpair_createv_number(value, namefmt, nameap);
- va_end(nameap);
-
- return (nvp);
-}
-
-nvpair_t *
-nvpair_createf_string(const char *value, const char *namefmt, ...)
-{
- va_list nameap;
- nvpair_t *nvp;
-
- va_start(nameap, namefmt);
- nvp = nvpair_createv_string(value, namefmt, nameap);
- va_end(nameap);
-
- return (nvp);
-}
-
-nvpair_t *
-nvpair_createf_nvlist(const nvlist_t *value, const char *namefmt, ...)
-{
- va_list nameap;
- nvpair_t *nvp;
-
- va_start(nameap, namefmt);
- nvp = nvpair_createv_nvlist(value, namefmt, nameap);
- va_end(nameap);
-
- return (nvp);
-}
-
-#ifndef _KERNEL
-nvpair_t *
-nvpair_createf_descriptor(int value, const char *namefmt, ...)
-{
- va_list nameap;
- nvpair_t *nvp;
-
- va_start(nameap, namefmt);
- nvp = nvpair_createv_descriptor(value, namefmt, nameap);
- va_end(nameap);
-
- return (nvp);
-}
-#endif
-
-nvpair_t *
-nvpair_createf_binary(const void *value, size_t size, const char *namefmt, ...)
-{
- va_list nameap;
- nvpair_t *nvp;
-
- va_start(nameap, namefmt);
- nvp = nvpair_createv_binary(value, size, namefmt, nameap);
- va_end(nameap);
-
- return (nvp);
-}
-
-nvpair_t *
-nvpair_createv_null(const char *namefmt, va_list nameap)
+nvpair_create_null(const char *name)
{
- return (nvpair_allocv(NV_TYPE_NULL, 0, 0, namefmt, nameap));
+ return (nvpair_allocv(name, NV_TYPE_NULL, 0, 0));
}
nvpair_t *
-nvpair_createv_bool(bool value, const char *namefmt, va_list nameap)
+nvpair_create_bool(const char *name, bool value)
{
- return (nvpair_allocv(NV_TYPE_BOOL, value ? 1 : 0, sizeof(uint8_t),
- namefmt, nameap));
+ return (nvpair_allocv(name, NV_TYPE_BOOL, value ? 1 : 0,
+ sizeof(uint8_t)));
}
nvpair_t *
-nvpair_createv_number(uint64_t value, const char *namefmt, va_list nameap)
+nvpair_create_number(const char *name, uint64_t value)
{
- return (nvpair_allocv(NV_TYPE_NUMBER, value, sizeof(value), namefmt,
- nameap));
+ return (nvpair_allocv(name, NV_TYPE_NUMBER, value, sizeof(value)));
}
nvpair_t *
-nvpair_createv_string(const char *value, const char *namefmt, va_list nameap)
+nvpair_create_string(const char *name, const char *value)
{
nvpair_t *nvp;
size_t size;
char *data;
if (value == NULL) {
- RESTORE_ERRNO(EINVAL);
+ ERRNO_SET(EINVAL);
return (NULL);
}
@@ -963,8 +812,8 @@ nvpair_createv_string(const char *value, const char *namefmt, va_list nameap)
return (NULL);
size = strlen(value) + 1;
- nvp = nvpair_allocv(NV_TYPE_STRING, (uint64_t)(uintptr_t)data, size,
- namefmt, nameap);
+ nvp = nvpair_allocv(name, NV_TYPE_STRING, (uint64_t)(uintptr_t)data,
+ size);
if (nvp == NULL)
nv_free(data);
@@ -972,14 +821,13 @@ nvpair_createv_string(const char *value, const char *namefmt, va_list nameap)
}
nvpair_t *
-nvpair_createv_nvlist(const nvlist_t *value, const char *namefmt,
- va_list nameap)
+nvpair_create_nvlist(const char *name, const nvlist_t *value)
{
nvlist_t *nvl;
nvpair_t *nvp;
if (value == NULL) {
- RESTORE_ERRNO(EINVAL);
+ ERRNO_SET(EINVAL);
return (NULL);
}
@@ -987,8 +835,7 @@ nvpair_createv_nvlist(const nvlist_t *value, const char *namefmt,
if (nvl == NULL)
return (NULL);
- nvp = nvpair_allocv(NV_TYPE_NVLIST, (uint64_t)(uintptr_t)nvl, 0,
- namefmt, nameap);
+ nvp = nvpair_allocv(name, NV_TYPE_NVLIST, (uint64_t)(uintptr_t)nvl, 0);
if (nvp == NULL)
nvlist_destroy(nvl);
else
@@ -999,12 +846,12 @@ nvpair_createv_nvlist(const nvlist_t *value, const char *namefmt,
#ifndef _KERNEL
nvpair_t *
-nvpair_createv_descriptor(int value, const char *namefmt, va_list nameap)
+nvpair_create_descriptor(const char *name, int value)
{
nvpair_t *nvp;
if (value < 0 || !fd_is_valid(value)) {
- errno = EBADF;
+ ERRNO_SET(EBADF);
return (NULL);
}
@@ -1012,24 +859,26 @@ nvpair_createv_descriptor(int value, const char *namefmt, va_list nameap)
if (value < 0)
return (NULL);
- nvp = nvpair_allocv(NV_TYPE_DESCRIPTOR, (uint64_t)value,
- sizeof(int64_t), namefmt, nameap);
- if (nvp == NULL)
+ nvp = nvpair_allocv(name, NV_TYPE_DESCRIPTOR, (uint64_t)value,
+ sizeof(int64_t));
+ if (nvp == NULL) {
+ ERRNO_SAVE();
close(value);
+ ERRNO_RESTORE();
+ }
return (nvp);
}
#endif
nvpair_t *
-nvpair_createv_binary(const void *value, size_t size, const char *namefmt,
- va_list nameap)
+nvpair_create_binary(const char *name, const void *value, size_t size)
{
nvpair_t *nvp;
void *data;
if (value == NULL || size == 0) {
- RESTORE_ERRNO(EINVAL);
+ ERRNO_SET(EINVAL);
return (NULL);
}
@@ -1038,8 +887,8 @@ nvpair_createv_binary(const void *value, size_t size, const char *namefmt,
return (NULL);
memcpy(data, value, size);
- nvp = nvpair_allocv(NV_TYPE_BINARY, (uint64_t)(uintptr_t)data, size,
- namefmt, nameap);
+ nvp = nvpair_allocv(name, NV_TYPE_BINARY, (uint64_t)(uintptr_t)data,
+ size);
if (nvp == NULL)
nv_free(data);
@@ -1049,127 +898,42 @@ nvpair_createv_binary(const void *value, size_t size, const char *namefmt,
nvpair_t *
nvpair_move_string(const char *name, char *value)
{
-
- return (nvpair_movef_string(value, "%s", name));
-}
-
-nvpair_t *
-nvpair_move_nvlist(const char *name, nvlist_t *value)
-{
-
- return (nvpair_movef_nvlist(value, "%s", name));
-}
-
-#ifndef _KERNEL
-nvpair_t *
-nvpair_move_descriptor(const char *name, int value)
-{
-
- return (nvpair_movef_descriptor(value, "%s", name));
-}
-#endif
-
-nvpair_t *
-nvpair_move_binary(const char *name, void *value, size_t size)
-{
-
- return (nvpair_movef_binary(value, size, "%s", name));
-}
-
-nvpair_t *
-nvpair_movef_string(char *value, const char *namefmt, ...)
-{
- va_list nameap;
- nvpair_t *nvp;
-
- va_start(nameap, namefmt);
- nvp = nvpair_movev_string(value, namefmt, nameap);
- va_end(nameap);
-
- return (nvp);
-}
-
-nvpair_t *
-nvpair_movef_nvlist(nvlist_t *value, const char *namefmt, ...)
-{
- va_list nameap;
- nvpair_t *nvp;
-
- va_start(nameap, namefmt);
- nvp = nvpair_movev_nvlist(value, namefmt, nameap);
- va_end(nameap);
-
- return (nvp);
-}
-
-#ifndef _KERNEL
-nvpair_t *
-nvpair_movef_descriptor(int value, const char *namefmt, ...)
-{
- va_list nameap;
- nvpair_t *nvp;
-
- va_start(nameap, namefmt);
- nvp = nvpair_movev_descriptor(value, namefmt, nameap);
- va_end(nameap);
-
- return (nvp);
-}
-#endif
-
-nvpair_t *
-nvpair_movef_binary(void *value, size_t size, const char *namefmt, ...)
-{
- va_list nameap;
- nvpair_t *nvp;
-
- va_start(nameap, namefmt);
- nvp = nvpair_movev_binary(value, size, namefmt, nameap);
- va_end(nameap);
-
- return (nvp);
-}
-
-nvpair_t *
-nvpair_movev_string(char *value, const char *namefmt, va_list nameap)
-{
nvpair_t *nvp;
- int serrno;
if (value == NULL) {
- RESTORE_ERRNO(EINVAL);
+ ERRNO_SET(EINVAL);
return (NULL);
}
- nvp = nvpair_allocv(NV_TYPE_STRING, (uint64_t)(uintptr_t)value,
- strlen(value) + 1, namefmt, nameap);
+ nvp = nvpair_allocv(name, NV_TYPE_STRING, (uint64_t)(uintptr_t)value,
+ strlen(value) + 1);
if (nvp == NULL) {
- SAVE_ERRNO(serrno);
+ ERRNO_SAVE();
nv_free(value);
- RESTORE_ERRNO(serrno);
+ ERRNO_RESTORE();
}
return (nvp);
}
nvpair_t *
-nvpair_movev_nvlist(nvlist_t *value, const char *namefmt, va_list nameap)
+nvpair_move_nvlist(const char *name, nvlist_t *value)
{
nvpair_t *nvp;
if (value == NULL || nvlist_get_nvpair_parent(value) != NULL) {
- RESTORE_ERRNO(EINVAL);
+ ERRNO_SET(EINVAL);
return (NULL);
}
if (nvlist_error(value) != 0) {
- RESTORE_ERRNO(nvlist_error(value));
+ ERRNO_SET(nvlist_error(value));
nvlist_destroy(value);
return (NULL);
}
- nvp = nvpair_allocv(NV_TYPE_NVLIST, (uint64_t)(uintptr_t)value, 0,
- namefmt, nameap);
+ nvp = nvpair_allocv(name, NV_TYPE_NVLIST, (uint64_t)(uintptr_t)value,
+ 0);
if (nvp == NULL)
nvlist_destroy(value);
else
@@ -1180,22 +944,21 @@ nvpair_movev_nvlist(nvlist_t *value, const char *namefmt, va_list nameap)
#ifndef _KERNEL
nvpair_t *
-nvpair_movev_descriptor(int value, const char *namefmt, va_list nameap)
+nvpair_move_descriptor(const char *name, int value)
{
nvpair_t *nvp;
- int serrno;
if (value < 0 || !fd_is_valid(value)) {
- errno = EBADF;
+ ERRNO_SET(EBADF);
return (NULL);
}
- nvp = nvpair_allocv(NV_TYPE_DESCRIPTOR, (uint64_t)value,
- sizeof(int64_t), namefmt, nameap);
+ nvp = nvpair_allocv(name, NV_TYPE_DESCRIPTOR, (uint64_t)value,
+ sizeof(int64_t));
if (nvp == NULL) {
- serrno = errno;
+ ERRNO_SAVE();
close(value);
- errno = serrno;
+ ERRNO_RESTORE();
}
return (nvp);
@@ -1203,23 +966,21 @@ nvpair_movev_descriptor(int value, const char *namefmt, va_list nameap)
#endif
nvpair_t *
-nvpair_movev_binary(void *value, size_t size, const char *namefmt,
- va_list nameap)
+nvpair_move_binary(const char *name, void *value, size_t size)
{
nvpair_t *nvp;
- int serrno;
if (value == NULL || size == 0) {
- RESTORE_ERRNO(EINVAL);
+ ERRNO_SET(EINVAL);
return (NULL);
}
- nvp = nvpair_allocv(NV_TYPE_BINARY, (uint64_t)(uintptr_t)value, size,
- namefmt, nameap);
+ nvp = nvpair_allocv(name, NV_TYPE_BINARY, (uint64_t)(uintptr_t)value,
+ size);
if (nvp == NULL) {
- SAVE_ERRNO(serrno);
+ ERRNO_SAVE();
nv_free(value);
- RESTORE_ERRNO(serrno);
+ ERRNO_RESTORE();
}
return (nvp);
@@ -1348,3 +1109,4 @@ nvpair_type_string(int type)
return ("<UNKNOWN>");
}
}
+
diff --git a/sys/kern/subr_param.c b/sys/kern/subr_param.c
index f662ec2..cba656a 100644
--- a/sys/kern/subr_param.c
+++ b/sys/kern/subr_param.c
@@ -99,11 +99,7 @@ pid_t pid_max = PID_MAX;
long maxswzone; /* max swmeta KVA storage */
long maxbcache; /* max buffer cache KVA storage */
long maxpipekva; /* Limit on pipe KVA */
-#ifdef XEN
-int vm_guest = VM_GUEST_XEN;
-#else
int vm_guest = VM_GUEST_NO; /* Running as virtual machine guest? */
-#endif
u_long maxtsiz; /* max text size */
u_long dfldsiz; /* initial data size limit */
u_long maxdsiz; /* max data size */
diff --git a/sys/kern/subr_prf.c b/sys/kern/subr_prf.c
index 7e6fd09..6509522 100644
--- a/sys/kern/subr_prf.c
+++ b/sys/kern/subr_prf.c
@@ -295,7 +295,7 @@ log(int level, const char *fmt, ...)
va_list ap;
va_start(ap, fmt);
- (void)_vprintf(level, log_open ? TOLOG : TOCONS, fmt, ap);
+ (void)_vprintf(level, log_open ? TOLOG : TOCONS | TOLOG, fmt, ap);
va_end(ap);
msgbuftrigger = 1;
diff --git a/sys/kern/subr_trap.c b/sys/kern/subr_trap.c
index cfc3ed7..93f7557 100644
--- a/sys/kern/subr_trap.c
+++ b/sys/kern/subr_trap.c
@@ -59,6 +59,7 @@ __FBSDID("$FreeBSD$");
#include <sys/ktr.h>
#include <sys/pioctl.h>
#include <sys/ptrace.h>
+#include <sys/racct.h>
#include <sys/resourcevar.h>
#include <sys/sched.h>
#include <sys/signalvar.h>
@@ -79,12 +80,6 @@ __FBSDID("$FreeBSD$");
#include <net/vnet.h>
#endif
-#ifdef XEN
-#include <vm/vm.h>
-#include <vm/vm_param.h>
-#include <vm/pmap.h>
-#endif
-
#ifdef HWPMC_HOOKS
#include <sys/pmckern.h>
#endif
@@ -135,9 +130,6 @@ userret(struct thread *td, struct trapframe *frame)
* Let the scheduler adjust our priority etc.
*/
sched_userret(td);
-#ifdef XEN
- PT_UPDATES_FLUSH();
-#endif
/*
* Check for misbehavior.
@@ -172,11 +164,13 @@ userret(struct thread *td, struct trapframe *frame)
__func__, td, p->p_pid, td->td_name, curvnet,
(td->td_vnet_lpush != NULL) ? td->td_vnet_lpush : "N/A"));
#endif
-#ifdef RACCT
- PROC_LOCK(p);
- while (p->p_throttled == 1)
- msleep(p->p_racct, &p->p_mtx, 0, "racct", 0);
- PROC_UNLOCK(p);
+#ifdef RACCT
+ if (racct_enable) {
+ PROC_LOCK(p);
+ while (p->p_throttled == 1)
+ msleep(p->p_racct, &p->p_mtx, 0, "racct", 0);
+ PROC_UNLOCK(p);
+ }
#endif
}
diff --git a/sys/kern/subr_vmem.c b/sys/kern/subr_vmem.c
index 47e583b..80940be 100644
--- a/sys/kern/subr_vmem.c
+++ b/sys/kern/subr_vmem.c
@@ -1330,12 +1330,15 @@ vmem_size(vmem_t *vm, int typemask)
case VMEM_FREE|VMEM_ALLOC:
return vm->vm_size;
case VMEM_MAXFREE:
+ VMEM_LOCK(vm);
for (i = VMEM_MAXORDER - 1; i >= 0; i--) {
if (LIST_EMPTY(&vm->vm_freelist[i]))
continue;
+ VMEM_UNLOCK(vm);
return ((vmem_size_t)ORDER2SIZE(i) <<
vm->vm_quantum_shift);
}
+ VMEM_UNLOCK(vm);
return (0);
default:
panic("vmem_size");
diff --git a/sys/kern/sys_generic.c b/sys/kern/sys_generic.c
index 8fc1db9..213801a 100644
--- a/sys/kern/sys_generic.c
+++ b/sys/kern/sys_generic.c
@@ -219,6 +219,7 @@ sys_pread(td, uap)
return(error);
}
+#if defined(COMPAT_FREEBSD6)
int
freebsd6_pread(td, uap)
struct thread *td;
@@ -232,6 +233,7 @@ freebsd6_pread(td, uap)
oargs.offset = uap->offset;
return (sys_pread(td, &oargs));
}
+#endif
/*
* Scatter read system call.
@@ -430,6 +432,7 @@ sys_pwrite(td, uap)
return(error);
}
+#if defined(COMPAT_FREEBSD6)
int
freebsd6_pwrite(td, uap)
struct thread *td;
@@ -443,6 +446,7 @@ freebsd6_pwrite(td, uap)
oargs.offset = uap->offset;
return (sys_pwrite(td, &oargs));
}
+#endif
/*
* Gather write system call.
diff --git a/sys/kern/sys_pipe.c b/sys/kern/sys_pipe.c
index fa06784..06a4d5a 100644
--- a/sys/kern/sys_pipe.c
+++ b/sys/kern/sys_pipe.c
@@ -406,13 +406,11 @@ kern_pipe(struct thread *td, int fildes[2])
int
kern_pipe2(struct thread *td, int fildes[2], int flags)
{
- struct filedesc *fdp;
struct file *rf, *wf;
struct pipe *rpipe, *wpipe;
struct pipepair *pp;
int fd, fflags, error;
- fdp = td->td_proc->p_fd;
pipe_paircreate(td, &pp);
rpipe = &pp->pp_rpipe;
wpipe = &pp->pp_wpipe;
@@ -438,7 +436,7 @@ kern_pipe2(struct thread *td, int fildes[2], int flags)
finit(rf, fflags, DTYPE_PIPE, rpipe, &pipeops);
error = falloc(td, &wf, &fd, flags);
if (error) {
- fdclose(fdp, rf, fildes[0], td);
+ fdclose(td, rf, fildes[0]);
fdrop(rf, td);
/* rpipe has been closed by fdrop(). */
pipeclose(wpipe);
diff --git a/sys/kern/syscalls.c b/sys/kern/syscalls.c
index e99ae94..a404c51 100644
--- a/sys/kern/syscalls.c
+++ b/sys/kern/syscalls.c
@@ -3,7 +3,7 @@
*
* DO NOT EDIT-- this file is automatically generated.
* $FreeBSD$
- * created from FreeBSD: head/sys/kern/syscalls.master 277610 2015-01-23 21:07:08Z jilles
+ * created from FreeBSD: head/sys/kern/syscalls.master 281714 2015-04-18 21:50:13Z kib
*/
const char *syscallnames[] = {
@@ -180,8 +180,8 @@ const char *syscallnames[] = {
"msgsys", /* 170 = msgsys */
"shmsys", /* 171 = shmsys */
"#172", /* 172 = nosys */
- "freebsd6_pread", /* 173 = freebsd6_pread */
- "freebsd6_pwrite", /* 174 = freebsd6_pwrite */
+ "compat6.pread", /* 173 = freebsd6 pread */
+ "compat6.pwrite", /* 174 = freebsd6 pwrite */
"setfib", /* 175 = setfib */
"ntp_adjtime", /* 176 = ntp_adjtime */
"#177", /* 177 = sfork */
@@ -204,11 +204,11 @@ const char *syscallnames[] = {
"getrlimit", /* 194 = getrlimit */
"setrlimit", /* 195 = setrlimit */
"getdirentries", /* 196 = getdirentries */
- "freebsd6_mmap", /* 197 = freebsd6_mmap */
+ "compat6.mmap", /* 197 = freebsd6 mmap */
"__syscall", /* 198 = __syscall */
- "freebsd6_lseek", /* 199 = freebsd6_lseek */
- "freebsd6_truncate", /* 200 = freebsd6_truncate */
- "freebsd6_ftruncate", /* 201 = freebsd6_ftruncate */
+ "compat6.lseek", /* 199 = freebsd6 lseek */
+ "compat6.truncate", /* 200 = freebsd6 truncate */
+ "compat6.ftruncate", /* 201 = freebsd6 ftruncate */
"__sysctl", /* 202 = __sysctl */
"mlock", /* 203 = mlock */
"munlock", /* 204 = munlock */
diff --git a/sys/kern/syscalls.master b/sys/kern/syscalls.master
index 09d38d4..9873868 100644
--- a/sys/kern/syscalls.master
+++ b/sys/kern/syscalls.master
@@ -342,9 +342,9 @@
int a4); }
; XXX should be { int shmsys(int which, ...); }
172 AUE_NULL UNIMPL nosys
-173 AUE_PREAD STD { ssize_t freebsd6_pread(int fd, void *buf, \
+173 AUE_PREAD COMPAT6 { ssize_t pread(int fd, void *buf, \
size_t nbyte, int pad, off_t offset); }
-174 AUE_PWRITE STD { ssize_t freebsd6_pwrite(int fd, \
+174 AUE_PWRITE COMPAT6 { ssize_t pwrite(int fd, \
const void *buf, \
size_t nbyte, int pad, off_t offset); }
175 AUE_NULL STD { int setfib(int fibnum); }
@@ -376,16 +376,16 @@
__setrlimit_args int
196 AUE_GETDIRENTRIES STD { int getdirentries(int fd, char *buf, \
u_int count, long *basep); }
-197 AUE_MMAP STD { caddr_t freebsd6_mmap(caddr_t addr, \
+197 AUE_MMAP COMPAT6 { caddr_t mmap(caddr_t addr, \
size_t len, int prot, int flags, int fd, \
int pad, off_t pos); }
198 AUE_NULL NOPROTO { int nosys(void); } __syscall \
__syscall_args int
-199 AUE_LSEEK STD { off_t freebsd6_lseek(int fd, int pad, \
+199 AUE_LSEEK COMPAT6 { off_t lseek(int fd, int pad, \
off_t offset, int whence); }
-200 AUE_TRUNCATE STD { int freebsd6_truncate(char *path, int pad, \
+200 AUE_TRUNCATE COMPAT6 { int truncate(char *path, int pad, \
off_t length); }
-201 AUE_FTRUNCATE STD { int freebsd6_ftruncate(int fd, int pad, \
+201 AUE_FTRUNCATE COMPAT6 { int ftruncate(int fd, int pad, \
off_t length); }
202 AUE_SYSCTL STD { int __sysctl(int *name, u_int namelen, \
void *old, size_t *oldlenp, void *new, \
diff --git a/sys/kern/systrace_args.c b/sys/kern/systrace_args.c
index c5d3b85..a06d7dc 100644
--- a/sys/kern/systrace_args.c
+++ b/sys/kern/systrace_args.c
@@ -914,28 +914,6 @@ systrace_args(int sysnum, void *params, uint64_t *uarg, int *n_args)
*n_args = 4;
break;
}
- /* freebsd6_pread */
- case 173: {
- struct freebsd6_pread_args *p = params;
- iarg[0] = p->fd; /* int */
- uarg[1] = (intptr_t) p->buf; /* void * */
- uarg[2] = p->nbyte; /* size_t */
- iarg[3] = p->pad; /* int */
- iarg[4] = p->offset; /* off_t */
- *n_args = 5;
- break;
- }
- /* freebsd6_pwrite */
- case 174: {
- struct freebsd6_pwrite_args *p = params;
- iarg[0] = p->fd; /* int */
- uarg[1] = (intptr_t) p->buf; /* const void * */
- uarg[2] = p->nbyte; /* size_t */
- iarg[3] = p->pad; /* int */
- iarg[4] = p->offset; /* off_t */
- *n_args = 5;
- break;
- }
/* setfib */
case 175: {
struct setfib_args *p = params;
@@ -1037,52 +1015,11 @@ systrace_args(int sysnum, void *params, uint64_t *uarg, int *n_args)
*n_args = 4;
break;
}
- /* freebsd6_mmap */
- case 197: {
- struct freebsd6_mmap_args *p = params;
- uarg[0] = (intptr_t) p->addr; /* caddr_t */
- uarg[1] = p->len; /* size_t */
- iarg[2] = p->prot; /* int */
- iarg[3] = p->flags; /* int */
- iarg[4] = p->fd; /* int */
- iarg[5] = p->pad; /* int */
- iarg[6] = p->pos; /* off_t */
- *n_args = 7;
- break;
- }
/* nosys */
case 198: {
*n_args = 0;
break;
}
- /* freebsd6_lseek */
- case 199: {
- struct freebsd6_lseek_args *p = params;
- iarg[0] = p->fd; /* int */
- iarg[1] = p->pad; /* int */
- iarg[2] = p->offset; /* off_t */
- iarg[3] = p->whence; /* int */
- *n_args = 4;
- break;
- }
- /* freebsd6_truncate */
- case 200: {
- struct freebsd6_truncate_args *p = params;
- uarg[0] = (intptr_t) p->path; /* char * */
- iarg[1] = p->pad; /* int */
- iarg[2] = p->length; /* off_t */
- *n_args = 3;
- break;
- }
- /* freebsd6_ftruncate */
- case 201: {
- struct freebsd6_ftruncate_args *p = params;
- iarg[0] = p->fd; /* int */
- iarg[1] = p->pad; /* int */
- iarg[2] = p->length; /* off_t */
- *n_args = 3;
- break;
- }
/* __sysctl */
case 202: {
struct sysctl_args *p = params;
@@ -4873,50 +4810,6 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *desc, size_t descsz)
break;
};
break;
- /* freebsd6_pread */
- case 173:
- switch(ndx) {
- case 0:
- p = "int";
- break;
- case 1:
- p = "void *";
- break;
- case 2:
- p = "size_t";
- break;
- case 3:
- p = "int";
- break;
- case 4:
- p = "off_t";
- break;
- default:
- break;
- };
- break;
- /* freebsd6_pwrite */
- case 174:
- switch(ndx) {
- case 0:
- p = "int";
- break;
- case 1:
- p = "const void *";
- break;
- case 2:
- p = "size_t";
- break;
- case 3:
- p = "int";
- break;
- case 4:
- p = "off_t";
- break;
- default:
- break;
- };
- break;
/* setfib */
case 175:
switch(ndx) {
@@ -5077,88 +4970,9 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *desc, size_t descsz)
break;
};
break;
- /* freebsd6_mmap */
- case 197:
- switch(ndx) {
- case 0:
- p = "caddr_t";
- break;
- case 1:
- p = "size_t";
- break;
- case 2:
- p = "int";
- break;
- case 3:
- p = "int";
- break;
- case 4:
- p = "int";
- break;
- case 5:
- p = "int";
- break;
- case 6:
- p = "off_t";
- break;
- default:
- break;
- };
- break;
/* nosys */
case 198:
break;
- /* freebsd6_lseek */
- case 199:
- switch(ndx) {
- case 0:
- p = "int";
- break;
- case 1:
- p = "int";
- break;
- case 2:
- p = "off_t";
- break;
- case 3:
- p = "int";
- break;
- default:
- break;
- };
- break;
- /* freebsd6_truncate */
- case 200:
- switch(ndx) {
- case 0:
- p = "char *";
- break;
- case 1:
- p = "int";
- break;
- case 2:
- p = "off_t";
- break;
- default:
- break;
- };
- break;
- /* freebsd6_ftruncate */
- case 201:
- switch(ndx) {
- case 0:
- p = "int";
- break;
- case 1:
- p = "int";
- break;
- case 2:
- p = "off_t";
- break;
- default:
- break;
- };
- break;
/* __sysctl */
case 202:
switch(ndx) {
@@ -9598,16 +9412,6 @@ systrace_return_setargdesc(int sysnum, int ndx, char *desc, size_t descsz)
if (ndx == 0 || ndx == 1)
p = "int";
break;
- /* freebsd6_pread */
- case 173:
- if (ndx == 0 || ndx == 1)
- p = "ssize_t";
- break;
- /* freebsd6_pwrite */
- case 174:
- if (ndx == 0 || ndx == 1)
- p = "ssize_t";
- break;
/* setfib */
case 175:
if (ndx == 0 || ndx == 1)
@@ -9673,28 +9477,8 @@ systrace_return_setargdesc(int sysnum, int ndx, char *desc, size_t descsz)
if (ndx == 0 || ndx == 1)
p = "int";
break;
- /* freebsd6_mmap */
- case 197:
- if (ndx == 0 || ndx == 1)
- p = "caddr_t";
- break;
/* nosys */
case 198:
- /* freebsd6_lseek */
- case 199:
- if (ndx == 0 || ndx == 1)
- p = "off_t";
- break;
- /* freebsd6_truncate */
- case 200:
- if (ndx == 0 || ndx == 1)
- p = "int";
- break;
- /* freebsd6_ftruncate */
- case 201:
- if (ndx == 0 || ndx == 1)
- p = "int";
- break;
/* __sysctl */
case 202:
if (ndx == 0 || ndx == 1)
diff --git a/sys/kern/sysv_msg.c b/sys/kern/sysv_msg.c
index acc44710..59357c4 100644
--- a/sys/kern/sysv_msg.c
+++ b/sys/kern/sysv_msg.c
@@ -617,12 +617,14 @@ sys_msgget(td, uap)
goto done2;
}
#ifdef RACCT
- PROC_LOCK(td->td_proc);
- error = racct_add(td->td_proc, RACCT_NMSGQ, 1);
- PROC_UNLOCK(td->td_proc);
- if (error != 0) {
- error = ENOSPC;
- goto done2;
+ if (racct_enable) {
+ PROC_LOCK(td->td_proc);
+ error = racct_add(td->td_proc, RACCT_NMSGQ, 1);
+ PROC_UNLOCK(td->td_proc);
+ if (error != 0) {
+ error = ENOSPC;
+ goto done2;
+ }
}
#endif
DPRINTF(("msqid %d is available\n", msqid));
@@ -724,20 +726,22 @@ kern_msgsnd(td, msqid, msgp, msgsz, msgflg, mtype)
#endif
#ifdef RACCT
- PROC_LOCK(td->td_proc);
- if (racct_add(td->td_proc, RACCT_MSGQQUEUED, 1)) {
- PROC_UNLOCK(td->td_proc);
- error = EAGAIN;
- goto done2;
- }
- saved_msgsz = msgsz;
- if (racct_add(td->td_proc, RACCT_MSGQSIZE, msgsz)) {
- racct_sub(td->td_proc, RACCT_MSGQQUEUED, 1);
+ if (racct_enable) {
+ PROC_LOCK(td->td_proc);
+ if (racct_add(td->td_proc, RACCT_MSGQQUEUED, 1)) {
+ PROC_UNLOCK(td->td_proc);
+ error = EAGAIN;
+ goto done2;
+ }
+ saved_msgsz = msgsz;
+ if (racct_add(td->td_proc, RACCT_MSGQSIZE, msgsz)) {
+ racct_sub(td->td_proc, RACCT_MSGQQUEUED, 1);
+ PROC_UNLOCK(td->td_proc);
+ error = EAGAIN;
+ goto done2;
+ }
PROC_UNLOCK(td->td_proc);
- error = EAGAIN;
- goto done2;
}
- PROC_UNLOCK(td->td_proc);
#endif
segs_needed = (msgsz + msginfo.msgssz - 1) / msginfo.msgssz;
@@ -994,7 +998,7 @@ kern_msgsnd(td, msqid, msgp, msgsz, msgflg, mtype)
td->td_retval[0] = 0;
done3:
#ifdef RACCT
- if (error != 0) {
+ if (racct_enable && error != 0) {
PROC_LOCK(td->td_proc);
racct_sub(td->td_proc, RACCT_MSGQQUEUED, 1);
racct_sub(td->td_proc, RACCT_MSGQSIZE, saved_msgsz);
diff --git a/sys/kern/sysv_sem.c b/sys/kern/sysv_sem.c
index 6ff5789..d9324f4 100644
--- a/sys/kern/sysv_sem.c
+++ b/sys/kern/sysv_sem.c
@@ -915,12 +915,14 @@ sys_semget(struct thread *td, struct semget_args *uap)
goto done2;
}
#ifdef RACCT
- PROC_LOCK(td->td_proc);
- error = racct_add(td->td_proc, RACCT_NSEM, nsems);
- PROC_UNLOCK(td->td_proc);
- if (error != 0) {
- error = ENOSPC;
- goto done2;
+ if (racct_enable) {
+ PROC_LOCK(td->td_proc);
+ error = racct_add(td->td_proc, RACCT_NSEM, nsems);
+ PROC_UNLOCK(td->td_proc);
+ if (error != 0) {
+ error = ENOSPC;
+ goto done2;
+ }
}
#endif
DPRINTF(("semid %d is available\n", semid));
@@ -1009,12 +1011,15 @@ sys_semop(struct thread *td, struct semop_args *uap)
return (E2BIG);
} else {
#ifdef RACCT
- PROC_LOCK(td->td_proc);
- if (nsops > racct_get_available(td->td_proc, RACCT_NSEMOP)) {
+ if (racct_enable) {
+ PROC_LOCK(td->td_proc);
+ if (nsops >
+ racct_get_available(td->td_proc, RACCT_NSEMOP)) {
+ PROC_UNLOCK(td->td_proc);
+ return (E2BIG);
+ }
PROC_UNLOCK(td->td_proc);
- return (E2BIG);
}
- PROC_UNLOCK(td->td_proc);
#endif
sops = malloc(nsops * sizeof(*sops), M_TEMP, M_WAITOK);
diff --git a/sys/kern/sysv_shm.c b/sys/kern/sysv_shm.c
index 5f3e00e..3240a5f 100644
--- a/sys/kern/sysv_shm.c
+++ b/sys/kern/sysv_shm.c
@@ -327,7 +327,7 @@ kern_shmat_locked(struct thread *td, int shmid, const void *shmaddr,
{
struct proc *p = td->td_proc;
struct shmid_kernel *shmseg;
- struct shmmap_state *shmmap_s = NULL;
+ struct shmmap_state *shmmap_s;
vm_offset_t attach_va;
vm_prot_t prot;
vm_size_t size;
@@ -651,17 +651,19 @@ shmget_allocate_segment(struct thread *td, struct shmget_args *uap, int mode)
("segnum %d shmalloced %d", segnum, shmalloced));
shmseg = &shmsegs[segnum];
#ifdef RACCT
- PROC_LOCK(td->td_proc);
- if (racct_add(td->td_proc, RACCT_NSHM, 1)) {
- PROC_UNLOCK(td->td_proc);
- return (ENOSPC);
- }
- if (racct_add(td->td_proc, RACCT_SHMSIZE, size)) {
- racct_sub(td->td_proc, RACCT_NSHM, 1);
+ if (racct_enable) {
+ PROC_LOCK(td->td_proc);
+ if (racct_add(td->td_proc, RACCT_NSHM, 1)) {
+ PROC_UNLOCK(td->td_proc);
+ return (ENOSPC);
+ }
+ if (racct_add(td->td_proc, RACCT_SHMSIZE, size)) {
+ racct_sub(td->td_proc, RACCT_NSHM, 1);
+ PROC_UNLOCK(td->td_proc);
+ return (ENOMEM);
+ }
PROC_UNLOCK(td->td_proc);
- return (ENOMEM);
}
- PROC_UNLOCK(td->td_proc);
#endif
/*
@@ -672,10 +674,12 @@ shmget_allocate_segment(struct thread *td, struct shmget_args *uap, int mode)
0, size, VM_PROT_DEFAULT, 0, cred);
if (shm_object == NULL) {
#ifdef RACCT
- PROC_LOCK(td->td_proc);
- racct_sub(td->td_proc, RACCT_NSHM, 1);
- racct_sub(td->td_proc, RACCT_SHMSIZE, size);
- PROC_UNLOCK(td->td_proc);
+ if (racct_enable) {
+ PROC_LOCK(td->td_proc);
+ racct_sub(td->td_proc, RACCT_NSHM, 1);
+ racct_sub(td->td_proc, RACCT_SHMSIZE, size);
+ PROC_UNLOCK(td->td_proc);
+ }
#endif
return (ENOMEM);
}
@@ -961,39 +965,39 @@ oshmctl(struct thread *td, struct oshmctl_args *uap)
if (!prison_allow(td->td_ucred, PR_ALLOW_SYSVIPC))
return (ENOSYS);
+ if (uap->cmd != IPC_STAT) {
+ return (freebsd7_shmctl(td,
+ (struct freebsd7_shmctl_args *)uap));
+ }
SYSVSHM_LOCK();
shmseg = shm_find_segment(uap->shmid, true);
if (shmseg == NULL) {
SYSVSHM_UNLOCK();
+ return (EINVAL);
+ }
+ error = ipcperm(td, &shmseg->u.shm_perm, IPC_R);
+ if (error != 0) {
+ SYSVSHM_UNLOCK();
return (error);
}
- switch (uap->cmd) {
- case IPC_STAT:
- error = ipcperm(td, &shmseg->u.shm_perm, IPC_R);
- if (error != 0)
- break;
#ifdef MAC
- error = mac_sysvshm_check_shmctl(td->td_ucred, shmseg,
- uap->cmd);
- if (error != 0)
- break;
-#endif
- ipcperm_new2old(&shmseg->u.shm_perm, &outbuf.shm_perm);
- outbuf.shm_segsz = shmseg->u.shm_segsz;
- outbuf.shm_cpid = shmseg->u.shm_cpid;
- outbuf.shm_lpid = shmseg->u.shm_lpid;
- outbuf.shm_nattch = shmseg->u.shm_nattch;
- outbuf.shm_atime = shmseg->u.shm_atime;
- outbuf.shm_dtime = shmseg->u.shm_dtime;
- outbuf.shm_ctime = shmseg->u.shm_ctime;
- outbuf.shm_handle = shmseg->object;
- error = copyout(&outbuf, uap->ubuf, sizeof(outbuf));
- break;
- default:
- error = freebsd7_shmctl(td, (struct freebsd7_shmctl_args *)uap);
- break;
+ error = mac_sysvshm_check_shmctl(td->td_ucred, shmseg, uap->cmd);
+ if (error != 0) {
+ SYSVSHM_UNLOCK();
+ return (error);
}
+#endif
+ ipcperm_new2old(&shmseg->u.shm_perm, &outbuf.shm_perm);
+ outbuf.shm_segsz = shmseg->u.shm_segsz;
+ outbuf.shm_cpid = shmseg->u.shm_cpid;
+ outbuf.shm_lpid = shmseg->u.shm_lpid;
+ outbuf.shm_nattch = shmseg->u.shm_nattch;
+ outbuf.shm_atime = shmseg->u.shm_atime;
+ outbuf.shm_dtime = shmseg->u.shm_dtime;
+ outbuf.shm_ctime = shmseg->u.shm_ctime;
+ outbuf.shm_handle = shmseg->object;
SYSVSHM_UNLOCK();
+ error = copyout(&outbuf, uap->ubuf, sizeof(outbuf));
return (error);
#else
return (EINVAL);
@@ -1025,9 +1029,7 @@ sys_shmsys(struct thread *td, struct shmsys_args *uap)
return (ENOSYS);
if (uap->which < 0 || uap->which >= nitems(shmcalls))
return (EINVAL);
- SYSVSHM_LOCK();
error = (*shmcalls[uap->which])(td, &uap->a2);
- SYSVSHM_UNLOCK();
return (error);
}
diff --git a/sys/kern/tty_pts.c b/sys/kern/tty_pts.c
index 0833362..2d1e8fe 100644
--- a/sys/kern/tty_pts.c
+++ b/sys/kern/tty_pts.c
@@ -845,7 +845,7 @@ sys_posix_openpt(struct thread *td, struct posix_openpt_args *uap)
/* Allocate the actual pseudo-TTY. */
error = pts_alloc(FFLAGS(uap->flags & O_ACCMODE), td, fp);
if (error != 0) {
- fdclose(td->td_proc->p_fd, fp, fd, td);
+ fdclose(td, fp, fd);
fdrop(fp, td);
return (error);
}
diff --git a/sys/kern/uipc_mqueue.c b/sys/kern/uipc_mqueue.c
index e3fb149..0589f4a 100644
--- a/sys/kern/uipc_mqueue.c
+++ b/sys/kern/uipc_mqueue.c
@@ -2022,7 +2022,7 @@ kern_kmq_open(struct thread *td, const char *upath, int flags, mode_t mode,
if (error) {
sx_xunlock(&mqfs_data.mi_lock);
- fdclose(fdp, fp, fd, td);
+ fdclose(td, fp, fd);
fdrop(fp, td);
return (error);
}
diff --git a/sys/kern/uipc_sem.c b/sys/kern/uipc_sem.c
index 935a245..dbfa28a 100644
--- a/sys/kern/uipc_sem.c
+++ b/sys/kern/uipc_sem.c
@@ -471,7 +471,7 @@ ksem_create(struct thread *td, const char *name, semid_t *semidp, mode_t mode,
*/
error = ksem_create_copyout_semid(td, semidp, fd, compat32);
if (error) {
- fdclose(fdp, fp, fd, td);
+ fdclose(td, fp, fd);
fdrop(fp, td);
return (error);
}
@@ -491,7 +491,7 @@ ksem_create(struct thread *td, const char *name, semid_t *semidp, mode_t mode,
if (error == 0 && path[0] != '/')
error = EINVAL;
if (error) {
- fdclose(fdp, fp, fd, td);
+ fdclose(td, fp, fd);
fdrop(fp, td);
free(path, M_KSEM);
return (error);
@@ -542,7 +542,7 @@ ksem_create(struct thread *td, const char *name, semid_t *semidp, mode_t mode,
if (error) {
KASSERT(ks == NULL, ("ksem_create error with a ksem"));
- fdclose(fdp, fp, fd, td);
+ fdclose(td, fp, fd);
fdrop(fp, td);
return (error);
}
diff --git a/sys/kern/uipc_shm.c b/sys/kern/uipc_shm.c
index 1df89ad..93c7ed1 100644
--- a/sys/kern/uipc_shm.c
+++ b/sys/kern/uipc_shm.c
@@ -163,6 +163,17 @@ uiomove_object_page(vm_object_t obj, size_t len, struct uio *uio)
VM_OBJECT_WLOCK(obj);
/*
+ * Read I/O without either a corresponding resident page or swap
+ * page: use zero_region. This is intended to avoid instantiating
+ * pages on read from a sparse region.
+ */
+ if (uio->uio_rw == UIO_READ && vm_page_lookup(obj, idx) == NULL &&
+ !vm_pager_has_page(obj, idx, NULL, NULL)) {
+ VM_OBJECT_WUNLOCK(obj);
+ return (uiomove(__DECONST(void *, zero_region), tlen, uio));
+ }
+
+ /*
* Parallel reads of the page content from disk are prevented
* by exclusive busy.
*
@@ -718,7 +729,7 @@ sys_shm_open(struct thread *td, struct shm_open_args *uap)
if (uap->path == SHM_ANON) {
/* A read-only anonymous object is pointless. */
if ((uap->flags & O_ACCMODE) == O_RDONLY) {
- fdclose(fdp, fp, fd, td);
+ fdclose(td, fp, fd);
fdrop(fp, td);
return (EINVAL);
}
@@ -734,7 +745,7 @@ sys_shm_open(struct thread *td, struct shm_open_args *uap)
if (error == 0 && path[0] != '/')
error = EINVAL;
if (error) {
- fdclose(fdp, fp, fd, td);
+ fdclose(td, fp, fd);
fdrop(fp, td);
free(path, M_SHMFD);
return (error);
@@ -800,7 +811,7 @@ sys_shm_open(struct thread *td, struct shm_open_args *uap)
sx_xunlock(&shm_dict_lock);
if (error) {
- fdclose(fdp, fp, fd, td);
+ fdclose(td, fp, fd);
fdrop(fp, td);
return (error);
}
diff --git a/sys/kern/uipc_syscalls.c b/sys/kern/uipc_syscalls.c
index a326a02..1efe3da 100644
--- a/sys/kern/uipc_syscalls.c
+++ b/sys/kern/uipc_syscalls.c
@@ -150,17 +150,17 @@ SYSCTL_PROC(_kern_ipc, OID_AUTO, sfstat, CTLTYPE_OPAQUE | CTLFLAG_RW,
* A reference on the file entry is held upon returning.
*/
int
-getsock_cap(struct filedesc *fdp, int fd, cap_rights_t *rightsp,
+getsock_cap(struct thread *td, int fd, cap_rights_t *rightsp,
struct file **fpp, u_int *fflagp)
{
struct file *fp;
int error;
- error = fget_unlocked(fdp, fd, rightsp, &fp, NULL);
+ error = fget_unlocked(td->td_proc->p_fd, fd, rightsp, &fp, NULL);
if (error != 0)
return (error);
if (fp->f_type != DTYPE_SOCKET) {
- fdrop(fp, curthread);
+ fdrop(fp, td);
return (ENOTSOCK);
}
if (fflagp != NULL)
@@ -216,7 +216,7 @@ sys_socket(td, uap)
error = socreate(uap->domain, &so, type, uap->protocol,
td->td_ucred, td);
if (error != 0) {
- fdclose(td->td_proc->p_fd, fp, fd, td);
+ fdclose(td, fp, fd);
} else {
finit(fp, FREAD | FWRITE | fflag, DTYPE_SOCKET, so, &socketops);
if ((fflag & FNONBLOCK) != 0)
@@ -258,8 +258,8 @@ kern_bindat(struct thread *td, int dirfd, int fd, struct sockaddr *sa)
AUDIT_ARG_FD(fd);
AUDIT_ARG_SOCKADDR(td, dirfd, sa);
- error = getsock_cap(td->td_proc->p_fd, fd,
- cap_rights_init(&rights, CAP_BIND), &fp, NULL);
+ error = getsock_cap(td, fd, cap_rights_init(&rights, CAP_BIND),
+ &fp, NULL);
if (error != 0)
return (error);
so = fp->f_data;
@@ -319,8 +319,8 @@ sys_listen(td, uap)
int error;
AUDIT_ARG_FD(uap->s);
- error = getsock_cap(td->td_proc->p_fd, uap->s,
- cap_rights_init(&rights, CAP_LISTEN), &fp, NULL);
+ error = getsock_cap(td, uap->s, cap_rights_init(&rights, CAP_LISTEN),
+ &fp, NULL);
if (error == 0) {
so = fp->f_data;
#ifdef MAC
@@ -373,7 +373,7 @@ accept1(td, s, uname, anamelen, flags)
error = copyout(&namelen, anamelen,
sizeof(namelen));
if (error != 0)
- fdclose(td->td_proc->p_fd, fp, td->td_retval[0], td);
+ fdclose(td, fp, td->td_retval[0]);
fdrop(fp, td);
free(name, M_SONAME);
return (error);
@@ -390,7 +390,6 @@ int
kern_accept4(struct thread *td, int s, struct sockaddr **name,
socklen_t *namelen, int flags, struct file **fp)
{
- struct filedesc *fdp;
struct file *headfp, *nfp = NULL;
struct sockaddr *sa = NULL;
struct socket *head, *so;
@@ -403,8 +402,7 @@ kern_accept4(struct thread *td, int s, struct sockaddr **name,
*name = NULL;
AUDIT_ARG_FD(s);
- fdp = td->td_proc->p_fd;
- error = getsock_cap(fdp, s, cap_rights_init(&rights, CAP_ACCEPT),
+ error = getsock_cap(td, s, cap_rights_init(&rights, CAP_ACCEPT),
&headfp, &fflag);
if (error != 0)
return (error);
@@ -520,7 +518,7 @@ noconnection:
* out from under us.
*/
if (error != 0)
- fdclose(fdp, nfp, fd, td);
+ fdclose(td, nfp, fd);
/*
* Release explicitly held references before returning. We return
@@ -604,8 +602,8 @@ kern_connectat(struct thread *td, int dirfd, int fd, struct sockaddr *sa)
AUDIT_ARG_FD(fd);
AUDIT_ARG_SOCKADDR(td, dirfd, sa);
- error = getsock_cap(td->td_proc->p_fd, fd,
- cap_rights_init(&rights, CAP_CONNECT), &fp, NULL);
+ error = getsock_cap(td, fd, cap_rights_init(&rights, CAP_CONNECT),
+ &fp, NULL);
if (error != 0)
return (error);
so = fp->f_data;
@@ -683,7 +681,6 @@ int
kern_socketpair(struct thread *td, int domain, int type, int protocol,
int *rsv)
{
- struct filedesc *fdp = td->td_proc->p_fd;
struct file *fp1, *fp2;
struct socket *so1, *so2;
int fd, error, oflag, fflag;
@@ -747,10 +744,10 @@ kern_socketpair(struct thread *td, int domain, int type, int protocol,
fdrop(fp2, td);
return (0);
free4:
- fdclose(fdp, fp2, rsv[1], td);
+ fdclose(td, fp2, rsv[1]);
fdrop(fp2, td);
free3:
- fdclose(fdp, fp1, rsv[0], td);
+ fdclose(td, fp1, rsv[0]);
fdrop(fp1, td);
free2:
if (so2 != NULL)
@@ -866,7 +863,7 @@ kern_sendit(td, s, mp, flags, control, segflg)
AUDIT_ARG_SOCKADDR(td, AT_FDCWD, mp->msg_name);
cap_rights_set(&rights, CAP_CONNECT);
}
- error = getsock_cap(td->td_proc->p_fd, s, &rights, &fp, NULL);
+ error = getsock_cap(td, s, &rights, &fp, NULL);
if (error != 0)
return (error);
so = (struct socket *)fp->f_data;
@@ -1066,8 +1063,8 @@ kern_recvit(td, s, mp, fromseg, controlp)
*controlp = NULL;
AUDIT_ARG_FD(s);
- error = getsock_cap(td->td_proc->p_fd, s,
- cap_rights_init(&rights, CAP_RECV), &fp, NULL);
+ error = getsock_cap(td, s, cap_rights_init(&rights, CAP_RECV),
+ &fp, NULL);
if (error != 0)
return (error);
so = fp->f_data;
@@ -1381,8 +1378,8 @@ sys_shutdown(td, uap)
int error;
AUDIT_ARG_FD(uap->s);
- error = getsock_cap(td->td_proc->p_fd, uap->s,
- cap_rights_init(&rights, CAP_SHUTDOWN), &fp, NULL);
+ error = getsock_cap(td, uap->s, cap_rights_init(&rights, CAP_SHUTDOWN),
+ &fp, NULL);
if (error == 0) {
so = fp->f_data;
error = soshutdown(so, uap->how);
@@ -1446,8 +1443,8 @@ kern_setsockopt(td, s, level, name, val, valseg, valsize)
}
AUDIT_ARG_FD(s);
- error = getsock_cap(td->td_proc->p_fd, s,
- cap_rights_init(&rights, CAP_SETSOCKOPT), &fp, NULL);
+ error = getsock_cap(td, s, cap_rights_init(&rights, CAP_SETSOCKOPT),
+ &fp, NULL);
if (error == 0) {
so = fp->f_data;
error = sosetopt(so, &sopt);
@@ -1527,8 +1524,8 @@ kern_getsockopt(td, s, level, name, val, valseg, valsize)
}
AUDIT_ARG_FD(s);
- error = getsock_cap(td->td_proc->p_fd, s,
- cap_rights_init(&rights, CAP_GETSOCKOPT), &fp, NULL);
+ error = getsock_cap(td, s, cap_rights_init(&rights, CAP_GETSOCKOPT),
+ &fp, NULL);
if (error == 0) {
so = fp->f_data;
error = sogetopt(so, &sopt);
@@ -1588,8 +1585,8 @@ kern_getsockname(struct thread *td, int fd, struct sockaddr **sa,
int error;
AUDIT_ARG_FD(fd);
- error = getsock_cap(td->td_proc->p_fd, fd,
- cap_rights_init(&rights, CAP_GETSOCKNAME), &fp, NULL);
+ error = getsock_cap(td, fd, cap_rights_init(&rights, CAP_GETSOCKNAME),
+ &fp, NULL);
if (error != 0)
return (error);
so = fp->f_data;
@@ -1687,8 +1684,8 @@ kern_getpeername(struct thread *td, int fd, struct sockaddr **sa,
int error;
AUDIT_ARG_FD(fd);
- error = getsock_cap(td->td_proc->p_fd, fd,
- cap_rights_init(&rights, CAP_GETPEERNAME), &fp, NULL);
+ error = getsock_cap(td, fd, cap_rights_init(&rights, CAP_GETPEERNAME),
+ &fp, NULL);
if (error != 0)
return (error);
so = fp->f_data;
@@ -2154,8 +2151,8 @@ kern_sendfile_getsock(struct thread *td, int s, struct file **sock_fp,
/*
* The socket must be a stream socket and connected.
*/
- error = getsock_cap(td->td_proc->p_fd, s, cap_rights_init(&rights,
- CAP_SEND), sock_fp, NULL);
+ error = getsock_cap(td, s, cap_rights_init(&rights, CAP_SEND),
+ sock_fp, NULL);
if (error != 0)
return (error);
*so = (*sock_fp)->f_data;
diff --git a/sys/kern/vfs_aio.c b/sys/kern/vfs_aio.c
index c7e602e..0bfcf2d 100644
--- a/sys/kern/vfs_aio.c
+++ b/sys/kern/vfs_aio.c
@@ -59,10 +59,12 @@ __FBSDID("$FreeBSD$");
#include <sys/conf.h>
#include <sys/event.h>
#include <sys/mount.h>
+#include <geom/geom.h>
#include <machine/atomic.h>
#include <vm/vm.h>
+#include <vm/vm_page.h>
#include <vm/vm_extern.h>
#include <vm/pmap.h>
#include <vm/vm_map.h>
@@ -232,9 +234,10 @@ struct aiocblist {
int jobstate; /* (b) job state */
int inputcharge; /* (*) input blockes */
int outputcharge; /* (*) output blockes */
- struct buf *bp; /* (*) private to BIO backend,
- * buffer pointer
- */
+ struct bio *bp; /* (*) BIO backend BIO pointer */
+ struct buf *pbuf; /* (*) BIO backend buffer pointer */
+ struct vm_page *pages[btoc(MAXPHYS)+1]; /* BIO backend pages */
+ int npages; /* BIO backend number of pages */
struct proc *userproc; /* (*) user process */
struct ucred *cred; /* (*) active credential when created */
struct file *fd_file; /* (*) pointer to file structure */
@@ -243,7 +246,6 @@ struct aiocblist {
struct knlist klist; /* (a) list of knotes */
struct aiocb uaiocb; /* (*) kernel I/O control block */
ksiginfo_t ksi; /* (a) realtime signal info */
- struct task biotask; /* (*) private to BIO backend */
uint64_t seqno; /* (*) job number */
int pending; /* (a) number of pending I/O, aio_fsync only */
};
@@ -344,11 +346,10 @@ static void aio_process_mlock(struct aiocblist *aiocbe);
static int aio_newproc(int *);
int aio_aqueue(struct thread *td, struct aiocb *job,
struct aioliojob *lio, int type, struct aiocb_ops *ops);
-static void aio_physwakeup(struct buf *bp);
+static void aio_physwakeup(struct bio *bp);
static void aio_proc_rundown(void *arg, struct proc *p);
static void aio_proc_rundown_exec(void *arg, struct proc *p, struct image_params *imgp);
static int aio_qphysio(struct proc *p, struct aiocblist *iocb);
-static void biohelper(void *, int);
static void aio_daemon(void *param);
static void aio_swake_cb(struct socket *, struct sockbuf *);
static int aio_unload(void);
@@ -1294,13 +1295,15 @@ aio_qphysio(struct proc *p, struct aiocblist *aiocbe)
{
struct aiocb *cb;
struct file *fp;
- struct buf *bp;
+ struct bio *bp;
+ struct buf *pbuf;
struct vnode *vp;
struct cdevsw *csw;
struct cdev *dev;
struct kaioinfo *ki;
struct aioliojob *lj;
- int error, ref;
+ int error, ref, unmap, poff;
+ vm_prot_t prot;
cb = &aiocbe->uaiocb;
fp = aiocbe->fd_file;
@@ -1309,107 +1312,121 @@ aio_qphysio(struct proc *p, struct aiocblist *aiocbe)
return (-1);
vp = fp->f_vnode;
-
- /*
- * If its not a disk, we don't want to return a positive error.
- * It causes the aio code to not fall through to try the thread
- * way when you're talking to a regular file.
- */
- if (!vn_isdisk(vp, &error)) {
- if (error == ENOTBLK)
- return (-1);
- else
- return (error);
- }
-
- if (vp->v_bufobj.bo_bsize == 0)
- return (-1);
-
- if (cb->aio_nbytes % vp->v_bufobj.bo_bsize)
+ if (vp->v_type != VCHR)
return (-1);
-
- if (cb->aio_nbytes >
- MAXPHYS - (((vm_offset_t) cb->aio_buf) & PAGE_MASK))
+ if (vp->v_bufobj.bo_bsize == 0)
return (-1);
-
- ki = p->p_aioinfo;
- if (ki->kaio_buffer_count >= ki->kaio_ballowed_count)
+ if (cb->aio_nbytes % vp->v_bufobj.bo_bsize)
return (-1);
ref = 0;
csw = devvn_refthread(vp, &dev, &ref);
if (csw == NULL)
return (ENXIO);
+
+ if ((csw->d_flags & D_DISK) == 0) {
+ error = -1;
+ goto unref;
+ }
if (cb->aio_nbytes > dev->si_iosize_max) {
error = -1;
goto unref;
}
- /* Create and build a buffer header for a transfer. */
- bp = (struct buf *)getpbuf(NULL);
- BUF_KERNPROC(bp);
+ ki = p->p_aioinfo;
+ poff = (vm_offset_t)cb->aio_buf & PAGE_MASK;
+ unmap = ((dev->si_flags & SI_UNMAPPED) && unmapped_buf_allowed);
+ if (unmap) {
+ if (cb->aio_nbytes > MAXPHYS) {
+ error = -1;
+ goto unref;
+ }
+ } else {
+ if (cb->aio_nbytes > MAXPHYS - poff) {
+ error = -1;
+ goto unref;
+ }
+ if (ki->kaio_buffer_count >= ki->kaio_ballowed_count) {
+ error = -1;
+ goto unref;
+ }
+ }
+ aiocbe->bp = bp = g_alloc_bio();
+ if (!unmap) {
+ aiocbe->pbuf = pbuf = (struct buf *)getpbuf(NULL);
+ BUF_KERNPROC(pbuf);
+ }
AIO_LOCK(ki);
ki->kaio_count++;
- ki->kaio_buffer_count++;
+ if (!unmap)
+ ki->kaio_buffer_count++;
lj = aiocbe->lio;
if (lj)
lj->lioj_count++;
- AIO_UNLOCK(ki);
-
- /*
- * Get a copy of the kva from the physical buffer.
- */
- error = 0;
-
- bp->b_bcount = cb->aio_nbytes;
- bp->b_bufsize = cb->aio_nbytes;
- bp->b_iodone = aio_physwakeup;
- bp->b_saveaddr = bp->b_data;
- bp->b_data = (void *)(uintptr_t)cb->aio_buf;
- bp->b_offset = cb->aio_offset;
- bp->b_iooffset = cb->aio_offset;
- bp->b_blkno = btodb(cb->aio_offset);
- bp->b_iocmd = cb->aio_lio_opcode == LIO_WRITE ? BIO_WRITE : BIO_READ;
-
- /*
- * Bring buffer into kernel space.
- */
- if (vmapbuf(bp, (dev->si_flags & SI_UNMAPPED) == 0) < 0) {
- error = EFAULT;
- goto doerror;
- }
-
- AIO_LOCK(ki);
- aiocbe->bp = bp;
- bp->b_caller1 = (void *)aiocbe;
TAILQ_INSERT_TAIL(&ki->kaio_bufqueue, aiocbe, plist);
TAILQ_INSERT_TAIL(&ki->kaio_all, aiocbe, allist);
aiocbe->jobstate = JOBST_JOBQBUF;
cb->_aiocb_private.status = cb->aio_nbytes;
AIO_UNLOCK(ki);
- atomic_add_int(&num_queue_count, 1);
- atomic_add_int(&num_buf_aio, 1);
-
- bp->b_error = 0;
+ bp->bio_length = cb->aio_nbytes;
+ bp->bio_bcount = cb->aio_nbytes;
+ bp->bio_done = aio_physwakeup;
+ bp->bio_data = (void *)(uintptr_t)cb->aio_buf;
+ bp->bio_offset = cb->aio_offset;
+ bp->bio_cmd = cb->aio_lio_opcode == LIO_WRITE ? BIO_WRITE : BIO_READ;
+ bp->bio_dev = dev;
+ bp->bio_caller1 = (void *)aiocbe;
+
+ prot = VM_PROT_READ;
+ if (cb->aio_lio_opcode == LIO_READ)
+ prot |= VM_PROT_WRITE; /* Less backwards than it looks */
+ if ((aiocbe->npages = vm_fault_quick_hold_pages(
+ &curproc->p_vmspace->vm_map,
+ (vm_offset_t)bp->bio_data, bp->bio_length, prot, aiocbe->pages,
+ sizeof(aiocbe->pages)/sizeof(aiocbe->pages[0]))) < 0) {
+ error = EFAULT;
+ goto doerror;
+ }
+ if (!unmap) {
+ pmap_qenter((vm_offset_t)pbuf->b_data,
+ aiocbe->pages, aiocbe->npages);
+ bp->bio_data = pbuf->b_data + poff;
+ } else {
+ bp->bio_ma = aiocbe->pages;
+ bp->bio_ma_n = aiocbe->npages;
+ bp->bio_ma_offset = poff;
+ bp->bio_data = unmapped_buf;
+ bp->bio_flags |= BIO_UNMAPPED;
+ }
- TASK_INIT(&aiocbe->biotask, 0, biohelper, aiocbe);
+ atomic_add_int(&num_queue_count, 1);
+ if (!unmap)
+ atomic_add_int(&num_buf_aio, 1);
/* Perform transfer. */
- dev_strategy_csw(dev, csw, bp);
+ csw->d_strategy(bp);
dev_relthread(dev, ref);
return (0);
doerror:
AIO_LOCK(ki);
+ aiocbe->jobstate = JOBST_NULL;
+ TAILQ_REMOVE(&ki->kaio_bufqueue, aiocbe, plist);
+ TAILQ_REMOVE(&ki->kaio_all, aiocbe, allist);
ki->kaio_count--;
- ki->kaio_buffer_count--;
+ if (!unmap)
+ ki->kaio_buffer_count--;
if (lj)
lj->lioj_count--;
- aiocbe->bp = NULL;
AIO_UNLOCK(ki);
- relpbuf(bp, NULL);
+ if (pbuf) {
+ relpbuf(pbuf, NULL);
+ aiocbe->pbuf = NULL;
+ }
+ g_destroy_bio(bp);
+ aiocbe->bp = NULL;
unref:
dev_relthread(dev, ref);
return (error);
@@ -1787,8 +1804,6 @@ no_kqueue:
}
#endif
queueit:
- /* No buffer for daemon I/O. */
- aiocbe->bp = NULL;
atomic_add_int(&num_queue_count, 1);
AIO_LOCK(ki);
@@ -2425,54 +2440,43 @@ sys_lio_listio(struct thread *td, struct lio_listio_args *uap)
return (error);
}
-/*
- * Called from interrupt thread for physio, we should return as fast
- * as possible, so we schedule a biohelper task.
- */
static void
-aio_physwakeup(struct buf *bp)
+aio_physwakeup(struct bio *bp)
{
- struct aiocblist *aiocbe;
-
- aiocbe = (struct aiocblist *)bp->b_caller1;
- taskqueue_enqueue(taskqueue_aiod_bio, &aiocbe->biotask);
-}
-
-/*
- * Task routine to perform heavy tasks, process wakeup, and signals.
- */
-static void
-biohelper(void *context, int pending)
-{
- struct aiocblist *aiocbe = context;
- struct buf *bp;
+ struct aiocblist *aiocbe = (struct aiocblist *)bp->bio_caller1;
struct proc *userp;
struct kaioinfo *ki;
int nblks;
+ /* Release mapping into kernel space. */
+ if (aiocbe->pbuf) {
+ pmap_qremove((vm_offset_t)aiocbe->pbuf->b_data, aiocbe->npages);
+ relpbuf(aiocbe->pbuf, NULL);
+ aiocbe->pbuf = NULL;
+ atomic_subtract_int(&num_buf_aio, 1);
+ }
+ vm_page_unhold_pages(aiocbe->pages, aiocbe->npages);
+
bp = aiocbe->bp;
+ aiocbe->bp = NULL;
userp = aiocbe->userproc;
ki = userp->p_aioinfo;
AIO_LOCK(ki);
- aiocbe->uaiocb._aiocb_private.status -= bp->b_resid;
+ aiocbe->uaiocb._aiocb_private.status -= bp->bio_resid;
aiocbe->uaiocb._aiocb_private.error = 0;
- if (bp->b_ioflags & BIO_ERROR)
- aiocbe->uaiocb._aiocb_private.error = bp->b_error;
+ if (bp->bio_flags & BIO_ERROR)
+ aiocbe->uaiocb._aiocb_private.error = bp->bio_error;
nblks = btodb(aiocbe->uaiocb.aio_nbytes);
if (aiocbe->uaiocb.aio_lio_opcode == LIO_WRITE)
aiocbe->outputcharge += nblks;
else
aiocbe->inputcharge += nblks;
- aiocbe->bp = NULL;
TAILQ_REMOVE(&userp->p_aioinfo->kaio_bufqueue, aiocbe, plist);
ki->kaio_buffer_count--;
aio_bio_done_notify(userp, aiocbe, DONE_BUF);
AIO_UNLOCK(ki);
- /* Release mapping into kernel space. */
- vunmapbuf(bp);
- relpbuf(bp, NULL);
- atomic_subtract_int(&num_buf_aio, 1);
+ g_destroy_bio(bp);
}
/* syscall - wait for the next completion of an aio request */
diff --git a/sys/kern/vfs_bio.c b/sys/kern/vfs_bio.c
index dfe2997..5ac04ac 100644
--- a/sys/kern/vfs_bio.c
+++ b/sys/kern/vfs_bio.c
@@ -113,8 +113,8 @@ static void vfs_setdirty_locked_object(struct buf *bp);
static void vfs_vmio_release(struct buf *bp);
static int vfs_bio_clcheck(struct vnode *vp, int size,
daddr_t lblkno, daddr_t blkno);
-static int buf_flush(int);
-static int flushbufqueues(int, int);
+static int buf_flush(struct vnode *vp, int);
+static int flushbufqueues(struct vnode *, int, int);
static void buf_daemon(void);
static void bremfreel(struct buf *bp);
static __inline void bd_wakeup(void);
@@ -805,6 +805,7 @@ bufinit(void)
struct buf *bp;
int i;
+ CTASSERT(MAXBCACHEBUF >= MAXBSIZE);
mtx_init(&bqclean, "bufq clean lock", NULL, MTX_DEF);
mtx_init(&bqdirty, "bufq dirty lock", NULL, MTX_DEF);
mtx_init(&rbreqlock, "runningbufspace lock", NULL, MTX_DEF);
@@ -846,8 +847,8 @@ bufinit(void)
* by the system.
*/
maxbufspace = (long)nbuf * BKVASIZE;
- hibufspace = lmax(3 * maxbufspace / 4, maxbufspace - MAXBSIZE * 10);
- lobufspace = hibufspace - MAXBSIZE;
+ hibufspace = lmax(3 * maxbufspace / 4, maxbufspace - MAXBCACHEBUF * 10);
+ lobufspace = hibufspace - MAXBCACHEBUF;
/*
* Note: The 16 MiB upper limit for hirunningspace was chosen
@@ -857,9 +858,9 @@ bufinit(void)
* The lower 1 MiB limit is the historical upper limit for
* hirunningspace.
*/
- hirunningspace = lmax(lmin(roundup(hibufspace / 64, MAXBSIZE),
+ hirunningspace = lmax(lmin(roundup(hibufspace / 64, MAXBCACHEBUF),
16 * 1024 * 1024), 1024 * 1024);
- lorunningspace = roundup((hirunningspace * 2) / 3, MAXBSIZE);
+ lorunningspace = roundup((hirunningspace * 2) / 3, MAXBCACHEBUF);
/*
* Limit the amount of malloc memory since it is wired permanently into
@@ -2096,7 +2097,7 @@ getnewbuf_bufd_help(struct vnode *vp, int gbflags, int slpflag, int slptimeo,
{
struct thread *td;
char *waitmsg;
- int cnt, error, flags, norunbuf, wait;
+ int error, fl, flags, norunbuf;
mtx_assert(&bqclean, MA_OWNED);
@@ -2118,8 +2119,6 @@ getnewbuf_bufd_help(struct vnode *vp, int gbflags, int slpflag, int slptimeo,
return;
td = curthread;
- cnt = 0;
- wait = MNT_NOWAIT;
rw_wlock(&nblock);
while ((needsbuffer & flags) != 0) {
if (vp != NULL && vp->v_type != VCHR &&
@@ -2133,20 +2132,23 @@ getnewbuf_bufd_help(struct vnode *vp, int gbflags, int slpflag, int slptimeo,
* cannot be achieved by the buf_daemon, that
* cannot lock the vnode.
*/
- if (cnt++ > 2)
- wait = MNT_WAIT;
- ASSERT_VOP_LOCKED(vp, "bufd_helper");
- error = VOP_ISLOCKED(vp) == LK_EXCLUSIVE ? 0 :
- vn_lock(vp, LK_TRYUPGRADE);
- if (error == 0) {
- /* play bufdaemon */
- norunbuf = curthread_pflags_set(TDP_BUFNEED |
- TDP_NORUNNINGBUF);
- VOP_FSYNC(vp, wait, td);
- atomic_add_long(&notbufdflushes, 1);
- curthread_pflags_restore(norunbuf);
- }
+ norunbuf = ~(TDP_BUFNEED | TDP_NORUNNINGBUF) |
+ (td->td_pflags & TDP_NORUNNINGBUF);
+
+ /*
+ * Play bufdaemon. The getnewbuf() function
+ * may be called while the thread owns lock
+ * for another dirty buffer for the same
+ * vnode, which makes it impossible to use
+ * VOP_FSYNC() there, due to the buffer lock
+ * recursion.
+ */
+ td->td_pflags |= TDP_BUFNEED | TDP_NORUNNINGBUF;
+ fl = buf_flush(vp, flushbufqtarget);
+ td->td_pflags &= norunbuf;
rw_wlock(&nblock);
+ if (fl != 0)
+ continue;
if ((needsbuffer & flags) == 0)
break;
}
@@ -2565,18 +2567,20 @@ static struct kproc_desc buf_kp = {
SYSINIT(bufdaemon, SI_SUB_KTHREAD_BUF, SI_ORDER_FIRST, kproc_start, &buf_kp);
static int
-buf_flush(int target)
+buf_flush(struct vnode *vp, int target)
{
int flushed;
- flushed = flushbufqueues(target, 0);
+ flushed = flushbufqueues(vp, target, 0);
if (flushed == 0) {
/*
* Could not find any buffers without rollback
* dependencies, so just write the first one
* in the hopes of eventually making progress.
*/
- flushed = flushbufqueues(target, 1);
+ if (vp != NULL && target > 2)
+ target /= 2;
+ flushbufqueues(vp, target, 1);
}
return (flushed);
}
@@ -2613,7 +2617,7 @@ buf_daemon()
* the I/O system.
*/
while (numdirtybuffers > lodirty) {
- if (buf_flush(numdirtybuffers - lodirty) == 0)
+ if (buf_flush(NULL, numdirtybuffers - lodirty) == 0)
break;
kern_yield(PRI_USER);
}
@@ -2668,7 +2672,7 @@ SYSCTL_INT(_vfs, OID_AUTO, flushwithdeps, CTLFLAG_RW, &flushwithdeps,
0, "Number of buffers flushed with dependecies that require rollbacks");
static int
-flushbufqueues(int target, int flushdeps)
+flushbufqueues(struct vnode *lvp, int target, int flushdeps)
{
struct buf *sentinel;
struct vnode *vp;
@@ -2678,6 +2682,7 @@ flushbufqueues(int target, int flushdeps)
int flushed;
int queue;
int error;
+ bool unlock;
flushed = 0;
queue = QUEUE_DIRTY;
@@ -2699,8 +2704,18 @@ flushbufqueues(int target, int flushdeps)
mtx_unlock(&bqdirty);
break;
}
- KASSERT(bp->b_qindex != QUEUE_SENTINEL,
- ("parallel calls to flushbufqueues() bp %p", bp));
+ /*
+ * Skip sentinels inserted by other invocations of the
+ * flushbufqueues(), taking care to not reorder them.
+ *
+ * Only flush the buffers that belong to the
+ * vnode locked by the curthread.
+ */
+ if (bp->b_qindex == QUEUE_SENTINEL || (lvp != NULL &&
+ bp->b_vp != lvp)) {
+ mtx_unlock(&bqdirty);
+ continue;
+ }
error = BUF_LOCK(bp, LK_EXCLUSIVE | LK_NOWAIT, NULL);
mtx_unlock(&bqdirty);
if (error != 0)
@@ -2748,16 +2763,37 @@ flushbufqueues(int target, int flushdeps)
BUF_UNLOCK(bp);
continue;
}
- error = vn_lock(vp, LK_EXCLUSIVE | LK_NOWAIT);
+ if (lvp == NULL) {
+ unlock = true;
+ error = vn_lock(vp, LK_EXCLUSIVE | LK_NOWAIT);
+ } else {
+ ASSERT_VOP_LOCKED(vp, "getbuf");
+ unlock = false;
+ error = VOP_ISLOCKED(vp) == LK_EXCLUSIVE ? 0 :
+ vn_lock(vp, LK_TRYUPGRADE);
+ }
if (error == 0) {
CTR3(KTR_BUF, "flushbufqueue(%p) vp %p flags %X",
bp, bp->b_vp, bp->b_flags);
- vfs_bio_awrite(bp);
+ if (curproc == bufdaemonproc) {
+ vfs_bio_awrite(bp);
+ } else {
+ bremfree(bp);
+ bwrite(bp);
+ notbufdflushes++;
+ }
vn_finished_write(mp);
- VOP_UNLOCK(vp, 0);
+ if (unlock)
+ VOP_UNLOCK(vp, 0);
flushwithdeps += hasdeps;
flushed++;
- if (runningbufspace > hirunningspace)
+
+ /*
+ * Sleeping on runningbufspace while holding
+ * vnode lock leads to deadlock.
+ */
+ if (curproc == bufdaemonproc &&
+ runningbufspace > hirunningspace)
waitrunningbufspace();
continue;
}
@@ -3073,8 +3109,9 @@ getblk(struct vnode *vp, daddr_t blkno, int size, int slpflag, int slptimeo,
KASSERT((flags & (GB_UNMAPPED | GB_KVAALLOC)) != GB_KVAALLOC,
("GB_KVAALLOC only makes sense with GB_UNMAPPED"));
ASSERT_VOP_LOCKED(vp, "getblk");
- if (size > MAXBSIZE)
- panic("getblk: size(%d) > MAXBSIZE(%d)\n", size, MAXBSIZE);
+ if (size > MAXBCACHEBUF)
+ panic("getblk: size(%d) > MAXBCACHEBUF(%d)\n", size,
+ MAXBCACHEBUF);
if (!unmapped_buf_allowed)
flags &= ~(GB_UNMAPPED | GB_KVAALLOC);
diff --git a/sys/kern/vfs_cache.c b/sys/kern/vfs_cache.c
index d57dc90..19ef783 100644
--- a/sys/kern/vfs_cache.c
+++ b/sys/kern/vfs_cache.c
@@ -323,29 +323,25 @@ static SYSCTL_NODE(_debug, OID_AUTO, hashstat, CTLFLAG_RW, NULL,
static int
sysctl_debug_hashstat_rawnchash(SYSCTL_HANDLER_ARGS)
{
- int error;
struct nchashhead *ncpp;
struct namecache *ncp;
- int n_nchash;
- int count;
+ int i, error, n_nchash, *cntbuf;
n_nchash = nchash + 1; /* nchash is max index, not count */
- if (!req->oldptr)
+ if (req->oldptr == NULL)
return SYSCTL_OUT(req, 0, n_nchash * sizeof(int));
-
- /* Scan hash tables for applicable entries */
- for (ncpp = nchashtbl; n_nchash > 0; n_nchash--, ncpp++) {
- CACHE_RLOCK();
- count = 0;
- LIST_FOREACH(ncp, ncpp, nc_hash) {
- count++;
- }
- CACHE_RUNLOCK();
- error = SYSCTL_OUT(req, &count, sizeof(count));
- if (error)
- return (error);
- }
- return (0);
+ cntbuf = malloc(n_nchash * sizeof(int), M_TEMP, M_ZERO | M_WAITOK);
+ CACHE_RLOCK();
+ /* Scan hash tables counting entries */
+ for (ncpp = nchashtbl, i = 0; i < n_nchash; ncpp++, i++)
+ LIST_FOREACH(ncp, ncpp, nc_hash)
+ cntbuf[i]++;
+ CACHE_RUNLOCK();
+ for (error = 0, i = 0; i < n_nchash; i++)
+ if ((error = SYSCTL_OUT(req, &cntbuf[i], sizeof(int))) != 0)
+ break;
+ free(cntbuf, M_TEMP);
+ return (error);
}
SYSCTL_PROC(_debug_hashstat, OID_AUTO, rawnchash, CTLTYPE_INT|CTLFLAG_RD|
CTLFLAG_MPSAFE, 0, 0, sysctl_debug_hashstat_rawnchash, "S,int",
@@ -363,6 +359,7 @@ sysctl_debug_hashstat_nchash(SYSCTL_HANDLER_ARGS)
if (!req->oldptr)
return SYSCTL_OUT(req, 0, 4 * sizeof(int));
+ CACHE_RLOCK();
n_nchash = nchash + 1; /* nchash is max index, not count */
used = 0;
maxlength = 0;
@@ -370,17 +367,16 @@ sysctl_debug_hashstat_nchash(SYSCTL_HANDLER_ARGS)
/* Scan hash tables for applicable entries */
for (ncpp = nchashtbl; n_nchash > 0; n_nchash--, ncpp++) {
count = 0;
- CACHE_RLOCK();
LIST_FOREACH(ncp, ncpp, nc_hash) {
count++;
}
- CACHE_RUNLOCK();
if (count)
used++;
if (maxlength < count)
maxlength = count;
}
n_nchash = nchash + 1;
+ CACHE_RUNLOCK();
pct = (used * 100) / (n_nchash / 100);
error = SYSCTL_OUT(req, &n_nchash, sizeof(n_nchash));
if (error)
@@ -1057,11 +1053,13 @@ sys___getcwd(td, uap)
struct __getcwd_args *uap;
{
- return (kern___getcwd(td, uap->buf, UIO_USERSPACE, uap->buflen));
+ return (kern___getcwd(td, uap->buf, UIO_USERSPACE, uap->buflen,
+ MAXPATHLEN));
}
int
-kern___getcwd(struct thread *td, char *buf, enum uio_seg bufseg, u_int buflen)
+kern___getcwd(struct thread *td, char *buf, enum uio_seg bufseg, u_int buflen,
+ u_int path_max)
{
char *bp, *tmpbuf;
struct filedesc *fdp;
@@ -1072,8 +1070,8 @@ kern___getcwd(struct thread *td, char *buf, enum uio_seg bufseg, u_int buflen)
return (ENODEV);
if (buflen < 2)
return (EINVAL);
- if (buflen > MAXPATHLEN)
- buflen = MAXPATHLEN;
+ if (buflen > path_max)
+ buflen = path_max;
tmpbuf = malloc(buflen, M_TEMP, M_WAITOK);
fdp = td->td_proc->p_fd;
diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c
index fda80c9..8e34456 100644
--- a/sys/kern/vfs_subr.c
+++ b/sys/kern/vfs_subr.c
@@ -3147,6 +3147,7 @@ DB_SHOW_COMMAND(mount, db_show_mount)
MNT_KERN_FLAG(MNTK_VGONE_WAITER);
MNT_KERN_FLAG(MNTK_LOOKUP_EXCL_DOTDOT);
MNT_KERN_FLAG(MNTK_MARKER);
+ MNT_KERN_FLAG(MNTK_USES_BCACHE);
MNT_KERN_FLAG(MNTK_NOASYNC);
MNT_KERN_FLAG(MNTK_UNMOUNT);
MNT_KERN_FLAG(MNTK_MWAIT);
diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c
index 14be379..c5c479d 100644
--- a/sys/kern/vfs_syscalls.c
+++ b/sys/kern/vfs_syscalls.c
@@ -434,9 +434,14 @@ sys_getfsstat(td, uap)
int flags;
} */ *uap;
{
+ size_t count;
+ int error;
- return (kern_getfsstat(td, &uap->buf, uap->bufsize, UIO_USERSPACE,
- uap->flags));
+ error = kern_getfsstat(td, &uap->buf, uap->bufsize, &count,
+ UIO_USERSPACE, uap->flags);
+ if (error == 0)
+ td->td_retval[0] = count;
+ return (error);
}
/*
@@ -446,7 +451,7 @@ sys_getfsstat(td, uap)
*/
int
kern_getfsstat(struct thread *td, struct statfs **buf, size_t bufsize,
- enum uio_seg bufseg, int flags)
+ size_t *countp, enum uio_seg bufseg, int flags)
{
struct mount *mp, *nmp;
struct statfs *sfsp, *sp, sb;
@@ -533,9 +538,9 @@ kern_getfsstat(struct thread *td, struct statfs **buf, size_t bufsize,
}
mtx_unlock(&mountlist_mtx);
if (sfsp && count > maxcount)
- td->td_retval[0] = maxcount;
+ *countp = maxcount;
else
- td->td_retval[0] = count;
+ *countp = count;
return (0);
}
@@ -624,9 +629,9 @@ freebsd4_getfsstat(td, uap)
count = uap->bufsize / sizeof(struct ostatfs);
size = count * sizeof(struct statfs);
- error = kern_getfsstat(td, &buf, size, UIO_SYSSPACE, uap->flags);
+ error = kern_getfsstat(td, &buf, size, &count, UIO_SYSSPACE,
+ uap->flags);
if (size > 0) {
- count = td->td_retval[0];
sp = buf;
while (count > 0 && error == 0) {
cvtstatfs(sp, &osb);
@@ -637,6 +642,8 @@ freebsd4_getfsstat(td, uap)
}
free(buf, M_TEMP);
}
+ if (error == 0)
+ td->td_retval[0] = count;
return (error);
}
@@ -1926,6 +1933,7 @@ olseek(td, uap)
}
#endif /* COMPAT_43 */
+#if defined(COMPAT_FREEBSD6)
/* Version with the 'pad' argument */
int
freebsd6_lseek(td, uap)
@@ -1939,6 +1947,7 @@ freebsd6_lseek(td, uap)
ouap.whence = uap->whence;
return (sys_lseek(td, &ouap));
}
+#endif
/*
* Check access permissions using passed credentials.
@@ -3294,6 +3303,7 @@ kern_utimensat(struct thread *td, int fd, char *path, enum uio_seg pathseg,
{
struct nameidata nd;
struct timespec ts[2];
+ cap_rights_t rights;
int error, flags;
if (flag & ~AT_SYMLINK_NOFOLLOW)
@@ -3301,8 +3311,9 @@ kern_utimensat(struct thread *td, int fd, char *path, enum uio_seg pathseg,
if ((error = getutimens(tptr, tptrseg, ts, &flags)) != 0)
return (error);
- NDINIT_AT(&nd, LOOKUP, ((flag & AT_SYMLINK_NOFOLLOW) ? NOFOLLOW :
- FOLLOW) | AUDITVNODE1, pathseg, path, fd, td);
+ NDINIT_ATRIGHTS(&nd, LOOKUP, ((flag & AT_SYMLINK_NOFOLLOW) ? NOFOLLOW :
+ FOLLOW) | AUDITVNODE1, pathseg, path, fd,
+ cap_rights_init(&rights, CAP_FUTIMES), td);
if ((error = namei(&nd)) != 0)
return (error);
/*
@@ -3414,6 +3425,7 @@ otruncate(td, uap)
}
#endif /* COMPAT_43 */
+#if defined(COMPAT_FREEBSD6)
/* Versions with the pad argument */
int
freebsd6_truncate(struct thread *td, struct freebsd6_truncate_args *uap)
@@ -3434,6 +3446,7 @@ freebsd6_ftruncate(struct thread *td, struct freebsd6_ftruncate_args *uap)
ouap.length = uap->length;
return (sys_ftruncate(td, &ouap));
}
+#endif
/*
* Sync an open file.
diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c
index ed4ad4d..01d448e 100644
--- a/sys/kern/vfs_vnops.c
+++ b/sys/kern/vfs_vnops.c
@@ -306,9 +306,15 @@ vn_open_vnode(struct vnode *vp, int fmode, struct ucred *cred,
if ((fmode & O_APPEND) && (fmode & FWRITE))
accmode |= VAPPEND;
#ifdef MAC
+ if (fmode & O_CREAT)
+ accmode |= VCREAT;
+ if (fmode & O_VERIFY)
+ accmode |= VVERIFY;
error = mac_vnode_check_open(cred, vp, accmode);
if (error)
return (error);
+
+ accmode &= ~(VCREAT | VVERIFY);
#endif
if ((fmode & O_CREAT) == 0) {
if (accmode & VWRITE) {
diff --git a/sys/net/zlib.c b/sys/libkern/zlib.c
index b348248..f5c3854 100644
--- a/sys/net/zlib.c
+++ b/sys/libkern/zlib.c
@@ -54,7 +54,7 @@
#define _Z_UTIL_H
#ifdef _KERNEL
-#include <net/zlib.h>
+#include <sys/zlib.h>
#else
#include "zlib.h"
#endif
diff --git a/sys/mips/adm5120/uart_dev_adm5120.c b/sys/mips/adm5120/uart_dev_adm5120.c
index 5ec18c8..5c3e691 100644
--- a/sys/mips/adm5120/uart_dev_adm5120.c
+++ b/sys/mips/adm5120/uart_dev_adm5120.c
@@ -175,7 +175,8 @@ struct uart_class uart_adm5120_uart_class = {
sizeof(struct adm5120_uart_softc),
.uc_ops = &uart_adm5120_uart_ops,
.uc_range = 1, /* use hinted range */
- .uc_rclk = 62500000
+ .uc_rclk = 62500000,
+ .uc_rshift = 0
};
#define SIGCHG(c, i, s, d) \
diff --git a/sys/mips/atheros/uart_dev_ar933x.c b/sys/mips/atheros/uart_dev_ar933x.c
index 7be92bc..e769cbe 100644
--- a/sys/mips/atheros/uart_dev_ar933x.c
+++ b/sys/mips/atheros/uart_dev_ar933x.c
@@ -351,7 +351,8 @@ struct uart_class uart_ar933x_class = {
sizeof(struct ar933x_softc),
.uc_ops = &uart_ar933x_ops,
.uc_range = 8,
- .uc_rclk = DEFAULT_RCLK
+ .uc_rclk = DEFAULT_RCLK,
+ .uc_rshift = 0
};
#define SIGCHG(c, i, s, d) \
diff --git a/sys/mips/cavium/uart_dev_oct16550.c b/sys/mips/cavium/uart_dev_oct16550.c
index f3d47ca..cfb347f 100644
--- a/sys/mips/cavium/uart_dev_oct16550.c
+++ b/sys/mips/cavium/uart_dev_oct16550.c
@@ -424,7 +424,8 @@ struct uart_class uart_oct16550_class = {
sizeof(struct oct16550_softc),
.uc_ops = &uart_oct16550_ops,
.uc_range = 8 << 3,
- .uc_rclk = 0
+ .uc_rclk = 0,
+ .uc_rshift = 0
};
#define SIGCHG(c, i, s, d) \
diff --git a/sys/mips/conf/CARAMBOLA2.hints b/sys/mips/conf/CARAMBOLA2.hints
index c7aac34..34f4865 100644
--- a/sys/mips/conf/CARAMBOLA2.hints
+++ b/sys/mips/conf/CARAMBOLA2.hints
@@ -98,19 +98,4 @@ hint.gpio.0.function_set=0x00000000
hint.gpio.0.function_clear=0x00000000
# These are the GPIO LEDs and buttons which can be software controlled.
-#hint.gpio.0.pinmask=0x001c02ae
-hint.gpio.0.pinmask=0x00001803
-
-# gpio0 - WLAN LED
-# gpio1 - USB LED
-# gpio11 - Jumpstart button
-# gpio12 - Reset button
-
-# LEDs are configured separately and driven by the LED device
-hint.gpioled.0.at="gpiobus0"
-hint.gpioled.0.name="wlan"
-hint.gpioled.0.pins=0x0001
-
-hint.gpioled.1.at="gpiobus0"
-hint.gpioled.1.name="usb"
-hint.gpioled.1.pins=0x0002
+hint.gpio.0.pinmask=0x00fc1803
diff --git a/sys/mips/conf/DIR-655A1.hints b/sys/mips/conf/DIR-655A1.hints
index 8e5756b..3946fd1 100644
--- a/sys/mips/conf/DIR-655A1.hints
+++ b/sys/mips/conf/DIR-655A1.hints
@@ -7,6 +7,32 @@
# QCA955X_ETH_CFG_RGMII_EN (1 << 0)
hint.qca955x_gmac.0.gmac_cfg=0x1
+# Use this to derive ath0 from arge0 MAC address.
+# 0x1ffe0004 is the arge0 MAC; but it's also the "unit MAC".
+# So make that the ath0 MAC, and make arge0 -1 from that.
+# ath0: offset 0
+# arge0: offset -1
+# arge1: use +1 from the arge0 MAC, even though
+# there's a secondary MAC address configured in EEPROM
+# at 0x1ffe0018.
+hint.ar71xx.0.eeprom_mac_addr=0x1ffe0004
+hint.ar71xx.0.eeprom_mac_isascii=1
+
+hint.ar71xx_mac_map.0.devid=ath
+hint.ar71xx_mac_map.0.unitid=0
+hint.ar71xx_mac_map.0.offset=0
+hint.ar71xx_mac_map.0.is_local=0
+
+hint.ar71xx_mac_map.1.devid=arge
+hint.ar71xx_mac_map.1.unitid=0
+hint.ar71xx_mac_map.1.offset=-1
+hint.ar71xx_mac_map.1.is_local=0
+
+hint.ar71xx_mac_map.2.devid=arge
+hint.ar71xx_mac_map.2.unitid=1
+hint.ar71xx_mac_map.2.offset=1
+hint.ar71xx_mac_map.2.is_local=0
+
# mdiobus0 on arge0
hint.argemdio.0.at="nexus0"
hint.argemdio.0.maddr=0x19000000
@@ -91,9 +117,8 @@ hint.arge.0.miimode=3 # RGMII
hint.arge.0.media=1000
hint.arge.0.fduplex=1
hint.arge.0.pll_1000=0x56000000
-
-# MAC for arge0 is the first 6 bytes of the ART
-hint.arge.0.eeprommac=0x1fff0000
+# hint.arge.0.eeprommac=0x1ffe0004
+# hint.arge.0.readascii=1
# arge1 - lock up to 1000/full
hint.arge.1.phymask=0x0
@@ -101,11 +126,12 @@ hint.arge.1.media=1000
hint.arge.1.fduplex=1
hint.arge.1.miimode=5 # SGMII
hint.arge.1.pll_1000=0x03000101
-
-# MAC for arge1 is the second 6 bytes of the ART
-hint.arge.1.eeprommac=0x1fff0006
+#hint.arge.1.eeprommac=0x1ffe0018
+#hint.arge.1.readascii=1
# ath0: Where the ART is - last 64k in the flash
+# Note: ath0 MAC is default (00:11:22:33:44:55) and thus
+# requires replacing via the board MAC address map.
hint.ath.0.eepromaddr=0x1fff0000
hint.ath.0.eepromsize=16384
diff --git a/sys/mips/conf/DIR-825C1.hints b/sys/mips/conf/DIR-825C1.hints
index 18ad6b8..7f19be6 100644
--- a/sys/mips/conf/DIR-825C1.hints
+++ b/sys/mips/conf/DIR-825C1.hints
@@ -1,13 +1,37 @@
# $FreeBSD$
-# This is a placeholder until the hardware support is complete.
-
# mdiobus0 on arge0
hint.argemdio.0.at="nexus0"
hint.argemdio.0.maddr=0x19000000
hint.argemdio.0.msize=0x1000
hint.argemdio.0.order=0
+# 0x1ffe0004 is the the "unit MAC".
+# 0x1ffe0018 is the second "MAC".
+# Right now this doesn't have any option for more than one
+# "unit MACs", so:
+# ath0: unit MAC
+# ath1: unit MAC + 1
+# arge0: unit MAC + 2
+# arge1: leave as default; not used.
+hint.ar71xx.0.eeprom_mac_addr=0x1ffe0004
+hint.ar71xx.0.eeprom_mac_isascii=1
+
+hint.ar71xx_mac_map.0.devid=ath
+hint.ar71xx_mac_map.0.unitid=0
+hint.ar71xx_mac_map.0.offset=0
+hint.ar71xx_mac_map.0.is_local=0
+
+hint.ar71xx_mac_map.1.devid=ath
+hint.ar71xx_mac_map.1.unitid=1
+hint.ar71xx_mac_map.1.offset=1
+hint.ar71xx_mac_map.1.is_local=0
+
+hint.ar71xx_mac_map.2.devid=arge
+hint.ar71xx_mac_map.2.unitid=0
+hint.ar71xx_mac_map.2.offset=2
+hint.ar71xx_mac_map.2.is_local=0
+
# DIR-825C1 GMAC configuration
# + AR934X_ETH_CFG_RGMII_GMAC0 (1 << 0)
# Onboard AR9344 10/100 switch is not wired up
diff --git a/sys/mips/include/reg.h b/sys/mips/include/reg.h
index c240506..0dc36c6 100644
--- a/sys/mips/include/reg.h
+++ b/sys/mips/include/reg.h
@@ -70,7 +70,7 @@ struct dbreg {
unsigned long junk;
};
-#ifdef COMPAT_FREEBSD32
+#ifdef __LP64__
/* Must match struct trapframe */
struct reg32 {
uint32_t r_regs[NUMSAVEREGS];
@@ -83,6 +83,8 @@ struct fpreg32 {
struct dbreg32 {
uint32_t junk;
};
+
+#define __HAVE_REG32
#endif
#ifdef _KERNEL
diff --git a/sys/mips/mips/busdma_machdep.c b/sys/mips/mips/busdma_machdep.c
index 083e8f5..90ec399 100644
--- a/sys/mips/mips/busdma_machdep.c
+++ b/sys/mips/mips/busdma_machdep.c
@@ -1359,8 +1359,8 @@ add_bounce_page(bus_dma_tag_t dmat, bus_dmamap_t map, vm_offset_t vaddr,
if (dmat->flags & BUS_DMA_KEEP_PG_OFFSET) {
/* Page offset needs to be preserved. */
- bpage->vaddr |= vaddr & PAGE_MASK;
- bpage->busaddr |= vaddr & PAGE_MASK;
+ bpage->vaddr |= addr & PAGE_MASK;
+ bpage->busaddr |= addr & PAGE_MASK;
}
bpage->datavaddr = vaddr;
bpage->dataaddr = addr;
diff --git a/sys/mips/rt305x/uart_dev_rt305x.c b/sys/mips/rt305x/uart_dev_rt305x.c
index d4f2319..5d23b1e 100644
--- a/sys/mips/rt305x/uart_dev_rt305x.c
+++ b/sys/mips/rt305x/uart_dev_rt305x.c
@@ -217,7 +217,8 @@ struct uart_class uart_rt305x_uart_class = {
sizeof(struct rt305x_uart_softc),
.uc_ops = &uart_rt305x_uart_ops,
.uc_range = 1, /* use hinted range */
- .uc_rclk = SYSTEM_CLOCK
+ .uc_rclk = SYSTEM_CLOCK,
+ .uc_rshift = 0
};
#define SIGCHG(c, i, s, d) \
diff --git a/sys/modules/dtb/allwinner/Makefile b/sys/modules/dtb/allwinner/Makefile
new file mode 100644
index 0000000..705b597
--- /dev/null
+++ b/sys/modules/dtb/allwinner/Makefile
@@ -0,0 +1,7 @@
+# $FreeBSD$
+# All the dts files for allwinner systems we support.
+DTS= \
+ cubieboard.dts \
+ cubieboard2.dts
+
+.include <bsd.dtb.mk>
diff --git a/sys/modules/ext2fs/Makefile b/sys/modules/ext2fs/Makefile
index fc10ab0..48697da 100644
--- a/sys/modules/ext2fs/Makefile
+++ b/sys/modules/ext2fs/Makefile
@@ -3,8 +3,8 @@
.PATH: ${.CURDIR}/../../fs/ext2fs
KMOD= ext2fs
SRCS= opt_ddb.h opt_directio.h opt_quota.h opt_suiddir.h vnode_if.h \
- ext2_alloc.c ext2_balloc.c ext2_bmap.c ext2_extents.c ext2_hash.c \
- ext2_htree.c ext2_inode.c ext2_inode_cnv.c ext2_lookup.c ext2_subr.c \
+ ext2_alloc.c ext2_balloc.c ext2_bmap.c ext2_extents.c \
+ ext2_inode.c ext2_inode_cnv.c ext2_lookup.c ext2_subr.c \
ext2_vfsops.c ext2_vnops.c
.include <bsd.kmod.mk>
diff --git a/sys/modules/hwpmc/Makefile b/sys/modules/hwpmc/Makefile
index c9c60fc..cfae7b6 100644
--- a/sys/modules/hwpmc/Makefile
+++ b/sys/modules/hwpmc/Makefile
@@ -25,7 +25,7 @@ SRCS+= device_if.h bus_if.h
.endif
.if ${MACHINE_CPUARCH} == "powerpc"
-SRCS+= hwpmc_powerpc.c hwpmc_mpc7xxx.c hwpmc_ppc970.c
+SRCS+= hwpmc_powerpc.c hwpmc_e500.c hwpmc_mpc7xxx.c hwpmc_ppc970.c
.endif
.if ${MACHINE_CPUARCH} == "sparc64"
diff --git a/sys/modules/i2c/iicbb/Makefile b/sys/modules/i2c/iicbb/Makefile
index 75d1c83..bd4e506 100644
--- a/sys/modules/i2c/iicbb/Makefile
+++ b/sys/modules/i2c/iicbb/Makefile
@@ -1,8 +1,11 @@
# $FreeBSD$
.PATH: ${.CURDIR}/../../../dev/iicbus
+.if ${MACHINE_CPUARCH} == "arm" || ${MACHINE_CPUARCH} == "powerpc"
+ofw_bus_if= ofw_bus_if.h
+.endif
KMOD = iicbb
SRCS = device_if.h bus_if.h iicbus_if.h \
- iicbb_if.h iicbb_if.c iicbb.c opt_platform.h
+ iicbb_if.h iicbb_if.c iicbb.c ${ofw_bus_if} opt_platform.h
.include <bsd.kmod.mk>
diff --git a/sys/modules/ix/Makefile b/sys/modules/ix/Makefile
index 5a5485d..1f30cb0 100644
--- a/sys/modules/ix/Makefile
+++ b/sys/modules/ix/Makefile
@@ -9,7 +9,7 @@ SRCS += if_ix.c ix_txrx.c
# Shared source
SRCS += ixgbe_common.c ixgbe_api.c ixgbe_phy.c ixgbe_mbx.c ixgbe_vf.c
SRCS += ixgbe_dcb.c ixgbe_dcb_82598.c ixgbe_dcb_82599.c
-SRCS += ixgbe_82599.c ixgbe_82598.c ixgbe_x540.c
+SRCS += ixgbe_82598.c ixgbe_82599.c ixgbe_x540.c ixgbe_x550.c
CFLAGS+= -I${.CURDIR}/../../dev/ixgbe -DSMP
.include <bsd.kmod.mk>
diff --git a/sys/modules/ixv/Makefile b/sys/modules/ixv/Makefile
index 20ecaf1..f8ce347 100644
--- a/sys/modules/ixv/Makefile
+++ b/sys/modules/ixv/Makefile
@@ -9,7 +9,7 @@ SRCS += if_ixv.c ix_txrx.c
# Shared source
SRCS += ixgbe_common.c ixgbe_api.c ixgbe_phy.c ixgbe_mbx.c ixgbe_vf.c
SRCS += ixgbe_dcb.c ixgbe_dcb_82598.c ixgbe_dcb_82599.c
-SRCS += ixgbe_82599.c ixgbe_82598.c ixgbe_x540.c
+SRCS += ixgbe_82598.c ixgbe_82599.c ixgbe_x540.c ixgbe_x550.c
CFLAGS+= -I${.CURDIR}/../../dev/ixgbe -DSMP
.include <bsd.kmod.mk>
diff --git a/sys/modules/oce/Makefile b/sys/modules/oce/Makefile
index 4821533..95e828d 100644
--- a/sys/modules/oce/Makefile
+++ b/sys/modules/oce/Makefile
@@ -3,7 +3,7 @@
#
.PATH: ${.CURDIR}/../../dev/oce
-KMOD = oce
+KMOD = if_oce
SRCS = oce_if.c oce_hw.c oce_mbox.c oce_util.c oce_queue.c oce_sysctl.c
SRCS += bus_if.h device_if.h pci_if.h opt_inet.h opt_inet6.h
diff --git a/sys/modules/usb/Makefile b/sys/modules/usb/Makefile
index c0490a9..84d5ef2 100644
--- a/sys/modules/usb/Makefile
+++ b/sys/modules/usb/Makefile
@@ -56,6 +56,7 @@ SUBDIR += ${_urtwn} ${_urtwnfw}
SUBDIR += atp uhid ukbd ums udbp ufm uep wsp uled
SUBDIR += ucom u3g uark ubsa ubser uchcom ucycom ufoma uftdi ugensa uipaq ulpt \
umct umcs umodem umoscom uplcom uslcom uvisor uvscom
+SUBDIR += udl
SUBDIR += uether aue axe axge cdce cue ${_kue} mos rue smsc udav uhso ipheth
SUBDIR += urndis
SUBDIR += usfs umass urio
diff --git a/sys/modules/zlib/Makefile b/sys/modules/zlib/Makefile
index 0a475b5..235d1c7 100644
--- a/sys/modules/zlib/Makefile
+++ b/sys/modules/zlib/Makefile
@@ -1,6 +1,6 @@
# $FreeBSD$
-.PATH: ${.CURDIR}/../../net
+.PATH: ${.CURDIR}/../../libkern
KMOD= zlib
SRCS= zlib.c
diff --git a/sys/contrib/altq/altq/altq.h b/sys/net/altq/altq.h
index c740ed3..cdf6546 100644
--- a/sys/contrib/altq/altq/altq.h
+++ b/sys/net/altq/altq.h
@@ -1,7 +1,4 @@
-/* $FreeBSD$ */
-/* $KAME: altq.h,v 1.10 2003/07/10 12:07:47 kjc Exp $ */
-
-/*
+/*-
* Copyright (C) 1998-2003
* Sony Computer Science Laboratories Inc. All rights reserved.
*
@@ -25,6 +22,9 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
+ *
+ * $KAME: altq.h,v 1.10 2003/07/10 12:07:47 kjc Exp $
+ * $FreeBSD$
*/
#ifndef _ALTQ_ALTQ_H_
#define _ALTQ_ALTQ_H_
@@ -198,7 +198,7 @@ struct pktcntr {
#endif /* ALTQ3_COMPAT */
#ifdef _KERNEL
-#include <altq/altq_var.h>
+#include <net/altq/altq_var.h>
#endif
#endif /* _ALTQ_ALTQ_H_ */
diff --git a/sys/contrib/altq/altq/altq_cbq.c b/sys/net/altq/altq_cbq.c
index 3991d1d..995c819 100644
--- a/sys/contrib/altq/altq/altq_cbq.c
+++ b/sys/net/altq/altq_cbq.c
@@ -1,7 +1,4 @@
-/* $FreeBSD$ */
-/* $KAME: altq_cbq.c,v 1.19 2003/09/17 14:23:25 kjc Exp $ */
-
-/*
+/*-
* Copyright (c) Sun Microsystems, Inc. 1993-1998 All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -29,15 +26,14 @@
* provided "as is" without express or implied warranty of any kind.
*
* These notices must be retained in any copies of any part of this software.
+ *
+ * $KAME: altq_cbq.c,v 1.19 2003/09/17 14:23:25 kjc Exp $
+ * $FreeBSD$
*/
-#if defined(__FreeBSD__) || defined(__NetBSD__)
#include "opt_altq.h"
#include "opt_inet.h"
-#ifdef __FreeBSD__
#include "opt_inet6.h"
-#endif
-#endif /* __FreeBSD__ || __NetBSD__ */
#ifdef ALTQ_CBQ /* cbq is enabled by ALTQ_CBQ option in opt_altq.h */
#include <sys/param.h>
@@ -60,10 +56,10 @@
#include <netpfil/pf/pf.h>
#include <netpfil/pf/pf_altq.h>
#include <netpfil/pf/pf_mtag.h>
-#include <altq/altq.h>
-#include <altq/altq_cbq.h>
+#include <net/altq/altq.h>
+#include <net/altq/altq_cbq.h>
#ifdef ALTQ3_COMPAT
-#include <altq/altq_conf.h>
+#include <net/altq/altq_conf.h>
#endif
#ifdef ALTQ3_COMPAT
@@ -251,11 +247,7 @@ cbq_pfattach(struct pf_altq *a)
if ((ifp = ifunit(a->ifname)) == NULL || a->altq_disc == NULL)
return (EINVAL);
-#ifdef __NetBSD__
s = splnet();
-#else
- s = splimp();
-#endif
error = altq_attach(&ifp->if_snd, ALTQT_CBQ, a->altq_disc,
cbq_enqueue, cbq_dequeue, cbq_request, NULL, NULL);
splx(s);
diff --git a/sys/contrib/altq/altq/altq_cbq.h b/sys/net/altq/altq_cbq.h
index 30a15c7..792c9fd 100644
--- a/sys/contrib/altq/altq/altq_cbq.h
+++ b/sys/net/altq/altq_cbq.h
@@ -1,6 +1,4 @@
-/* $KAME: altq_cbq.h,v 1.12 2003/10/03 05:05:15 kjc Exp $ */
-
-/*
+/*-
* Copyright (c) Sun Microsystems, Inc. 1993-1998 All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -28,15 +26,18 @@
* provided "as is" without express or implied warranty of any kind.
*
* These notices must be retained in any copies of any part of this software.
+ *
+ * $KAME: altq_cbq.h,v 1.12 2003/10/03 05:05:15 kjc Exp $
+ * $FreeBSD$
*/
#ifndef _ALTQ_ALTQ_CBQ_H_
#define _ALTQ_ALTQ_CBQ_H_
-#include <altq/altq.h>
-#include <altq/altq_rmclass.h>
-#include <altq/altq_red.h>
-#include <altq/altq_rio.h>
+#include <net/altq/altq.h>
+#include <net/altq/altq_rmclass.h>
+#include <net/altq/altq_red.h>
+#include <net/altq/altq_rio.h>
#ifdef __cplusplus
extern "C" {
diff --git a/sys/contrib/altq/altq/altq_cdnr.c b/sys/net/altq/altq_cdnr.c
index ee36fe8..ff531dc 100644
--- a/sys/contrib/altq/altq/altq_cdnr.c
+++ b/sys/net/altq/altq_cdnr.c
@@ -1,7 +1,4 @@
-/* $FreeBSD$ */
-/* $KAME: altq_cdnr.c,v 1.15 2005/04/13 03:44:24 suz Exp $ */
-
-/*
+/*-
* Copyright (C) 1999-2002
* Sony Computer Science Laboratories Inc. All rights reserved.
*
@@ -25,15 +22,14 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
+ *
+ * $KAME: altq_cdnr.c,v 1.15 2005/04/13 03:44:24 suz Exp $
+ * $FreeBSD$
*/
-#if defined(__FreeBSD__) || defined(__NetBSD__)
#include "opt_altq.h"
#include "opt_inet.h"
-#ifdef __FreeBSD__
#include "opt_inet6.h"
-#endif
-#endif /* __FreeBSD__ || __NetBSD__ */
#include <sys/param.h>
#include <sys/malloc.h>
@@ -55,12 +51,12 @@
#include <netinet/ip6.h>
#endif
-#include <altq/if_altq.h>
-#include <altq/altq.h>
+#include <net/altq/if_altq.h>
+#include <net/altq/altq.h>
#ifdef ALTQ3_COMPAT
-#include <altq/altq_conf.h>
+#include <net/altq/altq_conf.h>
#endif
-#include <altq/altq_cdnr.h>
+#include <net/altq/altq_cdnr.h>
#ifdef ALTQ3_COMPAT
/*
@@ -1272,11 +1268,7 @@ cdnrioctl(dev, cmd, addr, flag, p)
break;
}
-#ifdef __NetBSD__
s = splnet();
-#else
- s = splimp();
-#endif
switch (cmd) {
case CDNR_IF_ATTACH:
diff --git a/sys/contrib/altq/altq/altq_cdnr.h b/sys/net/altq/altq_cdnr.h
index d55402f..06fa9c9 100644
--- a/sys/contrib/altq/altq/altq_cdnr.h
+++ b/sys/net/altq/altq_cdnr.h
@@ -1,6 +1,4 @@
-/* $KAME: altq_cdnr.h,v 1.9 2003/07/10 12:07:48 kjc Exp $ */
-
-/*
+/*-
* Copyright (C) 1999-2002
* Sony Computer Science Laboratories Inc. All rights reserved.
*
@@ -24,12 +22,15 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
+ *
+ * $KAME: altq_cdnr.h,v 1.9 2003/07/10 12:07:48 kjc Exp $
+ * $FreeBSD$
*/
#ifndef _ALTQ_ALTQ_CDNR_H_
#define _ALTQ_ALTQ_CDNR_H_
-#include <altq/altq.h>
+#include <net/altq/altq.h>
/*
* traffic conditioner element types
diff --git a/sys/contrib/altq/altq/altq_classq.h b/sys/net/altq/altq_classq.h
index dc5c646..e30f9e2 100644
--- a/sys/contrib/altq/altq/altq_classq.h
+++ b/sys/net/altq/altq_classq.h
@@ -1,6 +1,4 @@
-/* $KAME: altq_classq.h,v 1.6 2003/01/07 07:33:38 kjc Exp $ */
-
-/*
+/*-
* Copyright (c) 1991-1997 Regents of the University of California.
* All rights reserved.
*
@@ -31,6 +29,9 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
+ *
+ * $KAME: altq_classq.h,v 1.6 2003/01/07 07:33:38 kjc Exp $
+ * $FreeBSD$
*/
/*
* class queue definitions extracted from rm_class.h.
diff --git a/sys/contrib/altq/altq/altq_hfsc.c b/sys/net/altq/altq_hfsc.c
index 0363016..517ecd7 100644
--- a/sys/contrib/altq/altq/altq_hfsc.c
+++ b/sys/net/altq/altq_hfsc.c
@@ -1,7 +1,4 @@
-/* $FreeBSD$ */
-/* $KAME: altq_hfsc.c,v 1.24 2003/12/05 05:40:46 kjc Exp $ */
-
-/*
+/*-
* Copyright (c) 1997-1999 Carnegie Mellon University. All Rights Reserved.
*
* Permission to use, copy, modify, and distribute this software and
@@ -29,6 +26,9 @@
* software to return any improvements or extensions that they make,
* and to grant Carnegie Mellon the rights to redistribute these
* changes without encumbrance.
+ *
+ * $KAME: altq_hfsc.c,v 1.24 2003/12/05 05:40:46 kjc Exp $
+ * $FreeBSD$
*/
/*
* H-FSC is described in Proceedings of SIGCOMM'97,
@@ -42,13 +42,9 @@
* a class whose fit-time exceeds the current time.
*/
-#if defined(__FreeBSD__) || defined(__NetBSD__)
#include "opt_altq.h"
#include "opt_inet.h"
-#ifdef __FreeBSD__
#include "opt_inet6.h"
-#endif
-#endif /* __FreeBSD__ || __NetBSD__ */
#ifdef ALTQ_HFSC /* hfsc is enabled by ALTQ_HFSC option in opt_altq.h */
@@ -72,10 +68,10 @@
#include <netpfil/pf/pf.h>
#include <netpfil/pf/pf_altq.h>
#include <netpfil/pf/pf_mtag.h>
-#include <altq/altq.h>
-#include <altq/altq_hfsc.h>
+#include <net/altq/altq.h>
+#include <net/altq/altq_hfsc.h>
#ifdef ALTQ3_COMPAT
-#include <altq/altq_conf.h>
+#include <net/altq/altq_conf.h>
#endif
/*
@@ -177,11 +173,7 @@ hfsc_pfattach(struct pf_altq *a)
if ((ifp = ifunit(a->ifname)) == NULL || a->altq_disc == NULL)
return (EINVAL);
-#ifdef __NetBSD__
s = splnet();
-#else
- s = splimp();
-#endif
error = altq_attach(&ifp->if_snd, ALTQT_HFSC, a->altq_disc,
hfsc_enqueue, hfsc_dequeue, hfsc_request, NULL, NULL);
splx(s);
@@ -483,11 +475,7 @@ hfsc_class_create(struct hfsc_if *hif, struct service_curve *rsc,
cl->cl_hif = hif;
cl->cl_parent = parent;
-#ifdef __NetBSD__
s = splnet();
-#else
- s = splimp();
-#endif
IFQ_LOCK(hif->hif_ifq);
hif->hif_classes++;
@@ -567,11 +555,7 @@ hfsc_class_destroy(struct hfsc_class *cl)
if (is_a_parent_class(cl))
return (EBUSY);
-#ifdef __NetBSD__
s = splnet();
-#else
- s = splimp();
-#endif
IFQ_LOCK(cl->cl_hif->hif_ifq);
#ifdef ALTQ3_COMPAT
@@ -1771,11 +1755,7 @@ hfsc_class_modify(cl, rsc, fsc, usc)
}
cur_time = read_machclk();
-#ifdef __NetBSD__
s = splnet();
-#else
- s = splimp();
-#endif
IFQ_LOCK(cl->cl_hif->hif_ifq);
if (rsc != NULL) {
diff --git a/sys/contrib/altq/altq/altq_hfsc.h b/sys/net/altq/altq_hfsc.h
index d04b378..8101428 100644
--- a/sys/contrib/altq/altq/altq_hfsc.h
+++ b/sys/net/altq/altq_hfsc.h
@@ -1,6 +1,4 @@
-/* $KAME: altq_hfsc.h,v 1.12 2003/12/05 05:40:46 kjc Exp $ */
-
-/*
+/*-
* Copyright (c) 1997-1999 Carnegie Mellon University. All Rights Reserved.
*
* Permission to use, copy, modify, and distribute this software and
@@ -28,14 +26,17 @@
* software to return any improvements or extensions that they make,
* and to grant Carnegie Mellon the rights to redistribute these
* changes without encumbrance.
+ *
+ * $KAME: altq_hfsc.h,v 1.12 2003/12/05 05:40:46 kjc Exp $
+ * $FreeBSD$
*/
#ifndef _ALTQ_ALTQ_HFSC_H_
#define _ALTQ_ALTQ_HFSC_H_
-#include <altq/altq.h>
-#include <altq/altq_classq.h>
-#include <altq/altq_red.h>
-#include <altq/altq_rio.h>
+#include <net/altq/altq.h>
+#include <net/altq/altq_classq.h>
+#include <net/altq/altq_red.h>
+#include <net/altq/altq_rio.h>
#ifdef __cplusplus
extern "C" {
diff --git a/sys/contrib/altq/altq/altq_priq.c b/sys/net/altq/altq_priq.c
index 3ce65dc..de18c03 100644
--- a/sys/contrib/altq/altq/altq_priq.c
+++ b/sys/net/altq/altq_priq.c
@@ -1,6 +1,4 @@
-/* $FreeBSD$ */
-/* $KAME: altq_priq.c,v 1.11 2003/09/17 14:23:25 kjc Exp $ */
-/*
+/*-
* Copyright (C) 2000-2003
* Sony Computer Science Laboratories Inc. All rights reserved.
*
@@ -24,18 +22,17 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
+ *
+ * $KAME: altq_priq.c,v 1.11 2003/09/17 14:23:25 kjc Exp $
+ * $FreeBSD$
*/
/*
* priority queue
*/
-#if defined(__FreeBSD__) || defined(__NetBSD__)
#include "opt_altq.h"
#include "opt_inet.h"
-#ifdef __FreeBSD__
#include "opt_inet6.h"
-#endif
-#endif /* __FreeBSD__ || __NetBSD__ */
#ifdef ALTQ_PRIQ /* priq is enabled by ALTQ_PRIQ option in opt_altq.h */
@@ -57,11 +54,11 @@
#include <netpfil/pf/pf.h>
#include <netpfil/pf/pf_altq.h>
#include <netpfil/pf/pf_mtag.h>
-#include <altq/altq.h>
+#include <net/altq/altq.h>
#ifdef ALTQ3_COMPAT
-#include <altq/altq_conf.h>
+#include <net/altq/altq_conf.h>
#endif
-#include <altq/altq_priq.h>
+#include <net/altq/altq_priq.h>
/*
* function prototypes
@@ -113,11 +110,7 @@ priq_pfattach(struct pf_altq *a)
if ((ifp = ifunit(a->ifname)) == NULL || a->altq_disc == NULL)
return (EINVAL);
-#ifdef __NetBSD__
s = splnet();
-#else
- s = splimp();
-#endif
error = altq_attach(&ifp->if_snd, ALTQT_PRIQ, a->altq_disc,
priq_enqueue, priq_dequeue, priq_request, NULL, NULL);
splx(s);
@@ -300,11 +293,7 @@ priq_class_create(struct priq_if *pif, int pri, int qlimit, int flags, int qid)
if ((cl = pif->pif_classes[pri]) != NULL) {
/* modify the class instead of creating a new one */
-#ifdef __NetBSD__
s = splnet();
-#else
- s = splimp();
-#endif
IFQ_LOCK(cl->cl_pif->pif_ifq);
if (!qempty(cl->cl_q))
priq_purgeq(cl);
@@ -407,11 +396,7 @@ priq_class_destroy(struct priq_class *cl)
struct priq_if *pif;
int s, pri;
-#ifdef __NetBSD__
s = splnet();
-#else
- s = splimp();
-#endif
IFQ_LOCK(cl->cl_pif->pif_ifq);
#ifdef ALTQ3_CLFIER_COMPAT
diff --git a/sys/contrib/altq/altq/altq_priq.h b/sys/net/altq/altq_priq.h
index 481d31b..d3cea33 100644
--- a/sys/contrib/altq/altq/altq_priq.h
+++ b/sys/net/altq/altq_priq.h
@@ -1,5 +1,4 @@
-/* $KAME: altq_priq.h,v 1.7 2003/10/03 05:05:15 kjc Exp $ */
-/*
+/*-
* Copyright (C) 2000-2003
* Sony Computer Science Laboratories Inc. All rights reserved.
*
@@ -23,15 +22,18 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
+ *
+ * $KAME: altq_priq.h,v 1.7 2003/10/03 05:05:15 kjc Exp $
+ * $FreeBSD$
*/
#ifndef _ALTQ_ALTQ_PRIQ_H_
#define _ALTQ_ALTQ_PRIQ_H_
-#include <altq/altq.h>
-#include <altq/altq_classq.h>
-#include <altq/altq_red.h>
-#include <altq/altq_rio.h>
+#include <net/altq/altq.h>
+#include <net/altq/altq_classq.h>
+#include <net/altq/altq_red.h>
+#include <net/altq/altq_rio.h>
#ifdef __cplusplus
extern "C" {
diff --git a/sys/contrib/altq/altq/altq_red.c b/sys/net/altq/altq_red.c
index defee29..1347851 100644
--- a/sys/contrib/altq/altq/altq_red.c
+++ b/sys/net/altq/altq_red.c
@@ -1,7 +1,4 @@
-/* $FreeBSD$ */
-/* $KAME: altq_red.c,v 1.18 2003/09/05 22:40:36 itojun Exp $ */
-
-/*
+/*-
* Copyright (C) 1997-2003
* Sony Computer Science Laboratories Inc. All rights reserved.
*
@@ -27,7 +24,7 @@
* SUCH DAMAGE.
*
*/
-/*
+/*-
* Copyright (c) 1990-1994 Regents of the University of California.
* All rights reserved.
*
@@ -58,15 +55,14 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
+ *
+ * $KAME: altq_red.c,v 1.18 2003/09/05 22:40:36 itojun Exp $
+ * $FreeBSD$
*/
-#if defined(__FreeBSD__) || defined(__NetBSD__)
#include "opt_altq.h"
#include "opt_inet.h"
-#ifdef __FreeBSD__
#include "opt_inet6.h"
-#endif
-#endif /* __FreeBSD__ || __NetBSD__ */
#ifdef ALTQ_RED /* red is enabled by ALTQ_RED option in opt_altq.h */
#include <sys/param.h>
@@ -98,12 +94,12 @@
#include <netpfil/pf/pf.h>
#include <netpfil/pf/pf_altq.h>
#include <netpfil/pf/pf_mtag.h>
-#include <altq/altq.h>
-#include <altq/altq_red.h>
+#include <net/altq/altq.h>
+#include <net/altq/altq_red.h>
#ifdef ALTQ3_COMPAT
-#include <altq/altq_conf.h>
+#include <net/altq/altq_conf.h>
#ifdef ALTQ_FLOWVALVE
-#include <altq/altq_flowvalve.h>
+#include <net/altq/altq_flowvalve.h>
#endif
#endif
@@ -944,11 +940,7 @@ redioctl(dev, cmd, addr, flag, p)
break;
}
-#ifdef __NetBSD__
s = splnet();
-#else
- s = splimp();
-#endif
red_purgeq(rqp);
limit = fc->red_limit;
if (limit < fc->red_thmax)
diff --git a/sys/contrib/altq/altq/altq_red.h b/sys/net/altq/altq_red.h
index dc8ea0a..8ae8d29 100644
--- a/sys/contrib/altq/altq/altq_red.h
+++ b/sys/net/altq/altq_red.h
@@ -1,6 +1,4 @@
-/* $KAME: altq_red.h,v 1.8 2003/07/10 12:07:49 kjc Exp $ */
-
-/*
+/*-
* Copyright (C) 1997-2003
* Sony Computer Science Laboratories Inc. All rights reserved.
*
@@ -24,12 +22,15 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
+ *
+ * $KAME: altq_red.h,v 1.8 2003/07/10 12:07:49 kjc Exp $
+ * $FreeBSD$
*/
#ifndef _ALTQ_ALTQ_RED_H_
#define _ALTQ_ALTQ_RED_H_
-#include <altq/altq_classq.h>
+#include <net/altq/altq_classq.h>
#ifdef ALTQ3_COMPAT
struct red_interface {
diff --git a/sys/contrib/altq/altq/altq_rio.c b/sys/net/altq/altq_rio.c
index 151debe..0f19735e 100644
--- a/sys/contrib/altq/altq/altq_rio.c
+++ b/sys/net/altq/altq_rio.c
@@ -1,7 +1,4 @@
-/* $FreeBSD$ */
-/* $KAME: altq_rio.c,v 1.17 2003/07/10 12:07:49 kjc Exp $ */
-
-/*
+/*-
* Copyright (C) 1998-2003
* Sony Computer Science Laboratories Inc. All rights reserved.
*
@@ -26,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
-/*
+/*-
* Copyright (c) 1990-1994 Regents of the University of California.
* All rights reserved.
*
@@ -57,15 +54,14 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
+ *
+ * $KAME: altq_rio.c,v 1.17 2003/07/10 12:07:49 kjc Exp $
+ * $FreeBSD$
*/
-#if defined(__FreeBSD__) || defined(__NetBSD__)
#include "opt_altq.h"
#include "opt_inet.h"
-#ifdef __FreeBSD__
#include "opt_inet6.h"
-#endif
-#endif /* __FreeBSD__ || __NetBSD__ */
#ifdef ALTQ_RIO /* rio is enabled by ALTQ_RIO option in opt_altq.h */
#include <sys/param.h>
@@ -92,12 +88,12 @@
#include <netpfil/pf/pf.h>
#include <netpfil/pf/pf_altq.h>
-#include <altq/altq.h>
-#include <altq/altq_cdnr.h>
-#include <altq/altq_red.h>
-#include <altq/altq_rio.h>
+#include <net/altq/altq.h>
+#include <net/altq/altq_cdnr.h>
+#include <net/altq/altq_red.h>
+#include <net/altq/altq_rio.h>
#ifdef ALTQ3_COMPAT
-#include <altq/altq_conf.h>
+#include <net/altq/altq_conf.h>
#endif
/*
@@ -684,11 +680,7 @@ rioioctl(dev, cmd, addr, flag, p)
break;
}
-#ifdef __NetBSD__
s = splnet();
-#else
- s = splimp();
-#endif
_flushq(rqp->rq_q);
limit = fc->rio_limit;
if (limit < fc->q_params[RIO_NDROPPREC-1].th_max)
diff --git a/sys/contrib/altq/altq/altq_rio.h b/sys/net/altq/altq_rio.h
index 83210f2..ce9dc0e 100644
--- a/sys/contrib/altq/altq/altq_rio.h
+++ b/sys/net/altq/altq_rio.h
@@ -1,6 +1,4 @@
-/* $KAME: altq_rio.h,v 1.9 2003/07/10 12:07:49 kjc Exp $ */
-
-/*
+/*-
* Copyright (C) 1998-2003
* Sony Computer Science Laboratories Inc. All rights reserved.
*
@@ -24,12 +22,15 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
+ *
+ * $KAME: altq_rio.h,v 1.9 2003/07/10 12:07:49 kjc Exp $
+ * $FreeBSD$
*/
#ifndef _ALTQ_ALTQ_RIO_H_
#define _ALTQ_ALTQ_RIO_H_
-#include <altq/altq_classq.h>
+#include <net/altq/altq_classq.h>
/*
* RIO: RED with IN/OUT bit
diff --git a/sys/contrib/altq/altq/altq_rmclass.c b/sys/net/altq/altq_rmclass.c
index c433024..3f76f2c 100644
--- a/sys/contrib/altq/altq/altq_rmclass.c
+++ b/sys/net/altq/altq_rmclass.c
@@ -1,7 +1,4 @@
-/* $FreeBSD$ */
-/* $KAME: altq_rmclass.c,v 1.19 2005/04/13 03:44:25 suz Exp $ */
-
-/*
+/*-
* Copyright (c) 1991-1997 Regents of the University of California.
* All rights reserved.
*
@@ -37,14 +34,12 @@
* For questions and/or comments, please send mail to cbq@ee.lbl.gov
*
* @(#)rm_class.c 1.48 97/12/05 SMI
+ * $KAME: altq_rmclass.c,v 1.19 2005/04/13 03:44:25 suz Exp $
+ * $FreeBSD$
*/
-#if defined(__FreeBSD__) || defined(__NetBSD__)
#include "opt_altq.h"
#include "opt_inet.h"
-#ifdef __FreeBSD__
#include "opt_inet6.h"
-#endif
-#endif /* __FreeBSD__ || __NetBSD__ */
#ifdef ALTQ_CBQ /* cbq is enabled by ALTQ_CBQ option in opt_altq.h */
#include <sys/param.h>
@@ -66,12 +61,12 @@
#include <netinet/ip.h>
#endif
-#include <altq/if_altq.h>
-#include <altq/altq.h>
-#include <altq/altq_rmclass.h>
-#include <altq/altq_rmclass_debug.h>
-#include <altq/altq_red.h>
-#include <altq/altq_rio.h>
+#include <net/altq/if_altq.h>
+#include <net/altq/altq.h>
+#include <net/altq/altq_rmclass.h>
+#include <net/altq/altq_rmclass_debug.h>
+#include <net/altq/altq_red.h>
+#include <net/altq/altq_rio.h>
/*
* Local Macros
@@ -306,11 +301,7 @@ rmc_newclass(int pri, struct rm_ifdat *ifd, u_int nsecPerByte,
/*
* put the class into the class tree
*/
-#ifdef __NetBSD__
s = splnet();
-#else
- s = splimp();
-#endif
IFQ_LOCK(ifd->ifq_);
if ((peer = ifd->active_[pri]) != NULL) {
/* find the last class at this pri */
@@ -359,11 +350,7 @@ rmc_modclass(struct rm_class *cl, u_int nsecPerByte, int maxq, u_int maxidle,
ifd = cl->ifdat_;
old_allotment = cl->allotment_;
-#ifdef __NetBSD__
s = splnet();
-#else
- s = splimp();
-#endif
IFQ_LOCK(ifd->ifq_);
cl->allotment_ = RM_NS_PER_SEC / nsecPerByte; /* Bytes per sec */
cl->qthresh_ = 0;
@@ -559,11 +546,7 @@ rmc_delete_class(struct rm_ifdat *ifd, struct rm_class *cl)
if (cl->sleeping_)
CALLOUT_STOP(&cl->callout_);
-#ifdef __NetBSD__
s = splnet();
-#else
- s = splimp();
-#endif
IFQ_LOCK(ifd->ifq_);
/*
* Free packets in the packet queue.
@@ -1531,13 +1514,8 @@ rmc_delay_action(struct rm_class *cl, struct rm_class *borrow)
* a 'backstop' to restart this class.
*/
if (delay > tick * 2) {
-#ifdef __FreeBSD__
/* FreeBSD rounds up the tick */
t = hzto(&cl->undertime_);
-#else
- /* other BSDs round down the tick */
- t = hzto(&cl->undertime_) + 1;
-#endif
} else
t = 2;
CALLOUT_RESET(&cl->callout_, t,
@@ -1568,11 +1546,7 @@ rmc_restart(struct rm_class *cl)
struct rm_ifdat *ifd = cl->ifdat_;
int s;
-#ifdef __NetBSD__
s = splnet();
-#else
- s = splimp();
-#endif
IFQ_LOCK(ifd->ifq_);
if (cl->sleeping_) {
cl->sleeping_ = 0;
diff --git a/sys/contrib/altq/altq/altq_rmclass.h b/sys/net/altq/altq_rmclass.h
index cf0ddf4..e2cae89 100644
--- a/sys/contrib/altq/altq/altq_rmclass.h
+++ b/sys/net/altq/altq_rmclass.h
@@ -1,6 +1,4 @@
-/* $KAME: altq_rmclass.h,v 1.10 2003/08/20 23:30:23 itojun Exp $ */
-
-/*
+/*-
* Copyright (c) 1991-1997 Regents of the University of California.
* All rights reserved.
*
@@ -31,12 +29,15 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
+ *
+ * $KAME: altq_rmclass.h,v 1.10 2003/08/20 23:30:23 itojun Exp $
+ * $FreeBSD$
*/
#ifndef _ALTQ_ALTQ_RMCLASS_H_
#define _ALTQ_ALTQ_RMCLASS_H_
-#include <altq/altq_classq.h>
+#include <net/altq/altq_classq.h>
/* #pragma ident "@(#)rm_class.h 1.20 97/10/23 SMI" */
diff --git a/sys/contrib/altq/altq/altq_rmclass_debug.h b/sys/net/altq/altq_rmclass_debug.h
index 8f471b2..7adbaec 100644
--- a/sys/contrib/altq/altq/altq_rmclass_debug.h
+++ b/sys/net/altq/altq_rmclass_debug.h
@@ -1,6 +1,4 @@
-/* $KAME: altq_rmclass_debug.h,v 1.3 2002/11/29 04:36:24 kjc Exp $ */
-
-/*
+/*-
* Copyright (c) Sun Microsystems, Inc. 1998 All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -28,6 +26,9 @@
* provided "as is" without express or implied warranty of any kind.
*
* These notices must be retained in any copies of any part of this software.
+ *
+ * $KAME: altq_rmclass_debug.h,v 1.3 2002/11/29 04:36:24 kjc Exp $
+ * $FreeBSD$
*/
#ifndef _ALTQ_ALTQ_RMCLASS_DEBUG_H_
diff --git a/sys/contrib/altq/altq/altq_subr.c b/sys/net/altq/altq_subr.c
index 16b796a..0c3da66 100644
--- a/sys/contrib/altq/altq/altq_subr.c
+++ b/sys/net/altq/altq_subr.c
@@ -1,7 +1,4 @@
-/* $FreeBSD$ */
-/* $KAME: altq_subr.c,v 1.21 2003/11/06 06:32:53 kjc Exp $ */
-
-/*
+/*-
* Copyright (C) 1997-2003
* Sony Computer Science Laboratories Inc. All rights reserved.
*
@@ -25,15 +22,14 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
+ *
+ * $KAME: altq_subr.c,v 1.21 2003/11/06 06:32:53 kjc Exp $
+ * $FreeBSD$
*/
-#if defined(__FreeBSD__) || defined(__NetBSD__)
#include "opt_altq.h"
#include "opt_inet.h"
-#ifdef __FreeBSD__
#include "opt_inet6.h"
-#endif
-#endif /* __FreeBSD__ || __NetBSD__ */
#include <sys/param.h>
#include <sys/malloc.h>
@@ -52,9 +48,7 @@
#include <net/if_var.h>
#include <net/if_dl.h>
#include <net/if_types.h>
-#ifdef __FreeBSD__
#include <net/vnet.h>
-#endif
#include <netinet/in.h>
#include <netinet/in_systm.h>
@@ -67,26 +61,20 @@
#include <netpfil/pf/pf.h>
#include <netpfil/pf/pf_altq.h>
-#include <altq/altq.h>
+#include <net/altq/altq.h>
#ifdef ALTQ3_COMPAT
-#include <altq/altq_conf.h>
+#include <net/altq/altq_conf.h>
#endif
/* machine dependent clock related includes */
-#ifdef __FreeBSD__
#include <sys/bus.h>
#include <sys/cpu.h>
#include <sys/eventhandler.h>
#include <machine/clock.h>
-#endif
#if defined(__amd64__) || defined(__i386__)
#include <machine/cpufunc.h> /* for pentium tsc */
#include <machine/specialreg.h> /* for CPUID_TSC */
-#ifdef __FreeBSD__
#include <machine/md_var.h> /* for cpu_feature */
-#elif defined(__NetBSD__) || defined(__OpenBSD__)
-#include <machine/cpu.h> /* for cpu_feature */
-#endif
#endif /* __amd64 || __i386__ */
/*
@@ -254,11 +242,7 @@ altq_enable(ifq)
return 0;
}
-#ifdef __NetBSD__
s = splnet();
-#else
- s = splimp();
-#endif
IFQ_PURGE_NOLOCK(ifq);
ASSERT(ifq->ifq_len == 0);
ifq->ifq_drv_maxlen = 0; /* disable bulk dequeue */
@@ -283,11 +267,7 @@ altq_disable(ifq)
return 0;
}
-#ifdef __NetBSD__
s = splnet();
-#else
- s = splimp();
-#endif
IFQ_PURGE_NOLOCK(ifq);
ASSERT(ifq->ifq_len == 0);
ifq->altq_flags &= ~(ALTQF_ENABLED|ALTQF_CLASSIFY);
@@ -444,24 +424,16 @@ static void
tbr_timeout(arg)
void *arg;
{
-#ifdef __FreeBSD__
VNET_ITERATOR_DECL(vnet_iter);
-#endif
struct ifnet *ifp;
int active, s;
active = 0;
-#ifdef __NetBSD__
s = splnet();
-#else
- s = splimp();
-#endif
-#ifdef __FreeBSD__
IFNET_RLOCK_NOSLEEP();
VNET_LIST_RLOCK_NOSLEEP();
VNET_FOREACH(vnet_iter) {
CURVNET_SET(vnet_iter);
-#endif
for (ifp = TAILQ_FIRST(&V_ifnet); ifp;
ifp = TAILQ_NEXT(ifp, if_list)) {
/* read from if_snd unlocked */
@@ -472,12 +444,10 @@ tbr_timeout(arg)
ifp->if_start != NULL)
(*ifp->if_start)(ifp);
}
-#ifdef __FreeBSD__
CURVNET_RESTORE();
}
VNET_LIST_RUNLOCK_NOSLEEP();
IFNET_RUNLOCK_NOSLEEP();
-#endif
splx(s);
if (active > 0)
CALLOUT_RESET(&tbr_callout, 1, tbr_timeout, (void *)0);
@@ -563,11 +533,7 @@ altq_pfdetach(struct pf_altq *a)
if (a->altq_disc == NULL || a->altq_disc != ifp->if_snd.altq_disc)
return (0);
-#ifdef __NetBSD__
s = splnet();
-#else
- s = splimp();
-#endif
/* read unlocked from if_snd, _disable and _detach take care */
if (ALTQ_IS_ENABLED(&ifp->if_snd))
error = altq_disable(&ifp->if_snd);
@@ -926,12 +892,8 @@ init_machclk_setup(void)
#endif
#if defined(__amd64__) || defined(__i386__)
/* check if TSC is available */
-#ifdef __FreeBSD__
if ((cpu_feature & CPUID_TSC) == 0 ||
atomic_load_acq_64(&tsc_freq) == 0)
-#else
- if ((cpu_feature & CPUID_TSC) == 0)
-#endif
machclk_usepcc = 0;
#endif
}
@@ -962,13 +924,7 @@ init_machclk(void)
* accessible, just use it.
*/
#if defined(__amd64__) || defined(__i386__)
-#ifdef __FreeBSD__
machclk_freq = atomic_load_acq_64(&tsc_freq);
-#elif defined(__NetBSD__)
- machclk_freq = (u_int32_t)cpu_tsc_freq;
-#elif defined(__OpenBSD__) && (defined(I586_CPU) || defined(I686_CPU))
- machclk_freq = pentium_mhz * 1000000;
-#endif
#endif
/*
@@ -1449,11 +1405,7 @@ acc_add_filter(classifier, filter, class, phandle)
* add this filter to the filter list.
* filters are ordered from the highest rule number.
*/
-#ifdef __NetBSD__
s = splnet();
-#else
- s = splimp();
-#endif
prev = NULL;
LIST_FOREACH(tmp, &classifier->acc_filters[i], f_chain) {
if (tmp->f_filter.ff_ruleno > afp->f_filter.ff_ruleno)
@@ -1482,11 +1434,7 @@ acc_delete_filter(classifier, handle)
if ((afp = filth_to_filtp(classifier, handle)) == NULL)
return (EINVAL);
-#ifdef __NetBSD__
s = splnet();
-#else
- s = splimp();
-#endif
LIST_REMOVE(afp, f_chain);
splx(s);
@@ -1510,11 +1458,7 @@ acc_discard_filters(classifier, class, all)
struct acc_filter *afp;
int i, s;
-#ifdef __NetBSD__
s = splnet();
-#else
- s = splimp();
-#endif
for (i = 0; i < ACC_FILTER_TABLESIZE; i++) {
do {
LIST_FOREACH(afp, &classifier->acc_filters[i], f_chain)
diff --git a/sys/contrib/altq/altq/altq_var.h b/sys/net/altq/altq_var.h
index 956ee16..df12144 100644
--- a/sys/contrib/altq/altq/altq_var.h
+++ b/sys/net/altq/altq_var.h
@@ -1,7 +1,4 @@
-/* $FreeBSD$ */
-/* $KAME: altq_var.h,v 1.16 2003/10/03 05:05:15 kjc Exp $ */
-
-/*
+/*-
* Copyright (C) 1998-2003
* Sony Computer Science Laboratories Inc. All rights reserved.
*
@@ -25,6 +22,9 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
+ *
+ * $KAME: altq_var.h,v 1.16 2003/10/03 05:05:15 kjc Exp $
+ * $FreeBSD$
*/
#ifndef _ALTQ_ALTQ_VAR_H_
#define _ALTQ_ALTQ_VAR_H_
@@ -161,7 +161,6 @@ typedef u_long ioctlcmd_t;
#endif
/* macro for timeout/untimeout */
-#if (__FreeBSD_version > 300000) || defined(__NetBSD__)
/* use callout */
#include <sys/callout.h>
@@ -175,35 +174,6 @@ typedef u_long ioctlcmd_t;
#if !defined(CALLOUT_INITIALIZER) && (__FreeBSD_version < 600000)
#define CALLOUT_INITIALIZER { { { NULL } }, 0, NULL, NULL, 0 }
#endif
-#elif defined(__OpenBSD__)
-#include <sys/timeout.h>
-/* callout structure as a wrapper of struct timeout */
-struct callout {
- struct timeout c_to;
-};
-#define CALLOUT_INIT(c) do { bzero((c), sizeof(*(c))); } while (/*CONSTCOND*/ 0)
-#define CALLOUT_RESET(c,t,f,a) do { if (!timeout_initialized(&(c)->c_to)) \
- timeout_set(&(c)->c_to, (f), (a)); \
- timeout_add(&(c)->c_to, (t)); } while (/*CONSTCOND*/ 0)
-#define CALLOUT_STOP(c) timeout_del(&(c)->c_to)
-#define CALLOUT_INITIALIZER { { { NULL }, NULL, NULL, 0, 0 } }
-#else
-/* use old-style timeout/untimeout */
-/* dummy callout structure */
-struct callout {
- void *c_arg; /* function argument */
- void (*c_func)(void *); /* functiuon to call */
-};
-#define CALLOUT_INIT(c) do { bzero((c), sizeof(*(c))); } while (/*CONSTCOND*/ 0)
-#define CALLOUT_RESET(c,t,f,a) do { (c)->c_arg = (a); \
- (c)->c_func = (f); \
- timeout((f),(a),(t)); } while (/*CONSTCOND*/ 0)
-#define CALLOUT_STOP(c) untimeout((c)->c_func,(c)->c_arg)
-#define CALLOUT_INITIALIZER { NULL, NULL }
-#endif
-#if !defined(__FreeBSD__)
-typedef void (timeout_t)(void *);
-#endif
#define m_pktlen(m) ((m)->m_pkthdr.len)
diff --git a/sys/contrib/altq/altq/if_altq.h b/sys/net/altq/if_altq.h
index 7c4d1c2..3dcc96c 100644
--- a/sys/contrib/altq/altq/if_altq.h
+++ b/sys/net/altq/if_altq.h
@@ -1,7 +1,4 @@
-/* $FreeBSD$ */
-/* $KAME: if_altq.h,v 1.12 2005/04/13 03:44:25 suz Exp $ */
-
-/*
+/*-
* Copyright (C) 1997-2003
* Sony Computer Science Laboratories Inc. All rights reserved.
*
@@ -25,19 +22,16 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
+ *
+ * $KAME: if_altq.h,v 1.12 2005/04/13 03:44:25 suz Exp $
+ * $FreeBSD$
*/
#ifndef _ALTQ_IF_ALTQ_H_
#define _ALTQ_IF_ALTQ_H_
-#ifdef __FreeBSD__
#include <sys/lock.h> /* XXX */
#include <sys/mutex.h> /* XXX */
#include <sys/event.h> /* XXX */
-#endif
-
-#ifdef _KERNEL_OPT
-#include <altq/altqconf.h>
-#endif
struct altq_pktattr; struct tb_regulator; struct top_cdnr;
@@ -50,9 +44,7 @@ struct ifaltq {
struct mbuf *ifq_tail;
int ifq_len;
int ifq_maxlen;
-#ifdef __FreeBSD__
struct mtx ifq_mtx;
-#endif
/* driver owned queue (used for bulk dequeue and prepend) UNLOCKED */
struct mbuf *ifq_drv_head;
diff --git a/sys/net/bpf.c b/sys/net/bpf.c
index a04fdef..9fc5e9f 100644
--- a/sys/net/bpf.c
+++ b/sys/net/bpf.c
@@ -69,7 +69,6 @@ __FBSDID("$FreeBSD$");
#include <net/if.h>
#include <net/if_var.h>
-#define BPF_INTERNAL
#include <net/bpf.h>
#include <net/bpf_buffer.h>
#ifdef BPF_JITTER
@@ -90,6 +89,20 @@ __FBSDID("$FreeBSD$");
MALLOC_DEFINE(M_BPF, "BPF", "BPF data");
+struct bpf_if {
+#define bif_next bif_ext.bif_next
+#define bif_dlist bif_ext.bif_dlist
+ struct bpf_if_ext bif_ext; /* public members */
+ u_int bif_dlt; /* link layer type */
+ u_int bif_hdrlen; /* length of link header */
+ struct ifnet *bif_ifp; /* corresponding interface */
+ struct rwlock bif_lock; /* interface lock */
+ LIST_HEAD(, bpf_d) bif_wlist; /* writer-only list */
+ int bif_flags; /* Interface flags */
+};
+
+CTASSERT(offsetof(struct bpf_if, bif_ext) == 0);
+
#if defined(DEV_BPF) || defined(NETGRAPH_BPF)
#define PRINET 26 /* interruptible */
@@ -601,7 +614,7 @@ bpf_attachd(struct bpf_d *d, struct bpf_if *bp)
* Save sysctl value to protect from sysctl change
* between reads
*/
- op_w = V_bpf_optimize_writers;
+ op_w = V_bpf_optimize_writers || d->bd_writer;
if (d->bd_bif != NULL)
bpf_detachd_locked(d);
@@ -864,6 +877,8 @@ bpfopen(struct cdev *dev, int flags, int fmt, struct thread *td)
* particular buffer method.
*/
bpf_buffer_init(d);
+ if ((flags & FREAD) == 0)
+ d->bd_writer = 2;
d->bd_hbuf_in_use = 0;
d->bd_bufmode = BPF_BUFMODE_BUFFER;
d->bd_sig = SIGIO;
@@ -1890,7 +1905,7 @@ bpf_setif(struct bpf_d *d, struct ifreq *ifr)
/* Check if interface is not being detached from BPF */
BPFIF_RLOCK(bp);
- if (bp->flags & BPFIF_FLAG_DYING) {
+ if (bp->bif_flags & BPFIF_FLAG_DYING) {
BPFIF_RUNLOCK(bp);
return (ENXIO);
}
@@ -2559,7 +2574,7 @@ bpfdetach(struct ifnet *ifp)
* Mark bp as detached to restrict new consumers.
*/
BPFIF_WLOCK(bp);
- bp->flags |= BPFIF_FLAG_DYING;
+ bp->bif_flags |= BPFIF_FLAG_DYING;
BPFIF_WUNLOCK(bp);
CTR4(KTR_NET, "%s: sheduling free for encap %d (%p) for if %p",
diff --git a/sys/net/bpf.h b/sys/net/bpf.h
index 47cbb87..df326e6 100644
--- a/sys/net/bpf.h
+++ b/sys/net/bpf.h
@@ -1451,21 +1451,14 @@ SYSCTL_DECL(_net_bpf);
/*
* Descriptor associated with each attached hardware interface.
- * FIXME: this structure is exposed to external callers to speed up
- * bpf_peers_present() call. However we cover all fields not needed by
- * this function via BPF_INTERNAL define
+ * Part of this structure is exposed to external callers to speed up
+ * bpf_peers_present() calls.
*/
-struct bpf_if {
+struct bpf_if;
+
+struct bpf_if_ext {
LIST_ENTRY(bpf_if) bif_next; /* list of all interfaces */
LIST_HEAD(, bpf_d) bif_dlist; /* descriptor list */
-#ifdef BPF_INTERNAL
- u_int bif_dlt; /* link layer type */
- u_int bif_hdrlen; /* length of link header */
- struct ifnet *bif_ifp; /* corresponding interface */
- struct rwlock bif_lock; /* interface lock */
- LIST_HEAD(, bpf_d) bif_wlist; /* writer-only list */
- int flags; /* Interface flags */
-#endif
};
void bpf_bufheld(struct bpf_d *d);
@@ -1483,8 +1476,10 @@ u_int bpf_filter(const struct bpf_insn *, u_char *, u_int, u_int);
static __inline int
bpf_peers_present(struct bpf_if *bpf)
{
+ struct bpf_if_ext *ext;
- if (!LIST_EMPTY(&bpf->bif_dlist))
+ ext = (struct bpf_if_ext *)bpf;
+ if (!LIST_EMPTY(&ext->bif_dlist))
return (1);
return (0);
}
diff --git a/sys/net/ieee8023ad_lacp.c b/sys/net/ieee8023ad_lacp.c
index c422c25..64aafb1 100644
--- a/sys/net/ieee8023ad_lacp.c
+++ b/sys/net/ieee8023ad_lacp.c
@@ -1066,12 +1066,16 @@ lacp_compose_key(struct lacp_port *lp)
case IFM_100_T4:
case IFM_100_VG:
case IFM_100_T2:
+ case IFM_100_T:
key = IFM_100_TX;
break;
case IFM_1000_SX:
case IFM_1000_LX:
case IFM_1000_CX:
case IFM_1000_T:
+ case IFM_1000_KX:
+ case IFM_1000_SGMII:
+ case IFM_1000_CX_SGMII:
key = IFM_1000_SX;
break;
case IFM_10G_LR:
@@ -1081,15 +1085,53 @@ lacp_compose_key(struct lacp_port *lp)
case IFM_10G_TWINAX_LONG:
case IFM_10G_LRM:
case IFM_10G_T:
+ case IFM_10G_KX4:
+ case IFM_10G_KR:
+ case IFM_10G_CR1:
+ case IFM_10G_ER:
+ case IFM_10G_SFI:
key = IFM_10G_LR;
break;
+ case IFM_20G_KR2:
+ key = IFM_20G_KR2;
+ break;
+ case IFM_2500_KX:
+ case IFM_2500_T:
+ key = IFM_2500_KX;
+ break;
+ case IFM_5000_T:
+ key = IFM_5000_T;
+ break;
+ case IFM_50G_PCIE:
+ case IFM_50G_CR2:
+ case IFM_50G_KR2:
+ key = IFM_50G_PCIE;
+ break;
+ case IFM_56G_R4:
+ key = IFM_56G_R4;
+ break;
+ case IFM_25G_PCIE:
+ case IFM_25G_CR:
+ case IFM_25G_KR:
+ case IFM_25G_SR:
+ key = IFM_25G_PCIE;
+ break;
case IFM_40G_CR4:
case IFM_40G_SR4:
case IFM_40G_LR4:
+ case IFM_40G_XLPPI:
+ case IFM_40G_KR4:
key = IFM_40G_CR4;
break;
+ case IFM_100G_CR4:
+ case IFM_100G_SR4:
+ case IFM_100G_KR4:
+ case IFM_100G_LR4:
+ key = IFM_100G_CR4;
+ break;
default:
key = subtype;
+ break;
}
/* bit 5..14: (some bits of) if_index of lagg device */
key |= 0x7fe0 & ((sc->sc_ifp->if_index) << 5);
diff --git a/sys/net/if.c b/sys/net/if.c
index 9d56803..1dec451 100644
--- a/sys/net/if.c
+++ b/sys/net/if.c
@@ -2582,6 +2582,7 @@ ifhwioctl(u_long cmd, struct ifnet *ifp, caddr_t data, struct thread *td)
case SIOCGIFPSRCADDR:
case SIOCGIFPDSTADDR:
case SIOCGIFMEDIA:
+ case SIOCGIFXMEDIA:
case SIOCGIFGENERIC:
if (ifp->if_ioctl == NULL)
return (EOPNOTSUPP);
diff --git a/sys/net/if_media.c b/sys/net/if_media.c
index 810db3f..abdfa2b 100644
--- a/sys/net/if_media.c
+++ b/sys/net/if_media.c
@@ -46,6 +46,8 @@
* to implement this interface.
*/
+#include "opt_ifmedia.h"
+
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/socket.h>
@@ -68,6 +70,7 @@ static struct ifmedia_entry *ifmedia_match(struct ifmedia *ifm,
int flags, int mask);
#ifdef IFMEDIA_DEBUG
+#include <net/if_var.h>
int ifmedia_debug = 0;
SYSCTL_INT(_debug, OID_AUTO, ifmedia, CTLFLAG_RW, &ifmedia_debug,
0, "if_media debugging msgs");
@@ -193,6 +196,21 @@ ifmedia_set(ifm, target)
}
/*
+ * Given a media word, return one suitable for an application
+ * using the original encoding.
+ */
+static int
+compat_media(int media)
+{
+
+ if (IFM_TYPE(media) == IFM_ETHER && IFM_SUBTYPE(media) > IFM_OTHER) {
+ media &= ~(IFM_ETH_XTYPE|IFM_TMASK);
+ media |= IFM_OTHER;
+ }
+ return (media);
+}
+
+/*
* Device-independent media ioctl support function.
*/
int
@@ -271,6 +289,7 @@ ifmedia_ioctl(ifp, ifr, ifm, cmd)
* Get list of available media and current media on interface.
*/
case SIOCGIFMEDIA:
+ case SIOCGIFXMEDIA:
{
struct ifmedia_entry *ep;
int i;
@@ -278,8 +297,13 @@ ifmedia_ioctl(ifp, ifr, ifm, cmd)
if (ifmr->ifm_count < 0)
return (EINVAL);
- ifmr->ifm_active = ifmr->ifm_current = ifm->ifm_cur ?
- ifm->ifm_cur->ifm_media : IFM_NONE;
+ if (cmd == SIOCGIFMEDIA) {
+ ifmr->ifm_active = ifmr->ifm_current = ifm->ifm_cur ?
+ compat_media(ifm->ifm_cur->ifm_media) : IFM_NONE;
+ } else {
+ ifmr->ifm_active = ifmr->ifm_current = ifm->ifm_cur ?
+ ifm->ifm_cur->ifm_media : IFM_NONE;
+ }
ifmr->ifm_mask = ifm->ifm_mask;
ifmr->ifm_status = 0;
(*ifm->ifm_status)(ifp, ifmr);
@@ -354,8 +378,7 @@ ifmedia_baudrate(int mword)
int i;
for (i = 0; ifmedia_baudrate_descriptions[i].ifmb_word != 0; i++) {
- if ((mword & (IFM_NMASK|IFM_TMASK)) ==
- ifmedia_baudrate_descriptions[i].ifmb_word)
+ if (IFM_TYPE_MATCH(mword, ifmedia_baudrate_descriptions[i].ifmb_word))
return (ifmedia_baudrate_descriptions[i].ifmb_baudrate);
}
@@ -461,7 +484,7 @@ ifmedia_printword(ifmw)
printf("<unknown type>\n");
return;
}
- printf(desc->ifmt_string);
+ printf("%s", desc->ifmt_string);
/* Any mode. */
for (desc = ttos->modes; desc && desc->ifmt_string != NULL; desc++)
diff --git a/sys/net/if_media.h b/sys/net/if_media.h
index 88384f3..8643995 100644
--- a/sys/net/if_media.h
+++ b/sys/net/if_media.h
@@ -118,7 +118,7 @@ uint64_t ifmedia_baudrate(int);
* ---- -------
* 0-4 Media variant
* 5-7 Media type
- * 8-15 Type specific options
+ * 8-15 Type specific options (includes added variant bits on Ethernet)
* 16-18 Mode (for multi-mode devices)
* 19 RFU
* 20-27 Shared (global) options
@@ -127,8 +127,18 @@ uint64_t ifmedia_baudrate(int);
/*
* Ethernet
+ * In order to use more than 31 subtypes, Ethernet uses some of the option
+ * bits as part of the subtype field. See the options section below for
+ * relevant definitions
*/
#define IFM_ETHER 0x00000020
+#define IFM_ETHER_SUBTYPE(x) (((x) & IFM_TMASK) | \
+ (((x) & (IFM_ETH_XTYPE >> IFM_ETH_XSHIFT)) << IFM_ETH_XSHIFT))
+#define IFM_X(x) IFM_ETHER_SUBTYPE(x) /* internal shorthand */
+#define IFM_ETHER_SUBTYPE_SET(x) (IFM_ETHER_SUBTYPE(x) | IFM_ETHER)
+#define IFM_ETHER_SUBTYPE_GET(x) ((x) & (IFM_TMASK|IFM_ETH_XTYPE))
+#define IFM_ETHER_IS_EXTENDED(x) ((x) & IFM_ETH_XTYPE)
+
#define IFM_10_T 3 /* 10BaseT - RJ45 */
#define IFM_10_2 4 /* 10Base2 - Thinnet */
#define IFM_10_5 5 /* 10Base5 - AUI */
@@ -156,15 +166,49 @@ uint64_t ifmedia_baudrate(int);
#define IFM_40G_CR4 27 /* 40GBase-CR4 */
#define IFM_40G_SR4 28 /* 40GBase-SR4 */
#define IFM_40G_LR4 29 /* 40GBase-LR4 */
+#define IFM_1000_KX 30 /* 1000Base-KX backplane */
+#define IFM_OTHER 31 /* Other: one of the following */
+
+/* following types are not visible to old binaries using only IFM_TMASK */
+#define IFM_10G_KX4 IFM_X(32) /* 10GBase-KX4 backplane */
+#define IFM_10G_KR IFM_X(33) /* 10GBase-KR backplane */
+#define IFM_10G_CR1 IFM_X(34) /* 10GBase-CR1 Twinax splitter */
+#define IFM_20G_KR2 IFM_X(35) /* 20GBase-KR2 backplane */
+#define IFM_2500_KX IFM_X(36) /* 2500Base-KX backplane */
+#define IFM_2500_T IFM_X(37) /* 2500Base-T - RJ45 (NBaseT) */
+#define IFM_5000_T IFM_X(38) /* 5000Base-T - RJ45 (NBaseT) */
+#define IFM_50G_PCIE IFM_X(39) /* 50G Ethernet over PCIE */
+#define IFM_25G_PCIE IFM_X(40) /* 25G Ethernet over PCIE */
+#define IFM_1000_SGMII IFM_X(41) /* 1G media interface */
+#define IFM_10G_SFI IFM_X(42) /* 10G media interface */
+#define IFM_40G_XLPPI IFM_X(43) /* 40G media interface */
+#define IFM_1000_CX_SGMII IFM_X(44) /* 1000Base-CX-SGMII */
+#define IFM_40G_KR4 IFM_X(45) /* 40GBase-KR4 */
+#define IFM_10G_ER IFM_X(46) /* 10GBase-ER */
+#define IFM_100G_CR4 IFM_X(47) /* 100GBase-CR4 */
+#define IFM_100G_SR4 IFM_X(48) /* 100GBase-SR4 */
+#define IFM_100G_KR4 IFM_X(49) /* 100GBase-KR4 */
+#define IFM_100G_LR4 IFM_X(50) /* 100GBase-LR4 */
+#define IFM_56G_R4 IFM_X(51) /* 56GBase-R4 */
+#define IFM_100_T IFM_X(52) /* 100BaseT - RJ45 */
+#define IFM_25G_CR IFM_X(53) /* 25GBase-CR */
+#define IFM_25G_KR IFM_X(54) /* 25GBase-KR */
+#define IFM_25G_SR IFM_X(55) /* 25GBase-SR */
+#define IFM_50G_CR2 IFM_X(56) /* 50GBase-CR2 */
+#define IFM_50G_KR2 IFM_X(57) /* 50GBase-KR2 */
+
/*
* Please update ieee8023ad_lacp.c:lacp_compose_key()
* after adding new Ethernet media types.
*/
-/* note 31 is the max! */
+/* Note IFM_X(511) is the max! */
+/* Ethernet option values; includes bits used for extended variant field */
#define IFM_ETH_MASTER 0x00000100 /* master mode (1000baseT) */
#define IFM_ETH_RXPAUSE 0x00000200 /* receive PAUSE frames */
#define IFM_ETH_TXPAUSE 0x00000400 /* transmit PAUSE frames */
+#define IFM_ETH_XTYPE 0x00007800 /* extended media variants */
+#define IFM_ETH_XSHIFT 6 /* shift XTYPE next to TMASK */
/*
* Token ring
@@ -307,7 +351,10 @@ uint64_t ifmedia_baudrate(int);
* Macros to extract various bits of information from the media word.
*/
#define IFM_TYPE(x) ((x) & IFM_NMASK)
-#define IFM_SUBTYPE(x) ((x) & IFM_TMASK)
+#define IFM_SUBTYPE(x) \
+ (IFM_TYPE(x) == IFM_ETHER ? IFM_ETHER_SUBTYPE_GET(x) : ((x) & IFM_TMASK))
+#define IFM_TYPE_MATCH(x,y) \
+ (IFM_TYPE(x) == IFM_TYPE(y) && IFM_SUBTYPE(x) == IFM_SUBTYPE(y))
#define IFM_TYPE_OPTIONS(x) ((x) & IFM_OMASK)
#define IFM_INST(x) (((x) & IFM_IMASK) >> IFM_ISHIFT)
#define IFM_OPTIONS(x) ((x) & (IFM_OMASK | IFM_GMASK))
@@ -372,6 +419,34 @@ struct ifmedia_description {
{ IFM_40G_CR4, "40Gbase-CR4" }, \
{ IFM_40G_SR4, "40Gbase-SR4" }, \
{ IFM_40G_LR4, "40Gbase-LR4" }, \
+ { IFM_1000_KX, "1000Base-KX" }, \
+ { IFM_OTHER, "Other" }, \
+ { IFM_10G_KX4, "10GBase-KX4" }, \
+ { IFM_10G_KR, "10GBase-KR" }, \
+ { IFM_10G_CR1, "10GBase-CR1" }, \
+ { IFM_20G_KR2, "20GBase-KR2" }, \
+ { IFM_2500_KX, "2500Base-KX" }, \
+ { IFM_2500_T, "2500Base-T" }, \
+ { IFM_5000_T, "5000Base-T" }, \
+ { IFM_50G_PCIE, "PCIExpress-50G" }, \
+ { IFM_25G_PCIE, "PCIExpress-25G" }, \
+ { IFM_1000_SGMII, "1000Base-SGMII" }, \
+ { IFM_10G_SFI, "10GBase-SFI" }, \
+ { IFM_40G_XLPPI, "40GBase-XLPPI" }, \
+ { IFM_1000_CX_SGMII, "1000Base-CX-SGMII" }, \
+ { IFM_40G_KR4, "40GBase-KR4" }, \
+ { IFM_10G_ER, "10GBase-ER" }, \
+ { IFM_100G_CR4, "100GBase-CR4" }, \
+ { IFM_100G_SR4, "100GBase-SR4" }, \
+ { IFM_100G_KR4, "100GBase-KR4" }, \
+ { IFM_100G_LR4, "100GBase-LR4" }, \
+ { IFM_56G_R4, "56GBase-R4" }, \
+ { IFM_100_T, "100BaseT" }, \
+ { IFM_25G_CR, "25GBase-CR" }, \
+ { IFM_25G_KR, "25GBase-KR" }, \
+ { IFM_25G_SR, "25GBase-SR" }, \
+ { IFM_50G_CR2, "50GBase-CR2" }, \
+ { IFM_50G_KR2, "50GBase-KR2" }, \
{ 0, NULL }, \
}
@@ -673,6 +748,33 @@ struct ifmedia_baudrate {
{ IFM_ETHER | IFM_40G_CR4, IF_Gbps(40ULL) }, \
{ IFM_ETHER | IFM_40G_SR4, IF_Gbps(40ULL) }, \
{ IFM_ETHER | IFM_40G_LR4, IF_Gbps(40ULL) }, \
+ { IFM_ETHER | IFM_1000_KX, IF_Mbps(1000) }, \
+ { IFM_ETHER | IFM_10G_KX4, IF_Gbps(10ULL) }, \
+ { IFM_ETHER | IFM_10G_KR, IF_Gbps(10ULL) }, \
+ { IFM_ETHER | IFM_10G_CR1, IF_Gbps(10ULL) }, \
+ { IFM_ETHER | IFM_20G_KR2, IF_Gbps(20ULL) }, \
+ { IFM_ETHER | IFM_2500_KX, IF_Mbps(2500) }, \
+ { IFM_ETHER | IFM_2500_T, IF_Mbps(2500) }, \
+ { IFM_ETHER | IFM_5000_T, IF_Mbps(5000) }, \
+ { IFM_ETHER | IFM_50G_PCIE, IF_Gbps(50ULL) }, \
+ { IFM_ETHER | IFM_25G_PCIE, IF_Gbps(25ULL) }, \
+ { IFM_ETHER | IFM_1000_SGMII, IF_Mbps(1000) }, \
+ { IFM_ETHER | IFM_10G_SFI, IF_Gbps(10ULL) }, \
+ { IFM_ETHER | IFM_40G_XLPPI, IF_Gbps(40ULL) }, \
+ { IFM_ETHER | IFM_1000_CX_SGMII, IF_Mbps(1000) }, \
+ { IFM_ETHER | IFM_40G_KR4, IF_Gbps(40ULL) }, \
+ { IFM_ETHER | IFM_10G_ER, IF_Gbps(10ULL) }, \
+ { IFM_ETHER | IFM_100G_CR4, IF_Gbps(100ULL) }, \
+ { IFM_ETHER | IFM_100G_SR4, IF_Gbps(100ULL) }, \
+ { IFM_ETHER | IFM_100G_KR4, IF_Gbps(100ULL) }, \
+ { IFM_ETHER | IFM_100G_LR4, IF_Gbps(100ULL) }, \
+ { IFM_ETHER | IFM_56G_R4, IF_Gbps(56ULL) }, \
+ { IFM_ETHER | IFM_100_T, IF_Mbps(100ULL) }, \
+ { IFM_ETHER | IFM_25G_CR, IF_Gbps(25ULL) }, \
+ { IFM_ETHER | IFM_25G_KR, IF_Gbps(25ULL) }, \
+ { IFM_ETHER | IFM_25G_SR, IF_Gbps(25ULL) }, \
+ { IFM_ETHER | IFM_50G_CR2, IF_Gbps(50ULL) }, \
+ { IFM_ETHER | IFM_50G_KR2, IF_Gbps(50ULL) }, \
\
{ IFM_TOKEN | IFM_TOK_STP4, IF_Mbps(4) }, \
{ IFM_TOKEN | IFM_TOK_STP16, IF_Mbps(16) }, \
diff --git a/sys/net/if_tap.c b/sys/net/if_tap.c
index 5f6f0aa..b23ab34 100644
--- a/sys/net/if_tap.c
+++ b/sys/net/if_tap.c
@@ -156,7 +156,6 @@ static int tapdebug = 0; /* debug flag */
static int tapuopen = 0; /* allow user open() */
static int tapuponopen = 0; /* IFF_UP on open() */
static int tapdclone = 1; /* enable devfs cloning */
-static int tapclosedeladdrs = 1; /* del addrs on close */
static SLIST_HEAD(, tap_softc) taphead; /* first device */
static struct clonedevs *tapclones;
@@ -173,9 +172,6 @@ SYSCTL_INT(_net_link_tap, OID_AUTO, up_on_open, CTLFLAG_RW, &tapuponopen, 0,
"Bring interface up when /dev/tap is opened");
SYSCTL_INT(_net_link_tap, OID_AUTO, devfs_cloning, CTLFLAG_RWTUN, &tapdclone, 0,
"Enably legacy devfs interface creation");
-SYSCTL_INT(_net_link_tap, OID_AUTO, deladdrs_on_close, CTLFLAG_RW,
- &tapclosedeladdrs, 0, "Delete addresses and routes when /dev/tap is "
- "closed");
SYSCTL_INT(_net_link_tap, OID_AUTO, debug, CTLFLAG_RW, &tapdebug, 0, "");
DEV_MODULE(if_tap, tapmodevent, NULL);
@@ -536,12 +532,11 @@ tapclose(struct cdev *dev, int foo, int bar, struct thread *td)
IF_DRAIN(&ifp->if_snd);
/*
- * do not bring the interface down, and do not anything with
- * interface, if we are in VMnet mode. just close the device.
+ * Do not bring the interface down, and do not anything with
+ * interface, if we are in VMnet mode. Just close the device.
*/
-
- if (tapclosedeladdrs == 1 && ((tp->tap_flags & TAP_VMNET) == 0) &&
- (ifp->if_flags & IFF_UP)) {
+ if (((tp->tap_flags & TAP_VMNET) == 0) &&
+ (ifp->if_flags & (IFF_UP | IFF_LINK0)) == IFF_UP) {
mtx_unlock(&tp->tap_mtx);
if_down(ifp);
mtx_lock(&tp->tap_mtx);
diff --git a/sys/net/if_types.h b/sys/net/if_types.h
index c9b20db..92e101a 100644
--- a/sys/net/if_types.h
+++ b/sys/net/if_types.h
@@ -42,211 +42,232 @@
* http://www.iana.org/assignments/smi-numbers
*/
-#define IFT_OTHER 0x1 /* none of the following */
-#define IFT_1822 0x2 /* old-style arpanet imp */
-#define IFT_HDH1822 0x3 /* HDH arpanet imp */
-#define IFT_X25DDN 0x4 /* x25 to imp */
-#define IFT_X25 0x5 /* PDN X25 interface (RFC877) */
-#define IFT_ETHER 0x6 /* Ethernet CSMA/CD */
-#define IFT_ISO88023 0x7 /* CMSA/CD */
-#define IFT_ISO88024 0x8 /* Token Bus */
-#define IFT_ISO88025 0x9 /* Token Ring */
-#define IFT_ISO88026 0xa /* MAN */
-#define IFT_STARLAN 0xb
-#define IFT_P10 0xc /* Proteon 10MBit ring */
-#define IFT_P80 0xd /* Proteon 80MBit ring */
-#define IFT_HY 0xe /* Hyperchannel */
-#define IFT_FDDI 0xf
-#define IFT_LAPB 0x10
-#define IFT_SDLC 0x11
-#define IFT_T1 0x12
-#define IFT_CEPT 0x13 /* E1 - european T1 */
-#define IFT_ISDNBASIC 0x14
-#define IFT_ISDNPRIMARY 0x15
-#define IFT_PTPSERIAL 0x16 /* Proprietary PTP serial */
-#define IFT_PPP 0x17 /* RFC 1331 */
-#define IFT_LOOP 0x18 /* loopback */
-#define IFT_EON 0x19 /* ISO over IP */
-#define IFT_XETHER 0x1a /* obsolete 3MB experimental ethernet */
-#define IFT_NSIP 0x1b /* XNS over IP */
-#define IFT_SLIP 0x1c /* IP over generic TTY */
-#define IFT_ULTRA 0x1d /* Ultra Technologies */
-#define IFT_DS3 0x1e /* Generic T3 */
-#define IFT_SIP 0x1f /* SMDS */
-#define IFT_FRELAY 0x20 /* Frame Relay DTE only */
-#define IFT_RS232 0x21
-#define IFT_PARA 0x22 /* parallel-port */
-#define IFT_ARCNET 0x23
-#define IFT_ARCNETPLUS 0x24
-#define IFT_ATM 0x25 /* ATM cells */
-#define IFT_MIOX25 0x26
-#define IFT_SONET 0x27 /* SONET or SDH */
-#define IFT_X25PLE 0x28
-#define IFT_ISO88022LLC 0x29
-#define IFT_LOCALTALK 0x2a
-#define IFT_SMDSDXI 0x2b
-#define IFT_FRELAYDCE 0x2c /* Frame Relay DCE */
-#define IFT_V35 0x2d
-#define IFT_HSSI 0x2e
-#define IFT_HIPPI 0x2f
-#define IFT_MODEM 0x30 /* Generic Modem */
-#define IFT_AAL5 0x31 /* AAL5 over ATM */
-#define IFT_SONETPATH 0x32
-#define IFT_SONETVT 0x33
-#define IFT_SMDSICIP 0x34 /* SMDS InterCarrier Interface */
-#define IFT_PROPVIRTUAL 0x35 /* Proprietary Virtual/internal */
-#define IFT_PROPMUX 0x36 /* Proprietary Multiplexing */
-#define IFT_IEEE80212 0x37 /* 100BaseVG */
-#define IFT_FIBRECHANNEL 0x38 /* Fibre Channel */
-#define IFT_HIPPIINTERFACE 0x39 /* HIPPI interfaces */
-#define IFT_FRAMERELAYINTERCONNECT 0x3a /* Obsolete, use either 0x20 or 0x2c */
-#define IFT_AFLANE8023 0x3b /* ATM Emulated LAN for 802.3 */
-#define IFT_AFLANE8025 0x3c /* ATM Emulated LAN for 802.5 */
-#define IFT_CCTEMUL 0x3d /* ATM Emulated circuit */
-#define IFT_FASTETHER 0x3e /* Fast Ethernet (100BaseT) */
-#define IFT_ISDN 0x3f /* ISDN and X.25 */
-#define IFT_V11 0x40 /* CCITT V.11/X.21 */
-#define IFT_V36 0x41 /* CCITT V.36 */
-#define IFT_G703AT64K 0x42 /* CCITT G703 at 64Kbps */
-#define IFT_G703AT2MB 0x43 /* Obsolete see DS1-MIB */
-#define IFT_QLLC 0x44 /* SNA QLLC */
-#define IFT_FASTETHERFX 0x45 /* Fast Ethernet (100BaseFX) */
-#define IFT_CHANNEL 0x46 /* channel */
-#define IFT_IEEE80211 0x47 /* radio spread spectrum */
-#define IFT_IBM370PARCHAN 0x48 /* IBM System 360/370 OEMI Channel */
-#define IFT_ESCON 0x49 /* IBM Enterprise Systems Connection */
-#define IFT_DLSW 0x4a /* Data Link Switching */
-#define IFT_ISDNS 0x4b /* ISDN S/T interface */
-#define IFT_ISDNU 0x4c /* ISDN U interface */
-#define IFT_LAPD 0x4d /* Link Access Protocol D */
-#define IFT_IPSWITCH 0x4e /* IP Switching Objects */
-#define IFT_RSRB 0x4f /* Remote Source Route Bridging */
-#define IFT_ATMLOGICAL 0x50 /* ATM Logical Port */
-#define IFT_DS0 0x51 /* Digital Signal Level 0 */
-#define IFT_DS0BUNDLE 0x52 /* group of ds0s on the same ds1 */
-#define IFT_BSC 0x53 /* Bisynchronous Protocol */
-#define IFT_ASYNC 0x54 /* Asynchronous Protocol */
-#define IFT_CNR 0x55 /* Combat Net Radio */
-#define IFT_ISO88025DTR 0x56 /* ISO 802.5r DTR */
-#define IFT_EPLRS 0x57 /* Ext Pos Loc Report Sys */
-#define IFT_ARAP 0x58 /* Appletalk Remote Access Protocol */
-#define IFT_PROPCNLS 0x59 /* Proprietary Connectionless Protocol*/
-#define IFT_HOSTPAD 0x5a /* CCITT-ITU X.29 PAD Protocol */
-#define IFT_TERMPAD 0x5b /* CCITT-ITU X.3 PAD Facility */
-#define IFT_FRAMERELAYMPI 0x5c /* Multiproto Interconnect over FR */
-#define IFT_X213 0x5d /* CCITT-ITU X213 */
-#define IFT_ADSL 0x5e /* Asymmetric Digital Subscriber Loop */
-#define IFT_RADSL 0x5f /* Rate-Adapt. Digital Subscriber Loop*/
-#define IFT_SDSL 0x60 /* Symmetric Digital Subscriber Loop */
-#define IFT_VDSL 0x61 /* Very H-Speed Digital Subscrib. Loop*/
-#define IFT_ISO88025CRFPINT 0x62 /* ISO 802.5 CRFP */
-#define IFT_MYRINET 0x63 /* Myricom Myrinet */
-#define IFT_VOICEEM 0x64 /* voice recEive and transMit */
-#define IFT_VOICEFXO 0x65 /* voice Foreign Exchange Office */
-#define IFT_VOICEFXS 0x66 /* voice Foreign Exchange Station */
-#define IFT_VOICEENCAP 0x67 /* voice encapsulation */
-#define IFT_VOICEOVERIP 0x68 /* voice over IP encapsulation */
-#define IFT_ATMDXI 0x69 /* ATM DXI */
-#define IFT_ATMFUNI 0x6a /* ATM FUNI */
-#define IFT_ATMIMA 0x6b /* ATM IMA */
-#define IFT_PPPMULTILINKBUNDLE 0x6c /* PPP Multilink Bundle */
-#define IFT_IPOVERCDLC 0x6d /* IBM ipOverCdlc */
-#define IFT_IPOVERCLAW 0x6e /* IBM Common Link Access to Workstn */
-#define IFT_STACKTOSTACK 0x6f /* IBM stackToStack */
-#define IFT_VIRTUALIPADDRESS 0x70 /* IBM VIPA */
-#define IFT_MPC 0x71 /* IBM multi-protocol channel support */
-#define IFT_IPOVERATM 0x72 /* IBM ipOverAtm */
-#define IFT_ISO88025FIBER 0x73 /* ISO 802.5j Fiber Token Ring */
-#define IFT_TDLC 0x74 /* IBM twinaxial data link control */
-#define IFT_GIGABITETHERNET 0x75 /* Gigabit Ethernet */
-#define IFT_HDLC 0x76 /* HDLC */
-#define IFT_LAPF 0x77 /* LAP F */
-#define IFT_V37 0x78 /* V.37 */
-#define IFT_X25MLP 0x79 /* Multi-Link Protocol */
-#define IFT_X25HUNTGROUP 0x7a /* X25 Hunt Group */
-#define IFT_TRANSPHDLC 0x7b /* Transp HDLC */
-#define IFT_INTERLEAVE 0x7c /* Interleave channel */
-#define IFT_FAST 0x7d /* Fast channel */
-#define IFT_IP 0x7e /* IP (for APPN HPR in IP networks) */
-#define IFT_DOCSCABLEMACLAYER 0x7f /* CATV Mac Layer */
-#define IFT_DOCSCABLEDOWNSTREAM 0x80 /* CATV Downstream interface */
-#define IFT_DOCSCABLEUPSTREAM 0x81 /* CATV Upstream interface */
-#define IFT_A12MPPSWITCH 0x82 /* Avalon Parallel Processor */
-#define IFT_TUNNEL 0x83 /* Encapsulation interface */
-#define IFT_COFFEE 0x84 /* coffee pot */
-#define IFT_CES 0x85 /* Circiut Emulation Service */
-#define IFT_ATMSUBINTERFACE 0x86 /* (x) ATM Sub Interface */
-#define IFT_L2VLAN 0x87 /* Layer 2 Virtual LAN using 802.1Q */
-#define IFT_L3IPVLAN 0x88 /* Layer 3 Virtual LAN - IP Protocol */
-#define IFT_L3IPXVLAN 0x89 /* Layer 3 Virtual LAN - IPX Prot. */
-#define IFT_DIGITALPOWERLINE 0x8a /* IP over Power Lines */
-#define IFT_MEDIAMAILOVERIP 0x8b /* (xxx) Multimedia Mail over IP */
-#define IFT_DTM 0x8c /* Dynamic synchronous Transfer Mode */
-#define IFT_DCN 0x8d /* Data Communications Network */
-#define IFT_IPFORWARD 0x8e /* IP Forwarding Interface */
-#define IFT_MSDSL 0x8f /* Multi-rate Symmetric DSL */
-#define IFT_IEEE1394 0x90 /* IEEE1394 High Performance SerialBus*/
-#define IFT_IFGSN 0x91 /* HIPPI-6400 */
-#define IFT_DVBRCCMACLAYER 0x92 /* DVB-RCC MAC Layer */
-#define IFT_DVBRCCDOWNSTREAM 0x93 /* DVB-RCC Downstream Channel */
-#define IFT_DVBRCCUPSTREAM 0x94 /* DVB-RCC Upstream Channel */
-#define IFT_ATMVIRTUAL 0x95 /* ATM Virtual Interface */
-#define IFT_MPLSTUNNEL 0x96 /* MPLS Tunnel Virtual Interface */
-#define IFT_SRP 0x97 /* Spatial Reuse Protocol */
-#define IFT_VOICEOVERATM 0x98 /* Voice over ATM */
-#define IFT_VOICEOVERFRAMERELAY 0x99 /* Voice Over Frame Relay */
-#define IFT_IDSL 0x9a /* Digital Subscriber Loop over ISDN */
-#define IFT_COMPOSITELINK 0x9b /* Avici Composite Link Interface */
-#define IFT_SS7SIGLINK 0x9c /* SS7 Signaling Link */
-#define IFT_PROPWIRELESSP2P 0x9d /* Prop. P2P wireless interface */
-#define IFT_FRFORWARD 0x9e /* Frame forward Interface */
-#define IFT_RFC1483 0x9f /* Multiprotocol over ATM AAL5 */
-#define IFT_USB 0xa0 /* USB Interface */
-#define IFT_IEEE8023ADLAG 0xa1 /* IEEE 802.3ad Link Aggregate*/
-#define IFT_BGPPOLICYACCOUNTING 0xa2 /* BGP Policy Accounting */
-#define IFT_FRF16MFRBUNDLE 0xa3 /* FRF.16 Multilik Frame Relay*/
-#define IFT_H323GATEKEEPER 0xa4 /* H323 Gatekeeper */
-#define IFT_H323PROXY 0xa5 /* H323 Voice and Video Proxy */
-#define IFT_MPLS 0xa6 /* MPLS */
-#define IFT_MFSIGLINK 0xa7 /* Multi-frequency signaling link */
-#define IFT_HDSL2 0xa8 /* High Bit-Rate DSL, 2nd gen. */
-#define IFT_SHDSL 0xa9 /* Multirate HDSL2 */
-#define IFT_DS1FDL 0xaa /* Facility Data Link (4Kbps) on a DS1*/
-#define IFT_POS 0xab /* Packet over SONET/SDH Interface */
-#define IFT_DVBASILN 0xac /* DVB-ASI Input */
-#define IFT_DVBASIOUT 0xad /* DVB-ASI Output */
-#define IFT_PLC 0xae /* Power Line Communications */
-#define IFT_NFAS 0xaf /* Non-Facility Associated Signaling */
-#define IFT_TR008 0xb0 /* TROO8 */
-#define IFT_GR303RDT 0xb1 /* Remote Digital Terminal */
-#define IFT_GR303IDT 0xb2 /* Integrated Digital Terminal */
-#define IFT_ISUP 0xb3 /* ISUP */
-#define IFT_PROPDOCSWIRELESSMACLAYER 0xb4 /* prop/Wireless MAC Layer */
-#define IFT_PROPDOCSWIRELESSDOWNSTREAM 0xb5 /* prop/Wireless Downstream */
-#define IFT_PROPDOCSWIRELESSUPSTREAM 0xb6 /* prop/Wireless Upstream */
-#define IFT_HIPERLAN2 0xb7 /* HIPERLAN Type 2 Radio Interface */
-#define IFT_PROPBWAP2MP 0xb8 /* PropBroadbandWirelessAccess P2MP*/
-#define IFT_SONETOVERHEADCHANNEL 0xb9 /* SONET Overhead Channel */
-#define IFT_DIGITALWRAPPEROVERHEADCHANNEL 0xba /* Digital Wrapper Overhead */
-#define IFT_AAL2 0xbb /* ATM adaptation layer 2 */
-#define IFT_RADIOMAC 0xbc /* MAC layer over radio links */
-#define IFT_ATMRADIO 0xbd /* ATM over radio links */
-#define IFT_IMT 0xbe /* Inter-Machine Trunks */
-#define IFT_MVL 0xbf /* Multiple Virtual Lines DSL */
-#define IFT_REACHDSL 0xc0 /* Long Reach DSL */
-#define IFT_FRDLCIENDPT 0xc1 /* Frame Relay DLCI End Point */
-#define IFT_ATMVCIENDPT 0xc2 /* ATM VCI End Point */
-#define IFT_OPTICALCHANNEL 0xc3 /* Optical Channel */
-#define IFT_OPTICALTRANSPORT 0xc4 /* Optical Transport */
-#define IFT_INFINIBAND 0xc7 /* Infiniband */
-#define IFT_BRIDGE 0xd1 /* Transparent bridge interface */
+typedef enum {
+ IFT_OTHER = 0x1, /* none of the following */
+ IFT_1822 = 0x2, /* old-style arpanet imp */
+ IFT_HDH1822 = 0x3, /* HDH arpanet imp */
+ IFT_X25DDN = 0x4, /* x25 to imp */
+ IFT_X25 = 0x5, /* PDN X25 interface (RFC877) */
+ IFT_ETHER = 0x6, /* Ethernet CSMA/CD */
+ IFT_ISO88023 = 0x7, /* CMSA/CD */
+ IFT_ISO88024 = 0x8, /* Token Bus */
+ IFT_ISO88025 = 0x9, /* Token Ring */
+ IFT_ISO88026 = 0xa, /* MAN */
+ IFT_STARLAN = 0xb,
+ IFT_P10 = 0xc, /* Proteon 10MBit ring */
+ IFT_P80 = 0xd, /* Proteon 80MBit ring */
+ IFT_HY = 0xe, /* Hyperchannel */
+ IFT_FDDI = 0xf,
+ IFT_LAPB = 0x10,
+ IFT_SDLC = 0x11,
+ IFT_T1 = 0x12,
+ IFT_CEPT = 0x13, /* E1 - european T1 */
+ IFT_ISDNBASIC = 0x14,
+ IFT_ISDNPRIMARY = 0x15,
+ IFT_PTPSERIAL = 0x16, /* Proprietary PTP serial */
+ IFT_PPP = 0x17, /* RFC 1331 */
+ IFT_LOOP = 0x18, /* loopback */
+ IFT_EON = 0x19, /* ISO over IP */
+ IFT_XETHER = 0x1a, /* obsolete 3MB experimental ethernet */
+ IFT_NSIP = 0x1b, /* XNS over IP */
+ IFT_SLIP = 0x1c, /* IP over generic TTY */
+ IFT_ULTRA = 0x1d, /* Ultra Technologies */
+ IFT_DS3 = 0x1e, /* Generic T3 */
+ IFT_SIP = 0x1f, /* SMDS */
+ IFT_FRELAY = 0x20, /* Frame Relay DTE only */
+ IFT_RS232 = 0x21,
+ IFT_PARA = 0x22, /* parallel-port */
+ IFT_ARCNET = 0x23,
+ IFT_ARCNETPLUS = 0x24,
+ IFT_ATM = 0x25, /* ATM cells */
+ IFT_MIOX25 = 0x26,
+ IFT_SONET = 0x27, /* SONET or SDH */
+ IFT_X25PLE = 0x28,
+ IFT_ISO88022LLC = 0x29,
+ IFT_LOCALTALK = 0x2a,
+ IFT_SMDSDXI = 0x2b,
+ IFT_FRELAYDCE = 0x2c, /* Frame Relay DCE */
+ IFT_V35 = 0x2d,
+ IFT_HSSI = 0x2e,
+ IFT_HIPPI = 0x2f,
+ IFT_MODEM = 0x30, /* Generic Modem */
+ IFT_AAL5 = 0x31, /* AAL5 over ATM */
+ IFT_SONETPATH = 0x32,
+ IFT_SONETVT = 0x33,
+ IFT_SMDSICIP = 0x34, /* SMDS InterCarrier Interface */
+ IFT_PROPVIRTUAL = 0x35, /* Proprietary Virtual/internal */
+ IFT_PROPMUX = 0x36, /* Proprietary Multiplexing */
+ IFT_IEEE80212 = 0x37, /* 100BaseVG */
+ IFT_FIBRECHANNEL = 0x38, /* Fibre Channel */
+ IFT_HIPPIINTERFACE = 0x39, /* HIPPI interfaces */
+ IFT_FRAMERELAYINTERCONNECT = 0x3a, /* Obsolete, use 0x20 either 0x2c */
+ IFT_AFLANE8023 = 0x3b, /* ATM Emulated LAN for 802.3 */
+ IFT_AFLANE8025 = 0x3c, /* ATM Emulated LAN for 802.5 */
+ IFT_CCTEMUL = 0x3d, /* ATM Emulated circuit */
+ IFT_FASTETHER = 0x3e, /* Fast Ethernet (100BaseT) */
+ IFT_ISDN = 0x3f, /* ISDN and X.25 */
+ IFT_V11 = 0x40, /* CCITT V.11/X.21 */
+ IFT_V36 = 0x41, /* CCITT V.36 */
+ IFT_G703AT64K = 0x42, /* CCITT G703 at 64Kbps */
+ IFT_G703AT2MB = 0x43, /* Obsolete see DS1-MIB */
+ IFT_QLLC = 0x44, /* SNA QLLC */
+ IFT_FASTETHERFX = 0x45, /* Fast Ethernet (100BaseFX) */
+ IFT_CHANNEL = 0x46, /* channel */
+ IFT_IEEE80211 = 0x47, /* radio spread spectrum */
+ IFT_IBM370PARCHAN = 0x48, /* IBM System 360/370 OEMI Channel */
+ IFT_ESCON = 0x49, /* IBM Enterprise Systems Connection */
+ IFT_DLSW = 0x4a, /* Data Link Switching */
+ IFT_ISDNS = 0x4b, /* ISDN S/T interface */
+ IFT_ISDNU = 0x4c, /* ISDN U interface */
+ IFT_LAPD = 0x4d, /* Link Access Protocol D */
+ IFT_IPSWITCH = 0x4e, /* IP Switching Objects */
+ IFT_RSRB = 0x4f, /* Remote Source Route Bridging */
+ IFT_ATMLOGICAL = 0x50, /* ATM Logical Port */
+ IFT_DS0 = 0x51, /* Digital Signal Level 0 */
+ IFT_DS0BUNDLE = 0x52, /* group of ds0s on the same ds1 */
+ IFT_BSC = 0x53, /* Bisynchronous Protocol */
+ IFT_ASYNC = 0x54, /* Asynchronous Protocol */
+ IFT_CNR = 0x55, /* Combat Net Radio */
+ IFT_ISO88025DTR = 0x56, /* ISO 802.5r DTR */
+ IFT_EPLRS = 0x57, /* Ext Pos Loc Report Sys */
+ IFT_ARAP = 0x58, /* Appletalk Remote Access Protocol */
+ IFT_PROPCNLS = 0x59, /* Proprietary Connectionless Protocol*/
+ IFT_HOSTPAD = 0x5a, /* CCITT-ITU X.29 PAD Protocol */
+ IFT_TERMPAD = 0x5b, /* CCITT-ITU X.3 PAD Facility */
+ IFT_FRAMERELAYMPI = 0x5c, /* Multiproto Interconnect over FR */
+ IFT_X213 = 0x5d, /* CCITT-ITU X213 */
+ IFT_ADSL = 0x5e, /* Asymmetric Digital Subscriber Loop */
+ IFT_RADSL = 0x5f, /* Rate-Adapt. Digital Subscriber Loop*/
+ IFT_SDSL = 0x60, /* Symmetric Digital Subscriber Loop */
+ IFT_VDSL = 0x61, /* Very H-Speed Digital Subscrib. Loop*/
+ IFT_ISO88025CRFPINT = 0x62, /* ISO 802.5 CRFP */
+ IFT_MYRINET = 0x63, /* Myricom Myrinet */
+ IFT_VOICEEM = 0x64, /* voice recEive and transMit */
+ IFT_VOICEFXO = 0x65, /* voice Foreign Exchange Office */
+ IFT_VOICEFXS = 0x66, /* voice Foreign Exchange Station */
+ IFT_VOICEENCAP = 0x67, /* voice encapsulation */
+ IFT_VOICEOVERIP = 0x68, /* voice over IP encapsulation */
+ IFT_ATMDXI = 0x69, /* ATM DXI */
+ IFT_ATMFUNI = 0x6a, /* ATM FUNI */
+ IFT_ATMIMA = 0x6b, /* ATM IMA */
+ IFT_PPPMULTILINKBUNDLE = 0x6c, /* PPP Multilink Bundle */
+ IFT_IPOVERCDLC = 0x6d, /* IBM ipOverCdlc */
+ IFT_IPOVERCLAW = 0x6e, /* IBM Common Link Access to Workstn */
+ IFT_STACKTOSTACK = 0x6f, /* IBM stackToStack */
+ IFT_VIRTUALIPADDRESS = 0x70, /* IBM VIPA */
+ IFT_MPC = 0x71, /* IBM multi-protocol channel support */
+ IFT_IPOVERATM = 0x72, /* IBM ipOverAtm */
+ IFT_ISO88025FIBER = 0x73, /* ISO 802.5j Fiber Token Ring */
+ IFT_TDLC = 0x74, /* IBM twinaxial data link control */
+ IFT_GIGABITETHERNET = 0x75, /* Gigabit Ethernet */
+ IFT_HDLC = 0x76, /* HDLC */
+ IFT_LAPF = 0x77, /* LAP F */
+ IFT_V37 = 0x78, /* V.37 */
+ IFT_X25MLP = 0x79, /* Multi-Link Protocol */
+ IFT_X25HUNTGROUP = 0x7a, /* X25 Hunt Group */
+ IFT_TRANSPHDLC = 0x7b, /* Transp HDLC */
+ IFT_INTERLEAVE = 0x7c, /* Interleave channel */
+ IFT_FAST = 0x7d, /* Fast channel */
+ IFT_IP = 0x7e, /* IP (for APPN HPR in IP networks) */
+ IFT_DOCSCABLEMACLAYER = 0x7f, /* CATV Mac Layer */
+ IFT_DOCSCABLEDOWNSTREAM = 0x80, /* CATV Downstream interface */
+ IFT_DOCSCABLEUPSTREAM = 0x81, /* CATV Upstream interface */
+ IFT_A12MPPSWITCH = 0x82, /* Avalon Parallel Processor */
+ IFT_TUNNEL = 0x83, /* Encapsulation interface */
+ IFT_COFFEE = 0x84, /* coffee pot */
+ IFT_CES = 0x85, /* Circiut Emulation Service */
+ IFT_ATMSUBINTERFACE = 0x86, /* (x) ATM Sub Interface */
+ IFT_L2VLAN = 0x87, /* Layer 2 Virtual LAN using 802.1Q */
+ IFT_L3IPVLAN = 0x88, /* Layer 3 Virtual LAN - IP Protocol */
+ IFT_L3IPXVLAN = 0x89, /* Layer 3 Virtual LAN - IPX Prot. */
+ IFT_DIGITALPOWERLINE = 0x8a, /* IP over Power Lines */
+ IFT_MEDIAMAILOVERIP = 0x8b, /* (xxx) Multimedia Mail over IP */
+ IFT_DTM = 0x8c, /* Dynamic synchronous Transfer Mode */
+ IFT_DCN = 0x8d, /* Data Communications Network */
+ IFT_IPFORWARD = 0x8e, /* IP Forwarding Interface */
+ IFT_MSDSL = 0x8f, /* Multi-rate Symmetric DSL */
+ IFT_IEEE1394 = 0x90, /* IEEE1394 High Performance SerialBus*/
+ IFT_IFGSN = 0x91, /* HIPPI-6400 */
+ IFT_DVBRCCMACLAYER = 0x92, /* DVB-RCC MAC Layer */
+ IFT_DVBRCCDOWNSTREAM = 0x93, /* DVB-RCC Downstream Channel */
+ IFT_DVBRCCUPSTREAM = 0x94, /* DVB-RCC Upstream Channel */
+ IFT_ATMVIRTUAL = 0x95, /* ATM Virtual Interface */
+ IFT_MPLSTUNNEL = 0x96, /* MPLS Tunnel Virtual Interface */
+ IFT_SRP = 0x97, /* Spatial Reuse Protocol */
+ IFT_VOICEOVERATM = 0x98, /* Voice over ATM */
+ IFT_VOICEOVERFRAMERELAY = 0x99, /* Voice Over Frame Relay */
+ IFT_IDSL = 0x9a, /* Digital Subscriber Loop over ISDN */
+ IFT_COMPOSITELINK = 0x9b, /* Avici Composite Link Interface */
+ IFT_SS7SIGLINK = 0x9c, /* SS7 Signaling Link */
+ IFT_PROPWIRELESSP2P = 0x9d, /* Prop. P2P wireless interface */
+ IFT_FRFORWARD = 0x9e, /* Frame forward Interface */
+ IFT_RFC1483 = 0x9f, /* Multiprotocol over ATM AAL5 */
+ IFT_USB = 0xa0, /* USB Interface */
+ IFT_IEEE8023ADLAG = 0xa1, /* IEEE 802.3ad Link Aggregate*/
+ IFT_BGPPOLICYACCOUNTING = 0xa2, /* BGP Policy Accounting */
+ IFT_FRF16MFRBUNDLE = 0xa3, /* FRF.16 Multilik Frame Relay*/
+ IFT_H323GATEKEEPER = 0xa4, /* H323 Gatekeeper */
+ IFT_H323PROXY = 0xa5, /* H323 Voice and Video Proxy */
+ IFT_MPLS = 0xa6, /* MPLS */
+ IFT_MFSIGLINK = 0xa7, /* Multi-frequency signaling link */
+ IFT_HDSL2 = 0xa8, /* High Bit-Rate DSL, 2nd gen. */
+ IFT_SHDSL = 0xa9, /* Multirate HDSL2 */
+ IFT_DS1FDL = 0xaa, /* Facility Data Link (4Kbps) on a DS1*/
+ IFT_POS = 0xab, /* Packet over SONET/SDH Interface */
+ IFT_DVBASILN = 0xac, /* DVB-ASI Input */
+ IFT_DVBASIOUT = 0xad, /* DVB-ASI Output */
+ IFT_PLC = 0xae, /* Power Line Communications */
+ IFT_NFAS = 0xaf, /* Non-Facility Associated Signaling */
+ IFT_TR008 = 0xb0, /* TROO8 */
+ IFT_GR303RDT = 0xb1, /* Remote Digital Terminal */
+ IFT_GR303IDT = 0xb2, /* Integrated Digital Terminal */
+ IFT_ISUP = 0xb3, /* ISUP */
+ IFT_PROPDOCSWIRELESSMACLAYER = 0xb4, /* prop/Wireless MAC Layer */
+ IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5, /* prop/Wireless Downstream */
+ IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6, /* prop/Wireless Upstream */
+ IFT_HIPERLAN2 = 0xb7, /* HIPERLAN Type 2 Radio Interface */
+ IFT_PROPBWAP2MP = 0xb8, /* PropBroadbandWirelessAccess P2MP*/
+ IFT_SONETOVERHEADCHANNEL = 0xb9, /* SONET Overhead Channel */
+ IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba, /* Digital Wrapper Overhead */
+ IFT_AAL2 = 0xbb, /* ATM adaptation layer 2 */
+ IFT_RADIOMAC = 0xbc, /* MAC layer over radio links */
+ IFT_ATMRADIO = 0xbd, /* ATM over radio links */
+ IFT_IMT = 0xbe, /* Inter-Machine Trunks */
+ IFT_MVL = 0xbf, /* Multiple Virtual Lines DSL */
+ IFT_REACHDSL = 0xc0, /* Long Reach DSL */
+ IFT_FRDLCIENDPT = 0xc1, /* Frame Relay DLCI End Point */
+ IFT_ATMVCIENDPT = 0xc2, /* ATM VCI End Point */
+ IFT_OPTICALCHANNEL = 0xc3, /* Optical Channel */
+ IFT_OPTICALTRANSPORT = 0xc4, /* Optical Transport */
+ IFT_INFINIBAND = 0xc7, /* Infiniband */
+ IFT_BRIDGE = 0xd1, /* Transparent bridge interface */
+ IFT_STF = 0xd7, /* 6to4 interface */
-#define IFT_STF 0xd7 /* 6to4 interface */
+ /*
+ * Not based on IANA assignments. Conflicting with IANA assignments.
+ * We should make them negative probably.
+ * This requires changes to struct if_data.
+ */
+ IFT_GIF = 0xf0, /* Generic tunnel interface */
+ IFT_PVC = 0xf1, /* Unused */
+ IFT_ENC = 0xf4, /* Encapsulating interface */
+ IFT_PFLOG = 0xf6, /* PF packet filter logging */
+ IFT_PFSYNC = 0xf7, /* PF packet filter synchronization */
+} ifType;
+
+/*
+ * Some (broken) software uses #ifdef IFT_TYPE to check whether
+ * an operating systems supports certain interface type. Lack of
+ * ifdef leads to a piece of functionality compiled out.
+ */
+#ifndef BURN_BRIDGES
+#define IFT_BRIDGE IFT_BRIDGE
+#define IFT_PPP IFT_PPP
+#define IFT_PROPVIRTUAL IFT_PROPVIRTUAL
+#define IFT_L2VLAN IFT_L2VLAN
+#define IFT_L3IPVLAN IFT_L3IPVLAN
+#define IFT_IEEE1394 IFT_IEEE1394
+#define IFT_INFINIBAND IFT_INFINIBAND
+#endif
-/* not based on IANA assignments */
-#define IFT_GIF 0xf0
-#define IFT_PVC 0xf1
-#define IFT_ENC 0xf4
-#define IFT_PFLOG 0xf6
-#define IFT_PFSYNC 0xf7
#endif /* !_NET_IF_TYPES_H_ */
diff --git a/sys/net/if_var.h b/sys/net/if_var.h
index c770374..4af6b52 100644
--- a/sys/net/if_var.h
+++ b/sys/net/if_var.h
@@ -83,7 +83,7 @@ struct netmap_adapter;
#define IF_DUNIT_NONE -1
-#include <altq/if_altq.h>
+#include <net/altq/if_altq.h>
TAILQ_HEAD(ifnethead, ifnet); /* we use TAILQs so that the order of */
TAILQ_HEAD(ifaddrhead, ifaddr); /* instantiation is preserved in the list */
diff --git a/sys/net/if_vlan.c b/sys/net/if_vlan.c
index 0753e0a..462c907 100644
--- a/sys/net/if_vlan.c
+++ b/sys/net/if_vlan.c
@@ -1705,27 +1705,6 @@ vlan_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
}
break;
- case SIOCSIFCAP:
- VLAN_LOCK();
- if (TRUNK(ifv) != NULL) {
- p = PARENT(ifv);
- VLAN_UNLOCK();
- if ((p->if_type != IFT_ETHER) &&
- (ifr->ifr_reqcap & IFCAP_VLAN_HWTAGGING) == 0) {
- error = EINVAL;
- break;
- }
- error = (*p->if_ioctl)(p, cmd, data);
- if (error)
- break;
- /* Propogate vlan interface capabilities */
- vlan_trunk_capabilities(p);
- } else {
- VLAN_UNLOCK();
- error = EINVAL;
- }
- break;
-
default:
error = EINVAL;
break;
diff --git a/sys/net/ifq.h b/sys/net/ifq.h
index d1fc3fe..769d5a5 100644
--- a/sys/net/ifq.h
+++ b/sys/net/ifq.h
@@ -47,7 +47,7 @@
*/
#define IF_DUNIT_NONE -1
-#include <altq/if_altq.h>
+#include <net/altq/if_altq.h>
/*
* Structure defining a queue for a network interface.
diff --git a/sys/net/netisr.c b/sys/net/netisr.c
index 178c3cb..4b3576d 100644
--- a/sys/net/netisr.c
+++ b/sys/net/netisr.c
@@ -156,10 +156,13 @@ SYSCTL_PROC(_net_isr, OID_AUTO, dispatch, CTLTYPE_STRING | CTLFLAG_RWTUN,
/*
* Allow the administrator to limit the number of threads (CPUs) to use for
* netisr. We don't check netisr_maxthreads before creating the thread for
- * CPU 0, so in practice we ignore values <= 1. This must be set at boot.
- * We will create at most one thread per CPU.
+ * CPU 0. This must be set at boot. We will create at most one thread per CPU.
+ * By default we initialize this to 1 which would assign just 1 cpu (cpu0) and
+ * therefore only 1 workstream. If set to -1, netisr would use all cpus
+ * (mp_ncpus) and therefore would have those many workstreams. One workstream
+ * per thread (CPU).
*/
-static int netisr_maxthreads = -1; /* Max number of threads. */
+static int netisr_maxthreads = 1; /* Max number of threads. */
SYSCTL_INT(_net_isr, OID_AUTO, maxthreads, CTLFLAG_RDTUN,
&netisr_maxthreads, 0,
"Use at most this many CPUs for netisr processing");
@@ -1120,8 +1123,10 @@ netisr_init(void *arg)
KASSERT(curcpu == 0, ("%s: not on CPU 0", __func__));
NETISR_LOCK_INIT();
- if (netisr_maxthreads < 1)
- netisr_maxthreads = 1;
+ if (netisr_maxthreads == 0 || netisr_maxthreads < -1 )
+ netisr_maxthreads = 1; /* default behavior */
+ else if (netisr_maxthreads == -1)
+ netisr_maxthreads = mp_ncpus; /* use max cpus */
if (netisr_maxthreads > mp_ncpus) {
printf("netisr_init: forcing maxthreads from %d to %d\n",
netisr_maxthreads, mp_ncpus);
diff --git a/sys/net/pfvar.h b/sys/net/pfvar.h
index a79f412..4a5f2a0 100644
--- a/sys/net/pfvar.h
+++ b/sys/net/pfvar.h
@@ -192,21 +192,20 @@ extern struct rwlock pf_rules_lock;
#define PF_AEQ(a, b, c) \
((c == AF_INET && (a)->addr32[0] == (b)->addr32[0]) || \
- ((a)->addr32[3] == (b)->addr32[3] && \
+ (c == AF_INET6 && (a)->addr32[3] == (b)->addr32[3] && \
(a)->addr32[2] == (b)->addr32[2] && \
(a)->addr32[1] == (b)->addr32[1] && \
(a)->addr32[0] == (b)->addr32[0])) \
#define PF_ANEQ(a, b, c) \
- ((c == AF_INET && (a)->addr32[0] != (b)->addr32[0]) || \
- ((a)->addr32[3] != (b)->addr32[3] || \
- (a)->addr32[2] != (b)->addr32[2] || \
+ ((a)->addr32[0] != (b)->addr32[0] || \
(a)->addr32[1] != (b)->addr32[1] || \
- (a)->addr32[0] != (b)->addr32[0])) \
+ (a)->addr32[2] != (b)->addr32[2] || \
+ (a)->addr32[3] != (b)->addr32[3]) \
#define PF_AZERO(a, c) \
((c == AF_INET && !(a)->addr32[0]) || \
- (!(a)->addr32[0] && !(a)->addr32[1] && \
+ (c == AF_INET6 && !(a)->addr32[0] && !(a)->addr32[1] && \
!(a)->addr32[2] && !(a)->addr32[3] )) \
#define PF_MATCHA(n, a, m, b, f) \
diff --git a/sys/net/route.c b/sys/net/route.c
index 8ab9e22..992cf8e 100644
--- a/sys/net/route.c
+++ b/sys/net/route.c
@@ -43,7 +43,6 @@
#include <sys/param.h>
#include <sys/systm.h>
-#include <sys/syslog.h>
#include <sys/malloc.h>
#include <sys/mbuf.h>
#include <sys/socket.h>
diff --git a/sys/net80211/ieee80211_mesh.c b/sys/net80211/ieee80211_mesh.c
index 8cd95c6..de9d60b 100644
--- a/sys/net80211/ieee80211_mesh.c
+++ b/sys/net80211/ieee80211_mesh.c
@@ -126,7 +126,7 @@ static int ieee80211_mesh_backofftimeout = -1;
SYSCTL_PROC(_net_wlan_mesh, OID_AUTO, backofftimeout, CTLTYPE_INT | CTLFLAG_RW,
&ieee80211_mesh_backofftimeout, 0, ieee80211_sysctl_msecs_ticks, "I",
"Backoff timeout (msec). This is to throutles peering forever when "
- "not receving answer or is rejected by a neighbor");
+ "not receiving answer or is rejected by a neighbor");
static int ieee80211_mesh_maxretries = 2;
SYSCTL_INT(_net_wlan_mesh, OID_AUTO, maxretries, CTLFLAG_RW,
&ieee80211_mesh_maxretries, 0,
diff --git a/sys/netgraph/bluetooth/hci/ng_hci_cmds.c b/sys/netgraph/bluetooth/hci/ng_hci_cmds.c
index 1dc9854..0edb44c 100644
--- a/sys/netgraph/bluetooth/hci/ng_hci_cmds.c
+++ b/sys/netgraph/bluetooth/hci/ng_hci_cmds.c
@@ -71,11 +71,15 @@ static int process_status_params
(ng_hci_unit_p, u_int16_t, struct mbuf *, struct mbuf *);
static int process_testing_params
(ng_hci_unit_p, u_int16_t, struct mbuf *, struct mbuf *);
+static int process_le_params
+ (ng_hci_unit_p, u_int16_t, struct mbuf *, struct mbuf *);
static int process_link_control_status
(ng_hci_unit_p, ng_hci_command_status_ep *, struct mbuf *);
static int process_link_policy_status
(ng_hci_unit_p, ng_hci_command_status_ep *, struct mbuf *);
+static int process_le_status
+ (ng_hci_unit_p, ng_hci_command_status_ep *, struct mbuf *);
/*
* Send HCI command to the driver.
@@ -222,7 +226,10 @@ ng_hci_process_command_complete(ng_hci_unit_p unit, struct mbuf *e)
error = process_testing_params(unit,
NG_HCI_OCF(ep->opcode), cp, e);
break;
-
+ case NG_HCI_OGF_LE:
+ error = process_le_params(unit,
+ NG_HCI_OCF(ep->opcode), cp, e);
+ break;
case NG_HCI_OGF_BT_LOGO:
case NG_HCI_OGF_VENDOR:
NG_FREE_M(cp);
@@ -294,7 +301,9 @@ ng_hci_process_command_status(ng_hci_unit_p unit, struct mbuf *e)
case NG_HCI_OGF_LINK_POLICY:
error = process_link_policy_status(unit, ep, cp);
break;
-
+ case NG_HCI_OGF_LE:
+ error = process_le_status(unit, ep, cp);
+ break;
case NG_HCI_OGF_BT_LOGO:
case NG_HCI_OGF_VENDOR:
NG_FREE_M(cp);
@@ -604,6 +613,8 @@ process_hc_baseband_params(ng_hci_unit_p unit, u_int16_t ocf,
case NG_HCI_OCF_READ_LOCAL_NAME:
case NG_HCI_OCF_READ_UNIT_CLASS:
case NG_HCI_OCF_WRITE_UNIT_CLASS:
+ case NG_HCI_OCF_READ_LE_HOST_SUPPORTED:
+ case NG_HCI_OCF_WRITE_LE_HOST_SUPPORTED:
/* These do not need post processing */
break;
@@ -796,6 +807,132 @@ process_testing_params(ng_hci_unit_p unit, u_int16_t ocf, struct mbuf *mcp,
return (error);
} /* process_testing_params */
+/*
+ * Process LE command return parameters
+ */
+
+static int
+process_le_params(ng_hci_unit_p unit, u_int16_t ocf,
+ struct mbuf *mcp, struct mbuf *mrp)
+{
+ int error = 0;
+
+ switch (ocf){
+ case NG_HCI_OCF_LE_SET_EVENT_MASK:
+ case NG_HCI_OCF_LE_READ_BUFFER_SIZE:
+ case NG_HCI_OCF_LE_READ_LOCAL_SUPPORTED_FEATURES:
+ case NG_HCI_OCF_LE_SET_RANDOM_ADDRESS:
+ case NG_HCI_OCF_LE_SET_ADVERTISING_PARAMETERS:
+ case NG_HCI_OCF_LE_READ_ADVERTISING_CHANNEL_TX_POWER:
+ case NG_HCI_OCF_LE_SET_ADVERTISING_DATA:
+ case NG_HCI_OCF_LE_SET_SCAN_RESPONSE_DATA:
+ case NG_HCI_OCF_LE_SET_ADVERTISE_ENABLE:
+ case NG_HCI_OCF_LE_SET_SCAN_PARAMETERS:
+ case NG_HCI_OCF_LE_SET_SCAN_ENABLE:
+ case NG_HCI_OCF_LE_CREATE_CONNECTION_CANCEL:
+ case NG_HCI_OCF_LE_CLEAR_WHITE_LIST:
+ case NG_HCI_OCF_LE_READ_WHITE_LIST_SIZE:
+ case NG_HCI_OCF_LE_ADD_DEVICE_TO_WHITE_LIST:
+ case NG_HCI_OCF_LE_REMOVE_DEVICE_FROM_WHITE_LIST:
+ case NG_HCI_OCF_LE_SET_HOST_CHANNEL_CLASSIFICATION:
+ case NG_HCI_OCF_LE_READ_CHANNEL_MAP:
+ case NG_HCI_OCF_LE_ENCRYPT:
+ case NG_HCI_OCF_LE_RAND:
+ case NG_HCI_OCF_LE_LONG_TERM_KEY_REQUEST_REPLY:
+ case NG_HCI_OCF_LE_LONG_TERM_KEY_REQUEST_NEGATIVE_REPLY:
+ case NG_HCI_OCF_LE_READ_SUPPORTED_STATUS:
+ case NG_HCI_OCF_LE_RECEIVER_TEST:
+ case NG_HCI_OCF_LE_TRANSMITTER_TEST:
+ case NG_HCI_OCF_LE_TEST_END:
+
+ /* These do not need post processing */
+ break;
+ case NG_HCI_OCF_LE_CREATE_CONNECTION:
+ case NG_HCI_OCF_LE_CONNECTION_UPDATE:
+ case NG_HCI_OCF_LE_READ_REMOTE_USED_FEATURES:
+ case NG_HCI_OCF_LE_START_ENCRYPTION:
+
+
+ default:
+ /*
+ * None of these command was supposed to generate
+ * Command_Complete event. Instead Command_Status event
+ * should have been generated and then appropriate event
+ * should have been sent to indicate the final result.
+ */
+
+ error = EINVAL;
+ break;
+ }
+
+ NG_FREE_M(mcp);
+ NG_FREE_M(mrp);
+
+ return (error);
+
+}
+
+
+
+static int
+process_le_status(ng_hci_unit_p unit,ng_hci_command_status_ep *ep,
+ struct mbuf *mcp)
+{
+ int error = 0;
+
+ switch (NG_HCI_OCF(ep->opcode)){
+ case NG_HCI_OCF_LE_CREATE_CONNECTION:
+ case NG_HCI_OCF_LE_CONNECTION_UPDATE:
+ case NG_HCI_OCF_LE_READ_REMOTE_USED_FEATURES:
+ case NG_HCI_OCF_LE_START_ENCRYPTION:
+
+ /* These do not need post processing */
+ break;
+
+ case NG_HCI_OCF_LE_SET_EVENT_MASK:
+ case NG_HCI_OCF_LE_READ_BUFFER_SIZE:
+ case NG_HCI_OCF_LE_READ_LOCAL_SUPPORTED_FEATURES:
+ case NG_HCI_OCF_LE_SET_RANDOM_ADDRESS:
+ case NG_HCI_OCF_LE_SET_ADVERTISING_PARAMETERS:
+ case NG_HCI_OCF_LE_READ_ADVERTISING_CHANNEL_TX_POWER:
+ case NG_HCI_OCF_LE_SET_ADVERTISING_DATA:
+ case NG_HCI_OCF_LE_SET_SCAN_RESPONSE_DATA:
+ case NG_HCI_OCF_LE_SET_ADVERTISE_ENABLE:
+ case NG_HCI_OCF_LE_SET_SCAN_PARAMETERS:
+ case NG_HCI_OCF_LE_SET_SCAN_ENABLE:
+ case NG_HCI_OCF_LE_CREATE_CONNECTION_CANCEL:
+ case NG_HCI_OCF_LE_CLEAR_WHITE_LIST:
+ case NG_HCI_OCF_LE_READ_WHITE_LIST_SIZE:
+ case NG_HCI_OCF_LE_ADD_DEVICE_TO_WHITE_LIST:
+ case NG_HCI_OCF_LE_REMOVE_DEVICE_FROM_WHITE_LIST:
+ case NG_HCI_OCF_LE_SET_HOST_CHANNEL_CLASSIFICATION:
+ case NG_HCI_OCF_LE_READ_CHANNEL_MAP:
+ case NG_HCI_OCF_LE_ENCRYPT:
+ case NG_HCI_OCF_LE_RAND:
+ case NG_HCI_OCF_LE_LONG_TERM_KEY_REQUEST_REPLY:
+ case NG_HCI_OCF_LE_LONG_TERM_KEY_REQUEST_NEGATIVE_REPLY:
+ case NG_HCI_OCF_LE_READ_SUPPORTED_STATUS:
+ case NG_HCI_OCF_LE_RECEIVER_TEST:
+ case NG_HCI_OCF_LE_TRANSMITTER_TEST:
+ case NG_HCI_OCF_LE_TEST_END:
+
+
+ default:
+ /*
+ * None of these command was supposed to generate
+ * Command_Stutus event. Command Complete instead.
+ */
+
+ error = EINVAL;
+ break;
+ }
+
+ NG_FREE_M(mcp);
+
+ return (error);
+
+}
+
/*
* Process link control command status
*/
diff --git a/sys/netgraph/bluetooth/hci/ng_hci_evnt.c b/sys/netgraph/bluetooth/hci/ng_hci_evnt.c
index b8dd21f..a31c5fb 100644
--- a/sys/netgraph/bluetooth/hci/ng_hci_evnt.c
+++ b/sys/netgraph/bluetooth/hci/ng_hci_evnt.c
@@ -76,6 +76,7 @@ static int page_scan_mode_change (ng_hci_unit_p, struct mbuf *);
static int page_scan_rep_mode_change (ng_hci_unit_p, struct mbuf *);
static int sync_con_queue (ng_hci_unit_p, ng_hci_unit_con_p, int);
static int send_data_packets (ng_hci_unit_p, int, int);
+static int le_event (ng_hci_unit_p, struct mbuf *);
/*
* Process HCI event packet
@@ -121,6 +122,9 @@ ng_hci_process_event(ng_hci_unit_p unit, struct mbuf *event)
/* These do not need post processing */
NG_FREE_M(event);
break;
+ case NG_HCI_EVENT_LE:
+ error = le_event(unit, event);
+ break;
case NG_HCI_EVENT_INQUIRY_RESULT:
error = inquiry_result(unit, event);
@@ -247,6 +251,7 @@ static int
send_data_packets(ng_hci_unit_p unit, int link_type, int limit)
{
ng_hci_unit_con_p con = NULL, winner = NULL;
+ int reallink_type;
item_p item = NULL;
int min_pending, total_sent, sent, error, v;
@@ -260,8 +265,11 @@ send_data_packets(ng_hci_unit_p unit, int link_type, int limit)
*/
LIST_FOREACH(con, &unit->con_list, next) {
- if (con->link_type != link_type)
+ reallink_type = (con->link_type == NG_HCI_LINK_SCO)?
+ NG_HCI_LINK_SCO: NG_HCI_LINK_ACL;
+ if (reallink_type != link_type){
continue;
+ }
if (NG_BT_ITEMQ_LEN(&con->conq) == 0)
continue;
@@ -327,7 +335,6 @@ send_data_packets(ng_hci_unit_p unit, int link_type, int limit)
/*
* Sync connection queue for the winner
*/
-
sync_con_queue(unit, winner, sent);
}
@@ -346,7 +353,7 @@ sync_con_queue(ng_hci_unit_p unit, ng_hci_unit_con_p con, int completed)
ng_hci_sync_con_queue_ep *state = NULL;
int error;
- hook = (con->link_type == NG_HCI_LINK_ACL)? unit->acl : unit->sco;
+ hook = (con->link_type != NG_HCI_LINK_SCO)? unit->acl : unit->sco;
if (hook == NULL || NG_HOOK_NOT_VALID(hook))
return (ENOTCONN);
@@ -363,6 +370,223 @@ sync_con_queue(ng_hci_unit_p unit, ng_hci_unit_con_p con, int completed)
return (error);
} /* sync_con_queue */
+/* le meta event */
+/* Inquiry result event */
+static int
+le_advertizing_report(ng_hci_unit_p unit, struct mbuf *event)
+{
+ ng_hci_le_advertising_report_ep *ep = NULL;
+ ng_hci_neighbor_p n = NULL;
+ bdaddr_t bdaddr;
+ int error = 0;
+ u_int8_t event_type;
+ u_int8_t addr_type;
+
+ NG_HCI_M_PULLUP(event, sizeof(*ep));
+ if (event == NULL)
+ return (ENOBUFS);
+
+ ep = mtod(event, ng_hci_le_advertising_report_ep *);
+ m_adj(event, sizeof(*ep));
+
+ for (; ep->num_reports > 0; ep->num_reports --) {
+ /* Get remote unit address */
+ NG_HCI_M_PULLUP(event, sizeof(u_int8_t));
+ event_type = *mtod(event, u_int8_t *);
+ m_adj(event, sizeof(u_int8_t));
+ NG_HCI_M_PULLUP(event, sizeof(u_int8_t));
+ addr_type = *mtod(event, u_int8_t *);
+ m_adj(event, sizeof(u_int8_t));
+
+ m_copydata(event, 0, sizeof(bdaddr), (caddr_t) &bdaddr);
+ m_adj(event, sizeof(bdaddr));
+
+ /* Lookup entry in the cache */
+ n = ng_hci_get_neighbor(unit, &bdaddr, (addr_type) ? NG_HCI_LINK_LE_RANDOM:NG_HCI_LINK_LE_PUBLIC);
+ if (n == NULL) {
+ /* Create new entry */
+ n = ng_hci_new_neighbor(unit);
+ if (n == NULL) {
+ error = ENOMEM;
+ break;
+ }
+ bcopy(&bdaddr, &n->bdaddr, sizeof(n->bdaddr));
+ n->addrtype = (addr_type)? NG_HCI_LINK_LE_RANDOM :
+ NG_HCI_LINK_LE_PUBLIC;
+
+ } else
+ getmicrotime(&n->updated);
+
+#if 0
+ {
+ /*
+ * TODO: Make these information
+ * Available from userland.
+ */
+ u_int8_t length_data;
+
+ char *rssi;
+
+ NG_HCI_M_PULLUP(event, sizeof(u_int8_t));
+ length_data = *mtod(event, u_int8_t *);
+ m_adj(event, sizeof(u_int8_t));
+ /*Advertizement data*/
+ NG_HCI_M_PULLUP(event, length_data);
+ m_adj(event, length_data);
+ NG_HCI_M_PULLUP(event, sizeof(char ));
+ /*Get RSSI*/
+ rssi = mtod(event, char *);
+ m_adj(event, sizeof(u_int8_t));
+ }
+#endif
+ }
+ NG_FREE_M(event);
+
+ return (error);
+} /* inquiry_result */
+
+static int le_connection_complete(ng_hci_unit_p unit, struct mbuf *event)
+{
+ int error = 0;
+
+ ng_hci_le_connection_complete_ep *ep = NULL;
+ ng_hci_unit_con_p con = NULL;
+ int link_type;
+ uint8_t uclass[3] = {0,0,0};//dummy uclass
+
+ NG_HCI_M_PULLUP(event, sizeof(*ep));
+ if (event == NULL)
+ return (ENOBUFS);
+
+ ep = mtod(event, ng_hci_le_connection_complete_ep *);
+ link_type = (ep->address_type)? NG_HCI_LINK_LE_RANDOM :
+ NG_HCI_LINK_LE_PUBLIC;
+ /*
+ * Find the first connection descriptor that matches the following:
+ *
+ * 1) con->link_type == link_type
+ * 2) con->state == NG_HCI_CON_W4_CONN_COMPLETE
+ * 3) con->bdaddr == ep->address
+ */
+ LIST_FOREACH(con, &unit->con_list, next)
+ if (con->link_type == link_type &&
+ con->state == NG_HCI_CON_W4_CONN_COMPLETE &&
+ bcmp(&con->bdaddr, &ep->address, sizeof(bdaddr_t)) == 0)
+ break;
+
+ /*
+ * Two possible cases:
+ *
+ * 1) We have found connection descriptor. That means upper layer has
+ * requested this connection via LP_CON_REQ message. In this case
+ * connection must have timeout set. If ng_hci_con_untimeout() fails
+ * then timeout message already went into node's queue. In this case
+ * ignore Connection_Complete event and let timeout deal with it.
+ *
+ * 2) We do not have connection descriptor. That means upper layer
+ * nas not requested this connection , (less likely) we gave up
+ * on this connection (timeout) or as node act as slave role.
+ * The most likely scenario is that
+ * we have received LE_Create_Connection command
+ * from the RAW hook
+ */
+
+ if (con == NULL) {
+ if (ep->status != 0)
+ goto out;
+
+ con = ng_hci_new_con(unit, link_type);
+ if (con == NULL) {
+ error = ENOMEM;
+ goto out;
+ }
+
+ con->state = NG_HCI_CON_W4_LP_CON_RSP;
+ ng_hci_con_timeout(con);
+
+ bcopy(&ep->address, &con->bdaddr, sizeof(con->bdaddr));
+ error = ng_hci_lp_con_ind(con, uclass);
+ if (error != 0) {
+ ng_hci_con_untimeout(con);
+ ng_hci_free_con(con);
+ }
+
+ } else if ((error = ng_hci_con_untimeout(con)) != 0)
+ goto out;
+
+ /*
+ * Update connection descriptor and send notification
+ * to the upper layers.
+ */
+
+ con->con_handle = NG_HCI_CON_HANDLE(le16toh(ep->handle));
+ con->encryption_mode = NG_HCI_ENCRYPTION_MODE_NONE;
+
+ ng_hci_lp_con_cfm(con, ep->status);
+
+ /* Adjust connection state */
+ if (ep->status != 0)
+ ng_hci_free_con(con);
+ else {
+ con->state = NG_HCI_CON_OPEN;
+
+ /*
+ * Change link policy for the ACL connections. Enable all
+ * supported link modes. Enable Role switch as well if
+ * device supports it.
+ */
+
+ }
+
+out:
+ NG_FREE_M(event);
+
+ return (error);
+
+}
+
+static int le_connection_update(ng_hci_unit_p unit, struct mbuf *event)
+{
+ int error = 0;
+ /*TBD*/
+
+ NG_FREE_M(event);
+ return error;
+
+}
+static int
+le_event(ng_hci_unit_p unit, struct mbuf *event)
+{
+ int error = 0;
+ ng_hci_le_ep *lep;
+
+ NG_HCI_M_PULLUP(event, sizeof(*lep));
+ if(event ==NULL){
+ return ENOBUFS;
+ }
+ lep = mtod(event, ng_hci_le_ep *);
+ m_adj(event, sizeof(*lep));
+ switch(lep->subevent_code){
+ case NG_HCI_LEEV_CON_COMPL:
+ le_connection_complete(unit, event);
+ break;
+ case NG_HCI_LEEV_ADVREP:
+ le_advertizing_report(unit, event);
+ break;
+ case NG_HCI_LEEV_CON_UPDATE_COMPL:
+ le_connection_update(unit, event);
+ break;
+ case NG_HCI_LEEV_READ_REMOTE_FEATURES_COMPL:
+ //TBD
+ /*FALLTHROUGH*/
+ case NG_HCI_LEEV_LONG_TERM_KEY_REQUEST:
+ //TBD
+ /*FALLTHROUGH*/
+ default:
+ NG_FREE_M(event);
+ }
+ return error;
+}
/* Inquiry result event */
static int
@@ -386,7 +610,7 @@ inquiry_result(ng_hci_unit_p unit, struct mbuf *event)
m_adj(event, sizeof(bdaddr));
/* Lookup entry in the cache */
- n = ng_hci_get_neighbor(unit, &bdaddr);
+ n = ng_hci_get_neighbor(unit, &bdaddr, NG_HCI_LINK_ACL);
if (n == NULL) {
/* Create new entry */
n = ng_hci_new_neighbor(unit);
@@ -398,6 +622,7 @@ inquiry_result(ng_hci_unit_p unit, struct mbuf *event)
getmicrotime(&n->updated);
bcopy(&bdaddr, &n->bdaddr, sizeof(n->bdaddr));
+ n->addrtype = NG_HCI_LINK_ACL;
/* XXX call m_pullup here? */
@@ -754,7 +979,7 @@ read_remote_features_compl(ng_hci_unit_p unit, struct mbuf *event)
}
/* Update cache entry */
- n = ng_hci_get_neighbor(unit, &con->bdaddr);
+ n = ng_hci_get_neighbor(unit, &con->bdaddr, NG_HCI_LINK_ACL);
if (n == NULL) {
n = ng_hci_new_neighbor(unit);
if (n == NULL) {
@@ -763,6 +988,7 @@ read_remote_features_compl(ng_hci_unit_p unit, struct mbuf *event)
}
bcopy(&con->bdaddr, &n->bdaddr, sizeof(n->bdaddr));
+ n->addrtype = NG_HCI_LINK_ACL;
} else
getmicrotime(&n->updated);
@@ -909,7 +1135,7 @@ num_compl_pkts(ng_hci_unit_p unit, struct mbuf *event)
}
/* Update buffer descriptor */
- if (con->link_type == NG_HCI_LINK_ACL)
+ if (con->link_type != NG_HCI_LINK_SCO)
NG_HCI_BUFF_ACL_FREE(unit->buffer, p);
else
NG_HCI_BUFF_SCO_FREE(unit->buffer, p);
@@ -1010,7 +1236,7 @@ read_clock_offset_compl(ng_hci_unit_p unit, struct mbuf *event)
}
/* Update cache entry */
- n = ng_hci_get_neighbor(unit, &con->bdaddr);
+ n = ng_hci_get_neighbor(unit, &con->bdaddr, NG_HCI_LINK_ACL);
if (n == NULL) {
n = ng_hci_new_neighbor(unit);
if (n == NULL) {
@@ -1019,6 +1245,7 @@ read_clock_offset_compl(ng_hci_unit_p unit, struct mbuf *event)
}
bcopy(&con->bdaddr, &n->bdaddr, sizeof(n->bdaddr));
+ n->addrtype = NG_HCI_LINK_ACL;
} else
getmicrotime(&n->updated);
@@ -1089,7 +1316,7 @@ page_scan_mode_change(ng_hci_unit_p unit, struct mbuf *event)
ep = mtod(event, ng_hci_page_scan_mode_change_ep *);
/* Update cache entry */
- n = ng_hci_get_neighbor(unit, &ep->bdaddr);
+ n = ng_hci_get_neighbor(unit, &ep->bdaddr, NG_HCI_LINK_ACL);
if (n == NULL) {
n = ng_hci_new_neighbor(unit);
if (n == NULL) {
@@ -1098,6 +1325,7 @@ page_scan_mode_change(ng_hci_unit_p unit, struct mbuf *event)
}
bcopy(&ep->bdaddr, &n->bdaddr, sizeof(n->bdaddr));
+ n->addrtype = NG_HCI_LINK_ACL;
} else
getmicrotime(&n->updated);
@@ -1123,7 +1351,7 @@ page_scan_rep_mode_change(ng_hci_unit_p unit, struct mbuf *event)
ep = mtod(event, ng_hci_page_scan_rep_mode_change_ep *);
/* Update cache entry */
- n = ng_hci_get_neighbor(unit, &ep->bdaddr);
+ n = ng_hci_get_neighbor(unit, &ep->bdaddr, NG_HCI_LINK_ACL);
if (n == NULL) {
n = ng_hci_new_neighbor(unit);
if (n == NULL) {
@@ -1132,6 +1360,7 @@ page_scan_rep_mode_change(ng_hci_unit_p unit, struct mbuf *event)
}
bcopy(&ep->bdaddr, &n->bdaddr, sizeof(n->bdaddr));
+ n->addrtype = NG_HCI_LINK_ACL;
} else
getmicrotime(&n->updated);
diff --git a/sys/netgraph/bluetooth/hci/ng_hci_main.c b/sys/netgraph/bluetooth/hci/ng_hci_main.c
index c5b3040..9abe595 100644
--- a/sys/netgraph/bluetooth/hci/ng_hci_main.c
+++ b/sys/netgraph/bluetooth/hci/ng_hci_main.c
@@ -775,7 +775,6 @@ ng_hci_acl_rcvdata(hook_p hook, item_p item)
int size, error = 0;
NG_HCI_BUFF_ACL_SIZE(unit->buffer, size);
-
/* Check packet */
NGI_GET_M(item, m);
@@ -788,7 +787,6 @@ ng_hci_acl_rcvdata(hook_p hook, item_p item)
error = EINVAL;
goto drop;
}
-
if (m->m_pkthdr.len < sizeof(ng_hci_acldata_pkt_t) ||
m->m_pkthdr.len > sizeof(ng_hci_acldata_pkt_t) + size) {
NG_HCI_ALERT(
@@ -831,7 +829,7 @@ ng_hci_acl_rcvdata(hook_p hook, item_p item)
goto drop;
}
- if (con->link_type != NG_HCI_LINK_ACL) {
+ if (con->link_type == NG_HCI_LINK_SCO) {
NG_HCI_ERR(
"%s: %s - unexpected HCI ACL data packet. Not ACL link, con_handle=%d, " \
"link_type=%d\n", __func__, NG_NODE_NAME(unit->node),
diff --git a/sys/netgraph/bluetooth/hci/ng_hci_misc.c b/sys/netgraph/bluetooth/hci/ng_hci_misc.c
index 2209fbd..c33b873 100644
--- a/sys/netgraph/bluetooth/hci/ng_hci_misc.c
+++ b/sys/netgraph/bluetooth/hci/ng_hci_misc.c
@@ -214,7 +214,7 @@ ng_hci_flush_neighbor_cache(ng_hci_unit_p unit)
*/
ng_hci_neighbor_p
-ng_hci_get_neighbor(ng_hci_unit_p unit, bdaddr_p bdaddr)
+ng_hci_get_neighbor(ng_hci_unit_p unit, bdaddr_p bdaddr,int link_type)
{
ng_hci_neighbor_p n = NULL;
@@ -222,7 +222,8 @@ ng_hci_get_neighbor(ng_hci_unit_p unit, bdaddr_p bdaddr)
ng_hci_neighbor_p nn = LIST_NEXT(n, next);
if (!ng_hci_neighbor_stale(n)) {
- if (bcmp(&n->bdaddr, bdaddr, sizeof(*bdaddr)) == 0)
+ if (n->addrtype == link_type &&
+ bcmp(&n->bdaddr, bdaddr, sizeof(*bdaddr)) == 0)
break;
} else
ng_hci_free_neighbor(n); /* remove old entry */
@@ -284,7 +285,7 @@ ng_hci_new_con(ng_hci_unit_p unit, int link_type)
con->link_type = link_type;
- if (con->link_type == NG_HCI_LINK_ACL)
+ if (con->link_type != NG_HCI_LINK_SCO)
NG_HCI_BUFF_ACL_TOTAL(unit->buffer, num_pkts);
else
NG_HCI_BUFF_SCO_TOTAL(unit->buffer, num_pkts);
@@ -313,7 +314,7 @@ ng_hci_free_con(ng_hci_unit_con_p con)
* flushed these packets and we can free them too
*/
- if (con->link_type == NG_HCI_LINK_ACL)
+ if (con->link_type != NG_HCI_LINK_SCO)
NG_HCI_BUFF_ACL_FREE(con->unit->buffer, con->pending);
else
NG_HCI_BUFF_SCO_FREE(con->unit->buffer, con->pending);
diff --git a/sys/netgraph/bluetooth/hci/ng_hci_misc.h b/sys/netgraph/bluetooth/hci/ng_hci_misc.h
index 59e8a3b..4902c7e 100644
--- a/sys/netgraph/bluetooth/hci/ng_hci_misc.h
+++ b/sys/netgraph/bluetooth/hci/ng_hci_misc.h
@@ -41,7 +41,7 @@ void ng_hci_unit_clean (ng_hci_unit_p, int);
ng_hci_neighbor_p ng_hci_new_neighbor (ng_hci_unit_p);
void ng_hci_free_neighbor (ng_hci_neighbor_p);
void ng_hci_flush_neighbor_cache (ng_hci_unit_p);
-ng_hci_neighbor_p ng_hci_get_neighbor (ng_hci_unit_p, bdaddr_p);
+ng_hci_neighbor_p ng_hci_get_neighbor (ng_hci_unit_p, bdaddr_p, int);
int ng_hci_neighbor_stale (ng_hci_neighbor_p);
ng_hci_unit_con_p ng_hci_new_con (ng_hci_unit_p, int);
diff --git a/sys/netgraph/bluetooth/hci/ng_hci_ulpi.c b/sys/netgraph/bluetooth/hci/ng_hci_ulpi.c
index 33ed0e9..9934ea8 100644
--- a/sys/netgraph/bluetooth/hci/ng_hci_ulpi.c
+++ b/sys/netgraph/bluetooth/hci/ng_hci_ulpi.c
@@ -56,6 +56,7 @@
static int ng_hci_lp_acl_con_req (ng_hci_unit_p, item_p, hook_p);
static int ng_hci_lp_sco_con_req (ng_hci_unit_p, item_p, hook_p);
+static int ng_hci_lp_le_con_req (ng_hci_unit_p, item_p, hook_p, int);
/*
* Process LP_ConnectReq event from the upper layer protocol
@@ -64,6 +65,8 @@ static int ng_hci_lp_sco_con_req (ng_hci_unit_p, item_p, hook_p);
int
ng_hci_lp_con_req(ng_hci_unit_p unit, item_p item, hook_p hook)
{
+ int link_type;
+
if ((unit->state & NG_HCI_UNIT_READY) != NG_HCI_UNIT_READY) {
NG_HCI_WARN(
"%s: %s - unit is not ready, state=%#x\n",
@@ -84,21 +87,30 @@ ng_hci_lp_con_req(ng_hci_unit_p unit, item_p item, hook_p hook)
return (EMSGSIZE);
}
-
- if (((ng_hci_lp_con_req_ep *)(NGI_MSG(item)->data))->link_type == NG_HCI_LINK_ACL)
+ link_type = ((ng_hci_lp_con_req_ep *)(NGI_MSG(item)->data))->link_type;
+ switch(link_type){
+ case NG_HCI_LINK_ACL:
return (ng_hci_lp_acl_con_req(unit, item, hook));
-
- if (hook != unit->sco) {
- NG_HCI_WARN(
-"%s: %s - LP_ConnectReq for SCO connection came from wrong hook=%p\n",
- __func__, NG_NODE_NAME(unit->node), hook);
-
- NG_FREE_ITEM(item);
-
- return (EINVAL);
+ case NG_HCI_LINK_SCO:
+ if (hook != unit->sco ) {
+ NG_HCI_WARN(
+ "%s: %s - LP_ConnectReq for SCO connection came from wrong hook=%p\n",
+ __func__, NG_NODE_NAME(unit->node), hook);
+
+ NG_FREE_ITEM(item);
+
+ return (EINVAL);
+ }
+
+ return (ng_hci_lp_sco_con_req(unit, item, hook));
+ case NG_HCI_LINK_LE_PUBLIC:
+ case NG_HCI_LINK_LE_RANDOM:
+ return (ng_hci_lp_le_con_req(unit, item, hook, link_type));
+ default:
+ panic("%s: link_type invalid.", __func__);
}
-
- return (ng_hci_lp_sco_con_req(unit, item, hook));
+
+ return (EINVAL);
} /* ng_hci_lp_con_req */
/*
@@ -264,7 +276,7 @@ ng_hci_lp_acl_con_req(ng_hci_unit_p unit, item_p item, hook_p hook)
* So check the neighbor cache.
*/
- n = ng_hci_get_neighbor(unit, &ep->bdaddr);
+ n = ng_hci_get_neighbor(unit, &ep->bdaddr, NG_HCI_LINK_ACL);
if (n == NULL) {
req->cp.page_scan_rep_mode = 0;
req->cp.page_scan_mode = 0;
@@ -469,6 +481,180 @@ out:
return (error);
} /* ng_hci_lp_sco_con_req */
+static int
+ng_hci_lp_le_con_req(ng_hci_unit_p unit, item_p item, hook_p hook, int link_type)
+{
+ struct acl_con_req {
+ ng_hci_cmd_pkt_t hdr;
+ ng_hci_le_create_connection_cp cp;
+ } __attribute__ ((packed)) *req = NULL;
+ ng_hci_lp_con_req_ep *ep = NULL;
+ ng_hci_unit_con_p con = NULL;
+ struct mbuf *m = NULL;
+ int error = 0;
+
+ ep = (ng_hci_lp_con_req_ep *)(NGI_MSG(item)->data);
+ if((link_type != NG_HCI_LINK_LE_PUBLIC)&&
+ (link_type != NG_HCI_LINK_LE_RANDOM)){
+ printf("%s: Link type %d Cannot be here \n", __func__,
+ link_type);
+ }
+ /*
+ * Only one ACL connection can exist between each pair of units.
+ * So try to find ACL connection descriptor (in any state) that
+ * has requested remote BD_ADDR.
+ *
+ * Two cases:
+ *
+ * 1) We do not have connection to the remote unit. This is simple.
+ * Just create new connection descriptor and send HCI command to
+ * create new connection.
+ *
+ * 2) We do have connection descriptor. We need to check connection
+ * state:
+ *
+ * 2.1) NG_HCI_CON_W4_LP_CON_RSP means that we are in the middle of
+ * accepting connection from the remote unit. This is a race
+ * condition. We will ignore this message.
+ *
+ * 2.2) NG_HCI_CON_W4_CONN_COMPLETE means that upper layer already
+ * requested connection or we just accepted it. In any case
+ * all we need to do here is set appropriate notification bit
+ * and wait.
+ *
+ * 2.3) NG_HCI_CON_OPEN means connection is open. Just reply back
+ * and let upper layer know that we have connection already.
+ */
+
+ con = ng_hci_con_by_bdaddr(unit, &ep->bdaddr, link_type);
+ if (con != NULL) {
+ switch (con->state) {
+ case NG_HCI_CON_W4_LP_CON_RSP: /* XXX */
+ error = EALREADY;
+ break;
+
+ case NG_HCI_CON_W4_CONN_COMPLETE:
+ if (hook != unit->sco)
+ con->flags |= NG_HCI_CON_NOTIFY_ACL;
+ else
+ con->flags |= NG_HCI_CON_NOTIFY_SCO;
+ break;
+
+ case NG_HCI_CON_OPEN: {
+ struct ng_mesg *msg = NULL;
+ ng_hci_lp_con_cfm_ep *cfm = NULL;
+
+ if (hook != NULL && NG_HOOK_IS_VALID(hook)) {
+ NGI_GET_MSG(item, msg);
+ NG_FREE_MSG(msg);
+
+ NG_MKMESSAGE(msg, NGM_HCI_COOKIE,
+ NGM_HCI_LP_CON_CFM, sizeof(*cfm),
+ M_NOWAIT);
+ if (msg != NULL) {
+ cfm = (ng_hci_lp_con_cfm_ep *)msg->data;
+ cfm->status = 0;
+ cfm->link_type = con->link_type;
+ cfm->con_handle = con->con_handle;
+ bcopy(&con->bdaddr, &cfm->bdaddr,
+ sizeof(cfm->bdaddr));
+
+ /*
+ * This will forward item back to
+ * sender and set item to NULL
+ */
+
+ _NGI_MSG(item) = msg;
+ NG_FWD_ITEM_HOOK(error, item, hook);
+ } else
+ error = ENOMEM;
+ } else
+ NG_HCI_INFO(
+"%s: %s - Source hook is not valid, hook=%p\n",
+ __func__, NG_NODE_NAME(unit->node),
+ hook);
+ } break;
+
+ default:
+ panic(
+"%s: %s - Invalid connection state=%d\n",
+ __func__, NG_NODE_NAME(unit->node), con->state);
+ break;
+ }
+
+ goto out;
+ }
+
+ /*
+ * If we got here then we need to create new ACL connection descriptor
+ * and submit HCI command. First create new connection desriptor, set
+ * bdaddr and notification flags.
+ */
+
+ con = ng_hci_new_con(unit, link_type);
+ if (con == NULL) {
+ error = ENOMEM;
+ goto out;
+ }
+
+ bcopy(&ep->bdaddr, &con->bdaddr, sizeof(con->bdaddr));
+
+ /*
+ * Create HCI command
+ */
+
+ MGETHDR(m, M_NOWAIT, MT_DATA);
+ if (m == NULL) {
+ ng_hci_free_con(con);
+ error = ENOBUFS;
+ goto out;
+ }
+
+ m->m_pkthdr.len = m->m_len = sizeof(*req);
+ req = mtod(m, struct acl_con_req *);
+ req->hdr.type = NG_HCI_CMD_PKT;
+ req->hdr.length = sizeof(req->cp);
+ req->hdr.opcode = htole16(NG_HCI_OPCODE(NG_HCI_OGF_LE,
+ NG_HCI_OCF_LE_CREATE_CONNECTION));
+
+ bcopy(&ep->bdaddr, &req->cp.peer_addr, sizeof(req->cp.peer_addr));
+ req->cp.own_address_type = 0;
+ req->cp.peer_addr_type = (link_type == NG_HCI_LINK_LE_RANDOM)? 1:0;
+ req->cp.scan_interval = htole16(4);
+ req->cp.scan_window = htole16(4);
+ req->cp.filter_policy = 0;
+ req->cp.conn_interval_min = htole16(0xf);
+ req->cp.conn_interval_max = htole16(0xf);
+ req->cp.conn_latency = htole16(0);
+ req->cp.supervision_timeout = htole16(0xc80);
+ req->cp.min_ce_length = htole16(1);
+ req->cp.max_ce_length = htole16(1);
+ /*
+ * Adust connection state
+ */
+
+ if (hook != unit->sco)
+ con->flags |= NG_HCI_CON_NOTIFY_ACL;
+ else
+ con->flags |= NG_HCI_CON_NOTIFY_SCO;
+
+ con->state = NG_HCI_CON_W4_CONN_COMPLETE;
+ ng_hci_con_timeout(con);
+
+ /*
+ * Queue and send HCI command
+ */
+
+ NG_BT_MBUFQ_ENQUEUE(&unit->cmdq, m);
+ if (!(unit->state & NG_HCI_UNIT_COMMAND_PENDING))
+ error = ng_hci_send_command(unit);
+out:
+ if (item != NULL)
+ NG_FREE_ITEM(item);
+
+ return (error);
+} /* ng_hci_lp_acl_con_req */
+
/*
* Process LP_DisconnectReq event from the upper layer protocol
*/
@@ -578,7 +764,7 @@ ng_hci_lp_con_cfm(ng_hci_unit_con_p con, int status)
* only SCO upstream hook will receive notification
*/
- if (con->link_type == NG_HCI_LINK_ACL &&
+ if (con->link_type != NG_HCI_LINK_SCO &&
con->flags & NG_HCI_CON_NOTIFY_ACL) {
if (unit->acl != NULL && NG_HOOK_IS_VALID(unit->acl)) {
NG_MKMESSAGE(msg, NGM_HCI_COOKIE, NGM_HCI_LP_CON_CFM,
@@ -646,7 +832,7 @@ ng_hci_lp_con_ind(ng_hci_unit_con_p con, u_int8_t *uclass)
* Use link_type to select upstream hook.
*/
- if (con->link_type == NG_HCI_LINK_ACL)
+ if (con->link_type != NG_HCI_LINK_SCO)
hook = unit->acl;
else
hook = unit->sco;
@@ -887,7 +1073,7 @@ ng_hci_lp_discon_ind(ng_hci_unit_con_p con, int reason)
* only SCO upstream hook will receive notification.
*/
- if (con->link_type == NG_HCI_LINK_ACL) {
+ if (con->link_type != NG_HCI_LINK_SCO) {
if (unit->acl != NULL && NG_HOOK_IS_VALID(unit->acl)) {
NG_MKMESSAGE(msg, NGM_HCI_COOKIE,
NGM_HCI_LP_DISCON_IND, sizeof(*ep), M_NOWAIT);
diff --git a/sys/netgraph/bluetooth/hci/ng_hci_var.h b/sys/netgraph/bluetooth/hci/ng_hci_var.h
index bce4a25..171c437 100644
--- a/sys/netgraph/bluetooth/hci/ng_hci_var.h
+++ b/sys/netgraph/bluetooth/hci/ng_hci_var.h
@@ -205,6 +205,7 @@ typedef struct ng_hci_neighbor {
bdaddr_t bdaddr; /* address */
u_int8_t features[NG_HCI_FEATURES_SIZE];
/* LMP features */
+ u_int8_t addrtype; /*Address Type*/
u_int8_t page_scan_rep_mode; /* PS rep. mode */
u_int8_t page_scan_mode; /* page scan mode */
diff --git a/sys/netgraph/bluetooth/include/ng_btsocket.h b/sys/netgraph/bluetooth/include/ng_btsocket.h
index 6c3ce8d..483858e 100644
--- a/sys/netgraph/bluetooth/include/ng_btsocket.h
+++ b/sys/netgraph/bluetooth/include/ng_btsocket.h
@@ -221,13 +221,32 @@ struct sockaddr_sco {
* Bluetooth version of struct sockaddr for L2CAP sockets (RAW and SEQPACKET)
*/
+struct sockaddr_l2cap_compat {
+ u_char l2cap_len; /* total length */
+ u_char l2cap_family; /* address family */
+ u_int16_t l2cap_psm; /* PSM (Protocol/Service Multiplexor) */
+ bdaddr_t l2cap_bdaddr; /* address */
+};
+
+#define BDADDR_BREDR 0
+#define BDADDR_LE_PUBLIC 1
+#define BDADDR_LE_RANDOM 2
+
struct sockaddr_l2cap {
u_char l2cap_len; /* total length */
u_char l2cap_family; /* address family */
u_int16_t l2cap_psm; /* PSM (Protocol/Service Multiplexor) */
bdaddr_t l2cap_bdaddr; /* address */
+ u_int16_t l2cap_cid; /*cid*/
+ u_int8_t l2cap_bdaddr_type; /*address type*/
};
+
+#if !defined(L2CAP_SOCKET_CHECKED) && !defined(_KERNEL)
+#warning "Make sure new member of socket address initialized"
+#endif
+
+
/* L2CAP socket options */
#define SOL_L2CAP 0x1609 /* socket option level */
diff --git a/sys/netgraph/bluetooth/include/ng_btsocket_l2cap.h b/sys/netgraph/bluetooth/include/ng_btsocket_l2cap.h
index 493ea42..7d8a200 100644
--- a/sys/netgraph/bluetooth/include/ng_btsocket_l2cap.h
+++ b/sys/netgraph/bluetooth/include/ng_btsocket_l2cap.h
@@ -70,6 +70,8 @@ struct ng_btsocket_l2cap_raw_pcb {
bdaddr_t src; /* source address */
bdaddr_t dst; /* dest address */
+ uint8_t srctype;/*source addr type*/
+ uint8_t dsttype;/*source addr type*/
ng_btsocket_l2cap_rtentry_p rt; /* routing info */
u_int32_t token; /* message token */
@@ -129,6 +131,8 @@ struct ng_btsocket_l2cap_pcb {
bdaddr_t src; /* Source address */
bdaddr_t dst; /* Destination address */
+ uint8_t srctype; /*source addr type*/
+ uint8_t dsttype; /*source addr type*/
u_int16_t psm; /* PSM */
u_int16_t cid; /* Local channel ID */
diff --git a/sys/netgraph/bluetooth/include/ng_hci.h b/sys/netgraph/bluetooth/include/ng_hci.h
index 5cdfd5c..1688c4c 100644
--- a/sys/netgraph/bluetooth/include/ng_hci.h
+++ b/sys/netgraph/bluetooth/include/ng_hci.h
@@ -75,10 +75,11 @@
#define NG_HCI_KEY_SIZE 16 /* link key */
#define NG_HCI_PIN_SIZE 16 /* link PIN */
#define NG_HCI_EVENT_MASK_SIZE 8 /* event mask */
+#define NG_HCI_LE_EVENT_MASK_SIZE 8 /* event mask */
#define NG_HCI_CLASS_SIZE 3 /* unit class */
#define NG_HCI_FEATURES_SIZE 8 /* LMP features */
#define NG_HCI_UNIT_NAME_SIZE 248 /* unit name size */
-
+#define NG_HCI_COMMANDS_SIZE 64 /*Command list BMP size*/
/* HCI specification */
#define NG_HCI_SPEC_V10 0x00 /* v1.0 */
#define NG_HCI_SPEC_V11 0x01 /* v1.1 */
@@ -115,6 +116,8 @@
/* Link types */
#define NG_HCI_LINK_SCO 0x00 /* Voice */
#define NG_HCI_LINK_ACL 0x01 /* Data */
+#define NG_HCI_LINK_LE_PUBLIC 0x02 /* LE Public*/
+#define NG_HCI_LINK_LE_RANDOM 0x03 /* LE Random*/
/* 0x02 - 0xFF - reserved for future use */
/* Packet types */
@@ -894,6 +897,8 @@ typedef struct {
} __attribute__ ((packed)) ng_hci_set_event_mask_cp;
typedef ng_hci_status_rp ng_hci_set_event_mask_rp;
+#define NG_HCI_EVENT_MASK_DEFAULT 0x1fffffffffff
+#define NG_HCI_EVENT_MASK_LE 0x2000000000000000
#define NG_HCI_OCF_RESET 0x0003
/* No command parameter(s) */
@@ -1265,6 +1270,7 @@ typedef struct {
typedef ng_hci_status_rp ng_hci_write_iac_lap_rp;
+/*0x003b-0x003e commands are depricated v2.0 or later*/
#define NG_HCI_OCF_READ_PAGE_SCAN_PERIOD 0x003b
/* No command parameter(s) */
typedef struct {
@@ -1293,6 +1299,21 @@ typedef struct {
typedef ng_hci_status_rp ng_hci_write_page_scan_rp;
+#define NG_HCI_OCF_READ_LE_HOST_SUPPORTED 0x6c
+typedef struct {
+ u_int8_t status; /* 0x00 - success */
+ u_int8_t le_supported_host ;/* LE host supported?*/
+ u_int8_t simultaneous_le_host; /* BR/LE simulateneous? */
+} __attribute__ ((packed)) ng_hci_read_le_host_supported_rp;
+
+#define NG_HCI_OCF_WRITE_LE_HOST_SUPPORTED 0x6d
+typedef struct {
+ u_int8_t le_supported_host; /* LE host supported?*/
+ u_int8_t simultaneous_le_host; /* LE host supported?*/
+} __attribute__ ((packed)) ng_hci_write_le_host_supported_cp;
+
+typedef ng_hci_status_rp ng_hci_write_le_host_supported_rp;
+
/**************************************************************************
**************************************************************************
** Informational commands and return parameters
@@ -1312,6 +1333,12 @@ typedef struct {
u_int16_t lmp_subversion; /* LMP sub-version */
} __attribute__ ((packed)) ng_hci_read_local_ver_rp;
+#define NG_HCI_OCF_READ_LOCAL_COMMANDS 0x0002
+typedef struct {
+ u_int8_t status; /* 0x00 - success */
+ u_int8_t features[NG_HCI_COMMANDS_SIZE]; /* command bitmsk*/
+} __attribute__ ((packed)) ng_hci_read_local_commands_rp;
+
#define NG_HCI_OCF_READ_LOCAL_FEATURES 0x0003
typedef struct {
u_int8_t status; /* 0x00 - success */
@@ -1418,6 +1445,252 @@ typedef ng_hci_status_rp ng_hci_enable_unit_under_test_rp;
/**************************************************************************
**************************************************************************
+ ** LE OpCode group field
+ **************************************************************************
+ **************************************************************************/
+
+#define NG_HCI_OGF_LE 0x08 /* OpCode Group Field */
+#define NG_HCI_OCF_LE_SET_EVENT_MASK 0x0001
+typedef struct {
+ u_int8_t event_mask[NG_HCI_LE_EVENT_MASK_SIZE]; /* event_mask*/
+
+} __attribute__ ((packed)) ng_hci_le_set_event_mask_cp;
+typedef ng_hci_status_rp ng_hci_le_set_event_mask_rp;
+#define NG_HCI_LE_EVENT_MASK_ALL 0x1f
+
+#define NG_HCI_OCF_LE_READ_BUFFER_SIZE 0x0002
+/*No command parameter */
+typedef struct {
+ u_int8_t status; /*status*/
+ u_int16_t hc_le_data_packet_length;
+ u_int8_t hc_total_num_le_data_packets;
+} __attribute__ ((packed)) ng_hci_le_read_buffer_size_rp;
+
+
+#define NG_HCI_OCF_LE_READ_LOCAL_SUPPORTED_FEATURES 0x0003
+/*No command parameter */
+typedef struct {
+ u_int8_t status; /*status*/
+ u_int64_t le_features;
+} __attribute__ ((packed)) ng_hci_le_read_local_supported_features_rp;
+
+#define NG_HCI_OCF_LE_SET_RANDOM_ADDRESS 0x0005
+typedef struct {
+ bdaddr_t random_address;
+} __attribute__ ((packed)) ng_hci_le_set_random_address_cp_;
+typedef ng_hci_status_rp ng_hci_le_set_random_address_rp;
+
+#define NG_HCI_OCF_LE_SET_ADVERTISING_PARAMETERS 0x0006
+typedef struct {
+ u_int16_t advertising_interval_min;
+ u_int16_t advertising_interval_max;
+ u_int8_t advertising_type;
+ u_int8_t own_address_type;
+ u_int8_t direct_address_type;
+ bdaddr_t direct_address;
+ u_int8_t advertising_channel_map;
+ u_int8_t advertising_filter_policy;
+} __attribute__ ((packed)) ng_hci_le_set_advertising_parameters_cp;
+typedef ng_hci_status_rp ng_hci_le_set_advertising_parameters_rp;
+
+#define NG_HCI_OCF_LE_READ_ADVERTISING_CHANNEL_TX_POWER 0x0007
+/*No command parameter*/
+typedef struct {
+ u_int8_t status;
+ u_int8_t transmit_power_level;
+} __attribute__ ((packed)) ng_hci_le_read_advertising_channel_tx_power_rp;
+
+#define NG_HCI_OCF_LE_SET_ADVERTISING_DATA 0x0008
+#define NG_HCI_ADVERTISING_DATA_SIZE 31
+typedef struct {
+ u_int8_t advertising_data_length;
+ char advertising_data[NG_HCI_ADVERTISING_DATA_SIZE];
+} __attribute__ ((packed)) ng_hci_le_set_advertising_data_cp;
+typedef ng_hci_status_rp ng_hci_le_set_advertising_data_rp;
+
+#define NG_HCI_OCF_LE_SET_SCAN_RESPONSE_DATA 0x0009
+
+typedef struct {
+ u_int8_t scan_response_data_length;
+ char scan_response_data[NG_HCI_ADVERTISING_DATA_SIZE];
+} __attribute__ ((packed)) ng_hci_le_set_scan_response_data_cp;
+typedef ng_hci_status_rp ng_hci_le_set_scan_response_data_rp;
+
+#define NG_HCI_OCF_LE_SET_ADVERTISE_ENABLE 0x000a
+typedef struct {
+ u_int8_t advertising_enable;
+}__attribute__ ((packed)) ng_hci_le_set_advertise_enable_cp;
+typedef ng_hci_status_rp ng_hci_le_set_advertise_enable_rp;
+
+#define NG_HCI_OCF_LE_SET_SCAN_PARAMETERS 0x000b
+typedef struct {
+ u_int8_t le_scan_type;
+ u_int16_t le_scan_interval;
+ u_int16_t le_scan_window;
+ u_int8_t own_address_type;
+ u_int8_t scanning_filter_policy;
+}__attribute__ ((packed)) ng_hci_le_set_scan_parameters_cp;
+typedef ng_hci_status_rp ng_hci_le_set_scan_parameters_rp;
+
+#define NG_HCI_OCF_LE_SET_SCAN_ENABLE 0x000c
+typedef struct {
+ u_int8_t le_scan_enable;
+ u_int8_t filter_duplicates;
+}__attribute__ ((packed)) ng_hci_le_set_scan_enable_cp;
+typedef ng_hci_status_rp ng_hci_le_set_scan_enable_rp;
+
+#define NG_HCI_OCF_LE_CREATE_CONNECTION 0x000d
+typedef struct {
+ u_int16_t scan_interval;
+ u_int16_t scan_window;
+ u_int8_t filter_policy;
+ u_int8_t peer_addr_type;
+ bdaddr_t peer_addr;
+ u_int8_t own_address_type;
+ u_int16_t conn_interval_min;
+ u_int16_t conn_interval_max;
+ u_int16_t conn_latency;
+ u_int16_t supervision_timeout;
+ u_int16_t min_ce_length;
+ u_int16_t max_ce_length;
+}__attribute__((packed)) ng_hci_le_create_connection_cp;
+/* no return paramters*/
+#define NG_HCI_OCF_LE_CREATE_CONNECTION_CANCEL 0x000e
+/*No command parameter*/
+typedef ng_hci_status_rp ng_hci_le_create_connection_cancel_rp;
+#define NG_HCI_OCF_LE_READ_WHITE_LIST_SIZE 0x000f
+/*No command parameter*/
+typedef struct {
+ u_int8_t status;
+ u_int8_t white_list_size;
+} __attribute__ ((packed)) ng_hci_le_read_white_list_size_rp;
+
+#define NG_HCI_OCF_LE_CLEAR_WHITE_LIST 0x0010
+/*No command paramters*/
+typedef ng_hci_status_rp ng_hci_le_clear_white_list_rp;
+#define NG_HCI_OCF_LE_ADD_DEVICE_TO_WHITE_LIST 0x0011
+typedef struct {
+ u_int8_t address_type;
+ bdaddr_t address;
+} __attribute__ ((packed)) ng_hci_le_add_device_to_white_list_cp;
+typedef ng_hci_status_rp ng_hci_le_add_device_to_white_list_rp;
+
+#define NG_HCI_OCF_LE_REMOVE_DEVICE_FROM_WHITE_LIST 0x0012
+typedef struct {
+ u_int8_t address_type;
+ bdaddr_t address;
+} __attribute__ ((packed)) ng_hci_le_remove_device_from_white_list_cp;
+typedef ng_hci_status_rp ng_hci_le_remove_device_from_white_list_rp;
+
+#define NG_HCI_OCF_LE_CONNECTION_UPDATE 0x0013
+typedef struct {
+ u_int16_t connection_handle;
+ u_int16_t conn_interval_min;
+ u_int16_t conn_interval_max;
+ u_int16_t conn_latency;
+ u_int16_t supervision_timeout;
+ u_int16_t minimum_ce_length;
+ u_int16_t maximum_ce_length;
+}__attribute__ ((packed)) ng_hci_le_connection_update_cp;
+/*no return parameter*/
+
+#define NG_HCI_OCF_LE_SET_HOST_CHANNEL_CLASSIFICATION 0x0014
+typedef struct{
+ u_int8_t le_channel_map[5];
+}__attribute__ ((packed)) ng_hci_le_set_host_channel_classification_cp;
+typedef ng_hci_status_rp ng_hci_le_set_host_channel_classification_rp;
+
+#define NG_HCI_OCF_LE_READ_CHANNEL_MAP 0x0015
+typedef struct {
+ u_int16_t connection_handle;
+}__attribute__ ((packed)) ng_hci_le_read_channel_map_cp;
+typedef struct {
+ u_int8_t status;
+ u_int16_t connection_handle;
+ u_int8_t le_channel_map[5];
+} __attribute__ ((packed)) ng_hci_le_read_channel_map_rp;
+
+#define NG_HCI_OCF_LE_READ_REMOTE_USED_FEATURES 0x0016
+typedef struct {
+ u_int16_t connection_handle;
+}__attribute__ ((packed)) ng_hci_le_read_remote_used_features_cp;
+/*No return parameter*/
+#define NG_HCI_128BIT 16
+#define NG_HCI_OCF_LE_ENCRYPT 0x0017
+typedef struct {
+ u_int8_t key[NG_HCI_128BIT];
+ u_int8_t plaintext_data[NG_HCI_128BIT];
+}__attribute__ ((packed)) ng_hci_le_encrypt_cp;
+typedef struct {
+ u_int8_t status;
+ u_int8_t plaintext_data[NG_HCI_128BIT];
+}__attribute__ ((packed)) ng_hci_le_encrypt_rp;
+
+#define NG_HCI_OCF_LE_RAND 0x0018
+/*No command parameter*/
+typedef struct {
+ u_int8_t status;
+ u_int64_t random_number;
+}__attribute__ ((packed)) ng_hci_le_rand_rp;
+
+#define NG_HCI_OCF_LE_START_ENCRYPTION 0x0019
+typedef struct {
+ u_int16_t connection_handle;
+ u_int64_t random_number;
+ u_int16_t encrypted_diversifier;
+ u_int8_t long_term_key[NG_HCI_128BIT];
+}__attribute__ ((packed)) ng_hci_le_start_encryption_cp;
+/*No return parameter*/
+#define NG_HCI_OCF_LE_LONG_TERM_KEY_REQUEST_REPLY 0x001a
+typedef struct {
+ u_int16_t connection_handle;
+ u_int8_t long_term_key[NG_HCI_128BIT];
+}__attribute__ ((packed)) ng_hci_le_long_term_key_request_reply_cp;
+typedef struct {
+ u_int8_t status;
+ u_int16_t connection_handle;
+}__attribute__ ((packed)) ng_hci_le_long_term_key_request_reply_rp;
+
+#define NG_HCI_OCF_LE_LONG_TERM_KEY_REQUEST_NEGATIVE_REPLY 0x001b
+typedef struct{
+ u_int16_t connection_handle;
+}ng_hci_le_long_term_key_request_negative_reply_cp;
+typedef struct {
+ u_int8_t status;
+ u_int16_t connection_handle;
+}__attribute__ ((packed)) ng_hci_le_long_term_key_request_negative_reply_rp;
+
+
+#define NG_HCI_OCF_LE_READ_SUPPORTED_STATUS 0x001c
+/*No command parameter*/
+typedef struct {
+ u_int8_t status;
+ u_int64_t le_status;
+}__attribute__ ((packed)) ng_hci_le_read_supported_status_rp;
+
+#define NG_HCI_OCF_LE_RECEIVER_TEST 0x001d
+typedef struct{
+ u_int8_t rx_frequency;
+} __attribute__((packed)) ng_le_receiver_test_cp;
+typedef ng_hci_status_rp ng_hci_le_receiver_test_rp;
+
+#define NG_HCI_OCF_LE_TRANSMITTER_TEST 0x001e
+typedef struct{
+ u_int8_t tx_frequency;
+ u_int8_t length_of_test_data;
+ u_int8_t packet_payload;
+} __attribute__((packed)) ng_le_transmitter_test_cp;
+typedef ng_hci_status_rp ng_hci_le_transmitter_test_rp;
+
+#define NG_HCI_OCF_LE_TEST_END 0x001f
+/*No command paramter*/
+typedef struct {
+ u_int8_t status;
+ u_int16_t number_of_packets;
+}__attribute__ ((packed)) ng_hci_le_test_end_rp;
+
+/**************************************************************************
+ **************************************************************************
** Special HCI OpCode group field values
**************************************************************************
**************************************************************************/
@@ -1654,6 +1927,54 @@ typedef struct {
bdaddr_t bdaddr; /* destination address */
u_int8_t page_scan_rep_mode; /* page scan repetition mode */
} __attribute__ ((packed)) ng_hci_page_scan_rep_mode_change_ep;
+#define NG_HCI_EVENT_LE 0x3e
+typedef struct {
+ u_int8_t subevent_code;
+}__attribute__ ((packed)) ng_hci_le_ep;
+
+#define NG_HCI_LEEV_CON_COMPL 0x01
+
+typedef struct {
+ u_int8_t status;
+ u_int16_t handle;
+ u_int8_t role;
+ u_int8_t address_type;
+ bdaddr_t address;
+ u_int16_t interval;
+ u_int8_t latency;
+ u_int16_t supervision_timeout;
+ u_int8_t master_clock_accracy;
+
+} __attribute__ ((packed)) ng_hci_le_connection_complete_ep;
+
+#define NG_HCI_LEEV_ADVREP 0x02
+typedef struct {
+ u_int8_t num_reports;
+
+}__attribute__ ((packed)) ng_hci_le_advertising_report_ep;
+#define NG_HCI_SCAN_RESPONSE_DATA_MAX 0x1f
+
+typedef struct {
+ u_int8_t event_type;
+ u_int8_t addr_type;
+ bdaddr_t bdaddr;
+ u_int8_t length_data;
+ u_int8_t data[NG_HCI_SCAN_RESPONSE_DATA_MAX];
+}__attribute__((packed)) ng_hci_le_advreport;
+
+#define NG_HCI_LEEV_CON_UPDATE_COMPL 0x03
+typedef struct {
+ u_int8_t status;
+ u_int16_t connection_handle;
+ u_int16_t conn_interval;
+ u_int16_t conn_latency;
+ u_int16_t supervision_timeout;
+}__attribute__((packed)) ng_hci_connection_update_complete_ep;
+#define NG_HCI_LEEV_READ_REMOTE_FEATURES_COMPL 0x04
+//TBD
+#define NG_HCI_LEEV_LONG_TERM_KEY_REQUEST 0x05
+//TBD
+
#define NG_HCI_EVENT_BT_LOGO 0xfe
diff --git a/sys/netgraph/bluetooth/include/ng_l2cap.h b/sys/netgraph/bluetooth/include/ng_l2cap.h
index f57b5cb..48b3b55 100644
--- a/sys/netgraph/bluetooth/include/ng_l2cap.h
+++ b/sys/netgraph/bluetooth/include/ng_l2cap.h
@@ -73,11 +73,18 @@
#define NG_L2CAP_NULL_CID 0x0000 /* DO NOT USE THIS CID */
#define NG_L2CAP_SIGNAL_CID 0x0001 /* signaling channel ID */
#define NG_L2CAP_CLT_CID 0x0002 /* connectionless channel ID */
- /* 0x0003 - 0x003f Reserved */
+#define NG_L2CAP_A2MP_CID 0x0003
+#define NG_L2CAP_ATT_CID 0x0004
+#define NG_L2CAP_LESIGNAL_CID 0x0005
+#define NG_L2CAP_SMP_CID 0x0006
+ /* 0x0007 - 0x003f Reserved */
#define NG_L2CAP_FIRST_CID 0x0040 /* dynamically alloc. (start) */
#define NG_L2CAP_LAST_CID 0xffff /* dynamically alloc. (end) */
+#define NG_L2CAP_LELAST_CID 0x007f
+
/* L2CAP MTU */
+#define NG_L2CAP_MTU_LE_MINIMAM 23
#define NG_L2CAP_MTU_MINIMUM 48
#define NG_L2CAP_MTU_DEFAULT 672
#define NG_L2CAP_MTU_MAXIMUM 0xffff
@@ -289,7 +296,6 @@ typedef struct {
* NG_L2CAP_CONNLESS_MTU - 2 bytes connectionless MTU
*/
} __attribute__ ((packed)) ng_l2cap_info_rsp_cp;
-
typedef union {
/* NG_L2CAP_CONNLESS_MTU */
struct {
@@ -298,6 +304,20 @@ typedef union {
} ng_l2cap_info_rsp_data_t;
typedef ng_l2cap_info_rsp_data_t * ng_l2cap_info_rsp_data_p;
+#define NG_L2CAP_CMD_PARAM_UPDATE_REQUEST 0x12
+
+typedef struct {
+ uint16_t interval_min;
+ uint16_t interval_max;
+ uint16_t slave_latency;
+ uint16_t timeout_mpl;
+} __attribute__ ((packed)) ng_l2cap_param_update_req_cp;
+
+#define NG_L2CAP_CMD_PARAM_UPDATE_RESPONSE 0x13
+#define NG_L2CAP_UPDATE_PARAM_ACCEPT 0
+#define NG_L2CAP_UPDATE_PARAM_REJECT 1
+
+//typedef uint16_t update_response;
/**************************************************************************
**************************************************************************
** Upper layer protocol interface. L2CA_xxx messages
@@ -332,19 +352,25 @@ typedef struct {
u_int32_t token; /* token to use in L2CAP_L2CA_WRITE */
u_int16_t length; /* length of the data */
u_int16_t lcid; /* local channel ID */
+ uint16_t idtype;
} __attribute__ ((packed)) ng_l2cap_l2ca_hdr_t;
-
+#define NG_L2CAP_L2CA_IDTYPE_BREDR 0
+#define NG_L2CAP_L2CA_IDTYPE_ATT 1
+#define NG_L2CAP_L2CA_IDTYPE_LE 2
/* L2CA_Connect */
#define NGM_L2CAP_L2CA_CON 0x80
/* Upper -> L2CAP */
typedef struct {
u_int16_t psm; /* Protocol/Service Multiplexor */
bdaddr_t bdaddr; /* remote unit address */
+ uint8_t linktype;
+ uint8_t idtype;
} ng_l2cap_l2ca_con_ip;
/* L2CAP -> Upper */
typedef struct {
u_int16_t lcid; /* local channel ID */
+ uint16_t idtype; /*ID type*/
u_int16_t result; /* 0x00 - success */
u_int16_t status; /* if result != 0x00 */
} ng_l2cap_l2ca_con_op;
@@ -357,7 +383,7 @@ typedef struct {
u_int16_t lcid; /* local channel ID */
u_int16_t psm; /* Procotol/Service Multiplexor */
u_int8_t ident; /* indentifier */
- u_int8_t unused; /* place holder */
+ u_int8_t linktype; /* link type*/
} ng_l2cap_l2ca_con_ind_ip;
/* No output parameters */
@@ -367,7 +393,7 @@ typedef struct {
typedef struct {
bdaddr_t bdaddr; /* remote unit address */
u_int8_t ident; /* "ident" from L2CAP_ConnectInd event */
- u_int8_t unused; /* place holder */
+ u_int8_t linktype; /*link type */
u_int16_t lcid; /* local channel ID */
u_int16_t result; /* 0x00 - success */
u_int16_t status; /* if response != 0x00 */
@@ -435,6 +461,7 @@ typedef struct {
/* Upper -> L2CAP */
typedef struct {
u_int16_t lcid; /* local channel ID */
+ u_int16_t idtype;
} ng_l2cap_l2ca_discon_ip;
/* L2CAP -> Upper */
@@ -457,6 +484,7 @@ typedef struct {
int result; /* result (0x00 - success) */
u_int16_t length; /* amount of data written */
u_int16_t lcid; /* local channel ID */
+ uint16_t idtype;
} ng_l2cap_l2ca_write_op;
/* L2CA_GroupCreate */
@@ -545,6 +573,8 @@ typedef struct {
typedef struct {
bdaddr_t bdaddr; /* remote unit address */
u_int16_t info_type; /* info type */
+ uint8_t linktype;
+ uint8_t unused;
} ng_l2cap_l2ca_get_info_ip;
/* L2CAP -> Upper */
@@ -610,7 +640,9 @@ typedef u_int16_t ng_l2cap_node_flags_ep;
typedef u_int16_t ng_l2cap_node_debug_ep;
#define NGM_L2CAP_NODE_HOOK_INFO 0x409 /* L2CAP -> Upper */
-/* bdaddr_t bdaddr; -- local (source BDADDR) */
+typedef struct {
+ bdaddr_t addr;
+}ng_l2cap_node_hook_info_ep;
#define NGM_L2CAP_NODE_GET_CON_LIST 0x40a /* L2CAP -> User */
typedef struct {
diff --git a/sys/netgraph/bluetooth/l2cap/ng_l2cap_cmds.c b/sys/netgraph/bluetooth/l2cap/ng_l2cap_cmds.c
index db667b9..167fcb6 100644
--- a/sys/netgraph/bluetooth/l2cap/ng_l2cap_cmds.c
+++ b/sys/netgraph/bluetooth/l2cap/ng_l2cap_cmds.c
@@ -86,7 +86,6 @@ ng_l2cap_con_wakeup(ng_l2cap_con_p con)
/* Process command */
switch (cmd->code) {
- case NG_L2CAP_CMD_REJ:
case NG_L2CAP_DISCON_RSP:
case NG_L2CAP_ECHO_RSP:
case NG_L2CAP_INFO_RSP:
@@ -104,7 +103,16 @@ ng_l2cap_con_wakeup(ng_l2cap_con_p con)
ng_l2cap_unlink_cmd(cmd);
ng_l2cap_free_cmd(cmd);
break;
-
+ case NG_L2CAP_CMD_REJ:
+ (void) ng_l2cap_lp_send(con,
+ (con->linktype == NG_HCI_LINK_ACL)?
+ NG_L2CAP_SIGNAL_CID:
+ NG_L2CAP_LESIGNAL_CID
+ , m);
+ ng_l2cap_unlink_cmd(cmd);
+ ng_l2cap_free_cmd(cmd);
+ break;
+
case NG_L2CAP_CON_REQ:
error = ng_l2cap_lp_send(con, NG_L2CAP_SIGNAL_CID, m);
if (error != 0) {
@@ -115,7 +123,6 @@ ng_l2cap_con_wakeup(ng_l2cap_con_p con)
ng_l2cap_command_timeout(cmd,
bluetooth_l2cap_rtx_timeout());
break;
-
case NG_L2CAP_CON_RSP:
error = ng_l2cap_lp_send(con, NG_L2CAP_SIGNAL_CID, m);
ng_l2cap_unlink_cmd(cmd);
@@ -208,9 +215,14 @@ ng_l2cap_con_wakeup(ng_l2cap_con_p con)
ng_l2cap_unlink_cmd(cmd);
ng_l2cap_free_cmd(cmd);
} break;
-
+ case NG_L2CAP_CMD_PARAM_UPDATE_RESPONSE:
+ error = ng_l2cap_lp_send(con, NG_L2CAP_LESIGNAL_CID, m);
+ ng_l2cap_unlink_cmd(cmd);
+ ng_l2cap_free_cmd(cmd);
+ break;
+ case NG_L2CAP_CMD_PARAM_UPDATE_REQUEST:
+ /*TBD.*/
/* XXX FIXME add other commands */
-
default:
panic(
"%s: %s - unknown command code=%d\n",
@@ -256,6 +268,7 @@ ng_l2cap_con_fail(ng_l2cap_con_p con, u_int16_t result)
case NG_L2CAP_DISCON_RSP:
case NG_L2CAP_ECHO_RSP:
case NG_L2CAP_INFO_RSP:
+ case NG_L2CAP_CMD_PARAM_UPDATE_RESPONSE:
break;
case NG_L2CAP_CON_REQ:
diff --git a/sys/netgraph/bluetooth/l2cap/ng_l2cap_cmds.h b/sys/netgraph/bluetooth/l2cap/ng_l2cap_cmds.h
index 52789a1..7f22023 100644
--- a/sys/netgraph/bluetooth/l2cap/ng_l2cap_cmds.h
+++ b/sys/netgraph/bluetooth/l2cap/ng_l2cap_cmds.h
@@ -199,6 +199,25 @@ do { \
c->hdr.length = htole16(c->hdr.length); \
} while (0)
+#define _ng_l2cap_cmd_urs(_m, _ident, _result) \
+do { \
+ struct _cmd_urs{ \
+ ng_l2cap_cmd_hdr_t hdr; \
+ uint16_t result; \
+ } __attribute__ ((packed)) *c = NULL; \
+ \
+ MGETHDR((_m), M_NOWAIT, MT_DATA); \
+ \
+ (_m)->m_pkthdr.len = (_m)->m_len = sizeof(*c); \
+ \
+ c = mtod((_m), struct _cmd_urs *); \
+ c->hdr.code = NG_L2CAP_CMD_PARAM_UPDATE_RESPONSE; \
+ c->hdr.ident = (_ident); \
+ c->hdr.length = sizeof(c->result); \
+ \
+ c->result = htole16((_result)); \
+} while (0)
+
/* Build configuration options */
#define _ng_l2cap_build_cfg_options(_m, _mtu, _flush_timo, _flow) \
do { \
diff --git a/sys/netgraph/bluetooth/l2cap/ng_l2cap_evnt.c b/sys/netgraph/bluetooth/l2cap/ng_l2cap_evnt.c
index 747b74c..287ab66 100644
--- a/sys/netgraph/bluetooth/l2cap/ng_l2cap_evnt.c
+++ b/sys/netgraph/bluetooth/l2cap/ng_l2cap_evnt.c
@@ -57,7 +57,10 @@
******************************************************************************/
static int ng_l2cap_process_signal_cmd (ng_l2cap_con_p);
+static int ng_l2cap_process_lesignal_cmd (ng_l2cap_con_p);
static int ng_l2cap_process_cmd_rej (ng_l2cap_con_p, u_int8_t);
+static int ng_l2cap_process_cmd_urq (ng_l2cap_con_p, u_int8_t);
+static int ng_l2cap_process_cmd_urs (ng_l2cap_con_p, u_int8_t);
static int ng_l2cap_process_con_req (ng_l2cap_con_p, u_int8_t);
static int ng_l2cap_process_con_rsp (ng_l2cap_con_p, u_int8_t);
static int ng_l2cap_process_cfg_req (ng_l2cap_con_p, u_int8_t);
@@ -74,6 +77,9 @@ static int send_l2cap_con_rej
(ng_l2cap_con_p, u_int8_t, u_int16_t, u_int16_t, u_int16_t);
static int send_l2cap_cfg_rsp
(ng_l2cap_con_p, u_int8_t, u_int16_t, u_int16_t, struct mbuf *);
+static int send_l2cap_param_urs
+ (ng_l2cap_con_p , u_int8_t , u_int16_t);
+
static int get_next_l2cap_opt
(struct mbuf *, int *, ng_l2cap_cfg_opt_p, ng_l2cap_cfg_opt_val_p);
@@ -124,7 +130,10 @@ ng_l2cap_receive(ng_l2cap_con_p con)
m_adj(con->rx_pkt, sizeof(*hdr));
error = ng_l2cap_process_signal_cmd(con);
break;
-
+ case NG_L2CAP_LESIGNAL_CID:
+ m_adj(con->rx_pkt, sizeof(*hdr));
+ error = ng_l2cap_process_lesignal_cmd(con);
+ break;
case NG_L2CAP_CLT_CID: /* Connectionless packet */
error = ng_l2cap_l2ca_clt_receive(con);
break;
@@ -264,6 +273,105 @@ ng_l2cap_process_signal_cmd(ng_l2cap_con_p con)
return (0);
} /* ng_l2cap_process_signal_cmd */
+static int
+ng_l2cap_process_lesignal_cmd(ng_l2cap_con_p con)
+{
+ ng_l2cap_p l2cap = con->l2cap;
+ ng_l2cap_cmd_hdr_t *hdr = NULL;
+ struct mbuf *m = NULL;
+
+ while (con->rx_pkt != NULL) {
+ /* Verify packet length */
+ if (con->rx_pkt->m_pkthdr.len < sizeof(*hdr)) {
+ NG_L2CAP_ERR(
+"%s: %s - invalid L2CAP signaling command. Packet too small, len=%d\n",
+ __func__, NG_NODE_NAME(l2cap->node),
+ con->rx_pkt->m_pkthdr.len);
+ NG_FREE_M(con->rx_pkt);
+
+ return (EMSGSIZE);
+ }
+
+ /* Get signaling command */
+ NG_L2CAP_M_PULLUP(con->rx_pkt, sizeof(*hdr));
+ if (con->rx_pkt == NULL)
+ return (ENOBUFS);
+
+ hdr = mtod(con->rx_pkt, ng_l2cap_cmd_hdr_t *);
+ hdr->length = le16toh(hdr->length);
+ m_adj(con->rx_pkt, sizeof(*hdr));
+
+ /* Verify command length */
+ if (con->rx_pkt->m_pkthdr.len < hdr->length) {
+ NG_L2CAP_ERR(
+"%s: %s - invalid L2CAP signaling command, code=%#x, ident=%d. " \
+"Invalid command length=%d, m_pkthdr.len=%d\n",
+ __func__, NG_NODE_NAME(l2cap->node),
+ hdr->code, hdr->ident, hdr->length,
+ con->rx_pkt->m_pkthdr.len);
+ NG_FREE_M(con->rx_pkt);
+
+ return (EMSGSIZE);
+ }
+
+ /* Get the command, save the rest (if any) */
+ if (con->rx_pkt->m_pkthdr.len > hdr->length)
+ m = m_split(con->rx_pkt, hdr->length, M_NOWAIT);
+ else
+ m = NULL;
+
+ /* Process command */
+ switch (hdr->code) {
+ case NG_L2CAP_CMD_REJ:
+ ng_l2cap_process_cmd_rej(con, hdr->ident);
+ break;
+ case NG_L2CAP_CMD_PARAM_UPDATE_REQUEST:
+ ng_l2cap_process_cmd_urq(con, hdr->ident);
+ break;
+ case NG_L2CAP_CMD_PARAM_UPDATE_RESPONSE:
+ ng_l2cap_process_cmd_urs(con, hdr->ident);
+ break;
+
+
+ default:
+ NG_L2CAP_ERR(
+"%s: %s - unknown L2CAP signaling command, code=%#x, ident=%d, length=%d\n",
+ __func__, NG_NODE_NAME(l2cap->node),
+ hdr->code, hdr->ident, hdr->length);
+
+ /*
+ * Send L2CAP_CommandRej. Do not really care
+ * about the result
+ */
+
+ send_l2cap_reject(con, hdr->ident,
+ NG_L2CAP_REJ_NOT_UNDERSTOOD, 0, 0, 0);
+ NG_FREE_M(con->rx_pkt);
+ break;
+ }
+
+ con->rx_pkt = m;
+ }
+
+ return (0);
+} /* ng_l2cap_process_signal_cmd */
+/*Update Paramater Request*/
+static int ng_l2cap_process_cmd_urq(ng_l2cap_con_p con, uint8_t ident)
+{
+ /*We do not implement paramter negotiasion for now*/
+ send_l2cap_param_urs(con, ident, NG_L2CAP_UPDATE_PARAM_ACCEPT);
+ NG_FREE_M(con->rx_pkt);
+ return 0;
+}
+
+static int ng_l2cap_process_cmd_urs(ng_l2cap_con_p con, uint8_t ident)
+{
+ /* We only support master side yet .*/
+ //send_l2cap_reject(con,ident ... );
+
+ NG_FREE_M(con->rx_pkt);
+ return 0;
+}
/*
* Process L2CAP_CommandRej command
@@ -352,7 +460,8 @@ ng_l2cap_process_con_req(ng_l2cap_con_p con, u_int8_t ident)
ng_l2cap_chan_p ch = NULL;
int error = 0;
u_int16_t dcid, psm;
-
+ int idtype;
+
/* Get command parameters */
NG_L2CAP_M_PULLUP(m, sizeof(*cp));
if (m == NULL)
@@ -364,13 +473,20 @@ ng_l2cap_process_con_req(ng_l2cap_con_p con, u_int8_t ident)
NG_FREE_M(m);
con->rx_pkt = NULL;
+ if(dcid == NG_L2CAP_ATT_CID)
+ idtype = NG_L2CAP_L2CA_IDTYPE_ATT;
+ else if( con->linktype != NG_HCI_LINK_ACL)
+ idtype = NG_L2CAP_L2CA_IDTYPE_LE;
+ else
+ idtype = NG_L2CAP_L2CA_IDTYPE_BREDR;
/*
* Create new channel and send L2CA_ConnectInd notification
* to the upper layer protocol.
*/
- ch = ng_l2cap_new_chan(l2cap, con, psm);
+ ch = ng_l2cap_new_chan(l2cap, con, psm, idtype);
+
if (ch == NULL)
return (send_l2cap_con_rej(con, ident, 0, dcid,
NG_L2CAP_NO_RESOURCES));
@@ -486,7 +602,8 @@ ng_l2cap_process_con_rsp(ng_l2cap_con_p con, u_int8_t ident)
*/
cmd->ch->dcid = dcid;
- cmd->ch->state = NG_L2CAP_CONFIG;
+ cmd->ch->state = (cmd->ch->scid == NG_L2CAP_ATT_CID)?
+ NG_L2CAP_OPEN : NG_L2CAP_CONFIG;
} else
/* There was an error, so close the channel */
NG_L2CAP_INFO(
@@ -541,7 +658,7 @@ ng_l2cap_process_cfg_req(ng_l2cap_con_p con, u_int8_t ident)
m_adj(m, sizeof(*cp));
/* Check if we have this channel and it is in valid state */
- ch = ng_l2cap_chan_by_scid(l2cap, dcid);
+ ch = ng_l2cap_chan_by_scid(l2cap, dcid, NG_L2CAP_L2CA_IDTYPE_BREDR);
if (ch == NULL) {
NG_L2CAP_ERR(
"%s: %s - unexpected L2CAP_ConfigReq command. " \
@@ -826,7 +943,7 @@ ng_l2cap_process_discon_req(ng_l2cap_con_p con, u_int8_t ident)
NG_FREE_M(con->rx_pkt);
/* Check if we have this channel and it is in valid state */
- ch = ng_l2cap_chan_by_scid(l2cap, dcid);
+ ch = ng_l2cap_chan_by_scid(l2cap, dcid, NG_L2CAP_L2CA_IDTYPE_BREDR);
if (ch == NULL) {
NG_L2CAP_ERR(
"%s: %s - unexpected L2CAP_DisconnectReq message. " \
@@ -1251,6 +1368,34 @@ send_l2cap_cfg_rsp(ng_l2cap_con_p con, u_int8_t ident, u_int16_t scid,
return (0);
} /* send_l2cap_cfg_rsp */
+static int
+send_l2cap_param_urs(ng_l2cap_con_p con, u_int8_t ident,
+ u_int16_t result)
+{
+ ng_l2cap_cmd_p cmd = NULL;
+
+ cmd = ng_l2cap_new_cmd(con, NULL, ident,
+ NG_L2CAP_CMD_PARAM_UPDATE_RESPONSE,
+ 0);
+ if (cmd == NULL) {
+
+ return (ENOMEM);
+ }
+
+ _ng_l2cap_cmd_urs(cmd->aux, cmd->ident, result);
+ if (cmd->aux == NULL) {
+ ng_l2cap_free_cmd(cmd);
+
+ return (ENOBUFS);
+ }
+
+ /* Link command to the queue */
+ ng_l2cap_link_cmd(con, cmd);
+ ng_l2cap_lp_deliver(con);
+
+ return (0);
+} /* send_l2cap_cfg_rsp */
+
/*
* Get next L2CAP configuration option
*
diff --git a/sys/netgraph/bluetooth/l2cap/ng_l2cap_llpi.c b/sys/netgraph/bluetooth/l2cap/ng_l2cap_llpi.c
index 704e74a..e9e7412 100644
--- a/sys/netgraph/bluetooth/l2cap/ng_l2cap_llpi.c
+++ b/sys/netgraph/bluetooth/l2cap/ng_l2cap_llpi.c
@@ -64,7 +64,7 @@
*/
int
-ng_l2cap_lp_con_req(ng_l2cap_p l2cap, bdaddr_p bdaddr)
+ng_l2cap_lp_con_req(ng_l2cap_p l2cap, bdaddr_p bdaddr, int type)
{
struct ng_mesg *msg = NULL;
ng_hci_lp_con_req_ep *ep = NULL;
@@ -72,7 +72,7 @@ ng_l2cap_lp_con_req(ng_l2cap_p l2cap, bdaddr_p bdaddr)
int error = 0;
/* Verify that we DO NOT have connection to the remote unit */
- con = ng_l2cap_con_by_addr(l2cap, bdaddr);
+ con = ng_l2cap_con_by_addr(l2cap, bdaddr, type);
if (con != NULL) {
NG_L2CAP_ALERT(
"%s: %s - unexpected LP_ConnectReq event. " \
@@ -93,7 +93,7 @@ ng_l2cap_lp_con_req(ng_l2cap_p l2cap, bdaddr_p bdaddr)
}
/* Create and intialize new connection descriptor */
- con = ng_l2cap_new_con(l2cap, bdaddr);
+ con = ng_l2cap_new_con(l2cap, bdaddr, type);
if (con == NULL)
return (ENOMEM);
@@ -108,7 +108,7 @@ ng_l2cap_lp_con_req(ng_l2cap_p l2cap, bdaddr_p bdaddr)
ep = (ng_hci_lp_con_req_ep *) (msg->data);
bcopy(bdaddr, &ep->bdaddr, sizeof(ep->bdaddr));
- ep->link_type = NG_HCI_LINK_ACL;
+ ep->link_type = type;
con->flags |= NG_L2CAP_CON_OUTGOING;
con->state = NG_L2CAP_W4_LP_CON_CFM;
@@ -152,9 +152,8 @@ ng_l2cap_lp_con_cfm(ng_l2cap_p l2cap, struct ng_mesg *msg)
}
ep = (ng_hci_lp_con_cfm_ep *) (msg->data);
-
/* Check if we have requested/accepted this connection */
- con = ng_l2cap_con_by_addr(l2cap, &ep->bdaddr);
+ con = ng_l2cap_con_by_addr(l2cap, &ep->bdaddr, ep->link_type);
if (con == NULL) {
NG_L2CAP_ERR(
"%s: %s - unexpected LP_ConnectCfm event. Connection does not exist\n",
@@ -224,7 +223,7 @@ ng_l2cap_lp_con_ind(ng_l2cap_p l2cap, struct ng_mesg *msg)
ep = (ng_hci_lp_con_ind_ep *) (msg->data);
/* Make sure we have only one connection to the remote unit */
- con = ng_l2cap_con_by_addr(l2cap, &ep->bdaddr);
+ con = ng_l2cap_con_by_addr(l2cap, &ep->bdaddr, ep->link_type);
if (con != NULL) {
NG_L2CAP_ALERT(
"%s: %s - unexpected LP_ConnectInd event. " \
@@ -245,7 +244,7 @@ ng_l2cap_lp_con_ind(ng_l2cap_p l2cap, struct ng_mesg *msg)
}
/* Create and intialize new connection descriptor */
- con = ng_l2cap_new_con(l2cap, &ep->bdaddr);
+ con = ng_l2cap_new_con(l2cap, &ep->bdaddr, ep->link_type);
if (con == NULL)
return (ENOMEM);
@@ -773,6 +772,10 @@ ng_l2cap_lp_deliver(ng_l2cap_con_p con)
con->tx_pkt = con->tx_pkt->m_nextpkt;
m->m_nextpkt = NULL;
+ if(m->m_flags &M_PROTO2){
+ ng_l2cap_lp_receive(con->l2cap, m);
+ continue;
+ }
NG_L2CAP_INFO(
"%s: %s - sending ACL packet, con_handle=%d, len=%d\n",
__func__, NG_NODE_NAME(l2cap->node), con->con_handle,
diff --git a/sys/netgraph/bluetooth/l2cap/ng_l2cap_llpi.h b/sys/netgraph/bluetooth/l2cap/ng_l2cap_llpi.h
index 919a0aa..67ea6c0 100644
--- a/sys/netgraph/bluetooth/l2cap/ng_l2cap_llpi.h
+++ b/sys/netgraph/bluetooth/l2cap/ng_l2cap_llpi.h
@@ -34,7 +34,7 @@
#ifndef _NETGRAPH_L2CAP_LLPI_H_
#define _NETGRAPH_L2CAP_LLPI_H_
-int ng_l2cap_lp_con_req (ng_l2cap_p, bdaddr_p);
+int ng_l2cap_lp_con_req (ng_l2cap_p, bdaddr_p, int);
int ng_l2cap_lp_con_cfm (ng_l2cap_p, struct ng_mesg *);
int ng_l2cap_lp_con_ind (ng_l2cap_p, struct ng_mesg *);
int ng_l2cap_lp_discon_ind (ng_l2cap_p, struct ng_mesg *);
diff --git a/sys/netgraph/bluetooth/l2cap/ng_l2cap_misc.c b/sys/netgraph/bluetooth/l2cap/ng_l2cap_misc.c
index 0c3f1d0..886a918 100644
--- a/sys/netgraph/bluetooth/l2cap/ng_l2cap_misc.c
+++ b/sys/netgraph/bluetooth/l2cap/ng_l2cap_misc.c
@@ -49,7 +49,7 @@
#include <netgraph/bluetooth/l2cap/ng_l2cap_ulpi.h>
#include <netgraph/bluetooth/l2cap/ng_l2cap_misc.h>
-static u_int16_t ng_l2cap_get_cid (ng_l2cap_p);
+static u_int16_t ng_l2cap_get_cid (ng_l2cap_p, int);
/******************************************************************************
******************************************************************************
@@ -67,6 +67,7 @@ ng_l2cap_send_hook_info(node_p node, hook_p hook, void *arg1, int arg2)
ng_l2cap_p l2cap = NULL;
struct ng_mesg *msg = NULL;
int error = 0;
+ ng_l2cap_node_hook_info_ep *ep ;
if (node == NULL || NG_NODE_NOT_VALID(node) ||
hook == NULL || NG_HOOK_NOT_VALID(hook))
@@ -78,9 +79,11 @@ ng_l2cap_send_hook_info(node_p node, hook_p hook, void *arg1, int arg2)
return;
NG_MKMESSAGE(msg, NGM_L2CAP_COOKIE, NGM_L2CAP_NODE_HOOK_INFO,
- sizeof(bdaddr_t), M_NOWAIT);
+ sizeof(*ep), M_NOWAIT);
+
if (msg != NULL) {
- bcopy(&l2cap->bdaddr, msg->data, sizeof(bdaddr_t));
+ ep = (ng_l2cap_node_hook_info_ep *) &msg->data;
+ bcopy(&l2cap->bdaddr, &ep->addr, sizeof(bdaddr_t));
NG_SEND_MSG_HOOK(error, node, msg, hook, 0);
} else
error = ENOMEM;
@@ -98,7 +101,7 @@ ng_l2cap_send_hook_info(node_p node, hook_p hook, void *arg1, int arg2)
*/
ng_l2cap_con_p
-ng_l2cap_new_con(ng_l2cap_p l2cap, bdaddr_p bdaddr)
+ng_l2cap_new_con(ng_l2cap_p l2cap, bdaddr_p bdaddr, int type)
{
static int fake_con_handle = 0x0f00;
ng_l2cap_con_p con = NULL;
@@ -131,6 +134,7 @@ ng_l2cap_new_con(ng_l2cap_p l2cap, bdaddr_p bdaddr)
fake_con_handle = 0x0f00;
bcopy(bdaddr, &con->remote, sizeof(con->remote));
+ con->linktype = type;
ng_callout_init(&con->con_timo);
con->ident = NG_L2CAP_FIRST_IDENT - 1;
@@ -292,12 +296,13 @@ ng_l2cap_free_con(ng_l2cap_con_p con)
*/
ng_l2cap_con_p
-ng_l2cap_con_by_addr(ng_l2cap_p l2cap, bdaddr_p bdaddr)
+ng_l2cap_con_by_addr(ng_l2cap_p l2cap, bdaddr_p bdaddr, unsigned int type)
{
ng_l2cap_con_p con = NULL;
LIST_FOREACH(con, &l2cap->con_list, next)
- if (bcmp(bdaddr, &con->remote, sizeof(con->remote)) == 0)
+ if ((bcmp(bdaddr, &con->remote, sizeof(con->remote)) == 0)&&
+ (con->linktype == type))
break;
return (con);
@@ -325,7 +330,7 @@ ng_l2cap_con_by_handle(ng_l2cap_p l2cap, u_int16_t con_handle)
*/
ng_l2cap_chan_p
-ng_l2cap_new_chan(ng_l2cap_p l2cap, ng_l2cap_con_p con, u_int16_t psm)
+ng_l2cap_new_chan(ng_l2cap_p l2cap, ng_l2cap_con_p con, u_int16_t psm, int idtype)
{
ng_l2cap_chan_p ch = NULL;
@@ -333,8 +338,12 @@ ng_l2cap_new_chan(ng_l2cap_p l2cap, ng_l2cap_con_p con, u_int16_t psm)
M_NOWAIT|M_ZERO);
if (ch == NULL)
return (NULL);
-
- ch->scid = ng_l2cap_get_cid(l2cap);
+ if(idtype == NG_L2CAP_L2CA_IDTYPE_ATT){
+ ch->scid = ch->dcid = NG_L2CAP_ATT_CID;
+ }else{
+ ch->scid = ng_l2cap_get_cid(l2cap,
+ (con->linktype!= NG_HCI_LINK_ACL));
+ }
if (ch->scid != NG_L2CAP_NULL_CID) {
/* Initialize channel */
@@ -364,19 +373,42 @@ ng_l2cap_new_chan(ng_l2cap_p l2cap, ng_l2cap_con_p con, u_int16_t psm)
return (ch);
} /* ng_l2cap_new_chan */
-/*
- * Get channel by source (local) channel ID
- */
ng_l2cap_chan_p
-ng_l2cap_chan_by_scid(ng_l2cap_p l2cap, u_int16_t scid)
+ng_l2cap_chan_by_scid(ng_l2cap_p l2cap, u_int16_t scid, int idtype)
{
ng_l2cap_chan_p ch = NULL;
- LIST_FOREACH(ch, &l2cap->chan_list, next)
+ if(idtype == NG_L2CAP_L2CA_IDTYPE_ATT){
+ return NULL;
+ }
+
+ LIST_FOREACH(ch, &l2cap->chan_list, next){
+ if((idtype != NG_L2CAP_L2CA_IDTYPE_BREDR)&&
+ (ch->con->linktype == NG_HCI_LINK_ACL ))
+ continue;
+ if((idtype != NG_L2CAP_L2CA_IDTYPE_LE)&&
+ (ch->con->linktype != NG_HCI_LINK_ACL ))
+ continue;
+
if (ch->scid == scid)
break;
+ }
+ return (ch);
+} /* ng_l2cap_chan_by_scid */
+ng_l2cap_chan_p
+ng_l2cap_chan_by_conhandle(ng_l2cap_p l2cap, uint16_t scid,
+ u_int16_t con_handle)
+{
+ ng_l2cap_chan_p ch = NULL;
+
+
+ LIST_FOREACH(ch, &l2cap->chan_list, next){
+ if ((ch->scid == scid) &&
+ (ch->con->con_handle == con_handle))
+ break;
+ }
return (ch);
} /* ng_l2cap_chan_by_scid */
@@ -390,6 +422,7 @@ ng_l2cap_free_chan(ng_l2cap_chan_p ch)
ng_l2cap_cmd_p f = NULL, n = NULL;
f = TAILQ_FIRST(&ch->con->cmd_list);
+
while (f != NULL) {
n = TAILQ_NEXT(f, next);
@@ -591,21 +624,40 @@ ng_l2cap_default_flow(void)
*/
static u_int16_t
-ng_l2cap_get_cid(ng_l2cap_p l2cap)
+ng_l2cap_get_cid(ng_l2cap_p l2cap,int isle)
{
- u_int16_t cid = l2cap->cid + 1;
-
+ u_int16_t cid ;
+ u_int16_t endcid;
+ uint16_t mask;
+ int idtype;
+ if(isle){
+ endcid = l2cap->lecid;
+ /*Assume Last CID is 2^n-1 */
+ mask = NG_L2CAP_LELAST_CID;
+ idtype = NG_L2CAP_L2CA_IDTYPE_LE;
+ }else{
+ endcid = l2cap->cid;
+ /*Assume Last CID is 2^n-1 */
+ mask = NG_L2CAP_LAST_CID;
+ idtype = NG_L2CAP_L2CA_IDTYPE_BREDR;
+ }
+ cid = (endcid+1) & mask;
+
if (cid < NG_L2CAP_FIRST_CID)
cid = NG_L2CAP_FIRST_CID;
- while (cid != l2cap->cid) {
- if (ng_l2cap_chan_by_scid(l2cap, cid) == NULL) {
- l2cap->cid = cid;
-
+ while (cid != endcid) {
+ if (ng_l2cap_chan_by_scid(l2cap, cid, idtype) == NULL) {
+ if(!isle){
+ l2cap->cid = cid;
+ }else{
+ l2cap->lecid = cid;
+ }
return (cid);
}
cid ++;
+ cid &= mask;
if (cid < NG_L2CAP_FIRST_CID)
cid = NG_L2CAP_FIRST_CID;
}
diff --git a/sys/netgraph/bluetooth/l2cap/ng_l2cap_misc.h b/sys/netgraph/bluetooth/l2cap/ng_l2cap_misc.h
index 22cff48..aa30fac 100644
--- a/sys/netgraph/bluetooth/l2cap/ng_l2cap_misc.h
+++ b/sys/netgraph/bluetooth/l2cap/ng_l2cap_misc.h
@@ -40,10 +40,10 @@ void ng_l2cap_send_hook_info (node_p, hook_p, void *, int);
* ACL Connections
*/
-ng_l2cap_con_p ng_l2cap_new_con (ng_l2cap_p, bdaddr_p);
+ng_l2cap_con_p ng_l2cap_new_con (ng_l2cap_p, bdaddr_p, int);
void ng_l2cap_con_ref (ng_l2cap_con_p);
void ng_l2cap_con_unref (ng_l2cap_con_p);
-ng_l2cap_con_p ng_l2cap_con_by_addr (ng_l2cap_p, bdaddr_p);
+ng_l2cap_con_p ng_l2cap_con_by_addr (ng_l2cap_p, bdaddr_p, unsigned int);
ng_l2cap_con_p ng_l2cap_con_by_handle (ng_l2cap_p, u_int16_t);
void ng_l2cap_free_con (ng_l2cap_con_p);
@@ -51,8 +51,10 @@ void ng_l2cap_free_con (ng_l2cap_con_p);
* L2CAP channels
*/
-ng_l2cap_chan_p ng_l2cap_new_chan (ng_l2cap_p, ng_l2cap_con_p, u_int16_t);
-ng_l2cap_chan_p ng_l2cap_chan_by_scid (ng_l2cap_p, u_int16_t);
+ng_l2cap_chan_p ng_l2cap_new_chan (ng_l2cap_p, ng_l2cap_con_p, u_int16_t, int);
+ng_l2cap_chan_p ng_l2cap_chan_by_scid (ng_l2cap_p, u_int16_t, int);
+ng_l2cap_chan_p ng_l2cap_chan_by_conhandle(ng_l2cap_p , uint16_t , u_int16_t);
+
void ng_l2cap_free_chan (ng_l2cap_chan_p);
/*
diff --git a/sys/netgraph/bluetooth/l2cap/ng_l2cap_ulpi.c b/sys/netgraph/bluetooth/l2cap/ng_l2cap_ulpi.c
index 8a8e31d..a0cfbcd 100644
--- a/sys/netgraph/bluetooth/l2cap/ng_l2cap_ulpi.c
+++ b/sys/netgraph/bluetooth/l2cap/ng_l2cap_ulpi.c
@@ -81,10 +81,10 @@ ng_l2cap_l2ca_con_req(ng_l2cap_p l2cap, struct ng_mesg *msg)
ip = (ng_l2cap_l2ca_con_ip *)(msg->data);
/* Check if we have connection to the remote unit */
- con = ng_l2cap_con_by_addr(l2cap, &ip->bdaddr);
+ con = ng_l2cap_con_by_addr(l2cap, &ip->bdaddr, ip->linktype);
if (con == NULL) {
/* Submit LP_ConnectReq to the lower layer */
- error = ng_l2cap_lp_con_req(l2cap, &ip->bdaddr);
+ error = ng_l2cap_lp_con_req(l2cap, &ip->bdaddr,ip->linktype);
if (error != 0) {
NG_L2CAP_ERR(
"%s: %s - unable to send LP_ConnectReq message, error=%d\n",
@@ -93,7 +93,7 @@ ng_l2cap_l2ca_con_req(ng_l2cap_p l2cap, struct ng_mesg *msg)
}
/* This should not fail */
- con = ng_l2cap_con_by_addr(l2cap, &ip->bdaddr);
+ con = ng_l2cap_con_by_addr(l2cap, &ip->bdaddr, ip->linktype);
KASSERT((con != NULL),
("%s: %s - could not find connection!\n", __func__, NG_NODE_NAME(l2cap->node)));
}
@@ -103,7 +103,7 @@ ng_l2cap_l2ca_con_req(ng_l2cap_p l2cap, struct ng_mesg *msg)
* not touch connection descriptor.
*/
- ch = ng_l2cap_new_chan(l2cap, con, ip->psm);
+ ch = ng_l2cap_new_chan(l2cap, con, ip->psm, ip->idtype);
if (ch == NULL) {
error = ENOMEM;
goto out;
@@ -126,7 +126,13 @@ ng_l2cap_l2ca_con_req(ng_l2cap_p l2cap, struct ng_mesg *msg)
}
/* Create L2CAP command packet */
- _ng_l2cap_con_req(cmd->aux, cmd->ident, ch->psm, ch->scid);
+ if(ip->idtype == NG_L2CAP_L2CA_IDTYPE_ATT){
+ _ng_l2cap_con_rsp(cmd->aux, cmd->ident, NG_L2CAP_ATT_CID,
+ NG_L2CAP_ATT_CID, 0, 0);
+ cmd->aux->m_flags |= M_PROTO2;
+ }else{
+ _ng_l2cap_con_req(cmd->aux, cmd->ident, ch->psm, ch->scid);
+ }
if (cmd->aux == NULL) {
ng_l2cap_free_cmd(cmd);
ng_l2cap_free_chan(ch);
@@ -182,8 +188,16 @@ ng_l2cap_l2ca_con_rsp(ng_l2cap_chan_p ch, u_int32_t token, u_int16_t result,
* What about PENDING? What the heck, for now always populate
* LCID :)
*/
+ if(ch->scid == NG_L2CAP_ATT_CID){
+ op->idtype = NG_L2CAP_L2CA_IDTYPE_ATT;
+ op->lcid = ch->con->con_handle;
+ }else{
+ op->idtype = (ch->con->linktype == NG_HCI_LINK_ACL)?
+ NG_L2CAP_L2CA_IDTYPE_BREDR :
+ NG_L2CAP_L2CA_IDTYPE_LE;
+ op->lcid = ch->scid;
+ }
- op->lcid = ch->scid;
op->result = result;
op->status = status;
@@ -220,7 +234,15 @@ ng_l2cap_l2ca_con_rsp_req(ng_l2cap_p l2cap, struct ng_mesg *msg)
ip = (ng_l2cap_l2ca_con_rsp_ip *)(msg->data);
/* Check if we have this channel */
- ch = ng_l2cap_chan_by_scid(l2cap, ip->lcid);
+ if(ip->lcid != NG_L2CAP_ATT_CID){
+ ch = ng_l2cap_chan_by_scid(l2cap, ip->lcid
+ ,(ip->linktype == NG_HCI_LINK_ACL)?
+ NG_L2CAP_L2CA_IDTYPE_BREDR:
+ NG_L2CAP_L2CA_IDTYPE_LE);
+ }else{
+ // For now not support on ATT device.
+ ch = NULL;
+ }
if (ch == NULL) {
NG_L2CAP_ALERT(
"%s: %s - unexpected L2CA_ConnectRsp request message. " \
@@ -259,7 +281,8 @@ ng_l2cap_l2ca_con_rsp_req(ng_l2cap_p l2cap, struct ng_mesg *msg)
/* Check result */
switch (ip->result) {
case NG_L2CAP_SUCCESS:
- ch->state = NG_L2CAP_CONFIG;
+ ch->state = (ch->scid == NG_L2CAP_ATT_CID)?
+ NG_L2CAP_OPEN : NG_L2CAP_CONFIG;
ch->cfg_state = 0;
break;
@@ -410,7 +433,7 @@ ng_l2cap_l2ca_cfg_req(ng_l2cap_p l2cap, struct ng_mesg *msg)
ip = (ng_l2cap_l2ca_cfg_ip *)(msg->data);
/* Check if we have this channel */
- ch = ng_l2cap_chan_by_scid(l2cap, ip->lcid);
+ ch = ng_l2cap_chan_by_scid(l2cap, ip->lcid, NG_L2CAP_L2CA_IDTYPE_BREDR);
if (ch == NULL) {
NG_L2CAP_ERR(
"%s: %s - unexpected L2CA_Config request message. " \
@@ -478,7 +501,8 @@ ng_l2cap_l2ca_cfg_req(ng_l2cap_p l2cap, struct ng_mesg *msg)
/* Adjust channel state for re-configuration */
if (ch->state == NG_L2CAP_OPEN) {
- ch->state = NG_L2CAP_CONFIG;
+ ch->state = (ch->scid == NG_L2CAP_ATT_CID)?
+ NG_L2CAP_OPEN : NG_L2CAP_CONFIG;
ch->cfg_state = 0;
}
@@ -580,7 +604,8 @@ ng_l2cap_l2ca_cfg_rsp_req(ng_l2cap_p l2cap, struct ng_mesg *msg)
ip = (ng_l2cap_l2ca_cfg_rsp_ip *)(msg->data);
/* Check if we have this channel */
- ch = ng_l2cap_chan_by_scid(l2cap, ip->lcid);
+ ch = ng_l2cap_chan_by_scid(l2cap, ip->lcid,
+ NG_L2CAP_L2CA_IDTYPE_BREDR);
if (ch == NULL) {
NG_L2CAP_ERR(
"%s: %s - unexpected L2CA_ConfigRsp request message. " \
@@ -784,16 +809,24 @@ ng_l2cap_l2ca_write_req(ng_l2cap_p l2cap, struct mbuf *m)
}
/* Check channel ID */
- if (l2ca_hdr->lcid < NG_L2CAP_FIRST_CID) {
- NG_L2CAP_ERR(
-"%s: %s - invalid L2CA Data packet. Inavlid channel ID, cid=%d\n",
- __func__, NG_NODE_NAME(l2cap->node), l2ca_hdr->lcid);
- error = EINVAL;
- goto drop;
- }
+ if (l2ca_hdr->idtype == NG_L2CAP_L2CA_IDTYPE_ATT){
+ ch = ng_l2cap_chan_by_conhandle(l2cap, NG_L2CAP_ATT_CID,
+ l2ca_hdr->lcid);
+ } else{
+ if (l2ca_hdr->lcid < NG_L2CAP_FIRST_CID) {
+ NG_L2CAP_ERR(
+ "%s: %s - invalid L2CA Data packet. Inavlid channel ID, cid=%d\n",
+ __func__, NG_NODE_NAME(l2cap->node),
+ l2ca_hdr->lcid);
+ error = EINVAL;
+ goto drop;
+ }
- /* Verify that we have the channel and make sure it is open */
- ch = ng_l2cap_chan_by_scid(l2cap, l2ca_hdr->lcid);
+ /* Verify that we have the channel and make sure it is open */
+ ch = ng_l2cap_chan_by_scid(l2cap, l2ca_hdr->lcid,
+ l2ca_hdr->idtype);
+ }
+
if (ch == NULL) {
NG_L2CAP_ERR(
"%s: %s - invalid L2CA Data packet. Channel does not exist, cid=%d\n",
@@ -865,8 +898,16 @@ ng_l2cap_l2ca_write_rsp(ng_l2cap_chan_p ch, u_int32_t token, u_int16_t result,
op = (ng_l2cap_l2ca_write_op *)(msg->data);
op->result = result;
op->length = length;
- op->lcid = ch->scid;
-
+ if(ch->scid == NG_L2CAP_ATT_CID){
+ op->idtype = NG_L2CAP_L2CA_IDTYPE_ATT;
+ op->lcid = ch->con->con_handle;
+ }else{
+ op->idtype = (ch->con->linktype == NG_HCI_LINK_ACL)?
+ NG_L2CAP_L2CA_IDTYPE_BREDR :
+ NG_L2CAP_L2CA_IDTYPE_LE;
+ op->lcid = ch->scid;
+
+ }
NG_SEND_MSG_HOOK(error, l2cap->node, msg, l2cap->l2c, 0);
}
@@ -885,6 +926,8 @@ ng_l2cap_l2ca_receive(ng_l2cap_con_p con)
ng_l2cap_hdr_t *hdr = NULL;
ng_l2cap_chan_p ch = NULL;
int error = 0;
+ int idtype;
+ uint16_t *idp;
NG_L2CAP_M_PULLUP(con->rx_pkt, sizeof(*hdr));
if (con->rx_pkt == NULL)
@@ -893,11 +936,26 @@ ng_l2cap_l2ca_receive(ng_l2cap_con_p con)
hdr = mtod(con->rx_pkt, ng_l2cap_hdr_t *);
/* Check channel */
- ch = ng_l2cap_chan_by_scid(l2cap, hdr->dcid);
+
+ if(hdr->dcid == NG_L2CAP_ATT_CID){
+ idtype = NG_L2CAP_L2CA_IDTYPE_ATT;
+ ch = ng_l2cap_chan_by_conhandle(l2cap, NG_L2CAP_ATT_CID,
+ con->con_handle);
+ /*
+ * Here,ATT channel is distinguished by
+ * connection handle
+ */
+ hdr->dcid = con->con_handle;
+ }else{
+ idtype = (con->linktype==NG_HCI_LINK_ACL)?
+ NG_L2CAP_L2CA_IDTYPE_BREDR:
+ NG_L2CAP_L2CA_IDTYPE_LE;
+ ch = ng_l2cap_chan_by_scid(l2cap, hdr->dcid, idtype);
+ }
if (ch == NULL) {
NG_L2CAP_ERR(
-"%s: %s - unexpected L2CAP data packet. Channel does not exist, cid=%d\n",
- __func__, NG_NODE_NAME(l2cap->node), hdr->dcid);
+"%s: %s - unexpected L2CAP data packet. Channel does not exist, cid=%d, idtype=%d\n",
+ __func__, NG_NODE_NAME(l2cap->node), hdr->dcid, idtype);
error = ENOENT;
goto drop;
}
@@ -938,6 +996,11 @@ ng_l2cap_l2ca_receive(ng_l2cap_con_p con)
error = ENOTCONN;
goto drop;
}
+ M_PREPEND(con->rx_pkt, sizeof(uint16_t), M_NOWAIT);
+ if(con->rx_pkt == NULL)
+ goto drop;
+ idp = mtod(con->rx_pkt, uint16_t *);
+ *idp = idtype;
NG_SEND_DATA_ONLY(error, l2cap->l2c, con->rx_pkt);
con->rx_pkt = NULL;
@@ -1091,8 +1154,26 @@ ng_l2cap_l2ca_discon_req(ng_l2cap_p l2cap, struct ng_mesg *msg)
ip = (ng_l2cap_l2ca_discon_ip *)(msg->data);
- /* Check if we have this channel */
- ch = ng_l2cap_chan_by_scid(l2cap, ip->lcid);
+
+ if(ip->idtype == NG_L2CAP_L2CA_IDTYPE_ATT){
+ /* Don't send Disconnect request on L2CAP Layer*/
+ ch = ng_l2cap_chan_by_conhandle(l2cap, NG_L2CAP_ATT_CID,
+ ip->lcid);
+
+ if(ch != NULL){
+ ng_l2cap_free_chan(ch);
+ }else{
+ NG_L2CAP_ERR(
+"%s: %s - unexpected L2CA_Disconnect request message. " \
+"Channel does not exist, conhandle=%d\n",
+ __func__, NG_NODE_NAME(l2cap->node), ip->lcid);
+ error = EINVAL;
+ }
+ goto out;
+ }else{
+ /* Check if we have this channel */
+ ch = ng_l2cap_chan_by_scid(l2cap, ip->lcid, ip->idtype);
+ }
if (ch == NULL) {
NG_L2CAP_ERR(
"%s: %s - unexpected L2CA_Disconnect request message. " \
@@ -1322,10 +1403,10 @@ ng_l2cap_l2ca_ping_req(ng_l2cap_p l2cap, struct ng_mesg *msg)
}
/* Check if we have connection to the unit */
- con = ng_l2cap_con_by_addr(l2cap, &ip->bdaddr);
+ con = ng_l2cap_con_by_addr(l2cap, &ip->bdaddr, NG_HCI_LINK_ACL);
if (con == NULL) {
/* Submit LP_ConnectReq to the lower layer */
- error = ng_l2cap_lp_con_req(l2cap, &ip->bdaddr);
+ error = ng_l2cap_lp_con_req(l2cap, &ip->bdaddr, NG_HCI_LINK_ACL);
if (error != 0) {
NG_L2CAP_ERR(
"%s: %s - unable to send LP_ConnectReq message, error=%d\n",
@@ -1334,7 +1415,7 @@ ng_l2cap_l2ca_ping_req(ng_l2cap_p l2cap, struct ng_mesg *msg)
}
/* This should not fail */
- con = ng_l2cap_con_by_addr(l2cap, &ip->bdaddr);
+ con = ng_l2cap_con_by_addr(l2cap, &ip->bdaddr, NG_HCI_LINK_ACL);
KASSERT((con != NULL),
("%s: %s - could not find connection!\n", __func__, NG_NODE_NAME(l2cap->node)));
}
@@ -1444,10 +1525,10 @@ ng_l2cap_l2ca_get_info_req(ng_l2cap_p l2cap, struct ng_mesg *msg)
ip = (ng_l2cap_l2ca_get_info_ip *)(msg->data);
/* Check if we have connection to the unit */
- con = ng_l2cap_con_by_addr(l2cap, &ip->bdaddr);
+ con = ng_l2cap_con_by_addr(l2cap, &ip->bdaddr,ip->linktype);
if (con == NULL) {
/* Submit LP_ConnectReq to the lower layer */
- error = ng_l2cap_lp_con_req(l2cap, &ip->bdaddr);
+ error = ng_l2cap_lp_con_req(l2cap, &ip->bdaddr,ip->linktype);
if (error != 0) {
NG_L2CAP_ERR(
"%s: %s - unable to send LP_ConnectReq message, error=%d\n",
@@ -1456,7 +1537,7 @@ ng_l2cap_l2ca_get_info_req(ng_l2cap_p l2cap, struct ng_mesg *msg)
}
/* This should not fail */
- con = ng_l2cap_con_by_addr(l2cap, &ip->bdaddr);
+ con = ng_l2cap_con_by_addr(l2cap, &ip->bdaddr, ip->linktype);
KASSERT((con != NULL),
("%s: %s - could not find connection!\n", __func__, NG_NODE_NAME(l2cap->node)));
}
diff --git a/sys/netgraph/bluetooth/l2cap/ng_l2cap_var.h b/sys/netgraph/bluetooth/l2cap/ng_l2cap_var.h
index 2188492..55db4ba 100644
--- a/sys/netgraph/bluetooth/l2cap/ng_l2cap_var.h
+++ b/sys/netgraph/bluetooth/l2cap/ng_l2cap_var.h
@@ -92,7 +92,9 @@ typedef struct ng_l2cap {
LIST_HEAD(, ng_l2cap_con) con_list; /* ACL connections */
- u_int16_t cid; /* last allocated CID */
+ u_int16_t cid; /* last allocated CID */
+ u_int16_t lecid; /* last allocated CID for LE */
+
LIST_HEAD(, ng_l2cap_chan) chan_list; /* L2CAP channels */
} ng_l2cap_t;
typedef ng_l2cap_t * ng_l2cap_p;
@@ -116,6 +118,8 @@ typedef struct ng_l2cap_con {
struct callout con_timo; /* connection timeout */
u_int8_t ident; /* last allocated ident */
+ uint8_t linktype;
+
TAILQ_HEAD(, ng_l2cap_cmd) cmd_list; /* pending L2CAP cmds */
struct mbuf *tx_pkt; /* xmitted L2CAP packet */
@@ -148,6 +152,7 @@ typedef struct ng_l2cap_chan {
u_int16_t scid; /* source channel ID */
u_int16_t dcid; /* destination channel ID */
+ uint16_t idtype;
u_int16_t imtu; /* incoming channel MTU */
ng_l2cap_flow_t iflow; /* incoming flow control */
diff --git a/sys/netgraph/bluetooth/socket/ng_btsocket_hci_raw.c b/sys/netgraph/bluetooth/socket/ng_btsocket_hci_raw.c
index 4c71414..139d6db 100644
--- a/sys/netgraph/bluetooth/socket/ng_btsocket_hci_raw.c
+++ b/sys/netgraph/bluetooth/socket/ng_btsocket_hci_raw.c
@@ -876,6 +876,9 @@ ng_btsocket_hci_raw_init(void)
/* Commands - Testing */
f = ng_btsocket_hci_raw_sec_filter->commands[NG_HCI_OGF_TESTING - 1];
bit_set(f, NG_HCI_OCF_READ_LOOPBACK_MODE - 1);
+ /*Commands - LE*/
+ f = ng_btsocket_hci_raw_sec_filter->commands[NG_HCI_OGF_LE -1];
+
} /* ng_btsocket_hci_raw_init */
/*
diff --git a/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap.c b/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap.c
index d2e0487..7b666b1 100644
--- a/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap.c
+++ b/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap.c
@@ -184,7 +184,7 @@ static int ng_btsocket_l2cap_process_l2ca_write_rsp
static int ng_btsocket_l2cap_send_l2ca_con_req
(ng_btsocket_l2cap_pcb_p);
static int ng_btsocket_l2cap_send_l2ca_con_rsp_req
- (u_int32_t, ng_btsocket_l2cap_rtentry_p, bdaddr_p, int, int, int);
+ (u_int32_t, ng_btsocket_l2cap_rtentry_p, bdaddr_p, int, int, int, int);
static int ng_btsocket_l2cap_send_l2ca_cfg_req
(ng_btsocket_l2cap_pcb_p);
static int ng_btsocket_l2cap_send_l2ca_cfg_rsp
@@ -209,15 +209,42 @@ static void ng_btsocket_l2cap_process_timeout (void *);
static ng_btsocket_l2cap_pcb_p ng_btsocket_l2cap_pcb_by_addr(bdaddr_p, int);
static ng_btsocket_l2cap_pcb_p ng_btsocket_l2cap_pcb_by_token(u_int32_t);
-static ng_btsocket_l2cap_pcb_p ng_btsocket_l2cap_pcb_by_cid (bdaddr_p, int);
+static ng_btsocket_l2cap_pcb_p ng_btsocket_l2cap_pcb_by_cid (bdaddr_p, int,int);
static int ng_btsocket_l2cap_result2errno(int);
+static int ng_btsock_l2cap_addrtype_to_linktype(int addrtype);
+static int ng_btsock_l2cap_pcb_to_idtype(struct ng_btsocket_l2cap_pcb *);
#define ng_btsocket_l2cap_wakeup_input_task() \
taskqueue_enqueue(taskqueue_swi_giant, &ng_btsocket_l2cap_queue_task)
#define ng_btsocket_l2cap_wakeup_route_task() \
taskqueue_enqueue(taskqueue_swi_giant, &ng_btsocket_l2cap_rt_task)
+
+int ng_btsock_l2cap_pcb_to_idtype(struct ng_btsocket_l2cap_pcb *pcb)
+{
+ if(pcb->dsttype == BDADDR_BREDR){
+ return NG_L2CAP_L2CA_IDTYPE_BREDR;
+ }else if(pcb->psm == 0){
+ return NG_L2CAP_L2CA_IDTYPE_ATT;
+ }else{
+ return NG_L2CAP_L2CA_IDTYPE_LE;
+ }
+}
+
+int ng_btsock_l2cap_addrtype_to_linktype(int addrtype)
+{
+ switch(addrtype){
+ case BDADDR_LE_PUBLIC:
+ return NG_HCI_LINK_LE_PUBLIC;
+ case BDADDR_LE_RANDOM:
+ return NG_HCI_LINK_LE_RANDOM;
+ default:
+ return NG_HCI_LINK_ACL;
+ }
+}
+
+
/*****************************************************************************
*****************************************************************************
** Netgraph node interface
@@ -445,28 +472,35 @@ ng_btsocket_l2cap_process_l2ca_con_req_rsp(struct ng_mesg *msg,
return (0);
}
- if (op->result == NG_L2CAP_SUCCESS) {
- /*
- * Channel is now open, so update local channel ID and
- * start configuration process. Source and destination
- * addresses as well as route must be already set.
- */
-
- pcb->cid = op->lcid;
-
- error = ng_btsocket_l2cap_send_l2ca_cfg_req(pcb);
- if (error != 0) {
- /* Send disconnect request with "zero" token */
- ng_btsocket_l2cap_send_l2ca_discon_req(0, pcb);
-
- /* ... and close the socket */
- pcb->state = NG_BTSOCKET_L2CAP_CLOSED;
- soisdisconnected(pcb->so);
- } else {
- pcb->cfg_state = NG_BTSOCKET_L2CAP_CFG_IN_SENT;
- pcb->state = NG_BTSOCKET_L2CAP_CONFIGURING;
-
- ng_btsocket_l2cap_timeout(pcb);
+ if (op->result == NG_L2CAP_SUCCESS){
+ if(ng_btsock_l2cap_pcb_to_idtype(pcb) ==
+ NG_L2CAP_L2CA_IDTYPE_ATT){
+ pcb->state = NG_BTSOCKET_L2CAP_OPEN;
+ soisconnected(pcb->so);
+ pcb->cid = op->lcid;
+ }else{
+ /*
+ * Channel is now open, so update local channel ID and
+ * start configuration process. Source and destination
+ * addresses as well as route must be already set.
+ */
+
+ pcb->cid = op->lcid;
+
+ error = ng_btsocket_l2cap_send_l2ca_cfg_req(pcb);
+ if (error != 0) {
+ /* Send disconnect request with "zero" token */
+ ng_btsocket_l2cap_send_l2ca_discon_req(0, pcb);
+
+ /* ... and close the socket */
+ pcb->state = NG_BTSOCKET_L2CAP_CLOSED;
+ soisdisconnected(pcb->so);
+ } else {
+ pcb->cfg_state = NG_BTSOCKET_L2CAP_CFG_IN_SENT;
+ pcb->state = NG_BTSOCKET_L2CAP_CONFIGURING;
+
+ ng_btsocket_l2cap_timeout(pcb);
+ }
}
} else {
/*
@@ -643,7 +677,9 @@ ng_btsocket_l2cap_process_l2ca_con_ind(struct ng_mesg *msg,
respond:
error = ng_btsocket_l2cap_send_l2ca_con_rsp_req(token, rt,
- &ip->bdaddr, ip->ident, ip->lcid, result);
+ &ip->bdaddr,
+ ip->ident, ip->lcid,
+ result,ip->linktype);
if (pcb1 != NULL) {
if (error != 0) {
pcb1->so->so_error = error;
@@ -899,7 +935,8 @@ ng_btsocket_l2cap_process_l2ca_cfg_ind(struct ng_mesg *msg,
mtx_lock(&ng_btsocket_l2cap_sockets_mtx);
/* Check for the open socket that has given channel ID */
- pcb = ng_btsocket_l2cap_pcb_by_cid(&rt->src, ip->lcid);
+ pcb = ng_btsocket_l2cap_pcb_by_cid(&rt->src, ip->lcid,
+ NG_L2CAP_L2CA_IDTYPE_BREDR);
if (pcb == NULL) {
mtx_unlock(&ng_btsocket_l2cap_sockets_mtx);
return (ENOENT);
@@ -1040,7 +1077,8 @@ ng_btsocket_l2cap_process_l2ca_discon_ind(struct ng_mesg *msg,
mtx_lock(&ng_btsocket_l2cap_sockets_mtx);
/* Look for the socket with given channel ID */
- pcb = ng_btsocket_l2cap_pcb_by_cid(&rt->src, ip->lcid);
+ pcb = ng_btsocket_l2cap_pcb_by_cid(&rt->src, ip->lcid,
+ NG_L2CAP_L2CA_IDTYPE_BREDR);
if (pcb == NULL) {
mtx_unlock(&ng_btsocket_l2cap_sockets_mtx);
return (0);
@@ -1176,7 +1214,8 @@ ng_btsocket_l2cap_send_l2ca_con_req(ng_btsocket_l2cap_pcb_p pcb)
ip = (ng_l2cap_l2ca_con_ip *)(msg->data);
bcopy(&pcb->dst, &ip->bdaddr, sizeof(ip->bdaddr));
ip->psm = pcb->psm;
-
+ ip->linktype = ng_btsock_l2cap_addrtype_to_linktype(pcb->dsttype);
+ ip->idtype = ng_btsock_l2cap_pcb_to_idtype(pcb);
NG_SEND_MSG_HOOK(error, ng_btsocket_l2cap_node, msg,pcb->rt->hook, 0);
return (error);
@@ -1189,7 +1228,7 @@ ng_btsocket_l2cap_send_l2ca_con_req(ng_btsocket_l2cap_pcb_p pcb)
static int
ng_btsocket_l2cap_send_l2ca_con_rsp_req(u_int32_t token,
ng_btsocket_l2cap_rtentry_p rt, bdaddr_p dst, int ident,
- int lcid, int result)
+ int lcid, int result, int linktype)
{
struct ng_mesg *msg = NULL;
ng_l2cap_l2ca_con_rsp_ip *ip = NULL;
@@ -1209,6 +1248,7 @@ ng_btsocket_l2cap_send_l2ca_con_rsp_req(u_int32_t token,
bcopy(dst, &ip->bdaddr, sizeof(ip->bdaddr));
ip->ident = ident;
ip->lcid = lcid;
+ ip->linktype = linktype;
ip->result = result;
ip->status = 0;
@@ -1314,6 +1354,7 @@ ng_btsocket_l2cap_send_l2ca_discon_req(u_int32_t token,
ip = (ng_l2cap_l2ca_discon_ip *)(msg->data);
ip->lcid = pcb->cid;
+ ip->idtype = ng_btsock_l2cap_pcb_to_idtype(pcb);
NG_SEND_MSG_HOOK(error, ng_btsocket_l2cap_node, msg,pcb->rt->hook, 0);
@@ -1337,6 +1378,7 @@ ng_btsocket_l2cap_data_input(struct mbuf *m, hook_p hook)
ng_l2cap_clt_hdr_t *clt_hdr = NULL;
ng_btsocket_l2cap_pcb_t *pcb = NULL;
ng_btsocket_l2cap_rtentry_t *rt = NULL;
+ uint16_t idtype;
if (hook == NULL) {
NG_BTSOCKET_L2CAP_ALERT(
@@ -1351,6 +1393,10 @@ ng_btsocket_l2cap_data_input(struct mbuf *m, hook_p hook)
goto drop;
}
+ m = m_pullup(m, sizeof(uint16_t));
+ idtype = *mtod(m, uint16_t *);
+ m_adj(m, sizeof(uint16_t));
+
/* Make sure we can access header */
if (m->m_pkthdr.len < sizeof(*hdr)) {
NG_BTSOCKET_L2CAP_ERR(
@@ -1394,12 +1440,13 @@ ng_btsocket_l2cap_data_input(struct mbuf *m, hook_p hook)
rt->src.b[2], rt->src.b[1], rt->src.b[0],
hdr->dcid, hdr->length);
- if (hdr->dcid >= NG_L2CAP_FIRST_CID) {
+ if ((hdr->dcid >= NG_L2CAP_FIRST_CID) ||
+ (idtype == NG_L2CAP_L2CA_IDTYPE_ATT)){
mtx_lock(&ng_btsocket_l2cap_sockets_mtx);
/* Normal packet: find connected socket */
- pcb = ng_btsocket_l2cap_pcb_by_cid(&rt->src, hdr->dcid);
+ pcb = ng_btsocket_l2cap_pcb_by_cid(&rt->src, hdr->dcid,idtype);
if (pcb == NULL) {
mtx_unlock(&ng_btsocket_l2cap_sockets_mtx);
goto drop;
@@ -1557,11 +1604,12 @@ ng_btsocket_l2cap_default_msg_input(struct ng_mesg *msg, hook_p hook)
switch (msg->header.cmd) {
case NGM_L2CAP_NODE_HOOK_INFO: {
ng_btsocket_l2cap_rtentry_t *rt = NULL;
-
- if (hook == NULL || msg->header.arglen != sizeof(bdaddr_t))
+ ng_l2cap_node_hook_info_ep *ep =
+ (ng_l2cap_node_hook_info_ep *)msg->data;
+ if (hook == NULL || msg->header.arglen != sizeof(*ep))
break;
- if (bcmp(msg->data, NG_HCI_BDADDR_ANY, sizeof(bdaddr_t)) == 0)
+ if (bcmp(&ep->addr, NG_HCI_BDADDR_ANY, sizeof(bdaddr_t)) == 0)
break;
mtx_lock(&ng_btsocket_l2cap_rt_mtx);
@@ -1580,7 +1628,7 @@ ng_btsocket_l2cap_default_msg_input(struct ng_mesg *msg, hook_p hook)
NG_HOOK_SET_PRIVATE(hook, rt);
}
- bcopy(msg->data, &rt->src, sizeof(rt->src));
+ bcopy(&ep->addr, &rt->src, sizeof(rt->src));
rt->hook = hook;
mtx_unlock(&ng_btsocket_l2cap_rt_mtx);
@@ -2035,7 +2083,9 @@ ng_btsocket_l2cap_bind(struct socket *so, struct sockaddr *nam,
return (EINVAL);
if (sa->l2cap_family != AF_BLUETOOTH)
return (EAFNOSUPPORT);
- if (sa->l2cap_len != sizeof(*sa))
+ /*For the time being, Not support LE binding.*/
+ if ((sa->l2cap_len != sizeof(*sa))&&
+ (sa->l2cap_len != sizeof(struct sockaddr_l2cap_compat)))
return (EINVAL);
psm = le16toh(sa->l2cap_psm);
@@ -2080,7 +2130,9 @@ ng_btsocket_l2cap_connect(struct socket *so, struct sockaddr *nam,
struct thread *td)
{
ng_btsocket_l2cap_pcb_t *pcb = so2l2cap_pcb(so);
- struct sockaddr_l2cap *sa = (struct sockaddr_l2cap *) nam;
+ struct sockaddr_l2cap_compat *sal = (struct sockaddr_l2cap_compat *) nam;
+ struct sockaddr_l2cap *sa = (struct sockaddr_l2cap *)nam;
+ struct sockaddr_l2cap ba;
ng_btsocket_l2cap_rtentry_t *rt = NULL;
int have_src, error = 0;
@@ -2097,14 +2149,27 @@ ng_btsocket_l2cap_connect(struct socket *so, struct sockaddr *nam,
return (EINVAL);
if (sa->l2cap_family != AF_BLUETOOTH)
return (EAFNOSUPPORT);
+ if (sa->l2cap_len == sizeof(*sal)){
+ bcopy(sal, &ba, sizeof(*sal));
+ sa = &ba;
+ sa->l2cap_len = sizeof(*sa);
+ sa->l2cap_bdaddr_type = BDADDR_BREDR;
+ }
if (sa->l2cap_len != sizeof(*sa))
return (EINVAL);
- if (sa->l2cap_psm == 0 ||
- bcmp(&sa->l2cap_bdaddr, NG_HCI_BDADDR_ANY, sizeof(bdaddr_t)) == 0)
+ if ((sa->l2cap_psm && sa->l2cap_cid))
+ return EINVAL;
+ if (bcmp(&sa->l2cap_bdaddr, NG_HCI_BDADDR_ANY, sizeof(bdaddr_t)) == 0)
return (EDESTADDRREQ);
+ if((sa->l2cap_bdaddr_type == BDADDR_BREDR)&&
+ (sa->l2cap_psm == 0))
+ return EDESTADDRREQ;
+ if((sa->l2cap_bdaddr_type != BDADDR_BREDR)&&
+ (sa->l2cap_cid != NG_L2CAP_ATT_CID)){
+ return EINVAL;
+ }
if (pcb->psm != 0 && pcb->psm != le16toh(sa->l2cap_psm))
return (EINVAL);
-
/*
* Routing. Socket should be bound to some source address. The source
* address can be ANY. Destination address must be set and it must not
@@ -2119,7 +2184,9 @@ ng_btsocket_l2cap_connect(struct socket *so, struct sockaddr *nam,
/* Send destination address and PSM */
bcopy(&sa->l2cap_bdaddr, &pcb->dst, sizeof(pcb->dst));
pcb->psm = le16toh(sa->l2cap_psm);
-
+ pcb->dsttype = sa->l2cap_bdaddr_type;
+ pcb->cid = sa->l2cap_cid;
+
pcb->rt = NULL;
have_src = bcmp(&pcb->src, NG_HCI_BDADDR_ANY, sizeof(pcb->src));
@@ -2140,8 +2207,12 @@ ng_btsocket_l2cap_connect(struct socket *so, struct sockaddr *nam,
if (rt != NULL) {
pcb->rt = rt;
- if (!have_src)
+ if (!have_src){
bcopy(&rt->src, &pcb->src, sizeof(pcb->src));
+ pcb->srctype =
+ (sa->l2cap_bdaddr_type == BDADDR_BREDR)?
+ BDADDR_BREDR : BDADDR_LE_RANDOM;
+ }
} else
error = EHOSTUNREACH;
@@ -2418,7 +2489,8 @@ ng_btsocket_l2cap_peeraddr(struct socket *so, struct sockaddr **nam)
sa.l2cap_psm = htole16(pcb->psm);
sa.l2cap_len = sizeof(sa);
sa.l2cap_family = AF_BLUETOOTH;
-
+ sa.l2cap_cid = 0;
+ sa.l2cap_bdaddr_type = pcb->dsttype;
*nam = sodupsockaddr((struct sockaddr *) &sa, M_NOWAIT);
return ((*nam == NULL)? ENOMEM : 0);
@@ -2536,7 +2608,7 @@ ng_btsocket_l2cap_send2(ng_btsocket_l2cap_pcb_p pcb)
hdr->token = pcb->token;
hdr->length = m->m_pkthdr.len - sizeof(*hdr);
hdr->lcid = pcb->cid;
-
+ hdr->idtype = ng_btsock_l2cap_pcb_to_idtype(pcb);
NG_BTSOCKET_L2CAP_INFO(
"%s: Sending packet: len=%d, length=%d, lcid=%d, token=%d, state=%d\n",
__func__, m->m_pkthdr.len, hdr->length, hdr->lcid,
@@ -2571,6 +2643,8 @@ ng_btsocket_l2cap_sockaddr(struct socket *so, struct sockaddr **nam)
sa.l2cap_psm = htole16(pcb->psm);
sa.l2cap_len = sizeof(sa);
sa.l2cap_family = AF_BLUETOOTH;
+ sa.l2cap_cid = 0;
+ sa.l2cap_bdaddr_type = pcb->srctype;
*nam = sodupsockaddr((struct sockaddr *) &sa, M_NOWAIT);
@@ -2638,16 +2712,19 @@ ng_btsocket_l2cap_pcb_by_token(u_int32_t token)
*/
static ng_btsocket_l2cap_pcb_p
-ng_btsocket_l2cap_pcb_by_cid(bdaddr_p src, int cid)
+ng_btsocket_l2cap_pcb_by_cid(bdaddr_p src, int cid, int idtype)
{
ng_btsocket_l2cap_pcb_p p = NULL;
mtx_assert(&ng_btsocket_l2cap_sockets_mtx, MA_OWNED);
- LIST_FOREACH(p, &ng_btsocket_l2cap_sockets, next)
- if (p->cid == cid && bcmp(src, &p->src, sizeof(p->src)) == 0)
+ LIST_FOREACH(p, &ng_btsocket_l2cap_sockets, next){
+ if (p->cid == cid &&
+ bcmp(src, &p->src, sizeof(p->src)) == 0&&
+ ng_btsock_l2cap_pcb_to_idtype(p) == idtype)
break;
+ }
return (p);
} /* ng_btsocket_l2cap_pcb_by_cid */
diff --git a/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap_raw.c b/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap_raw.c
index e0b57e1..bb66510 100644
--- a/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap_raw.c
+++ b/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap_raw.c
@@ -667,7 +667,8 @@ ng_btsocket_l2cap_raw_bind(struct socket *so, struct sockaddr *nam,
return (EINVAL);
if (sa->l2cap_family != AF_BLUETOOTH)
return (EAFNOSUPPORT);
- if (sa->l2cap_len != sizeof(*sa))
+ if((sa->l2cap_len != sizeof(*sa))&&
+ (sa->l2cap_len != sizeof(struct sockaddr_l2cap_compat)))
return (EINVAL);
if (bcmp(&sa->l2cap_bdaddr, NG_HCI_BDADDR_ANY,
@@ -720,8 +721,10 @@ ng_btsocket_l2cap_raw_connect(struct socket *so, struct sockaddr *nam,
return (EINVAL);
if (sa->l2cap_family != AF_BLUETOOTH)
return (EAFNOSUPPORT);
- if (sa->l2cap_len != sizeof(*sa))
+ if((sa->l2cap_len != sizeof(*sa))&&
+ (sa->l2cap_len != sizeof(struct sockaddr_l2cap_compat)))
return (EINVAL);
+
if (bcmp(&sa->l2cap_bdaddr, NG_HCI_BDADDR_ANY, sizeof(bdaddr_t)) == 0)
return (EINVAL);
@@ -1179,6 +1182,8 @@ ng_btsocket_l2cap_raw_peeraddr(struct socket *so, struct sockaddr **nam)
sa.l2cap_psm = 0;
sa.l2cap_len = sizeof(sa);
sa.l2cap_family = AF_BLUETOOTH;
+ sa.l2cap_cid = 0;
+ sa.l2cap_bdaddr_type = BDADDR_BREDR;
*nam = sodupsockaddr((struct sockaddr *) &sa, M_NOWAIT);
@@ -1221,7 +1226,8 @@ ng_btsocket_l2cap_raw_sockaddr(struct socket *so, struct sockaddr **nam)
sa.l2cap_psm = 0;
sa.l2cap_len = sizeof(sa);
sa.l2cap_family = AF_BLUETOOTH;
-
+ sa.l2cap_cid = 0;
+ sa.l2cap_bdaddr_type = BDADDR_BREDR;
*nam = sodupsockaddr((struct sockaddr *) &sa, M_NOWAIT);
return ((*nam == NULL)? ENOMEM : 0);
diff --git a/sys/netgraph/ng_deflate.c b/sys/netgraph/ng_deflate.c
index da68e49..be52942 100644
--- a/sys/netgraph/ng_deflate.c
+++ b/sys/netgraph/ng_deflate.c
@@ -39,8 +39,7 @@
#include <sys/endian.h>
#include <sys/errno.h>
#include <sys/syslog.h>
-
-#include <net/zlib.h>
+#include <sys/zlib.h>
#include <netgraph/ng_message.h>
#include <netgraph/netgraph.h>
diff --git a/sys/netinet/igmp.c b/sys/netinet/igmp.c
index 986ee3c..a094a49 100644
--- a/sys/netinet/igmp.c
+++ b/sys/netinet/igmp.c
@@ -1540,7 +1540,6 @@ igmp_input(struct mbuf **mp, int *offp, int proto)
struct igmpv3 *igmpv3;
uint16_t igmpv3len;
uint16_t nsrc;
- int srclen;
IGMPSTAT_INC(igps_rcv_v3_queries);
igmpv3 = (struct igmpv3 *)igmp;
@@ -1548,8 +1547,8 @@ igmp_input(struct mbuf **mp, int *offp, int proto)
* Validate length based on source count.
*/
nsrc = ntohs(igmpv3->igmp_numsrc);
- srclen = sizeof(struct in_addr) * nsrc;
- if (nsrc * sizeof(in_addr_t) > srclen) {
+ if (nsrc * sizeof(in_addr_t) >
+ UINT16_MAX - iphlen - IGMP_V3_QUERY_MINLEN) {
IGMPSTAT_INC(igps_rcv_tooshort);
return (IPPROTO_DONE);
}
@@ -1558,7 +1557,7 @@ igmp_input(struct mbuf **mp, int *offp, int proto)
* this scope.
*/
igmpv3len = iphlen + IGMP_V3_QUERY_MINLEN +
- srclen;
+ sizeof(struct in_addr) * nsrc;
if ((!M_WRITABLE(m) ||
m->m_len < igmpv3len) &&
(m = m_pullup(m, igmpv3len)) == NULL) {
diff --git a/sys/netinet/in.c b/sys/netinet/in.c
index bfcb33a..f47492d 100644
--- a/sys/netinet/in.c
+++ b/sys/netinet/in.c
@@ -128,6 +128,30 @@ in_localip(struct in_addr in)
}
/*
+ * Return 1 if an internet address is configured on an interface.
+ */
+int
+in_ifhasaddr(struct ifnet *ifp, struct in_addr in)
+{
+ struct ifaddr *ifa;
+ struct in_ifaddr *ia;
+
+ IF_ADDR_RLOCK(ifp);
+ TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
+ if (ifa->ifa_addr->sa_family != AF_INET)
+ continue;
+ ia = (struct in_ifaddr *)ifa;
+ if (ia->ia_addr.sin_addr.s_addr == in.s_addr) {
+ IF_ADDR_RUNLOCK(ifp);
+ return (1);
+ }
+ }
+ IF_ADDR_RUNLOCK(ifp);
+
+ return (0);
+}
+
+/*
* Return a reference to the interface address which is different to
* the supplied one but with same IP address value.
*/
diff --git a/sys/netinet/in.h b/sys/netinet/in.h
index 1f79761..325b523 100644
--- a/sys/netinet/in.h
+++ b/sys/netinet/in.h
@@ -642,6 +642,7 @@ int in_broadcast(struct in_addr, struct ifnet *);
int in_canforward(struct in_addr);
int in_localaddr(struct in_addr);
int in_localip(struct in_addr);
+int in_ifhasaddr(struct ifnet *, struct in_addr);
int inet_aton(const char *, struct in_addr *); /* in libkern */
char *inet_ntoa(struct in_addr); /* in libkern */
char *inet_ntoa_r(struct in_addr ina, char *buf); /* in libkern */
diff --git a/sys/netinet/in_kdtrace.c b/sys/netinet/in_kdtrace.c
index d37e3c0..edcc853 100644
--- a/sys/netinet/in_kdtrace.c
+++ b/sys/netinet/in_kdtrace.c
@@ -102,6 +102,9 @@ SDT_PROBE_DEFINE5_XLATE(tcp, , , send,
"struct tcpcb *", "tcpsinfo_t *" ,
"struct tcphdr *", "tcpinfo_t *");
+SDT_PROBE_DEFINE1_XLATE(tcp, , , siftr,
+ "struct pkt_node *", "siftrinfo_t *");
+
SDT_PROBE_DEFINE6_XLATE(tcp, , , state__change,
"void *", "void *",
"struct tcpcb *", "csinfo_t *",
diff --git a/sys/netinet/in_kdtrace.h b/sys/netinet/in_kdtrace.h
index 07b3e3a..c0511d0 100644
--- a/sys/netinet/in_kdtrace.h
+++ b/sys/netinet/in_kdtrace.h
@@ -32,6 +32,8 @@
SDT_PROBE6(ip, , , probe, arg0, arg1, arg2, arg3, arg4, arg5)
#define UDP_PROBE(probe, arg0, arg1, arg2, arg3, arg4) \
SDT_PROBE5(udp, , , probe, arg0, arg1, arg2, arg3, arg4)
+#define TCP_PROBE1(probe, arg0) \
+ SDT_PROBE1(tcp, , , probe, arg0)
#define TCP_PROBE5(probe, arg0, arg1, arg2, arg3, arg4) \
SDT_PROBE5(tcp, , , probe, arg0, arg1, arg2, arg3, arg4)
#define TCP_PROBE6(probe, arg0, arg1, arg2, arg3, arg4, arg5) \
@@ -51,6 +53,7 @@ SDT_PROBE_DECLARE(tcp, , , connect__refused);
SDT_PROBE_DECLARE(tcp, , , connect__request);
SDT_PROBE_DECLARE(tcp, , , receive);
SDT_PROBE_DECLARE(tcp, , , send);
+SDT_PROBE_DECLARE(tcp, , , siftr);
SDT_PROBE_DECLARE(tcp, , , state__change);
SDT_PROBE_DECLARE(udp, , , receive);
diff --git a/sys/netinet/in_var.h b/sys/netinet/in_var.h
index f7737ec..0318fb2 100644
--- a/sys/netinet/in_var.h
+++ b/sys/netinet/in_var.h
@@ -176,15 +176,6 @@ do { \
} while (0)
/*
- * IP datagram reassembly.
- */
-#define IPREASS_NHASH_LOG2 6
-#define IPREASS_NHASH (1 << IPREASS_NHASH_LOG2)
-#define IPREASS_HMASK (IPREASS_NHASH - 1)
-#define IPREASS_HASH(x,y) \
- (((((x) & 0xF) | ((((x) >> 8) & 0xF) << 4)) ^ (y)) & IPREASS_HMASK)
-
-/*
* Legacy IPv4 IGMP per-link structure.
*/
struct router_info {
diff --git a/sys/netinet/ip_carp.c b/sys/netinet/ip_carp.c
index 20962b0..2fa8820 100644
--- a/sys/netinet/ip_carp.c
+++ b/sys/netinet/ip_carp.c
@@ -180,9 +180,6 @@ static int proto_reg[] = {-1, -1};
*
* Known issues with locking:
*
- * - There is no protection for races between two ioctl() requests,
- * neither SIOCSVH, nor SIOCAIFADDR & SIOCAIFADDR_IN6. I think that all
- * interface ioctl()s should be serialized right in net/if.c.
* - Sending ad, we put the pointer to the softc in an mtag, and no reference
* counting is done on the softc.
* - On module unload we may race (?) with packet processing thread
@@ -259,7 +256,7 @@ SYSCTL_VNET_PCPUSTAT(_net_inet_carp, OID_AUTO, stats, struct carpstats,
#define CIF_LOCK(cif) mtx_lock(&(cif)->cif_mtx)
#define CIF_UNLOCK(cif) mtx_unlock(&(cif)->cif_mtx)
#define CIF_FREE(cif) do { \
- CIF_LOCK_ASSERT(cif); \
+ CIF_LOCK(cif); \
if (TAILQ_EMPTY(&(cif)->cif_vrs)) \
carp_free_if(cif); \
else \
@@ -299,7 +296,6 @@ SYSCTL_VNET_PCPUSTAT(_net_inet_carp, OID_AUTO, stats, struct carpstats,
static void carp_input_c(struct mbuf *, struct carp_header *, sa_family_t);
static struct carp_softc
*carp_alloc(struct ifnet *);
-static void carp_detach_locked(struct ifaddr *);
static void carp_destroy(struct carp_softc *);
static struct carp_if
*carp_alloc_if(struct ifnet *);
@@ -321,6 +317,7 @@ static void carp_demote_adj(int, char *);
static LIST_HEAD(, carp_softc) carp_list;
static struct mtx carp_mtx;
+static struct sx carp_sx;
static struct task carp_sendall_task =
TASK_INITIALIZER(0, carp_send_ad_all, NULL);
@@ -1252,8 +1249,6 @@ carp_multicast_setup(struct carp_if *cif, sa_family_t sa)
struct ifnet *ifp = cif->cif_ifp;
int error = 0;
- CIF_LOCK_ASSERT(cif);
-
switch (sa) {
#ifdef INET
case AF_INET:
@@ -1266,9 +1261,7 @@ carp_multicast_setup(struct carp_if *cif, sa_family_t sa)
imo->imo_membership = (struct in_multi **)malloc(
(sizeof(struct in_multi *) * IP_MIN_MEMBERSHIPS), M_CARP,
- M_NOWAIT);
- if (imo->imo_membership == NULL)
- return (ENOMEM);
+ M_WAITOK);
imo->imo_mfilters = NULL;
imo->imo_max_memberships = IP_MIN_MEMBERSHIPS;
imo->imo_multicast_vif = -1;
@@ -1298,9 +1291,7 @@ carp_multicast_setup(struct carp_if *cif, sa_family_t sa)
im6o->im6o_membership = (struct in6_multi **)malloc(
(sizeof(struct in6_multi *) * IPV6_MIN_MEMBERSHIPS), M_CARP,
- M_ZERO | M_NOWAIT);
- if (im6o->im6o_membership == NULL)
- return (ENOMEM);
+ M_ZERO | M_WAITOK);
im6o->im6o_mfilters = NULL;
im6o->im6o_max_memberships = IPV6_MIN_MEMBERSHIPS;
im6o->im6o_multicast_hlim = CARP_DFLTTL;
@@ -1357,7 +1348,8 @@ static void
carp_multicast_cleanup(struct carp_if *cif, sa_family_t sa)
{
- CIF_LOCK_ASSERT(cif);
+ sx_assert(&carp_sx, SA_XLOCKED);
+
switch (sa) {
#ifdef INET
case AF_INET:
@@ -1506,22 +1498,18 @@ carp_alloc(struct ifnet *ifp)
return (sc);
}
-static int
+static void
carp_grow_ifas(struct carp_softc *sc)
{
struct ifaddr **new;
- CARP_LOCK_ASSERT(sc);
-
- new = malloc(sc->sc_ifasiz * 2, M_CARP, M_NOWAIT|M_ZERO);
- if (new == NULL)
- return (ENOMEM);
+ new = malloc(sc->sc_ifasiz * 2, M_CARP, M_WAITOK | M_ZERO);
+ CARP_LOCK(sc);
bcopy(sc->sc_ifas, new, sc->sc_ifasiz);
free(sc->sc_ifas, M_CARP);
sc->sc_ifas = new;
sc->sc_ifasiz *= 2;
-
- return (0);
+ CARP_UNLOCK(sc);
}
static void
@@ -1530,17 +1518,20 @@ carp_destroy(struct carp_softc *sc)
struct ifnet *ifp = sc->sc_carpdev;
struct carp_if *cif = ifp->if_carp;
- CIF_LOCK_ASSERT(cif);
+ sx_assert(&carp_sx, SA_XLOCKED);
+
+ if (sc->sc_suppress)
+ carp_demote_adj(-V_carp_ifdown_adj, "vhid removed");
+ CARP_UNLOCK(sc);
+ CIF_LOCK(cif);
TAILQ_REMOVE(&cif->cif_vrs, sc, sc_list);
+ CIF_UNLOCK(cif);
mtx_lock(&carp_mtx);
LIST_REMOVE(sc, sc_next);
mtx_unlock(&carp_mtx);
- CARP_LOCK(sc);
- if (sc->sc_suppress)
- carp_demote_adj(-V_carp_ifdown_adj, "vhid removed");
callout_drain(&sc->sc_ad_tmo);
#ifdef INET
callout_drain(&sc->sc_md_tmo);
@@ -1650,6 +1641,7 @@ carp_ioctl(struct ifreq *ifr, u_long cmd, struct thread *td)
goto out;
}
+ sx_xlock(&carp_sx);
switch (cmd) {
case SIOCSVH:
if ((error = priv_check(td, PRIV_NETINET_CARP)))
@@ -1780,6 +1772,7 @@ carp_ioctl(struct ifreq *ifr, u_long cmd, struct thread *td)
default:
error = EINVAL;
}
+ sx_xunlock(&carp_sx);
out:
if (locked)
@@ -1807,8 +1800,7 @@ carp_attach(struct ifaddr *ifa, int vhid)
struct carp_softc *sc;
int index, error;
- if (ifp->if_carp == NULL)
- return (ENOPROTOOPT);
+ KASSERT(ifa->ifa_carp == NULL, ("%s: ifa %p attached", __func__, ifa));
switch (ifa->ifa_addr->sa_family) {
#ifdef INET
@@ -1822,40 +1814,32 @@ carp_attach(struct ifaddr *ifa, int vhid)
return (EPROTOTYPE);
}
+ sx_xlock(&carp_sx);
+ if (ifp->if_carp == NULL) {
+ sx_xunlock(&carp_sx);
+ return (ENOPROTOOPT);
+ }
+
CIF_LOCK(cif);
IFNET_FOREACH_CARP(ifp, sc)
if (sc->sc_vhid == vhid)
break;
+ CIF_UNLOCK(cif);
if (sc == NULL) {
- CIF_UNLOCK(cif);
+ sx_xunlock(&carp_sx);
return (ENOENT);
}
- if (ifa->ifa_carp) {
- if (ifa->ifa_carp->sc_vhid != vhid)
- carp_detach_locked(ifa);
- else {
- CIF_UNLOCK(cif);
- return (0);
- }
- }
-
error = carp_multicast_setup(cif, ifa->ifa_addr->sa_family);
if (error) {
CIF_FREE(cif);
+ sx_xunlock(&carp_sx);
return (error);
}
- CARP_LOCK(sc);
index = sc->sc_naddrs + sc->sc_naddrs6 + 1;
if (index > sc->sc_ifasiz / sizeof(struct ifaddr *))
- if ((error = carp_grow_ifas(sc)) != 0) {
- carp_multicast_cleanup(cif,
- ifa->ifa_addr->sa_family);
- CARP_UNLOCK(sc);
- CIF_FREE(cif);
- return (error);
- }
+ carp_grow_ifas(sc);
switch (ifa->ifa_addr->sa_family) {
#ifdef INET
@@ -1873,14 +1857,15 @@ carp_attach(struct ifaddr *ifa, int vhid)
}
ifa_ref(ifa);
+
+ CARP_LOCK(sc);
sc->sc_ifas[index - 1] = ifa;
ifa->ifa_carp = sc;
-
carp_hmac_prepare(sc);
carp_sc_state(sc);
-
CARP_UNLOCK(sc);
- CIF_UNLOCK(cif);
+
+ sx_xunlock(&carp_sx);
return (0);
}
@@ -1890,25 +1875,14 @@ carp_detach(struct ifaddr *ifa)
{
struct ifnet *ifp = ifa->ifa_ifp;
struct carp_if *cif = ifp->if_carp;
-
- CIF_LOCK(cif);
- carp_detach_locked(ifa);
- CIF_FREE(cif);
-}
-
-static void
-carp_detach_locked(struct ifaddr *ifa)
-{
- struct ifnet *ifp = ifa->ifa_ifp;
- struct carp_if *cif = ifp->if_carp;
struct carp_softc *sc = ifa->ifa_carp;
int i, index;
KASSERT(sc != NULL, ("%s: %p not attached", __func__, ifa));
- CIF_LOCK_ASSERT(cif);
- CARP_LOCK(sc);
+ sx_xlock(&carp_sx);
+ CARP_LOCK(sc);
/* Shift array. */
index = sc->sc_naddrs + sc->sc_naddrs6;
for (i = 0; i < index; i++)
@@ -1943,11 +1917,14 @@ carp_detach_locked(struct ifaddr *ifa)
carp_hmac_prepare(sc);
carp_sc_state(sc);
- if (sc->sc_naddrs == 0 && sc->sc_naddrs6 == 0) {
- CARP_UNLOCK(sc);
+ if (sc->sc_naddrs == 0 && sc->sc_naddrs6 == 0)
carp_destroy(sc);
- } else
+ else
CARP_UNLOCK(sc);
+
+ CIF_FREE(cif);
+
+ sx_xunlock(&carp_sx);
}
static void
@@ -2099,6 +2076,7 @@ carp_mod_cleanup(void)
mtx_unlock(&carp_mtx);
taskqueue_drain(taskqueue_swi, &carp_sendall_task);
mtx_destroy(&carp_mtx);
+ sx_destroy(&carp_sx);
}
static int
@@ -2107,6 +2085,7 @@ carp_mod_load(void)
int err;
mtx_init(&carp_mtx, "carp_mtx", NULL, MTX_DEF);
+ sx_init(&carp_sx, "carp_sx");
LIST_INIT(&carp_list);
carp_get_vhid_p = carp_get_vhid;
carp_forus_p = carp_forus;
diff --git a/sys/netinet/ip_fw.h b/sys/netinet/ip_fw.h
index 9c53793..d1764bb 100644
--- a/sys/netinet/ip_fw.h
+++ b/sys/netinet/ip_fw.h
@@ -40,10 +40,12 @@
#define IPFW_MAX_SETS 32 /* Number of sets supported by ipfw*/
/*
- * Default number of ipfw tables.
+ * Compat values for old clients
*/
+#ifndef _KERNEL
#define IPFW_TABLES_MAX 65535
#define IPFW_TABLES_DEFAULT 128
+#endif
/*
* Most commands (queue, pipe, tag, untag, limit...) can have a 16-bit
@@ -963,7 +965,6 @@ typedef struct _ipfw_ta_info {
uint64_t spare1;
} ipfw_ta_info;
-#define IPFW_OBJTYPE_TABLE 1
typedef struct _ipfw_obj_header {
ip_fw3_opheader opheader; /* IP_FW3 opcode */
uint32_t spare;
diff --git a/sys/netinet/ip_input.c b/sys/netinet/ip_input.c
index a3dd57f..f4b6dfc 100644
--- a/sys/netinet/ip_input.c
+++ b/sys/netinet/ip_input.c
@@ -89,6 +89,14 @@ __FBSDID("$FreeBSD$");
CTASSERT(sizeof(struct ip) == 20);
#endif
+/* IP reassembly functions are defined in ip_reass.c. */
+extern void ipreass_init(void);
+extern void ipreass_drain(void);
+extern void ipreass_slowtimo(void);
+#ifdef VIMAGE
+extern void ipreass_destroy(void);
+#endif
+
struct rwlock in_ifaddr_lock;
RW_SYSINIT(in_ifaddr_lock, &in_ifaddr_lock, "in_ifaddr_lock");
@@ -164,36 +172,6 @@ VNET_DEFINE(struct in_ifaddrhead, in_ifaddrhead); /* first inet address */
VNET_DEFINE(struct in_ifaddrhashhead *, in_ifaddrhashtbl); /* inet addr hash table */
VNET_DEFINE(u_long, in_ifaddrhmask); /* mask for hash table */
-static VNET_DEFINE(uma_zone_t, ipq_zone);
-static VNET_DEFINE(TAILQ_HEAD(ipqhead, ipq), ipq[IPREASS_NHASH]);
-static struct mtx ipqlock;
-
-#define V_ipq_zone VNET(ipq_zone)
-#define V_ipq VNET(ipq)
-
-#define IPQ_LOCK() mtx_lock(&ipqlock)
-#define IPQ_UNLOCK() mtx_unlock(&ipqlock)
-#define IPQ_LOCK_INIT() mtx_init(&ipqlock, "ipqlock", NULL, MTX_DEF)
-#define IPQ_LOCK_ASSERT() mtx_assert(&ipqlock, MA_OWNED)
-
-static void maxnipq_update(void);
-static void ipq_zone_change(void *);
-static void ip_drain_locked(void);
-
-static VNET_DEFINE(int, maxnipq); /* Administrative limit on # reass queues. */
-static VNET_DEFINE(int, nipq); /* Total # of reass queues */
-#define V_maxnipq VNET(maxnipq)
-#define V_nipq VNET(nipq)
-SYSCTL_INT(_net_inet_ip, OID_AUTO, fragpackets, CTLFLAG_VNET | CTLFLAG_RD,
- &VNET_NAME(nipq), 0,
- "Current number of IPv4 fragment reassembly queue entries");
-
-static VNET_DEFINE(int, maxfragsperpacket);
-#define V_maxfragsperpacket VNET(maxfragsperpacket)
-SYSCTL_INT(_net_inet_ip, OID_AUTO, maxfragsperpacket, CTLFLAG_VNET | CTLFLAG_RW,
- &VNET_NAME(maxfragsperpacket), 0,
- "Maximum number of IPv4 fragments allowed per packet");
-
#ifdef IPCTL_DEFMTU
SYSCTL_INT(_net_inet_ip, IPCTL_DEFMTU, mtu, CTLFLAG_RW,
&ip_mtu, 0, "Default MTU");
@@ -206,8 +184,6 @@ SYSCTL_INT(_net_inet_ip, OID_AUTO, stealth, CTLFLAG_VNET | CTLFLAG_RW,
"IP stealth mode, no TTL decrementation on forwarding");
#endif
-static void ip_freef(struct ipqhead *, struct ipq *);
-
/*
* IP statistics are stored in the "array" of counter(9)s.
*/
@@ -330,13 +306,7 @@ ip_init(void)
V_in_ifaddrhashtbl = hashinit(INADDR_NHASH, M_IFADDR, &V_in_ifaddrhmask);
/* Initialize IP reassembly queue. */
- for (i = 0; i < IPREASS_NHASH; i++)
- TAILQ_INIT(&V_ipq[i]);
- V_maxnipq = nmbclusters / 32;
- V_maxfragsperpacket = 16;
- V_ipq_zone = uma_zcreate("ipq", sizeof(struct ipq), NULL, NULL, NULL,
- NULL, UMA_ALIGN_PTR, 0);
- maxnipq_update();
+ ipreass_init();
/* Initialize packet filter hooks. */
V_inet_pfil_hook.ph_type = PFIL_TYPE_AF;
@@ -369,11 +339,6 @@ ip_init(void)
ip_protox[pr->pr_protocol] = pr - inetsw;
}
- EVENTHANDLER_REGISTER(nmbclusters_change, ipq_zone_change,
- NULL, EVENTHANDLER_PRI_ANY);
-
- /* Initialize various other remaining things. */
- IPQ_LOCK_INIT();
netisr_register(&ip_nh);
#ifdef RSS
netisr_register(&ip_direct_nh);
@@ -393,11 +358,8 @@ ip_destroy(void)
/* Cleanup in_ifaddr hash table; should be empty. */
hashdestroy(V_in_ifaddrhashtbl, M_IFADDR, V_in_ifaddrhmask);
- IPQ_LOCK();
- ip_drain_locked();
- IPQ_UNLOCK();
-
- uma_zdestroy(V_ipq_zone);
+ /* Destroy IP reassembly queue. */
+ ipreass_destroy();
}
#endif
@@ -791,451 +753,6 @@ bad:
}
/*
- * After maxnipq has been updated, propagate the change to UMA. The UMA zone
- * max has slightly different semantics than the sysctl, for historical
- * reasons.
- */
-static void
-maxnipq_update(void)
-{
-
- /*
- * -1 for unlimited allocation.
- */
- if (V_maxnipq < 0)
- uma_zone_set_max(V_ipq_zone, 0);
- /*
- * Positive number for specific bound.
- */
- if (V_maxnipq > 0)
- uma_zone_set_max(V_ipq_zone, V_maxnipq);
- /*
- * Zero specifies no further fragment queue allocation -- set the
- * bound very low, but rely on implementation elsewhere to actually
- * prevent allocation and reclaim current queues.
- */
- if (V_maxnipq == 0)
- uma_zone_set_max(V_ipq_zone, 1);
-}
-
-static void
-ipq_zone_change(void *tag)
-{
-
- if (V_maxnipq > 0 && V_maxnipq < (nmbclusters / 32)) {
- V_maxnipq = nmbclusters / 32;
- maxnipq_update();
- }
-}
-
-static int
-sysctl_maxnipq(SYSCTL_HANDLER_ARGS)
-{
- int error, i;
-
- i = V_maxnipq;
- error = sysctl_handle_int(oidp, &i, 0, req);
- if (error || !req->newptr)
- return (error);
-
- /*
- * XXXRW: Might be a good idea to sanity check the argument and place
- * an extreme upper bound.
- */
- if (i < -1)
- return (EINVAL);
- V_maxnipq = i;
- maxnipq_update();
- return (0);
-}
-
-SYSCTL_PROC(_net_inet_ip, OID_AUTO, maxfragpackets, CTLTYPE_INT|CTLFLAG_RW,
- NULL, 0, sysctl_maxnipq, "I",
- "Maximum number of IPv4 fragment reassembly queue entries");
-
-#define M_IP_FRAG M_PROTO9
-
-/*
- * Take incoming datagram fragment and try to reassemble it into
- * whole datagram. If the argument is the first fragment or one
- * in between the function will return NULL and store the mbuf
- * in the fragment chain. If the argument is the last fragment
- * the packet will be reassembled and the pointer to the new
- * mbuf returned for further processing. Only m_tags attached
- * to the first packet/fragment are preserved.
- * The IP header is *NOT* adjusted out of iplen.
- */
-struct mbuf *
-ip_reass(struct mbuf *m)
-{
- struct ip *ip;
- struct mbuf *p, *q, *nq, *t;
- struct ipq *fp = NULL;
- struct ipqhead *head;
- int i, hlen, next;
- u_int8_t ecn, ecn0;
- u_short hash;
-#ifdef RSS
- uint32_t rss_hash, rss_type;
-#endif
-
- /* If maxnipq or maxfragsperpacket are 0, never accept fragments. */
- if (V_maxnipq == 0 || V_maxfragsperpacket == 0) {
- IPSTAT_INC(ips_fragments);
- IPSTAT_INC(ips_fragdropped);
- m_freem(m);
- return (NULL);
- }
-
- ip = mtod(m, struct ip *);
- hlen = ip->ip_hl << 2;
-
- hash = IPREASS_HASH(ip->ip_src.s_addr, ip->ip_id);
- head = &V_ipq[hash];
- IPQ_LOCK();
-
- /*
- * Look for queue of fragments
- * of this datagram.
- */
- TAILQ_FOREACH(fp, head, ipq_list)
- if (ip->ip_id == fp->ipq_id &&
- ip->ip_src.s_addr == fp->ipq_src.s_addr &&
- ip->ip_dst.s_addr == fp->ipq_dst.s_addr &&
-#ifdef MAC
- mac_ipq_match(m, fp) &&
-#endif
- ip->ip_p == fp->ipq_p)
- goto found;
-
- fp = NULL;
-
- /*
- * Attempt to trim the number of allocated fragment queues if it
- * exceeds the administrative limit.
- */
- if ((V_nipq > V_maxnipq) && (V_maxnipq > 0)) {
- /*
- * drop something from the tail of the current queue
- * before proceeding further
- */
- struct ipq *q = TAILQ_LAST(head, ipqhead);
- if (q == NULL) { /* gak */
- for (i = 0; i < IPREASS_NHASH; i++) {
- struct ipq *r = TAILQ_LAST(&V_ipq[i], ipqhead);
- if (r) {
- IPSTAT_ADD(ips_fragtimeout,
- r->ipq_nfrags);
- ip_freef(&V_ipq[i], r);
- break;
- }
- }
- } else {
- IPSTAT_ADD(ips_fragtimeout, q->ipq_nfrags);
- ip_freef(head, q);
- }
- }
-
-found:
- /*
- * Adjust ip_len to not reflect header,
- * convert offset of this to bytes.
- */
- ip->ip_len = htons(ntohs(ip->ip_len) - hlen);
- if (ip->ip_off & htons(IP_MF)) {
- /*
- * Make sure that fragments have a data length
- * that's a non-zero multiple of 8 bytes.
- */
- if (ip->ip_len == htons(0) || (ntohs(ip->ip_len) & 0x7) != 0) {
- IPSTAT_INC(ips_toosmall); /* XXX */
- goto dropfrag;
- }
- m->m_flags |= M_IP_FRAG;
- } else
- m->m_flags &= ~M_IP_FRAG;
- ip->ip_off = htons(ntohs(ip->ip_off) << 3);
-
- /*
- * Attempt reassembly; if it succeeds, proceed.
- * ip_reass() will return a different mbuf.
- */
- IPSTAT_INC(ips_fragments);
- m->m_pkthdr.PH_loc.ptr = ip;
-
- /* Previous ip_reass() started here. */
- /*
- * Presence of header sizes in mbufs
- * would confuse code below.
- */
- m->m_data += hlen;
- m->m_len -= hlen;
-
- /*
- * If first fragment to arrive, create a reassembly queue.
- */
- if (fp == NULL) {
- fp = uma_zalloc(V_ipq_zone, M_NOWAIT);
- if (fp == NULL)
- goto dropfrag;
-#ifdef MAC
- if (mac_ipq_init(fp, M_NOWAIT) != 0) {
- uma_zfree(V_ipq_zone, fp);
- fp = NULL;
- goto dropfrag;
- }
- mac_ipq_create(m, fp);
-#endif
- TAILQ_INSERT_HEAD(head, fp, ipq_list);
- V_nipq++;
- fp->ipq_nfrags = 1;
- fp->ipq_ttl = IPFRAGTTL;
- fp->ipq_p = ip->ip_p;
- fp->ipq_id = ip->ip_id;
- fp->ipq_src = ip->ip_src;
- fp->ipq_dst = ip->ip_dst;
- fp->ipq_frags = m;
- m->m_nextpkt = NULL;
- goto done;
- } else {
- fp->ipq_nfrags++;
-#ifdef MAC
- mac_ipq_update(m, fp);
-#endif
- }
-
-#define GETIP(m) ((struct ip*)((m)->m_pkthdr.PH_loc.ptr))
-
- /*
- * Handle ECN by comparing this segment with the first one;
- * if CE is set, do not lose CE.
- * drop if CE and not-ECT are mixed for the same packet.
- */
- ecn = ip->ip_tos & IPTOS_ECN_MASK;
- ecn0 = GETIP(fp->ipq_frags)->ip_tos & IPTOS_ECN_MASK;
- if (ecn == IPTOS_ECN_CE) {
- if (ecn0 == IPTOS_ECN_NOTECT)
- goto dropfrag;
- if (ecn0 != IPTOS_ECN_CE)
- GETIP(fp->ipq_frags)->ip_tos |= IPTOS_ECN_CE;
- }
- if (ecn == IPTOS_ECN_NOTECT && ecn0 != IPTOS_ECN_NOTECT)
- goto dropfrag;
-
- /*
- * Find a segment which begins after this one does.
- */
- for (p = NULL, q = fp->ipq_frags; q; p = q, q = q->m_nextpkt)
- if (ntohs(GETIP(q)->ip_off) > ntohs(ip->ip_off))
- break;
-
- /*
- * If there is a preceding segment, it may provide some of
- * our data already. If so, drop the data from the incoming
- * segment. If it provides all of our data, drop us, otherwise
- * stick new segment in the proper place.
- *
- * If some of the data is dropped from the preceding
- * segment, then it's checksum is invalidated.
- */
- if (p) {
- i = ntohs(GETIP(p)->ip_off) + ntohs(GETIP(p)->ip_len) -
- ntohs(ip->ip_off);
- if (i > 0) {
- if (i >= ntohs(ip->ip_len))
- goto dropfrag;
- m_adj(m, i);
- m->m_pkthdr.csum_flags = 0;
- ip->ip_off = htons(ntohs(ip->ip_off) + i);
- ip->ip_len = htons(ntohs(ip->ip_len) - i);
- }
- m->m_nextpkt = p->m_nextpkt;
- p->m_nextpkt = m;
- } else {
- m->m_nextpkt = fp->ipq_frags;
- fp->ipq_frags = m;
- }
-
- /*
- * While we overlap succeeding segments trim them or,
- * if they are completely covered, dequeue them.
- */
- for (; q != NULL && ntohs(ip->ip_off) + ntohs(ip->ip_len) >
- ntohs(GETIP(q)->ip_off); q = nq) {
- i = (ntohs(ip->ip_off) + ntohs(ip->ip_len)) -
- ntohs(GETIP(q)->ip_off);
- if (i < ntohs(GETIP(q)->ip_len)) {
- GETIP(q)->ip_len = htons(ntohs(GETIP(q)->ip_len) - i);
- GETIP(q)->ip_off = htons(ntohs(GETIP(q)->ip_off) + i);
- m_adj(q, i);
- q->m_pkthdr.csum_flags = 0;
- break;
- }
- nq = q->m_nextpkt;
- m->m_nextpkt = nq;
- IPSTAT_INC(ips_fragdropped);
- fp->ipq_nfrags--;
- m_freem(q);
- }
-
- /*
- * Check for complete reassembly and perform frag per packet
- * limiting.
- *
- * Frag limiting is performed here so that the nth frag has
- * a chance to complete the packet before we drop the packet.
- * As a result, n+1 frags are actually allowed per packet, but
- * only n will ever be stored. (n = maxfragsperpacket.)
- *
- */
- next = 0;
- for (p = NULL, q = fp->ipq_frags; q; p = q, q = q->m_nextpkt) {
- if (ntohs(GETIP(q)->ip_off) != next) {
- if (fp->ipq_nfrags > V_maxfragsperpacket) {
- IPSTAT_ADD(ips_fragdropped, fp->ipq_nfrags);
- ip_freef(head, fp);
- }
- goto done;
- }
- next += ntohs(GETIP(q)->ip_len);
- }
- /* Make sure the last packet didn't have the IP_MF flag */
- if (p->m_flags & M_IP_FRAG) {
- if (fp->ipq_nfrags > V_maxfragsperpacket) {
- IPSTAT_ADD(ips_fragdropped, fp->ipq_nfrags);
- ip_freef(head, fp);
- }
- goto done;
- }
-
- /*
- * Reassembly is complete. Make sure the packet is a sane size.
- */
- q = fp->ipq_frags;
- ip = GETIP(q);
- if (next + (ip->ip_hl << 2) > IP_MAXPACKET) {
- IPSTAT_INC(ips_toolong);
- IPSTAT_ADD(ips_fragdropped, fp->ipq_nfrags);
- ip_freef(head, fp);
- goto done;
- }
-
- /*
- * Concatenate fragments.
- */
- m = q;
- t = m->m_next;
- m->m_next = NULL;
- m_cat(m, t);
- nq = q->m_nextpkt;
- q->m_nextpkt = NULL;
- for (q = nq; q != NULL; q = nq) {
- nq = q->m_nextpkt;
- q->m_nextpkt = NULL;
- m->m_pkthdr.csum_flags &= q->m_pkthdr.csum_flags;
- m->m_pkthdr.csum_data += q->m_pkthdr.csum_data;
- m_cat(m, q);
- }
- /*
- * In order to do checksumming faster we do 'end-around carry' here
- * (and not in for{} loop), though it implies we are not going to
- * reassemble more than 64k fragments.
- */
- while (m->m_pkthdr.csum_data & 0xffff0000)
- m->m_pkthdr.csum_data = (m->m_pkthdr.csum_data & 0xffff) +
- (m->m_pkthdr.csum_data >> 16);
-#ifdef MAC
- mac_ipq_reassemble(fp, m);
- mac_ipq_destroy(fp);
-#endif
-
- /*
- * Create header for new ip packet by modifying header of first
- * packet; dequeue and discard fragment reassembly header.
- * Make header visible.
- */
- ip->ip_len = htons((ip->ip_hl << 2) + next);
- ip->ip_src = fp->ipq_src;
- ip->ip_dst = fp->ipq_dst;
- TAILQ_REMOVE(head, fp, ipq_list);
- V_nipq--;
- uma_zfree(V_ipq_zone, fp);
- m->m_len += (ip->ip_hl << 2);
- m->m_data -= (ip->ip_hl << 2);
- /* some debugging cruft by sklower, below, will go away soon */
- if (m->m_flags & M_PKTHDR) /* XXX this should be done elsewhere */
- m_fixhdr(m);
- IPSTAT_INC(ips_reassembled);
- IPQ_UNLOCK();
-
-#ifdef RSS
- /*
- * Query the RSS layer for the flowid / flowtype for the
- * mbuf payload.
- *
- * For now, just assume we have to calculate a new one.
- * Later on we should check to see if the assigned flowid matches
- * what RSS wants for the given IP protocol and if so, just keep it.
- *
- * We then queue into the relevant netisr so it can be dispatched
- * to the correct CPU.
- *
- * Note - this may return 1, which means the flowid in the mbuf
- * is correct for the configured RSS hash types and can be used.
- */
- if (rss_mbuf_software_hash_v4(m, 0, &rss_hash, &rss_type) == 0) {
- m->m_pkthdr.flowid = rss_hash;
- M_HASHTYPE_SET(m, rss_type);
- }
-
- /*
- * Queue/dispatch for reprocessing.
- *
- * Note: this is much slower than just handling the frame in the
- * current receive context. It's likely worth investigating
- * why this is.
- */
- netisr_dispatch(NETISR_IP_DIRECT, m);
- return (NULL);
-#endif
-
- /* Handle in-line */
- return (m);
-
-dropfrag:
- IPSTAT_INC(ips_fragdropped);
- if (fp != NULL)
- fp->ipq_nfrags--;
- m_freem(m);
-done:
- IPQ_UNLOCK();
- return (NULL);
-
-#undef GETIP
-}
-
-/*
- * Free a fragment reassembly header and all
- * associated datagrams.
- */
-static void
-ip_freef(struct ipqhead *fhp, struct ipq *fp)
-{
- struct mbuf *q;
-
- IPQ_LOCK_ASSERT();
-
- while (fp->ipq_frags) {
- q = fp->ipq_frags;
- fp->ipq_frags = q->m_nextpkt;
- m_freem(q);
- }
- TAILQ_REMOVE(fhp, fp, ipq_list);
- uma_zfree(V_ipq_zone, fp);
- V_nipq--;
-}
-
-/*
* IP timer processing;
* if a timer expires on a reassembly
* queue, discard it.
@@ -1244,80 +761,27 @@ void
ip_slowtimo(void)
{
VNET_ITERATOR_DECL(vnet_iter);
- struct ipq *fp;
- int i;
VNET_LIST_RLOCK_NOSLEEP();
- IPQ_LOCK();
VNET_FOREACH(vnet_iter) {
CURVNET_SET(vnet_iter);
- for (i = 0; i < IPREASS_NHASH; i++) {
- for(fp = TAILQ_FIRST(&V_ipq[i]); fp;) {
- struct ipq *fpp;
-
- fpp = fp;
- fp = TAILQ_NEXT(fp, ipq_list);
- if(--fpp->ipq_ttl == 0) {
- IPSTAT_ADD(ips_fragtimeout,
- fpp->ipq_nfrags);
- ip_freef(&V_ipq[i], fpp);
- }
- }
- }
- /*
- * If we are over the maximum number of fragments
- * (due to the limit being lowered), drain off
- * enough to get down to the new limit.
- */
- if (V_maxnipq >= 0 && V_nipq > V_maxnipq) {
- for (i = 0; i < IPREASS_NHASH; i++) {
- while (V_nipq > V_maxnipq &&
- !TAILQ_EMPTY(&V_ipq[i])) {
- IPSTAT_ADD(ips_fragdropped,
- TAILQ_FIRST(&V_ipq[i])->ipq_nfrags);
- ip_freef(&V_ipq[i],
- TAILQ_FIRST(&V_ipq[i]));
- }
- }
- }
+ ipreass_slowtimo();
CURVNET_RESTORE();
}
- IPQ_UNLOCK();
VNET_LIST_RUNLOCK_NOSLEEP();
}
-/*
- * Drain off all datagram fragments.
- */
-static void
-ip_drain_locked(void)
-{
- int i;
-
- IPQ_LOCK_ASSERT();
-
- for (i = 0; i < IPREASS_NHASH; i++) {
- while(!TAILQ_EMPTY(&V_ipq[i])) {
- IPSTAT_ADD(ips_fragdropped,
- TAILQ_FIRST(&V_ipq[i])->ipq_nfrags);
- ip_freef(&V_ipq[i], TAILQ_FIRST(&V_ipq[i]));
- }
- }
-}
-
void
ip_drain(void)
{
VNET_ITERATOR_DECL(vnet_iter);
VNET_LIST_RLOCK_NOSLEEP();
- IPQ_LOCK();
VNET_FOREACH(vnet_iter) {
CURVNET_SET(vnet_iter);
- ip_drain_locked();
+ ipreass_drain();
CURVNET_RESTORE();
}
- IPQ_UNLOCK();
VNET_LIST_RUNLOCK_NOSLEEP();
}
diff --git a/sys/netinet/ip_ipsec.c b/sys/netinet/ip_ipsec.c
index 1a643fb..47f683d 100644
--- a/sys/netinet/ip_ipsec.c
+++ b/sys/netinet/ip_ipsec.c
@@ -199,6 +199,9 @@ ip_ipsec_output(struct mbuf **m, struct inpcb *inp, int *error)
/* NB: callee frees mbuf */
*error = ipsec4_process_packet(*m, sp->req);
+ /* Release SP if an error occured */
+ if (*error != 0)
+ KEY_FREESP(&sp);
if (*error == EJUSTRETURN) {
/*
* We had a SP with a level of 'use' and no SA. We
@@ -234,13 +237,9 @@ ip_ipsec_output(struct mbuf **m, struct inpcb *inp, int *error)
/* No IPsec processing for this packet. */
}
done:
- if (sp != NULL)
- KEY_FREESP(&sp);
- return 0;
+ return (0);
reinjected:
- if (sp != NULL)
- KEY_FREESP(&sp);
- return -1;
+ return (-1);
bad:
if (sp != NULL)
KEY_FREESP(&sp);
diff --git a/sys/netinet/ip_reass.c b/sys/netinet/ip_reass.c
new file mode 100644
index 0000000..dc1ac14
--- /dev/null
+++ b/sys/netinet/ip_reass.c
@@ -0,0 +1,658 @@
+/*-
+ * Copyright (c) 2015 Gleb Smirnoff <glebius@FreeBSD.org>
+ * Copyright (c) 2015 Adrian Chadd <adrian@FreeBSD.org>
+ * Copyright (c) 1982, 1986, 1988, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)ip_input.c 8.2 (Berkeley) 1/4/94
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "opt_rss.h"
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/eventhandler.h>
+#include <sys/hash.h>
+#include <sys/mbuf.h>
+#include <sys/malloc.h>
+#include <sys/lock.h>
+#include <sys/mutex.h>
+#include <sys/sysctl.h>
+
+#include <net/rss_config.h>
+#include <net/netisr.h>
+#include <net/vnet.h>
+
+#include <netinet/in.h>
+#include <netinet/ip.h>
+#include <netinet/ip_var.h>
+#include <netinet/in_rss.h>
+#ifdef MAC
+#include <security/mac/mac_framework.h>
+#endif
+
+SYSCTL_DECL(_net_inet_ip);
+
+/*
+ * Reassembly headers are stored in hash buckets.
+ */
+#define IPREASS_NHASH_LOG2 6
+#define IPREASS_NHASH (1 << IPREASS_NHASH_LOG2)
+#define IPREASS_HMASK (IPREASS_NHASH - 1)
+
+struct ipqbucket {
+ TAILQ_HEAD(ipqhead, ipq) head;
+ struct mtx lock;
+};
+
+static VNET_DEFINE(struct ipqbucket, ipq[IPREASS_NHASH]);
+#define V_ipq VNET(ipq)
+static VNET_DEFINE(uint32_t, ipq_hashseed);
+#define V_ipq_hashseed VNET(ipq_hashseed)
+
+#define IPQ_LOCK(i) mtx_lock(&V_ipq[i].lock)
+#define IPQ_TRYLOCK(i) mtx_trylock(&V_ipq[i].lock)
+#define IPQ_UNLOCK(i) mtx_unlock(&V_ipq[i].lock)
+#define IPQ_LOCK_ASSERT(i) mtx_assert(&V_ipq[i].lock, MA_OWNED)
+
+void ipreass_init(void);
+void ipreass_drain(void);
+void ipreass_slowtimo(void);
+#ifdef VIMAGE
+void ipreass_destroy(void);
+#endif
+static int sysctl_maxfragpackets(SYSCTL_HANDLER_ARGS);
+static void ipreass_zone_change(void *);
+static void ipreass_drain_tomax(void);
+static void ipq_free(struct ipqhead *, struct ipq *);
+static struct ipq * ipq_reuse(int);
+
+static inline void
+ipq_timeout(struct ipqhead *head, struct ipq *fp)
+{
+
+ IPSTAT_ADD(ips_fragtimeout, fp->ipq_nfrags);
+ ipq_free(head, fp);
+}
+
+static inline void
+ipq_drop(struct ipqhead *head, struct ipq *fp)
+{
+
+ IPSTAT_ADD(ips_fragdropped, fp->ipq_nfrags);
+ ipq_free(head, fp);
+}
+
+static VNET_DEFINE(uma_zone_t, ipq_zone);
+#define V_ipq_zone VNET(ipq_zone)
+SYSCTL_PROC(_net_inet_ip, OID_AUTO, maxfragpackets, CTLFLAG_VNET |
+ CTLTYPE_INT | CTLFLAG_RW, NULL, 0, sysctl_maxfragpackets, "I",
+ "Maximum number of IPv4 fragment reassembly queue entries");
+SYSCTL_UMA_CUR(_net_inet_ip, OID_AUTO, fragpackets, CTLFLAG_VNET,
+ &VNET_NAME(ipq_zone),
+ "Current number of IPv4 fragment reassembly queue entries");
+
+static VNET_DEFINE(int, noreass);
+#define V_noreass VNET(noreass)
+
+static VNET_DEFINE(int, maxfragsperpacket);
+#define V_maxfragsperpacket VNET(maxfragsperpacket)
+SYSCTL_INT(_net_inet_ip, OID_AUTO, maxfragsperpacket, CTLFLAG_VNET | CTLFLAG_RW,
+ &VNET_NAME(maxfragsperpacket), 0,
+ "Maximum number of IPv4 fragments allowed per packet");
+
+/*
+ * Take incoming datagram fragment and try to reassemble it into
+ * whole datagram. If the argument is the first fragment or one
+ * in between the function will return NULL and store the mbuf
+ * in the fragment chain. If the argument is the last fragment
+ * the packet will be reassembled and the pointer to the new
+ * mbuf returned for further processing. Only m_tags attached
+ * to the first packet/fragment are preserved.
+ * The IP header is *NOT* adjusted out of iplen.
+ */
+#define M_IP_FRAG M_PROTO9
+struct mbuf *
+ip_reass(struct mbuf *m)
+{
+ struct ip *ip;
+ struct mbuf *p, *q, *nq, *t;
+ struct ipq *fp;
+ struct ipqhead *head;
+ int i, hlen, next;
+ u_int8_t ecn, ecn0;
+ uint32_t hash;
+#ifdef RSS
+ uint32_t rss_hash, rss_type;
+#endif
+
+ /*
+ * If no reassembling or maxfragsperpacket are 0,
+ * never accept fragments.
+ */
+ if (V_noreass == 1 || V_maxfragsperpacket == 0) {
+ IPSTAT_INC(ips_fragments);
+ IPSTAT_INC(ips_fragdropped);
+ m_freem(m);
+ return (NULL);
+ }
+
+ ip = mtod(m, struct ip *);
+ hlen = ip->ip_hl << 2;
+
+ /*
+ * Adjust ip_len to not reflect header,
+ * convert offset of this to bytes.
+ */
+ ip->ip_len = htons(ntohs(ip->ip_len) - hlen);
+ if (ip->ip_off & htons(IP_MF)) {
+ /*
+ * Make sure that fragments have a data length
+ * that's a non-zero multiple of 8 bytes.
+ */
+ if (ip->ip_len == htons(0) || (ntohs(ip->ip_len) & 0x7) != 0) {
+ IPSTAT_INC(ips_toosmall); /* XXX */
+ IPSTAT_INC(ips_fragdropped);
+ m_freem(m);
+ return (NULL);
+ }
+ m->m_flags |= M_IP_FRAG;
+ } else
+ m->m_flags &= ~M_IP_FRAG;
+ ip->ip_off = htons(ntohs(ip->ip_off) << 3);
+
+ /*
+ * Attempt reassembly; if it succeeds, proceed.
+ * ip_reass() will return a different mbuf.
+ */
+ IPSTAT_INC(ips_fragments);
+ m->m_pkthdr.PH_loc.ptr = ip;
+
+ /*
+ * Presence of header sizes in mbufs
+ * would confuse code below.
+ */
+ m->m_data += hlen;
+ m->m_len -= hlen;
+
+ hash = ip->ip_src.s_addr ^ ip->ip_id;
+ hash = jenkins_hash32(&hash, 1, V_ipq_hashseed) & IPREASS_HMASK;
+ head = &V_ipq[hash].head;
+ IPQ_LOCK(hash);
+
+ /*
+ * Look for queue of fragments
+ * of this datagram.
+ */
+ TAILQ_FOREACH(fp, head, ipq_list)
+ if (ip->ip_id == fp->ipq_id &&
+ ip->ip_src.s_addr == fp->ipq_src.s_addr &&
+ ip->ip_dst.s_addr == fp->ipq_dst.s_addr &&
+#ifdef MAC
+ mac_ipq_match(m, fp) &&
+#endif
+ ip->ip_p == fp->ipq_p)
+ break;
+ /*
+ * If first fragment to arrive, create a reassembly queue.
+ */
+ if (fp == NULL) {
+ fp = uma_zalloc(V_ipq_zone, M_NOWAIT);
+ if (fp == NULL)
+ fp = ipq_reuse(hash);
+#ifdef MAC
+ if (mac_ipq_init(fp, M_NOWAIT) != 0) {
+ uma_zfree(V_ipq_zone, fp);
+ fp = NULL;
+ goto dropfrag;
+ }
+ mac_ipq_create(m, fp);
+#endif
+ TAILQ_INSERT_HEAD(head, fp, ipq_list);
+ fp->ipq_nfrags = 1;
+ fp->ipq_ttl = IPFRAGTTL;
+ fp->ipq_p = ip->ip_p;
+ fp->ipq_id = ip->ip_id;
+ fp->ipq_src = ip->ip_src;
+ fp->ipq_dst = ip->ip_dst;
+ fp->ipq_frags = m;
+ m->m_nextpkt = NULL;
+ goto done;
+ } else {
+ fp->ipq_nfrags++;
+#ifdef MAC
+ mac_ipq_update(m, fp);
+#endif
+ }
+
+#define GETIP(m) ((struct ip*)((m)->m_pkthdr.PH_loc.ptr))
+
+ /*
+ * Handle ECN by comparing this segment with the first one;
+ * if CE is set, do not lose CE.
+ * drop if CE and not-ECT are mixed for the same packet.
+ */
+ ecn = ip->ip_tos & IPTOS_ECN_MASK;
+ ecn0 = GETIP(fp->ipq_frags)->ip_tos & IPTOS_ECN_MASK;
+ if (ecn == IPTOS_ECN_CE) {
+ if (ecn0 == IPTOS_ECN_NOTECT)
+ goto dropfrag;
+ if (ecn0 != IPTOS_ECN_CE)
+ GETIP(fp->ipq_frags)->ip_tos |= IPTOS_ECN_CE;
+ }
+ if (ecn == IPTOS_ECN_NOTECT && ecn0 != IPTOS_ECN_NOTECT)
+ goto dropfrag;
+
+ /*
+ * Find a segment which begins after this one does.
+ */
+ for (p = NULL, q = fp->ipq_frags; q; p = q, q = q->m_nextpkt)
+ if (ntohs(GETIP(q)->ip_off) > ntohs(ip->ip_off))
+ break;
+
+ /*
+ * If there is a preceding segment, it may provide some of
+ * our data already. If so, drop the data from the incoming
+ * segment. If it provides all of our data, drop us, otherwise
+ * stick new segment in the proper place.
+ *
+ * If some of the data is dropped from the preceding
+ * segment, then it's checksum is invalidated.
+ */
+ if (p) {
+ i = ntohs(GETIP(p)->ip_off) + ntohs(GETIP(p)->ip_len) -
+ ntohs(ip->ip_off);
+ if (i > 0) {
+ if (i >= ntohs(ip->ip_len))
+ goto dropfrag;
+ m_adj(m, i);
+ m->m_pkthdr.csum_flags = 0;
+ ip->ip_off = htons(ntohs(ip->ip_off) + i);
+ ip->ip_len = htons(ntohs(ip->ip_len) - i);
+ }
+ m->m_nextpkt = p->m_nextpkt;
+ p->m_nextpkt = m;
+ } else {
+ m->m_nextpkt = fp->ipq_frags;
+ fp->ipq_frags = m;
+ }
+
+ /*
+ * While we overlap succeeding segments trim them or,
+ * if they are completely covered, dequeue them.
+ */
+ for (; q != NULL && ntohs(ip->ip_off) + ntohs(ip->ip_len) >
+ ntohs(GETIP(q)->ip_off); q = nq) {
+ i = (ntohs(ip->ip_off) + ntohs(ip->ip_len)) -
+ ntohs(GETIP(q)->ip_off);
+ if (i < ntohs(GETIP(q)->ip_len)) {
+ GETIP(q)->ip_len = htons(ntohs(GETIP(q)->ip_len) - i);
+ GETIP(q)->ip_off = htons(ntohs(GETIP(q)->ip_off) + i);
+ m_adj(q, i);
+ q->m_pkthdr.csum_flags = 0;
+ break;
+ }
+ nq = q->m_nextpkt;
+ m->m_nextpkt = nq;
+ IPSTAT_INC(ips_fragdropped);
+ fp->ipq_nfrags--;
+ m_freem(q);
+ }
+
+ /*
+ * Check for complete reassembly and perform frag per packet
+ * limiting.
+ *
+ * Frag limiting is performed here so that the nth frag has
+ * a chance to complete the packet before we drop the packet.
+ * As a result, n+1 frags are actually allowed per packet, but
+ * only n will ever be stored. (n = maxfragsperpacket.)
+ *
+ */
+ next = 0;
+ for (p = NULL, q = fp->ipq_frags; q; p = q, q = q->m_nextpkt) {
+ if (ntohs(GETIP(q)->ip_off) != next) {
+ if (fp->ipq_nfrags > V_maxfragsperpacket)
+ ipq_drop(head, fp);
+ goto done;
+ }
+ next += ntohs(GETIP(q)->ip_len);
+ }
+ /* Make sure the last packet didn't have the IP_MF flag */
+ if (p->m_flags & M_IP_FRAG) {
+ if (fp->ipq_nfrags > V_maxfragsperpacket)
+ ipq_drop(head, fp);
+ goto done;
+ }
+
+ /*
+ * Reassembly is complete. Make sure the packet is a sane size.
+ */
+ q = fp->ipq_frags;
+ ip = GETIP(q);
+ if (next + (ip->ip_hl << 2) > IP_MAXPACKET) {
+ IPSTAT_INC(ips_toolong);
+ ipq_drop(head, fp);
+ goto done;
+ }
+
+ /*
+ * Concatenate fragments.
+ */
+ m = q;
+ t = m->m_next;
+ m->m_next = NULL;
+ m_cat(m, t);
+ nq = q->m_nextpkt;
+ q->m_nextpkt = NULL;
+ for (q = nq; q != NULL; q = nq) {
+ nq = q->m_nextpkt;
+ q->m_nextpkt = NULL;
+ m->m_pkthdr.csum_flags &= q->m_pkthdr.csum_flags;
+ m->m_pkthdr.csum_data += q->m_pkthdr.csum_data;
+ m_cat(m, q);
+ }
+ /*
+ * In order to do checksumming faster we do 'end-around carry' here
+ * (and not in for{} loop), though it implies we are not going to
+ * reassemble more than 64k fragments.
+ */
+ while (m->m_pkthdr.csum_data & 0xffff0000)
+ m->m_pkthdr.csum_data = (m->m_pkthdr.csum_data & 0xffff) +
+ (m->m_pkthdr.csum_data >> 16);
+#ifdef MAC
+ mac_ipq_reassemble(fp, m);
+ mac_ipq_destroy(fp);
+#endif
+
+ /*
+ * Create header for new ip packet by modifying header of first
+ * packet; dequeue and discard fragment reassembly header.
+ * Make header visible.
+ */
+ ip->ip_len = htons((ip->ip_hl << 2) + next);
+ ip->ip_src = fp->ipq_src;
+ ip->ip_dst = fp->ipq_dst;
+ TAILQ_REMOVE(head, fp, ipq_list);
+ uma_zfree(V_ipq_zone, fp);
+ m->m_len += (ip->ip_hl << 2);
+ m->m_data -= (ip->ip_hl << 2);
+ /* some debugging cruft by sklower, below, will go away soon */
+ if (m->m_flags & M_PKTHDR) /* XXX this should be done elsewhere */
+ m_fixhdr(m);
+ IPSTAT_INC(ips_reassembled);
+ IPQ_UNLOCK(hash);
+
+#ifdef RSS
+ /*
+ * Query the RSS layer for the flowid / flowtype for the
+ * mbuf payload.
+ *
+ * For now, just assume we have to calculate a new one.
+ * Later on we should check to see if the assigned flowid matches
+ * what RSS wants for the given IP protocol and if so, just keep it.
+ *
+ * We then queue into the relevant netisr so it can be dispatched
+ * to the correct CPU.
+ *
+ * Note - this may return 1, which means the flowid in the mbuf
+ * is correct for the configured RSS hash types and can be used.
+ */
+ if (rss_mbuf_software_hash_v4(m, 0, &rss_hash, &rss_type) == 0) {
+ m->m_pkthdr.flowid = rss_hash;
+ M_HASHTYPE_SET(m, rss_type);
+ }
+
+ /*
+ * Queue/dispatch for reprocessing.
+ *
+ * Note: this is much slower than just handling the frame in the
+ * current receive context. It's likely worth investigating
+ * why this is.
+ */
+ netisr_dispatch(NETISR_IP_DIRECT, m);
+ return (NULL);
+#endif
+
+ /* Handle in-line */
+ return (m);
+
+dropfrag:
+ IPSTAT_INC(ips_fragdropped);
+ if (fp != NULL)
+ fp->ipq_nfrags--;
+ m_freem(m);
+done:
+ IPQ_UNLOCK(hash);
+ return (NULL);
+
+#undef GETIP
+}
+
+/*
+ * Initialize IP reassembly structures.
+ */
+void
+ipreass_init(void)
+{
+
+ for (int i = 0; i < IPREASS_NHASH; i++) {
+ TAILQ_INIT(&V_ipq[i].head);
+ mtx_init(&V_ipq[i].lock, "IP reassembly", NULL,
+ MTX_DEF | MTX_DUPOK);
+ }
+ V_ipq_hashseed = arc4random();
+ V_maxfragsperpacket = 16;
+ V_ipq_zone = uma_zcreate("ipq", sizeof(struct ipq), NULL, NULL, NULL,
+ NULL, UMA_ALIGN_PTR, 0);
+ uma_zone_set_max(V_ipq_zone, nmbclusters / 32);
+
+ if (IS_DEFAULT_VNET(curvnet))
+ EVENTHANDLER_REGISTER(nmbclusters_change, ipreass_zone_change,
+ NULL, EVENTHANDLER_PRI_ANY);
+}
+
+/*
+ * If a timer expires on a reassembly queue, discard it.
+ */
+void
+ipreass_slowtimo(void)
+{
+ struct ipq *fp, *tmp;
+
+ for (int i = 0; i < IPREASS_NHASH; i++) {
+ IPQ_LOCK(i);
+ TAILQ_FOREACH_SAFE(fp, &V_ipq[i].head, ipq_list, tmp)
+ if (--fp->ipq_ttl == 0)
+ ipq_timeout(&V_ipq[i].head, fp);
+ IPQ_UNLOCK(i);
+ }
+}
+
+/*
+ * Drain off all datagram fragments.
+ */
+void
+ipreass_drain(void)
+{
+
+ for (int i = 0; i < IPREASS_NHASH; i++) {
+ IPQ_LOCK(i);
+ while(!TAILQ_EMPTY(&V_ipq[i].head))
+ ipq_drop(&V_ipq[i].head, TAILQ_FIRST(&V_ipq[i].head));
+ IPQ_UNLOCK(i);
+ }
+}
+
+#ifdef VIMAGE
+/*
+ * Destroy IP reassembly structures.
+ */
+void
+ipreass_destroy(void)
+{
+
+ ipreass_drain();
+ uma_zdestroy(V_ipq_zone);
+ for (int i = 0; i < IPREASS_NHASH; i++)
+ mtx_destroy(&V_ipq[i].lock);
+}
+#endif
+
+/*
+ * After maxnipq has been updated, propagate the change to UMA. The UMA zone
+ * max has slightly different semantics than the sysctl, for historical
+ * reasons.
+ */
+static void
+ipreass_drain_tomax(void)
+{
+ int target;
+
+ /*
+ * If we are over the maximum number of fragments,
+ * drain off enough to get down to the new limit,
+ * stripping off last elements on queues. Every
+ * run we strip the oldest element from each bucket.
+ */
+ target = uma_zone_get_max(V_ipq_zone);
+ while (uma_zone_get_cur(V_ipq_zone) > target) {
+ struct ipq *fp;
+
+ for (int i = 0; i < IPREASS_NHASH; i++) {
+ IPQ_LOCK(i);
+ fp = TAILQ_LAST(&V_ipq[i].head, ipqhead);
+ if (fp != NULL)
+ ipq_timeout(&V_ipq[i].head, fp);
+ IPQ_UNLOCK(i);
+ }
+ }
+}
+
+static void
+ipreass_zone_change(void *tag)
+{
+
+ uma_zone_set_max(V_ipq_zone, nmbclusters / 32);
+ ipreass_drain_tomax();
+}
+
+/*
+ * Change the limit on the UMA zone, or disable the fragment allocation
+ * at all. Since 0 and -1 is a special values here, we need our own handler,
+ * instead of sysctl_handle_uma_zone_max().
+ */
+static int
+sysctl_maxfragpackets(SYSCTL_HANDLER_ARGS)
+{
+ int error, max;
+
+ if (V_noreass == 0) {
+ max = uma_zone_get_max(V_ipq_zone);
+ if (max == 0)
+ max = -1;
+ } else
+ max = 0;
+ error = sysctl_handle_int(oidp, &max, 0, req);
+ if (error || !req->newptr)
+ return (error);
+ if (max > 0) {
+ /*
+ * XXXRW: Might be a good idea to sanity check the argument
+ * and place an extreme upper bound.
+ */
+ max = uma_zone_set_max(V_ipq_zone, max);
+ ipreass_drain_tomax();
+ V_noreass = 0;
+ } else if (max == 0) {
+ V_noreass = 1;
+ ipreass_drain();
+ } else if (max == -1) {
+ V_noreass = 0;
+ uma_zone_set_max(V_ipq_zone, 0);
+ } else
+ return (EINVAL);
+ return (0);
+}
+
+/*
+ * Seek for old fragment queue header that can be reused. Try to
+ * reuse a header from currently locked hash bucket.
+ */
+static struct ipq *
+ipq_reuse(int start)
+{
+ struct ipq *fp;
+ int i;
+
+ IPQ_LOCK_ASSERT(start);
+
+ for (i = start;; i++) {
+ if (i == IPREASS_NHASH)
+ i = 0;
+ if (i != start && IPQ_TRYLOCK(i) == 0)
+ continue;
+ fp = TAILQ_LAST(&V_ipq[i].head, ipqhead);
+ if (fp) {
+ struct mbuf *m;
+
+ IPSTAT_ADD(ips_fragtimeout, fp->ipq_nfrags);
+ while (fp->ipq_frags) {
+ m = fp->ipq_frags;
+ fp->ipq_frags = m->m_nextpkt;
+ m_freem(m);
+ }
+ TAILQ_REMOVE(&V_ipq[i].head, fp, ipq_list);
+ if (i != start)
+ IPQ_UNLOCK(i);
+ IPQ_LOCK_ASSERT(start);
+ return (fp);
+ }
+ if (i != start)
+ IPQ_UNLOCK(i);
+ }
+}
+
+/*
+ * Free a fragment reassembly header and all associated datagrams.
+ */
+static void
+ipq_free(struct ipqhead *fhp, struct ipq *fp)
+{
+ struct mbuf *q;
+
+ while (fp->ipq_frags) {
+ q = fp->ipq_frags;
+ fp->ipq_frags = q->m_nextpkt;
+ m_freem(q);
+ }
+ TAILQ_REMOVE(fhp, fp, ipq_list);
+ uma_zfree(V_ipq_zone, fp);
+}
diff --git a/sys/netinet/libalias/libalias.3 b/sys/netinet/libalias/libalias.3
index 45e7fa4..543420b 100644
--- a/sys/netinet/libalias/libalias.3
+++ b/sys/netinet/libalias/libalias.3
@@ -173,10 +173,12 @@ Mainly useful for debugging when the log file is viewed continuously with
.It Dv PKT_ALIAS_DENY_INCOMING
If this mode bit is set, all incoming packets associated with new TCP
connections or new UDP transactions will be marked for being ignored
-.Fn ( LibAliasIn
+.Po
+.Fn LibAliasIn
returns
.Dv PKT_ALIAS_IGNORED
-code)
+code
+.Pc
by the calling program.
Response packets to connections or transactions initiated from the packet
aliasing host or local network will be unaffected.
@@ -1001,7 +1003,7 @@ If this results in a conflict, then port numbers are randomly chosen until
a unique aliasing link can be established.
In an alternate operating mode, the first choice of an aliasing port is also
random and unrelated to the local port number.
-.Sh MODULAR ARCHITECTURE (AND Xr ipfw 4 Sh SUPPORT)
+.Sh MODULAR ARCHITECTURE Po AND Xr ipfw 4 SUPPORT Pc
One of the latest improvements to
.Nm
was to make its support
diff --git a/sys/netinet/sctp_indata.c b/sys/netinet/sctp_indata.c
index ea3d3e7..d3b4855 100644
--- a/sys/netinet/sctp_indata.c
+++ b/sys/netinet/sctp_indata.c
@@ -3614,24 +3614,17 @@ sctp_express_handle_sack(struct sctp_tcb *stcb, uint32_t cumack,
send_s = asoc->sending_seq;
}
if (SCTP_TSN_GE(cumack, send_s)) {
-#ifndef INVARIANTS
struct mbuf *op_err;
char msg[SCTP_DIAG_INFO_LEN];
-#endif
-#ifdef INVARIANTS
- panic("Impossible sack 1");
-#else
-
*abort_now = 1;
/* XXX */
- snprintf(msg, sizeof(msg), "Cum ack %8.8x greater or equal then TSN %8.8x",
+ snprintf(msg, sizeof(msg), "Cum ack %8.8x greater or equal than TSN %8.8x",
cumack, send_s);
op_err = sctp_generate_cause(SCTP_CAUSE_PROTOCOL_VIOLATION, msg);
stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_25;
sctp_abort_an_association(stcb->sctp_ep, stcb, op_err, SCTP_SO_NOT_LOCKED);
return;
-#endif
}
}
asoc->this_sack_highest_gap = cumack;
@@ -4195,7 +4188,7 @@ sctp_handle_sack(struct mbuf *m, int offset_seg, int offset_dup,
hopeless_peer:
*abort_now = 1;
/* XXX */
- snprintf(msg, sizeof(msg), "Cum ack %8.8x greater or equal then TSN %8.8x",
+ snprintf(msg, sizeof(msg), "Cum ack %8.8x greater or equal than TSN %8.8x",
cum_ack, send_s);
op_err = sctp_generate_cause(SCTP_CAUSE_PROTOCOL_VIOLATION, msg);
stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_25;
diff --git a/sys/netinet/sctp_syscalls.c b/sys/netinet/sctp_syscalls.c
index 3161abc..28b4445 100644
--- a/sys/netinet/sctp_syscalls.c
+++ b/sys/netinet/sctp_syscalls.c
@@ -187,7 +187,7 @@ noconnection:
* out from under us.
*/
if (error != 0)
- fdclose(td->td_proc->p_fd, nfp, fd, td);
+ fdclose(td, nfp, fd);
/*
* Release explicitly held references before returning.
@@ -248,7 +248,7 @@ sys_sctp_generic_sendmsg (td, uap)
}
AUDIT_ARG_FD(uap->sd);
- error = getsock_cap(td->td_proc->p_fd, uap->sd, &rights, &fp, NULL);
+ error = getsock_cap(td, uap->sd, &rights, &fp, NULL);
if (error != 0)
goto sctp_bad;
#ifdef KTRACE
@@ -357,7 +357,7 @@ sys_sctp_generic_sendmsg_iov(td, uap)
}
AUDIT_ARG_FD(uap->sd);
- error = getsock_cap(td->td_proc->p_fd, uap->sd, &rights, &fp, NULL);
+ error = getsock_cap(td, uap->sd, &rights, &fp, NULL);
if (error != 0)
goto sctp_bad1;
@@ -468,8 +468,8 @@ sys_sctp_generic_recvmsg(td, uap)
int error, fromlen, i, msg_flags;
AUDIT_ARG_FD(uap->sd);
- error = getsock_cap(td->td_proc->p_fd, uap->sd,
- cap_rights_init(&rights, CAP_RECV), &fp, NULL);
+ error = getsock_cap(td, uap->sd, cap_rights_init(&rights, CAP_RECV),
+ &fp, NULL);
if (error != 0)
return (error);
#ifdef COMPAT_FREEBSD32
diff --git a/sys/netinet/siftr.c b/sys/netinet/siftr.c
index 2cd58ad..6b31d7b 100644
--- a/sys/netinet/siftr.c
+++ b/sys/netinet/siftr.c
@@ -75,6 +75,7 @@ __FBSDID("$FreeBSD$");
#include <sys/pcpu.h>
#include <sys/proc.h>
#include <sys/sbuf.h>
+#include <sys/sdt.h>
#include <sys/smp.h>
#include <sys/socket.h>
#include <sys/socketvar.h>
@@ -86,6 +87,7 @@ __FBSDID("$FreeBSD$");
#include <net/pfil.h>
#include <netinet/in.h>
+#include <netinet/in_kdtrace.h>
#include <netinet/in_pcb.h>
#include <netinet/in_systm.h>
#include <netinet/in_var.h>
@@ -811,6 +813,8 @@ siftr_siftdata(struct pkt_node *pn, struct inpcb *inp, struct tcpcb *tp,
* maximum pps throughput processing when SIFTR is loaded and enabled.
*/
microtime(&pn->tval);
+ TCP_PROBE1(siftr, &pn);
+
}
diff --git a/sys/netinet/tcp_subr.c b/sys/netinet/tcp_subr.c
index 5b845f0..d75221c 100644
--- a/sys/netinet/tcp_subr.c
+++ b/sys/netinet/tcp_subr.c
@@ -230,6 +230,7 @@ static struct inpcb *tcp_notify(struct inpcb *, int);
static struct inpcb *tcp_mtudisc_notify(struct inpcb *, int);
static char * tcp_log_addr(struct in_conninfo *inc, struct tcphdr *th,
void *ip4hdr, const void *ip6hdr);
+static void tcp_timer_discard(struct tcpcb *, uint32_t);
/*
* Target size of TCP PCB hash tables. Must be a power of two.
@@ -801,7 +802,13 @@ tcp_newtcpcb(struct inpcb *inp)
if (V_tcp_do_sack)
tp->t_flags |= TF_SACK_PERMIT;
TAILQ_INIT(&tp->snd_holes);
- tp->t_inpcb = inp; /* XXX */
+ /*
+ * The tcpcb will hold a reference on its inpcb until tcp_discardcb()
+ * is called.
+ */
+ in_pcbref(inp); /* Reference for tcpcb */
+ tp->t_inpcb = inp;
+
/*
* Init srtt to TCPTV_SRTTBASE (0), so we can tell that we have no
* rtt estimate. Set rttvar so that srtt + 4 * rttvar gives
@@ -920,6 +927,7 @@ tcp_discardcb(struct tcpcb *tp)
#ifdef INET6
int isipv6 = (inp->inp_vflag & INP_IPV6) != 0;
#endif /* INET6 */
+ int released;
INP_WLOCK_ASSERT(inp);
@@ -927,22 +935,15 @@ tcp_discardcb(struct tcpcb *tp)
* Make sure that all of our timers are stopped before we delete the
* PCB.
*
- * XXXRW: Really, we would like to use callout_drain() here in order
- * to avoid races experienced in tcp_timer.c where a timer is already
- * executing at this point. However, we can't, both because we're
- * running in a context where we can't sleep, and also because we
- * hold locks required by the timers. What we instead need to do is
- * test to see if callout_drain() is required, and if so, defer some
- * portion of the remainder of tcp_discardcb() to an asynchronous
- * context that can callout_drain() and then continue. Some care
- * will be required to ensure that no further processing takes place
- * on the tcpcb, even though it hasn't been freed (a flag?).
+ * If stopping a timer fails, we schedule a discard function in same
+ * callout, and the last discard function called will take care of
+ * deleting the tcpcb.
*/
- callout_stop(&tp->t_timers->tt_rexmt);
- callout_stop(&tp->t_timers->tt_persist);
- callout_stop(&tp->t_timers->tt_keep);
- callout_stop(&tp->t_timers->tt_2msl);
- callout_stop(&tp->t_timers->tt_delack);
+ tcp_timer_stop(tp, TT_REXMT);
+ tcp_timer_stop(tp, TT_PERSIST);
+ tcp_timer_stop(tp, TT_KEEP);
+ tcp_timer_stop(tp, TT_2MSL);
+ tcp_timer_stop(tp, TT_DELACK);
/*
* If we got enough samples through the srtt filter,
@@ -1019,8 +1020,80 @@ tcp_discardcb(struct tcpcb *tp)
CC_ALGO(tp) = NULL;
inp->inp_ppcb = NULL;
- tp->t_inpcb = NULL;
- uma_zfree(V_tcpcb_zone, tp);
+ if ((tp->t_timers->tt_flags & TT_MASK) == 0) {
+ /* We own the last reference on tcpcb, let's free it. */
+ tp->t_inpcb = NULL;
+ uma_zfree(V_tcpcb_zone, tp);
+ released = in_pcbrele_wlocked(inp);
+ KASSERT(!released, ("%s: inp %p should not have been released "
+ "here", __func__, inp));
+ }
+}
+
+void
+tcp_timer_2msl_discard(void *xtp)
+{
+
+ tcp_timer_discard((struct tcpcb *)xtp, TT_2MSL);
+}
+
+void
+tcp_timer_keep_discard(void *xtp)
+{
+
+ tcp_timer_discard((struct tcpcb *)xtp, TT_KEEP);
+}
+
+void
+tcp_timer_persist_discard(void *xtp)
+{
+
+ tcp_timer_discard((struct tcpcb *)xtp, TT_PERSIST);
+}
+
+void
+tcp_timer_rexmt_discard(void *xtp)
+{
+
+ tcp_timer_discard((struct tcpcb *)xtp, TT_REXMT);
+}
+
+void
+tcp_timer_delack_discard(void *xtp)
+{
+
+ tcp_timer_discard((struct tcpcb *)xtp, TT_DELACK);
+}
+
+void
+tcp_timer_discard(struct tcpcb *tp, uint32_t timer_type)
+{
+ struct inpcb *inp;
+
+ CURVNET_SET(tp->t_vnet);
+ INP_INFO_WLOCK(&V_tcbinfo);
+ inp = tp->t_inpcb;
+ KASSERT(inp != NULL, ("%s: tp %p tp->t_inpcb == NULL",
+ __func__, tp));
+ INP_WLOCK(inp);
+ KASSERT((tp->t_timers->tt_flags & TT_STOPPED) != 0,
+ ("%s: tcpcb has to be stopped here", __func__));
+ KASSERT((tp->t_timers->tt_flags & timer_type) != 0,
+ ("%s: discard callout should be running", __func__));
+ tp->t_timers->tt_flags &= ~timer_type;
+ if ((tp->t_timers->tt_flags & TT_MASK) == 0) {
+ /* We own the last reference on this tcpcb, let's free it. */
+ tp->t_inpcb = NULL;
+ uma_zfree(V_tcpcb_zone, tp);
+ if (in_pcbrele_wlocked(inp)) {
+ INP_INFO_WUNLOCK(&V_tcbinfo);
+ CURVNET_RESTORE();
+ return;
+ }
+ }
+ INP_WUNLOCK(inp);
+ INP_INFO_WUNLOCK(&V_tcbinfo);
+ CURVNET_RESTORE();
}
/*
@@ -2086,6 +2159,7 @@ tcp_signature_do_compute(struct mbuf *m, int len, int optlen,
break;
#endif
default:
+ KEY_FREESAV(&sav);
return (-1);
/* NOTREACHED */
break;
diff --git a/sys/netinet/tcp_timer.c b/sys/netinet/tcp_timer.c
index e6007e0..a64e403 100644
--- a/sys/netinet/tcp_timer.c
+++ b/sys/netinet/tcp_timer.c
@@ -258,10 +258,6 @@ int tcp_backoff[TCP_MAXRXTSHIFT + 1] =
static int tcp_totbackoff = 2559; /* sum of tcp_backoff[] */
-static int tcp_timer_race;
-SYSCTL_INT(_net_inet_tcp, OID_AUTO, timer_race, CTLFLAG_RD, &tcp_timer_race,
- 0, "Count of t_inpcb races on tcp_discardcb");
-
/*
* TCP timer processing.
*/
@@ -274,18 +270,7 @@ tcp_timer_delack(void *xtp)
CURVNET_SET(tp->t_vnet);
inp = tp->t_inpcb;
- /*
- * XXXRW: While this assert is in fact correct, bugs in the tcpcb
- * tear-down mean we need it as a work-around for races between
- * timers and tcp_discardcb().
- *
- * KASSERT(inp != NULL, ("tcp_timer_delack: inp == NULL"));
- */
- if (inp == NULL) {
- tcp_timer_race++;
- CURVNET_RESTORE();
- return;
- }
+ KASSERT(inp != NULL, ("%s: tp %p tp->t_inpcb == NULL", __func__, tp));
INP_WLOCK(inp);
if (callout_pending(&tp->t_timers->tt_delack) ||
!callout_active(&tp->t_timers->tt_delack)) {
@@ -299,6 +284,10 @@ tcp_timer_delack(void *xtp)
CURVNET_RESTORE();
return;
}
+ KASSERT((tp->t_timers->tt_flags & TT_STOPPED) == 0,
+ ("%s: tp %p tcpcb can't be stopped here", __func__, tp));
+ KASSERT((tp->t_timers->tt_flags & TT_DELACK) != 0,
+ ("%s: tp %p delack callout should be running", __func__, tp));
tp->t_flags |= TF_ACKNOW;
TCPSTAT_INC(tcps_delack);
@@ -318,24 +307,9 @@ tcp_timer_2msl(void *xtp)
ostate = tp->t_state;
#endif
- /*
- * XXXRW: Does this actually happen?
- */
INP_INFO_WLOCK(&V_tcbinfo);
inp = tp->t_inpcb;
- /*
- * XXXRW: While this assert is in fact correct, bugs in the tcpcb
- * tear-down mean we need it as a work-around for races between
- * timers and tcp_discardcb().
- *
- * KASSERT(inp != NULL, ("tcp_timer_2msl: inp == NULL"));
- */
- if (inp == NULL) {
- tcp_timer_race++;
- INP_INFO_WUNLOCK(&V_tcbinfo);
- CURVNET_RESTORE();
- return;
- }
+ KASSERT(inp != NULL, ("%s: tp %p tp->t_inpcb == NULL", __func__, tp));
INP_WLOCK(inp);
tcp_free_sackholes(tp);
if (callout_pending(&tp->t_timers->tt_2msl) ||
@@ -352,6 +326,10 @@ tcp_timer_2msl(void *xtp)
CURVNET_RESTORE();
return;
}
+ KASSERT((tp->t_timers->tt_flags & TT_STOPPED) == 0,
+ ("%s: tp %p tcpcb can't be stopped here", __func__, tp));
+ KASSERT((tp->t_timers->tt_flags & TT_2MSL) != 0,
+ ("%s: tp %p 2msl callout should be running", __func__, tp));
/*
* 2 MSL timeout in shutdown went off. If we're closed but
* still waiting for peer to close and connection has been idle
@@ -402,19 +380,7 @@ tcp_timer_keep(void *xtp)
#endif
INP_INFO_WLOCK(&V_tcbinfo);
inp = tp->t_inpcb;
- /*
- * XXXRW: While this assert is in fact correct, bugs in the tcpcb
- * tear-down mean we need it as a work-around for races between
- * timers and tcp_discardcb().
- *
- * KASSERT(inp != NULL, ("tcp_timer_keep: inp == NULL"));
- */
- if (inp == NULL) {
- tcp_timer_race++;
- INP_INFO_WUNLOCK(&V_tcbinfo);
- CURVNET_RESTORE();
- return;
- }
+ KASSERT(inp != NULL, ("%s: tp %p tp->t_inpcb == NULL", __func__, tp));
INP_WLOCK(inp);
if (callout_pending(&tp->t_timers->tt_keep) ||
!callout_active(&tp->t_timers->tt_keep)) {
@@ -430,6 +396,10 @@ tcp_timer_keep(void *xtp)
CURVNET_RESTORE();
return;
}
+ KASSERT((tp->t_timers->tt_flags & TT_STOPPED) == 0,
+ ("%s: tp %p tcpcb can't be stopped here", __func__, tp));
+ KASSERT((tp->t_timers->tt_flags & TT_KEEP) != 0,
+ ("%s: tp %p keep callout should be running", __func__, tp));
/*
* Keep-alive timer went off; send something
* or drop connection if idle for too long.
@@ -505,19 +475,7 @@ tcp_timer_persist(void *xtp)
#endif
INP_INFO_WLOCK(&V_tcbinfo);
inp = tp->t_inpcb;
- /*
- * XXXRW: While this assert is in fact correct, bugs in the tcpcb
- * tear-down mean we need it as a work-around for races between
- * timers and tcp_discardcb().
- *
- * KASSERT(inp != NULL, ("tcp_timer_persist: inp == NULL"));
- */
- if (inp == NULL) {
- tcp_timer_race++;
- INP_INFO_WUNLOCK(&V_tcbinfo);
- CURVNET_RESTORE();
- return;
- }
+ KASSERT(inp != NULL, ("%s: tp %p tp->t_inpcb == NULL", __func__, tp));
INP_WLOCK(inp);
if (callout_pending(&tp->t_timers->tt_persist) ||
!callout_active(&tp->t_timers->tt_persist)) {
@@ -533,6 +491,10 @@ tcp_timer_persist(void *xtp)
CURVNET_RESTORE();
return;
}
+ KASSERT((tp->t_timers->tt_flags & TT_STOPPED) == 0,
+ ("%s: tp %p tcpcb can't be stopped here", __func__, tp));
+ KASSERT((tp->t_timers->tt_flags & TT_PERSIST) != 0,
+ ("%s: tp %p persist callout should be running", __func__, tp));
/*
* Persistance timer into zero window.
* Force a byte to be output, if possible.
@@ -594,19 +556,7 @@ tcp_timer_rexmt(void * xtp)
INP_INFO_RLOCK(&V_tcbinfo);
inp = tp->t_inpcb;
- /*
- * XXXRW: While this assert is in fact correct, bugs in the tcpcb
- * tear-down mean we need it as a work-around for races between
- * timers and tcp_discardcb().
- *
- * KASSERT(inp != NULL, ("tcp_timer_rexmt: inp == NULL"));
- */
- if (inp == NULL) {
- tcp_timer_race++;
- INP_INFO_RUNLOCK(&V_tcbinfo);
- CURVNET_RESTORE();
- return;
- }
+ KASSERT(inp != NULL, ("%s: tp %p tp->t_inpcb == NULL", __func__, tp));
INP_WLOCK(inp);
if (callout_pending(&tp->t_timers->tt_rexmt) ||
!callout_active(&tp->t_timers->tt_rexmt)) {
@@ -622,6 +572,10 @@ tcp_timer_rexmt(void * xtp)
CURVNET_RESTORE();
return;
}
+ KASSERT((tp->t_timers->tt_flags & TT_STOPPED) == 0,
+ ("%s: tp %p tcpcb can't be stopped here", __func__, tp));
+ KASSERT((tp->t_timers->tt_flags & TT_REXMT) != 0,
+ ("%s: tp %p rexmt callout should be running", __func__, tp));
tcp_free_sackholes(tp);
/*
* Retransmission timer went off. Message has not
@@ -850,7 +804,7 @@ out:
}
void
-tcp_timer_activate(struct tcpcb *tp, int timer_type, u_int delta)
+tcp_timer_activate(struct tcpcb *tp, uint32_t timer_type, u_int delta)
{
struct callout *t_callout;
timeout_t *f_callout;
@@ -862,6 +816,9 @@ tcp_timer_activate(struct tcpcb *tp, int timer_type, u_int delta)
return;
#endif
+ if (tp->t_timers->tt_flags & TT_STOPPED)
+ return;
+
switch (timer_type) {
case TT_DELACK:
t_callout = &tp->t_timers->tt_delack;
@@ -887,14 +844,23 @@ tcp_timer_activate(struct tcpcb *tp, int timer_type, u_int delta)
panic("tp %p bad timer_type %#x", tp, timer_type);
}
if (delta == 0) {
- callout_stop(t_callout);
+ if ((tp->t_timers->tt_flags & timer_type) &&
+ callout_stop(t_callout)) {
+ tp->t_timers->tt_flags &= ~timer_type;
+ }
} else {
- callout_reset_on(t_callout, delta, f_callout, tp, cpu);
+ if ((tp->t_timers->tt_flags & timer_type) == 0) {
+ tp->t_timers->tt_flags |= timer_type;
+ callout_reset_on(t_callout, delta, f_callout, tp, cpu);
+ } else {
+ /* Reset already running callout on the same CPU. */
+ callout_reset(t_callout, delta, f_callout, tp);
+ }
}
}
int
-tcp_timer_active(struct tcpcb *tp, int timer_type)
+tcp_timer_active(struct tcpcb *tp, uint32_t timer_type)
{
struct callout *t_callout;
@@ -920,6 +886,58 @@ tcp_timer_active(struct tcpcb *tp, int timer_type)
return callout_active(t_callout);
}
+void
+tcp_timer_stop(struct tcpcb *tp, uint32_t timer_type)
+{
+ struct callout *t_callout;
+ timeout_t *f_callout;
+
+ tp->t_timers->tt_flags |= TT_STOPPED;
+
+ switch (timer_type) {
+ case TT_DELACK:
+ t_callout = &tp->t_timers->tt_delack;
+ f_callout = tcp_timer_delack_discard;
+ break;
+ case TT_REXMT:
+ t_callout = &tp->t_timers->tt_rexmt;
+ f_callout = tcp_timer_rexmt_discard;
+ break;
+ case TT_PERSIST:
+ t_callout = &tp->t_timers->tt_persist;
+ f_callout = tcp_timer_persist_discard;
+ break;
+ case TT_KEEP:
+ t_callout = &tp->t_timers->tt_keep;
+ f_callout = tcp_timer_keep_discard;
+ break;
+ case TT_2MSL:
+ t_callout = &tp->t_timers->tt_2msl;
+ f_callout = tcp_timer_2msl_discard;
+ break;
+ default:
+ panic("tp %p bad timer_type %#x", tp, timer_type);
+ }
+
+ if (tp->t_timers->tt_flags & timer_type) {
+ if (callout_stop(t_callout)) {
+ tp->t_timers->tt_flags &= ~timer_type;
+ } else {
+ /*
+ * Can't stop the callout, defer tcpcb actual deletion
+ * to the last tcp timer discard callout.
+ * The TT_STOPPED flag will ensure that no tcp timer
+ * callouts can be restarted on our behalf, and
+ * past this point currently running callouts waiting
+ * on inp lock will return right away after the
+ * classical check for callout reset/stop events:
+ * callout_pending() || !callout_active()
+ */
+ callout_reset(t_callout, 1, f_callout, tp);
+ }
+ }
+}
+
#define ticks_to_msecs(t) (1000*(t) / hz)
void
diff --git a/sys/netinet/tcp_timer.h b/sys/netinet/tcp_timer.h
index f80e744..02a7782 100644
--- a/sys/netinet/tcp_timer.h
+++ b/sys/netinet/tcp_timer.h
@@ -146,12 +146,21 @@ struct tcp_timer {
struct callout tt_keep; /* keepalive */
struct callout tt_2msl; /* 2*msl TIME_WAIT timer */
struct callout tt_delack; /* delayed ACK timer */
+ uint32_t tt_flags; /* Timers flags */
+ uint32_t tt_spare; /* TDB */
};
-#define TT_DELACK 0x01
-#define TT_REXMT 0x02
-#define TT_PERSIST 0x04
-#define TT_KEEP 0x08
-#define TT_2MSL 0x10
+
+/*
+ * Flags for the tt_flags field.
+ */
+#define TT_DELACK 0x0001
+#define TT_REXMT 0x0002
+#define TT_PERSIST 0x0004
+#define TT_KEEP 0x0008
+#define TT_2MSL 0x0010
+#define TT_MASK (TT_DELACK|TT_REXMT|TT_PERSIST|TT_KEEP|TT_2MSL)
+
+#define TT_STOPPED 0x00010000
#define TP_KEEPINIT(tp) ((tp)->t_keepinit ? (tp)->t_keepinit : tcp_keepinit)
#define TP_KEEPIDLE(tp) ((tp)->t_keepidle ? (tp)->t_keepidle : tcp_keepidle)
@@ -183,6 +192,11 @@ void tcp_timer_keep(void *xtp);
void tcp_timer_persist(void *xtp);
void tcp_timer_rexmt(void *xtp);
void tcp_timer_delack(void *xtp);
+void tcp_timer_2msl_discard(void *xtp);
+void tcp_timer_keep_discard(void *xtp);
+void tcp_timer_persist_discard(void *xtp);
+void tcp_timer_rexmt_discard(void *xtp);
+void tcp_timer_delack_discard(void *xtp);
void tcp_timer_to_xtimer(struct tcpcb *tp, struct tcp_timer *timer,
struct xtcp_timer *xtimer);
diff --git a/sys/netinet/tcp_timewait.c b/sys/netinet/tcp_timewait.c
index da48615..1ba74d8 100644
--- a/sys/netinet/tcp_timewait.c
+++ b/sys/netinet/tcp_timewait.c
@@ -251,6 +251,13 @@ tcp_twstart(struct tcpcb *tp)
}
}
+
+ /*
+ * For use only by DTrace. We do not reference the state
+ * after this point so modifying it in place is not a problem.
+ */
+ tcp_state_change(tp, TCPS_TIME_WAIT);
+
tw = uma_zalloc(V_tcptw_zone, M_NOWAIT);
if (tw == NULL) {
/*
diff --git a/sys/netinet/tcp_var.h b/sys/netinet/tcp_var.h
index 0bf5be4..df01735 100644
--- a/sys/netinet/tcp_var.h
+++ b/sys/netinet/tcp_var.h
@@ -708,8 +708,9 @@ void tcp_slowtimo(void);
struct tcptemp *
tcpip_maketemplate(struct inpcb *);
void tcpip_fillheaders(struct inpcb *, void *, void *);
-void tcp_timer_activate(struct tcpcb *, int, u_int);
-int tcp_timer_active(struct tcpcb *, int);
+void tcp_timer_activate(struct tcpcb *, uint32_t, u_int);
+int tcp_timer_active(struct tcpcb *, uint32_t);
+void tcp_timer_stop(struct tcpcb *, uint32_t);
void tcp_trace(short, short, struct tcpcb *, void *, struct tcphdr *, int);
/*
* All tcp_hc_* functions are IPv4 and IPv6 (via in_conninfo)
diff --git a/sys/netinet6/in6.c b/sys/netinet6/in6.c
index ae68f26..d2570c4 100644
--- a/sys/netinet6/in6.c
+++ b/sys/netinet6/in6.c
@@ -1684,6 +1684,36 @@ in6_localip(struct in6_addr *in6)
IN6_IFADDR_RUNLOCK();
return (0);
}
+
+/*
+ * Return 1 if an internet address is configured on an interface.
+ */
+int
+in6_ifhasaddr(struct ifnet *ifp, struct in6_addr *addr)
+{
+ struct in6_addr in6;
+ struct ifaddr *ifa;
+ struct in6_ifaddr *ia6;
+
+ in6 = *addr;
+ if (in6_clearscope(&in6))
+ return (0);
+ in6_setscope(&in6, ifp, NULL);
+
+ IF_ADDR_RLOCK(ifp);
+ TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
+ if (ifa->ifa_addr->sa_family != AF_INET6)
+ continue;
+ ia6 = (struct in6_ifaddr *)ifa;
+ if (IN6_ARE_ADDR_EQUAL(&ia6->ia_addr.sin6_addr, &in6)) {
+ IF_ADDR_RUNLOCK(ifp);
+ return (1);
+ }
+ }
+ IF_ADDR_RUNLOCK(ifp);
+
+ return (0);
+}
int
in6_is_addr_deprecated(struct sockaddr_in6 *sa6)
@@ -1967,18 +1997,9 @@ in6_if2idlen(struct ifnet *ifp)
{
switch (ifp->if_type) {
case IFT_ETHER: /* RFC2464 */
-#ifdef IFT_PROPVIRTUAL
case IFT_PROPVIRTUAL: /* XXX: no RFC. treat it as ether */
-#endif
-#ifdef IFT_L2VLAN
case IFT_L2VLAN: /* ditto */
-#endif
-#ifdef IFT_IEEE80211
case IFT_IEEE80211: /* ditto */
-#endif
-#ifdef IFT_MIP
- case IFT_MIP: /* ditto */
-#endif
case IFT_INFINIBAND:
return (64);
case IFT_FDDI: /* RFC2467 */
diff --git a/sys/netinet6/in6.h b/sys/netinet6/in6.h
index 1a33527..50ca387 100644
--- a/sys/netinet6/in6.h
+++ b/sys/netinet6/in6.h
@@ -650,6 +650,7 @@ int in6_cksum_partial(struct mbuf *, u_int8_t, u_int32_t, u_int32_t,
u_int32_t);
int in6_localaddr(struct in6_addr *);
int in6_localip(struct in6_addr *);
+int in6_ifhasaddr(struct ifnet *, struct in6_addr *);
int in6_addrscope(const struct in6_addr *);
char *ip6_sprintf(char *, const struct in6_addr *);
struct in6_ifaddr *in6_ifawithifp(struct ifnet *, struct in6_addr *);
diff --git a/sys/netinet6/in6_ifattach.c b/sys/netinet6/in6_ifattach.c
index 06d931b..8c25e98 100644
--- a/sys/netinet6/in6_ifattach.c
+++ b/sys/netinet6/in6_ifattach.c
@@ -274,9 +274,7 @@ found:
case IFT_ISO88025:
case IFT_ATM:
case IFT_IEEE1394:
-#ifdef IFT_IEEE80211
case IFT_IEEE80211:
-#endif
/* IEEE802/EUI64 cases - what others? */
/* IEEE1394 uses 16byte length address starting with EUI64 */
if (addrlen > 8)
@@ -338,9 +336,7 @@ found:
break;
case IFT_GIF:
-#ifdef IFT_STF
case IFT_STF:
-#endif
/*
* RFC2893 says: "SHOULD use IPv4 address as ifid source".
* however, IPv4 address is not very suitable as unique
diff --git a/sys/netinet6/in6_mcast.c b/sys/netinet6/in6_mcast.c
index d872b87..4bc66e6 100644
--- a/sys/netinet6/in6_mcast.c
+++ b/sys/netinet6/in6_mcast.c
@@ -2348,11 +2348,15 @@ in6p_set_multicast_if(struct inpcb *inp, struct sockopt *sopt)
return (error);
if (V_if_index < ifindex)
return (EINVAL);
-
- ifp = ifnet_byindex(ifindex);
- if (ifp == NULL || (ifp->if_flags & IFF_MULTICAST) == 0)
- return (EADDRNOTAVAIL);
-
+ if (ifindex == 0)
+ ifp = NULL;
+ else {
+ ifp = ifnet_byindex(ifindex);
+ if (ifp == NULL)
+ return (EINVAL);
+ if ((ifp->if_flags & IFF_MULTICAST) == 0)
+ return (EADDRNOTAVAIL);
+ }
imo = in6p_findmoptions(inp);
imo->im6o_multicast_ifp = ifp;
INP_WUNLOCK(inp);
diff --git a/sys/netinet6/ip6_forward.c b/sys/netinet6/ip6_forward.c
index d66b674..83e58c1 100644
--- a/sys/netinet6/ip6_forward.c
+++ b/sys/netinet6/ip6_forward.c
@@ -248,8 +248,7 @@ ip6_forward(struct mbuf *m, int srcrt)
/*
* when the kernel forwards a packet, it is not proper to apply
- * IPsec transport mode to the packet is not proper. this check
- * avoid from this.
+ * IPsec transport mode to the packet. This check avoid from this.
* at present, if there is even a transport mode SA request in the
* security policy, the kernel does not apply IPsec to the packet.
* this check is not enough because the following case is valid.
@@ -283,9 +282,9 @@ ip6_forward(struct mbuf *m, int srcrt)
* ipsec6_proces_packet will send the packet using ip6_output
*/
error = ipsec6_process_packet(m, sp->req);
-
- KEY_FREESP(&sp);
-
+ /* Release SP if an error occured */
+ if (error != 0)
+ KEY_FREESP(&sp);
if (error == EJUSTRETURN) {
/*
* We had a SP with a level of 'use' and no SA. We
@@ -413,39 +412,6 @@ again2:
goto bad;
}
- if (m->m_pkthdr.len > IN6_LINKMTU(rt->rt_ifp)) {
- in6_ifstat_inc(rt->rt_ifp, ifs6_in_toobig);
- if (mcopy) {
- u_long mtu;
-#ifdef IPSEC
- size_t ipsechdrsiz;
-#endif /* IPSEC */
-
- mtu = IN6_LINKMTU(rt->rt_ifp);
-#ifdef IPSEC
- /*
- * When we do IPsec tunnel ingress, we need to play
- * with the link value (decrement IPsec header size
- * from mtu value). The code is much simpler than v4
- * case, as we have the outgoing interface for
- * encapsulated packet as "rt->rt_ifp".
- */
- ipsechdrsiz = ipsec_hdrsiz(mcopy, IPSEC_DIR_OUTBOUND,
- NULL);
- if (ipsechdrsiz < mtu)
- mtu -= ipsechdrsiz;
- /*
- * if mtu becomes less than minimum MTU,
- * tell minimum MTU (and I'll need to fragment it).
- */
- if (mtu < IPV6_MMTU)
- mtu = IPV6_MMTU;
-#endif /* IPSEC */
- icmp6_error(mcopy, ICMP6_PACKET_TOO_BIG, 0, mtu);
- }
- goto bad;
- }
-
if (rt->rt_flags & RTF_GATEWAY)
dst = (struct sockaddr_in6 *)rt->rt_gateway;
@@ -537,22 +503,9 @@ again2:
if (!IN6_ARE_ADDR_EQUAL(&odst, &ip6->ip6_dst)) {
m->m_flags |= M_SKIP_FIREWALL;
/* If destination is now ourself drop to ip6_input(). */
- if (in6_localip(&ip6->ip6_dst)) {
+ if (in6_localip(&ip6->ip6_dst))
m->m_flags |= M_FASTFWD_OURS;
- if (m->m_pkthdr.rcvif == NULL)
- m->m_pkthdr.rcvif = V_loif;
- if (m->m_pkthdr.csum_flags & CSUM_DELAY_DATA_IPV6) {
- m->m_pkthdr.csum_flags |=
- CSUM_DATA_VALID_IPV6 | CSUM_PSEUDO_HDR;
- m->m_pkthdr.csum_data = 0xffff;
- }
-#ifdef SCTP
- if (m->m_pkthdr.csum_flags & CSUM_SCTP_IPV6)
- m->m_pkthdr.csum_flags |= CSUM_SCTP_VALID;
-#endif
- error = netisr_queue(NETISR_IPV6, m);
- goto out;
- } else
+ else
goto again; /* Redo the routing table lookup. */
}
@@ -584,6 +537,40 @@ again2:
}
pass:
+ /* See if the size was changed by the packet filter. */
+ if (m->m_pkthdr.len > IN6_LINKMTU(rt->rt_ifp)) {
+ in6_ifstat_inc(rt->rt_ifp, ifs6_in_toobig);
+ if (mcopy) {
+ u_long mtu;
+#ifdef IPSEC
+ size_t ipsechdrsiz;
+#endif /* IPSEC */
+
+ mtu = IN6_LINKMTU(rt->rt_ifp);
+#ifdef IPSEC
+ /*
+ * When we do IPsec tunnel ingress, we need to play
+ * with the link value (decrement IPsec header size
+ * from mtu value). The code is much simpler than v4
+ * case, as we have the outgoing interface for
+ * encapsulated packet as "rt->rt_ifp".
+ */
+ ipsechdrsiz = ipsec_hdrsiz(mcopy, IPSEC_DIR_OUTBOUND,
+ NULL);
+ if (ipsechdrsiz < mtu)
+ mtu -= ipsechdrsiz;
+ /*
+ * if mtu becomes less than minimum MTU,
+ * tell minimum MTU (and I'll need to fragment it).
+ */
+ if (mtu < IPV6_MMTU)
+ mtu = IPV6_MMTU;
+#endif /* IPSEC */
+ icmp6_error(mcopy, ICMP6_PACKET_TOO_BIG, 0, mtu);
+ }
+ goto bad;
+ }
+
error = nd6_output(rt->rt_ifp, origifp, m, dst, rt);
if (error) {
in6_ifstat_inc(rt->rt_ifp, ifs6_out_discard);
diff --git a/sys/netinet6/ip6_ipsec.c b/sys/netinet6/ip6_ipsec.c
index 0a416cd..e6e16ed 100644
--- a/sys/netinet6/ip6_ipsec.c
+++ b/sys/netinet6/ip6_ipsec.c
@@ -213,7 +213,9 @@ ip6_ipsec_output(struct mbuf **m, struct inpcb *inp, int *error)
/* NB: callee frees mbuf */
*error = ipsec6_process_packet(*m, sp->req);
-
+ /* Release SP if an error occured */
+ if (*error != 0)
+ KEY_FREESP(&sp);
if (*error == EJUSTRETURN) {
/*
* We had a SP with a level of 'use' and no SA. We
@@ -249,13 +251,9 @@ ip6_ipsec_output(struct mbuf **m, struct inpcb *inp, int *error)
/* No IPsec processing for this packet. */
}
done:
- if (sp != NULL)
- KEY_FREESP(&sp);
- return 0;
+ return (0);
reinjected:
- if (sp != NULL)
- KEY_FREESP(&sp);
- return -1;
+ return (-1);
bad:
if (sp != NULL)
KEY_FREESP(&sp);
diff --git a/sys/netinet6/ip6_mroute.c b/sys/netinet6/ip6_mroute.c
index 3976b08..a2f9a7c 100644
--- a/sys/netinet6/ip6_mroute.c
+++ b/sys/netinet6/ip6_mroute.c
@@ -196,9 +196,34 @@ static struct mtx mfc6_mtx;
static u_char n6expire[MF6CTBLSIZ];
static struct mif6 mif6table[MAXMIFS];
-SYSCTL_OPAQUE(_net_inet6_ip6, OID_AUTO, mif6table, CTLFLAG_RD,
- &mif6table, sizeof(mif6table), "S,mif6[MAXMIFS]",
- "IPv6 Multicast Interfaces (struct mif6[MAXMIFS], netinet6/ip6_mroute.h)");
+static int
+sysctl_mif6table(SYSCTL_HANDLER_ARGS)
+{
+ struct mif6_sctl *out;
+ int error;
+
+ out = malloc(sizeof(struct mif6_sctl) * MAXMIFS, M_TEMP, M_WAITOK);
+ for (int i = 0; i < MAXMIFS; i++) {
+ out[i].m6_flags = mif6table[i].m6_flags;
+ out[i].m6_rate_limit = mif6table[i].m6_rate_limit;
+ out[i].m6_lcl_addr = mif6table[i].m6_lcl_addr;
+ if (mif6table[i].m6_ifp != NULL)
+ out[i].m6_ifp = mif6table[i].m6_ifp->if_index;
+ else
+ out[i].m6_ifp = 0;
+ out[i].m6_pkt_in = mif6table[i].m6_pkt_in;
+ out[i].m6_pkt_out = mif6table[i].m6_pkt_out;
+ out[i].m6_bytes_in = mif6table[i].m6_bytes_in;
+ out[i].m6_bytes_out = mif6table[i].m6_bytes_out;
+ }
+ error = SYSCTL_OUT(req, out, sizeof(struct mif6_sctl) * MAXMIFS);
+ free(out, M_TEMP);
+ return (error);
+}
+SYSCTL_PROC(_net_inet6_ip6, OID_AUTO, mif6table, CTLTYPE_OPAQUE | CTLFLAG_RD,
+ NULL, 0, sysctl_mif6table, "S,mif6_sctl[MAXMIFS]",
+ "IPv6 Multicast Interfaces (struct mif6_sctl[MAXMIFS], "
+ "netinet6/ip6_mroute.h)");
static struct mtx mif6_mtx;
#define MIF6_LOCK() mtx_lock(&mif6_mtx)
diff --git a/sys/netinet6/ip6_mroute.h b/sys/netinet6/ip6_mroute.h
index d7b0014..51e1d49 100644
--- a/sys/netinet6/ip6_mroute.h
+++ b/sys/netinet6/ip6_mroute.h
@@ -194,6 +194,20 @@ struct sioc_mif_req6 {
u_quad_t obytes; /* Output byte count on mif */
};
+/*
+ * Structure to export 'struct mif6' to userland via sysctl.
+ */
+struct mif6_sctl {
+ u_char m6_flags; /* MIFF_ flags defined above */
+ u_int m6_rate_limit; /* max rate */
+ struct in6_addr m6_lcl_addr; /* local interface address */
+ uint32_t m6_ifp; /* interface index */
+ u_quad_t m6_pkt_in; /* # pkts in on interface */
+ u_quad_t m6_pkt_out; /* # pkts out on interface */
+ u_quad_t m6_bytes_in; /* # bytes in on interface */
+ u_quad_t m6_bytes_out; /* # bytes out on interface */
+};
+
#if defined(_KERNEL) || defined(KERNEL)
/*
* The kernel's multicast-interface structure.
diff --git a/sys/netinet6/nd6.c b/sys/netinet6/nd6.c
index da32f07..83dda1a 100644
--- a/sys/netinet6/nd6.c
+++ b/sys/netinet6/nd6.c
@@ -765,11 +765,10 @@ regen_tmpaddr(struct in6_ifaddr *ia6)
* address with the prefix.
*/
if (!IFA6_IS_DEPRECATED(it6))
- public_ifa6 = it6;
-
- if (public_ifa6 != NULL)
- ifa_ref(&public_ifa6->ia_ifa);
+ public_ifa6 = it6;
}
+ if (public_ifa6 != NULL)
+ ifa_ref(&public_ifa6->ia_ifa);
IF_ADDR_RUNLOCK(ifp);
if (public_ifa6 != NULL) {
@@ -2146,12 +2145,8 @@ nd6_need_cache(struct ifnet *ifp)
case IFT_ETHER:
case IFT_FDDI:
case IFT_IEEE1394:
-#ifdef IFT_L2VLAN
case IFT_L2VLAN:
-#endif
-#ifdef IFT_IEEE80211
case IFT_IEEE80211:
-#endif
case IFT_INFINIBAND:
case IFT_BRIDGE:
case IFT_PROPVIRTUAL:
@@ -2236,12 +2231,8 @@ nd6_storelladdr(struct ifnet *ifp, struct mbuf *m,
switch (ifp->if_type) {
case IFT_ETHER:
case IFT_FDDI:
-#ifdef IFT_L2VLAN
case IFT_L2VLAN:
-#endif
-#ifdef IFT_IEEE80211
case IFT_IEEE80211:
-#endif
case IFT_BRIDGE:
case IFT_ISO88025:
ETHER_MAP_IPV6_MULTICAST(&SIN6(dst)->sin6_addr,
diff --git a/sys/netinet6/nd6_nbr.c b/sys/netinet6/nd6_nbr.c
index 2d319ed..a4ae618 100644
--- a/sys/netinet6/nd6_nbr.c
+++ b/sys/netinet6/nd6_nbr.c
@@ -417,14 +417,9 @@ nd6_ns_output_fib(struct ifnet *ifp, const struct in6_addr *daddr6,
/* estimate the size of message */
maxlen = sizeof(*ip6) + sizeof(*nd_ns);
maxlen += (sizeof(struct nd_opt_hdr) + ifp->if_addrlen + 7) & ~7;
- if (max_linkhdr + maxlen >= MCLBYTES) {
-#ifdef DIAGNOSTIC
- printf("%s: max_linkhdr + maxlen >= MCLBYTES "
- "(%d + %d > %d)\n", __func__, max_linkhdr, maxlen,
- MCLBYTES);
-#endif
- return;
- }
+ KASSERT(max_linkhdr + maxlen <= MCLBYTES, (
+ "%s: max_linkhdr + maxlen > MCLBYTES (%d + %d > %d)",
+ __func__, max_linkhdr, maxlen, MCLBYTES));
if (max_linkhdr + maxlen > MHLEN)
m = m_getcl(M_NOWAIT, MT_DATA, M_PKTHDR);
@@ -992,13 +987,9 @@ nd6_na_output_fib(struct ifnet *ifp, const struct in6_addr *daddr6_0,
/* estimate the size of message */
maxlen = sizeof(*ip6) + sizeof(*nd_na);
maxlen += (sizeof(struct nd_opt_hdr) + ifp->if_addrlen + 7) & ~7;
- if (max_linkhdr + maxlen >= MCLBYTES) {
-#ifdef DIAGNOSTIC
- printf("nd6_na_output: max_linkhdr + maxlen >= MCLBYTES "
- "(%d + %d > %d)\n", max_linkhdr, maxlen, MCLBYTES);
-#endif
- return;
- }
+ KASSERT(max_linkhdr + maxlen <= MCLBYTES, (
+ "%s: max_linkhdr + maxlen > MCLBYTES (%d + %d > %d)",
+ __func__, max_linkhdr, maxlen, MCLBYTES));
if (max_linkhdr + maxlen > MHLEN)
m = m_getcl(M_NOWAIT, MT_DATA, M_PKTHDR);
@@ -1158,12 +1149,8 @@ nd6_ifptomac(struct ifnet *ifp)
case IFT_ETHER:
case IFT_FDDI:
case IFT_IEEE1394:
-#ifdef IFT_L2VLAN
case IFT_L2VLAN:
-#endif
-#ifdef IFT_IEEE80211
case IFT_IEEE80211:
-#endif
case IFT_INFINIBAND:
case IFT_BRIDGE:
case IFT_ISO88025:
@@ -1558,9 +1545,7 @@ nd6_dad_duplicated(struct ifaddr *ifa, struct dadq *dp)
case IFT_FDDI:
case IFT_ATM:
case IFT_IEEE1394:
-#ifdef IFT_IEEE80211
case IFT_IEEE80211:
-#endif
case IFT_INFINIBAND:
in6 = ia->ia_addr.sin6_addr;
if (in6_get_hw_ifid(ifp, &in6) == 0 &&
diff --git a/sys/netinet6/nd6_rtr.c b/sys/netinet6/nd6_rtr.c
index 19c5f8d..0576aa2 100644
--- a/sys/netinet6/nd6_rtr.c
+++ b/sys/netinet6/nd6_rtr.c
@@ -297,8 +297,16 @@ nd6_ra_input(struct mbuf *m, int off, int icmp6len)
}
if (nd_ra->nd_ra_retransmit)
ndi->retrans = ntohl(nd_ra->nd_ra_retransmit);
- if (nd_ra->nd_ra_curhoplimit)
- ndi->chlim = nd_ra->nd_ra_curhoplimit;
+ if (nd_ra->nd_ra_curhoplimit) {
+ if (ndi->chlim < nd_ra->nd_ra_curhoplimit)
+ ndi->chlim = nd_ra->nd_ra_curhoplimit;
+ else if (ndi->chlim != nd_ra->nd_ra_curhoplimit) {
+ log(LOG_ERR, "RA with a lower CurHopLimit sent from "
+ "%s on %s (current = %d, received = %d). "
+ "Ignored.\n", ip6_sprintf(ip6bufs, &ip6->ip6_src),
+ if_name(ifp), ndi->chlim, nd_ra->nd_ra_curhoplimit);
+ }
+ }
dr = defrtrlist_update(&dr0);
}
diff --git a/sys/netipsec/ipsec.c b/sys/netipsec/ipsec.c
index 8a79052..266f6d0 100644
--- a/sys/netipsec/ipsec.c
+++ b/sys/netipsec/ipsec.c
@@ -238,6 +238,7 @@ SYSCTL_VNET_PCPUSTAT(_net_inet6_ipsec6, IPSECCTL_STATS, ipsecstats,
struct ipsecstat, ipsec6stat, "IPsec IPv6 statistics.");
#endif /* INET6 */
+static int ipsec_in_reject(struct secpolicy *, struct mbuf *);
static int ipsec_setspidx_inpcb(struct mbuf *, struct inpcb *);
static int ipsec_setspidx(struct mbuf *, struct secpolicyindex *, int);
static void ipsec4_get_ulp(struct mbuf *m, struct secpolicyindex *, int);
@@ -1191,7 +1192,7 @@ ipsec_get_reqlevel(struct ipsecrequest *isr)
* 0: valid
* 1: invalid
*/
-int
+static int
ipsec_in_reject(struct secpolicy *sp, struct mbuf *m)
{
struct ipsecrequest *isr;
@@ -1488,6 +1489,7 @@ ipsec_chkreplay(u_int32_t seq, struct secasvar *sav)
int
ipsec_updatereplay(u_int32_t seq, struct secasvar *sav)
{
+ char buf[128];
struct secreplay *replay;
u_int32_t diff;
int fr;
@@ -1567,7 +1569,8 @@ ok:
return (1);
ipseclog((LOG_WARNING, "%s: replay counter made %d cycle. %s\n",
- __func__, replay->overflow, ipsec_logsastr(sav)));
+ __func__, replay->overflow,
+ ipsec_logsastr(sav, buf, sizeof(buf))));
}
replay->count++;
@@ -1598,67 +1601,37 @@ vshiftl(unsigned char *bitmap, int nbit, int wsize)
}
}
-#ifdef INET
-/* Return a printable string for the IPv4 address. */
-static char *
-inet_ntoa4(struct in_addr ina)
-{
- static char buf[4][4 * sizeof "123" + 4];
- unsigned char *ucp = (unsigned char *) &ina;
- static int i = 3;
-
- /* XXX-BZ Returns static buffer. */
- i = (i + 1) % 4;
- sprintf(buf[i], "%d.%d.%d.%d", ucp[0] & 0xff, ucp[1] & 0xff,
- ucp[2] & 0xff, ucp[3] & 0xff);
- return (buf[i]);
-}
-#endif
-
/* Return a printable string for the address. */
-char *
-ipsec_address(union sockaddr_union* sa)
+char*
+ipsec_address(union sockaddr_union* sa, char *buf, socklen_t size)
{
-#ifdef INET6
- char ip6buf[INET6_ADDRSTRLEN];
-#endif
switch (sa->sa.sa_family) {
#ifdef INET
case AF_INET:
- return (inet_ntoa4(sa->sin.sin_addr));
+ return (inet_ntop(AF_INET, &sa->sin.sin_addr, buf, size));
#endif /* INET */
#ifdef INET6
case AF_INET6:
- return (ip6_sprintf(ip6buf, &sa->sin6.sin6_addr));
+ return (inet_ntop(AF_INET6, &sa->sin6.sin6_addr, buf, size));
#endif /* INET6 */
default:
return ("(unknown address family)");
}
}
-const char *
-ipsec_logsastr(struct secasvar *sav)
+char *
+ipsec_logsastr(struct secasvar *sav, char *buf, size_t size)
{
- static char buf[256];
- char *p;
- struct secasindex *saidx = &sav->sah->saidx;
-
- IPSEC_ASSERT(saidx->src.sa.sa_family == saidx->dst.sa.sa_family,
- ("address family mismatch"));
-
- p = buf;
- snprintf(buf, sizeof(buf), "SA(SPI=%u ", (u_int32_t)ntohl(sav->spi));
- while (p && *p)
- p++;
- /* NB: only use ipsec_address on one address at a time. */
- snprintf(p, sizeof (buf) - (p - buf), "src=%s ",
- ipsec_address(&saidx->src));
- while (p && *p)
- p++;
- snprintf(p, sizeof (buf) - (p - buf), "dst=%s)",
- ipsec_address(&saidx->dst));
+ char sbuf[INET6_ADDRSTRLEN], dbuf[INET6_ADDRSTRLEN];
+
+ IPSEC_ASSERT(sav->sah->saidx.src.sa.sa_family ==
+ sav->sah->saidx.dst.sa.sa_family, ("address family mismatch"));
+ snprintf(buf, size, "SA(SPI=%08lx src=%s dst=%s)",
+ (u_long)ntohl(sav->spi),
+ ipsec_address(&sav->sah->saidx.src, sbuf, sizeof(sbuf)),
+ ipsec_address(&sav->sah->saidx.dst, dbuf, sizeof(dbuf)));
return (buf);
}
diff --git a/sys/netipsec/ipsec.h b/sys/netipsec/ipsec.h
index 226ef70..442387a 100644
--- a/sys/netipsec/ipsec.h
+++ b/sys/netipsec/ipsec.h
@@ -309,7 +309,6 @@ struct inpcb;
extern int ipsec_init_policy(struct socket *so, struct inpcbpolicy **);
extern int ipsec_copy_policy(struct inpcbpolicy *, struct inpcbpolicy *);
extern u_int ipsec_get_reqlevel(struct ipsecrequest *);
-extern int ipsec_in_reject(struct secpolicy *, struct mbuf *);
extern int ipsec_set_policy(struct inpcb *inp, int optname,
caddr_t request, size_t len, struct ucred *cred);
@@ -327,8 +326,8 @@ extern size_t ipsec_hdrsiz(struct mbuf *, u_int, struct inpcb *);
extern size_t ipsec_hdrsiz_tcp(struct tcpcb *);
union sockaddr_union;
-extern char * ipsec_address(union sockaddr_union* sa);
-extern const char *ipsec_logsastr(struct secasvar *);
+extern char *ipsec_address(union sockaddr_union *, char *, socklen_t);
+extern char *ipsec_logsastr(struct secasvar *, char *, size_t);
extern void ipsec_dumpmbuf(struct mbuf *);
diff --git a/sys/netipsec/ipsec_input.c b/sys/netipsec/ipsec_input.c
index 86cc5b5..5837699 100644
--- a/sys/netipsec/ipsec_input.c
+++ b/sys/netipsec/ipsec_input.c
@@ -121,6 +121,7 @@ static void ipsec4_common_ctlinput(int, struct sockaddr *, void *, int);
static int
ipsec_common_input(struct mbuf *m, int skip, int protoff, int af, int sproto)
{
+ char buf[INET6_ADDRSTRLEN];
union sockaddr_union dst_address;
struct secasvar *sav;
u_int32_t spi;
@@ -195,6 +196,13 @@ ipsec_common_input(struct mbuf *m, int skip, int protoff, int af, int sproto)
m_copydata(m, offsetof(struct ip6_hdr, ip6_dst),
sizeof(struct in6_addr),
(caddr_t) &dst_address.sin6.sin6_addr);
+ /* We keep addresses in SADB without embedded scope id */
+ if (IN6_IS_SCOPE_LINKLOCAL(&dst_address.sin6.sin6_addr)) {
+ /* XXX: sa6_recoverscope() */
+ dst_address.sin6.sin6_scope_id =
+ ntohs(dst_address.sin6.sin6_addr.s6_addr16[1]);
+ dst_address.sin6.sin6_addr.s6_addr16[1] = 0;
+ }
break;
#endif /* INET6 */
default:
@@ -208,8 +216,8 @@ ipsec_common_input(struct mbuf *m, int skip, int protoff, int af, int sproto)
sav = KEY_ALLOCSA(&dst_address, sproto, spi);
if (sav == NULL) {
DPRINTF(("%s: no key association found for SA %s/%08lx/%u\n",
- __func__, ipsec_address(&dst_address),
- (u_long) ntohl(spi), sproto));
+ __func__, ipsec_address(&dst_address, buf, sizeof(buf)),
+ (u_long) ntohl(spi), sproto));
IPSEC_ISTAT(sproto, notdb);
m_freem(m);
return ENOENT;
@@ -217,8 +225,8 @@ ipsec_common_input(struct mbuf *m, int skip, int protoff, int af, int sproto)
if (sav->tdb_xform == NULL) {
DPRINTF(("%s: attempted to use uninitialized SA %s/%08lx/%u\n",
- __func__, ipsec_address(&dst_address),
- (u_long) ntohl(spi), sproto));
+ __func__, ipsec_address(&dst_address, buf, sizeof(buf)),
+ (u_long) ntohl(spi), sproto));
IPSEC_ISTAT(sproto, noxform);
KEY_FREESAV(&sav);
m_freem(m);
@@ -320,6 +328,7 @@ int
ipsec4_common_input_cb(struct mbuf *m, struct secasvar *sav, int skip,
int protoff)
{
+ char buf[INET6_ADDRSTRLEN];
int prot, af, sproto, isr_prot;
struct ip *ip;
struct m_tag *mtag;
@@ -358,8 +367,8 @@ ipsec4_common_input_cb(struct mbuf *m, struct secasvar *sav, int skip,
*/
if (m->m_len < skip && (m = m_pullup(m, skip)) == NULL) {
DPRINTF(("%s: processing failed for SA %s/%08lx\n",
- __func__, ipsec_address(&sav->sah->saidx.dst),
- (u_long) ntohl(sav->spi)));
+ __func__, ipsec_address(&sav->sah->saidx.dst,
+ buf, sizeof(buf)), (u_long) ntohl(sav->spi)));
IPSEC_ISTAT(sproto, hdrops);
error = ENOBUFS;
goto bad;
@@ -382,6 +391,7 @@ ipsec4_common_input_cb(struct mbuf *m, struct secasvar *sav, int skip,
ipsec_bpf(m, sav, AF_INET, ENC_IN|ENC_BEFORE);
if ((error = ipsec_filter(&m, PFIL_IN, ENC_IN|ENC_BEFORE)) != 0)
return (error);
+ ip = mtod(m, struct ip *);
#endif /* DEV_ENC */
/* IP-in-IP encapsulation */
@@ -615,12 +625,13 @@ int
ipsec6_common_input_cb(struct mbuf *m, struct secasvar *sav, int skip,
int protoff)
{
+ char buf[INET6_ADDRSTRLEN];
int prot, af, sproto;
struct ip6_hdr *ip6;
struct m_tag *mtag;
struct tdb_ident *tdbi;
struct secasindex *saidx;
- int nxt;
+ int nxt, isr_prot;
u_int8_t nxt8;
int error, nest;
#ifdef notyet
@@ -651,8 +662,8 @@ ipsec6_common_input_cb(struct mbuf *m, struct secasvar *sav, int skip,
(m = m_pullup(m, sizeof(struct ip6_hdr))) == NULL) {
DPRINTF(("%s: processing failed for SA %s/%08lx\n",
- __func__, ipsec_address(&sav->sah->saidx.dst),
- (u_long) ntohl(sav->spi)));
+ __func__, ipsec_address(&sav->sah->saidx.dst, buf,
+ sizeof(buf)), (u_long) ntohl(sav->spi)));
IPSEC_ISTAT(sproto, hdrops);
error = EACCES;
@@ -796,6 +807,35 @@ ipsec6_common_input_cb(struct mbuf *m, struct secasvar *sav, int skip,
if ((error = ipsec_filter(&m, PFIL_IN, ENC_IN|ENC_AFTER)) != 0)
return (error);
#endif /* DEV_ENC */
+ if (skip == 0) {
+ /*
+ * We stripped outer IPv6 header.
+ * Now we should requeue decrypted packet via netisr.
+ */
+ switch (prot) {
+#ifdef INET
+ case IPPROTO_IPIP:
+ isr_prot = NETISR_IP;
+ break;
+#endif
+ case IPPROTO_IPV6:
+ isr_prot = NETISR_IPV6;
+ break;
+ default:
+ DPRINTF(("%s: cannot handle inner ip proto %d\n",
+ __func__, prot));
+ IPSEC_ISTAT(sproto, nopf);
+ error = EPFNOSUPPORT;
+ goto bad;
+ }
+ error = netisr_queue_src(isr_prot, (uintptr_t)sav->spi, m);
+ if (error) {
+ IPSEC_ISTAT(sproto, qfull);
+ DPRINTF(("%s: queue full; proto %u packet dropped\n",
+ __func__, sproto));
+ }
+ return (error);
+ }
/*
* See the end of ip6_input for this logic.
* IPPROTO_IPV[46] case will be processed just like other ones
diff --git a/sys/netipsec/ipsec_output.c b/sys/netipsec/ipsec_output.c
index 8e65005..ae36070 100644
--- a/sys/netipsec/ipsec_output.c
+++ b/sys/netipsec/ipsec_output.c
@@ -61,6 +61,7 @@
#include <netinet/ip6.h>
#ifdef INET6
#include <netinet6/ip6_var.h>
+#include <netinet6/scope6_var.h>
#endif
#include <netinet/in_pcb.h>
#ifdef INET6
@@ -103,6 +104,7 @@ ipsec_process_done(struct mbuf *m, struct ipsecrequest *isr)
IPSEC_ASSERT(m != NULL, ("null mbuf"));
IPSEC_ASSERT(isr != NULL, ("null ISR"));
+ IPSEC_ASSERT(isr->sp != NULL, ("NULL isr->sp"));
sav = isr->sav;
IPSEC_ASSERT(sav != NULL, ("null SA"));
IPSEC_ASSERT(sav->sah != NULL, ("null SAH"));
@@ -162,6 +164,10 @@ ipsec_process_done(struct mbuf *m, struct ipsecrequest *isr)
* If this is a problem we'll need to introduce a queue
* to set the packet on so we can unwind the stack before
* doing further processing.
+ *
+ * If ipsec[46]_process_packet() will successfully queue
+ * the request, we need to take additional reference to SP,
+ * because xform callback will release reference.
*/
if (isr->next) {
/* XXX-BZ currently only support same AF bundles. */
@@ -169,7 +175,11 @@ ipsec_process_done(struct mbuf *m, struct ipsecrequest *isr)
#ifdef INET
case AF_INET:
IPSECSTAT_INC(ips_out_bundlesa);
- return ipsec4_process_packet(m, isr->next);
+ key_addref(isr->sp);
+ error = ipsec4_process_packet(m, isr->next);
+ if (error != 0)
+ KEY_FREESP(&isr->sp);
+ return (error);
/* NOTREACHED */
#endif
#ifdef notyet
@@ -177,7 +187,11 @@ ipsec_process_done(struct mbuf *m, struct ipsecrequest *isr)
case AF_INET6:
/* XXX */
IPSEC6STAT_INC(ips_out_bundlesa);
- return ipsec6_process_packet(m, isr->next);
+ key_addref(isr->sp);
+ error = ipsec6_process_packet(m, isr->next);
+ if (error != 0)
+ KEY_FREESP(&isr->sp);
+ return (error);
/* NOTREACHED */
#endif /* INET6 */
#endif
@@ -192,8 +206,7 @@ ipsec_process_done(struct mbuf *m, struct ipsecrequest *isr)
/*
* We're done with IPsec processing, transmit the packet using the
- * appropriate network protocol (IP or IPv6). SPD lookup will be
- * performed again there.
+ * appropriate network protocol (IP or IPv6).
*/
switch (saidx->dst.sa.sa_family) {
#ifdef INET
@@ -419,6 +432,108 @@ bad:
#undef IPSEC_OSTAT
}
+static int
+ipsec_encap(struct mbuf **mp, struct secasindex *saidx)
+{
+#ifdef INET6
+ struct ip6_hdr *ip6;
+#endif
+ struct ip *ip;
+ int setdf;
+ uint8_t itos, proto;
+
+ ip = mtod(*mp, struct ip *);
+ switch (ip->ip_v) {
+#ifdef INET
+ case IPVERSION:
+ proto = IPPROTO_IPIP;
+ /*
+ * Collect IP_DF state from the inner header
+ * and honor system-wide control of how to handle it.
+ */
+ switch (V_ip4_ipsec_dfbit) {
+ case 0: /* clear in outer header */
+ case 1: /* set in outer header */
+ setdf = V_ip4_ipsec_dfbit;
+ break;
+ default:/* propagate to outer header */
+ setdf = (ip->ip_off & ntohs(IP_DF)) != 0;
+ }
+ itos = ip->ip_tos;
+ break;
+#endif
+#ifdef INET6
+ case (IPV6_VERSION >> 4):
+ proto = IPPROTO_IPV6;
+ ip6 = mtod(*mp, struct ip6_hdr *);
+ itos = (ntohl(ip6->ip6_flow) >> 20) & 0xff;
+ setdf = V_ip4_ipsec_dfbit ? 1: 0;
+ /* scoped address handling */
+ in6_clearscope(&ip6->ip6_src);
+ in6_clearscope(&ip6->ip6_dst);
+ break;
+#endif
+ default:
+ return (EAFNOSUPPORT);
+ }
+ switch (saidx->dst.sa.sa_family) {
+#ifdef INET
+ case AF_INET:
+ if (saidx->src.sa.sa_family != AF_INET ||
+ saidx->src.sin.sin_addr.s_addr == INADDR_ANY ||
+ saidx->dst.sin.sin_addr.s_addr == INADDR_ANY)
+ return (EINVAL);
+ M_PREPEND(*mp, sizeof(struct ip), M_NOWAIT);
+ if (*mp == NULL)
+ return (ENOBUFS);
+ ip = mtod(*mp, struct ip *);
+ ip->ip_v = IPVERSION;
+ ip->ip_hl = sizeof(struct ip) >> 2;
+ ip->ip_p = proto;
+ ip->ip_len = htons((*mp)->m_pkthdr.len);
+ ip->ip_ttl = V_ip_defttl;
+ ip->ip_sum = 0;
+ ip->ip_off = setdf ? htons(IP_DF): 0;
+ ip->ip_src = saidx->src.sin.sin_addr;
+ ip->ip_dst = saidx->dst.sin.sin_addr;
+ ip_ecn_ingress(V_ip4_ipsec_ecn, &ip->ip_tos, &itos);
+ ip_fillid(ip);
+ break;
+#endif /* INET */
+#ifdef INET6
+ case AF_INET6:
+ if (saidx->src.sa.sa_family != AF_INET6 ||
+ IN6_IS_ADDR_UNSPECIFIED(&saidx->src.sin6.sin6_addr) ||
+ IN6_IS_ADDR_UNSPECIFIED(&saidx->dst.sin6.sin6_addr))
+ return (EINVAL);
+ M_PREPEND(*mp, sizeof(struct ip6_hdr), M_NOWAIT);
+ if (*mp == NULL)
+ return (ENOBUFS);
+ ip6 = mtod(*mp, struct ip6_hdr *);
+ ip6->ip6_flow = 0;
+ ip6->ip6_vfc = IPV6_VERSION;
+ ip6->ip6_hlim = V_ip6_defhlim;
+ ip6->ip6_nxt = proto;
+ ip6->ip6_dst = saidx->dst.sin6.sin6_addr;
+ /* For link-local address embed scope zone id */
+ if (IN6_IS_SCOPE_LINKLOCAL(&ip6->ip6_dst))
+ ip6->ip6_dst.s6_addr16[1] =
+ htons(saidx->dst.sin6.sin6_scope_id & 0xffff);
+ ip6->ip6_src = saidx->src.sin6.sin6_addr;
+ if (IN6_IS_SCOPE_LINKLOCAL(&ip6->ip6_src))
+ ip6->ip6_src.s6_addr16[1] =
+ htons(saidx->src.sin6.sin6_scope_id & 0xffff);
+ ip6->ip6_plen = htons((*mp)->m_pkthdr.len - sizeof(*ip6));
+ ip_ecn_ingress(V_ip6_ipsec_ecn, &proto, &itos);
+ ip6->ip6_flow |= htonl((uint32_t)proto << 20);
+ break;
+#endif /* INET6 */
+ default:
+ return (EAFNOSUPPORT);
+ }
+ return (0);
+}
+
#ifdef INET
/*
* IPsec output logic for IPv4.
@@ -426,11 +541,12 @@ bad:
int
ipsec4_process_packet(struct mbuf *m, struct ipsecrequest *isr)
{
+ char sbuf[INET6_ADDRSTRLEN], dbuf[INET6_ADDRSTRLEN];
union sockaddr_union *dst;
struct secasindex saidx;
struct secasvar *sav;
struct ip *ip;
- int error, i, off, setdf;
+ int error, i, off;
IPSEC_ASSERT(m != NULL, ("null mbuf"));
IPSEC_ASSERT(isr != NULL, ("null isr"));
@@ -461,57 +577,29 @@ ipsec4_process_packet(struct mbuf *m, struct ipsecrequest *isr)
/* pass the mbuf to enc0 for packet filtering */
if ((error = ipsec_filter(&m, PFIL_OUT, ENC_OUT|ENC_BEFORE)) != 0)
goto bad;
+ ip = mtod(m, struct ip *);
#endif
/* Do the appropriate encapsulation, if necessary */
if (isr->saidx.mode == IPSEC_MODE_TUNNEL || /* Tunnel requ'd */
dst->sa.sa_family != AF_INET || /* PF mismatch */
-#if 0
- (sav->flags & SADB_X_SAFLAGS_TUNNEL) || /* Tunnel requ'd */
- sav->tdb_xform->xf_type == XF_IP4 || /* ditto */
-#endif
(dst->sa.sa_family == AF_INET && /* Proxy */
dst->sin.sin_addr.s_addr != INADDR_ANY &&
dst->sin.sin_addr.s_addr != ip->ip_dst.s_addr)) {
- struct mbuf *mp;
-
/* Fix IPv4 header checksum and length */
ip->ip_len = htons(m->m_pkthdr.len);
ip->ip_sum = 0;
ip->ip_sum = in_cksum(m, ip->ip_hl << 2);
- /*
- * Collect IP_DF state from the outer header
- * and honor system-wide control of how to handle it.
- */
- switch (V_ip4_ipsec_dfbit) {
- case 0: /* clear in outer header */
- case 1: /* set in outer header */
- setdf = V_ip4_ipsec_dfbit;
- break;
- default: /* propagate to outer header */
- setdf = ntohs(ip->ip_off & IP_DF);
- }
- /* Encapsulate the packet */
- error = ipip_output(m, isr, &mp, 0, 0);
+ error = ipsec_encap(&m, &sav->sah->saidx);
if (error != 0) {
- m = NULL; /* ipip_output() already freed it */
+ DPRINTF(("%s: encapsulation for SA %s->%s "
+ "SPI 0x%08x failed with error %d\n", __func__,
+ ipsec_address(&sav->sah->saidx.src, sbuf,
+ sizeof(sbuf)),
+ ipsec_address(&sav->sah->saidx.dst, dbuf,
+ sizeof(dbuf)), ntohl(sav->spi), error));
goto bad;
}
- m = mp;
- /*
- * ipip_output clears IP_DF in the new header. If
- * we need to propagate IP_DF from the outer header,
- * then we have to do it here.
- *
- * XXX shouldn't assume what ipip_output does.
- */
- if (dst->sa.sa_family == AF_INET && setdf) {
- ip = mtod(m, struct ip *);
- ip->ip_off = ntohs(ip->ip_off);
- ip->ip_off |= IP_DF;
- ip->ip_off = htons(ip->ip_off);
- }
}
-
#ifdef DEV_ENC
/* pass the mbuf to enc0 for bpf processing */
ipsec_bpf(m, sav, sav->sah->saidx.dst.sa.sa_family, ENC_OUT|ENC_AFTER);
@@ -523,40 +611,33 @@ ipsec4_process_packet(struct mbuf *m, struct ipsecrequest *isr)
/*
* Dispatch to the appropriate IPsec transform logic. The
* packet will be returned for transmission after crypto
- * processing, etc. are completed. For encapsulation we
- * bypass this call because of the explicit call done above
- * (necessary to deal with IP_DF handling for IPv4).
+ * processing, etc. are completed.
*
* NB: m & sav are ``passed to caller'' who's reponsible for
* for reclaiming their resources.
*/
- if (sav->tdb_xform->xf_type != XF_IP4) {
- union sockaddr_union *dst = &sav->sah->saidx.dst;
- switch(dst->sa.sa_family) {
- case AF_INET:
- ip = mtod(m, struct ip *);
- i = ip->ip_hl << 2;
- off = offsetof(struct ip, ip_p);
- break;
+ switch(dst->sa.sa_family) {
+ case AF_INET:
+ ip = mtod(m, struct ip *);
+ i = ip->ip_hl << 2;
+ off = offsetof(struct ip, ip_p);
+ break;
#ifdef INET6
- case AF_INET6:
- i = sizeof(struct ip6_hdr);
- off = offsetof(struct ip6_hdr, ip6_nxt);
- break;
+ case AF_INET6:
+ i = sizeof(struct ip6_hdr);
+ off = offsetof(struct ip6_hdr, ip6_nxt);
+ break;
#endif /* INET6 */
- default:
+ default:
DPRINTF(("%s: unsupported protocol family %u\n",
- __func__, dst->sa.sa_family));
- error = EPFNOSUPPORT;
- IPSECSTAT_INC(ips_out_inval);
- goto bad;
- }
- error = (*sav->tdb_xform->xf_output)(m, isr, NULL, i, off);
- } else {
- error = ipsec_process_done(m, isr);
+ __func__, dst->sa.sa_family));
+ error = EPFNOSUPPORT;
+ IPSECSTAT_INC(ips_out_inval);
+ goto bad;
}
+ error = (*sav->tdb_xform->xf_output)(m, isr, NULL, i, off);
IPSECREQUEST_UNLOCK(isr);
- return error;
+ return (error);
bad:
if (isr)
IPSECREQUEST_UNLOCK(isr);
@@ -584,11 +665,9 @@ in6_sa_equal_addrwithscope(const struct sockaddr_in6 *sa, const struct in6_addr
* IPsec output logic for IPv6.
*/
int
-ipsec6_process_packet(
- struct mbuf *m,
- struct ipsecrequest *isr
- )
+ipsec6_process_packet(struct mbuf *m, struct ipsecrequest *isr)
{
+ char sbuf[INET6_ADDRSTRLEN], dbuf[INET6_ADDRSTRLEN];
struct secasindex saidx;
struct secasvar *sav;
struct ip6_hdr *ip6;
@@ -606,7 +685,6 @@ ipsec6_process_packet(
goto bad;
return EJUSTRETURN;
}
-
sav = isr->sav;
dst = &sav->sah->saidx.dst;
@@ -621,6 +699,7 @@ ipsec6_process_packet(
/* pass the mbuf to enc0 for packet filtering */
if ((error = ipsec_filter(&m, PFIL_OUT, ENC_OUT|ENC_BEFORE)) != 0)
goto bad;
+ ip6 = mtod(m, struct ip6_hdr *);
#endif /* DEV_ENC */
/* Do the appropriate encapsulation, if necessary */
@@ -630,42 +709,21 @@ ipsec6_process_packet(
(!IN6_IS_ADDR_UNSPECIFIED(&dst->sin6.sin6_addr)) &&
(!in6_sa_equal_addrwithscope(&dst->sin6,
&ip6->ip6_dst)))) {
- struct mbuf *mp;
-
- /* Fix IPv6 header payload length. */
- if (m->m_len < sizeof(struct ip6_hdr))
- if ((m = m_pullup(m,sizeof(struct ip6_hdr))) == NULL) {
- error = ENOBUFS;
- goto bad;
- }
-
if (m->m_pkthdr.len - sizeof(*ip6) > IPV6_MAXPACKET) {
/* No jumbogram support. */
error = ENXIO; /*XXX*/
goto bad;
}
-
- /* Encapsulate the packet */
- error = ipip_output(m, isr, &mp, 0, 0);
- if (mp == NULL && !error) {
- /* Should never happen. */
- DPRINTF(("ipsec6_process_packet: ipip_output "
- "returns no mbuf and no error!"));
- error = EFAULT;
- goto bad;
- }
-
- if (error) {
- if (mp) {
- /* XXX: Should never happen! */
- m_freem(mp);
- }
- m = NULL; /* ipip_output() already freed it */
+ error = ipsec_encap(&m, &sav->sah->saidx);
+ if (error != 0) {
+ DPRINTF(("%s: encapsulation for SA %s->%s "
+ "SPI 0x%08x failed with error %d\n", __func__,
+ ipsec_address(&sav->sah->saidx.src, sbuf,
+ sizeof(sbuf)),
+ ipsec_address(&sav->sah->saidx.dst, dbuf,
+ sizeof(dbuf)), ntohl(sav->spi), error));
goto bad;
}
-
- m = mp;
- mp = NULL;
}
#ifdef DEV_ENC
diff --git a/sys/netipsec/key.c b/sys/netipsec/key.c
index a19adab..353dd32 100644
--- a/sys/netipsec/key.c
+++ b/sys/netipsec/key.c
@@ -3856,48 +3856,19 @@ key_ismyaddr(struct sockaddr *sa)
* compare my own address for IPv6.
* 1: ours
* 0: other
- * NOTE: derived ip6_input() in KAME. This is necessary to modify more.
*/
-#include <netinet6/in6_var.h>
-
static int
key_ismyaddr6(struct sockaddr_in6 *sin6)
{
- struct in6_ifaddr *ia;
-#if 0
- struct in6_multi *in6m;
-#endif
+ struct in6_addr in6;
- IN6_IFADDR_RLOCK();
- TAILQ_FOREACH(ia, &V_in6_ifaddrhead, ia_link) {
- if (key_sockaddrcmp((struct sockaddr *)sin6,
- (struct sockaddr *)&ia->ia_addr, 0) == 0) {
- IN6_IFADDR_RUNLOCK();
- return 1;
- }
+ if (!IN6_IS_SCOPE_LINKLOCAL(&sin6->sin6_addr))
+ return (in6_localip(&sin6->sin6_addr));
-#if 0
- /*
- * XXX Multicast
- * XXX why do we care about multlicast here while we don't care
- * about IPv4 multicast??
- * XXX scope
- */
- in6m = NULL;
- IN6_LOOKUP_MULTI(sin6->sin6_addr, ia->ia_ifp, in6m);
- if (in6m) {
- IN6_IFADDR_RUNLOCK();
- return 1;
- }
-#endif
- }
- IN6_IFADDR_RUNLOCK();
-
- /* loopback, just for safety */
- if (IN6_IS_ADDR_LOOPBACK(&sin6->sin6_addr))
- return 1;
-
- return 0;
+ /* Convert address into kernel-internal form */
+ in6 = sin6->sin6_addr;
+ in6.s6_addr16[1] = htons(sin6->sin6_scope_id & 0xffff);
+ return (in6_localip(&in6));
}
#endif /*INET6*/
diff --git a/sys/netipsec/xform.h b/sys/netipsec/xform.h
index a6bce34..132717f 100644
--- a/sys/netipsec/xform.h
+++ b/sys/netipsec/xform.h
@@ -83,7 +83,7 @@ struct ipescrequest;
struct xformsw {
u_short xf_type; /* xform ID */
-#define XF_IP4 1 /* IP inside IP */
+#define XF_IP4 1 /* unused */
#define XF_AH 2 /* AH */
#define XF_ESP 3 /* ESP */
#define XF_TCPSIGNATURE 5 /* TCP MD5 Signature option, RFC 2358 */
@@ -108,10 +108,6 @@ extern int xform_init(struct secasvar *sav, int xftype);
struct cryptoini;
-/* XF_IP4 */
-extern int ipip_output(struct mbuf *, struct ipsecrequest *,
- struct mbuf **, int, int);
-
/* XF_AH */
extern int ah_init0(struct secasvar *, struct xformsw *, struct cryptoini *);
extern int ah_zeroize(struct secasvar *sav);
diff --git a/sys/netipsec/xform_ah.c b/sys/netipsec/xform_ah.c
index 292dba2..8f791db 100644
--- a/sys/netipsec/xform_ah.c
+++ b/sys/netipsec/xform_ah.c
@@ -567,6 +567,7 @@ ah_massage_headers(struct mbuf **m0, int proto, int skip, int alg, int out)
static int
ah_input(struct mbuf *m, struct secasvar *sav, int skip, int protoff)
{
+ char buf[128];
struct auth_hash *ahx;
struct tdb_crypto *tc;
struct newah *ah;
@@ -596,7 +597,7 @@ ah_input(struct mbuf *m, struct secasvar *sav, int skip, int protoff)
if (sav->replay && !ipsec_chkreplay(ntohl(ah->ah_seq), sav)) {
AHSTAT_INC(ahs_replay);
DPRINTF(("%s: packet replay failure: %s\n", __func__,
- ipsec_logsastr(sav)));
+ ipsec_logsastr(sav, buf, sizeof(buf))));
m_freem(m);
return ENOBUFS;
}
@@ -607,10 +608,10 @@ ah_input(struct mbuf *m, struct secasvar *sav, int skip, int protoff)
authsize = AUTHSIZE(sav);
if (hl != authsize + rplen - sizeof (struct ah)) {
DPRINTF(("%s: bad authenticator length %u (expecting %lu)"
- " for packet in SA %s/%08lx\n", __func__,
- hl, (u_long) (authsize + rplen - sizeof (struct ah)),
- ipsec_address(&sav->sah->saidx.dst),
- (u_long) ntohl(sav->spi)));
+ " for packet in SA %s/%08lx\n", __func__, hl,
+ (u_long) (authsize + rplen - sizeof (struct ah)),
+ ipsec_address(&sav->sah->saidx.dst, buf, sizeof(buf)),
+ (u_long) ntohl(sav->spi)));
AHSTAT_INC(ahs_badauthl);
m_freem(m);
return EACCES;
@@ -695,6 +696,7 @@ ah_input(struct mbuf *m, struct secasvar *sav, int skip, int protoff)
static int
ah_input_cb(struct cryptop *crp)
{
+ char buf[INET6_ADDRSTRLEN];
int rplen, error, skip, protoff;
unsigned char calc[AH_ALEN_MAX];
struct mbuf *m;
@@ -764,7 +766,7 @@ ah_input_cb(struct cryptop *crp)
if (bcmp(ptr + skip + rplen, calc, authsize)) {
DPRINTF(("%s: authentication hash mismatch for packet "
"in SA %s/%08lx\n", __func__,
- ipsec_address(&saidx->dst),
+ ipsec_address(&saidx->dst, buf, sizeof(buf)),
(u_long) ntohl(sav->spi)));
AHSTAT_INC(ahs_badauth);
error = EACCES;
@@ -803,8 +805,8 @@ ah_input_cb(struct cryptop *crp)
error = m_striphdr(m, skip, rplen + authsize);
if (error) {
DPRINTF(("%s: mangled mbuf chain for SA %s/%08lx\n", __func__,
- ipsec_address(&saidx->dst), (u_long) ntohl(sav->spi)));
-
+ ipsec_address(&saidx->dst, buf, sizeof(buf)),
+ (u_long) ntohl(sav->spi)));
AHSTAT_INC(ahs_hdrops);
goto bad;
}
@@ -843,13 +845,10 @@ bad:
* AH output routine, called by ipsec[46]_process_packet().
*/
static int
-ah_output(
- struct mbuf *m,
- struct ipsecrequest *isr,
- struct mbuf **mp,
- int skip,
- int protoff)
+ah_output(struct mbuf *m, struct ipsecrequest *isr, struct mbuf **mp,
+ int skip, int protoff)
{
+ char buf[INET6_ADDRSTRLEN];
struct secasvar *sav;
struct auth_hash *ahx;
struct cryptodesc *crda;
@@ -887,7 +886,7 @@ ah_output(
DPRINTF(("%s: unknown/unsupported protocol family %u, "
"SA %s/%08lx\n", __func__,
sav->sah->saidx.dst.sa.sa_family,
- ipsec_address(&sav->sah->saidx.dst),
+ ipsec_address(&sav->sah->saidx.dst, buf, sizeof(buf)),
(u_long) ntohl(sav->spi)));
AHSTAT_INC(ahs_nopf);
error = EPFNOSUPPORT;
@@ -897,7 +896,7 @@ ah_output(
if (rplen + authsize + m->m_pkthdr.len > maxpacketsize) {
DPRINTF(("%s: packet in SA %s/%08lx got too big "
"(len %u, max len %u)\n", __func__,
- ipsec_address(&sav->sah->saidx.dst),
+ ipsec_address(&sav->sah->saidx.dst, buf, sizeof(buf)),
(u_long) ntohl(sav->spi),
rplen + authsize + m->m_pkthdr.len, maxpacketsize));
AHSTAT_INC(ahs_toobig);
@@ -911,7 +910,7 @@ ah_output(
m = m_unshare(m, M_NOWAIT);
if (m == NULL) {
DPRINTF(("%s: cannot clone mbuf chain, SA %s/%08lx\n", __func__,
- ipsec_address(&sav->sah->saidx.dst),
+ ipsec_address(&sav->sah->saidx.dst, buf, sizeof(buf)),
(u_long) ntohl(sav->spi)));
AHSTAT_INC(ahs_hdrops);
error = ENOBUFS;
@@ -924,7 +923,7 @@ ah_output(
DPRINTF(("%s: failed to inject %u byte AH header for SA "
"%s/%08lx\n", __func__,
rplen + authsize,
- ipsec_address(&sav->sah->saidx.dst),
+ ipsec_address(&sav->sah->saidx.dst, buf, sizeof(buf)),
(u_long) ntohl(sav->spi)));
AHSTAT_INC(ahs_hdrops); /*XXX differs from openbsd */
error = ENOBUFS;
@@ -951,9 +950,8 @@ ah_output(
if (sav->replay->count == ~0 &&
(sav->flags & SADB_X_EXT_CYCSEQ) == 0) {
DPRINTF(("%s: replay counter wrapped for SA %s/%08lx\n",
- __func__,
- ipsec_address(&sav->sah->saidx.dst),
- (u_long) ntohl(sav->spi)));
+ __func__, ipsec_address(&sav->sah->saidx.dst, buf,
+ sizeof(buf)), (u_long) ntohl(sav->spi)));
AHSTAT_INC(ahs_wrap);
error = EINVAL;
goto bad;
@@ -1093,6 +1091,7 @@ ah_output_cb(struct cryptop *crp)
m = (struct mbuf *) crp->crp_buf;
isr = tc->tc_isr;
+ IPSEC_ASSERT(isr->sp != NULL, ("NULL isr->sp"));
IPSECREQUEST_LOCK(isr);
sav = tc->tc_sav;
/* With the isr lock released SA pointer can be updated. */
@@ -1156,16 +1155,18 @@ ah_output_cb(struct cryptop *crp)
error = ipsec_process_done(m, isr);
KEY_FREESAV(&sav);
IPSECREQUEST_UNLOCK(isr);
- return error;
+ KEY_FREESP(&isr->sp);
+ return (error);
bad:
if (sav)
KEY_FREESAV(&sav);
IPSECREQUEST_UNLOCK(isr);
+ KEY_FREESP(&isr->sp);
if (m)
m_freem(m);
free(tc, M_XDATA);
crypto_freereq(crp);
- return error;
+ return (error);
}
static struct xformsw ah_xformsw = {
diff --git a/sys/netipsec/xform_esp.c b/sys/netipsec/xform_esp.c
index cc95996..003c514 100644
--- a/sys/netipsec/xform_esp.c
+++ b/sys/netipsec/xform_esp.c
@@ -268,6 +268,7 @@ esp_zeroize(struct secasvar *sav)
static int
esp_input(struct mbuf *m, struct secasvar *sav, int skip, int protoff)
{
+ char buf[128];
struct auth_hash *esph;
struct enc_xform *espx;
struct tdb_crypto *tc;
@@ -326,9 +327,8 @@ esp_input(struct mbuf *m, struct secasvar *sav, int skip, int protoff)
if ((plen & (espx->blocksize - 1)) || (plen <= 0)) {
DPRINTF(("%s: payload of %d octets not a multiple of %d octets,"
" SA %s/%08lx\n", __func__,
- plen, espx->blocksize,
- ipsec_address(&sav->sah->saidx.dst),
- (u_long) ntohl(sav->spi)));
+ plen, espx->blocksize, ipsec_address(&sav->sah->saidx.dst,
+ buf, sizeof(buf)), (u_long) ntohl(sav->spi)));
ESPSTAT_INC(esps_badilen);
m_freem(m);
return EINVAL;
@@ -340,7 +340,7 @@ esp_input(struct mbuf *m, struct secasvar *sav, int skip, int protoff)
if (esph != NULL && sav->replay != NULL &&
!ipsec_chkreplay(ntohl(esp->esp_seq), sav)) {
DPRINTF(("%s: packet replay check for %s\n", __func__,
- ipsec_logsastr(sav))); /*XXX*/
+ ipsec_logsastr(sav, buf, sizeof(buf)))); /*XXX*/
ESPSTAT_INC(esps_replay);
m_freem(m);
return ENOBUFS; /*XXX*/
@@ -431,6 +431,7 @@ esp_input(struct mbuf *m, struct secasvar *sav, int skip, int protoff)
static int
esp_input_cb(struct cryptop *crp)
{
+ char buf[128];
u_int8_t lastthree[3], aalg[AH_HMAC_MAXHASHLEN];
int hlen, skip, protoff, error, alen;
struct mbuf *m;
@@ -507,7 +508,7 @@ esp_input_cb(struct cryptop *crp)
if (bcmp(ptr, aalg, alen) != 0) {
DPRINTF(("%s: authentication hash mismatch for "
"packet in SA %s/%08lx\n", __func__,
- ipsec_address(&saidx->dst),
+ ipsec_address(&saidx->dst, buf, sizeof(buf)),
(u_long) ntohl(sav->spi)));
ESPSTAT_INC(esps_badauth);
error = EACCES;
@@ -537,7 +538,7 @@ esp_input_cb(struct cryptop *crp)
sizeof (seq), (caddr_t) &seq);
if (ipsec_updatereplay(ntohl(seq), sav)) {
DPRINTF(("%s: packet replay check for %s\n", __func__,
- ipsec_logsastr(sav)));
+ ipsec_logsastr(sav, buf, sizeof(buf))));
ESPSTAT_INC(esps_replay);
error = ENOBUFS;
goto bad;
@@ -555,7 +556,7 @@ esp_input_cb(struct cryptop *crp)
if (error) {
ESPSTAT_INC(esps_hdrops);
DPRINTF(("%s: bad mbuf chain, SA %s/%08lx\n", __func__,
- ipsec_address(&sav->sah->saidx.dst),
+ ipsec_address(&sav->sah->saidx.dst, buf, sizeof(buf)),
(u_long) ntohl(sav->spi)));
goto bad;
}
@@ -567,10 +568,10 @@ esp_input_cb(struct cryptop *crp)
if (lastthree[1] + 2 > m->m_pkthdr.len - skip) {
ESPSTAT_INC(esps_badilen);
DPRINTF(("%s: invalid padding length %d for %u byte packet "
- "in SA %s/%08lx\n", __func__,
- lastthree[1], m->m_pkthdr.len - skip,
- ipsec_address(&sav->sah->saidx.dst),
- (u_long) ntohl(sav->spi)));
+ "in SA %s/%08lx\n", __func__, lastthree[1],
+ m->m_pkthdr.len - skip,
+ ipsec_address(&sav->sah->saidx.dst, buf, sizeof(buf)),
+ (u_long) ntohl(sav->spi)));
error = EINVAL;
goto bad;
}
@@ -580,9 +581,9 @@ esp_input_cb(struct cryptop *crp)
if (lastthree[1] != lastthree[0] && lastthree[1] != 0) {
ESPSTAT_INC(esps_badenc);
DPRINTF(("%s: decryption failed for packet in "
- "SA %s/%08lx\n", __func__,
- ipsec_address(&sav->sah->saidx.dst),
- (u_long) ntohl(sav->spi)));
+ "SA %s/%08lx\n", __func__, ipsec_address(
+ &sav->sah->saidx.dst, buf, sizeof(buf)),
+ (u_long) ntohl(sav->spi)));
error = EINVAL;
goto bad;
}
@@ -628,14 +629,10 @@ bad:
* ESP output routine, called by ipsec[46]_process_packet().
*/
static int
-esp_output(
- struct mbuf *m,
- struct ipsecrequest *isr,
- struct mbuf **mp,
- int skip,
- int protoff
-)
+esp_output(struct mbuf *m, struct ipsecrequest *isr, struct mbuf **mp,
+ int skip, int protoff)
{
+ char buf[INET6_ADDRSTRLEN];
struct enc_xform *espx;
struct auth_hash *esph;
int hlen, rlen, padding, blks, alen, i, roff;
@@ -703,8 +700,8 @@ esp_output(
default:
DPRINTF(("%s: unknown/unsupported protocol "
"family %d, SA %s/%08lx\n", __func__,
- saidx->dst.sa.sa_family, ipsec_address(&saidx->dst),
- (u_long) ntohl(sav->spi)));
+ saidx->dst.sa.sa_family, ipsec_address(&saidx->dst,
+ buf, sizeof(buf)), (u_long) ntohl(sav->spi)));
ESPSTAT_INC(esps_nopf);
error = EPFNOSUPPORT;
goto bad;
@@ -712,7 +709,8 @@ esp_output(
if (skip + hlen + rlen + padding + alen > maxpacketsize) {
DPRINTF(("%s: packet in SA %s/%08lx got too big "
"(len %u, max len %u)\n", __func__,
- ipsec_address(&saidx->dst), (u_long) ntohl(sav->spi),
+ ipsec_address(&saidx->dst, buf, sizeof(buf)),
+ (u_long) ntohl(sav->spi),
skip + hlen + rlen + padding + alen, maxpacketsize));
ESPSTAT_INC(esps_toobig);
error = EMSGSIZE;
@@ -725,7 +723,8 @@ esp_output(
m = m_unshare(m, M_NOWAIT);
if (m == NULL) {
DPRINTF(("%s: cannot clone mbuf chain, SA %s/%08lx\n", __func__,
- ipsec_address(&saidx->dst), (u_long) ntohl(sav->spi)));
+ ipsec_address(&saidx->dst, buf, sizeof(buf)),
+ (u_long) ntohl(sav->spi)));
ESPSTAT_INC(esps_hdrops);
error = ENOBUFS;
goto bad;
@@ -735,8 +734,8 @@ esp_output(
mo = m_makespace(m, skip, hlen, &roff);
if (mo == NULL) {
DPRINTF(("%s: %u byte ESP hdr inject failed for SA %s/%08lx\n",
- __func__, hlen, ipsec_address(&saidx->dst),
- (u_long) ntohl(sav->spi)));
+ __func__, hlen, ipsec_address(&saidx->dst, buf,
+ sizeof(buf)), (u_long) ntohl(sav->spi)));
ESPSTAT_INC(esps_hdrops); /* XXX diffs from openbsd */
error = ENOBUFS;
goto bad;
@@ -765,7 +764,8 @@ esp_output(
pad = (u_char *) m_pad(m, padding + alen);
if (pad == NULL) {
DPRINTF(("%s: m_pad failed for SA %s/%08lx\n", __func__,
- ipsec_address(&saidx->dst), (u_long) ntohl(sav->spi)));
+ ipsec_address(&saidx->dst, buf, sizeof(buf)),
+ (u_long) ntohl(sav->spi)));
m = NULL; /* NB: free'd by m_pad */
error = ENOBUFS;
goto bad;
@@ -876,6 +876,7 @@ bad:
static int
esp_output_cb(struct cryptop *crp)
{
+ char buf[INET6_ADDRSTRLEN];
struct tdb_crypto *tc;
struct ipsecrequest *isr;
struct secasvar *sav;
@@ -887,13 +888,14 @@ esp_output_cb(struct cryptop *crp)
m = (struct mbuf *) crp->crp_buf;
isr = tc->tc_isr;
+ IPSEC_ASSERT(isr->sp != NULL, ("NULL isr->sp"));
IPSECREQUEST_LOCK(isr);
sav = tc->tc_sav;
/* With the isr lock released SA pointer can be updated. */
if (sav != isr->sav) {
ESPSTAT_INC(esps_notdb);
DPRINTF(("%s: SA gone during crypto (SA %s/%08lx proto %u)\n",
- __func__, ipsec_address(&tc->tc_dst),
+ __func__, ipsec_address(&tc->tc_dst, buf, sizeof(buf)),
(u_long) ntohl(tc->tc_spi), tc->tc_proto));
error = ENOBUFS; /*XXX*/
goto bad;
@@ -965,16 +967,18 @@ esp_output_cb(struct cryptop *crp)
error = ipsec_process_done(m, isr);
KEY_FREESAV(&sav);
IPSECREQUEST_UNLOCK(isr);
- return error;
+ KEY_FREESP(&isr->sp);
+ return (error);
bad:
if (sav)
KEY_FREESAV(&sav);
IPSECREQUEST_UNLOCK(isr);
+ KEY_FREESP(&isr->sp);
if (m)
m_freem(m);
free(tc, M_XDATA);
crypto_freereq(crp);
- return error;
+ return (error);
}
static struct xformsw esp_xformsw = {
diff --git a/sys/netipsec/xform_ipcomp.c b/sys/netipsec/xform_ipcomp.c
index e7035cb..ef460cd 100644
--- a/sys/netipsec/xform_ipcomp.c
+++ b/sys/netipsec/xform_ipcomp.c
@@ -224,6 +224,7 @@ ipcomp_input(struct mbuf *m, struct secasvar *sav, int skip, int protoff)
static int
ipcomp_input_cb(struct cryptop *crp)
{
+ char buf[INET6_ADDRSTRLEN];
struct cryptodesc *crd;
struct tdb_crypto *tc;
int skip, protoff;
@@ -298,8 +299,8 @@ ipcomp_input_cb(struct cryptop *crp)
if (error) {
IPCOMPSTAT_INC(ipcomps_hdrops);
DPRINTF(("%s: bad mbuf chain, IPCA %s/%08lx\n", __func__,
- ipsec_address(&sav->sah->saidx.dst),
- (u_long) ntohl(sav->spi)));
+ ipsec_address(&sav->sah->saidx.dst, buf, sizeof(buf)),
+ (u_long) ntohl(sav->spi)));
goto bad;
}
@@ -340,14 +341,10 @@ bad:
* IPComp output routine, called by ipsec[46]_process_packet()
*/
static int
-ipcomp_output(
- struct mbuf *m,
- struct ipsecrequest *isr,
- struct mbuf **mp,
- int skip,
- int protoff
-)
+ipcomp_output(struct mbuf *m, struct ipsecrequest *isr, struct mbuf **mp,
+ int skip, int protoff)
{
+ char buf[INET6_ADDRSTRLEN];
struct secasvar *sav;
struct comp_algo *ipcompx;
int error, ralen, maxpacketsize;
@@ -391,7 +388,7 @@ ipcomp_output(
DPRINTF(("%s: unknown/unsupported protocol family %d, "
"IPCA %s/%08lx\n", __func__,
sav->sah->saidx.dst.sa.sa_family,
- ipsec_address(&sav->sah->saidx.dst),
+ ipsec_address(&sav->sah->saidx.dst, buf, sizeof(buf)),
(u_long) ntohl(sav->spi)));
error = EPFNOSUPPORT;
goto bad;
@@ -400,7 +397,7 @@ ipcomp_output(
IPCOMPSTAT_INC(ipcomps_toobig);
DPRINTF(("%s: packet in IPCA %s/%08lx got too big "
"(len %u, max len %u)\n", __func__,
- ipsec_address(&sav->sah->saidx.dst),
+ ipsec_address(&sav->sah->saidx.dst, buf, sizeof(buf)),
(u_long) ntohl(sav->spi),
ralen + skip + IPCOMP_HLENGTH, maxpacketsize));
error = EMSGSIZE;
@@ -414,8 +411,8 @@ ipcomp_output(
if (m == NULL) {
IPCOMPSTAT_INC(ipcomps_hdrops);
DPRINTF(("%s: cannot clone mbuf chain, IPCA %s/%08lx\n",
- __func__, ipsec_address(&sav->sah->saidx.dst),
- (u_long) ntohl(sav->spi)));
+ __func__, ipsec_address(&sav->sah->saidx.dst, buf,
+ sizeof(buf)), (u_long) ntohl(sav->spi)));
error = ENOBUFS;
goto bad;
}
@@ -482,6 +479,7 @@ bad:
static int
ipcomp_output_cb(struct cryptop *crp)
{
+ char buf[INET6_ADDRSTRLEN];
struct tdb_crypto *tc;
struct ipsecrequest *isr;
struct secasvar *sav;
@@ -494,6 +492,7 @@ ipcomp_output_cb(struct cryptop *crp)
skip = tc->tc_skip;
isr = tc->tc_isr;
+ IPSEC_ASSERT(isr->sp != NULL, ("NULL isr->sp"));
IPSECREQUEST_LOCK(isr);
sav = tc->tc_sav;
/* With the isr lock released SA pointer can be updated. */
@@ -539,8 +538,8 @@ ipcomp_output_cb(struct cryptop *crp)
if (mo == NULL) {
IPCOMPSTAT_INC(ipcomps_wrap);
DPRINTF(("%s: IPCOMP header inject failed for IPCA %s/%08lx\n",
- __func__, ipsec_address(&sav->sah->saidx.dst),
- (u_long) ntohl(sav->spi)));
+ __func__, ipsec_address(&sav->sah->saidx.dst, buf,
+ sizeof(buf)), (u_long) ntohl(sav->spi)));
error = ENOBUFS;
goto bad;
}
@@ -586,8 +585,8 @@ ipcomp_output_cb(struct cryptop *crp)
DPRINTF(("%s: unknown/unsupported protocol "
"family %d, IPCA %s/%08lx\n", __func__,
sav->sah->saidx.dst.sa.sa_family,
- ipsec_address(&sav->sah->saidx.dst),
- (u_long) ntohl(sav->spi)));
+ ipsec_address(&sav->sah->saidx.dst, buf,
+ sizeof(buf)), (u_long) ntohl(sav->spi)));
error = EPFNOSUPPORT;
goto bad;
}
@@ -608,16 +607,18 @@ ipcomp_output_cb(struct cryptop *crp)
error = ipsec_process_done(m, isr);
KEY_FREESAV(&sav);
IPSECREQUEST_UNLOCK(isr);
- return error;
+ KEY_FREESP(&isr->sp);
+ return (error);
bad:
if (sav)
KEY_FREESAV(&sav);
IPSECREQUEST_UNLOCK(isr);
+ KEY_FREESP(&isr->sp);
if (m)
m_freem(m);
free(tc, M_XDATA);
crypto_freereq(crp);
- return error;
+ return (error);
}
static struct xformsw ipcomp_xformsw = {
diff --git a/sys/netipsec/xform_ipip.c b/sys/netipsec/xform_ipip.c
deleted file mode 100644
index fc6c4a1..0000000
--- a/sys/netipsec/xform_ipip.c
+++ /dev/null
@@ -1,307 +0,0 @@
-/* $FreeBSD$ */
-/* $OpenBSD: ip_ipip.c,v 1.25 2002/06/10 18:04:55 itojun Exp $ */
-/*-
- * The authors of this code are John Ioannidis (ji@tla.org),
- * Angelos D. Keromytis (kermit@csd.uch.gr) and
- * Niels Provos (provos@physnet.uni-hamburg.de).
- *
- * The original version of this code was written by John Ioannidis
- * for BSD/OS in Athens, Greece, in November 1995.
- *
- * Ported to OpenBSD and NetBSD, with additional transforms, in December 1996,
- * by Angelos D. Keromytis.
- *
- * Additional transforms and features in 1997 and 1998 by Angelos D. Keromytis
- * and Niels Provos.
- *
- * Additional features in 1999 by Angelos D. Keromytis.
- *
- * Copyright (C) 1995, 1996, 1997, 1998, 1999 by John Ioannidis,
- * Angelos D. Keromytis and Niels Provos.
- * Copyright (c) 2001, Angelos D. Keromytis.
- *
- * Permission to use, copy, and modify this software with or without fee
- * is hereby granted, provided that this entire notice is included in
- * all copies of any software which is or includes a copy or
- * modification of this software.
- * You may use this code under the GNU public license if you so wish. Please
- * contribute changes back to the authors under this freer than GPL license
- * so that we may further the use of strong encryption without limitations to
- * all.
- *
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTY. IN PARTICULAR, NONE OF THE AUTHORS MAKES ANY
- * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE
- * MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR
- * PURPOSE.
- */
-
-/*
- * IP-inside-IP processing
- */
-#include "opt_inet.h"
-#include "opt_inet6.h"
-#include "opt_enc.h"
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/mbuf.h>
-#include <sys/socket.h>
-#include <sys/kernel.h>
-#include <sys/protosw.h>
-#include <sys/sysctl.h>
-
-#include <net/if.h>
-#include <net/if_var.h>
-#include <net/pfil.h>
-#include <net/netisr.h>
-#include <net/vnet.h>
-
-#include <netinet/in.h>
-#include <netinet/in_systm.h>
-#include <netinet/in_var.h>
-#include <netinet/ip.h>
-#include <netinet/ip_ecn.h>
-#include <netinet/ip_var.h>
-
-#include <netipsec/ipsec.h>
-#include <netipsec/xform.h>
-
-#ifdef INET6
-#include <netinet/ip6.h>
-#include <netipsec/ipsec6.h>
-#include <netinet6/ip6_ecn.h>
-#include <netinet6/in6_var.h>
-#include <netinet6/scope6_var.h>
-#endif
-
-#include <netipsec/key.h>
-#include <netipsec/key_debug.h>
-
-int
-ipip_output(struct mbuf *m, struct ipsecrequest *isr, struct mbuf **mp,
- int skip, int protoff)
-{
- struct secasvar *sav;
- u_int8_t tp, otos;
- struct secasindex *saidx;
- int error;
-#if defined(INET) || defined(INET6)
- u_int8_t itos;
-#endif
-#ifdef INET
- struct ip *ipo;
-#endif /* INET */
-#ifdef INET6
- struct ip6_hdr *ip6, *ip6o;
-#endif /* INET6 */
-
- sav = isr->sav;
- IPSEC_ASSERT(sav != NULL, ("null SA"));
- IPSEC_ASSERT(sav->sah != NULL, ("null SAH"));
-
- /* XXX Deal with empty TDB source/destination addresses. */
-
- m_copydata(m, 0, 1, &tp);
- tp = (tp >> 4) & 0xff; /* Get the IP version number. */
-
- saidx = &sav->sah->saidx;
- switch (saidx->dst.sa.sa_family) {
-#ifdef INET
- case AF_INET:
- if (saidx->src.sa.sa_family != AF_INET ||
- saidx->src.sin.sin_addr.s_addr == INADDR_ANY ||
- saidx->dst.sin.sin_addr.s_addr == INADDR_ANY) {
- DPRINTF(("%s: unspecified tunnel endpoint "
- "address in SA %s/%08lx\n", __func__,
- ipsec_address(&saidx->dst),
- (u_long) ntohl(sav->spi)));
- error = EINVAL;
- goto bad;
- }
-
- M_PREPEND(m, sizeof(struct ip), M_NOWAIT);
- if (m == 0) {
- DPRINTF(("%s: M_PREPEND failed\n", __func__));
- error = ENOBUFS;
- goto bad;
- }
-
- ipo = mtod(m, struct ip *);
-
- ipo->ip_v = IPVERSION;
- ipo->ip_hl = 5;
- ipo->ip_len = htons(m->m_pkthdr.len);
- ipo->ip_ttl = V_ip_defttl;
- ipo->ip_sum = 0;
- ipo->ip_src = saidx->src.sin.sin_addr;
- ipo->ip_dst = saidx->dst.sin.sin_addr;
- /* If the inner protocol is IP... */
- switch (tp) {
- case IPVERSION:
- /* Save ECN notification */
- m_copydata(m, sizeof(struct ip) +
- offsetof(struct ip, ip_tos),
- sizeof(u_int8_t), (caddr_t) &itos);
-
- ipo->ip_p = IPPROTO_IPIP;
-
- /*
- * We should be keeping tunnel soft-state and
- * send back ICMPs if needed.
- */
- m_copydata(m, sizeof(struct ip) +
- offsetof(struct ip, ip_off),
- sizeof(u_int16_t), (caddr_t) &ipo->ip_off);
- ipo->ip_off = ntohs(ipo->ip_off);
- ipo->ip_off &= ~(IP_DF | IP_MF | IP_OFFMASK);
- ipo->ip_off = htons(ipo->ip_off);
- break;
-#ifdef INET6
- case (IPV6_VERSION >> 4):
- {
- u_int32_t itos32;
-
- /* Save ECN notification. */
- m_copydata(m, sizeof(struct ip) +
- offsetof(struct ip6_hdr, ip6_flow),
- sizeof(u_int32_t), (caddr_t) &itos32);
- itos = ntohl(itos32) >> 20;
- ipo->ip_p = IPPROTO_IPV6;
- ipo->ip_off = 0;
- break;
- }
-#endif /* INET6 */
- default:
- goto nofamily;
- }
- ip_fillid(ipo);
-
- otos = 0;
- ip_ecn_ingress(ECN_ALLOWED, &otos, &itos);
- ipo->ip_tos = otos;
- break;
-#endif /* INET */
-
-#ifdef INET6
- case AF_INET6:
- if (IN6_IS_ADDR_UNSPECIFIED(&saidx->dst.sin6.sin6_addr) ||
- saidx->src.sa.sa_family != AF_INET6 ||
- IN6_IS_ADDR_UNSPECIFIED(&saidx->src.sin6.sin6_addr)) {
- DPRINTF(("%s: unspecified tunnel endpoint "
- "address in SA %s/%08lx\n", __func__,
- ipsec_address(&saidx->dst),
- (u_long) ntohl(sav->spi)));
- error = ENOBUFS;
- goto bad;
- }
-
- /* scoped address handling */
- ip6 = mtod(m, struct ip6_hdr *);
- in6_clearscope(&ip6->ip6_src);
- in6_clearscope(&ip6->ip6_dst);
- M_PREPEND(m, sizeof(struct ip6_hdr), M_NOWAIT);
- if (m == 0) {
- DPRINTF(("%s: M_PREPEND failed\n", __func__));
- error = ENOBUFS;
- goto bad;
- }
-
- /* Initialize IPv6 header */
- ip6o = mtod(m, struct ip6_hdr *);
- ip6o->ip6_flow = 0;
- ip6o->ip6_vfc &= ~IPV6_VERSION_MASK;
- ip6o->ip6_vfc |= IPV6_VERSION;
- ip6o->ip6_hlim = IPV6_DEFHLIM;
- ip6o->ip6_dst = saidx->dst.sin6.sin6_addr;
- ip6o->ip6_src = saidx->src.sin6.sin6_addr;
- ip6o->ip6_plen = htons(m->m_pkthdr.len - sizeof(*ip6));
-
- switch (tp) {
-#ifdef INET
- case IPVERSION:
- /* Save ECN notification */
- m_copydata(m, sizeof(struct ip6_hdr) +
- offsetof(struct ip, ip_tos), sizeof(u_int8_t),
- (caddr_t) &itos);
-
- /* This is really IPVERSION. */
- ip6o->ip6_nxt = IPPROTO_IPIP;
- break;
-#endif /* INET */
- case (IPV6_VERSION >> 4):
- {
- u_int32_t itos32;
-
- /* Save ECN notification. */
- m_copydata(m, sizeof(struct ip6_hdr) +
- offsetof(struct ip6_hdr, ip6_flow),
- sizeof(u_int32_t), (caddr_t) &itos32);
- itos = ntohl(itos32) >> 20;
-
- ip6o->ip6_nxt = IPPROTO_IPV6;
- break;
- }
- default:
- goto nofamily;
- }
-
- otos = 0;
- ip_ecn_ingress(V_ip6_ipsec_ecn, &otos, &itos);
- ip6o->ip6_flow |= htonl((u_int32_t) otos << 20);
- break;
-#endif /* INET6 */
-
- default:
-nofamily:
- DPRINTF(("%s: unsupported protocol family %u\n", __func__,
- saidx->dst.sa.sa_family));
- error = EAFNOSUPPORT; /* XXX diffs from openbsd */
- goto bad;
- }
-
- *mp = m;
- return (0);
-bad:
- if (m)
- m_freem(m);
- *mp = NULL;
- return (error);
-}
-
-static int
-ipe4_init(struct secasvar *sav, struct xformsw *xsp)
-{
- sav->tdb_xform = xsp;
- return 0;
-}
-
-static int
-ipe4_zeroize(struct secasvar *sav)
-{
- sav->tdb_xform = NULL;
- return 0;
-}
-
-static int
-ipe4_input(struct mbuf *m, struct secasvar *sav, int skip, int protoff)
-{
- /* This is a rather serious mistake, so no conditional printing. */
- printf("%s: should never be called\n", __func__);
- if (m)
- m_freem(m);
- return EOPNOTSUPP;
-}
-
-static struct xformsw ipe4_xformsw = {
- XF_IP4, 0, "IPv4 Simple Encapsulation",
- ipe4_init, ipe4_zeroize, ipe4_input, ipip_output,
-};
-
-static void
-ipe4_attach(void)
-{
-
- xform_register(&ipe4_xformsw);
-}
-SYSINIT(ipe4_xform_init, SI_SUB_PROTO_DOMAIN, SI_ORDER_MIDDLE, ipe4_attach, NULL);
diff --git a/sys/netpfil/ipfw/ip_fw2.c b/sys/netpfil/ipfw/ip_fw2.c
index a30f6bf..4da0ee0 100644
--- a/sys/netpfil/ipfw/ip_fw2.c
+++ b/sys/netpfil/ipfw/ip_fw2.c
@@ -2762,6 +2762,10 @@ vnet_ipfw_init(const void *unused)
LIST_INIT(&chain->nat);
#endif
+ /* Init shared services hash table */
+ ipfw_init_srv(chain);
+
+ ipfw_init_obj_rewriter();
ipfw_init_counters();
/* insert the default rule and create the initial map */
chain->n_rules = 1;
@@ -2860,9 +2864,11 @@ vnet_ipfw_uninit(const void *unused)
if (reap != NULL)
ipfw_reap_rules(reap);
vnet_ipfw_iface_destroy(chain);
+ ipfw_destroy_srv(chain);
IPFW_LOCK_DESTROY(chain);
ipfw_dyn_uninit(1); /* free the remaining parts */
ipfw_destroy_counters();
+ ipfw_destroy_obj_rewriter();
return (0);
}
diff --git a/sys/netpfil/ipfw/ip_fw_nat.c b/sys/netpfil/ipfw/ip_fw_nat.c
index 201be2f..df40398 100644
--- a/sys/netpfil/ipfw/ip_fw_nat.c
+++ b/sys/netpfil/ipfw/ip_fw_nat.c
@@ -242,6 +242,8 @@ add_redir_spool_cfg(char *buf, struct cfg_nat *ptr)
}
if (r->alink[0] == NULL) {
printf("LibAliasRedirect* returned NULL\n");
+ free(r->alink, M_IPFW);
+ free(r, M_IPFW);
return (EINVAL);
}
/* LSNAT handling. */
@@ -263,6 +265,16 @@ add_redir_spool_cfg(char *buf, struct cfg_nat *ptr)
return (0);
}
+static void
+free_nat_instance(struct cfg_nat *ptr)
+{
+
+ del_redir_spool_cfg(ptr, &ptr->redir_chain);
+ LibAliasUninit(ptr->lib);
+ free(ptr, M_IPFW);
+}
+
+
/*
* ipfw_nat - perform mbuf header translation.
*
@@ -536,7 +548,7 @@ nat44_config(struct ip_fw_chain *chain, struct nat44_cfg_nat *ucfg)
IPFW_UH_WUNLOCK(chain);
if (tcfg != NULL)
- free(tcfg, M_IPFW);
+ free_nat_instance(ptr);
}
/*
@@ -626,9 +638,7 @@ nat44_destroy(struct ip_fw_chain *chain, ip_fw3_opheader *op3,
IPFW_WUNLOCK(chain);
IPFW_UH_WUNLOCK(chain);
- del_redir_spool_cfg(ptr, &ptr->redir_chain);
- LibAliasUninit(ptr->lib);
- free(ptr, M_IPFW);
+ free_nat_instance(ptr);
return (0);
}
@@ -994,9 +1004,7 @@ ipfw_nat_del(struct sockopt *sopt)
flush_nat_ptrs(chain, i);
IPFW_WUNLOCK(chain);
IPFW_UH_WUNLOCK(chain);
- del_redir_spool_cfg(ptr, &ptr->redir_chain);
- LibAliasUninit(ptr->lib);
- free(ptr, M_IPFW);
+ free_nat_instance(ptr);
return (0);
}
@@ -1139,9 +1147,7 @@ vnet_ipfw_nat_uninit(const void *arg __unused)
IPFW_WLOCK(chain);
LIST_FOREACH_SAFE(ptr, &chain->nat, _next, ptr_temp) {
LIST_REMOVE(ptr, _next);
- del_redir_spool_cfg(ptr, &ptr->redir_chain);
- LibAliasUninit(ptr->lib);
- free(ptr, M_IPFW);
+ free_nat_instance(ptr);
}
flush_nat_ptrs(chain, -1 /* flush all */);
V_ipfw_nat_ready = 0;
diff --git a/sys/netpfil/ipfw/ip_fw_private.h b/sys/netpfil/ipfw/ip_fw_private.h
index bb5b3ba..504093b 100644
--- a/sys/netpfil/ipfw/ip_fw_private.h
+++ b/sys/netpfil/ipfw/ip_fw_private.h
@@ -264,10 +264,10 @@ struct ip_fw_chain {
struct ip_fw **map; /* array of rule ptrs to ease lookup */
uint32_t id; /* ruleset id */
int n_rules; /* number of static rules */
- LIST_HEAD(nat_list, cfg_nat) nat; /* list of nat entries */
void *tablestate; /* runtime table info */
void *valuestate; /* runtime table value info */
int *idxmap; /* skipto array of rules */
+ void **srvstate; /* runtime service mappings */
#if defined( __linux__ ) || defined( _WIN32 )
spinlock_t rwmtx;
#else
@@ -275,10 +275,12 @@ struct ip_fw_chain {
#endif
int static_len; /* total len of static rules (v0) */
uint32_t gencnt; /* NAT generation count */
+ LIST_HEAD(nat_list, cfg_nat) nat; /* list of nat entries */
struct ip_fw *default_rule;
struct tables_config *tblcfg; /* tables module data */
void *ifcfg; /* interface module data */
int *idxmap_back; /* standby skipto array of rules */
+ struct namedobj_instance *srvmap; /* cfg name->number mappings */
#if defined( __linux__ ) || defined( _WIN32 )
spinlock_t uh_lock;
#else
@@ -306,16 +308,15 @@ struct table_value {
uint64_t refcnt; /* Number of references */
};
-struct namedobj_instance;
struct named_object {
TAILQ_ENTRY(named_object) nn_next; /* namehash */
TAILQ_ENTRY(named_object) nv_next; /* valuehash */
char *name; /* object name */
- uint8_t type; /* object type */
- uint8_t compat; /* Object name is number */
+ uint8_t subtype; /* object subtype within class */
+ uint8_t etlv; /* Export TLV id */
+ uint16_t spare[2];
uint16_t kidx; /* object kernel index */
- uint16_t uidx; /* userland idx for compat records */
uint32_t set; /* set object belongs to */
uint32_t refcnt; /* number of references */
};
@@ -450,7 +451,7 @@ struct obj_idx {
struct rule_check_info {
uint16_t flags; /* rule-specific check flags */
- uint16_t table_opcodes; /* count of opcodes referencing table */
+ uint16_t object_opcodes; /* num of opcodes referencing objects */
uint16_t urule_numoff; /* offset of rulenum in bytes */
uint8_t version; /* rule version */
uint8_t spare;
@@ -507,6 +508,84 @@ struct ip_fw_bcounter0 {
(r)->cmd_len * 4 - 4, 8))
#define RULEKSIZE1(r) roundup2((sizeof(struct ip_fw) + (r)->cmd_len*4 - 4), 8)
+/*
+ * Tables/Objects index rewriting code
+ */
+
+/* Default and maximum number of ipfw tables/objects. */
+#define IPFW_TABLES_MAX 65536
+#define IPFW_TABLES_DEFAULT 128
+#define IPFW_OBJECTS_MAX 65536
+#define IPFW_OBJECTS_DEFAULT 128
+
+#define CHAIN_TO_SRV(ch) ((ch)->srvmap)
+
+struct tid_info {
+ uint32_t set; /* table set */
+ uint16_t uidx; /* table index */
+ uint8_t type; /* table type */
+ uint8_t atype;
+ uint8_t spare;
+ int tlen; /* Total TLV size block */
+ void *tlvs; /* Pointer to first TLV */
+};
+
+/*
+ * Classifier callback. Checks if @cmd opcode contains kernel object reference.
+ * If true, returns its index and type.
+ * Returns 0 if match is found, 1 overwise.
+ */
+typedef int (ipfw_obj_rw_cl)(ipfw_insn *cmd, uint16_t *puidx, uint8_t *ptype);
+/*
+ * Updater callback. Sets kernel object reference index to @puidx
+ */
+typedef void (ipfw_obj_rw_upd)(ipfw_insn *cmd, uint16_t puidx);
+/*
+ * Finder callback. Tries to find named object by name (specified via @ti).
+ * Stores found named object pointer in @pno.
+ * If object was not found, NULL is stored.
+ *
+ * Return 0 if input data was valid.
+ */
+typedef int (ipfw_obj_fname_cb)(struct ip_fw_chain *ch,
+ struct tid_info *ti, struct named_object **pno);
+/*
+ * Another finder callback. Tries to findex named object by kernel index.
+ *
+ * Returns pointer to named object or NULL.
+ */
+typedef struct named_object *(ipfw_obj_fidx_cb)(struct ip_fw_chain *ch,
+ uint16_t kidx);
+/*
+ * Object creator callback. Tries to create object specified by @ti.
+ * Stores newly-allocated object index in @pkidx.
+ *
+ * Returns 0 on success.
+ */
+typedef int (ipfw_obj_create_cb)(struct ip_fw_chain *ch, struct tid_info *ti,
+ uint16_t *pkidx);
+
+
+struct opcode_obj_rewrite {
+ uint32_t opcode; /* Opcode to act upon */
+ uint32_t etlv; /* Relevant export TLV id */
+ ipfw_obj_rw_cl *classifier; /* Check if rewrite is needed */
+ ipfw_obj_rw_upd *update; /* update cmd with new value */
+ ipfw_obj_fname_cb *find_byname; /* Find named object by name */
+ ipfw_obj_fidx_cb *find_bykidx; /* Find named object by kidx */
+ ipfw_obj_create_cb *create_object; /* Create named object */
+};
+
+#define IPFW_ADD_OBJ_REWRITER(f, c) do { \
+ if ((f) != 0) \
+ ipfw_add_obj_rewriter(c, \
+ sizeof(c) / sizeof(c[0])); \
+ } while(0)
+#define IPFW_DEL_OBJ_REWRITER(l, c) do { \
+ if ((l) != 0) \
+ ipfw_del_obj_rewriter(c, \
+ sizeof(c) / sizeof(c[0])); \
+ } while(0)
/* In ip_fw_iface.c */
int ipfw_iface_init(void);
@@ -562,6 +641,7 @@ caddr_t ipfw_get_sopt_header(struct sockopt_data *sd, size_t needed);
sizeof(c) / sizeof(c[0])); \
} while(0)
+struct namedobj_instance;
typedef void (objhash_cb_t)(struct namedobj_instance *ni, struct named_object *,
void *arg);
typedef uint32_t (objhash_hash_f)(struct namedobj_instance *ni, void *key,
@@ -578,6 +658,8 @@ void ipfw_objhash_bitmap_free(void *idx, int blocks);
void ipfw_objhash_set_hashf(struct namedobj_instance *ni, objhash_hash_f *f);
struct named_object *ipfw_objhash_lookup_name(struct namedobj_instance *ni,
uint32_t set, char *name);
+struct named_object *ipfw_objhash_lookup_name_type(struct namedobj_instance *ni,
+ uint32_t set, uint32_t type, char *name);
struct named_object *ipfw_objhash_lookup_kidx(struct namedobj_instance *ni,
uint16_t idx);
int ipfw_objhash_same_name(struct namedobj_instance *ni, struct named_object *a,
@@ -591,6 +673,25 @@ int ipfw_objhash_free_idx(struct namedobj_instance *ni, uint16_t idx);
int ipfw_objhash_alloc_idx(void *n, uint16_t *pidx);
void ipfw_objhash_set_funcs(struct namedobj_instance *ni,
objhash_hash_f *hash_f, objhash_cmp_f *cmp_f);
+void ipfw_init_obj_rewriter(void);
+void ipfw_destroy_obj_rewriter(void);
+void ipfw_add_obj_rewriter(struct opcode_obj_rewrite *rw, size_t count);
+int ipfw_del_obj_rewriter(struct opcode_obj_rewrite *rw, size_t count);
+
+int ipfw_rewrite_rule_uidx(struct ip_fw_chain *chain,
+ struct rule_check_info *ci);
+int ipfw_mark_object_kidx(struct ip_fw_chain *chain, struct ip_fw *rule,
+ uint32_t *bmask);
+int ref_opcode_object(struct ip_fw_chain *ch, ipfw_insn *cmd, struct tid_info *ti,
+ struct obj_idx *pidx, int *found, int *unresolved);
+void unref_oib_objects(struct ip_fw_chain *ch, ipfw_insn *cmd,
+ struct obj_idx *oib, struct obj_idx *end);
+int create_objects_compat(struct ip_fw_chain *ch, ipfw_insn *cmd,
+ struct obj_idx *oib, struct obj_idx *pidx, struct tid_info *ti);
+void update_opcode_kidx(ipfw_insn *cmd, uint16_t idx);
+int classify_opcode_kidx(ipfw_insn *cmd, uint16_t *puidx);
+void ipfw_init_srv(struct ip_fw_chain *ch);
+void ipfw_destroy_srv(struct ip_fw_chain *ch);
/* In ip_fw_table.c */
struct table_info;
diff --git a/sys/netpfil/ipfw/ip_fw_sockopt.c b/sys/netpfil/ipfw/ip_fw_sockopt.c
index ef1ff6c..d618a6c 100644
--- a/sys/netpfil/ipfw/ip_fw_sockopt.c
+++ b/sys/netpfil/ipfw/ip_fw_sockopt.c
@@ -148,6 +148,21 @@ static struct ipfw_sopt_handler scodes[] = {
{ IP_FW_DUMP_SOPTCODES, 0, HDIR_GET, dump_soptcodes },
};
+static int
+set_legacy_obj_kidx(struct ip_fw_chain *ch, struct ip_fw_rule0 *rule);
+struct opcode_obj_rewrite *ipfw_find_op_rw(uint16_t opcode);
+static int mark_object_kidx(struct ip_fw_chain *ch, struct ip_fw *rule,
+ uint32_t *bmask);
+static void unref_rule_objects(struct ip_fw_chain *chain, struct ip_fw *rule);
+static int export_objhash_ntlv(struct namedobj_instance *ni, uint16_t kidx,
+ struct sockopt_data *sd);
+
+/*
+ * Opcode object rewriter variables
+ */
+struct opcode_obj_rewrite *ctl3_rewriters;
+static size_t ctl3_rsize;
+
/*
* static variables followed by global ones
*/
@@ -646,17 +661,18 @@ commit_rules(struct ip_fw_chain *chain, struct rule_check_info *rci, int count)
struct ip_fw *krule;
struct ip_fw **map; /* the new array of pointers */
- /* Check if we need to do table remap */
+ /* Check if we need to do table/obj index remap */
tcount = 0;
for (ci = rci, i = 0; i < count; ci++, i++) {
- if (ci->table_opcodes == 0)
+ if (ci->object_opcodes == 0)
continue;
/*
- * Rule has some table opcodes.
- * Reference & allocate needed tables/
+ * Rule has some object opcodes.
+ * We need to find (and create non-existing)
+ * kernel objects, and reference existing ones.
*/
- error = ipfw_rewrite_table_uidx(chain, ci);
+ error = ipfw_rewrite_rule_uidx(chain, ci);
if (error != 0) {
/*
@@ -674,9 +690,9 @@ commit_rules(struct ip_fw_chain *chain, struct rule_check_info *rci, int count)
IPFW_UH_WLOCK(chain);
while (ci != rci) {
ci--;
- if (ci->table_opcodes == 0)
+ if (ci->object_opcodes == 0)
continue;
- ipfw_unref_rule_tables(chain,ci->krule);
+ unref_rule_objects(chain,ci->krule);
}
IPFW_UH_WUNLOCK(chain);
@@ -696,10 +712,10 @@ commit_rules(struct ip_fw_chain *chain, struct rule_check_info *rci, int count)
/* Unbind tables */
IPFW_UH_WLOCK(chain);
for (ci = rci, i = 0; i < count; ci++, i++) {
- if (ci->table_opcodes == 0)
+ if (ci->object_opcodes == 0)
continue;
- ipfw_unref_rule_tables(chain, ci->krule);
+ unref_rule_objects(chain, ci->krule);
}
IPFW_UH_WUNLOCK(chain);
}
@@ -759,7 +775,7 @@ ipfw_reap_add(struct ip_fw_chain *chain, struct ip_fw **head,
IPFW_UH_WLOCK_ASSERT(chain);
/* Unlink rule from everywhere */
- ipfw_unref_rule_tables(chain, rule);
+ unref_rule_objects(chain, rule);
*((struct ip_fw **)rule) = *head;
*head = rule;
@@ -1542,7 +1558,7 @@ check_ipfw_rule_body(ipfw_insn *cmd, int cmd_len, struct rule_check_info *ci)
cmdlen != F_INSN_SIZE(ipfw_insn_u32) + 1 &&
cmdlen != F_INSN_SIZE(ipfw_insn_u32))
goto bad_size;
- ci->table_opcodes++;
+ ci->object_opcodes++;
break;
case O_IP_FLOW_LOOKUP:
if (cmd->arg1 >= V_fw_tables_max) {
@@ -1553,7 +1569,7 @@ check_ipfw_rule_body(ipfw_insn *cmd, int cmd_len, struct rule_check_info *ci)
if (cmdlen != F_INSN_SIZE(ipfw_insn) &&
cmdlen != F_INSN_SIZE(ipfw_insn_u32))
goto bad_size;
- ci->table_opcodes++;
+ ci->object_opcodes++;
break;
case O_MACADDR2:
if (cmdlen != F_INSN_SIZE(ipfw_insn_mac))
@@ -1587,7 +1603,7 @@ check_ipfw_rule_body(ipfw_insn *cmd, int cmd_len, struct rule_check_info *ci)
case O_XMIT:
case O_VIA:
if (((ipfw_insn_if *)cmd)->name[0] == '\1')
- ci->table_opcodes++;
+ ci->object_opcodes++;
if (cmdlen != F_INSN_SIZE(ipfw_insn_if))
goto bad_size;
break;
@@ -1788,7 +1804,7 @@ ipfw_getrules(struct ip_fw_chain *chain, void *buf, size_t space)
l = RULESIZE7(rule);
if (bp + l + sizeof(uint32_t) <= ep) {
bcopy(rule, bp, l + sizeof(uint32_t));
- error = ipfw_rewrite_table_kidx(chain,
+ error = set_legacy_obj_kidx(chain,
(struct ip_fw_rule0 *)bp);
if (error != 0)
return (0);
@@ -1817,7 +1833,7 @@ ipfw_getrules(struct ip_fw_chain *chain, void *buf, size_t space)
}
dst = (struct ip_fw_rule0 *)bp;
export_rule0(rule, dst, l);
- error = ipfw_rewrite_table_kidx(chain, dst);
+ error = set_legacy_obj_kidx(chain, dst);
/*
* XXX HACK. Store the disable mask in the "next"
@@ -1861,6 +1877,34 @@ struct dump_args {
};
/*
+ * Export named object info in instance @ni, identified by @kidx
+ * to ipfw_obj_ntlv. TLV is allocated from @sd space.
+ *
+ * Returns 0 on success.
+ */
+static int
+export_objhash_ntlv(struct namedobj_instance *ni, uint16_t kidx,
+ struct sockopt_data *sd)
+{
+ struct named_object *no;
+ ipfw_obj_ntlv *ntlv;
+
+ no = ipfw_objhash_lookup_kidx(ni, kidx);
+ KASSERT(no != NULL, ("invalid object kernel index passed"));
+
+ ntlv = (ipfw_obj_ntlv *)ipfw_get_sopt_space(sd, sizeof(*ntlv));
+ if (ntlv == NULL)
+ return (ENOMEM);
+
+ ntlv->head.type = no->etlv;
+ ntlv->head.length = sizeof(*ntlv);
+ ntlv->idx = no->kidx;
+ strlcpy(ntlv->name, no->name, sizeof(ntlv->name));
+
+ return (0);
+}
+
+/*
* Dumps static rules with table TLVs in buffer @sd.
*
* Returns 0 on success.
@@ -1874,6 +1918,7 @@ dump_static_rules(struct ip_fw_chain *chain, struct dump_args *da,
uint32_t tcount;
ipfw_obj_ctlv *ctlv;
struct ip_fw *krule;
+ struct namedobj_instance *ni;
caddr_t dst;
/* Dump table names first (if any) */
@@ -1891,13 +1936,21 @@ dump_static_rules(struct ip_fw_chain *chain, struct dump_args *da,
i = 0;
tcount = da->tcount;
+ ni = ipfw_get_table_objhash(chain);
while (tcount > 0) {
if ((bmask[i / 32] & (1 << (i % 32))) == 0) {
i++;
continue;
}
- if ((error = ipfw_export_table_ntlv(chain, i, sd)) != 0)
+ /* Jump to shared named object bitmask */
+ if (i >= IPFW_TABLES_MAX) {
+ ni = CHAIN_TO_SRV(chain);
+ i -= IPFW_TABLES_MAX;
+ bmask += IPFW_TABLES_MAX / 32;
+ }
+
+ if ((error = export_objhash_ntlv(ni, i, sd)) != 0)
return (error);
i++;
@@ -1929,6 +1982,52 @@ dump_static_rules(struct ip_fw_chain *chain, struct dump_args *da,
}
/*
+ * Marks every object index used in @rule with bit in @bmask.
+ * Used to generate bitmask of referenced tables/objects for given ruleset
+ * or its part.
+ *
+ * Returns number of newly-referenced objects.
+ */
+static int
+mark_object_kidx(struct ip_fw_chain *ch, struct ip_fw *rule,
+ uint32_t *bmask)
+{
+ int cmdlen, l, count;
+ ipfw_insn *cmd;
+ uint16_t kidx;
+ struct opcode_obj_rewrite *rw;
+ int bidx;
+ uint8_t subtype;
+
+ l = rule->cmd_len;
+ cmd = rule->cmd;
+ cmdlen = 0;
+ count = 0;
+ for ( ; l > 0 ; l -= cmdlen, cmd += cmdlen) {
+ cmdlen = F_LEN(cmd);
+
+ rw = ipfw_find_op_rw(cmd->opcode);
+ if (rw == NULL)
+ continue;
+
+ if (rw->classifier(cmd, &kidx, &subtype) != 0)
+ continue;
+
+ bidx = kidx / 32;
+ /* Maintain separate bitmasks for table and non-table objects */
+ if (rw->etlv != IPFW_TLV_TBL_NAME)
+ bidx += IPFW_TABLES_MAX / 32;
+
+ if ((bmask[bidx] & (1 << (kidx % 32))) == 0)
+ count++;
+
+ bmask[bidx] |= 1 << (kidx % 32);
+ }
+
+ return (count);
+}
+
+/*
* Dumps requested objects data
* Data layout (version 0)(current):
* Request: [ ipfw_cfg_lheader ] + IPFW_CFG_GET_* flags
@@ -1963,9 +2062,9 @@ dump_config(struct ip_fw_chain *chain, ip_fw3_opheader *op3,
error = 0;
bmask = NULL;
- /* Allocate needed state */
+ /* Allocate needed state. Note we allocate 2xspace mask, for table&srv */
if (hdr->flags & IPFW_CFG_GET_STATIC)
- bmask = malloc(IPFW_TABLES_MAX / 8, M_TEMP, M_WAITOK | M_ZERO);
+ bmask = malloc(IPFW_TABLES_MAX / 4, M_TEMP, M_WAITOK | M_ZERO);
IPFW_UH_RLOCK(chain);
@@ -1994,7 +2093,8 @@ dump_config(struct ip_fw_chain *chain, ip_fw3_opheader *op3,
rule = chain->map[i];
da.rsize += RULEUSIZE1(rule) + sizeof(ipfw_obj_tlv);
da.rcount++;
- da.tcount += ipfw_mark_table_kidx(chain, rule, bmask);
+ /* Update bitmask of used objects for given range */
+ da.tcount += mark_object_kidx(chain, rule, bmask);
}
/* Add counters if requested */
if (hdr->flags & IPFW_CFG_GET_COUNTERS) {
@@ -2064,6 +2164,241 @@ check_object_name(ipfw_obj_ntlv *ntlv)
}
/*
+ * Creates non-existent objects referenced by rule.
+ *
+ * Return 0 on success.
+ */
+int
+create_objects_compat(struct ip_fw_chain *ch, ipfw_insn *cmd,
+ struct obj_idx *oib, struct obj_idx *pidx, struct tid_info *ti)
+{
+ struct opcode_obj_rewrite *rw;
+ struct obj_idx *p;
+ uint16_t kidx;
+ int error;
+
+ /*
+ * Compatibility stuff: do actual creation for non-existing,
+ * but referenced objects.
+ */
+ for (p = oib; p < pidx; p++) {
+ if (p->kidx != 0)
+ continue;
+
+ ti->uidx = p->uidx;
+ ti->type = p->type;
+ ti->atype = 0;
+
+ rw = ipfw_find_op_rw((cmd + p->off)->opcode);
+ KASSERT(rw != NULL, ("Unable to find handler for op %d",
+ (cmd + p->off)->opcode));
+
+ error = rw->create_object(ch, ti, &kidx);
+ if (error == 0) {
+ p->kidx = kidx;
+ continue;
+ }
+
+ /*
+ * Error happened. We have to rollback everything.
+ * Drop all already acquired references.
+ */
+ IPFW_UH_WLOCK(ch);
+ unref_oib_objects(ch, cmd, oib, pidx);
+ IPFW_UH_WUNLOCK(ch);
+
+ return (error);
+ }
+
+ return (0);
+}
+
+/*
+ * Compatibility function for old ipfw(8) binaries.
+ * Rewrites table/nat kernel indices with userland ones.
+ * Convert tables matching '/^\d+$/' to their atoi() value.
+ * Use number 65535 for other tables.
+ *
+ * Returns 0 on success.
+ */
+static int
+set_legacy_obj_kidx(struct ip_fw_chain *ch, struct ip_fw_rule0 *rule)
+{
+ int cmdlen, error, l;
+ ipfw_insn *cmd;
+ uint16_t kidx, uidx;
+ struct named_object *no;
+ struct opcode_obj_rewrite *rw;
+ uint8_t subtype;
+ char *end;
+ long val;
+
+ error = 0;
+
+ l = rule->cmd_len;
+ cmd = rule->cmd;
+ cmdlen = 0;
+ for ( ; l > 0 ; l -= cmdlen, cmd += cmdlen) {
+ cmdlen = F_LEN(cmd);
+
+ rw = ipfw_find_op_rw(cmd->opcode);
+ if (rw == NULL)
+ continue;
+
+ /* Check if is index in given opcode */
+ if (rw->classifier(cmd, &kidx, &subtype) != 0)
+ continue;
+
+ /* Try to find referenced kernel object */
+ no = rw->find_bykidx(ch, kidx);
+ if (no == NULL)
+ continue;
+
+ val = strtol(no->name, &end, 10);
+ if (*end == '\0' && val < 65535) {
+ uidx = val;
+ } else {
+
+ /*
+ * We are called via legacy opcode.
+ * Save error and show table as fake number
+ * not to make ipfw(8) hang.
+ */
+ uidx = 65535;
+ error = 2;
+ }
+
+ rw->update(cmd, uidx);
+ }
+
+ return (error);
+}
+
+
+/*
+ * Unreferences all already-referenced objects in given @cmd rule,
+ * using information in @oib.
+ *
+ * Used to rollback partially converted rule on error.
+ */
+void
+unref_oib_objects(struct ip_fw_chain *ch, ipfw_insn *cmd, struct obj_idx *oib,
+ struct obj_idx *end)
+{
+ struct opcode_obj_rewrite *rw;
+ struct named_object *no;
+ struct obj_idx *p;
+
+ IPFW_UH_WLOCK_ASSERT(ch);
+
+ for (p = oib; p < end; p++) {
+ if (p->kidx == 0)
+ continue;
+
+ rw = ipfw_find_op_rw((cmd + p->off)->opcode);
+ KASSERT(rw != NULL, ("Unable to find handler for op %d",
+ (cmd + p->off)->opcode));
+
+ /* Find & unref by existing idx */
+ no = rw->find_bykidx(ch, p->kidx);
+ KASSERT(no != NULL, ("Ref'd object %d disappeared", p->kidx));
+ no->refcnt--;
+ }
+}
+
+/*
+ * Remove references from every object used in @rule.
+ * Used at rule removal code.
+ */
+static void
+unref_rule_objects(struct ip_fw_chain *ch, struct ip_fw *rule)
+{
+ int cmdlen, l;
+ ipfw_insn *cmd;
+ struct named_object *no;
+ uint16_t kidx;
+ struct opcode_obj_rewrite *rw;
+ uint8_t subtype;
+
+ IPFW_UH_WLOCK_ASSERT(ch);
+
+ l = rule->cmd_len;
+ cmd = rule->cmd;
+ cmdlen = 0;
+ for ( ; l > 0 ; l -= cmdlen, cmd += cmdlen) {
+ cmdlen = F_LEN(cmd);
+
+ rw = ipfw_find_op_rw(cmd->opcode);
+ if (rw == NULL)
+ continue;
+ if (rw->classifier(cmd, &kidx, &subtype) != 0)
+ continue;
+
+ no = rw->find_bykidx(ch, kidx);
+
+ KASSERT(no != NULL, ("table id %d not found", kidx));
+ KASSERT(no->subtype == subtype,
+ ("wrong type %d (%d) for table id %d",
+ no->subtype, subtype, kidx));
+ KASSERT(no->refcnt > 0, ("refcount for table %d is %d",
+ kidx, no->refcnt));
+
+ no->refcnt--;
+ }
+}
+
+
+/*
+ * Find and reference object (if any) stored in instruction @cmd.
+ *
+ * Saves object info in @pidx, sets
+ * - @found to 1 if object was found and references
+ * - @unresolved to 1 if object should exists but not found
+ *
+ * Returns non-zero value in case of error.
+ */
+int
+ref_opcode_object(struct ip_fw_chain *ch, ipfw_insn *cmd, struct tid_info *ti,
+ struct obj_idx *pidx, int *found, int *unresolved)
+{
+ struct named_object *no;
+ struct opcode_obj_rewrite *rw;
+ int error;
+
+ *found = 0;
+ *unresolved = 0;
+
+ /* Check if this opcode is candidate for rewrite */
+ rw = ipfw_find_op_rw(cmd->opcode);
+ if (rw == NULL)
+ return (0);
+
+ /* Check if we need to rewrite this opcode */
+ if (rw->classifier(cmd, &ti->uidx, &ti->type) != 0)
+ return (0);
+
+ /* Need to rewrite. Save necessary fields */
+ pidx->uidx = ti->uidx;
+ pidx->type = ti->type;
+
+ /* Try to find referenced kernel object */
+ error = rw->find_byname(ch, ti, &no);
+ if (error != 0)
+ return (error);
+ if (no == NULL) {
+ *unresolved = 1;
+ return (0);
+ }
+
+ /* Found. bump refcount */
+ *found = 1;
+ no->refcnt++;
+ pidx->kidx = no->kidx;
+
+ return (0);
+}
+
+/*
* Adds one or more rules to ipfw @chain.
* Data layout (version 0)(current):
* Request:
@@ -2315,6 +2650,160 @@ dump_soptcodes(struct ip_fw_chain *chain, ip_fw3_opheader *op3,
}
/*
+ * Compares two opcodes.
+ * Used both in qsort() and bsearch().
+ *
+ * Returns 0 if match is found.
+ */
+static int
+compare_opcodes(const void *_a, const void *_b)
+{
+ const struct opcode_obj_rewrite *a, *b;
+
+ a = (const struct opcode_obj_rewrite *)_a;
+ b = (const struct opcode_obj_rewrite *)_b;
+
+ if (a->opcode < b->opcode)
+ return (-1);
+ else if (a->opcode > b->opcode)
+ return (1);
+
+ return (0);
+}
+
+/*
+ * Finds opcode object rewriter based on @code.
+ *
+ * Returns pointer to handler or NULL.
+ */
+struct opcode_obj_rewrite *
+ipfw_find_op_rw(uint16_t opcode)
+{
+ struct opcode_obj_rewrite *rw, h;
+
+ memset(&h, 0, sizeof(h));
+ h.opcode = opcode;
+
+ rw = (struct opcode_obj_rewrite *)bsearch(&h, ctl3_rewriters,
+ ctl3_rsize, sizeof(h), compare_opcodes);
+
+ return (rw);
+}
+
+int
+classify_opcode_kidx(ipfw_insn *cmd, uint16_t *puidx)
+{
+ struct opcode_obj_rewrite *rw;
+ uint8_t subtype;
+
+ rw = ipfw_find_op_rw(cmd->opcode);
+ if (rw == NULL)
+ return (1);
+
+ return (rw->classifier(cmd, puidx, &subtype));
+}
+
+void
+update_opcode_kidx(ipfw_insn *cmd, uint16_t idx)
+{
+ struct opcode_obj_rewrite *rw;
+
+ rw = ipfw_find_op_rw(cmd->opcode);
+ KASSERT(rw != NULL, ("No handler to update opcode %d", cmd->opcode));
+ rw->update(cmd, idx);
+}
+
+void
+ipfw_init_obj_rewriter()
+{
+
+ ctl3_rewriters = NULL;
+ ctl3_rsize = 0;
+}
+
+void
+ipfw_destroy_obj_rewriter()
+{
+
+ if (ctl3_rewriters != NULL)
+ free(ctl3_rewriters, M_IPFW);
+ ctl3_rewriters = NULL;
+ ctl3_rsize = 0;
+}
+
+/*
+ * Adds one or more opcode object rewrite handlers to the global array.
+ * Function may sleep.
+ */
+void
+ipfw_add_obj_rewriter(struct opcode_obj_rewrite *rw, size_t count)
+{
+ size_t sz;
+ struct opcode_obj_rewrite *tmp;
+
+ CTL3_LOCK();
+
+ for (;;) {
+ sz = ctl3_rsize + count;
+ CTL3_UNLOCK();
+ tmp = malloc(sizeof(*rw) * sz, M_IPFW, M_WAITOK | M_ZERO);
+ CTL3_LOCK();
+ if (ctl3_rsize + count <= sz)
+ break;
+
+ /* Retry */
+ free(tmp, M_IPFW);
+ }
+
+ /* Merge old & new arrays */
+ sz = ctl3_rsize + count;
+ memcpy(tmp, ctl3_rewriters, ctl3_rsize * sizeof(*rw));
+ memcpy(&tmp[ctl3_rsize], rw, count * sizeof(*rw));
+ qsort(tmp, sz, sizeof(*rw), compare_opcodes);
+ /* Switch new and free old */
+ if (ctl3_rewriters != NULL)
+ free(ctl3_rewriters, M_IPFW);
+ ctl3_rewriters = tmp;
+ ctl3_rsize = sz;
+
+ CTL3_UNLOCK();
+}
+
+/*
+ * Removes one or more object rewrite handlers from the global array.
+ */
+int
+ipfw_del_obj_rewriter(struct opcode_obj_rewrite *rw, size_t count)
+{
+ size_t sz;
+ struct opcode_obj_rewrite *tmp, *h;
+ int i;
+
+ CTL3_LOCK();
+
+ for (i = 0; i < count; i++) {
+ tmp = &rw[i];
+ h = ipfw_find_op_rw(tmp->opcode);
+ if (h == NULL)
+ continue;
+
+ sz = (ctl3_rewriters + ctl3_rsize - (h + 1)) * sizeof(*h);
+ memmove(h, h + 1, sz);
+ ctl3_rsize--;
+ }
+
+ if (ctl3_rsize == 0) {
+ if (ctl3_rewriters != NULL)
+ free(ctl3_rewriters, M_IPFW);
+ ctl3_rewriters = NULL;
+ }
+
+ CTL3_UNLOCK();
+
+ return (0);
+}
+
+/*
* Compares two sopt handlers (code, version and handler ptr).
* Used both as qsort() and bsearch().
* Does not compare handler for latter case.
@@ -3150,6 +3639,23 @@ convert_rule_to_8(struct ip_fw_rule0 *rule)
*
*/
+void
+ipfw_init_srv(struct ip_fw_chain *ch)
+{
+
+ ch->srvmap = ipfw_objhash_create(IPFW_OBJECTS_DEFAULT);
+ ch->srvstate = malloc(sizeof(void *) * IPFW_OBJECTS_DEFAULT,
+ M_IPFW, M_WAITOK | M_ZERO);
+}
+
+void
+ipfw_destroy_srv(struct ip_fw_chain *ch)
+{
+
+ free(ch->srvstate, M_IPFW);
+ ipfw_objhash_destroy(ch->srvmap);
+}
+
/*
* Allocate new bitmask which can be used to enlarge/shrink
* named instance index.
@@ -3323,6 +3829,26 @@ ipfw_objhash_lookup_name(struct namedobj_instance *ni, uint32_t set, char *name)
return (NULL);
}
+/*
+ * Find named object by name, considering also its TLV type.
+ */
+struct named_object *
+ipfw_objhash_lookup_name_type(struct namedobj_instance *ni, uint32_t set,
+ uint32_t type, char *name)
+{
+ struct named_object *no;
+ uint32_t hash;
+
+ hash = ni->hash_f(ni, name, set) % ni->nn_size;
+
+ TAILQ_FOREACH(no, &ni->names[hash], nn_next) {
+ if (ni->cmp_f(no, name, set) == 0 && no->etlv == type)
+ return (no);
+ }
+
+ return (NULL);
+}
+
struct named_object *
ipfw_objhash_lookup_kidx(struct namedobj_instance *ni, uint16_t kidx)
{
diff --git a/sys/netpfil/ipfw/ip_fw_table.c b/sys/netpfil/ipfw/ip_fw_table.c
index 4498ace..ca4e0e4 100644
--- a/sys/netpfil/ipfw/ip_fw_table.c
+++ b/sys/netpfil/ipfw/ip_fw_table.c
@@ -89,6 +89,8 @@ struct table_config {
struct namedobj_instance *vi;
};
+static int find_table_err(struct namedobj_instance *ni, struct tid_info *ti,
+ struct table_config **tc);
static struct table_config *find_table(struct namedobj_instance *ni,
struct tid_info *ti);
static struct table_config *alloc_table_config(struct ip_fw_chain *ch,
@@ -122,7 +124,6 @@ static struct table_algo *find_table_algo(struct tables_config *tableconf,
static void objheader_to_ti(struct _ipfw_obj_header *oh, struct tid_info *ti);
static void ntlv_to_ti(struct _ipfw_obj_ntlv *ntlv, struct tid_info *ti);
-static int classify_table_opcode(ipfw_insn *cmd, uint16_t *puidx, uint8_t *ptype);
#define CHAIN_TO_NI(chain) (CHAIN_TO_TCFG(chain)->namehash)
#define KIDX_TO_TI(ch, k) (&(((struct table_info *)(ch)->tablestate)[k]))
@@ -297,7 +298,7 @@ find_ref_table(struct ip_fw_chain *ch, struct tid_info *ti,
tc = NULL;
if ((tc = find_table(ni, ti)) != NULL) {
/* check table type */
- if (tc->no.type != ti->type)
+ if (tc->no.subtype != ti->type)
return (EINVAL);
if (tc->locked != 0)
@@ -1116,7 +1117,7 @@ find_table_entry(struct ip_fw_chain *ch, ip_fw3_opheader *op3,
}
/* check table type */
- if (tc->no.type != ti.type) {
+ if (tc->no.subtype != ti.type) {
IPFW_UH_RUNLOCK(ch);
return (EINVAL);
}
@@ -1399,7 +1400,7 @@ swap_tables(struct ip_fw_chain *ch, struct tid_info *a,
}
/* Check type and value are the same */
- if (tc_a->no.type != tc_b->no.type || tc_a->tflags != tc_b->tflags) {
+ if (tc_a->no.subtype!=tc_b->no.subtype || tc_a->tflags!=tc_b->tflags) {
IPFW_UH_WUNLOCK(ch);
return (EINVAL);
}
@@ -1613,7 +1614,6 @@ ipfw_switch_tables_namespace(struct ip_fw_chain *ch, unsigned int sets)
ipfw_insn *cmd;
int cmdlen, i, l;
uint16_t kidx;
- uint8_t type;
IPFW_UH_WLOCK(ch);
@@ -1636,7 +1636,7 @@ ipfw_switch_tables_namespace(struct ip_fw_chain *ch, unsigned int sets)
for ( ; l > 0 ; l -= cmdlen, cmd += cmdlen) {
cmdlen = F_LEN(cmd);
- if (classify_table_opcode(cmd, &kidx, &type) != 0)
+ if (classify_opcode_kidx(cmd, &kidx) != 0)
continue;
no = ipfw_objhash_lookup_kidx(ni, kidx);
@@ -1920,7 +1920,7 @@ create_table_internal(struct ip_fw_chain *ch, struct tid_info *ti,
* requesting to create existing table
* which has the same type
*/
- if (compat == 0 || tc_new->no.type != tc->no.type) {
+ if (compat == 0 || tc_new->no.subtype != tc->no.subtype) {
IPFW_UH_WUNLOCK(ch);
free_table_config(ni, tc);
return (EEXIST);
@@ -1940,6 +1940,7 @@ create_table_internal(struct ip_fw_chain *ch, struct tid_info *ti,
return (EBUSY);
}
tc->no.kidx = kidx;
+ tc->no.etlv = IPFW_TLV_TBL_NAME;
IPFW_WLOCK(ch);
link_table(ch, tc);
@@ -1977,6 +1978,13 @@ objheader_to_ti(struct _ipfw_obj_header *oh, struct tid_info *ti)
ntlv_to_ti(&oh->ntlv, ti);
}
+struct namedobj_instance *
+ipfw_get_table_objhash(struct ip_fw_chain *ch)
+{
+
+ return (CHAIN_TO_NI(ch));
+}
+
/*
* Exports basic table info as name TLV.
* Used inside dump_static_rules() to provide info
@@ -2009,40 +2017,6 @@ ipfw_export_table_ntlv(struct ip_fw_chain *ch, uint16_t kidx,
return (0);
}
-/*
- * Marks every table kidx used in @rule with bit in @bmask.
- * Used to generate bitmask of referenced tables for given ruleset.
- *
- * Returns number of newly-referenced tables.
- */
-int
-ipfw_mark_table_kidx(struct ip_fw_chain *chain, struct ip_fw *rule,
- uint32_t *bmask)
-{
- int cmdlen, l, count;
- ipfw_insn *cmd;
- uint16_t kidx;
- uint8_t type;
-
- l = rule->cmd_len;
- cmd = rule->cmd;
- cmdlen = 0;
- count = 0;
- for ( ; l > 0 ; l -= cmdlen, cmd += cmdlen) {
- cmdlen = F_LEN(cmd);
-
- if (classify_table_opcode(cmd, &kidx, &type) != 0)
- continue;
-
- if ((bmask[kidx / 32] & (1 << (kidx % 32))) == 0)
- count++;
-
- bmask[kidx / 32] |= 1 << (kidx % 32);
- }
-
- return (count);
-}
-
struct dump_args {
struct ip_fw_chain *ch;
struct table_info *ti;
@@ -2111,7 +2085,7 @@ export_table_info(struct ip_fw_chain *ch, struct table_config *tc,
struct table_info *ti;
struct table_algo *ta;
- i->type = tc->no.type;
+ i->type = tc->no.subtype;
i->tflags = tc->tflags;
i->vmask = tc->vmask;
i->set = tc->no.set;
@@ -2296,7 +2270,7 @@ dump_table_v0(struct ip_fw_chain *ch, ip_fw3_opheader *op3,
xtbl->cnt = count;
xtbl->size = sz;
- xtbl->type = tc->no.type;
+ xtbl->type = tc->no.subtype;
xtbl->tbl = ti.uidx;
if (sd->valsize < sz) {
@@ -2440,7 +2414,7 @@ ipfw_dump_table_legacy(struct ip_fw_chain *ch, struct tid_info *ti,
ta = tc->ta;
/* This dump format supports IPv4 only */
- if (tc->no.type != IPFW_TABLE_ADDR)
+ if (tc->no.subtype != IPFW_TABLE_ADDR)
return (0);
memset(&da, 0, sizeof(da));
@@ -2531,7 +2505,7 @@ dump_table_xentry(void *e, void *arg)
pval = get_table_value(da->ch, da->tc, da->tent.v.kidx);
xent->value = ipfw_export_table_value_legacy(pval);
/* Apply some hacks */
- if (tc->no.type == IPFW_TABLE_ADDR && tent->subtype == AF_INET) {
+ if (tc->no.subtype == IPFW_TABLE_ADDR && tent->subtype == AF_INET) {
xent->k.addr6.s6_addr32[3] = tent->k.addr.s_addr;
xent->flags = IPFW_TCF_INET;
} else
@@ -2781,114 +2755,157 @@ list_table_algo(struct ip_fw_chain *ch, ip_fw3_opheader *op3,
return (0);
}
-/*
- * Tables rewriting code
- */
-
-/*
- * Determine table number and lookup type for @cmd.
- * Fill @tbl and @type with appropriate values.
- * Returns 0 for relevant opcodes, 1 otherwise.
- */
static int
-classify_table_opcode(ipfw_insn *cmd, uint16_t *puidx, uint8_t *ptype)
+classify_srcdst(ipfw_insn *cmd, uint16_t *puidx, uint8_t *ptype)
{
- ipfw_insn_if *cmdif;
- int skip;
- uint16_t v;
-
- skip = 1;
-
- switch (cmd->opcode) {
- case O_IP_SRC_LOOKUP:
- case O_IP_DST_LOOKUP:
- /* Basic IPv4/IPv6 or u32 lookups */
- *puidx = cmd->arg1;
- /* Assume ADDR by default */
- *ptype = IPFW_TABLE_ADDR;
- skip = 0;
+ /* Basic IPv4/IPv6 or u32 lookups */
+ *puidx = cmd->arg1;
+ /* Assume ADDR by default */
+ *ptype = IPFW_TABLE_ADDR;
+ int v;
- if (F_LEN(cmd) > F_INSN_SIZE(ipfw_insn_u32)) {
- /*
- * generic lookup. The key must be
- * in 32bit big-endian format.
- */
- v = ((ipfw_insn_u32 *)cmd)->d[1];
- switch (v) {
- case 0:
- case 1:
- /* IPv4 src/dst */
- break;
- case 2:
- case 3:
- /* src/dst port */
- *ptype = IPFW_TABLE_NUMBER;
- break;
- case 4:
- /* uid/gid */
- *ptype = IPFW_TABLE_NUMBER;
- break;
- case 5:
- /* jid */
- *ptype = IPFW_TABLE_NUMBER;
- break;
- case 6:
- /* dscp */
- *ptype = IPFW_TABLE_NUMBER;
- break;
- }
- }
- break;
- case O_XMIT:
- case O_RECV:
- case O_VIA:
- /* Interface table, possibly */
- cmdif = (ipfw_insn_if *)cmd;
- if (cmdif->name[0] != '\1')
+ if (F_LEN(cmd) > F_INSN_SIZE(ipfw_insn_u32)) {
+ /*
+ * generic lookup. The key must be
+ * in 32bit big-endian format.
+ */
+ v = ((ipfw_insn_u32 *)cmd)->d[1];
+ switch (v) {
+ case 0:
+ case 1:
+ /* IPv4 src/dst */
break;
-
- *ptype = IPFW_TABLE_INTERFACE;
- *puidx = cmdif->p.kidx;
- skip = 0;
- break;
- case O_IP_FLOW_LOOKUP:
- *puidx = cmd->arg1;
- *ptype = IPFW_TABLE_FLOW;
- skip = 0;
- break;
+ case 2:
+ case 3:
+ /* src/dst port */
+ *ptype = IPFW_TABLE_NUMBER;
+ break;
+ case 4:
+ /* uid/gid */
+ *ptype = IPFW_TABLE_NUMBER;
+ break;
+ case 5:
+ /* jid */
+ *ptype = IPFW_TABLE_NUMBER;
+ break;
+ case 6:
+ /* dscp */
+ *ptype = IPFW_TABLE_NUMBER;
+ break;
+ }
}
- return (skip);
+ return (0);
+}
+
+static int
+classify_via(ipfw_insn *cmd, uint16_t *puidx, uint8_t *ptype)
+{
+ ipfw_insn_if *cmdif;
+
+ /* Interface table, possibly */
+ cmdif = (ipfw_insn_if *)cmd;
+ if (cmdif->name[0] != '\1')
+ return (1);
+
+ *ptype = IPFW_TABLE_INTERFACE;
+ *puidx = cmdif->p.kidx;
+
+ return (0);
+}
+
+static int
+classify_flow(ipfw_insn *cmd, uint16_t *puidx, uint8_t *ptype)
+{
+
+ *puidx = cmd->arg1;
+ *ptype = IPFW_TABLE_FLOW;
+
+ return (0);
+}
+
+static void
+update_arg1(ipfw_insn *cmd, uint16_t idx)
+{
+
+ cmd->arg1 = idx;
}
-/*
- * Sets new table value for given opcode.
- * Assume the same opcodes as classify_table_opcode()
- */
static void
-update_table_opcode(ipfw_insn *cmd, uint16_t idx)
+update_via(ipfw_insn *cmd, uint16_t idx)
{
ipfw_insn_if *cmdif;
- switch (cmd->opcode) {
- case O_IP_SRC_LOOKUP:
- case O_IP_DST_LOOKUP:
- /* Basic IPv4/IPv6 or u32 lookups */
- cmd->arg1 = idx;
- break;
- case O_XMIT:
- case O_RECV:
- case O_VIA:
- /* Interface table, possibly */
- cmdif = (ipfw_insn_if *)cmd;
- cmdif->p.kidx = idx;
- break;
- case O_IP_FLOW_LOOKUP:
- cmd->arg1 = idx;
- break;
- }
+ cmdif = (ipfw_insn_if *)cmd;
+ cmdif->p.kidx = idx;
}
+static int
+table_findbyname(struct ip_fw_chain *ch, struct tid_info *ti,
+ struct named_object **pno)
+{
+ struct table_config *tc;
+ int error;
+
+ IPFW_UH_WLOCK_ASSERT(ch);
+
+ error = find_table_err(CHAIN_TO_NI(ch), ti, &tc);
+ if (error != 0)
+ return (error);
+
+ *pno = &tc->no;
+ return (0);
+}
+
+/* XXX: sets-sets! */
+static struct named_object *
+table_findbykidx(struct ip_fw_chain *ch, uint16_t idx)
+{
+ struct namedobj_instance *ni;
+ struct table_config *tc;
+
+ IPFW_UH_WLOCK_ASSERT(ch);
+ ni = CHAIN_TO_NI(ch);
+ tc = (struct table_config *)ipfw_objhash_lookup_kidx(ni, idx);
+ KASSERT(tc != NULL, ("Table with index %d not found", idx));
+
+ return (&tc->no);
+}
+
+static struct opcode_obj_rewrite opcodes[] = {
+ {
+ O_IP_SRC_LOOKUP, IPFW_TLV_TBL_NAME,
+ classify_srcdst, update_arg1,
+ table_findbyname, table_findbykidx, create_table_compat
+ },
+ {
+ O_IP_DST_LOOKUP, IPFW_TLV_TBL_NAME,
+ classify_srcdst, update_arg1,
+ table_findbyname, table_findbykidx, create_table_compat
+ },
+ {
+ O_IP_FLOW_LOOKUP, IPFW_TLV_TBL_NAME,
+ classify_flow, update_arg1,
+ table_findbyname, table_findbykidx, create_table_compat
+ },
+ {
+ O_XMIT, IPFW_TLV_TBL_NAME,
+ classify_via, update_via,
+ table_findbyname, table_findbykidx, create_table_compat
+ },
+ {
+ O_RECV, IPFW_TLV_TBL_NAME,
+ classify_via, update_via,
+ table_findbyname, table_findbykidx, create_table_compat
+ },
+ {
+ O_VIA, IPFW_TLV_TBL_NAME,
+ classify_via, update_via,
+ table_findbyname, table_findbykidx, create_table_compat
+ },
+};
+
+
/*
* Checks table name for validity.
* Enforce basic length checks, the rest
@@ -2960,10 +2977,11 @@ find_name_tlv(void *tlvs, int len, uint16_t uidx)
* or name in ntlv.
* Note @ti structure contains unchecked data from userland.
*
- * Returns pointer to table_config or NULL.
+ * Returns 0 in success and fills in @tc with found config
*/
-static struct table_config *
-find_table(struct namedobj_instance *ni, struct tid_info *ti)
+static int
+find_table_err(struct namedobj_instance *ni, struct tid_info *ti,
+ struct table_config **tc)
{
char *name, bname[16];
struct named_object *no;
@@ -2973,7 +2991,7 @@ find_table(struct namedobj_instance *ni, struct tid_info *ti)
if (ti->tlvs != NULL) {
ntlv = find_name_tlv(ti->tlvs, ti->tlen, ti->uidx);
if (ntlv == NULL)
- return (NULL);
+ return (EINVAL);
name = ntlv->name;
/*
@@ -2989,8 +3007,27 @@ find_table(struct namedobj_instance *ni, struct tid_info *ti)
}
no = ipfw_objhash_lookup_name(ni, set, name);
+ *tc = (struct table_config *)no;
+
+ return (0);
+}
+
+/*
+ * Finds table config based on either legacy index
+ * or name in ntlv.
+ * Note @ti structure contains unchecked data from userland.
+ *
+ * Returns pointer to table_config or NULL.
+ */
+static struct table_config *
+find_table(struct namedobj_instance *ni, struct tid_info *ti)
+{
+ struct table_config *tc;
+
+ if (find_table_err(ni, ti, &tc) != 0)
+ return (NULL);
- return ((struct table_config *)no);
+ return (tc);
}
/*
@@ -3016,6 +3053,7 @@ alloc_table_config(struct ip_fw_chain *ch, struct tid_info *ti,
name = ntlv->name;
set = ntlv->set;
} else {
+ /* Compat part: convert number to string representation */
snprintf(bname, sizeof(bname), "%d", ti->uidx);
name = bname;
set = 0;
@@ -3023,7 +3061,7 @@ alloc_table_config(struct ip_fw_chain *ch, struct tid_info *ti,
tc = malloc(sizeof(struct table_config), M_IPFW, M_WAITOK | M_ZERO);
tc->no.name = tc->tablename;
- tc->no.type = ta->type;
+ tc->no.subtype = ta->type;
tc->no.set = set;
tc->tflags = tflags;
tc->ta = ta;
@@ -3031,11 +3069,6 @@ alloc_table_config(struct ip_fw_chain *ch, struct tid_info *ti,
/* Set "shared" value type by default */
tc->vshared = 1;
- if (ti->tlvs == NULL) {
- tc->no.compat = 1;
- tc->no.uidx = ti->uidx;
- }
-
/* Preallocate data structures for new tables */
error = ta->init(ch, &tc->astate, &tc->ti_copy, aname, tflags);
if (error != 0) {
@@ -3211,7 +3244,6 @@ ipfw_move_tables_sets(struct ip_fw_chain *ch, ipfw_range_tlv *rt,
struct namedobj_instance *ni;
int bad, i, l, cmdlen;
uint16_t kidx;
- uint8_t type;
ipfw_insn *cmd;
IPFW_UH_WLOCK_ASSERT(ch);
@@ -3229,7 +3261,7 @@ ipfw_move_tables_sets(struct ip_fw_chain *ch, ipfw_range_tlv *rt,
cmdlen = 0;
for ( ; l > 0 ; l -= cmdlen, cmd += cmdlen) {
cmdlen = F_LEN(cmd);
- if (classify_table_opcode(cmd, &kidx, &type) != 0)
+ if (classify_opcode_kidx(cmd, &kidx) != 0)
continue;
no = ipfw_objhash_lookup_kidx(ni, kidx);
KASSERT(no != NULL,
@@ -3252,7 +3284,7 @@ ipfw_move_tables_sets(struct ip_fw_chain *ch, ipfw_range_tlv *rt,
cmdlen = 0;
for ( ; l > 0 ; l -= cmdlen, cmd += cmdlen) {
cmdlen = F_LEN(cmd);
- if (classify_table_opcode(cmd, &kidx, &type) != 0)
+ if (classify_opcode_kidx(cmd, &kidx) != 0)
continue;
no = ipfw_objhash_lookup_kidx(ni, kidx);
KASSERT(no != NULL,
@@ -3291,7 +3323,7 @@ ipfw_move_tables_sets(struct ip_fw_chain *ch, ipfw_range_tlv *rt,
cmdlen = 0;
for ( ; l > 0 ; l -= cmdlen, cmd += cmdlen) {
cmdlen = F_LEN(cmd);
- if (classify_table_opcode(cmd, &kidx, &type) != 0)
+ if (classify_opcode_kidx(cmd, &kidx) != 0)
continue;
no = ipfw_objhash_lookup_kidx(ni, kidx);
KASSERT(no != NULL,
@@ -3313,215 +3345,68 @@ ipfw_move_tables_sets(struct ip_fw_chain *ch, ipfw_range_tlv *rt,
}
/*
- * Finds and bumps refcount for tables referenced by given @rule.
+ * Finds and bumps refcount for objects referenced by given @rule.
* Auto-creates non-existing tables.
* Fills in @oib array with userland/kernel indexes.
- * First free oidx pointer is saved back in @oib.
*
* Returns 0 on success.
*/
static int
-find_ref_rule_tables(struct ip_fw_chain *ch, struct ip_fw *rule,
- struct rule_check_info *ci, struct obj_idx **oib, struct tid_info *ti)
+ref_rule_objects(struct ip_fw_chain *ch, struct ip_fw *rule,
+ struct rule_check_info *ci, struct obj_idx *oib, struct tid_info *ti)
{
- struct table_config *tc;
- struct namedobj_instance *ni;
- struct named_object *no;
int cmdlen, error, l, numnew;
- uint16_t kidx;
ipfw_insn *cmd;
- struct obj_idx *pidx, *pidx_first, *p;
+ struct obj_idx *pidx;
+ int found, unresolved;
- pidx_first = *oib;
- pidx = pidx_first;
+ pidx = oib;
l = rule->cmd_len;
cmd = rule->cmd;
cmdlen = 0;
error = 0;
numnew = 0;
+ found = 0;
+ unresolved = 0;
IPFW_UH_WLOCK(ch);
- ni = CHAIN_TO_NI(ch);
/* Increase refcount on each existing referenced table. */
for ( ; l > 0 ; l -= cmdlen, cmd += cmdlen) {
cmdlen = F_LEN(cmd);
- if (classify_table_opcode(cmd, &ti->uidx, &ti->type) != 0)
- continue;
-
- pidx->uidx = ti->uidx;
- pidx->type = ti->type;
-
- if ((tc = find_table(ni, ti)) != NULL) {
- if (tc->no.type != ti->type) {
- /* Incompatible types */
- error = EINVAL;
- break;
- }
-
- /* Reference found table and save kidx */
- tc->no.refcnt++;
- pidx->kidx = tc->no.kidx;
+ error = ref_opcode_object(ch, cmd, ti, pidx, &found, &unresolved);
+ if (error != 0)
+ break;
+ if (found || unresolved) {
+ pidx->off = rule->cmd_len - l;
pidx++;
- continue;
}
-
/*
* Compability stuff for old clients:
- * prepare to manually create non-existing tables.
+ * prepare to manually create non-existing objects.
*/
- pidx++;
- numnew++;
+ if (unresolved)
+ numnew++;
}
if (error != 0) {
/* Unref everything we have already done */
- for (p = *oib; p < pidx; p++) {
- if (p->kidx == 0)
- continue;
-
- /* Find & unref by existing idx */
- no = ipfw_objhash_lookup_kidx(ni, p->kidx);
- KASSERT(no != NULL, ("Ref'd table %d disappeared",
- p->kidx));
-
- no->refcnt--;
- }
- }
-
- IPFW_UH_WUNLOCK(ch);
-
- if (numnew == 0) {
- *oib = pidx;
- return (error);
- }
-
- /*
- * Compatibility stuff: do actual creation for non-existing,
- * but referenced tables.
- */
- for (p = pidx_first; p < pidx; p++) {
- if (p->kidx != 0)
- continue;
-
- ti->uidx = p->uidx;
- ti->type = p->type;
- ti->atype = 0;
-
- error = create_table_compat(ch, ti, &kidx);
- if (error == 0) {
- p->kidx = kidx;
- continue;
- }
-
- /* Error. We have to drop references */
- IPFW_UH_WLOCK(ch);
- for (p = pidx_first; p < pidx; p++) {
- if (p->kidx == 0)
- continue;
-
- /* Find & unref by existing idx */
- no = ipfw_objhash_lookup_kidx(ni, p->kidx);
- KASSERT(no != NULL, ("Ref'd table %d disappeared",
- p->kidx));
-
- no->refcnt--;
- }
+ unref_oib_objects(ch, rule->cmd, oib, pidx);
IPFW_UH_WUNLOCK(ch);
-
return (error);
}
- *oib = pidx;
-
- return (error);
-}
-
-/*
- * Remove references from every table used in @rule.
- */
-void
-ipfw_unref_rule_tables(struct ip_fw_chain *chain, struct ip_fw *rule)
-{
- int cmdlen, l;
- ipfw_insn *cmd;
- struct namedobj_instance *ni;
- struct named_object *no;
- uint16_t kidx;
- uint8_t type;
-
- IPFW_UH_WLOCK_ASSERT(chain);
- ni = CHAIN_TO_NI(chain);
-
- l = rule->cmd_len;
- cmd = rule->cmd;
- cmdlen = 0;
- for ( ; l > 0 ; l -= cmdlen, cmd += cmdlen) {
- cmdlen = F_LEN(cmd);
-
- if (classify_table_opcode(cmd, &kidx, &type) != 0)
- continue;
-
- no = ipfw_objhash_lookup_kidx(ni, kidx);
-
- KASSERT(no != NULL, ("table id %d not found", kidx));
- KASSERT(no->type == type, ("wrong type %d (%d) for table id %d",
- no->type, type, kidx));
- KASSERT(no->refcnt > 0, ("refcount for table %d is %d",
- kidx, no->refcnt));
-
- no->refcnt--;
- }
-}
-
-/*
- * Compatibility function for old ipfw(8) binaries.
- * Rewrites table kernel indices with userland ones.
- * Convert tables matching '/^\d+$/' to their atoi() value.
- * Use number 65535 for other tables.
- *
- * Returns 0 on success.
- */
-int
-ipfw_rewrite_table_kidx(struct ip_fw_chain *chain, struct ip_fw_rule0 *rule)
-{
- int cmdlen, error, l;
- ipfw_insn *cmd;
- uint16_t kidx, uidx;
- uint8_t type;
- struct named_object *no;
- struct namedobj_instance *ni;
-
- ni = CHAIN_TO_NI(chain);
- error = 0;
-
- l = rule->cmd_len;
- cmd = rule->cmd;
- cmdlen = 0;
- for ( ; l > 0 ; l -= cmdlen, cmd += cmdlen) {
- cmdlen = F_LEN(cmd);
-
- if (classify_table_opcode(cmd, &kidx, &type) != 0)
- continue;
+ IPFW_UH_WUNLOCK(ch);
- if ((no = ipfw_objhash_lookup_kidx(ni, kidx)) == NULL)
- return (1);
+ found = pidx - oib;
+ KASSERT(found == ci->object_opcodes,
+ ("refcount inconsistency: found: %d total: %d",
+ found, ci->object_opcodes));
- uidx = no->uidx;
- if (no->compat == 0) {
-
- /*
- * We are called via legacy opcode.
- * Save error and show table as fake number
- * not to make ipfw(8) hang.
- */
- uidx = 65535;
- error = 2;
- }
-
- update_table_opcode(cmd, uidx);
- }
+ /* Perform auto-creation for non-existing objects */
+ if (numnew != 0)
+ error = create_objects_compat(ch, rule->cmd, oib, pidx, ti);
return (error);
}
@@ -3534,31 +3419,27 @@ ipfw_rewrite_table_kidx(struct ip_fw_chain *chain, struct ip_fw_rule0 *rule)
* Returns 0 on success and appropriate error code otherwise.
*/
int
-ipfw_rewrite_table_uidx(struct ip_fw_chain *chain,
+ipfw_rewrite_rule_uidx(struct ip_fw_chain *chain,
struct rule_check_info *ci)
{
- int cmdlen, error, l;
+ int error;
ipfw_insn *cmd;
- uint16_t uidx;
uint8_t type;
- struct namedobj_instance *ni;
struct obj_idx *p, *pidx_first, *pidx_last;
struct tid_info ti;
- ni = CHAIN_TO_NI(chain);
-
/*
* Prepare an array for storing opcode indices.
* Use stack allocation by default.
*/
- if (ci->table_opcodes <= (sizeof(ci->obuf)/sizeof(ci->obuf[0]))) {
+ if (ci->object_opcodes <= (sizeof(ci->obuf)/sizeof(ci->obuf[0]))) {
/* Stack */
pidx_first = ci->obuf;
} else
- pidx_first = malloc(ci->table_opcodes * sizeof(struct obj_idx),
+ pidx_first = malloc(ci->object_opcodes * sizeof(struct obj_idx),
M_IPFW, M_WAITOK | M_ZERO);
- pidx_last = pidx_first;
+ pidx_last = pidx_first + ci->object_opcodes;
error = 0;
type = 0;
memset(&ti, 0, sizeof(ti));
@@ -3573,28 +3454,18 @@ ipfw_rewrite_table_uidx(struct ip_fw_chain *chain,
ti.tlen = ci->ctlv->head.length - sizeof(ipfw_obj_ctlv);
}
- /* Reference all used tables */
- error = find_ref_rule_tables(chain, ci->krule, ci, &pidx_last, &ti);
+ /* Reference all used tables and other objects */
+ error = ref_rule_objects(chain, ci->krule, ci, pidx_first, &ti);
if (error != 0)
goto free;
- IPFW_UH_WLOCK(chain);
-
/* Perform rule rewrite */
- l = ci->krule->cmd_len;
- cmd = ci->krule->cmd;
- cmdlen = 0;
p = pidx_first;
- for ( ; l > 0 ; l -= cmdlen, cmd += cmdlen) {
- cmdlen = F_LEN(cmd);
- if (classify_table_opcode(cmd, &uidx, &type) != 0)
- continue;
- update_table_opcode(cmd, p->kidx);
- p++;
+ for (p = pidx_first; p < pidx_last; p++) {
+ cmd = ci->krule->cmd + p->off;
+ update_opcode_kidx(cmd, p->kidx);
}
- IPFW_UH_WUNLOCK(chain);
-
free:
if (pidx_first != ci->obuf)
free(pidx_first, M_IPFW);
@@ -3641,6 +3512,7 @@ ipfw_destroy_tables(struct ip_fw_chain *ch, int last)
{
IPFW_DEL_SOPT_HANDLER(last, scodes);
+ IPFW_DEL_OBJ_REWRITER(last, opcodes);
/* Remove all tables from working set */
IPFW_UH_WLOCK(ch);
@@ -3678,6 +3550,7 @@ ipfw_init_tables(struct ip_fw_chain *ch, int first)
ipfw_table_value_init(ch, first);
ipfw_table_algo_init(ch);
+ IPFW_ADD_OBJ_REWRITER(first, opcodes);
IPFW_ADD_SOPT_HANDLER(first, scodes);
return (0);
}
diff --git a/sys/netpfil/ipfw/ip_fw_table.h b/sys/netpfil/ipfw/ip_fw_table.h
index 028e450..ca49fd4 100644
--- a/sys/netpfil/ipfw/ip_fw_table.h
+++ b/sys/netpfil/ipfw/ip_fw_table.h
@@ -53,16 +53,6 @@ struct table_info {
u_long data; /* Hints for given func */
};
-/* Internal structures for handling sockopt data */
-struct tid_info {
- uint32_t set; /* table set */
- uint16_t uidx; /* table index */
- uint8_t type; /* table type */
- uint8_t atype;
- void *tlvs; /* Pointer to first TLV */
- int tlen; /* Total TLV size block */
-};
-
struct table_value;
struct tentry_info {
void *paddr;
@@ -189,13 +179,12 @@ void rollback_table_values(struct tableop_state *ts);
int ipfw_rewrite_table_uidx(struct ip_fw_chain *chain,
struct rule_check_info *ci);
-int ipfw_rewrite_table_kidx(struct ip_fw_chain *chain,
- struct ip_fw_rule0 *rule);
int ipfw_mark_table_kidx(struct ip_fw_chain *chain, struct ip_fw *rule,
uint32_t *bmask);
int ipfw_export_table_ntlv(struct ip_fw_chain *ch, uint16_t kidx,
struct sockopt_data *sd);
void ipfw_unref_rule_tables(struct ip_fw_chain *chain, struct ip_fw *rule);
+struct namedobj_instance *ipfw_get_table_objhash(struct ip_fw_chain *ch);
/* utility functions */
int ipfw_check_table_name(char *name);
diff --git a/sys/netpfil/pf/pf.c b/sys/netpfil/pf/pf.c
index ce0c6bd..6d24634 100644
--- a/sys/netpfil/pf/pf.c
+++ b/sys/netpfil/pf/pf.c
@@ -6070,7 +6070,7 @@ pf_test6(int dir, struct ifnet *ifp, struct mbuf **m0, struct inpcb *inp)
M_ASSERTPKTHDR(m);
- if (ifp != m->m_pkthdr.rcvif)
+ if (dir == PF_OUT && m->m_pkthdr.rcvif && ifp != m->m_pkthdr.rcvif)
fwdir = PF_FWD;
if (!V_pf_status.running)
diff --git a/sys/netpfil/pf/pf_ioctl.c b/sys/netpfil/pf/pf_ioctl.c
index 359d9de..c20e00a 100644
--- a/sys/netpfil/pf/pf_ioctl.c
+++ b/sys/netpfil/pf/pf_ioctl.c
@@ -84,7 +84,7 @@ __FBSDID("$FreeBSD$");
#endif /* INET6 */
#ifdef ALTQ
-#include <altq/altq.h>
+#include <net/altq/altq.h>
#endif
static int pfattach(void);
diff --git a/sys/netpfil/pf/pf_norm.c b/sys/netpfil/pf/pf_norm.c
index 5ffb86d..f169723 100644
--- a/sys/netpfil/pf/pf_norm.c
+++ b/sys/netpfil/pf/pf_norm.c
@@ -1152,6 +1152,7 @@ pf_refragment6(struct ifnet *ifp, struct mbuf **m0, struct m_tag *mtag)
for (t = m; m; m = t) {
t = m->m_nextpkt;
m->m_nextpkt = NULL;
+ m->m_flags |= M_SKIP_FIREWALL;
memset(&pd, 0, sizeof(pd));
pd.pf_mtag = pf_find_mtag(m);
if (error == 0)
@@ -1642,7 +1643,7 @@ pf_normalize_tcp(int dir, struct pfi_kif *kif, struct mbuf *m, int ipoff,
goto tcp_drop;
if (flags & TH_FIN)
- flags &= ~TH_FIN;
+ goto tcp_drop;
} else {
/* Illegal packet */
if (!(flags & (TH_ACK|TH_RST)))
diff --git a/sys/nfsclient/nfs.h b/sys/nfsclient/nfs.h
index 22a291a..a085da1 100644
--- a/sys/nfsclient/nfs.h
+++ b/sys/nfsclient/nfs.h
@@ -114,10 +114,7 @@
#ifdef _KERNEL
#ifdef MALLOC_DECLARE
-MALLOC_DECLARE(M_NFSREQ);
MALLOC_DECLARE(M_NFSDIROFF);
-MALLOC_DECLARE(M_NFSBIGFH);
-MALLOC_DECLARE(M_NFSHASH);
MALLOC_DECLARE(M_NFSDIRECTIO);
#endif
diff --git a/sys/ofed/include/linux/file.h b/sys/ofed/include/linux/file.h
index 22a035f..f1a7398 100644
--- a/sys/ofed/include/linux/file.h
+++ b/sys/ofed/include/linux/file.h
@@ -82,7 +82,7 @@ put_unused_fd(unsigned int fd)
* installed, so no need to free the associated Linux file
* structure.
*/
- fdclose(curthread->td_proc->p_fd, file, fd, curthread);
+ fdclose(curthread, file, fd);
/* drop extra reference */
fdrop(file, curthread);
diff --git a/sys/ofed/include/linux/linux_idr.c b/sys/ofed/include/linux/linux_idr.c
index 809e178..a692fb8 100644
--- a/sys/ofed/include/linux/linux_idr.c
+++ b/sys/ofed/include/linux/linux_idr.c
@@ -185,27 +185,37 @@ out:
return (res);
}
-void *
-idr_find(struct idr *idr, int id)
+static inline void *
+idr_find_locked(struct idr *idr, int id)
{
struct idr_layer *il;
void *res;
int layer;
- res = NULL;
+ mtx_assert(&idr->lock, MA_OWNED);
+
id &= MAX_ID_MASK;
- mtx_lock(&idr->lock);
+ res = NULL;
il = idr->top;
layer = idr->layers - 1;
if (il == NULL || id > idr_max(idr))
- goto out;
+ return (NULL);
while (layer && il) {
il = il->ary[idr_pos(id, layer)];
layer--;
}
if (il != NULL)
res = il->ary[id & IDR_MASK];
-out:
+ return (res);
+}
+
+void *
+idr_find(struct idr *idr, int id)
+{
+ void *res;
+
+ mtx_lock(&idr->lock);
+ res = idr_find_locked(idr, id);
mtx_unlock(&idr->lock);
return (res);
}
@@ -331,13 +341,13 @@ idr_get_new(struct idr *idr, void *ptr, int *idp)
}
error = 0;
out:
- mtx_unlock(&idr->lock);
#ifdef INVARIANTS
- if (error == 0 && idr_find(idr, id) != ptr) {
+ if (error == 0 && idr_find_locked(idr, id) != ptr) {
panic("idr_get_new: Failed for idr %p, id %d, ptr %p\n",
idr, id, ptr);
}
#endif
+ mtx_unlock(&idr->lock);
return (error);
}
@@ -438,12 +448,12 @@ restart:
}
error = 0;
out:
- mtx_unlock(&idr->lock);
#ifdef INVARIANTS
- if (error == 0 && idr_find(idr, id) != ptr) {
+ if (error == 0 && idr_find_locked(idr, id) != ptr) {
panic("idr_get_new_above: Failed for idr %p, id %d, ptr %p\n",
idr, id, ptr);
}
#endif
+ mtx_unlock(&idr->lock);
return (error);
}
diff --git a/sys/opencrypto/cryptodeflate.c b/sys/opencrypto/cryptodeflate.c
index 0ad86e3..c55210d 100644
--- a/sys/opencrypto/cryptodeflate.c
+++ b/sys/opencrypto/cryptodeflate.c
@@ -29,7 +29,7 @@
/*
* This file contains a wrapper around the deflate algo compression
- * functions using the zlib library (see net/zlib.{c,h})
+ * functions using the zlib library (see libkern/zlib.c and sys/zlib.h})
*/
#include <sys/cdefs.h>
@@ -42,7 +42,7 @@ __FBSDID("$FreeBSD$");
#include <sys/kernel.h>
#include <sys/sdt.h>
#include <sys/systm.h>
-#include <net/zlib.h>
+#include <sys/zlib.h>
#include <opencrypto/cryptodev.h>
#include <opencrypto/deflate.h>
diff --git a/sys/opencrypto/deflate.h b/sys/opencrypto/deflate.h
index dcf7a84..d31a3bf 100644
--- a/sys/opencrypto/deflate.h
+++ b/sys/opencrypto/deflate.h
@@ -36,7 +36,7 @@
#ifndef _CRYPTO_DEFLATE_H_
#define _CRYPTO_DEFLATE_H_
-#include <net/zlib.h>
+#include <sys/zlib.h>
#define Z_METHOD 8
#define Z_MEMLEVEL 8
diff --git a/sys/opencrypto/gmac.h b/sys/opencrypto/gmac.h
index 79a9e11..909b78c 100644
--- a/sys/opencrypto/gmac.h
+++ b/sys/opencrypto/gmac.h
@@ -31,6 +31,7 @@
*/
#ifndef _GMAC_H_
+#define _GMAC_H_
#include "gfmult.h"
#include <crypto/rijndael/rijndael.h>
diff --git a/sys/pc98/pc98/genassym.c b/sys/pc98/pc98/genassym.c
new file mode 100644
index 0000000..26858e5
--- /dev/null
+++ b/sys/pc98/pc98/genassym.c
@@ -0,0 +1,3 @@
+/* $FreeBSD$ */
+
+#include "../../i386/i386/genassym.c"
diff --git a/sys/powerpc/aim/machdep.c b/sys/powerpc/aim/aim_machdep.c
index 22f3b2f..ab09ab6 100644
--- a/sys/powerpc/aim/machdep.c
+++ b/sys/powerpc/aim/aim_machdep.c
@@ -129,106 +129,14 @@ __FBSDID("$FreeBSD$");
#include <dev/ofw/openfirm.h>
-int cold = 1;
#ifdef __powerpc64__
extern int n_slbs;
-int cacheline_size = 128;
-#else
-int cacheline_size = 32;
#endif
-int hw_direct_map = 1;
-
-extern void *ap_pcpu;
-
-struct pcpu __pcpu[MAXCPU];
-
-static struct trapframe frame0;
-
-char machine[] = "powerpc";
-SYSCTL_STRING(_hw, HW_MACHINE, machine, CTLFLAG_RD, machine, 0, "");
-
-static void cpu_startup(void *);
-SYSINIT(cpu, SI_SUB_CPU, SI_ORDER_FIRST, cpu_startup, NULL);
-
-SYSCTL_INT(_machdep, CPU_CACHELINE, cacheline_size,
- CTLFLAG_RD, &cacheline_size, 0, "");
-
-uintptr_t powerpc_init(vm_offset_t, vm_offset_t, vm_offset_t, void *);
-
-long Maxmem = 0;
-long realmem = 0;
#ifndef __powerpc64__
struct bat battable[16];
#endif
-struct kva_md_info kmi;
-
-static void
-cpu_startup(void *dummy)
-{
-
- /*
- * Initialise the decrementer-based clock.
- */
- decr_init();
-
- /*
- * Good {morning,afternoon,evening,night}.
- */
- cpu_setup(PCPU_GET(cpuid));
-
-#ifdef PERFMON
- perfmon_init();
-#endif
- printf("real memory = %ld (%ld MB)\n", ptoa(physmem),
- ptoa(physmem) / 1048576);
- realmem = physmem;
-
- if (bootverbose)
- printf("available KVA = %zd (%zd MB)\n",
- virtual_end - virtual_avail,
- (virtual_end - virtual_avail) / 1048576);
-
- /*
- * Display any holes after the first chunk of extended memory.
- */
- if (bootverbose) {
- int indx;
-
- printf("Physical memory chunk(s):\n");
- for (indx = 0; phys_avail[indx + 1] != 0; indx += 2) {
- vm_offset_t size1 =
- phys_avail[indx + 1] - phys_avail[indx];
-
- #ifdef __powerpc64__
- printf("0x%016lx - 0x%016lx, %ld bytes (%ld pages)\n",
- #else
- printf("0x%08x - 0x%08x, %d bytes (%ld pages)\n",
- #endif
- phys_avail[indx], phys_avail[indx + 1] - 1, size1,
- size1 / PAGE_SIZE);
- }
- }
-
- vm_ksubmap_init(&kmi);
-
- printf("avail memory = %ld (%ld MB)\n", ptoa(vm_cnt.v_free_count),
- ptoa(vm_cnt.v_free_count) / 1048576);
-
- /*
- * Set up buffers, so they can be used to read disk labels.
- */
- bufinit();
- vm_pager_bufferinit();
-}
-
-extern vm_offset_t __startkernel, __endkernel;
-extern unsigned char __bss_start[];
-extern unsigned char __sbss_start[];
-extern unsigned char __sbss_end[];
-extern unsigned char _end[];
-
#ifndef __powerpc64__
/* Bits for running on 64-bit systems in 32-bit mode. */
extern void *testppc64, *testppc64size;
@@ -252,121 +160,25 @@ extern void *imisstrap, *imisssize;
extern void *dlmisstrap, *dlmisssize;
extern void *dsmisstrap, *dsmisssize;
-uintptr_t
-powerpc_init(vm_offset_t fdt, vm_offset_t toc, vm_offset_t ofentry, void *mdp)
+extern void *ap_pcpu;
+
+void aim_cpu_init(vm_offset_t toc);
+
+void
+aim_cpu_init(vm_offset_t toc)
{
- struct pcpu *pc;
- vm_offset_t startkernel, endkernel;
size_t trap_offset, trapsize;
vm_offset_t trap;
- void *kmdp;
- char *env;
register_t msr, scratch;
uint8_t *cache_check;
int cacheline_warn;
#ifndef __powerpc64__
int ppc64;
#endif
-#ifdef DDB
- vm_offset_t ksym_start;
- vm_offset_t ksym_end;
-#endif
- kmdp = NULL;
trap_offset = 0;
cacheline_warn = 0;
- /* First guess at start/end kernel positions */
- startkernel = __startkernel;
- endkernel = __endkernel;
-
- /* Check for ePAPR loader, which puts a magic value into r6 */
- if (mdp == (void *)0x65504150)
- mdp = NULL;
-
- /*
- * Parse metadata if present and fetch parameters. Must be done
- * before console is inited so cninit gets the right value of
- * boothowto.
- */
- if (mdp != NULL) {
- preload_metadata = mdp;
- kmdp = preload_search_by_type("elf kernel");
- if (kmdp != NULL) {
- boothowto = MD_FETCH(kmdp, MODINFOMD_HOWTO, int);
- kern_envp = MD_FETCH(kmdp, MODINFOMD_ENVP, char *);
- endkernel = ulmax(endkernel, MD_FETCH(kmdp,
- MODINFOMD_KERNEND, vm_offset_t));
-#ifdef DDB
- ksym_start = MD_FETCH(kmdp, MODINFOMD_SSYM, uintptr_t);
- ksym_end = MD_FETCH(kmdp, MODINFOMD_ESYM, uintptr_t);
- db_fetch_ksymtab(ksym_start, ksym_end);
-#endif
- }
- } else {
- bzero(__sbss_start, __sbss_end - __sbss_start);
- bzero(__bss_start, _end - __bss_start);
- }
-
- /* Store boot environment state */
- OF_initial_setup((void *)fdt, NULL, (int (*)(void *))ofentry);
-
- /*
- * Init params/tunables that can be overridden by the loader
- */
- init_param1();
-
- /*
- * Start initializing proc0 and thread0.
- */
- proc_linkup0(&proc0, &thread0);
- thread0.td_frame = &frame0;
-
- /*
- * Set up per-cpu data.
- */
- pc = __pcpu;
- pcpu_init(pc, 0, sizeof(struct pcpu));
- pc->pc_curthread = &thread0;
-#ifdef __powerpc64__
- __asm __volatile("mr 13,%0" :: "r"(pc->pc_curthread));
-#else
- __asm __volatile("mr 2,%0" :: "r"(pc->pc_curthread));
-#endif
- pc->pc_cpuid = 0;
-
- __asm __volatile("mtsprg 0, %0" :: "r"(pc));
-
- /*
- * Init mutexes, which we use heavily in PMAP
- */
-
- mutex_init();
-
- /*
- * Install the OF client interface
- */
-
- OF_bootstrap();
-
- /*
- * Initialize the console before printing anything.
- */
- cninit();
-
- /*
- * Complain if there is no metadata.
- */
- if (mdp == NULL || kmdp == NULL) {
- printf("powerpc_init: no loader metadata.\n");
- }
-
- /*
- * Init KDB
- */
-
- kdb_init();
-
/* Various very early CPU fix ups */
switch (mfpvr() >> 16) {
/*
@@ -431,9 +243,6 @@ powerpc_init(vm_offset_t fdt, vm_offset_t toc, vm_offset_t ofentry, void *mdp)
cacheline_size = 32;
}
- /* Make sure the kernel icache is valid before we go too much further */
- __syncicache((caddr_t)startkernel, endkernel - startkernel);
-
#ifndef __powerpc64__
/*
* Figure out whether we need to use the 64 bit PMAP. This works by
@@ -552,12 +361,6 @@ powerpc_init(vm_offset_t fdt, vm_offset_t toc, vm_offset_t ofentry, void *mdp)
}
/*
- * Choose a platform module so we can get the physical memory map.
- */
-
- platform_probe_and_attach();
-
- /*
* Initialise virtual memory. Use BUS_PROBE_GENERIC priority
* in case the platform module had a better idea of what we
* should do.
@@ -566,96 +369,6 @@ powerpc_init(vm_offset_t fdt, vm_offset_t toc, vm_offset_t ofentry, void *mdp)
pmap_mmu_install(MMU_TYPE_G5, BUS_PROBE_GENERIC);
else
pmap_mmu_install(MMU_TYPE_OEA, BUS_PROBE_GENERIC);
-
- pmap_bootstrap(startkernel, endkernel);
- mtmsr(PSL_KERNSET & ~PSL_EE);
-
- /*
- * Initialize params/tunables that are derived from memsize
- */
- init_param2(physmem);
-
- /*
- * Grab booted kernel's name
- */
- env = kern_getenv("kernelname");
- if (env != NULL) {
- strlcpy(kernelname, env, sizeof(kernelname));
- freeenv(env);
- }
-
- /*
- * Finish setting up thread0.
- */
- thread0.td_pcb = (struct pcb *)
- ((thread0.td_kstack + thread0.td_kstack_pages * PAGE_SIZE -
- sizeof(struct pcb)) & ~15UL);
- bzero((void *)thread0.td_pcb, sizeof(struct pcb));
- pc->pc_curpcb = thread0.td_pcb;
-
- /* Initialise the message buffer. */
- msgbufinit(msgbufp, msgbufsize);
-
-#ifdef KDB
- if (boothowto & RB_KDB)
- kdb_enter(KDB_WHY_BOOTFLAGS,
- "Boot flags requested debugger");
-#endif
-
- return (((uintptr_t)thread0.td_pcb -
- (sizeof(struct callframe) - 3*sizeof(register_t))) & ~15UL);
-}
-
-void
-bzero(void *buf, size_t len)
-{
- caddr_t p;
-
- p = buf;
-
- while (((vm_offset_t) p & (sizeof(u_long) - 1)) && len) {
- *p++ = 0;
- len--;
- }
-
- while (len >= sizeof(u_long) * 8) {
- *(u_long*) p = 0;
- *((u_long*) p + 1) = 0;
- *((u_long*) p + 2) = 0;
- *((u_long*) p + 3) = 0;
- len -= sizeof(u_long) * 8;
- *((u_long*) p + 4) = 0;
- *((u_long*) p + 5) = 0;
- *((u_long*) p + 6) = 0;
- *((u_long*) p + 7) = 0;
- p += sizeof(u_long) * 8;
- }
-
- while (len >= sizeof(u_long)) {
- *(u_long*) p = 0;
- len -= sizeof(u_long);
- p += sizeof(u_long);
- }
-
- while (len) {
- *p++ = 0;
- len--;
- }
-}
-
-void
-cpu_boot(int howto)
-{
-}
-
-/*
- * Flush the D-cache for non-DMA I/O so that the I-cache can
- * be made coherent later.
- */
-void
-cpu_flush_dcache(void *ptr, size_t len)
-{
- /* TBD */
}
/*
@@ -669,17 +382,6 @@ cpu_halt(void)
}
int
-ptrace_set_pc(struct thread *td, unsigned long addr)
-{
- struct trapframe *tf;
-
- tf = td->td_frame;
- tf->srr0 = (register_t)addr;
-
- return (0);
-}
-
-int
ptrace_single_step(struct thread *td)
{
struct trapframe *tf;
@@ -727,66 +429,7 @@ memcpy(pcpu->pc_slb, PCPU_GET(slb), sizeof(pcpu->pc_slb));
#endif
}
-void
-spinlock_enter(void)
-{
- struct thread *td;
- register_t msr;
-
- td = curthread;
- if (td->td_md.md_spinlock_count == 0) {
- __asm __volatile("or 2,2,2"); /* Set high thread priority */
- msr = intr_disable();
- td->td_md.md_spinlock_count = 1;
- td->td_md.md_saved_msr = msr;
- } else
- td->td_md.md_spinlock_count++;
- critical_enter();
-}
-
-void
-spinlock_exit(void)
-{
- struct thread *td;
- register_t msr;
-
- td = curthread;
- critical_exit();
- msr = td->td_md.md_saved_msr;
- td->td_md.md_spinlock_count--;
- if (td->td_md.md_spinlock_count == 0) {
- intr_restore(msr);
- __asm __volatile("or 6,6,6"); /* Set normal thread priority */
- }
-}
-
-int db_trap_glue(struct trapframe *); /* Called from trap_subr.S */
-
-int
-db_trap_glue(struct trapframe *frame)
-{
- if (!(frame->srr1 & PSL_PR)
- && (frame->exc == EXC_TRC || frame->exc == EXC_RUNMODETRC
- || (frame->exc == EXC_PGM
- && (frame->srr1 & 0x20000))
- || frame->exc == EXC_BPT
- || frame->exc == EXC_DSI)) {
- int type = frame->exc;
-
- /* Ignore DTrace traps. */
- if (*(uint32_t *)frame->srr0 == EXC_DTRACE)
- return (0);
- if (type == EXC_PGM && (frame->srr1 & 0x20000)) {
- type = T_BREAKPOINT;
- }
- return (kdb_trap(type, 0, frame));
- }
-
- return (0);
-}
-
#ifndef __powerpc64__
-
uint64_t
va_to_vsid(pmap_t pm, vm_offset_t va)
{
@@ -970,3 +613,4 @@ cpu_sleep()
enable_vec(curthread);
powerpc_sync();
}
+
diff --git a/sys/powerpc/aim/mmu_oea64.c b/sys/powerpc/aim/mmu_oea64.c
index 23bd449..c45f941 100644
--- a/sys/powerpc/aim/mmu_oea64.c
+++ b/sys/powerpc/aim/mmu_oea64.c
@@ -137,8 +137,6 @@ struct ofw_map {
extern unsigned char _etext[];
extern unsigned char _end[];
-extern int ofw_real_mode;
-
/*
* Map of physical memory regions.
*/
@@ -852,8 +850,7 @@ moea64_late_bootstrap(mmu_t mmup, vm_offset_t kernelstart, vm_offset_t kernelend
*/
chosen = OF_finddevice("/chosen");
- if (!ofw_real_mode && chosen != -1 &&
- OF_getprop(chosen, "mmu", &mmui, 4) != -1) {
+ if (chosen != -1 && OF_getprop(chosen, "mmu", &mmui, 4) != -1) {
mmu = OF_instance_to_package(mmui);
if (mmu == -1 ||
(sz = OF_getproplen(mmu, "translations")) == -1)
diff --git a/sys/powerpc/booke/machdep.c b/sys/powerpc/booke/booke_machdep.c
index f3ef9e3..2a27775 100644
--- a/sys/powerpc/booke/machdep.c
+++ b/sys/powerpc/booke/booke_machdep.c
@@ -83,6 +83,7 @@ __FBSDID("$FreeBSD$");
#include "opt_compat.h"
#include "opt_ddb.h"
+#include "opt_hwpmc_hooks.h"
#include "opt_kstack_pages.h"
#include "opt_platform.h"
@@ -162,6 +163,7 @@ extern unsigned char __bss_start[];
extern unsigned char __sbss_start[];
extern unsigned char __sbss_end[];
extern unsigned char _end[];
+extern vm_offset_t __endkernel;
/*
* Bootinfo is passed to us by legacy loaders. Save the address of the
@@ -169,25 +171,6 @@ extern unsigned char _end[];
*/
uint32_t *bootinfo;
-struct kva_md_info kmi;
-struct pcpu __pcpu[MAXCPU];
-struct trapframe frame0;
-int cold = 1;
-long realmem = 0;
-long Maxmem = 0;
-char machine[] = "powerpc";
-SYSCTL_STRING(_hw, HW_MACHINE, machine, CTLFLAG_RD, machine, 0, "");
-
-int cacheline_size = 32;
-
-SYSCTL_INT(_machdep, CPU_CACHELINE, cacheline_size,
- CTLFLAG_RD, &cacheline_size, 0, "");
-
-int hw_direct_map = 0;
-
-static void cpu_booke_startup(void *);
-SYSINIT(cpu, SI_SUB_CPU, SI_ORDER_FIRST, cpu_booke_startup, NULL);
-
void print_kernel_section_addr(void);
void print_kenv(void);
u_int booke_init(uint32_t, uint32_t);
@@ -208,6 +191,9 @@ extern void *int_watchdog;
extern void *int_data_tlb_error;
extern void *int_inst_tlb_error;
extern void *int_debug;
+#ifdef HWPMC_HOOKS
+extern void *int_performance_counter;
+#endif
#define SET_TRAP(ivor, handler) \
KASSERT(((uintptr_t)(&handler) & ~0xffffUL) == \
@@ -215,6 +201,16 @@ extern void *int_debug;
("Handler " #handler " too far from interrupt vector base")); \
mtspr(ivor, (uintptr_t)(&handler) & 0xffffUL);
+uintptr_t powerpc_init(vm_offset_t fdt, vm_offset_t, vm_offset_t, void *mdp);
+void booke_cpu_init(void);
+
+void
+booke_cpu_init(void)
+{
+
+ pmap_mmu_install(MMU_TYPE_BOOKE, BUS_PROBE_GENERIC);
+}
+
void
ivor_setup(void)
{
@@ -235,90 +231,9 @@ ivor_setup(void)
SET_TRAP(SPR_IVOR13, int_data_tlb_error);
SET_TRAP(SPR_IVOR14, int_inst_tlb_error);
SET_TRAP(SPR_IVOR15, int_debug);
-}
-
-static void
-cpu_booke_startup(void *dummy)
-{
- int indx;
- unsigned long size;
-
- /* Initialise the decrementer-based clock. */
- decr_init();
-
- /* Good {morning,afternoon,evening,night}. */
- cpu_setup(PCPU_GET(cpuid));
-
- printf("real memory = %lu (%ld MB)\n", ptoa(physmem),
- ptoa(physmem) / 1048576);
- realmem = physmem;
-
- /* Display any holes after the first chunk of extended memory. */
- if (bootverbose) {
- printf("Physical memory chunk(s):\n");
- for (indx = 0; phys_avail[indx + 1] != 0; indx += 2) {
- size = phys_avail[indx + 1] - phys_avail[indx];
-
- printf("0x%08x - 0x%08x, %lu bytes (%lu pages)\n",
- phys_avail[indx], phys_avail[indx + 1] - 1,
- size, size / PAGE_SIZE);
- }
- }
-
- vm_ksubmap_init(&kmi);
-
- printf("avail memory = %lu (%ld MB)\n", ptoa(vm_cnt.v_free_count),
- ptoa(vm_cnt.v_free_count) / 1048576);
-
- /* Set up buffers, so they can be used to read disk labels. */
- bufinit();
- vm_pager_bufferinit();
-}
-
-static char *
-kenv_next(char *cp)
-{
-
- if (cp != NULL) {
- while (*cp != 0)
- cp++;
- cp++;
- if (*cp == 0)
- cp = NULL;
- }
- return (cp);
-}
-
-void
-print_kenv(void)
-{
- int len;
- char *cp;
-
- debugf("loader passed (static) kenv:\n");
- if (kern_envp == NULL) {
- debugf(" no env, null ptr\n");
- return;
- }
- debugf(" kern_envp = 0x%08x\n", (u_int32_t)kern_envp);
-
- len = 0;
- for (cp = kern_envp; cp != NULL; cp = kenv_next(cp))
- debugf(" %x %s\n", (u_int32_t)cp, cp);
-}
-
-void
-print_kernel_section_addr(void)
-{
-
- debugf("kernel image addresses:\n");
- debugf(" kernel_text = 0x%08x\n", (uint32_t)kernel_text);
- debugf(" _etext (sdata) = 0x%08x\n", (uint32_t)_etext);
- debugf(" _edata = 0x%08x\n", (uint32_t)_edata);
- debugf(" __sbss_start = 0x%08x\n", (uint32_t)__sbss_start);
- debugf(" __sbss_end = 0x%08x\n", (uint32_t)__sbss_end);
- debugf(" __sbss_start = 0x%08x\n", (uint32_t)__bss_start);
- debugf(" _end = 0x%08x\n", (uint32_t)_end);
+#ifdef HWPMC_HOOKS
+ SET_TRAP(SPR_IVOR35, int_performance_counter);
+#endif
}
static int
@@ -338,24 +253,20 @@ booke_check_for_fdt(uint32_t arg1, vm_offset_t *dtbp)
return (0);
}
-u_int
+uintptr_t
booke_init(uint32_t arg1, uint32_t arg2)
{
- struct pcpu *pc;
- void *kmdp, *mdp;
+ uintptr_t ret;
+ void *mdp;
vm_offset_t dtbp, end;
-#ifdef DDB
- vm_offset_t ksym_start;
- vm_offset_t ksym_end;
-#endif
-
- kmdp = NULL;
end = (uintptr_t)_end;
dtbp = (vm_offset_t)NULL;
/* Set up TLB initially */
bootinfo = NULL;
+ bzero(__sbss_start, __sbss_end - __sbss_start);
+ bzero(__bss_start, _end - __bss_start);
tlb1_init();
/*
@@ -384,152 +295,22 @@ booke_init(uint32_t arg1, uint32_t arg2)
memmove((void *)end, (void *)dtbp, fdt_totalsize((void *)dtbp));
dtbp = end;
end += fdt_totalsize((void *)dtbp);
+ __endkernel = end;
mdp = NULL;
} else if (arg1 > (uintptr_t)kernel_text) /* FreeBSD loader */
mdp = (void *)arg1;
else /* U-Boot */
mdp = NULL;
- /*
- * Parse metadata and fetch parameters.
- */
- if (mdp != NULL) {
- preload_metadata = mdp;
- kmdp = preload_search_by_type("elf kernel");
- if (kmdp != NULL) {
- boothowto = MD_FETCH(kmdp, MODINFOMD_HOWTO, int);
- kern_envp = MD_FETCH(kmdp, MODINFOMD_ENVP, char *);
- dtbp = MD_FETCH(kmdp, MODINFOMD_DTBP, vm_offset_t);
- end = MD_FETCH(kmdp, MODINFOMD_KERNEND, vm_offset_t);
-
- bootinfo = (uint32_t *)preload_search_info(kmdp,
- MODINFO_METADATA | MODINFOMD_BOOTINFO);
-
-#ifdef DDB
- ksym_start = MD_FETCH(kmdp, MODINFOMD_SSYM, uintptr_t);
- ksym_end = MD_FETCH(kmdp, MODINFOMD_ESYM, uintptr_t);
- db_fetch_ksymtab(ksym_start, ksym_end);
-#endif
- }
- } else {
- bzero(__sbss_start, __sbss_end - __sbss_start);
- bzero(__bss_start, _end - __bss_start);
- }
-
-#if defined(FDT_DTB_STATIC)
- /*
- * In case the device tree blob was not retrieved (from metadata) try
- * to use the statically embedded one.
- */
- if (dtbp == (vm_offset_t)NULL)
- dtbp = (vm_offset_t)&fdt_static_dtb;
-#endif
-
- if (OF_install(OFW_FDT, 0) == FALSE)
- while (1);
-
- if (OF_init((void *)dtbp) != 0)
- while (1);
-
- OF_interpret("perform-fixup", 0);
-
/* Reset TLB1 to get rid of temporary mappings */
tlb1_init();
- /* Reset Time Base */
- mttb(0);
-
- /* Init params/tunables that can be overridden by the loader. */
- init_param1();
-
- /* Start initializing proc0 and thread0. */
- proc_linkup0(&proc0, &thread0);
- thread0.td_frame = &frame0;
-
- /* Set up per-cpu data and store the pointer in SPR general 0. */
- pc = &__pcpu[0];
- pcpu_init(pc, 0, sizeof(struct pcpu));
- pc->pc_curthread = &thread0;
-#ifdef __powerpc64__
- __asm __volatile("mr 13,%0" :: "r"(pc->pc_curthread));
-#else
- __asm __volatile("mr 2,%0" :: "r"(pc->pc_curthread));
-#endif
- __asm __volatile("mtsprg 0, %0" :: "r"(pc));
-
- /* Initialize system mutexes. */
- mutex_init();
-
- /* Initialize the console before printing anything. */
- cninit();
-
- /* Print out some debug info... */
- debugf("%s: console initialized\n", __func__);
- debugf(" arg3 mdp = 0x%08x\n", (u_int32_t)mdp);
- debugf(" end = 0x%08x\n", (u_int32_t)end);
- debugf(" boothowto = 0x%08x\n", boothowto);
-#ifdef MPC85XX
- debugf(" kernel ccsrbar = 0x%08x\n", CCSRBAR_VA);
-#endif
- debugf(" MSR = 0x%08x\n", mfmsr());
-#if defined(BOOKE_E500)
- debugf(" HID0 = 0x%08x\n", mfspr(SPR_HID0));
- debugf(" HID1 = 0x%08x\n", mfspr(SPR_HID1));
- debugf(" BUCSR = 0x%08x\n", mfspr(SPR_BUCSR));
-#endif
-
- debugf(" dtbp = 0x%08x\n", (uint32_t)dtbp);
-
- print_kernel_section_addr();
- print_kenv();
-#if defined(BOOKE_E500)
- //tlb1_print_entries();
- //tlb1_print_tlbentries();
-#endif
-
- kdb_init();
-
-#ifdef KDB
- if (boothowto & RB_KDB)
- kdb_enter(KDB_WHY_BOOTFLAGS, "Boot flags requested debugger");
-#endif
-
- /* Initialise platform module */
- platform_probe_and_attach();
-
- /* Initialise virtual memory. */
- pmap_mmu_install(MMU_TYPE_BOOKE, 0);
- pmap_bootstrap((uintptr_t)kernel_text, end);
- debugf("MSR = 0x%08x\n", mfmsr());
-#if defined(BOOKE_E500)
- //tlb1_print_entries();
- //tlb1_print_tlbentries();
-#endif
-
- /* Initialize params/tunables that are derived from memsize. */
- init_param2(physmem);
-
- /* Finish setting up thread0. */
- thread0.td_pcb = (struct pcb *)
- ((thread0.td_kstack + thread0.td_kstack_pages * PAGE_SIZE -
- sizeof(struct pcb)) & ~15);
- bzero((void *)thread0.td_pcb, sizeof(struct pcb));
- pc->pc_curpcb = thread0.td_pcb;
-
- /* Initialise the message buffer. */
- msgbufinit(msgbufp, msgbufsize);
-
- /* Enable Machine Check interrupt. */
- mtmsr(mfmsr() | PSL_ME);
- isync();
+ ret = powerpc_init(dtbp, 0, 0, mdp);
/* Enable L1 caches */
booke_enable_l1_cache();
- debugf("%s: SP = 0x%08x\n", __func__,
- ((uintptr_t)thread0.td_pcb - 16) & ~15);
-
- return (((uintptr_t)thread0.td_pcb - 16) & ~15);
+ return (ret);
}
#define RES_GRANULE 32
@@ -553,63 +334,6 @@ cpu_pcpu_init(struct pcpu *pcpu, int cpuid, size_t sz)
#endif
}
-/*
- * Flush the D-cache for non-DMA I/O so that the I-cache can
- * be made coherent later.
- */
-void
-cpu_flush_dcache(void *ptr, size_t len)
-{
- register_t addr, off;
-
- /*
- * Align the address to a cacheline and adjust the length
- * accordingly. Then round the length to a multiple of the
- * cacheline for easy looping.
- */
- addr = (uintptr_t)ptr;
- off = addr & (cacheline_size - 1);
- addr -= off;
- len = (len + off + cacheline_size - 1) & ~(cacheline_size - 1);
-
- while (len > 0) {
- __asm __volatile ("dcbf 0,%0" :: "r"(addr));
- __asm __volatile ("sync");
- addr += cacheline_size;
- len -= cacheline_size;
- }
-}
-
-void
-spinlock_enter(void)
-{
- struct thread *td;
- register_t msr;
-
- td = curthread;
- if (td->td_md.md_spinlock_count == 0) {
- msr = intr_disable();
- td->td_md.md_spinlock_count = 1;
- td->td_md.md_saved_msr = msr;
- } else
- td->td_md.md_spinlock_count++;
- critical_enter();
-}
-
-void
-spinlock_exit(void)
-{
- struct thread *td;
- register_t msr;
-
- td = curthread;
- critical_exit();
- msr = td->td_md.md_saved_msr;
- td->td_md.md_spinlock_count--;
- if (td->td_md.md_spinlock_count == 0)
- intr_restore(msr);
-}
-
/* Shutdown the CPU as much as possible. */
void
cpu_halt(void)
@@ -621,17 +345,6 @@ cpu_halt(void)
}
int
-ptrace_set_pc(struct thread *td, unsigned long addr)
-{
- struct trapframe *tf;
-
- tf = td->td_frame;
- tf->srr0 = (register_t)addr;
-
- return (0);
-}
-
-int
ptrace_single_step(struct thread *td)
{
struct trapframe *tf;
@@ -673,40 +386,3 @@ kdb_cpu_set_singlestep(void)
kdb_frame->srr1 |= PSL_DE;
}
-void
-bzero(void *buf, size_t len)
-{
- caddr_t p;
-
- p = buf;
-
- while (((vm_offset_t) p & (sizeof(u_long) - 1)) && len) {
- *p++ = 0;
- len--;
- }
-
- while (len >= sizeof(u_long) * 8) {
- *(u_long*) p = 0;
- *((u_long*) p + 1) = 0;
- *((u_long*) p + 2) = 0;
- *((u_long*) p + 3) = 0;
- len -= sizeof(u_long) * 8;
- *((u_long*) p + 4) = 0;
- *((u_long*) p + 5) = 0;
- *((u_long*) p + 6) = 0;
- *((u_long*) p + 7) = 0;
- p += sizeof(u_long) * 8;
- }
-
- while (len >= sizeof(u_long)) {
- *(u_long*) p = 0;
- len -= sizeof(u_long);
- p += sizeof(u_long);
- }
-
- while (len) {
- *p++ = 0;
- len--;
- }
-}
-
diff --git a/sys/powerpc/booke/interrupt.c b/sys/powerpc/booke/interrupt.c
index b5f6140..3786c68 100644
--- a/sys/powerpc/booke/interrupt.c
+++ b/sys/powerpc/booke/interrupt.c
@@ -32,6 +32,8 @@
* Interrupts are dispatched to here from locore asm
*/
+#include "opt_hwpmc_hooks.h"
+
#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
__FBSDID("$FreeBSD$");
@@ -45,6 +47,9 @@ __FBSDID("$FreeBSD$");
#include <sys/lock.h>
#include <sys/malloc.h>
#include <sys/mutex.h>
+#ifdef HWPMC_HOOKS
+#include <sys/pmckern.h>
+#endif
#include <sys/proc.h>
#include <sys/smp.h>
#include <sys/unistd.h>
@@ -67,6 +72,9 @@ void powerpc_decr_interrupt(struct trapframe *);
void powerpc_extr_interrupt(struct trapframe *);
void powerpc_crit_interrupt(struct trapframe *);
void powerpc_mchk_interrupt(struct trapframe *);
+#ifdef HWPMC_HOOKS
+void powerpc_pmc_interrupt(struct trapframe *framep);
+#endif
static void dump_frame(struct trapframe *framep);
@@ -142,3 +150,20 @@ powerpc_extr_interrupt(struct trapframe *framep)
critical_exit();
framep->srr1 &= ~PSL_WE;
}
+
+#ifdef HWPMC_HOOKS
+/*
+ * Performance Counter interrupt routine
+ */
+void
+powerpc_pmc_interrupt(struct trapframe *framep)
+{
+
+ critical_enter();
+ KASSERT(pmc_intr != NULL, ("Performance exception, but no handler!"));
+ (*pmc_intr)(PCPU_GET(cpuid), framep);
+ critical_exit();
+ if (pmc_hook && (PCPU_GET(curthread)->td_pflags & TDP_CALLCHAIN))
+ pmc_hook(PCPU_GET(curthread), PMC_FN_USER_CALLCHAIN, framep);
+}
+#endif
diff --git a/sys/powerpc/booke/locore.S b/sys/powerpc/booke/locore.S
index 37860e5..330a61f 100644
--- a/sys/powerpc/booke/locore.S
+++ b/sys/powerpc/booke/locore.S
@@ -28,6 +28,8 @@
#include "assym.s"
+#include "opt_hwpmc_hooks.h"
+
#include <machine/asm.h>
#include <machine/hid.h>
#include <machine/param.h>
@@ -722,12 +724,10 @@ setfault:
lwz %r4, TD_PCB(%r2)
stw %r3, PCB_ONFAULT(%r4)
mfcr %r10
- mfctr %r11
- mfxer %r12
stw %r0, 0(%r3)
stw %r1, 4(%r3)
stw %r2, 8(%r3)
- stmw %r10, 12(%r3) /* store CR, CTR, XER, [r13 .. r31] */
+ stmw %r13, 12(%r3) /* store CR, CTR, XER, [r13 .. r31] */
li %r3, 0 /* return FALSE */
blr
diff --git a/sys/powerpc/booke/pmap.c b/sys/powerpc/booke/pmap.c
index 2c6df63..c5e3bf3 100644
--- a/sys/powerpc/booke/pmap.c
+++ b/sys/powerpc/booke/pmap.c
@@ -1031,13 +1031,8 @@ mmu_booke_bootstrap(mmu_t mmu, vm_offset_t start, vm_offset_t kernelend)
* Align kernel start and end address (kernel image).
* Note that kernel end does not necessarily relate to kernsize.
* kernsize is the size of the kernel that is actually mapped.
- * Also note that "start - 1" is deliberate. With SMP, the
- * entry point is exactly a page from the actual load address.
- * As such, trunc_page() has no effect and we're off by a page.
- * Since we always have the ELF header between the load address
- * and the entry point, we can safely subtract 1 to compensate.
*/
- kernstart = trunc_page(start - 1);
+ kernstart = trunc_page(start);
data_start = round_page(kernelend);
data_end = data_start;
diff --git a/sys/powerpc/booke/trap.c b/sys/powerpc/booke/trap.c
deleted file mode 100644
index d1899ef..0000000
--- a/sys/powerpc/booke/trap.c
+++ /dev/null
@@ -1,519 +0,0 @@
-/*-
- * Copyright (C) 1995, 1996 Wolfgang Solfrank.
- * Copyright (C) 1995, 1996 TooLs GmbH.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by TooLs GmbH.
- * 4. The name of TooLs GmbH may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY TOOLS GMBH ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * $NetBSD: trap.c,v 1.58 2002/03/04 04:07:35 dbj Exp $
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include "opt_fpu_emu.h"
-
-#include <sys/param.h>
-#include <sys/kdb.h>
-#include <sys/proc.h>
-#include <sys/ktr.h>
-#include <sys/lock.h>
-#include <sys/mutex.h>
-#include <sys/pioctl.h>
-#include <sys/ptrace.h>
-#include <sys/reboot.h>
-#include <sys/syscall.h>
-#include <sys/sysent.h>
-#include <sys/systm.h>
-#include <sys/kernel.h>
-#include <sys/uio.h>
-#include <sys/signalvar.h>
-#include <sys/vmmeter.h>
-
-#include <security/audit/audit.h>
-
-#include <vm/vm.h>
-#include <vm/pmap.h>
-#include <vm/vm_extern.h>
-#include <vm/vm_param.h>
-#include <vm/vm_kern.h>
-#include <vm/vm_map.h>
-#include <vm/vm_page.h>
-
-#include <machine/cpu.h>
-#include <machine/db_machdep.h>
-#include <machine/frame.h>
-#include <machine/pcb.h>
-#include <machine/pmap.h>
-#include <machine/psl.h>
-#include <machine/trap.h>
-#include <machine/spr.h>
-
-#define FAULTBUF_LR 0
-#define FAULTBUF_R1 1
-#define FAULTBUF_R2 2
-#define FAULTBUF_CR 3
-#define FAULTBUF_CTR 4
-#define FAULTBUF_XER 5
-#define FAULTBUF_R13 6
-
-static void trap_fatal(struct trapframe *frame);
-static void printtrap(u_int vector, struct trapframe *frame, int isfatal,
- int user);
-static int trap_pfault(struct trapframe *frame, int user);
-static int fix_unaligned(struct thread *td, struct trapframe *frame);
-static int handle_onfault(struct trapframe *frame);
-static void syscall(struct trapframe *frame);
-
-struct powerpc_exception {
- u_int vector;
- char *name;
-};
-
-static struct powerpc_exception powerpc_exceptions[] = {
- { EXC_CRIT, "critical input" },
- { EXC_MCHK, "machine check" },
- { EXC_DSI, "data storage interrupt" },
- { EXC_ISI, "instruction storage interrupt" },
- { EXC_EXI, "external interrupt" },
- { EXC_ALI, "alignment" },
- { EXC_PGM, "program" },
- { EXC_SC, "system call" },
- { EXC_APU, "auxiliary proc unavailable" },
- { EXC_DECR, "decrementer" },
- { EXC_FIT, "fixed-interval timer" },
- { EXC_WDOG, "watchdog timer" },
- { EXC_DTMISS, "data tlb miss" },
- { EXC_ITMISS, "instruction tlb miss" },
- { EXC_DEBUG, "debug" },
- { EXC_PERF, "performance monitoring" },
- { EXC_LAST, NULL }
-};
-
-static const char *
-trapname(u_int vector)
-{
- struct powerpc_exception *pe;
-
- for (pe = powerpc_exceptions; pe->vector != EXC_LAST; pe++) {
- if (pe->vector == vector)
- return (pe->name);
- }
-
- return ("unknown");
-}
-
-void
-trap(struct trapframe *frame)
-{
- struct thread *td;
- struct proc *p;
- int sig, type, user;
- ksiginfo_t ksi;
-
-#ifdef KDB
- if (kdb_active) {
- kdb_reenter();
- return;
- }
-#endif
-
- PCPU_INC(cnt.v_trap);
-
- td = curthread;
- p = td->td_proc;
-
- type = frame->exc;
- sig = 0;
- user = (frame->srr1 & PSL_PR) ? 1 : 0;
-
- CTR3(KTR_TRAP, "trap: %s type=%s (%s)", p->p_comm,
- trapname(type), user ? "user" : "kernel");
-
- if (user) {
- td->td_frame = frame;
- if (td->td_ucred != p->p_ucred)
- cred_update_thread(td);
-
- /* User Mode Traps */
- switch (type) {
- case EXC_DSI:
- case EXC_ISI:
- sig = trap_pfault(frame, 1);
- break;
-
- case EXC_SC:
- syscall(frame);
- break;
-
- case EXC_ALI:
- if (fix_unaligned(td, frame) != 0)
- sig = SIGBUS;
- else
- frame->srr0 += 4;
- break;
-
- case EXC_DEBUG: /* Single stepping */
- mtspr(SPR_DBSR, mfspr(SPR_DBSR));
- frame->srr1 &= ~PSL_DE;
- frame->cpu.booke.dbcr0 &= ~(DBCR0_IDM || DBCR0_IC);
- sig = SIGTRAP;
- break;
-
- case EXC_PGM: /* Program exception */
- sig = ppc_instr_emulate(frame, td->td_pcb);
- break;
-
- default:
- trap_fatal(frame);
- }
- } else {
- /* Kernel Mode Traps */
- KASSERT(cold || td->td_ucred != NULL,
- ("kernel trap doesn't have ucred"));
-
- switch (type) {
- case EXC_DEBUG:
- mtspr(SPR_DBSR, mfspr(SPR_DBSR));
- kdb_trap(frame->exc, 0, frame);
- return;
-
- case EXC_DSI:
- if (trap_pfault(frame, 0) == 0)
- return;
- break;
-
- case EXC_MCHK:
- if (handle_onfault(frame))
- return;
- break;
-#ifdef KDB
- case EXC_PGM:
- if (frame->cpu.booke.esr & ESR_PTR)
- kdb_trap(EXC_PGM, 0, frame);
- return;
-#endif
- default:
- break;
- }
- trap_fatal(frame);
- }
-
- if (sig != 0) {
- if (p->p_sysent->sv_transtrap != NULL)
- sig = (p->p_sysent->sv_transtrap)(sig, type);
- ksiginfo_init_trap(&ksi);
- ksi.ksi_signo = sig;
- ksi.ksi_code = type; /* XXX, not POSIX */
- /* ksi.ksi_addr = ? */
- ksi.ksi_trapno = type;
- trapsignal(td, &ksi);
- }
-
- userret(td, frame);
-}
-
-static void
-trap_fatal(struct trapframe *frame)
-{
-
- printtrap(frame->exc, frame, 1, (frame->srr1 & PSL_PR));
-#ifdef KDB
- if ((debugger_on_panic || kdb_active) &&
- kdb_trap(frame->exc, 0, frame))
- return;
-#endif
- panic("%s trap", trapname(frame->exc));
-}
-
-static void
-printtrap(u_int vector, struct trapframe *frame, int isfatal, int user)
-{
- register_t va = 0;
-
- printf("\n");
- printf("%s %s trap:\n", isfatal ? "fatal" : "handled",
- user ? "user" : "kernel");
- printf("\n");
- printf(" exception = 0x%x (%s)\n", vector, trapname(vector));
-
- switch (vector) {
- case EXC_DTMISS:
- case EXC_DSI:
- va = frame->dar;
- break;
-
- case EXC_ITMISS:
- case EXC_ISI:
- va = frame->srr0;
- break;
- }
-
- printf(" virtual address = 0x%08x\n", va);
- printf(" srr0 = 0x%08x\n", frame->srr0);
- printf(" srr1 = 0x%08x\n", frame->srr1);
- printf(" curthread = %p\n", curthread);
- if (curthread != NULL)
- printf(" pid = %d, comm = %s\n",
- curthread->td_proc->p_pid, curthread->td_proc->p_comm);
- printf("\n");
-}
-
-/*
- * Handles a fatal fault when we have onfault state to recover. Returns
- * non-zero if there was onfault recovery state available.
- */
-static int
-handle_onfault(struct trapframe *frame)
-{
- struct thread *td;
- faultbuf *fb;
-
- td = curthread;
- fb = td->td_pcb->pcb_onfault;
- if (fb != NULL) {
- frame->srr0 = (*fb)[FAULTBUF_LR];
- frame->fixreg[1] = (*fb)[FAULTBUF_R1];
- frame->fixreg[2] = (*fb)[FAULTBUF_R2];
- frame->fixreg[3] = 1;
- frame->cr = (*fb)[FAULTBUF_CR];
- frame->ctr = (*fb)[FAULTBUF_CTR];
- frame->xer = (*fb)[FAULTBUF_XER];
- bcopy(&(*fb)[FAULTBUF_R13], &frame->fixreg[13],
- 19 * sizeof(register_t));
- return (1);
- }
- return (0);
-}
-
-int
-cpu_fetch_syscall_args(struct thread *td, struct syscall_args *sa)
-{
- struct proc *p;
- struct trapframe *frame;
- caddr_t params;
- int error, n;
-
- p = td->td_proc;
- frame = td->td_frame;
-
- sa->code = frame->fixreg[0];
- params = (caddr_t)(frame->fixreg + FIRSTARG);
- n = NARGREG;
-
- if (sa->code == SYS_syscall) {
- /*
- * code is first argument,
- * followed by actual args.
- */
- sa->code = *(u_int *) params;
- params += sizeof(register_t);
- n -= 1;
- } else if (sa->code == SYS___syscall) {
- /*
- * Like syscall, but code is a quad,
- * so as to maintain quad alignment
- * for the rest of the args.
- */
- params += sizeof(register_t);
- sa->code = *(u_int *) params;
- params += sizeof(register_t);
- n -= 2;
- }
-
- if (p->p_sysent->sv_mask)
- sa->code &= p->p_sysent->sv_mask;
- if (sa->code >= p->p_sysent->sv_size)
- sa->callp = &p->p_sysent->sv_table[0];
- else
- sa->callp = &p->p_sysent->sv_table[sa->code];
- sa->narg = sa->callp->sy_narg;
-
- bcopy(params, sa->args, n * sizeof(register_t));
- if (sa->narg > n) {
- error = copyin(MOREARGS(frame->fixreg[1]), sa->args + n,
- (sa->narg - n) * sizeof(register_t));
- } else
- error = 0;
-
- if (error == 0) {
- td->td_retval[0] = 0;
- td->td_retval[1] = frame->fixreg[FIRSTARG + 1];
- }
- return (error);
-}
-
-#include "../../kern/subr_syscall.c"
-
-void
-syscall(struct trapframe *frame)
-{
- struct thread *td;
- struct syscall_args sa;
- int error;
-
- td = curthread;
- td->td_frame = frame;
-
- error = syscallenter(td, &sa);
- syscallret(td, error, &sa);
-}
-
-static int
-trap_pfault(struct trapframe *frame, int user)
-{
- vm_offset_t eva, va;
- struct thread *td;
- struct proc *p;
- vm_map_t map;
- vm_prot_t ftype;
- int rv;
-
- td = curthread;
- p = td->td_proc;
-
- if (frame->exc == EXC_ISI) {
- eva = frame->srr0;
- ftype = VM_PROT_READ | VM_PROT_EXECUTE;
-
- } else {
- eva = frame->dar;
- if (frame->cpu.booke.esr & ESR_ST)
- ftype = VM_PROT_WRITE;
- else
- ftype = VM_PROT_READ;
- }
-
- if (user) {
- KASSERT(p->p_vmspace != NULL, ("trap_pfault: vmspace NULL"));
- map = &p->p_vmspace->vm_map;
- } else {
- if (eva < VM_MAXUSER_ADDRESS) {
-
- if (p->p_vmspace == NULL)
- return (SIGSEGV);
-
- map = &p->p_vmspace->vm_map;
-
- } else {
- map = kernel_map;
- }
- }
- va = trunc_page(eva);
-
- if (map != kernel_map) {
- /*
- * Keep swapout from messing with us during this
- * critical time.
- */
- PROC_LOCK(p);
- ++p->p_lock;
- PROC_UNLOCK(p);
-
- /* Fault in the user page: */
- rv = vm_fault(map, va, ftype, VM_FAULT_NORMAL);
-
- PROC_LOCK(p);
- --p->p_lock;
- PROC_UNLOCK(p);
- } else {
- /*
- * Don't have to worry about process locking or stacks in the
- * kernel.
- */
- rv = vm_fault(map, va, ftype, VM_FAULT_NORMAL);
- }
-
- if (rv == KERN_SUCCESS)
- return (0);
-
- if (!user && handle_onfault(frame))
- return (0);
-
- return ((rv == KERN_PROTECTION_FAILURE) ? SIGBUS : SIGSEGV);
-}
-
-/*
- * For now, this only deals with the particular unaligned access case
- * that gcc tends to generate. Eventually it should handle all of the
- * possibilities that can happen on a 32-bit PowerPC in big-endian mode.
- */
-
-static int
-fix_unaligned(struct thread *td, struct trapframe *frame)
-{
-#if 0
- struct thread *fputhread;
- int indicator, reg;
- double *fpr;
-
- indicator = EXC_ALI_OPCODE_INDICATOR(frame->dsisr);
-
- switch (indicator) {
- case EXC_ALI_LFD:
- case EXC_ALI_STFD:
- reg = EXC_ALI_RST(frame->dsisr);
- fpr = &td->td_pcb->pcb_fpu.fpr[reg];
- fputhread = PCPU_GET(fputhread);
- /* Juggle the FPU to ensure that we've initialized
- * the FPRs, and that their current state is in
- * the PCB.
- */
- if (fputhread != td) {
- if (fputhread)
- save_fpu(fputhread);
- enable_fpu(td);
- }
- save_fpu(td);
-
- if (indicator == EXC_ALI_LFD) {
- if (copyin((void *)frame->dar, fpr,
- sizeof(double)) != 0)
- return -1;
- enable_fpu(td);
- } else {
- if (copyout(fpr, (void *)frame->dar,
- sizeof(double)) != 0)
- return -1;
- }
- return 0;
- break;
- }
-
-#endif
- return (-1);
-}
-
-#ifdef KDB
-int db_trap_glue(struct trapframe *);
-int
-db_trap_glue(struct trapframe *tf)
-{
- if (!(tf->srr1 & PSL_PR))
- return (kdb_trap(tf->exc, 0, tf));
- return (0);
-}
-#endif
diff --git a/sys/powerpc/booke/trap_subr.S b/sys/powerpc/booke/trap_subr.S
index bc6bad3..c585f14 100644
--- a/sys/powerpc/booke/trap_subr.S
+++ b/sys/powerpc/booke/trap_subr.S
@@ -497,6 +497,19 @@ INTERRUPT(int_watchdog)
b trap_common
+#ifdef HWPMC_HOOKS
+/*****************************************************************************
+ * PMC Interrupt
+ ****************************************************************************/
+INTERRUPT(int_performance_counter)
+ STANDARD_PROLOG(SPR_SPRG3, PC_TEMPSAVE, SPR_SRR0, SPR_SRR1)
+ FRAME_SETUP(SPR_SPRG3, PC_TEMPSAVE, EXC_PERF)
+ addi %r3, %r1, 8
+ bl CNAME(powerpc_pmc_interrupt)
+ b trapexit
+#endif
+
+
/*****************************************************************************
* Data TLB miss interrupt
*
diff --git a/sys/powerpc/conf/GENERIC b/sys/powerpc/conf/GENERIC
index e3939be..b5bf850 100644
--- a/sys/powerpc/conf/GENERIC
+++ b/sys/powerpc/conf/GENERIC
@@ -32,6 +32,7 @@ options PSIM #GDB PSIM ppc simulator
options MAMBO #IBM Mambo Full System Simulator
options PSERIES #PAPR-compliant systems
+options FDT
options SCHED_ULE #ULE scheduler
options PREEMPTION #Enable kernel thread preemption
options INET #InterNETworking
diff --git a/sys/powerpc/include/pmc_mdep.h b/sys/powerpc/include/pmc_mdep.h
index 87dc76c..eb74b56 100644
--- a/sys/powerpc/include/pmc_mdep.h
+++ b/sys/powerpc/include/pmc_mdep.h
@@ -7,9 +7,7 @@
#ifndef _MACHINE_PMC_MDEP_H_
#define _MACHINE_PMC_MDEP_H_
-#define PMC_MDEP_CLASS_INDEX_CPU 1
-#define PMC_MDEP_CLASS_INDEX_PPC7450 1
-#define PMC_MDEP_CLASS_INDEX_PPC970 1
+#define PMC_MDEP_CLASS_INDEX_POWERPC 1
union pmc_md_op_pmcallocate {
uint64_t __pad[4];
@@ -19,6 +17,60 @@ union pmc_md_op_pmcallocate {
#define PMCLOG_READADDR PMCLOG_READ32
#define PMCLOG_EMITADDR PMCLOG_EMIT32
+#define mtpmr(reg, val) \
+ __asm __volatile("mtpmr %0,%1" : : "K"(reg), "r"(val))
+#define mfpmr(reg) \
+ ( { register_t val; \
+ __asm __volatile("mfpmr %0,%1" : "=r"(val) : "K"(reg)); \
+ val; } )
+
+#define PMR_PMC0 16
+#define PMR_PMC1 17
+#define PMR_PMC2 18
+#define PMR_PMC3 19
+#define PMR_PMLCa0 144
+#define PMLCax_FC 0x80000000
+#define PMLCax_FCS 0x40000000
+#define PMLCax_FCU 0x20000000
+#define PMLCax_FCM1 0x10000000
+#define PMLCax_FCM0 0x08000000
+#define PMLCax_CE 0x04000000
+#define PMLCax_EVENT(x) ((x) << 16)
+#define PMLCax_FCGS1 0x00000002
+#define PMLCax_FCGS0 0x00000001
+#define PMR_PMLCa1 145
+#define PMR_PMLCa2 146
+#define PMR_PMLCa3 147
+#define PMR_PMLCb0 272
+#define PMLCbx_TRIGONCTL(x) ((x) << 28)
+#define PMLCbx_TRIGOFFCTL(x) ((x) << 24)
+#define PMLCbx_PMCC 0x00800000
+#define PMLCbx_PMP(x) ((x) << 13)
+#define PMLCbx_TREHMUL(x) ((x) << 8)
+#define PMLCbx_TRESHOLD(x) ((x) << 0)
+#define PMR_PMLCb1 273
+#define PMR_PMLCb2 274
+#define PMR_PMLCb3 275
+#define PMR_PMGC0 400
+#define PMGC_FAC 0x80000000
+#define PMGC_PMIE 0x40000000
+#define PMGC_FCECE 0x20000000
+#define PMGC_TBSEL(x) ((x) << 11)
+#define PMGC_TBEE 0x00000100
+#define PMR_UPMC0 0
+#define PMR_UPMC1 1
+#define PMR_UPMC2 2
+#define PMR_UPMC3 3
+#define PMR_UPMLCa0 128
+#define PMR_UPMLCa1 129
+#define PMR_UPMLCa2 130
+#define PMR_UPMLCa3 131
+#define PMR_UPMLCb0 256
+#define PMR_UPMLCb1 257
+#define PMR_UPMLCb2 258
+#define PMR_UPMLCb3 259
+#define PMR_UPMGC0 384
+
#if _KERNEL
struct pmc_md_powerpc_pmc {
diff --git a/sys/powerpc/include/reg.h b/sys/powerpc/include/reg.h
index f6c1722..e77625a 100644
--- a/sys/powerpc/include/reg.h
+++ b/sys/powerpc/include/reg.h
@@ -39,7 +39,7 @@ struct dbreg {
unsigned int junk;
};
-#ifdef COMPAT_FREEBSD32
+#ifdef __LP64__
/* Must match struct trapframe */
struct reg32 {
int32_t fixreg[32];
@@ -61,6 +61,8 @@ struct vmxreg32 {
struct dbreg32 {
struct dbreg data;
};
+
+#define __HAVE_REG32
#endif
#ifdef _KERNEL
diff --git a/sys/powerpc/include/trap.h b/sys/powerpc/include/trap.h
index b3391b1..3ca4b13 100644
--- a/sys/powerpc/include/trap.h
+++ b/sys/powerpc/include/trap.h
@@ -85,7 +85,7 @@
#define EXC_DTMISS 0x1100 /* Data TLB Miss */
#define EXC_ITMISS 0x1200 /* Instruction TLB Miss */
#define EXC_APU 0x1300 /* Auxiliary Processing Unit */
-#define EXC_DEBUG 0x2000 /* Debug trap */
+#define EXC_DEBUG 0x2f10 /* Debug trap */
#define EXC_LAST 0x2f00 /* Last possible exception vector */
diff --git a/sys/powerpc/mpc85xx/mpc85xx_gpio.c b/sys/powerpc/mpc85xx/mpc85xx_gpio.c
new file mode 100644
index 0000000..e62f727
--- /dev/null
+++ b/sys/powerpc/mpc85xx/mpc85xx_gpio.c
@@ -0,0 +1,307 @@
+/*-
+ * Copyright (c) 2015 Justin Hibbits
+ * Copyright (c) 2013 Thomas Skibo
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/conf.h>
+#include <sys/bus.h>
+#include <sys/kernel.h>
+#include <sys/module.h>
+#include <sys/lock.h>
+#include <sys/mutex.h>
+#include <sys/resource.h>
+#include <sys/rman.h>
+#include <sys/gpio.h>
+
+#include <machine/bus.h>
+#include <machine/resource.h>
+#include <machine/stdarg.h>
+
+#include <dev/fdt/fdt_common.h>
+#include <dev/gpio/gpiobusvar.h>
+#include <dev/ofw/ofw_bus.h>
+#include <dev/ofw/ofw_bus_subr.h>
+
+#include "gpio_if.h"
+
+#define MAXPIN (7)
+
+#define VALID_PIN(u) ((u) >= 0 && (u) <= MAXPIN)
+
+#define GPIO_LOCK(sc) mtx_lock(&(sc)->sc_mtx)
+#define GPIO_UNLOCK(sc) mtx_unlock(&(sc)->sc_mtx)
+#define GPIO_LOCK_INIT(sc) \
+ mtx_init(&(sc)->sc_mtx, device_get_nameunit((sc)->dev), \
+ "gpio", MTX_DEF)
+#define GPIO_LOCK_DESTROY(_sc) mtx_destroy(&_sc->sc_mtx);
+
+struct mpc85xx_gpio_softc {
+ device_t dev;
+ device_t busdev;
+ struct mtx sc_mtx;
+ struct resource *out_res; /* Memory resource */
+ struct resource *in_res;
+};
+
+static device_t
+mpc85xx_gpio_get_bus(device_t dev)
+{
+ struct mpc85xx_gpio_softc *sc;
+
+ sc = device_get_softc(dev);
+
+ return (sc->busdev);
+}
+
+static int
+mpc85xx_gpio_pin_max(device_t dev, int *maxpin)
+{
+
+ *maxpin = MAXPIN;
+ return (0);
+}
+
+/* Get a specific pin's capabilities. */
+static int
+mpc85xx_gpio_pin_getcaps(device_t dev, uint32_t pin, uint32_t *caps)
+{
+
+ if (!VALID_PIN(pin))
+ return (EINVAL);
+
+ *caps = (GPIO_PIN_INPUT | GPIO_PIN_OUTPUT);
+
+ return (0);
+}
+
+/* Get a specific pin's name. */
+static int
+mpc85xx_gpio_pin_getname(device_t dev, uint32_t pin, char *name)
+{
+
+ if (!VALID_PIN(pin))
+ return (EINVAL);
+
+ snprintf(name, GPIOMAXNAME, "GPIO%d", pin);
+ name[GPIOMAXNAME-1] = '\0';
+
+ return (0);
+}
+
+/* Set a specific output pin's value. */
+static int
+mpc85xx_gpio_pin_set(device_t dev, uint32_t pin, unsigned int value)
+{
+ struct mpc85xx_gpio_softc *sc = device_get_softc(dev);
+ uint32_t outvals;
+ uint8_t pinbit;
+
+ if (!VALID_PIN(pin) || value > 1)
+ return (EINVAL);
+
+ GPIO_LOCK(sc);
+ pinbit = 31 - pin;
+
+ outvals = bus_read_4(sc->out_res, 0);
+ outvals &= ~(1 << pinbit);
+ outvals |= (value << pinbit);
+ bus_write_4(sc->out_res, 0, outvals);
+
+ GPIO_UNLOCK(sc);
+
+ return (0);
+}
+
+/* Get a specific pin's input value. */
+static int
+mpc85xx_gpio_pin_get(device_t dev, uint32_t pin, unsigned int *value)
+{
+ struct mpc85xx_gpio_softc *sc = device_get_softc(dev);
+
+ if (!VALID_PIN(pin))
+ return (EINVAL);
+
+ *value = (bus_read_4(sc->in_res, 0) >> (31 - pin)) & 1;
+
+ return (0);
+}
+
+/* Toggle a pin's output value. */
+static int
+mpc85xx_gpio_pin_toggle(device_t dev, uint32_t pin)
+{
+ struct mpc85xx_gpio_softc *sc = device_get_softc(dev);
+ uint32_t val;
+
+ if (!VALID_PIN(pin))
+ return (EINVAL);
+
+ GPIO_LOCK(sc);
+
+ val = bus_read_4(sc->out_res, 0);
+ val ^= (1 << (31 - pin));
+ bus_write_4(sc->out_res, 0, val);
+
+ GPIO_UNLOCK(sc);
+
+ return (0);
+}
+
+static int
+mpc85xx_gpio_probe(device_t dev)
+{
+ uint16_t vers;
+ uint32_t svr;
+
+ if (!ofw_bus_status_okay(dev))
+ return (ENXIO);
+
+ if (!ofw_bus_is_compatible(dev, "gpio"))
+ return (ENXIO);
+
+ vers = mfpvr() >> 16;
+ switch (vers) {
+ case FSL_E500v1:
+ case FSL_E500v2:
+ case FSL_E500mc:
+ break;
+ default:
+ return (ENXIO);
+ }
+
+ svr = mfspr(SPR_SVR);
+ switch (SVR_VER(svr)) {
+ case SVR_MPC8533:
+ case SVR_MPC8533E:
+ break;
+ default:
+ return (ENXIO);
+ }
+
+ device_set_desc(dev, "MPC85xx GPIO driver");
+ return (0);
+}
+
+static int mpc85xx_gpio_detach(device_t dev);
+
+static int
+mpc85xx_gpio_attach(device_t dev)
+{
+ struct mpc85xx_gpio_softc *sc = device_get_softc(dev);
+ int rid;
+
+ sc->dev = dev;
+
+ GPIO_LOCK_INIT(sc);
+
+ /* Allocate memory. */
+ rid = 0;
+ sc->out_res = bus_alloc_resource_any(dev,
+ SYS_RES_MEMORY, &rid, RF_ACTIVE);
+ if (sc->out_res == NULL) {
+ device_printf(dev, "Can't allocate memory for device output port");
+ mpc85xx_gpio_detach(dev);
+ return (ENOMEM);
+ }
+
+ rid = 1;
+ sc->in_res = bus_alloc_resource_any(dev,
+ SYS_RES_MEMORY, &rid, RF_ACTIVE);
+ if (sc->in_res == NULL) {
+ device_printf(dev, "Can't allocate memory for device input port");
+ mpc85xx_gpio_detach(dev);
+ return (ENOMEM);
+ }
+
+ sc->busdev = gpiobus_attach_bus(dev);
+ if (sc->busdev == NULL) {
+ mpc85xx_gpio_detach(dev);
+ return (ENOMEM);
+ }
+
+ OF_device_register_xref(OF_xref_from_node(ofw_bus_get_node(dev)), dev);
+
+ return (0);
+}
+
+static int
+mpc85xx_gpio_detach(device_t dev)
+{
+ struct mpc85xx_gpio_softc *sc = device_get_softc(dev);
+
+ gpiobus_detach_bus(dev);
+
+ if (sc->out_res != NULL) {
+ /* Release output port resource. */
+ bus_release_resource(dev, SYS_RES_MEMORY,
+ rman_get_rid(sc->out_res), sc->out_res);
+ }
+
+ if (sc->in_res != NULL) {
+ /* Release input port resource. */
+ bus_release_resource(dev, SYS_RES_MEMORY,
+ rman_get_rid(sc->in_res), sc->in_res);
+ }
+
+ GPIO_LOCK_DESTROY(sc);
+
+ return (0);
+}
+
+static device_method_t mpc85xx_gpio_methods[] = {
+ /* device_if */
+ DEVMETHOD(device_probe, mpc85xx_gpio_probe),
+ DEVMETHOD(device_attach, mpc85xx_gpio_attach),
+ DEVMETHOD(device_detach, mpc85xx_gpio_detach),
+
+ /* GPIO protocol */
+ DEVMETHOD(gpio_get_bus, mpc85xx_gpio_get_bus),
+ DEVMETHOD(gpio_pin_max, mpc85xx_gpio_pin_max),
+ DEVMETHOD(gpio_pin_getname, mpc85xx_gpio_pin_getname),
+ DEVMETHOD(gpio_pin_getcaps, mpc85xx_gpio_pin_getcaps),
+ DEVMETHOD(gpio_pin_get, mpc85xx_gpio_pin_get),
+ DEVMETHOD(gpio_pin_set, mpc85xx_gpio_pin_set),
+ DEVMETHOD(gpio_pin_toggle, mpc85xx_gpio_pin_toggle),
+
+ DEVMETHOD_END
+};
+
+static driver_t mpc85xx_gpio_driver = {
+ "gpio",
+ mpc85xx_gpio_methods,
+ sizeof(struct mpc85xx_gpio_softc),
+};
+static devclass_t mpc85xx_gpio_devclass;
+
+EARLY_DRIVER_MODULE(mpc85xx_gpio, simplebus, mpc85xx_gpio_driver,
+ mpc85xx_gpio_devclass, NULL, NULL,
+ BUS_PASS_RESOURCE + BUS_PASS_ORDER_MIDDLE);
diff --git a/sys/powerpc/ofw/ofw_machdep.c b/sys/powerpc/ofw/ofw_machdep.c
index 05af094..31813fb 100644
--- a/sys/powerpc/ofw/ofw_machdep.c
+++ b/sys/powerpc/ofw/ofw_machdep.c
@@ -62,11 +62,12 @@ __FBSDID("$FreeBSD$");
#include <machine/ofw_machdep.h>
#include <machine/trap.h>
+static void *fdt;
+int ofw_real_mode;
+
#ifdef AIM
extern register_t ofmsr[5];
extern void *openfirmware_entry;
-static void *fdt;
-int ofw_real_mode;
char save_trap_init[0x2f00]; /* EXC_LAST */
char save_trap_of[0x2f00]; /* EXC_LAST */
@@ -336,10 +337,10 @@ ofw_mem_regions(struct mem_region *memp, int *memsz,
*availsz = asz;
}
-#ifdef AIM
void
OF_initial_setup(void *fdt_ptr, void *junk, int (*openfirm)(void *))
{
+#ifdef AIM
ofmsr[0] = mfmsr();
#ifdef __powerpc64__
ofmsr[0] &= ~PSL_SF;
@@ -348,22 +349,25 @@ OF_initial_setup(void *fdt_ptr, void *junk, int (*openfirm)(void *))
__asm __volatile("mfsprg1 %0" : "=&r"(ofmsr[2]));
__asm __volatile("mfsprg2 %0" : "=&r"(ofmsr[3]));
__asm __volatile("mfsprg3 %0" : "=&r"(ofmsr[4]));
+ openfirmware_entry = openfirm;
if (ofmsr[0] & PSL_DR)
ofw_real_mode = 0;
else
ofw_real_mode = 1;
+ ofw_save_trap_vec(save_trap_init);
+#else
+ ofw_real_mode = 1;
+#endif
+
fdt = fdt_ptr;
- openfirmware_entry = openfirm;
#ifdef FDT_DTB_STATIC
/* Check for a statically included blob */
if (fdt == NULL)
fdt = &fdt_static_dtb;
#endif
-
- ofw_save_trap_vec(save_trap_init);
}
boolean_t
@@ -371,6 +375,7 @@ OF_bootstrap()
{
boolean_t status = FALSE;
+#ifdef AIM
if (openfirmware_entry != NULL) {
if (ofw_real_mode) {
status = OF_install(OFW_STD_REAL, 0);
@@ -386,18 +391,22 @@ OF_bootstrap()
return status;
OF_init(openfirmware);
- } else if (fdt != NULL) {
+ } else
+#endif
+ if (fdt != NULL) {
status = OF_install(OFW_FDT, 0);
if (status != TRUE)
return status;
OF_init(fdt);
+ OF_interpret("perform-fixup", 0);
}
return (status);
}
+#ifdef AIM
void
ofw_quiesce(void)
{
diff --git a/sys/powerpc/powerpc/busdma_machdep.c b/sys/powerpc/powerpc/busdma_machdep.c
index bd226c8..9ea51ce 100644
--- a/sys/powerpc/powerpc/busdma_machdep.c
+++ b/sys/powerpc/powerpc/busdma_machdep.c
@@ -1121,8 +1121,8 @@ add_bounce_page(bus_dma_tag_t dmat, bus_dmamap_t map, vm_offset_t vaddr,
if (dmat->flags & BUS_DMA_KEEP_PG_OFFSET) {
/* Page offset needs to be preserved. */
- bpage->vaddr |= vaddr & PAGE_MASK;
- bpage->busaddr |= vaddr & PAGE_MASK;
+ bpage->vaddr |= addr & PAGE_MASK;
+ bpage->busaddr |= addr & PAGE_MASK;
}
bpage->datavaddr = vaddr;
bpage->dataaddr = addr;
diff --git a/sys/powerpc/powerpc/machdep.c b/sys/powerpc/powerpc/machdep.c
new file mode 100644
index 0000000..2bc9496
--- /dev/null
+++ b/sys/powerpc/powerpc/machdep.c
@@ -0,0 +1,502 @@
+/*-
+ * Copyright (C) 1995, 1996 Wolfgang Solfrank.
+ * Copyright (C) 1995, 1996 TooLs GmbH.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by TooLs GmbH.
+ * 4. The name of TooLs GmbH may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY TOOLS GMBH ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+/*-
+ * Copyright (C) 2001 Benno Rice
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Benno Rice ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * $NetBSD: machdep.c,v 1.74.2.1 2000/11/01 16:13:48 tv Exp $
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "opt_compat.h"
+#include "opt_ddb.h"
+#include "opt_kstack_pages.h"
+#include "opt_platform.h"
+
+#include <sys/param.h>
+#include <sys/proc.h>
+#include <sys/systm.h>
+#include <sys/bio.h>
+#include <sys/buf.h>
+#include <sys/bus.h>
+#include <sys/cons.h>
+#include <sys/cpu.h>
+#include <sys/eventhandler.h>
+#include <sys/exec.h>
+#include <sys/imgact.h>
+#include <sys/kdb.h>
+#include <sys/kernel.h>
+#include <sys/ktr.h>
+#include <sys/linker.h>
+#include <sys/lock.h>
+#include <sys/malloc.h>
+#include <sys/mbuf.h>
+#include <sys/msgbuf.h>
+#include <sys/mutex.h>
+#include <sys/ptrace.h>
+#include <sys/reboot.h>
+#include <sys/rwlock.h>
+#include <sys/signalvar.h>
+#include <sys/syscallsubr.h>
+#include <sys/sysctl.h>
+#include <sys/sysent.h>
+#include <sys/sysproto.h>
+#include <sys/ucontext.h>
+#include <sys/uio.h>
+#include <sys/vmmeter.h>
+#include <sys/vnode.h>
+
+#include <net/netisr.h>
+
+#include <vm/vm.h>
+#include <vm/vm_extern.h>
+#include <vm/vm_kern.h>
+#include <vm/vm_page.h>
+#include <vm/vm_map.h>
+#include <vm/vm_object.h>
+#include <vm/vm_pager.h>
+
+#include <machine/altivec.h>
+#ifndef __powerpc64__
+#include <machine/bat.h>
+#endif
+#include <machine/cpu.h>
+#include <machine/elf.h>
+#include <machine/fpu.h>
+#include <machine/hid.h>
+#include <machine/kdb.h>
+#include <machine/md_var.h>
+#include <machine/metadata.h>
+#include <machine/mmuvar.h>
+#include <machine/pcb.h>
+#include <machine/reg.h>
+#include <machine/sigframe.h>
+#include <machine/spr.h>
+#include <machine/trap.h>
+#include <machine/vmparam.h>
+#include <machine/ofw_machdep.h>
+
+#include <ddb/ddb.h>
+
+#include <dev/ofw/openfirm.h>
+
+int cold = 1;
+#ifdef __powerpc64__
+int cacheline_size = 128;
+#else
+int cacheline_size = 32;
+#endif
+int hw_direct_map = 1;
+
+extern void *ap_pcpu;
+
+struct pcpu __pcpu[MAXCPU];
+
+static struct trapframe frame0;
+
+char machine[] = "powerpc";
+SYSCTL_STRING(_hw, HW_MACHINE, machine, CTLFLAG_RD, machine, 0, "");
+
+static void cpu_startup(void *);
+SYSINIT(cpu, SI_SUB_CPU, SI_ORDER_FIRST, cpu_startup, NULL);
+
+SYSCTL_INT(_machdep, CPU_CACHELINE, cacheline_size,
+ CTLFLAG_RD, &cacheline_size, 0, "");
+
+uintptr_t powerpc_init(vm_offset_t, vm_offset_t, vm_offset_t, void *);
+
+long Maxmem = 0;
+long realmem = 0;
+
+struct kva_md_info kmi;
+
+static void
+cpu_startup(void *dummy)
+{
+
+ /*
+ * Initialise the decrementer-based clock.
+ */
+ decr_init();
+
+ /*
+ * Good {morning,afternoon,evening,night}.
+ */
+ cpu_setup(PCPU_GET(cpuid));
+
+#ifdef PERFMON
+ perfmon_init();
+#endif
+ printf("real memory = %ld (%ld MB)\n", ptoa(physmem),
+ ptoa(physmem) / 1048576);
+ realmem = physmem;
+
+ if (bootverbose)
+ printf("available KVA = %zd (%zd MB)\n",
+ virtual_end - virtual_avail,
+ (virtual_end - virtual_avail) / 1048576);
+
+ /*
+ * Display any holes after the first chunk of extended memory.
+ */
+ if (bootverbose) {
+ int indx;
+
+ printf("Physical memory chunk(s):\n");
+ for (indx = 0; phys_avail[indx + 1] != 0; indx += 2) {
+ vm_offset_t size1 =
+ phys_avail[indx + 1] - phys_avail[indx];
+
+ #ifdef __powerpc64__
+ printf("0x%016lx - 0x%016lx, %ld bytes (%ld pages)\n",
+ #else
+ printf("0x%08x - 0x%08x, %d bytes (%ld pages)\n",
+ #endif
+ phys_avail[indx], phys_avail[indx + 1] - 1, size1,
+ size1 / PAGE_SIZE);
+ }
+ }
+
+ vm_ksubmap_init(&kmi);
+
+ printf("avail memory = %ld (%ld MB)\n", ptoa(vm_cnt.v_free_count),
+ ptoa(vm_cnt.v_free_count) / 1048576);
+
+ /*
+ * Set up buffers, so they can be used to read disk labels.
+ */
+ bufinit();
+ vm_pager_bufferinit();
+}
+
+extern vm_offset_t __startkernel, __endkernel;
+extern unsigned char __bss_start[];
+extern unsigned char __sbss_start[];
+extern unsigned char __sbss_end[];
+extern unsigned char _end[];
+
+void aim_cpu_init(vm_offset_t toc);
+void booke_cpu_init(void);
+
+uintptr_t
+powerpc_init(vm_offset_t fdt, vm_offset_t toc, vm_offset_t ofentry, void *mdp)
+{
+ struct pcpu *pc;
+ vm_offset_t startkernel, endkernel;
+ void *kmdp;
+ char *env;
+#ifdef DDB
+ vm_offset_t ksym_start;
+ vm_offset_t ksym_end;
+#endif
+
+ kmdp = NULL;
+
+ /* First guess at start/end kernel positions */
+ startkernel = __startkernel;
+ endkernel = __endkernel;
+
+ /* Check for ePAPR loader, which puts a magic value into r6 */
+ if (mdp == (void *)0x65504150)
+ mdp = NULL;
+
+ /*
+ * Parse metadata if present and fetch parameters. Must be done
+ * before console is inited so cninit gets the right value of
+ * boothowto.
+ */
+ if (mdp != NULL) {
+ preload_metadata = mdp;
+ kmdp = preload_search_by_type("elf kernel");
+ if (kmdp != NULL) {
+ boothowto = MD_FETCH(kmdp, MODINFOMD_HOWTO, int);
+ kern_envp = MD_FETCH(kmdp, MODINFOMD_ENVP, char *);
+ endkernel = ulmax(endkernel, MD_FETCH(kmdp,
+ MODINFOMD_KERNEND, vm_offset_t));
+#ifdef DDB
+ ksym_start = MD_FETCH(kmdp, MODINFOMD_SSYM, uintptr_t);
+ ksym_end = MD_FETCH(kmdp, MODINFOMD_ESYM, uintptr_t);
+ db_fetch_ksymtab(ksym_start, ksym_end);
+#endif
+ }
+ } else {
+ bzero(__sbss_start, __sbss_end - __sbss_start);
+ bzero(__bss_start, _end - __bss_start);
+ }
+#ifdef BOOKE
+ tlb1_init();
+#endif
+
+ /* Store boot environment state */
+ OF_initial_setup((void *)fdt, NULL, (int (*)(void *))ofentry);
+
+ /*
+ * Init params/tunables that can be overridden by the loader
+ */
+ init_param1();
+
+ /*
+ * Start initializing proc0 and thread0.
+ */
+ proc_linkup0(&proc0, &thread0);
+ thread0.td_frame = &frame0;
+
+ /*
+ * Set up per-cpu data.
+ */
+ pc = __pcpu;
+ pcpu_init(pc, 0, sizeof(struct pcpu));
+ pc->pc_curthread = &thread0;
+#ifdef __powerpc64__
+ __asm __volatile("mr 13,%0" :: "r"(pc->pc_curthread));
+#else
+ __asm __volatile("mr 2,%0" :: "r"(pc->pc_curthread));
+#endif
+ pc->pc_cpuid = 0;
+
+ __asm __volatile("mtsprg 0, %0" :: "r"(pc));
+
+ /*
+ * Init mutexes, which we use heavily in PMAP
+ */
+
+ mutex_init();
+
+ /*
+ * Install the OF client interface
+ */
+
+ OF_bootstrap();
+
+ /*
+ * Initialize the console before printing anything.
+ */
+ cninit();
+
+ /*
+ * Complain if there is no metadata.
+ */
+ if (mdp == NULL || kmdp == NULL) {
+ printf("powerpc_init: no loader metadata.\n");
+ }
+
+ /*
+ * Init KDB
+ */
+
+ kdb_init();
+
+#ifdef AIM
+ aim_cpu_init(toc);
+#else /* BOOKE */
+ booke_cpu_init();
+
+ /* Make sure the kernel icache is valid before we go too much further */
+ __syncicache((caddr_t)startkernel, endkernel - startkernel);
+#endif
+
+ /*
+ * Choose a platform module so we can get the physical memory map.
+ */
+
+ platform_probe_and_attach();
+
+ /*
+ * Bring up MMU
+ */
+ pmap_bootstrap(startkernel, endkernel);
+ mtmsr(PSL_KERNSET & ~PSL_EE);
+
+ /*
+ * Initialize params/tunables that are derived from memsize
+ */
+ init_param2(physmem);
+
+ /*
+ * Grab booted kernel's name
+ */
+ env = kern_getenv("kernelname");
+ if (env != NULL) {
+ strlcpy(kernelname, env, sizeof(kernelname));
+ freeenv(env);
+ }
+
+ /*
+ * Finish setting up thread0.
+ */
+ thread0.td_pcb = (struct pcb *)
+ ((thread0.td_kstack + thread0.td_kstack_pages * PAGE_SIZE -
+ sizeof(struct pcb)) & ~15UL);
+ bzero((void *)thread0.td_pcb, sizeof(struct pcb));
+ pc->pc_curpcb = thread0.td_pcb;
+
+ /* Initialise the message buffer. */
+ msgbufinit(msgbufp, msgbufsize);
+
+#ifdef KDB
+ if (boothowto & RB_KDB)
+ kdb_enter(KDB_WHY_BOOTFLAGS,
+ "Boot flags requested debugger");
+#endif
+
+ return (((uintptr_t)thread0.td_pcb -
+ (sizeof(struct callframe) - 3*sizeof(register_t))) & ~15UL);
+}
+
+void
+bzero(void *buf, size_t len)
+{
+ caddr_t p;
+
+ p = buf;
+
+ while (((vm_offset_t) p & (sizeof(u_long) - 1)) && len) {
+ *p++ = 0;
+ len--;
+ }
+
+ while (len >= sizeof(u_long) * 8) {
+ *(u_long*) p = 0;
+ *((u_long*) p + 1) = 0;
+ *((u_long*) p + 2) = 0;
+ *((u_long*) p + 3) = 0;
+ len -= sizeof(u_long) * 8;
+ *((u_long*) p + 4) = 0;
+ *((u_long*) p + 5) = 0;
+ *((u_long*) p + 6) = 0;
+ *((u_long*) p + 7) = 0;
+ p += sizeof(u_long) * 8;
+ }
+
+ while (len >= sizeof(u_long)) {
+ *(u_long*) p = 0;
+ len -= sizeof(u_long);
+ p += sizeof(u_long);
+ }
+
+ while (len) {
+ *p++ = 0;
+ len--;
+ }
+}
+
+/*
+ * Flush the D-cache for non-DMA I/O so that the I-cache can
+ * be made coherent later.
+ */
+void
+cpu_flush_dcache(void *ptr, size_t len)
+{
+ register_t addr, off;
+
+ /*
+ * Align the address to a cacheline and adjust the length
+ * accordingly. Then round the length to a multiple of the
+ * cacheline for easy looping.
+ */
+ addr = (uintptr_t)ptr;
+ off = addr & (cacheline_size - 1);
+ addr -= off;
+ len = (len + off + cacheline_size - 1) & ~(cacheline_size - 1);
+
+ while (len > 0) {
+ __asm __volatile ("dcbf 0,%0" :: "r"(addr));
+ __asm __volatile ("sync");
+ addr += cacheline_size;
+ len -= cacheline_size;
+ }
+}
+
+int
+ptrace_set_pc(struct thread *td, unsigned long addr)
+{
+ struct trapframe *tf;
+
+ tf = td->td_frame;
+ tf->srr0 = (register_t)addr;
+
+ return (0);
+}
+
+void
+spinlock_enter(void)
+{
+ struct thread *td;
+ register_t msr;
+
+ td = curthread;
+ if (td->td_md.md_spinlock_count == 0) {
+ __asm __volatile("or 2,2,2"); /* Set high thread priority */
+ msr = intr_disable();
+ td->td_md.md_spinlock_count = 1;
+ td->td_md.md_saved_msr = msr;
+ } else
+ td->td_md.md_spinlock_count++;
+ critical_enter();
+}
+
+void
+spinlock_exit(void)
+{
+ struct thread *td;
+ register_t msr;
+
+ td = curthread;
+ critical_exit();
+ msr = td->td_md.md_saved_msr;
+ td->td_md.md_spinlock_count--;
+ if (td->td_md.md_spinlock_count == 0) {
+ intr_restore(msr);
+ __asm __volatile("or 6,6,6"); /* Set normal thread priority */
+ }
+}
+
diff --git a/sys/powerpc/aim/trap.c b/sys/powerpc/powerpc/trap.c
index e0e2fe6..0ceb170 100644
--- a/sys/powerpc/aim/trap.c
+++ b/sys/powerpc/powerpc/trap.c
@@ -74,6 +74,12 @@ __FBSDID("$FreeBSD$");
#include <machine/spr.h>
#include <machine/sr.h>
+#define FAULTBUF_LR 0
+#define FAULTBUF_R1 1
+#define FAULTBUF_R2 2
+#define FAULTBUF_CR 3
+#define FAULTBUF_R13 4
+
static void trap_fatal(struct trapframe *frame);
static void printtrap(u_int vector, struct trapframe *frame, int isfatal,
int user);
@@ -100,32 +106,37 @@ int (*dtrace_invop_jump_addr)(struct trapframe *);
#endif
static struct powerpc_exception powerpc_exceptions[] = {
- { 0x0100, "system reset" },
- { 0x0200, "machine check" },
- { 0x0300, "data storage interrupt" },
- { 0x0380, "data segment exception" },
- { 0x0400, "instruction storage interrupt" },
- { 0x0480, "instruction segment exception" },
- { 0x0500, "external interrupt" },
- { 0x0600, "alignment" },
- { 0x0700, "program" },
- { 0x0800, "floating-point unavailable" },
- { 0x0900, "decrementer" },
- { 0x0c00, "system call" },
- { 0x0d00, "trace" },
- { 0x0e00, "floating-point assist" },
- { 0x0f00, "performance monitoring" },
- { 0x0f20, "altivec unavailable" },
- { 0x0f40, "vsx unavailable" },
- { 0x1000, "instruction tlb miss" },
- { 0x1100, "data load tlb miss" },
- { 0x1200, "data store tlb miss" },
- { 0x1300, "instruction breakpoint" },
- { 0x1400, "system management" },
- { 0x1600, "altivec assist" },
- { 0x1700, "thermal management" },
- { 0x2000, "run mode/trace" },
- { 0x3000, NULL }
+ { EXC_CRIT, "critical input" },
+ { EXC_RST, "system reset" },
+ { EXC_MCHK, "machine check" },
+ { EXC_DSI, "data storage interrupt" },
+ { EXC_DSE, "data segment exception" },
+ { EXC_ISI, "instruction storage interrupt" },
+ { EXC_ISE, "instruction segment exception" },
+ { EXC_EXI, "external interrupt" },
+ { EXC_ALI, "alignment" },
+ { EXC_PGM, "program" },
+ { EXC_FPU, "floating-point unavailable" },
+ { EXC_APU, "auxiliary proc unavailable" },
+ { EXC_DECR, "decrementer" },
+ { EXC_FIT, "fixed-interval timer" },
+ { EXC_WDOG, "watchdog timer" },
+ { EXC_SC, "system call" },
+ { EXC_TRC, "trace" },
+ { EXC_FPA, "floating-point assist" },
+ { EXC_DEBUG, "debug" },
+ { EXC_PERF, "performance monitoring" },
+ { EXC_VEC, "altivec unavailable" },
+ { EXC_VSX, "vsx unavailable" },
+ { EXC_ITMISS, "instruction tlb miss" },
+ { EXC_DLMISS, "data load tlb miss" },
+ { EXC_DSMISS, "data store tlb miss" },
+ { EXC_BPT, "instruction breakpoint" },
+ { EXC_SMI, "system management" },
+ { EXC_VECAST_G4, "altivec assist" },
+ { EXC_THRM, "thermal management" },
+ { EXC_RUNMODETRC, "run mode/trace" },
+ { EXC_LAST, NULL }
};
static const char *
@@ -133,7 +144,7 @@ trapname(u_int vector)
{
struct powerpc_exception *pe;
- for (pe = powerpc_exceptions; pe->vector != 0x3000; pe++) {
+ for (pe = powerpc_exceptions; pe->vector != EXC_LAST; pe++) {
if (pe->vector == vector)
return (pe->name);
}
@@ -265,9 +276,21 @@ trap(struct trapframe *frame)
frame->srr0 += 4;
break;
+ case EXC_DEBUG: /* Single stepping */
+ mtspr(SPR_DBSR, mfspr(SPR_DBSR));
+ frame->srr1 &= ~PSL_DE;
+ frame->cpu.booke.dbcr0 &= ~(DBCR0_IDM || DBCR0_IC);
+ sig = SIGTRAP;
+ ucode = TRAP_TRACE;
+ break;
+
case EXC_PGM:
/* Identify the trap reason */
+#ifdef AIM
if (frame->srr1 & EXC_PGM_TRAP) {
+#else
+ if (frame->cpu.booke.esr & ESR_PTR) {
+#endif
#ifdef KDTRACE_HOOKS
inst = fuword32((const void *)frame->srr0);
if (inst == 0x0FFFDDDD &&
@@ -386,15 +409,23 @@ printtrap(u_int vector, struct trapframe *frame, int isfatal, int user)
switch (vector) {
case EXC_DSE:
case EXC_DSI:
+ case EXC_DTMISS:
printf(" virtual address = 0x%" PRIxPTR "\n", frame->dar);
+#ifdef AIM
printf(" dsisr = 0x%" PRIxPTR "\n",
frame->cpu.aim.dsisr);
+#endif
break;
case EXC_ISE:
case EXC_ISI:
+ case EXC_ITMISS:
printf(" virtual address = 0x%" PRIxPTR "\n", frame->srr0);
break;
}
+#ifdef BOOKE
+ printf(" esr = 0x%" PRIxPTR "\n",
+ frame->cpu.booke.esr);
+#endif
printf(" srr0 = 0x%" PRIxPTR "\n", frame->srr0);
printf(" srr1 = 0x%" PRIxPTR "\n", frame->srr1);
printf(" lr = 0x%" PRIxPTR "\n", frame->lr);
@@ -418,12 +449,12 @@ handle_onfault(struct trapframe *frame)
td = curthread;
fb = td->td_pcb->pcb_onfault;
if (fb != NULL) {
- frame->srr0 = (*fb)[0];
- frame->fixreg[1] = (*fb)[1];
- frame->fixreg[2] = (*fb)[2];
+ frame->srr0 = (*fb)[FAULTBUF_LR];
+ frame->fixreg[1] = (*fb)[FAULTBUF_R1];
+ frame->fixreg[2] = (*fb)[FAULTBUF_R2];
frame->fixreg[3] = 1;
- frame->cr = (*fb)[3];
- bcopy(&(*fb)[4], &frame->fixreg[13],
+ frame->cr = (*fb)[FAULTBUF_CR];
+ bcopy(&(*fb)[FAULTBUF_R13], &frame->fixreg[13],
19 * sizeof(register_t));
return (1);
}
@@ -630,7 +661,9 @@ trap_pfault(struct trapframe *frame, int user)
vm_map_t map;
vm_prot_t ftype;
int rv;
+#ifdef AIM
register_t user_sr;
+#endif
td = curthread;
p = td->td_proc;
@@ -641,24 +674,35 @@ trap_pfault(struct trapframe *frame, int user)
ftype |= VM_PROT_READ;
} else {
eva = frame->dar;
+#ifdef BOOKE
+ if (frame->cpu.booke.esr & ESR_ST)
+#else
if (frame->cpu.aim.dsisr & DSISR_STORE)
+#endif
ftype = VM_PROT_WRITE;
else
ftype = VM_PROT_READ;
}
if (user) {
+ KASSERT(p->p_vmspace != NULL, ("trap_pfault: vmspace NULL"));
map = &p->p_vmspace->vm_map;
} else {
+#ifdef BOOKE
+ if (eva < VM_MAXUSER_ADDRESS) {
+#else
if ((eva >> ADDR_SR_SHFT) == (USER_ADDR >> ADDR_SR_SHFT)) {
+#endif
if (p->p_vmspace == NULL)
return (SIGSEGV);
map = &p->p_vmspace->vm_map;
+#ifdef AIM
user_sr = td->td_pcb->pcb_cpu.aim.usr_segm;
eva &= ADDR_PIDX | ADDR_POFF;
eva |= user_sr << ADDR_SR_SHFT;
+#endif
} else {
map = kernel_map;
}
@@ -736,17 +780,51 @@ fix_unaligned(struct thread *td, struct trapframe *frame)
if (indicator == EXC_ALI_LFD) {
if (copyin((void *)frame->dar, fpr,
sizeof(double)) != 0)
- return -1;
+ return (-1);
enable_fpu(td);
} else {
if (copyout(fpr, (void *)frame->dar,
sizeof(double)) != 0)
- return -1;
+ return (-1);
}
- return 0;
+ return (0);
break;
}
- return -1;
+ return (-1);
}
+#ifdef KDB
+int db_trap_glue(struct trapframe *); /* Called from trap_subr.S */
+
+int
+db_trap_glue(struct trapframe *frame)
+{
+ if (!(frame->srr1 & PSL_PR)
+ && (frame->exc == EXC_TRC || frame->exc == EXC_RUNMODETRC
+#ifdef AIM
+ || (frame->exc == EXC_PGM
+ && (frame->srr1 & 0x20000))
+#else
+ || (frame->exc == EXC_DEBUG)
+#endif
+ || frame->exc == EXC_BPT
+ || frame->exc == EXC_DSI)) {
+ int type = frame->exc;
+
+ /* Ignore DTrace traps. */
+ if (*(uint32_t *)frame->srr0 == EXC_DTRACE)
+ return (0);
+#ifdef AIM
+ if (type == EXC_PGM && (frame->srr1 & 0x20000)) {
+#else
+ if (frame->cpu.booke.esr & ESR_PTR) {
+#endif
+ type = T_BREAKPOINT;
+ }
+ return (kdb_trap(type, 0, frame));
+ }
+
+ return (0);
+}
+#endif
diff --git a/sys/powerpc/aim/uma_machdep.c b/sys/powerpc/powerpc/uma_machdep.c
index 1c27e3e..1c27e3e 100644
--- a/sys/powerpc/aim/uma_machdep.c
+++ b/sys/powerpc/powerpc/uma_machdep.c
diff --git a/sys/rpc/svc_generic.c b/sys/rpc/svc_generic.c
index 59e36c2..2ce010d 100644
--- a/sys/rpc/svc_generic.c
+++ b/sys/rpc/svc_generic.c
@@ -168,7 +168,7 @@ svc_tp_create(
taddr = uaddr2taddr(nconf, uaddr);
bind.addr = *taddr;
free(taddr, M_RPC);
- bind.qlen = SOMAXCONN;
+ bind.qlen = -1;
xprt = svc_tli_create(pool, NULL, nconf, &bind, 0, 0);
free(bind.addr.buf, M_RPC);
} else {
@@ -256,7 +256,7 @@ svc_tli_create(
goto freedata;
}
}
- solisten(so, SOMAXCONN, curthread);
+ solisten(so, -1, curthread);
} else {
if (bindresvport(so,
(struct sockaddr *)bindaddr->addr.buf)) {
diff --git a/sys/rpc/svc_vc.c b/sys/rpc/svc_vc.c
index 920c4b5..1d3d041 100644
--- a/sys/rpc/svc_vc.c
+++ b/sys/rpc/svc_vc.c
@@ -177,7 +177,7 @@ svc_vc_create(SVCPOOL *pool, struct socket *so, size_t sendsize,
xprt_register(xprt);
- solisten(so, SOMAXCONN, curthread);
+ solisten(so, -1, curthread);
SOCKBUF_LOCK(&so->so_rcv);
xprt->xp_upcallset = 1;
diff --git a/sys/sparc64/include/reg.h b/sys/sparc64/include/reg.h
index d224186..8a4dd2a 100644
--- a/sys/sparc64/include/reg.h
+++ b/sys/sparc64/include/reg.h
@@ -98,6 +98,12 @@ struct dbreg {
int dummy;
};
+/*
+ * NB: sparcv8 binaries are not supported even though this header
+ * defines the relevant structures.
+ */
+#define __HAVE_REG32
+
#ifdef _KERNEL
/*
* XXX these interfaces are MI, so they should be declared in a MI place.
diff --git a/sys/sparc64/pci/apb.c b/sys/sparc64/pci/apb.c
index 9b3fa44..c0d6172 100644
--- a/sys/sparc64/pci/apb.c
+++ b/sys/sparc64/pci/apb.c
@@ -171,20 +171,14 @@ apb_attach(device_t dev)
* Get current bridge configuration.
*/
sc->sc_bsc.ops_pcib_sc.domain = pci_get_domain(dev);
- sc->sc_bsc.ops_pcib_sc.secstat =
- pci_read_config(dev, PCIR_SECSTAT_1, 2);
- sc->sc_bsc.ops_pcib_sc.command =
- pci_read_config(dev, PCIR_COMMAND, 2);
- sc->sc_bsc.ops_pcib_sc.pribus =
- pci_read_config(dev, PCIR_PRIBUS_1, 1);
+ sc->sc_bsc.ops_pcib_sc.pribus = pci_get_bus(dev);
+ pci_write_config(dev, PCIR_PRIBUS_1, sc->sc_bsc.ops_pcib_sc.pribus, 1);
sc->sc_bsc.ops_pcib_sc.bus.sec =
pci_read_config(dev, PCIR_SECBUS_1, 1);
sc->sc_bsc.ops_pcib_sc.bus.sub =
pci_read_config(dev, PCIR_SUBBUS_1, 1);
sc->sc_bsc.ops_pcib_sc.bridgectl =
pci_read_config(dev, PCIR_BRIDGECTL_1, 2);
- sc->sc_bsc.ops_pcib_sc.seclat =
- pci_read_config(dev, PCIR_SECLAT_1, 1);
sc->sc_iomap = pci_read_config(dev, APBR_IOMAP, 1);
sc->sc_memmap = pci_read_config(dev, APBR_MEMMAP, 1);
diff --git a/sys/sparc64/pci/sbbc.c b/sys/sparc64/pci/sbbc.c
index c19fb71..f1e7fab 100644
--- a/sys/sparc64/pci/sbbc.c
+++ b/sys/sparc64/pci/sbbc.c
@@ -813,7 +813,8 @@ struct uart_class uart_sbbc_class = {
sizeof(struct uart_softc),
.uc_ops = &sbbc_uart_ops,
.uc_range = 1,
- .uc_rclk = 0x5bbc /* arbitrary */
+ .uc_rclk = 0x5bbc, /* arbitrary */
+ .uc_rshift = 0
};
#define SIGCHG(c, i, s, d) \
diff --git a/sys/sys/buf.h b/sys/sys/buf.h
index 72ab61b..4e2af1a 100644
--- a/sys/sys/buf.h
+++ b/sys/sys/buf.h
@@ -231,8 +231,8 @@ struct buf {
#define PRINT_BUF_FLAGS "\20\40remfree\37cluster\36vmio\35ram\34managed" \
"\33paging\32infreecnt\31nocopy\30b23\27relbuf\26dirty\25b20" \
"\24b19\23b18\22clusterok\21malloc\20nocache\17b14\16inval" \
- "\15b12\14b11\13eintr\12done\11persist\10delwri\7validsuspwrt" \
- "\6cache\5deferred\4direct\3async\2needcommit\1age"
+ "\15kvaalloc\14unmapped\13eintr\12done\11persist\10delwri" \
+ "\7validsuspwrt\6cache\5deferred\4direct\3async\2needcommit\1age"
/*
* These flags are kept in b_xflags.
diff --git a/sys/sys/cdefs.h b/sys/sys/cdefs.h
index fa0caa5..ab7d59d 100644
--- a/sys/sys/cdefs.h
+++ b/sys/sys/cdefs.h
@@ -375,8 +375,10 @@
#endif
#if __GNUC_PREREQ__(4, 1)
+#define __gnu_inline __attribute__((__gnu_inline__))
#define __returns_twice __attribute__((__returns_twice__))
#else
+#define __gnu_inline
#define __returns_twice
#endif
@@ -386,6 +388,12 @@
#define __alloc_size(x)
#endif
+#if __has_attribute(alloc_align) || __GNUC_PREREQ__(4, 9)
+#define __alloc_align(x) __attribute__((__alloc_align__(x)))
+#else
+#define __alloc_align(x)
+#endif
+
/* XXX: should use `#if __STDC_VERSION__ < 199901'. */
#if !__GNUC_PREREQ__(2, 7) && !defined(__INTEL_COMPILER)
#define __func__ NULL
@@ -761,6 +769,24 @@
#endif
/*
+ * Type Safety Checking
+ *
+ * Clang provides additional attributes to enable checking type safety
+ * properties that cannot be enforced by the C type system.
+ */
+
+#if __has_attribute(argument_with_type_tag) && \
+ __has_attribute(type_tag_for_datatype) && !defined(lint)
+#define __arg_type_tag(arg_kind, arg_idx, type_tag_idx) \
+ __attribute__((__argument_with_type_tag__(arg_kind, arg_idx, type_tag_idx)))
+#define __datatype_type_tag(kind, type) \
+ __attribute__((__type_tag_for_datatype__(kind, type)))
+#else
+#define __arg_type_tag(arg_kind, arg_idx, type_tag_idx)
+#define __datatype_type_tag(kind, type)
+#endif
+
+/*
* Lock annotations.
*
* Clang provides support for doing basic thread-safety tests at
diff --git a/sys/sys/elf_common.h b/sys/sys/elf_common.h
index 19f460d..aa06c70 100644
--- a/sys/sys/elf_common.h
+++ b/sys/sys/elf_common.h
@@ -863,6 +863,7 @@ typedef struct {
#define R_386_TLS_TPOFF32 37 /* GOT entry of -ve static TLS offset */
#define R_386_IRELATIVE 42 /* PLT entry resolved indirectly at runtime */
+#define R_AARCH64_NONE 0 /* No relocation */
#define R_AARCH64_ABS64 257 /* Absolute offset */
#define R_AARCH64_ABS32 258 /* Absolute, 32-bit overflow check */
#define R_AARCH64_ABS16 259 /* Absolute, 16-bit overflow check */
diff --git a/sys/sys/fcntl.h b/sys/sys/fcntl.h
index 85db07f..5793229 100644
--- a/sys/sys/fcntl.h
+++ b/sys/sys/fcntl.h
@@ -129,6 +129,10 @@ typedef __pid_t pid_t;
#define O_CLOEXEC 0x00100000
#endif
+#if __BSD_VISIBLE
+#define O_VERIFY 0x00200000 /* open only after verification */
+#endif
+
/*
* XXX missing O_DSYNC, O_RSYNC.
*/
diff --git a/sys/sys/filedesc.h b/sys/sys/filedesc.h
index 4eef17b..eca30ff 100644
--- a/sys/sys/filedesc.h
+++ b/sys/sys/filedesc.h
@@ -152,7 +152,7 @@ int finstall(struct thread *td, struct file *fp, int *resultfp, int flags,
int fdalloc(struct thread *td, int minfd, int *result);
int fdallocn(struct thread *td, int minfd, int *fds, int n);
int fdcheckstd(struct thread *td);
-void fdclose(struct filedesc *fdp, struct file *fp, int idx, struct thread *td);
+void fdclose(struct thread *td, struct file *fp, int idx);
void fdcloseexec(struct thread *td);
void fdsetugidsafety(struct thread *td);
struct filedesc *fdcopy(struct filedesc *fdp);
diff --git a/sys/sys/imgact.h b/sys/sys/imgact.h
index 8440939..ac88a14 100644
--- a/sys/sys/imgact.h
+++ b/sys/sys/imgact.h
@@ -80,6 +80,7 @@ struct image_params {
unsigned long pagesizes;
int pagesizeslen;
vm_prot_t stack_prot;
+ u_long stack_sz;
};
#ifdef _KERNEL
diff --git a/sys/sys/kerneldump.h b/sys/sys/kerneldump.h
index 4254ab2..763b7cd 100644
--- a/sys/sys/kerneldump.h
+++ b/sys/sys/kerneldump.h
@@ -66,6 +66,7 @@ struct kerneldumpheader {
uint32_t version;
#define KERNELDUMPVERSION 1
uint32_t architectureversion;
+#define KERNELDUMP_AARCH64_VERSION 1
#define KERNELDUMP_AMD64_VERSION 2
#define KERNELDUMP_ARM_VERSION 1
#define KERNELDUMP_I386_VERSION 2
diff --git a/sys/sys/malloc.h b/sys/sys/malloc.h
index dcb4290..6b8a9c0 100644
--- a/sys/sys/malloc.h
+++ b/sys/sys/malloc.h
@@ -173,9 +173,11 @@ typedef void malloc_type_list_func_t(struct malloc_type *, void *);
void contigfree(void *addr, unsigned long size, struct malloc_type *type);
void *contigmalloc(unsigned long size, struct malloc_type *type, int flags,
vm_paddr_t low, vm_paddr_t high, unsigned long alignment,
- vm_paddr_t boundary) __malloc_like;
+ vm_paddr_t boundary) __malloc_like __result_use_check
+ __alloc_size(1);
void free(void *addr, struct malloc_type *type);
-void *malloc(unsigned long size, struct malloc_type *type, int flags) __malloc_like;
+void *malloc(unsigned long size, struct malloc_type *type, int flags)
+ __malloc_like __result_use_check __alloc_size(1);
void malloc_init(void *);
int malloc_last_fail(void);
void malloc_type_allocated(struct malloc_type *type, unsigned long size);
@@ -183,9 +185,9 @@ void malloc_type_freed(struct malloc_type *type, unsigned long size);
void malloc_type_list(malloc_type_list_func_t *, void *);
void malloc_uninit(void *);
void *realloc(void *addr, unsigned long size, struct malloc_type *type,
- int flags);
+ int flags) __result_use_check __alloc_size(2);
void *reallocf(void *addr, unsigned long size, struct malloc_type *type,
- int flags);
+ int flags) __alloc_size(2);
struct malloc_type *malloc_desc2type(const char *desc);
#endif /* _KERNEL */
diff --git a/sys/sys/mbuf.h b/sys/sys/mbuf.h
index 6203212..ab06547 100644
--- a/sys/sys/mbuf.h
+++ b/sys/sys/mbuf.h
@@ -616,8 +616,8 @@ m_getzone(int size)
* should go away with constant propagation for !MGETHDR.
*/
static __inline int
-m_init(struct mbuf *m, uma_zone_t zone, int size, int how, short type,
- int flags)
+m_init(struct mbuf *m, uma_zone_t zone __unused, int size __unused, int how,
+ short type, int flags)
{
int error;
@@ -686,8 +686,8 @@ static __inline int
m_clget(struct mbuf *m, int how)
{
- if (m->m_flags & M_EXT)
- printf("%s: %p mbuf already has external storage\n", __func__, m);
+ KASSERT((m->m_flags & M_EXT) == 0, ("%s: mbuf %p has M_EXT",
+ __func__, m));
m->m_ext.ext_buf = (char *)NULL;
uma_zalloc_arg(zone_clust, m, how);
/*
@@ -713,10 +713,11 @@ m_cljget(struct mbuf *m, int how, int size)
{
uma_zone_t zone;
- if (m && m->m_flags & M_EXT)
- printf("%s: %p mbuf already has external storage\n", __func__, m);
- if (m != NULL)
+ if (m != NULL) {
+ KASSERT((m->m_flags & M_EXT) == 0, ("%s: mbuf %p has M_EXT",
+ __func__, m));
m->m_ext.ext_buf = NULL;
+ }
zone = m_getzone(size);
return (uma_zalloc_arg(zone, m, how));
@@ -1121,7 +1122,7 @@ m_tag_first(struct mbuf *m)
* Return the next tag in the list of tags associated with an mbuf.
*/
static __inline struct m_tag *
-m_tag_next(struct mbuf *m, struct m_tag *t)
+m_tag_next(struct mbuf *m __unused, struct m_tag *t)
{
return (SLIST_NEXT(t, m_tag_link));
@@ -1177,7 +1178,7 @@ m_free(struct mbuf *m)
return (n);
}
-static int inline
+static __inline int
rt_m_getfib(struct mbuf *m)
{
KASSERT(m->m_flags & M_PKTHDR , ("Attempt to get FIB from non header mbuf."));
diff --git a/sys/sys/module.h b/sys/sys/module.h
index 3baa755..69b74ff 100644
--- a/sys/sys/module.h
+++ b/sys/sys/module.h
@@ -71,7 +71,7 @@ typedef union modspecific {
} modspecific_t;
/*
- * Module dependency declarartion
+ * Module dependency declaration
*/
struct mod_depend {
int md_ver_minimum;
diff --git a/sys/sys/mount.h b/sys/sys/mount.h
index 6fb2d08..b167845 100644
--- a/sys/sys/mount.h
+++ b/sys/sys/mount.h
@@ -355,6 +355,7 @@ void __mnt_vnode_markerfree_active(struct vnode **mvp, struct mount *);
#define MNTK_LOOKUP_EXCL_DOTDOT 0x00000800
#define MNTK_MARKER 0x00001000
#define MNTK_UNMAPPED_BUFS 0x00002000
+#define MNTK_USES_BCACHE 0x00004000 /* FS uses the buffer cache. */
#define MNTK_NOASYNC 0x00800000 /* disable async */
#define MNTK_UNMOUNT 0x01000000 /* unmount in progress */
#define MNTK_MWAIT 0x02000000 /* waiting for unmount to finish */
diff --git a/sys/sys/mouse.h b/sys/sys/mouse.h
index e03bc40..5329693 100644
--- a/sys/sys/mouse.h
+++ b/sys/sys/mouse.h
@@ -86,7 +86,7 @@ typedef struct mousehw {
int type; /* mouse/track ball/pad... */
int model; /* I/F dependent model ID: MOUSE_MODEL_XXX */
int hwid; /* I/F dependent hardware ID
- * for the PS/2 mouse, it will be PSM_XXX_ID
+ * for the PS/2 mouse, it will be PSM_XXX_ID
*/
} mousehw_t;
@@ -108,8 +108,26 @@ typedef struct synapticshw {
int capPalmDetect;
int capPassthrough;
int capMiddle;
+ int capLowPower;
+ int capMultiFingerReport;
+ int capBallistics;
int nExtendedButtons;
int nExtendedQueries;
+ int capClickPad;
+ int capDeluxeLEDs;
+ int noAbsoluteFilter;
+ int capReportsV;
+ int capUniformClickPad;
+ int capReportsMin;
+ int capInterTouch;
+ int capReportsMax;
+ int capClearPad;
+ int capAdvancedGestures;
+ int multiFingerMode;
+ int capCoveredPad;
+ int verticalScroll;
+ int horizontalScroll;
+ int verticalWheel;
} synapticshw_t;
/* iftype */
@@ -269,7 +287,7 @@ typedef struct mousevar {
#define MOUSE_PS2_BUTTON2DOWN 0x04 /* middle */
#define MOUSE_PS2_BUTTON3DOWN 0x02 /* right */
#define MOUSE_PS2_TAP MOUSE_PS2_SYNC /* GlidePoint (PS/2) `tapping'
- * Yes! this is the same bit
+ * Yes! this is the same bit
* as SYNC!
*/
@@ -324,11 +342,11 @@ typedef struct mousevar {
#define MOUSE_PS2VERSA_TAP 0x02
/* A4 Tech 4D Mouse (PS/2) data packet */
-#define MOUSE_4D_PACKETSIZE 3
+#define MOUSE_4D_PACKETSIZE 3
#define MOUSE_4D_WHEELBITS 0xf0
/* A4 Tech 4D+ Mouse (PS/2) data packet */
-#define MOUSE_4DPLUS_PACKETSIZE 3
+#define MOUSE_4DPLUS_PACKETSIZE 3
#define MOUSE_4DPLUS_ZNEG 0x04 /* sign bit */
#define MOUSE_4DPLUS_BUTTON4DOWN 0x08
@@ -340,7 +358,7 @@ typedef struct mousevar {
* as at the level 0. There are additional three bytes which shows
* `dz' and the states of additional buttons. `dz' is expressed as the
* sum of the byte 5 and 6 which contain signed seven bit values.
- * The states of the button 4 though 10 are in the bit 0 though 6 in
+ * The states of the button 4 though 10 are in the bit 0 though 6 in
* the byte 7 respectively: 1 indicates the button is up.
*/
#define MOUSE_SYS_PACKETSIZE 8
diff --git a/sys/sys/nv.h b/sys/sys/nv.h
index 0876e57..fa5d138 100644
--- a/sys/sys/nv.h
+++ b/sys/sys/nv.h
@@ -64,6 +64,10 @@ typedef struct nvlist nvlist_t;
* Perform case-insensitive lookups of provided names.
*/
#define NV_FLAG_IGNORE_CASE 0x01
+/*
+ * Names don't have to be unique.
+ */
+#define NV_FLAG_NO_UNIQUE 0x02
#if defined(_KERNEL) && defined(MALLOC_DECLARE)
MALLOC_DECLARE(M_NVLIST);
@@ -75,6 +79,7 @@ nvlist_t *nvlist_create(int flags);
void nvlist_destroy(nvlist_t *nvl);
int nvlist_error(const nvlist_t *nvl);
bool nvlist_empty(const nvlist_t *nvl);
+int nvlist_flags(const nvlist_t *nvl);
void nvlist_set_error(nvlist_t *nvl, int error);
nvlist_t *nvlist_clone(const nvlist_t *nvl);
@@ -86,11 +91,11 @@ void nvlist_fdump(const nvlist_t *nvl, FILE *fp);
size_t nvlist_size(const nvlist_t *nvl);
void *nvlist_pack(const nvlist_t *nvl, size_t *sizep);
-nvlist_t *nvlist_unpack(const void *buf, size_t size);
+nvlist_t *nvlist_unpack(const void *buf, size_t size, int flags);
int nvlist_send(int sock, const nvlist_t *nvl);
-nvlist_t *nvlist_recv(int sock);
-nvlist_t *nvlist_xfer(int sock, nvlist_t *nvl);
+nvlist_t *nvlist_recv(int sock, int flags);
+nvlist_t *nvlist_xfer(int sock, nvlist_t *nvl, int flags);
const char *nvlist_next(const nvlist_t *nvl, int *typep, void **cookiep);
@@ -194,129 +199,6 @@ void nvlist_free_descriptor(nvlist_t *nvl, const char *name);
#endif
void nvlist_free_binary(nvlist_t *nvl, const char *name);
-/*
- * Below are the same functions, but which operate on format strings and
- * variable argument lists.
- *
- * Functions that are not inserting a new pair into the nvlist cannot handle
- * a failure to allocate the memory to hold the new name. Therefore these
- * functions are not provided in the kernel.
- */
-
-#ifndef _KERNEL
-bool nvlist_existsf(const nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
-bool nvlist_existsf_type(const nvlist_t *nvl, int type, const char *namefmt, ...) __printflike(3, 4);
-
-bool nvlist_existsf_null(const nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
-bool nvlist_existsf_bool(const nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
-bool nvlist_existsf_number(const nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
-bool nvlist_existsf_string(const nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
-bool nvlist_existsf_nvlist(const nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
-bool nvlist_existsf_descriptor(const nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
-bool nvlist_existsf_binary(const nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
-
-bool nvlist_existsv(const nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
-bool nvlist_existsv_type(const nvlist_t *nvl, int type, const char *namefmt, va_list nameap) __printflike(3, 0);
-
-bool nvlist_existsv_null(const nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
-bool nvlist_existsv_bool(const nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
-bool nvlist_existsv_number(const nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
-bool nvlist_existsv_string(const nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
-bool nvlist_existsv_nvlist(const nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
-bool nvlist_existsv_descriptor(const nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
-bool nvlist_existsv_binary(const nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
-#endif
-
-void nvlist_addf_null(nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
-void nvlist_addf_bool(nvlist_t *nvl, bool value, const char *namefmt, ...) __printflike(3, 4);
-void nvlist_addf_number(nvlist_t *nvl, uint64_t value, const char *namefmt, ...) __printflike(3, 4);
-void nvlist_addf_string(nvlist_t *nvl, const char *value, const char *namefmt, ...) __printflike(3, 4);
-void nvlist_addf_nvlist(nvlist_t *nvl, const nvlist_t *value, const char *namefmt, ...) __printflike(3, 4);
-#ifndef _KERNEL
-void nvlist_addf_descriptor(nvlist_t *nvl, int value, const char *namefmt, ...) __printflike(3, 4);
-#endif
-void nvlist_addf_binary(nvlist_t *nvl, const void *value, size_t size, const char *namefmt, ...) __printflike(4, 5);
-
-#if !defined(_KERNEL) || defined(_VA_LIST_DECLARED)
-void nvlist_addv_null(nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
-void nvlist_addv_bool(nvlist_t *nvl, bool value, const char *namefmt, va_list nameap) __printflike(3, 0);
-void nvlist_addv_number(nvlist_t *nvl, uint64_t value, const char *namefmt, va_list nameap) __printflike(3, 0);
-void nvlist_addv_string(nvlist_t *nvl, const char *value, const char *namefmt, va_list nameap) __printflike(3, 0);
-void nvlist_addv_nvlist(nvlist_t *nvl, const nvlist_t *value, const char *namefmt, va_list nameap) __printflike(3, 0);
-#ifndef _KERNEL
-void nvlist_addv_descriptor(nvlist_t *nvl, int value, const char *namefmt, va_list nameap) __printflike(3, 0);
-#endif
-void nvlist_addv_binary(nvlist_t *nvl, const void *value, size_t size, const char *namefmt, va_list nameap) __printflike(4, 0);
-#endif
-
-void nvlist_movef_string(nvlist_t *nvl, char *value, const char *namefmt, ...) __printflike(3, 4);
-void nvlist_movef_nvlist(nvlist_t *nvl, nvlist_t *value, const char *namefmt, ...) __printflike(3, 4);
-#ifndef _KERNEL
-void nvlist_movef_descriptor(nvlist_t *nvl, int value, const char *namefmt, ...) __printflike(3, 4);
-#endif
-void nvlist_movef_binary(nvlist_t *nvl, void *value, size_t size, const char *namefmt, ...) __printflike(4, 5);
-
-#if !defined(_KERNEL) || defined(_VA_LIST_DECLARED)
-void nvlist_movev_string(nvlist_t *nvl, char *value, const char *namefmt, va_list nameap) __printflike(3, 0);
-void nvlist_movev_nvlist(nvlist_t *nvl, nvlist_t *value, const char *namefmt, va_list nameap) __printflike(3, 0);
-#ifndef _KERNEL
-void nvlist_movev_descriptor(nvlist_t *nvl, int value, const char *namefmt, va_list nameap) __printflike(3, 0);
-#endif
-void nvlist_movev_binary(nvlist_t *nvl, void *value, size_t size, const char *namefmt, va_list nameap) __printflike(4, 0);
-#endif
-
-#ifndef _KERNEL
-bool nvlist_getf_bool(const nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
-uint64_t nvlist_getf_number(const nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
-const char *nvlist_getf_string(const nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
-const nvlist_t *nvlist_getf_nvlist(const nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
-int nvlist_getf_descriptor(const nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
-const void *nvlist_getf_binary(const nvlist_t *nvl, size_t *sizep, const char *namefmt, ...) __printflike(3, 4);
-
-bool nvlist_getv_bool(const nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
-uint64_t nvlist_getv_number(const nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
-const char *nvlist_getv_string(const nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
-const nvlist_t *nvlist_getv_nvlist(const nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
-int nvlist_getv_descriptor(const nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
-const void *nvlist_getv_binary(const nvlist_t *nvl, size_t *sizep, const char *namefmt, va_list nameap) __printflike(3, 0);
-
-bool nvlist_takef_bool(nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
-uint64_t nvlist_takef_number(nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
-char *nvlist_takef_string(nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
-nvlist_t *nvlist_takef_nvlist(nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
-int nvlist_takef_descriptor(nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
-void *nvlist_takef_binary(nvlist_t *nvl, size_t *sizep, const char *namefmt, ...) __printflike(3, 4);
-
-bool nvlist_takev_bool(nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
-uint64_t nvlist_takev_number(nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
-char *nvlist_takev_string(nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
-nvlist_t *nvlist_takev_nvlist(nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
-int nvlist_takev_descriptor(nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
-void *nvlist_takev_binary(nvlist_t *nvl, size_t *sizep, const char *namefmt, va_list nameap) __printflike(3, 0);
-
-void nvlist_freef(nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
-void nvlist_freef_type(nvlist_t *nvl, int type, const char *namefmt, ...) __printflike(3, 4);
-
-void nvlist_freef_null(nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
-void nvlist_freef_bool(nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
-void nvlist_freef_number(nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
-void nvlist_freef_string(nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
-void nvlist_freef_nvlist(nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
-void nvlist_freef_descriptor(nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
-void nvlist_freef_binary(nvlist_t *nvl, const char *namefmt, ...) __printflike(2, 3);
-
-void nvlist_freev(nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
-void nvlist_freev_type(nvlist_t *nvl, int type, const char *namefmt, va_list nameap) __printflike(3, 0);
-
-void nvlist_freev_null(nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
-void nvlist_freev_bool(nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
-void nvlist_freev_number(nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
-void nvlist_freev_string(nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
-void nvlist_freev_nvlist(nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
-void nvlist_freev_descriptor(nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
-void nvlist_freev_binary(nvlist_t *nvl, const char *namefmt, va_list nameap) __printflike(2, 0);
-#endif /* _KERNEL */
-
__END_DECLS
#endif /* !_NV_H_ */
diff --git a/sys/sys/nv_impl.h b/sys/sys/nv_impl.h
index da90e79..c088c3d 100644
--- a/sys/sys/nv_impl.h
+++ b/sys/sys/nv_impl.h
@@ -41,23 +41,24 @@ typedef struct nvpair nvpair_t;
#define NV_TYPE_NVLIST_UP 255
-#define NV_TYPE_FIRST NV_TYPE_NULL
-#define NV_TYPE_LAST NV_TYPE_BINARY
+#define NV_TYPE_FIRST NV_TYPE_NULL
+#define NV_TYPE_LAST NV_TYPE_BINARY
#define NV_FLAG_BIG_ENDIAN 0x80
#ifdef _KERNEL
-#define nv_malloc(size) malloc((size), M_NVLIST, M_NOWAIT)
+#define nv_malloc(size) malloc((size), M_NVLIST, M_WAITOK)
#define nv_calloc(n, size) malloc((n) * (size), M_NVLIST, \
- M_NOWAIT | M_ZERO)
+ M_WAITOK | M_ZERO)
#define nv_realloc(buf, size) realloc((buf), (size), M_NVLIST, \
- M_NOWAIT)
+ M_WAITOK)
#define nv_free(buf) free((buf), M_NVLIST)
#define nv_strdup(buf) strdup((buf), M_NVLIST)
#define nv_vasprintf(ptr, ...) vasprintf(ptr, M_NVLIST, __VA_ARGS__)
-#define SAVE_ERRNO(var) ((void)(var))
-#define RESTORE_ERRNO(var) ((void)(var))
+#define ERRNO_SET(var) do { } while (0)
+#define ERRNO_SAVE() do { do { } while(0)
+#define ERRNO_RESTORE() } while (0)
#define ERRNO_OR_DEFAULT(default) (default)
@@ -70,8 +71,14 @@ typedef struct nvpair nvpair_t;
#define nv_strdup(buf) strdup((buf))
#define nv_vasprintf(ptr, ...) vasprintf(ptr, __VA_ARGS__)
-#define SAVE_ERRNO(var) (var) = errno
-#define RESTORE_ERRNO(var) errno = (var)
+#define ERRNO_SET(var) do { errno = (var); } while (0)
+#define ERRNO_SAVE() do { \
+ int _serrno; \
+ \
+ _serrno = errno
+
+#define ERRNO_RESTORE() errno = _serrno; \
+ } while (0)
#define ERRNO_OR_DEFAULT(default) (errno == 0 ? (default) : errno)
@@ -128,30 +135,4 @@ const void *nvpair_get_binary(const nvpair_t *nvp, size_t *sizep);
void nvpair_free(nvpair_t *nvp);
-nvpair_t *nvpair_createf_null(const char *namefmt, ...) __printflike(1, 2);
-nvpair_t *nvpair_createf_bool(bool value, const char *namefmt, ...) __printflike(2, 3);
-nvpair_t *nvpair_createf_number(uint64_t value, const char *namefmt, ...) __printflike(2, 3);
-nvpair_t *nvpair_createf_string(const char *value, const char *namefmt, ...) __printflike(2, 3);
-nvpair_t *nvpair_createf_nvlist(const nvlist_t *value, const char *namefmt, ...) __printflike(2, 3);
-nvpair_t *nvpair_createf_descriptor(int value, const char *namefmt, ...) __printflike(2, 3);
-nvpair_t *nvpair_createf_binary(const void *value, size_t size, const char *namefmt, ...) __printflike(3, 4);
-
-nvpair_t *nvpair_createv_null(const char *namefmt, va_list nameap) __printflike(1, 0);
-nvpair_t *nvpair_createv_bool(bool value, const char *namefmt, va_list nameap) __printflike(2, 0);
-nvpair_t *nvpair_createv_number(uint64_t value, const char *namefmt, va_list nameap) __printflike(2, 0);
-nvpair_t *nvpair_createv_string(const char *value, const char *namefmt, va_list nameap) __printflike(2, 0);
-nvpair_t *nvpair_createv_nvlist(const nvlist_t *value, const char *namefmt, va_list nameap) __printflike(2, 0);
-nvpair_t *nvpair_createv_descriptor(int value, const char *namefmt, va_list nameap) __printflike(2, 0);
-nvpair_t *nvpair_createv_binary(const void *value, size_t size, const char *namefmt, va_list nameap) __printflike(3, 0);
-
-nvpair_t *nvpair_movef_string(char *value, const char *namefmt, ...) __printflike(2, 3);
-nvpair_t *nvpair_movef_nvlist(nvlist_t *value, const char *namefmt, ...) __printflike(2, 3);
-nvpair_t *nvpair_movef_descriptor(int value, const char *namefmt, ...) __printflike(2, 3);
-nvpair_t *nvpair_movef_binary(void *value, size_t size, const char *namefmt, ...) __printflike(3, 4);
-
-nvpair_t *nvpair_movev_string(char *value, const char *namefmt, va_list nameap) __printflike(2, 0);
-nvpair_t *nvpair_movev_nvlist(nvlist_t *value, const char *namefmt, va_list nameap) __printflike(2, 0);
-nvpair_t *nvpair_movev_descriptor(int value, const char *namefmt, va_list nameap) __printflike(2, 0);
-nvpair_t *nvpair_movev_binary(void *value, size_t size, const char *namefmt, va_list nameap) __printflike(3, 0);
-
#endif /* !_NV_IMPL_H_ */
diff --git a/sys/sys/nvlist_impl.h b/sys/sys/nvlist_impl.h
index a59a90e..8aeac67 100644
--- a/sys/sys/nvlist_impl.h
+++ b/sys/sys/nvlist_impl.h
@@ -38,10 +38,6 @@
#include "nv.h"
-void *nvlist_xpack(const nvlist_t *nvl, int64_t *fdidxp, size_t *sizep);
-nvlist_t *nvlist_xunpack(const void *buf, size_t size, const int *fds,
- size_t nfds);
-
nvpair_t *nvlist_get_nvpair_parent(const nvlist_t *nvl);
const unsigned char *nvlist_unpack_header(nvlist_t *nvl,
const unsigned char *ptr, size_t nfds, bool *isbep, size_t *leftp);
diff --git a/sys/sys/param.h b/sys/sys/param.h
index cb8b9bd..bc722df 100644
--- a/sys/sys/param.h
+++ b/sys/sys/param.h
@@ -50,7 +50,7 @@
* there.
* Currently this lives here in the doc/ repository:
*
- * head/en_US.ISO8859-1/books/porters-handbook/book.xml
+ * head/en_US.ISO8859-1/books/porters-handbook/versions/chapter.xml
*
* scheme is: <major><two digit minor>Rxx
* 'R' is in the range 0 to 4 if this is a release branch or
@@ -58,7 +58,7 @@
* in the range 5 to 9.
*/
#undef __FreeBSD_version
-#define __FreeBSD_version 1100067 /* Master, propagated to newvers */
+#define __FreeBSD_version 1100072 /* Master, propagated to newvers */
/*
* __FreeBSD_kernel__ indicates that this system uses the kernel of FreeBSD,
@@ -233,10 +233,19 @@
* and may be made smaller at the risk of not being able to use
* filesystems which require a block size exceeding MAXBSIZE.
*
+ * MAXBCACHEBUF - Maximum size of a buffer in the buffer cache. This must
+ * be >= MAXBSIZE and can be set differently for different
+ * architectures by defining it in <machine/param.h>.
+ * Making this larger allows NFS to do larger reads/writes.
+ *
* BKVASIZE - Nominal buffer space per buffer, in bytes. BKVASIZE is the
* minimum KVM memory reservation the kernel is willing to make.
* Filesystems can of course request smaller chunks. Actual
* backing memory uses a chunk size of a page (PAGE_SIZE).
+ * The default value here can be overridden on a per-architecture
+ * basis by defining it in <machine/param.h>. This should
+ * probably be done to increase its value, when MAXBCACHEBUF is
+ * defined as a larger value in <machine/param.h>.
*
* If you make BKVASIZE too small you risk seriously fragmenting
* the buffer KVM map which may slow things down a bit. If you
@@ -248,7 +257,12 @@
* normal UFS filesystem.
*/
#define MAXBSIZE 65536 /* must be power of 2 */
+#ifndef MAXBCACHEBUF
+#define MAXBCACHEBUF MAXBSIZE /* must be a power of 2 >= MAXBSIZE */
+#endif
+#ifndef BKVASIZE
#define BKVASIZE 16384 /* must be power of 2 */
+#endif
#define BKVAMASK (BKVASIZE-1)
/*
diff --git a/sys/sys/pmc.h b/sys/sys/pmc.h
index ca0d076..34d9c34 100644
--- a/sys/sys/pmc.h
+++ b/sys/sys/pmc.h
@@ -96,10 +96,14 @@
__PMC_CPU(INTEL_NEHALEM_EX, 0x93, "Intel Nehalem Xeon 7500") \
__PMC_CPU(INTEL_WESTMERE_EX, 0x94, "Intel Westmere Xeon E7") \
__PMC_CPU(INTEL_HASWELL_XEON, 0x95, "Intel Haswell Xeon E5 v3") \
+ __PMC_CPU(INTEL_BROADWELL, 0x96, "Intel Broadwell") \
__PMC_CPU(INTEL_XSCALE, 0x100, "Intel XScale") \
__PMC_CPU(MIPS_24K, 0x200, "MIPS 24K") \
__PMC_CPU(MIPS_OCTEON, 0x201, "Cavium Octeon") \
+ __PMC_CPU(MIPS_74K, 0x202, "MIPS 74K") \
__PMC_CPU(PPC_7450, 0x300, "PowerPC MPC7450") \
+ __PMC_CPU(PPC_E500, 0x340, "PowerPC e500 Core") \
+ __PMC_CPU(PPC_MPC85XX, 0x340, "Freescale PowerPC MPC85XX") \
__PMC_CPU(PPC_970, 0x380, "IBM PowerPC 970") \
__PMC_CPU(GENERIC, 0x400, "Generic")
@@ -131,8 +135,10 @@ enum pmc_cputype {
__PMC_CLASS(ARMV7) /* ARMv7 */ \
__PMC_CLASS(MIPS24K) /* MIPS 24K */ \
__PMC_CLASS(OCTEON) /* Cavium Octeon */ \
+ __PMC_CLASS(MIPS74K) /* MIPS 74K */ \
__PMC_CLASS(PPC7450) /* Motorola MPC7450 class */ \
__PMC_CLASS(PPC970) /* IBM PowerPC 970 class */ \
+ __PMC_CLASS(E500) /* Freescale e500 class */ \
__PMC_CLASS(SOFT) /* Software events */
enum pmc_class {
diff --git a/sys/sys/procctl.h b/sys/sys/procctl.h
index c57eee6..75dbf53 100644
--- a/sys/sys/procctl.h
+++ b/sys/sys/procctl.h
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2013 Advanced Computing Technologies LLC
+ * Copyright (c) 2013 Hudson River Trading LLC
* Written by: John H. Baldwin <jhb@FreeBSD.org>
* All rights reserved.
*
diff --git a/sys/sys/procfs.h b/sys/sys/procfs.h
index cab9c30..6b32dfd 100644
--- a/sys/sys/procfs.h
+++ b/sys/sys/procfs.h
@@ -80,8 +80,6 @@ typedef struct prpsinfo {
char pr_psargs[PRARGSZ+1]; /* Arguments, null terminated (1) */
} prpsinfo_t;
-#define THRMISC_VERSION 1 /* Current version of thrmisc_t */
-
typedef struct thrmisc {
char pr_tname[MAXCOMLEN+1]; /* Thread name, null terminated (1) */
u_int _pad; /* Convenience pad, 0-filled (1) */
@@ -89,4 +87,29 @@ typedef struct thrmisc {
typedef uint64_t psaddr_t; /* An address in the target process. */
+#ifdef __HAVE_REG32
+typedef struct prstatus32 {
+ int32_t pr_version;
+ uint32_t pr_statussz;
+ uint32_t pr_gregsetsz;
+ uint32_t pr_fpregsetsz;
+ int32_t pr_osreldate;
+ int32_t pr_cursig;
+ int32_t pr_pid;
+ struct reg32 pr_reg;
+} prstatus32_t;
+
+typedef struct prpsinfo32 {
+ int32_t pr_version;
+ uint32_t pr_psinfosz;
+ char pr_fname[PRFNAMESZ+1];
+ char pr_psargs[PRARGSZ+1];
+} prpsinfo32_t;
+
+struct thrmisc32 {
+ char pr_tname[MAXCOMLEN+1];
+ uint32_t _pad;
+};
+#endif /* __HAVE_REG32 */
+
#endif /* _SYS_PROCFS_H_ */
diff --git a/sys/sys/racct.h b/sys/sys/racct.h
index 966d27a..313d5d0 100644
--- a/sys/sys/racct.h
+++ b/sys/sys/racct.h
@@ -83,6 +83,10 @@ struct ucred;
#define RACCT_DECAYING 0x20
extern int racct_types[];
+extern int racct_enable;
+
+#define ASSERT_RACCT_ENABLED() KASSERT(racct_enable, \
+ ("%s called with !racct_enable", __func__))
/*
* Amount stored in c_resources[] is 10**6 times bigger than what's
diff --git a/sys/sys/seq.h b/sys/sys/seq.h
index eaab86e..21067cb 100644
--- a/sys/sys/seq.h
+++ b/sys/sys/seq.h
@@ -79,7 +79,7 @@ typedef uint32_t seq_t;
* on amd64 but still has unnecessary cost.
*/
static __inline int
-atomic_load_rmb_int(volatile u_int *p)
+atomic_load_rmb_int(volatile const u_int *p)
{
volatile u_int v;
@@ -89,7 +89,7 @@ atomic_load_rmb_int(volatile u_int *p)
}
static __inline int
-atomic_rmb_load_int(volatile u_int *p)
+atomic_rmb_load_int(volatile const u_int *p)
{
volatile u_int v = 0;
@@ -122,7 +122,7 @@ seq_write_end(seq_t *seqp)
}
static __inline seq_t
-seq_read(seq_t *seqp)
+seq_read(const seq_t *seqp)
{
seq_t ret;
@@ -139,7 +139,7 @@ seq_read(seq_t *seqp)
}
static __inline seq_t
-seq_consistent(seq_t *seqp, seq_t oldseq)
+seq_consistent(const seq_t *seqp, seq_t oldseq)
{
return (atomic_rmb_load_int(seqp) == oldseq);
diff --git a/sys/sys/socketvar.h b/sys/sys/socketvar.h
index dfeeede..112bb2c 100644
--- a/sys/sys/socketvar.h
+++ b/sys/sys/socketvar.h
@@ -339,7 +339,7 @@ struct uio;
*/
int sockargs(struct mbuf **mp, caddr_t buf, int buflen, int type);
int getsockaddr(struct sockaddr **namp, caddr_t uaddr, size_t len);
-int getsock_cap(struct filedesc *fdp, int fd, cap_rights_t *rightsp,
+int getsock_cap(struct thread *td, int fd, cap_rights_t *rightsp,
struct file **fpp, u_int *fflagp);
void soabort(struct socket *so);
int soaccept(struct socket *so, struct sockaddr **nam);
diff --git a/sys/sys/sockio.h b/sys/sys/sockio.h
index 7b09acf..f04bb12 100644
--- a/sys/sys/sockio.h
+++ b/sys/sys/sockio.h
@@ -128,5 +128,6 @@
#define SIOCGIFGROUP _IOWR('i', 136, struct ifgroupreq) /* get ifgroups */
#define SIOCDIFGROUP _IOW('i', 137, struct ifgroupreq) /* delete ifgroup */
#define SIOCGIFGMEMB _IOWR('i', 138, struct ifgroupreq) /* get members */
+#define SIOCGIFXMEDIA _IOWR('i', 139, struct ifmediareq) /* get net xmedia */
#endif /* !_SYS_SOCKIO_H_ */
diff --git a/sys/sys/syscall.h b/sys/sys/syscall.h
index 54a450f..5e757bf 100644
--- a/sys/sys/syscall.h
+++ b/sys/sys/syscall.h
@@ -3,7 +3,7 @@
*
* DO NOT EDIT-- this file is automatically generated.
* $FreeBSD$
- * created from FreeBSD: head/sys/kern/syscalls.master 277610 2015-01-23 21:07:08Z jilles
+ * created from FreeBSD: head/sys/kern/syscalls.master 281714 2015-04-18 21:50:13Z kib
*/
#define SYS_syscall 0
diff --git a/sys/sys/syscall.mk b/sys/sys/syscall.mk
index 4e8e891..50c02cb 100644
--- a/sys/sys/syscall.mk
+++ b/sys/sys/syscall.mk
@@ -1,7 +1,7 @@
# FreeBSD system call names.
# DO NOT EDIT-- this file is automatically generated.
# $FreeBSD$
-# created from FreeBSD: head/sys/kern/syscalls.master 277610 2015-01-23 21:07:08Z jilles
+# created from FreeBSD: head/sys/kern/syscalls.master 281714 2015-04-18 21:50:13Z kib
MIASM = \
syscall.o \
exit.o \
diff --git a/sys/sys/syscallsubr.h b/sys/sys/syscallsubr.h
index cb6d4e3..8d8c173 100644
--- a/sys/sys/syscallsubr.h
+++ b/sys/sys/syscallsubr.h
@@ -58,7 +58,7 @@ struct thr_param;
struct __wrusage;
int kern___getcwd(struct thread *td, char *buf, enum uio_seg bufseg,
- u_int buflen);
+ u_int buflen, u_int path_max);
int kern_accept(struct thread *td, int s, struct sockaddr **name,
socklen_t *namelen, struct file **fp);
int kern_accept4(struct thread *td, int s, struct sockaddr **name,
@@ -104,7 +104,7 @@ int kern_futimens(struct thread *td, int fd, struct timespec *tptr,
int kern_getdirentries(struct thread *td, int fd, char *buf, u_int count,
long *basep, ssize_t *residp, enum uio_seg bufseg);
int kern_getfsstat(struct thread *td, struct statfs **buf, size_t bufsize,
- enum uio_seg bufseg, int flags);
+ size_t *countp, enum uio_seg bufseg, int flags);
int kern_getitimer(struct thread *, u_int, struct itimerval *);
int kern_getppid(struct thread *);
int kern_getpeername(struct thread *td, int fd, struct sockaddr **sa,
diff --git a/sys/sys/sysproto.h b/sys/sys/sysproto.h
index 71dc979..3a35861 100644
--- a/sys/sys/sysproto.h
+++ b/sys/sys/sysproto.h
@@ -3,7 +3,7 @@
*
* DO NOT EDIT-- this file is automatically generated.
* $FreeBSD$
- * created from FreeBSD: head/sys/kern/syscalls.master 277610 2015-01-23 21:07:08Z jilles
+ * created from FreeBSD: head/sys/kern/syscalls.master 281714 2015-04-18 21:50:13Z kib
*/
#ifndef _SYS_SYSPROTO_H_
@@ -532,20 +532,6 @@ struct shmsys_args {
char a3_l_[PADL_(int)]; int a3; char a3_r_[PADR_(int)];
char a4_l_[PADL_(int)]; int a4; char a4_r_[PADR_(int)];
};
-struct freebsd6_pread_args {
- char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)];
- char buf_l_[PADL_(void *)]; void * buf; char buf_r_[PADR_(void *)];
- char nbyte_l_[PADL_(size_t)]; size_t nbyte; char nbyte_r_[PADR_(size_t)];
- char pad_l_[PADL_(int)]; int pad; char pad_r_[PADR_(int)];
- char offset_l_[PADL_(off_t)]; off_t offset; char offset_r_[PADR_(off_t)];
-};
-struct freebsd6_pwrite_args {
- char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)];
- char buf_l_[PADL_(const void *)]; const void * buf; char buf_r_[PADR_(const void *)];
- char nbyte_l_[PADL_(size_t)]; size_t nbyte; char nbyte_r_[PADR_(size_t)];
- char pad_l_[PADL_(int)]; int pad; char pad_r_[PADR_(int)];
- char offset_l_[PADL_(off_t)]; off_t offset; char offset_r_[PADR_(off_t)];
-};
struct setfib_args {
char fibnum_l_[PADL_(int)]; int fibnum; char fibnum_r_[PADR_(int)];
};
@@ -595,31 +581,6 @@ struct getdirentries_args {
char count_l_[PADL_(u_int)]; u_int count; char count_r_[PADR_(u_int)];
char basep_l_[PADL_(long *)]; long * basep; char basep_r_[PADR_(long *)];
};
-struct freebsd6_mmap_args {
- char addr_l_[PADL_(caddr_t)]; caddr_t addr; char addr_r_[PADR_(caddr_t)];
- char len_l_[PADL_(size_t)]; size_t len; char len_r_[PADR_(size_t)];
- char prot_l_[PADL_(int)]; int prot; char prot_r_[PADR_(int)];
- char flags_l_[PADL_(int)]; int flags; char flags_r_[PADR_(int)];
- char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)];
- char pad_l_[PADL_(int)]; int pad; char pad_r_[PADR_(int)];
- char pos_l_[PADL_(off_t)]; off_t pos; char pos_r_[PADR_(off_t)];
-};
-struct freebsd6_lseek_args {
- char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)];
- char pad_l_[PADL_(int)]; int pad; char pad_r_[PADR_(int)];
- char offset_l_[PADL_(off_t)]; off_t offset; char offset_r_[PADR_(off_t)];
- char whence_l_[PADL_(int)]; int whence; char whence_r_[PADR_(int)];
-};
-struct freebsd6_truncate_args {
- char path_l_[PADL_(char *)]; char * path; char path_r_[PADR_(char *)];
- char pad_l_[PADL_(int)]; int pad; char pad_r_[PADR_(int)];
- char length_l_[PADL_(off_t)]; off_t length; char length_r_[PADR_(off_t)];
-};
-struct freebsd6_ftruncate_args {
- char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)];
- char pad_l_[PADL_(int)]; int pad; char pad_r_[PADR_(int)];
- char length_l_[PADL_(off_t)]; off_t length; char length_r_[PADR_(off_t)];
-};
struct sysctl_args {
char name_l_[PADL_(int *)]; int * name; char name_r_[PADR_(int *)];
char namelen_l_[PADL_(u_int)]; u_int namelen; char namelen_r_[PADR_(u_int)];
@@ -1941,8 +1902,6 @@ int sys_rtprio(struct thread *, struct rtprio_args *);
int sys_semsys(struct thread *, struct semsys_args *);
int sys_msgsys(struct thread *, struct msgsys_args *);
int sys_shmsys(struct thread *, struct shmsys_args *);
-int freebsd6_pread(struct thread *, struct freebsd6_pread_args *);
-int freebsd6_pwrite(struct thread *, struct freebsd6_pwrite_args *);
int sys_setfib(struct thread *, struct setfib_args *);
int sys_ntp_adjtime(struct thread *, struct ntp_adjtime_args *);
int sys_setgid(struct thread *, struct setgid_args *);
@@ -1956,10 +1915,6 @@ int sys_fpathconf(struct thread *, struct fpathconf_args *);
int sys_getrlimit(struct thread *, struct __getrlimit_args *);
int sys_setrlimit(struct thread *, struct __setrlimit_args *);
int sys_getdirentries(struct thread *, struct getdirentries_args *);
-int freebsd6_mmap(struct thread *, struct freebsd6_mmap_args *);
-int freebsd6_lseek(struct thread *, struct freebsd6_lseek_args *);
-int freebsd6_truncate(struct thread *, struct freebsd6_truncate_args *);
-int freebsd6_ftruncate(struct thread *, struct freebsd6_ftruncate_args *);
int sys___sysctl(struct thread *, struct sysctl_args *);
int sys_mlock(struct thread *, struct mlock_args *);
int sys_munlock(struct thread *, struct munlock_args *);
@@ -2459,6 +2414,51 @@ int freebsd4_sigreturn(struct thread *, struct freebsd4_sigreturn_args *);
#ifdef COMPAT_FREEBSD6
+struct freebsd6_pread_args {
+ char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)];
+ char buf_l_[PADL_(void *)]; void * buf; char buf_r_[PADR_(void *)];
+ char nbyte_l_[PADL_(size_t)]; size_t nbyte; char nbyte_r_[PADR_(size_t)];
+ char pad_l_[PADL_(int)]; int pad; char pad_r_[PADR_(int)];
+ char offset_l_[PADL_(off_t)]; off_t offset; char offset_r_[PADR_(off_t)];
+};
+struct freebsd6_pwrite_args {
+ char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)];
+ char buf_l_[PADL_(const void *)]; const void * buf; char buf_r_[PADR_(const void *)];
+ char nbyte_l_[PADL_(size_t)]; size_t nbyte; char nbyte_r_[PADR_(size_t)];
+ char pad_l_[PADL_(int)]; int pad; char pad_r_[PADR_(int)];
+ char offset_l_[PADL_(off_t)]; off_t offset; char offset_r_[PADR_(off_t)];
+};
+struct freebsd6_mmap_args {
+ char addr_l_[PADL_(caddr_t)]; caddr_t addr; char addr_r_[PADR_(caddr_t)];
+ char len_l_[PADL_(size_t)]; size_t len; char len_r_[PADR_(size_t)];
+ char prot_l_[PADL_(int)]; int prot; char prot_r_[PADR_(int)];
+ char flags_l_[PADL_(int)]; int flags; char flags_r_[PADR_(int)];
+ char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)];
+ char pad_l_[PADL_(int)]; int pad; char pad_r_[PADR_(int)];
+ char pos_l_[PADL_(off_t)]; off_t pos; char pos_r_[PADR_(off_t)];
+};
+struct freebsd6_lseek_args {
+ char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)];
+ char pad_l_[PADL_(int)]; int pad; char pad_r_[PADR_(int)];
+ char offset_l_[PADL_(off_t)]; off_t offset; char offset_r_[PADR_(off_t)];
+ char whence_l_[PADL_(int)]; int whence; char whence_r_[PADR_(int)];
+};
+struct freebsd6_truncate_args {
+ char path_l_[PADL_(char *)]; char * path; char path_r_[PADR_(char *)];
+ char pad_l_[PADL_(int)]; int pad; char pad_r_[PADR_(int)];
+ char length_l_[PADL_(off_t)]; off_t length; char length_r_[PADR_(off_t)];
+};
+struct freebsd6_ftruncate_args {
+ char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)];
+ char pad_l_[PADL_(int)]; int pad; char pad_r_[PADR_(int)];
+ char length_l_[PADL_(off_t)]; off_t length; char length_r_[PADR_(off_t)];
+};
+int freebsd6_pread(struct thread *, struct freebsd6_pread_args *);
+int freebsd6_pwrite(struct thread *, struct freebsd6_pwrite_args *);
+int freebsd6_mmap(struct thread *, struct freebsd6_mmap_args *);
+int freebsd6_lseek(struct thread *, struct freebsd6_lseek_args *);
+int freebsd6_truncate(struct thread *, struct freebsd6_truncate_args *);
+int freebsd6_ftruncate(struct thread *, struct freebsd6_ftruncate_args *);
#endif /* COMPAT_FREEBSD6 */
diff --git a/sys/sys/systm.h b/sys/sys/systm.h
index 8a358ce..786414f 100644
--- a/sys/sys/systm.h
+++ b/sys/sys/systm.h
@@ -187,6 +187,7 @@ void *phashinit(int count, struct malloc_type *type, u_long *nentries);
void g_waitidle(void);
void panic(const char *, ...) __dead2 __printflike(1, 2);
+void vpanic(const char *, __va_list) __dead2 __printflike(1, 0);
void cpu_boot(int);
void cpu_flush_dcache(void *, size_t);
diff --git a/sys/sys/vnode.h b/sys/sys/vnode.h
index e1f912e..d70aa57 100644
--- a/sys/sys/vnode.h
+++ b/sys/sys/vnode.h
@@ -336,6 +336,8 @@ struct vattr {
#define VWRITE_ACL 000040000000 /* change ACL and/or file mode */
#define VWRITE_OWNER 000100000000 /* change file owner */
#define VSYNCHRONIZE 000200000000 /* not used */
+#define VCREAT 000400000000 /* creating new file */
+#define VVERIFY 001000000000 /* verification required */
/*
* Permissions that were traditionally granted only to the file owner.
diff --git a/sys/net/zlib.h b/sys/sys/zlib.h
index 16edae1..16edae1 100644
--- a/sys/net/zlib.h
+++ b/sys/sys/zlib.h
diff --git a/sys/net/zutil.h b/sys/sys/zutil.h
index 74f0221..1431b6f 100644
--- a/sys/net/zutil.h
+++ b/sys/sys/zutil.h
@@ -17,7 +17,7 @@
#define ZEXPORT
#ifdef _KERNEL
-#include <net/zlib.h>
+#include <sys/zlib.h>
#else
#include "zlib.h"
#endif
diff --git a/sys/ufs/ffs/ffs_alloc.c b/sys/ufs/ffs/ffs_alloc.c
index c918cd7..c384064 100644
--- a/sys/ufs/ffs/ffs_alloc.c
+++ b/sys/ufs/ffs/ffs_alloc.c
@@ -112,8 +112,7 @@ static void ffs_blkfree_trim_task(void *ctx, int pending __unused);
#ifdef INVARIANTS
static int ffs_checkblk(struct inode *, ufs2_daddr_t, long);
#endif
-static ufs2_daddr_t ffs_clusteralloc(struct inode *, u_int, ufs2_daddr_t, int,
- int);
+static ufs2_daddr_t ffs_clusteralloc(struct inode *, u_int, ufs2_daddr_t, int);
static ino_t ffs_dirpref(struct inode *);
static ufs2_daddr_t ffs_fragextend(struct inode *, u_int, ufs2_daddr_t,
int, int);
@@ -460,10 +459,16 @@ nospace:
SYSCTL_NODE(_vfs, OID_AUTO, ffs, CTLFLAG_RW, 0, "FFS filesystem");
static int doasyncfree = 1;
-SYSCTL_INT(_vfs_ffs, OID_AUTO, doasyncfree, CTLFLAG_RW, &doasyncfree, 0, "");
+SYSCTL_INT(_vfs_ffs, OID_AUTO, doasyncfree, CTLFLAG_RW, &doasyncfree, 0,
+"do not force synchronous writes when blocks are reallocated");
static int doreallocblks = 1;
-SYSCTL_INT(_vfs_ffs, OID_AUTO, doreallocblks, CTLFLAG_RW, &doreallocblks, 0, "");
+SYSCTL_INT(_vfs_ffs, OID_AUTO, doreallocblks, CTLFLAG_RW, &doreallocblks, 0,
+"enable block reallocation");
+
+static int maxclustersearch = 10;
+SYSCTL_INT(_vfs_ffs, OID_AUTO, maxclustersearch, CTLFLAG_RW, &maxclustersearch,
+0, "max number of cylinder group to search for contigous blocks");
#ifdef DEBUG
static volatile int prtrealloc = 0;
@@ -510,7 +515,7 @@ ffs_reallocblks_ufs1(ap)
ufs1_daddr_t soff, newblk, blkno;
ufs2_daddr_t pref;
struct indir start_ap[NIADDR + 1], end_ap[NIADDR + 1], *idp;
- int i, len, start_lvl, end_lvl, ssize;
+ int i, cg, len, start_lvl, end_lvl, ssize;
vp = ap->a_vp;
ip = VTOI(vp);
@@ -597,18 +602,39 @@ ffs_reallocblks_ufs1(ap)
ebap = (ufs1_daddr_t *)ebp->b_data;
}
/*
- * Find the preferred location for the cluster.
+ * Find the preferred location for the cluster. If we have not
+ * previously failed at this endeavor, then follow our standard
+ * preference calculation. If we have failed at it, then pick up
+ * where we last ended our search.
*/
UFS_LOCK(ump);
- pref = ffs_blkpref_ufs1(ip, start_lbn, soff, sbap);
+ if (ip->i_nextclustercg == -1)
+ pref = ffs_blkpref_ufs1(ip, start_lbn, soff, sbap);
+ else
+ pref = cgdata(fs, ip->i_nextclustercg);
/*
* Search the block map looking for an allocation of the desired size.
+ * To avoid wasting too much time, we limit the number of cylinder
+ * groups that we will search.
+ */
+ cg = dtog(fs, pref);
+ for (i = min(maxclustersearch, fs->fs_ncg); i > 0; i--) {
+ if ((newblk = ffs_clusteralloc(ip, cg, pref, len)) != 0)
+ break;
+ cg += 1;
+ if (cg >= fs->fs_ncg)
+ cg = 0;
+ }
+ /*
+ * If we have failed in our search, record where we gave up for
+ * next time. Otherwise, fall back to our usual search citerion.
*/
- if ((newblk = ffs_hashalloc(ip, dtog(fs, pref), pref,
- len, len, ffs_clusteralloc)) == 0) {
+ if (newblk == 0) {
+ ip->i_nextclustercg = cg;
UFS_UNLOCK(ump);
goto fail;
}
+ ip->i_nextclustercg = -1;
/*
* We have found a new contiguous block.
*
@@ -737,7 +763,7 @@ ffs_reallocblks_ufs2(ap)
ufs_lbn_t start_lbn, end_lbn;
ufs2_daddr_t soff, newblk, blkno, pref;
struct indir start_ap[NIADDR + 1], end_ap[NIADDR + 1], *idp;
- int i, len, start_lvl, end_lvl, ssize;
+ int i, cg, len, start_lvl, end_lvl, ssize;
vp = ap->a_vp;
ip = VTOI(vp);
@@ -824,18 +850,39 @@ ffs_reallocblks_ufs2(ap)
ebap = (ufs2_daddr_t *)ebp->b_data;
}
/*
- * Find the preferred location for the cluster.
+ * Find the preferred location for the cluster. If we have not
+ * previously failed at this endeavor, then follow our standard
+ * preference calculation. If we have failed at it, then pick up
+ * where we last ended our search.
*/
UFS_LOCK(ump);
- pref = ffs_blkpref_ufs2(ip, start_lbn, soff, sbap);
+ if (ip->i_nextclustercg == -1)
+ pref = ffs_blkpref_ufs2(ip, start_lbn, soff, sbap);
+ else
+ pref = cgdata(fs, ip->i_nextclustercg);
/*
* Search the block map looking for an allocation of the desired size.
+ * To avoid wasting too much time, we limit the number of cylinder
+ * groups that we will search.
+ */
+ cg = dtog(fs, pref);
+ for (i = min(maxclustersearch, fs->fs_ncg); i > 0; i--) {
+ if ((newblk = ffs_clusteralloc(ip, cg, pref, len)) != 0)
+ break;
+ cg += 1;
+ if (cg >= fs->fs_ncg)
+ cg = 0;
+ }
+ /*
+ * If we have failed in our search, record where we gave up for
+ * next time. Otherwise, fall back to our usual search citerion.
*/
- if ((newblk = ffs_hashalloc(ip, dtog(fs, pref), pref,
- len, len, ffs_clusteralloc)) == 0) {
+ if (newblk == 0) {
+ ip->i_nextclustercg = cg;
UFS_UNLOCK(ump);
goto fail;
}
+ ip->i_nextclustercg = -1;
/*
* We have found a new contiguous block.
*
@@ -1786,12 +1833,11 @@ gotit:
* take the first one that we find following bpref.
*/
static ufs2_daddr_t
-ffs_clusteralloc(ip, cg, bpref, len, unused)
+ffs_clusteralloc(ip, cg, bpref, len)
struct inode *ip;
u_int cg;
ufs2_daddr_t bpref;
int len;
- int unused;
{
struct fs *fs;
struct cg *cgp;
diff --git a/sys/ufs/ffs/ffs_vfsops.c b/sys/ufs/ffs/ffs_vfsops.c
index 6e2e556..2a368bd 100644
--- a/sys/ufs/ffs/ffs_vfsops.c
+++ b/sys/ufs/ffs/ffs_vfsops.c
@@ -1055,7 +1055,8 @@ ffs_mountfs(devvp, mp, td)
*/
MNT_ILOCK(mp);
mp->mnt_kern_flag |= MNTK_LOOKUP_SHARED | MNTK_EXTENDED_SHARED |
- MNTK_NO_IOPF | MNTK_UNMAPPED_BUFS | MNTK_SUSPENDABLE;
+ MNTK_NO_IOPF | MNTK_UNMAPPED_BUFS | MNTK_SUSPENDABLE |
+ MNTK_USES_BCACHE;
MNT_IUNLOCK(mp);
#ifdef UFS_EXTATTR
#ifdef UFS_EXTATTR_AUTOSTART
@@ -1687,6 +1688,7 @@ ffs_vgetf(mp, ino, flags, vpp, ffs_flags)
ip->i_dev = dev;
ip->i_number = ino;
ip->i_ea_refs = 0;
+ ip->i_nextclustercg = -1;
#ifdef QUOTA
{
int i;
diff --git a/sys/ufs/ufs/inode.h b/sys/ufs/ufs/inode.h
index 37081d5..cd7c472 100644
--- a/sys/ufs/ufs/inode.h
+++ b/sys/ufs/ufs/inode.h
@@ -87,6 +87,8 @@ struct inode {
daddr_t *snapblklist; /* Collect expunged snapshot blocks. */
} i_un;
+ int i_nextclustercg; /* last cg searched for cluster */
+
/*
* Data for extended attribute modification.
*/
diff --git a/sys/vm/device_pager.c b/sys/vm/device_pager.c
index 4cd245a..d05ea33 100644
--- a/sys/vm/device_pager.c
+++ b/sys/vm/device_pager.c
@@ -294,7 +294,6 @@ static int
old_dev_pager_fault(vm_object_t object, vm_ooffset_t offset, int prot,
vm_page_t *mres)
{
- vm_pindex_t pidx;
vm_paddr_t paddr;
vm_page_t m_paddr, page;
struct cdev *dev;
@@ -304,7 +303,6 @@ old_dev_pager_fault(vm_object_t object, vm_ooffset_t offset, int prot,
vm_memattr_t memattr;
int ref, ret;
- pidx = OFF_TO_IDX(offset);
memattr = object->memattr;
VM_OBJECT_WUNLOCK(object);
diff --git a/sys/vm/sg_pager.c b/sys/vm/sg_pager.c
index 08e8fc7..e35741e 100644
--- a/sys/vm/sg_pager.c
+++ b/sys/vm/sg_pager.c
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2009 Advanced Computing Technologies LLC
+ * Copyright (c) 2009 Hudson River Trading LLC
* Written by: John H. Baldwin <jhb@FreeBSD.org>
* All rights reserved.
*
diff --git a/sys/vm/swap_pager.c b/sys/vm/swap_pager.c
index 435f412..9a83989 100644
--- a/sys/vm/swap_pager.c
+++ b/sys/vm/swap_pager.c
@@ -198,11 +198,13 @@ swap_reserve_by_cred(vm_ooffset_t incr, struct ucred *cred)
panic("swap_reserve: & PAGE_MASK");
#ifdef RACCT
- PROC_LOCK(curproc);
- error = racct_add(curproc, RACCT_SWAP, incr);
- PROC_UNLOCK(curproc);
- if (error != 0)
- return (0);
+ if (racct_enable) {
+ PROC_LOCK(curproc);
+ error = racct_add(curproc, RACCT_SWAP, incr);
+ PROC_UNLOCK(curproc);
+ if (error != 0)
+ return (0);
+ }
#endif
res = 0;
@@ -326,17 +328,16 @@ static int nsw_wcount_async; /* limit write buffers / asynchronous */
static int nsw_wcount_async_max;/* assigned maximum */
static int nsw_cluster_max; /* maximum VOP I/O allowed */
+static int sysctl_swap_async_max(SYSCTL_HANDLER_ARGS);
+SYSCTL_PROC(_vm, OID_AUTO, swap_async_max, CTLTYPE_INT | CTLFLAG_RW,
+ NULL, 0, sysctl_swap_async_max, "I", "Maximum running async swap ops");
+
static struct swblock **swhash;
static int swhash_mask;
static struct mtx swhash_mtx;
-static int swap_async_max = 4; /* maximum in-progress async I/O's */
static struct sx sw_alloc_sx;
-
-SYSCTL_INT(_vm, OID_AUTO, swap_async_max,
- CTLFLAG_RW, &swap_async_max, 0, "Maximum running async swap ops");
-
/*
* "named" and "unnamed" anon region objects. Try to reduce the overhead
* of searching a named list by hashing it just a little.
@@ -1348,39 +1349,6 @@ swap_pager_putpages(vm_object_t object, vm_page_t *m, int count,
/*
* Step 2
*
- * Update nsw parameters from swap_async_max sysctl values.
- * Do not let the sysop crash the machine with bogus numbers.
- */
- mtx_lock(&pbuf_mtx);
- if (swap_async_max != nsw_wcount_async_max) {
- int n;
-
- /*
- * limit range
- */
- if ((n = swap_async_max) > nswbuf / 2)
- n = nswbuf / 2;
- if (n < 1)
- n = 1;
- swap_async_max = n;
-
- /*
- * Adjust difference ( if possible ). If the current async
- * count is too low, we may not be able to make the adjustment
- * at this time.
- */
- n -= nsw_wcount_async_max;
- if (nsw_wcount_async + n >= 0) {
- nsw_wcount_async += n;
- nsw_wcount_async_max += n;
- wakeup(&nsw_wcount_async);
- }
- }
- mtx_unlock(&pbuf_mtx);
-
- /*
- * Step 3
- *
* Assign swap blocks and issue I/O. We reallocate swap on the fly.
* The page is left dirty until the pageout operation completes
* successfully.
@@ -2579,7 +2547,6 @@ swapgeom_done(struct bio *bp2)
struct swdevt *sp;
struct buf *bp;
struct g_consumer *cp;
- int destroy;
bp = bp2->bio_caller2;
cp = bp2->bio_from;
@@ -2590,15 +2557,14 @@ swapgeom_done(struct bio *bp2)
bp->b_error = bp2->bio_error;
bufdone(bp);
mtx_lock(&sw_dev_mtx);
- destroy = ((--cp->index) == 0 && cp->private);
- if (destroy) {
- sp = bp2->bio_caller1;
- sp->sw_id = NULL;
+ if ((--cp->index) == 0 && cp->private) {
+ if (g_post_event(swapgeom_close_ev, cp, M_NOWAIT, NULL) == 0) {
+ sp = bp2->bio_caller1;
+ sp->sw_id = NULL;
+ }
}
mtx_unlock(&sw_dev_mtx);
g_destroy_bio(bp2);
- if (destroy)
- g_waitfor_event(swapgeom_close_ev, cp, M_WAITOK, NULL);
}
static void
@@ -2835,3 +2801,40 @@ swaponvp(struct thread *td, struct vnode *vp, u_long nblks)
NODEV, 0);
return (0);
}
+
+static int
+sysctl_swap_async_max(SYSCTL_HANDLER_ARGS)
+{
+ int error, new, n;
+
+ new = nsw_wcount_async_max;
+ error = sysctl_handle_int(oidp, &new, 0, req);
+ if (error != 0 || req->newptr == NULL)
+ return (error);
+
+ if (new > nswbuf / 2 || new < 1)
+ return (EINVAL);
+
+ mtx_lock(&pbuf_mtx);
+ while (nsw_wcount_async_max != new) {
+ /*
+ * Adjust difference. If the current async count is too low,
+ * we will need to sqeeze our update slowly in. Sleep with a
+ * higher priority than getpbuf() to finish faster.
+ */
+ n = new - nsw_wcount_async_max;
+ if (nsw_wcount_async + n >= 0) {
+ nsw_wcount_async += n;
+ nsw_wcount_async_max += n;
+ wakeup(&nsw_wcount_async);
+ } else {
+ nsw_wcount_async_max -= nsw_wcount_async;
+ nsw_wcount_async = 0;
+ msleep(&nsw_wcount_async, &pbuf_mtx, PSWP,
+ "swpsysctl", 0);
+ }
+ }
+ mtx_unlock(&pbuf_mtx);
+
+ return (0);
+}
diff --git a/sys/vm/uma_core.c b/sys/vm/uma_core.c
index 7556803..4ff177f 100644
--- a/sys/vm/uma_core.c
+++ b/sys/vm/uma_core.c
@@ -307,9 +307,8 @@ bucket_init(void)
{
struct uma_bucket_zone *ubz;
int size;
- int i;
- for (i = 0, ubz = &bucket_zones[0]; ubz->ubz_entries != 0; ubz++) {
+ for (ubz = &bucket_zones[0]; ubz->ubz_entries != 0; ubz++) {
size = roundup(sizeof(struct uma_bucket), sizeof(void *));
size += sizeof(void *) * ubz->ubz_entries;
ubz->ubz_zone = uma_zcreate(ubz->ubz_name, size,
@@ -3060,7 +3059,7 @@ uma_zone_set_fini(uma_zone_t zone, uma_fini fini)
uma_keg_t keg;
keg = zone_first_keg(zone);
- KASSERT(keg != NULL, ("uma_zone_set_init: Invalid zone type"));
+ KASSERT(keg != NULL, ("uma_zone_set_fini: Invalid zone type"));
KEG_LOCK(keg);
KASSERT(keg->uk_pages == 0,
("uma_zone_set_fini on non-empty keg"));
@@ -3100,7 +3099,7 @@ uma_zone_set_freef(uma_zone_t zone, uma_free freef)
uma_keg_t keg;
keg = zone_first_keg(zone);
- KASSERT(keg != NULL, ("uma_zone_set_init: Invalid zone type"));
+ KASSERT(keg != NULL, ("uma_zone_set_freef: Invalid zone type"));
KEG_LOCK(keg);
keg->uk_freef = freef;
KEG_UNLOCK(keg);
@@ -3540,16 +3539,13 @@ int
sysctl_handle_uma_zone_max(SYSCTL_HANDLER_ARGS)
{
uma_zone_t zone = *(uma_zone_t *)arg1;
- int error, max, old;
+ int error, max;
- old = max = uma_zone_get_max(zone);
+ max = uma_zone_get_max(zone);
error = sysctl_handle_int(oidp, &max, 0, req);
if (error || !req->newptr)
return (error);
- if (max < old)
- return (EINVAL);
-
uma_zone_set_max(zone, max);
return (0);
diff --git a/sys/vm/vm_fault.c b/sys/vm/vm_fault.c
index 536076a..0c84d44 100644
--- a/sys/vm/vm_fault.c
+++ b/sys/vm/vm_fault.c
@@ -81,6 +81,7 @@ __FBSDID("$FreeBSD$");
#include <sys/systm.h>
#include <sys/kernel.h>
#include <sys/lock.h>
+#include <sys/mman.h>
#include <sys/proc.h>
#include <sys/resourcevar.h>
#include <sys/rwlock.h>
@@ -113,7 +114,8 @@ static int vm_fault_additional_pages(vm_page_t, int, int, vm_page_t *, int *);
#define VM_FAULT_READ_MAX (1 + VM_FAULT_READ_AHEAD_MAX)
#define VM_FAULT_NINCR (VM_FAULT_READ_MAX / VM_FAULT_READ_BEHIND)
#define VM_FAULT_SUM (VM_FAULT_NINCR * (VM_FAULT_NINCR + 1) / 2)
-#define VM_FAULT_CACHE_BEHIND (VM_FAULT_READ_BEHIND * VM_FAULT_SUM)
+
+#define VM_FAULT_DONTNEED_MIN 1048576
struct faultstate {
vm_page_t m;
@@ -128,7 +130,8 @@ struct faultstate {
struct vnode *vp;
};
-static void vm_fault_cache_behind(const struct faultstate *fs, int distance);
+static void vm_fault_dontneed(const struct faultstate *fs, vm_offset_t vaddr,
+ int ahead);
static void vm_fault_prefault(const struct faultstate *fs, vm_offset_t addra,
int faultcount, int reqpage);
@@ -345,6 +348,10 @@ RetryFault:;
vm_map_lock(fs.map);
if (vm_map_lookup_entry(fs.map, vaddr, &fs.entry) &&
(fs.entry->eflags & MAP_ENTRY_IN_TRANSITION)) {
+ if (fs.vp != NULL) {
+ vput(fs.vp);
+ fs.vp = NULL;
+ }
fs.entry->eflags |= MAP_ENTRY_NEEDS_WAKEUP;
vm_map_unlock_and_wait(fs.map, 0);
} else
@@ -566,8 +573,7 @@ readrest:
nera = VM_FAULT_READ_AHEAD_MAX;
ahead = nera;
if (fs.pindex == fs.entry->next_read)
- vm_fault_cache_behind(&fs,
- VM_FAULT_READ_MAX);
+ vm_fault_dontneed(&fs, vaddr, ahead);
} else if (fs.pindex == fs.entry->next_read) {
/*
* This is a sequential fault. Arithmetically
@@ -585,8 +591,7 @@ readrest:
}
ahead = nera;
if (era == VM_FAULT_READ_AHEAD_MAX)
- vm_fault_cache_behind(&fs,
- VM_FAULT_CACHE_BEHIND);
+ vm_fault_dontneed(&fs, vaddr, ahead);
} else {
/*
* This is a non-sequential fault. Request a
@@ -1034,15 +1039,26 @@ vnode_locked:
}
/*
- * Speed up the reclamation of up to "distance" pages that precede the
- * faulting pindex within the first object of the shadow chain.
+ * Speed up the reclamation of pages that precede the faulting pindex within
+ * the first object of the shadow chain. Essentially, perform the equivalent
+ * to madvise(..., MADV_DONTNEED) on a large cluster of pages that precedes
+ * the faulting pindex by the cluster size when the pages read by vm_fault()
+ * cross a cluster-size boundary. The cluster size is the greater of the
+ * smallest superpage size and VM_FAULT_DONTNEED_MIN.
+ *
+ * When "fs->first_object" is a shadow object, the pages in the backing object
+ * that precede the faulting pindex are deactivated by vm_fault(). So, this
+ * function must only be concerned with pages in the first object.
*/
static void
-vm_fault_cache_behind(const struct faultstate *fs, int distance)
+vm_fault_dontneed(const struct faultstate *fs, vm_offset_t vaddr, int ahead)
{
+ vm_map_entry_t entry;
vm_object_t first_object, object;
- vm_page_t m, m_prev;
- vm_pindex_t pindex;
+ vm_offset_t end, start;
+ vm_page_t m, m_next;
+ vm_pindex_t pend, pstart;
+ vm_size_t size;
object = fs->object;
VM_OBJECT_ASSERT_WLOCKED(object);
@@ -1054,32 +1070,34 @@ vm_fault_cache_behind(const struct faultstate *fs, int distance)
VM_OBJECT_WLOCK(object);
}
}
- /* Neither fictitious nor unmanaged pages can be cached. */
+ /* Neither fictitious nor unmanaged pages can be reclaimed. */
if ((first_object->flags & (OBJ_FICTITIOUS | OBJ_UNMANAGED)) == 0) {
- if (fs->first_pindex < distance)
- pindex = 0;
- else
- pindex = fs->first_pindex - distance;
- if (pindex < OFF_TO_IDX(fs->entry->offset))
- pindex = OFF_TO_IDX(fs->entry->offset);
- m = first_object != object ? fs->first_m : fs->m;
- vm_page_assert_xbusied(m);
- m_prev = vm_page_prev(m);
- while ((m = m_prev) != NULL && m->pindex >= pindex &&
- m->valid == VM_PAGE_BITS_ALL) {
- m_prev = vm_page_prev(m);
- if (vm_page_busied(m))
- continue;
- vm_page_lock(m);
- if (m->hold_count == 0 && m->wire_count == 0) {
- pmap_remove_all(m);
- vm_page_aflag_clear(m, PGA_REFERENCED);
- if (m->dirty != 0)
- vm_page_deactivate(m);
- else
- vm_page_cache(m);
+ size = VM_FAULT_DONTNEED_MIN;
+ if (MAXPAGESIZES > 1 && size < pagesizes[1])
+ size = pagesizes[1];
+ end = rounddown2(vaddr, size);
+ if (vaddr - end >= size - PAGE_SIZE - ptoa(ahead) &&
+ (entry = fs->entry)->start < end) {
+ if (end - entry->start < size)
+ start = entry->start;
+ else
+ start = end - size;
+ pmap_advise(fs->map->pmap, start, end, MADV_DONTNEED);
+ pstart = OFF_TO_IDX(entry->offset) + atop(start -
+ entry->start);
+ m_next = vm_page_find_least(first_object, pstart);
+ pend = OFF_TO_IDX(entry->offset) + atop(end -
+ entry->start);
+ while ((m = m_next) != NULL && m->pindex < pend) {
+ m_next = TAILQ_NEXT(m, listq);
+ if (m->valid != VM_PAGE_BITS_ALL ||
+ vm_page_busied(m))
+ continue;
+ vm_page_lock(m);
+ if (m->hold_count == 0 && m->wire_count == 0)
+ vm_page_advise(m, MADV_DONTNEED);
+ vm_page_unlock(m);
}
- vm_page_unlock(m);
}
}
if (first_object != object)
diff --git a/sys/vm/vm_map.c b/sys/vm/vm_map.c
index b7e668b..bad9994 100644
--- a/sys/vm/vm_map.c
+++ b/sys/vm/vm_map.c
@@ -300,11 +300,11 @@ vmspace_alloc(vm_offset_t min, vm_offset_t max, pmap_pinit_t pinit)
return (vm);
}
+#ifdef RACCT
static void
vmspace_container_reset(struct proc *p)
{
-#ifdef RACCT
PROC_LOCK(p);
racct_set(p, RACCT_DATA, 0);
racct_set(p, RACCT_STACK, 0);
@@ -312,8 +312,8 @@ vmspace_container_reset(struct proc *p)
racct_set(p, RACCT_MEMLOCK, 0);
racct_set(p, RACCT_VMEM, 0);
PROC_UNLOCK(p);
-#endif
}
+#endif
static inline void
vmspace_dofree(struct vmspace *vm)
@@ -415,7 +415,10 @@ vmspace_exit(struct thread *td)
pmap_activate(td);
vmspace_dofree(vm);
}
- vmspace_container_reset(p);
+#ifdef RACCT
+ if (racct_enable)
+ vmspace_container_reset(p);
+#endif
}
/* Acquire reference to vmspace owned by another process. */
@@ -3652,14 +3655,16 @@ Retry:
return (KERN_NO_SPACE);
}
#ifdef RACCT
- PROC_LOCK(p);
- if (is_procstack &&
- racct_set(p, RACCT_STACK, ctob(vm->vm_ssize) + grow_amount)) {
+ if (racct_enable) {
+ PROC_LOCK(p);
+ if (is_procstack && racct_set(p, RACCT_STACK,
+ ctob(vm->vm_ssize) + grow_amount)) {
+ PROC_UNLOCK(p);
+ vm_map_unlock_read(map);
+ return (KERN_NO_SPACE);
+ }
PROC_UNLOCK(p);
- vm_map_unlock_read(map);
- return (KERN_NO_SPACE);
}
- PROC_UNLOCK(p);
#endif
/* Round up the grow amount modulo sgrowsiz */
@@ -3685,15 +3690,17 @@ Retry:
goto out;
}
#ifdef RACCT
- PROC_LOCK(p);
- if (racct_set(p, RACCT_MEMLOCK,
- ptoa(pmap_wired_count(map->pmap)) + grow_amount)) {
+ if (racct_enable) {
+ PROC_LOCK(p);
+ if (racct_set(p, RACCT_MEMLOCK,
+ ptoa(pmap_wired_count(map->pmap)) + grow_amount)) {
+ PROC_UNLOCK(p);
+ vm_map_unlock_read(map);
+ rv = KERN_NO_SPACE;
+ goto out;
+ }
PROC_UNLOCK(p);
- vm_map_unlock_read(map);
- rv = KERN_NO_SPACE;
- goto out;
}
- PROC_UNLOCK(p);
#endif
}
/* If we would blow our VMEM resource limit, no go */
@@ -3703,14 +3710,16 @@ Retry:
goto out;
}
#ifdef RACCT
- PROC_LOCK(p);
- if (racct_set(p, RACCT_VMEM, map->size + grow_amount)) {
+ if (racct_enable) {
+ PROC_LOCK(p);
+ if (racct_set(p, RACCT_VMEM, map->size + grow_amount)) {
+ PROC_UNLOCK(p);
+ vm_map_unlock_read(map);
+ rv = KERN_NO_SPACE;
+ goto out;
+ }
PROC_UNLOCK(p);
- vm_map_unlock_read(map);
- rv = KERN_NO_SPACE;
- goto out;
}
- PROC_UNLOCK(p);
#endif
if (vm_map_lock_upgrade(map))
@@ -3809,7 +3818,7 @@ Retry:
out:
#ifdef RACCT
- if (rv != KERN_SUCCESS) {
+ if (racct_enable && rv != KERN_SUCCESS) {
PROC_LOCK(p);
error = racct_set(p, RACCT_VMEM, map->size);
KASSERT(error == 0, ("decreasing RACCT_VMEM failed"));
diff --git a/sys/vm/vm_mmap.c b/sys/vm/vm_mmap.c
index a9ff248..1dd2479 100644
--- a/sys/vm/vm_mmap.c
+++ b/sys/vm/vm_mmap.c
@@ -462,6 +462,7 @@ done:
return (error);
}
+#if defined(COMPAT_FREEBSD6)
int
freebsd6_mmap(struct thread *td, struct freebsd6_mmap_args *uap)
{
@@ -475,6 +476,7 @@ freebsd6_mmap(struct thread *td, struct freebsd6_mmap_args *uap)
oargs.pos = uap->pos;
return (sys_mmap(td, &oargs));
}
+#endif
#ifdef COMPAT_43
#ifndef _SYS_SYSPROTO_H_
@@ -1120,16 +1122,18 @@ vm_mlock(struct proc *proc, struct ucred *cred, const void *addr0, size_t len)
if (npages + vm_cnt.v_wire_count > vm_page_max_wired)
return (EAGAIN);
#ifdef RACCT
- PROC_LOCK(proc);
- error = racct_set(proc, RACCT_MEMLOCK, nsize);
- PROC_UNLOCK(proc);
- if (error != 0)
- return (ENOMEM);
+ if (racct_enable) {
+ PROC_LOCK(proc);
+ error = racct_set(proc, RACCT_MEMLOCK, nsize);
+ PROC_UNLOCK(proc);
+ if (error != 0)
+ return (ENOMEM);
+ }
#endif
error = vm_map_wire(map, start, end,
VM_MAP_WIRE_USER | VM_MAP_WIRE_NOHOLES);
#ifdef RACCT
- if (error != KERN_SUCCESS) {
+ if (racct_enable && error != KERN_SUCCESS) {
PROC_LOCK(proc);
racct_set(proc, RACCT_MEMLOCK,
ptoa(pmap_wired_count(map->pmap)));
@@ -1177,11 +1181,13 @@ sys_mlockall(td, uap)
PROC_UNLOCK(td->td_proc);
}
#ifdef RACCT
- PROC_LOCK(td->td_proc);
- error = racct_set(td->td_proc, RACCT_MEMLOCK, map->size);
- PROC_UNLOCK(td->td_proc);
- if (error != 0)
- return (ENOMEM);
+ if (racct_enable) {
+ PROC_LOCK(td->td_proc);
+ error = racct_set(td->td_proc, RACCT_MEMLOCK, map->size);
+ PROC_UNLOCK(td->td_proc);
+ if (error != 0)
+ return (ENOMEM);
+ }
#endif
if (uap->how & MCL_FUTURE) {
@@ -1203,7 +1209,7 @@ sys_mlockall(td, uap)
error = (error == KERN_SUCCESS ? 0 : EAGAIN);
}
#ifdef RACCT
- if (error != KERN_SUCCESS) {
+ if (racct_enable && error != KERN_SUCCESS) {
PROC_LOCK(td->td_proc);
racct_set(td->td_proc, RACCT_MEMLOCK,
ptoa(pmap_wired_count(map->pmap)));
@@ -1245,7 +1251,7 @@ sys_munlockall(td, uap)
error = vm_map_unwire(map, vm_map_min(map), vm_map_max(map),
VM_MAP_WIRE_USER|VM_MAP_WIRE_HOLESOK);
#ifdef RACCT
- if (error == KERN_SUCCESS) {
+ if (racct_enable && error == KERN_SUCCESS) {
PROC_LOCK(td->td_proc);
racct_set(td->td_proc, RACCT_MEMLOCK, 0);
PROC_UNLOCK(td->td_proc);
@@ -1289,7 +1295,7 @@ sys_munlock(td, uap)
error = vm_map_unwire(&td->td_proc->p_vmspace->vm_map, start, end,
VM_MAP_WIRE_USER | VM_MAP_WIRE_NOHOLES);
#ifdef RACCT
- if (error == KERN_SUCCESS) {
+ if (racct_enable && error == KERN_SUCCESS) {
PROC_LOCK(td->td_proc);
map = &td->td_proc->p_vmspace->vm_map;
racct_set(td->td_proc, RACCT_MEMLOCK,
diff --git a/sys/vm/vm_page.c b/sys/vm/vm_page.c
index 64ca130..0aec01f 100644
--- a/sys/vm/vm_page.c
+++ b/sys/vm/vm_page.c
@@ -91,12 +91,14 @@ __FBSDID("$FreeBSD$");
#include <sys/lock.h>
#include <sys/kernel.h>
#include <sys/limits.h>
+#include <sys/linker.h>
#include <sys/malloc.h>
#include <sys/mman.h>
#include <sys/msgbuf.h>
#include <sys/mutex.h>
#include <sys/proc.h>
#include <sys/rwlock.h>
+#include <sys/sbuf.h>
#include <sys/sysctl.h>
#include <sys/vmmeter.h>
#include <sys/vnode.h>
@@ -142,6 +144,12 @@ static int pa_tryrelock_restart;
SYSCTL_INT(_vm, OID_AUTO, tryrelock_restart, CTLFLAG_RD,
&pa_tryrelock_restart, 0, "Number of tryrelock restarts");
+static TAILQ_HEAD(, vm_page) blacklist_head;
+static int sysctl_vm_page_blacklist(SYSCTL_HANDLER_ARGS);
+SYSCTL_PROC(_vm, OID_AUTO, page_blacklist, CTLTYPE_STRING | CTLFLAG_RD |
+ CTLFLAG_MPSAFE, NULL, 0, sysctl_vm_page_blacklist, "A", "Blacklist pages");
+
+
static uma_zone_t fakepg_zone;
static struct vnode *vm_page_alloc_init(vm_page_t m);
@@ -216,35 +224,153 @@ vm_set_page_size(void)
}
/*
- * vm_page_blacklist_lookup:
+ * vm_page_blacklist_next:
*
- * See if a physical address in this page has been listed
- * in the blacklist tunable. Entries in the tunable are
- * separated by spaces or commas. If an invalid integer is
- * encountered then the rest of the string is skipped.
+ * Find the next entry in the provided string of blacklist
+ * addresses. Entries are separated by space, comma, or newline.
+ * If an invalid integer is encountered then the rest of the
+ * string is skipped. Updates the list pointer to the next
+ * character, or NULL if the string is exhausted or invalid.
*/
-static int
-vm_page_blacklist_lookup(char *list, vm_paddr_t pa)
+static vm_paddr_t
+vm_page_blacklist_next(char **list, char *end)
{
vm_paddr_t bad;
char *cp, *pos;
- for (pos = list; *pos != '\0'; pos = cp) {
+ if (list == NULL || *list == NULL)
+ return (0);
+ if (**list =='\0') {
+ *list = NULL;
+ return (0);
+ }
+
+ /*
+ * If there's no end pointer then the buffer is coming from
+ * the kenv and we know it's null-terminated.
+ */
+ if (end == NULL)
+ end = *list + strlen(*list);
+
+ /* Ensure that strtoq() won't walk off the end */
+ if (*end != '\0') {
+ if (*end == '\n' || *end == ' ' || *end == ',')
+ *end = '\0';
+ else {
+ printf("Blacklist not terminated, skipping\n");
+ *list = NULL;
+ return (0);
+ }
+ }
+
+ for (pos = *list; *pos != '\0'; pos = cp) {
bad = strtoq(pos, &cp, 0);
- if (*cp != '\0') {
- if (*cp == ' ' || *cp == ',') {
- cp++;
- if (cp == pos)
+ if (*cp == '\0' || *cp == ' ' || *cp == ',' || *cp == '\n') {
+ if (bad == 0) {
+ if (++cp < end)
continue;
- } else
- break;
- }
- if (pa == trunc_page(bad))
- return (1);
+ else
+ break;
+ }
+ } else
+ break;
+ if (*cp == '\0' || ++cp >= end)
+ *list = NULL;
+ else
+ *list = cp;
+ return (trunc_page(bad));
}
+ printf("Garbage in RAM blacklist, skipping\n");
+ *list = NULL;
return (0);
}
+/*
+ * vm_page_blacklist_check:
+ *
+ * Iterate through the provided string of blacklist addresses, pulling
+ * each entry out of the physical allocator free list and putting it
+ * onto a list for reporting via the vm.page_blacklist sysctl.
+ */
+static void
+vm_page_blacklist_check(char *list, char *end)
+{
+ vm_paddr_t pa;
+ vm_page_t m;
+ char *next;
+ int ret;
+
+ next = list;
+ while (next != NULL) {
+ if ((pa = vm_page_blacklist_next(&next, end)) == 0)
+ continue;
+ m = vm_phys_paddr_to_vm_page(pa);
+ if (m == NULL)
+ continue;
+ mtx_lock(&vm_page_queue_free_mtx);
+ ret = vm_phys_unfree_page(m);
+ mtx_unlock(&vm_page_queue_free_mtx);
+ if (ret == TRUE) {
+ TAILQ_INSERT_TAIL(&blacklist_head, m, listq);
+ if (bootverbose)
+ printf("Skipping page with pa 0x%jx\n",
+ (uintmax_t)pa);
+ }
+ }
+}
+
+/*
+ * vm_page_blacklist_load:
+ *
+ * Search for a special module named "ram_blacklist". It'll be a
+ * plain text file provided by the user via the loader directive
+ * of the same name.
+ */
+static void
+vm_page_blacklist_load(char **list, char **end)
+{
+ void *mod;
+ u_char *ptr;
+ u_int len;
+
+ mod = NULL;
+ ptr = NULL;
+
+ mod = preload_search_by_type("ram_blacklist");
+ if (mod != NULL) {
+ ptr = preload_fetch_addr(mod);
+ len = preload_fetch_size(mod);
+ }
+ *list = ptr;
+ if (ptr != NULL)
+ *end = ptr + len;
+ else
+ *end = NULL;
+ return;
+}
+
+static int
+sysctl_vm_page_blacklist(SYSCTL_HANDLER_ARGS)
+{
+ vm_page_t m;
+ struct sbuf sbuf;
+ int error, first;
+
+ first = 1;
+ error = sysctl_wire_old_buffer(req, 0);
+ if (error != 0)
+ return (error);
+ sbuf_new_for_sysctl(&sbuf, NULL, 128, req);
+ TAILQ_FOREACH(m, &blacklist_head, listq) {
+ sbuf_printf(&sbuf, "%s%#jx", first ? "" : ",",
+ (uintmax_t)m->phys_addr);
+ first = 0;
+ }
+ error = sbuf_finish(&sbuf);
+ sbuf_delete(&sbuf);
+ return (error);
+}
+
static void
vm_page_domain_init(struct vm_domain *vmd)
{
@@ -290,7 +416,7 @@ vm_page_startup(vm_offset_t vaddr)
int i;
vm_paddr_t pa;
vm_paddr_t last_pa;
- char *list;
+ char *list, *listend;
vm_paddr_t end;
vm_paddr_t biggestsize;
vm_paddr_t low_water, high_water;
@@ -305,14 +431,6 @@ vm_page_startup(vm_offset_t vaddr)
phys_avail[i + 1] = trunc_page(phys_avail[i + 1]);
}
-#ifdef XEN
- /*
- * There is no obvious reason why i386 PV Xen needs vm_page structs
- * created for these pseudo-physical addresses. XXX
- */
- vm_phys_add_seg(0, phys_avail[0]);
-#endif
-
low_water = phys_avail[0];
high_water = phys_avail[1];
@@ -477,20 +595,22 @@ vm_page_startup(vm_offset_t vaddr)
*/
vm_cnt.v_page_count = 0;
vm_cnt.v_free_count = 0;
- list = kern_getenv("vm.blacklist");
for (i = 0; phys_avail[i + 1] != 0; i += 2) {
pa = phys_avail[i];
last_pa = phys_avail[i + 1];
while (pa < last_pa) {
- if (list != NULL &&
- vm_page_blacklist_lookup(list, pa))
- printf("Skipping page with pa 0x%jx\n",
- (uintmax_t)pa);
- else
- vm_phys_add_page(pa);
+ vm_phys_add_page(pa);
pa += PAGE_SIZE;
}
}
+
+ TAILQ_INIT(&blacklist_head);
+ vm_page_blacklist_load(&list, &listend);
+ vm_page_blacklist_check(list, listend);
+
+ list = kern_getenv("vm.blacklist");
+ vm_page_blacklist_check(list, NULL);
+
freeenv(list);
#if VM_NRESERVLEVEL > 0
/*
diff --git a/sys/vm/vm_pageout.c b/sys/vm/vm_pageout.c
index 2fb7c55..872ffd8 100644
--- a/sys/vm/vm_pageout.c
+++ b/sys/vm/vm_pageout.c
@@ -118,7 +118,8 @@ __FBSDID("$FreeBSD$");
/* the kernel process "vm_pageout"*/
static void vm_pageout(void);
static void vm_pageout_init(void);
-static int vm_pageout_clean(vm_page_t);
+static int vm_pageout_clean(vm_page_t m);
+static int vm_pageout_cluster(vm_page_t m);
static void vm_pageout_scan(struct vm_domain *vmd, int pass);
static void vm_pageout_mightbe_oom(struct vm_domain *vmd, int pass);
@@ -347,7 +348,7 @@ vm_pageout_page_lock(vm_page_t m, vm_page_t *next)
* late and we cannot do anything that will mess with the page.
*/
static int
-vm_pageout_clean(vm_page_t m)
+vm_pageout_cluster(vm_page_t m)
{
vm_object_t object;
vm_page_t mc[2*vm_pageout_page_count], pb, ps;
@@ -906,6 +907,115 @@ vm_pageout_map_deactivate_pages(map, desired)
#endif /* !defined(NO_SWAPPING) */
/*
+ * Attempt to acquire all of the necessary locks to launder a page and
+ * then call through the clustering layer to PUTPAGES. Wait a short
+ * time for a vnode lock.
+ *
+ * Requires the page and object lock on entry, releases both before return.
+ * Returns 0 on success and an errno otherwise.
+ */
+static int
+vm_pageout_clean(vm_page_t m)
+{
+ struct vnode *vp;
+ struct mount *mp;
+ vm_object_t object;
+ vm_pindex_t pindex;
+ int error, lockmode;
+
+ vm_page_assert_locked(m);
+ object = m->object;
+ VM_OBJECT_ASSERT_WLOCKED(object);
+ error = 0;
+ vp = NULL;
+ mp = NULL;
+
+ /*
+ * The object is already known NOT to be dead. It
+ * is possible for the vget() to block the whole
+ * pageout daemon, but the new low-memory handling
+ * code should prevent it.
+ *
+ * We can't wait forever for the vnode lock, we might
+ * deadlock due to a vn_read() getting stuck in
+ * vm_wait while holding this vnode. We skip the
+ * vnode if we can't get it in a reasonable amount
+ * of time.
+ */
+ if (object->type == OBJT_VNODE) {
+ vm_page_unlock(m);
+ vp = object->handle;
+ if (vp->v_type == VREG &&
+ vn_start_write(vp, &mp, V_NOWAIT) != 0) {
+ mp = NULL;
+ error = EDEADLK;
+ goto unlock_all;
+ }
+ KASSERT(mp != NULL,
+ ("vp %p with NULL v_mount", vp));
+ vm_object_reference_locked(object);
+ pindex = m->pindex;
+ VM_OBJECT_WUNLOCK(object);
+ lockmode = MNT_SHARED_WRITES(vp->v_mount) ?
+ LK_SHARED : LK_EXCLUSIVE;
+ if (vget(vp, lockmode | LK_TIMELOCK, curthread)) {
+ vp = NULL;
+ error = EDEADLK;
+ goto unlock_mp;
+ }
+ VM_OBJECT_WLOCK(object);
+ vm_page_lock(m);
+ /*
+ * While the object and page were unlocked, the page
+ * may have been:
+ * (1) moved to a different queue,
+ * (2) reallocated to a different object,
+ * (3) reallocated to a different offset, or
+ * (4) cleaned.
+ */
+ if (m->queue != PQ_INACTIVE || m->object != object ||
+ m->pindex != pindex || m->dirty == 0) {
+ vm_page_unlock(m);
+ error = ENXIO;
+ goto unlock_all;
+ }
+
+ /*
+ * The page may have been busied or held while the object
+ * and page locks were released.
+ */
+ if (vm_page_busied(m) || m->hold_count != 0) {
+ vm_page_unlock(m);
+ error = EBUSY;
+ goto unlock_all;
+ }
+ }
+
+ /*
+ * If a page is dirty, then it is either being washed
+ * (but not yet cleaned) or it is still in the
+ * laundry. If it is still in the laundry, then we
+ * start the cleaning operation.
+ */
+ if (vm_pageout_cluster(m) == 0)
+ error = EIO;
+
+unlock_all:
+ VM_OBJECT_WUNLOCK(object);
+
+unlock_mp:
+ vm_page_lock_assert(m, MA_NOTOWNED);
+ if (mp != NULL) {
+ if (vp != NULL)
+ vput(vp);
+ vm_object_deallocate(object);
+ vn_finished_write(mp);
+ }
+
+ return (error);
+}
+
+/*
* vm_pageout_scan does the dirty work for the pageout daemon.
*
* pass 0 - Update active LRU/deactivate pages
@@ -921,7 +1031,6 @@ vm_pageout_scan(struct vm_domain *vmd, int pass)
int act_delta, addl_page_shortage, deficit, maxscan, page_shortage;
int vnodes_skipped = 0;
int maxlaunder;
- int lockmode;
boolean_t queues_locked;
/*
@@ -1155,9 +1264,7 @@ vm_pageout_scan(struct vm_domain *vmd, int pass)
* on the inactive queue, we may have to go all out.
*/
int swap_pageouts_ok;
- struct vnode *vp = NULL;
- struct mount *mp = NULL;
- vm_pindex_t pindex;
+ int error;
if ((object->type != OBJT_SWAP) && (object->type != OBJT_DEFAULT)) {
swap_pageouts_ok = 1;
@@ -1180,124 +1287,20 @@ vm_pageout_scan(struct vm_domain *vmd, int pass)
vm_page_requeue_locked(m);
goto relock_queues;
}
-
- /*
- * The object is already known NOT to be dead. It
- * is possible for the vget() to block the whole
- * pageout daemon, but the new low-memory handling
- * code should prevent it.
- *
- * The previous code skipped locked vnodes and, worse,
- * reordered pages in the queue. This results in
- * completely non-deterministic operation and, on a
- * busy system, can lead to extremely non-optimal
- * pageouts. For example, it can cause clean pages
- * to be freed and dirty pages to be moved to the end
- * of the queue. Since dirty pages are also moved to
- * the end of the queue once-cleaned, this gives
- * way too large a weighting to deferring the freeing
- * of dirty pages.
- *
- * We can't wait forever for the vnode lock, we might
- * deadlock due to a vn_read() getting stuck in
- * vm_wait while holding this vnode. We skip the
- * vnode if we can't get it in a reasonable amount
- * of time.
- */
- if (object->type == OBJT_VNODE) {
- vm_page_unlock(m);
- vp = object->handle;
- if (vp->v_type == VREG &&
- vn_start_write(vp, &mp, V_NOWAIT) != 0) {
- mp = NULL;
- ++pageout_lock_miss;
- if (object->flags & OBJ_MIGHTBEDIRTY)
- vnodes_skipped++;
- goto unlock_and_continue;
- }
- KASSERT(mp != NULL,
- ("vp %p with NULL v_mount", vp));
- vm_object_reference_locked(object);
- pindex = m->pindex;
- VM_OBJECT_WUNLOCK(object);
- lockmode = MNT_SHARED_WRITES(vp->v_mount) ?
- LK_SHARED : LK_EXCLUSIVE;
- if (vget(vp, lockmode | LK_TIMELOCK,
- curthread)) {
- VM_OBJECT_WLOCK(object);
- ++pageout_lock_miss;
- if (object->flags & OBJ_MIGHTBEDIRTY)
- vnodes_skipped++;
- vp = NULL;
- goto unlock_and_continue;
- }
- VM_OBJECT_WLOCK(object);
- vm_page_lock(m);
- /*
- * While the object and page were unlocked,
- * the page may have been
- * (1) moved to a different queue,
- * (2) reallocated to a different object,
- * (3) reallocated to a different offset, or
- * (4) cleaned.
- */
- if (m->queue != PQ_INACTIVE ||
- m->object != object ||
- m->pindex != pindex ||
- m->dirty == 0) {
- vm_page_unlock(m);
- if (object->flags & OBJ_MIGHTBEDIRTY)
- vnodes_skipped++;
- goto unlock_and_continue;
- }
-
- /*
- * The page may have been busied during the
- * blocking in vget(). We don't move the
- * page back onto the end of the queue so that
- * statistics are more correct if we don't.
- */
- if (vm_page_busied(m)) {
- vm_page_unlock(m);
- addl_page_shortage++;
- goto unlock_and_continue;
- }
-
- /*
- * If the page has become held it might
- * be undergoing I/O, so skip it
- */
- if (m->hold_count != 0) {
- vm_page_unlock(m);
- addl_page_shortage++;
- if (object->flags & OBJ_MIGHTBEDIRTY)
- vnodes_skipped++;
- goto unlock_and_continue;
- }
- }
-
+ error = vm_pageout_clean(m);
/*
- * If a page is dirty, then it is either being washed
- * (but not yet cleaned) or it is still in the
- * laundry. If it is still in the laundry, then we
- * start the cleaning operation.
- *
- * decrement page_shortage on success to account for
+ * Decrement page_shortage on success to account for
* the (future) cleaned page. Otherwise we could wind
* up laundering or cleaning too many pages.
*/
- if (vm_pageout_clean(m) != 0) {
- --page_shortage;
- --maxlaunder;
- }
-unlock_and_continue:
- vm_page_lock_assert(m, MA_NOTOWNED);
- VM_OBJECT_WUNLOCK(object);
- if (mp != NULL) {
- if (vp != NULL)
- vput(vp);
- vm_object_deallocate(object);
- vn_finished_write(mp);
+ if (error == 0) {
+ page_shortage--;
+ maxlaunder--;
+ } else if (error == EDEADLK) {
+ pageout_lock_miss++;
+ vnodes_skipped++;
+ } else if (error == EBUSY) {
+ addl_page_shortage++;
}
vm_page_lock_assert(m, MA_NOTOWNED);
goto relock_queues;
@@ -1784,11 +1787,13 @@ vm_daemon(void)
while (TRUE) {
mtx_lock(&vm_daemon_mtx);
+ msleep(&vm_daemon_needed, &vm_daemon_mtx, PPAUSE, "psleep",
#ifdef RACCT
- msleep(&vm_daemon_needed, &vm_daemon_mtx, PPAUSE, "psleep", hz);
+ racct_enable ? hz : 0
#else
- msleep(&vm_daemon_needed, &vm_daemon_mtx, PPAUSE, "psleep", 0);
+ 0
#endif
+ );
swapout_flags = vm_pageout_req_swapout;
vm_pageout_req_swapout = 0;
mtx_unlock(&vm_daemon_mtx);
@@ -1863,33 +1868,40 @@ again:
&vm->vm_map, limit);
}
#ifdef RACCT
- rsize = IDX_TO_OFF(size);
- PROC_LOCK(p);
- racct_set(p, RACCT_RSS, rsize);
- ravailable = racct_get_available(p, RACCT_RSS);
- PROC_UNLOCK(p);
- if (rsize > ravailable) {
- /*
- * Don't be overly aggressive; this might be
- * an innocent process, and the limit could've
- * been exceeded by some memory hog. Don't
- * try to deactivate more than 1/4th of process'
- * resident set size.
- */
- if (attempts <= 8) {
- if (ravailable < rsize - (rsize / 4))
- ravailable = rsize - (rsize / 4);
- }
- vm_pageout_map_deactivate_pages(
- &vm->vm_map, OFF_TO_IDX(ravailable));
- /* Update RSS usage after paging out. */
- size = vmspace_resident_count(vm);
+ if (racct_enable) {
rsize = IDX_TO_OFF(size);
PROC_LOCK(p);
racct_set(p, RACCT_RSS, rsize);
+ ravailable = racct_get_available(p, RACCT_RSS);
PROC_UNLOCK(p);
- if (rsize > ravailable)
- tryagain = 1;
+ if (rsize > ravailable) {
+ /*
+ * Don't be overly aggressive; this
+ * might be an innocent process,
+ * and the limit could've been exceeded
+ * by some memory hog. Don't try
+ * to deactivate more than 1/4th
+ * of process' resident set size.
+ */
+ if (attempts <= 8) {
+ if (ravailable < rsize -
+ (rsize / 4)) {
+ ravailable = rsize -
+ (rsize / 4);
+ }
+ }
+ vm_pageout_map_deactivate_pages(
+ &vm->vm_map,
+ OFF_TO_IDX(ravailable));
+ /* Update RSS usage after paging out. */
+ size = vmspace_resident_count(vm);
+ rsize = IDX_TO_OFF(size);
+ PROC_LOCK(p);
+ racct_set(p, RACCT_RSS, rsize);
+ PROC_UNLOCK(p);
+ if (rsize > ravailable)
+ tryagain = 1;
+ }
}
#endif
vmspace_free(vm);
diff --git a/sys/vm/vm_reserv.c b/sys/vm/vm_reserv.c
index 585a749..b74c768 100644
--- a/sys/vm/vm_reserv.c
+++ b/sys/vm/vm_reserv.c
@@ -983,8 +983,18 @@ vm_reserv_reclaim_contig(u_long npages, vm_paddr_t low, vm_paddr_t high,
break;
} else if ((pa & (alignment - 1)) != 0 ||
((pa ^ (pa + size - 1)) & ~(boundary - 1)) != 0) {
- /* Continue with this reservation. */
- hi = lo;
+ /*
+ * The current page doesn't meet the alignment
+ * and/or boundary requirements. Continue
+ * searching this reservation until the rest
+ * of its free pages are either excluded or
+ * exhausted.
+ */
+ hi = lo + 1;
+ if (hi >= NBPOPMAP) {
+ hi = 0;
+ i++;
+ }
continue;
}
/* Find the next used page. */
diff --git a/sys/vm/vm_unix.c b/sys/vm/vm_unix.c
index de9aa78..cc77ff7 100644
--- a/sys/vm/vm_unix.c
+++ b/sys/vm/vm_unix.c
@@ -130,35 +130,39 @@ sys_obreak(td, uap)
goto done;
}
#ifdef RACCT
- PROC_LOCK(td->td_proc);
- error = racct_set(td->td_proc, RACCT_DATA, new - base);
- if (error != 0) {
- PROC_UNLOCK(td->td_proc);
- error = ENOMEM;
- goto done;
- }
- error = racct_set(td->td_proc, RACCT_VMEM,
- map->size + (new - old));
- if (error != 0) {
- racct_set_force(td->td_proc, RACCT_DATA, old - base);
- PROC_UNLOCK(td->td_proc);
- error = ENOMEM;
- goto done;
- }
- if (!old_mlock && map->flags & MAP_WIREFUTURE) {
- error = racct_set(td->td_proc, RACCT_MEMLOCK,
- ptoa(pmap_wired_count(map->pmap)) + (new - old));
+ if (racct_enable) {
+ PROC_LOCK(td->td_proc);
+ error = racct_set(td->td_proc, RACCT_DATA, new - base);
+ if (error != 0) {
+ PROC_UNLOCK(td->td_proc);
+ error = ENOMEM;
+ goto done;
+ }
+ error = racct_set(td->td_proc, RACCT_VMEM,
+ map->size + (new - old));
if (error != 0) {
racct_set_force(td->td_proc, RACCT_DATA,
old - base);
- racct_set_force(td->td_proc, RACCT_VMEM,
- map->size);
PROC_UNLOCK(td->td_proc);
error = ENOMEM;
goto done;
}
+ if (!old_mlock && map->flags & MAP_WIREFUTURE) {
+ error = racct_set(td->td_proc, RACCT_MEMLOCK,
+ ptoa(pmap_wired_count(map->pmap)) +
+ (new - old));
+ if (error != 0) {
+ racct_set_force(td->td_proc, RACCT_DATA,
+ old - base);
+ racct_set_force(td->td_proc, RACCT_VMEM,
+ map->size);
+ PROC_UNLOCK(td->td_proc);
+ error = ENOMEM;
+ goto done;
+ }
+ }
+ PROC_UNLOCK(td->td_proc);
}
- PROC_UNLOCK(td->td_proc);
#endif
prot = VM_PROT_RW;
#ifdef COMPAT_FREEBSD32
@@ -170,14 +174,19 @@ sys_obreak(td, uap)
rv = vm_map_insert(map, NULL, 0, old, new, prot, VM_PROT_ALL, 0);
if (rv != KERN_SUCCESS) {
#ifdef RACCT
- PROC_LOCK(td->td_proc);
- racct_set_force(td->td_proc, RACCT_DATA, old - base);
- racct_set_force(td->td_proc, RACCT_VMEM, map->size);
- if (!old_mlock && map->flags & MAP_WIREFUTURE) {
- racct_set_force(td->td_proc, RACCT_MEMLOCK,
- ptoa(pmap_wired_count(map->pmap)));
+ if (racct_enable) {
+ PROC_LOCK(td->td_proc);
+ racct_set_force(td->td_proc,
+ RACCT_DATA, old - base);
+ racct_set_force(td->td_proc,
+ RACCT_VMEM, map->size);
+ if (!old_mlock && map->flags & MAP_WIREFUTURE) {
+ racct_set_force(td->td_proc,
+ RACCT_MEMLOCK,
+ ptoa(pmap_wired_count(map->pmap)));
+ }
+ PROC_UNLOCK(td->td_proc);
}
- PROC_UNLOCK(td->td_proc);
#endif
error = ENOMEM;
goto done;
@@ -205,14 +214,16 @@ sys_obreak(td, uap)
}
vm->vm_dsize -= btoc(old - new);
#ifdef RACCT
- PROC_LOCK(td->td_proc);
- racct_set_force(td->td_proc, RACCT_DATA, new - base);
- racct_set_force(td->td_proc, RACCT_VMEM, map->size);
- if (!old_mlock && map->flags & MAP_WIREFUTURE) {
- racct_set_force(td->td_proc, RACCT_MEMLOCK,
- ptoa(pmap_wired_count(map->pmap)));
+ if (racct_enable) {
+ PROC_LOCK(td->td_proc);
+ racct_set_force(td->td_proc, RACCT_DATA, new - base);
+ racct_set_force(td->td_proc, RACCT_VMEM, map->size);
+ if (!old_mlock && map->flags & MAP_WIREFUTURE) {
+ racct_set_force(td->td_proc, RACCT_MEMLOCK,
+ ptoa(pmap_wired_count(map->pmap)));
+ }
+ PROC_UNLOCK(td->td_proc);
}
- PROC_UNLOCK(td->td_proc);
#endif
}
done:
diff --git a/sys/x86/acpica/OsdEnvironment.c b/sys/x86/acpica/OsdEnvironment.c
index 380f1bf..be612b5 100644
--- a/sys/x86/acpica/OsdEnvironment.c
+++ b/sys/x86/acpica/OsdEnvironment.c
@@ -68,7 +68,7 @@ acpi_get_root_from_loader(void)
static u_long
acpi_get_root_from_memory(void)
{
- ACPI_SIZE acpi_root;
+ ACPI_PHYSICAL_ADDRESS acpi_root;
if (ACPI_SUCCESS(AcpiFindRootPointer(&acpi_root)))
return (acpi_root);
diff --git a/sys/x86/acpica/acpi_wakeup.c b/sys/x86/acpica/acpi_wakeup.c
index e8782c2..0eb6823 100644
--- a/sys/x86/acpica/acpi_wakeup.c
+++ b/sys/x86/acpica/acpi_wakeup.c
@@ -379,7 +379,7 @@ acpi_install_wakeup_handler(struct acpi_softc *sc)
/* Save pointers to some global data. */
WAKECODE_FIXUP(wakeup_ret, void *, resumectx);
#ifndef __amd64__
-#ifdef PAE
+#if defined(PAE) || defined(PAE_TABLES)
WAKECODE_FIXUP(wakeup_cr3, register_t, vtophys(kernel_pmap->pm_pdpt));
#else
WAKECODE_FIXUP(wakeup_cr3, register_t, vtophys(kernel_pmap->pm_pdir));
diff --git a/sys/x86/acpica/srat.c b/sys/x86/acpica/srat.c
index 8335a8c..8d2a741 100644
--- a/sys/x86/acpica/srat.c
+++ b/sys/x86/acpica/srat.c
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2010 Advanced Computing Technologies LLC
+ * Copyright (c) 2010 Hudson River Trading LLC
* Written by: John H. Baldwin <jhb@FreeBSD.org>
* All rights reserved.
*
diff --git a/sys/x86/include/apicvar.h b/sys/x86/include/apicvar.h
index 818a831..0bd9fe5 100644
--- a/sys/x86/include/apicvar.h
+++ b/sys/x86/include/apicvar.h
@@ -454,6 +454,7 @@ void lapic_handle_error(void);
void lapic_handle_intr(int vector, struct trapframe *frame);
void lapic_handle_timer(struct trapframe *frame);
void xen_intr_handle_upcall(struct trapframe *frame);
+void hv_vector_handler(struct trapframe *frame);
extern int x2apic_mode;
extern int lapic_eoi_suppression;
diff --git a/sys/x86/include/mca.h b/sys/x86/include/mca.h
index 29728b9..6420eb8 100644
--- a/sys/x86/include/mca.h
+++ b/sys/x86/include/mca.h
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2009 Advanced Computing Technologies LLC
+ * Copyright (c) 2009 Hudson River Trading LLC
* Written by: John H. Baldwin <jhb@FreeBSD.org>
* All rights reserved.
*
diff --git a/sys/x86/include/reg.h b/sys/x86/include/reg.h
index 56668ea8..a1452cc 100644
--- a/sys/x86/include/reg.h
+++ b/sys/x86/include/reg.h
@@ -91,6 +91,7 @@
#define __fpreg64 fpreg
#define __dbreg32 dbreg32
#define __dbreg64 dbreg
+#define __HAVE_REG32
#endif
/*
diff --git a/sys/x86/include/segments.h b/sys/x86/include/segments.h
index a5c1ea4..65b5870 100644
--- a/sys/x86/include/segments.h
+++ b/sys/x86/include/segments.h
@@ -46,11 +46,7 @@
*/
#define SEL_RPL_MASK 3 /* requester priv level */
#define ISPL(s) ((s)&3) /* priority level of a selector */
-#ifdef XEN
-#define SEL_KPL 1 /* kernel priority level */
-#else
#define SEL_KPL 0 /* kernel priority level */
-#endif
#define SEL_UPL 3 /* user priority level */
#define ISLDT(s) ((s)&SEL_LDT) /* is it local or global */
#define SEL_LDT 4 /* local descriptor table */
@@ -244,11 +240,7 @@ union descriptor {
#define GBIOSUTIL_SEL 16 /* BIOS interface (Utility) */
#define GBIOSARGS_SEL 17 /* BIOS interface (Arguments) */
#define GNDIS_SEL 18 /* For the NDIS layer */
-#ifdef XEN
-#define NGDT 9
-#else
#define NGDT 19
-#endif
/*
* Entries in the Local Descriptor Table (LDT)
diff --git a/sys/x86/iommu/busdma_dmar.c b/sys/x86/iommu/busdma_dmar.c
index 3f86c78..96b0bce 100644
--- a/sys/x86/iommu/busdma_dmar.c
+++ b/sys/x86/iommu/busdma_dmar.c
@@ -462,6 +462,7 @@ dmar_bus_dmamap_load_something1(struct bus_dma_tag_dmar *tag,
bus_size_t buflen1;
int error, idx, gas_flags, seg;
+ KASSERT(offset < DMAR_PAGE_SIZE, ("offset %d", offset));
if (segs == NULL)
segs = tag->segments;
ctx = tag->ctx;
@@ -476,7 +477,6 @@ dmar_bus_dmamap_load_something1(struct bus_dma_tag_dmar *tag,
}
buflen1 = buflen > tag->common.maxsegsz ?
tag->common.maxsegsz : buflen;
- buflen -= buflen1;
size = round_page(offset + buflen1);
/*
@@ -487,7 +487,7 @@ dmar_bus_dmamap_load_something1(struct bus_dma_tag_dmar *tag,
if (seg + 1 < tag->common.nsegments)
gas_flags |= DMAR_GM_CANSPLIT;
- error = dmar_gas_map(ctx, &tag->common, size,
+ error = dmar_gas_map(ctx, &tag->common, size, offset,
DMAR_MAP_ENTRY_READ | DMAR_MAP_ENTRY_WRITE,
gas_flags, ma + idx, &entry);
if (error != 0)
@@ -506,6 +506,10 @@ dmar_bus_dmamap_load_something1(struct bus_dma_tag_dmar *tag,
(uintmax_t)size, (uintmax_t)entry->start,
(uintmax_t)entry->end));
}
+ if (offset + buflen1 > size)
+ buflen1 = size - offset;
+ if (buflen1 > tag->common.maxsegsz)
+ buflen1 = tag->common.maxsegsz;
KASSERT(((entry->start + offset) & (tag->common.alignment - 1))
== 0,
@@ -519,15 +523,16 @@ dmar_bus_dmamap_load_something1(struct bus_dma_tag_dmar *tag,
(uintmax_t)entry->start, (uintmax_t)entry->end,
(uintmax_t)tag->common.lowaddr,
(uintmax_t)tag->common.highaddr));
- KASSERT(dmar_test_boundary(entry->start, entry->end -
- entry->start, tag->common.boundary),
+ KASSERT(dmar_test_boundary(entry->start + offset, buflen1,
+ tag->common.boundary),
("boundary failed: ctx %p start 0x%jx end 0x%jx "
"boundary 0x%jx", ctx, (uintmax_t)entry->start,
(uintmax_t)entry->end, (uintmax_t)tag->common.boundary));
KASSERT(buflen1 <= tag->common.maxsegsz,
("segment too large: ctx %p start 0x%jx end 0x%jx "
- "maxsegsz 0x%jx", ctx, (uintmax_t)entry->start,
- (uintmax_t)entry->end, (uintmax_t)tag->common.maxsegsz));
+ "buflen1 0x%jx maxsegsz 0x%jx", ctx,
+ (uintmax_t)entry->start, (uintmax_t)entry->end,
+ (uintmax_t)buflen1, (uintmax_t)tag->common.maxsegsz));
DMAR_CTX_LOCK(ctx);
TAILQ_INSERT_TAIL(&map->map_entries, entry, dmamap_link);
@@ -541,6 +546,7 @@ dmar_bus_dmamap_load_something1(struct bus_dma_tag_dmar *tag,
idx += OFF_TO_IDX(trunc_page(offset + buflen1));
offset += buflen1;
offset &= DMAR_PAGE_MASK;
+ buflen -= buflen1;
}
if (error == 0)
*segp = seg;
diff --git a/sys/x86/iommu/intel_dmar.h b/sys/x86/iommu/intel_dmar.h
index 2865ab5..401ff2f 100644
--- a/sys/x86/iommu/intel_dmar.h
+++ b/sys/x86/iommu/intel_dmar.h
@@ -308,7 +308,7 @@ struct dmar_map_entry *dmar_gas_alloc_entry(struct dmar_ctx *ctx, u_int flags);
void dmar_gas_free_entry(struct dmar_ctx *ctx, struct dmar_map_entry *entry);
void dmar_gas_free_space(struct dmar_ctx *ctx, struct dmar_map_entry *entry);
int dmar_gas_map(struct dmar_ctx *ctx, const struct bus_dma_tag_common *common,
- dmar_gaddr_t size, u_int eflags, u_int flags, vm_page_t *ma,
+ dmar_gaddr_t size, int offset, u_int eflags, u_int flags, vm_page_t *ma,
struct dmar_map_entry **res);
void dmar_gas_free_region(struct dmar_ctx *ctx, struct dmar_map_entry *entry);
int dmar_gas_map_region(struct dmar_ctx *ctx, struct dmar_map_entry *entry,
diff --git a/sys/x86/iommu/intel_gas.c b/sys/x86/iommu/intel_gas.c
index d91da97..5a7a730 100644
--- a/sys/x86/iommu/intel_gas.c
+++ b/sys/x86/iommu/intel_gas.c
@@ -294,6 +294,7 @@ dmar_gas_fini_ctx(struct dmar_ctx *ctx)
struct dmar_gas_match_args {
struct dmar_ctx *ctx;
dmar_gaddr_t size;
+ int offset;
const struct bus_dma_tag_common *common;
u_int gas_flags;
struct dmar_map_entry *entry;
@@ -310,25 +311,28 @@ dmar_gas_match_one(struct dmar_gas_match_args *a, struct dmar_map_entry *prev,
/* DMAR_PAGE_SIZE to create gap after new entry. */
if (a->entry->start < prev->end + DMAR_PAGE_SIZE ||
- a->entry->start + a->size + DMAR_PAGE_SIZE > prev->end +
- prev->free_after)
+ a->entry->start + a->size + a->offset + DMAR_PAGE_SIZE >
+ prev->end + prev->free_after)
return (false);
/* No boundary crossing. */
- if (dmar_test_boundary(a->entry->start, a->size, a->common->boundary))
+ if (dmar_test_boundary(a->entry->start + a->offset, a->size,
+ a->common->boundary))
return (true);
/*
- * The start to start + size region crosses the boundary.
- * Check if there is enough space after the next boundary
- * after the prev->end.
+ * The start + offset to start + offset + size region crosses
+ * the boundary. Check if there is enough space after the
+ * next boundary after the prev->end.
*/
- bs = (a->entry->start + a->common->boundary) & ~(a->common->boundary
- - 1);
+ bs = (a->entry->start + a->offset + a->common->boundary) &
+ ~(a->common->boundary - 1);
start = roundup2(bs, a->common->alignment);
/* DMAR_PAGE_SIZE to create gap after new entry. */
- if (start + a->size + DMAR_PAGE_SIZE <= prev->end + prev->free_after &&
- start + a->size <= end && dmar_test_boundary(start, a->size,
+ if (start + a->offset + a->size + DMAR_PAGE_SIZE <=
+ prev->end + prev->free_after &&
+ start + a->offset + a->size <= end &&
+ dmar_test_boundary(start + a->offset, a->size,
a->common->boundary)) {
a->entry->start = start;
return (true);
@@ -410,7 +414,7 @@ dmar_gas_lowermatch(struct dmar_gas_match_args *a, struct dmar_map_entry *prev)
return (0);
}
}
- if (prev->free_down < a->size + DMAR_PAGE_SIZE)
+ if (prev->free_down < a->size + a->offset + DMAR_PAGE_SIZE)
return (ENOMEM);
l = RB_LEFT(prev, rb_entry);
if (l != NULL) {
@@ -466,7 +470,7 @@ dmar_gas_uppermatch(struct dmar_gas_match_args *a)
static int
dmar_gas_find_space(struct dmar_ctx *ctx,
const struct bus_dma_tag_common *common, dmar_gaddr_t size,
- u_int flags, struct dmar_map_entry *entry)
+ int offset, u_int flags, struct dmar_map_entry *entry)
{
struct dmar_gas_match_args a;
int error;
@@ -477,6 +481,7 @@ dmar_gas_find_space(struct dmar_ctx *ctx,
a.ctx = ctx;
a.size = size;
+ a.offset = offset;
a.common = common;
a.gas_flags = flags;
a.entry = entry;
@@ -618,7 +623,7 @@ dmar_gas_free_region(struct dmar_ctx *ctx, struct dmar_map_entry *entry)
int
dmar_gas_map(struct dmar_ctx *ctx, const struct bus_dma_tag_common *common,
- dmar_gaddr_t size, u_int eflags, u_int flags, vm_page_t *ma,
+ dmar_gaddr_t size, int offset, u_int eflags, u_int flags, vm_page_t *ma,
struct dmar_map_entry **res)
{
struct dmar_map_entry *entry;
@@ -632,7 +637,7 @@ dmar_gas_map(struct dmar_ctx *ctx, const struct bus_dma_tag_common *common,
if (entry == NULL)
return (ENOMEM);
DMAR_CTX_LOCK(ctx);
- error = dmar_gas_find_space(ctx, common, size, flags, entry);
+ error = dmar_gas_find_space(ctx, common, size, offset, flags, entry);
if (error == ENOMEM) {
DMAR_CTX_UNLOCK(ctx);
dmar_gas_free_entry(ctx, entry);
diff --git a/sys/x86/pci/qpi.c b/sys/x86/pci/qpi.c
index 2f88891..ae29daa 100644
--- a/sys/x86/pci/qpi.c
+++ b/sys/x86/pci/qpi.c
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2010 Advanced Computing Technologies LLC
+ * Copyright (c) 2010 Hudson River Trading LLC
* Written by: John H. Baldwin <jhb@FreeBSD.org>
* All rights reserved.
*
diff --git a/sys/x86/x86/busdma_bounce.c b/sys/x86/x86/busdma_bounce.c
index 1438053..dcdeafa 100644
--- a/sys/x86/x86/busdma_bounce.c
+++ b/sys/x86/x86/busdma_bounce.c
@@ -147,11 +147,6 @@ static void _bus_dmamap_count_phys(bus_dma_tag_t dmat, bus_dmamap_t map,
static int _bus_dmamap_reserve_pages(bus_dma_tag_t dmat, bus_dmamap_t map,
int flags);
-#ifdef XEN
-#undef pmap_kextract
-#define pmap_kextract pmap_kextract_ma
-#endif
-
/*
* Allocate a device specific dma_tag.
*/
@@ -994,8 +989,8 @@ add_bounce_page(bus_dma_tag_t dmat, bus_dmamap_t map, vm_offset_t vaddr,
if (dmat->common.flags & BUS_DMA_KEEP_PG_OFFSET) {
/* Page offset needs to be preserved. */
- bpage->vaddr |= vaddr & PAGE_MASK;
- bpage->busaddr |= vaddr & PAGE_MASK;
+ bpage->vaddr |= addr & PAGE_MASK;
+ bpage->busaddr |= addr & PAGE_MASK;
}
bpage->datavaddr = vaddr;
bpage->dataaddr = addr;
diff --git a/sys/x86/x86/cpu_machdep.c b/sys/x86/x86/cpu_machdep.c
new file mode 100644
index 0000000..f8d1f08
--- /dev/null
+++ b/sys/x86/x86/cpu_machdep.c
@@ -0,0 +1,486 @@
+/*-
+ * Copyright (c) 2003 Peter Wemm.
+ * Copyright (c) 1992 Terrence R. Lambert.
+ * Copyright (c) 1982, 1987, 1990 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * William Jolitz.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * from: @(#)machdep.c 7.4 (Berkeley) 6/3/91
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "opt_atpic.h"
+#include "opt_compat.h"
+#include "opt_cpu.h"
+#include "opt_ddb.h"
+#include "opt_inet.h"
+#include "opt_isa.h"
+#include "opt_kstack_pages.h"
+#include "opt_maxmem.h"
+#include "opt_mp_watchdog.h"
+#include "opt_perfmon.h"
+#include "opt_platform.h"
+#ifdef __i386__
+#include "opt_npx.h"
+#include "opt_apic.h"
+#include "opt_xbox.h"
+#endif
+
+#include <sys/param.h>
+#include <sys/proc.h>
+#include <sys/systm.h>
+#include <sys/bus.h>
+#include <sys/cpu.h>
+#include <sys/kdb.h>
+#include <sys/kernel.h>
+#include <sys/ktr.h>
+#include <sys/lock.h>
+#include <sys/malloc.h>
+#include <sys/mutex.h>
+#include <sys/pcpu.h>
+#include <sys/rwlock.h>
+#include <sys/sched.h>
+#ifdef SMP
+#include <sys/smp.h>
+#endif
+#include <sys/sysctl.h>
+
+#include <machine/clock.h>
+#include <machine/cpu.h>
+#include <machine/cputypes.h>
+#include <machine/specialreg.h>
+#include <machine/md_var.h>
+#include <machine/mp_watchdog.h>
+#ifdef PERFMON
+#include <machine/perfmon.h>
+#endif
+#include <machine/tss.h>
+#ifdef SMP
+#include <machine/smp.h>
+#endif
+
+#include <vm/vm.h>
+#include <vm/vm_extern.h>
+#include <vm/vm_kern.h>
+#include <vm/vm_page.h>
+#include <vm/vm_map.h>
+#include <vm/vm_object.h>
+#include <vm/vm_pager.h>
+#include <vm/vm_param.h>
+
+/*
+ * Machine dependent boot() routine
+ *
+ * I haven't seen anything to put here yet
+ * Possibly some stuff might be grafted back here from boot()
+ */
+void
+cpu_boot(int howto)
+{
+}
+
+/*
+ * Flush the D-cache for non-DMA I/O so that the I-cache can
+ * be made coherent later.
+ */
+void
+cpu_flush_dcache(void *ptr, size_t len)
+{
+ /* Not applicable */
+}
+
+/* Get current clock frequency for the given cpu id. */
+int
+cpu_est_clockrate(int cpu_id, uint64_t *rate)
+{
+ uint64_t tsc1, tsc2;
+ uint64_t acnt, mcnt, perf;
+ register_t reg;
+
+ if (pcpu_find(cpu_id) == NULL || rate == NULL)
+ return (EINVAL);
+#ifdef __i386__
+ if ((cpu_feature & CPUID_TSC) == 0)
+ return (EOPNOTSUPP);
+#endif
+
+ /*
+ * If TSC is P-state invariant and APERF/MPERF MSRs do not exist,
+ * DELAY(9) based logic fails.
+ */
+ if (tsc_is_invariant && !tsc_perf_stat)
+ return (EOPNOTSUPP);
+
+#ifdef SMP
+ if (smp_cpus > 1) {
+ /* Schedule ourselves on the indicated cpu. */
+ thread_lock(curthread);
+ sched_bind(curthread, cpu_id);
+ thread_unlock(curthread);
+ }
+#endif
+
+ /* Calibrate by measuring a short delay. */
+ reg = intr_disable();
+ if (tsc_is_invariant) {
+ wrmsr(MSR_MPERF, 0);
+ wrmsr(MSR_APERF, 0);
+ tsc1 = rdtsc();
+ DELAY(1000);
+ mcnt = rdmsr(MSR_MPERF);
+ acnt = rdmsr(MSR_APERF);
+ tsc2 = rdtsc();
+ intr_restore(reg);
+ perf = 1000 * acnt / mcnt;
+ *rate = (tsc2 - tsc1) * perf;
+ } else {
+ tsc1 = rdtsc();
+ DELAY(1000);
+ tsc2 = rdtsc();
+ intr_restore(reg);
+ *rate = (tsc2 - tsc1) * 1000;
+ }
+
+#ifdef SMP
+ if (smp_cpus > 1) {
+ thread_lock(curthread);
+ sched_unbind(curthread);
+ thread_unlock(curthread);
+ }
+#endif
+
+ return (0);
+}
+
+/*
+ * Shutdown the CPU as much as possible
+ */
+void
+cpu_halt(void)
+{
+ for (;;)
+ halt();
+}
+
+void (*cpu_idle_hook)(sbintime_t) = NULL; /* ACPI idle hook. */
+static int cpu_ident_amdc1e = 0; /* AMD C1E supported. */
+static int idle_mwait = 1; /* Use MONITOR/MWAIT for short idle. */
+SYSCTL_INT(_machdep, OID_AUTO, idle_mwait, CTLFLAG_RWTUN, &idle_mwait,
+ 0, "Use MONITOR/MWAIT for short idle");
+
+#define STATE_RUNNING 0x0
+#define STATE_MWAIT 0x1
+#define STATE_SLEEPING 0x2
+
+#ifndef PC98
+static void
+cpu_idle_acpi(sbintime_t sbt)
+{
+ int *state;
+
+ state = (int *)PCPU_PTR(monitorbuf);
+ *state = STATE_SLEEPING;
+
+ /* See comments in cpu_idle_hlt(). */
+ disable_intr();
+ if (sched_runnable())
+ enable_intr();
+ else if (cpu_idle_hook)
+ cpu_idle_hook(sbt);
+ else
+ __asm __volatile("sti; hlt");
+ *state = STATE_RUNNING;
+}
+#endif /* !PC98 */
+
+static void
+cpu_idle_hlt(sbintime_t sbt)
+{
+ int *state;
+
+ state = (int *)PCPU_PTR(monitorbuf);
+ *state = STATE_SLEEPING;
+
+ /*
+ * Since we may be in a critical section from cpu_idle(), if
+ * an interrupt fires during that critical section we may have
+ * a pending preemption. If the CPU halts, then that thread
+ * may not execute until a later interrupt awakens the CPU.
+ * To handle this race, check for a runnable thread after
+ * disabling interrupts and immediately return if one is
+ * found. Also, we must absolutely guarentee that hlt is
+ * the next instruction after sti. This ensures that any
+ * interrupt that fires after the call to disable_intr() will
+ * immediately awaken the CPU from hlt. Finally, please note
+ * that on x86 this works fine because of interrupts enabled only
+ * after the instruction following sti takes place, while IF is set
+ * to 1 immediately, allowing hlt instruction to acknowledge the
+ * interrupt.
+ */
+ disable_intr();
+ if (sched_runnable())
+ enable_intr();
+ else
+ __asm __volatile("sti; hlt");
+ *state = STATE_RUNNING;
+}
+
+static void
+cpu_idle_mwait(sbintime_t sbt)
+{
+ int *state;
+
+ state = (int *)PCPU_PTR(monitorbuf);
+ *state = STATE_MWAIT;
+
+ /* See comments in cpu_idle_hlt(). */
+ disable_intr();
+ if (sched_runnable()) {
+ enable_intr();
+ *state = STATE_RUNNING;
+ return;
+ }
+ cpu_monitor(state, 0, 0);
+ if (*state == STATE_MWAIT)
+ __asm __volatile("sti; mwait" : : "a" (MWAIT_C1), "c" (0));
+ else
+ enable_intr();
+ *state = STATE_RUNNING;
+}
+
+static void
+cpu_idle_spin(sbintime_t sbt)
+{
+ int *state;
+ int i;
+
+ state = (int *)PCPU_PTR(monitorbuf);
+ *state = STATE_RUNNING;
+
+ /*
+ * The sched_runnable() call is racy but as long as there is
+ * a loop missing it one time will have just a little impact if any
+ * (and it is much better than missing the check at all).
+ */
+ for (i = 0; i < 1000; i++) {
+ if (sched_runnable())
+ return;
+ cpu_spinwait();
+ }
+}
+
+/*
+ * C1E renders the local APIC timer dead, so we disable it by
+ * reading the Interrupt Pending Message register and clearing
+ * both C1eOnCmpHalt (bit 28) and SmiOnCmpHalt (bit 27).
+ *
+ * Reference:
+ * "BIOS and Kernel Developer's Guide for AMD NPT Family 0Fh Processors"
+ * #32559 revision 3.00+
+ */
+#define MSR_AMDK8_IPM 0xc0010055
+#define AMDK8_SMIONCMPHALT (1ULL << 27)
+#define AMDK8_C1EONCMPHALT (1ULL << 28)
+#define AMDK8_CMPHALT (AMDK8_SMIONCMPHALT | AMDK8_C1EONCMPHALT)
+
+void
+cpu_probe_amdc1e(void)
+{
+
+ /*
+ * Detect the presence of C1E capability mostly on latest
+ * dual-cores (or future) k8 family.
+ */
+ if (cpu_vendor_id == CPU_VENDOR_AMD &&
+ (cpu_id & 0x00000f00) == 0x00000f00 &&
+ (cpu_id & 0x0fff0000) >= 0x00040000) {
+ cpu_ident_amdc1e = 1;
+ }
+}
+
+#if defined(__i386__) && defined(PC98)
+void (*cpu_idle_fn)(sbintime_t) = cpu_idle_hlt;
+#else
+void (*cpu_idle_fn)(sbintime_t) = cpu_idle_acpi;
+#endif
+
+void
+cpu_idle(int busy)
+{
+ uint64_t msr;
+ sbintime_t sbt = -1;
+
+ CTR2(KTR_SPARE2, "cpu_idle(%d) at %d",
+ busy, curcpu);
+#ifdef MP_WATCHDOG
+ ap_watchdog(PCPU_GET(cpuid));
+#endif
+
+ /* If we are busy - try to use fast methods. */
+ if (busy) {
+ if ((cpu_feature2 & CPUID2_MON) && idle_mwait) {
+ cpu_idle_mwait(busy);
+ goto out;
+ }
+ }
+
+ /* If we have time - switch timers into idle mode. */
+ if (!busy) {
+ critical_enter();
+ sbt = cpu_idleclock();
+ }
+
+ /* Apply AMD APIC timer C1E workaround. */
+ if (cpu_ident_amdc1e && cpu_disable_c3_sleep) {
+ msr = rdmsr(MSR_AMDK8_IPM);
+ if (msr & AMDK8_CMPHALT)
+ wrmsr(MSR_AMDK8_IPM, msr & ~AMDK8_CMPHALT);
+ }
+
+ /* Call main idle method. */
+ cpu_idle_fn(sbt);
+
+ /* Switch timers back into active mode. */
+ if (!busy) {
+ cpu_activeclock();
+ critical_exit();
+ }
+out:
+ CTR2(KTR_SPARE2, "cpu_idle(%d) at %d done",
+ busy, curcpu);
+}
+
+int
+cpu_idle_wakeup(int cpu)
+{
+ struct pcpu *pcpu;
+ int *state;
+
+ pcpu = pcpu_find(cpu);
+ state = (int *)pcpu->pc_monitorbuf;
+ /*
+ * This doesn't need to be atomic since missing the race will
+ * simply result in unnecessary IPIs.
+ */
+ if (*state == STATE_SLEEPING)
+ return (0);
+ if (*state == STATE_MWAIT)
+ *state = STATE_RUNNING;
+ return (1);
+}
+
+/*
+ * Ordered by speed/power consumption.
+ */
+struct {
+ void *id_fn;
+ char *id_name;
+} idle_tbl[] = {
+ { cpu_idle_spin, "spin" },
+ { cpu_idle_mwait, "mwait" },
+ { cpu_idle_hlt, "hlt" },
+#if !defined(__i386__) || !defined(PC98)
+ { cpu_idle_acpi, "acpi" },
+#endif
+ { NULL, NULL }
+};
+
+static int
+idle_sysctl_available(SYSCTL_HANDLER_ARGS)
+{
+ char *avail, *p;
+ int error;
+ int i;
+
+ avail = malloc(256, M_TEMP, M_WAITOK);
+ p = avail;
+ for (i = 0; idle_tbl[i].id_name != NULL; i++) {
+ if (strstr(idle_tbl[i].id_name, "mwait") &&
+ (cpu_feature2 & CPUID2_MON) == 0)
+ continue;
+#if !defined(__i386__) || !defined(PC98)
+ if (strcmp(idle_tbl[i].id_name, "acpi") == 0 &&
+ cpu_idle_hook == NULL)
+ continue;
+#endif
+ p += sprintf(p, "%s%s", p != avail ? ", " : "",
+ idle_tbl[i].id_name);
+ }
+ error = sysctl_handle_string(oidp, avail, 0, req);
+ free(avail, M_TEMP);
+ return (error);
+}
+
+SYSCTL_PROC(_machdep, OID_AUTO, idle_available, CTLTYPE_STRING | CTLFLAG_RD,
+ 0, 0, idle_sysctl_available, "A", "list of available idle functions");
+
+static int
+idle_sysctl(SYSCTL_HANDLER_ARGS)
+{
+ char buf[16];
+ int error;
+ char *p;
+ int i;
+
+ p = "unknown";
+ for (i = 0; idle_tbl[i].id_name != NULL; i++) {
+ if (idle_tbl[i].id_fn == cpu_idle_fn) {
+ p = idle_tbl[i].id_name;
+ break;
+ }
+ }
+ strncpy(buf, p, sizeof(buf));
+ error = sysctl_handle_string(oidp, buf, sizeof(buf), req);
+ if (error != 0 || req->newptr == NULL)
+ return (error);
+ for (i = 0; idle_tbl[i].id_name != NULL; i++) {
+ if (strstr(idle_tbl[i].id_name, "mwait") &&
+ (cpu_feature2 & CPUID2_MON) == 0)
+ continue;
+#if !defined(__i386__) || !defined(PC98)
+ if (strcmp(idle_tbl[i].id_name, "acpi") == 0 &&
+ cpu_idle_hook == NULL)
+ continue;
+#endif
+ if (strcmp(idle_tbl[i].id_name, buf))
+ continue;
+ cpu_idle_fn = idle_tbl[i].id_fn;
+ return (0);
+ }
+ return (EINVAL);
+}
+
+SYSCTL_PROC(_machdep, OID_AUTO, idle, CTLTYPE_STRING | CTLFLAG_RW, 0, 0,
+ idle_sysctl, "A", "currently selected idle function");
diff --git a/sys/x86/x86/identcpu.c b/sys/x86/x86/identcpu.c
index ca2b5ca..9f39d1c 100644
--- a/sys/x86/x86/identcpu.c
+++ b/sys/x86/x86/identcpu.c
@@ -1190,7 +1190,6 @@ hook_tsc_freq(void *arg __unused)
SYSINIT(hook_tsc_freq, SI_SUB_CONFIGURE, SI_ORDER_ANY, hook_tsc_freq, NULL);
-#ifndef XEN
static const char *const vm_bnames[] = {
"QEMU", /* QEMU */
"Plex86", /* Plex86 */
@@ -1281,7 +1280,6 @@ identify_hypervisor(void)
freeenv(p);
}
}
-#endif
/*
* Final stage of CPU identification.
@@ -1314,9 +1312,7 @@ identify_cpu(void)
cpu_feature2 = regs[2];
#endif
-#ifndef XEN
identify_hypervisor();
-#endif
cpu_vendor_id = find_cpu_vendor_id();
/*
diff --git a/sys/x86/x86/intr_machdep.c b/sys/x86/x86/intr_machdep.c
index b27df4a..d81c913 100644
--- a/sys/x86/x86/intr_machdep.c
+++ b/sys/x86/x86/intr_machdep.c
@@ -532,13 +532,6 @@ intr_shuffle_irqs(void *arg __unused)
struct intsrc *isrc;
int i;
-#ifdef XEN
- /*
- * Doesn't work yet
- */
- return;
-#endif
-
/* Don't bother on UP. */
if (mp_ncpus == 1)
return;
diff --git a/sys/x86/x86/local_apic.c b/sys/x86/x86/local_apic.c
index e0656ef..d75a452 100644
--- a/sys/x86/x86/local_apic.c
+++ b/sys/x86/x86/local_apic.c
@@ -1579,17 +1579,13 @@ apic_setup_io(void *dummy __unused)
* Local APIC must be registered before other PICs and pseudo PICs
* for proper suspend/resume order.
*/
-#ifndef XEN
intr_register_pic(&lapic_pic);
-#endif
retval = best_enum->apic_setup_io();
if (retval != 0)
printf("%s: Failed to setup I/O APICs: returned %d\n",
best_enum->apic_name, retval);
-#ifdef XEN
- return;
-#endif
+
/*
* Finish setting up the local APIC on the BSP once we know
* how to properly program the LINT pins. In particular, this
diff --git a/sys/x86/x86/mca.c b/sys/x86/x86/mca.c
index 2fd959f..8026b15 100644
--- a/sys/x86/x86/mca.c
+++ b/sys/x86/x86/mca.c
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2009 Advanced Computing Technologies LLC
+ * Copyright (c) 2009 Hudson River Trading LLC
* Written by: John H. Baldwin <jhb@FreeBSD.org>
* All rights reserved.
*
@@ -251,15 +251,24 @@ mca_mute(const struct mca_record *rec)
{
/*
- * Skip spurious corrected parity errors generated by desktop Haswell
- * (see HSD131 erratum) unless reporting is enabled.
- * Note that these errors also have been observed with D0-stepping,
- * while the revision 014 desktop Haswell specification update only
- * talks about C0-stepping.
+ * Skip spurious corrected parity errors generated by Intel Haswell-
+ * and Broadwell-based CPUs (see HSD131, HSM142, HSW131 and BDM48
+ * erratum respectively), unless reporting is enabled.
+ * Note that these errors also have been observed with the D0-stepping
+ * of Haswell, while at least initially the CPU specification updates
+ * suggested only the C0-stepping to be affected. Similarly, Celeron
+ * 2955U with a CPU ID of 0x45 apparently are also concerned with the
+ * same problem, with HSM142 only referring to 0x3c and 0x46.
*/
- if (rec->mr_cpu_vendor_id == CPU_VENDOR_INTEL &&
- rec->mr_cpu_id == 0x306c3 && rec->mr_bank == 0 &&
- rec->mr_status == 0x90000040000f0005 && !intel6h_HSD131)
+ if (cpu_vendor_id == CPU_VENDOR_INTEL &&
+ CPUID_TO_FAMILY(cpu_id) == 0x6 &&
+ (CPUID_TO_MODEL(cpu_id) == 0x3c || /* HSD131, HSM142, HSW131 */
+ CPUID_TO_MODEL(cpu_id) == 0x3d || /* BDM48 */
+ CPUID_TO_MODEL(cpu_id) == 0x45 ||
+ CPUID_TO_MODEL(cpu_id) == 0x46) && /* HSM142 */
+ rec->mr_bank == 0 &&
+ (rec->mr_status & 0xa0000000ffffffff) == 0x80000000000f0005 &&
+ !intel6h_HSD131)
return (1);
return (0);
diff --git a/sys/x86/x86/mp_x86.c b/sys/x86/x86/mp_x86.c
new file mode 100644
index 0000000..b4c66a5
--- /dev/null
+++ b/sys/x86/x86/mp_x86.c
@@ -0,0 +1,1120 @@
+/*-
+ * Copyright (c) 1996, by Steve Passe
+ * Copyright (c) 2003, by Peter Wemm
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. The name of the developer may NOT be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#ifdef __i386__
+#include "opt_apic.h"
+#endif
+#include "opt_cpu.h"
+#include "opt_kstack_pages.h"
+#include "opt_pmap.h"
+#include "opt_sched.h"
+#include "opt_smp.h"
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/bus.h>
+#include <sys/cons.h> /* cngetc() */
+#include <sys/cpuset.h>
+#ifdef GPROF
+#include <sys/gmon.h>
+#endif
+#include <sys/kernel.h>
+#include <sys/ktr.h>
+#include <sys/lock.h>
+#include <sys/malloc.h>
+#include <sys/memrange.h>
+#include <sys/mutex.h>
+#include <sys/pcpu.h>
+#include <sys/proc.h>
+#include <sys/sched.h>
+#include <sys/smp.h>
+#include <sys/sysctl.h>
+
+#include <vm/vm.h>
+#include <vm/vm_param.h>
+#include <vm/pmap.h>
+#include <vm/vm_kern.h>
+#include <vm/vm_extern.h>
+
+#include <x86/apicreg.h>
+#include <machine/clock.h>
+#include <machine/cputypes.h>
+#include <x86/mca.h>
+#include <machine/md_var.h>
+#include <machine/pcb.h>
+#include <machine/psl.h>
+#include <machine/smp.h>
+#include <machine/specialreg.h>
+#include <machine/cpu.h>
+
+#define WARMBOOT_TARGET 0
+#define WARMBOOT_OFF (KERNBASE + 0x0467)
+#define WARMBOOT_SEG (KERNBASE + 0x0469)
+
+#define CMOS_REG (0x70)
+#define CMOS_DATA (0x71)
+#define BIOS_RESET (0x0f)
+#define BIOS_WARM (0x0a)
+
+/* lock region used by kernel profiling */
+int mcount_lock;
+
+int mp_naps; /* # of Applications processors */
+int boot_cpu_id = -1; /* designated BSP */
+
+extern struct pcpu __pcpu[];
+
+/* AP uses this during bootstrap. Do not staticize. */
+char *bootSTK;
+int bootAP;
+
+/* Free these after use */
+void *bootstacks[MAXCPU];
+void *dpcpu;
+
+struct pcb stoppcbs[MAXCPU];
+struct susppcb **susppcbs;
+
+#ifdef COUNT_IPIS
+/* Interrupt counts. */
+static u_long *ipi_preempt_counts[MAXCPU];
+static u_long *ipi_ast_counts[MAXCPU];
+u_long *ipi_invltlb_counts[MAXCPU];
+u_long *ipi_invlrng_counts[MAXCPU];
+u_long *ipi_invlpg_counts[MAXCPU];
+u_long *ipi_invlcache_counts[MAXCPU];
+u_long *ipi_rendezvous_counts[MAXCPU];
+static u_long *ipi_hardclock_counts[MAXCPU];
+#endif
+
+/* Default cpu_ops implementation. */
+struct cpu_ops cpu_ops;
+
+/*
+ * Local data and functions.
+ */
+
+static volatile cpuset_t ipi_nmi_pending;
+
+/* used to hold the AP's until we are ready to release them */
+struct mtx ap_boot_mtx;
+
+/* Set to 1 once we're ready to let the APs out of the pen. */
+volatile int aps_ready = 0;
+
+/*
+ * Store data from cpu_add() until later in the boot when we actually setup
+ * the APs.
+ */
+struct cpu_info cpu_info[MAX_APIC_ID + 1];
+int cpu_apic_ids[MAXCPU];
+int apic_cpuids[MAX_APIC_ID + 1];
+
+/* Holds pending bitmap based IPIs per CPU */
+volatile u_int cpu_ipi_pending[MAXCPU];
+
+int cpu_logical; /* logical cpus per core */
+int cpu_cores; /* cores per package */
+
+static void release_aps(void *dummy);
+
+static u_int hyperthreading_cpus; /* logical cpus sharing L1 cache */
+static int hyperthreading_allowed = 1;
+
+void
+mem_range_AP_init(void)
+{
+
+ if (mem_range_softc.mr_op && mem_range_softc.mr_op->initAP)
+ mem_range_softc.mr_op->initAP(&mem_range_softc);
+}
+
+static void
+topo_probe_amd(void)
+{
+ int core_id_bits;
+ int id;
+
+ /* AMD processors do not support HTT. */
+ cpu_logical = 1;
+
+ if ((amd_feature2 & AMDID2_CMP) == 0) {
+ cpu_cores = 1;
+ return;
+ }
+
+ core_id_bits = (cpu_procinfo2 & AMDID_COREID_SIZE) >>
+ AMDID_COREID_SIZE_SHIFT;
+ if (core_id_bits == 0) {
+ cpu_cores = (cpu_procinfo2 & AMDID_CMP_CORES) + 1;
+ return;
+ }
+
+ /* Fam 10h and newer should get here. */
+ for (id = 0; id <= MAX_APIC_ID; id++) {
+ /* Check logical CPU availability. */
+ if (!cpu_info[id].cpu_present || cpu_info[id].cpu_disabled)
+ continue;
+ /* Check if logical CPU has the same package ID. */
+ if ((id >> core_id_bits) != (boot_cpu_id >> core_id_bits))
+ continue;
+ cpu_cores++;
+ }
+}
+
+/*
+ * Round up to the next power of two, if necessary, and then
+ * take log2.
+ * Returns -1 if argument is zero.
+ */
+static __inline int
+mask_width(u_int x)
+{
+
+ return (fls(x << (1 - powerof2(x))) - 1);
+}
+
+static void
+topo_probe_0x4(void)
+{
+ u_int p[4];
+ int pkg_id_bits;
+ int core_id_bits;
+ int max_cores;
+ int max_logical;
+ int id;
+
+ /* Both zero and one here mean one logical processor per package. */
+ max_logical = (cpu_feature & CPUID_HTT) != 0 ?
+ (cpu_procinfo & CPUID_HTT_CORES) >> 16 : 1;
+ if (max_logical <= 1)
+ return;
+
+ /*
+ * Because of uniformity assumption we examine only
+ * those logical processors that belong to the same
+ * package as BSP. Further, we count number of
+ * logical processors that belong to the same core
+ * as BSP thus deducing number of threads per core.
+ */
+ if (cpu_high >= 0x4) {
+ cpuid_count(0x04, 0, p);
+ max_cores = ((p[0] >> 26) & 0x3f) + 1;
+ } else
+ max_cores = 1;
+ core_id_bits = mask_width(max_logical/max_cores);
+ if (core_id_bits < 0)
+ return;
+ pkg_id_bits = core_id_bits + mask_width(max_cores);
+
+ for (id = 0; id <= MAX_APIC_ID; id++) {
+ /* Check logical CPU availability. */
+ if (!cpu_info[id].cpu_present || cpu_info[id].cpu_disabled)
+ continue;
+ /* Check if logical CPU has the same package ID. */
+ if ((id >> pkg_id_bits) != (boot_cpu_id >> pkg_id_bits))
+ continue;
+ cpu_cores++;
+ /* Check if logical CPU has the same package and core IDs. */
+ if ((id >> core_id_bits) == (boot_cpu_id >> core_id_bits))
+ cpu_logical++;
+ }
+
+ KASSERT(cpu_cores >= 1 && cpu_logical >= 1,
+ ("topo_probe_0x4 couldn't find BSP"));
+
+ cpu_cores /= cpu_logical;
+ hyperthreading_cpus = cpu_logical;
+}
+
+static void
+topo_probe_0xb(void)
+{
+ u_int p[4];
+ int bits;
+ int cnt;
+ int i;
+ int logical;
+ int type;
+ int x;
+
+ /* We only support three levels for now. */
+ for (i = 0; i < 3; i++) {
+ cpuid_count(0x0b, i, p);
+
+ /* Fall back if CPU leaf 11 doesn't really exist. */
+ if (i == 0 && p[1] == 0) {
+ topo_probe_0x4();
+ return;
+ }
+
+ bits = p[0] & 0x1f;
+ logical = p[1] &= 0xffff;
+ type = (p[2] >> 8) & 0xff;
+ if (type == 0 || logical == 0)
+ break;
+ /*
+ * Because of uniformity assumption we examine only
+ * those logical processors that belong to the same
+ * package as BSP.
+ */
+ for (cnt = 0, x = 0; x <= MAX_APIC_ID; x++) {
+ if (!cpu_info[x].cpu_present ||
+ cpu_info[x].cpu_disabled)
+ continue;
+ if (x >> bits == boot_cpu_id >> bits)
+ cnt++;
+ }
+ if (type == CPUID_TYPE_SMT)
+ cpu_logical = cnt;
+ else if (type == CPUID_TYPE_CORE)
+ cpu_cores = cnt;
+ }
+ if (cpu_logical == 0)
+ cpu_logical = 1;
+ cpu_cores /= cpu_logical;
+}
+
+/*
+ * Both topology discovery code and code that consumes topology
+ * information assume top-down uniformity of the topology.
+ * That is, all physical packages must be identical and each
+ * core in a package must have the same number of threads.
+ * Topology information is queried only on BSP, on which this
+ * code runs and for which it can query CPUID information.
+ * Then topology is extrapolated on all packages using the
+ * uniformity assumption.
+ */
+void
+topo_probe(void)
+{
+ static int cpu_topo_probed = 0;
+
+ if (cpu_topo_probed)
+ return;
+
+ CPU_ZERO(&logical_cpus_mask);
+ if (mp_ncpus <= 1)
+ cpu_cores = cpu_logical = 1;
+ else if (cpu_vendor_id == CPU_VENDOR_AMD)
+ topo_probe_amd();
+ else if (cpu_vendor_id == CPU_VENDOR_INTEL) {
+ /*
+ * See Intel(R) 64 Architecture Processor
+ * Topology Enumeration article for details.
+ *
+ * Note that 0x1 <= cpu_high < 4 case should be
+ * compatible with topo_probe_0x4() logic when
+ * CPUID.1:EBX[23:16] > 0 (cpu_cores will be 1)
+ * or it should trigger the fallback otherwise.
+ */
+ if (cpu_high >= 0xb)
+ topo_probe_0xb();
+ else if (cpu_high >= 0x1)
+ topo_probe_0x4();
+ }
+
+ /*
+ * Fallback: assume each logical CPU is in separate
+ * physical package. That is, no multi-core, no SMT.
+ */
+ if (cpu_cores == 0 || cpu_logical == 0)
+ cpu_cores = cpu_logical = 1;
+ cpu_topo_probed = 1;
+}
+
+struct cpu_group *
+cpu_topo(void)
+{
+ int cg_flags;
+
+ /*
+ * Determine whether any threading flags are
+ * necessry.
+ */
+ topo_probe();
+ if (cpu_logical > 1 && hyperthreading_cpus)
+ cg_flags = CG_FLAG_HTT;
+ else if (cpu_logical > 1)
+ cg_flags = CG_FLAG_SMT;
+ else
+ cg_flags = 0;
+ if (mp_ncpus % (cpu_cores * cpu_logical) != 0) {
+ printf("WARNING: Non-uniform processors.\n");
+ printf("WARNING: Using suboptimal topology.\n");
+ return (smp_topo_none());
+ }
+ /*
+ * No multi-core or hyper-threaded.
+ */
+ if (cpu_logical * cpu_cores == 1)
+ return (smp_topo_none());
+ /*
+ * Only HTT no multi-core.
+ */
+ if (cpu_logical > 1 && cpu_cores == 1)
+ return (smp_topo_1level(CG_SHARE_L1, cpu_logical, cg_flags));
+ /*
+ * Only multi-core no HTT.
+ */
+ if (cpu_cores > 1 && cpu_logical == 1)
+ return (smp_topo_1level(CG_SHARE_L2, cpu_cores, cg_flags));
+ /*
+ * Both HTT and multi-core.
+ */
+ return (smp_topo_2level(CG_SHARE_L2, cpu_cores,
+ CG_SHARE_L1, cpu_logical, cg_flags));
+}
+
+
+void
+cpu_add(u_int apic_id, char boot_cpu)
+{
+
+ if (apic_id > MAX_APIC_ID) {
+ panic("SMP: APIC ID %d too high", apic_id);
+ return;
+ }
+ KASSERT(cpu_info[apic_id].cpu_present == 0, ("CPU %d added twice",
+ apic_id));
+ cpu_info[apic_id].cpu_present = 1;
+ if (boot_cpu) {
+ KASSERT(boot_cpu_id == -1,
+ ("CPU %d claims to be BSP, but CPU %d already is", apic_id,
+ boot_cpu_id));
+ boot_cpu_id = apic_id;
+ cpu_info[apic_id].cpu_bsp = 1;
+ }
+ if (mp_ncpus < MAXCPU) {
+ mp_ncpus++;
+ mp_maxid = mp_ncpus - 1;
+ }
+ if (bootverbose)
+ printf("SMP: Added CPU %d (%s)\n", apic_id, boot_cpu ? "BSP" :
+ "AP");
+}
+
+void
+cpu_mp_setmaxid(void)
+{
+
+ /*
+ * mp_maxid should be already set by calls to cpu_add().
+ * Just sanity check its value here.
+ */
+ if (mp_ncpus == 0)
+ KASSERT(mp_maxid == 0,
+ ("%s: mp_ncpus is zero, but mp_maxid is not", __func__));
+ else if (mp_ncpus == 1)
+ mp_maxid = 0;
+ else
+ KASSERT(mp_maxid >= mp_ncpus - 1,
+ ("%s: counters out of sync: max %d, count %d", __func__,
+ mp_maxid, mp_ncpus));
+}
+
+int
+cpu_mp_probe(void)
+{
+
+ /*
+ * Always record BSP in CPU map so that the mbuf init code works
+ * correctly.
+ */
+ CPU_SETOF(0, &all_cpus);
+ if (mp_ncpus == 0) {
+ /*
+ * No CPUs were found, so this must be a UP system. Setup
+ * the variables to represent a system with a single CPU
+ * with an id of 0.
+ */
+ mp_ncpus = 1;
+ return (0);
+ }
+
+ /* At least one CPU was found. */
+ if (mp_ncpus == 1) {
+ /*
+ * One CPU was found, so this must be a UP system with
+ * an I/O APIC.
+ */
+ mp_maxid = 0;
+ return (0);
+ }
+
+ /* At least two CPUs were found. */
+ return (1);
+}
+
+/*
+ * Print various information about the SMP system hardware and setup.
+ */
+void
+cpu_mp_announce(void)
+{
+ const char *hyperthread;
+ int i;
+
+ printf("FreeBSD/SMP: %d package(s) x %d core(s)",
+ mp_ncpus / (cpu_cores * cpu_logical), cpu_cores);
+ if (hyperthreading_cpus > 1)
+ printf(" x %d HTT threads", cpu_logical);
+ else if (cpu_logical > 1)
+ printf(" x %d SMT threads", cpu_logical);
+ printf("\n");
+
+ /* List active CPUs first. */
+ printf(" cpu0 (BSP): APIC ID: %2d\n", boot_cpu_id);
+ for (i = 1; i < mp_ncpus; i++) {
+ if (cpu_info[cpu_apic_ids[i]].cpu_hyperthread)
+ hyperthread = "/HT";
+ else
+ hyperthread = "";
+ printf(" cpu%d (AP%s): APIC ID: %2d\n", i, hyperthread,
+ cpu_apic_ids[i]);
+ }
+
+ /* List disabled CPUs last. */
+ for (i = 0; i <= MAX_APIC_ID; i++) {
+ if (!cpu_info[i].cpu_present || !cpu_info[i].cpu_disabled)
+ continue;
+ if (cpu_info[i].cpu_hyperthread)
+ hyperthread = "/HT";
+ else
+ hyperthread = "";
+ printf(" cpu (AP%s): APIC ID: %2d (disabled)\n", hyperthread,
+ i);
+ }
+}
+
+void
+init_secondary_tail(void)
+{
+ u_int cpuid;
+
+ /*
+ * On real hardware, switch to x2apic mode if possible. Do it
+ * after aps_ready was signalled, to avoid manipulating the
+ * mode while BSP might still want to send some IPI to us
+ * (second startup IPI is ignored on modern hardware etc).
+ */
+ lapic_xapic_mode();
+
+ /* Initialize the PAT MSR. */
+ pmap_init_pat();
+
+ /* set up CPU registers and state */
+ cpu_setregs();
+
+ /* set up SSE/NX */
+ initializecpu();
+
+ /* set up FPU state on the AP */
+#ifdef __amd64__
+ fpuinit();
+#else
+ npxinit(false);
+#endif
+
+ if (cpu_ops.cpu_init)
+ cpu_ops.cpu_init();
+
+ /* A quick check from sanity claus */
+ cpuid = PCPU_GET(cpuid);
+ if (PCPU_GET(apic_id) != lapic_id()) {
+ printf("SMP: cpuid = %d\n", cpuid);
+ printf("SMP: actual apic_id = %d\n", lapic_id());
+ printf("SMP: correct apic_id = %d\n", PCPU_GET(apic_id));
+ panic("cpuid mismatch! boom!!");
+ }
+
+ /* Initialize curthread. */
+ KASSERT(PCPU_GET(idlethread) != NULL, ("no idle thread"));
+ PCPU_SET(curthread, PCPU_GET(idlethread));
+
+ mca_init();
+
+ mtx_lock_spin(&ap_boot_mtx);
+
+ /* Init local apic for irq's */
+ lapic_setup(1);
+
+ /* Set memory range attributes for this CPU to match the BSP */
+ mem_range_AP_init();
+
+ smp_cpus++;
+
+ CTR1(KTR_SMP, "SMP: AP CPU #%d Launched", cpuid);
+ printf("SMP: AP CPU #%d Launched!\n", cpuid);
+
+ /* Determine if we are a logical CPU. */
+ /* XXX Calculation depends on cpu_logical being a power of 2, e.g. 2 */
+ if (cpu_logical > 1 && PCPU_GET(apic_id) % cpu_logical != 0)
+ CPU_SET(cpuid, &logical_cpus_mask);
+
+ if (bootverbose)
+ lapic_dump("AP");
+
+ if (smp_cpus == mp_ncpus) {
+ /* enable IPI's, tlb shootdown, freezes etc */
+ atomic_store_rel_int(&smp_started, 1);
+ }
+
+#ifdef __amd64__
+ /*
+ * Enable global pages TLB extension
+ * This also implicitly flushes the TLB
+ */
+ load_cr4(rcr4() | CR4_PGE);
+ if (pmap_pcid_enabled)
+ load_cr4(rcr4() | CR4_PCIDE);
+ load_ds(_udatasel);
+ load_es(_udatasel);
+ load_fs(_ufssel);
+#endif
+
+ mtx_unlock_spin(&ap_boot_mtx);
+
+ /* Wait until all the AP's are up. */
+ while (smp_started == 0)
+ ia32_pause();
+
+ /* Start per-CPU event timers. */
+ cpu_initclocks_ap();
+
+ sched_throw(NULL);
+
+ panic("scheduler returned us to %s", __func__);
+ /* NOTREACHED */
+}
+
+/*******************************************************************
+ * local functions and data
+ */
+
+/*
+ * We tell the I/O APIC code about all the CPUs we want to receive
+ * interrupts. If we don't want certain CPUs to receive IRQs we
+ * can simply not tell the I/O APIC code about them in this function.
+ * We also do not tell it about the BSP since it tells itself about
+ * the BSP internally to work with UP kernels and on UP machines.
+ */
+void
+set_interrupt_apic_ids(void)
+{
+ u_int i, apic_id;
+
+ for (i = 0; i < MAXCPU; i++) {
+ apic_id = cpu_apic_ids[i];
+ if (apic_id == -1)
+ continue;
+ if (cpu_info[apic_id].cpu_bsp)
+ continue;
+ if (cpu_info[apic_id].cpu_disabled)
+ continue;
+
+ /* Don't let hyperthreads service interrupts. */
+ if (cpu_logical > 1 &&
+ apic_id % cpu_logical != 0)
+ continue;
+
+ intr_add_cpu(i);
+ }
+}
+
+/*
+ * Assign logical CPU IDs to local APICs.
+ */
+void
+assign_cpu_ids(void)
+{
+ u_int i;
+
+ TUNABLE_INT_FETCH("machdep.hyperthreading_allowed",
+ &hyperthreading_allowed);
+
+ /* Check for explicitly disabled CPUs. */
+ for (i = 0; i <= MAX_APIC_ID; i++) {
+ if (!cpu_info[i].cpu_present || cpu_info[i].cpu_bsp)
+ continue;
+
+ if (hyperthreading_cpus > 1 && i % hyperthreading_cpus != 0) {
+ cpu_info[i].cpu_hyperthread = 1;
+
+ /*
+ * Don't use HT CPU if it has been disabled by a
+ * tunable.
+ */
+ if (hyperthreading_allowed == 0) {
+ cpu_info[i].cpu_disabled = 1;
+ continue;
+ }
+ }
+
+ /* Don't use this CPU if it has been disabled by a tunable. */
+ if (resource_disabled("lapic", i)) {
+ cpu_info[i].cpu_disabled = 1;
+ continue;
+ }
+ }
+
+ if (hyperthreading_allowed == 0 && hyperthreading_cpus > 1) {
+ hyperthreading_cpus = 0;
+ cpu_logical = 1;
+ }
+
+ /*
+ * Assign CPU IDs to local APIC IDs and disable any CPUs
+ * beyond MAXCPU. CPU 0 is always assigned to the BSP.
+ *
+ * To minimize confusion for userland, we attempt to number
+ * CPUs such that all threads and cores in a package are
+ * grouped together. For now we assume that the BSP is always
+ * the first thread in a package and just start adding APs
+ * starting with the BSP's APIC ID.
+ */
+ mp_ncpus = 1;
+ cpu_apic_ids[0] = boot_cpu_id;
+ apic_cpuids[boot_cpu_id] = 0;
+ for (i = boot_cpu_id + 1; i != boot_cpu_id;
+ i == MAX_APIC_ID ? i = 0 : i++) {
+ if (!cpu_info[i].cpu_present || cpu_info[i].cpu_bsp ||
+ cpu_info[i].cpu_disabled)
+ continue;
+
+ if (mp_ncpus < MAXCPU) {
+ cpu_apic_ids[mp_ncpus] = i;
+ apic_cpuids[i] = mp_ncpus;
+ mp_ncpus++;
+ } else
+ cpu_info[i].cpu_disabled = 1;
+ }
+ KASSERT(mp_maxid >= mp_ncpus - 1,
+ ("%s: counters out of sync: max %d, count %d", __func__, mp_maxid,
+ mp_ncpus));
+}
+
+#ifdef COUNT_XINVLTLB_HITS
+u_int xhits_gbl[MAXCPU];
+u_int xhits_pg[MAXCPU];
+u_int xhits_rng[MAXCPU];
+static SYSCTL_NODE(_debug, OID_AUTO, xhits, CTLFLAG_RW, 0, "");
+SYSCTL_OPAQUE(_debug_xhits, OID_AUTO, global, CTLFLAG_RW, &xhits_gbl,
+ sizeof(xhits_gbl), "IU", "");
+SYSCTL_OPAQUE(_debug_xhits, OID_AUTO, page, CTLFLAG_RW, &xhits_pg,
+ sizeof(xhits_pg), "IU", "");
+SYSCTL_OPAQUE(_debug_xhits, OID_AUTO, range, CTLFLAG_RW, &xhits_rng,
+ sizeof(xhits_rng), "IU", "");
+
+u_int ipi_global;
+u_int ipi_page;
+u_int ipi_range;
+u_int ipi_range_size;
+SYSCTL_INT(_debug_xhits, OID_AUTO, ipi_global, CTLFLAG_RW, &ipi_global, 0, "");
+SYSCTL_INT(_debug_xhits, OID_AUTO, ipi_page, CTLFLAG_RW, &ipi_page, 0, "");
+SYSCTL_INT(_debug_xhits, OID_AUTO, ipi_range, CTLFLAG_RW, &ipi_range, 0, "");
+SYSCTL_INT(_debug_xhits, OID_AUTO, ipi_range_size, CTLFLAG_RW, &ipi_range_size,
+ 0, "");
+
+u_int ipi_masked_global;
+u_int ipi_masked_page;
+u_int ipi_masked_range;
+u_int ipi_masked_range_size;
+SYSCTL_INT(_debug_xhits, OID_AUTO, ipi_masked_global, CTLFLAG_RW,
+ &ipi_masked_global, 0, "");
+SYSCTL_INT(_debug_xhits, OID_AUTO, ipi_masked_page, CTLFLAG_RW,
+ &ipi_masked_page, 0, "");
+SYSCTL_INT(_debug_xhits, OID_AUTO, ipi_masked_range, CTLFLAG_RW,
+ &ipi_masked_range, 0, "");
+SYSCTL_INT(_debug_xhits, OID_AUTO, ipi_masked_range_size, CTLFLAG_RW,
+ &ipi_masked_range_size, 0, "");
+#endif /* COUNT_XINVLTLB_HITS */
+
+/*
+ * Init and startup IPI.
+ */
+void
+ipi_startup(int apic_id, int vector)
+{
+
+ /*
+ * This attempts to follow the algorithm described in the
+ * Intel Multiprocessor Specification v1.4 in section B.4.
+ * For each IPI, we allow the local APIC ~20us to deliver the
+ * IPI. If that times out, we panic.
+ */
+
+ /*
+ * first we do an INIT IPI: this INIT IPI might be run, resetting
+ * and running the target CPU. OR this INIT IPI might be latched (P5
+ * bug), CPU waiting for STARTUP IPI. OR this INIT IPI might be
+ * ignored.
+ */
+ lapic_ipi_raw(APIC_DEST_DESTFLD | APIC_TRIGMOD_LEVEL |
+ APIC_LEVEL_ASSERT | APIC_DESTMODE_PHY | APIC_DELMODE_INIT, apic_id);
+ lapic_ipi_wait(100);
+
+ /* Explicitly deassert the INIT IPI. */
+ lapic_ipi_raw(APIC_DEST_DESTFLD | APIC_TRIGMOD_LEVEL |
+ APIC_LEVEL_DEASSERT | APIC_DESTMODE_PHY | APIC_DELMODE_INIT,
+ apic_id);
+
+ DELAY(10000); /* wait ~10mS */
+
+ /*
+ * next we do a STARTUP IPI: the previous INIT IPI might still be
+ * latched, (P5 bug) this 1st STARTUP would then terminate
+ * immediately, and the previously started INIT IPI would continue. OR
+ * the previous INIT IPI has already run. and this STARTUP IPI will
+ * run. OR the previous INIT IPI was ignored. and this STARTUP IPI
+ * will run.
+ */
+ lapic_ipi_raw(APIC_DEST_DESTFLD | APIC_TRIGMOD_EDGE |
+ APIC_LEVEL_ASSERT | APIC_DESTMODE_PHY | APIC_DELMODE_STARTUP |
+ vector, apic_id);
+ if (!lapic_ipi_wait(100))
+ panic("Failed to deliver first STARTUP IPI to APIC %d",
+ apic_id);
+ DELAY(200); /* wait ~200uS */
+
+ /*
+ * finally we do a 2nd STARTUP IPI: this 2nd STARTUP IPI should run IF
+ * the previous STARTUP IPI was cancelled by a latched INIT IPI. OR
+ * this STARTUP IPI will be ignored, as only ONE STARTUP IPI is
+ * recognized after hardware RESET or INIT IPI.
+ */
+ lapic_ipi_raw(APIC_DEST_DESTFLD | APIC_TRIGMOD_EDGE |
+ APIC_LEVEL_ASSERT | APIC_DESTMODE_PHY | APIC_DELMODE_STARTUP |
+ vector, apic_id);
+ if (!lapic_ipi_wait(100))
+ panic("Failed to deliver second STARTUP IPI to APIC %d",
+ apic_id);
+
+ DELAY(200); /* wait ~200uS */
+}
+
+/*
+ * Send an IPI to specified CPU handling the bitmap logic.
+ */
+void
+ipi_send_cpu(int cpu, u_int ipi)
+{
+ u_int bitmap, old_pending, new_pending;
+
+ KASSERT(cpu_apic_ids[cpu] != -1, ("IPI to non-existent CPU %d", cpu));
+
+ if (IPI_IS_BITMAPED(ipi)) {
+ bitmap = 1 << ipi;
+ ipi = IPI_BITMAP_VECTOR;
+ do {
+ old_pending = cpu_ipi_pending[cpu];
+ new_pending = old_pending | bitmap;
+ } while (!atomic_cmpset_int(&cpu_ipi_pending[cpu],
+ old_pending, new_pending));
+ if (old_pending)
+ return;
+ }
+ lapic_ipi_vectored(ipi, cpu_apic_ids[cpu]);
+}
+
+void
+ipi_bitmap_handler(struct trapframe frame)
+{
+ struct trapframe *oldframe;
+ struct thread *td;
+ int cpu = PCPU_GET(cpuid);
+ u_int ipi_bitmap;
+
+ critical_enter();
+ td = curthread;
+ td->td_intr_nesting_level++;
+ oldframe = td->td_intr_frame;
+ td->td_intr_frame = &frame;
+ ipi_bitmap = atomic_readandclear_int(&cpu_ipi_pending[cpu]);
+ if (ipi_bitmap & (1 << IPI_PREEMPT)) {
+#ifdef COUNT_IPIS
+ (*ipi_preempt_counts[cpu])++;
+#endif
+ sched_preempt(td);
+ }
+ if (ipi_bitmap & (1 << IPI_AST)) {
+#ifdef COUNT_IPIS
+ (*ipi_ast_counts[cpu])++;
+#endif
+ /* Nothing to do for AST */
+ }
+ if (ipi_bitmap & (1 << IPI_HARDCLOCK)) {
+#ifdef COUNT_IPIS
+ (*ipi_hardclock_counts[cpu])++;
+#endif
+ hardclockintr();
+ }
+ td->td_intr_frame = oldframe;
+ td->td_intr_nesting_level--;
+ critical_exit();
+}
+
+/*
+ * send an IPI to a set of cpus.
+ */
+void
+ipi_selected(cpuset_t cpus, u_int ipi)
+{
+ int cpu;
+
+ /*
+ * IPI_STOP_HARD maps to a NMI and the trap handler needs a bit
+ * of help in order to understand what is the source.
+ * Set the mask of receiving CPUs for this purpose.
+ */
+ if (ipi == IPI_STOP_HARD)
+ CPU_OR_ATOMIC(&ipi_nmi_pending, &cpus);
+
+ while ((cpu = CPU_FFS(&cpus)) != 0) {
+ cpu--;
+ CPU_CLR(cpu, &cpus);
+ CTR3(KTR_SMP, "%s: cpu: %d ipi: %x", __func__, cpu, ipi);
+ ipi_send_cpu(cpu, ipi);
+ }
+}
+
+/*
+ * send an IPI to a specific CPU.
+ */
+void
+ipi_cpu(int cpu, u_int ipi)
+{
+
+ /*
+ * IPI_STOP_HARD maps to a NMI and the trap handler needs a bit
+ * of help in order to understand what is the source.
+ * Set the mask of receiving CPUs for this purpose.
+ */
+ if (ipi == IPI_STOP_HARD)
+ CPU_SET_ATOMIC(cpu, &ipi_nmi_pending);
+
+ CTR3(KTR_SMP, "%s: cpu: %d ipi: %x", __func__, cpu, ipi);
+ ipi_send_cpu(cpu, ipi);
+}
+
+/*
+ * send an IPI to all CPUs EXCEPT myself
+ */
+void
+ipi_all_but_self(u_int ipi)
+{
+ cpuset_t other_cpus;
+
+ other_cpus = all_cpus;
+ CPU_CLR(PCPU_GET(cpuid), &other_cpus);
+ if (IPI_IS_BITMAPED(ipi)) {
+ ipi_selected(other_cpus, ipi);
+ return;
+ }
+
+ /*
+ * IPI_STOP_HARD maps to a NMI and the trap handler needs a bit
+ * of help in order to understand what is the source.
+ * Set the mask of receiving CPUs for this purpose.
+ */
+ if (ipi == IPI_STOP_HARD)
+ CPU_OR_ATOMIC(&ipi_nmi_pending, &other_cpus);
+
+ CTR2(KTR_SMP, "%s: ipi: %x", __func__, ipi);
+ lapic_ipi_vectored(ipi, APIC_IPI_DEST_OTHERS);
+}
+
+int
+ipi_nmi_handler()
+{
+ u_int cpuid;
+
+ /*
+ * As long as there is not a simple way to know about a NMI's
+ * source, if the bitmask for the current CPU is present in
+ * the global pending bitword an IPI_STOP_HARD has been issued
+ * and should be handled.
+ */
+ cpuid = PCPU_GET(cpuid);
+ if (!CPU_ISSET(cpuid, &ipi_nmi_pending))
+ return (1);
+
+ CPU_CLR_ATOMIC(cpuid, &ipi_nmi_pending);
+ cpustop_handler();
+ return (0);
+}
+
+/*
+ * Handle an IPI_STOP by saving our current context and spinning until we
+ * are resumed.
+ */
+void
+cpustop_handler(void)
+{
+ u_int cpu;
+
+ cpu = PCPU_GET(cpuid);
+
+ savectx(&stoppcbs[cpu]);
+
+ /* Indicate that we are stopped */
+ CPU_SET_ATOMIC(cpu, &stopped_cpus);
+
+ /* Wait for restart */
+ while (!CPU_ISSET(cpu, &started_cpus))
+ ia32_pause();
+
+ CPU_CLR_ATOMIC(cpu, &started_cpus);
+ CPU_CLR_ATOMIC(cpu, &stopped_cpus);
+
+#if defined(__amd64__) && defined(DDB)
+ amd64_db_resume_dbreg();
+#endif
+
+ if (cpu == 0 && cpustop_restartfunc != NULL) {
+ cpustop_restartfunc();
+ cpustop_restartfunc = NULL;
+ }
+}
+
+/*
+ * Handle an IPI_SUSPEND by saving our current context and spinning until we
+ * are resumed.
+ */
+void
+cpususpend_handler(void)
+{
+ u_int cpu;
+
+ mtx_assert(&smp_ipi_mtx, MA_NOTOWNED);
+
+ cpu = PCPU_GET(cpuid);
+ if (savectx(&susppcbs[cpu]->sp_pcb)) {
+#ifdef __amd64__
+ fpususpend(susppcbs[cpu]->sp_fpususpend);
+#else
+ npxsuspend(susppcbs[cpu]->sp_fpususpend);
+#endif
+ wbinvd();
+ CPU_SET_ATOMIC(cpu, &suspended_cpus);
+ } else {
+#ifdef __amd64__
+ fpuresume(susppcbs[cpu]->sp_fpususpend);
+#else
+ npxresume(susppcbs[cpu]->sp_fpususpend);
+#endif
+ pmap_init_pat();
+ initializecpu();
+ PCPU_SET(switchtime, 0);
+ PCPU_SET(switchticks, ticks);
+
+ /* Indicate that we are resumed */
+ CPU_CLR_ATOMIC(cpu, &suspended_cpus);
+ }
+
+ /* Wait for resume */
+ while (!CPU_ISSET(cpu, &started_cpus))
+ ia32_pause();
+
+ if (cpu_ops.cpu_resume)
+ cpu_ops.cpu_resume();
+#ifdef __amd64__
+ if (vmm_resume_p)
+ vmm_resume_p();
+#endif
+
+ /* Resume MCA and local APIC */
+ lapic_xapic_mode();
+ mca_resume();
+ lapic_setup(0);
+
+ /* Indicate that we are resumed */
+ CPU_CLR_ATOMIC(cpu, &suspended_cpus);
+ CPU_CLR_ATOMIC(cpu, &started_cpus);
+}
+
+
+void
+invlcache_handler(void)
+{
+#ifdef COUNT_IPIS
+ (*ipi_invlcache_counts[PCPU_GET(cpuid)])++;
+#endif /* COUNT_IPIS */
+
+ wbinvd();
+ atomic_add_int(&smp_tlb_wait, 1);
+}
+
+/*
+ * This is called once the rest of the system is up and running and we're
+ * ready to let the AP's out of the pen.
+ */
+static void
+release_aps(void *dummy __unused)
+{
+
+ if (mp_ncpus == 1)
+ return;
+ atomic_store_rel_int(&aps_ready, 1);
+ while (smp_started == 0)
+ ia32_pause();
+}
+SYSINIT(start_aps, SI_SUB_SMP, SI_ORDER_FIRST, release_aps, NULL);
+
+#ifdef COUNT_IPIS
+/*
+ * Setup interrupt counters for IPI handlers.
+ */
+static void
+mp_ipi_intrcnt(void *dummy)
+{
+ char buf[64];
+ int i;
+
+ CPU_FOREACH(i) {
+ snprintf(buf, sizeof(buf), "cpu%d:invltlb", i);
+ intrcnt_add(buf, &ipi_invltlb_counts[i]);
+ snprintf(buf, sizeof(buf), "cpu%d:invlrng", i);
+ intrcnt_add(buf, &ipi_invlrng_counts[i]);
+ snprintf(buf, sizeof(buf), "cpu%d:invlpg", i);
+ intrcnt_add(buf, &ipi_invlpg_counts[i]);
+ snprintf(buf, sizeof(buf), "cpu%d:invlcache", i);
+ intrcnt_add(buf, &ipi_invlcache_counts[i]);
+ snprintf(buf, sizeof(buf), "cpu%d:preempt", i);
+ intrcnt_add(buf, &ipi_preempt_counts[i]);
+ snprintf(buf, sizeof(buf), "cpu%d:ast", i);
+ intrcnt_add(buf, &ipi_ast_counts[i]);
+ snprintf(buf, sizeof(buf), "cpu%d:rendezvous", i);
+ intrcnt_add(buf, &ipi_rendezvous_counts[i]);
+ snprintf(buf, sizeof(buf), "cpu%d:hardclock", i);
+ intrcnt_add(buf, &ipi_hardclock_counts[i]);
+ }
+}
+SYSINIT(mp_ipi_intrcnt, SI_SUB_INTR, SI_ORDER_MIDDLE, mp_ipi_intrcnt, NULL);
+#endif
diff --git a/sys/x86/xen/xen_apic.c b/sys/x86/xen/xen_apic.c
index 8e83184..c742920 100644
--- a/sys/x86/xen/xen_apic.c
+++ b/sys/x86/xen/xen_apic.c
@@ -68,9 +68,6 @@ static driver_filter_t xen_invltlb;
static driver_filter_t xen_invlpg;
static driver_filter_t xen_invlrng;
static driver_filter_t xen_invlcache;
-#ifdef __i386__
-static driver_filter_t xen_lazypmap;
-#endif
static driver_filter_t xen_ipi_bitmap_handler;
static driver_filter_t xen_cpustop_handler;
static driver_filter_t xen_cpususpend_handler;
@@ -79,9 +76,6 @@ static driver_filter_t xen_cpustophard_handler;
/*---------------------------- Extern Declarations ---------------------------*/
/* Variables used by mp_machdep to perform the MMU related IPIs */
-#ifdef __i386__
-extern void pmap_lazyfix_action(void);
-#endif
#ifdef __amd64__
extern int pmap_pcid_enabled;
#endif
@@ -104,9 +98,6 @@ static struct xen_ipi_handler xen_ipis[] =
[IPI_TO_IDX(IPI_INVLPG)] = { xen_invlpg, "ipg" },
[IPI_TO_IDX(IPI_INVLRNG)] = { xen_invlrng, "irg" },
[IPI_TO_IDX(IPI_INVLCACHE)] = { xen_invlcache, "ic" },
-#ifdef __i386__
- [IPI_TO_IDX(IPI_LAZYPMAP)] = { xen_lazypmap, "lp" },
-#endif
[IPI_TO_IDX(IPI_BITMAP_VECTOR)] = { xen_ipi_bitmap_handler, "b" },
[IPI_TO_IDX(IPI_STOP)] = { xen_cpustop_handler, "st" },
[IPI_TO_IDX(IPI_SUSPEND)] = { xen_cpususpend_handler, "sp" },
@@ -474,16 +465,6 @@ xen_invlcache(void *arg)
return (FILTER_HANDLED);
}
-#ifdef __i386__
-static int
-xen_lazypmap(void *arg)
-{
-
- pmap_lazyfix_action();
- return (FILTER_HANDLED);
-}
-#endif
-
static int
xen_cpustop_handler(void *arg)
{
diff --git a/sys/x86/xen/xen_intr.c b/sys/x86/xen/xen_intr.c
index 64979b1..3bc4b43 100644
--- a/sys/x86/xen/xen_intr.c
+++ b/sys/x86/xen/xen_intr.c
@@ -1,7 +1,7 @@
/******************************************************************************
* xen_intr.c
*
- * Xen event and interrupt services for x86 PV and HVM guests.
+ * Xen event and interrupt services for x86 HVM guests.
*
* Copyright (c) 2002-2005, K A Fraser
* Copyright (c) 2005, Intel Corporation <xiaofeng.ling@intel.com>
@@ -864,10 +864,8 @@ xen_intr_assign_cpu(struct intsrc *base_isrc, u_int apic_id)
u_int to_cpu, vcpu_id;
int error, masked;
-#ifdef XENHVM
if (xen_vector_callback_enabled == 0)
return (EOPNOTSUPP);
-#endif
to_cpu = apic_cpuid(apic_id);
vcpu_id = pcpu_find(to_cpu)->pc_vcpu_id;
diff --git a/sys/x86/xen/xen_nexus.c b/sys/x86/xen/xen_nexus.c
index f25f970..73506fc 100644
--- a/sys/x86/xen/xen_nexus.c
+++ b/sys/x86/xen/xen_nexus.c
@@ -66,14 +66,11 @@ static int
nexus_xen_attach(device_t dev)
{
int error;
-#ifndef XEN
device_t acpi_dev = NULL;
-#endif
nexus_init_resources();
bus_generic_probe(dev);
-#ifndef XEN
if (xen_initial_domain()) {
/* Disable some ACPI devices that are not usable by Dom0 */
acpi_cpu_disabled = true;
@@ -84,13 +81,10 @@ nexus_xen_attach(device_t dev)
if (acpi_dev == NULL)
panic("Unable to add ACPI bus to Xen Dom0");
}
-#endif
error = bus_generic_attach(dev);
-#ifndef XEN
if (xen_initial_domain() && (error == 0))
acpi_install_wakeup_handler(device_get_softc(acpi_dev));
-#endif
return (error);
}
OpenPOWER on IntegriCloud